LCOV - code coverage report
Current view: top level - src/convergence - IterationCountConvergence.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: 2bf808 Lines: 41 46 89.1 %
Date: 2025-07-17 01:28:37 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             : 
      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             : }

Generated by: LCOV version 1.14