diff --git a/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp b/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp index dbff374834473d6d5e8f3a2e926b7d9363f30b5c..bc22dc04cd8201d728eb2bbdc19379b3992f6f79 100644 --- a/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp +++ b/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp @@ -11,6 +11,10 @@ #include <logog/include/logog.hpp> +#ifdef USE_MKL +#include <Eigen/PardisoSupport> +#endif + #include "BaseLib/ConfigTree.h" #include "EigenVector.h" #include "EigenMatrix.h" @@ -174,6 +178,13 @@ EigenLinearSolver::EigenLinearSolver( _solver = details::createIterativeSolver(_option.solver_type, _option.precon_type); return; +#ifdef USE_MKL + case EigenOption::SolverType::PardisoLU: { + using SolverType = Eigen::PardisoLU<EigenMatrix::RawMatrixType>; + _solver.reset(new details::EigenDirectLinearSolver<SolverType>); + return; + } +#endif } OGS_FATAL("Invalid Eigen linear solver type. Aborting."); diff --git a/MathLib/LinAlg/Eigen/EigenOption.cpp b/MathLib/LinAlg/Eigen/EigenOption.cpp index 3c273491484a7404ccbfde4e5be205f7b3db49c1..a6200c8e97afe03142149fb1bb2602f9c8f8bb60 100644 --- a/MathLib/LinAlg/Eigen/EigenOption.cpp +++ b/MathLib/LinAlg/Eigen/EigenOption.cpp @@ -29,6 +29,10 @@ EigenOption::SolverType EigenOption::getSolverType(const std::string &solver_nam return SolverType::BiCGSTAB; if (solver_name == "SparseLU") return SolverType::SparseLU; +#ifdef USE_MKL + if (solver_name == "PardisoLU") + return SolverType::PardisoLU; +#endif OGS_FATAL("Unknown Eigen solver type `%s'", solver_name.c_str()); } diff --git a/MathLib/LinAlg/Eigen/EigenOption.h b/MathLib/LinAlg/Eigen/EigenOption.h index 5b64fc41a7b42da5fb1ab976a975c32222cba4b1..d90997fa1b6c5e6add718a74f52888ebdeabf733 100644 --- a/MathLib/LinAlg/Eigen/EigenOption.h +++ b/MathLib/LinAlg/Eigen/EigenOption.h @@ -24,6 +24,9 @@ struct EigenOption final CG, BiCGSTAB, SparseLU +#ifdef USE_MKL + , PardisoLU +#endif }; /// Preconditioner type