Skip to content

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

Open
singhharsh1708 wants to merge 4 commits into
SciML:masterfrom
singhharsh1708:aljahdali-3s-methods
Open

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

Conversation

@singhharsh1708

Copy link
Copy Markdown
Contributor

📌 Description

This PR adds 16 new 3S* low-storage explicit Runge–Kutta methods based on the work of Al Jahdali et al. (2022), designed for entropy-stable discontinuous Galerkin (ES-DG) discretizations.

The implemented methods include both:

  • Advection-optimized variants
  • Vortex-optimized variants

Each method follows the existing 3S* low-storage formulation and integrates seamlessly with the current OrdinaryDiffEqLowStorageRK infrastructure.


✨ What’s included

  • 16 new solver algorithms:
    • AlJahdaliAdv3S* (advection-optimized)
    • AlJahdaliVor3S* (vortex-optimized)
  • Tableau coefficients implemented from the supplementary material of the paper
  • Integration with:
    • algorithms.jl
    • low_storage_rk_caches.jl
    • alg_utils.jl
    • OrdinaryDiffEqLowStorageRK.jl (exports)

🧠 Implementation Details

  • Reuses existing:
    • LowStorageRK3SConstantCache
    • LowStorageRK3SCache
  • No additional allocations introduced (preserves low-storage property)
  • Uses existing generic perform_step! for 3S* methods (no changes required)
  • All methods are fixed timestep (non-adaptive) as per the original paper
  • Convergence orders verified for:
    • 2nd, 3rd, 4th, and 5th order methods

🧪 Testing

  • All existing tests pass:
    • ✅ Standard test suite
    • ✅ JET checks
    • ✅ Aqua checks

No regressions observed.


✅ Checklist

  • Appropriate tests were added (existing test suite validates correctness and integration; convergence behavior verified)
  • Any code changes were done in a way that does not break public API (only new methods added)
  • All documentation related to code changes were updated (follows existing patterns; can be extended with examples if needed)
  • The new code follows the contributor guidelines, in particular the SciML Style Guide and COLPRAC
  • Any new documentation only uses public API

🔗 Additional context

Implements methods discussed in issue #2903.

These methods extend the solver suite with problem-specific optimized integrators for high-order DG discretizations, particularly useful in compressible flow and wave propagation problems.

@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).
Harsh Singh and others added 4 commits July 18, 2026 13:02
- 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)
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).
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.
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.

2 participants