Skip to content

Commit 9f6af12

Browse files
fixes
1 parent fc8aca3 commit 9f6af12

File tree

4 files changed

+32
-13
lines changed

4 files changed

+32
-13
lines changed

lib/OrdinaryDiffEqFIRK/src/firk_addsteps.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -413,8 +413,8 @@ if integrator.EEst <= oneunit(integrator.EEst)
413413
if alg.extrapolant != :constant
414414
integrator.k[3] = (z2 - z3)/c2m1
415415
tmp = @.. (z1 - z2)/c1mc2
416-
integrator.k[4] = (tmp - cache.cont1)/c1m1
417-
integrator.k[5] = cache.cont2-(tmp - z1 / c1) / c2
416+
integrator.k[4] = (tmp - integrator.k[3])/c1m1
417+
integrator.k[5] = integrator.k[4]-(tmp - z1 / c1) / c2
418418
end
419419
end
420420

lib/OrdinaryDiffEqFIRK/src/firk_interpolants.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ FIRK_WITH_INTERPOLATIONS = Union{RadauIIA3ConstantCache, RadauIIA3Cache, RadauII
77
@unpack cont1, cont2 = cache
88
@unpack c1 = cache.tab
99
c1m1 = c1 - 1
10+
Θdt = 1 - Θ
1011
@.. y₁ - Θdt * (k[3] - (Θdt + c1m1) * k[4])
1112
end
1213

lib/OrdinaryDiffEqFIRK/src/firk_perform_step.jl

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ function initialize!(integrator, cache::RadauIIA3Cache)
6363
end
6464

6565
function initialize!(integrator, cache::RadauIIA5ConstantCache)
66-
integrator.kshortsize = 2
66+
integrator.kshortsize = 5
6767
integrator.k = typeof(integrator.k)(undef, integrator.kshortsize)
6868
integrator.fsalfirst = integrator.f(integrator.uprev, integrator.p, integrator.t) # Pre-start fsal
6969
OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1)
@@ -72,8 +72,9 @@ function initialize!(integrator, cache::RadauIIA5ConstantCache)
7272
integrator.fsallast = zero(integrator.fsalfirst)
7373
integrator.k[1] = integrator.fsalfirst
7474
integrator.k[2] = integrator.fsallast
75-
integrator.f(integrator.fsalfirst, integrator.uprev, integrator.p, integrator.t)
76-
OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1)
75+
integrator.k[3] = zero(integrator.fsalfirst)
76+
integrator.k[4] = zero(integrator.fsalfirst)
77+
integrator.k[5] = zero(integrator.fsalfirst)
7778
nothing
7879
end
7980

@@ -110,8 +111,11 @@ function initialize!(integrator, cache::RadauIIA9ConstantCache)
110111
integrator.fsallast = zero(integrator.fsalfirst)
111112
integrator.k[1] = integrator.fsalfirst
112113
integrator.k[2] = integrator.fsallast
113-
integrator.f(integrator.fsalfirst, integrator.uprev, integrator.p, integrator.t)
114-
OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1)
114+
integrator.k[3] = zero(integrator.fsalfirst)
115+
integrator.k[4] = zero(integrator.fsalfirst)
116+
integrator.k[5] = zero(integrator.fsalfirst)
117+
integrator.k[6] = zero(integrator.fsalfirst)
118+
integrator.k[7] = zero(integrator.fsalfirst)
115119
nothing
116120
end
117121

@@ -140,6 +144,23 @@ function initialize!(integrator, cache::RadauIIA9Cache)
140144
nothing
141145
end
142146

147+
function initialize!(integrator, cache::AdaptiveRadauConstantCache)
148+
max_stages = (integrator.alg.max_order - 1) ÷ 4 * 2 + 1
149+
integrator.kshortsize = max_stages + 2
150+
integrator.k = typeof(integrator.k)(undef, integrator.kshortsize)
151+
integrator.fsalfirst = integrator.f(integrator.uprev, integrator.p, integrator.t) # Pre-start fsal
152+
OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1)
153+
154+
# Avoid undefined entries if k is an array of arrays
155+
integrator.fsallast = zero(integrator.fsalfirst)
156+
integrator.k[1] = integrator.fsalfirst
157+
integrator.k[2] = integrator.fsallast
158+
for i in 3 : max_stages + 2
159+
integrator.k[i] = zero(integrator.fsallast)
160+
end
161+
nothing
162+
end
163+
143164
function initialize!(integrator, cache::AdaptiveRadauCache)
144165
max_stages = (integrator.alg.max_order - 1) ÷ 4 * 2 + 1
145166
integrator.kshortsize = max_stages + 2
@@ -616,8 +637,8 @@ end
616637
if alg.extrapolant != :constant
617638
integrator.k[3] = (z2 - z3)/c2m1
618639
tmp = @.. (z1 - z2)/c1mc2
619-
integrator.k[4] = (tmp - cache.cont1)/c1m1
620-
integrator.k[5] = cache.cont2-(tmp - z1 / c1) / c2
640+
integrator.k[4] = (tmp - integrator.k[3])/c1m1
641+
integrator.k[5] = integrator.k[4]-(tmp - z1 / c1) / c2
621642
end
622643
end
623644

lib/OrdinaryDiffEqFIRK/test/ode_firk_tests.jl

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ for prob in [prob_ode_linear, prob_ode_2Dlinear]
99
@test sim21.𝒪est[:L2]4 atol=testTol
1010
end
1111

12-
sim21 = test_convergence(1 ./ 2 .^ (2.5:-1:0.5), prob, RadauIIA9(), dense_errors = true)
12+
sim21 = test_convergence(1 ./ 2 .^ (2.5:-1:0.5), prob_ode_linear, RadauIIA9(), dense_errors = true)
1313
@test sim21.𝒪est[:final]8 atol=testTol
1414
@test sim21.𝒪est[:L2]6 atol=testTol
1515

@@ -32,9 +32,6 @@ for i in [5, 9, 13, 17, 21, 25], prob in [prob_ode_linear_big, prob_ode_2Dlinear
3232
@test sim21.𝒪est[:L2] ((i + 3) ÷ 2) atol=testTol
3333
end
3434

35-
dts = 1 ./ 2 .^ (4.25:-1:0.25)
36-
local sim21 = test_convergence(dts, prob_ode_2Dlinear_big, AdaptiveRadau(min_order = 5, max_order = 5), dense_errors = true)
37-
3835
#threaded tests
3936
using OrdinaryDiffEqCore
4037
for i in [5, 9, 13, 17, 21, 25], prob in [prob_ode_linear_big, prob_ode_2Dlinear_big]

0 commit comments

Comments
 (0)