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