OGS
LinearSolverOptionsParser.cpp
Go to the documentation of this file.
1
12
13#include "BaseLib/ConfigTree.h"
14#include "BaseLib/Error.h"
16
17namespace MathLib
18{
19std::tuple<std::string, EigenOption>
21 std::string const& prefix,
22 BaseLib::ConfigTree const* const solver_config) const
23{
24 if (!solver_config)
25 {
26 return {prefix, EigenOption{}};
27 }
28
29 ignoreOtherLinearSolvers(*solver_config, "eigen");
31 auto const config = solver_config->getConfigSubtreeOptional("eigen");
32 if (!config)
33 {
35 "OGS was compiled with Eigen but the config section in the "
36 "project file seems to be invalid");
37 }
38
39 EigenOption options;
40
41 if (auto solver_type =
43 config->getConfigParameterOptional<std::string>("solver_type"))
44 {
46 }
47 if (auto precon_type =
49 config->getConfigParameterOptional<std::string>("precon_type"))
50 {
52 }
53 if (auto error_tolerance =
55 config->getConfigParameterOptional<double>("error_tolerance"))
56 {
57 options.error_tolerance = *error_tolerance;
58 }
59 if (auto max_iteration_step =
61 config->getConfigParameterOptional<int>("max_iteration_step"))
62 {
63 options.max_iterations = *max_iteration_step;
64 }
65 if (auto triangular_matrix_type =
67 config->getConfigParameterOptional<std::string>("triangular_matrix"))
68 {
71 *triangular_matrix_type);
72 }
73 if (auto scaling =
75 config->getConfigParameterOptional<bool>("scaling"))
76 {
77#ifdef USE_EIGEN_UNSUPPORTED
78 options.scaling = *scaling;
79#else
81 "The code is not compiled with the Eigen unsupported modules. "
82 "scaling is not available.");
83#endif
84 }
85 if (auto restart =
87 config->getConfigParameterOptional<int>("restart"))
88 {
89#ifdef USE_EIGEN_UNSUPPORTED
90 options.restart = *restart;
91#else
93 "The code is not compiled with the Eigen unsupported modules. "
94 "GMRES/GMRES option restart is not available.");
95#endif
96 }
97 if (auto l =
99 config->getConfigParameterOptional<int>("l"))
100 {
101#ifdef USE_EIGEN_UNSUPPORTED
102 options.l = *l;
103#else
104 OGS_FATAL(
105 "The code is not compiled with the Eigen unsupported modules.");
106#endif
107 }
108 if (auto s =
110 config->getConfigParameterOptional<int>("s"))
111 {
112#ifdef USE_EIGEN_UNSUPPORTED
113 options.s = *s;
114#else
115 OGS_FATAL(
116 "The code is not compiled with the Eigen unsupported modules.");
117#endif
118 }
119 if (auto smoothing =
121 config->getConfigParameterOptional<int>("smoothing"))
122 {
123#ifdef USE_EIGEN_UNSUPPORTED
124 options.smoothing = *smoothing;
125#else
126 OGS_FATAL(
127 "The code is not compiled with the Eigen unsupported modules.");
128#endif
129 }
130 if (auto angle =
132 config->getConfigParameterOptional<int>("angle"))
133 {
134#ifdef USE_EIGEN_UNSUPPORTED
135 options.angle = *angle;
136#else
137 OGS_FATAL(
138 "The code is not compiled with the Eigen unsupported modules.");
139#endif
140 }
141 if (auto residualupdate =
143 config->getConfigParameterOptional<int>("residual_update"))
144 {
145#ifdef USE_EIGEN_UNSUPPORTED
146 options.residualupdate = *residualupdate;
147#else
148 OGS_FATAL(
149 "The code is not compiled with the Eigen unsupported modules.");
150#endif
151 }
152 return {prefix, options};
153}
154} // namespace MathLib
#define OGS_FATAL(...)
Definition Error.h:26
std::optional< ConfigTree > getConfigSubtreeOptional(std::string const &root) const
static const double s
void ignoreOtherLinearSolvers(const BaseLib::ConfigTree &config, const std::string &solver_name)
Option for Eigen sparse solver.
Definition EigenOption.h:19
static TriangularMatrixType getTriangularMatrixType(const std::string &triangular_matrix_name)
PreconType precon_type
Preconditioner type.
Definition EigenOption.h:54
TriangularMatrixType triangular_matrix_type
Triangular Matrix Type.
Definition EigenOption.h:56
static PreconType getPreconType(const std::string &precon_name)
SolverType solver_type
Linear solver type.
Definition EigenOption.h:52
double error_tolerance
Error tolerance.
Definition EigenOption.h:60
static SolverType getSolverType(const std::string &solver_name)
int max_iterations
Maximum iteration count.
Definition EigenOption.h:58