LCOV - code coverage report
Current view: top level - src/timeintegrators - BDF2.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: #32971 (54bef8) with base c6cf66 Lines: 51 53 96.2 %
Date: 2026-05-29 20:35:17 Functions: 10 10 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        3787 : BDF2::validParams()
      17             : {
      18        3787 :   InputParameters params = TimeIntegrator::validParams();
      19        3787 :   params.addClassDescription(
      20             :       "Second order backward differentiation formula time integration scheme.");
      21        3787 :   return params;
      22           0 : }
      23             : 
      24         484 : BDF2::BDF2(const InputParameters & parameters)
      25             :   : TimeIntegrator(parameters),
      26         484 :     _weight(declareRestartableData<std::vector<Real>>("weight")),
      27         968 :     _solution_older(_sys.solutionState(2))
      28             : {
      29         484 :   _weight.resize(3);
      30         484 : }
      31             : 
      32             : void
      33       53678 : BDF2::preStep()
      34             : {
      35       53678 :   if (_t_step > 1)
      36             :   {
      37       45278 :     Real sum = _dt + _dt_old;
      38       45278 :     _weight[0] = 1. + _dt / sum;
      39       45278 :     _weight[1] = -sum / _dt_old;
      40       45278 :     _weight[2] = _dt * _dt / _dt_old / sum;
      41             :   }
      42       53678 : }
      43             : 
      44             : void
      45       22472 : BDF2::computeTimeDerivatives()
      46             : {
      47       22472 :   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       22472 :   NumericVector<Number> & u_dot = *_sys.solutionUDot();
      52       22472 :   if (_t_step == 1)
      53        3316 :     u_dot = *_solution;
      54             :   else
      55       19156 :     u_dot.zero();
      56       22472 :   computeTimeDerivativeHelper(u_dot, *_solution, _solution_old, _solution_older);
      57       22472 :   u_dot.close();
      58       22472 :   computeDuDotDu();
      59       22472 : }
      60             : 
      61             : void
      62     1020166 : BDF2::computeADTimeDerivatives(ADReal & ad_u_dot,
      63             :                                const dof_id_type & dof,
      64             :                                ADReal & /*ad_u_dotdot*/) const
      65             : {
      66     1020166 :   auto ad_sln = ad_u_dot;
      67     1020166 :   if (_t_step != 1)
      68      893592 :     ad_u_dot = 0;
      69     1020166 :   computeTimeDerivativeHelper(ad_u_dot, ad_sln, _solution_old(dof), _solution_older(dof));
      70     1020166 : }
      71             : 
      72             : void
      73       16738 : BDF2::postResidual(NumericVector<Number> & residual)
      74             : {
      75       16738 :   residual += *_Re_time;
      76       16738 :   residual += *_Re_non_time;
      77       16738 :   residual.close();
      78       16738 : }
      79             : 
      80             : Real
      81       22472 : BDF2::duDotDuCoeff() const
      82             : {
      83       22472 :   if (_t_step == 1)
      84        3316 :     return 1;
      85             :   else
      86       19156 :     return _weight[0];
      87             : }
      88             : 
      89             : Real
      90        1008 : BDF2::timeDerivativeRHSContribution(dof_id_type dof_id, const std::vector<Real> & factors) const
      91             : {
      92             :   mooseAssert(factors.size() == numStatesRequired(),
      93             :               "Either too many or too few states are given!");
      94             : 
      95        1008 :   if (_t_step == 1)
      96         144 :     return factors[0] * _solution_old(dof_id) / _dt;
      97             :   else
      98         864 :     return -(_weight[1] * factors[0] * _solution_old(dof_id) +
      99         864 :              _weight[2] * factors[1] * _solution_older(dof_id)) /
     100         864 :            _dt;
     101             : }
     102             : 
     103             : Real
     104        1008 : BDF2::timeDerivativeMatrixContribution(const Real factor) const
     105             : {
     106        1008 :   if (_t_step == 1)
     107         144 :     return factor / _dt;
     108             :   else
     109         864 :     return factor * _weight[0] / _dt;
     110             : }

Generated by: LCOV version 1.14