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
162 stars 155 forks source link

Adding CEDS at 0.1 degree as a global emission inventory #1745

Open 1Dandan opened 1 year ago

1Dandan commented 1 year ago

Name and Institution (Required)

Name: Dandan Zhang Institution: Washington University in St. Louis

New GEOS-Chem feature

Hi, I am writing to request adding CEDS at 0.1 degree as a global emission inventory to support high-resolution global or regional simulations.

Original dataset of CEDS at 0.1 degree from year 1980 to 2019 can be requested and downloaded from https://data.pnnl.gov/group/nodes/dataset/13488, which includes fine-scale emission fluxes on the top of CEDS v2 at 0.5 degree. I have downloaded and processed the dataset to be readily usable by GEOS-Chem.

Process dataset is available at: http://geoschemdata.wustl.edu/ExtData/HEMCO/CEDS/v2023-04/, where subdirectories at each year contains monthly emission fluxes for each species; config/ contains HEMCO_Config.rc and ExtData.rc files modified to facilitate using CEDS at 0.1 degree for GCHP version 13.4.1; scripts/ contains processing scripts.

To verify it, I regrid processed CEDS at 0.1 to 0.5 degree by area-weighted regridding to maintain same emission fluxes at different resolutions and compare it with the current CEDS v2 at 0.5 degree (http://geoschemdata.wustl.edu/ExtData/HEMCO/CEDS/v2021-06/) for annual mean emissions in year 2018. Comparison plots: Comp_Emissions_CEDS01_vs_CEDSv2_2018_AnnMean.pdf Above plots show that the differences between the two are negligible as expected. Thus the processed dataset should be readily usable.

yantosca commented 1 year ago

Thanks @1Dandan. A couple of questions:

  1. Have you run the isCoards script (from https://github.com/geos-chem/netcdf-scripts) on the CEDS data files to make sure that they are COARDS-compliant and will also be compatible with GCHP?
  2. Do you have a sample HEMCO_Config.rc file with the entries that will read in CEDS?
1Dandan commented 1 year ago

Hi @yantosca, For 1), I just ran the isCoards scripts and the output is:

(base) dandan.z@compute1-exec-7:/ExtData/HEMCO/CEDS/v2023-04/2018$ isCoards CEDS_NO_0.1x0.1_2018.nc
===========================================================================
Filename: CEDS_NO_0.1x0.1_2018.nc
===========================================================================

The following items adhere to the COARDS standard:
---------------------------------------------------------------------------
-> Dimension "time" adheres to standard usage
-> Dimension "lat" adheres to standard usage
-> Dimension "lon" adheres to standard usage
-> Dimension "lat" uses only lowercase letters (requirement for GCHP)
-> lat(lat)
-> lat is monotonically increasing
-> lat:axis = "Y" 
-> lat:long_name = "Latitude" 
-> lat:units = "degrees_north" 
-> Dimension "lon" uses only lowercase letters (requirement for GCHP)
-> lon(lon)
-> lon is monotonically increasing
-> lon:axis = "X" 
-> lon:long_name = "Longitude" 
-> lon:units = "degrees_east" 
-> Dimension "time" uses only lowercase letters (requirement for GCHP)
-> time(time)
-> time is monotonically increasing
-> time[0] = 0 (requirement for GCHP)
-> time:axis = "T" 
-> time:calendar = "standard" 
-> time:long_name = "Time" 
-> time:units = "days since 2018-01-01 00:00:00" 
-> "time:units" does not contain decimals (requirement for GCHP)
-> NO_agr(time,lat,lon)
-> NO_agr has proper dimension ordering (requirement for GCHP)
-> NO_agr:long_name = "NO emission in sector agr" 
-> NO_agr:units = "kg/m2/s" 
-> NO_agr:long_name = NaNf 
-> NO_ene(time,lat,lon)
-> NO_ene has proper dimension ordering (requirement for GCHP)
-> NO_ene:long_name = "NO emission in sector ene" 
-> NO_ene:units = "kg/m2/s" 
-> NO_ene:long_name = NaNf 
-> NO_ind(time,lat,lon)
-> NO_ind has proper dimension ordering (requirement for GCHP)
-> NO_ind:long_name = "NO emission in sector ind" 
-> NO_ind:units = "kg/m2/s" 
-> NO_ind:long_name = NaNf 
-> NO_tra(time,lat,lon)
-> NO_tra has proper dimension ordering (requirement for GCHP)
-> NO_tra:long_name = "NO emission in sector tra" 
-> NO_tra:units = "kg/m2/s" 
-> NO_tra:long_name = NaNf 
-> NO_rco(time,lat,lon)
-> NO_rco has proper dimension ordering (requirement for GCHP)
-> NO_rco:long_name = "NO emission in sector rco" 
-> NO_rco:units = "kg/m2/s" 
-> NO_rco:long_name = NaNf 
-> NO_slv(time,lat,lon)
-> NO_slv has proper dimension ordering (requirement for GCHP)
-> NO_slv:long_name = "NO emission in sector slv" 
-> NO_slv:units = "kg/m2/s" 
-> NO_slv:long_name = NaNf 
-> NO_wst(time,lat,lon)
-> NO_wst has proper dimension ordering (requirement for GCHP)
-> NO_wst:long_name = "NO emission in sector wst" 
-> NO_wst:units = "kg/m2/s" 
-> NO_wst:long_name = NaNf 
-> NO_shp(time,lat,lon)
-> NO_shp has proper dimension ordering (requirement for GCHP)
-> NO_shp:long_name = "NO emission in sector shp" 
-> NO_shp:units = "kg/m2/s" 
-> NO_shp:long_name = NaNf 
-> conventions: "COARDS" 
-> title: "COARDS/netCDF file containing monthly emissions of NO" 

The following items DO NOT ADHERE to the COARDS standard:
---------------------------------------------------------------------------
-> The "history" global attribute is missing

The following optional items are RECOMMENDED:
---------------------------------------------------------------------------
-> Consider adding NO_agr:missing_value
-> Consider adding NO_ene:missing_value
-> Consider adding NO_ind:missing_value
-> Consider adding NO_tra:missing_value
-> Consider adding NO_rco:missing_value
-> Consider adding NO_slv:missing_value
-> Consider adding NO_wst:missing_value
-> Consider adding NO_shp:missing_value
-> Consider adding the "format" global attribute
-> Consider adding the "references" global attribute

---------------------------------------------------------------------------
For detailed instructions on how to edit netCDF files, see:
 1. "Work with netCDF files" and
 2. "Prepare COARDS-compliant netCDF files"
at the GEOS-Chem manual (geos-chem.readthedocs.io).
---------------------------------------------------------------------------

I did not use nco or cdo for formatting netCDF files. Do you think I need to add history attribute to all files?

For 2), Yes, as indicated in above original description, the sample HEMCO_Config.rc and ExtData.rc files are at http://geoschemdata.wustl.edu/ExtData/HEMCO/CEDS/v2023-04/config which will read all corresponding entries into the base emission called CEDS01

