Skip to content

Commit bcbe915

Browse files
committed
Get rid of explicit template instantiation
Since we instantiating the templates explicitly, nothing stops us to convert the templates to plain functions.
1 parent a034674 commit bcbe915

4 files changed

Lines changed: 81 additions & 131 deletions

File tree

applications/trilinos_application/amgcl_mpi_solver_impl.cpp

Lines changed: 31 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
#include "Epetra_FEVector.h"
2727
#include "trilinos_space.h"
2828

29+
#include "external_includes/amgcl_mpi_solve_functions.h"
30+
2931
namespace Kratos
3032
{
3133

@@ -37,13 +39,11 @@ void register_vexcl_static_matrix_type();
3739
#endif
3840

3941
// Spacialization of AMGCLScalarSolve for distribued systems.
40-
template <class TSparseSpaceType>
41-
typename std::enable_if<TSparseSpaceType::IsDistributed(), void>::type
42-
AMGCLScalarSolve(
43-
typename TSparseSpaceType::MatrixType& rA,
44-
typename TSparseSpaceType::VectorType& rX,
45-
typename TSparseSpaceType::VectorType& rB,
46-
typename TSparseSpaceType::IndexType& rIterationNumber,
42+
void AMGCLScalarSolve(
43+
TrilinosSpace<Epetra_FECrsMatrix, Epetra_FEVector>::MatrixType& rA,
44+
TrilinosSpace<Epetra_FECrsMatrix, Epetra_FEVector>::VectorType& rX,
45+
TrilinosSpace<Epetra_FECrsMatrix, Epetra_FEVector>::VectorType& rB,
46+
TrilinosSpace<Epetra_FECrsMatrix, Epetra_FEVector>::IndexType& rIterationNumber,
4747
double& rResidual,
4848
const boost::property_tree::ptree &amgclParams,
4949
int verbosity_level,
@@ -100,13 +100,12 @@ AMGCLScalarSolve(
100100
}
101101

102102
// Spacialization of AMGCLBlockSolve for distribued systems.
103-
template <int TBlockSize, class TSparseSpaceType>
104-
typename std::enable_if<TSparseSpaceType::IsDistributed(), void>::type
105-
AMGCLBlockSolve(
106-
typename TSparseSpaceType::MatrixType & rA,
107-
typename TSparseSpaceType::VectorType& rX,
108-
typename TSparseSpaceType::VectorType& rB,
109-
typename TSparseSpaceType::IndexType& rIterationNumber,
103+
template <int TBlockSize>
104+
void AMGCLBlockSolve(
105+
TrilinosSpace<Epetra_FECrsMatrix, Epetra_FEVector>::MatrixType & rA,
106+
TrilinosSpace<Epetra_FECrsMatrix, Epetra_FEVector>::VectorType& rX,
107+
TrilinosSpace<Epetra_FECrsMatrix, Epetra_FEVector>::VectorType& rB,
108+
TrilinosSpace<Epetra_FECrsMatrix, Epetra_FEVector>::IndexType& rIterationNumber,
110109
double& rResidual,
111110
boost::property_tree::ptree amgclParams,
112111
int verbosity_level,
@@ -184,8 +183,8 @@ AMGCLBlockSolve(
184183
}
185184
}
186185

187-
// Exlplicit instantiations:
188-
template void AMGCLScalarSolve< TrilinosSpace<Epetra_FECrsMatrix, Epetra_FEVector> >(
186+
void AMGCLSolve(
187+
int block_size,
189188
TrilinosSpace<Epetra_FECrsMatrix, Epetra_FEVector>::MatrixType& rA,
190189
TrilinosSpace<Epetra_FECrsMatrix, Epetra_FEVector>::VectorType& rX,
191190
TrilinosSpace<Epetra_FECrsMatrix, Epetra_FEVector>::VectorType& rB,
@@ -194,25 +193,23 @@ template void AMGCLScalarSolve< TrilinosSpace<Epetra_FECrsMatrix, Epetra_FEVecto
194193
const boost::property_tree::ptree &amgclParams,
195194
int verbosity_level,
196195
bool use_gpgpu
197-
);
198-
199-
#define INSTANTIATE_BLOCK_SOLVER(B) \
200-
template void AMGCLBlockSolve<B, TrilinosSpace<Epetra_FECrsMatrix, Epetra_FEVector> >( \
201-
TrilinosSpace<Epetra_FECrsMatrix, Epetra_FEVector>::MatrixType& rA, \
202-
TrilinosSpace<Epetra_FECrsMatrix, Epetra_FEVector>::VectorType& rX, \
203-
TrilinosSpace<Epetra_FECrsMatrix, Epetra_FEVector>::VectorType& rB, \
204-
TrilinosSpace<Epetra_FECrsMatrix, Epetra_FEVector>::IndexType& rIterationNumber, \
205-
double& rResidual, \
206-
boost::property_tree::ptree amgclParams, \
207-
int verbosity_level, \
208-
bool use_gpgpu \
209196
)
210-
211-
INSTANTIATE_BLOCK_SOLVER(2);
212-
INSTANTIATE_BLOCK_SOLVER(3);
213-
INSTANTIATE_BLOCK_SOLVER(4);
214-
215-
#undef INSTANTIATE_BLOCK_SOLVER
197+
{
198+
switch (block_size) {
199+
case 2:
200+
AMGCLBlockSolve<2>(rA, rX, rB, rIterationNumber, rResidual, amgclParams, verbosity_level, use_gpgpu);
201+
return;
202+
case 3:
203+
AMGCLBlockSolve<3>(rA, rX, rB, rIterationNumber, rResidual, amgclParams, verbosity_level, use_gpgpu);
204+
return;
205+
case 4:
206+
AMGCLBlockSolve<4>(rA, rX, rB, rIterationNumber, rResidual, amgclParams, verbosity_level, use_gpgpu);
207+
return;
208+
default:
209+
AMGCLScalarSolve(rA, rX, rB, rIterationNumber, rResidual, amgclParams, verbosity_level, use_gpgpu);
210+
return;
211+
}
212+
}
216213

217214
} // namespace Kratos
218215

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,24 @@
11
#ifndef KRATOS_AMGCL_MPI_SOLVE_FUNCTIONS_H
22
#define KRATOS_AMGCL_MPI_SOLVE_FUNCTIONS_H
33

4+
#include <boost/property_tree/ptree.hpp>
45
#include <boost/property_tree/ptree.hpp>
56

67
namespace Kratos
78
{
89

9-
// Spacialization of AMGCLScalarSolve for distribued systems.
10-
template <class TSparseSpaceType>
11-
typename std::enable_if<TSparseSpaceType::IsDistributed(), void>::type
12-
AMGCLScalarSolve(
13-
typename TSparseSpaceType::MatrixType& rA,
14-
typename TSparseSpaceType::VectorType& rX,
15-
typename TSparseSpaceType::VectorType& rB,
16-
typename TSparseSpaceType::IndexType& rIterationNumber,
10+
void AMGCLSolve(
11+
int block_size,
12+
TrilinosSpace<Epetra_FECrsMatrix, Epetra_FEVector>::MatrixType& rA,
13+
TrilinosSpace<Epetra_FECrsMatrix, Epetra_FEVector>::VectorType& rX,
14+
TrilinosSpace<Epetra_FECrsMatrix, Epetra_FEVector>::VectorType& rB,
15+
TrilinosSpace<Epetra_FECrsMatrix, Epetra_FEVector>::IndexType& rIterationNumber,
1716
double& rResidual,
1817
const boost::property_tree::ptree &amgclParams,
1918
int verbosity_level,
2019
bool use_gpgpu
2120
);
2221

23-
// Spacialization of AMGCLBlockSolve for distribued systems.
24-
template <int TBlockSize, class TSparseSpaceType>
25-
typename std::enable_if<TSparseSpaceType::IsDistributed(), void>::type
26-
AMGCLBlockSolve(
27-
typename TSparseSpaceType::MatrixType & rA,
28-
typename TSparseSpaceType::VectorType& rX,
29-
typename TSparseSpaceType::VectorType& rB,
30-
typename TSparseSpaceType::IndexType& rIterationNumber,
31-
double& rResidual,
32-
boost::property_tree::ptree amgclParams,
33-
int verbosity_level,
34-
bool use_gpgpu
35-
);
36-
3722
} // namespace Kratos
3823

3924
#endif

kratos/linear_solvers/amgcl_solver.h

Lines changed: 10 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -68,47 +68,26 @@ enum AMGCLCoarseningType
6868
///@{
6969

7070
/**
71-
* @brief This function computes a scalar solve for Ublas Matrix type
71+
* @brief This function solves with Ublas Matrix type
72+
* @param block_size Block size
7273
* @param rA System matrix
7374
* @param rX Solution vector. It's also the initial guess for iterative linear solvers.
7475
* @param rB Right hand side vector.
7576
* @param rIterationNumber The current number of iterations
7677
* @param rResidual The current residual of the problem
7778
*/
78-
template <class TSparseSpaceType>
79-
typename std::enable_if<!TSparseSpaceType::IsDistributed(), void>::type
80-
AMGCLScalarSolve(
81-
typename TSparseSpaceType::MatrixType& rA,
82-
typename TSparseSpaceType::VectorType& rX,
83-
typename TSparseSpaceType::VectorType& rB,
84-
typename TSparseSpaceType::IndexType& rIterationNumber,
79+
void KRATOS_API(KRATOS_CORE) AMGCLSolve(
80+
int block_size,
81+
TUblasSparseSpace<double>::MatrixType& rA,
82+
TUblasSparseSpace<double>::VectorType& rX,
83+
TUblasSparseSpace<double>::VectorType& rB,
84+
TUblasSparseSpace<double>::IndexType& rIterationNumber,
8585
double& rResidual,
8686
const boost::property_tree::ptree &amgclParams,
8787
int verbosity_level,
8888
bool use_gpgpu
8989
);
9090

91-
/**
92-
* @brief This method solves by block a Ax=b system
93-
* @param rA System matrix
94-
* @param rX Solution vector. It's also the initial guess for iterative linear solvers.
95-
* @param rB Right hand side vector.
96-
* @param rIterationNumber The current number of iterations
97-
* @param rResidual The current residual of the problem
98-
*/
99-
template <int TBlockSize, class TSparseSpaceType>
100-
typename std::enable_if<!TSparseSpaceType::IsDistributed(), void>::type
101-
AMGCLBlockSolve(
102-
typename TSparseSpaceType::MatrixType & rA,
103-
typename TSparseSpaceType::VectorType& rX,
104-
typename TSparseSpaceType::VectorType& rB,
105-
typename TSparseSpaceType::IndexType& rIterationNumber,
106-
double& rResidual,
107-
boost::property_tree::ptree amgclParams,
108-
int verbosity_level,
109-
bool use_gpgpu
110-
);
111-
11291
///@}
11392
///@name Kratos Classes
11493
///@{
@@ -462,21 +441,14 @@ class AMGCLSolver : public LinearSolver< TSparseSpaceType,
462441
if(mUseBlockMatricesIfPossible) {
463442
KRATOS_ERROR_IF(TSparseSpaceType::Size1(rA)%mBlockSize != 0) << "The block size employed " << mBlockSize << " is not an exact multiple of the matrix size "
464443
<< TSparseSpaceType::Size1(rA) << std::endl;
465-
if(mBlockSize == 1) AMGCLScalarSolve<TSparseSpaceType>(rA,rX,rB, iters, resid, mAMGCLParameters, mVerbosity, mUseGPGPU);
466-
else if(mBlockSize == 2) AMGCLBlockSolve<2, TSparseSpaceType>(rA,rX,rB, iters, resid, mAMGCLParameters, mVerbosity, mUseGPGPU);
467-
else if(mBlockSize == 3) AMGCLBlockSolve<3, TSparseSpaceType>(rA,rX,rB, iters, resid, mAMGCLParameters, mVerbosity, mUseGPGPU);
468-
else if(mBlockSize == 4) AMGCLBlockSolve<4, TSparseSpaceType>(rA,rX,rB, iters, resid, mAMGCLParameters, mVerbosity, mUseGPGPU);
469-
else
470-
AMGCLScalarSolve<TSparseSpaceType>(rA,rX,rB, iters, resid, mAMGCLParameters, mVerbosity, mUseGPGPU);
471-
} else {
472-
AMGCLScalarSolve<TSparseSpaceType>(rA,rX,rB, iters, resid, mAMGCLParameters, mVerbosity, mUseGPGPU);
473444
}
445+
AMGCLSolve(mBlockSize, rA,rX,rB, iters, resid, mAMGCLParameters, mVerbosity, mUseGPGPU);
474446
} //please do not remove this parenthesis!
475447

476448
if(mFallbackToGMRES && resid > mTolerance ) {
477449
mAMGCLParameters.put("solver.type", "gmres");
478450
mAMGCLParameters.put("solver.M", mGMRESSize);
479-
AMGCLScalarSolve<TSparseSpaceType>(rA,rX,rB, iters, resid, mAMGCLParameters, mVerbosity, mUseGPGPU);
451+
AMGCLSolve(1, rA,rX,rB, iters, resid, mAMGCLParameters, mVerbosity, mUseGPGPU);
480452
}
481453

482454
KRATOS_WARNING_IF("AMGCL Linear Solver", mTolerance < resid)<<"Non converged linear solution. ["<< resid << " > "<< mTolerance << "]" << std::endl;

kratos/linear_solvers/amgcl_solver_impl.cpp

Lines changed: 33 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#endif
1919

2020
#include "spaces/ublas_space.h"
21+
#include "linear_solvers/amgcl_solver.h"
2122

2223
namespace 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

Comments
 (0)