Skip to content

Add ES-DG optimized 3S* low-storage RK methods (Al Jahdali et al. 2022) - #3241

Merged
ChrisRackauckas merged 5 commits into
SciML:masterfrom
singhharsh1708:aljahdali-3s-methods
Jul 31, 2026
Merged

Add ES-DG optimized 3S* low-storage RK methods (Al Jahdali et al. 2022)#3241
ChrisRackauckas merged 5 commits into
SciML:masterfrom
singhharsh1708:aljahdali-3s-methods

Conversation

@singhharsh1708

@singhharsh1708 singhharsh1708 commented Mar 25, 2026

Copy link
Copy Markdown
Contributor

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 LowStorageRK3SAlgorithm union and _lowstorage_3s_tableau dispatch, same as the ParsaniKetcheson family, so there is no new stepping code. The latest commit consolidated the originally hand-written per-method alg_cache definitions 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.

@singhharsh1708

Copy link
Copy Markdown
Contributor Author

@ChrisRackauckas

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 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 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 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).
- 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).
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.
@ChrisRackauckas
ChrisRackauckas merged commit 0be95df into SciML:master Jul 31, 2026
101 of 131 checks passed
@singhharsh1708
singhharsh1708 deleted the aljahdali-3s-methods branch July 31, 2026 07:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

New low-storage methods for hyperbolic PDEs, optimized for ES DG schemes DG

2 participants