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 15587 : BDF2::validParams() 17 : { 18 15587 : InputParameters params = TimeIntegrator::validParams(); 19 15587 : params.addClassDescription( 20 : "Second order backward differentiation formula time integration scheme."); 21 15587 : return params; 22 0 : } 23 : 24 480 : BDF2::BDF2(const InputParameters & parameters) 25 : : TimeIntegrator(parameters), 26 480 : _weight(declareRestartableData<std::vector<Real>>("weight")), 27 960 : _solution_older(_sys.solutionState(2)) 28 : { 29 480 : _weight.resize(3); 30 480 : } 31 : 32 : void 33 52572 : BDF2::preStep() 34 : { 35 52572 : if (_t_step > 1) 36 : { 37 43745 : Real sum = _dt + _dt_old; 38 43745 : _weight[0] = 1. + _dt / sum; 39 43745 : _weight[1] = -sum / _dt_old; 40 43745 : _weight[2] = _dt * _dt / _dt_old / sum; 41 : } 42 52572 : } 43 : 44 : void 45 19752 : BDF2::computeTimeDerivatives() 46 : { 47 19752 : 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 19752 : NumericVector<Number> & u_dot = *_sys.solutionUDot(); 52 19752 : if (_t_step == 1) 53 3456 : u_dot = *_solution; 54 : else 55 16296 : u_dot.zero(); 56 19752 : computeTimeDerivativeHelper(u_dot, *_solution, _solution_old, _solution_older); 57 19752 : u_dot.close(); 58 19752 : computeDuDotDu(); 59 19752 : } 60 : 61 : void 62 1145680 : BDF2::computeADTimeDerivatives(ADReal & ad_u_dot, 63 : const dof_id_type & dof, 64 : ADReal & /*ad_u_dotdot*/) const 65 : { 66 1145680 : auto ad_sln = ad_u_dot; 67 1145680 : if (_t_step != 1) 68 1005560 : ad_u_dot = 0; 69 1145680 : computeTimeDerivativeHelper(ad_u_dot, ad_sln, _solution_old(dof), _solution_older(dof)); 70 1145680 : } 71 : 72 : void 73 16997 : BDF2::postResidual(NumericVector<Number> & residual) 74 : { 75 16997 : residual += *_Re_time; 76 16997 : residual += *_Re_non_time; 77 16997 : residual.close(); 78 16997 : } 79 : 80 : Real 81 19752 : BDF2::duDotDuCoeff() const 82 : { 83 19752 : if (_t_step == 1) 84 3456 : return 1; 85 : else 86 16296 : return _weight[0]; 87 : }