OGS
MathLib::EigenLinearSolver Class Referencefinal

Detailed Description

Definition at line 19 of file EigenLinearSolver.h.

#include <EigenLinearSolver.h>

Collaboration diagram for MathLib::EigenLinearSolver:
[legend]

Public Member Functions

 EigenLinearSolver (std::string const &solver_name, EigenOption const &option)
 ~EigenLinearSolver ()
void setOption (const EigenOption &option)
EigenOptiongetOption ()
bool compute (EigenMatrix &A, MathLib::LinearSolverBehaviour const linear_solver_behaviour)
bool solve (EigenVector &b, EigenVector &x)
bool solve (EigenMatrix &A, EigenVector &b, EigenVector &x, MathLib::LinearSolverBehaviour const linear_solver_behaviour=MathLib::LinearSolverBehaviour::RECOMPUTE)
 Computes and solves in a single call.
bool canSolveRectangular () const
 Get, if the solver can handle rectangular equation systems.
bool willCompute (MathLib::LinearSolverBehaviour const linear_solver_behaviour) const

Protected Member Functions

void setRestart ()
void setL ()
void setS ()
void setSmoothing ()
void setAngle ()
void setResidualUpdate ()

Protected Attributes

EigenOption option_
std::unique_ptr< EigenLinearSolverBasesolver_
bool can_solve_rectangular_ = false

Constructor & Destructor Documentation

◆ EigenLinearSolver()

MathLib::EigenLinearSolver::EigenLinearSolver ( std::string const & solver_name,
EigenOption const & option )
explicit

Constructor

Parameters
solver_nameA name used as a prefix for command line options if there are such options available.
optionEigen linear solver options.

Definition at line 496 of file EigenLinearSolver.cpp.

498 : option_(option)
499{
500 using Matrix = EigenMatrix::RawMatrixType;
501
502 switch (option_.solver_type)
503 {
505 {
506 using SolverType =
507 Eigen::SparseLU<Matrix, Eigen::COLAMDOrdering<int>>;
508 solver_ = std::make_unique<
509 details::EigenDirectLinearSolver<SolverType>>();
511 return;
512 }
519 solver_ =
521 option_.precon_type,
522 option_.triangular_matrix_type);
524 return;
526 solver_ =
528 option_.precon_type,
529 option_.triangular_matrix_type);
531 return;
533 {
534#ifdef USE_MKL
535 using SolverType = Eigen::PardisoLU<EigenMatrix::RawMatrixType>;
536 solver_.reset(new details::EigenDirectLinearSolver<SolverType>);
538 return;
539#else
540 OGS_FATAL(
541 "The code is not compiled with Intel MKL. Linear solver type "
542 "PardisoLU is not available.");
543#endif
544 }
545 }
546
547 OGS_FATAL("Invalid Eigen linear solver type. Aborting.");
548}
#define OGS_FATAL(...)
Definition Error.h:19
std::unique_ptr< EigenLinearSolverBase > solver_
Eigen::SparseMatrix< double, Eigen::RowMajor > RawMatrixType
Definition EigenMatrix.h:24
std::unique_ptr< EigenLinearSolverBase > createIterativeSolver()

References MathLib::EigenOption::BiCGSTAB, MathLib::EigenOption::BiCGSTABL, can_solve_rectangular_, MathLib::EigenOption::CG, MathLib::details::createIterativeSolver(), MathLib::EigenOption::GMRES, MathLib::EigenOption::IDRS, MathLib::EigenOption::IDRSTABL, MathLib::EigenOption::LeastSquareCG, option_, MathLib::EigenOption::PardisoLU, and solver_.

◆ ~EigenLinearSolver()

MathLib::EigenLinearSolver::~EigenLinearSolver ( )
default

Member Function Documentation

◆ canSolveRectangular()

bool MathLib::EigenLinearSolver::canSolveRectangular ( ) const
inline

Get, if the solver can handle rectangular equation systems.

Definition at line 68 of file EigenLinearSolver.h.

68{ return can_solve_rectangular_; }

References can_solve_rectangular_.

◆ compute()

bool MathLib::EigenLinearSolver::compute ( EigenMatrix & A,
MathLib::LinearSolverBehaviour const linear_solver_behaviour )

Performs the compute() step of the Eigen linear solver.

