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 : }