2016 US EPA National Emissions Inventory (NEI) data
We have a data loader for CMAQ-formatted monthly US National Emissions Inventory data for year 2016,NEI2016MonthlyEmis
.
Download Configuration
Because there is an issue with the EPA's FTP server that we download the data from you may need to set the following environment variable before using it:
In Julia:
ENV["JULIA_NO_VERIFY_HOSTS"] = "gaftp.epa.gov"
or in a bash shell:
export JULIA_NO_VERIFY_HOSTS=gaftp.epa.gov
Equations
This is what its equation system looks like:
using EarthSciData, ModelingToolkit, DynamicQuantities, DataFrames
using ModelingToolkit: t
using DynamicQuantities: dimension
@parameters lat, [unit=u"rad"], lon, [unit=u"rad"], lev [unit=u"rad"]
emis, emis_updater = NEI2016MonthlyEmis("mrggrid_withbeis_withrwc", lon, lat, lev)
(ModelingToolkit.ODESystem(0x0000000000000005, Symbolics.Equation[ACET(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, ACET}, t, lon, lat) / Δz, zero_emis), ACROLEIN(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, ACROLEIN}, t, lon, lat) / Δz, zero_emis), ALD2(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, ALD2}, t, lon, lat) / Δz, zero_emis), ALD2_PRIMARY(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, ALD2_PRIMARY}, t, lon, lat) / Δz, zero_emis), ALDX(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, ALDX}, t, lon, lat) / Δz, zero_emis), APIN(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, APIN}, t, lon, lat) / Δz, zero_emis), BENZ(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, BENZ}, t, lon, lat) / Δz, zero_emis), BPIN(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, BPIN}, t, lon, lat) / Δz, zero_emis), BUTADIENE13(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, BUTADIENE13}, t, lon, lat) / Δz, zero_emis), CH4(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, CH4}, t, lon, lat) / Δz, zero_emis) … SO2(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, SO2}, t, lon, lat) / Δz, zero_emis), SOAALK(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, SOAALK}, t, lon, lat) / Δz, zero_emis), SULF(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, SULF}, t, lon, lat) / Δz, zero_emis), TERP(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, TERP}, t, lon, lat) / Δz, zero_emis), TOL(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, TOL}, t, lon, lat) / Δz, zero_emis), UNK(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, UNK}, t, lon, lat) / Δz, zero_emis), UNR(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, UNR}, t, lon, lat) / Δz, zero_emis), VOC_BEIS(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, VOC_BEIS}, t, lon, lat) / Δz, zero_emis), VOC_INV(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, VOC_INV}, t, lon, lat) / Δz, zero_emis), XYLMN(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, XYLMN}, t, lon, lat) / Δz, zero_emis)], t, SymbolicUtils.BasicSymbolic{Real}[ACET(t), ACROLEIN(t), ALD2(t), ALD2_PRIMARY(t), ALDX(t), APIN(t), BENZ(t), BPIN(t), BUTADIENE13(t), CH4(t) … SO2(t), SOAALK(t), SULF(t), TERP(t), TOL(t), UNK(t), UNR(t), VOC_BEIS(t), VOC_INV(t), XYLMN(t)], SymbolicUtils.BasicSymbolic{Real}[lon, lat, Δz, lev], nothing, Dict{Any, Any}(:NAPH => NAPH(t), :SESQ => SESQ(t), :PNO3 => PNO3(t), :PMG => PMG(t), :CH4_INV => CH4_INV(t), :PCL => PCL(t), :lev => lev, :CH4 => CH4(t), :lon => lon, :CL2 => CL2(t)…), Any[], Symbolics.Equation[], Base.RefValue{Vector{Symbolics.Num}}(Symbolics.Num[]), Base.RefValue{Any}(Matrix{Symbolics.Num}(undef, 0, 0)), Base.RefValue{Any}(Matrix{Symbolics.Num}(undef, 0, 0)), Base.RefValue{Matrix{Symbolics.Num}}(Matrix{Symbolics.Num}(undef, 0, 0)), Base.RefValue{Matrix{Symbolics.Num}}(Matrix{Symbolics.Num}(undef, 0, 0)), :NEI2016MonthlyEmis, ModelingToolkit.ODESystem[], Dict{Any, Any}(Δz => 60.0), Dict{Any, Any}(), nothing, nothing, Symbolics.Equation[], nothing, nothing, nothing, ModelingToolkit.SymbolicContinuousCallback[], ModelingToolkit.SymbolicDiscreteCallback[], Symbolics.Equation[], Dict{Symbol, DataType}(:coupletype => EarthSciData.NEI2016MonthlyEmisCoupler), nothing, nothing, nothing, false, nothing, nothing, nothing, nothing, nothing), EarthSciData.UpdateCallbackCreator(ModelingToolkit.ODESystem(0x0000000000000005, Symbolics.Equation[ACET(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, ACET}, t, lon, lat) / Δz, zero_emis), ACROLEIN(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, ACROLEIN}, t, lon, lat) / Δz, zero_emis), ALD2(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, ALD2}, t, lon, lat) / Δz, zero_emis), ALD2_PRIMARY(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, ALD2_PRIMARY}, t, lon, lat) / Δz, zero_emis), ALDX(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, ALDX}, t, lon, lat) / Δz, zero_emis), APIN(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, APIN}, t, lon, lat) / Δz, zero_emis), BENZ(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, BENZ}, t, lon, lat) / Δz, zero_emis), BPIN(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, BPIN}, t, lon, lat) / Δz, zero_emis), BUTADIENE13(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, BUTADIENE13}, t, lon, lat) / Δz, zero_emis), CH4(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, CH4}, t, lon, lat) / Δz, zero_emis) … SO2(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, SO2}, t, lon, lat) / Δz, zero_emis), SOAALK(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, SOAALK}, t, lon, lat) / Δz, zero_emis), SULF(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, SULF}, t, lon, lat) / Δz, zero_emis), TERP(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, TERP}, t, lon, lat) / Δz, zero_emis), TOL(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, TOL}, t, lon, lat) / Δz, zero_emis), UNK(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, UNK}, t, lon, lat) / Δz, zero_emis), UNR(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, UNR}, t, lon, lat) / Δz, zero_emis), VOC_BEIS(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, VOC_BEIS}, t, lon, lat) / Δz, zero_emis), VOC_INV(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, VOC_INV}, t, lon, lat) / Δz, zero_emis), XYLMN(t) ~ ifelse(lev < 2, EarthSciData.interp_unsafe(DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, XYLMN}, t, lon, lat) / Δz, zero_emis)], t, SymbolicUtils.BasicSymbolic{Real}[ACET(t), ACROLEIN(t), ALD2(t), ALD2_PRIMARY(t), ALDX(t), APIN(t), BENZ(t), BPIN(t), BUTADIENE13(t), CH4(t) … SO2(t), SOAALK(t), SULF(t), TERP(t), TOL(t), UNK(t), UNR(t), VOC_BEIS(t), VOC_INV(t), XYLMN(t)], SymbolicUtils.BasicSymbolic{Real}[lon, lat, Δz, lev], nothing, Dict{Any, Any}(:NAPH => NAPH(t), :SESQ => SESQ(t), :PNO3 => PNO3(t), :PMG => PMG(t), :CH4_INV => CH4_INV(t), :PCL => PCL(t), :lev => lev, :CH4 => CH4(t), :lon => lon, :CL2 => CL2(t)…), Any[], Symbolics.Equation[], Base.RefValue{Vector{Symbolics.Num}}(Symbolics.Num[]), Base.RefValue{Any}(Matrix{Symbolics.Num}(undef, 0, 0)), Base.RefValue{Any}(Matrix{Symbolics.Num}(undef, 0, 0)), Base.RefValue{Matrix{Symbolics.Num}}(Matrix{Symbolics.Num}(undef, 0, 0)), Base.RefValue{Matrix{Symbolics.Num}}(Matrix{Symbolics.Num}(undef, 0, 0)), :NEI2016MonthlyEmis, ModelingToolkit.ODESystem[], Dict{Any, Any}(Δz => 60.0), Dict{Any, Any}(), nothing, nothing, Symbolics.Equation[], nothing, nothing, nothing, ModelingToolkit.SymbolicContinuousCallback[], ModelingToolkit.SymbolicDiscreteCallback[], Symbolics.Equation[], Dict{Symbol, DataType}(:coupletype => EarthSciData.NEI2016MonthlyEmisCoupler), nothing, nothing, nothing, false, nothing, nothing, nothing, nothing, nothing), Any[ACET(t), ACROLEIN(t), ALD2(t), ALD2_PRIMARY(t), ALDX(t), APIN(t), BENZ(t), BPIN(t), BUTADIENE13(t), CH4(t) … SO2(t), SOAALK(t), SULF(t), TERP(t), TOL(t), UNK(t), UNR(t), VOC_BEIS(t), VOC_INV(t), XYLMN(t)], Any[DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, ACET}, DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, ACROLEIN}, DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, ALD2}, DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, ALD2_PRIMARY}, DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, ALDX}, DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, APIN}, DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, BENZ}, DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, BPIN}, DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, BUTADIENE13}, DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, CH4} … DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, SO2}, DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, SOAALK}, DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, SULF}, DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, TERP}, DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, TOL}, DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, UNK}, DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, UNR}, DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, VOC_BEIS}, DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, VOC_INV}, DataSetInterpolator{EarthSciData.NEI2016MonthlyEmisFileSet, XYLMN}]))
Variables
Here are the variables in tabular format:
table(vars) = DataFrame(
:Name => [string(Symbolics.tosymbol(v, escape=false)) for v ∈ vars],
:Units => [dimension(ModelingToolkit.get_unit(v)) for v ∈ vars],
:Description => [ModelingToolkit.getdescription(v) for v in vars],
)
table(unknowns(emis))
69×3 DataFrame
Row | Name | Units | Description |
---|---|---|---|
String | Dimensio… | String | |
1 | ACET | m⁻³ kg s⁻¹ | Model species ACET |
2 | ACROLEIN | m⁻³ kg s⁻¹ | Model species ACROLEIN |
3 | ALD2 | m⁻³ kg s⁻¹ | Model species ALD2 |
4 | ALD2_PRIMARY | m⁻³ kg s⁻¹ | Model species ALD2_PRIMARY |
5 | ALDX | m⁻³ kg s⁻¹ | Model species ALDX |
6 | APIN | m⁻³ kg s⁻¹ | Model species APIN |
7 | BENZ | m⁻³ kg s⁻¹ | Model species BENZ |
8 | BPIN | m⁻³ kg s⁻¹ | Model species BPIN |
9 | BUTADIENE13 | m⁻³ kg s⁻¹ | Model species BUTADIENE13 |
10 | CH4 | m⁻³ kg s⁻¹ | Model species CH4 |
11 | CH4_INV | m⁻³ kg s⁻¹ | Model species CH4_INV |
12 | CL2 | m⁻³ kg s⁻¹ | Model species CL2 |
13 | CO | m⁻³ kg s⁻¹ | Model species CO |
14 | CO2_INV | m⁻³ kg s⁻¹ | Model species CO2_INV |
15 | ETH | m⁻³ kg s⁻¹ | Model species ETH |
16 | ETHA | m⁻³ kg s⁻¹ | Model species ETHA |
17 | ETHY | m⁻³ kg s⁻¹ | Model species ETHY |
18 | ETOH | m⁻³ kg s⁻¹ | Model species ETOH |
19 | FORM | m⁻³ kg s⁻¹ | Model species FORM |
20 | FORM_PRIMARY | m⁻³ kg s⁻¹ | Model species FORM_PRIMARY |
21 | HCL | m⁻³ kg s⁻¹ | Model species HCL |
22 | HONO | m⁻³ kg s⁻¹ | Model species HONO |
23 | IOLE | m⁻³ kg s⁻¹ | Model species IOLE |
24 | ISOP | m⁻³ kg s⁻¹ | Model species ISOP |
25 | KET | m⁻³ kg s⁻¹ | Model species KET |
26 | MEOH | m⁻³ kg s⁻¹ | Model species MEOH |
27 | N2O_INV | m⁻³ kg s⁻¹ | Model species N2O_INV |
28 | NAPH | m⁻³ kg s⁻¹ | Model species NAPH |
29 | NH3 | m⁻³ kg s⁻¹ | Model species NH3 |
30 | NH3_FERT | m⁻³ kg s⁻¹ | Model species NH3_FERT |
31 | NO | m⁻³ kg s⁻¹ | Model species NO |
32 | NO2 | m⁻³ kg s⁻¹ | Model species NO2 |
33 | NOX | m⁻³ kg s⁻¹ | Model species NOX |
34 | NR | m⁻³ kg s⁻¹ | Model species NR |
35 | NVOL | m⁻³ kg s⁻¹ | Model species NVOL |
36 | OLE | m⁻³ kg s⁻¹ | Model species OLE |
37 | PAL | m⁻³ kg s⁻¹ | Model species PAL |
38 | PAR | m⁻³ kg s⁻¹ | Model species PAR |
39 | PCA | m⁻³ kg s⁻¹ | Model species PCA |
40 | PCL | m⁻³ kg s⁻¹ | Model species PCL |
41 | PEC | m⁻³ kg s⁻¹ | Model species PEC |
42 | PFE | m⁻³ kg s⁻¹ | Model species PFE |
43 | PH2O | m⁻³ kg s⁻¹ | Model species PH2O |
44 | PK | m⁻³ kg s⁻¹ | Model species PK |
45 | PM2_5 | m⁻³ kg s⁻¹ | Model species PM2_5 |
46 | PMC | m⁻³ kg s⁻¹ | Model species PMC |
47 | PMG | m⁻³ kg s⁻¹ | Model species PMG |
48 | PMN | m⁻³ kg s⁻¹ | Model species PMN |
49 | PMOTHR | m⁻³ kg s⁻¹ | Model species PMOTHR |
50 | PNA | m⁻³ kg s⁻¹ | Model species PNA |
51 | PNCOM | m⁻³ kg s⁻¹ | Model species PNCOM |
52 | PNH4 | m⁻³ kg s⁻¹ | Model species PNH4 |
53 | PNO3 | m⁻³ kg s⁻¹ | Model species PNO3 |
54 | POC | m⁻³ kg s⁻¹ | Model species POC |
55 | PRPA | m⁻³ kg s⁻¹ | Model species PRPA |
56 | PSI | m⁻³ kg s⁻¹ | Model species PSI |
57 | PSO4 | m⁻³ kg s⁻¹ | Model species PSO4 |
58 | PTI | m⁻³ kg s⁻¹ | Model species PTI |
59 | SESQ | m⁻³ kg s⁻¹ | Model species SESQ |
60 | SO2 | m⁻³ kg s⁻¹ | Model species SO2 |
61 | SOAALK | m⁻³ kg s⁻¹ | Model species SOAALK |
62 | SULF | m⁻³ kg s⁻¹ | Model species SULF |
63 | TERP | m⁻³ kg s⁻¹ | Model species TERP |
64 | TOL | m⁻³ kg s⁻¹ | Model species TOL |
65 | UNK | m⁻³ kg s⁻¹ | Model species UNK |
66 | UNR | m⁻³ kg s⁻¹ | Model species UNR |
67 | VOC_BEIS | m⁻³ kg s⁻¹ | Model species VOC_BEIS |
68 | VOC_INV | m⁻³ kg s⁻¹ | Model species VOC_INV |
69 | XYLMN | m⁻³ kg s⁻¹ | Model species XYLMN |
Parameters
Finally, here are the parameters in tabular format:
table(parameters(emis))
4×3 DataFrame
Row | Name | Units | Description |
---|---|---|---|
String | Dimensio… | String | |
1 | lon | ||
2 | lat | ||
3 | Δz | m | Height of the first vertical grid layer |
4 | lev |