LCOV - code coverage report
Current view: top level - src/actions - AddDefaultConvergenceAction.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: 2bf808 Lines: 81 93 87.1 %
Date: 2025-07-17 01:28:37 Functions: 7 7 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 "AddDefaultConvergenceAction.h"
      11             : #include "FEProblem.h"
      12             : #include "Executioner.h"
      13             : #include "FEProblemSolve.h"
      14             : #include "FixedPointSolve.h"
      15             : #include "DefaultNonlinearConvergence.h"
      16             : #include "DefaultMultiAppFixedPointConvergence.h"
      17             : 
      18             : registerMooseAction("MooseApp", AddDefaultConvergenceAction, "add_default_nonlinear_convergence");
      19             : registerMooseAction("MooseApp",
      20             :                     AddDefaultConvergenceAction,
      21             :                     "add_default_multiapp_fixed_point_convergence");
      22             : 
      23             : InputParameters
      24       61934 : AddDefaultConvergenceAction::validParams()
      25             : {
      26       61934 :   InputParameters params = Action::validParams();
      27       61934 :   params.addClassDescription("Adds default Convergence objects to the simulation.");
      28       61934 :   return params;
      29           0 : }
      30             : 
      31       61934 : AddDefaultConvergenceAction::AddDefaultConvergenceAction(const InputParameters & params)
      32       61934 :   : Action(params)
      33             : {
      34       61934 : }
      35             : 
      36             : void
      37      115086 : AddDefaultConvergenceAction::act()
      38             : {
      39      115086 :   if (_current_task == "add_default_nonlinear_convergence")
      40       57549 :     addDefaultNonlinearConvergence();
      41       57537 :   else if (_current_task == "add_default_multiapp_fixed_point_convergence")
      42       57537 :     addDefaultMultiAppFixedPointConvergence();
      43      115062 : }
      44             : 
      45             : void
      46       57549 : AddDefaultConvergenceAction::addDefaultNonlinearConvergence()
      47             : {
      48       57549 :   if (_problem->needToAddDefaultNonlinearConvergence())
      49             :   {
      50       57119 :     const std::string default_name = "default_nonlinear_convergence";
      51             :     // Create a default convergence for every nonlinear system
      52       57119 :     std::vector<ConvergenceName> default_name_vec;
      53      113343 :     for (const auto & nl_sys_name : _problem->getNonlinearSystemNames())
      54       56224 :       default_name_vec.push_back(default_name + nl_sys_name);
      55       57119 :     _problem->setNonlinearConvergenceNames(default_name_vec);
      56       57119 :     _problem->addDefaultNonlinearConvergence(getMooseApp().getExecutioner()->parameters());
      57       57111 :   }
      58             : 
      59       57541 :   checkUnusedNonlinearConvergenceParameters();
      60       57537 : }
      61             : 
      62             : void
      63       57537 : AddDefaultConvergenceAction::addDefaultMultiAppFixedPointConvergence()
      64             : {
      65       57537 :   if (_problem->needToAddDefaultMultiAppFixedPointConvergence())
      66             :   {
      67       57465 :     const std::string conv_name = "default_multiapp_fixed_point_convergence";
      68       57465 :     _problem->setMultiAppFixedPointConvergenceName(conv_name);
      69       57465 :     _problem->addDefaultMultiAppFixedPointConvergence(getMooseApp().getExecutioner()->parameters());
      70       57453 :   }
      71             : 
      72       57525 :   checkUnusedMultiAppFixedPointConvergenceParameters();
      73       57525 : }
      74             : 
      75             : void
      76       57541 : AddDefaultConvergenceAction::checkUnusedNonlinearConvergenceParameters()
      77             : {
      78             :   // Only perform this check if the executioner uses Convergence objects
      79       57541 :   auto & executioner_params = getMooseApp().getExecutioner()->parameters();
      80       57541 :   if (!executioner_params.have_parameter<std::vector<ConvergenceName>>("nonlinear_convergence"))
      81         154 :     return;
      82             : 
      83             :   // Convergences may exist but be inactive
      84       57387 :   bool has_convergence = false;
      85      113879 :   for (const auto & cv_name : _problem->getNonlinearConvergenceNames())
      86       56492 :     if (_problem->hasConvergence(cv_name))
      87       56492 :       has_convergence = true;
      88       57387 :   if (!has_convergence)
      89        1097 :     return;
      90             : 
      91             :   // If a single convergence is a `DefaultNonlinearConvergence` they can handle the Executioner
      92             :   // parameters pertaining to the nonlinear system solve
      93       56290 :   bool has_a_default_nl_conv = false;
      94      112782 :   for (const auto & cv_name : _problem->getNonlinearConvergenceNames())
      95             :   {
      96       56492 :     if (!_problem->hasConvergence(cv_name))
      97           0 :       continue;
      98       56492 :     auto & conv = _problem->getConvergence(cv_name);
      99       56492 :     auto * default_nl_conv = dynamic_cast<DefaultNonlinearConvergence *>(&conv);
     100       56492 :     if (default_nl_conv)
     101       56394 :       has_a_default_nl_conv = true;
     102             :   }
     103             : 
     104             :   // Only Convergence objects deriving from DefaultNonlinearConvergence should
     105             :   // share parameters with the executioner.
     106       56290 :   if (!has_a_default_nl_conv)
     107             :   {
     108         192 :     for (const auto & cv_name : _problem->getNonlinearConvergenceNames())
     109             :     {
     110          98 :       if (!_problem->hasConvergence(cv_name))
     111           0 :         continue;
     112             : 
     113          98 :       auto nl_params = FEProblemSolve::feProblemDefaultConvergenceParams();
     114          98 :       std::vector<std::string> unused_params;
     115        1078 :       for (const auto & param : nl_params.getParametersList())
     116         980 :         if (executioner_params.isParamSetByUser(param))
     117         102 :           unused_params.push_back(param);
     118             : 
     119          98 :       if (unused_params.size() > 0)
     120             :       {
     121           4 :         std::stringstream msg;
     122             :         msg << "The following nonlinear convergence parameters were set in the executioner, but "
     123           4 :                "are not used:\n";
     124           8 :         for (const auto & param : unused_params)
     125           4 :           msg << "  " << param << "\n";
     126           4 :         mooseError(msg.str());
     127           0 :       }
     128          94 :     }
     129             :   }
     130             : }
     131             : 
     132             : void
     133       57525 : AddDefaultConvergenceAction::checkUnusedMultiAppFixedPointConvergenceParameters()
     134             : {
     135             :   // Abort check if executioner does not allow Convergence objects
     136       57525 :   auto & executioner_params = getMooseApp().getExecutioner()->parameters();
     137       57525 :   if (!executioner_params.have_parameter<ConvergenceName>("multiapp_fixed_point_convergence"))
     138           0 :     return;
     139             : 
     140             :   // Abort if there is no fixed point convergence. For example, Executors may not have them.
     141       57525 :   if (!_problem->hasSetMultiAppFixedPointConvergenceName())
     142          20 :     return;
     143             : 
     144       57505 :   const auto & conv_name = _problem->getMultiAppFixedPointConvergenceName();
     145             : 
     146             :   // Abort check if Convergence is inactive
     147       57505 :   if (!_problem->hasConvergence(conv_name))
     148           0 :     return;
     149             : 
     150             :   // If the convergence is a DefaultMultiAppFixedPointConvergence they can handle the Executioner
     151             :   // parameters pertaining to the fixed point solve
     152       57505 :   auto & conv = _problem->getConvergence(conv_name);
     153       57505 :   const auto * const default_conv = dynamic_cast<DefaultMultiAppFixedPointConvergence *>(&conv);
     154             : 
     155             :   // Only Convergence objects deriving from DefaultMultiAppFixedPointConvergence should
     156             :   // share parameters with the executioner
     157       57505 :   if (!default_conv)
     158             :   {
     159          24 :     auto fp_params = FixedPointSolve::fixedPointDefaultConvergenceParams();
     160          24 :     std::vector<std::string> unused_params;
     161         288 :     for (const auto & param : fp_params.getParametersList())
     162         264 :       if (executioner_params.isParamSetByUser(param))
     163          24 :         unused_params.push_back(param);
     164             : 
     165          24 :     if (unused_params.size() > 0)
     166             :     {
     167           0 :       std::stringstream msg;
     168             :       msg << "The following fixed point convergence parameters were set in the executioner, but "
     169           0 :              "are not used:\n";
     170           0 :       for (const auto & param : unused_params)
     171           0 :         msg << "  " << param << "\n";
     172           0 :       mooseError(msg.str());
     173           0 :     }
     174          24 :   }
     175             : }

Generated by: LCOV version 1.14