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 14498 : IterationCountConvergence::validParams() 17 : { 18 14498 : InputParameters params = Convergence::validParams(); 19 : 20 57992 : params.addParam<unsigned int>("min_iterations", 0, "Minimum number of iterations"); 21 57992 : params.addParam<unsigned int>("max_iterations", 50, "Maximum number of iterations"); 22 43494 : params.addParam<bool>( 23 28996 : "converge_at_max_iterations", false, "Converge at 'max_iterations' instead of diverging"); 24 : 25 14498 : params.addClassDescription("Checks the iteration count."); 26 : 27 14498 : return params; 28 0 : } 29 : 30 1136 : IterationCountConvergence::IterationCountConvergence(const InputParameters & parameters) 31 : : Convergence(parameters), 32 1136 : _min_iterations(getParam<unsigned int>("min_iterations")), 33 2272 : _max_iterations(getParam<unsigned int>("max_iterations")), 34 3408 : _converge_at_max_iterations(getParam<bool>("converge_at_max_iterations")) 35 : { 36 1136 : if (_max_iterations < _min_iterations) 37 3 : mooseError("'max_iterations' must be >= 'min_iterations'."); 38 1133 : } 39 : 40 : Convergence::MooseConvergenceStatus 41 58911 : IterationCountConvergence::checkConvergence(unsigned int iter) 42 : { 43 58911 : const auto status_inner = checkConvergenceInner(iter); 44 : 45 58911 : std::ostringstream oss; 46 58911 : switch (status_inner) 47 : { 48 58811 : case MooseConvergenceStatus::ITERATING: 49 58811 : if (iter >= _max_iterations) 50 : { 51 3308 : if (_converge_at_max_iterations) 52 : { 53 3287 : oss << "Converged due to iterations (" << iter << ") >= max iterations (" 54 3287 : << _max_iterations << ") and 'converge_at_max_iterations' = 'true'."; 55 3287 : verboseOutput(oss); 56 3287 : 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 55503 : return MooseConvergenceStatus::ITERATING; 68 : break; 69 : 70 100 : case MooseConvergenceStatus::CONVERGED: 71 100 : 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 78 : 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 58911 : } 90 : 91 : Convergence::MooseConvergenceStatus 92 58258 : IterationCountConvergence::checkConvergenceInner(unsigned int /*iter*/) 93 : { 94 58258 : return MooseConvergenceStatus::ITERATING; 95 : }