yantosca commented 1 year ago

Hi @1Dandan, this looks good! The biggest thing is that the data is now on the standard calendar, and that time[0] = 0, which facilitates GCHP input. I would say this is good to go.

1Dandan commented 1 year ago

Hi @yantosca, thanks. I may add the attributes of missing_value and _FillValue of 1.e+20f to be consistent with the original dataset. I will let you know when it's ready.

1Dandan commented 1 year ago

Hi @yantosca, just to let you know that missing_value and _FillValue have been added to all emission files. The output of isCoards is:

dandan.z@compute1-exec-3:/ExtData/HEMCO/CEDS/v2023-04/2018$ isCoards CEDS_NO_0.1x0.1_2018.nc 
===========================================================================
Filename: CEDS_NO_0.1x0.1_2018.nc
===========================================================================

The following items adhere to the COARDS standard:
---------------------------------------------------------------------------
-> Dimension "time" adheres to standard usage
-> Dimension "lon" adheres to standard usage
-> Dimension "lat" adheres to standard usage
-> Dimension "time" uses only lowercase letters (requirement for GCHP)
-> time(time)
-> time is monotonically increasing
-> time[0] = 0 (requirement for GCHP)
-> time:axis = "T" 
-> time:calendar = "standard" 
-> time:long_name = "Time" 
-> time:units = "days since 2018-01-01 00:00:00" 
-> "time:units" does not contain decimals (requirement for GCHP)
-> Dimension "lon" uses only lowercase letters (requirement for GCHP)
-> lon(lon)
-> lon is monotonically increasing
-> lon:axis = "X" 
-> lon:long_name = "Longitude" 
-> lon:units = "degrees_east" 
-> Dimension "lat" uses only lowercase letters (requirement for GCHP)
-> lat(lat)
-> lat is monotonically increasing
-> lat:axis = "Y" 
-> lat:long_name = "Latitude" 
-> lat:units = "degrees_north" 
-> NO_agr(time,lat,lon)
-> NO_agr has proper dimension ordering (requirement for GCHP)
-> NO_agr:long_name = "NO emission in sector agr" 
-> NO_agr:units = "kg/m2/s" 
-> NO_agr:long_name = 1.e+20f 
-> NO_agr:missing_value = 1.e+20f 
-> NO_ene(time,lat,lon)
-> NO_ene has proper dimension ordering (requirement for GCHP)
-> NO_ene:long_name = "NO emission in sector ene" 
-> NO_ene:units = "kg/m2/s" 
-> NO_ene:long_name = 1.e+20f 
-> NO_ene:missing_value = 1.e+20f 
-> NO_ind(time,lat,lon)
-> NO_ind has proper dimension ordering (requirement for GCHP)
-> NO_ind:long_name = "NO emission in sector ind" 
-> NO_ind:units = "kg/m2/s" 
-> NO_ind:long_name = 1.e+20f 
-> NO_ind:missing_value = 1.e+20f 
-> NO_tra(time,lat,lon)
-> NO_tra has proper dimension ordering (requirement for GCHP)
-> NO_tra:long_name = "NO emission in sector tra" 
-> NO_tra:units = "kg/m2/s" 
-> NO_tra:long_name = 1.e+20f 
-> NO_tra:missing_value = 1.e+20f 
-> NO_rco(time,lat,lon)
-> NO_rco has proper dimension ordering (requirement for GCHP)
-> NO_rco:long_name = "NO emission in sector rco" 
-> NO_rco:units = "kg/m2/s" 
-> NO_rco:long_name = 1.e+20f 
-> NO_rco:missing_value = 1.e+20f 
-> NO_slv(time,lat,lon)
-> NO_slv has proper dimension ordering (requirement for GCHP)
-> NO_slv:long_name = "NO emission in sector slv" 
-> NO_slv:units = "kg/m2/s" 
-> NO_slv:long_name = 1.e+20f 
-> NO_slv:missing_value = 1.e+20f 
-> NO_wst(time,lat,lon)
-> NO_wst has proper dimension ordering (requirement for GCHP)
-> NO_wst:long_name = "NO emission in sector wst" 
-> NO_wst:units = "kg/m2/s" 
-> NO_wst:long_name = 1.e+20f 
-> NO_wst:missing_value = 1.e+20f 
-> NO_shp(time,lat,lon)
-> NO_shp has proper dimension ordering (requirement for GCHP)
-> NO_shp:long_name = "NO emission in sector shp" 
-> NO_shp:units = "kg/m2/s" 
-> NO_shp:long_name = 1.e+20f 
-> NO_shp:missing_value = 1.e+20f 
-> conventions: "COARDS" 
-> history: "Mon Apr 10 20:34:21 2023: cdo setmissval,1e+20 /ExtData/HEMCO/CEDS/v2023-04/2018/CEDS_NO_0.1x0.1_2018.nc tmp.nc" 
-> title: "COARDS/netCDF file containing monthly emissions of NO" 

