Skip to content

Commit 6f7d62b

Browse files
Harsh SinghHarsh Singh
authored andcommitted
Restore Shampine Rosenbrock23/32 stiff interpolation
Replace H=zeros(T,0,3) (Hermite fallback) with the 1x3 dense coefficient matrix H=[0, -1/(gamma*(1-2*gamma)), 0] for both Rosenbrock23 and Rosenbrock32, yielding interp_order=1 and one dense stage vector. Add interp_order==1 branches to all eight _ode_interpolant/_ode_interpolant! overloads (Val{0}/Val{1}, idxs::Nothing/idxs, returning/mutating), which implement p(Theta)=(1-Theta)*y0+Theta*y1+Theta*(1-Theta)*K[1] and its first derivative. This algebraically recovers the original MATLAB ODE Suite Shampine 'free' 2nd-order stiff-aware dense output. Fixes regression noticed by ChrisRackauckas in SciML#3273.
1 parent 7f6a1e8 commit 6f7d62b

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

lib/OrdinaryDiffEqRosenbrock/src/rosenbrock_interpolants.jl

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ end
4040
# Generic Hermite: k[1]=f₀, k[2]=f₁ (methods with no H matrix)
4141
@.. Θ1 * y₀ + Θ * y₁ +
4242
Θ *- 1) * ((1 - 2Θ) * (y₁ - y₀) +- 1) * dt * k[1] + Θ * dt * k[2])
43+
elseif hasproperty(cache, :interp_order) && cache.interp_order == 1
44+
# Shampine Rosenbrock23/32: p(Θ) = (1-Θ)y₀ + Θy₁ + Θ(1-Θ)K[1]
45+
@.. Θ1 * y₀ + Θ * (y₁ + Θ1 * k[1])
4346
elseif !hasproperty(cache, :interp_order) || cache.interp_order == 2
4447
@.. Θ1 * y₀ + Θ * (y₁ + Θ1 * (k[1] + Θ * k[2]))
4548
elseif cache.interp_order == 4
@@ -62,6 +65,8 @@ end
6265
if hasproperty(cache, :interp_order) && cache.interp_order == -1
6366
@views @.. Θ1 * y₀[idxs] + Θ * y₁[idxs] +
6467
Θ *- 1) * ((1 - 2Θ) * (y₁[idxs] - y₀[idxs]) +- 1) * dt * k[1][idxs] + Θ * dt * k[2][idxs])
68+
elseif hasproperty(cache, :interp_order) && cache.interp_order == 1
69+
@views @.. Θ1 * y₀[idxs] + Θ * (y₁[idxs] + Θ1 * k[1][idxs])
6570
elseif !hasproperty(cache, :interp_order) || cache.interp_order == 2
6671
@views @.. Θ1 * y₀[idxs] + Θ * (y₁[idxs] + Θ1 * (k[1][idxs] + Θ * k[2][idxs]))
6772
elseif cache.interp_order == 4
@@ -90,6 +95,8 @@ end
9095
if hasproperty(cache, :interp_order) && cache.interp_order == -1
9196
@.. out = Θ1 * y₀ + Θ * y₁ +
9297
Θ *- 1) * ((1 - 2Θ) * (y₁ - y₀) +- 1) * dt * k[1] + Θ * dt * k[2])
98+
elseif hasproperty(cache, :interp_order) && cache.interp_order == 1
99+
@.. out = Θ1 * y₀ + Θ * (y₁ + Θ1 * k[1])
93100
elseif !hasproperty(cache, :interp_order) || cache.interp_order == 2
94101
@.. out = Θ1 * y₀ + Θ * (y₁ + Θ1 * (k[1] + Θ * k[2]))
95102
elseif cache.interp_order == 4
@@ -113,6 +120,8 @@ end
113120
if hasproperty(cache, :interp_order) && cache.interp_order == -1
114121
@views @.. out = Θ1 * y₀[idxs] + Θ * y₁[idxs] +
115122
Θ *- 1) * ((1 - 2Θ) * (y₁[idxs] - y₀[idxs]) +- 1) * dt * k[1][idxs] + Θ * dt * k[2][idxs])
123+
elseif hasproperty(cache, :interp_order) && cache.interp_order == 1
124+
@views @.. out = Θ1 * y₀[idxs] + Θ * (y₁[idxs] + Θ1 * k[1][idxs])
116125
elseif !hasproperty(cache, :interp_order) || cache.interp_order == 2
117126
@views @.. out = Θ1 * y₀[idxs] + Θ * (y₁[idxs] + Θ1 * (k[1][idxs] + Θ * k[2][idxs]))
118127
elseif cache.interp_order == 4
@@ -151,6 +160,9 @@ end
151160
@.. 6 * Θ * (1 - Θ) * (y₁ - y₀) / dt +
152161
k[1] * (3 * Θ^2 - 4 * Θ + 1) +
153162
k[2] * (3 * Θ^2 - 2 * Θ)
163+
elseif hasproperty(cache, :interp_order) && cache.interp_order == 1
164+
# Shampine Rosenbrock23/32: dp/dt = (y₁-y₀ + (1-2Θ)K[1]) / dt
165+
@.. ((1 - 2 * Θ) * k[1] - y₀ + y₁) / dt
154166
elseif !hasproperty(cache, :interp_order) || cache.interp_order == 2
155167
@.. (k[1] + Θ * (-2 * k[1] + 2 * k[2] - 3 * k[2] * Θ) - y₀ + y₁) / dt
156168
elseif cache.interp_order == 4
@@ -188,6 +200,8 @@ end
188200
@views @.. 6 * Θ * (1 - Θ) * (y₁[idxs] - y₀[idxs]) / dt +
189201
k[1][idxs] * (3 * Θ^2 - 4 * Θ + 1) +
190202
k[2][idxs] * (3 * Θ^2 - 2 * Θ)
203+
elseif hasproperty(cache, :interp_order) && cache.interp_order == 1
204+
@views @.. ((1 - 2 * Θ) * k[1][idxs] - y₀[idxs] + y₁[idxs]) / dt
191205
elseif !hasproperty(cache, :interp_order) || cache.interp_order == 2
192206
@views @.. (
193207
k[1][idxs] +
@@ -231,6 +245,8 @@ end
231245
@.. out = 6 * Θ * (1 - Θ) * (y₁ - y₀) / dt +
232246
k[1] * (3 * Θ^2 - 4 * Θ + 1) +
233247
k[2] * (3 * Θ^2 - 2 * Θ)
248+
elseif hasproperty(cache, :interp_order) && cache.interp_order == 1
249+
@.. out = ((1 - 2 * Θ) * k[1] - y₀ + y₁) / dt
234250
elseif !hasproperty(cache, :interp_order) || cache.interp_order == 2
235251
@.. out = (k[1] + Θ * (-2 * k[1] + 2 * k[2] - 3 * k[2] * Θ) - y₀ + y₁) / dt
236252
elseif cache.interp_order == 4
@@ -270,6 +286,8 @@ end
270286
@views @.. out = 6 * Θ * (1 - Θ) * (y₁[idxs] - y₀[idxs]) / dt +
271287
k[1][idxs] * (3 * Θ^2 - 4 * Θ + 1) +
272288
k[2][idxs] * (3 * Θ^2 - 2 * Θ)
289+
elseif hasproperty(cache, :interp_order) && cache.interp_order == 1
290+
@views @.. out = ((1 - 2 * Θ) * k[1][idxs] - y₀[idxs] + y₁[idxs]) / dt
273291
elseif !hasproperty(cache, :interp_order) || cache.interp_order == 2
274292
@views @.. out = (
275293
k[1][idxs] +

lib/OrdinaryDiffEqRosenbrock/src/rosenbrock_tableaus.jl

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,11 @@ function Rosenbrock23RodasTableau(T, T2)
3838
convert(T, igamma / 6),
3939
]
4040

41-
H = zeros(T, 0, 3)
41+
# Shampine 2nd-order "free" stiff interpolation (Rodas-encoded).
42+
# K[1] = H[1,2]*ks[2] = -ks[2]/(γ(1-2γ)); combined with interp_order=1 formula
43+
# p(Θ) = (1-Θ)y₀ + Θy₁ + Θ(1-Θ)K[1] this exactly recovers the MATLAB ODE Suite
44+
# dense output c1*k̃₁ + c2*k̃₂ with c1=Θ(1-Θ)/(1-2γ), c2=Θ(Θ-2γ)/(1-2γ).
45+
H = T[zero(T) convert(T, -1 / (gamma * (1 - 2 * gamma))) zero(T)]
4246

4347
return RodasTableau(A, C, gamma, c, d, H, b, btilde)
4448
end
@@ -75,7 +79,8 @@ function Rosenbrock32RodasTableau(T, T2)
7579
convert(T, igamma / 6),
7680
]
7781

78-
H = zeros(T, 0, 3)
82+
# Same Shampine interpolation as Rosenbrock23 (identical γ, same stencil)
83+
H = T[zero(T) convert(T, -1 / (gamma * (1 - 2 * gamma))) zero(T)]
7984

8085
return RodasTableau(A, C, gamma, c, d, H, b, btilde)
8186
end

0 commit comments

Comments
 (0)