OGS
MathLib::EigenLinearSolver Class Referencefinal

Detailed Description

Definition at line 30 of file EigenLinearSolver.h.

#include <EigenLinearSolver.h>

Collaboration diagram for MathLib::EigenLinearSolver:
[legend]

Public Member Functions

 EigenLinearSolver (const std::string &solver_name, BaseLib::ConfigTree const *const option)
 
 ~EigenLinearSolver ()
 
void setOption (const BaseLib::ConfigTree &option)
 
void setOption (const EigenOption &option)
 
EigenOptiongetOption ()
 
bool solve (EigenMatrix &A, EigenVector &b, EigenVector &x)
 

Protected Member Functions

void setRestart ()
 

Protected Attributes

EigenOption option_
 
std::unique_ptr< EigenLinearSolverBasesolver_
 

Constructor & Destructor Documentation

◆ EigenLinearSolver()

MathLib::EigenLinearSolver::EigenLinearSolver ( const std::string &  solver_name,
BaseLib::ConfigTree const *const  option 
)

Constructor

Parameters
solver_nameA name used as a prefix for command line options if there are such options available.
optionA pointer to a linear solver option. In case you omit this argument, default settings follow those of LisOption struct.

Definition at line 222 of file EigenLinearSolver.cpp.

224 {
225  using Matrix = EigenMatrix::RawMatrixType;
226 
227  if (option)
228  {
229  setOption(*option);
230  }
231 
232  // TODO for my taste it is much too unobvious that the default solver type
233  // currently is SparseLU.
234  switch (option_.solver_type)
235  {
237  {
238  using SolverType =
239  Eigen::SparseLU<Matrix, Eigen::COLAMDOrdering<int>>;
240  solver_ = std::make_unique<
241  details::EigenDirectLinearSolver<SolverType>>();
242  return;
243  }
249  return;
251  {
252 #ifdef USE_MKL
253  using SolverType = Eigen::PardisoLU<EigenMatrix::RawMatrixType>;
254  solver_.reset(new details::EigenDirectLinearSolver<SolverType>);
255  return;
256 #else
257  OGS_FATAL(
258  "The code is not compiled with Intel MKL. Linear solver type "
259  "PardisoLU is not available.");
260 #endif
261  }
262  }
263 
264  OGS_FATAL("Invalid Eigen linear solver type. Aborting.");
265 }
#define OGS_FATAL(...)
Definition: Error.h:26
void setOption(const BaseLib::ConfigTree &option)
std::unique_ptr< EigenLinearSolverBase > solver_
Eigen::SparseMatrix< double, Eigen::RowMajor > RawMatrixType
Definition: EigenMatrix.h:31
std::unique_ptr< EigenLinearSolverBase > createIterativeSolver()
PreconType precon_type
Preconditioner type.
Definition: EigenOption.h:41
SolverType solver_type
Linear solver type.
Definition: EigenOption.h:39

References MathLib::EigenOption::BiCGSTAB, MathLib::EigenOption::CG, MathLib::details::createIterativeSolver(), MathLib::EigenOption::GMRES, OGS_FATAL, option_, MathLib::EigenOption::PardisoLU, MathLib::EigenOption::precon_type, setOption(), solver_, MathLib::EigenOption::solver_type, and MathLib::EigenOption::SparseLU.

◆ ~EigenLinearSolver()

MathLib::EigenLinearSolver::~EigenLinearSolver ( )
default

Member Function Documentation

◆ getOption()

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

get linear solver options

Definition at line 59 of file EigenLinearSolver.h.

59 { return option_; }

References option_.

◆ setOption() [1/2]

void MathLib::EigenLinearSolver::setOption ( const BaseLib::ConfigTree option)

parse linear solvers configuration

Input File Parameter:
prj__linear_solvers__linear_solver__eigen
Input File Parameter:
prj__linear_solvers__linear_solver__eigen__solver_type
Input File Parameter:
prj__linear_solvers__linear_solver__eigen__precon_type
Input File Parameter:
prj__linear_solvers__linear_solver__eigen__error_tolerance
Input File Parameter:
prj__linear_solvers__linear_solver__eigen__max_iteration_step
Input File Parameter:
prj__linear_solvers__linear_solver__eigen__scaling
Input File Parameter:
prj__linear_solvers__linear_solver__eigen__restart

Definition at line 269 of file EigenLinearSolver.cpp.

