From 3742563e0ed00b64c6bb42d345e6c50763d202af Mon Sep 17 00:00:00 2001
From: Norihiro Watanabe <norihiro.watanabe@ufz.de>
Date: Tue, 8 Nov 2016 10:13:12 +0100
Subject: [PATCH] [Eigen] log output solver types

---
 MathLib/LinAlg/Eigen/EigenLinearSolver.cpp |  9 ++++---
 MathLib/LinAlg/Eigen/EigenOption.cpp       | 30 ++++++++++++++++++++++
 MathLib/LinAlg/Eigen/EigenOption.h         |  7 +++++
 3 files changed, 43 insertions(+), 3 deletions(-)

diff --git a/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp b/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp
index db003d28652..c04c897a6e1 100644
--- a/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp
+++ b/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp
@@ -52,9 +52,10 @@ template <class T_SOLVER>
 class EigenDirectLinearSolver final : public EigenLinearSolverBase
 {
 public:
-    bool solve(Matrix& A, Vector const& b, Vector& x, EigenOption& /*opt*/) override
+    bool solve(Matrix& A, Vector const& b, Vector& x, EigenOption& opt) override
     {
-        INFO("-> solve");
+        INFO("-> solve with %s",
+             EigenOption::getSolverName(opt.solver_type).c_str());
         if (!A.isCompressed()) A.makeCompressed();
 
         _solver.compute(A);
@@ -83,7 +84,9 @@ class EigenIterativeLinearSolver final : public EigenLinearSolverBase
 public:
     bool solve(Matrix& A, Vector const& b, Vector& x, EigenOption& opt) override
     {
-        INFO("-> solve");
+        INFO("-> solve with %s (precon %s)",
+             EigenOption::getSolverName(opt.solver_type).c_str(),
+             EigenOption::getPreconName(opt.precon_type).c_str());
         _solver.setTolerance(opt.error_tolerance);
         _solver.setMaxIterations(opt.max_iterations);
 
diff --git a/MathLib/LinAlg/Eigen/EigenOption.cpp b/MathLib/LinAlg/Eigen/EigenOption.cpp
index 5cd640d8724..c64f3630138 100644
--- a/MathLib/LinAlg/Eigen/EigenOption.cpp
+++ b/MathLib/LinAlg/Eigen/EigenOption.cpp
@@ -52,4 +52,34 @@ EigenOption::PreconType EigenOption::getPreconType(const std::string &precon_nam
     OGS_FATAL("Unknown Eigen preconditioner type `%s'", precon_name.c_str());
 }
 
+std::string EigenOption::getSolverName(SolverType const solver_type)
+{
+    switch (solver_type) {
+        case SolverType::CG:
+            return "CG";
+        case SolverType::BiCGSTAB:
+            return "BiCGSTAB";
+        case SolverType::SparseLU:
+            return "SparseLU";
+        case SolverType::PardisoLU:
+            return "PardisoLU";
+        case SolverType::GMRES:
+            return "GMRES";
+    }
+    return "Invalid";
+}
+
+std::string EigenOption::getPreconName(PreconType const precon_type)
+{
+    switch (precon_type) {
+        case PreconType::NONE:
+            return "NONE";
+        case PreconType::DIAGONAL:
+            return "DIAGONAL";
+        case PreconType::ILUT:
+            return "ILUT";
+    }
+    return "Invalid";
+}
+
 } //MathLib
diff --git a/MathLib/LinAlg/Eigen/EigenOption.h b/MathLib/LinAlg/Eigen/EigenOption.h
index 84af7c8f607..619b01f1685 100644
--- a/MathLib/LinAlg/Eigen/EigenOption.h
+++ b/MathLib/LinAlg/Eigen/EigenOption.h
@@ -71,6 +71,13 @@ struct EigenOption final
     ///      is returned.
     static PreconType getPreconType(const std::string &precon_name);
 
+
+    /// return a linear solver name from the solver type
+    static std::string getSolverName(SolverType const solver_type);
+
+    /// return a preconditioner name from the preconditioner type
+    static std::string getPreconName(PreconType const precon_type);
+
 };
 
 }
-- 
GitLab