Line data Source code
1 : //* This file is part of the MOOSE framework 2 : //* https://mooseframework.inl.gov 3 : //* 4 : //* All rights reserved, see COPYRIGHT for full restrictions 5 : //* https://github.com/idaholab/moose/blob/master/COPYRIGHT 6 : //* 7 : //* Licensed under LGPL 2.1, please see LICENSE for details 8 : //* https://www.gnu.org/licenses/lgpl-2.1.html 9 : 10 : #include "IterationCountConvergence.h" 11 : 12 : registerMooseObject("MooseApp", IterationCountConvergence); 13 : 14 : InputParameters 15 45037 : IterationCountConvergence::validParams() 16 : { 17 45037 : InputParameters params = Convergence::validParams(); 18 : 19 45037 : params.addParam<unsigned int>("min_iterations", 0, "Minimum number of iterations"); 20 45037 : params.addParam<unsigned int>("max_iterations", 50, "Maximum number of iterations"); 21 135111 : params.addParam<bool>( 22 90074 : "converge_at_max_iterations", false, "Converge at 'max_iterations' instead of diverging"); 23 : 24 45037 : params.addClassDescription("Checks the iteration count."); 25 : 26 45037 : return params; 27 0 : } 28 : 29 1123 : IterationCountConvergence::IterationCountConvergence(const InputParameters & parameters) 30 : : Convergence(parameters), 31 1123 : _min_iterations(getParam<unsigned int>("min_iterations")), 32 1123 : _max_iterations(getParam<unsigned int>("max_iterations")), 33 2246 : _converge_at_max_iterations(getParam<bool>("converge_at_max_iterations")) 34 : { 35 1123 : if (_max_iterations < _min_iterations) 36 4 : mooseError("'max_iterations' must be >= 'min_iterations'."); 37 1119 : } 38 : 39 : Convergence::MooseConvergenceStatus 40 12718 : IterationCountConvergence::checkConvergence(unsigned int iter) 41 : { 42 12718 : const auto status_inner = checkConvergenceInner(iter); 43 : 44 12718 : std::ostringstream oss; 45 12718 : switch (status_inner) 46 : { 47 12652 : case MooseConvergenceStatus::ITERATING: 48 12652 : if (iter >= _max_iterations) 49 : { 50 3315 : if (_converge_at_max_iterations) 51 : { 52 3295 : oss << "Converged due to iterations (" << iter << ") >= max iterations (" 53 3295 : << _max_iterations << ") and 'converge_at_max_iterations' = 'true'."; 54 3295 : verboseOutput(oss); 55 3295 : return MooseConvergenceStatus::CONVERGED; 56 : } 57 : else 58 : { 59 20 : oss << "Diverged due to iterations (" << iter << ") >= max iterations (" 60 20 : << _max_iterations << ")."; 61 20 : verboseOutput(oss); 62 20 : return MooseConvergenceStatus::DIVERGED; 63 : } 64 : } 65 : else 66 9337 : return MooseConvergenceStatus::ITERATING; 67 : break; 68 : 69 66 : case MooseConvergenceStatus::CONVERGED: 70 66 : if (iter < _min_iterations) 71 : { 72 22 : oss << "Still iterating because iterations (" << iter << ") < min iterations (" 73 22 : << _min_iterations << ")."; 74 22 : verboseOutput(oss); 75 22 : return MooseConvergenceStatus::ITERATING; 76 : } 77 : else 78 44 : return MooseConvergenceStatus::CONVERGED; 79 : break; 80 : 81 0 : case MooseConvergenceStatus::DIVERGED: 82 0 : return MooseConvergenceStatus::DIVERGED; 83 : break; 84 : 85 0 : default: 86 0 : mooseError("Invalid convergence status"); 87 : } 88 12718 : } 89 : 90 : Convergence::MooseConvergenceStatus 91 12341 : IterationCountConvergence::checkConvergenceInner(unsigned int /*iter*/) 92 : { 93 12341 : return MooseConvergenceStatus::ITERATING; 94 : }