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 : #include "FixedPointSolve.h" 12 : 13 : registerMooseObject("MooseApp", IterationCountConvergence); 14 : 15 : InputParameters 16 14523 : IterationCountConvergence::validParams() 17 : { 18 14523 : InputParameters params = Convergence::validParams(); 19 : 20 58092 : params.addParam<unsigned int>("min_iterations", 0, "Minimum number of iterations"); 21 58092 : params.addParam<unsigned int>("max_iterations", 50, "Maximum number of iterations"); 22 43569 : params.addParam<bool>( 23 29046 : "converge_at_max_iterations", false, "Converge at 'max_iterations' instead of diverging"); 24 : 25 14523 : params.addClassDescription("Checks the iteration count."); 26 : 27 14523 : return params; 28 0 : } 29 : 30 1149 : IterationCountConvergence::IterationCountConvergence(const InputParameters & parameters) 31 : : Convergence(parameters), 32 1149 : _min_iterations(getParam<unsigned int>("min_iterations")), 33 2298 : _max_iterations(getParam<unsigned int>("max_iterations")), 34 3447 : _converge_at_max_iterations(getParam<bool>("converge_at_max_iterations")) 35 : { 36 1149 : if (_max_iterations < _min_iterations) 37 3 : mooseError("'max_iterations' must be >= 'min_iterations'."); 38 1146 : } 39 : 40 : Convergence::MooseConvergenceStatus 41 32346 : IterationCountConvergence::checkConvergence(unsigned int iter) 42 : { 43 32346 : const auto status_inner = checkConvergenceInner(iter); 44 : 45 32346 : std::ostringstream oss; 46 32346 : switch (status_inner) 47 : { 48 32235 : case MooseConvergenceStatus::ITERATING: 49 32235 : if (iter >= _max_iterations) 50 : { 51 1782 : if (_converge_at_max_iterations) 52 : { 53 1761 : oss << "Converged due to iterations (" << iter << ") >= max iterations (" 54 1761 : << _max_iterations << ") and 'converge_at_max_iterations' = 'true'."; 55 1761 : verboseOutput(oss); 56 1761 : return MooseConvergenceStatus::CONVERGED; 57 : } 58 : else 59 : { 60 21 : oss << "Diverged due to iterations (" << iter << ") >= max iterations (" 61 21 : << _max_iterations << ")."; 62 21 : verboseOutput(oss); 63 21 : return MooseConvergenceStatus::DIVERGED; 64 : } 65 : } 66 : else 67 30453 : return MooseConvergenceStatus::ITERATING; 68 : break; 69 : 70 111 : case MooseConvergenceStatus::CONVERGED: 71 111 : if (iter < _min_iterations) 72 : { 73 22 : oss << "Still iterating because iterations (" << iter << ") < min iterations (" 74 22 : << _min_iterations << ")."; 75 22 : verboseOutput(oss); 76 22 : return MooseConvergenceStatus::ITERATING; 77 : } 78 : else 79 89 : return MooseConvergenceStatus::CONVERGED; 80 : break; 81 : 82 0 : case MooseConvergenceStatus::DIVERGED: 83 0 : return MooseConvergenceStatus::DIVERGED; 84 : break; 85 : 86 0 : default: 87 0 : mooseError("Invalid convergence status"); 88 : } 89 32346 : } 90 : 91 : Convergence::MooseConvergenceStatus 92 31572 : IterationCountConvergence::checkConvergenceInner(unsigned int /*iter*/) 93 : { 94 31572 : return MooseConvergenceStatus::ITERATING; 95 : }