270 {
271  ignoreOtherLinearSolvers(option, "eigen");
273  auto const ptSolver = option.getConfigSubtreeOptional("eigen");
274  if (!ptSolver)
275  {
276  return;
277  }
278 
279  if (auto solver_type =
281  ptSolver->getConfigParameterOptional<std::string>("solver_type"))
282  {
284  }
285  if (auto precon_type =
287  ptSolver->getConfigParameterOptional<std::string>("precon_type"))
288  {
290  }
291  if (auto error_tolerance =
293  ptSolver->getConfigParameterOptional<double>("error_tolerance"))
294  {
295  option_.error_tolerance = *error_tolerance;
296  }
297  if (auto max_iteration_step =
299  ptSolver->getConfigParameterOptional<int>("max_iteration_step"))
300  {
301  option_.max_iterations = *max_iteration_step;
302  }
303  if (auto scaling =
305  ptSolver->getConfigParameterOptional<bool>("scaling"))
306  {
307 #ifdef USE_EIGEN_UNSUPPORTED
308  option_.scaling = *scaling;
309 #else
310  OGS_FATAL(
311  "The code is not compiled with the Eigen unsupported modules. "
312  "scaling is not available.");
313 #endif
314  }
315  if (auto restart =
317  ptSolver->getConfigParameterOptional<int>("restart"))
318  {
319 #ifdef USE_EIGEN_UNSUPPORTED
320  option_.restart = *restart;
321 #else
322  OGS_FATAL(
323  "The code is not compiled with the Eigen unsupported modules. "
324  "GMRES/GMRES option restart is not available.");
325 #endif
326  }
327 }
std::optional< ConfigTree > getConfigSubtreeOptional(std::string const &root) const
Definition: ConfigTree.cpp:155
void ignoreOtherLinearSolvers(const BaseLib::ConfigTree &config, const std::string &solver_name)
static PreconType getPreconType(const std::string &precon_name)
Definition: EigenOption.cpp:56
double error_tolerance
Error tolerance.
Definition: EigenOption.h:45
static SolverType getSolverType(const std::string &solver_name)
Definition: EigenOption.cpp:29
int max_iterations
Maximum iteration count.
Definition: EigenOption.h:43

References MathLib::EigenOption::error_tolerance, BaseLib::ConfigTree::getConfigSubtreeOptional(), MathLib::EigenOption::getPreconType(), MathLib::EigenOption::getSolverType(), MathLib::ignoreOtherLinearSolvers(), MathLib::EigenOption::max_iterations, OGS_FATAL, option_, MathLib::EigenOption::precon_type, and MathLib::EigenOption::solver_type.

Referenced by EigenLinearSolver().

◆ setOption() [2/2]

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

copy linear solvers options

Definition at line 54 of file EigenLinearSolver.h.

54 { option_ = option; }

References option_.

◆ setRestart()

void MathLib::EigenLinearSolver::setRestart ( )
protected

◆ solve()

bool MathLib::EigenLinearSolver::solve ( EigenMatrix A,
EigenVector b,
EigenVector x 
)

Definition at line 329 of file EigenLinearSolver.cpp.

330 {
331  INFO("------------------------------------------------------------------");
332  INFO("*** Eigen solver computation");
333 
334 #ifdef USE_EIGEN_UNSUPPORTED
335  std::unique_ptr<Eigen::IterScaling<EigenMatrix::RawMatrixType>> scal;
336  if (option_.scaling)
337  {
338  INFO("-> scale");
339  scal =
340  std::make_unique<Eigen::IterScaling<EigenMatrix::RawMatrixType>>();
341  scal->computeRef(A.getRawMatrix());
342  b.getRawVector() = scal->LeftScaling().cwiseProduct(b.getRawVector());
343  }
344 #endif
345  auto const success = solver_->solve(A.getRawMatrix(), b.getRawVector(),
346  x.getRawVector(), option_);
347 #ifdef USE_EIGEN_UNSUPPORTED
348  if (scal)
349  {
350  x.getRawVector() = scal->RightScaling().cwiseProduct(x.getRawVector());
351  }
352 #endif
353 
354  INFO("------------------------------------------------------------------");
355 
356  return success;
357 }
void INFO(char const *fmt, Args const &... args)
Definition: Logging.h:32

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

Member Data Documentation

◆ option_

EigenOption MathLib::EigenLinearSolver::option_
protected

Definition at line 64 of file EigenLinearSolver.h.

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

◆ solver_

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

Definition at line 65 of file EigenLinearSolver.h.

Referenced by EigenLinearSolver(), and solve().


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