OGS
MathLib::EigenLinearSolver Class Referencefinal

Detailed Description

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

505 : option_(option)
506{
507 using Matrix = EigenMatrix::RawMatrixType;
508
509 switch (option_.solver_type)
510 {
512 {
513 using SolverType =
514 Eigen::SparseLU<Matrix, Eigen::COLAMDOrdering<int>>;
515 solver_ = std::make_unique<
516 details::EigenDirectLinearSolver<SolverType>>();
518 return;
519 }
526 solver_ =
528 option_.precon_type,
529 option_.triangular_matrix_type);
531 return;
533 solver_ =
535 option_.precon_type,
536 option_.triangular_matrix_type);
538 return;
540 {
541#ifdef USE_MKL
542 using SolverType = Eigen::PardisoLU<EigenMatrix::RawMatrixType>;
543 solver_.reset(new details::EigenDirectLinearSolver<SolverType>);
545 return;
546#else
547 OGS_FATAL(
548 "The code is not compiled with Intel MKL. Linear solver type "
549 "PardisoLU is not available.");
550#endif
551 }
552 }
553
554 OGS_FATAL("Invalid Eigen linear solver type. Aborting.");
555}
#define OGS_FATAL(...)
Definition Error.h:26
std::unique_ptr< EigenLinearSolverBase > solver_
Eigen::SparseMatrix< double, Eigen::RowMajor > RawMatrixType
Definition EigenMatrix.h:31
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 75 of file EigenLinearSolver.h.

75{ 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 559 of file EigenLinearSolver.cpp.

562{
563 INFO("------------------------------------------------------------------");
564 INFO("*** Eigen solver compute()");
565
566 return solver_->compute(A.getRawMatrix(), option_, linear_solver_behaviour);
567}
void INFO(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:36

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 48 of file EigenLinearSolver.h.

48{ 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 43 of file EigenLinearSolver.h.

43{ 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 577 of file EigenLinearSolver.cpp.

580{
581 return solver_->compute(A.getRawMatrix(), option_,
582 linear_solver_behaviour) &&
583 solver_->solve(b.getRawVector(), x.getRawVector(), option_);
584}

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

570{
571 INFO("------------------------------------------------------------------");
572 INFO("*** Eigen solver solve()");
573
574 return solver_->solve(b.getRawVector(), x.getRawVector(), option_);
575}

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

588{
589 return linear_solver_behaviour != MathLib::LinearSolverBehaviour::REUSE ||
590 !solver_->didComputeAtLeastOnce();
591}

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 85 of file EigenLinearSolver.h.

Referenced by EigenLinearSolver(), and canSolveRectangular().

◆ option_

EigenOption MathLib::EigenLinearSolver::option_
protected

Definition at line 83 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 84 of file EigenLinearSolver.h.

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


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