SpECTRE Documentation Coverage Report
Current view: top level - Time/TimeSteppers - ImexRungeKutta.hpp Hit Total Coverage
Commit: 6e1258ccd353220e12442198913007fb6c170b6b Lines: 4 8 50.0 %
Date: 2024-10-23 19:54:13
Legend: Lines: hit not hit

          Line data    Source code
       1           0 : // Distributed under the MIT License.
       2             : // See LICENSE.txt for details.
       3             : 
       4             : #pragma once
       5             : 
       6             : #include <vector>
       7             : 
       8             : #include "Time/TimeSteppers/ImexTimeStepper.hpp"
       9             : #include "Time/TimeSteppers/RungeKutta.hpp"
      10             : #include "Utilities/Gsl.hpp"
      11             : 
      12             : /// \cond
      13             : class TimeDelta;
      14             : namespace TimeSteppers {
      15             : template <typename T>
      16             : class ConstUntypedHistory;
      17             : }  // namespace TimeSteppers
      18             : /// \endcond
      19             : 
      20             : namespace TimeSteppers {
      21             : /*!
      22             :  * \ingroup TimeSteppersGroup
      23             :  * Intermediate base class implementing a generic IMEX Runge-Kutta
      24             :  * scheme.
      25             :  *
      26             :  * Implements most of the virtual methods of ImexTimeStepper for a
      27             :  * generic Runge-Kutta method.  Derived classes must implement the
      28             :  * requirements of the `RungeKutta` base class, as well as
      29             :  * `imex_order()`, `implicit_stage_order()`, and
      30             :  * `implicit_butcher_tableau()`.
      31             :  */
      32           1 : class ImexRungeKutta : public virtual RungeKutta,
      33             :                        public virtual ImexTimeStepper {
      34             :  public:
      35             :   /// Implicit part of the Butcher tableau.  Most parts of the tableau
      36             :   /// must be the same as the explicit part, and so are omitted.
      37           1 :   struct ImplicitButcherTableau {
      38             :     /*!
      39             :      * The coefficient matrix of the substeps.  We can only reasonably
      40             :      * support EDIRK methods (including special cases such as ESDIRK
      41             :      * and QESDIRK, see \cite Kennedy2016), so the tableau must be
      42             :      * lower-triangular with an empty first row.  As with the explicit
      43             :      * tableau, the initial blank row should be omitted.  For a
      44             :      * stiffly-accurate method, the final row must be the same as the
      45             :      * result coefficients in the explicit tableau.
      46             :      *
      47             :      * More general DIRK methods can be implemented inefficiently by
      48             :      * adding an unused initial substep to convert them to EDIRK form.
      49             :      */
      50           1 :     std::vector<std::vector<double>> substep_coefficients;
      51             :   };
      52             : 
      53             :   /*!
      54             :    * Smallest order of the intermediate result at any substep.  For
      55             :    * the methods supported by this class, this cannot exceed 2.
      56             :    */
      57           1 :   virtual size_t implicit_stage_order() const = 0;
      58             : 
      59           0 :   virtual const ImplicitButcherTableau& implicit_butcher_tableau() const = 0;
      60             : 
      61             :  private:
      62             :   template <typename T>
      63           0 :   void add_inhomogeneous_implicit_terms_impl(
      64             :       gsl::not_null<T*> u, const ConstUntypedHistory<T>& implicit_history,
      65             :       const TimeDelta& time_step) const;
      66             : 
      67             :   template <typename T>
      68           0 :   double implicit_weight_impl(const ConstUntypedHistory<T>& implicit_history,
      69             :                               const TimeDelta& time_step) const;
      70             : 
      71             :   IMEX_TIME_STEPPER_DECLARE_OVERLOADS
      72             : };
      73             : }  // namespace TimeSteppers

Generated by: LCOV version 1.14