1+ ---
2+ title: Nelson Work-Precision Diagrams
3+ author: Stella Offner and Chris Rackauckas
4+ ---
5+
6+ ```julia
7+ using OrdinaryDiffEq
8+ using Plots
9+ using Sundials
10+ using ODEInterface, ODEInterfaceDiffEq
11+ ```
12+
13+ ```julia
14+ T = 10
15+ Av = 2 # This is what depotic uses for visual extinction
16+ Go = 1.7 # I think despotic uses 1.7
17+ n_H = 611
18+ shield = 1
19+
20+ function Nelson_ODE(du,u,p,t)
21+ # 1: H2
22+ #= du[1] = -1.2e-17 * u[1] +
23+ n_H * (1.9e-6 * u[2] * u[3]) / (T^0.54) -
24+ n_H * 4e-16 * u[1] * u[12] -
25+ n_H * 7e-15 * u[1] * u[5] +
26+ n_H * 1.7e-9 * u[10] * u[2] +
27+ n_H * 2e-9 * u[2] * u[6] +
28+ n_H * 2e-9 * u[2] * u[14] +
29+ n_H * 8e-10 * u[2] * u[8] =#
30+ du[1] = 0
31+
32+ # 2: H3+
33+ du[2] = 1.2e-17 * u[1] +
34+ n_H * (-1.9e-6 * u[3] * u[2]) / (T^0.54) -
35+ n_H * 1.7e-9 * u[10] * u[2] -
36+ n_H * 2e-9 * u[2] * u[6] -
37+ n_H * 2e-9 * u[2] * u[14] -
38+ n_H * 8e-10 * u[2] * u[8]
39+
40+ # 3: e
41+ du[3] = n_H * (-1.4e-10 * u[3] * u[12]) / (T^0.61) -
42+ n_H * (3.8e-10 * u[13] * u[3]) / (T^0.65) -
43+ n_H * (3.3e-5 * u[11] * u[3]) / T +
44+ 1.2e-17 * u[1] -
45+ n_H * (1.9e-6 * u[3] * u[2]) / (T^0.54) +
46+ 6.8e-18 * u[4] -
47+ n_H * (9e-11 * u[3] * u[5]) / (T^0.64) +
48+ 3e-10 * Go * exp(-3 * Av) * u[6] +
49+ n_H * 2e-9 * u[2] * u[13] ## CHECK I added this extra term from a CR ionization reaction
50+ + 2.0e-10 * Go * exp(-1.9 * Av) * u[14] # this term was added as part of the skipped photoreaction
51+
52+
53+ # 4: He
54+ du[4] = n_H * (9e-11 * u[3] * u[5]) / (T^0.64) -
55+ 6.8e-18 * u[4] +
56+ n_H * 7e-15 * u[1] * u[5] +
57+ n_H * 1.6e-9 * u[10] * u[5]
58+ #du[4] = 0
59+
60+ # 5: He+ 6.8e-18 or 1.1
61+ du[5] = 6.8e-18 * u[4] -
62+ n_H * (9e-11 * u[3] * u[5]) / (T^0.64) -
63+ n_H * 7e-15 * u[1] * u[5] -
64+ n_H * 1.6e-9 * u[10] * u[5]
65+ #u[5] = 0
66+
67+ # 6: C
68+ du[6] = n_H * (1.4e-10 * u[3] * u[12]) / (T^0.61) -
69+ n_H * 2e-9 * u[2] * u[6] -
70+ n_H * 5.8e-12 * (T^0.5) * u[9] * u[6] +
71+ 1e-9 * Go * exp(-1.5 * Av) * u[7] -
72+ 3e-10 * Go * exp(-3 * Av) * u[6] +
73+ 1e-10 * Go * exp(-3 * Av) * u[10] * shield
74+
75+ # 7: CHx
76+ du[7] = n_H * (-2e-10) * u[7] * u[8] +
77+ n_H * 4e-16 * u[1] * u[12] +
78+ n_H * 2e-9 * u[2] * u[6] -
79+ 1e-9 * Go * u[7] * exp(-1.5 * Av)
80+
81+ # 8: O
82+ du[8] = n_H * (-2e-10) * u[7] * u[8] +
83+ n_H * 1.6e-9 * u[10] * u[5] -
84+ n_H * 8e-10 * u[2] * u[8] +
85+ 5e-10 * Go * exp(-1.7 * Av) * u[9] +
86+ 1e-10 * Go * exp(-3 * Av) * u[10] * shield
87+
88+ # 9: OHx
89+ du[9] = n_H * (-1e-9) * u[9] * u[12] +
90+ n_H * 8e-10 * u[2] * u[8] -
91+ n_H * 5.8e-12 * (T^0.5) * u[9] * u[6] -
92+ 5e-10 * Go * exp(-1.7 * Av) * u[9]
93+
94+ # 10: CO
95+ du[10] = n_H * (3.3e-5 * u[11] * u[3]) / T +
96+ n_H * 2e-10 * u[7] * u[8] -
97+ n_H * 1.7e-9 * u[10] * u[2] -
98+ n_H * 1.6e-9 * u[10] * u[5] +
99+ n_H * 5.8e-12 * (T^0.5) * u[9] * u[6] -
100+ 1e-10 * Go * exp(-3 * Av) * u[10] +
101+ 1.5e-10 * Go * exp(-2.5 * Av) * u[11] * shield
102+
103+ # 11: HCO+
104+ du[11] = n_H * (-3.3e-5 * u[11] * u[3]) / T +
105+ n_H * 1e-9 * u[9] * u[12] +
106+ n_H * 1.7e-9 * u[10] * u[2] -
107+ 1.5e-10 * Go * exp(-2.5 * Av) * u[11]
108+
109+ # 12: C+
110+ du[12] = n_H * (-1.4e-10 * u[3] * u[12]) / (T^0.61) -
111+ n_H * 4e-16 * u[1] * u[12] -
112+ n_H * 1e-9 * u[9] * u[12] +
113+ n_H * 1.6e-9 * u[10] * u[5] +
114+ 3e-10 * Go * exp(-3 * Av) * u[6]
115+
116+ # 13: M+
117+ du[13] = n_H * (-3.8e-10 * u[13] * u[3]) / (T^0.65) +
118+ n_H * 2e-9 * u[2] * u[14]
119+ + 2.0e-10 * Go * exp(-1.9 * Av) * u[14] # this term was added as part of the skipped photoreaction
120+
121+ # 14: M
122+ du[14] = n_H * (3.8e-10 * u[13] * u[3]) / (T^0.65) -
123+ n_H * 2e-9 * u[2] * u[14]
124+ - 2.0e-10 * Go * exp(-1.9 * Av) * u[14] # this term was added as part of the skipped photoreaction
125+
126+ end
127+
128+
129+ u0 = [0.5 ; # 1: H2 yep?
130+ 9.059e-9 ; # 2: H3+ yep
131+ 2.0e-4 ; # 3: e yep
132+ 0.1 ; # 4: He SEE lines 535 NL99
133+ 7.866e-7 ; # 5: He+ yep? should be 2.622e-5
134+ 0.0 ; # 6: C yep
135+ 0.0 ; # 7: CHx yep
136+ 0.0004 ; # 8: O yep
137+ 0.0 ; # 9: OHx yep
138+ 0.0 ; # 10: CO yep
139+ 0.0 ; # 11: HCO+ yep
140+ 0.0002 ; # 12: C+ yep
141+ 2.0e-7 ; # 13: M+ yep
142+ 2.0e-7 ] # 14: M yep
143+
144+
145+ tspan = (0.0, 30 * 3.16e10) # ~30 thousand yrs
146+
147+ prob = ODEProblem(Nelson_ODE, u0, tspan)
148+ refsol = solve(prob, Vern9(), abstol=1e-14, reltol=1e-14)
149+
150+ using Plots
151+ plot(sol; yscale=:log10, idxs = (0,5))
152+ ```
153+
154+ ## Run Benchmark
155+
156+ ```julia
157+ abstols = 1.0 ./ 10.0 .^ (8:10)
158+ reltols = 1.0 ./ 10.0 .^ (8:10)
159+
160+ sol = solve(prob, DP8(), abstol=1e-8, reltol=1e-8)
161+
162+
163+ setups = [Dict(:alg=>DP8())
164+ Dict(:alg=>Vern7())
165+ Dict(:alg=>CVODE_Adams())
166+ Dict(:alg=>ARKODE(Sundials.Explicit(),order=6))
167+ Dict(:alg=>lsoda())
168+ Dict(:alg=>odex())
169+ Dict(:alg=>ddeabm())
170+ ]
171+ wp = WorkPrecisionSet(prob,abstols,reltols,setups;appxsol=refsol,save_everystep=false, print_names = true)
172+ plot(wp)
173+ ```
0 commit comments