OGS
NonlinearSolver.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#pragma once
5
6#include <memory>
7#include <utility>
8
11#include "NewtonStepStrategy.h"
13#include "NonlinearSystem.h"
14#include "Types.h"
15
16namespace BaseLib
17{
18class ConfigTree;
19}
20
21// TODO Document in the ODE solver lib, which matrices and vectors that are
22// passed around as method arguments are guaranteed to be of the right size
23// (and zeroed out) and which are not.
24
25namespace NumLib
26{
31{
32public:
34 std::vector<GlobalVector*> const& x,
35 std::vector<GlobalVector*> const& x_prev, int const process_id) = 0;
36
48 std::vector<GlobalVector*>& x,
49 std::vector<GlobalVector*> const& x_prev,
50 std::function<void(int, std::vector<GlobalVector*> const&)> const&
51 postIterationCallback,
52 int const process_id) = 0;
53
54 virtual ~NonlinearSolverBase() = default;
55};
56
59
64template <NonlinearSolverTag NLTag>
66
69template <>
71 : public NonlinearSolverBase
72{
73public:
76
87 explicit NonlinearSolver(GlobalLinearSolver& linear_solver,
88 int const maxiter,
89 std::unique_ptr<NewtonStepStrategy>
90 newton_strategy,
91 int const recompute_jacobian = 1)
92 : _linear_solver(linear_solver),
93 _maxiter(maxiter),
94 _step_strategy(std::move(newton_strategy)),
95 _recompute_jacobian(recompute_jacobian)
96 {
97 }
98
100
106 {
107 _equation_system = &eq;
108 _convergence_criterion = &conv_crit;
109 _step_strategy->setDampingPolicy(
110 _convergence_criterion->dampingPolicy());
111 }
112
113 void calculateNonEquilibriumInitialResiduum(
114 std::vector<GlobalVector*> const& x,
115 std::vector<GlobalVector*> const& x_prev,
116 int const process_id) override;
117
119 std::vector<GlobalVector*>& x,
120 std::vector<GlobalVector*> const& x_prev,
121 std::function<void(int, std::vector<GlobalVector*> const&)> const&
122 postIterationCallback,
123 int const process_id) override;
124
129
130 void setTikhonovLambda(double const lambda, int const starting_iteration)
131 {
132 _tikhonov_lambda = lambda;
133 _tikhonov_starting_iteration = starting_iteration;
134 }
135
136private:
139
140 int const _maxiter;
141
143 std::unique_ptr<NewtonStepStrategy> _step_strategy;
144
147
149 1;
150
151 GlobalVector* _r_neq = nullptr;
152 std::size_t _res_id = 0u;
153 std::size_t _J_id = 0u;
154 std::size_t _minus_delta_x_id = 0u;
155 std::size_t _x_new_id =
156 0u;
157 std::size_t _r_neq_id = 0u;
159
166 double _tikhonov_lambda = 0.0;
168 0;
169};
170
189template <>
191 : public NonlinearSolverBase
192{
193public:
196
209 explicit NonlinearSolver(GlobalLinearSolver& linear_solver,
210 int const maxiter, int const anderson_depth,
211 double const damping)
212 : _linear_solver(linear_solver),
213 _damping(damping),
214 _anderson_depth(anderson_depth),
215 _maxiter(maxiter)
216 {
217 }
218
220
224 {
225 _equation_system = &eq;
226 _convergence_criterion = &conv_crit;
227 }
228
229 void calculateNonEquilibriumInitialResiduum(
230 std::vector<GlobalVector*> const& x,
231 std::vector<GlobalVector*> const& x_prev,
232 int const process_id) override;
233
235 std::vector<GlobalVector*>& x,
236 std::vector<GlobalVector*> const& x_prev,
237 std::function<void(int, std::vector<GlobalVector*> const&)> const&
238 postIterationCallback,
239 int const process_id) override;
240
245
246private:
249
250 // TODO doc
252
256 double const _damping;
257
261
262 int const _maxiter;
263
264 GlobalVector* _r_neq = nullptr;
265 std::size_t _A_id = 0u;
266 std::size_t _rhs_id = 0u;
267 std::size_t _x_new_id = 0u;
269 std::size_t _r_neq_id = 0u;
271
272 // clang-format off
275 // clang-format on
276};
277
278
279} // namespace NumLib
MathLib::EigenLisLinearSolver GlobalLinearSolver
MathLib::EigenVector GlobalVector
virtual ~NonlinearSolverBase()=default
virtual void calculateNonEquilibriumInitialResiduum(std::vector< GlobalVector * > const &x, std::vector< GlobalVector * > const &x_prev, int const process_id)=0
virtual NonlinearSolverStatus solve(std::vector< GlobalVector * > &x, std::vector< GlobalVector * > const &x_prev, std::function< void(int, std::vector< GlobalVector * > const &)> const &postIterationCallback, int const process_id)=0
ConvergenceCriterion * _convergence_criterion
Convergence criterion used to terminate the Newton iteration.
double _tikhonov_lambda
Tikhonov regularization parameter.
std::size_t _J_id
ID of the Jacobian matrix.
std::size_t _x_new_id
ID of the vector storing .
std::size_t _res_id
ID of the residual vector.
GlobalVector * _r_neq
non-equilibrium initial residuum.
NonlinearSystem< NonlinearSolverTag::Newton > System
Type of the nonlinear equation system to be solved.
void setEquationSystem(System &eq, ConvergenceCriterion &conv_crit)
int const _maxiter
maximum number of iterations
int const _recompute_jacobian
Recompute Jacobian every this many steps.
std::unique_ptr< NewtonStepStrategy > _step_strategy
Globalization / step-acceptance strategy (e.g. fixed damping).
void setTikhonovLambda(double const lambda, int const starting_iteration)
NonlinearSolver(GlobalLinearSolver &linear_solver, int const maxiter, std::unique_ptr< NewtonStepStrategy > newton_strategy, int const recompute_jacobian=1)
int _tikhonov_starting_iteration
Starting iteration for Tikhonov regularization.
std::size_t _rhs_id
ID of the right-hand side vector.
GlobalVector * _r_neq
non-equilibrium initial residuum.
NonlinearSolver(GlobalLinearSolver &linear_solver, int const maxiter, int const anderson_depth, double const damping)
int const _maxiter
maximum number of iterations
void setEquationSystem(System &eq, ConvergenceCriterion &conv_crit)
NonlinearSystem< NonlinearSolverTag::Picard > System
Type of the nonlinear equation system to be solved.
NonlinearSolverTag
Tag used to specify which nonlinear solver will be used.
Definition Types.h:13
Status of the non-linear solver.