Skip to content

Conversation

@ChrisRackauckas
Copy link
Member

Summary

This PR implements the new explicit 15-stage Runge-Kutta method of order 10 from the paper by F. White et al. (2025, arXiv:2504.17329), addressing issue #2694.

Changes

  • Added FW15Stage10 algorithm struct with appropriate documentation
  • Implemented constant and mutable cache structures for the method
  • Added Butcher tableau coefficients extracted from the provided NUM file
  • Implemented perform_step\! methods for both cache types
  • Added initialize\! functions for proper integrator setup
  • Registered algorithm order (10) in alg_utils.jl
  • Exported the new method from OrdinaryDiffEqHighOrderRK
  • Added basic convergence test to verify 10th order accuracy

Technical Details

The method uses 15 stages to achieve 10th order accuracy. The coefficients were extracted from the NUM file provided in the issue, which contains the method's c (nodes), A (Runge-Kutta matrix), and b (weights) coefficients in 90-digit precision format.

Testing

  • Added convergence test in high_order_erk_convergence_tests.jl
  • Verified the method compiles and runs on simple test problems
  • The method successfully integrates basic ODEs

Notes

This is a fixed-step explicit method without embedded error estimation. Future work could include adding an embedded lower-order method for adaptive timestepping.

Fixes #2694

🤖 Generated with Claude Code

This commit implements the new explicit 15-stage Runge-Kutta method of order 10
from the paper by F. White et al. (2025, arXiv:2504.17329).

Changes:
- Add FW15Stage10 algorithm struct with documentation
- Implement constant and mutable cache structures
- Add Butcher tableau coefficients extracted from provided data
- Implement perform_step\! methods for both cache types
- Add initialize\! functions for proper integrator setup
- Register algorithm order (10) in alg_utils
- Export the new method from OrdinaryDiffEqHighOrderRK
- Add basic convergence test to verify 10th order accuracy

The method provides a high-order explicit solver option for problems
requiring very high accuracy.

Fixes #2694

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
@github-actions
Copy link
Contributor

github-actions bot commented Jul 22, 2025

Benchmark Results (Julia v1)

