7#ifndef LINEARSOLVER_HPP
8#define LINEARSOLVER_HPP
11#include <Eigen/Sparse>
14#include <Eigen/UmfPackSupport>
18#include <Eigen/PardisoSupport>
27#include <Eigen/SuperLUSupport>
30#include <boost/algorithm/string.hpp>
45 {
"eps_refinement",0},{
"eps_ctrl",1}
59 "Set the solver parameters; Usage [with v1, v2 as doubles]: \n"
60 "--solver-parameters param1=v1 param2=v2\n"
61 "--solver-parameters param1=v1 --solver-parameters param2=v2 \n"
63 "Possible parameters are [all optionals]:\n eps_refinement \n eps_ctrl\n"
65 "Set the solver parameters, not implemented with this solver, see src/Common/linearsolver.hpp for modifications\n"
70 template<
typename MatrixType>
72 template<
typename MatrixType>
75 template<
typename MatrixType>
82 template<
typename MatrixType>
98 using SuperLUType = Eigen::SuperLU<Eigen::SparseMatrix<double>>;
133 template<
typename MatrixType>
134 using ListSolvers = std::tuple<std::unique_ptr<EigenLUType<MatrixType>>,
135 std::unique_ptr<EigenBiCGStabType<MatrixType>>,
136 std::unique_ptr<PardisoLUType<MatrixType>>,
137 std::unique_ptr<UMFPACKType<MatrixType>>,
138 std::unique_ptr<PastixLUType>,
139 std::unique_ptr<PastixLLTType>,
140 std::unique_ptr<SuperLUType>>;
144 template<
typename MatrixType>
152 : m_name(
map_solver[boost::algorithm::to_lower_copy(namesolver)])
158 std::cout <<
"[linearsolver] Pardiso not available, reverting to Eigen LU" << std::endl;
164 std::cout <<
"[linearsolver] UMFPACK not available, reverting to Eigen LU" << std::endl;
170 std::cout <<
"[linearsolver] PaStiX not available, reverting to Eigen LU" << std::endl;
176 std::cout <<
"[linearsolver] SuperLU not available, reverting to Eigen LU" << std::endl;
195 unsigned nb_threads_hint = std::thread::hardware_concurrency();
197 mkl_set_num_threads(nb_threads_hint);
225 std::get<6>(m_list_solvers).reset(
new SuperLUType );
243 return m_info_factorize;
257 if (m_is_pattern_analyzed ==
false){
261 std::get<0>(m_list_solvers).get()->analyzePattern(
A);
266 std::get<1>(m_list_solvers).get()->analyzePattern(
A);
272 std::get<2>(m_list_solvers).get()->analyzePattern(
A);
280 std::get<3>(m_list_solvers).get()->analyzePattern(
A);
288 std::get<4>(m_list_solvers).get()->analyzePattern(
A);
294 std::get<5>(m_list_solvers).get()->analyzePattern(
A);
302 std::get<6>(m_list_solvers).get()->analyzePattern(
A);
311 m_is_pattern_analyzed =
true;
322 std::get<0>(m_list_solvers).get()->factorize(
A);
323 m_info_factorize = std::get<0>(m_list_solvers).get()->info();
328 std::get<1>(m_list_solvers).get()->factorize(
A);
329 m_info_factorize = std::get<1>(m_list_solvers).get()->info();
335 std::get<2>(m_list_solvers).get()->factorize(
A);
336 m_info_factorize = std::get<2>(m_list_solvers).get()->info();
344 std::get<3>(m_list_solvers).get()->factorize(
A);
345 m_info_factorize = std::get<3>(m_list_solvers).get()->info();
353 std::get<4>(m_list_solvers).get()->factorize(
A);
354 m_info_factorize = std::get<4>(m_list_solvers).get()->info();
360 std::get<5>(m_list_solvers).get()->factorize(
A);
361 m_info_factorize = std::get<5>(m_list_solvers).get()->info();
369 std::get<6>(m_list_solvers).get()->factorize(
A);
370 m_info_factorize = std::get<6>(m_list_solvers).get()->info();
379 _check_info(m_info_factorize,
"factorize");
392 template<
typename VectorType>
401 x = std::get<0>(m_list_solvers).get()->solve(b);
402 m_info_solve = std::get<0>(m_list_solvers).get()->info();
407 x = std::get<1>(m_list_solvers).get()->solve(b);
408 m_info_solve = std::get<1>(m_list_solvers).get()->info();
414 x = std::get<2>(m_list_solvers).get()->solve(b);
415 m_info_solve = std::get<2>(m_list_solvers).get()->info();
423 x = std::get<3>(m_list_solvers).get()->solve(b);
424 m_info_solve = std::get<3>(m_list_solvers).get()->info();
432 x = std::get<4>(m_list_solvers).get()->solve(b);
433 m_info_solve = std::get<4>(m_list_solvers).get()->info();
439 x = std::get<5>(m_list_solvers).get()->solve(b);
440 m_info_solve = std::get<5>(m_list_solvers).get()->info();
448 x = std::get<6>(m_list_solvers).get()->solve(b);
449 m_info_solve = std::get<6>(m_list_solvers).get()->info();
458 _check_info(m_info_solve,
"solve");
464 template<
typename VectorType>
475 template <
typename VectorType>
476 inline double residual(MatrixType &
A, VectorType & b, VectorType & x)
477 {
return (
A*x - b).template lpNorm<Eigen::Infinity>() / (b.template lpNorm<Eigen::Infinity>()+1e-8); }
482 void _check_info(Eigen::ComputationInfo
const & info, std::string step)
const
484 if (info != Eigen::Success) {
485 std::cerr <<
"[linearsolver] ERROR in step: " << step << std::endl;
486 std::cerr <<
"[linearsolver] Info: " << info <<
" (see Eigen::ComputationInfo for the meaning)" << std::endl;
493 ListSolvers<MatrixType> m_list_solvers;
494 Eigen::ComputationInfo m_info_factorize;
495 Eigen::ComputationInfo m_info_solve;
496 bool m_is_pattern_analyzed =
false;
Class to invoke the Pastix LLT solver.
Definition PastixInterface.hpp:543
Class to invoke the Pastix LU solver.
Definition PastixInterface.hpp:424
This structure is a wrapper to allow a given code to select various linear solvers.
Definition linearsolver.hpp:146
bool PardisoLUType
Definition linearsolver.hpp:79
VectorType compute_and_solve(MatrixType &A, VectorType &b)
Perform all operators to solve Ax=b.
Definition linearsolver.hpp:465
SolverName
Enumeration of all available solvers.
Definition linearsolver.hpp:40
bool SuperLUType
Definition linearsolver.hpp:100
const char * SolverParamHelper
Create a solver specific description in boost::desc.options.
Definition linearsolver.hpp:57
LinearSolver(const std::string &namesolver)
Constructor.
Definition linearsolver.hpp:151
std::map< std::string, SolverName > map_solver
Map to associate to each lowercase name a solver.
Definition linearsolver.hpp:105
double residual(MatrixType &A, VectorType &b, VectorType &x)
Check relative infinity norm of residual: ||Ax-b||/||b||.
Definition linearsolver.hpp:476
Eigen::ComputationInfo info_solve() const
Returns the information message after the "solve" step.
Definition linearsolver.hpp:247
std::string name() const
Returns the name of the solver.
Definition linearsolver.hpp:235
Eigen::ComputationInfo info_factorize() const
Returns the information message after the "factorize" step.
Definition linearsolver.hpp:241
std::tuple< std::unique_ptr< EigenLUType< MatrixType > >, std::unique_ptr< EigenBiCGStabType< MatrixType > >, std::unique_ptr< PardisoLUType< MatrixType > >, std::unique_ptr< UMFPACKType< MatrixType > >, std::unique_ptr< PastixLUType >, std::unique_ptr< PastixLLTType >, std::unique_ptr< SuperLUType > > ListSolvers
Definition linearsolver.hpp:140
void analyzePattern(MatrixType &A)
Analyze the pattern of the matrix.
Definition linearsolver.hpp:253
std::map< std::string, int > ParamName
To parse optional Solver parameter from command line.
Definition linearsolver.hpp:43
std::vector< double > SolverParam
Create space and stores default values of optional solver parameters.
Definition linearsolver.hpp:50
Eigen::BiCGSTAB< MatrixType, Eigen::IncompleteLUT< double > > EigenBiCGStabType
Definition linearsolver.hpp:73
bool UMFPACKType
Definition linearsolver.hpp:86
std::map< SolverName, std::string > map_realname
Map to associate to each solver its proper name.
Definition linearsolver.hpp:114
Eigen::SparseLU< MatrixType > EigenLUType
Definition linearsolver.hpp:71
void compute(MatrixType &A)
Analyze and factorize the matrix.
Definition linearsolver.hpp:384
std::map< SolverName, size_t > map_id
Definition linearsolver.hpp:122
bool PastixLUType
Definition linearsolver.hpp:93
bool PastixLLTType
Definition linearsolver.hpp:94
VectorType solve(VectorType &b)
Solve the system Ax=b using the selected solver (after analysis of pattern and computation of matrix)
Definition linearsolver.hpp:393
void factorize(MatrixType &A)
Factorize the matrix.
Definition linearsolver.hpp:316
@ PaStiXLU
Definition linearsolver.hpp:40
@ UMFPACK
Definition linearsolver.hpp:40
@ EigenLU
Definition linearsolver.hpp:40
@ SuperLU
Definition linearsolver.hpp:40
@ PaStiXLLT
Definition linearsolver.hpp:40
@ PardisoLU
Definition linearsolver.hpp:40
@ EigenBiCGStab
Definition linearsolver.hpp:40
Definition ddr-klplate.hpp:27