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