AdvanceImexRkArs222< Limiter, Flux, Model > Struct Template ReferenceΒΆ

adc_cpp: pops::detail::AdvanceImexRkArs222< Limiter, Flux, Model > Struct Template Reference
adc_cpp 0.3.0
Model-free C++23 core for coupled hyperbolic-elliptic systems on adaptive (AMR) meshes, with MPI and GPU (Kokkos) backends
pops::detail::AdvanceImexRkArs222< Limiter, Flux, Model > Struct Template Reference

IMEX-RK ARS(2,2,2) advance (Ascher, Ruuth, Spiteri 1997; "Implicit-explicit Runge-Kutta methods for time-dependent partial differential equations", Appl. More...

#include <block_builder.hpp>

+ Collaboration diagram for pops::detail::AdvanceImexRkArs222< Limiter, Flux, Model >:

Public Member Functions

void operator() (MultiFab &U, Real dt, int n) const
 

Public Attributes

Model m
 
GridContext ctx
 
bool recon_prim
 
NewtonOptions nopts {}
 
NewtonReportnreport = nullptr
 
Real pos_floor = Real(0)
 Zhang-Shu positivity limiter (<= 0: inactive)
 

Detailed Description

template<class Limiter, class Flux, class Model>
struct pops::detail::AdvanceImexRkArs222< Limiter, Flux, Model >

IMEX-RK ARS(2,2,2) advance (Ascher, Ruuth, Spiteri 1997; "Implicit-explicit Runge-Kutta methods for time-dependent partial differential equations", Appl.

Numer. Math. 25): explicit transport (L = -div F) coupled to the stiff implicit source (per-cell LOCAL backward-Euler), ORDER 2. It is a family DISTINCT from and PARALLEL to AdvanceImex (which remains the default order-1 backward-Euler, UNTOUCHED and bit-identical). Coefficients: gamma = 1 - 1/sqrt(2), delta = 1 - 1/(2 gamma).

Tableaux (stiffly accurate, implicit part SDIRK; c = [0, gamma, 1] for both): explicit: A_E = [[0, 0, 0], [gamma, 0, 0], [delta, 1-delta, 0]], b_E = [delta, 1-delta, 0] implicit: A_I = [[0, 0, 0], [0, gamma, 0], [0, 1-gamma, gamma]], b_I = [0, 1-gamma, gamma]

b_E == last row of A_E and b_I == last row of A_I -> STIFFLY ACCURATE scheme -> the final solution IS the last stage (U^{n+1} = U^(3)), no final recombination. With L = the SourceFreeModel transport and S = the source of the full model, the per-stage recurrence is: U^(1) = U^n (first row of A_I is zero: no solve, S^(1) unused) L1 = L(U^n) U^(2) = U^n + dt*gamma*L1 + dt*gamma*S(U^(2)) (implicit solve: backward_euler_source at step dt*gamma on the base U^n + dt*gamma*L1) L2 = L(U^(2)) U^(3) = U^n + dt*delta*L1 + dt*(1-delta)*L2 + dt*(1-gamma)*S^(2) + dt*gamma*S(U^(3)) U^{n+1} = U^(3) The term dt*gamma*S^(2) is NOT re-evaluated: by construction of the stage-2 solve, dt*gamma*S^(2) = U^(2) - base2 (the solve increment), so dt*(1-gamma)*S^(2) = ((1-gamma)/gamma) * (U^(2) - base2). NO extra source kernel: we REUSE BlockRhsEval<SourceFreeModel> (transport, SAME mechanism as the explicit half-step of AdvanceImex), backward_euler_source (local implicit solve) and saxpy/lincomb (stages). Device-clean (no new kernel).

FULLY IMPLICIT SOURCE: the partial IMEX mask is NOT wired here (the consistency relation dt*gamma*S^(2) = U^(2) - base2 assumes a homogeneous stage solve; a per-component forward-backward treatment would mix the explicit/implicit tableaux). System::add_block therefore rejects implicit_vars/implicit_roles with time='imexrk_ars222'. The Newton options (nopts), on the other hand, are carried through: they parametrize BOTH implicit stage solves.

The stage MultiFabs are allocated ONCE per advance (outside the substep loop): Un (U^n), L1/L2 (transport residuals), base2 (stage-2 base, re-read at stage 3) without ghosts (read on valid cells); work (stage state) with the ghosts of U (it is passed to the transport residual).

Member Function Documentation

◆ operator()()

template<class Limiter , class Flux , class Model >
void pops::detail::AdvanceImexRkArs222< Limiter, Flux, Model >::operator() ( MultiFab U,
Real  dt,
int  n 
) const
inline
+ Here is the call graph for this function:

Member Data Documentation

◆ ctx

template<class Limiter , class Flux , class Model >
GridContext pops::detail::AdvanceImexRkArs222< Limiter, Flux, Model >::ctx

◆ m

template<class Limiter , class Flux , class Model >
Model pops::detail::AdvanceImexRkArs222< Limiter, Flux, Model >::m

◆ nopts

template<class Limiter , class Flux , class Model >
NewtonOptions pops::detail::AdvanceImexRkArs222< Limiter, Flux, Model >::nopts {}

◆ nreport

template<class Limiter , class Flux , class Model >
NewtonReport* pops::detail::AdvanceImexRkArs222< Limiter, Flux, Model >::nreport = nullptr

◆ pos_floor

template<class Limiter , class Flux , class Model >
Real pops::detail::AdvanceImexRkArs222< Limiter, Flux, Model >::pos_floor = Real(0)

Zhang-Shu positivity limiter (<= 0: inactive)

◆ recon_prim

template<class Limiter , class Flux , class Model >
bool pops::detail::AdvanceImexRkArs222< Limiter, Flux, Model >::recon_prim

The documentation for this struct was generated from the following file: