Skip to content

Add initial IMEX Runge-Kutta solvers (SSP and BHR schemes)#3341

Draft
singhharsh1708 wants to merge 3 commits intoSciML:masterfrom
singhharsh1708:imex-rk-solvers
Draft

Add initial IMEX Runge-Kutta solvers (SSP and BHR schemes)#3341
singhharsh1708 wants to merge 3 commits intoSciML:masterfrom
singhharsh1708:imex-rk-solvers

Conversation

@singhharsh1708
Copy link
Copy Markdown
Contributor

@singhharsh1708 singhharsh1708 commented Apr 4, 2026

This PR introduces a set of Implicit-Explicit (IMEX) Runge-Kutta solvers based on the works of Boscarino–Russo (2009) and Pareschi–Russo (2005). These methods are designed for time integration of stiff systems with a natural splitting into non-stiff (explicit) and stiff (implicit) components, i.e., SplitODEProblem.

The implementation extends the existing SDIRK/KenCarp framework in OrdinaryDiffEqSDIRK, since the implicit part of these methods follows an ESDIRK structure, making them compatible with the current infrastructure.

Implemented Methods

From Pareschi & Russo (2005)

IMEXSSP222 — SSP2(2,2,2)
IMEXSSP2322 — SSP2(3,2,2)
IMEXSSP3332 — SSP3(3,3,2)
IMEXSSP3433 — SSP3(4,3,3)

Implementation Details

  • Added new algorithm types in:

    • algorithms.jl
  • Added corresponding Butcher tableaux in:

    • sdirk_tableaus.jl
  • Integrated with existing KenCarp-style stepping logic:

    • kencarp_kvaerno_perform_step.jl
    • kencarp_kvaerno_caches.jl
  • These methods follow the IMEX formulation:

    • implicit part (f1) handled via SDIRK
    • explicit part (f2) handled via explicit RK

Motivation

Existing IMEX methods (e.g., KenCarp family) do not explicitly include:

  • SSP-based IMEX schemes
  • Uniformly accurate IMEX schemes (Boscarino–Russo)

This PR adds:

  • Well-established schemes from literature
  • Methods suitable for hyperbolic systems with relaxation and multiscale problems
  • Improved behavior in the stiff limit (ε → 0), where classical IMEX methods may suffer order reduction

Checklist


Additional context

  • Based on:

    • Boscarino & Russo (2009): Uniformly Accurate IMEX Runge-Kutta Schemes
    • Pareschi & Russo (2005): Implicit-Explicit Runge-Kutta Schemes
  • This PR focuses on core solver implementation; additional variants (e.g., MARS/MARK) can be added in follow-up PRs.

@singhharsh1708
Copy link
Copy Markdown
Contributor Author

@ChrisRackauckas

@oscardssmith
Copy link
Copy Markdown
Member

This should likely be on top of #3030

@singhharsh1708
Copy link
Copy Markdown
Contributor Author

This should likely be on top of #3030

I wanted to first get the solvers working and tested, and then in a follow-up step adapt them to a more generic tableau-based implementation (similar to the ongoing work in #3030 and previous KenCarp/Kvaerno refactors)

@ChrisRackauckas
Copy link
Copy Markdown
Member

The NonlienarSolve wrappers were handled: rebase and there shouldn't be an issue there.

Comment on lines +46 to +48
SFSDIRK7, SFSDIRK8, ESDIRK436L2SA2, ESDIRK437L2SA, ESDIRK547L2SA2, ESDIRK659L2SA,
IMEXSSP222, IMEXSSP2322, IMEXSSP3332, IMEXSSP3433,
ARS222, ARS232, ARS443, BHR553
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I dont' think we want to export these

Comment on lines +2746 to +2750
@muladd function perform_step!(
integrator, cache::IMEXSSP222ConstantCache, repeat_step = false
)
(; t, dt, uprev, u, p) = integrator
nlsolver = cache.nlsolver
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It doesn't seem helpful to just write a ton of perform_step!s for these pretableau.

@singhharsh1708
Copy link
Copy Markdown
Contributor Author

@ChrisRackauckas

@singhharsh1708 singhharsh1708 marked this pull request as draft April 8, 2026 20:39
[1 0]
b̃ = [1/2, 1/2]
=#
struct IMEXSSP222Tableau{T, T2}
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why 222 instead of four numbers 2222 like for the others?

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.

4 participants