OGS
ConvergenceCriterion.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
8#include "MathLib/LinAlg/LinAlg.h" // For MathLib::VecNormType
10
11namespace BaseLib
12{
13class ConfigTree;
14} // namespace BaseLib
15
16namespace NumLib
17{
25{
26public:
28 : _norm_type(norm_type)
29 {
30 }
31
37 virtual bool hasDeltaXCheck() const = 0;
38
44 virtual bool hasResidualCheck() const = 0;
45
46 virtual bool hasNonNegativeDamping() const = 0;
47
57 virtual void checkDeltaX(GlobalVector const& minus_delta_x,
58 GlobalVector const& x) = 0;
59
61 virtual void checkResidual(GlobalVector const& residual) = 0;
62
63 virtual double getDampingFactor(GlobalVector const& minus_delta_x,
64 GlobalVector const& x,
65 double damping_orig) = 0;
66
69 virtual void preFirstIteration() { _is_first_iteration = true; }
70
73 virtual void setNoFirstIteration() { _is_first_iteration = false; }
74
82 virtual void reset()
83 {
84 _satisfied = true;
85 _is_first_iteration = false;
86 };
87
89 virtual bool isSatisfied() const { return _satisfied; };
90
92
93 virtual ~ConvergenceCriterion() = default;
94
95protected:
96 bool _satisfied = true;
99};
100
102std::unique_ptr<ConvergenceCriterion> createConvergenceCriterion(
103 BaseLib::ConfigTree const& config);
104
108bool checkRelativeTolerance(double const reltol,
109 double const numerator,
110 double const denominator);
111
112} // namespace NumLib
MathLib::EigenVector GlobalVector
virtual double getDampingFactor(GlobalVector const &minus_delta_x, GlobalVector const &x, double damping_orig)=0
MathLib::VecNormType getVectorNormType() const
virtual void checkResidual(GlobalVector const &residual)=0
Check if the residual satisfies the convergence criterion.
virtual bool hasResidualCheck() const =0
virtual bool isSatisfied() const
Tell if the convergence criterion is satisfied.
ConvergenceCriterion(const MathLib::VecNormType norm_type)
virtual void checkDeltaX(GlobalVector const &minus_delta_x, GlobalVector const &x)=0
virtual bool hasDeltaXCheck() const =0
virtual bool hasNonNegativeDamping() const =0
const MathLib::VecNormType _norm_type
virtual ~ConvergenceCriterion()=default
bool checkRelativeTolerance(const double reltol, const double numerator, const double denominator)
std::unique_ptr< ConvergenceCriterion > createConvergenceCriterion(const BaseLib::ConfigTree &config)
Creates a convergence criterion from the given configuration.