diff --git a/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp b/MathLib/LinAlg/Eigen/EigenLinearSolver.cpp index cf89fbe1617aa3835e859b8ea2470b632013f61e..6aa15b39cbae57baa31b92be98c550b4c946c16b 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 6aef020f5ecf22527cae4163ec6a9c2979dd6ce4..129e73112c2ac5a7d67f5cc8845cfd8c873d1c40 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 2139339792b39c07d83e75e4c430b838f06441fc..ca32fb24f239ba4894c5d80d9f38d6404c65e011 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 da2f910c681daaff716bbcc0d59c4328bf85ff46..c40b6e89ed9ccc33c60c78227c26b8ccd12fb360 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