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 "ActuallyExplicitEuler.h" 13 : 14 : /** 15 : * Implements a truly explicit (no nonlinear solve) Central Difference time 16 : * integration scheme. 17 : */ 18 : class CentralDifference : public ActuallyExplicitEuler 19 : { 20 : public: 21 : CentralDifference(const InputParameters & parameters); 22 : 23 : static InputParameters validParams(); 24 : 25 : virtual void initialSetup() override; 26 : 27 0 : virtual int order() override { return 2; } 28 : virtual void computeTimeDerivatives() override; 29 : void computeADTimeDerivatives(ADReal & ad_u_dot, 30 : const dof_id_type & dof, 31 : ADReal & ad_u_dotdot) const override; 32 : 33 : protected: 34 : virtual Real duDotDuCoeff() const override; 35 : 36 : /// solution vector for \f$ {du^dotdot}\over{du} \f$ 37 : Real & _du_dotdot_du; 38 : 39 : /// The older solution 40 : const NumericVector<Number> & _solution_older; 41 : 42 : /** 43 : * Helper function that actually does the math for computing the time derivative 44 : */ 45 : template <typename T, typename T2, typename T3, typename T4> 46 : void 47 : computeTimeDerivativeHelper(T & u_dot, T2 & u_dotdot, const T3 & u_old, const T4 & u_older) const; 48 : }; 49 : 50 : template <typename T, typename T2, typename T3, typename T4> 51 : void 52 24135 : CentralDifference::computeTimeDerivativeHelper(T & u_dot, 53 : T2 & u_dotdot, 54 : const T3 & u_old, 55 : const T4 & u_older) const 56 : { 57 : // computing first derivative 58 : // using the Central Difference method 59 : // u_dot_old = (first_term - second_term) / 2 / dt 60 : // first_term = u 61 : // second_term = u_older 62 24135 : u_dot -= u_older; // 'older than older' solution 63 24135 : u_dot *= 1.0 / (2.0 * _dt); 64 : 65 : // computing second derivative 66 : // using the Central Difference method 67 : // u_dotdot_old = (first_term - second_term + third_term) / dt / dt 68 : // first_term = u 69 : // second_term = 2 * u_old 70 : // third_term = u_older 71 24135 : u_dotdot -= u_old; 72 24135 : u_dotdot -= u_old; 73 24135 : u_dotdot += u_older; 74 24135 : u_dotdot *= 1.0 / (_dt * _dt); 75 24135 : }