Difference between revisions of "MERRA-2 implementation details"

From Geos-chem
Jump to: navigation, search
(NcdfUtil/perl subdirectory)
(GeosCore directory)
Line 122: Line 122:
 
|-valign="top"
 
|-valign="top"
 
|convection_mod.F
 
|convection_mod.F
|
+
|In routine DO_CONVECTION:
In routine DO_CONVECTION:
+
 
*Changed code to: <tt>#if defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )</tt>
 
*Changed code to: <tt>#if defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )</tt>
  
 
|-valign="top"
 
|-valign="top"
 
|dao_mod.F
 
|dao_mod.F
|
+
|In routine COPY_I6_FIELDS:
In routine COPY_I6_FIELDS:
+
 
*Changed code to: <tt>#if defined( GEOS_FP ) || defined( MERRA2 )</tt>
 
*Changed code to: <tt>#if defined( GEOS_FP ) || defined( MERRA2 )</tt>
 
In routine INTERP:  
 
In routine INTERP:  
Line 136: Line 134:
 
|-valign="top"
 
|-valign="top"
 
|depo_mercury_mod.F
 
|depo_mercury_mod.F
|
+
|In routine ADD_Hg2_SNOWPACK
In routine ADD_Hg2_SNOWPACK
+
 
*Changed code to: <tt>#if defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )</tt>
 
*Changed code to: <tt>#if defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )</tt>
  
 
|-valign="top"
 
|-valign="top"
 
|dust_dead_mod.F
 
|dust_dead_mod.F
|
+
|In routine DST_MBL:  
In routine DST_MBL:  
+
 
*For GEOS-FP, add a new value for parameter FLX_MSS_FDG_FCT.  The scale factor ensures that we get the same dust totals (w/in roundoff error) as for GEOS-5.
 
*For GEOS-FP, add a new value for parameter FLX_MSS_FDG_FCT.  The scale factor ensures that we get the same dust totals (w/in roundoff error) as for GEOS-5.
  
Line 154: Line 150:
 
|-valign="top"
 
|-valign="top"
 
|gamap_mod.F
 
|gamap_mod.F
|
+
|In routine INIT_TRACERINFO:  
In routine INIT_TRACERINFO:  
+
 
*Changed code to: <tt>#elif defined( GEOS_5 ) || defined( MERRA ) || defined( GEOS_FP )</tt>
 
*Changed code to: <tt>#elif defined( GEOS_5 ) || defined( MERRA ) || defined( GEOS_FP )</tt>
  
 
|-valign="top"
 
|-valign="top"
|geosfp_read_mod.F90
+
|merra2_read_mod.F90
|
+
|*Added this module w/ routines to read GEOS-FP met data (in netCDF format)
*Added this module w/ routines to read GEOS-FP met data (in netCDF format)
+
  
 
|-valign="top"
 
|-valign="top"
 
|global_ch4_mod.F
 
|global_ch4_mod.F
|
+
|In routines WETLAND_EMIS and READ_COPROD:
In routines WETLAND_EMIS and READ_COPROD:
+
 
*Now use: <tt>#if defined( GEOS_5 ) || defined( MERRA ) || defined( GEOS_FP )</tt>
 
*Now use: <tt>#if defined( GEOS_5 ) || defined( MERRA ) || defined( GEOS_FP )</tt>
  
 
|-valign="top"
 
|-valign="top"
 
|input_mod.F
 
|input_mod.F
|
+
|In routine READ_SIMULATION_MENU:  
In routine READ_SIMULATION_MENU:  
+
*Now read value for <tt>Input_Opt%MERRA2_DIR</tt> from <tt>input.geos</tt>
*Read value for GEOS_FP_DIR from <tt>input.geos</tt> file and save into <tt>Input_Opt</tt>
+
*Also set <tt>Input_Opt%RES_DIR</tt> accordingly for 0.5&deg; x 0.625&deg; nested grids
*Set LUNZIP=.FALSE. for GEOS-FP met
+
*Set LUNZIP=.FALSE. for MERRA2 met
 
In routine READ_CONVECTION_MENU:  
 
In routine READ_CONVECTION_MENU:  
*Change #if statement to allow non-local PBL mixing for GEOS-FP met data
+
*Change #if statement to allow non-local PBL mixing for MERRA2 met data
In routine READ_EMISSIONS_MENU:
+
*Turn off LMEGANMONO when LMEGAN is turned off
+
 
In routine VALIDATE_DIRECTORIES:  
 
In routine VALIDATE_DIRECTORIES:  
*Error check GEOS_FP_DIR for start & end date
+
*Error check MERRA2_DIR for start & end date
  
 
|-valign="top"
 
|-valign="top"
Line 186: Line 177:
 
|
 
|
 
