Skip to content

Commit 8546819

Browse files
Merge pull request #1282 from SciML/stiff_ode
Add new stiff ODE benchmark problems
2 parents 7daed1a + e95f09e commit 8546819

File tree

2 files changed

+589
-514
lines changed

2 files changed

+589
-514
lines changed

benchmarks/StiffODE/E5.jmd

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
---
2+
title: E5 Work-Precision Diagrams
3+
author: Chris Rackauckas
4+
---
5+
6+
```julia
7+
using OrdinaryDiffEq, DiffEqDevTools, Sundials, Plots, ODEInterfaceDiffEq, LSODA
8+
using LinearAlgebra, StaticArrays, RecursiveFactorization
9+
using OrdinaryDiffEqFIRK
10+
gr()
11+
12+
# E5 Problem from Stiff Test Set
13+
# Exact implementation based on the Fortran feval subroutine
14+
# 4-dimensional stiff ODE system with widely separated rate constants
15+
16+
function e5!(du, u, p, t)
17+
# E5 problem - exact translation from Fortran feval subroutine:
18+
# prod1=7.89D-10*y(1)
19+
# prod2=1.1D7*y(1)*y(3)
20+
# prod3=1.13D9*y(2)*y(3)
21+
# prod4=1.13D3*y(4)
22+
# f(1)=-prod1-prod2
23+
# f(2)=prod1-prod3
24+
# f(4)=prod2-prod4
25+
# f(3)=f(2)-f(4)
26+
27+
prod1 = 7.89e-10 * u[1]
28+
prod2 = 1.1e7 * u[1] * u[3]
29+
prod3 = 1.13e9 * u[2] * u[3]
30+
prod4 = 1.13e3 * u[4]
31+
32+
du[1] = -prod1 - prod2 # f(1)
33+
du[2] = prod1 - prod3 # f(2)
34+
du[4] = prod2 - prod4 # f(4)
35+
du[3] = du[2] - du[4] # f(3) = f(2) - f(4)
36+
end
37+
38+
function e5(u, p, t)
39+
# E5 problem - exact translation from Fortran feval subroutine:
40+
# prod1=7.89D-10*y(1)
41+
# prod2=1.1D7*y(1)*y(3)
42+
# prod3=1.13D9*y(2)*y(3)
43+
# prod4=1.13D3*y(4)
44+
# f(1)=-prod1-prod2
45+
# f(2)=prod1-prod3
46+
# f(4)=prod2-prod4
47+
# f(3)=f(2)-f(4)
48+
49+
prod1 = 7.89e-10 * u[1]
50+
prod2 = 1.1e7 * u[1] * u[3]
51+
prod3 = 1.13e9 * u[2] * u[3]
52+
prod4 = 1.13e3 * u[4]
53+
54+
du1 = -prod1 - prod2 # f(1)
55+
du2 = prod1 - prod3 # f(2)
56+
du4 = prod2 - prod4 # f(4)
57+
du3 = du2 - du4 # f(3) = f(2) - f(4)
58+
SA[du1,du2,du3,du4]
59+
end
60+
61+
# Initial conditions - system starts with all mass in species A
62+
u0 = [1.76e-3, 0.0, 0.0, 0.0]
63+
64+
# Time span - long enough to see both fast and slow time scales
65+
tspan = (0.0, 1e10)
66+
67+
prob = ODEProblem{true, SciMLBase.FullSpecialize}(e5!, u0, tspan)
68+
probstatic = ODEProblem{false}(e5, SVector{4}(u0), tspan)
69+
probbig = ODEProblem{true, SciMLBase.FullSpecialize}(e5!, big.(u0), big.(tspan))
70+
71+
# Generate reference solution
72+
sol = solve(probbig, Rodas5P(), abstol=1/10^60, reltol=1/10^30)
73+
probs = [prob, probstatic]
74+
test_sol = [sol, sol]
75+
76+
abstols = [1.7e-28 for i in 1:2]
77+
reltols = 10.0 .^ -(6 .+ (1:2)./4)
78+
```
79+
80+
```julia
81+
ylabels = 10.0 .^ (-30:2:0)
82+
plot(sol, xscale=:log10, yscale=:log10, tspan = (1e-5, 1e10), labels=["A" "B" "C" "D"], yticks = ylabels)
83+
```
84+
85+
## Benchmarks
86+
87+
```julia
88+
setups = [Dict(:alg=>Rosenbrock23()),
89+
Dict(:alg=>Rosenbrock23(), :prob_choice => 2),
90+
Dict(:alg=>lsoda()),
91+
Dict(:alg=>Rodas5P()),
92+
Dict(:alg=>Rodas5P(), :prob_choice => 2),
93+
Dict(:alg=>FBDF()),
94+
Dict(:alg=>QNDF()),
95+
Dict(:alg=>TRBDF2()),
96+
Dict(:alg=>CVODE_BDF()),
97+
#Dict(:alg=>rodas()),
98+
#Dict(:alg=>radau()),
99+
Dict(:alg=>RadauIIA5()),
100+
Dict(:alg=>ROS34PW1a()),
101+
102+
]
103+
wp = WorkPrecisionSet(probs,abstols,reltols,setups; error_estimate = :l2, verbose=false, dense=false,
104+
save_everystep=false,appxsol=test_sol,maxiters=Int(1e5),numruns=10)
105+
plot(wp)
106+
```
107+
108+
```julia
109+
setups = [Dict(:alg=>FBDF()),
110+
Dict(:alg=>QNDF()),
111+
Dict(:alg=>CVODE_BDF()),
112+
Dict(:alg=>lsoda()),
113+
Dict(:alg=>ddebdf()),
114+
Dict(:alg=>Rodas5P()),
115+
Dict(:alg=>Rodas5P(), :prob_choice => 2),
116+
Dict(:alg=>rodas()),
117+
Dict(:alg=>radau()),
118+
Dict(:alg=>RadauIIA5()),
119+
]
120+
wp = WorkPrecisionSet(probs,abstols,reltols,setups; verbose=false, dense=false,
121+
save_everystep=false,appxsol=test_sol,maxiters=Int(1e5),numruns=10)
122+
plot(wp)
123+
```
124+
125+
```julia
126+
setups = [Dict(:alg=>Kvaerno4()),
127+
Dict(:alg=>Kvaerno5()),
128+
Dict(:alg=>CVODE_BDF()),
129+
Dict(:alg=>KenCarp4()),
130+
Dict(:alg=>KenCarp47()),
131+
Dict(:alg=>KenCarp47(), :prob_choice => 2),
132+
Dict(:alg=>KenCarp5()),
133+
Dict(:alg=>lsoda()),
134+
Dict(:alg=>Rodas5P()),
135+
Dict(:alg=>Rodas5P(), :prob_choice => 2),
136+
Dict(:alg=>ImplicitEulerExtrapolation(min_order = 4, init_order = 11,threading = OrdinaryDiffEq.PolyesterThreads())),
137+
Dict(:alg=>ImplicitEulerExtrapolation(min_order = 4, init_order = 11,threading = false)),
138+
Dict(:alg=>ImplicitEulerBarycentricExtrapolation(min_order = 4, init_order = 11, threading = OrdinaryDiffEq.PolyesterThreads())),
139+
Dict(:alg=>ImplicitEulerBarycentricExtrapolation(min_order = 4, init_order = 11, threading = false)),
140+
Dict(:alg=>ImplicitHairerWannerExtrapolation(min_order = 3, init_order = 111,threading = OrdinaryDiffEq.PolyesterThreads())),
141+
Dict(:alg=>ImplicitHairerWannerExtrapolation(min_order = 3, init_order = 11,threading = false)),
142+
]
143+
wp = WorkPrecisionSet(probs,abstols,reltols,setups; verbose=false, dense=false,
144+
save_everystep=false,appxsol=test_sol,maxiters=Int(1e5),numruns=10)
145+
plot(wp)
146+
```
147+
148+
```julia, echo = false
149+
using SciMLBenchmarks
150+
SciMLBenchmarks.bench_footer(WEAVE_ARGS[:folder],WEAVE_ARGS[:file])
151+
```

0 commit comments

Comments
 (0)