Loading [MathJax]/extensions/MathZoom.js
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 406 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 412 of file EigenLinearSolver.cpp.

◆ EigenCGSolverU

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

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

373{
374 using Slv =
376 return std::make_unique<Slv>();
377}
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 380 of file EigenLinearSolver.cpp.

382{
383 switch (precon_type)
384 {
385 case EigenOption::PreconType::NONE:
386 return createIterativeSolver<Solver,
387 Eigen::IdentityPreconditioner>();
388 case EigenOption::PreconType::DIAGONAL:
390 Solver, Eigen::DiagonalPreconditioner<double>>();
391 case EigenOption::PreconType::LeastSquareDIAGONAL:
393 Solver, Eigen::LeastSquareDiagonalPreconditioner<double>>();
394 case EigenOption::PreconType::ILUT:
395 // TODO for this preconditioner further options can be passed.
396 // see
397 // https://libeigen.gitlab.io/docs/classEigen_1_1IncompleteLUT.html
398 return createIterativeSolver<Solver,
399 Eigen::IncompleteLUT<double>>();
400 default:
401 OGS_FATAL("Invalid Eigen preconditioner type.");
402 }
403}
#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 415 of file EigenLinearSolver.cpp.

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

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.