Add ES-DG optimized 3S* low-storage RK methods (Al Jahdali et al. 2022) - #3241
Merged
ChrisRackauckas merged 5 commits intoJul 31, 2026
Merged
Conversation
Contributor
Author
ChrisRackauckas
approved these changes
Mar 26, 2026
singhharsh1708
added a commit
to singhharsh1708/OrdinaryDiffEq.jl
that referenced
this pull request
Jul 15, 2026
Rebasing SciML#3241 (approved months ago) over master exposed two breakages from unrelated drift, not merge conflicts: - thread::Thread = False() no longer resolves; the rest of the low-storage family moved to Serial() as the default. - SVector(...) was passed to LowStorageRK3SConstantCache, whose fields are NTuple; StaticArrays was never a runtime dependency, only a test one, so this never actually worked. Switched to plain tuples matching the sibling ParsaniKetcheson* constructors. Also Runic-reformats the added AlJahdali constructors (numeric literal style drifted from current convention); no other lines touched. Verified: all 16 methods solve, order-of-convergence matches each method's claimed order, and the full LowStorageRK Core suite passes (515 pass, 28 pre-existing broken, 0 fail).
singhharsh1708
force-pushed
the
aljahdali-3s-methods
branch
from
July 15, 2026 21:03
f3659ad to
7ce88e7
Compare
singhharsh1708
added a commit
to singhharsh1708/OrdinaryDiffEq.jl
that referenced
this pull request
Jul 16, 2026
Rebasing SciML#3241 (approved months ago) over master exposed two breakages from unrelated drift, not merge conflicts: - thread::Thread = False() no longer resolves; the rest of the low-storage family moved to Serial() as the default. - SVector(...) was passed to LowStorageRK3SConstantCache, whose fields are NTuple; StaticArrays was never a runtime dependency, only a test one, so this never actually worked. Switched to plain tuples matching the sibling ParsaniKetcheson* constructors. Also Runic-reformats the added AlJahdali constructors (numeric literal style drifted from current convention); no other lines touched. Verified: all 16 methods solve, order-of-convergence matches each method's claimed order, and the full LowStorageRK Core suite passes (515 pass, 28 pre-existing broken, 0 fail).
singhharsh1708
force-pushed
the
aljahdali-3s-methods
branch
from
July 16, 2026 11:50
798dec8 to
58c60e1
Compare
singhharsh1708
added a commit
to singhharsh1708/OrdinaryDiffEq.jl
that referenced
this pull request
Jul 18, 2026
Rebasing SciML#3241 (approved months ago) over master exposed two breakages from unrelated drift, not merge conflicts: - thread::Thread = False() no longer resolves; the rest of the low-storage family moved to Serial() as the default. - SVector(...) was passed to LowStorageRK3SConstantCache, whose fields are NTuple; StaticArrays was never a runtime dependency, only a test one, so this never actually worked. Switched to plain tuples matching the sibling ParsaniKetcheson* constructors. Also Runic-reformats the added AlJahdali constructors (numeric literal style drifted from current convention); no other lines touched. Verified: all 16 methods solve, order-of-convergence matches each method's claimed order, and the full LowStorageRK Core suite passes (515 pass, 28 pre-existing broken, 0 fail).
singhharsh1708
force-pushed
the
aljahdali-3s-methods
branch
from
July 18, 2026 07:33
58c60e1 to
5c06e64
Compare
singhharsh1708
added a commit
to singhharsh1708/OrdinaryDiffEq.jl
that referenced
this pull request
Jul 21, 2026
Rebasing SciML#3241 (approved months ago) over master exposed two breakages from unrelated drift, not merge conflicts: - thread::Thread = False() no longer resolves; the rest of the low-storage family moved to Serial() as the default. - SVector(...) was passed to LowStorageRK3SConstantCache, whose fields are NTuple; StaticArrays was never a runtime dependency, only a test one, so this never actually worked. Switched to plain tuples matching the sibling ParsaniKetcheson* constructors. Also Runic-reformats the added AlJahdali constructors (numeric literal style drifted from current convention); no other lines touched. Verified: all 16 methods solve, order-of-convergence matches each method's claimed order, and the full LowStorageRK Core suite passes (515 pass, 28 pre-existing broken, 0 fail).
singhharsh1708
force-pushed
the
aljahdali-3s-methods
branch
from
July 21, 2026 14:31
5c06e64 to
c7e5d8f
Compare
- Implement 16 new methods (advection- and vortex-optimized) - Reuse existing LowStorageRK3S cache structures (no allocations) - Add tableau constructors and alg_cache implementations - Register methods in alg_utils and exports - All tests pass (517 + JET + Aqua)
singhharsh1708
added a commit
to singhharsh1708/OrdinaryDiffEq.jl
that referenced
this pull request
Jul 30, 2026
Rebasing SciML#3241 (approved months ago) over master exposed two breakages from unrelated drift, not merge conflicts: - thread::Thread = False() no longer resolves; the rest of the low-storage family moved to Serial() as the default. - SVector(...) was passed to LowStorageRK3SConstantCache, whose fields are NTuple; StaticArrays was never a runtime dependency, only a test one, so this never actually worked. Switched to plain tuples matching the sibling ParsaniKetcheson* constructors. Also Runic-reformats the added AlJahdali constructors (numeric literal style drifted from current convention); no other lines touched. Verified: all 16 methods solve, order-of-convergence matches each method's claimed order, and the full LowStorageRK Core suite passes (515 pass, 28 pre-existing broken, 0 fail).
singhharsh1708
force-pushed
the
aljahdali-3s-methods
branch
from
July 30, 2026 19:22
c7e5d8f to
ff9b548
Compare
Adapt the 16 constant-cache constructors to upstream changes that landed after the March review: LowStorageRK3SConstantCache moved its fields from SVector to NTuple and the sublibrary dropped StaticArrays, so the SVector construction that was correct at approval time no longer builds. Switched to plain tuples matching the sibling ParsaniKetcheson* constructors, and the thread default changed False() -> Serial() with the same upstream drift. Also Runic-reformats the added AlJahdali constructors (numeric literal style drifted from current convention); no other lines touched.
The approved PR shipped with no test coverage for these methods at all. Adds a compact loop over all 16 checking convergence order against an analytic reference (test_problems_only_time), matching each method's alg_order. Unlike ParsaniKetchesonDeconinck3S*, these don't show a consistent +1 pure-quadrature super-convergence bump at the same dts range (some do, some measure close to their claimed order, some land between), so atol is looser (1.25) than the family's usual testTol (0.25) rather than hand-tuning dts per method. Still catches an actually wrong coefficient set, which would land further off.
Spell Check CI flagged every occurrence of Vor (the vorticity- optimized half of the AlJahdali 3S* family, paired with Adv for advection-optimized) as a typo for For.
Route the 16 AlJahdali methods through LowStorageRK3SAlgorithm and _lowstorage_3s_tableau like the ParsaniKetcheson family, deleting the 32 hand-written per-method alg_cache definitions. Drop the positional compatibility constructors: the methods are new so there is nothing to be compatible with, and the positional form silently discarded a passed stage limiter (the 3S kernel does not apply stage limiters). Also document the 16 exports in the LowStorageRK docs page, match the ConstantCache constructor signatures to the sibling families, and bump OrdinaryDiffEqLowStorageRK to 3.3.0 for the new exports. Verified behavior-preserving: end states for all 16 methods are bit-identical to the pre-consolidation dispatch on in-place and out-of-place problems, and the full LowStorageRK test file passes.
singhharsh1708
force-pushed
the
aljahdali-3s-methods
branch
from
July 30, 2026 19:43
ff9b548 to
abe4ea8
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #2903.
Adds the 16 3S* low-storage methods from Al Jahdali, Dalcin, Boukharfane, Nolasco, Keyes, Parsani (2022), "Optimized explicit Runge-Kutta schemes for high-order collocated discontinuous Galerkin methods for compressible fluid dynamics" (doi:10.1016/j.camwa.2022.05.006). Eight advection-optimized (
AlJahdaliAdv3S*) and eight vortex-optimized (AlJahdaliVor3S*), orders 2 through 5, fixed timestep only as in the paper.The methods are pure coefficient data: they go through the existing
LowStorageRK3SAlgorithmunion and_lowstorage_3s_tableaudispatch, same as the ParsaniKetcheson family, so there is no new stepping code. The latest commit consolidated the originally hand-written per-methodalg_cachedefinitions into that dispatch (-705 lines) and dropped the positional compatibility constructors, matching how master restructured the family since this PR was first reviewed. End states before and after that consolidation are bit-identical for all 16 methods, in-place and out-of-place.Coefficients were checked against the order conditions directly: tableaus reconstructed from the stored 3S* arrays in BigFloat satisfy all rooted-tree conditions at the claimed order for every method, and the order-(p+1) conditions are properly violated. Convergence testset covers all 16. Steps allocate 0 bytes after warmup, same as the existing 3S methods. The 16 exports are documented in the LowStorageRK docs page and the sublibrary is bumped to 3.3.0.
AI Disclosure
Claude assisted with this work.