From 3e1d8092185da31d10294a40d4363f2ca4fc056c Mon Sep 17 00:00:00 2001
From: Norihiro Watanabe <norihiro.watanabe@ufz.de>
Date: Wed, 2 Nov 2016 14:14:13 +0100
Subject: [PATCH] [Math/Eigen] support PardisoLU if MKL is available

---
 MathLib/LinAlg/Eigen/EigenLinearSolver.cpp | 11 +++++++++++
 MathLib/LinAlg/Eigen/EigenOption.cpp       |  4 ++++
 MathLib/LinAlg/Eigen/EigenOption.h         |  3 +++
 3 files changed, 18 insertions(+)

diff --git a/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp b/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp
index dbff3748344..bc22dc04cd8 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 3c273491484..a6200c8e97a 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 5b64fc41a7b..d90997fa1b6 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
-- 
GitLab