LCOV - code coverage report
Current view: top level - src/executioners - NonlinearEigen.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: 2bf808 Lines: 64 65 98.5 %
Date: 2025-07-17 01:28:37 Functions: 5 5 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 "NonlinearEigen.h"
      11             : #include "FEProblemBase.h"
      12             : 
      13             : registerMooseObject("MooseApp", NonlinearEigen);
      14             : 
      15             : InputParameters
      16       14457 : NonlinearEigen::validParams()
      17             : {
      18       14457 :   InputParameters params = EigenExecutionerBase::validParams();
      19       14457 :   params.addParam<unsigned int>("free_power_iterations", 4, "The number of free power iterations");
      20       14457 :   params.set<Real>("nl_abs_tol", true) = 1.0e-06;
      21       14457 :   params.set<Real>("nl_rel_tol", true) = 1e-50;
      22       14457 :   params.set<Real>("l_tol", true) = 1e-2;
      23       14457 :   params.addParam<Real>("free_l_tol", 1e-2, "Relative linear tolerance in free power iteration");
      24       43371 :   params.addParam<bool>(
      25       28914 :       "output_after_power_iterations", true, "True to output solution after free power iterations");
      26       14457 :   return params;
      27           0 : }
      28             : 
      29          96 : NonlinearEigen::NonlinearEigen(const InputParameters & parameters)
      30             :   : EigenExecutionerBase(parameters),
      31          96 :     _free_iter(getParam<unsigned int>("free_power_iterations")),
      32          96 :     _nl_abs_tol(getParam<Real>("nl_abs_tol")),
      33          96 :     _nl_rel_tol(getParam<Real>("nl_rel_tol")),
      34          96 :     _l_tol(getParam<Real>("l_tol")),
      35          96 :     _free_l_tol(getParam<Real>("free_l_tol")),
      36         192 :     _output_after_pi(getParam<bool>("output_after_power_iterations"))
      37             : {
      38          96 :   mooseInfo(
      39             :       "'NonlinearEigen' executioner is deprecated in favor of 'Eigenvalue' executioner.\n",
      40             :       "Few parameters such as 'bx_norm', 'k0', 'free_l_tol', 'output_before_normalization' and "
      41             :       "'output_after_power_iterations' are no longer supported.\n",
      42             :       "However, 'Eigenvalue' executioner supports more solving options by interfacing SLEPc.\n",
      43             :       "Most of the inputs will work by simply replacing the executioner type with 'Eigenvalue'.");
      44          96 : }
      45             : 
      46             : void
      47          96 : NonlinearEigen::init()
      48             : {
      49          96 :   if (_app.isRecovering())
      50             :   {
      51           1 :     _console << "\nCannot recover NonlinearEigen solves!\nExiting...\n" << std::endl;
      52           1 :     return;
      53             :   }
      54             : 
      55          95 :   EigenExecutionerBase::init();
      56             : 
      57             :   // Write the initial.
      58             :   // Note: We need to tempararily change the system time to make the output system work properly.
      59          95 :   _problem.timeStep() = 0;
      60          95 :   Real t = _problem.time();
      61          95 :   _problem.time() = _problem.timeStep();
      62          95 :   _problem.outputStep(EXEC_INITIAL);
      63          95 :   _problem.time() = t;
      64             : 
      65          95 :   if (_free_iter > 0)
      66             :   {
      67             :     // save the initial guess
      68          95 :     _problem.advanceState();
      69             : 
      70             :     // free power iterations
      71          95 :     _console << " Free power iteration starts" << std::endl;
      72             : 
      73             :     Real initial_res;
      74         190 :     inversePowerIteration(_free_iter,
      75          95 :                           _free_iter,
      76          95 :                           _free_l_tol,
      77             :                           false,
      78             :                           std::numeric_limits<Real>::min(),
      79             :                           true,
      80             :                           "",
      81             :                           std::numeric_limits<Real>::max(),
      82          95 :                           _eigenvalue,
      83             :                           initial_res);
      84             : 
      85          95 :     _problem.onTimestepEnd();
      86          95 :     _problem.execute(EXEC_TIMESTEP_END);
      87             : 
      88          95 :     if (_output_after_pi)
      89             :     {
      90             :       // output initial guess created by free power iterations
      91          45 :       _problem.timeStep()++;
      92          45 :       Real t = _problem.time();
      93          45 :       _problem.time() = _problem.timeStep();
      94          45 :       _problem.outputStep(EXEC_TIMESTEP_END);
      95          45 :       _problem.time() = t;
      96             :     }
      97             :   }
      98             : }
      99             : 
     100             : void
     101          96 : NonlinearEigen::execute()
     102             : {
     103          96 :   if (_app.isRecovering())
     104             :   {
     105           1 :     _last_solve_converged = true;
     106           1 :     return;
     107             :   }
     108             : 
     109          95 :   preExecute();
     110             : 
     111          95 :   takeStep();
     112             : 
     113          95 :   postExecute();
     114             : }
     115             : 
     116             : void
     117          95 : NonlinearEigen::takeStep()
     118             : {
     119          95 :   _console << " Nonlinear iteration starts" << std::endl;
     120             : 
     121          95 :   preSolve();
     122          95 :   _problem.timestepSetup();
     123          95 :   _problem.advanceState();
     124          95 :   _problem.execute(EXEC_TIMESTEP_BEGIN);
     125             : 
     126          95 :   _last_solve_converged = nonlinearSolve(_nl_rel_tol, _nl_abs_tol, _l_tol, _eigenvalue);
     127          95 :   postSolve();
     128             : 
     129          95 :   if (lastSolveConverged())
     130             :   {
     131          95 :     printEigenvalue();
     132             : 
     133          95 :     _problem.onTimestepEnd();
     134          95 :     _problem.execute(EXEC_TIMESTEP_END);
     135             :   }
     136          95 : }

Generated by: LCOV version 1.14