kernel_ssprk54 Subroutine

public subroutine kernel_ssprk54(u, resid, s1, s2, s3, dt, rhs, ctx)

SSPRK(5,4) — Spiteri & Ruuth (2002), SIAM J. Numer. Anal. 40(2), 469-491, Shu-Osher form. Coefficients independently cross-checked against NodePy (ketch/nodepy, runge_kutta_method.py, RK['SSP54']/'SSPRK54', fetched 2026-07-08): converting this routine's Shu-Osher coefficients to Butcher (A, b) form reproduces every one of NodePy's 30-digit A/b entries to 8-12 significant digits, consistent with NodePy's own documented note that its table is a higher-precision (30-digit) re-solve of the same Ruuth-Spiteri method whose originally published coefficients (as coded below, ~15 digits) are only accurate to about 10 digits. Five stages, order 4, SSP coefficient c ~= 1.508. Register use: s1 = u0 (stages 2-4), s2 = u2 then the final stage's partial sum, s3 = u3; the final stage's L(u3) piece is accumulated into s2 before stage 4 overwrites resid (avoids a fourth scratch array). HISTORY: before 2026-07 this routine carried an unpublished 3rd-order tableau (initial-commit transcription defect; see the 2026-07-07 retrospective). The observed-order tripwire test guards against any regression.

Arguments

Type IntentOptional Attributes Name
real(kind=wp), intent(in), pointer :: u(:)
real(kind=wp), intent(in), pointer :: resid(:)
real(kind=wp), intent(in), pointer :: s1(:)
real(kind=wp), intent(in), pointer :: s2(:)
real(kind=wp), intent(in), pointer :: s3(:)
real(kind=wp), intent(in) :: dt
procedure(rhs_fn) :: rhs
class(*), intent(inout), target :: ctx