1818#endif
1919
2020#include " spaces/ublas_space.h"
21+ #include " linear_solvers/amgcl_solver.h"
2122
2223namespace Kratos {
2324
@@ -39,13 +40,11 @@ void register_vexcl_static_matrix_type() {
3940}
4041#endif
4142
42- template <class TSparseSpaceType >
43- typename std::enable_if<!TSparseSpaceType::IsDistributed(), void >::type
44- AMGCLScalarSolve (
45- typename TSparseSpaceType::MatrixType& rA,
46- typename TSparseSpaceType::VectorType& rX,
47- typename TSparseSpaceType::VectorType& rB,
48- typename TSparseSpaceType::IndexType& rIterationNumber,
43+ void AMGCLScalarSolve (
44+ TUblasSparseSpace<double >::MatrixType& rA,
45+ TUblasSparseSpace<double >::VectorType& rX,
46+ TUblasSparseSpace<double >::VectorType& rB,
47+ TUblasSparseSpace<double >::IndexType& rIterationNumber,
4948 double & rResidual,
5049 const boost::property_tree::ptree &amgclParams,
5150 int verbosity_level,
@@ -66,7 +65,7 @@ AMGCLScalarSolve(
6665 bprm.q = ctx;
6766
6867 Solver solve (amgcl::adapter::zero_copy (
69- TSparseSpaceType ::Size1 (rA),
68+ TUblasSparseSpace< double > ::Size1 (rA),
7069 rA.index1_data ().begin (),
7170 rA.index2_data ().begin (),
7271 rA.value_data ().begin ()),
@@ -91,7 +90,7 @@ AMGCLScalarSolve(
9190 > Solver;
9291
9392 Solver solve (amgcl::adapter::zero_copy (
94- TSparseSpaceType ::Size1 (rA),
93+ TUblasSparseSpace< double > ::Size1 (rA),
9594 rA.index1_data ().begin (),
9695 rA.index2_data ().begin (),
9796 rA.value_data ().begin ()),
@@ -104,13 +103,12 @@ AMGCLScalarSolve(
104103 }
105104}
106105
107- template <int TBlockSize, class TSparseSpaceType >
108- typename std::enable_if<!TSparseSpaceType::IsDistributed(), void >::type
109- AMGCLBlockSolve (
110- typename TSparseSpaceType::MatrixType & rA,
111- typename TSparseSpaceType::VectorType& rX,
112- typename TSparseSpaceType::VectorType& rB,
113- typename TSparseSpaceType::IndexType& rIterationNumber,
106+ template <int TBlockSize>
107+ void AMGCLBlockSolve (
108+ TUblasSparseSpace<double >::MatrixType & rA,
109+ TUblasSparseSpace<double >::VectorType& rX,
110+ TUblasSparseSpace<double >::VectorType& rB,
111+ TUblasSparseSpace<double >::IndexType& rIterationNumber,
114112 double & rResidual,
115113 boost::property_tree::ptree amgclParams,
116114 int verbosity_level,
@@ -125,7 +123,7 @@ AMGCLBlockSolve(
125123 typedef amgcl::static_matrix<double , TBlockSize, TBlockSize> value_type;
126124 typedef amgcl::static_matrix<double , TBlockSize, 1 > rhs_type;
127125
128- std::size_t n = TSparseSpaceType ::Size1 (rA);
126+ std::size_t n = TUblasSparseSpace< double > ::Size1 (rA);
129127 std::size_t nb = n / TBlockSize;
130128
131129#ifdef AMGCL_GPGPU
@@ -188,8 +186,8 @@ AMGCLBlockSolve(
188186 }
189187}
190188
191- // Exlplicit instantiations:
192- template void AMGCLScalarSolve< TUblasSparseSpace< double > >(
189+ void AMGCLSolve (
190+ int block_size,
193191 TUblasSparseSpace<double >::MatrixType& rA,
194192 TUblasSparseSpace<double >::VectorType& rX,
195193 TUblasSparseSpace<double >::VectorType& rB,
@@ -198,24 +196,22 @@ template void AMGCLScalarSolve< TUblasSparseSpace<double> >(
198196 const boost::property_tree::ptree &amgclParams,
199197 int verbosity_level,
200198 bool use_gpgpu
201- );
202-
203- #define INSTANTIATE_BLOCK_SOLVER (B ) \
204- template void AMGCLBlockSolve<B, TUblasSparseSpace<double > >( \
205- TUblasSparseSpace<double >::MatrixType& rA, \
206- TUblasSparseSpace<double >::VectorType& rX, \
207- TUblasSparseSpace<double >::VectorType& rB, \
208- TUblasSparseSpace<double >::IndexType& rIterationNumber, \
209- double & rResidual, \
210- boost::property_tree::ptree amgclParams, \
211- int verbosity_level, \
212- bool use_gpgpu \
213199 )
214-
215- INSTANTIATE_BLOCK_SOLVER (2 );
216- INSTANTIATE_BLOCK_SOLVER (3 );
217- INSTANTIATE_BLOCK_SOLVER (4 );
218-
219- #undef INSTANTIATE_BLOCK_SOLVER
200+ {
201+ switch (block_size) {
202+ case 2 :
203+ AMGCLBlockSolve<2 >(rA, rX, rB, rIterationNumber, rResidual, amgclParams, verbosity_level, use_gpgpu);
204+ return ;
205+ case 3 :
206+ AMGCLBlockSolve<3 >(rA, rX, rB, rIterationNumber, rResidual, amgclParams, verbosity_level, use_gpgpu);
207+ return ;
208+ case 4 :
209+ AMGCLBlockSolve<4 >(rA, rX, rB, rIterationNumber, rResidual, amgclParams, verbosity_level, use_gpgpu);
210+ return ;
211+ default :
212+ AMGCLScalarSolve (rA, rX, rB, rIterationNumber, rResidual, amgclParams, verbosity_level, use_gpgpu);
213+ return ;
214+ }
215+ }
220216
221217}
0 commit comments