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

321{
322 using Slv =
324 return std::make_unique<Slv>();
325}
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 328 of file EigenLinearSolver.cpp.

330{
331 switch (precon_type)
332 {
333 case EigenOption::PreconType::NONE:
334 return createIterativeSolver<Solver,
335 Eigen::IdentityPreconditioner>();
336 case EigenOption::PreconType::DIAGONAL:
338 Solver, Eigen::DiagonalPreconditioner<double>>();
339 case EigenOption::PreconType::ILUT:
340 // TODO for this preconditioner further options can be passed.
341 // see
342 // https://libeigen.gitlab.io/docs/classEigen_1_1IncompleteLUT.html
343 return createIterativeSolver<Solver,
344 Eigen::IncompleteLUT<double>>();
345 default:
346 OGS_FATAL("Invalid Eigen preconditioner type.");
347 }
348}
#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 353 of file EigenLinearSolver.cpp.

355{
356 switch (solver_type)
357 {
358 case EigenOption::SolverType::BiCGSTAB:
359 {
360 return createIterativeSolver<Eigen::BiCGSTAB>(precon_type);
361 }
362 case EigenOption::SolverType::BiCGSTABL:
363 {
364#ifdef USE_EIGEN_UNSUPPORTED
365#if EIGEN_VERSION_AT_LEAST(3, 4, 90)
366 return createIterativeSolver<Eigen::BiCGSTABL>(precon_type);
367#else
368 OGS_FATAL("BiCGSTABL requires at least Eigen version 3.4.90");
369#endif
370#else
371 OGS_FATAL(
372 "The code is not compiled with the Eigen unsupported modules. "
373 "Linear solver type BiCGSTABL is not available.");
374#endif
375 }
376 case EigenOption::SolverType::CG:
377 {
378 return createIterativeSolver<EigenCGSolver>(precon_type);
379 }
380 case EigenOption::SolverType::GMRES:
381 {
382#ifdef USE_EIGEN_UNSUPPORTED
383 return createIterativeSolver<Eigen::GMRES>(precon_type);
384#else
385 OGS_FATAL(
386 "The code is not compiled with the Eigen unsupported modules. "
387 "Linear solver type GMRES is not available.");
388#endif
389 }
390 case EigenOption::SolverType::IDRS:
391 {
392#ifdef USE_EIGEN_UNSUPPORTED
393#if EIGEN_VERSION_AT_LEAST(3, 4, 90)
394 return createIterativeSolver<Eigen::IDRS>(precon_type);
395#else
396 OGS_FATAL("IDRS 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 IDRS is not available.");
402#endif
403 }
404 case EigenOption::SolverType::IDRSTABL:
405 {
406#ifdef USE_EIGEN_UNSUPPORTED
407#if EIGEN_VERSION_AT_LEAST(3, 4, 90)
408 return createIterativeSolver<Eigen::IDRSTABL>(precon_type);
409#else
410 OGS_FATAL("IDRSTABL requires at least Eigen version 3.4.90");
411#endif
412#else
413 OGS_FATAL(
414 "The code is not compiled with the Eigen unsupported modules. "
415 "Linear solver type IDRSTABL is not available.");
416#endif
417 }
418 default:
419 OGS_FATAL("Invalid Eigen iterative linear solver type. Aborting.");
420 }
421}

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