I.e., computes the (LU) decomposition in case of a direct solver, or computes the preconditioner of an iterative solver.

Definition at line 552 of file EigenLinearSolver.cpp.

555{
556 INFO("------------------------------------------------------------------");
557 INFO("*** Eigen solver compute()");
558
559 return solver_->compute(A.getRawMatrix(), option_, linear_solver_behaviour);
560}
void INFO(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:28

References compute(), MathLib::EigenMatrix::getRawMatrix(), INFO(), option_, and solver_.

Referenced by compute().

◆ getOption()

EigenOption & MathLib::EigenLinearSolver::getOption ( )
inline

get linear solver options

Definition at line 41 of file EigenLinearSolver.h.

41{ return option_; }

References option_.

◆ setAngle()

void MathLib::EigenLinearSolver::setAngle ( )
protected

◆ setL()

void MathLib::EigenLinearSolver::setL ( )
protected

◆ setOption()

void MathLib::EigenLinearSolver::setOption ( const EigenOption & option)
inline

copy linear solvers options

Definition at line 36 of file EigenLinearSolver.h.

36{ option_ = option; }

References option_.

◆ setResidualUpdate()

void MathLib::EigenLinearSolver::setResidualUpdate ( )
protected

◆ setRestart()

void MathLib::EigenLinearSolver::setRestart ( )
protected

◆ setS()

void MathLib::EigenLinearSolver::setS ( )
protected

◆ setSmoothing()

void MathLib::EigenLinearSolver::setSmoothing ( )
protected

◆ solve() [1/2]

bool MathLib::EigenLinearSolver::solve ( EigenMatrix & A,
EigenVector & b,
EigenVector & x,
MathLib::LinearSolverBehaviour const linear_solver_behaviour = MathLib::LinearSolverBehaviour::RECOMPUTE )

Computes and solves in a single call.

Definition at line 570 of file EigenLinearSolver.cpp.

573{
574 return solver_->compute(A.getRawMatrix(), option_,
575 linear_solver_behaviour) &&
576 solver_->solve(b.getRawVector(), x.getRawVector(), option_);
577}

References MathLib::EigenMatrix::getRawMatrix(), MathLib::EigenVector::getRawVector(), option_, solve(), and solver_.

◆ solve() [2/2]

bool MathLib::EigenLinearSolver::solve ( EigenVector & b,
EigenVector & x )

Solves the linear system for the given right-hand side b and initial guess x.

Precondition
compute() must have been called before. (Not necessarily for every x and b separately, but for every new/changed matrix A.

Definition at line 562 of file EigenLinearSolver.cpp.

563{
564 INFO("------------------------------------------------------------------");
565 INFO("*** Eigen solver solve()");
566
567 return solver_->solve(b.getRawVector(), x.getRawVector(), option_);
568}

References MathLib::EigenVector::getRawVector(), INFO(), option_, solve(), and solver_.

Referenced by solve(), and solve().

◆ willCompute()

bool MathLib::EigenLinearSolver::willCompute ( MathLib::LinearSolverBehaviour const linear_solver_behaviour) const

Tells if the solver will perform the compute step the next time it is called or if it can reuse the results from the preceding call.

Definition at line 579 of file EigenLinearSolver.cpp.

581{
582 return linear_solver_behaviour != MathLib::LinearSolverBehaviour::REUSE ||
583 !solver_->didComputeAtLeastOnce();
584}

References MathLib::REUSE, solver_, and willCompute().

Referenced by willCompute().

Member Data Documentation

◆ can_solve_rectangular_

bool MathLib::EigenLinearSolver::can_solve_rectangular_ = false
protected

Definition at line 78 of file EigenLinearSolver.h.

Referenced by EigenLinearSolver(), and canSolveRectangular().

◆ option_

EigenOption MathLib::EigenLinearSolver::option_
protected

Definition at line 76 of file EigenLinearSolver.h.

Referenced by EigenLinearSolver(), compute(), getOption(), setOption(), solve(), and solve().

◆ solver_

std::unique_ptr<EigenLinearSolverBase> MathLib::EigenLinearSolver::solver_
protected

Definition at line 77 of file EigenLinearSolver.h.

Referenced by EigenLinearSolver(), compute(), solve(), solve(), and willCompute().


The documentation for this class was generated from the following files: