LCOV - code coverage report
Current view: top level - src/convergence - IterationCountConvergence.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: 39a256 Lines: 41 46 89.1 %
Date: 2026-07-14 14:36:17 Functions: 4 4 100.0 %
Legend: Lines: hit not hit

          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             : }

Generated by: LCOV version 1.14