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

◆ EigenCGSolverU

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

Definition at line 411 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 374 of file EigenLinearSolver.cpp.

375{
376 using Slv =
378 return std::make_unique<Slv>();
379}
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 382 of file EigenLinearSolver.cpp.

384{
385 switch (precon_type)
386 {
388 return createIterativeSolver<Solver,
389 Eigen::IdentityPreconditioner>();
392 Solver, Eigen::DiagonalPreconditioner<double>>();
395 Solver, Eigen::LeastSquareDiagonalPreconditioner<double>>();
397 // TODO for this preconditioner further options can be passed.
398 // see
399 // https://libeigen.gitlab.io/docs/classEigen_1_1IncompleteLUT.html
400 return createIterativeSolver<Solver,
401 Eigen::IncompleteLUT<double>>();
402 default:
403 OGS_FATAL("Invalid Eigen preconditioner type.");
404 }
405}
#define OGS_FATAL(...)
Definition Error.h:26
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 417 of file EigenLinearSolver.cpp.

420{
421 switch (solver_type)
422 {
424 {
425 return createIterativeSolver<Eigen::BiCGSTAB>(precon_type);
426 }
428 {
429#ifdef USE_EIGEN_UNSUPPORTED
430#if EIGEN_VERSION_AT_LEAST(3, 4, 90)
431 return createIterativeSolver<Eigen::BiCGSTABL>(precon_type);
432#else
433 OGS_FATAL("BiCGSTABL requires at least Eigen version 3.4.90");
434#endif
435#else
436 OGS_FATAL(
437 "The code is not compiled with the Eigen unsupported modules. "
438 "Linear solver type BiCGSTABL is not available.");
439#endif
440 }
442 {
443 switch (triangular_matrix_type)
444 {
446 return createIterativeSolver<EigenCGSolverU>(precon_type);
448 return createIterativeSolver<EigenCGSolverLU>(precon_type);
449 default:
450 return createIterativeSolver<EigenCGSolverL>(precon_type);
451 }
452 }
454 {
456 precon_type);
457 }
459 {
460#ifdef USE_EIGEN_UNSUPPORTED
461 return createIterativeSolver<Eigen::GMRES>(precon_type);
462#else
463 OGS_FATAL(
464 "The code is not compiled with the Eigen unsupported modules. "
465 "Linear solver type GMRES is not available.");
466#endif
467 }
469 {
470#ifdef USE_EIGEN_UNSUPPORTED
471#if EIGEN_VERSION_AT_LEAST(3, 4, 90)
472 return createIterativeSolver<Eigen::IDRS>(precon_type);
473#else
474 OGS_FATAL("IDRS requires at least Eigen version 3.4.90");
475#endif
476#else
477 OGS_FATAL(
478 "The code is not compiled with the Eigen unsupported modules. "
479 "Linear solver type IDRS is not available.");
480#endif
481 }
483 {
484#ifdef USE_EIGEN_UNSUPPORTED
485#if EIGEN_VERSION_AT_LEAST(3, 4, 90)
486 return createIterativeSolver<Eigen::IDRSTABL>(precon_type);
487#else
488 OGS_FATAL("IDRSTABL requires at least Eigen version 3.4.90");
489#endif
490#else
491 OGS_FATAL(
492 "The code is not compiled with the Eigen unsupported modules. "
493 "Linear solver type IDRSTABL is not available.");
494#endif
495 }
496 default:
497 OGS_FATAL("Invalid Eigen iterative linear solver type. Aborting.");
498 }
499}

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.