LCOV - code coverage report
Current view: top level - include/timeintegrators - CentralDifference.h (source / functions) Hit Total Coverage
Test: idaholab/moose framework: 2bf808 Lines: 8 9 88.9 %
Date: 2025-07-17 01:28:37 Functions: 3 4 75.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 "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 : }

Generated by: LCOV version 1.14