OGS
DampingReductionStrategy.cpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
5
6#include <algorithm>
7
8#include "DampingPolicy.h"
10
11namespace NumLib
12{
14 double damping_reduction)
15 : _damping(damping), _damping_reduction(damping_reduction)
16{
17}
18
20 GlobalVector const& x,
21 GlobalVector const& minus_delta_x,
22 GlobalVector const& /*res*/,
23 GlobalMatrix const& /*J*/,
24 GlobalVector& x_new,
25 NewtonStepContext& /*ctx*/,
26 int iteration)
27{
28 double damping = _damping;
29
31 {
32 damping = _damping_policy->apply(minus_delta_x, x, _damping);
33 }
34
35 damping +=
36 (1.0 - damping) * std::clamp(iteration / _damping_reduction, 0.0, 1.0);
37
38 MathLib::LinAlg::axpy(x_new, -damping, minus_delta_x);
39
40 return {.success = true, .step_length = damping, .x_new_is_set = true};
41}
42
43} // namespace NumLib
MathLib::EigenMatrix GlobalMatrix
MathLib::EigenVector GlobalVector
DampingReductionStrategy(double damping, double damping_reduction)
StepResult applyStep(GlobalVector const &x, GlobalVector const &minus_delta_x, GlobalVector const &res, GlobalMatrix const &J, GlobalVector &x_new, NewtonStepContext &ctx, int iteration) override
DampingPolicy const * _damping_policy
void axpy(PETScVector &y, PetscScalar const a, PETScVector const &x)
Definition LinAlg.cpp:50
Result returned by a step strategy's applyStep().