In routines LAND_MERCURY_FLUX:
 
In routines LAND_MERCURY_FLUX:
*Changed code to: <tt>#if defined( MERRA ) || defined( GEOS_FP )</tt>
+
*Changed code to: <tt>#if defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )</tt>
 
In routines SOILEMIS:
 
In routines SOILEMIS:
*Changed code to: <tt>#if defined( MERRA ) || defined( GEOS_FP )</tt>
+
*Changed code to: <tt>#if defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )</tt>
 
*Extend #if statement for variable SOIL_EMIS_FAC to get the code to compile w/o error.<br>'''''(NOTE: Team Hg: you will have to submit a proper value for this later.'''''  
 
*Extend #if statement for variable SOIL_EMIS_FAC to get the code to compile w/o error.<br>'''''(NOTE: Team Hg: you will have to submit a proper value for this later.'''''  
 
|-valign="top"
 
|lightning_nox_mod.F
 
|
 
In routine LIGHTNING:
 
*Eliminate the shallow-cloud inhibititon trap for GEOS-FP, as we already do for GEOS-5 and MERRA
 
In routine GET_OTD_LIS_SCALE:
 
*Now use updated values for <tt>ANN_AVG_FLASHRATE</tt> computed by Lee Murray (2013-11-07).
 
  
 
|-valign="top"
 
|-valign="top"
 
|main.F
 
|main.F
 
|
 
|
*Rewrote USE statements for clarity
+
*Added calls to routines from merra2_read_mod.F
*Added calls to routines from geosfp_read_mod.F
+
*Split off the code that reads met fields into internal subroutines READ_INITIAL_MET_FIELDS and READ_MET_FIELDS, for clarity.
+
*Renamed NN to NNN to avoid name confusion
+
  
 
|-valign="top"
 
|-valign="top"
 
|mercury_mod.F
 
|mercury_mod.F
|
+
|In routine CHEMMERCURY
In routine CHEM_Hg0_Hg2:
+
*Add placeholder <tt>K_RED_JNO2</tt> parameter for the 0.5&deg; x 0.625&deg; nested grids. 
*In the block that computes LWC, changed code to: <tt>#if defined( GEOS_5 ) || defined( MERRA ) || defined( GEOS_FP )</tt>
+
**For now use the same value as for the 0.5&deg; x 0.666&deg; grid.  <span style="color:red">Team Hg will need to supply an updated value.</span>
*In the block that computes Hg0 exchange, changed code to: <tt>#if defined( MERRA ) || defined( GEOS_FP )</tt>
+
*Changed code to: <tt>#if defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )</tt>
 +
*Changed code to: <tt>#if defined( GEOS_5 ) || defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )</tt>
  
 
|-valign="top"
 
|-valign="top"
 
|ocean_mercury_mod.F
 
|ocean_mercury_mod.F
|
+
|Multiple instances:
Multiple instances:
+
*Changed code to: <tt>#if defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )</tt>
*Now use: <tt>#if defined( MERRA ) || defined( GEOS_FP )</tt>
+
  
 
|-valign="top"
 
|-valign="top"
 
|planeflight_mod.F
 
|planeflight_mod.F
|
+
|In routine PLANEFLIGHT
In routine PLANEFLIGHT
+
*Now use: <tt>#if defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )</tt>
*Now use: <tt>#if defined( MERRA ) || defined( GEOS_FP )</tt>
+
  
 
|-valign="top"
 
|-valign="top"
 
|strat_chem_mod.F90
 
|strat_chem_mod.F90
|
+
|Multiple instances:
Multiple instances:
+
*Now use: <tt>#if defined( GEOS_5 ) || defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )</tt>
*Now use: <tt>#if defined( GEOS_5 ) || defined( MERRA ) || defined( GEOS_FP )</tt>
+
In routine DO_SYNOZ:
 +
*Add placeholder values for 0.5&deg; x 0.625&deg; grids
  
 
|-valign="top"
 
|-valign="top"
 
|sulfate_mod.F
 
|sulfate_mod.F
|
+
|In routine CHEM_SO2:
Multiple instances:
+
*Changed code to: <tt>#if defined( GEOS_5 ) || defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )</tt>
*Now use: <tt>#if defined( GEOS_5 ) || defined( MERRA ) || defined( GEOS_FP )</tt>
+
In routine INIT_SULFATE:
 +
*Changed code to: <tt>#if !defined( GEOS_5 ) && !defined( MERRA ) && !defined( GEOS_FP ) && !defined( MERRA2 )</tt>
 +
In routine SRCSFC30 (TOMAS-only)
 +
*Added a placeholder value for TSCALE for the 0.5&deg; x 0.625&deg; grids
  
 
|-valign="top"
 
|-valign="top"
Line 246: Line 229:
 
