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