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 267 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 linear_solver_behaviour)
bool didComputeAtLeastOnce () const

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 270 of file EigenLinearSolver.cpp.

273 {
274 INFO("-> compute with Eigen iterative linear solver {:s} (precon {:s})",
275 EigenOption::getSolverName(opt.solver_type),
276 EigenOption::getPreconName(opt.precon_type));
277 solver_.setTolerance(opt.error_tolerance);
278 solver_.setMaxIterations(opt.max_iterations);
279
280#ifdef USE_EIGEN_UNSUPPORTED
282 opt.restart);
286 opt.smoothing);
288 opt.angle);
290 T_SOLVER>::setResidualUpdate(opt.residualupdate);
291#endif
292
293 auto compute = [this](Matrix& m)
294 {
295 if (!m.isCompressed())
296 {
297 m.makeCompressed();
298 }
299
300 solver_.compute(m);
301 };
302
304 {
306 {
307 // matrix must be copied, because Eigen's linear solver stores a
308 // reference to it cf.
309 // https://libeigen.gitlab.io/docs/classEigen_1_1IterativeSolverBase.html#a7dfa55c55e82d697bde227696a630914
310 A_ = A;
311 compute(A_);
312 break;
313 }
315 {
316 compute(A);
317 break;
318 }
320 OGS_FATAL(
321 "If NumLib::LinearSolverBehaviour::REUSE is set then "
322 "EigenLinearSolver::compute() should never be executed");
323 };
324
325 if (solver_.info() != Eigen::Success)
326 {
327 ERR("Failed during Eigen linear solver initialization");
328 return false;
329 }
330
331 return true;
332 }
#define OGS_FATAL(...)
Definition Error.h:26
void INFO(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:36
void ERR(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:48
bool compute(Matrix &A, EigenOption &opt, MathLib::LinearSolverBehaviour linear_solver_behaviour)
EigenMatrix::RawMatrixType Matrix
Template class for Eigen iterative linear solvers.

References 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, 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 334 of file EigenLinearSolver.cpp.

335 {
336 INFO("-> solve with Eigen iterative linear solver {:s} (precon {:s})",
337 EigenOption::getSolverName(opt.solver_type),
338 EigenOption::getPreconName(opt.precon_type));
339
340 x = solver_.solveWithGuess(b, x);
341 INFO("\t iteration: {:d}/{:d}", solver_.iterations(),
342 opt.max_iterations);
343 INFO("\t residual: {:e}\n", solver_.error());
344
345 if (solver_.info() != Eigen::Success)
346 {
347 ERR("Failed during Eigen linear solve");
348 return false;
349 }
350
351 return true;
352 }

References ERR(), MathLib::EigenOption::getPreconName(), MathLib::EigenOption::getSolverName(), INFO(), MathLib::EigenOption::max_iterations, MathLib::EigenOption::precon_type, solver_, and MathLib::EigenOption::solver_type.

Member Data Documentation

◆ A_

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

Definition at line 356 of file EigenLinearSolver.cpp.

Referenced by computeImpl().

◆ solver_

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

Definition at line 355 of file EigenLinearSolver.cpp.

Referenced by computeImpl(), and solveImpl().


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