OGS
MathLib::details::EigenIterativeLinearSolver< T_SOLVER > Class Template Referencefinal

Detailed Description

template<class T_SOLVER>
class MathLib::details::EigenIterativeLinearSolver< T_SOLVER >

Template class for Eigen iterative linear solvers.

Definition at line 241 of file EigenLinearSolver.cpp.

Inheritance diagram for MathLib::details::EigenIterativeLinearSolver< T_SOLVER >:
[legend]
Collaboration diagram for MathLib::details::EigenIterativeLinearSolver< T_SOLVER >:
[legend]

Public Member Functions

bool computeImpl (Matrix &A, EigenOption &opt, MathLib::LinearSolverBehaviour const linear_solver_behaviour) override
 
bool solveImpl (Vector const &b, Vector &x, EigenOption &opt) override
 
- Public Member Functions inherited from MathLib::EigenLinearSolverBase
virtual ~EigenLinearSolverBase ()=default
 
bool solve (Vector &b, Vector &x, EigenOption &opt)
 
bool compute (Matrix &A, EigenOption &opt, MathLib::LinearSolverBehaviour const linear_solver_behaviour)
 

Private Attributes

T_SOLVER solver_
 
Matrix A_
 

Additional Inherited Members

- Public Types inherited from MathLib::EigenLinearSolverBase
using Vector = EigenVector::RawVectorType
 
using Matrix = EigenMatrix::RawMatrixType
 

Member Function Documentation

◆ computeImpl()

template<class T_SOLVER >
bool MathLib::details::EigenIterativeLinearSolver< T_SOLVER >::computeImpl ( Matrix & A,
EigenOption & opt,
MathLib::LinearSolverBehaviour const linear_solver_behaviour )
inlineoverridevirtual

Implements MathLib::EigenLinearSolverBase.

Definition at line 244 of file EigenLinearSolver.cpp.

247 {
248 INFO("-> compute with Eigen iterative linear solver {:s} (precon {:s})",
249 EigenOption::getSolverName(opt.solver_type),
250 EigenOption::getPreconName(opt.precon_type));
251 solver_.setTolerance(opt.error_tolerance);
252 solver_.setMaxIterations(opt.max_iterations);
253
254#ifdef USE_EIGEN_UNSUPPORTED
256 opt.restart);
260 opt.smoothing);
262 opt.angle);
264 T_SOLVER>::setResidualUpdate(opt.residualupdate);
265#endif
266
267 auto compute = [this](Matrix& m)
268 {
269 if (!m.isCompressed())
270 {
271 m.makeCompressed();
272 }
273
274 solver_.compute(m);
275 };
276
277 switch (linear_solver_behaviour)
278 {
280 {
281 // matrix must be copied, because Eigen's linear solver stores a
282 // reference to it cf.
283 // https://libeigen.gitlab.io/docs/classEigen_1_1IterativeSolverBase.html#a7dfa55c55e82d697bde227696a630914
284 A_ = A;
285 compute(A_);
286 break;
287 }
289 {
290 compute(A);
291 break;
292 }
294 OGS_FATAL(
295 "If NumLib::LinearSolverBehaviour::REUSE is set then "
296 "EigenLinearSolver::compute() should never be executed");
297 };
298
299 if (solver_.info() != Eigen::Success)
300 {
301 ERR("Failed during Eigen linear solver initialization");
302 return false;
303 }
304
305 return true;
306 }
#define OGS_FATAL(...)
Definition Error.h:26
void INFO(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:35
void ERR(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:45
EigenMatrix::RawMatrixType Matrix
bool compute(Matrix &A, EigenOption &opt, MathLib::LinearSolverBehaviour const linear_solver_behaviour)
Template class for Eigen iterative linear solvers.
static std::string getSolverName(SolverType const solver_type)
return a linear solver name from the solver type
static std::string getPreconName(PreconType const precon_type)
return a preconditioner name from the preconditioner type

References MathLib::details::EigenIterativeLinearSolver< T_SOLVER >::A_, MathLib::EigenLinearSolverBase::compute(), ERR(), MathLib::EigenOption::error_tolerance, MathLib::EigenOption::getPreconName(), MathLib::EigenOption::getSolverName(), INFO(), MathLib::EigenOption::max_iterations, OGS_FATAL, MathLib::EigenOption::precon_type, MathLib::RECOMPUTE, MathLib::RECOMPUTE_AND_STORE, MathLib::REUSE, MathLib::details::EigenIterativeLinearSolver< T_SOLVER >::solver_, and MathLib::EigenOption::solver_type.

◆ solveImpl()

template<class T_SOLVER >
bool MathLib::details::EigenIterativeLinearSolver< T_SOLVER >::solveImpl ( Vector const & b,
Vector & x,
EigenOption & opt )
inlineoverridevirtual

Implements MathLib::EigenLinearSolverBase.

Definition at line 308 of file EigenLinearSolver.cpp.

309 {
310 INFO("-> solve with Eigen iterative linear solver {:s} (precon {:s})",
311 EigenOption::getSolverName(opt.solver_type),
312 EigenOption::getPreconName(opt.precon_type));
313
314 x = solver_.solveWithGuess(b, x);
315 INFO("\t iteration: {:d}/{:d}", solver_.iterations(),
316 opt.max_iterations);
317 INFO("\t residual: {:e}\n", solver_.error());
318
319 if (solver_.info() != Eigen::Success)
320 {
321 ERR("Failed during Eigen linear solve");
322 return false;
323 }
324
325 return true;
326 }

References ERR(), MathLib::EigenOption::getPreconName(), MathLib::EigenOption::getSolverName(), INFO(), MathLib::EigenOption::max_iterations, MathLib::EigenOption::precon_type, MathLib::details::EigenIterativeLinearSolver< T_SOLVER >::solver_, and MathLib::EigenOption::solver_type.

Member Data Documentation

◆ A_

template<class T_SOLVER >
Matrix MathLib::details::EigenIterativeLinearSolver< T_SOLVER >::A_
private

◆ solver_


The documentation for this class was generated from the following file: