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
|
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 {} |
| NewtonReport * | nreport = nullptr |
| Real | pos_floor = Real(0) |
| Zhang-Shu positivity limiter (<= 0: inactive) | |
Detailed Description
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()()
|
inline |
Here is the call graph for this function:Member Data Documentation
◆ ctx
| GridContext pops::detail::AdvanceImexRkArs222< Limiter, Flux, Model >::ctx |
◆ m
| Model pops::detail::AdvanceImexRkArs222< Limiter, Flux, Model >::m |
◆ nopts
| NewtonOptions pops::detail::AdvanceImexRkArs222< Limiter, Flux, Model >::nopts {} |
◆ nreport
| NewtonReport* pops::detail::AdvanceImexRkArs222< Limiter, Flux, Model >::nreport = nullptr |
◆ pos_floor
| Real pops::detail::AdvanceImexRkArs222< Limiter, Flux, Model >::pos_floor = Real(0) |
Zhang-Shu positivity limiter (<= 0: inactive)
◆ recon_prim
| bool pops::detail::AdvanceImexRkArs222< Limiter, Flux, Model >::recon_prim |
The documentation for this struct was generated from the following file:
- include/pops/runtime/builders/block/block_builder.hpp
Generated by