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[], nothing, 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[], nothing, 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
RowNameUnitsDescription
StringDimensio…String
1ACETm⁻³ kg s⁻¹Model species ACET
2ACROLEINm⁻³ kg s⁻¹Model species ACROLEIN
3ALD2m⁻³ kg s⁻¹Model species ALD2
4ALD2_PRIMARYm⁻³ kg s⁻¹Model species ALD2_PRIMARY
5ALDXm⁻³ kg s⁻¹Model species ALDX
6APINm⁻³ kg s⁻¹Model species APIN
7BENZm⁻³ kg s⁻¹Model species BENZ
8BPINm⁻³ kg s⁻¹Model species BPIN
9BUTADIENE13m⁻³ kg s⁻¹Model species BUTADIENE13
10CH4m⁻³ kg s⁻¹Model species CH4
11CH4_INVm⁻³ kg s⁻¹Model species CH4_INV
12CL2m⁻³ kg s⁻¹Model species CL2
13COm⁻³ kg s⁻¹Model species CO
14CO2_INVm⁻³ kg s⁻¹Model species CO2_INV
15ETHm⁻³ kg s⁻¹Model species ETH
16ETHAm⁻³ kg s⁻¹Model species ETHA
17ETHYm⁻³ kg s⁻¹Model species ETHY
18ETOHm⁻³ kg s⁻¹Model species ETOH
19FORMm⁻³ kg s⁻¹Model species FORM
20FORM_PRIMARYm⁻³ kg s⁻¹Model species FORM_PRIMARY
21HCLm⁻³ kg s⁻¹Model species HCL
22HONOm⁻³ kg s⁻¹Model species HONO
23IOLEm⁻³ kg s⁻¹Model species IOLE
24ISOPm⁻³ kg s⁻¹Model species ISOP
25KETm⁻³ kg s⁻¹Model species KET
26MEOHm⁻³ kg s⁻¹Model species MEOH
27N2O_INVm⁻³ kg s⁻¹Model species N2O_INV
28NAPHm⁻³ kg s⁻¹Model species NAPH
29NH3m⁻³ kg s⁻¹Model species NH3
30NH3_FERTm⁻³ kg s⁻¹Model species NH3_FERT
31NOm⁻³ kg s⁻¹Model species NO
32NO2m⁻³ kg s⁻¹Model species NO2
33NOXm⁻³ kg s⁻¹Model species NOX
34NRm⁻³ kg s⁻¹Model species NR
35NVOLm⁻³ kg s⁻¹Model species NVOL
36OLEm⁻³ kg s⁻¹Model species OLE
37PALm⁻³ kg s⁻¹Model species PAL
38PARm⁻³ kg s⁻¹Model species PAR
39PCAm⁻³ kg s⁻¹Model species PCA
40PCLm⁻³ kg s⁻¹Model species PCL
41PECm⁻³ kg s⁻¹Model species PEC
42PFEm⁻³ kg s⁻¹Model species PFE
43PH2Om⁻³ kg s⁻¹Model species PH2O
44PKm⁻³ kg s⁻¹Model species PK
45PM2_5m⁻³ kg s⁻¹Model species PM2_5
46PMCm⁻³ kg s⁻¹Model species PMC
47PMGm⁻³ kg s⁻¹Model species PMG
48PMNm⁻³ kg s⁻¹Model species PMN
49PMOTHRm⁻³ kg s⁻¹Model species PMOTHR
50PNAm⁻³ kg s⁻¹Model species PNA
51PNCOMm⁻³ kg s⁻¹Model species PNCOM
52PNH4m⁻³ kg s⁻¹Model species PNH4
53PNO3m⁻³ kg s⁻¹Model species PNO3
54POCm⁻³ kg s⁻¹Model species POC
55PRPAm⁻³ kg s⁻¹Model species PRPA
56PSIm⁻³ kg s⁻¹Model species PSI
57PSO4m⁻³ kg s⁻¹Model species PSO4
58PTIm⁻³ kg s⁻¹Model species PTI
59SESQm⁻³ kg s⁻¹Model species SESQ
60SO2m⁻³ kg s⁻¹Model species SO2
61SOAALKm⁻³ kg s⁻¹Model species SOAALK
62SULFm⁻³ kg s⁻¹Model species SULF
63TERPm⁻³ kg s⁻¹Model species TERP
64TOLm⁻³ kg s⁻¹Model species TOL
65UNKm⁻³ kg s⁻¹Model species UNK
66UNRm⁻³ kg s⁻¹Model species UNR
67VOC_BEISm⁻³ kg s⁻¹Model species VOC_BEIS
68VOC_INVm⁻³ kg s⁻¹Model species VOC_INV
69XYLMNm⁻³ kg s⁻¹Model species XYLMN

Parameters

Finally, here are the parameters in tabular format:

table(parameters(emis))
4×3 DataFrame
RowNameUnitsDescription
StringDimensio…String
1lon
2lat
3ΔzmHeight of the first vertical grid layer
4lev