|tpcore_bc_mod.F:
 
|tpcore_bc_mod.F:
 
|Multiple instances:
 
|Multiple instances:
*Now use: <tt>#if defined( GEOS_5 ) || defined( MERRA ) || defined( GEOS_FP )</tt>
+
*Added MERRA2 placeholder values for <tt>I1_BC_CH, I2_BC_CH, J1_BC_CH, J2_BC_CH</tt>
 +
*Added MERRA2 placeholder values for <tt>I1_BC_EU, I2_BC_EU, J1_BC_EU, J2_BC_EU</tt>
 +
*Added MERRA2 placeholder values for <tt>I1_BC_NA, I2_BC_NA, J1_BC_NA, J2_BC_NA</tt>  
  
 
|-valign="top"
 
|-valign="top"
 
|vdiff_mod.F90
 
|vdiff_mod.F90
 
|In routine VDIFFDR:
 
|In routine VDIFFDR:
*Changed code to: <tt>#if defined( MERRA ) || defined( GEOS_FP )</tt>
+
*Changed code to: <tt>#if defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )</tt>
  
 
|-valign="top"
 
|-valign="top"

Revision as of 16:01, 12 August 2015

Page is under construction.jpg

Required coding changes in GEOS-Chem

As noted in the section above, the similarities between MERRA and GEOS-FP (especially of the vertical grids) means that in most cases we can just treat MERRA in the same way as for GEOS-5. In many areas of the code, the coding changes are straightforward and simply involve an extension of C-preprocessor statements such as:

#if defined( GEOS_5 ) || defined( MERRA )

to

#if defined( GEOS_5 ) || defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )

In other areas of GEOS-Chem the changes are more involved. Below we provide a description of the areas of GEOS-Chem that were modified for MERRA:

Top-level directory

File Modifications made
Makefile_header.mk
  • If MET=merra2 or MET=merra-2 (case-insensitive), then activate the MERRA2 C-preprocessor switch
    • i.e. Add -DMERRA2 to the Makefile variable USER_DEFS.
  • If GRID=05x0625 is added, then activate the GRID05x0625 C-preprocessor switch
    • i.e. Add -DGRID05x0625 to the Makefile variable USER_DEFS.

--Bob Y. (talk) 21:25, 11 August 2015 (UTC)

Headers directory

The following modifications for MERRA2 were made in the Headers/ directory:

File Modifications made
CMN_SIZE_mod.F
  • Added size parameters for GEOS-FP grids at 4° x 5° 2° x 2.5° and 0.25° x 0.3125° resolution
gigc_input_opt_mod.F90
  • Add MERRA2_DIR to the OptInput derived type
  • Set Input_Opt%MERRA2_DIR = './' in routine Init_GIGC_Input_Opt
gigc_state_met_mod.F90 Multiple instances:
  • Now use: #if defined( GEOS_FP ) || defined( MERRA ) || defined( MERRA2 )

--Bob Y. (talk) 21:26, 11 August 2015 (UTC)

GeosUtil directory

The following modifications for GEOS-FP were made in the GeosUtil/ directory:

File Modifications made
bpch2_mod.F In routine GET_MODELNAME:
  • Add MERRA2_47L and MERRA2 modelnames to the #if block

In routine GET_NAME_EXT:

  • Return grid name merra2 for MERRA2 fields

In routine GET_NAME_EXT_2D:

  • Now use #if defined( MERRA ) || defined( MERRA2 )

In routine GET_RES_EXT:

  • Return resolution string <tt>05x0625 for 0.5° x 0.625° grids
pressure_mod.F In routines GET_PEDGE and GET_PEDGE_FULLGRID:
  • Compute PEDGE for MERRA2 in the same way as for GEOS-5, MERRA, and GEOS-FP

In routine INIT_PRESSURE:

  • Initialize Ap and Bp for MERRA2 in the same way as for GEOS-5, MERRA, and GEOS-FP
time_mod.F In routine GET_A1_TIME:
  • Compute the DATE array for MERRA2 the same way as is done for MERRA and GEOS-FP
transfer_mod.F In several routines:
  • Changed code to #if defined( GEOS_5 ) || defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )

--Bob Y. (talk) 21:40, 11 August 2015 (UTC)

GeosCore directory

The following modifications for GEOS-FP were made in the GeosCore/ directory:

File Modifications made
calcrate.F Multiple instances:
  • Now use: #if defined( GEOS_5 ) || defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )
carbon_mod.F Multiple instances:
  • Now use: #if defined( GEOS_5 ) || defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )
cldice_HbrHOBr_mod.F Multiple instances:
  • Now use: #if defined( GEOS_5 ) || defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )
convection_mod.F In routine DO_CONVECTION:
  • Changed code to: #if defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )
