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 "Options/String.hpp" 9 : #include "Time/TimeSteppers/ImexRungeKutta.hpp" 10 : #include "Utilities/Serialization/CharmPupable.hpp" 11 : #include "Utilities/TMPL.hpp" 12 : 13 : namespace TimeSteppers { 14 : /*! 15 : * \ingroup TimeSteppersGroup 16 : * \brief A second order continuous-extension RK method that provides 2nd-order 17 : * dense output. 18 : * 19 : * \f{eqnarray}{ 20 : * \frac{du}{dt} & = & \mathcal{L}(t,u). 21 : * \f} 22 : * Given a solution \f$u(t^n)=u^n\f$, this stepper computes 23 : * \f$u(t^{n+1})=u^{n+1}\f$ using the following equations: 24 : * 25 : * \f{align}{ 26 : * k^{(i)} & = \mathcal{L}(t^n + c_i \Delta t, 27 : * u^n + \Delta t \sum_{j=1}^{i-1} a_{ij} k^{(j)}), 28 : * \mbox{ } 1 \leq i \leq s,\\ 29 : * u^{n+1}(t^n + \theta \Delta t) & = u^n + \Delta t \sum_{i=1}^{s} b_i(\theta) 30 : * k^{(i)}. \f} 31 : * 32 : * Here the coefficients \f$a_{ij}\f$, \f$b_i\f$, and \f$c_i\f$ are given 33 : * in \cite Gassner20114232. Note that \f$c_1 = 0\f$, \f$s\f$ is the number 34 : * of stages, and \f$\theta\f$ is the fraction of the step. 35 : * 36 : * When used as an IMEX method, the implicit portion uses the 37 : * trapezoid rule, which is stiffly accurate and A-stable. 38 : * 39 : * The CFL factor/stable step size is 1.0. 40 : */ 41 1 : class Heun2 : public ImexRungeKutta { 42 : public: 43 0 : using options = tmpl::list<>; 44 0 : static constexpr Options::String help = { 45 : "Heun's method, a 2nd order Runge-Kutta method."}; 46 : 47 0 : Heun2() = default; 48 0 : Heun2(const Heun2&) = default; 49 0 : Heun2& operator=(const Heun2&) = default; 50 0 : Heun2(Heun2&&) = default; 51 0 : Heun2& operator=(Heun2&&) = default; 52 0 : ~Heun2() override = default; 53 : 54 1 : size_t order() const override; 55 : 56 1 : double stable_step() const override; 57 : 58 1 : size_t imex_order() const override; 59 : 60 1 : size_t implicit_stage_order() const override; 61 : 62 0 : WRAPPED_PUPable_decl_template(Heun2); // NOLINT 63 : 64 0 : explicit Heun2(CkMigrateMessage* /*unused*/) {} 65 : 66 0 : const ButcherTableau& butcher_tableau() const override; 67 : 68 0 : const ImplicitButcherTableau& implicit_butcher_tableau() const override; 69 : }; 70 : 71 0 : inline bool constexpr operator==(const Heun2& /*lhs*/, const Heun2& /*rhs*/) { 72 : return true; 73 : } 74 : 75 0 : inline bool constexpr operator!=(const Heun2& /*lhs*/, const Heun2& /*rhs*/) { 76 : return false; 77 : } 78 : } // namespace TimeSteppers