geoschem / geos-chem

GEOS-Chem "Science Codebase" repository. Contains GEOS-Chem science routines, run directory generation scripts, and interface code. This repository is used as a submodule within the GCClassic and GCHP wrappers, as well as in other modeling contexts (external ESMs).
http://geos-chem.org
Other
169 stars 165 forks source link

[QUESTION] NEI 2011 on-road emission and surface emission #1015

Closed ganluoasrc closed 2 years ago

ganluoasrc commented 2 years ago

Ask a question about GEOS-Chem:

Recently, I am working with NEI 2011 emission (HEMCO/NEI2011/v2015-03). I thought on-road emission (onroad.nc+onroad_catx.nc) was included in surface emission (*[date].nc). However, my analysis found that on-road emission is higher than surface emission at a lot of grids (see attached Figure1&2). Within the domain (33N-47N, 125W-75W) shown in Fig.1&2, the ratios of NO on-road emission to NO surface emission (NO_onroad/NO_surface) at grids where the ratios are larger than 1.0 are varied from 1.0002 to 63.5625. The mean value of these ratios is 1.3156. It indicates that on-road emission was not included in surface emission. I am wondering:

  1. On-road emission and off-road emission shown in HEMCO/NEI2011/v2015-03 were not used by HEMCO_Config.rc. Are they included in any NEI emission files used by HEMCO_Config.rc?

  2. What are these on-road emission and off-road emission referred to? Do they have the same definitions of EPA on-road emission and off-road emission (https://www.epa.gov/emission-standards-reference-guide/basic-information-about-emission-standards-reference-guide-road: "On-road" or highway sources include vehicles used on roads for transportation of passengers or freight. "Nonroad" (also called "off-road") sources include vehicles, engines, and equipment used for construction, agriculture, recreation, and many other purposes.)?

NEI2011-surface-onroad-emission.pdf

yantosca commented 2 years ago

Thanks @ganluoasrc for writing. I am tagging @barronh, who knows more about the EPA emissions than I do.

Please also note in 13.3.1, just released, we have the option to use NEI2016, which is a more recent product.

barronh commented 2 years ago

@ganluoasrc - I ran a quick test for a specific day. I think you are seeing a sum of ratios vs a ratio of sums issue. For my test case, I looked at January 1 2011. If I average all the ratios greater than 1, I get an average of 1.63. If I sum the fluxes in cells where the ratio is greater than 1, I get 3.0139927e-07. If I do the same thing for the cells where the ratio is less than or equal to 1, I get 1.9873407e-05. That suggests that you are seeing inconsistencies that affect about 1.5% of the emissions. This could easily be related to sums of remapped data versus remapped sums.

At the CONUS scale, you can see this. It is particularly evident if you zoom in. The code below does the analysis and produces the two attached figures.

import matplotlib.pyplot as plt
import numpy as np
import PseudoNetCDF as pnc
import pycno

hcroot = '/work/ROMO/geos-chem/data/ExtData/HEMCO'
eiroot = f'{hcroot}/NEI2011/v2015-03/01/'

onroadpath = f'{eiroot}/NEI11_0.1x0.1_20110101_onroad.nc'
onroadcatxpath = f'{eiroot}/NEI11_0.1x0.1_20110101_onroad_catx.nc'
sfcpath = f'{eiroot}/NEI11_0.1x0.1_20110101.nc'

onroadf = pnc.pncopen(onroadpath, format='netcdf')
onroadcatxf = pnc.pncopen(onroadcatxpath, format='netcdf')
srf = pnc.pncopen(sfcpath, format='netcdf')

def getnox(sf):
    no = sf.variables['NO'][:].sum(0)
    no2 = sf.variables['NO2'][:].sum(0)
    if no.ndim == 3:
        no = no.sum(0)
    if no2.ndim == 3:
        no2 = no2.sum(0)
    nox = no + no2
    return nox

onroadNOx = getnox(onroadf)
onroadcatxNOx = getnox(onroadcatxf)
allroadNOx = np.ma.masked_values(onroadNOx + onroadcatxNOx, 0, atol=1e-30)
sfNOx = getnox(srf)

ratNOx = allroadNOx / sfNOx

ma_ratNOx = np.ma.masked_less(ratNOx, 1)
print(ma_ratNOx.mean())

# Output
# 1.6339415587462462

gtNOx = np.ma.masked_where(ma_ratNOx.mask, allroadNOx)
leNOx = np.ma.masked_where(~ma_ratNOx.mask, allroadNOx)

print(f'Fraction of emissions in <1 cells: {leNOx.sum() / allroadNOx.sum():5.1%}')
print(f'Fraction of emissions in >1 cells: {gtNOx.sum() / allroadNOx.sum():5.1%}')

# Output
# Fraction of emissions in <1 cells: 98.5%
# Fraction of emissions in >1 cells:  1.5%

lon = srf.variables['lon']
lat = srf.variables['lat']

cno = pycno.cno()

fig, axx = plt.subplots(1, 3, figsize=(18, 5), sharey=True)
cax = fig.add_axes([.1, .05, .53, .025])
dax = fig.add_axes([.68, .05, .22, .025])
p = axx[0].pcolormesh(lon, lat, leNOx, cmap='Reds', shading='nearest', vmin=0, vmax=5e-9)
axx[0].text(-135, 25, 'less than sfc', backgroundcolor='white')
p = axx[1].pcolormesh(lon, lat, gtNOx, cmap='Reds', shading='nearest', vmin=0, vmax=5e-9)
axx[1].text(-135, 25, 'greater than sfc', backgroundcolor='white')
dp = axx[2].pcolormesh(lon, lat, ratNOx, cmap='bwr', shading='nearest', vmin=0.9, vmax=1.1)
fig.colorbar(p, cax=cax, orientation='horizontal')
fig.colorbar(dp, cax=dax, orientation='horizontal', label='(onroad+catx)/sfc')
for ax in axx:
    cno.draw('MWDB_Coasts_USA_3.cnob', ax=ax)

fig.savefig('summary.png')

for ax in fig.axes[:3]:
    ax.set_ylim(27, 37)
    ax.set_xlim(-105, -95)

axx[0].texts[0].set_position((-104, 28))
axx[1].texts[0].set_position((-104, 28))
fig.savefig('summary_tx.png')

summary

summary_tx

p.s., add

axx[0].set_facecolor('grey')
axx[1].set_facecolor('grey')

To make it more obvious where data is missing.

ganluoasrc commented 2 years ago

Thanks @barronh . It makes sense to me now. I thought surface emission should be always larger than on-road emission if on-road emission is included in surface emission. I have two other questions. Does off-road emission file include aircraft emission at airport? Are NEI110.1x0.1[date]_othpt.nc (other point sources) and “Other Industrial Processes” defined by EPA the same thing? Thanks.

barronh commented 2 years ago

You can look at the documentation for the emissions[1] for definitions of "premerged sectors." The original files were provided with names like "emis_mole_all_20110101_12US1_cmaq_cb05_soa_F40_2011ed.nc". That tells us that these are version 2011ed. By looking through the TSDs, we see that Version 6.0 is the 2011ed, v6.1 is 2011ef, v6.2 is 2011eh, and v6.3 includes 2011ek thru 2011en. Comparing Table 5-1 from v6.0 and v6.3, we see that total CONUS NOx was 14,154,492 short tons in v6.0 and 14,163,853 short tons in v6.3. The "premerged sectors" changed, so it takes work to know what changed. Each document defines what is in each "premerged sector."

I also suggest that you pick a day and make spatial plots of NO to get a feel for the data. For example, you can see the roads in the surface file, so obviously they are in there. Similarly, if you plot othpt, you'll see that it is Mexico, Canada, and offshore.

[1] https://www.epa.gov/air-emissions-modeling/2011-version-6-air-emissions-modeling-platforms

ganluoasrc commented 2 years ago

Thanks @barronh . It makes things clearer to me. The link of the documentations for the emissions used by models is very helpful.

yantosca commented 2 years ago

Thanks @barronh and @ganluoasrc! I'll close out this issue now, as it seems that there is a resolution.