dao_mod.F In routine COPY_I6_FIELDS:
  • Changed code to: #if defined( GEOS_FP ) || defined( MERRA2 )

In routine INTERP:

  • Changed code to: #if defined( GEOS_FP ) || defined( MERRA2 )
depo_mercury_mod.F In routine ADD_Hg2_SNOWPACK
  • Changed code to: #if defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )
dust_dead_mod.F In routine DST_MBL:
  • For GEOS-FP, add a new value for parameter FLX_MSS_FDG_FCT. The scale factor ensures that we get the same dust totals (w/in roundoff error) as for GEOS-5.
fast_jx_mod.F In routine FAST_JX:
  • Do cloud overlapping for GEOS-FP in the same way as for GEOS-5 and MERRA.
  • Now use: #if defined( GEOS_5 ) || defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )
gamap_mod.F In routine INIT_TRACERINFO:
  • Changed code to: #elif defined( GEOS_5 ) || defined( MERRA ) || defined( GEOS_FP )
merra2_read_mod.F90 *Added this module w/ routines to read GEOS-FP met data (in netCDF format)
global_ch4_mod.F In routines WETLAND_EMIS and READ_COPROD:
  • Now use: #if defined( GEOS_5 ) || defined( MERRA ) || defined( GEOS_FP )
input_mod.F In routine READ_SIMULATION_MENU:
  • Now read value for Input_Opt%MERRA2_DIR from input.geos
  • Also set Input_Opt%RES_DIR accordingly for 0.5° x 0.625° nested grids
  • Set LUNZIP=.FALSE. for MERRA2 met

In routine READ_CONVECTION_MENU:

  • Change #if statement to allow non-local PBL mixing for MERRA2 met data

In routine VALIDATE_DIRECTORIES:

  • Error check MERRA2_DIR for start & end date
land_mercury_mod.F

In routines LAND_MERCURY_FLUX:

  • Changed code to: #if defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )

In routines SOILEMIS:

  • Changed code to: #if defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )
  • Extend #if statement for variable SOIL_EMIS_FAC to get the code to compile w/o error.
    (NOTE: Team Hg: you will have to submit a proper value for this later.
main.F
  • Added calls to routines from merra2_read_mod.F
mercury_mod.F In routine CHEMMERCURY
  • Add placeholder K_RED_JNO2 parameter for the 0.5° x 0.625° nested grids.
    • For now use the same value as for the 0.5° x 0.666° grid. Team Hg will need to supply an updated value.
  • Changed code to: #if defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )
  • Changed code to: #if defined( GEOS_5 ) || defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )
ocean_mercury_mod.F Multiple instances:
  • Changed code to: #if defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )
planeflight_mod.F In routine PLANEFLIGHT
  • Now use: #if defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )
strat_chem_mod.F90 Multiple instances:
  • Now use: #if defined( GEOS_5 ) || defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )

In routine DO_SYNOZ:

  • Add placeholder values for 0.5° x 0.625° grids
sulfate_mod.F In routine CHEM_SO2:
  • Changed code to: #if defined( GEOS_5 ) || defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )

In routine INIT_SULFATE:

  • Changed code to: #if !defined( GEOS_5 ) && !defined( MERRA ) && !defined( GEOS_FP ) && !defined( MERRA2 )

In routine SRCSFC30 (TOMAS-only)

  • Added a placeholder value for TSCALE for the 0.5° x 0.625° grids
tagged_ox_mod.F In routine GET_REGIONAL_POX:
  • Now use: #if defined( GEOS_5 ) || defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )
tpcore_bc_mod.F: Multiple instances:
  • Added MERRA2 placeholder values for I1_BC_CH, I2_BC_CH, J1_BC_CH, J2_BC_CH
  • Added MERRA2 placeholder values for I1_BC_EU, I2_BC_EU, J1_BC_EU, J2_BC_EU
  • Added MERRA2 placeholder values for I1_BC_NA, I2_BC_NA, J1_BC_NA, J2_BC_NA
vdiff_mod.F90 In routine VDIFFDR:
  • Changed code to: #if defined( MERRA ) || defined( GEOS_FP ) || defined( MERRA2 )
wetscav_mod.F In routines DO_WETDEP, DO_WASHOUT_ONLY
  • Changed code to: #if defined( MERRA ) || defined( GEOS_FP )

In routine MAKE_QQ:

  • Add #if block for GEOS-FP met
  • Refer to PFILSAN(I,J,L+1) and PFLLSAN(I,J,L+1), since these fields are defined on level edges

In routine RAINOUT:

  • Changed code to: #if defined( GEOS_5 ) || defined( MERRA ) || defined( GEOS_FP )

--Bob Y. (talk) 22:13, 11 August 2015 (UTC)