Skip to content

Commit d0284e7

Browse files
Merge pull request #2753 from SciML/hr/fix_stats_stabilized_rk
fix stats of stabilized RK methods
2 parents 185d91f + a0eae4b commit d0284e7

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

lib/OrdinaryDiffEqStabilizedRK/src/rkc_perform_step.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ end
3535
μ, κ = recf[cache.start + (i - 2) * 2 + 1], recf[cache.start + (i - 2) * 2 + 2]
3636
ν = -1 - κ
3737
u = f(uᵢ₋₁, p, tᵢ₋₁)
38+
OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1)
3839
tᵢ₋₁ = dt * μ - ν * tᵢ₋₂ - κ * tᵢ₋₃
3940
u = (dt * μ) * u - ν * uᵢ₋₁ - κ * uᵢ₋₂
4041
i < cache.mdeg && (uᵢ₋₂ = uᵢ₋₁;
@@ -110,6 +111,7 @@ end
110111
μ, κ = recf[ccache.start + (i - 2) * 2 + 1], recf[ccache.start + (i - 2) * 2 + 2]
111112
ν = -1 - κ
112113
f(k, uᵢ₋₁, p, tᵢ₋₁)
114+
OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1)
113115
tᵢ₋₁ = dt * μ - ν * tᵢ₋₂ - κ * tᵢ₋₃
114116
@.. broadcast=false u=(dt * μ) * k - ν * uᵢ₋₁ - κ * uᵢ₋₂
115117
if i < ccache.mdeg
@@ -192,6 +194,7 @@ end
192194
μ, κ = recf[cache.start + (i - 2) * 2 + 1], recf[cache.start + (i - 2) * 2 + 2]
193195
ν = -1 - κ
194196
u = f(uᵢ₋₁, p, tᵢ₋₁)
197+
OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1)
195198
tᵢ₋₁ = dt * μ - ν * tᵢ₋₂ - κ * tᵢ₋₃
196199
u = (dt * μ) * u - ν * uᵢ₋₁ - κ * uᵢ₋₂
197200
i < cache.mdeg && (uᵢ₋₂ = uᵢ₋₁;
@@ -314,6 +317,7 @@ end
314317
μ, κ = recf[ccache.start + (i - 2) * 2 + 1], recf[ccache.start + (i - 2) * 2 + 2]
315318
ν = -1 - κ
316319
f(k, uᵢ₋₁, p, tᵢ₋₁)
320+
OrdinaryDiffEqCore.increment_nf!(integrator.stats, 1)
317321
tᵢ₋₁ = (dt * μ) - ν * tᵢ₋₂ - κ * tᵢ₋₃
318322
@.. broadcast=false u=(dt * μ) * k - ν * uᵢ₋₁ - κ * uᵢ₋₂
319323
if i < ccache.mdeg

lib/OrdinaryDiffEqStabilizedRK/test/rkc_tests.jl

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,33 @@ end
7272
@test sim.𝒪est[:l∞]5 atol=testTol
7373
end
7474
end
75+
76+
@testset "Number of function evaluations" begin
77+
x = Ref(0)
78+
u0 = [1.0, 1.0]
79+
tspan = (0.0, 1.0)
80+
probop = ODEProblem(u0, tspan) do u, p, t
81+
x[] += 1
82+
return -500 * u
83+
end
84+
probip = ODEProblem(u0, tspan) do du, u, p, t
85+
x[] += 1
86+
@. du = -500 * u
87+
return nothing
88+
end
89+
90+
@testset "$prob" for prob in [probop, probip]
91+
eigen_est = (integrator) -> integrator.eigen_est = 500
92+
algs = [ROCK2(), ROCK2(eigen_est = eigen_est),
93+
ROCK4(), ROCK4(eigen_est = eigen_est),
94+
RKC(), RKC(eigen_est = eigen_est),
95+
SERK2(), SERK2(eigen_est = eigen_est),
96+
ESERK4(), ESERK4(eigen_est = eigen_est),
97+
ESERK5(), ESERK5(eigen_est = eigen_est)]
98+
@testset "$alg" for alg in algs
99+
x[] = 0
100+
sol = solve(prob, alg)
101+
@test x[] == sol.stats.nf
102+
end
103+
end
104+
end

0 commit comments

Comments
 (0)