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 45497 : IterationCountConvergence::validParams() 17 : { 18 45497 : InputParameters params = Convergence::validParams(); 19 : 20 45497 : params.addParam<unsigned int>("min_iterations", 0, "Minimum number of iterations"); 21 45497 : params.addParam<unsigned int>("max_iterations", 50, "Maximum number of iterations"); 22 136491 : params.addParam<bool>( 23 90994 : "converge_at_max_iterations", false, "Converge at 'max_iterations' instead of diverging"); 24 : 25 45497 : params.addClassDescription("Checks the iteration count."); 26 : 27 45497 : return params; 28 0 : } 29 : 30 1355 : IterationCountConvergence::IterationCountConvergence(const InputParameters & parameters) 31 : : Convergence(parameters), 32 1355 : _min_iterations(getParam<unsigned int>("min_iterations")), 33 1355 : _max_iterations(getParam<unsigned int>("max_iterations")), 34 2710 : _converge_at_max_iterations(getParam<bool>("converge_at_max_iterations")) 35 : { 36 1355 : if (_max_iterations < _min_iterations) 37 4 : mooseError("'max_iterations' must be >= 'min_iterations'."); 38 1351 : } 39 : 40 : Convergence::MooseConvergenceStatus 41 15539 : IterationCountConvergence::checkConvergence(unsigned int iter) 42 : { 43 15539 : const auto status_inner = checkConvergenceInner(iter); 44 : 45 15539 : std::ostringstream oss; 46 15539 : switch (status_inner) 47 : { 48 15454 : case MooseConvergenceStatus::ITERATING: 49 15454 : if (iter >= _max_iterations) 50 : { 51 3881 : if (_converge_at_max_iterations) 52 : { 53 3857 : oss << "Converged due to iterations (" << iter << ") >= max iterations (" 54 3857 : << _max_iterations << ") and 'converge_at_max_iterations' = 'true'."; 55 3857 : verboseOutput(oss); 56 3857 : return MooseConvergenceStatus::CONVERGED; 57 : } 58 : else 59 : { 60 24 : oss << "Diverged due to iterations (" << iter << ") >= max iterations (" 61 24 : << _max_iterations << ")."; 62 24 : verboseOutput(oss); 63 24 : return MooseConvergenceStatus::DIVERGED; 64 : } 65 : } 66 : else 67 11573 : return MooseConvergenceStatus::ITERATING; 68 : break; 69 : 70 85 : case MooseConvergenceStatus::CONVERGED: 71 85 : if (iter < _min_iterations) 72 : { 73 24 : oss << "Still iterating because iterations (" << iter << ") < min iterations (" 74 24 : << _min_iterations << ")."; 75 24 : verboseOutput(oss); 76 24 : return MooseConvergenceStatus::ITERATING; 77 : } 78 : else 79 61 : 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 15539 : } 90 : 91 : Convergence::MooseConvergenceStatus 92 14898 : IterationCountConvergence::checkConvergenceInner(unsigned int /*iter*/) 93 : { 94 14898 : return MooseConvergenceStatus::ITERATING; 95 : }