From fdddee2c25f9cc8d14922c574f90d78d4abca738 Mon Sep 17 00:00:00 2001
From: joerg <joerg@debian>
Date: Sun, 19 Apr 2020 21:15:45 +0200
Subject: [PATCH] add GMRES option restart

add gmres restart test1

set gmres restart test2

add restart option for all Preconditioners (final)
---
 MathLib/LinAlg/Eigen/EigenLinearSolver.cpp | 36 ++++++++++++++++++++++
 MathLib/LinAlg/Eigen/EigenLinearSolver.h   |  1 +
 MathLib/LinAlg/Eigen/EigenOption.cpp       |  1 +
 MathLib/LinAlg/Eigen/EigenOption.h         |  1 +
 4 files changed, 39 insertions(+)

diff --git a/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp b/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp
index cf89fbe1617..6aa15b39cba 100644
--- a/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp
+++ b/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp
@@ -92,6 +92,7 @@ public:
              EigenOption::getPreconName(opt.precon_type));
         _solver.setTolerance(opt.error_tolerance);
         _solver.setMaxIterations(opt.max_iterations);
+        MathLib::details::EigenIterativeLinearSolver<T_SOLVER>::setRestart(opt.restart);
 
         if (!A.isCompressed())
         {
@@ -119,8 +120,31 @@ public:
 
 private:
     T_SOLVER _solver;
+    void setRestart(int const /*restart*/) {
+    }
 };
 
+template <> 
+void EigenIterativeLinearSolver<Eigen::GMRES<EigenMatrix::RawMatrixType, Eigen::IdentityPreconditioner>>::setRestart(int const restart)
+{
+    _solver.set_restart(restart);
+    INFO("-> set restart value: {:d}", _solver.get_restart());
+}
+
+template <> 
+void EigenIterativeLinearSolver<Eigen::GMRES<EigenMatrix::RawMatrixType, Eigen::DiagonalPreconditioner<double>>>::setRestart(int const restart)
+{   
+    _solver.set_restart(restart);
+    INFO("-> set restart value: {:d}", _solver.get_restart());
+}
+
+template <>
+void EigenIterativeLinearSolver<Eigen::GMRES<EigenMatrix::RawMatrixType, Eigen::IncompleteLUT<double>>>::setRestart(int const restart)
+{
+    _solver.set_restart(restart);
+    INFO("-> set restart value: {:d}", _solver.get_restart());
+}
+
 template <template <typename, typename> class Solver, typename Precon>
 std::unique_ptr<EigenLinearSolverBase> createIterativeSolver()
 {
@@ -265,6 +289,18 @@ void EigenLinearSolver::setOption(BaseLib::ConfigTree const& option)
             "scaling is not available.");
 #endif
     }
+    if (auto restart =
+            //! \ogs_file_param{prj__linear_solvers__linear_solver__eigen__restart}
+            ptSolver->getConfigParameterOptional<int>("restart")) {
+#ifdef USE_EIGEN_UNSUPPORTED
+        _option.restart = *restart;
+#else
+        OGS_FATAL(
+            "The code is not compiled with the Eigen unsupported modules. "
+            "GMRES option restart is not available.");
+#endif
+    }
+
 }
 
 bool EigenLinearSolver::solve(EigenMatrix &A, EigenVector& b, EigenVector &x)
diff --git a/MathLib/LinAlg/Eigen/EigenLinearSolver.h b/MathLib/LinAlg/Eigen/EigenLinearSolver.h
index 6aef020f5ec..129e73112c2 100644
--- a/MathLib/LinAlg/Eigen/EigenLinearSolver.h
+++ b/MathLib/LinAlg/Eigen/EigenLinearSolver.h
@@ -59,6 +59,7 @@ public:
 protected:
     EigenOption _option;
     std::unique_ptr<EigenLinearSolverBase> _solver;
+    void setRestart();
 };
 
 }  // namespace MathLib
diff --git a/MathLib/LinAlg/Eigen/EigenOption.cpp b/MathLib/LinAlg/Eigen/EigenOption.cpp
index 2139339792b..ca32fb24f23 100644
--- a/MathLib/LinAlg/Eigen/EigenOption.cpp
+++ b/MathLib/LinAlg/Eigen/EigenOption.cpp
@@ -22,6 +22,7 @@ EigenOption::EigenOption()
     error_tolerance = 1.e-16;
 #ifdef USE_EIGEN_UNSUPPORTED
     scaling = false;
+    restart = 30;
 #endif
 }
 
diff --git a/MathLib/LinAlg/Eigen/EigenOption.h b/MathLib/LinAlg/Eigen/EigenOption.h
index da2f910c681..c40b6e89ed9 100644
--- a/MathLib/LinAlg/Eigen/EigenOption.h
+++ b/MathLib/LinAlg/Eigen/EigenOption.h
@@ -47,6 +47,7 @@ struct EigenOption final
 #ifdef USE_EIGEN_UNSUPPORTED
     /// Scaling the coefficient matrix and the RHS bector
     bool scaling;
+    int restart;
 #endif
 
     /// Constructor
-- 
GitLab