Time benchmarks
master 27b9be8... master / 27b9be8...
construction/linear_N50 28.1 ± 6.2 μs 28.5 ± 14 μs 0.986 ± 0.52
construction/lotka_volterra 18.9 ± 0.24 μs 19.1 ± 0.3 μs 0.992 ± 0.02
construction/rober 19.2 ± 0.37 μs 19.1 ± 0.24 μs 1 ± 0.023
nonstiff/fitzhugh_nagumo/BS3 0.145 ± 0.0095 ms 0.144 ± 0.01 ms 1 ± 0.096
nonstiff/fitzhugh_nagumo/DP5 0.0987 ± 0.0048 ms 0.0983 ± 0.0066 ms 1 ± 0.084
nonstiff/fitzhugh_nagumo/Tsit5 0.116 ± 0.009 ms 0.119 ± 0.009 ms 0.976 ± 0.11
nonstiff/fitzhugh_nagumo/Vern6 0.17 ± 0.0084 ms 0.169 ± 0.0086 ms 1.01 ± 0.071
nonstiff/fitzhugh_nagumo/Vern7 0.114 ± 0.008 ms 0.114 ± 0.0088 ms 0.998 ± 0.1
nonstiff/lotka_volterra/BS3 0.287 ± 0.01 ms 0.291 ± 0.011 ms 0.986 ± 0.051
nonstiff/lotka_volterra/DP5 0.0467 ± 0.015 ms 0.0485 ± 0.018 ms 0.963 ± 0.46
nonstiff/lotka_volterra/Tsit5 0.0626 ± 0.022 ms 0.0625 ± 0.024 ms 1 ± 0.53
nonstiff/lotka_volterra/Vern6 0.0827 ± 0.01 ms 0.0819 ± 0.012 ms 1.01 ± 0.19
nonstiff/lotka_volterra/Vern7 0.0496 ± 0.02 ms 0.0504 ± 0.022 ms 0.983 ± 0.58
nonstiff/pleiades/BS3 0.0867 ± 0.013 s 0.0876 ± 0.019 s 0.99 ± 0.26
nonstiff/pleiades/DP5 1.25 ± 0.094 ms 1.31 ± 0.1 ms 0.957 ± 0.11
nonstiff/pleiades/Tsit5 15.7 ± 5.2 ms 15.6 ± 7.1 ms 1.01 ± 0.57
nonstiff/pleiades/Vern6 6.51 s 7.62 s 0.855
nonstiff/pleiades/Vern7 7.73 s 8 s 0.966
scaling/brusselator_2d/16x16 0.304 ± 0.027 s 0.316 ± 0.032 s 0.962 ± 0.13
scaling/brusselator_2d/32x32 7.12 s 7.34 s 0.971
scaling/brusselator_2d/8x8 11.2 ± 0.21 ms 11.4 ± 0.57 ms 0.981 ± 0.052
scaling/linear/N10 0.037 ± 0.017 ms 0.0378 ± 0.017 ms 0.978 ± 0.62
scaling/linear/N100 0.791 ± 0.018 ms 0.798 ± 0.02 ms 0.991 ± 0.034
scaling/linear/N50 0.212 ± 0.011 ms 0.216 ± 0.011 ms 0.981 ± 0.073
stiff/pollution/FBDF 0.588 ± 0.013 ms 0.599 ± 0.012 ms 0.981 ± 0.03
stiff/pollution/KenCarp4 0.549 ± 0.01 ms 0.557 ± 0.012 ms 0.986 ± 0.028
stiff/pollution/Rodas4 0.771 ± 0.015 ms 0.784 ± 0.014 ms 0.983 ± 0.026
stiff/pollution/Rosenbrock23 1.36 ± 0.029 ms 1.36 ± 0.025 ms 0.999 ± 0.028
stiff/pollution/TRBDF2 0.509 ± 0.011 ms 0.52 ± 0.013 ms 0.98 ± 0.031
stiff/rober/FBDF 0.611 ± 0.01 ms 0.602 ± 0.011 ms 1.01 ± 0.025
stiff/rober/KenCarp4 0.74 ± 0.019 ms 0.753 ± 0.021 ms 0.983 ± 0.037
stiff/rober/Rodas4 0.402 ± 0.0096 ms 0.402 ± 0.01 ms 1 ± 0.034
stiff/rober/Rosenbrock23 0.275 ± 0.0088 ms 0.273 ± 0.01 ms 1.01 ± 0.05
stiff/rober/TRBDF2 1.73 ± 0.015 ms 1.74 ± 0.015 ms 0.989 ± 0.012
stiff/van_der_pol/FBDF 9.79 ± 0.088 ms 9.85 ± 0.1 ms 0.995 ± 0.014
stiff/van_der_pol/KenCarp4 4.77 ± 0.077 ms 4.68 ± 0.068 ms 1.02 ± 0.022
stiff/van_der_pol/Rodas4 7.24 ± 0.061 ms 7.64 ± 0.046 ms 0.947 ± 0.0098
stiff/van_der_pol/Rosenbrock23 21 ± 0.19 ms 21.2 ± 0.25 ms 0.993 ± 0.015
stiff/van_der_pol/TRBDF2 2.95 ± 0.086 ms 2.93 ± 0.09 ms 1.01 ± 0.043
time_to_load 3.23 ± 0.025 s 3.26 ± 0.04 s 0.991 ± 0.014
Memory benchmarks
master 27b9be8... master / 27b9be8...
construction/linear_N50 0.071 k allocs: 0.0411 MB 0.071 k allocs: 0.0411 MB 1
construction/lotka_volterra 0.065 k allocs: 2.45 kB 0.065 k allocs: 2.45 kB 1
construction/rober 0.065 k allocs: 2.42 kB 0.065 k allocs: 2.42 kB 1
nonstiff/fitzhugh_nagumo/BS3 3.69 k allocs: 0.164 MB 3.69 k allocs: 0.164 MB 1
nonstiff/fitzhugh_nagumo/DP5 2.63 k allocs: 0.127 MB 2.63 k allocs: 0.127 MB 1
nonstiff/fitzhugh_nagumo/Tsit5 4 k allocs: 0.182 MB 4 k allocs: 0.182 MB 1
nonstiff/fitzhugh_nagumo/Vern6 4.54 k allocs: 0.207 MB 4.54 k allocs: 0.207 MB 1
nonstiff/fitzhugh_nagumo/Vern7 3.91 k allocs: 0.165 MB 3.91 k allocs: 0.165 MB 1
nonstiff/lotka_volterra/BS3 7.88 k allocs: 0.365 MB 7.88 k allocs: 0.365 MB 1
nonstiff/lotka_volterra/DP5 1.21 k allocs: 0.0543 MB 1.21 k allocs: 0.0543 MB 1
nonstiff/lotka_volterra/Tsit5 2.17 k allocs: 0.093 MB 2.17 k allocs: 0.093 MB 1
nonstiff/lotka_volterra/Vern6 2.24 k allocs: 0.0986 MB 2.24 k allocs: 0.0986 MB 1
nonstiff/lotka_volterra/Vern7 1.65 k allocs: 0.0736 MB 1.65 k allocs: 0.0736 MB 1
nonstiff/pleiades/BS3 0.685 M allocs: 0.0675 GB 0.685 M allocs: 0.0675 GB 1
nonstiff/pleiades/DP5 6.63 k allocs: 0.51 MB 6.63 k allocs: 0.51 MB 1
nonstiff/pleiades/Tsit5 0.186 M allocs: 20.4 MB 0.186 M allocs: 20.4 MB 1
nonstiff/pleiades/Vern6 0.038 G allocs: 4.05 GB 0.038 G allocs: 4.05 GB 1
nonstiff/pleiades/Vern7 0.044 G allocs: 4.63 GB 0.044 G allocs: 4.63 GB 1
scaling/brusselator_2d/16x16 3.58 k allocs: 0.152 GB 3.58 k allocs: 0.152 GB 1
scaling/brusselator_2d/32x32 3.4 k allocs: 2.22 GB 3.4 k allocs: 2.22 GB 1
scaling/brusselator_2d/8x8 2.62 k allocs: 8.76 MB 2.62 k allocs: 8.76 MB 1
scaling/linear/N10 0.752 k allocs: 0.0514 MB 0.752 k allocs: 0.0514 MB 1
scaling/linear/N100 2.27 k allocs: 0.901 MB 2.27 k allocs: 0.901 MB 1
scaling/linear/N50 1.66 k allocs: 0.348 MB 1.66 k allocs: 0.348 MB 1
stiff/pollution/FBDF 1.5 k allocs: 0.288 MB 1.5 k allocs: 0.288 MB 1
stiff/pollution/KenCarp4 0.516 k allocs: 0.134 MB 0.516 k allocs: 0.134 MB 1
stiff/pollution/Rodas4 1.28 k allocs: 0.363 MB 1.28 k allocs: 0.363 MB 1
stiff/pollution/Rosenbrock23 2.77 k allocs: 0.819 MB 2.77 k allocs: 0.819 MB 1
stiff/pollution/TRBDF2 0.783 k allocs: 0.168 MB 0.783 k allocs: 0.168 MB 1
stiff/rober/FBDF 2.89 k allocs: 0.137 MB 2.89 k allocs: 0.137 MB 1
stiff/rober/KenCarp4 1.3 k allocs: 0.0575 MB 1.3 k allocs: 0.0575 MB 1
stiff/rober/Rodas4 2.19 k allocs: 0.106 MB 2.19 k allocs: 0.106 MB 1
stiff/rober/Rosenbrock23 2.51 k allocs: 0.117 MB 2.51 k allocs: 0.117 MB 1
stiff/rober/TRBDF2 7.72 k allocs: 0.36 MB 7.72 k allocs: 0.36 MB 1
stiff/van_der_pol/FBDF 0.0444 M allocs: 2.2 MB 0.0444 M allocs: 2.2 MB 1
stiff/van_der_pol/KenCarp4 4.27 k allocs: 0.184 MB 4.27 k allocs: 0.184 MB 1
stiff/van_der_pol/Rodas4 0.0377 M allocs: 1.86 MB 0.0377 M allocs: 1.86 MB 1
stiff/van_der_pol/Rosenbrock23 0.213 M allocs: 9.09 MB 0.213 M allocs: 9.09 MB 1
stiff/van_der_pol/TRBDF2 5.02 k allocs: 0.212 MB 5.02 k allocs: 0.212 MB 1
time_to_load 0.159 k allocs: 11.2 kB 0.159 k allocs: 11.2 kB 1

The FW15Stage10 method does not have embedded error estimation coefficients
(btilde) implemented, so it cannot run in adaptive mode. By explicitly setting
adaptive=false in the convergence test, we ensure the test runs in fixed
timestep mode where error estimation is not required.

This resolves the CI failure with "KeyError: key :l∞ not found" that was
occurring because the convergence test was trying to access error estimates
that weren't being calculated.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>
@ChrisRackauckas ChrisRackauckas deleted the add-fw15stage10-rk-method branch July 24, 2025 11:07
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.

explicit 15-stage Runge-Kutta methods of order 10

2 participants