OGS
MathLib::details Namespace Reference

Classes

class  EigenDirectLinearSolver
 Template class for Eigen direct linear solvers. More...
class  EigenIterativeLinearSolver
 Template class for Eigen iterative linear solvers. More...

Typedefs

template<typename Mat, typename Precon>
using EigenCGSolverL = Eigen::ConjugateGradient<Mat, Eigen::Lower, Precon>
template<typename Mat, typename Precon>
using EigenCGSolverU = Eigen::ConjugateGradient<Mat, Eigen::Upper, Precon>
template<typename Mat, typename Precon>
using EigenCGSolverLU

Functions

template<template< typename, typename > class Solver, typename Precon>
std::unique_ptr< EigenLinearSolverBasecreateIterativeSolver ()
template<template< typename, typename > class Solver>
std::unique_ptr< EigenLinearSolverBasecreateIterativeSolver (EigenOption::PreconType precon_type)
std::unique_ptr< EigenLinearSolverBasecreateIterativeSolver (EigenOption::SolverType solver_type, EigenOption::PreconType precon_type, EigenOption::TriangularMatrixType triangular_matrix_type)

Typedef Documentation

◆ EigenCGSolverL

template<typename Mat, typename Precon>
using MathLib::details::EigenCGSolverL = Eigen::ConjugateGradient<Mat, Eigen::Lower, Precon>

Definition at line 401 of file EigenLinearSolver.cpp.

◆ EigenCGSolverLU

template<typename Mat, typename Precon>
using MathLib::details::EigenCGSolverLU
Initial value:
Eigen::ConjugateGradient<Mat, Eigen::Lower | Eigen::Upper, Precon>

Definition at line 407 of file EigenLinearSolver.cpp.

◆ EigenCGSolverU

template<typename Mat, typename Precon>
using MathLib::details::EigenCGSolverU = Eigen::ConjugateGradient<Mat, Eigen::Upper, Precon>

Definition at line 404 of file EigenLinearSolver.cpp.

Function Documentation

◆ createIterativeSolver() [1/3]

template<template< typename, typename > class Solver, typename Precon>
std::unique_ptr< EigenLinearSolverBase > MathLib::details::createIterativeSolver ( )

Definition at line 367 of file EigenLinearSolver.cpp.

368{
369 using Slv =
371 return std::make_unique<Slv>();
372}
Template class for Eigen iterative linear solvers.

Referenced by MathLib::EigenLinearSolver::EigenLinearSolver(), createIterativeSolver(), and createIterativeSolver().

◆ createIterativeSolver() [2/3]

template<template< typename, typename > class Solver>
std::unique_ptr< EigenLinearSolverBase > MathLib::details::createIterativeSolver ( EigenOption::PreconType precon_type)

Definition at line 375 of file EigenLinearSolver.cpp.

377{
378 switch (precon_type)
379 {
381 return createIterativeSolver<Solver,
382 Eigen::IdentityPreconditioner>();
385 Solver, Eigen::DiagonalPreconditioner<double>>();
388 Solver, Eigen::LeastSquareDiagonalPreconditioner<double>>();
390 // TODO for this preconditioner further options can be passed.
391 // see
392 // https://libeigen.gitlab.io/docs/classEigen_1_1IncompleteLUT.html
393 return createIterativeSolver<Solver,
394 Eigen::IncompleteLUT<double>>();
395 default:
396 OGS_FATAL("Invalid Eigen preconditioner type.");
397 }
398}
#define OGS_FATAL(...)
Definition Error.h:19
std::unique_ptr< EigenLinearSolverBase > createIterativeSolver()

References createIterativeSolver(), MathLib::EigenOption::DIAGONAL, MathLib::EigenOption::ILUT, MathLib::EigenOption::LeastSquareDIAGONAL, MathLib::EigenOption::NONE, and OGS_FATAL.

◆ createIterativeSolver() [3/3]

std::unique_ptr< EigenLinearSolverBase > MathLib::details::createIterativeSolver ( EigenOption::SolverType solver_type,
EigenOption::PreconType precon_type,
EigenOption::TriangularMatrixType triangular_matrix_type )

Definition at line 410 of file EigenLinearSolver.cpp.

413{
414 switch (solver_type)
415 {
417 {
418 return createIterativeSolver<Eigen::BiCGSTAB>(precon_type);
419 }
421 {
422#ifdef USE_EIGEN_UNSUPPORTED
423#if EIGEN_VERSION_AT_LEAST(3, 4, 90)
424 return createIterativeSolver<Eigen::BiCGSTABL>(precon_type);
425#else
426 OGS_FATAL("BiCGSTABL requires at least Eigen version 3.4.90");
427#endif
428#else
429 OGS_FATAL(
430 "The code is not compiled with the Eigen unsupported modules. "
431 "Linear solver type BiCGSTABL is not available.");
432#endif
433 }
435 {
436 switch (triangular_matrix_type)
437 {
439 return createIterativeSolver<EigenCGSolverU>(precon_type);
441 return createIterativeSolver<EigenCGSolverLU>(precon_type);
442 default:
443 return createIterativeSolver<EigenCGSolverL>(precon_type);
444 }
445 }
447 {
449 precon_type);
450 }
452 {
453#ifdef USE_EIGEN_UNSUPPORTED
454 return createIterativeSolver<Eigen::GMRES>(precon_type);
455#else
456 OGS_FATAL(
457 "The code is not compiled with the Eigen unsupported modules. "
458 "Linear solver type GMRES is not available.");
459#endif
460 }
462 {
463#ifdef USE_EIGEN_UNSUPPORTED
464#if EIGEN_VERSION_AT_LEAST(3, 4, 90)
465 return createIterativeSolver<Eigen::IDRS>(precon_type);
466#else
467 OGS_FATAL("IDRS requires at least Eigen version 3.4.90");
468#endif
469#else
470 OGS_FATAL(
471 "The code is not compiled with the Eigen unsupported modules. "
472 "Linear solver type IDRS is not available.");
473#endif
474 }
476 {
477#ifdef USE_EIGEN_UNSUPPORTED
478#if EIGEN_VERSION_AT_LEAST(3, 4, 90)
479 return createIterativeSolver<Eigen::IDRSTABL>(precon_type);
480#else
481 OGS_FATAL("IDRSTABL requires at least Eigen version 3.4.90");
482#endif
483#else
484 OGS_FATAL(
485 "The code is not compiled with the Eigen unsupported modules. "
486 "Linear solver type IDRSTABL is not available.");
487#endif
488 }
489 default:
490 OGS_FATAL("Invalid Eigen iterative linear solver type. Aborting.");
491 }
492}

References MathLib::EigenOption::BiCGSTAB, MathLib::EigenOption::BiCGSTABL, MathLib::EigenOption::CG, createIterativeSolver(), MathLib::EigenOption::GMRES, MathLib::EigenOption::IDRS, MathLib::EigenOption::IDRSTABL, MathLib::EigenOption::LeastSquareCG, MathLib::EigenOption::LowerUpper, OGS_FATAL, and MathLib::EigenOption::Upper.