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