OGS
ConvergenceCriterion.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
7#include "BaseLib/Error.h"
12
13namespace NumLib
14{
15std::unique_ptr<ConvergenceCriterion> createConvergenceCriterion(
16 const BaseLib::ConfigTree& config)
17{
19 auto const type = config.peekConfigParameter<std::string>("type");
20
21 if (type == "DeltaX")
22 {
24 }
25 if (type == "Residual")
26 {
28 }
29 if (type == "PerComponentDeltaX")
30 {
32 }
33 if (type == "PerComponentResidual")
34 {
36 }
37
38 OGS_FATAL("There is no convergence criterion of type `{:s}'.", type);
39}
40
41bool checkRelativeTolerance(const double reltol, const double numerator,
42 const double denominator)
43{
44 auto const eps = std::numeric_limits<double>::epsilon();
45 return std::abs(numerator) <
46 std::abs(reltol) * (std::abs(denominator) + eps);
47}
48
49} // namespace NumLib
#define OGS_FATAL(...)
Definition Error.h:19
T peekConfigParameter(std::string const &param) const
bool checkRelativeTolerance(const double reltol, const double numerator, const double denominator)
std::unique_ptr< ConvergenceCriterionResidual > createConvergenceCriterionResidual(const BaseLib::ConfigTree &config)
std::unique_ptr< ConvergenceCriterionPerComponentDeltaX > createConvergenceCriterionPerComponentDeltaX(const BaseLib::ConfigTree &config)
std::unique_ptr< ConvergenceCriterion > createConvergenceCriterion(const BaseLib::ConfigTree &config)
Creates a convergence criterion from the given configuration.
std::unique_ptr< ConvergenceCriterionDeltaX > createConvergenceCriterionDeltaX(const BaseLib::ConfigTree &config)
std::unique_ptr< ConvergenceCriterionPerComponentResidual > createConvergenceCriterionPerComponentResidual(const BaseLib::ConfigTree &config)