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

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

160 {
161  using Slv =
162  EigenIterativeLinearSolver<Solver<EigenMatrix::RawMatrixType, Precon>>;
163  return std::make_unique<Slv>();
164 }

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

169 {
170  switch (precon_type)
171  {
172  case EigenOption::PreconType::NONE:
173  return createIterativeSolver<Solver,
174  Eigen::IdentityPreconditioner>();
175  case EigenOption::PreconType::DIAGONAL:
176  return createIterativeSolver<
177  Solver, Eigen::DiagonalPreconditioner<double>>();
178  case EigenOption::PreconType::ILUT:
179  // TODO for this preconditioner further options can be passed.
180  // see
181  // https://eigen.tuxfamily.org/dox/classEigen_1_1IncompleteLUT.html
182  return createIterativeSolver<Solver,
183  Eigen::IncompleteLUT<double>>();
184  default:
185  OGS_FATAL("Invalid Eigen preconditioner type.");
186  }
187 }
#define OGS_FATAL(...)
Definition: Error.h:26
std::unique_ptr< EigenLinearSolverBase > createIterativeSolver(EigenOption::SolverType solver_type, EigenOption::PreconType precon_type)

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

194 {
195  switch (solver_type)
196  {
197  case EigenOption::SolverType::BiCGSTAB:
198  {
199  return createIterativeSolver<Eigen::BiCGSTAB>(precon_type);
200  }
201  case EigenOption::SolverType::CG:
202  {
203  return createIterativeSolver<EigenCGSolver>(precon_type);
204  }
205  case EigenOption::SolverType::GMRES:
206  {
207 #ifdef USE_EIGEN_UNSUPPORTED
208  return createIterativeSolver<Eigen::GMRES>(precon_type);
209 #else
210  OGS_FATAL(
211  "The code is not compiled with the Eigen unsupported modules. "
212  "Linear solver type GMRES is not available.");
213 #endif
214  }
215  default:
216  OGS_FATAL("Invalid Eigen iterative linear solver type. Aborting.");
217  }
218 }

References MathLib::EigenOption::BiCGSTAB, MathLib::EigenOption::CG, MathLib::EigenOption::GMRES, and OGS_FATAL.