20#ifndef DUMUX_TIMESTEPPING_MULTISTAGE_METHODS_HH
21#define DUMUX_TIMESTEPPING_MULTISTAGE_METHODS_HH
90 virtual std::string
name ()
const = 0;
104template<
class Scalar>
109 : paramAlpha_{{-1.0, 1.0}}
110 , paramBeta_{{1.0-theta, theta}}
111 , paramD_{{0.0, 1.0}}
115 {
return paramBeta_[1] > 0.0; }
121 {
return paramAlpha_[k]; }
124 {
return paramBeta_[k]; }
127 {
return paramD_[k]; }
129 std::string
name ()
const override
130 {
return "theta scheme"; }
133 std::array<Scalar, 2> paramAlpha_;
134 std::array<Scalar, 2> paramBeta_;
135 std::array<Scalar, 2> paramD_;
141template<
class Scalar>
147 std::string
name () const final
148 {
return "explicit Euler"; }
154template<
class Scalar>
160 std::string
name () const final
161 {
return "implicit Euler"; }
167template<
class Scalar>
172 : paramAlpha_{{{-1.0, 1.0, 0.0},
174 , paramBeta_{{{1.0, 0.0, 0.0},
176 , paramD_{{0.0, 1.0, 1.0}}
186 {
return paramAlpha_[i-1][k]; }
189 {
return paramBeta_[i-1][k]; }
192 {
return paramD_[k]; }
194 std::string
name () const final
195 {
return "explicit Runge-Kutta 2nd order (Heun)"; }
198 std::array<std::array<Scalar, 3>, 2> paramAlpha_;
199 std::array<std::array<Scalar, 3>, 2> paramBeta_;
200 std::array<Scalar, 3> paramD_;
206template<
class Scalar>
211 : paramAlpha_{{{-1.0, 1.0, 0.0, 0.0},
212 {-1.0, 0.0, 1.0, 0.0},
213 {-1.0, 0.0, 0.0, 1.0}}}
214 , paramBeta_{{{0.5, 0.0, 0.0, 0.0},
215 {-1.0, 2.0, 0.0, 0.0},
216 {1.0/6.0, 2.0/3.0, 1.0/6.0, 0.0}}}
217 , paramD_{{0.0, 0.5, 1.0, 1.0}}
227 {
return paramAlpha_[i-1][k]; }
230 {
return paramBeta_[i-1][k]; }
233 {
return paramD_[k]; }
235 std::string
name () const final
236 {
return "explicit Runge-Kutta 3rd order"; }
239 std::array<std::array<Scalar, 4>, 3> paramAlpha_;
240 std::array<std::array<Scalar, 4>, 3> paramBeta_;
241 std::array<Scalar, 4> paramD_;
247template<
class Scalar>
252 : paramAlpha_{{{-1.0, 1.0, 0.0, 0.0, 0.0},
253 {-1.0, 0.0, 1.0, 0.0, 0.0},
254 {-1.0, 0.0, 0.0, 1.0, 0.0},
255 {-1.0, 0.0, 0.0, 0.0, 1.0}}}
256 , paramBeta_{{{0.5, 0.0, 0.0, 0.0, 0.0},
257 {0.0, 0.5, 0.0, 0.0, 0.0},
258 {0.0, 0.0, 1.0, 0.0, 0.0},
259 {1.0/6.0, 1.0/3.0, 1.0/3.0, 1.0/6.0, 0.0}}}
260 , paramD_{{0.0, 0.5, 0.5, 1.0, 1.0}}
270 {
return paramAlpha_[i-1][k]; }
273 {
return paramBeta_[i-1][k]; }
276 {
return paramD_[k]; }
278 std::string
name () const final
279 {
return "explicit Runge-Kutta 4th order"; }
282 std::array<std::array<Scalar, 5>, 4> paramAlpha_;
283 std::array<std::array<Scalar, 5>, 4> paramBeta_;
284 std::array<Scalar, 5> paramD_;
292template<
class Scalar>
299 const Scalar gamma = 1.0 - 1.0/sqrt(2.0);
301 paramD_ = {{0.0, gamma, 1.0}};
308 {0.0, 1.0-gamma, gamma}
319 {
return paramAlpha_[i-1][k]; }
322 {
return paramBeta_[i-1][k]; }
325 {
return paramD_[k]; }
327 std::string
name () const final
328 {
return "diagonally implicit Runge-Kutta 2nd order (Alexander)"; }
331 std::array<std::array<Scalar, 3>, 2> paramAlpha_;
332 std::array<std::array<Scalar, 3>, 2> paramBeta_;
333 std::array<Scalar, 3> paramD_;
340template<
class Scalar>
346 constexpr Scalar alpha = []{
348 Scalar alpha = 0.4358665215;
349 for (
int i = 0; i < 10; ++i)
350 alpha = alpha - (alpha*(alpha*alpha-3.0*(alpha-0.5))-1.0/6.0)/(3.0*alpha*(alpha-2.0)+1.5);
354 constexpr Scalar tau2 = (1.0+alpha)*0.5;
355 constexpr Scalar b1 = -(6.0*alpha*alpha -16.0*alpha + 1.0)*0.25;
356 constexpr Scalar b2 = (6*alpha*alpha - 20.0*alpha + 5.0)*0.25;
358 paramD_ = {{0.0, alpha, tau2, 1.0}};
360 {-1.0, 1.0, 0.0, 0.0},
361 {-1.0, 0.0, 1.0, 0.0},
362 {-1.0, 0.0, 0.0, 1.0}
365 {0.0, alpha, 0.0, 0.0},
366 {0.0, tau2-alpha, alpha, 0.0},
378 {
return paramAlpha_[i-1][k]; }
381 {
return paramBeta_[i-1][k]; }
384 {
return paramD_[k]; }
386 std::string
name () const final
387 {
return "diagonally implicit Runge-Kutta 3rd order (Alexander)"; }
390 std::array<std::array<Scalar, 4>, 3> paramAlpha_;
391 std::array<std::array<Scalar, 4>, 3> paramBeta_;
392 std::array<Scalar, 4> paramD_;
416template<
class Scalar>
422 {-1.0, 1.0, 0.0, 0.0},
423 {-1.0, 0.0, 1.0, 0.0},
424 {-1.0, 0.0, 0.0, 1.0}
427 {0.0, 0.25, 0.0, 0.0},
428 {0.0, 0.5, 0.25, 0.0},
431 , paramD_{{0.0, 0.25, 0.75, 1.0}}
441 {
return paramAlpha_[i-1][k]; }
444 {
return paramBeta_[i-1][k]; }
447 {
return paramD_[k]; }
449 std::string
name () const final
450 {
return "symplectic diagonally implicit Runge-Kutta 2nd order (Qin-Zhang)"; }
453 std::array<std::array<Scalar, 4>, 3> paramAlpha_;
454 std::array<std::array<Scalar, 4>, 3> paramBeta_;
455 std::array<Scalar, 4> paramD_;
DIRKSecondOrderAlexander()
Definition multistagemethods.hh:296
Scalar timeStepWeight(std::size_t k) const final
time step weights for each stage ( )
Definition multistagemethods.hh:324
std::size_t numStages() const final
Definition multistagemethods.hh:315
bool implicit() const final
Definition multistagemethods.hh:312
std::string name() const final
Definition multistagemethods.hh:327
Scalar spatialWeight(std::size_t i, std::size_t k) const final
weights of the spatial operator residual ( )
Definition multistagemethods.hh:321
Scalar temporalWeight(std::size_t i, std::size_t k) const final
weights of the temporal operator residual ( )
Definition multistagemethods.hh:318
bool implicit() const final
Definition multistagemethods.hh:371
DIRKThirdOrderAlexander()
Definition multistagemethods.hh:344
Scalar temporalWeight(std::size_t i, std::size_t k) const final
weights of the temporal operator residual ( )
Definition multistagemethods.hh:377
Scalar spatialWeight(std::size_t i, std::size_t k) const final
weights of the spatial operator residual ( )
Definition multistagemethods.hh:380
Scalar timeStepWeight(std::size_t k) const final
time step weights for each stage ( )
Definition multistagemethods.hh:383
std::string name() const final
Definition multistagemethods.hh:386
std::size_t numStages() const final
Definition multistagemethods.hh:374
ExplicitEuler()
Definition multistagemethods.hh:145
std::string name() const final
Definition multistagemethods.hh:147
ImplicitEuler()
Definition multistagemethods.hh:158
std::string name() const final
Definition multistagemethods.hh:160
std::size_t numStages() const final
Definition multistagemethods.hh:437
Scalar timeStepWeight(std::size_t k) const final
time step weights for each stage ( )
Definition multistagemethods.hh:446
std::string name() const final
Definition multistagemethods.hh:449
QinZhangSymplecticDIRK()
Definition multistagemethods.hh:420
bool implicit() const final
Definition multistagemethods.hh:434
Scalar spatialWeight(std::size_t i, std::size_t k) const final
weights of the spatial operator residual ( )
Definition multistagemethods.hh:443
Scalar temporalWeight(std::size_t i, std::size_t k) const final
weights of the temporal operator residual ( )
Definition multistagemethods.hh:440
RungeKuttaExplicitFourthOrder()
Definition multistagemethods.hh:251
Scalar temporalWeight(std::size_t i, std::size_t k) const final
weights of the temporal operator residual ( )
Definition multistagemethods.hh:269
std::string name() const final
Definition multistagemethods.hh:278
bool implicit() const final
Definition multistagemethods.hh:263
std::size_t numStages() const final
Definition multistagemethods.hh:266
Scalar spatialWeight(std::size_t i, std::size_t k) const final
weights of the spatial operator residual ( )
Definition multistagemethods.hh:272
Scalar timeStepWeight(std::size_t k) const final
time step weights for each stage ( )
Definition multistagemethods.hh:275
std::size_t numStages() const final
Definition multistagemethods.hh:182
RungeKuttaExplicitSecondOrderHeun()
Definition multistagemethods.hh:171
bool implicit() const final
Definition multistagemethods.hh:179
std::string name() const final
Definition multistagemethods.hh:194
Scalar temporalWeight(std::size_t i, std::size_t k) const final
weights of the temporal operator residual ( )
Definition multistagemethods.hh:185
Scalar spatialWeight(std::size_t i, std::size_t k) const final
weights of the spatial operator residual ( )
Definition multistagemethods.hh:188
Scalar timeStepWeight(std::size_t k) const final
time step weights for each stage ( )
Definition multistagemethods.hh:191
bool implicit() const final
Definition multistagemethods.hh:220
Scalar timeStepWeight(std::size_t k) const final
time step weights for each stage ( )
Definition multistagemethods.hh:232
Scalar spatialWeight(std::size_t i, std::size_t k) const final
weights of the spatial operator residual ( )
Definition multistagemethods.hh:229
std::size_t numStages() const final
Definition multistagemethods.hh:223
Scalar temporalWeight(std::size_t i, std::size_t k) const final
weights of the temporal operator residual ( )
Definition multistagemethods.hh:226
std::string name() const final
Definition multistagemethods.hh:235
RungeKuttaExplicitThirdOrder()
Definition multistagemethods.hh:210
std::size_t numStages() const final
Definition multistagemethods.hh:117
bool implicit() const final
Definition multistagemethods.hh:114
std::string name() const override
Definition multistagemethods.hh:129
Theta(const Scalar theta)
Definition multistagemethods.hh:108
Scalar spatialWeight(std::size_t, std::size_t k) const final
weights of the spatial operator residual ( )
Definition multistagemethods.hh:123
Scalar temporalWeight(std::size_t, std::size_t k) const final
weights of the temporal operator residual ( )
Definition multistagemethods.hh:120
Scalar timeStepWeight(std::size_t k) const final
time step weights for each stage ( )
Definition multistagemethods.hh:126
Abstract interface for one-step multi-stage method parameters in Shu/Osher form.
Definition multistagemethods.hh:75
virtual std::string name() const =0
virtual std::size_t numStages() const =0
virtual ~MultiStageMethod()=default
virtual Scalar timeStepWeight(std::size_t k) const =0
time step weights for each stage ( )
virtual Scalar temporalWeight(std::size_t i, std::size_t k) const =0
weights of the temporal operator residual ( )
virtual bool implicit() const =0
virtual Scalar spatialWeight(std::size_t i, std::size_t k) const =0
weights of the spatial operator residual ( )
Multi-stage time stepping scheme implementations.
Definition multistagemethods.hh:96
Definition assembly/assembler.hh:44