LCOV - code coverage report
Current view: top level - src/timeintegrators - BDF2.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: 2bf808 Lines: 41 43 95.3 %
Date: 2025-07-17 01:28:37 Functions: 8 8 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 "BDF2.h"
      11             : #include "NonlinearSystem.h"
      12             : 
      13             : registerMooseObject("MooseApp", BDF2);
      14             : 
      15             : InputParameters
      16       14775 : BDF2::validParams()
      17             : {
      18       14775 :   InputParameters params = TimeIntegrator::validParams();
      19       14775 :   params.addClassDescription(
      20             :       "Second order backward differentiation formula time integration scheme.");
      21       14775 :   return params;
      22           0 : }
      23             : 
      24         340 : BDF2::BDF2(const InputParameters & parameters)
      25             :   : TimeIntegrator(parameters),
      26         340 :     _weight(declareRestartableData<std::vector<Real>>("weight")),
      27         680 :     _solution_older(_sys.solutionState(2))
      28             : {
      29         340 :   _weight.resize(3);
      30         340 : }
      31             : 
      32             : void
      33       48117 : BDF2::preStep()
      34             : {
      35       48117 :   if (_t_step > 1)
      36             :   {
      37       42493 :     Real sum = _dt + _dt_old;
      38       42493 :     _weight[0] = 1. + _dt / sum;
      39       42493 :     _weight[1] = -sum / _dt_old;
      40       42493 :     _weight[2] = _dt * _dt / _dt_old / sum;
      41             :   }
      42       48117 : }
      43             : 
      44             : void
      45       21973 : BDF2::computeTimeDerivatives()
      46             : {
      47       21973 :   if (!_sys.solutionUDot())
      48           0 :     mooseError("BDF2: Time derivative of solution (`u_dot`) is not stored. Please set "
      49             :                "uDotRequested() to true in FEProblemBase befor requesting `u_dot`.");
      50             : 
      51       21973 :   NumericVector<Number> & u_dot = *_sys.solutionUDot();
      52       21973 :   if (_t_step == 1)
      53        2580 :     u_dot = *_solution;
      54             :   else
      55       19393 :     u_dot.zero();
      56       21973 :   computeTimeDerivativeHelper(u_dot, *_solution, _solution_old, _solution_older);
      57       21973 :   u_dot.close();
      58       21973 :   computeDuDotDu();
      59       21973 : }
      60             : 
      61             : void
      62      766988 : BDF2::computeADTimeDerivatives(ADReal & ad_u_dot,
      63             :                                const dof_id_type & dof,
      64             :                                ADReal & /*ad_u_dotdot*/) const
      65             : {
      66      766988 :   auto ad_sln = ad_u_dot;
      67      766988 :   if (_t_step != 1)
      68      689472 :     ad_u_dot = 0;
      69      766988 :   computeTimeDerivativeHelper(ad_u_dot, ad_sln, _solution_old(dof), _solution_older(dof));
      70      766988 : }
      71             : 
      72             : void
      73       15510 : BDF2::postResidual(NumericVector<Number> & residual)
      74             : {
      75       15510 :   residual += *_Re_time;
      76       15510 :   residual += *_Re_non_time;
      77       15510 :   residual.close();
      78       15510 : }
      79             : 
      80             : Real
      81       21973 : BDF2::duDotDuCoeff() const
      82             : {
      83       21973 :   if (_t_step == 1)
      84        2580 :     return 1;
      85             :   else
      86       19393 :     return _weight[0];
      87             : }

Generated by: LCOV version 1.14