Loading [MathJax]/extensions/tex2jax.js
OGS
NonlinearSolver.h
Go to the documentation of this file.
1
11#pragma once
12
13#include <memory>
14#include <utility>
15
19#include "NonlinearSystem.h"
20#include "Types.h"
21
22namespace BaseLib
23{
24class ConfigTree;
25}
26
27// TODO Document in the ODE solver lib, which matrices and vectors that are
28// passed around as method arguments are guaranteed to be of the right size
29// (and zeroed out) and which are not.
30
31namespace NumLib
32{
37{
38public:
40 std::vector<GlobalVector*> const& x,
41 std::vector<GlobalVector*> const& x_prev, int const process_id) = 0;
42
54 std::vector<GlobalVector*>& x,
55 std::vector<GlobalVector*> const& x_prev,
56 std::function<void(int, bool, std::vector<GlobalVector*> const&)> const&
57 postIterationCallback,
58 int const process_id) = 0;
59
60 virtual ~NonlinearSolverBase() = default;
61};
62
65
70template <NonlinearSolverTag NLTag>
72
75template <>
77 : public NonlinearSolverBase
78{
79public:
82
95 GlobalLinearSolver& linear_solver,
96 int const maxiter,
97 int const recompute_jacobian = 1,
98 double const damping = 1.0,
99 std::optional<double> const damping_reduction = std::nullopt)
100 : _linear_solver(linear_solver),
101 _maxiter(maxiter),
102 _recompute_jacobian(recompute_jacobian),
103 _damping(damping),
104 _damping_reduction(damping_reduction)
105 {
106 }
107
109
113 {
114 _equation_system = &eq;
115 _convergence_criterion = &conv_crit;
116 }
117
118 void calculateNonEquilibriumInitialResiduum(
119 std::vector<GlobalVector*> const& x,
120 std::vector<GlobalVector*> const& x_prev,
121 int const process_id) override;
122
124 std::vector<GlobalVector*>& x,
125 std::vector<GlobalVector*> const& x_prev,
126 std::function<void(int, bool, std::vector<GlobalVector*> const&)> const&
127 postIterationCallback,
128 int const process_id) override;
129
131 {
132 _compensate_non_equilibrium_initial_residuum = value;
133 }
134
135private:
137 System* _equation_system = nullptr;
138
139 // TODO doc
140 ConvergenceCriterion* _convergence_criterion = nullptr;
141 int const _maxiter;
142
143 int const _recompute_jacobian = 1;
144
149 double const _damping;
150
154 std::optional<double> const _damping_reduction;
155
156 GlobalVector* _r_neq = nullptr;
157 std::size_t _res_id = 0u;
158 std::size_t _J_id = 0u;
159 std::size_t _minus_delta_x_id = 0u;
160 std::size_t _x_new_id =
161 0u;
162 std::size_t _r_neq_id = 0u;
164
170 bool _compensate_non_equilibrium_initial_residuum = false;
171};
172
177template <>
179 : public NonlinearSolverBase
180{
181public:
184
191 explicit NonlinearSolver(GlobalLinearSolver& linear_solver,
192 const int maxiter)
193 : _linear_solver(linear_solver), _maxiter(maxiter)
194 {
195 }
196
198
202 {
203 _equation_system = &eq;
204 _convergence_criterion = &conv_crit;
205 }
206
207 void calculateNonEquilibriumInitialResiduum(
208 std::vector<GlobalVector*> const& x,
209 std::vector<GlobalVector*> const& x_prev,
210 int const process_id) override;
211
213 std::vector<GlobalVector*>& x,
214 std::vector<GlobalVector*> const& x_prev,
215 std::function<void(int, bool, std::vector<GlobalVector*> const&)> const&
216 postIterationCallback,
217 int const process_id) override;
218
220 {
221 _compensate_non_equilibrium_initial_residuum = value;
222 }
223
224private:
226 System* _equation_system = nullptr;
227
228 // TODO doc
229 ConvergenceCriterion* _convergence_criterion = nullptr;
230 const int _maxiter;
231
232 GlobalVector* _r_neq = nullptr;
233 std::size_t _A_id = 0u;
234 std::size_t _rhs_id = 0u;
235 std::size_t _x_new_id = 0u;
237 std::size_t _r_neq_id = 0u;
239
240 // clang-format off
242 bool _compensate_non_equilibrium_initial_residuum = false;
243 // clang-format on
244};
245
256std::pair<std::unique_ptr<NonlinearSolverBase>, NonlinearSolverTag>
258 BaseLib::ConfigTree const& config);
259
261
262} // namespace NumLib
Global vector based on Eigen vector.
Definition EigenVector.h:26
virtual ~NonlinearSolverBase()=default
virtual NonlinearSolverStatus solve(std::vector< GlobalVector * > &x, std::vector< GlobalVector * > const &x_prev, std::function< void(int, bool, std::vector< GlobalVector * > const &)> const &postIterationCallback, int const process_id)=0
virtual void calculateNonEquilibriumInitialResiduum(std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, int const process_id)=0
void setEquationSystem(System &eq, ConvergenceCriterion &conv_crit)
NonlinearSolver(GlobalLinearSolver &linear_solver, int const maxiter, int const recompute_jacobian=1, double const damping=1.0, std::optional< double > const damping_reduction=std::nullopt)
int const _maxiter
maximum number of iterations
const int _maxiter
maximum number of iterations
NonlinearSolver(GlobalLinearSolver &linear_solver, const int maxiter)
void setEquationSystem(System &eq, ConvergenceCriterion &conv_crit)
NonlinearSolverTag
Tag used to specify which nonlinear solver will be used.
Definition Types.h:20
std::pair< std::unique_ptr< NonlinearSolverBase >, NonlinearSolverTag > createNonlinearSolver(GlobalLinearSolver &linear_solver, BaseLib::ConfigTree const &config)
Status of the non-linear solver.