LCOV - code coverage report
Current view: top level - include/timeintegrators - NewmarkBeta.h (source / functions) Hit Total Coverage
Test: idaholab/moose framework: 2bf808 Lines: 10 11 90.9 %
Date: 2025-07-17 01:28:37 Functions: 4 5 80.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.14