Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <cstddef> 7 : 8 : #include "DataStructures/TaggedVariant.hpp" 9 : #include "Options/String.hpp" 10 : #include "Time/TimeSteppers/RungeKutta.hpp" 11 : #include "Utilities/Serialization/CharmPupable.hpp" 12 : #include "Utilities/TMPL.hpp" 13 : 14 : namespace TimeSteppers { 15 : /*! 16 : * \ingroup TimeSteppersGroup 17 : * \brief A fourth order continuous-extension RK method that provides 4th-order 18 : * dense output. 19 : * 20 : * \f{eqnarray}{ 21 : * \frac{du}{dt} & = & \mathcal{L}(t,u). 22 : * \f} 23 : * Given a solution \f$u(t^n)=u^n\f$, this stepper computes 24 : * \f$u(t^{n+1})=u^{n+1}\f$ using the following equations: 25 : * 26 : * \f{align}{ 27 : * k^{(i)} & = \mathcal{L}(t^n + c_i \Delta t, 28 : * u^n + \Delta t \sum_{j=1}^{i-1} a_{ij} k^{(j)}), 29 : * \mbox{ } 1 \leq i \leq s,\\ 30 : * u^{n+1}(t^n + \theta \Delta t) & = u^n + \Delta t \sum_{i=1}^{s} b_i(\theta) 31 : * k^{(i)}. \f} 32 : * 33 : * Here the coefficients \f$a_{ij}\f$, \f$b_i\f$, and \f$c_i\f$ are given 34 : * in \cite Owren1992 and \cite Gassner20114232. Note that \f$c_1 = 0\f$, 35 : * \f$s\f$ is the number of stages, and \f$\theta\f$ is the fraction of the 36 : * step. This is an FSAL stepper. 37 : * 38 : * The CFL factor/stable step size is 1.4367588951002057. 39 : */ 40 1 : class Rk4Owren : public RungeKutta { 41 : public: 42 0 : using options = tmpl::list<>; 43 0 : static constexpr Options::String help = { 44 : "A 4th-order continuous extension Runge-Kutta time stepper."}; 45 : 46 0 : Rk4Owren() = default; 47 0 : Rk4Owren(const Rk4Owren&) = default; 48 0 : Rk4Owren& operator=(const Rk4Owren&) = default; 49 0 : Rk4Owren(Rk4Owren&&) = default; 50 0 : Rk4Owren& operator=(Rk4Owren&&) = default; 51 0 : ~Rk4Owren() override = default; 52 : 53 1 : variants::TaggedVariant<Tags::FixedOrder, Tags::VariableOrder> order() 54 : const override; 55 : 56 1 : double stable_step() const override; 57 : 58 0 : WRAPPED_PUPable_decl_template(Rk4Owren); // NOLINT 59 : 60 0 : explicit Rk4Owren(CkMigrateMessage* /*msg*/); 61 : 62 0 : const ButcherTableau& butcher_tableau() const override; 63 : }; 64 : 65 0 : inline bool constexpr operator==(const Rk4Owren& /*lhs*/, 66 : const Rk4Owren& /*rhs*/) { 67 : return true; 68 : } 69 : 70 0 : inline bool constexpr operator!=(const Rk4Owren& /*lhs*/, 71 : const Rk4Owren& /*rhs*/) { 72 : return false; 73 : } 74 : } // namespace TimeSteppers