Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <cstddef> 7 : 8 : #include "Options/String.hpp" 9 : #include "Utilities/TMPL.hpp" 10 : 11 : /// \cond 12 : namespace PUP { 13 : class er; 14 : } // namespace PUP 15 : /// \endcond 16 : 17 : namespace Convergence { 18 : 19 : /*! 20 : * \brief Criteria that determine an iterative algorithm has converged 21 : * 22 : * \details Most criteria are based on a residual magnitude 23 : * \f$r_k\f$ after completion of an iteration \f$k\f$ (see, for instance, the 24 : * \ref LinearSolverGroup documentation, `LinearSolver::Tags::Residual` and 25 : * `LinearSolver::Tags::Magnitude`). 26 : * 27 : * The following criteria are implemented, ordered from highest to lowest 28 : * priority: 29 : * 30 : * - AbsoluteResidual: Matches if the residual has reached this magnitude. 31 : * - RelativeResidual: Matches if the residual has decreased by this factor, 32 : * relative to the start of the first iteration. 33 : * - MaxIterations: Matches if the number of iterations exceeds this limit. 34 : */ 35 1 : struct Criteria { 36 0 : static constexpr Options::String help = 37 : "The algorithm terminates when any of these criteria is matched."; 38 : 39 0 : struct MaxIterations { 40 0 : using type = size_t; 41 0 : static constexpr Options::String help = { 42 : "The number of iterations exceeds this limit."}; 43 0 : static type lower_bound() { return 0; } 44 : }; 45 : 46 0 : struct AbsoluteResidual { 47 0 : using type = double; 48 0 : static constexpr Options::String help = { 49 : "The residual has reached this magnitude."}; 50 0 : static type lower_bound() { return 0.; } 51 : }; 52 : 53 0 : struct RelativeResidual { 54 0 : using type = double; 55 0 : static constexpr Options::String help = { 56 : "The residual has decreased by this factor."}; 57 0 : static type lower_bound() { return 0.; } 58 0 : static type upper_bound() { return 1.; } 59 : }; 60 : 61 0 : using options = tmpl::list<MaxIterations, AbsoluteResidual, RelativeResidual>; 62 : 63 0 : Criteria() = default; 64 0 : Criteria(size_t max_iterations_in, double absolute_residual_in, 65 : double relative_residual_in); 66 : 67 : // NOLINTNEXTLINE(google-runtime-references) 68 0 : void pup(PUP::er& p); 69 : 70 0 : size_t max_iterations{}; 71 0 : double absolute_residual{}; 72 0 : double relative_residual{}; 73 : }; 74 : 75 0 : bool operator==(const Criteria& lhs, const Criteria& rhs); 76 0 : bool operator!=(const Criteria& lhs, const Criteria& rhs); 77 : 78 : } // namespace Convergence