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 EigenCGSolver = Eigen::ConjugateGradient<Mat, Eigen::Lower, Precon>
 

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)
 

Typedef Documentation

◆ EigenCGSolver

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

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

349{
350 using Slv =
352 return std::make_unique<Slv>();
353}
Template class for Eigen iterative linear solvers.

Referenced by MathLib::EigenLinearSolver::EigenLinearSolver(), 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 356 of file EigenLinearSolver.cpp.

358{
359 switch (precon_type)
360 {
361 case EigenOption::PreconType::NONE:
362 return createIterativeSolver<Solver,
363 Eigen::IdentityPreconditioner>();
364 case EigenOption::PreconType::DIAGONAL:
366 Solver, Eigen::DiagonalPreconditioner<double>>();
367 case EigenOption::PreconType::ILUT:
368 // TODO for this preconditioner further options can be passed.
369 // see
370 // https://libeigen.gitlab.io/docs/classEigen_1_1IncompleteLUT.html
371 return createIterativeSolver<Solver,
372 Eigen::IncompleteLUT<double>>();
373 default:
374 OGS_FATAL("Invalid Eigen preconditioner type.");
375 }
376}
#define OGS_FATAL(...)
Definition Error.h:26
std::unique_ptr< EigenLinearSolverBase > createIterativeSolver()

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

◆ createIterativeSolver() [3/3]

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

Definition at line 381 of file EigenLinearSolver.cpp.

383{
384 switch (solver_type)
385 {
386 case EigenOption::SolverType::BiCGSTAB:
387 {
388 return createIterativeSolver<Eigen::BiCGSTAB>(precon_type);
389 }
390 case EigenOption::SolverType::BiCGSTABL:
391 {
392#ifdef USE_EIGEN_UNSUPPORTED
393#if EIGEN_VERSION_AT_LEAST(3, 4, 90)
394 return createIterativeSolver<Eigen::BiCGSTABL>(precon_type);
395#else
396 OGS_FATAL("BiCGSTABL requires at least Eigen version 3.4.90");
397#endif
398#else
399 OGS_FATAL(
400 "The code is not compiled with the Eigen unsupported modules. "
401 "Linear solver type BiCGSTABL is not available.");
402#endif
403 }
404 case EigenOption::SolverType::CG:
405 {
406 return createIterativeSolver<EigenCGSolver>(precon_type);
407 }
408 case EigenOption::SolverType::GMRES:
409 {
410#ifdef USE_EIGEN_UNSUPPORTED
411 return createIterativeSolver<Eigen::GMRES>(precon_type);
412#else
413 OGS_FATAL(
414 "The code is not compiled with the Eigen unsupported modules. "
415 "Linear solver type GMRES is not available.");
416#endif
417 }
418 case EigenOption::SolverType::IDRS:
419 {
420#ifdef USE_EIGEN_UNSUPPORTED
421#if EIGEN_VERSION_AT_LEAST(3, 4, 90)
422 return createIterativeSolver<Eigen::IDRS>(precon_type);
423#else
424 OGS_FATAL("IDRS requires at least Eigen version 3.4.90");
425#endif
426#else
427 OGS_FATAL(
428 "The code is not compiled with the Eigen unsupported modules. "
429 "Linear solver type IDRS is not available.");
430#endif
431 }
432 case EigenOption::SolverType::IDRSTABL:
433 {
434#ifdef USE_EIGEN_UNSUPPORTED
435#if EIGEN_VERSION_AT_LEAST(3, 4, 90)
436 return createIterativeSolver<Eigen::IDRSTABL>(precon_type);
437#else
438 OGS_FATAL("IDRSTABL requires at least Eigen version 3.4.90");
439#endif
440#else
441 OGS_FATAL(
442 "The code is not compiled with the Eigen unsupported modules. "
443 "Linear solver type IDRSTABL is not available.");
444#endif
445 }
446 default:
447 OGS_FATAL("Invalid Eigen iterative linear solver type. Aborting.");
448 }
449}

References MathLib::EigenOption::BiCGSTAB, MathLib::EigenOption::BiCGSTABL, MathLib::EigenOption::CG, MathLib::EigenOption::GMRES, MathLib::EigenOption::IDRS, MathLib::EigenOption::IDRSTABL, and OGS_FATAL.