The following items DO NOT ADHERE to the COARDS standard:
---------------------------------------------------------------------------

The following optional items are RECOMMENDED:
---------------------------------------------------------------------------
-> Consider adding the "format" global attribute
-> Consider adding the "references" global attribute

---------------------------------------------------------------------------
For detailed instructions on how to edit netCDF files, see:
 1. "Work with netCDF files" and
 2. "Prepare COARDS-compliant netCDF files"
at the GEOS-Chem manual (geos-chem.readthedocs.io).
---------------------------------------------------------------------------
yantosca commented 1 year ago

Thanks @1Dandan!

msulprizio commented 1 year ago

This update is now marked as delivered on the Model Development Priority page as well.

Ruijun-Dang commented 4 months ago

Hi @1Dandan, thank you for preparing the data! I noticed reversed seasonality in v2023-04 compared to v2021-06. The figure provides an example of the global mean NH3 emission rate from the agricultural sector. This reversed seasonality is observed in other species as well, including NO. It might worth a double-check.

image
yantosca commented 4 months ago

Thanks @Ruijun-Dang and @1Dandan. I will hold off on implementing this until we resolve the seasonality issue.

1Dandan commented 3 months ago

Thanks @Ruijun-Dang for your caution and patience and thanks @yantosca for reminding. I also noticed that the seasonality of all species from all sectors is flipped for CEDS at 0.1 degree from CEDS at 0.5 degree, which is originated from the original dataset from PNNL. The attached plots show that the seasonality for CEDS at 0.1 degree is flipped from CEDS at 0.5 degree for an example year of 2017. The map is plotted from original dataset downloaded from PNNL DataHub (https://data.pnnl.gov/group/nodes/dataset/13488 for CEDS at 0.1, and https://data.pnnl.gov/dataset/CEDS-4-21-21 for CEDS at 0.5) for the absolute differences between May and Sep in the year of 2017, which also confirms the problem.

I contacted Steven J. Smith and computing supports from PNNL and they are currently checking into it. I will keep you posted with any further progress.

Comp_seasonality_CEDS_0.5_0.1_2017_MonMean_GL.pdf

1Dandan commented 3 weeks ago

Hi @yantosca @msulprizio @Ruijun-Dang, I have received the fixed CEDS at 0.1 degree dataset from PNNL and processed it. The fixed dataset shows consistent seasonality versus CEDS v2 at 0.5 degree: TimeSeries_CEDS_fixed_species_2017_MonMean_GL.pdf

The processed dataset is available at: http://geoschemdata.wustl.edu/ExtData/HEMCO/CEDS/v2024-06/ The isCoards outputs also show adherence to COARDS convention:

===========================================================================
Filename: CEDS_ALD2_0.1x0.1_2019.nc
===========================================================================

The following items adhere to the COARDS standard:
---------------------------------------------------------------------------
-> Dimension "time" adheres to standard usage
-> Dimension "lat" adheres to standard usage
-> Dimension "lon" adheres to standard usage
-> Dimension "lat" uses only lowercase letters (requirement for GCHP)
-> lat(lat)
-> lat is monotonically increasing
-> lat:axis = "Y" 
-> lat:long_name = "Latitude" 
-> lat:units = "degrees_north" 
-> Dimension "lon" uses only lowercase letters (requirement for GCHP)
-> lon(lon)
-> lon is monotonically increasing
-> lon:axis = "X" 
-> lon:long_name = "Longitude" 
-> lon:units = "degrees_east" 
-> Dimension "time" uses only lowercase letters (requirement for GCHP)
-> time(time)
-> time is monotonically increasing
-> time[0] = 0 (requirement for GCHP)
-> time:axis = "T" 
-> time:calendar = "standard" 
-> time:long_name = "Time" 
-> time:units = "days since 2019-01-01 00:00:00" 
-> "time:units" does not contain decimals (requirement for GCHP)
-> ALD2_agr(time,lat,lon)
-> ALD2_agr has proper dimension ordering (requirement for GCHP)
-> ALD2_agr:long_name = "ALD2 emission in sector agr" 
-> ALD2_agr:units = "kg/m2/s" 
-> ALD2_agr:long_name = 1.e+15f 
-> ALD2_agr:missing_value = 1.e+15 
-> ALD2_ene(time,lat,lon)
-> ALD2_ene has proper dimension ordering (requirement for GCHP)
-> ALD2_ene:long_name = "ALD2 emission in sector ene" 
-> ALD2_ene:units = "kg/m2/s" 
-> ALD2_ene:long_name = 1.e+15f 
-> ALD2_ene:missing_value = 1.e+15 
-> ALD2_ind(time,lat,lon)
-> ALD2_ind has proper dimension ordering (requirement for GCHP)
-> ALD2_ind:long_name = "ALD2 emission in sector ind" 
-> ALD2_ind:units = "kg/m2/s" 
-> ALD2_ind:long_name = 1.e+15f 
-> ALD2_ind:missing_value = 1.e+15 
-> ALD2_tra(time,lat,lon)
-> ALD2_tra has proper dimension ordering (requirement for GCHP)
-> ALD2_tra:long_name = "ALD2 emission in sector tra" 
-> ALD2_tra:units = "kg/m2/s" 
-> ALD2_tra:long_name = 1.e+15f 
-> ALD2_tra:missing_value = 1.e+15 
-> ALD2_rco(time,lat,lon)
-> ALD2_rco has proper dimension ordering (requirement for GCHP)
-> ALD2_rco:long_name = "ALD2 emission in sector rco" 
-> ALD2_rco:units = "kg/m2/s" 
-> ALD2_rco:long_name = 1.e+15f 
-> ALD2_rco:missing_value = 1.e+15 
-> ALD2_slv(time,lat,lon)
-> ALD2_slv has proper dimension ordering (requirement for GCHP)
-> ALD2_slv:long_name = "ALD2 emission in sector slv" 
-> ALD2_slv:units = "kg/m2/s" 
-> ALD2_slv:long_name = 1.e+15f 
-> ALD2_slv:missing_value = 1.e+15 
-> ALD2_wst(time,lat,lon)
-> ALD2_wst has proper dimension ordering (requirement for GCHP)
-> ALD2_wst:long_name = "ALD2 emission in sector wst" 
-> ALD2_wst:units = "kg/m2/s" 
-> ALD2_wst:long_name = 1.e+15f 
-> ALD2_wst:missing_value = 1.e+15 
-> ALD2_shp(time,lat,lon)
-> ALD2_shp has proper dimension ordering (requirement for GCHP)
-> ALD2_shp:long_name = "ALD2 emission in sector shp" 
-> ALD2_shp:units = "kg/m2/s" 
-> ALD2_shp:long_name = 1.e+15f 
-> ALD2_shp:missing_value = 1.e+15 
-> conventions: "COARDS" 
-> title: "COARDS/netCDF file containing monthly emissions of ALD2" 

The following items DO NOT ADHERE to the COARDS standard:
---------------------------------------------------------------------------
-> The "history" global attribute is missing

The following optional items are RECOMMENDED:
---------------------------------------------------------------------------
-> Consider adding the "format" global attribute
-> Consider adding the "references" global attribute

---------------------------------------------------------------------------
For detailed instructions on how to edit netCDF files, see:
 1. "Work with netCDF files" and
 2. "Prepare COARDS-compliant netCDF files"
at the GEOS-Chem manual (geos-chem.readthedocs.io).
---------------------------------------------------------------------------