From 08cc608f46878f94fb51d157df934d5ff6da133e Mon Sep 17 00:00:00 2001 From: jialinl6 Date: Tue, 27 Aug 2024 00:16:39 -0500 Subject: [PATCH] Update to MTKv9 --- docs/Project.toml | 12 +- docs/src/composing_models.md | 37 +- docs/src/geoschem/overview.md | 10 +- docs/src/geoschem/params.md | 20 +- docs/src/geoschem/states.md | 8 +- docs/src/superfast.md | 10 +- ext/EarthSciDataExt.jl | 31 +- src/Fast-JX.jl | 17 +- src/GasChem.jl | 5 +- src/SuperFast.jl | 89 ++-- src/geoschem_fullchem.jl | 616 +++++++++++++------------- src/geoschem_ratelaws.jl | 104 ++--- test/EarthSciData_test.jl | 22 +- test/compose_fastjx_superfast_test.jl | 9 +- test/geoschem_test.jl | 21 +- test/superfast_test.jl | 30 +- 16 files changed, 516 insertions(+), 525 deletions(-) diff --git a/docs/Project.toml b/docs/Project.toml index 846414ae..a60cf04e 100644 --- a/docs/Project.toml +++ b/docs/Project.toml @@ -4,23 +4,23 @@ DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" DifferentialEquations = "0c46a032-eb83-5123-abaf-570d42b7fbaa" Documenter = "e30172f5-a6a5-5a46-863b-614d45cd2de4" +DynamicQuantities = "06fc5a27-2a28-4c7c-a15d-362465fb6821" EarthSciData = "a293c155-435f-439d-9c11-a083b6b47337" EarthSciMLBase = "e53f1632-a13c-4728-9402-0c66d48804b0" GasChem = "58070593-4751-4c87-a5d1-63807d11d76c" ModelingToolkit = "961ee093-0014-501f-94e3-6117800e7a78" Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" -Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" [compat] -ModelingToolkit = "8" +ModelingToolkit = "9" Documenter = "1" -GasChem = "0.6" +DynamicQuantities = "0.13" +GasChem = "0.7" DifferentialEquations = "7" -EarthSciMLBase = "0.15" +EarthSciMLBase = "0.16" DataFrames = "1" -Catalyst = "13" -Unitful = "1" +Catalyst = "14" Plots = "1" diff --git a/docs/src/composing_models.md b/docs/src/composing_models.md index bb5b56ec..fc7b313e 100644 --- a/docs/src/composing_models.md +++ b/docs/src/composing_models.md @@ -9,22 +9,21 @@ Here is the complete example of composing, visualizing and solving the SuperFast model and the Fast-JX model, with explanation to follow: ```julia -using EarthSciMLBase, GasChem, ModelingToolkit, Dates, Unitful, DifferentialEquations +using EarthSciMLBase, GasChem, ModelingToolkit, Dates, DynamicQuantities, DifferentialEquations +using ModelingToolkit:t - -@parameters t [unit = u"s", description = "Time"] -composed_ode = couple(SuperFast(t), FastJX(t)) # Compose two models use the "couple" function +composed_ode = couple(SuperFast(), FastJX()) # Compose two models use the "couple" function start = Dates.datetime2unix(Dates.DateTime(2024, 2, 29)) tspan = (start, start+3600*24*3) -sys = structural_simplify(get_mtk(composed_ode)) # Define the coupled system +sys = structural_simplify(convert(ODESystem, composed_ode)) # Define the coupled system sol = solve(ODEProblem(sys, [], tspan, []),AutoTsit5(Rosenbrock23()), saveat=10.0) # Solve the coupled system ``` In the composed system, the variable name for O₃ is not ```O3``` but ```superfast₊O3(t)```. So we need some preparation of the result before visualizing. ```julia -vars = states(sys) # Get the variables in the composed system +vars = unknowns(sys) # Get the variables in the composed system var_dict = Dict(string(var) => var for var in vars) pols = ["O3", "OH", "NO", "NO2", "CH4", "CH3O2", "CO","CH3OOH", "CH3O", "DMS", "SO2", "ISOP"] var_names_p = ["superfast₊$(v)(t)" for v in pols] @@ -33,17 +32,17 @@ x_t = unix2datetime.(sol[t]) # Convert from unixtime to date time for visualizin ``` Then, we could plot the results as: ```@setup 1 -using EarthSciMLBase, GasChem, ModelingToolkit, Dates, Unitful, DifferentialEquations +using EarthSciMLBase, GasChem, ModelingToolkit, Dates, DynamicQuantities, DifferentialEquations +using ModelingToolkit:t -@parameters t [unit = u"s"] -composed_ode = couple(SuperFast(t), FastJX(t)) # Compose two models use the "couple" function +composed_ode = couple(SuperFast(), FastJX()) # Compose two models use the "couple" function start = Dates.datetime2unix(Dates.DateTime(2024, 2, 29)) tspan = (start, start+3600*24*3) -sys = structural_simplify(get_mtk(composed_ode)) # Define the coupled system +sys = structural_simplify(convert(ODESystem, composed_ode)) # Define the coupled system sol = solve(ODEProblem(sys, [], tspan, []),AutoTsit5(Rosenbrock23()), saveat=10.0) # Solve the coupled system -vars = states(sys) # Get the variables in the composed system +vars = unknowns(sys) # Get the variables in the composed system var_dict = Dict(string(var) => var for var in vars) pols = ["O3", "OH", "NO", "NO2", "CH4", "CH3O2", "CO","CH3OOH", "CH3O", "DMS", "SO2", "ISOP"] var_names_p = ["SuperFast₊$(v)(t)" for v in pols] @@ -68,27 +67,27 @@ Here's a simple example: ```@example 2 using GasChem, EarthSciData # This will trigger the emission extension using Dates, ModelingToolkit, DifferentialEquations, EarthSciMLBase -using Plots, Unitful +using Plots, DynamicQuantities +using ModelingToolkit:t -@parameters t [unit = u"s", description = "Time"] @parameters lat = 40 @parameters lon = -97 @parameters lev = 1 -emis = NEI2016MonthlyEmis("mrggrid_withbeis_withrwc", t, lon, lat, lev; dtype=Float64) +emis = NEI2016MonthlyEmis("mrggrid_withbeis_withrwc", lon, lat, lev; dtype=Float64) -model_noemis = couple(SuperFast(t),FastJX(t)) # A model with chemistry and photolysis, but no emissions. -model_withemis = couple(SuperFast(t), FastJX(t), emis) # The same model with emissions. +model_noemis = couple(SuperFast(),FastJX()) # A model with chemistry and photolysis, but no emissions. +model_withemis = couple(SuperFast(), FastJX(), emis) # The same model with emissions. -sys_noemis = structural_simplify(get_mtk(model_noemis)) -sys_withemis = structural_simplify(get_mtk(model_withemis)) +sys_noemis = structural_simplify(convert(ODESystem, model_noemis)) +sys_withemis = structural_simplify(convert(ODESystem, model_withemis)) start = Dates.datetime2unix(Dates.DateTime(2016, 5, 1)) tspan = (start, start+3*24*3600) sol_noemis = solve(ODEProblem(sys_noemis, [], tspan, []), AutoTsit5(Rosenbrock23())) sol_withemis = solve(ODEProblem(sys_withemis, [], tspan, []), AutoTsit5(Rosenbrock23())) -vars = states(sys_noemis) # Get the variables in the composed system +vars = unknowns(sys_noemis) # Get the variables in the composed system var_dict = Dict(string(var) => var for var in vars) pols = ["O3", "OH", "NO", "NO2", "CH4", "CH3O2", "CO","CH3OOH", "CH3O", "DMS", "SO2", "ISOP"] var_names_p = ["SuperFast₊$(v)(t)" for v in pols] diff --git a/docs/src/geoschem/overview.md b/docs/src/geoschem/overview.md index 001972e4..02fcd2f6 100644 --- a/docs/src/geoschem/overview.md +++ b/docs/src/geoschem/overview.md @@ -16,11 +16,11 @@ First, let's initialize the model and we can also look at the first few ODE equa ```@example 1 using GasChem, EarthSciMLBase using DifferentialEquations, ModelingToolkit -using Unitful, Plots +using DynamicQuantities, Plots +using ModelingToolkit:t tspan = (0.0, 360.0) -@variables t [unit = u"s", description = "Time"] -gc = GEOSChemGasPhase(t) +gc = GEOSChemGasPhase() equations(gc)[1:5] ``` @@ -37,11 +37,11 @@ Now, let's run a simulation and plot the results: ```@example 1 sys = structural_simplify(gc) vals = ModelingToolkit.get_defaults(sys) -for k in setdiff(states(sys),keys(vals)) +for k in setdiff(unknowns(sys),keys(vals)) vals[k] = 0 # Set variables with no default to zero. end prob = ODEProblem(sys, vals, tspan, vals) sol = solve(prob, AutoTsit5(Rosenbrock23())) plot(sol, legend = :outertopright, xlabel = "Time (s)", - ylabel = "Concentration (nmol/mol)") + ylabel = "Concentration (ppb)") ``` \ No newline at end of file diff --git a/docs/src/geoschem/params.md b/docs/src/geoschem/params.md index 23e51756..ef0325b7 100644 --- a/docs/src/geoschem/params.md +++ b/docs/src/geoschem/params.md @@ -8,27 +8,27 @@ We can explore what happens when we change them: ```@example using GasChem, EarthSciMLBase using DifferentialEquations, ModelingToolkit -using Unitful, Plots +using DynamicQuantities, Plots +using ModelingToolkit:t tspan = (0.0, 60.0*60*24*4) # 4 day simulation -@variables t #[unit = u"s", description = "Time"] # Run a simulation with constant temperature and pressure. -sys = structural_simplify(GEOSChemGasPhase(t)) +sys = structural_simplify(GEOSChemGasPhase()) vals = ModelingToolkit.get_defaults(sys) -for k in setdiff(states(sys),keys(vals)) +for k in setdiff(unknowns(sys),keys(vals)) vals[k] = 0 # Set variables with no default to zero. end prob = ODEProblem(sys, vals, tspan, vals) sol1 = solve(prob, AutoTsit5(Rosenbrock23())) # Now, convert parameters to variables so we can change them over time. -sys2 = param_to_var(GEOSChemGasPhase(t), :T, :num_density) +sys2 = param_to_var(GEOSChemGasPhase(), :T, :num_density) # Vary temperature and pressure over time. @unpack T, num_density = sys2 @constants T_0 = 300 [unit=u"K"] -@constants t_0 = 1 #[unit=u"s"] +@constants t_0 = 1 [unit=u"s"] eqs = [ T ~ T_0 + T_0 / 1.5 * sin(2π*t/t_0/(60*60*24)), num_density ~ 2.7e19 - 2.5e19*t/t_0/(60*60*24*4), @@ -38,7 +38,7 @@ sys2 = extend(sys2,ODESystem(eqs, t; name=:var_T)) # Run the simulation again. sys2 = structural_simplify(sys2) vals = ModelingToolkit.get_defaults(sys2) -for k in setdiff(states(sys2),keys(vals)) +for k in setdiff(unknowns(sys2),keys(vals)) vals[k] = 0 # Set variables with no default to zero. end prob = ODEProblem(sys2, vals, tspan, vals) @@ -46,7 +46,7 @@ sol2 = solve(prob, AutoTsit5(Rosenbrock23())) # Plot the results p1 = plot(sol1.t, sol1[sys2.O3], xticks=:none, label="Constant T and P", - ylabel = "Concentration (nmol/mol)") + ylabel = "Concentration (ppb)") plot!(p1, sol2.t, sol2[sys2.O3], label="Varying T and P") p2 = plot(sol2.t, sol2[sys2.T], label = "T (K)", xticks=:none) @@ -60,9 +60,9 @@ plot(p1, p2, p3, layout=grid(3, 1, heights=[0.7, 0.15, 0.15])) Here is a list of all of the model parameters: ```@example 1 -using GasChem, DataFrames, EarthSciMLBase, ModelingToolkit, Unitful +using GasChem, DataFrames, EarthSciMLBase, ModelingToolkit, DynamicQuantities @variables t [unit = u"s", description = "Time"] -gc = structural_simplify(GEOSChemGasPhase(t)) +gc = structural_simplify(GEOSChemGasPhase()) vars = parameters(gc) DataFrame( :Name => [string(Symbolics.tosymbol(v, escape=false)) for v ∈ vars], diff --git a/docs/src/geoschem/states.md b/docs/src/geoschem/states.md index 40f4f1ec..d315e71f 100644 --- a/docs/src/geoschem/states.md +++ b/docs/src/geoschem/states.md @@ -3,10 +3,10 @@ Here is a list of the chemical species in the mechanism: ```@example 1 -using GasChem, DataFrames, EarthSciMLBase, ModelingToolkit, Unitful -@variables t [unit = u"s", description = "Time"] -gc = structural_simplify(GEOSChemGasPhase(t)) -vars = states(gc) +using GasChem, DataFrames, EarthSciMLBase, ModelingToolkit, DynamicQuantities +using ModelingToolkit:t +gc = structural_simplify(GEOSChemGasPhase()) +vars = unknowns(gc) DataFrame( :Name => [string(Symbolics.tosymbol(v, escape=false)) for v ∈ vars], :Units => [ModelingToolkit.get_unit(v) for v ∈ vars], diff --git a/docs/src/superfast.md b/docs/src/superfast.md index a435b7c5..3ca8c23f 100644 --- a/docs/src/superfast.md +++ b/docs/src/superfast.md @@ -11,25 +11,25 @@ First, we can look at the reaction equations: ```@example 1 using GasChem, EarthSciMLBase, ModelingToolkit -using Unitful, DifferentialEquations +using DynamicQuantities, DifferentialEquations using Catalyst using Plots +using ModelingToolkit:t -@parameters t [unit = u"s", description = "Time"] -model = SuperFast(t) +model = SuperFast() ``` We can also look at them as a graph: ```@example 1 -Graph(SuperFast(t, rxn_sys=true)) +Graph(SuperFast(;name=:SuperFast, rxn_sys=true)) ``` ## Variables and parameters The chemical species included in the superfast model are: ```@example 1 -vars = states(model) +vars = unknowns(model) using DataFrames DataFrame( :Name => [string(Symbolics.tosymbol(v, escape=false)) for v ∈ vars], diff --git a/ext/EarthSciDataExt.jl b/ext/EarthSciDataExt.jl index 1bfeefe4..b5855056 100644 --- a/ext/EarthSciDataExt.jl +++ b/ext/EarthSciDataExt.jl @@ -1,31 +1,31 @@ module EarthSciDataExt -using GasChem, EarthSciData, ModelingToolkit, EarthSciMLBase, Unitful +using GasChem, EarthSciData, ModelingToolkit, EarthSciMLBase, DynamicQuantities +@register_unit ppb 1 function EarthSciMLBase.couple2(c::GasChem.SuperFastCoupler, e::EarthSciData.NEI2016MonthlyEmisCoupler) c, e = c.sys, e.sys @constants( - MW_NO2 = 46.0055, [unit = u"g/mol", description="NO2 molar mass"], - MW_NO = 30.01, [unit = u"g/mol", description="NO molar mass"], - MW_FORM = 30.0260, [unit = u"g/mol", description="Formaldehyde molar mass"], - MW_CH4 = 16.0425, [unit = u"g/mol", description="Methane molar mass"], - MW_CO = 28.0101, [unit = u"g/mol", description="Carbon monoxide molar mass"], - MW_SO2 = 64.0638, [unit = u"g/mol", description="Sulfur dioxide molar mass"], - MW_ISOP = 68.12, [unit = u"g/mol", description="Isoprene molar mass"], - - gperkg = 1e3, [unit = u"g/kg", description="Conversion factor from kg to g"], - nmolpermol = 1e9, [unit = u"nmol/mol", description="Conversion factor from mol to nmol"], + MW_NO2 = 46.0055*10^-3, [unit = u"kg/mol", description="NO2 molar mass"], + MW_NO = 30.01*10^-3, [unit = u"kg/mol", description="NO molar mass"], + MW_FORM = 30.0260*10^-3, [unit = u"kg/mol", description="Formaldehyde molar mass"], + MW_CH4 = 16.0425*10^-3, [unit = u"kg/mol", description="Methane molar mass"], + MW_CO = 28.0101*10^-3, [unit = u"kg/mol", description="Carbon monoxide molar mass"], + MW_SO2 = 64.0638*10^-3, [unit = u"kg/mol", description="Sulfur dioxide molar mass"], + MW_ISOP = 68.12*10^-3, [unit = u"kg/mol", description="Isoprene molar mass"], + + nmolpermol = 1e9, [unit = u"ppb", description="noml/mol, Conversion factor from mol to nmol"], R = 8.31446261815324, [unit = u"m^3*Pa/mol/K", description="Ideal gas constant"], ) # Emissions are in units of "kg/m3/s" and need to be converted to "ppb/s" or "nmol/mol/s". # To do this we need to convert kg of emissions to nmol of emissions, # and we need to convert m3 of air to mol of air. - # nmol_emissions = kg_emissions * gperkg / MW_emission * nmolpermol = kg * g/kg / g/mol * nmol/mol = nmol + # nmol_emissions = kg_emissions * gperkg / MW_emission * nmolpermol = kg / kg/mol * nmol/mol = nmol # mol_air = m3_air / R / T * P = m3 / (m3*Pa/mol/K) / K * Pa = mol # So, the overall conversion is: - # nmol_emissions / mol_air = (kg_emissions * gperkg / MW_emission * nmolpermol) / (m3_air / R / T * P) - uconv = gperkg * nmolpermol * R * c.T / c.P # Conversion factor with MW factored out. + # nmol_emissions / mol_air = (kg_emissions / MW_emission * nmolpermol) / (m3_air / R / T * P) + uconv = nmolpermol * R * c.T / c.P # Conversion factor with MW factored out. operator_compose(convert(ODESystem, c), e, Dict( c.NO2 => e.NO2 => uconv / MW_NO2, c.NO => e.NO => uconv / MW_NO, @@ -40,11 +40,10 @@ end function EarthSciMLBase.couple2(c::GasChem.SuperFastCoupler, g::EarthSciData.GEOSFPCoupler) c, g = c.sys, g.sys - @constants PaPerhPa = 100 [unit = u"Pa/hPa", description="Conversion factor from hPa to Pa"] c = param_to_var(c, :T, :P) ConnectorSystem([ c.T ~ g.I3₊T, - c.P ~ g.P * PaPerhPa, + c.P ~ g.P, ], c, g) end diff --git a/src/Fast-JX.jl b/src/Fast-JX.jl index 619a2bfb..53b0479f 100644 --- a/src/Fast-JX.jl +++ b/src/Fast-JX.jl @@ -127,13 +127,13 @@ function j_mean(σ_interp, ϕ::Float32, time::T2, lat::T, long::T, Temperature:: end # Dummy functions for unit validation. Basically ModelingToolkit -# will call the function with a Unitful.Quantity or an integer to +# will call the function with a DynamicQuantities.Quantity or an integer to # get information about the type and units of the output. -j_mean_H2O2(t, lat, long, T::Unitful.Quantity) = 0.0u"s^-1" -j_mean_CH2Oa(t, lat, long, T::Unitful.Quantity) = 0.0u"s^-1" -j_mean_CH3OOH(t, lat, long, T::Unitful.Quantity) = 0.0u"s^-1" -j_mean_NO2(t, lat, long, T::Unitful.Quantity) = 0.0u"s^-1" -j_mean_o31D(t, lat, long, T::Unitful.Quantity) = 0.0u"s^-1" +j_mean_H2O2(t, lat, long, T::DynamicQuantities.Quantity) = 0.0u"s^-1" +j_mean_CH2Oa(t, lat, long, T::DynamicQuantities.Quantity) = 0.0u"s^-1" +j_mean_CH3OOH(t, lat, long, T::DynamicQuantities.Quantity) = 0.0u"s^-1" +j_mean_NO2(t, lat, long, T::DynamicQuantities.Quantity) = 0.0u"s^-1" +j_mean_o31D(t, lat, long, T::DynamicQuantities.Quantity) = 0.0u"s^-1" j_mean_H2O2(t, lat, long, T) = j_mean(σ_H2O2_interp, ϕ_H2O2_jx, t, lat, long, T) @register_symbolic j_mean_H2O2(t, lat, long, T) @@ -157,11 +157,10 @@ Description: This is a box model used to calculate the photolysis reaction rate Build Fast-JX model # Example ``` julia - @parameters t [unit = u"s"] - fj = FastJX(t) + fj = FastJX() ``` """ -function FastJX(t; name=:FastJX) +function FastJX(;name=:FastJX) @parameters T = 298.0 [unit = u"K", description = "Temperature"] @parameters lat = 40.0 [description = "Latitude (Degrees)"] @parameters long = -97.0 [description = "Longitude (Degrees)"] diff --git a/src/GasChem.jl b/src/GasChem.jl index 5fc69e04..9d1d833a 100644 --- a/src/GasChem.jl +++ b/src/GasChem.jl @@ -4,9 +4,12 @@ using EarthSciMLBase using ModelingToolkit using Catalyst using Dates -using Unitful +using DynamicQuantities using StaticArrays using Interpolations +using ModelingToolkit:t + +@register_unit ppb 1 include("SuperFast.jl") include("geoschem_ratelaws.jl") diff --git a/src/SuperFast.jl b/src/SuperFast.jl index fc806993..2895da6d 100644 --- a/src/SuperFast.jl +++ b/src/SuperFast.jl @@ -5,7 +5,7 @@ struct SuperFastCoupler end """ - SuperFast(t) + SuperFast() This atmospheric chemical system model is built based on the Super Fast Chemical Mechanism, which is one of the simplest representations of atmospheric chemistry. It can efficiently simulate background tropheric ozone chemistry and perform well for those species included in the mechanism. The chemical equations we used is included in the supporting table S2 of the paper: @@ -19,65 +19,64 @@ If the keyword argument `rxn_sys` is set to `true`, the function will return a r # Example ``` using GasChem, EarthSciMLBase, DifferentialEquations, Plots -@variables t [unit = u"s"] -rs = SuperFast(t) -sol = solve(ODEProblem(get_mtk(rs), [], (0,360), [], combinatoric_ratelaws=false), Tsit5()) +rs = SuperFast() +sol = solve(ODEProblem(structural_simplify(rs), [], (0,360), [], combinatoric_ratelaws=false), Tsit5()) plot(sol) ``` """ -function SuperFast(t; name=:SuperFast, rxn_sys=false) +function SuperFast(;name=:SuperFast, rxn_sys=false) params = @parameters( jO31D = 4.0 * 10.0^-3, [unit = u"s^-1"], - j2OH = 2.2 * 10.0^-10, [unit = u"(s*nmol/mol)^-1"], + j2OH = 2.2 * 10.0^-10, [unit = u"(s*ppb)^-1"], jH2O2 = 1.0097 * 10.0^-5, [unit = u"s^-1"], jNO2 = 0.0149, [unit = u"s^-1"], jCH2Oa = 0.00014, [unit = u"s^-1"], # TODO(JL): What's difference between the two photolysis reactions of CH2O, do we really need both? (@variables jCH20b(t) = 0.00014 [unit = u"s^-1"]) jCH3OOH = 8.9573 * 10.0^-6, [unit = u"s^-1"], - k1 = 1.7e-12, [unit = u"(s*nmol/mol)^-1"], T1 = -940, [unit = u"K"], - k2 = 1.0e-14, [unit = u"(s*nmol/mol)^-1"], T2 = -490, [unit = u"K"], - k3 = 4.8e-11, [unit = u"(s*nmol/mol)^-1"], T3 = 250, [unit = u"K"], - k4 = 3.0e-12, [unit = u"(s*nmol/mol)^-1"], T4 = -1500, [unit = u"K"], - k5 = 3.5e-12, [unit = u"(s*nmol/mol)^-1"], T5 = 250, [unit = u"K"], - k6 = 2.45e-12, [unit = u"(s*nmol/mol)^-1"], T6 = -1775, [unit = u"K"], - k7 = 5.5e-12, [unit = u"(s*nmol/mol)^-1"], T7 = 125, [unit = u"K"], - k8 = 4.1e-13, [unit = u"(s*nmol/mol)^-1"], T8 = 750, [unit = u"K"], - k9 = 2.7e-12, [unit = u"(s*nmol/mol)^-1"], T9 = 200, [unit = u"K"], - k10 = 1.1e-12, [unit = u"(s*nmol/mol)^-1"], T10 = 200, [unit = u"K"], - k11 = 2.8e-12, [unit = u"(s*nmol/mol)^-1"], T11 = 300, [unit = u"K"], - k12 = 9.5e-14 / 10, [unit = u"s^-1*(nmol/mol)^-19"], T12 = 390, [unit = u"K"], - k13 = 1.1e-11, [unit = u"(s*nmol/mol)^-1"], T13 = -240, [unit = u"K"], - k14 = 2.7e-11, [unit = u"(s*nmol/mol)^-1"], T14 = 390, [unit = u"K"], - k15 = 2.7e-11 / 2, [unit = u"s^-1*(nmol/mol)^-3"], T15 = 390, [unit = u"K"], - k16 = 5.59e-15, [unit = u"(s*nmol/mol)^-1"], T16 = -1814, [unit = u"K"], - k17 = 3.0e-13, [unit = u"(s*nmol/mol)^-1"], T17 = 460, [unit = u"K"], - k18 = 1.8e-12, [unit = u"(s*nmol/mol)^-1"], - k19 = 1.5e-13, [unit = u"(s*nmol/mol)^-1"], + k1 = 1.7e-12, [unit = u"(s*ppb)^-1"], T1 = -940, [unit = u"K"], + k2 = 1.0e-14, [unit = u"(s*ppb)^-1"], T2 = -490, [unit = u"K"], + k3 = 4.8e-11, [unit = u"(s*ppb)^-1"], T3 = 250, [unit = u"K"], + k4 = 3.0e-12, [unit = u"(s*ppb)^-1"], T4 = -1500, [unit = u"K"], + k5 = 3.5e-12, [unit = u"(s*ppb)^-1"], T5 = 250, [unit = u"K"], + k6 = 2.45e-12, [unit = u"(s*ppb)^-1"], T6 = -1775, [unit = u"K"], + k7 = 5.5e-12, [unit = u"(s*ppb)^-1"], T7 = 125, [unit = u"K"], + k8 = 4.1e-13, [unit = u"(s*ppb)^-1"], T8 = 750, [unit = u"K"], + k9 = 2.7e-12, [unit = u"(s*ppb)^-1"], T9 = 200, [unit = u"K"], + k10 = 1.1e-12, [unit = u"(s*ppb)^-1"], T10 = 200, [unit = u"K"], + k11 = 2.8e-12, [unit = u"(s*ppb)^-1"], T11 = 300, [unit = u"K"], + k12 = 9.5e-14 / 10, [unit = u"s^-1*(ppb)^-19"], T12 = 390, [unit = u"K"], + k13 = 1.1e-11, [unit = u"(s*ppb)^-1"], T13 = -240, [unit = u"K"], + k14 = 2.7e-11, [unit = u"(s*ppb)^-1"], T14 = 390, [unit = u"K"], + k15 = 2.7e-11 / 2, [unit = u"s^-1*(ppb)^-3"], T15 = 390, [unit = u"K"], + k16 = 5.59e-15, [unit = u"(s*ppb)^-1"], T16 = -1814, [unit = u"K"], + k17 = 3.0e-13, [unit = u"(s*ppb)^-1"], T17 = 460, [unit = u"K"], + k18 = 1.8e-12, [unit = u"(s*ppb)^-1"], + k19 = 1.5e-13, [unit = u"(s*ppb)^-1"], T = 280.0, [unit = u"K", description = "Temperature"], P = 101325, [unit = u"Pa", description = "Pressure (not directly used)"], ) species = @species( - O3(t) = 10.0, [unit = u"nmol/mol"], - O1d(t) = 0.00001, [unit = u"nmol/mol"], - OH(t) = 10.0, [unit = u"nmol/mol"], - HO2(t) = 10.0, [unit = u"nmol/mol"], - O2(t) = 2.1 * (10.0^8), [unit = u"nmol/mol"], - H2O(t) = 450.0, [unit = u"nmol/mol"], - NO(t) = 0.0, [unit = u"nmol/mol"], - NO2(t) = 10.0, [unit = u"nmol/mol"], - CH4(t) = 1700.0, [unit = u"nmol/mol"], - CH3O2(t) = 0.01, [unit = u"nmol/mol"], - CH2O(t) = 0.15, [unit = u"nmol/mol"], - CO(t) = 275.0, [unit = u"nmol/mol"], - CH3OOH(t) = 1.6, [unit = u"nmol/mol"], - CH3O(t) = 0.0, [unit = u"nmol/mol"], - DMS(t) = 50, [unit = u"nmol/mol"], - SO2(t) = 2.0, [unit = u"nmol/mol"], - ISOP(t) = 0.15, [unit = u"nmol/mol"], - H2O2(t) = 2.34, [unit = u"nmol/mol"], + O3(t) = 10.0, [unit = u"ppb"], + O1d(t) = 0.00001, [unit = u"ppb"], + OH(t) = 10.0, [unit = u"ppb"], + HO2(t) = 10.0, [unit = u"ppb"], + O2(t) = 2.1 * (10.0^8), [unit = u"ppb"], + H2O(t) = 450.0, [unit = u"ppb"], + NO(t) = 0.0, [unit = u"ppb"], + NO2(t) = 10.0, [unit = u"ppb"], + CH4(t) = 1700.0, [unit = u"ppb"], + CH3O2(t) = 0.01, [unit = u"ppb"], + CH2O(t) = 0.15, [unit = u"ppb"], + CO(t) = 275.0, [unit = u"ppb"], + CH3OOH(t) = 1.6, [unit = u"ppb"], + CH3O(t) = 0.0, [unit = u"ppb"], + DMS(t) = 50, [unit = u"ppb"], + SO2(t) = 2.0, [unit = u"ppb"], + ISOP(t) = 0.15, [unit = u"ppb"], + H2O2(t) = 2.34, [unit = u"ppb"], ) - @constants P_hack = 1.0e20, [unit = u"Pa/mol*nmol*s", description = "Constant for hack to avoid dropping pressure from the model"] + @constants P_hack = 1.0e20, [unit = u"Pa*ppb*s", description = "Constant for hack to avoid dropping pressure from the model"] c = 2.46e10 # TODO(JL): What is this constant? rate(k, Tc) = k * exp(Tc / T) * c @@ -145,5 +144,5 @@ function SuperFast(t; name=:SuperFast, rxn_sys=false) if rxn_sys return rxns end - convert(ODESystem, rxns; metadata=Dict(:coupletype => SuperFastCoupler)) + convert(ODESystem, complete(rxns); metadata=Dict(:coupletype => SuperFastCoupler)) end \ No newline at end of file diff --git a/src/geoschem_fullchem.jl b/src/geoschem_fullchem.jl index be7ebc4a..cd1cbecd 100644 --- a/src/geoschem_fullchem.jl +++ b/src/geoschem_fullchem.jl @@ -55,7 +55,7 @@ Moch et al, JGR, https, * Moch2020 # //doi.org/10.1029/2020JD032706, 2020. * Wolfe2012: Wolfe et al., Phys. Chem. Chem. Phys., doi: 10.1039/C2CP40388A, 2012. * Xie2013: Xie et al., Atmos. Chem. Phys., doi:10.5194/acp-13-8439-2013, 2013. """ -function GEOSChemGasPhase(t; name=:GEOSChemGasPhase, rxn_sys=false) +function GEOSChemGasPhase(; name=:GEOSChemGasPhase, rxn_sys=false) # Create reaction rate constant system constructors rate_systems = [] @@ -67,13 +67,13 @@ function GEOSChemGasPhase(t; name=:GEOSChemGasPhase, rxn_sys=false) return sys.k end function arrnodim(T, a0, b0, c0) - sys = arrhenius(t, T, a0, b0, c0, unit=u"nmol/mol"/u"nmol/mol", name=Symbol(:arrhenius, i)) + sys = arrhenius(t, T, a0, b0, c0, unit=u"ppb"/u"ppb", name=Symbol(:arrhenius, i)) i+=1 push!(rate_systems, sys) return sys.k end function arrsq(T, a0, b0, c0) - sys = arrhenius(t, T, a0, b0, c0, unit=u"mol/nmol"^2, name=Symbol(:arrhenius, i)) + sys = arrhenius(t, T, a0, b0, c0, unit=u"ppb^-1"^2, name=Symbol(:arrhenius, i)) i+=1 push!(rate_systems, sys) return sys.k @@ -97,7 +97,7 @@ function GEOSChemGasPhase(t; name=:GEOSChemGasPhase, rxn_sys=false) return sys.k end function arr3nodim(T, num_density, a1, b1, c1, a2, b2, c2, fv) - sys = arr_3rdbody(t, T, num_density, a1, b1, c1, a2, b2, c2, fv; unit=u"nmol/mol"/u"nmol/mol", name=Symbol(:arr_3rdbody, i)) + sys = arr_3rdbody(t, T, num_density, a1, b1, c1, a2, b2, c2, fv; unit=u"ppb"/u"ppb", name=Symbol(:arr_3rdbody, i)) i+=1 push!(rate_systems, sys) return sys.k @@ -157,7 +157,7 @@ function GEOSChemGasPhase(t; name=:GEOSChemGasPhase, rxn_sys=false) return sys.k end function eqconstnodim(T, num_density, a0, c0, a1, b1, a2, b2, fv) - sys = eq_const(t, T, num_density, a0, c0, a1, b1, a2, b2, fv; unit=u"nmol/mol"/u"nmol/mol", name=Symbol(:eq_const, i)) + sys = eq_const(t, T, num_density, a0, c0, a1, b1, a2, b2, fv; unit=u"ppb"/u"ppb", name=Symbol(:eq_const, i)) i+=1 push!(rate_systems, sys) return sys.k @@ -211,7 +211,7 @@ function GEOSChemGasPhase(t; name=:GEOSChemGasPhase, rxn_sys=false) return sys.k end function arrplsnodim(T, a0, b0, c0, d0, e0) - sys = arrplus(t, T, a0, b0, c0, d0, e0; unit=u"nmol/mol"/u"nmol/mol", name=Symbol(:arrplus, i)) + sys = arrplus(t, T, a0, b0, c0, d0, e0; unit=u"ppb"/u"ppb", name=Symbol(:arrplus, i)) i+=1 push!(rate_systems, sys) return sys.k @@ -223,7 +223,7 @@ function GEOSChemGasPhase(t; name=:GEOSChemGasPhase, rxn_sys=false) return sys.k end function tunplsnodim(T, a0, b0, c0, d0, e0) - sys = tunplus(t, T, a0, b0, c0, d0, e0;unit=u"nmol/mol"/u"nmol/mol", name=Symbol(:tunplus, i)) + sys = tunplus(t, T, a0, b0, c0, d0, e0;unit=u"ppb"/u"ppb", name=Symbol(:tunplus, i)) i+=1 push!(rate_systems, sys) return sys.k @@ -253,7 +253,7 @@ function GEOSChemGasPhase(t; name=:GEOSChemGasPhase, rxn_sys=false) return sys.k end function rPAN_ababnodim(T, num_density, a0, b0, a1, b1, cf) - sys = rate_PAN_abab(t, T, num_density, a0, b0, a1, b1, cf; unit=u"nmol/mol"/u"nmol/mol", name=Symbol(:rate_PAN_abab, i)) + sys = rate_PAN_abab(t, T, num_density, a0, b0, a1, b1, cf; unit=u"ppb"/u"ppb", name=Symbol(:rate_PAN_abab, i)) i+=1 push!(rate_systems, sys) return sys.k @@ -283,312 +283,312 @@ function GEOSChemGasPhase(t; name=:GEOSChemGasPhase, rxn_sys=false) # Equations - Date modified; Reference; Developer initials @species( - A3O2(t) = 59.469, [unit = u"nmol/mol", description = "CH3CH2CH2OO; Primary RO2 from C3H8"], - ACET(t) = 87.473, [unit = u"nmol/mol", description = "CH3C(O)CH3; Acetone"], - ACTA(t) = 70.187, [unit = u"nmol/mol", description = "CH3C(O)OH; Acetic acid"], - AERI(t) = 30.013, [unit = u"nmol/mol", description = "I; Dissolved iodine"], - ALD2(t) = 9.4976, [unit = u"nmol/mol", description = "CH3CHO; Acetaldehyde"], - ALK4(t) = 8.4827, [unit = u"nmol/mol", description = ">= C4 alkanes"], - AONITA(t) = 77.604, [unit = u"nmol/mol", description = "Aerosol-phase organic nitrate from aromatic precursors"], - AROMRO2(t) = 77.132, [unit = u"nmol/mol", description = "generic peroxy radical from aromatic oxidation"], - AROMP4(t) = 52.322, [unit = u"nmol/mol", description = "Generic C4 product from aromatic oxidation"], - AROMP5(t) = 4.8975, [unit = u"nmol/mol", description = "Generic C5 product from aromatic oxidation"], - ATO2(t) = 88.056, [unit = u"nmol/mol", description = "CH3C(O)CH2O2; RO2 from acetone"], - ATOOH(t) = 95.672, [unit = u"nmol/mol", description = "CH3C(O)CH2OOH; ATO2 peroxide"], - B3O2(t) = 44.692, [unit = u"nmol/mol", description = "CH3CH(OO)CH3; Secondary RO2 from C3H8"], - BALD(t) = 35.859, [unit = u"nmol/mol", description = "benzaldehyde and tolualdehyde"], - BENZ(t) = 18.166, [unit = u"nmol/mol", description = "C6H6; Benzene"], - BENZO(t) = 92.094, [unit = u"nmol/mol", description = "C6H5O radical"], - BENZO2(t) = 45.770, [unit = u"nmol/mol", description = "C6H5O2 radical"], - BENZP(t) = 45.646, [unit = u"nmol/mol", description = "hydroperoxide from BENZO2"], - Br(t) = 56.283, [unit = u"nmol/mol", description = "Br; Atomic bromine"], - Br2(t) = 98.265, [unit = u"nmol/mol", description = "Br2; Molecular bromine"], - BrCl(t) = 70.858, [unit = u"nmol/mol", description = "BrCl; Bromine chloride"], - BrNO2(t) = 15.765, [unit = u"nmol/mol", description = "BrNO2; Nitryl bromide"], - BrNO3(t) = 8.8808, [unit = u"nmol/mol", description = "BrNO3; Bromine nitrate"], - BrO(t) = 90.871, [unit = u"nmol/mol", description = "BrO; Bromine monoxide"], - BRO2(t) = 90.134, [unit = u"nmol/mol", description = "C6H5O2 ; Peroxy radical from BENZ oxidation"], - BrSALA(t) = 5.6082, [unit = u"nmol/mol", description = "Br; Fine sea salt bromine"], - BrSALC(t) = 23.602, [unit = u"nmol/mol", description = "Br; Course sea salt bromine"], - BZCO3(t) = 34.301, [unit = u"nmol/mol", description = "benzoylperoxy radical"], - BZCO3H(t) = 18.280, [unit = u"nmol/mol", description = "perbenzoic acid"], - BZPAN(t) = 25.224, [unit = u"nmol/mol", description = "peroxybenzoyl nitrate"], - C2H2(t) = 64.023, [unit = u"nmol/mol", description = "C2H2; Ethyne"], - C2H4(t) = 48.832, [unit = u"nmol/mol", description = "Ethylene"], - C2H6(t) = 95.500, [unit = u"nmol/mol", description = "C2H6; Ethane"], - C3H8(t) = 93.457, [unit = u"nmol/mol", description = "C3H8; Propane"], - C4HVP1(t) = 90.362, [unit = u"nmol/mol", description = "C4 hydroxy-vinyl-peroxy radicals from HPALDs"], - C4HVP2(t) = 60.972, [unit = u"nmol/mol", description = "C4 hydroxy-vinyl-peroxy radicals from HPALDs"], - CCl4(t) = 38.249, [unit = u"nmol/mol", description = "CCl4; Carbon tetrachloride"], - CFC11(t) = 16.012, [unit = u"nmol/mol", description = "CCl3F ; CFC-11, R-11, Freon 11"], - CFC12(t) = 60.683, [unit = u"nmol/mol", description = "CCl2F2; CFC-12, R-12, Freon 12"], - CFC113(t) = 99.375, [unit = u"nmol/mol", description = "C2Cl3F3; CFC-113, Freon 113"], - CFC114(t) = 82.883, [unit = u"nmol/mol", description = "C2Cl2F4; CFC-114, Freon 114"], - CFC115(t) = 63.617, [unit = u"nmol/mol", description = "C2ClF5; CFC-115, Freon 115"], - CH2Br2(t) = 53.658, [unit = u"nmol/mol", description = "CH3Br2; Dibromomethane"], - CH2Cl2(t) = 6.5485, [unit = u"nmol/mol", description = "CH2Cl2; Dichloromethane"], - CH2I2(t) = 62.463, [unit = u"nmol/mol", description = "CH2I2; Diiodomethane"], - CH2IBr(t) = 98.965, [unit = u"nmol/mol", description = "CH2IBr; Bromoiodomethane"], - CH2ICl(t) = 33.656, [unit = u"nmol/mol", description = "CH2ICl; Chloroiodomethane"], - CH2O(t) = 34.136, [unit = u"nmol/mol", description = "CH2O; Formaldehyde"], - CH2OO(t) = 72.666, [unit = u"nmol/mol", description = "CH2OO; Criegee intermediate"], - CH3Br(t) = 76.768, [unit = u"nmol/mol", description = "CH3Br; Methyl bromide"], - CH3CCl3(t) = 99.842, [unit = u"nmol/mol", description = "CH3CCl3; Methyl chloroform"], - CH3CHOO(t) = 27.830, [unit = u"nmol/mol", description = "CH3CHOO; Criegee intermediate"], - CH3Cl(t) = 14.055, [unit = u"nmol/mol", description = "CH3Cl; Chloromethane"], - CH3I(t) = 19.671, [unit = u"nmol/mol", description = "CH3I; Methyl iodide"], - CH4(t) = 6.9330, [unit = u"nmol/mol", description = "CH4; Methane"], - CHBr3(t) = 84.204, [unit = u"nmol/mol", description = "CHBr3; Tribromethane"], - CHCl3(t) = 79.435, [unit = u"nmol/mol", description = "CHCl3; Chloroform"], - Cl(t) = 47.484, [unit = u"nmol/mol", description = "Cl; Atomic chlorine"], - Cl2(t) = 71.292, [unit = u"nmol/mol", description = "Cl2; Molecular chlorine"], - Cl2O2(t) = 96.248, [unit = u"nmol/mol", description = "Cl2O2; Dichlorine dioxide"], - ClNO2(t) = 36.482, [unit = u"nmol/mol", description = "ClNO2; Nitryl chloride"], - ClNO3(t) = 55.020, [unit = u"nmol/mol", description = "ClONO2; Chlorine nitrate"], - ClO(t) = 0.9863, [unit = u"nmol/mol", description = "ClO; Chlorine monoxide"], - ClOO(t) = 53.802, [unit = u"nmol/mol", description = "ClOO; Chlorine dioxide"], - CO(t) = 32.978, [unit = u"nmol/mol", description = "CO; Carbon monoxide"], - CO2(t) = 55.611, [unit = u"nmol/mol", description = "CO2; Carbon dioxide"], - CSL(t) = 23.332, [unit = u"nmol/mol", description = "cresols and xylols"], - DMS(t) = 5.8615, [unit = u"nmol/mol", description = "(CH3)2S; Dimethylsulfide"], - EOH(t) = 18.988, [unit = u"nmol/mol", description = "C2H5OH; Ethanol"], - ETHLN(t) = 69.851, [unit = u"nmol/mol", description = "CHOCH2ONO2; Ethanal nitrate"], - ETHN(t) = 24.767, [unit = u"nmol/mol", description = "stable hydroxy-nitrooxy-ethane"], - ETHP(t) = 59.843, [unit = u"nmol/mol", description = "stable hydroxy-hydroperoxy-ethane"], - ETNO3(t) = 11.558, [unit = u"nmol/mol", description = "C2H5ONO2; Ethyl nitrate"], - ETO(t) = 85.116, [unit = u"nmol/mol", description = "hydroxy-alkoxy-ethane radical"], - ETOO(t) = 24.842, [unit = u"nmol/mol", description = "hydroxy-peroxy-ethane radical, formed from ethene + OH"], - ETO2(t) = 29.300, [unit = u"nmol/mol", description = "CH3CH2OO; Ethylperoxy radical"], - ETP(t) = 81.950, [unit = u"nmol/mol", description = "CH3CH2OOH; Ethylhydroperoxide"], - GLYC(t) = 20.407, [unit = u"nmol/mol", description = "HOCH2CHO; Glycoaldehyde"], - GLYX(t) = 81.571, [unit = u"nmol/mol", description = "CHOCHO; Glyoxal"], - H(t) = 7.6410, [unit = u"nmol/mol", description = "H; Atomic hydrogen"], - H1211(t) = 46.027, [unit = u"nmol/mol", description = "CBrClF2; H-1211"], - H1301(t) = 36.584, [unit = u"nmol/mol", description = "CBrF3; H-1301"], - H2402(t) = 52.639, [unit = u"nmol/mol", description = "C2Br2F4; H-2402"], - H2O(t) = 56.623, [unit = u"nmol/mol", description = "H2O; Water vapor"], - H2O2(t) = 44.325, [unit = u"nmol/mol", description = "H2O2; Hydrogen peroxide"], - HAC(t) = 88.335, [unit = u"nmol/mol", description = "HOCH2C(O)CH3; Hydroxyacetone"], - HBr(t) = 15.715, [unit = u"nmol/mol", description = "HBr; Hypobromic acid"], - HC5A(t) = 44.638, [unit = u"nmol/mol", description = "C5H8O2; Isoprene-4,1-hydroxyaldehyde"], - HCFC123(t) = 22.296, [unit = u"nmol/mol", description = "C2HCl2F3; HCFC-123, R-123, Freon 123"], - HCFC141b(t) = 93.091, [unit = u"nmol/mol", description = "C(CH3)Cl2F; HCFC-141b, R-141b, Freon 141b"], - HCFC142b(t) = 81.415, [unit = u"nmol/mol", description = "C(CH3)ClF2; HCFC-142b, R-142b, Freon 142b"], - HCFC22(t) = 16.333, [unit = u"nmol/mol", description = "CHClF2 ; HCFC-22, R-22, Freon 22"], - HCl(t) = 87.644, [unit = u"nmol/mol", description = "HCl; Hydrochloric acid"], - HCOOH(t) = 99.489, [unit = u"nmol/mol", description = "HCOOH; Formic acid"], - HI(t) = 68.377, [unit = u"nmol/mol", description = "HI; Hydrogen iodide"], - HMHP(t) = 16.437, [unit = u"nmol/mol", description = "HOCH2OOH; Hydroxymethyl hydroperoxide"], - HMML(t) = 33.654, [unit = u"nmol/mol", description = "C4H6O3; Hydroxymethyl-methyl-a-lactone"], - HMS(t) = 54.099, [unit = u"nmol/mol", description = "HOCH2SO3-; hydroxymethanesulfonate"], - HNO2(t) = 18.174, [unit = u"nmol/mol", description = "HONO; Nitrous acid"], - HNO3(t) = 62.170, [unit = u"nmol/mol", description = "HNO3; Nitric acid"], - HNO4(t) = 39.302, [unit = u"nmol/mol", description = "HNO4; Pernitric acid"], - HO2(t) = 58.306, [unit = u"nmol/mol", description = "HO2; Hydroperoxyl radical"], - HOBr(t) = 59.529, [unit = u"nmol/mol", description = "HOBr; Hypobromous acid"], - HOCl(t) = 90.397, [unit = u"nmol/mol", description = "HOCl; Hypochlorous acid"], - HOI(t) = 35.827, [unit = u"nmol/mol", description = "HOI; Hypoiodous acid"], - HONIT(t) = 58.760, [unit = u"nmol/mol", description = "2nd gen monoterpene organic nitrate"], - HPALD1(t) = 73.164, [unit = u"nmol/mol", description = "O=CHC(CH3)=CHCH2OOH; d-4,1-C5-hydroperoxyaldehyde"], - HPALD1OO(t) = 34.759, [unit = u"nmol/mol", description = "peroxy radicals from HPALD1"], - HPALD2(t) = 1.0291, [unit = u"nmol/mol", description = "HOOCH2C(CH3)=CHCH=O; d-1,4-C5-hydroperoxyaldehyde"], - HPALD2OO(t) = 28.332, [unit = u"nmol/mol", description = "peroxy radicals from HPALD2"], - HPALD3(t) = 91.404, [unit = u"nmol/mol", description = "O=CHC(CH3)OOHCH=CH2; b-2,1-C5-hydroperoxyaldehyde"], - HPALD4(t) = 14.949, [unit = u"nmol/mol", description = "CH2=C(CH3)CHOOHCH=O; b-3,4-C5-hydroperoxyaldehyde"], - HPETHNL(t) = 90.330, [unit = u"nmol/mol", description = "CHOCH2OOH; hydroperoxyethanal"], - I(t) = 85.092, [unit = u"nmol/mol", description = "I; Atmoic iodine"], - I2(t) = 49.639, [unit = u"nmol/mol", description = "I2; Molecular iodine"], - I2O2(t) = 70.687, [unit = u"nmol/mol", description = "I2O2; Diiodine dioxide"], - I2O3(t) = 85.950, [unit = u"nmol/mol", description = "I2O3; Diiodine trioxide"], - I2O4(t) = 36.304, [unit = u"nmol/mol", description = "I2O4; Diiodine tetraoxide"], - IBr(t) = 46.529, [unit = u"nmol/mol", description = "IBr; Iodine monobromide"], - ICHE(t) = 17.739, [unit = u"nmol/mol", description = "C5H8O3; Isoprene hydroxy-carbonyl-epoxides"], - ICHOO(t) = 75.448, [unit = u"nmol/mol", description = "peroxy radical from IEPOXD"], - ICl(t) = 32.124, [unit = u"nmol/mol", description = "ICl; Iodine monochloride"], - ICN(t) = 22.128, [unit = u"nmol/mol", description = "C5H7NO4; Lumped isoprene carbonyl nitrates"], - ICNOO(t) = 12.649, [unit = u"nmol/mol", description = "peroxy radicals from ICN"], - ICPDH(t) = 71.736, [unit = u"nmol/mol", description = "C5H10O5; Isoprene dihydroxy hydroperoxycarbonyl"], - IDC(t) = 28.840, [unit = u"nmol/mol", description = "C5H6O2; Lumped isoprene dicarbonyls"], - IDCHP(t) = 2.3035, [unit = u"nmol/mol", description = "C5H8O5; Isoprene dicarbonyl hydroxy dihydroperoxide"], - IDHDP(t) = 21.649, [unit = u"nmol/mol", description = "C5H12O6; Isoprene dihydroxy dihydroperoxide"], - IDHNBOO(t) = 25.086, [unit = u"nmol/mol", description = "peroxy radicals from INPB"], - IDHNDOO1(t) = 15.276, [unit = u"nmol/mol", description = "peroxy radicals from INPD"], - IDHNDOO2(t) = 61.961, [unit = u"nmol/mol", description = "peroxy radicals from INPD"], - IDHPE(t) = 94.216, [unit = u"nmol/mol", description = "C5H10O5; Isoprene dihydroxy hydroperoxy epoxide"], - IDN(t) = 13.328, [unit = u"nmol/mol", description = "C5H8N2O6; Lumped isoprene dinitrates"], - IDNOO(t) = 44.188, [unit = u"nmol/mol", description = "peroxy radicals from IDN"], - IEPOXA(t) = 60.554, [unit = u"nmol/mol", description = "C5H10O3; trans-Beta isoprene epoxydiol"], - IEPOXAOO(t) = 27.948, [unit = u"nmol/mol", description = "peroxy radical from trans-Beta isoprene epoxydiol"], - IEPOXB(t) = 38.609, [unit = u"nmol/mol", description = "C5H10O3; cis-Beta isoprene epoxydiol"], - IEPOXBOO(t) = 87.094, [unit = u"nmol/mol", description = "peroxy radical from cis-Beta isoprene epoxydiol"], - IEPOXD(t) = 8.0346, [unit = u"nmol/mol", description = "C5H10O3; Delta isoprene epoxydiol"], - IHN1(t) = 11.028, [unit = u"nmol/mol", description = "C5H9NO4; Isoprene-d-4-hydroxy-1-nitrate"], - IHN2(t) = 71.286, [unit = u"nmol/mol", description = "C5H9NO4; Isoprene-b-1-hydroxy-2-nitrate"], - IHN3(t) = 82.443, [unit = u"nmol/mol", description = "C5H9NO4; Isoprene-b-4-hydroxy-3-nitrate"], - IHN4(t) = 91.975, [unit = u"nmol/mol", description = "C5H9NO4; Isoprene-d-1-hydroxy-4-nitrate"], - IHOO1(t) = 27.517, [unit = u"nmol/mol", description = "peroxy radical from OH addition to isoprene at C1"], - IHOO4(t) = 51.624, [unit = u"nmol/mol", description = "peroxy radical from OH addition to isoprene at C4"], - IHPNBOO(t) = 66.363, [unit = u"nmol/mol", description = "peroxy radicals from INPB"], - IHPNDOO(t) = 63.447, [unit = u"nmol/mol", description = "peroxy radicals from INPD"], - IHPOO1(t) = 79.476, [unit = u"nmol/mol", description = "peroxy radical from ISOPOOH"], - IHPOO2(t) = 58.328, [unit = u"nmol/mol", description = "peroxy radical from ISOPOOH"], - IHPOO3(t) = 5.9515, [unit = u"nmol/mol", description = "peroxy radical from ISOPOOH"], - INA(t) = 26.490, [unit = u"nmol/mol", description = "alkoxy radical from INO2D"], - INDIOL(t) = 52.424, [unit = u"nmol/mol", description = "Generic aerosol phase organonitrate hydrolysis product"], - INO(t) = 73.106, [unit = u"nmol/mol", description = "INO; Nitrosyl iodide"], - INO2B(t) = 25.723, [unit = u"nmol/mol", description = "beta-peroxy radicals from isoprene + NO3"], - INO2D(t) = 30.524, [unit = u"nmol/mol", description = "delta-peroxy radicals from isoprene + NO3"], - INPB(t) = 96.224, [unit = u"nmol/mol", description = "C5H9NO5; Lumped isoprene beta-hydroperoxy nitrates"], - INPD(t) = 80.193, [unit = u"nmol/mol", description = "C5H9NO5; Lumped isoprene delta-hydroperoxy nitrates"], - IO(t) = 26.615, [unit = u"nmol/mol", description = "IO; Iodine monoxide"], - IONITA(t) = 25.539, [unit = u"nmol/mol", description = "Aerosol-phase organic nitrate from isoprene precursors"], - IONO(t) = 56.756, [unit = u"nmol/mol", description = "IONO; Nitryl iodide"], - IONO2(t) = 53.992, [unit = u"nmol/mol", description = "IONO2; Iodine nitrate"], - IPRNO3(t) = 22.638, [unit = u"nmol/mol", description = "C3H8ONO2; Isopropyl nitrate"], - ISALA(t) = 79.006, [unit = u"nmol/mol", description = "I; Fine sea salt iodine"], - ISALC(t) = 13.184, [unit = u"nmol/mol", description = "I; Coarse sea salt iodine"], - ISOP(t) = 83.240, [unit = u"nmol/mol", description = "CH2=C(CH3)CH=CH2; Isoprene"], - ISOPNOO1(t) = 60.043, [unit = u"nmol/mol", description = "peroxy radicals from IHN2"], - ISOPNOO2(t) = 71.160, [unit = u"nmol/mol", description = "peroxy radicals from IHN3"], - ITCN(t) = 26.206, [unit = u"nmol/mol", description = "C5H9NO7; Lumped tetrafunctional isoprene carbonyl-nitrates"], - ITHN(t) = 11.572, [unit = u"nmol/mol", description = "C5H11NO7; Lumped tetrafunctional isoprene hydroxynitrates"], - KO2(t) = 84.868, [unit = u"nmol/mol", description = "RO2 from >3 ketones"], - LBRO2H(t) = 61.633, [unit = u"nmol/mol", description = "Dummy spc to track oxidation of BRO2 by HO2"], - LBRO2N(t) = 11.255, [unit = u"nmol/mol", description = "Dummy spc to track oxidation of BRO2 by NO"], - LIMO(t) = 53.446, [unit = u"nmol/mol", description = "C10H16; Limonene"], - LIMO2(t) = 92.794, [unit = u"nmol/mol", description = "RO2 from LIMO"], - LISOPOH(t) = 92.199, [unit = u"nmol/mol", description = "Dummy spc to track oxidation of ISOP by OH"], - LISOPNO3(t) = 29.918, [unit = u"nmol/mol", description = "Dummy spc to track oxidation of ISOP by NO3"], - LNRO2H(t) = 29.939, [unit = u"nmol/mol", description = "Dummy spc to track oxidation of NRO2 by HO2"], - LNRO2N(t) = 57.661, [unit = u"nmol/mol", description = "Dummy spc to track oxidation of NRO2 by NO"], - LTRO2H(t) = 46.441, [unit = u"nmol/mol", description = "Dummy spc to track oxidation of TRO2 by HO2"], - LTRO2N(t) = 28.826, [unit = u"nmol/mol", description = "Dummy spc to track oxidation of TRO2 by NO"], - LVOC(t) = 47.079, [unit = u"nmol/mol", description = "C5H14O5; Gas-phase low-volatility non-IEPOX product of ISOPOOH (RIP) oxidation"], - LVOCOA(t) = 97.788, [unit = u"nmol/mol", description = "C5H14O5; Aerosol-phase low-volatility non-IEPOX product of ISOPOOH (RIP) oxidation"], - LXRO2H(t) = 62.462, [unit = u"nmol/mol", description = "Dummy spc to track oxidation of XRO2 by HO2"], - LXRO2N(t) = 39.337, [unit = u"nmol/mol", description = "Dummy spc to track oxidation of XRO2 by NO"], - MACR(t) = 17.935, [unit = u"nmol/mol", description = "CH2=C(CH3)CHO; Methacrolein"], - MACR1OO(t) = 91.114, [unit = u"nmol/mol", description = "peroxyacyl radical from MACR + OH"], - MACR1OOH(t) = 61.547, [unit = u"nmol/mol", description = "CH2=C(CH3)C(O)OOH; Peracid from MACR"], - MACRNO2(t) = 97.585, [unit = u"nmol/mol", description = "Product of MCRHN + OH"], - MAP(t) = 61.421, [unit = u"nmol/mol", description = "CH3C(O)OOH; Peroxyacetic acid"], - MCO3(t) = 0.6220, [unit = u"nmol/mol", description = "CH3C(O)OO; Peroxyacetyl radical"], - MCRDH(t) = 23.756, [unit = u"nmol/mol", description = "C4H8O3; Dihydroxy-MACR"], - MCRENOL(t) = 43.151, [unit = u"nmol/mol", description = "C4H6O2; Lumped enols from MVK/MACR"], - MCRHN(t) = 5.5067, [unit = u"nmol/mol", description = "HOCH2C(ONO2)(CH3)CHO; Hydroxynitrate from MACR"], - MCRHNB(t) = 2.8277, [unit = u"nmol/mol", description = "O2NOCH2C(OH)(CH3)CHO; Hydroxynitrate from MACR"], - MCRHP(t) = 0.2048, [unit = u"nmol/mol", description = "HOCH2C(OOH)(CH3)CHO; Hydroxy-hydroperoxy-MACR"], - MCROHOO(t) = 49.422, [unit = u"nmol/mol", description = "peroxy radical from MACR + OH"], - MCT(t) = 77.753, [unit = u"nmol/mol", description = "methylcatechols"], - MEK(t) = 61.732, [unit = u"nmol/mol", description = "RC(O)R; Methyl ethyl ketone"], - MENO3(t) = 89.773, [unit = u"nmol/mol", description = "CH3ONO2; methyl nitrate"], - MGLY(t) = 93.209, [unit = u"nmol/mol", description = "CH3COCHO; Methylglyoxal"], - MO2(t) = 73.881, [unit = u"nmol/mol", description = "CH3O2; Methylperoxy radical"], - MOH(t) = 55.585, [unit = u"nmol/mol", description = "CH3OH; Methanol"], - MONITA(t) = 61.052, [unit = u"nmol/mol", description = "Aerosol-phase organic nitrate from monoterpene precursors"], - MONITS(t) = 71.179, [unit = u"nmol/mol", description = "Saturated 1st gen monoterpene organic nitrate"], - MONITU(t) = 23.294, [unit = u"nmol/mol", description = "Unsaturated 1st gen monoterpene organic nitrate"], - MP(t) = 25.386, [unit = u"nmol/mol", description = "CH3OOH; Methylhydroperoxide"], - MPAN(t) = 89.575, [unit = u"nmol/mol", description = "CH2=C(CH3)C(O)OONO2; Peroxymethacroyl nitrate (PMN)"], - MPN(t) = 59.399, [unit = u"nmol/mol", description = "CH3O2NO2; Methyl peroxy nitrate"], - MSA(t) = 82.711, [unit = u"nmol/mol", description = "CH4SO3; Methanesulfonic acid"], - MTPA(t) = 25.413, [unit = u"nmol/mol", description = "Lumped monoterpenes: a-pinene, b-pinene, sabinene, carene"], - MTPO(t) = 8.9141, [unit = u"nmol/mol", description = "Other monoterpenes: Terpinene, terpinolene, myrcene, ocimene, other monoterpenes"], - MVK(t) = 62.109, [unit = u"nmol/mol", description = "CH2=CHC(=O)CH3; Methyl vinyl ketone"], - MVKDH(t) = 97.635, [unit = u"nmol/mol", description = "HOCH2CH2OHC(O)CH3; Dihydroxy-MVK"], - MVKHC(t) = 98.159, [unit = u"nmol/mol", description = "C4H6O3; MVK hydroxy-carbonyl"], - MVKHCB(t) = 50.621, [unit = u"nmol/mol", description = "C4H6O3; MVK hydroxy-carbonyl"], - MVKHP(t) = 35.334, [unit = u"nmol/mol", description = "C4H8O4; MVK hydroxy-hydroperoxide"], - MVKN(t) = 48.570, [unit = u"nmol/mol", description = "HOCH2CH(ONO2)C(=O)CH3; Hydroxynitrate from MVK"], - MVKOHOO(t) = 41.490, [unit = u"nmol/mol", description = "peroxy radical from MVK + OH"], - MVKPC(t) = 8.2590, [unit = u"nmol/mol", description = "OCHCH(OOH)C(O)CH3; MVK hydroperoxy-carbonyl"], - N(t) = 56.891, [unit = u"nmol/mol", description = "N; Atomic nitrogen"], - N2O(t) = 50.751, [unit = u"nmol/mol", description = "N2O; Nitrous oxide"], - N2O5(t) = 19.118, [unit = u"nmol/mol", description = "N2O5; Dinitrogen pentoxide"], - NAP(t) = 33.270, [unit = u"nmol/mol", description = "C10H8; Naphthalene; IVOC surrogate"], - NIT(t) = 77.088, [unit = u"nmol/mol", description = "NIT; Fine mode inorganic nitrate"], - NITs(t) = 56.341, [unit = u"nmol/mol", description = "NITs; Coarse mode inorganic nitrate"], - NO(t) = 54.454, [unit = u"nmol/mol", description = "NO; Nitric oxide"], - NO2(t) = 5.5605, [unit = u"nmol/mol", description = "NO2; Nitrogen dioxide"], - NO3(t) = 31.739, [unit = u"nmol/mol", description = "NO3; Nitrate radical"], - NPHEN(t) = 87.002, [unit = u"nmol/mol", description = "nitrophenols"], - NPRNO3(t) = 58.488, [unit = u"nmol/mol", description = "C3H8ONO2; n-propyl nitrate"], - NRO2(t) = 83.618, [unit = u"nmol/mol", description = "Peroxy radical from NAP oxidation"], - O(t) = 14.164, [unit = u"nmol/mol", description = "O(3P); Ground state atomic oxygen"], - O1D(t) = 17.648, [unit = u"nmol/mol", description = "O(1D); Excited atomic oxygen"], - O3(t) = 2.1326, [unit = u"nmol/mol", description = "O3; Ozone"], - O3A(t) = 28.223, [unit = u"nmol/mol", description = "O3; Ozone in accum seasalt"], - O3C(t) = 49.728, [unit = u"nmol/mol", description = "O3; Ozone in coarse seasalt"], - OClO(t) = 60.037, [unit = u"nmol/mol", description = "OClO; Chlorine dioxide"], - OCS(t) = 20.867, [unit = u"nmol/mol", description = "COS; Carbonyl sulfide"], - OH(t) = 19.293, [unit = u"nmol/mol", description = "OH; Hydroxyl radical"], - OIO(t) = 51.406, [unit = u"nmol/mol", description = "OIO; Iodine dioxide"], - OLND(t) = 63.247, [unit = u"nmol/mol", description = "Monoterpene-derived NO3-alkene adduct"], - OLNN(t) = 95.667, [unit = u"nmol/mol", description = "Monoterpene-derived NO3 adduct"], - OTHRO2(t) = 74.722, [unit = u"nmol/mol", description = "Other C2 RO2 not from C2H6 oxidation"], - PAN(t) = 59.945, [unit = u"nmol/mol", description = "CH3C(O)OONO2; Peroxyacetylnitrate"], - PHEN(t) = 59.463, [unit = u"nmol/mol", description = "phenol"], - PIO2(t) = 94.953, [unit = u"nmol/mol", description = "RO2 from MTPA"], - PIP(t) = 96.809, [unit = u"nmol/mol", description = "Peroxides from MTPA"], - PO2(t) = 25.827, [unit = u"nmol/mol", description = "HOCH2CH(OO)CH3; RO2 from propene"], - PP(t) = 61.804, [unit = u"nmol/mol", description = "HOCH2CH(OOH)CH3; Peroxide from PO2"], - PPN(t) = 94.436, [unit = u"nmol/mol", description = "CH3CH2C(O)OONO2; Peroxypropionylnitrate"], - PRN1(t) = 87.618, [unit = u"nmol/mol", description = "O2NOCH2CH(OO)CH3; RO2 from propene + NO3"], - PROPNN(t) = 33.842, [unit = u"nmol/mol", description = "CH3C(=O)CH2ONO2; Propanone nitrate"], - PRPE(t) = 63.131, [unit = u"nmol/mol", description = "C3H6; >= C3 alkenes"], - PRPN(t) = 43.083, [unit = u"nmol/mol", description = "O2NOCH2CH(OOH)CH3; Peroxide from PRN1"], - PYAC(t) = 79.104, [unit = u"nmol/mol", description = "CH3COCOOH; Pyruvic acid"], - R4N1(t) = 37.438, [unit = u"nmol/mol", description = "RO2 from R4N2"], - R4N2(t) = 46.153, [unit = u"nmol/mol", description = "RO2NO; >= C4 alkylnitrates"], - R4O2(t) = 36.162, [unit = u"nmol/mol", description = "RO2 from ALK4"], - R4P(t) = 40.804, [unit = u"nmol/mol", description = "CH3CH2CH2CH2OOH; Peroxide from R4O2"], - RA3P(t) = 57.025, [unit = u"nmol/mol", description = "CH3CH2CH2OOH; Peroxide from A3O2"], - RB3P(t) = 72.421, [unit = u"nmol/mol", description = "CH3CH(OOH)CH3; Peroxide from B3O2"], - RCHO(t) = 37.680, [unit = u"nmol/mol", description = "CH3CH2CHO; >= C3 aldehydes"], - RCO3(t) = 63.108, [unit = u"nmol/mol", description = "CH3CH2C(O)OO; Peroxypropionyl radical"], - RIPA(t) = 42.881, [unit = u"nmol/mol", description = "HOCH2C(OOH)(CH3)CH=CH2; 1,2-ISOPOOH"], - RIPB(t) = 24.737, [unit = u"nmol/mol", description = "HOCH2C(OOH)(CH3)CH=CH2; 4,3-ISOPOOH"], - RIPC(t) = 57.374, [unit = u"nmol/mol", description = "C5H10O3; d(1,4)-ISOPOOH"], - RIPD(t) = 5.9941, [unit = u"nmol/mol", description = "C5H10O3; d(4,1)-ISOPOOH"], - ROH(t) = 67.750, [unit = u"nmol/mol", description = "C3H7OH; > C2 alcohols"], - RP(t) = 38.598, [unit = u"nmol/mol", description = "CH3CH2C(O)OOH; Peroxide from RCO3"], - SALAAL(t) = 37.928, [unit = u"nmol/mol", description = "Accumulation mode seasalt aerosol alkalinity"], - SALCAL(t) = 13.651, [unit = u"nmol/mol", description = "Coarse mode seasalt aerosol alkalinity"], - SALACL(t) = 41.613, [unit = u"nmol/mol", description = "Cl; Fine chloride"], - SALCCL(t) = 41.813, [unit = u"nmol/mol", description = "Cl; Coarse chloride"], - SALASO2(t) = 46.971, [unit = u"nmol/mol", description = "SO2; Fine seasalt"], - SALCSO2(t) = 98.028, [unit = u"nmol/mol", description = "SO2; Coarse seasalt"], - SALASO3(t) = 18.107, [unit = u"nmol/mol", description = "SO3--; Fine seasalt"], - SALCSO3(t) = 51.008, [unit = u"nmol/mol", description = "SO3--; Coarse chloride"], - SO2(t) = 6.2180, [unit = u"nmol/mol", description = "SO2; Sulfur dioxide"], - SO4(t) = 97.494, [unit = u"nmol/mol", description = "SO4; Sulfate"], - SO4s(t) = 74.244, [unit = u"nmol/mol", description = "SO4 on sea-salt; Sulfate"], - SOAGX(t) = 82.469, [unit = u"nmol/mol", description = "CHOCHO; Aerosol-phase glyoxal"], - SOAIE(t) = 81.289, [unit = u"nmol/mol", description = "C5H10O3; Aerosol-phase IEPOX"], - TOLU(t) = 58.265, [unit = u"nmol/mol", description = "C7H8; Toluene"], - TRO2(t) = 10.659, [unit = u"nmol/mol", description = "Peroxy radical from TOLU oxidation"], - XYLE(t) = 24.563, [unit = u"nmol/mol", description = "C8H10; Xylene"], - XRO2(t) = 25.058, [unit = u"nmol/mol", description = "Peroxy radical from XYLE oxidation"], - H2(t) = 97.924, [unit = u"nmol/mol", description = "H2; Molecular hydrogen"], - N2(t) = 36.998, [unit = u"nmol/mol", description = "N2; Molecular nitrogen"], - O2(t) = 51.201, [unit = u"nmol/mol", description = "O2; Molecular oxygen"], - RCOOH(t) = 12.892, [unit = u"nmol/mol", description = "C2H5C(O)OH; > C2 organic acids "], + A3O2(t) = 59.469, [unit = u"ppb", description = "CH3CH2CH2OO; Primary RO2 from C3H8"], + ACET(t) = 87.473, [unit = u"ppb", description = "CH3C(O)CH3; Acetone"], + ACTA(t) = 70.187, [unit = u"ppb", description = "CH3C(O)OH; Acetic acid"], + AERI(t) = 30.013, [unit = u"ppb", description = "I; Dissolved iodine"], + ALD2(t) = 9.4976, [unit = u"ppb", description = "CH3CHO; Acetaldehyde"], + ALK4(t) = 8.4827, [unit = u"ppb", description = ">= C4 alkanes"], + AONITA(t) = 77.604, [unit = u"ppb", description = "Aerosol-phase organic nitrate from aromatic precursors"], + AROMRO2(t) = 77.132, [unit = u"ppb", description = "generic peroxy radical from aromatic oxidation"], + AROMP4(t) = 52.322, [unit = u"ppb", description = "Generic C4 product from aromatic oxidation"], + AROMP5(t) = 4.8975, [unit = u"ppb", description = "Generic C5 product from aromatic oxidation"], + ATO2(t) = 88.056, [unit = u"ppb", description = "CH3C(O)CH2O2; RO2 from acetone"], + ATOOH(t) = 95.672, [unit = u"ppb", description = "CH3C(O)CH2OOH; ATO2 peroxide"], + B3O2(t) = 44.692, [unit = u"ppb", description = "CH3CH(OO)CH3; Secondary RO2 from C3H8"], + BALD(t) = 35.859, [unit = u"ppb", description = "benzaldehyde and tolualdehyde"], + BENZ(t) = 18.166, [unit = u"ppb", description = "C6H6; Benzene"], + BENZO(t) = 92.094, [unit = u"ppb", description = "C6H5O radical"], + BENZO2(t) = 45.770, [unit = u"ppb", description = "C6H5O2 radical"], + BENZP(t) = 45.646, [unit = u"ppb", description = "hydroperoxide from BENZO2"], + Br(t) = 56.283, [unit = u"ppb", description = "Br; Atomic bromine"], + Br2(t) = 98.265, [unit = u"ppb", description = "Br2; Molecular bromine"], + BrCl(t) = 70.858, [unit = u"ppb", description = "BrCl; Bromine chloride"], + BrNO2(t) = 15.765, [unit = u"ppb", description = "BrNO2; Nitryl bromide"], + BrNO3(t) = 8.8808, [unit = u"ppb", description = "BrNO3; Bromine nitrate"], + BrO(t) = 90.871, [unit = u"ppb", description = "BrO; Bromine monoxide"], + BRO2(t) = 90.134, [unit = u"ppb", description = "C6H5O2 ; Peroxy radical from BENZ oxidation"], + BrSALA(t) = 5.6082, [unit = u"ppb", description = "Br; Fine sea salt bromine"], + BrSALC(t) = 23.602, [unit = u"ppb", description = "Br; Course sea salt bromine"], + BZCO3(t) = 34.301, [unit = u"ppb", description = "benzoylperoxy radical"], + BZCO3H(t) = 18.280, [unit = u"ppb", description = "perbenzoic acid"], + BZPAN(t) = 25.224, [unit = u"ppb", description = "peroxybenzoyl nitrate"], + C2H2(t) = 64.023, [unit = u"ppb", description = "C2H2; Ethyne"], + C2H4(t) = 48.832, [unit = u"ppb", description = "Ethylene"], + C2H6(t) = 95.500, [unit = u"ppb", description = "C2H6; Ethane"], + C3H8(t) = 93.457, [unit = u"ppb", description = "C3H8; Propane"], + C4HVP1(t) = 90.362, [unit = u"ppb", description = "C4 hydroxy-vinyl-peroxy radicals from HPALDs"], + C4HVP2(t) = 60.972, [unit = u"ppb", description = "C4 hydroxy-vinyl-peroxy radicals from HPALDs"], + CCl4(t) = 38.249, [unit = u"ppb", description = "CCl4; Carbon tetrachloride"], + CFC11(t) = 16.012, [unit = u"ppb", description = "CCl3F ; CFC-11, R-11, Freon 11"], + CFC12(t) = 60.683, [unit = u"ppb", description = "CCl2F2; CFC-12, R-12, Freon 12"], + CFC113(t) = 99.375, [unit = u"ppb", description = "C2Cl3F3; CFC-113, Freon 113"], + CFC114(t) = 82.883, [unit = u"ppb", description = "C2Cl2F4; CFC-114, Freon 114"], + CFC115(t) = 63.617, [unit = u"ppb", description = "C2ClF5; CFC-115, Freon 115"], + CH2Br2(t) = 53.658, [unit = u"ppb", description = "CH3Br2; Dibromomethane"], + CH2Cl2(t) = 6.5485, [unit = u"ppb", description = "CH2Cl2; Dichloromethane"], + CH2I2(t) = 62.463, [unit = u"ppb", description = "CH2I2; Diiodomethane"], + CH2IBr(t) = 98.965, [unit = u"ppb", description = "CH2IBr; Bromoiodomethane"], + CH2ICl(t) = 33.656, [unit = u"ppb", description = "CH2ICl; Chloroiodomethane"], + CH2O(t) = 34.136, [unit = u"ppb", description = "CH2O; Formaldehyde"], + CH2OO(t) = 72.666, [unit = u"ppb", description = "CH2OO; Criegee intermediate"], + CH3Br(t) = 76.768, [unit = u"ppb", description = "CH3Br; Methyl bromide"], + CH3CCl3(t) = 99.842, [unit = u"ppb", description = "CH3CCl3; Methyl chloroform"], + CH3CHOO(t) = 27.830, [unit = u"ppb", description = "CH3CHOO; Criegee intermediate"], + CH3Cl(t) = 14.055, [unit = u"ppb", description = "CH3Cl; Chloromethane"], + CH3I(t) = 19.671, [unit = u"ppb", description = "CH3I; Methyl iodide"], + CH4(t) = 6.9330, [unit = u"ppb", description = "CH4; Methane"], + CHBr3(t) = 84.204, [unit = u"ppb", description = "CHBr3; Tribromethane"], + CHCl3(t) = 79.435, [unit = u"ppb", description = "CHCl3; Chloroform"], + Cl(t) = 47.484, [unit = u"ppb", description = "Cl; Atomic chlorine"], + Cl2(t) = 71.292, [unit = u"ppb", description = "Cl2; Molecular chlorine"], + Cl2O2(t) = 96.248, [unit = u"ppb", description = "Cl2O2; Dichlorine dioxide"], + ClNO2(t) = 36.482, [unit = u"ppb", description = "ClNO2; Nitryl chloride"], + ClNO3(t) = 55.020, [unit = u"ppb", description = "ClONO2; Chlorine nitrate"], + ClO(t) = 0.9863, [unit = u"ppb", description = "ClO; Chlorine monoxide"], + ClOO(t) = 53.802, [unit = u"ppb", description = "ClOO; Chlorine dioxide"], + CO(t) = 32.978, [unit = u"ppb", description = "CO; Carbon monoxide"], + CO2(t) = 55.611, [unit = u"ppb", description = "CO2; Carbon dioxide"], + CSL(t) = 23.332, [unit = u"ppb", description = "cresols and xylols"], + DMS(t) = 5.8615, [unit = u"ppb", description = "(CH3)2S; Dimethylsulfide"], + EOH(t) = 18.988, [unit = u"ppb", description = "C2H5OH; Ethanol"], + ETHLN(t) = 69.851, [unit = u"ppb", description = "CHOCH2ONO2; Ethanal nitrate"], + ETHN(t) = 24.767, [unit = u"ppb", description = "stable hydroxy-nitrooxy-ethane"], + ETHP(t) = 59.843, [unit = u"ppb", description = "stable hydroxy-hydroperoxy-ethane"], + ETNO3(t) = 11.558, [unit = u"ppb", description = "C2H5ONO2; Ethyl nitrate"], + ETO(t) = 85.116, [unit = u"ppb", description = "hydroxy-alkoxy-ethane radical"], + ETOO(t) = 24.842, [unit = u"ppb", description = "hydroxy-peroxy-ethane radical, formed from ethene + OH"], + ETO2(t) = 29.300, [unit = u"ppb", description = "CH3CH2OO; Ethylperoxy radical"], + ETP(t) = 81.950, [unit = u"ppb", description = "CH3CH2OOH; Ethylhydroperoxide"], + GLYC(t) = 20.407, [unit = u"ppb", description = "HOCH2CHO; Glycoaldehyde"], + GLYX(t) = 81.571, [unit = u"ppb", description = "CHOCHO; Glyoxal"], + H(t) = 7.6410, [unit = u"ppb", description = "H; Atomic hydrogen"], + H1211(t) = 46.027, [unit = u"ppb", description = "CBrClF2; H-1211"], + H1301(t) = 36.584, [unit = u"ppb", description = "CBrF3; H-1301"], + H2402(t) = 52.639, [unit = u"ppb", description = "C2Br2F4; H-2402"], + H2O(t) = 56.623, [unit = u"ppb", description = "H2O; Water vapor"], + H2O2(t) = 44.325, [unit = u"ppb", description = "H2O2; Hydrogen peroxide"], + HAC(t) = 88.335, [unit = u"ppb", description = "HOCH2C(O)CH3; Hydroxyacetone"], + HBr(t) = 15.715, [unit = u"ppb", description = "HBr; Hypobromic acid"], + HC5A(t) = 44.638, [unit = u"ppb", description = "C5H8O2; Isoprene-4,1-hydroxyaldehyde"], + HCFC123(t) = 22.296, [unit = u"ppb", description = "C2HCl2F3; HCFC-123, R-123, Freon 123"], + HCFC141b(t) = 93.091, [unit = u"ppb", description = "C(CH3)Cl2F; HCFC-141b, R-141b, Freon 141b"], + HCFC142b(t) = 81.415, [unit = u"ppb", description = "C(CH3)ClF2; HCFC-142b, R-142b, Freon 142b"], + HCFC22(t) = 16.333, [unit = u"ppb", description = "CHClF2 ; HCFC-22, R-22, Freon 22"], + HCl(t) = 87.644, [unit = u"ppb", description = "HCl; Hydrochloric acid"], + HCOOH(t) = 99.489, [unit = u"ppb", description = "HCOOH; Formic acid"], + HI(t) = 68.377, [unit = u"ppb", description = "HI; Hydrogen iodide"], + HMHP(t) = 16.437, [unit = u"ppb", description = "HOCH2OOH; Hydroxymethyl hydroperoxide"], + HMML(t) = 33.654, [unit = u"ppb", description = "C4H6O3; Hydroxymethyl-methyl-a-lactone"], + HMS(t) = 54.099, [unit = u"ppb", description = "HOCH2SO3-; hydroxymethanesulfonate"], + HNO2(t) = 18.174, [unit = u"ppb", description = "HONO; Nitrous acid"], + HNO3(t) = 62.170, [unit = u"ppb", description = "HNO3; Nitric acid"], + HNO4(t) = 39.302, [unit = u"ppb", description = "HNO4; Pernitric acid"], + HO2(t) = 58.306, [unit = u"ppb", description = "HO2; Hydroperoxyl radical"], + HOBr(t) = 59.529, [unit = u"ppb", description = "HOBr; Hypobromous acid"], + HOCl(t) = 90.397, [unit = u"ppb", description = "HOCl; Hypochlorous acid"], + HOI(t) = 35.827, [unit = u"ppb", description = "HOI; Hypoiodous acid"], + HONIT(t) = 58.760, [unit = u"ppb", description = "2nd gen monoterpene organic nitrate"], + HPALD1(t) = 73.164, [unit = u"ppb", description = "O=CHC(CH3)=CHCH2OOH; d-4,1-C5-hydroperoxyaldehyde"], + HPALD1OO(t) = 34.759, [unit = u"ppb", description = "peroxy radicals from HPALD1"], + HPALD2(t) = 1.0291, [unit = u"ppb", description = "HOOCH2C(CH3)=CHCH=O; d-1,4-C5-hydroperoxyaldehyde"], + HPALD2OO(t) = 28.332, [unit = u"ppb", description = "peroxy radicals from HPALD2"], + HPALD3(t) = 91.404, [unit = u"ppb", description = "O=CHC(CH3)OOHCH=CH2; b-2,1-C5-hydroperoxyaldehyde"], + HPALD4(t) = 14.949, [unit = u"ppb", description = "CH2=C(CH3)CHOOHCH=O; b-3,4-C5-hydroperoxyaldehyde"], + HPETHNL(t) = 90.330, [unit = u"ppb", description = "CHOCH2OOH; hydroperoxyethanal"], + I(t) = 85.092, [unit = u"ppb", description = "I; Atmoic iodine"], + I2(t) = 49.639, [unit = u"ppb", description = "I2; Molecular iodine"], + I2O2(t) = 70.687, [unit = u"ppb", description = "I2O2; Diiodine dioxide"], + I2O3(t) = 85.950, [unit = u"ppb", description = "I2O3; Diiodine trioxide"], + I2O4(t) = 36.304, [unit = u"ppb", description = "I2O4; Diiodine tetraoxide"], + IBr(t) = 46.529, [unit = u"ppb", description = "IBr; Iodine monobromide"], + ICHE(t) = 17.739, [unit = u"ppb", description = "C5H8O3; Isoprene hydroxy-carbonyl-epoxides"], + ICHOO(t) = 75.448, [unit = u"ppb", description = "peroxy radical from IEPOXD"], + ICl(t) = 32.124, [unit = u"ppb", description = "ICl; Iodine monochloride"], + ICN(t) = 22.128, [unit = u"ppb", description = "C5H7NO4; Lumped isoprene carbonyl nitrates"], + ICNOO(t) = 12.649, [unit = u"ppb", description = "peroxy radicals from ICN"], + ICPDH(t) = 71.736, [unit = u"ppb", description = "C5H10O5; Isoprene dihydroxy hydroperoxycarbonyl"], + IDC(t) = 28.840, [unit = u"ppb", description = "C5H6O2; Lumped isoprene dicarbonyls"], + IDCHP(t) = 2.3035, [unit = u"ppb", description = "C5H8O5; Isoprene dicarbonyl hydroxy dihydroperoxide"], + IDHDP(t) = 21.649, [unit = u"ppb", description = "C5H12O6; Isoprene dihydroxy dihydroperoxide"], + IDHNBOO(t) = 25.086, [unit = u"ppb", description = "peroxy radicals from INPB"], + IDHNDOO1(t) = 15.276, [unit = u"ppb", description = "peroxy radicals from INPD"], + IDHNDOO2(t) = 61.961, [unit = u"ppb", description = "peroxy radicals from INPD"], + IDHPE(t) = 94.216, [unit = u"ppb", description = "C5H10O5; Isoprene dihydroxy hydroperoxy epoxide"], + IDN(t) = 13.328, [unit = u"ppb", description = "C5H8N2O6; Lumped isoprene dinitrates"], + IDNOO(t) = 44.188, [unit = u"ppb", description = "peroxy radicals from IDN"], + IEPOXA(t) = 60.554, [unit = u"ppb", description = "C5H10O3; trans-Beta isoprene epoxydiol"], + IEPOXAOO(t) = 27.948, [unit = u"ppb", description = "peroxy radical from trans-Beta isoprene epoxydiol"], + IEPOXB(t) = 38.609, [unit = u"ppb", description = "C5H10O3; cis-Beta isoprene epoxydiol"], + IEPOXBOO(t) = 87.094, [unit = u"ppb", description = "peroxy radical from cis-Beta isoprene epoxydiol"], + IEPOXD(t) = 8.0346, [unit = u"ppb", description = "C5H10O3; Delta isoprene epoxydiol"], + IHN1(t) = 11.028, [unit = u"ppb", description = "C5H9NO4; Isoprene-d-4-hydroxy-1-nitrate"], + IHN2(t) = 71.286, [unit = u"ppb", description = "C5H9NO4; Isoprene-b-1-hydroxy-2-nitrate"], + IHN3(t) = 82.443, [unit = u"ppb", description = "C5H9NO4; Isoprene-b-4-hydroxy-3-nitrate"], + IHN4(t) = 91.975, [unit = u"ppb", description = "C5H9NO4; Isoprene-d-1-hydroxy-4-nitrate"], + IHOO1(t) = 27.517, [unit = u"ppb", description = "peroxy radical from OH addition to isoprene at C1"], + IHOO4(t) = 51.624, [unit = u"ppb", description = "peroxy radical from OH addition to isoprene at C4"], + IHPNBOO(t) = 66.363, [unit = u"ppb", description = "peroxy radicals from INPB"], + IHPNDOO(t) = 63.447, [unit = u"ppb", description = "peroxy radicals from INPD"], + IHPOO1(t) = 79.476, [unit = u"ppb", description = "peroxy radical from ISOPOOH"], + IHPOO2(t) = 58.328, [unit = u"ppb", description = "peroxy radical from ISOPOOH"], + IHPOO3(t) = 5.9515, [unit = u"ppb", description = "peroxy radical from ISOPOOH"], + INA(t) = 26.490, [unit = u"ppb", description = "alkoxy radical from INO2D"], + INDIOL(t) = 52.424, [unit = u"ppb", description = "Generic aerosol phase organonitrate hydrolysis product"], + INO(t) = 73.106, [unit = u"ppb", description = "INO; Nitrosyl iodide"], + INO2B(t) = 25.723, [unit = u"ppb", description = "beta-peroxy radicals from isoprene + NO3"], + INO2D(t) = 30.524, [unit = u"ppb", description = "delta-peroxy radicals from isoprene + NO3"], + INPB(t) = 96.224, [unit = u"ppb", description = "C5H9NO5; Lumped isoprene beta-hydroperoxy nitrates"], + INPD(t) = 80.193, [unit = u"ppb", description = "C5H9NO5; Lumped isoprene delta-hydroperoxy nitrates"], + IO(t) = 26.615, [unit = u"ppb", description = "IO; Iodine monoxide"], + IONITA(t) = 25.539, [unit = u"ppb", description = "Aerosol-phase organic nitrate from isoprene precursors"], + IONO(t) = 56.756, [unit = u"ppb", description = "IONO; Nitryl iodide"], + IONO2(t) = 53.992, [unit = u"ppb", description = "IONO2; Iodine nitrate"], + IPRNO3(t) = 22.638, [unit = u"ppb", description = "C3H8ONO2; Isopropyl nitrate"], + ISALA(t) = 79.006, [unit = u"ppb", description = "I; Fine sea salt iodine"], + ISALC(t) = 13.184, [unit = u"ppb", description = "I; Coarse sea salt iodine"], + ISOP(t) = 83.240, [unit = u"ppb", description = "CH2=C(CH3)CH=CH2; Isoprene"], + ISOPNOO1(t) = 60.043, [unit = u"ppb", description = "peroxy radicals from IHN2"], + ISOPNOO2(t) = 71.160, [unit = u"ppb", description = "peroxy radicals from IHN3"], + ITCN(t) = 26.206, [unit = u"ppb", description = "C5H9NO7; Lumped tetrafunctional isoprene carbonyl-nitrates"], + ITHN(t) = 11.572, [unit = u"ppb", description = "C5H11NO7; Lumped tetrafunctional isoprene hydroxynitrates"], + KO2(t) = 84.868, [unit = u"ppb", description = "RO2 from >3 ketones"], + LBRO2H(t) = 61.633, [unit = u"ppb", description = "Dummy spc to track oxidation of BRO2 by HO2"], + LBRO2N(t) = 11.255, [unit = u"ppb", description = "Dummy spc to track oxidation of BRO2 by NO"], + LIMO(t) = 53.446, [unit = u"ppb", description = "C10H16; Limonene"], + LIMO2(t) = 92.794, [unit = u"ppb", description = "RO2 from LIMO"], + LISOPOH(t) = 92.199, [unit = u"ppb", description = "Dummy spc to track oxidation of ISOP by OH"], + LISOPNO3(t) = 29.918, [unit = u"ppb", description = "Dummy spc to track oxidation of ISOP by NO3"], + LNRO2H(t) = 29.939, [unit = u"ppb", description = "Dummy spc to track oxidation of NRO2 by HO2"], + LNRO2N(t) = 57.661, [unit = u"ppb", description = "Dummy spc to track oxidation of NRO2 by NO"], + LTRO2H(t) = 46.441, [unit = u"ppb", description = "Dummy spc to track oxidation of TRO2 by HO2"], + LTRO2N(t) = 28.826, [unit = u"ppb", description = "Dummy spc to track oxidation of TRO2 by NO"], + LVOC(t) = 47.079, [unit = u"ppb", description = "C5H14O5; Gas-phase low-volatility non-IEPOX product of ISOPOOH (RIP) oxidation"], + LVOCOA(t) = 97.788, [unit = u"ppb", description = "C5H14O5; Aerosol-phase low-volatility non-IEPOX product of ISOPOOH (RIP) oxidation"], + LXRO2H(t) = 62.462, [unit = u"ppb", description = "Dummy spc to track oxidation of XRO2 by HO2"], + LXRO2N(t) = 39.337, [unit = u"ppb", description = "Dummy spc to track oxidation of XRO2 by NO"], + MACR(t) = 17.935, [unit = u"ppb", description = "CH2=C(CH3)CHO; Methacrolein"], + MACR1OO(t) = 91.114, [unit = u"ppb", description = "peroxyacyl radical from MACR + OH"], + MACR1OOH(t) = 61.547, [unit = u"ppb", description = "CH2=C(CH3)C(O)OOH; Peracid from MACR"], + MACRNO2(t) = 97.585, [unit = u"ppb", description = "Product of MCRHN + OH"], + MAP(t) = 61.421, [unit = u"ppb", description = "CH3C(O)OOH; Peroxyacetic acid"], + MCO3(t) = 0.6220, [unit = u"ppb", description = "CH3C(O)OO; Peroxyacetyl radical"], + MCRDH(t) = 23.756, [unit = u"ppb", description = "C4H8O3; Dihydroxy-MACR"], + MCRENOL(t) = 43.151, [unit = u"ppb", description = "C4H6O2; Lumped enols from MVK/MACR"], + MCRHN(t) = 5.5067, [unit = u"ppb", description = "HOCH2C(ONO2)(CH3)CHO; Hydroxynitrate from MACR"], + MCRHNB(t) = 2.8277, [unit = u"ppb", description = "O2NOCH2C(OH)(CH3)CHO; Hydroxynitrate from MACR"], + MCRHP(t) = 0.2048, [unit = u"ppb", description = "HOCH2C(OOH)(CH3)CHO; Hydroxy-hydroperoxy-MACR"], + MCROHOO(t) = 49.422, [unit = u"ppb", description = "peroxy radical from MACR + OH"], + MCT(t) = 77.753, [unit = u"ppb", description = "methylcatechols"], + MEK(t) = 61.732, [unit = u"ppb", description = "RC(O)R; Methyl ethyl ketone"], + MENO3(t) = 89.773, [unit = u"ppb", description = "CH3ONO2; methyl nitrate"], + MGLY(t) = 93.209, [unit = u"ppb", description = "CH3COCHO; Methylglyoxal"], + MO2(t) = 73.881, [unit = u"ppb", description = "CH3O2; Methylperoxy radical"], + MOH(t) = 55.585, [unit = u"ppb", description = "CH3OH; Methanol"], + MONITA(t) = 61.052, [unit = u"ppb", description = "Aerosol-phase organic nitrate from monoterpene precursors"], + MONITS(t) = 71.179, [unit = u"ppb", description = "Saturated 1st gen monoterpene organic nitrate"], + MONITU(t) = 23.294, [unit = u"ppb", description = "Unsaturated 1st gen monoterpene organic nitrate"], + MP(t) = 25.386, [unit = u"ppb", description = "CH3OOH; Methylhydroperoxide"], + MPAN(t) = 89.575, [unit = u"ppb", description = "CH2=C(CH3)C(O)OONO2; Peroxymethacroyl nitrate (PMN)"], + MPN(t) = 59.399, [unit = u"ppb", description = "CH3O2NO2; Methyl peroxy nitrate"], + MSA(t) = 82.711, [unit = u"ppb", description = "CH4SO3; Methanesulfonic acid"], + MTPA(t) = 25.413, [unit = u"ppb", description = "Lumped monoterpenes: a-pinene, b-pinene, sabinene, carene"], + MTPO(t) = 8.9141, [unit = u"ppb", description = "Other monoterpenes: Terpinene, terpinolene, myrcene, ocimene, other monoterpenes"], + MVK(t) = 62.109, [unit = u"ppb", description = "CH2=CHC(=O)CH3; Methyl vinyl ketone"], + MVKDH(t) = 97.635, [unit = u"ppb", description = "HOCH2CH2OHC(O)CH3; Dihydroxy-MVK"], + MVKHC(t) = 98.159, [unit = u"ppb", description = "C4H6O3; MVK hydroxy-carbonyl"], + MVKHCB(t) = 50.621, [unit = u"ppb", description = "C4H6O3; MVK hydroxy-carbonyl"], + MVKHP(t) = 35.334, [unit = u"ppb", description = "C4H8O4; MVK hydroxy-hydroperoxide"], + MVKN(t) = 48.570, [unit = u"ppb", description = "HOCH2CH(ONO2)C(=O)CH3; Hydroxynitrate from MVK"], + MVKOHOO(t) = 41.490, [unit = u"ppb", description = "peroxy radical from MVK + OH"], + MVKPC(t) = 8.2590, [unit = u"ppb", description = "OCHCH(OOH)C(O)CH3; MVK hydroperoxy-carbonyl"], + N(t) = 56.891, [unit = u"ppb", description = "N; Atomic nitrogen"], + N2O(t) = 50.751, [unit = u"ppb", description = "N2O; Nitrous oxide"], + N2O5(t) = 19.118, [unit = u"ppb", description = "N2O5; Dinitrogen pentoxide"], + NAP(t) = 33.270, [unit = u"ppb", description = "C10H8; Naphthalene; IVOC surrogate"], + NIT(t) = 77.088, [unit = u"ppb", description = "NIT; Fine mode inorganic nitrate"], + NITs(t) = 56.341, [unit = u"ppb", description = "NITs; Coarse mode inorganic nitrate"], + NO(t) = 54.454, [unit = u"ppb", description = "NO; Nitric oxide"], + NO2(t) = 5.5605, [unit = u"ppb", description = "NO2; Nitrogen dioxide"], + NO3(t) = 31.739, [unit = u"ppb", description = "NO3; Nitrate radical"], + NPHEN(t) = 87.002, [unit = u"ppb", description = "nitrophenols"], + NPRNO3(t) = 58.488, [unit = u"ppb", description = "C3H8ONO2; n-propyl nitrate"], + NRO2(t) = 83.618, [unit = u"ppb", description = "Peroxy radical from NAP oxidation"], + O(t) = 14.164, [unit = u"ppb", description = "O(3P); Ground state atomic oxygen"], + O1D(t) = 17.648, [unit = u"ppb", description = "O(1D); Excited atomic oxygen"], + O3(t) = 2.1326, [unit = u"ppb", description = "O3; Ozone"], + O3A(t) = 28.223, [unit = u"ppb", description = "O3; Ozone in accum seasalt"], + O3C(t) = 49.728, [unit = u"ppb", description = "O3; Ozone in coarse seasalt"], + OClO(t) = 60.037, [unit = u"ppb", description = "OClO; Chlorine dioxide"], + OCS(t) = 20.867, [unit = u"ppb", description = "COS; Carbonyl sulfide"], + OH(t) = 19.293, [unit = u"ppb", description = "OH; Hydroxyl radical"], + OIO(t) = 51.406, [unit = u"ppb", description = "OIO; Iodine dioxide"], + OLND(t) = 63.247, [unit = u"ppb", description = "Monoterpene-derived NO3-alkene adduct"], + OLNN(t) = 95.667, [unit = u"ppb", description = "Monoterpene-derived NO3 adduct"], + OTHRO2(t) = 74.722, [unit = u"ppb", description = "Other C2 RO2 not from C2H6 oxidation"], + PAN(t) = 59.945, [unit = u"ppb", description = "CH3C(O)OONO2; Peroxyacetylnitrate"], + PHEN(t) = 59.463, [unit = u"ppb", description = "phenol"], + PIO2(t) = 94.953, [unit = u"ppb", description = "RO2 from MTPA"], + PIP(t) = 96.809, [unit = u"ppb", description = "Peroxides from MTPA"], + PO2(t) = 25.827, [unit = u"ppb", description = "HOCH2CH(OO)CH3; RO2 from propene"], + PP(t) = 61.804, [unit = u"ppb", description = "HOCH2CH(OOH)CH3; Peroxide from PO2"], + PPN(t) = 94.436, [unit = u"ppb", description = "CH3CH2C(O)OONO2; Peroxypropionylnitrate"], + PRN1(t) = 87.618, [unit = u"ppb", description = "O2NOCH2CH(OO)CH3; RO2 from propene + NO3"], + PROPNN(t) = 33.842, [unit = u"ppb", description = "CH3C(=O)CH2ONO2; Propanone nitrate"], + PRPE(t) = 63.131, [unit = u"ppb", description = "C3H6; >= C3 alkenes"], + PRPN(t) = 43.083, [unit = u"ppb", description = "O2NOCH2CH(OOH)CH3; Peroxide from PRN1"], + PYAC(t) = 79.104, [unit = u"ppb", description = "CH3COCOOH; Pyruvic acid"], + R4N1(t) = 37.438, [unit = u"ppb", description = "RO2 from R4N2"], + R4N2(t) = 46.153, [unit = u"ppb", description = "RO2NO; >= C4 alkylnitrates"], + R4O2(t) = 36.162, [unit = u"ppb", description = "RO2 from ALK4"], + R4P(t) = 40.804, [unit = u"ppb", description = "CH3CH2CH2CH2OOH; Peroxide from R4O2"], + RA3P(t) = 57.025, [unit = u"ppb", description = "CH3CH2CH2OOH; Peroxide from A3O2"], + RB3P(t) = 72.421, [unit = u"ppb", description = "CH3CH(OOH)CH3; Peroxide from B3O2"], + RCHO(t) = 37.680, [unit = u"ppb", description = "CH3CH2CHO; >= C3 aldehydes"], + RCO3(t) = 63.108, [unit = u"ppb", description = "CH3CH2C(O)OO; Peroxypropionyl radical"], + RIPA(t) = 42.881, [unit = u"ppb", description = "HOCH2C(OOH)(CH3)CH=CH2; 1,2-ISOPOOH"], + RIPB(t) = 24.737, [unit = u"ppb", description = "HOCH2C(OOH)(CH3)CH=CH2; 4,3-ISOPOOH"], + RIPC(t) = 57.374, [unit = u"ppb", description = "C5H10O3; d(1,4)-ISOPOOH"], + RIPD(t) = 5.9941, [unit = u"ppb", description = "C5H10O3; d(4,1)-ISOPOOH"], + ROH(t) = 67.750, [unit = u"ppb", description = "C3H7OH; > C2 alcohols"], + RP(t) = 38.598, [unit = u"ppb", description = "CH3CH2C(O)OOH; Peroxide from RCO3"], + SALAAL(t) = 37.928, [unit = u"ppb", description = "Accumulation mode seasalt aerosol alkalinity"], + SALCAL(t) = 13.651, [unit = u"ppb", description = "Coarse mode seasalt aerosol alkalinity"], + SALACL(t) = 41.613, [unit = u"ppb", description = "Cl; Fine chloride"], + SALCCL(t) = 41.813, [unit = u"ppb", description = "Cl; Coarse chloride"], + SALASO2(t) = 46.971, [unit = u"ppb", description = "SO2; Fine seasalt"], + SALCSO2(t) = 98.028, [unit = u"ppb", description = "SO2; Coarse seasalt"], + SALASO3(t) = 18.107, [unit = u"ppb", description = "SO3--; Fine seasalt"], + SALCSO3(t) = 51.008, [unit = u"ppb", description = "SO3--; Coarse chloride"], + SO2(t) = 6.2180, [unit = u"ppb", description = "SO2; Sulfur dioxide"], + SO4(t) = 97.494, [unit = u"ppb", description = "SO4; Sulfate"], + SO4s(t) = 74.244, [unit = u"ppb", description = "SO4 on sea-salt; Sulfate"], + SOAGX(t) = 82.469, [unit = u"ppb", description = "CHOCHO; Aerosol-phase glyoxal"], + SOAIE(t) = 81.289, [unit = u"ppb", description = "C5H10O3; Aerosol-phase IEPOX"], + TOLU(t) = 58.265, [unit = u"ppb", description = "C7H8; Toluene"], + TRO2(t) = 10.659, [unit = u"ppb", description = "Peroxy radical from TOLU oxidation"], + XYLE(t) = 24.563, [unit = u"ppb", description = "C8H10; Xylene"], + XRO2(t) = 25.058, [unit = u"ppb", description = "Peroxy radical from XYLE oxidation"], + H2(t) = 97.924, [unit = u"ppb", description = "H2; Molecular hydrogen"], + N2(t) = 36.998, [unit = u"ppb", description = "N2; Molecular nitrogen"], + O2(t) = 51.201, [unit = u"ppb", description = "O2; Molecular oxygen"], + RCOOH(t) = 12.892, [unit = u"ppb", description = "C2H5C(O)OH; > C2 organic acids "], ) @parameters( T = 298.15, [unit = u"K", description = "Temperature"], - num_density = 2.7e19, [description = "Number density of air (The units should be molecules/cm^3 but the equations here treat it as unitless)."], k_mt1 = 0, [unit = u"mol/nmol", description = "Seasalt rate constant"], - k_mt2 = 0, [unit = u"mol/nmol", description = "Seasalt rate constant"], - k_mt3 = 0, [unit = u"mol/nmol", description = "Seasalt rate constant"], - k_mt4 = 0, [unit = u"mol/nmol", description = "Seasalt rate constant"], - k_mt5 = 0, [unit = u"mol/nmol", description = "Seasalt rate constant"], - k_mt6 = 0, [unit = u"mol/nmol", description = "Seasalt rate constant"], - k_cld1 = 0, [unit = u"mol/nmol", description = "Cloud rate constant"], - k_cld2 = 0, [unit = u"mol/nmol", description = "Cloud rate constant"], + num_density = 2.7e19, [description = "Number density of air (The units should be molecules/cm^3 but the equations here treat it as unitless)."], k_mt1 = 0, [unit = u"ppb^-1", description = "Seasalt rate constant"], + k_mt2 = 0, [unit = u"ppb^-1", description = "Seasalt rate constant"], + k_mt3 = 0, [unit = u"ppb^-1", description = "Seasalt rate constant"], + k_mt4 = 0, [unit = u"ppb^-1", description = "Seasalt rate constant"], + k_mt5 = 0, [unit = u"ppb^-1", description = "Seasalt rate constant"], + k_mt6 = 0, [unit = u"ppb^-1", description = "Seasalt rate constant"], + k_cld1 = 0, [unit = u"ppb^-1", description = "Cloud rate constant"], + k_cld2 = 0, [unit = u"ppb^-1", description = "Cloud rate constant"], k_cld3 = 0, [description = "Cloud rate constant (dimensionless)"], - k_cld4 = 0, [unit = u"mol/nmol", description = "HMS rate constant"], + k_cld4 = 0, [unit = u"ppb^-1", description = "HMS rate constant"], k_cld5 = 0, [description = "HMS rate constant (dimensionless)"], - k_cld6 = 0, [unit = u"mol/nmol", description = "HMS rate constant"], + k_cld6 = 0, [unit = u"ppb^-1", description = "HMS rate constant"], j_2 = 0, [description = "Photolysis rate constant"], j_3 = 0, [description = "Photolysis rate constant"], j_1 = 0, [description = "Photolysis rate constant"], diff --git a/src/geoschem_ratelaws.jl b/src/geoschem_ratelaws.jl index 36ef9834..c3707b7b 100644 --- a/src/geoschem_ratelaws.jl +++ b/src/geoschem_ratelaws.jl @@ -4,18 +4,18 @@ "Function to create a constant rate coefficient" -function constant_k(t, c; unit=u"mol/nmol", name=:constant_k) +function constant_k(t, c; unit=u"ppb^-1", name=:constant_k) @constants c = c, [unit = unit] - @variables k(t) [unit = u"mol/nmol"] + @variables k(t) [unit = u"ppb^-1"] NonlinearSystem([k ~ c], [k], []; name=name) end function regress_T(t, T, a_0, b_0, T_0; name=:acet_oh) T = ParentScope(T) @constants T_0 = T_0 [unit = u"K"] - @constants a_0 = a_0 [unit = u"mol/nmol"] - @constants b_0 = b_0 [unit = u"mol/nmol"] - @variables k(t) [unit = u"mol/nmol"] + @constants a_0 = a_0 [unit = u"ppb^-1"] + @constants b_0 = b_0 [unit = u"ppb^-1"] + @variables k(t) [unit = u"ppb^-1"] NonlinearSystem([k ~ a_0 + b_0 * exp(T_0 / T)], [k], []; name=name) end @@ -25,7 +25,7 @@ Arrhenius equation: k = a0 * exp( c0 / T ) * (T/300)^b0 ``` """ -function arrhenius(t, T, a0, b0, c0; unit=u"mol/nmol", name=:arrhenius) +function arrhenius(t, T, a0, b0, c0; unit=u"ppb^-1", name=:arrhenius) T = ParentScope(T) t = ParentScope(t) @constants( @@ -45,7 +45,7 @@ a2, b2, c2 are the Arrhenius parameters for the upper-limit rate. fv is the falloff curve paramter, (see ATKINSON ET. AL (1992) J. Phys. Chem. Ref. Data 21, P. 1145). Usually fv = 0.6. """ -function arr_3rdbody(t, T, num_density, a1, b1, c1, a2, b2, c2, fv; unit=u"mol/nmol", name=:arr_3rdbody) +function arr_3rdbody(t, T, num_density, a1, b1, c1, a2, b2, c2, fv; unit=u"ppb^-1", name=:arr_3rdbody) t = ParentScope(t) T = ParentScope(T) num_density = ParentScope(num_density) @@ -72,10 +72,10 @@ function rate_HO2HO2(t, T, num_density, H2O, a0, c0, a1, c1; name=:rate_HO2HO2) @named k1 = arrhenius(t, T, a1, 0.0, c1) @constants( T_0 = 2200.0, [unit = u"K"], - one = 1.0, [unit = u"nmol/mol"], - unit_conv = 1, [unit = u"mol/nmol"], + one = 1.0, [unit = u"ppb"], + unit_conv = 1, [unit = u"ppb^-1"], ) - @variables k(t) [unit = u"mol/nmol"] + @variables k(t) [unit = u"ppb^-1"] NonlinearSystem([k ~ unit_conv * (k0.k + k1.k * num_density) * (one + 1.4E-21 * H2O * exp(T_0 / T))], [k], []; systems=[k0, k1], name=name) end @@ -99,7 +99,7 @@ function rate_OHCO(t, T, num_density; name=:rate_OHCO) blog2 = log10(xyrat2) fexp2 = 1.0 / (1.0 + blog2 * blog2) kco2 = klo2.k * 0.6^fexp2 / (1.0 + xyrat2) - @variables k(t) [unit = u"mol/nmol"] + @variables k(t) [unit = u"ppb^-1"] NonlinearSystem([k ~ kco1 + kco2], [k], []; systems=[klo1, khi1, klo2, khi2], name=name) end @@ -121,10 +121,10 @@ in Fisher et al. 2018 function rate_RO2NO_a1(t, T, a0, c0; name=:rate_RO2NO_a1) T = ParentScope(T) @constants( - a0 = a0, [unit = u"mol/nmol"], + a0 = a0, [unit = u"ppb^-1"], c0 = c0, [unit = u"K"], ) - @variables k(t) [unit = u"mol/nmol"] + @variables k(t) [unit = u"ppb^-1"] NonlinearSystem([k ~ a0 * exp(c0 / T) * 3.0e-4], [k], []; name=name) end @@ -141,11 +141,11 @@ Reaction rate for the "B" branch of these RO2 + NO reactions: function rate_RO2NO_b1(t, T, a0, c0; name=:rate_RO2NO_b1) T = ParentScope(T) @constants( - a0 = a0, [unit = u"mol/nmol"], + a0 = a0, [unit = u"ppb^-1"], c0 = c0, [unit = u"K"], fyrno3 = 3.0e-4, ) - @variables k(t) [unit = u"mol/nmol"] + @variables k(t) [unit = u"ppb^-1"] NonlinearSystem([k ~ a0 * exp(c0 / T) * (1 - fyrno3)], [k], []; name=name) end @@ -161,8 +161,8 @@ function rate_RO2NO_a2(t, T, num_density, a0, c0, a1; name=:rate_RO2NO_a2) T = ParentScope(T) num_density = ParentScope(num_density) @constants( - one_ppb = 1.0, [unit = u"nmol/mol"], - inv_ppb = 1.0, [unit = u"mol/nmol"], + one_ppb = 1.0, [unit = u"ppb"], + inv_ppb = 1.0, [unit = u"ppb^-1"], ) @named k0 = arrhenius(t, T, a0, 0, c0) xxyn = 1.94e-22 * exp(0.97 * a1) * num_density @@ -171,7 +171,7 @@ function rate_RO2NO_a2(t, T, num_density, a0, c0, a1; name=:rate_RO2NO_a2) zzyn = (1.0 / (1.0 + (aaa * aaa))) rarb = (xxyn / (one_ppb + (xxyn / yyyn.k))) * (0.411^zzyn) fyrno3 = (rarb / (inv_ppb + rarb)) - @variables k(t) [unit = u"mol/nmol"] + @variables k(t) [unit = u"ppb^-1"] NonlinearSystem([k ~ k0.k * fyrno3], [k], []; systems=[k0, yyyn], name=name) end @@ -189,8 +189,8 @@ function rate_RO2NO_b2(t, T, num_density, a0, c0, a1; name=:rate_RO2NO_b2) T = ParentScope(T) num_density = ParentScope(num_density) @constants( - one_ppb = 1.0, [unit = u"nmol/mol"], - inv_ppb = 1.0, [unit = u"mol/nmol"], + one_ppb = 1.0, [unit = u"ppb"], + inv_ppb = 1.0, [unit = u"ppb^-1"], ) @named k0 = arrhenius(t, T, a0, 0.0, c0) xxyn = 1.94e-22 * exp(0.97 * a1) * num_density @@ -199,7 +199,7 @@ function rate_RO2NO_b2(t, T, num_density, a0, c0, a1; name=:rate_RO2NO_b2) zzyn = (1.0 / (1.0 + (aaa * aaa))) rarb = (xxyn / (one_ppb + (xxyn / yyyn.k))) * (0.411^zzyn) fyrno3 = (rarb / (inv_ppb + rarb)) - @variables k(t) [unit = u"mol/nmol"] + @variables k(t) [unit = u"ppb^-1"] NonlinearSystem([k ~ k0.k * (1.0 - fyrno3)], [k], []; systems=[k0, yyyn], name=name) end @@ -208,10 +208,10 @@ Temperature Dependent Branching Ratio """ function tbranch(t, T, a0, b0, c0, a1, b1, c1; name=:tbranch) T = ParentScope(T) - @constants unit_conv = 1, [unit = u"nmol/mol"] + @constants unit_conv = 1, [unit = u"ppb"] @named k0 = arrhenius(t, T, a0, b0, c0) @named k1 = arrhenius(t, T, a1, b1, c1) - @variables k(t) [unit = u"mol/nmol"] + @variables k(t) [unit = u"ppb^-1"] NonlinearSystem([k ~ k0.k / (1.0 + unit_conv * k1.k)], [k], []; systems=[k0, k1], name=name) end @@ -228,7 +228,7 @@ function rate_OHHNO3(t, T, num_density, a0, c0, a1, c1, a2, c2; name=:rate_OHHNO @named k1 = arrhenius(t, T, a1, 0, c1) @named k1_5 = arrhenius(t, T, a2, 0, c2) k2 = num_density * k1_5.k - @variables k(t) [unit = u"mol/nmol"] + @variables k(t) [unit = u"ppb^-1"] NonlinearSystem([k ~ k0.k + k2 / (1.0 + k2 / k1.k)], [k], []; systems=[k0, k1, k1_5], name=name) end @@ -243,7 +243,7 @@ Used to compute the rate for these reactions: ClOO {+M} = Cl + O2 {+M} Cl2O2 {+M} = 2ClO {+M} """ -function eq_const(t, T, num_density, a0, c0, a1, b1, a2, b2, fv; unit=u"mol/nmol", name=:eq_const) +function eq_const(t, T, num_density, a0, c0, a1, b1, a2, b2, fv; unit=u"ppb^-1", name=:eq_const) T = ParentScope(T) num_density = ParentScope(num_density) @constants unit_conv = 1, [unit = unit] @@ -264,7 +264,7 @@ Carbon Dependence of RO2+HO2, used in these reactions: function rate_RO2HO2(t, T, a0, c0, a1; name=:rate_RO2HO2) T = ParentScope(T) @named k0 = arrhenius(t, T, a0, 0, c0) - @variables k(t) [unit = u"mol/nmol"] + @variables k(t) [unit = u"ppb^-1"] NonlinearSystem([k ~ k0.k * (1.0 - exp(-0.245 * a1))], [k], []; systems=[k0], name=name) end @@ -280,11 +280,11 @@ Used to compute the rate for this reaction: """ function rate_GLYCOH_a(t, T, a0; name=:rate_GLYCOH_a) T = ParentScope(T) - @constants a0 = a0, [unit = u"mol/nmol"] + @constants a0 = a0, [unit = u"ppb^-1"] @constants exp_arg = -1.0 / 73.0 [unit = u"K^-1"] glyc_frac = 1.0 - 11.0729 * exp(exp_arg * T) glyc_frac = max(glyc_frac, 0.0) - @variables k(t) [unit = u"mol/nmol"] + @variables k(t) [unit = u"ppb^-1"] NonlinearSystem([k ~ a0 * glyc_frac], [k], []; name=name) end @@ -299,11 +299,11 @@ Used to compute the rate for this reaction: """ function rate_GLYCOH_b(t, T, a0; name=:rate_GLYCOH_b) T = ParentScope(T) - @constants a0 = a0, [unit = u"mol/nmol"] + @constants a0 = a0, [unit = u"ppb^-1"] @constants exp_arg = -1.0 / 73.0 [unit = u"K^-1"] glyc_frac = 1.0 - 11.0729 * exp(exp_arg * T) glyc_frac = max(glyc_frac, 0.0) - @variables k(t) [unit = u"mol/nmol"] + @variables k(t) [unit = u"ppb^-1"] NonlinearSystem([k ~ a0 * (1.0 - glyc_frac)], [k], []; name=name) end @@ -318,7 +318,7 @@ function rate_HACOH_a(t, T, a0, c0; name=:rate_HACOH_a) k0 = arrhenius(t, T, a0, 0, c0) hac_frac = 1.0 - 23.7 * exp(exp_arg * T) hac_frac = max(hac_frac, 0.0) - @variables k(t) [unit = u"mol/nmol"] + @variables k(t) [unit = u"ppb^-1"] NonlinearSystem([k ~ k0.k * hac_frac], [k], []; systems=[k0], name=name) end @@ -333,7 +333,7 @@ function rate_HACOH_b(t, T, a0, c0; name=:rate_HACOH_b) k0 = arrhenius(t, T, a0, 0, c0) hac_frac = 1.0 - 23.7 * exp(exp_arg * T) hac_frac = max(hac_frac, 0.0) - @variables k(t) [unit = u"mol/nmol"] + @variables k(t) [unit = u"ppb^-1"] NonlinearSystem([k ~ k0.k * (1.0 - hac_frac)], [k], []; systems=[k0], name=name) end @@ -344,11 +344,11 @@ Reaction rate for: function rate_DMSOH(t, T, num_density, a0, c0, a1, c1; name=:rate_DMSOH) T = ParentScope(T) num_density = ParentScope(num_density) - @constants unit_conv = 1, [unit = u"mol/nmol"] - @constants c2 = 0.2095e0, [unit = u"nmol/mol"] + @constants unit_conv = 1, [unit = u"ppb^-1"] + @constants c2 = 0.2095e0, [unit = u"ppb"] @named k0 = arrhenius(t, T, a0, 0, c0) @named k1 = arrhenius(t, T, a1, 0, c1) - @variables k(t) [unit = u"mol/nmol"] + @variables k(t) [unit = u"ppb^-1"] NonlinearSystem([k ~ unit_conv * (k0.k * num_density * c2) / (1.0 + k1.k * c2)], [k], []; systems=[k0, k1], name=name) end @@ -364,14 +364,14 @@ function rate_GLYXNO3(t, T, num_density, a0, c0; name=:rate_GLYXNO3) num_density = ParentScope(num_density) O2 = num_density * 0.2095 @named k0 = arrhenius(t, T, a0, 0, c0) - @variables k(t) [unit = u"mol/nmol"] + @variables k(t) [unit = u"ppb^-1"] NonlinearSystem([k ~ k0.k * (O2 + 3.5E+18) / (2.0 * O2 + 3.5E+18)], [k], []; systems=[k0], name=name) end """ Modified Arrhenius law. """ -function arrplus(t, T, a0, b0, c0, d0, e0; unit=u"mol/nmol", name=:arrplus) +function arrplus(t, T, a0, b0, c0, d0, e0; unit=u"ppb^-1", name=:arrplus) T = ParentScope(T) @constants( K_300 = 300, [unit = u"K"], @@ -389,7 +389,7 @@ Used to compute the rate for these reactions: IHOO1 = 1.5OH + ... IHOO4 = 1.5OH + ... """ -function tunplus(t, T, a0, b0, c0, d0, e0; unit=u"mol/nmol", name=:tunplus) +function tunplus(t, T, a0, b0, c0, d0, e0; unit=u"ppb^-1", name=:tunplus) T = ParentScope(T) @constants( a0 = a0, [unit = unit], @@ -412,7 +412,7 @@ function rate_ISO1(t, T, a0, b0, c0, d0, e0, f0, g0; name=:rate_ISO1) T = ParentScope(T) @constants( ct = 1.0E8, [unit = u"K^3"], - a0 = a0, [unit = u"mol/nmol"], + a0 = a0, [unit = u"ppb^-1"], b0 = b0, [unit = u"K"], e0 = e0, [unit = u"K"], g0 = g0, [unit = u"K"], @@ -420,7 +420,7 @@ function rate_ISO1(t, T, a0, b0, c0, d0, e0, f0, g0; name=:rate_ISO1) k0 = d0 * exp(e0 / T) * exp(ct / T^3) k1 = f0 * exp(g0 / T) k2 = c0 * k0 / (k0 + k1) - @variables k(t) [unit = u"mol/nmol"] + @variables k(t) [unit = u"ppb^-1"] NonlinearSystem([k ~ a0 * exp(b0 / T) * (1.0 - k2)], [k], []; name=name) end @@ -437,7 +437,7 @@ function rate_ISO2(t, T, a0, b0, c0, d0, e0, f0, g0; name=:rate_ISO2) T = ParentScope(T) @constants( ct = 1.0E8, [unit = u"K^3"], - a0 = a0, [unit = u"mol/nmol"], + a0 = a0, [unit = u"ppb^-1"], b0 = b0, [unit = u"K"], e0 = e0, [unit = u"K"], g0 = g0, [unit = u"K"], @@ -445,7 +445,7 @@ function rate_ISO2(t, T, a0, b0, c0, d0, e0, f0, g0; name=:rate_ISO2) k0 = d0 * exp(e0 / T) * exp(ct / T^3) k1 = f0 * exp(g0 / T) k2 = c0 * k0 / (k0 + k1) - @variables k(t) [unit = u"mol/nmol"] + @variables k(t) [unit = u"ppb^-1"] NonlinearSystem([k ~ a0 * exp(b0 / T) * k2], [k], []; name=name) end @@ -468,13 +468,13 @@ function rate_EPO(t, T, num_density, a1, e1, m1; name=:rate_EPO) T = ParentScope(T) num_density = ParentScope(num_density) @constants e1 = e1, [unit = u"K"] - @constants a1 = a1, [unit = u"mol/nmol"] + @constants a1 = a1, [unit = u"ppb^-1"] k1 = 1.0 / (m1 * num_density + 1.0) - @variables k(t) [unit = u"mol/nmol"] + @variables k(t) [unit = u"ppb^-1"] NonlinearSystem([k ~ a1 * exp(e1 / T) * k1], [k], []; name=name) end -function rate_PAN_abab(t, T, num_density, a0, b0, a1, b1, cf; unit=u"mol/nmol", name=:rate_PAN_abab) +function rate_PAN_abab(t, T, num_density, a0, b0, a1, b1, cf; unit=u"ppb^-1", name=:rate_PAN_abab) T = ParentScope(T) num_density = ParentScope(num_density) @constants( @@ -498,8 +498,8 @@ function rate_PAN_acac(t, T, num_density, a0, c0, a1, c1, cf; name=:rate_PAN_aca num_density = ParentScope(num_density) @constants( K_300 = 300, [unit = u"K"], - a0 = a0, [unit = u"mol/nmol"], - a1 = a1, [unit = u"mol/nmol"], + a0 = a0, [unit = u"ppb^-1"], + a1 = a1, [unit = u"ppb^-1"], ) k0 = a0 * (T / K_300)^c0 k1 = a1 * (T / K_300)^c1 @@ -507,7 +507,7 @@ function rate_PAN_acac(t, T, num_density, a0, c0, a1, c1, cf; name=:rate_PAN_aca kr = k0 / k1 nc = 0.75 - 1.27 * (log10(cf)) f = 10.0^(log10(cf) / (1.0 + (log10(kr) / nc)^2)) - @variables k(t) [unit = u"mol/nmol"] + @variables k(t) [unit = u"ppb^-1"] NonlinearSystem([k ~ k0 * k1 * f / (k0 + k1)], [k], []; name=name) end @@ -537,7 +537,7 @@ function rate_NIT(t, T, num_density, a0, b0, c0, n, x0, y0; name=:rate_NIT) num_density = ParentScope(num_density) @constants( T_298 = 298.0, [unit = u"K"], - a0 = a0, [unit = u"mol/nmol"], + a0 = a0, [unit = u"ppb^-1"], b0 = b0, [unit = u"K"], y0 = y0, [unit = u"K^-1"], ) @@ -549,7 +549,7 @@ function rate_NIT(t, T, num_density, a0, b0, c0, n, x0, y0; name=:rate_NIT) k3 = k2 / (k2 + c0) k4 = a0 * (x0 - T * y0) kx = k4 * exp(b0 / T) * k3 - @variables k(t) [unit = u"mol/nmol"] + @variables k(t) [unit = u"ppb^-1"] NonlinearSystem([k ~ max(kx, 0.0)], [k], []; name=name) end @@ -581,7 +581,7 @@ function rate_ALK(t, T, num_density, a0, b0, c0, n, x0, y0; name=:rate_ALK) num_density = ParentScope(num_density) @constants( T_298 = 298.0, [unit = u"K"], - a0 = a0, [unit = u"mol/nmol"], + a0 = a0, [unit = u"ppb^-1"], b0 = b0, [unit = u"K"], y0 = y0, [unit = u"K^-1"], ) @@ -593,6 +593,6 @@ function rate_ALK(t, T, num_density, a0, b0, c0, n, x0, y0; name=:rate_ALK) k3 = c0 / (k2 + c0) k4 = a0 * (x0 - T * y0) kx = k4 * exp(b0 / T) * k3 - @variables k(t) [unit = u"mol/nmol"] + @variables k(t) [unit = u"ppb^-1"] NonlinearSystem([k ~ max(kx, 0.0)], [k], []; name=name) end \ No newline at end of file diff --git a/test/EarthSciData_test.jl b/test/EarthSciData_test.jl index 116c018c..b766a60e 100644 --- a/test/EarthSciData_test.jl +++ b/test/EarthSciData_test.jl @@ -1,18 +1,17 @@ using Main.GasChem, EarthSciData -using Test, Dates, ModelingToolkit, DifferentialEquations, EarthSciMLBase, Unitful +using Test, Dates, ModelingToolkit, DifferentialEquations, EarthSciMLBase, DynamicQuantities @testset "NEI2016Extension3way" begin - @parameters t [unit = u"s"] @parameters lat = 40 @parameters lon = -97 @parameters lev = 1 - emis = NEI2016MonthlyEmis("mrggrid_withbeis_withrwc", t, lon, lat, lev; dtype=Float64) + emis = NEI2016MonthlyEmis("mrggrid_withbeis_withrwc", lon, lat, lev; dtype=Float64) - model_3way = couple(FastJX(t), SuperFast(t), emis) + model_3way = couple(FastJX(), SuperFast(), emis) - sys = structural_simplify(get_mtk(model_3way)) - @test length(states(sys)) ≈ 18 + sys = structural_simplify(convert(ODESystem, model_3way)) + @test length(unknowns(sys)) ≈ 18 eqs = string(equations(sys)) wanteq = "Differential(t)(SuperFast₊CH2O(t)) ~ SuperFast₊NEI2016MonthlyEmis_FORM(t)" @@ -21,19 +20,18 @@ end @testset "GEOS-FP" begin - @parameters t [unit = u"s"] @parameters lat = 40 @parameters lon = -97 @parameters lev = 1 - geosfp = GEOSFP("4x5", t) + geosfp = GEOSFP("4x5") - model_3way = couple(FastJX(t), SuperFast(t), geosfp) + model_3way = couple(FastJX(), SuperFast(), geosfp) - sys = structural_simplify(get_mtk(model_3way)) - @test length(states(sys)) ≈ 18 + sys = structural_simplify(convert(ODESystem, model_3way)) + @test length(unknowns(sys)) ≈ 18 - eqs = string(equations(get_mtk(model_3way))) + eqs = string(equations(convert(ODESystem, model_3way))) wanteq = "SuperFast₊T(t) ~ GEOSFP₊I3₊T(t)" @test contains(eqs, wanteq) wanteq = "FastJX₊T(t) ~ GEOSFP₊I3₊T(t)" diff --git a/test/compose_fastjx_superfast_test.jl b/test/compose_fastjx_superfast_test.jl index 0a8e289c..b6119f53 100644 --- a/test/compose_fastjx_superfast_test.jl +++ b/test/compose_fastjx_superfast_test.jl @@ -1,14 +1,15 @@ using GasChem using EarthSciMLBase -using DifferentialEquations, ModelingToolkit, Unitful +using DifferentialEquations, ModelingToolkit, DynamicQuantities +using ModelingToolkit:t # Unit Test @testset "2wayCoupling" begin sol_middle = 9.948004877573444 - @parameters t [unit = u"s"] - sf = couple(SuperFast(t), FastJX(t)) - sys = structural_simplify(get_mtk(sf)) + sf = couple(SuperFast(), FastJX()) + combined_mtk = convert(ODESystem, sf) + sys = structural_simplify(combined_mtk) tspan = (0.0, 3600 * 24) sol = solve( ODEProblem(sys, [], tspan, []), diff --git a/test/geoschem_test.jl b/test/geoschem_test.jl index 527440da..dcce6a37 100644 --- a/test/geoschem_test.jl +++ b/test/geoschem_test.jl @@ -1,11 +1,10 @@ using Main.GasChem using EarthSciMLBase using Test -using DifferentialEquations, ModelingToolkit, Unitful +using DifferentialEquations, ModelingToolkit, DynamicQuantities tspan = (0.0, 360.0) -@parameters t [unit = u"s"] -sys = GEOSChemGasPhase(t) +sys = GEOSChemGasPhase() sys = structural_simplify(sys) # Unit Test 0: Base case @@ -21,7 +20,7 @@ sys = structural_simplify(sys) ] vals = ModelingToolkit.get_defaults(sys) - for k in setdiff(states(sys),keys(vals)) + for k in setdiff(unknowns(sys),keys(vals)) vals[k] = 0 # Set variables with no default to zero. end prob = ODEProblem(sys, vals, tspan, vals) @@ -37,7 +36,7 @@ end u_1 = 1.7279825730298626e-5 vals = ModelingToolkit.get_defaults(sys) - for k in setdiff(states(sys),keys(vals)) + for k in setdiff(unknowns(sys),keys(vals)) vals[k] = 0 # Set variables with no default to zero. end @unpack O3, O1D = sys @@ -56,7 +55,7 @@ end u_2 = 5.209463225241961e-7 vals = ModelingToolkit.get_defaults(sys) - for k in setdiff(states(sys),keys(vals)) + for k in setdiff(unknowns(sys),keys(vals)) vals[k] = 0 # Set variables with no default to zero. end @unpack O3, OH = sys @@ -75,7 +74,7 @@ end u_3 = 1.8946337831948767e-9 vals = ModelingToolkit.get_defaults(sys) - for k in setdiff(states(sys),keys(vals)) + for k in setdiff(unknowns(sys),keys(vals)) vals[k] = 0 # Set variables with no default to zero. end @unpack O3, NO2 = sys @@ -94,7 +93,7 @@ end u_4 = -6.469934550779044e-6 vals = ModelingToolkit.get_defaults(sys) - for k in setdiff(states(sys),keys(vals)) + for k in setdiff(unknowns(sys),keys(vals)) vals[k] = 0 # Set variables with no default to zero. end @unpack O3, HO2 = sys @@ -109,10 +108,10 @@ end end @testset "Compose GEOSChem FastJX" begin - gc = GEOSChemGasPhase(t) - fjx = FastJX(t) + gc = GEOSChemGasPhase() + fjx = FastJX() gf = couple(gc, fjx) - gf = get_mtk(gf) + gf = convert(ODESystem, gf) structural_simplify(gf) diff --git a/test/superfast_test.jl b/test/superfast_test.jl index bfbbd3a5..cb934f96 100644 --- a/test/superfast_test.jl +++ b/test/superfast_test.jl @@ -1,13 +1,12 @@ using GasChem -using DifferentialEquations, ModelingToolkit, Unitful +using DifferentialEquations, ModelingToolkit, DynamicQuantities tspan = (0.0, 360.0) @testset "Base case" begin answer = 18.861830827565885 - @parameters t [unit = u"s"] - rs = structural_simplify(SuperFast(t)) + rs = structural_simplify(SuperFast()) sol = solve( ODEProblem(rs, [], tspan, []), Tsit5(), @@ -22,8 +21,7 @@ end @testset "DMS sensitivity" begin u_dms = 0.8842096169345286 - @parameters t [unit = u"s"] - rs1 = structural_simplify(SuperFast(t)) + rs1 = structural_simplify(SuperFast()) o1 = solve( ODEProblem(rs1, [rs1.DMS => 76], tspan, []), Tsit5(), @@ -31,7 +29,7 @@ end abstol=1e-12, reltol=1e-12, ) - rs2 = structural_simplify(SuperFast(t)) + rs2 = structural_simplify(SuperFast()) o2 = solve( ODEProblem(rs2, [rs2.DMS => 46], tspan, []), Tsit5(), @@ -47,8 +45,7 @@ end @testset "ISOP sensitivity" begin u_isop = 0.19386790460198 - @parameters t [unit = u"s"] - rs1 = structural_simplify(SuperFast(t)) + rs1 = structural_simplify(SuperFast()) o1 = solve( ODEProblem(rs1, [rs1.ISOP => 0.54], tspan, []), Tsit5(), @@ -56,7 +53,7 @@ end abstol=1e-12, reltol=1e-12, ) - rs2 = structural_simplify(SuperFast(t)) + rs2 = structural_simplify(SuperFast()) o2 = solve( ODEProblem(rs2, [rs2.ISOP => 0.13], tspan, []), Tsit5(), @@ -72,8 +69,7 @@ end @testset "NO2 sensitivity" begin u_no2 = 45.85359224356945 - @parameters t [unit = u"s"] - rs1 = structural_simplify(SuperFast(t)) + rs1 = structural_simplify(SuperFast()) o1 = solve( ODEProblem( rs1, @@ -87,7 +83,7 @@ end abstol=1e-12, reltol=1e-12, ) - rs2 = structural_simplify(SuperFast(t)) + rs2 = structural_simplify(SuperFast()) o2 = solve( ODEProblem(rs2, [rs2.DMS => 0.1], tspan, []), Tsit5(), @@ -103,8 +99,7 @@ end @testset "CO sensitivity" begin u_co = -0.1938631791778107 - @parameters t [unit = u"s"] - rs1 = structural_simplify(SuperFast(t)) + rs1 = structural_simplify(SuperFast()) o1 = solve( ODEProblem(rs1, [rs1.CO => 50.0], tspan, []), Tsit5(), @@ -112,7 +107,7 @@ end abstol=1e-12, reltol=1e-12, ) - rs2 = structural_simplify(SuperFast(t)) + rs2 = structural_simplify(SuperFast()) o2 = solve( ODEProblem(rs2, [rs2.CO => 500.0], tspan, []), Tsit5(), @@ -128,8 +123,7 @@ end @testset "CH4 sensitivity" begin u_ch4 = 0.006664852234028018 - @parameters t [unit = u"s"] - rs1 = structural_simplify(SuperFast(t)) + rs1 = structural_simplify(SuperFast()) o1 = solve( ODEProblem(rs1, [rs1.CH4 => 1900.0], tspan, []), Tsit5(), @@ -137,7 +131,7 @@ end abstol=1e-12, reltol=1e-12, ) - rs2 = structural_simplify(SuperFast(t)) + rs2 = structural_simplify(SuperFast()) o2 = solve( ODEProblem(rs2, [rs2.CH4 => 1600.0], tspan, []), Tsit5(),