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 : #pragma once 11 : 12 : #include "TimeIntegrator.h" 13 : #include "MathUtils.h" 14 : 15 : /** 16 : * Newmark-Beta time integration method 17 : */ 18 : class NewmarkBeta : public TimeIntegrator 19 : { 20 : public: 21 : static InputParameters validParams(); 22 : 23 : NewmarkBeta(const InputParameters & parameters); 24 : virtual ~NewmarkBeta(); 25 : 26 0 : virtual int order() override { return 1; } 27 : virtual void computeTimeDerivatives() override; 28 : virtual void computeADTimeDerivatives(ADReal & ad_u_dot, 29 : const dof_id_type & dof, 30 : ADReal & ad_u_dotdot) const override; 31 : virtual void postResidual(NumericVector<Number> & residual) override; 32 1100 : virtual bool overridesSolve() const override { return false; } 33 : 34 : protected: 35 : /** 36 : * Helper function that actually does the math for computing the time derivative 37 : */ 38 : template <typename T, typename T2, typename T3, typename T4, typename T5> 39 : void computeTimeDerivativeHelper(T & u_dot, 40 : const T2 & u_old, 41 : const T3 & u_dot_old, 42 : T4 & u_dotdot, 43 : const T5 & u_dotdot_old) const; 44 : 45 : virtual Real duDotDuCoeff() const override; 46 : 47 : /// Newmark time integration parameter-beta 48 : Real _beta; 49 : 50 : /// Newmark time integration parameter-gamma 51 : Real _gamma; 52 : 53 : /// Inactive time steps 54 : int _inactive_tsteps; 55 : 56 : /// solution vector for \f$ {du^dotdot}\over{du} \f$ 57 : Real & _du_dotdot_du; 58 : }; 59 : 60 : template <typename T, typename T2, typename T3, typename T4, typename T5> 61 : void 62 584587 : NewmarkBeta::computeTimeDerivativeHelper( 63 : T & u_dot, const T2 & u_old, const T3 & u_dot_old, T4 & u_dotdot, const T5 & u_dotdot_old) const 64 : { 65 : // compute second derivative 66 : // according to Newmark-Beta method 67 : // u_dotdot = first_term - second_term - third_term 68 : // first_term = (u - u_old) / beta / dt ^ 2 69 : // second_term = u_dot_old / beta / dt 70 : // third_term = u_dotdot_old * (1 / 2 / beta - 1) 71 584587 : u_dotdot -= u_old; 72 584587 : u_dotdot *= 1.0 / _beta / _dt / _dt; 73 584587 : MathUtils::addScaled(-1.0 / _beta / _dt, u_dot_old, u_dotdot); 74 584587 : MathUtils::addScaled(-0.5 / _beta + 1.0, u_dotdot_old, u_dotdot); 75 : 76 : // compute first derivative 77 : // according to Newmark-Beta method 78 : // u_dot = first_term + second_term + third_term 79 : // first_term = u_dot_old 80 : // second_term = u_dotdot_old * (1 - gamma) * dt 81 : // third_term = u_dotdot * gamma * dt 82 584587 : u_dot = u_dot_old; 83 584587 : MathUtils::addScaled((1.0 - _gamma) * _dt, u_dotdot_old, u_dot); 84 584587 : MathUtils::addScaled(_gamma * _dt, u_dotdot, u_dot); 85 584587 : }