From a093dfc583a4f0971f4b16bc6a77da39c9a4c773 Mon Sep 17 00:00:00 2001 From: Melissa Sulprizio Date: Fri, 6 Oct 2023 10:22:50 -0400 Subject: [PATCH 1/5] Add initial modifications for running GEOS-Chem at 0.125x0.15625 resolution NASA GMAO has provided 1-hourly mass flux fields for GEOS-FP meteorology at c720 resolution to drive GCHP. The mass flux fields have been converted to derived winds fields and further regridded from c720 to 0.125x0.15625 lat-lon resolution. The new files include the following collections and met fields: - GEOS.fp.asm.I1dyn : PS, SPHU - GEOS.fp.asm.A1dyn : U, V Signed-off-by: Melissa Sulprizio --- CHANGELOG.md | 4 + .../HEMCO_Config.rc.gmao_metfields_0125 | 154 ++++++++++++++++++ run/GCClassic/createRunDir.sh | 20 ++- run/shared/settings/0125x015625.txt | 3 + 4 files changed, 175 insertions(+), 6 deletions(-) create mode 100644 run/GCClassic/HEMCO_Config.rc.templates/HEMCO_Config.rc.gmao_metfields_0125 create mode 100644 run/shared/settings/0125x015625.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index 100aedbd3..13dc2ebd9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ This file documents all notable changes to the GEOS-Chem repository starting in The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased 14.2.1] - TBD +### Added +- Added option to run GEOS-Chem at 0.125x0.15625 resolution using GEOS-FP derived winds fields generated from c720 mass fluxes archived by GMAO + ## [Unreleased 14.2.1] - TBD ### Added - Script `test/difference/diffTest.sh`, checks 2 different integration tests for differences diff --git a/run/GCClassic/HEMCO_Config.rc.templates/HEMCO_Config.rc.gmao_metfields_0125 b/run/GCClassic/HEMCO_Config.rc.templates/HEMCO_Config.rc.gmao_metfields_0125 new file mode 100644 index 000000000..ebc96baf8 --- /dev/null +++ b/run/GCClassic/HEMCO_Config.rc.templates/HEMCO_Config.rc.gmao_metfields_0125 @@ -0,0 +1,154 @@ +#------------------------------------------------------------------------------ +# Harmonized Emissions Component (HEMCO) ! +#------------------------------------------------------------------------------ +#BOP +# +# !MODULE: HEMCO_Config.rc +# +# !DESCRIPTION: Contains configuration information for GMAO meteorology fields +# in HEMCO. +#\\ +#\\ +# !REMARKS: +# See The HEMCO User's Guide for file details: +# http://wiki.geos-chem.org/The_HEMCO_User%27s_Guide +# +# !REVISION HISTORY: +# See https://github.com/geoschem/geos-chem for complete history +#EOP +#------------------------------------------------------------------------------ +#BOC +############################################################################### +### BEGIN SECTION SETTINGS +############################################################################### + +ROOT: ${RUNDIR_DATA_ROOT}/HEMCO +METDIR: ${RUNDIR_DATA_ROOT}/GEOS_0.25x0.3125/GEOS_FP +METDIR_0125: ${RUNDIR_MET_DIR} + +### END SECTION SETTINGS ### + +############################################################################### +### BEGIN SECTION BASE EMISSIONS +############################################################################### + +# ExtNr Name sourceFile sourceVar sourceTime C/R/E SrcDim SrcUnit Species ScalIDs Cat Hier + +#============================================================================== +# --- Meteorology fields --- +#============================================================================== + +# --- CN fields --- +* FRLAKE $METDIR/$CNYR/01/$MET.$CNYR0101.CN.$RES.$NC FRLAKE */1/1/0 C xy 1 * - 1 1 +* FRLAND $METDIR/$CNYR/01/$MET.$CNYR0101.CN.$RES.$NC FRLAND */1/1/0 C xy 1 * - 1 1 +* FRLANDIC $METDIR/$CNYR/01/$MET.$CNYR0101.CN.$RES.$NC FRLANDIC */1/1/0 C xy 1 * - 1 1 +* FROCEAN $METDIR/$CNYR/01/$MET.$CNYR0101.CN.$RES.$NC FROCEAN */1/1/0 C xy 1 * - 1 1 +* PHIS $METDIR/$CNYR/01/$MET.$CNYR0101.CN.$RES.$NC PHIS */1/1/0 C xy 1 * - 1 1 + +# --- A1 fields --- +* ALBEDO $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC ALBEDO 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* CLDTOT $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC CLDTOT 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* EFLUX $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC EFLUX 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* EVAP $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC EVAP 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* FRSEAICE $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC FRSEAICE 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* FRSNO $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC FRSNO 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* GRN $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC GRN 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* GWETROOT $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC GWETROOT 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* GWETTOP $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC GWETTOP 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* HFLUX $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC HFLUX 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* LAI $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC LAI 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* LWGNT $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC LWGNT 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* PARDF $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC PARDF 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* PARDR $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC PARDR 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* PBLH $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC PBLH 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* PRECANV $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC PRECANV 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* PRECCON $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC PRECCON 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* PRECLSC $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC PRECLSC 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* PRECSNO $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC PRECSNO 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* PRECTOT $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC PRECTOT 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* QV2M $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC QV2M 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* SEAICE00 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC SEAICE00 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* SEAICE10 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC SEAICE10 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* SEAICE20 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC SEAICE20 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* SEAICE30 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC SEAICE30 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* SEAICE40 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC SEAICE40 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* SEAICE50 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC SEAICE50 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* SEAICE60 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC SEAICE60 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* SEAICE70 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC SEAICE70 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* SEAICE80 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC SEAICE80 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* SEAICE90 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC SEAICE90 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* SLP $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC SLP 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* SNODP $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC SNODP 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* SNOMAS $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC SNOMAS 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* SWGDN $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC SWGDN 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* TO3 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC TO3 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* TROPPT $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC TROPPT 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* TS $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC TS 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* T2M $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC T2M 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* U10M $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC U10M 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* USTAR $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC USTAR 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* V10M $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC V10M 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* Z0M $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC Z0M 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 + +# --- A3cld fields --- +* CLOUD $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3cld.$RES.$NC CLOUD 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* OPTDEPTH $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3cld.$RES.$NC OPTDEPTH 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* QI $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3cld.$RES.$NC QI 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* QL $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3cld.$RES.$NC QL 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* TAUCLI $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3cld.$RES.$NC TAUCLI 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* TAUCLW $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3cld.$RES.$NC TAUCLW 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 + +# --- A3dyn fields --- +* DTRAIN $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3dyn.$RES.$NC DTRAIN 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* OMEGA $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3dyn.$RES.$NC OMEGA 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* RH $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3dyn.$RES.$NC RH 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 + +# --- A3mstC fields --- +* DQRCU $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3mstC.$RES.$NC DQRCU 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* DQRLSAN $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3mstC.$RES.$NC DQRLSAN 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* REEVAPCN $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3mstC.$RES.$NC REEVAPCN 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* REEVAPLS $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3mstC.$RES.$NC REEVAPLS 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 + +# --- A3mstE fields --- +* CMFMC $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3mstE.$RES.$NC CMFMC 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* PFICU $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3mstE.$RES.$NC PFICU 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* PFILSAN $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3mstE.$RES.$NC PFILSAN 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* PFLCU $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3mstE.$RES.$NC PFLCU 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* PFLLSAN $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3mstE.$RES.$NC PFLLSAN 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 + +# --- I3 fields --- +* TMPU $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.I3.$RES.$NC T 1980-2021/1-12/1-31/* EFY xyz 1 * - 1 1 +* TMPU_NEXTDAY $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.I3.$RES.$NC T 1980-2021/1-12/1-31/1/+1day EFY xyz 1 * - 1 1 + +# --- 0.125x0.15625 fields --- +* U $METDIR_0125/Y$YYYY/M$MM/D$DD/GEOS.fp.asm.A1dyn.0125x015625.NA.$YYYY$MM$DD_$hh.V01.nc4 UA 2021-2023/1-12/1-31/0-23/+90minute EFY xyz 1 * - 1 1 +* V $METDIR_0125/Y$YYYY/M$MM/D$DD/GEOS.fp.asm.A1dyn.0125x015625.NA.$YYYY$MM$DD_$hh.V01.nc4 VA 2021-2023/1-12/1-31/0-23/+90minute EFY xyz 1 * - 1 1 +* PS $METDIR_0125/Y$YYYY/M$MM/D$DD/GEOS.fp.asm.I1dyn.0125x015625.NA.$YYYY$MM$DD_$hh.V01.nc4 PS 2021-2023/1-12/1-31/0-23 EFY xy 1 * - 1 1 +* SPHU $METDIR_0125/Y$YYYY/M$MM/D$DD/GEOS.fp.asm.I1dyn.0125x015625.NA.$YYYY$MM$DD_$hh.V01.nc4 QV 2021-2023/1-12/1-31/0-23 EFY xyz 1 * - 1 1 + +* PS_NEXTDAY $METDIR_0125/Y$YYYY/M$MM/D$DD/GEOS.fp.asm.I1dyn.0125x015625.NA.$YYYY$MM$DD_$hh.V01.nc4 PS 2021-2023/1-12/1-31/0-23/+1day EFY xy 1 * - 1 1 +* SPHU_NEXTDAY $METDIR_0125/Y$YYYY/M$MM/D$DD/GEOS.fp.asm.I1dyn.0125x015625.NA.$YYYY$MM$DD_$hh.V01.nc4 QV 2021-2023/1-12/1-31/0-23/+1day EFY xyz 1 * - 1 1 + +#============================================================================== +# --- Fields for lightning emissions (Extension 103) --- +# +# Native-resolution lightning flash rates constrained to LIS/OTD climatology +# and convective depth are now prescribed as offline meteorology. +# --Lee Murray (16 Jan 2019) +#============================================================================== +(((LightNOx +(((.not.LightningClimatology +* FLASH_DENS $ROOT/OFFLINE_LIGHTNING/v2020-03/$MET/$YYYY/FLASH_CTH_$MET_${RUNDIR_MET_NATIVE_RES}_$YYYY_$MM.nc4 LDENS 1980-2021/1-12/1-31/0-23/+90minute RFY3 xy 1 * - 1 1 +* CONV_DEPTH $ROOT/OFFLINE_LIGHTNING/v2020-03/$MET/$YYYY/FLASH_CTH_$MET_${RUNDIR_MET_NATIVE_RES}_$YYYY_$MM.nc4 CTH 1980-2021/1-12/1-31/0-23/+90minute RFY3 xy 1 * - 1 1 +))).not.LightningClimatology + +(((LightningClimatology +* FLASH_DENS $ROOT/OFFLINE_LIGHTNING/v2020-03/$MET/CLIM/FLASH_CTH_$MET_${RUNDIR_MET_NATIVE_RES}_${RUNDIR_MET_LCLIM}.ymonmean.nc4 LDENS 2019/1-12/1/0 C xy 1 * - 1 1 +* CONV_DEPTH $ROOT/OFFLINE_LIGHTNING/v2020-03/$MET/CLIM/FLASH_CTH_$MET_${RUNDIR_MET_NATIVE_RES}_${RUNDIR_MET_LCLIM}.ymonmean.nc4 CTH 2019/1-12/1/0 C xy 1 * - 1 1 +)))LightningClimatology +)))LightNOx + +### END SECTION BASE EMISSIONS ### + +### END OF HEMCO INPUT FILE ### +#EOC \ No newline at end of file diff --git a/run/GCClassic/createRunDir.sh b/run/GCClassic/createRunDir.sh index 5166b3ddc..566499ed8 100755 --- a/run/GCClassic/createRunDir.sh +++ b/run/GCClassic/createRunDir.sh @@ -494,6 +494,7 @@ else printf " 3. 0.5 x 0.625\n" if [[ "x${met}" == "xgeosfp" ]]; then printf " 4. 0.25 x 0.3125\n" + printf " 5. 0.125 x 0.15625\n" fi fi @@ -511,8 +512,6 @@ while [ "${valid_res}" -eq 0 ]; do grid_res='05x0625' RUNDIR_VARS+="$(cat ${gcdir}/run/shared/settings/05x0625.txt)\n" elif [[ "x${res_num}" == "x4" ]]; then - # Error check: Don't allow a 0.25 x 0.3125 MERRA-2 rundir. - # -- Melissa Sulprizio, Bob Yantosca (12 Sep 2023) if [[ "x${met}" == "xmerra2" ]]; then valid_res=0 printf "Cannot create a MERRA-2 rundir at 0.25 x 0.3125 " @@ -520,6 +519,15 @@ while [ "${valid_res}" -eq 0 ]; do fi grid_res='025x03125' RUNDIR_VARS+="$(cat ${gcdir}/run/shared/settings/025x03125.txt)\n" + elif [[ "x${res_num}" == "x5" ]]; then + if [[ "x${met}" == "xmerra2" ]]; then + valid_res=0 + printf "Cannot create a MERRA-2 rundir at 0.125 x 0.15625 " + printf "resolution!\nPlease make another selection.\n" + fi + grid_res='0125x015625' + RUNDIR_VARS+="$(cat ${gcdir}/run/shared/settings/0125x015625.txt)\n" + RUNDIR_VARS+="RUNDIR_MET_FIELD_CONFIG='HEMCO_Config.rc.gmao_metfields_0125'\n" else valid_res=0 printf "Invalid horizontal resolution option.\n" @@ -527,7 +535,7 @@ while [ "${valid_res}" -eq 0 ]; do fi done -if [[ ${grid_res} = "05x0625" ]] || [[ ${grid_res} = "025x03125" ]]; then +if [[ ${grid_res} = "05x0625" ]] || [[ ${grid_res} = "025x03125" ]] || [[ ${grid_res} = "0125x015625" ]]; then printf "${thinline}Choose horizontal grid domain:${thinline}" printf " 1. Global\n" printf " 2. Asia\n" @@ -550,7 +558,7 @@ if [[ ${grid_res} = "05x0625" ]] || [[ ${grid_res} = "025x03125" ]]; then if [[ ${grid_res} = "05x0625" ]]; then RUNDIR_VARS+="RUNDIR_GRID_LON_RANGE='[ 60.0, 150.0]'\n" RUNDIR_VARS+="RUNDIR_GRID_LAT_RANGE='[-11.0, 55.0]'\n" - elif [[ ${grid_res} = "025x03125" ]]; then + elif [[ ${grid_res} = "025x03125" ]] || [[ ${grid_res} = "0125x015625" ]]; then RUNDIR_VARS+="RUNDIR_GRID_LON_RANGE='[ 70.0, 140.0]'\n" RUNDIR_VARS+="RUNDIR_GRID_LAT_RANGE='[ 15.0, 55.0]'\n" fi @@ -560,7 +568,7 @@ if [[ ${grid_res} = "05x0625" ]] || [[ ${grid_res} = "025x03125" ]]; then if [[ ${grid_res} = "05x0625" ]]; then RUNDIR_VARS+="RUNDIR_GRID_LON_RANGE='[-30.0, 50.0]'\n" RUNDIR_VARS+="RUNDIR_GRID_LAT_RANGE='[ 30.0, 70.0]'\n" - elif [[ ${grid_res} = "025x03125" ]]; then + elif [[ ${grid_res} = "025x03125" ]] || [[ ${grid_res} = "0125x015625" ]]; then RUNDIR_VARS+="RUNDIR_GRID_LON_RANGE='[-15.0, 40.0 ]'\n" RUNDIR_VARS+="RUNDIR_GRID_LAT_RANGE='[ 32.75, 61.25]'\n" fi @@ -570,7 +578,7 @@ if [[ ${grid_res} = "05x0625" ]] || [[ ${grid_res} = "025x03125" ]]; then if [[ ${grid_res} = "05x0625" ]]; then RUNDIR_VARS+="RUNDIR_GRID_LON_RANGE='[-140.0, -40.0]'\n" RUNDIR_VARS+="RUNDIR_GRID_LAT_RANGE='[ 10.0, 70.0]'\n" - elif [[ ${grid_res} = "025x03125" ]]; then + elif [[ ${grid_res} = "025x03125" ]] || [[ ${grid_res} = "0125x015625" ]]; then RUNDIR_VARS+="RUNDIR_GRID_LON_RANGE='[-130.0, -60.0]'\n" RUNDIR_VARS+="RUNDIR_GRID_LAT_RANGE='[ 9.75, 60.0]'\n" fi diff --git a/run/shared/settings/0125x015625.txt b/run/shared/settings/0125x015625.txt new file mode 100644 index 000000000..79f244a66 --- /dev/null +++ b/run/shared/settings/0125x015625.txt @@ -0,0 +1,3 @@ +RUNDIR_GRID_RES='0125x015625' +RUNDIR_GRID_RES_LONG='0.125x0.15625' +RUNDIR_GRID_DIR='0.125x0.15625' From 4d77fcb63b9f81d313f25fcb27739257af8e0d12 Mon Sep 17 00:00:00 2001 From: Melissa Sulprizio Date: Tue, 21 Nov 2023 10:41:46 -0500 Subject: [PATCH 2/5] Expand IF statements for GridRes to include 0.125x0.15625 resolution Several IF statements have been expanded to include State_Grid%GridRes = 0.125x0.15625 resolution so that grid parameters and scale factors are properly determined. Also updated createRunDir.sh for GCClassic to correctly set transport and chemistry timesteps for 0.125x0.15625 resolution. For now the same default timesteps as 0.25x0.3125 and 0.5x0.625 will be used (transport=5 min, chemistry=10 min). This recommendation may later changed based on proper evaluation of the 0.125x0.15625 simulations. Signed-off-by: Melissa Sulprizio --- GeosCore/input_mod.F90 | 2 ++ GeosCore/pjc_pfix_window_mod.F90 | 46 ++++++++++++++++++++------------ GeosCore/sulfate_mod.F90 | 2 ++ GeosCore/tomas_mod.F90 | 2 ++ GeosCore/tpcore_window_mod.F90 | 10 ++++--- run/GCClassic/createRunDir.sh | 2 +- 6 files changed, 42 insertions(+), 22 deletions(-) diff --git a/GeosCore/input_mod.F90 b/GeosCore/input_mod.F90 index 469bb2978..84e96c9c1 100644 --- a/GeosCore/input_mod.F90 +++ b/GeosCore/input_mod.F90 @@ -5495,6 +5495,8 @@ SUBROUTINE Check_Time_Steps( Input_Opt, State_Grid, RC ) MAX_DYN = 600 ELSE IF ( TRIM(State_Grid%GridRes) == '0.25x0.3125' ) THEN MAX_DYN = 300 + ELSE IF ( TRIM(State_Grid%GridRes) == '0.125x0.15625' ) THEN + MAX_DYN = 300 ELSE MAX_DYN = 3600 ENDIF diff --git a/GeosCore/pjc_pfix_window_mod.F90 b/GeosCore/pjc_pfix_window_mod.F90 index 6d7fd1e6e..720ded07a 100644 --- a/GeosCore/pjc_pfix_window_mod.F90 +++ b/GeosCore/pjc_pfix_window_mod.F90 @@ -1209,12 +1209,15 @@ SUBROUTINE Convert_Winds(State_Grid, igd, tdt, cosp, crx, cry, uu, vv) ri2 = i2_gl rj2m1 = j2_gl - 1 - IF ( TRIM(State_Grid%GridRes) == '0.25x0.3125' ) THEN - dl = 2.0e+0_fp * PI / 1152.0_fp - dp = PI /720e+0_fp - ELSEIF ( TRIM(State_Grid%GridRes) == '0.5x0.625' ) THEN + IF ( TRIM(State_Grid%GridRes) == '0.5x0.625' ) THEN dl = 2.0e+0_fp * PI / 576.0_fp dp = PI /360e+0_fp + ELSE IF ( TRIM(State_Grid%GridRes) == '0.25x0.3125' ) THEN + dl = 2.0e+0_fp * PI / 1152.0_fp + dp = PI /720e+0_fp + ELSE IF ( TRIM(State_Grid%GridRes) == '0.125x0.15625' ) THEN + dl = 2.0e+0_fp * PI / 2304.0_fp + dp = PI /720e+0_fp ENDIF dtdy = tdt / (Re * dp) @@ -1373,12 +1376,15 @@ SUBROUTINE Calc_Horiz_Mass_Flux & ri2 = i2_gl rj2m1 = j2_gl - 1 - IF ( TRIM(State_Grid%GridRes) == '0.25x0.3125' ) THEN - dl = 2.0e+0_fp * PI / 1152.0_fp - dp = PI /720.0_fp - ELSEIF ( TRIM(State_Grid%GridRes) == '0.5x0.625' ) THEN + IF ( TRIM(State_Grid%GridRes) == '0.5x0.625' ) THEN dl = 2.0e+0_fp * PI / 576.0_fp dp = PI /360.0_fp + ELSE IF ( TRIM(State_Grid%GridRes) == '0.25x0.3125' ) THEN + dl = 2.0e+0_fp * PI / 1152.0_fp + dp = PI /720.0_fp + ELSE IF ( TRIM(State_Grid%GridRes) == '0.125x0.15625' ) THEN + dl = 2.0e+0_fp * PI / 2304.0_fp + dp = PI /720.0_fp ENDIF facty = 0.5_fp * tdt / (Re * dp) @@ -1866,18 +1872,22 @@ SUBROUTINE INIT_PJC_PFIX_WINDOW( State_Grid ) ENDDO ! Longitude spacing - IF ( TRIM(State_Grid%GridRes) == '0.25x0.3125' ) THEN - DLON_FV = 2.0_fp * PI / 1152.0_fp - ELSE IF ( TRIM(State_Grid%GridRes) == '0.5x0.625' ) THEN + IF ( TRIM(State_Grid%GridRes) == '0.5x0.625' ) THEN DLON_FV = 2.0_fp * PI / 576.0_fp + ELSE IF ( TRIM(State_Grid%GridRes) == '0.25x0.3125' ) THEN + DLON_FV = 2.0_fp * PI / 1152.0_fp + ELSE IF ( TRIM(State_Grid%GridRes) == '0.125x0.15625' ) THEN + DLON_FV = 2.0_fp * PI / 2304.0_fp ENDIF ! Latitude edge at south pole [radians] !ELAT_FV(1) = -0.5e+0_fp * PI - IF ( TRIM(State_Grid%GridRes) == '0.25x0.3125' ) THEN - ELAT_FV(1) = CLAT_FV(1) - 0.125_fp * PI / 180.0_fp - ELSE IF ( TRIM(State_Grid%GridRes) == '0.5x0.625' ) THEN + IF ( TRIM(State_Grid%GridRes) == '0.5x0.625' ) THEN ELAT_FV(1) = CLAT_FV(1) - 0.25_fp * PI / 180.0_fp + ELSE IF ( TRIM(State_Grid%GridRes) == '0.25x0.3125' ) THEN + ELAT_FV(1) = CLAT_FV(1) - 0.125_fp * PI / 180.0_fp + ELSE IF ( TRIM(State_Grid%GridRes) == '0.125x0.15625' ) THEN + ELAT_FV(1) = CLAT_FV(1) - 0.0625_fp * PI / 180.0_fp ENDIF ! SIN and COS of lat edge at south pole [unitless] @@ -1897,10 +1907,12 @@ SUBROUTINE INIT_PJC_PFIX_WINDOW( State_Grid ) ! Latitude edge at North Pole [radians] !ELAT_FV(J2_GL+1) = 0.5e+0_fp * PI ! for nested NA or EA (lzh, 07/20/2010) - IF ( TRIM(State_Grid%GridRes) == '0.25x0.3125' ) THEN - ELAT_FV(J2_GL+1) = CLAT_FV(J2_GL)+0.125_fp * PI / 180.0_fp - ELSE IF ( TRIM(State_Grid%GridRes) == '0.5x0.625' ) THEN + IF ( TRIM(State_Grid%GridRes) == '0.5x0.625' ) THEN ELAT_FV(J2_GL+1) = CLAT_FV(J2_GL)+0.25_fp * PI / 180.0_fp + ELSE IF ( TRIM(State_Grid%GridRes) == '0.25x0.3125' ) THEN + ELAT_FV(J2_GL+1) = CLAT_FV(J2_GL)+0.125_fp * PI / 180.0_fp + ELSE IF ( TRIM(State_Grid%GridRes) == '0.125x0.15625' ) THEN + ELAT_FV(J2_GL+1) = CLAT_FV(J2_GL)+0.0625_fp * PI / 180.0_fp ENDIF ! SIN of lat edge at North Pole diff --git a/GeosCore/sulfate_mod.F90 b/GeosCore/sulfate_mod.F90 index 401ba3d6d..01761de89 100644 --- a/GeosCore/sulfate_mod.F90 +++ b/GeosCore/sulfate_mod.F90 @@ -1035,6 +1035,8 @@ SUBROUTINE SRCSF30( Input_Opt, State_Grid, State_Met, State_Chm, TC2, RC ) TSCALE = 1.*3600. ELSE IF ( TRIM(State_Grid%GridRes) == '0.25x0.3125' ) THEN TSCALE = 0.5*3600. + ELSE IF ( TRIM(State_Grid%GridRes) == '0.125x0.15625' ) THEN + TSCALE = 0.25*3600. ENDIF ! Point to species array diff --git a/GeosCore/tomas_mod.F90 b/GeosCore/tomas_mod.F90 index b4c2347f5..90eb88c57 100644 --- a/GeosCore/tomas_mod.F90 +++ b/GeosCore/tomas_mod.F90 @@ -6278,6 +6278,8 @@ SUBROUTINE INIT_TOMAS( Input_Opt, State_Chm, State_Grid, RC ) SGCTSCALE = 1.*3600. ELSE IF ( TRIM(State_Grid%GridRes) == '0.25x0.3125' ) THEN SGCTSCALE = 0.5*3600. + ELSE IF ( TRIM(State_Grid%GridRes) == '0.125x0.15625' ) THEN + SGCTSCALE = 0.25*3600. ENDIF #if defined(TOMAS40) diff --git a/GeosCore/tpcore_window_mod.F90 b/GeosCore/tpcore_window_mod.F90 index 6b05e6c17..6e0705d80 100644 --- a/GeosCore/tpcore_window_mod.F90 +++ b/GeosCore/tpcore_window_mod.F90 @@ -301,10 +301,12 @@ subroutine init_WINDOW(State_Grid, im,jm,km,jfirst,jlast,ng, mg, dt, ae, clat) pi = 4. * atan(1.) - IF ( TRIM(State_Grid%GridRes) == '0.25x0.3125' ) THEN - dlon = 2.*pi / float(1152) !(dan) - ELSEIF ( TRIM(State_Grid%GridRes) == '0.5x0.625' ) THEN - dlon = 2.*pi / float(576) !(dan) + IF ( TRIM(State_Grid%GridRes) == '0.5x0.625' ) THEN + dlon = 2.*pi / float(576) + ELSE IF ( TRIM(State_Grid%GridRes) == '0.25x0.3125' ) THEN + dlon = 2.*pi / float(1152) + ELSE IF ( TRIM(State_Grid%GridRes) == '0.125x0.15625' ) THEN + dlon = 2.*pi / float(2304) ENDIF ! dan for window diff --git a/run/GCClassic/createRunDir.sh b/run/GCClassic/createRunDir.sh index 566499ed8..51b28697f 100755 --- a/run/GCClassic/createRunDir.sh +++ b/run/GCClassic/createRunDir.sh @@ -612,7 +612,7 @@ fi RUNDIR_VARS+="$(cat ${shared_met_settings})\n" # shared_met_settings needs to be included after RUNDIR_GRID_DIR is defined # Set timesteps according to grid resolution -if [[ ${grid_res} = "05x0625" ]] || [[ ${grid_res} = "025x03125" ]]; then +if [[ ${grid_res} = "05x0625" ]] || [[ ${grid_res} = "025x03125" ]] || [[ ${grid_res} = "0125x015625" ]]; then RUNDIR_VARS+="RUNDIR_TRANSPORT_TS='300'\n" RUNDIR_VARS+="RUNDIR_CHEMISTRY_TS='600'\n" else From d22b361a782148e9b6877b282e93698cbaa90724 Mon Sep 17 00:00:00 2001 From: Melissa Sulprizio Date: Tue, 21 Nov 2023 11:38:08 -0500 Subject: [PATCH 3/5] Modify HEMCO_Config.rc.gmao_metfields_0125 to use 0.25x0.3125 NA files for non-dynamic fields The 0.125x0.15625 files are only available for dynamic collections A1dyn and I1dyn. The remaining met fields when running at this resolution should be read at 0.25x0.3125. This file is currently hardcoded to use the North America (NA) files at 0.25x0.3125 resolution for testing, but this should be made more flexible in the future. The 0.125x0.15625 files have also been updated here so that daily files are used instead of hourly files. The use of daily 24-hour met field files has already been implemented in GEOS-Chem, but it does not currently know how to handle hourly files. Signed-off-by: Melissa Sulprizio --- .../HEMCO_Config.rc.gmao_metfields_0125 | 158 +++++++++--------- 1 file changed, 79 insertions(+), 79 deletions(-) diff --git a/run/GCClassic/HEMCO_Config.rc.templates/HEMCO_Config.rc.gmao_metfields_0125 b/run/GCClassic/HEMCO_Config.rc.templates/HEMCO_Config.rc.gmao_metfields_0125 index ebc96baf8..e7dc79ebe 100644 --- a/run/GCClassic/HEMCO_Config.rc.templates/HEMCO_Config.rc.gmao_metfields_0125 +++ b/run/GCClassic/HEMCO_Config.rc.templates/HEMCO_Config.rc.gmao_metfields_0125 @@ -24,7 +24,7 @@ ROOT: ${RUNDIR_DATA_ROOT}/HEMCO METDIR: ${RUNDIR_DATA_ROOT}/GEOS_0.25x0.3125/GEOS_FP -METDIR_0125: ${RUNDIR_MET_DIR} +HIGHRES: ${RUNDIR_MET_DIR} ### END SECTION SETTINGS ### @@ -39,95 +39,95 @@ METDIR_0125: ${RUNDIR_MET_DIR} #============================================================================== # --- CN fields --- -* FRLAKE $METDIR/$CNYR/01/$MET.$CNYR0101.CN.$RES.$NC FRLAKE */1/1/0 C xy 1 * - 1 1 -* FRLAND $METDIR/$CNYR/01/$MET.$CNYR0101.CN.$RES.$NC FRLAND */1/1/0 C xy 1 * - 1 1 -* FRLANDIC $METDIR/$CNYR/01/$MET.$CNYR0101.CN.$RES.$NC FRLANDIC */1/1/0 C xy 1 * - 1 1 -* FROCEAN $METDIR/$CNYR/01/$MET.$CNYR0101.CN.$RES.$NC FROCEAN */1/1/0 C xy 1 * - 1 1 -* PHIS $METDIR/$CNYR/01/$MET.$CNYR0101.CN.$RES.$NC PHIS */1/1/0 C xy 1 * - 1 1 +* FRLAKE $METDIR/$CNYR/01/$MET.$CNYR0101.CN.025x03125.NA.$NC FRLAKE */1/1/0 C xy 1 * - 1 1 +* FRLAND $METDIR/$CNYR/01/$MET.$CNYR0101.CN.025x03125.NA.$NC FRLAND */1/1/0 C xy 1 * - 1 1 +* FRLANDIC $METDIR/$CNYR/01/$MET.$CNYR0101.CN.025x03125.NA.$NC FRLANDIC */1/1/0 C xy 1 * - 1 1 +* FROCEAN $METDIR/$CNYR/01/$MET.$CNYR0101.CN.025x03125.NA.$NC FROCEAN */1/1/0 C xy 1 * - 1 1 +* PHIS $METDIR/$CNYR/01/$MET.$CNYR0101.CN.025x03125.NA.$NC PHIS */1/1/0 C xy 1 * - 1 1 # --- A1 fields --- -* ALBEDO $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC ALBEDO 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* CLDTOT $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC CLDTOT 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* EFLUX $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC EFLUX 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* EVAP $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC EVAP 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* FRSEAICE $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC FRSEAICE 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* FRSNO $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC FRSNO 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* GRN $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC GRN 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* GWETROOT $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC GWETROOT 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* GWETTOP $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC GWETTOP 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* HFLUX $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC HFLUX 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* LAI $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC LAI 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* LWGNT $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC LWGNT 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* PARDF $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC PARDF 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* PARDR $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC PARDR 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* PBLH $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC PBLH 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* PRECANV $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC PRECANV 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* PRECCON $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC PRECCON 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* PRECLSC $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC PRECLSC 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* PRECSNO $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC PRECSNO 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* PRECTOT $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC PRECTOT 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* QV2M $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC QV2M 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* SEAICE00 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC SEAICE00 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* SEAICE10 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC SEAICE10 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* SEAICE20 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC SEAICE20 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* SEAICE30 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC SEAICE30 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* SEAICE40 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC SEAICE40 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* SEAICE50 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC SEAICE50 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* SEAICE60 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC SEAICE60 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* SEAICE70 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC SEAICE70 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* SEAICE80 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC SEAICE80 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* SEAICE90 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC SEAICE90 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* SLP $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC SLP 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* SNODP $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC SNODP 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* SNOMAS $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC SNOMAS 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* SWGDN $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC SWGDN 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* TO3 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC TO3 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* TROPPT $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC TROPPT 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* TS $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC TS 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* T2M $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC T2M 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* U10M $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC U10M 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* USTAR $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC USTAR 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* V10M $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC V10M 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 -* Z0M $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.$RES.$NC Z0M 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* ALBEDO $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC ALBEDO 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* CLDTOT $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC CLDTOT 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* EFLUX $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC EFLUX 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* EVAP $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC EVAP 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* FRSEAICE $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC FRSEAICE 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* FRSNO $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC FRSNO 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* GRN $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC GRN 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* GWETROOT $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC GWETROOT 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* GWETTOP $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC GWETTOP 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* HFLUX $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC HFLUX 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* LAI $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC LAI 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* LWGNT $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC LWGNT 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* PARDF $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC PARDF 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* PARDR $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC PARDR 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* PBLH $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC PBLH 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* PRECANV $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC PRECANV 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* PRECCON $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC PRECCON 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* PRECLSC $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC PRECLSC 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* PRECSNO $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC PRECSNO 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* PRECTOT $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC PRECTOT 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* QV2M $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC QV2M 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* SEAICE00 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC SEAICE00 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* SEAICE10 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC SEAICE10 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* SEAICE20 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC SEAICE20 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* SEAICE30 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC SEAICE30 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* SEAICE40 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC SEAICE40 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* SEAICE50 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC SEAICE50 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* SEAICE60 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC SEAICE60 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* SEAICE70 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC SEAICE70 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* SEAICE80 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC SEAICE80 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* SEAICE90 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC SEAICE90 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* SLP $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC SLP 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* SNODP $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC SNODP 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* SNOMAS $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC SNOMAS 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* SWGDN $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC SWGDN 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* TO3 $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC TO3 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* TROPPT $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC TROPPT 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* TS $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC TS 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* T2M $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC T2M 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* U10M $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC U10M 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* USTAR $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC USTAR 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* V10M $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC V10M 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 +* Z0M $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A1.025x03125.NA.$NC Z0M 1980-2021/1-12/1-31/*/+30minute EFY xy 1 * - 1 1 # --- A3cld fields --- -* CLOUD $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3cld.$RES.$NC CLOUD 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 -* OPTDEPTH $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3cld.$RES.$NC OPTDEPTH 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 -* QI $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3cld.$RES.$NC QI 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 -* QL $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3cld.$RES.$NC QL 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 -* TAUCLI $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3cld.$RES.$NC TAUCLI 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 -* TAUCLW $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3cld.$RES.$NC TAUCLW 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* CLOUD $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3cld.025x03125.NA.$NC CLOUD 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* OPTDEPTH $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3cld.025x03125.NA.$NC OPTDEPTH 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* QI $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3cld.025x03125.NA.$NC QI 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* QL $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3cld.025x03125.NA.$NC QL 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* TAUCLI $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3cld.025x03125.NA.$NC TAUCLI 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* TAUCLW $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3cld.025x03125.NA.$NC TAUCLW 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 # --- A3dyn fields --- -* DTRAIN $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3dyn.$RES.$NC DTRAIN 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 -* OMEGA $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3dyn.$RES.$NC OMEGA 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 -* RH $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3dyn.$RES.$NC RH 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* DTRAIN $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3dyn.025x03125.NA.$NC DTRAIN 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* OMEGA $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3dyn.025x03125.NA.$NC OMEGA 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* RH $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3dyn.025x03125.NA.$NC RH 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 # --- A3mstC fields --- -* DQRCU $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3mstC.$RES.$NC DQRCU 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 -* DQRLSAN $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3mstC.$RES.$NC DQRLSAN 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 -* REEVAPCN $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3mstC.$RES.$NC REEVAPCN 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 -* REEVAPLS $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3mstC.$RES.$NC REEVAPLS 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* DQRCU $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3mstC.025x03125.NA.$NC DQRCU 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* DQRLSAN $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3mstC.025x03125.NA.$NC DQRLSAN 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* REEVAPCN $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3mstC.025x03125.NA.$NC REEVAPCN 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* REEVAPLS $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3mstC.025x03125.NA.$NC REEVAPLS 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 # --- A3mstE fields --- -* CMFMC $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3mstE.$RES.$NC CMFMC 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 -* PFICU $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3mstE.$RES.$NC PFICU 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 -* PFILSAN $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3mstE.$RES.$NC PFILSAN 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 -* PFLCU $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3mstE.$RES.$NC PFLCU 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 -* PFLLSAN $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3mstE.$RES.$NC PFLLSAN 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* CMFMC $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3mstE.025x03125.NA.$NC CMFMC 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* PFICU $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3mstE.025x03125.NA.$NC PFICU 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* PFILSAN $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3mstE.025x03125.NA.$NC PFILSAN 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* PFLCU $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3mstE.025x03125.NA.$NC PFLCU 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 +* PFLLSAN $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.A3mstE.025x03125.NA.$NC PFLLSAN 1980-2021/1-12/1-31/*/+90minute EFY xyz 1 * - 1 1 # --- I3 fields --- -* TMPU $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.I3.$RES.$NC T 1980-2021/1-12/1-31/* EFY xyz 1 * - 1 1 -* TMPU_NEXTDAY $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.I3.$RES.$NC T 1980-2021/1-12/1-31/1/+1day EFY xyz 1 * - 1 1 +* TMPU $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.I3.025x03125.NA.$NC T 1980-2021/1-12/1-31/* EFY xyz 1 * - 1 1 +* TMPU_NEXTDAY $METDIR/$YYYY/$MM/$MET.$YYYY$MM$DD.I3.025x03125.NA.$NC T 1980-2021/1-12/1-31/1/+1day EFY xyz 1 * - 1 1 # --- 0.125x0.15625 fields --- -* U $METDIR_0125/Y$YYYY/M$MM/D$DD/GEOS.fp.asm.A1dyn.0125x015625.NA.$YYYY$MM$DD_$hh.V01.nc4 UA 2021-2023/1-12/1-31/0-23/+90minute EFY xyz 1 * - 1 1 -* V $METDIR_0125/Y$YYYY/M$MM/D$DD/GEOS.fp.asm.A1dyn.0125x015625.NA.$YYYY$MM$DD_$hh.V01.nc4 VA 2021-2023/1-12/1-31/0-23/+90minute EFY xyz 1 * - 1 1 -* PS $METDIR_0125/Y$YYYY/M$MM/D$DD/GEOS.fp.asm.I1dyn.0125x015625.NA.$YYYY$MM$DD_$hh.V01.nc4 PS 2021-2023/1-12/1-31/0-23 EFY xy 1 * - 1 1 -* SPHU $METDIR_0125/Y$YYYY/M$MM/D$DD/GEOS.fp.asm.I1dyn.0125x015625.NA.$YYYY$MM$DD_$hh.V01.nc4 QV 2021-2023/1-12/1-31/0-23 EFY xyz 1 * - 1 1 +* U $HIGHRES/Y$YYYY/M$MM/D$DD/GEOS.fp.asm.A1dyn.0125x015625.NA.$YYYY$MM$DD.nc4 UA 2021-2023/1-12/1-31/* EFY xyz 1 * - 1 1 +* V $HIGHRES/Y$YYYY/M$MM/D$DD/GEOS.fp.asm.A1dyn.0125x015625.NA.$YYYY$MM$DD.nc4 VA 2021-2023/1-12/1-31/* EFY xyz 1 * - 1 1 +* PS $HIGHRES/Y$YYYY/M$MM/D$DD/GEOS.fp.asm.I1dyn.0125x015625.NA.$YYYY$MM$DD.nc4 PS 2021-2023/1-12/1-31/* EFY xy 1 * - 1 1 +* SPHU $HIGHRES/Y$YYYY/M$MM/D$DD/GEOS.fp.asm.I1dyn.0125x015625.NA.$YYYY$MM$DD.nc4 QV 2021-2023/1-12/1-31/* EFY xyz 1 * - 1 1 -* PS_NEXTDAY $METDIR_0125/Y$YYYY/M$MM/D$DD/GEOS.fp.asm.I1dyn.0125x015625.NA.$YYYY$MM$DD_$hh.V01.nc4 PS 2021-2023/1-12/1-31/0-23/+1day EFY xy 1 * - 1 1 -* SPHU_NEXTDAY $METDIR_0125/Y$YYYY/M$MM/D$DD/GEOS.fp.asm.I1dyn.0125x015625.NA.$YYYY$MM$DD_$hh.V01.nc4 QV 2021-2023/1-12/1-31/0-23/+1day EFY xyz 1 * - 1 1 +* PS_NEXTDAY $HIGHRES/Y$YYYY/M$MM/D$DD/GEOS.fp.asm.I1dyn.0125x015625.NA.$YYYY$MM$DD.nc4 PS 2021-2023/1-12/1-31/*/+1day EFY xy 1 * - 1 1 +* SPHU_NEXTDAY $HIGHRES/Y$YYYY/M$MM/D$DD/GEOS.fp.asm.I1dyn.0125x015625.NA.$YYYY$MM$DD.nc4 QV 2021-2023/1-12/1-31/*/+1day EFY xyz 1 * - 1 1 #============================================================================== # --- Fields for lightning emissions (Extension 103) --- @@ -138,13 +138,13 @@ METDIR_0125: ${RUNDIR_MET_DIR} #============================================================================== (((LightNOx (((.not.LightningClimatology -* FLASH_DENS $ROOT/OFFLINE_LIGHTNING/v2020-03/$MET/$YYYY/FLASH_CTH_$MET_${RUNDIR_MET_NATIVE_RES}_$YYYY_$MM.nc4 LDENS 1980-2021/1-12/1-31/0-23/+90minute RFY3 xy 1 * - 1 1 -* CONV_DEPTH $ROOT/OFFLINE_LIGHTNING/v2020-03/$MET/$YYYY/FLASH_CTH_$MET_${RUNDIR_MET_NATIVE_RES}_$YYYY_$MM.nc4 CTH 1980-2021/1-12/1-31/0-23/+90minute RFY3 xy 1 * - 1 1 +* FLASH_DENS $ROOT/OFFLINE_LIGHTNING/v2020-03/$MET/$YYYY/FLASH_CTH_$MET_0.25x0.3125_$YYYY_$MM.nc4 LDENS 1980-2021/1-12/1-31/0-23/+90minute RFY3 xy 1 * - 1 1 +* CONV_DEPTH $ROOT/OFFLINE_LIGHTNING/v2020-03/$MET/$YYYY/FLASH_CTH_$MET_0.25x0.3125_$YYYY_$MM.nc4 CTH 1980-2021/1-12/1-31/0-23/+90minute RFY3 xy 1 * - 1 1 ))).not.LightningClimatology (((LightningClimatology -* FLASH_DENS $ROOT/OFFLINE_LIGHTNING/v2020-03/$MET/CLIM/FLASH_CTH_$MET_${RUNDIR_MET_NATIVE_RES}_${RUNDIR_MET_LCLIM}.ymonmean.nc4 LDENS 2019/1-12/1/0 C xy 1 * - 1 1 -* CONV_DEPTH $ROOT/OFFLINE_LIGHTNING/v2020-03/$MET/CLIM/FLASH_CTH_$MET_${RUNDIR_MET_NATIVE_RES}_${RUNDIR_MET_LCLIM}.ymonmean.nc4 CTH 2019/1-12/1/0 C xy 1 * - 1 1 +* FLASH_DENS $ROOT/OFFLINE_LIGHTNING/v2020-03/$MET/CLIM/FLASH_CTH_$MET_0.25x0.3125_2014-2019.ymonmean.nc4 LDENS 2019/1-12/1/0 C xy 1 * - 1 1 +* CONV_DEPTH $ROOT/OFFLINE_LIGHTNING/v2020-03/$MET/CLIM/FLASH_CTH_$MET_0.25x0.3125_2014-2019.ymonmean.nc4 CTH 2019/1-12/1/0 C xy 1 * - 1 1 )))LightningClimatology )))LightNOx From cb71dfac542a0a95b0f3e558933f6634a7199204 Mon Sep 17 00:00:00 2001 From: Melissa Sulprizio Date: Mon, 22 Apr 2024 14:27:58 -0400 Subject: [PATCH 4/5] Add fixes for 0.125x0.15625 grid from Xiaolin Wang Xiaolin Wang identified the following bugs in the 12km simulations: 1. In GeosCore/pjc_pfix_window_mod.F90 for 12km code, we need to change the parameter dp in correspond with 12km resolution. 2. In the input_mod.F90, we need to improve floating point precision, otherwise the longitude resolution is 0.1563 rather than 0.15625. Signed-off-by: Melissa Sulprizio --- GeosCore/input_mod.F90 | 12 ++++++------ GeosCore/pjc_pfix_window_mod.F90 | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/GeosCore/input_mod.F90 b/GeosCore/input_mod.F90 index 0add951b0..f4dd94a76 100644 --- a/GeosCore/input_mod.F90 +++ b/GeosCore/input_mod.F90 @@ -1010,8 +1010,8 @@ SUBROUTINE Config_Grid( Config, Input_Opt, State_Grid, RC ) ENDIF ! Save the delta X and Y values - State_Grid%DY = Cast_and_RoundOff( subStrs(1), places=4 ) - State_Grid%DX = Cast_and_RoundOff( subStrs(2), places=4 ) + State_Grid%DY = Cast_and_RoundOff( subStrs(1), places=6 ) + State_Grid%DX = Cast_and_RoundOff( subStrs(2), places=6 ) !------------------------------------------------------------------------ ! Level range @@ -1037,8 +1037,8 @@ SUBROUTINE Config_Grid( Config, Input_Opt, State_Grid, RC ) CALL GC_Error( errMsg, RC, thisLoc ) RETURN ENDIF - State_Grid%XMin = Cast_and_RoundOff( a_str(1), places=4 ) - State_Grid%XMax = Cast_and_RoundOff( a_str(2), places=4 ) + State_Grid%XMin = Cast_and_RoundOff( a_str(1), places=6 ) + State_Grid%XMax = Cast_and_RoundOff( a_str(2), places=6 ) ! Make sure values are in valid rangre IF ( State_Grid%XMin >= State_Grid%XMax ) THEN @@ -1074,8 +1074,8 @@ SUBROUTINE Config_Grid( Config, Input_Opt, State_Grid, RC ) CALL GC_Error( errMsg, RC, thisLoc ) RETURN ENDIF - State_Grid%YMin = Cast_and_RoundOff( a_str(1), places=4 ) - State_Grid%YMax = Cast_and_RoundOff( a_str(2), places=4 ) + State_Grid%YMin = Cast_and_RoundOff( a_str(1), places=6 ) + State_Grid%YMax = Cast_and_RoundOff( a_str(2), places=6 ) ! Make sure values are in valid range IF ( State_Grid%YMin >= State_Grid%YMax ) THEN diff --git a/GeosCore/pjc_pfix_window_mod.F90 b/GeosCore/pjc_pfix_window_mod.F90 index 720ded07a..cdc7716cf 100644 --- a/GeosCore/pjc_pfix_window_mod.F90 +++ b/GeosCore/pjc_pfix_window_mod.F90 @@ -1217,7 +1217,7 @@ SUBROUTINE Convert_Winds(State_Grid, igd, tdt, cosp, crx, cry, uu, vv) dp = PI /720e+0_fp ELSE IF ( TRIM(State_Grid%GridRes) == '0.125x0.15625' ) THEN dl = 2.0e+0_fp * PI / 2304.0_fp - dp = PI /720e+0_fp + dp = PI /1440e+0_fp ENDIF dtdy = tdt / (Re * dp) @@ -1384,7 +1384,7 @@ SUBROUTINE Calc_Horiz_Mass_Flux & dp = PI /720.0_fp ELSE IF ( TRIM(State_Grid%GridRes) == '0.125x0.15625' ) THEN dl = 2.0e+0_fp * PI / 2304.0_fp - dp = PI /720.0_fp + dp = PI /1440.0_fp ENDIF facty = 0.5_fp * tdt / (Re * dp) From c482454dbb0834e75fbfb81a9ca16e97e763ed41 Mon Sep 17 00:00:00 2001 From: Melissa Sulprizio Date: Wed, 17 Jul 2024 11:06:29 -0400 Subject: [PATCH 5/5] Add fixes to read 0.125x0.15625 met fields at proper frequency from Xiaolin Wang The PS and SPHU fields at 0.125x0.15625 resolution are in the I1dyn collection, while the U and V fields are read from the A1dyn collection. All of these fields should be read hourly, not 3-hourly as is the case for 0.25x0.3125 resolution and coarser. New subroutines FlexGrid_Read_A1dyn, FlexGrid_Read_I1dyn_1, FlexGrid_Read_I1dyn_2, and Copy_I1dyn_Fields have been added to flexgrid_mod.F90 following work by Xiaolin Wang. The code in hco_interface_gc_mod.F90 and main.F90 that calls these routines has also been updated. New I1dyn routines have also been added to time_mod.F90. Signed-off-by: Melissa Sulprizio --- GeosCore/flexgrid_read_mod.F90 | 672 ++++++++++++++++++++++++++---- GeosCore/hco_interface_gc_mod.F90 | 154 +++++-- GeosUtil/time_mod.F90 | 163 ++++++++ Interfaces/GCClassic/main.F90 | 18 +- 4 files changed, 888 insertions(+), 119 deletions(-) diff --git a/GeosCore/flexgrid_read_mod.F90 b/GeosCore/flexgrid_read_mod.F90 index a79f4bbfa..aa14e1a66 100644 --- a/GeosCore/flexgrid_read_mod.F90 +++ b/GeosCore/flexgrid_read_mod.F90 @@ -34,10 +34,14 @@ MODULE FlexGrid_Read_Mod ! PUBLIC :: FlexGrid_Read_CN PUBLIC :: FlexGrid_Read_A1 + PUBLIC :: FlexGrid_Read_A1dyn PUBLIC :: FlexGrid_Read_A3 + PUBLIC :: FlexGrid_Read_I1dyn_1 + PUBLIC :: FlexGrid_Read_I1dyn_2 PUBLIC :: FlexGrid_Read_I3_1 PUBLIC :: FlexGrid_Read_I3_2 PUBLIC :: Copy_I3_Fields + PUBLIC :: Copy_I1dyn_Fields ! ! !REMARKS: ! Assumes that you have a netCDF library (either v3 or v4) installed on @@ -522,6 +526,143 @@ END SUBROUTINE FlexGrid_Read_A1 !------------------------------------------------------------------------------ !BOP ! +! !IROUTINE: FlexGrid_Read_a1dyn +! +! !DESCRIPTION: Routine to read variables and attributes from a NetCDF +! met fields file containing 1-hr time-averaged (A1) data. +!\\ +!\\ +! !INTERFACE: +! + SUBROUTINE FlexGrid_Read_A1dyn( YYYYMMDD, HHMMSS, Input_Opt, State_Grid, & + State_Met ) +! +! !USES: +! + USE Input_Opt_Mod, ONLY : OptInput + USE State_Grid_Mod, ONLY : GrdState + USE State_Met_Mod, ONLY : MetState + USE Get_Met_Mod +! +! !INPUT PARAMETERS: +! + INTEGER, INTENT(IN) :: YYYYMMDD ! GMT date in YYYY/MM/DD format + INTEGER, INTENT(IN) :: HHMMSS ! GMT time in hh:mm:ss format + TYPE(OptInput), INTENT(IN) :: Input_Opt ! Input Options object + TYPE(GrdState), INTENT(IN) :: State_Grid ! Grid State object +! +! !INPUT/OUTPUT PARAMETERS: +! + TYPE(MetState), INTENT(INOUT) :: State_Met ! Meteorology State object +! +! !REMARKS: +! This routine was automatically generated by the Perl script ncCodeRead, +! and was subsequently hand-edited for compatibility with GEOS-Chem. +! . +! Even though the netCDF file is self-describing, the GEOS-FP data, +! dimensions, and units are pre-specified according to the GMAO GEOS-FP +! file specification. Therefore we can "cheat" a little bit and not have +! to read netCDF attributes to find what these values are. +! . +! Special handling for surface precipitation fields: +! --------------------------------------------------------------------------- +! In GEOS-FP (and in MERRA), the PRECTOT etc. surface precipitation +! met fields fields have units of [kg/m2/s]. In all other GEOS +! versions, PREACC and PRECON have units of [mm/day]. +! . +! Therefore, for backwards compatibility with existing code, apply +! the following unit conversion to the GEOS-5 PRECTOT and PRECCON +! fields: +! . +! kg | m3 | 86400 s | 1000 mm +! ------+----------+---------+--------- = 86400 +! m2 s | 1000 kg | day | m +! ^ +! | +! 1 / density of water +! +! !REVISION HISTORY: +! 30 Jan 2012 - R. Yantosca - Initial version +! See https://github.com/geoschem/geos-chem for complete history +!EOP +!------------------------------------------------------------------------------ +!BOC +! +! !LOCAL VARIABLES: +! + ! Scalars + INTEGER :: t_index ! Time index + CHARACTER(LEN=16) :: stamp ! Time and date stamp + CHARACTER(LEN=255) :: v_name ! netCDF variable name + CHARACTER(LEN=255) :: errMsg ! Error message + CHARACTER(LEN=255) :: caller ! Name of this routine + + ! Saved scalars + INTEGER, SAVE :: lastDate = -1 ! Stores last YYYYMMDD value + INTEGER, SAVE :: lastTime = -1 ! Stores last hhmmss value + + ! Arrays + REAL*4 :: Q(State_Grid%NX,State_Grid%NY,State_Grid%NZ) ! Temporary data arrray + + !====================================================================== + ! Skip if we have already read data for this date & time + !====================================================================== + IF ( YYYYMMDD == lastDate .and. HHMMSS == lastTime ) THEN + stamp = TimeStamp_String( YYYYMMDD, HHMMSS ) + WRITE( 6, 20 ) stamp + 20 FORMAT( ' - FLEXGRID A1dyn met fields for ', a, & + ' have been read already' ) + RETURN + ENDIF + + !====================================================================== + ! Select the proper time slice + !====================================================================== + + ! Name of this routine (for error printout) + caller = "FlexGrid_Read_A1dyn (flexgrid_read_mod.F90)" + + ! Find the proper time-slice to read from disk + t_index = ( HHMMSS / 10000 ) + 1 + + ! Stop w/ error if the time index is invalid + IF ( t_index < 1 .or. t_index > 24 ) THEN + WRITE( errMsg, 100 ) t_index + 100 FORMAT( 'Time_index value ', i5, ' must be in the range 1 to 24!' ) + CALL Error_Stop( errMsg, caller ) + ENDIF + + !====================================================================== + ! Get met fields from HEMCO + !====================================================================== + + ! Read U + v_name = "U" + CALL Get_Met_3D( Input_Opt, State_Grid, Q, TRIM(v_name), t_index=t_index ) + State_Met%U = Q + + ! Read V + v_name = "V" + CALL Get_Met_3D( Input_Opt, State_Grid, Q, TRIM(v_name), t_index=t_index ) + State_Met%V = Q + + ! Echo info + stamp = TimeStamp_String( YYYYMMDD, HHMMSS ) + WRITE( 6, 10 ) stamp + 10 FORMAT( ' - Found all A1dyn met fields for ', a ) + + + ! Save date & time for next iteration + lastDate = YYYYMMDD + lastTime = HHMMSS + + END SUBROUTINE FlexGrid_Read_A1dyn +!EOC +!------------------------------------------------------------------------------ +! GEOS-Chem Global Chemical Transport Model ! +!------------------------------------------------------------------------------ +!BOP +! ! !IROUTINE: FlexGrid_Read_a3 ! ! !DESCRIPTION: Convenience wrapper for the following routines which read @@ -844,15 +985,20 @@ SUBROUTINE FlexGrid_Read_A3dyn( YYYYMMDD, HHMMSS, Input_Opt, State_Grid, & CALL Get_Met_3D( Input_Opt, State_Grid, Q, TRIM(v_name), t_index=t_index ) State_Met%RH = Q - ! Read U - v_name = "U" - CALL Get_Met_3D( Input_Opt, State_Grid, Q, TRIM(v_name), t_index=t_index ) - State_Met%U = Q + ! 0.125x0.15625 uses A1dyn archive + IF ( TRIM(State_Grid%GridRes) /= '0.125x0.15625' ) THEN - ! Read V - v_name = "V" - CALL Get_Met_3D( Input_Opt, State_Grid, Q, TRIM(v_name), t_index=t_index ) - State_Met%V = Q + ! Read U + v_name = "U" + CALL Get_Met_3D( Input_Opt, State_Grid, Q, TRIM(v_name), t_index=t_index ) + State_Met%U = Q + + ! Read V + v_name = "V" + CALL Get_Met_3D( Input_Opt, State_Grid, Q, TRIM(v_name), t_index=t_index ) + State_Met%V = Q + + ENDIF ! Echo info stamp = TimeStamp_String( YYYYMMDD, HHMMSS ) @@ -1213,6 +1359,182 @@ SUBROUTINE FlexGrid_Read_I3_1( YYYYMMDD, HHMMSS, Input_Opt, State_Grid, & ! Get met fields from HEMCO !====================================================================== + ! Name of this routine (for error printout) + caller = 'FlexGrid_Read_I3_1 (flexgrid_read_mod.F90)' + + ! Find the proper time-slice to read from disk + t_index = ( HHMMSS / 030000 ) + 1 + + ! Stop w/ error if the time index is invalid + IF ( t_index < 1 .or. t_index > 8 ) THEN + WRITE( errMsg, 100 ) t_index + 100 FORMAT( 'Time_index value ', i5, ' must be in the range 1 to 8!' ) + CALL Error_Stop( errMsg, caller ) + ENDIF + + ! Resolution 0.125x0.15625 uses I1dyn archive for PS, SPHU (xlwang, 06/2024) + IF ( TRIM(State_Grid%GridRes) .NE. '0.125x0.15625' ) THEN + + !------------------------------------------------- + ! Read 2D data + !------------------------------------------------- + + ! Read PS + v_name = "PS" + CALL Get_Met_2D( Input_Opt, State_Grid, Q2, TRIM(v_name), t_index=t_index ) + State_Met%PS1_WET = Q2 + + !------------------------------------------------- + ! Read 3D data + !------------------------------------------------- + + !---------------------------------------------------------------- + ! Prior to 2/3/12: + ! For now, skip reading Potential Vorticity (bmy, 2/3/12) + !! Read PV + !v_name = "PV" + !CALL Get_Met_3D( Input_Opt, State_Grid, Q3, TRIM(v_name), t_index=t_index ) + !!Q3 = ABS(1.0e6*Q3) ! PV to PVU + !State_Met%PV = Q3 + !---------------------------------------------------------------- + + ! Read SPHU + v_name = "SPHU" + CALL Get_Met_3D( Input_Opt, State_Grid, Q3, TRIM(v_name), t_index=t_index ) + State_Met%SPHU1 = Q3 + + ENDIF + + ! Read T + v_name = "TMPU" + CALL Get_Met_3D( Input_Opt, State_Grid, Q3, TRIM(v_name), t_index=t_index ) + State_Met%TMPU1 = Q3 + + ! Echo info + stamp = TimeStamp_String( YYYYMMDD, HHMMSS ) + WRITE( 6, 10 ) stamp + 10 FORMAT( ' - Found all I3 met fields for ', a ) + + !------------------------------------------------- + ! Unit conversions & special handling + !------------------------------------------------- + + ! Resolution 0.125x0.15625 uses I1dyn archive for PS, SPHU (xlwang, 06/2024) + IF ( TRIM(State_Grid%GridRes) /= '0.125x0.15625' ) THEN + + WHERE ( State_Met%SPHU1 < 0d0 ) + + ! NOTE: Now set negative Q to a small positive # + ! instead of zero, so as not to blow up logarithms + State_Met%SPHU1 = 1d-32 + + ELSEWHERE + + ! Convert GEOS-FP specific humidity from [kg/kg] to [g/kg] + State_Met%SPHU1 = State_Met%SPHU1 * 1000d0 + + ENDWHERE + + IF ( TRIM(Input_Opt%MetField) == 'MERRA2' .or. & + TRIM(Input_Opt%MetField) == 'MODELE2.1' .or. & + TRIM(Input_Opt%MetField) == 'MODELE2.2' ) THEN + ! Convert PS1_WET from [Pa] to [hPa] + State_Met%PS1_WET = State_Met%PS1_WET * 1e-2_fp + ENDIF + + ! Initialize State_Met%SPHU to State_Met%SPHU1. After all future MET + ! field reads (flexgrid_read_i3_2) we will interpolate State_Met%SPHU + ! from the values of State_Met vars SPHU1 and SPHU2. + State_Met%SPHU = State_Met%SPHU1 + + ENDIF + + ! Initialize State_Met%T to State_Met%TMPU1. After all future MET + ! field reads (flexgrid_read_i3_2) we will interpolate State_Met%T + ! from the values of State_Met vars TMPU1 and TMPU2. + State_Met%T = State_Met%TMPU1 + + !====================================================================== + ! Diagnostics, cleanup, and quit + !====================================================================== + +#ifdef BPCH_DIAG + ! Increment the # of times I3 fields have been read + CALL Set_Ct_I3( INCREMENT=.TRUE. ) +#endif + + END SUBROUTINE FlexGrid_Read_I3_1 +!EOC +!------------------------------------------------------------------------------ +! GEOS-Chem Global Chemical Transport Model ! +!------------------------------------------------------------------------------ +!BOP +! +! !IROUTINE: FlexGrid_Read_I3_2 +! +! !DESCRIPTION: Routine to read variables and attributes from a NetCDF +! met fields file containing 3-hr instantaneous (I3) data. +!\\ +!\\ +! !INTERFACE: +! + SUBROUTINE FlexGrid_Read_I3_2( YYYYMMDD, HHMMSS, Input_Opt, State_Grid, & + State_Met ) +! +! !USES: +! + USE Input_Opt_Mod, ONLY : OptInput + USE State_Grid_Mod, ONLY : GrdState + USE State_Met_Mod, ONLY : MetState + USE Get_Met_Mod +#ifdef BPCH_DIAG + USE Time_Mod, ONLY : Set_Ct_I3 +#endif +! +! !INPUT PARAMETERS: +! + INTEGER, INTENT(IN) :: YYYYMMDD ! GMT date in YYYY/MM/DD format + INTEGER, INTENT(IN) :: HHMMSS ! GMT time in hh:mm:ss format + TYPE(OptInput), INTENT(IN) :: Input_Opt ! Input Options object + TYPE(GrdState), INTENT(IN) :: State_Grid ! Grid State object +! +! !INPUT/OUTPUT PARAMETERS: +! + TYPE(MetState), INTENT(INOUT) :: State_Met ! Meteorology State object +! +! !REMARKS: +! This routine was automatically generated by the Perl script ncCodeRead, +! and was subsequently hand-edited for compatibility with GEOS-Chem. +! . +! Even though the netCDF file is self-describing, the GEOS-FP data, +! dimensions, and units are pre-specified according to the GMAO GEOS-FP +! file specification. Therefore we can "cheat" a little bit and not have +! to read netCDF attributes to find what these values are. +! +! !REVISION HISTORY: +! 30 Jan 2012 - R. Yantosca - Initial version +! See https://github.com/geoschem/geos-chem for complete history +!EOP +!------------------------------------------------------------------------------ +!BOC +! +! !LOCAL VARIABLES: +! + ! Scalars + INTEGER :: t_index ! Time index + CHARACTER(LEN=16) :: stamp ! Time and date stamp + CHARACTER(LEN=255) :: v_name ! netCDF variable name + CHARACTER(LEN=255) :: errMsg ! Error message + CHARACTER(LEN=255) :: caller ! Name of this routine + + ! Arrays + REAL*4 :: Q2(State_Grid%NX,State_Grid%NY ) ! 2D temporary data arrray + REAL*4 :: Q3(State_Grid%NX,State_Grid%NY,State_Grid%NZ) ! 3D temporary data arrray + + !====================================================================== + ! Get met fields from HEMCO + !====================================================================== + ! Name of this routine (for error printout) caller = 'FlexGrid_Read_I3_2 (flexgrid_read_mod.F90)' @@ -1226,6 +1548,236 @@ SUBROUTINE FlexGrid_Read_I3_1( YYYYMMDD, HHMMSS, Input_Opt, State_Grid, & CALL Error_Stop( errMsg, caller ) ENDIF + ! Resolution 0.125x0.15625 uses I1dyn archive for PS, SPHU (xlwang, 06/2024) + IF ( TRIM(State_Grid%GridRes) .NE. '0.125x0.15625' ) THEN + + !------------------------------------------------- + ! Read 2D data + !------------------------------------------------- + + ! Read PS + IF ( HHMMSS == 000000 ) THEN + v_name = "PS_NEXTDAY" + ELSE + v_name = "PS" + ENDIF + CALL Get_Met_2D( Input_Opt, State_Grid, Q2, TRIM(v_name), t_index=t_index ) + State_Met%PS2_WET = Q2 + + !------------------------------------------------- + ! Read 3D data + !------------------------------------------------- + + !---------------------------------------------------------------- + ! Prior to 2/3/12: + ! For now, skip reading Potential Vorticity (bmy, 2/3/12) + !! Read PV + !IF ( HHMMSS == 000000 ) THEN + ! v_name = "PV_NEXTDAY" + !ELSE + ! v_name = "PV" + !ENDIF + !CALL Get_Met_3D( Input_Opt, State_Grid, Q3, TRIM(v_name), t_index=t_index ) + !!Q3 = ABS(1.0e6*Q3) ! PV to PVU + !State_Met%PV = Q3 + !---------------------------------------------------------------- + + ! Read SPHU + IF ( HHMMSS == 000000 ) THEN + v_name = "SPHU_NEXTDAY" + ELSE + v_name = "SPHU" + ENDIF + CALL Get_Met_3D( Input_Opt, State_Grid, Q3, TRIM(v_name), t_index=t_index ) + State_Met%SPHU2 = Q3 + + ENDIF + + !------------------------------------------------- + ! Read 3D data + !------------------------------------------------- + + ! Read T + IF ( HHMMSS == 000000 ) THEN + v_name = "TMPU_NEXTDAY" + ELSE + v_name = "TMPU" + ENDIF + CALL Get_Met_3D( Input_Opt, State_Grid, Q3, TRIM(v_name), t_index=t_index ) + State_Met%TMPU2 = Q3 + + ! Echo info + stamp = TimeStamp_String( YYYYMMDD, HHMMSS ) + WRITE( 6, 10 ) stamp + 10 FORMAT( ' - Found all I3 met fields for ', a ) + + !------------------------------------------------- + ! Unit conversions & special handling + !------------------------------------------------- + ! Resolution 0.125x0.15625 uses I1dyn archive for PS, SPHU (xlwang, 06/2024) + IF ( TRIM(State_Grid%GridRes) /= '0.125x0.15625' ) THEN + + WHERE ( State_Met%SPHU2 < 0d0 ) + + ! NOTE: Now set negative Q to a small positive # + ! instead of zero, so as not to blow up logarithms + State_Met%SPHU2 = 1d-32 + + ELSEWHERE + + ! Convert specific humidity from [kg/kg] to [g/kg] + State_Met%SPHU2 = State_Met%SPHU2 * 1000d0 + + ENDWHERE + + IF ( TRIM(Input_Opt%MetField) == 'MERRA2' .or. & + TRIM(Input_Opt%MetField) == 'MODELE2.1' .or. & + TRIM(Input_Opt%MetField) == 'MODELE2.2' ) THEN + ! Convert PS2_WET from [Pa] to [hPa] + State_Met%PS2_WET = State_Met%PS2_WET * 1e-2_fp + ENDIF + + ENDIF + + !====================================================================== + ! Diagnostics, cleanup, and quit + !====================================================================== + +#ifdef BPCH_DIAG + ! Increment the # of times I3 fields have been read + CALL Set_Ct_I3( INCREMENT=.TRUE. ) +#endif + + END SUBROUTINE FlexGrid_Read_I3_2 +!EOC +!------------------------------------------------------------------------------ +! GEOS-Chem Global Chemical Transport Model ! +!------------------------------------------------------------------------------ +!BOP +! +! !IROUTINE: copy_i3_fields +! +! !DESCRIPTION: Subroutine COPY\_I3\_FIELDS copies the I-3 fields at the +! end of a 3-hr timestep. The I-3 fields at the end of a given 3-hr timestep +! become the fields at the beginning of the next 3-hr timestep. +!\\ +!\\ +! !INTERFACE: +! + SUBROUTINE COPY_I3_FIELDS( State_Met, State_Grid ) +! +! !USES: +! + USE State_Met_Mod, ONLY : MetState + USE State_Grid_Mod, ONLY : GrdState +! +! !INPUT PARAMETERS: +! + TYPE(GrdState), INTENT(IN) :: State_Grid ! Grid State object + TYPE(MetState), INTENT(INOUT) :: State_Met ! Meteorology State object +! +! !REVISION HISTORY: +! 13 Apr 2004 - R. Yantosca - Initial version +! See https://github.com/geoschem/geos-chem for complete history +!EOP +!------------------------------------------------------------------------------ +!BOC +! + ! Resolution 0.125x0.15625 uses I1dyn archive for PS, SPHU (xlwang, 06/2024) + IF ( TRIM(State_Grid%GridRes) .NE. '0.125x0.15625' ) THEN + State_Met%PS1_WET = State_Met%PS2_WET ! I3 surface pressure [hPa] + State_Met%PS1_DRY = State_Met%PS2_DRY ! I3 surface pressure [hPa] + State_Met%SPHU1 = State_Met%SPHU2 ! I3 specific humidity [g/kg] + ENDIF + + State_Met%TMPU1 = State_Met%TMPU2 ! I3 temperature [K] + + + END SUBROUTINE COPY_I3_FIELDS +!EOC +!------------------------------------------------------------------------------ +! GEOS-Chem Global Chemical Transport Model ! +!------------------------------------------------------------------------------ +!BOP +! +! !IROUTINE: FlexGrid_Read_I1dyn_1 +! +! !DESCRIPTION: Routine to read variables and attributes from a NetCDF +! met fields file containing 1-hr instantaneous (I1dyn) data. +!\\ +!\\ +! !INTERFACE: +! + SUBROUTINE FlexGrid_Read_I1dyn_1( YYYYMMDD, HHMMSS, Input_Opt, State_Grid, & + State_Met ) +! +! !USES: +! + USE Input_Opt_Mod, ONLY : OptInput + USE State_Grid_Mod, ONLY : GrdState + USE State_Met_Mod, ONLY : MetState + USE Get_Met_Mod +#ifdef BPCH_DIAG + USE Time_Mod, ONLY : Set_Ct_I1dyn +#endif +! +! !INPUT PARAMETERS: +! + INTEGER, INTENT(IN) :: YYYYMMDD ! GMT date in YYYY/MM/DD format + INTEGER, INTENT(IN) :: HHMMSS ! GMT time in hh:mm:ss format + TYPE(OptInput), INTENT(IN) :: Input_Opt ! Input Options object + TYPE(GrdState), INTENT(IN) :: State_Grid ! Grid State object +! +! !INPUT/OUTPUT PARAMETERS: +! + TYPE(MetState), INTENT(INOUT) :: State_Met ! Meteorology State object +! +! !REMARKS: +! This routine was automatically generated by the Perl script ncCodeRead, +! and was subsequently hand-edited for compatibility with GEOS-Chem. +! . +! Even though the netCDF file is self-describing, the GEOS-FP data, +! dimensions, and units are pre-specified according to the GMAO GEOS-FP +! file specification. Therefore we can "cheat" a little bit and not have +! to read netCDF attributes to find what these values are. +! +! !REVISION HISTORY: +! 30 Jan 2012 - R. Yantosca - Initial version +! See https://github.com/geoschem/geos-chem for complete history +!EOP +!------------------------------------------------------------------------------ +!BOC +! +! !LOCAL VARIABLES: +! + ! Scalars + INTEGER :: t_index ! Time index + CHARACTER(LEN=16) :: stamp ! Time and date stamp + CHARACTER(LEN=255) :: v_name ! netCDF variable name + CHARACTER(LEN=255) :: errMsg ! Error message + CHARACTER(LEN=255) :: caller ! Name of this routine + + ! Arrays + REAL*4 :: Q2(State_Grid%NX,State_Grid%NY ) ! 2D temporary data arrray + REAL*4 :: Q3(State_Grid%NX,State_Grid%NY,State_Grid%NZ) ! 3D temporary data arrray + + !====================================================================== + ! Get met fields from HEMCO + !====================================================================== + + ! Name of this routine (for error printout) + caller = 'FlexGrid_Read_I1dyn_1 (flexgrid_read_mod.F90)' + + ! Find the proper time-slice to read from disk + t_index = ( HHMMSS / 10000 ) + 1 + + ! Stop w/ error if the time index is invalid + IF ( t_index < 1 .or. t_index > 24 ) THEN + WRITE( errMsg, 100 ) t_index + 100 FORMAT( 'Time_index value ', i5, ' must be in the range 1 to 24!' ) + CALL Error_Stop( errMsg, caller ) + ENDIF + !------------------------------------------------- ! Read 2D data !------------------------------------------------- @@ -1239,30 +1791,15 @@ SUBROUTINE FlexGrid_Read_I3_1( YYYYMMDD, HHMMSS, Input_Opt, State_Grid, & ! Read 3D data !------------------------------------------------- - !---------------------------------------------------------------- - ! Prior to 2/3/12: - ! For now, skip reading Potential Vorticity (bmy, 2/3/12) - !! Read PV - !v_name = "PV" - !CALL Get_Met_3D( Input_Opt, State_Grid, Q3, TRIM(v_name), t_index=t_index ) - !!Q3 = ABS(1.0e6*Q3) ! PV to PVU - !State_Met%PV = Q3 - !---------------------------------------------------------------- - - ! Read QV + ! Read SPHU v_name = "SPHU" CALL Get_Met_3D( Input_Opt, State_Grid, Q3, TRIM(v_name), t_index=t_index ) State_Met%SPHU1 = Q3 - ! Read T - v_name = "TMPU" - CALL Get_Met_3D( Input_Opt, State_Grid, Q3, TRIM(v_name), t_index=t_index ) - State_Met%TMPU1 = Q3 - ! Echo info stamp = TimeStamp_String( YYYYMMDD, HHMMSS ) WRITE( 6, 10 ) stamp - 10 FORMAT( ' - Found all I3 met fields for ', a ) + 10 FORMAT( ' - Found all I1dyn met fields for ', a ) !------------------------------------------------- ! Unit conversions & special handling @@ -1287,39 +1824,36 @@ SUBROUTINE FlexGrid_Read_I3_1( YYYYMMDD, HHMMSS, Input_Opt, State_Grid, & State_Met%PS1_WET = State_Met%PS1_WET * 1e-2_fp ENDIF - ! Initialize State_Met%T to State_Met%TMPU1 and State_Met%SPHU to - ! State_Met%SPHU1. After all future MET field reads (flexgrid_read_i3_2) - ! we will interpolate State_Met%T from the values of State_Met vars - ! TMPU1 and TMPU2 and State_Met%SPHU from the values of State_Met vars - ! SPHU1 and SPHU2. - State_Met%T = State_Met%TMPU1 - State_Met%SPHU = State_Met%SPHU1 + ! Initialize State_Met%SPHU to State_Met%SPHU1. After all future MET + ! field reads (flexgrid_read_I1dyn_2) we will interpolate State_Met%SPHU + ! from the values of State_Met vars SPHU1 and SPHU2. + State_Met%SPHU = State_Met%SPHU1 !====================================================================== ! Diagnostics, cleanup, and quit !====================================================================== #ifdef BPCH_DIAG - ! Increment the # of times I3 fields have been read - CALL Set_Ct_I3( INCREMENT=.TRUE. ) + ! Increment the # of times I1dyn fields have been read + CALL Set_Ct_I1dyn( INCREMENT=.TRUE. ) #endif - END SUBROUTINE FlexGrid_Read_I3_1 + END SUBROUTINE FlexGrid_Read_I1dyn_1 !EOC !------------------------------------------------------------------------------ ! GEOS-Chem Global Chemical Transport Model ! !------------------------------------------------------------------------------ !BOP ! -! !IROUTINE: FlexGrid_Read_I3_2 +! !IROUTINE: FlexGrid_Read_I1dyn_2 ! ! !DESCRIPTION: Routine to read variables and attributes from a NetCDF -! met fields file containing 3-hr instantaneous (I3) data. +! met fields file containing 1-hr instantaneous (I1dyn) data. !\\ !\\ ! !INTERFACE: ! - SUBROUTINE FlexGrid_Read_I3_2( YYYYMMDD, HHMMSS, Input_Opt, State_Grid, & + SUBROUTINE FlexGrid_Read_I1dyn_2( YYYYMMDD, HHMMSS, Input_Opt, State_Grid, & State_Met ) ! ! !USES: @@ -1329,7 +1863,7 @@ SUBROUTINE FlexGrid_Read_I3_2( YYYYMMDD, HHMMSS, Input_Opt, State_Grid, & USE State_Met_Mod, ONLY : MetState USE Get_Met_Mod #ifdef BPCH_DIAG - USE Time_Mod, ONLY : Set_Ct_I3 + USE Time_Mod, ONLY : Set_Ct_I1dyn #endif ! ! !INPUT PARAMETERS: @@ -1377,15 +1911,15 @@ SUBROUTINE FlexGrid_Read_I3_2( YYYYMMDD, HHMMSS, Input_Opt, State_Grid, & !====================================================================== ! Name of this routine (for error printout) - caller = 'FlexGrid_Read_I3_2 (flexgrid_read_mod.F90)' + caller = 'FlexGrid_Read_I1dyn_2 (flexgrid_read_mod.F90)' ! Find the proper time-slice to read from disk - t_index = ( HHMMSS / 030000 ) + 1 + t_index = ( HHMMSS / 10000 ) + 1 ! Stop w/ error if the time index is invalid - IF ( t_index < 1 .or. t_index > 8 ) THEN + IF ( t_index < 1 .or. t_index > 24 ) THEN WRITE( errMsg, 100 ) t_index - 100 FORMAT( 'Time_index value ', i5, ' must be in the range 1 to 8!' ) + 100 FORMAT( 'Time_index value ', i5, ' must be in the range 1 to 24!' ) CALL Error_Stop( errMsg, caller ) ENDIF @@ -1406,21 +1940,7 @@ SUBROUTINE FlexGrid_Read_I3_2( YYYYMMDD, HHMMSS, Input_Opt, State_Grid, & ! Read 3D data !------------------------------------------------- - !---------------------------------------------------------------- - ! Prior to 2/3/12: - ! For now, skip reading Potential Vorticity (bmy, 2/3/12) - !! Read PV - !IF ( HHMMSS == 000000 ) THEN - ! v_name = "PV_NEXTDAY" - !ELSE - ! v_name = "PV" - !ENDIF - !CALL Get_Met_3D( Input_Opt, State_Grid, Q3, TRIM(v_name), t_index=t_index ) - !!Q3 = ABS(1.0e6*Q3) ! PV to PVU - !State_Met%PV = Q3 - !---------------------------------------------------------------- - - ! Read QV + ! Read SPHU IF ( HHMMSS == 000000 ) THEN v_name = "SPHU_NEXTDAY" ELSE @@ -1429,19 +1949,10 @@ SUBROUTINE FlexGrid_Read_I3_2( YYYYMMDD, HHMMSS, Input_Opt, State_Grid, & CALL Get_Met_3D( Input_Opt, State_Grid, Q3, TRIM(v_name), t_index=t_index ) State_Met%SPHU2 = Q3 - ! Read T - IF ( HHMMSS == 000000 ) THEN - v_name = "TMPU_NEXTDAY" - ELSE - v_name = "TMPU" - ENDIF - CALL Get_Met_3D( Input_Opt, State_Grid, Q3, TRIM(v_name), t_index=t_index ) - State_Met%TMPU2 = Q3 - ! Echo info stamp = TimeStamp_String( YYYYMMDD, HHMMSS ) WRITE( 6, 10 ) stamp - 10 FORMAT( ' - Found all I3 met fields for ', a ) + 10 FORMAT( ' - Found all I1dyn met fields for ', a ) !------------------------------------------------- ! Unit conversions & special handling @@ -1471,27 +1982,27 @@ SUBROUTINE FlexGrid_Read_I3_2( YYYYMMDD, HHMMSS, Input_Opt, State_Grid, & !====================================================================== #ifdef BPCH_DIAG - ! Increment the # of times I3 fields have been read - CALL Set_Ct_I3( INCREMENT=.TRUE. ) + ! Increment the # of times I1dyn fields have been read + CALL Set_Ct_I1dyn( INCREMENT=.TRUE. ) #endif - END SUBROUTINE FlexGrid_Read_I3_2 + END SUBROUTINE FlexGrid_Read_I1dyn_2 !EOC !------------------------------------------------------------------------------ ! GEOS-Chem Global Chemical Transport Model ! !------------------------------------------------------------------------------ !BOP ! -! !IROUTINE: copy_i3_fields +! !IROUTINE: copy_I1dyn_fields ! -! !DESCRIPTION: Subroutine COPY\_I3\_FIELDS copies the I-3 fields at the -! end of a 3-hr timestep. The I-3 fields at the end of a given 3-hr timestep -! become the fields at the beginning of the next 3-hr timestep. +! !DESCRIPTION: Subroutine COPY\_I1dyn\_FIELDS copies the I-1 fields at the +! end of a 1-hr timestep. The I-1 fields at the end of a given 1-hr timestep +! become the fields at the beginning of the next 1-hr timestep. !\\ !\\ ! !INTERFACE: ! - SUBROUTINE COPY_I3_FIELDS( State_Met ) + SUBROUTINE COPY_I1dyn_FIELDS( State_Met ) ! ! !USES: ! @@ -1508,12 +2019,11 @@ SUBROUTINE COPY_I3_FIELDS( State_Met ) !------------------------------------------------------------------------------ !BOC ! - State_Met%PS1_WET = State_Met%PS2_WET ! I3 surface pressure [hPa] - State_Met%PS1_DRY = State_Met%PS2_DRY ! I3 surface pressure [hPa] - State_Met%SPHU1 = State_Met%SPHU2 ! I3 specific humidity [g/kg] - State_Met%TMPU1 = State_Met%TMPU2 ! I3 temperature [K] + State_Met%PS1_WET = State_Met%PS2_WET ! I1dyn surface pressure [hPa] + State_Met%PS1_DRY = State_Met%PS2_DRY ! I1dyn surface pressure [hPa] + State_Met%SPHU1 = State_Met%SPHU2 ! I1dyn specific humidity [g/kg] - END SUBROUTINE COPY_I3_FIELDS + END SUBROUTINE COPY_I1dyn_FIELDS !EOC END MODULE FlexGrid_Read_Mod #endif diff --git a/GeosCore/hco_interface_gc_mod.F90 b/GeosCore/hco_interface_gc_mod.F90 index 66e076e6b..6c3a729fb 100644 --- a/GeosCore/hco_interface_gc_mod.F90 +++ b/GeosCore/hco_interface_gc_mod.F90 @@ -4440,6 +4440,10 @@ SUBROUTINE Get_Met_Fields( Input_Opt, State_Chm, State_Grid, & IF ( PHASE == 0 .or. ITS_TIME_FOR_A1() .and. & .not. ITS_TIME_FOR_EXIT() ) THEN CALL FlexGrid_Read_A1( D(1), D(2), Input_Opt, State_Grid, State_Met ) + + IF ( TRIM(State_Grid%GridRes) == '0.125x0.15625' ) THEN + CALL FlexGrid_Read_A1dyn( D(1), D(2), Input_Opt, State_Grid, State_Met ) + ENDIF ENDIF !---------------------------------- @@ -4462,41 +4466,46 @@ SUBROUTINE Get_Met_Fields( Input_Opt, State_Chm, State_Grid, & D = GET_FIRST_I3_TIME() CALL FlexGrid_Read_I3_1( D(1), D(2), Input_Opt, State_Grid, State_Met ) - ! Get delta pressure per grid box stored in restart file to allow - ! mass conservation across consecutive runs. - v_name = 'DELPDRY' - CALL HCO_GC_GetPtr( Input_Opt, State_Grid, TRIM(v_name), Ptr3D, RC, FOUND=FOUND ) - IF ( FOUND ) THEN - State_Met%DELP_DRY = Ptr3D - IF ( Input_Opt%amIRoot ) THEN - WRITE(6,*) 'Initialize DELP_DRY from restart file' - ENDIF - ELSE - IF ( Input_Opt%amIRoot ) THEN - WRITE(6,*) 'DELP_DRY not found in restart, set to zero' - ENDIF - ENDIF - Ptr3D => NULL() + ! Resolution 0.125x0.15625 uses I1dyn archive (xlwang, 06/2024) + IF ( TRIM(State_Grid%GridRes) /= '0.125x0.15625' ) THEN + + ! Get delta pressure per grid box stored in restart file to allow + ! mass conservation across consecutive runs. + v_name = 'DELPDRY' + CALL HCO_GC_GetPtr( Input_Opt, State_Grid, TRIM(v_name), Ptr3D, RC, FOUND=FOUND ) + IF ( FOUND ) THEN + State_Met%DELP_DRY = Ptr3D + IF ( Input_Opt%amIRoot ) THEN + WRITE(6,*) 'Initialize DELP_DRY from restart file' + ENDIF + ELSE + IF ( Input_Opt%amIRoot ) THEN + WRITE(6,*) 'DELP_DRY not found in restart, set to zero' + ENDIF + ENDIF + Ptr3D => NULL() + + ! Set dry surface pressure (PS1_DRY) from State_Met%PS1_WET + ! and compute avg dry pressure near polar caps + CALL Set_Dry_Surface_Pressure( State_Grid, State_Met, 1 ) + CALL AvgPole( State_Grid, State_Met%PS1_DRY ) - ! Set dry surface pressure (PS1_DRY) from State_Met%PS1_WET - ! and compute avg dry pressure near polar caps - CALL Set_Dry_Surface_Pressure( State_Grid, State_Met, 1 ) - CALL AvgPole( State_Grid, State_Met%PS1_DRY ) + ! Compute avg moist pressure near polar caps + CALL AvgPole( State_Grid, State_Met%PS1_WET ) - ! Compute avg moist pressure near polar caps - CALL AvgPole( State_Grid, State_Met%PS1_WET ) + ! Initialize surface pressures prior to interpolation + ! to allow initialization of floating pressures + State_Met%PSC2_WET = State_Met%PS1_WET + State_Met%PSC2_DRY = State_Met%PS1_DRY + CALL Set_Floating_Pressures( State_Grid, State_Met, RC ) - ! Initialize surface pressures prior to interpolation - ! to allow initialization of floating pressures - State_Met%PSC2_WET = State_Met%PS1_WET - State_Met%PSC2_DRY = State_Met%PS1_DRY - CALL Set_Floating_Pressures( State_Grid, State_Met, RC ) + ! Call AIRQNT to compute initial air mass quantities + ! Do not update initial tracer concentrations since not read + ! from restart file yet (ewl, 10/28/15) + CALL AirQnt( Input_Opt, State_Chm, State_Grid, State_Met, & + RC, update_mixing_ratio=.FALSE. ) - ! Call AIRQNT to compute initial air mass quantities - ! Do not update initial tracer concentrations since not read - ! from restart file yet (ewl, 10/28/15) - CALL AirQnt( Input_Opt, State_Chm, State_Grid, State_Met, & - RC, update_mixing_ratio=.FALSE. ) + ENDIF ! not 0.125x0.15625 ENDIF @@ -4506,16 +4515,87 @@ SUBROUTINE Get_Met_Fields( Input_Opt, State_Chm, State_Grid, & D = GET_I3_TIME() CALL FlexGrid_Read_I3_2( D(1), D(2), Input_Opt, State_Grid, State_Met ) - ! Set dry surface pressure (PS2_DRY) from State_Met%PS2_WET - ! and compute avg dry pressure near polar caps - CALL Set_Dry_Surface_Pressure( State_Grid, State_Met, 2 ) - CALL AvgPole( State_Grid, State_Met%PS2_DRY ) + ! Resolution 0.125x0.15625 use I1dyn archive (xlwang, 06/2024) + IF ( TRIM(State_Grid%GridRes) .NE. '0.125x0.15625' ) THEN - ! Compute avg moist pressure near polar caps - CALL AvgPole( State_Grid, State_Met%PS2_WET ) + ! Set dry surface pressure (PS2_DRY) from State_Met%PS2_WET + ! and compute avg dry pressure near polar caps + CALL Set_Dry_Surface_Pressure( State_Grid, State_Met, 2 ) + CALL AvgPole( State_Grid, State_Met%PS2_DRY ) + + ! Compute avg moist pressure near polar caps + CALL AvgPole( State_Grid, State_Met%PS2_WET ) + + ENDIF ! not 0.125x0.15625 ENDIF + !---------------------------------- + ! Read 1-hr instantanous data + !---------------------------------- + + ! Resolution 0.125x0.15625 uses I1dyn archive (xlwang, 06/2024) + IF ( TRIM(State_Grid%GridRes) == '0.125x0.15625' ) THEN + + IF ( PHASE == 0 ) THEN + D = GET_FIRST_I1dyn_TIME() + CALL FlexGrid_Read_I1dyn_1( D(1), D(2), Input_Opt, State_Grid, State_Met ) + + ! Get delta pressure per grid box stored in restart file to allow + ! mass conservation across consecutive runs. + v_name = 'DELPDRY' + CALL HCO_GC_GetPtr( Input_Opt, State_Grid, TRIM(v_name), Ptr3D, RC, FOUND=FOUND ) + IF ( FOUND ) THEN + State_Met%DELP_DRY = Ptr3D + IF ( Input_Opt%amIRoot ) THEN + WRITE(6,*) 'Initialize DELP_DRY from restart file' + ENDIF + ELSE + IF ( Input_Opt%amIRoot ) THEN + WRITE(6,*) 'DELP_DRY not found in restart, set to zero' + ENDIF + ENDIF + Ptr3D => NULL() + + ! Set dry surface pressure (PS1_DRY) from State_Met%PS1_WET + ! and compute avg dry pressure near polar caps + CALL Set_Dry_Surface_Pressure( State_Grid, State_Met, 1 ) + CALL AvgPole( State_Grid, State_Met%PS1_DRY ) + + ! Compute avg moist pressure near polar caps + CALL AvgPole( State_Grid, State_Met%PS1_WET ) + + ! Initialize surface pressures prior to interpolation + ! to allow initialization of floating pressures + State_Met%PSC2_WET = State_Met%PS1_WET + State_Met%PSC2_DRY = State_Met%PS1_DRY + CALL Set_Floating_Pressures( State_Grid, State_Met, RC ) + + ! Call AIRQNT to compute initial air mass quantities + ! Do not update initial tracer concentrations since not read + ! from restart file yet (ewl, 10/28/15) + CALL AirQnt( Input_Opt, State_Chm, State_Grid, State_Met, & + RC, update_mixing_ratio=.FALSE. ) + + ENDIF + + ! Read in I1dyn fields at t+3hours for this timestep + IF ( ITS_TIME_FOR_I1dyn() .and. .not. ITS_TIME_FOR_EXIT() ) THEN + + D = GET_I1dyn_TIME() + CALL FlexGrid_Read_I1dyn_2( D(1), D(2), Input_Opt, State_Grid, State_Met ) + + ! Set dry surface pressure (PS2_DRY) from State_Met%PS2_WET + ! and compute avg dry pressure near polar caps + CALL Set_Dry_Surface_Pressure( State_Grid, State_Met, 2 ) + CALL AvgPole( State_Grid, State_Met%PS2_DRY ) + + ! Compute avg moist pressure near polar caps + CALL AvgPole( State_Grid, State_Met%PS2_WET ) + + ENDIF + + ENDIF END SUBROUTINE Get_Met_Fields !EOC #endif diff --git a/GeosUtil/time_mod.F90 b/GeosUtil/time_mod.F90 index 3bcd2e171..2f8515b4e 100644 --- a/GeosUtil/time_mod.F90 +++ b/GeosUtil/time_mod.F90 @@ -62,10 +62,12 @@ MODULE TIME_MOD PUBLIC :: GET_A1_TIME PUBLIC :: GET_A3_TIME PUBLIC :: GET_I3_TIME + PUBLIC :: GET_I1dyn_TIME PUBLIC :: GET_BC_TIME PUBLIC :: GET_FIRST_A1_TIME PUBLIC :: GET_FIRST_A3_TIME PUBLIC :: GET_FIRST_I3_TIME + PUBLIC :: GET_FIRST_I1dyn_TIME PUBLIC :: GET_FIRST_BC_TIME PUBLIC :: ITS_TIME_FOR_CHEM PUBLIC :: ITS_TIME_FOR_CONV @@ -78,6 +80,7 @@ MODULE TIME_MOD PUBLIC :: ITS_TIME_FOR_A1 PUBLIC :: ITS_TIME_FOR_A3 PUBLIC :: ITS_TIME_FOR_I3 + PUBLIC :: ITS_TIME_FOR_I1dyn PUBLIC :: ITS_TIME_FOR_BC PUBLIC :: ITS_TIME_FOR_EXIT PUBLIC :: ITS_MIDMONTH @@ -2433,6 +2436,81 @@ END FUNCTION GET_I3_TIME !------------------------------------------------------------------------------ !BOP ! +! !IROUTINE: Get_i1dyn_time +! +! !DESCRIPTION: Function GET\_I1dyn\_TIME returns the correct YYYYMMDD and +! HHMMSS values that are needed to read in the next instantaneous 1-hour +! (I-1) fields. +!\\ +!\\ +! !INTERFACE: +! + FUNCTION GET_I1dyn_TIME() RESULT( DATE ) +! +! !RETURN VALUE: +! + INTEGER :: DATE(2) ! YYYYMMDD and HHMMSS values +! +! !REMARKS: +! Modified for start times other than 0 GMT. +! +! !REVISION HISTORY: +! 15 Jun 2024 - X. Wang - Initial version, for 0.125x0.15625 +! See https://github.com/geoschem/geos-chem for complete history +!EOP +!------------------------------------------------------------------------------ +!BOC +! +! !LOCAL VARIABLES: +! + LOGICAL, SAVE :: FIRST = .TRUE. + INTEGER :: HH, MM, SS, SECS, OFFSET + + !================================================================= + ! ALL MET FIELDS: + !================================================================= + + IF ( FIRST ) THEN + + !-------------------------------------------------------------- + ! FIRST-TIME ONLY! Get the proper # of hours until the next + ! I1dyn time. Also works for start times other than 0 GMT. + !-------------------------------------------------------------- + + ! Split NHMS into hours, mins, seconds + CALL YMD_EXTRACT( NHMS, HH, MM, SS ) + + ! Compute seconds elapsed in the 1-hour interval + SECS = MOD( HH, 1 )*3600 + MM*60 + SS + + ! Compute offset to next I-1 time + OFFSET = 3600 - SECS + + ! Get YYYY/MM/DD and hh:mm:ss to next I1dyn time + DATE = GET_TIME_AHEAD( OFFSET ) + + ! Reset first-time flag + FIRST = .FALSE. + + ELSE + + !-------------------------------------------------------------- + ! Other than the 1st time: Search 180 mins ahead + !-------------------------------------------------------------- + + ! We need to read in the I-1 fields 1h (60 mins, or 3600 secs) + ! ahead of time + DATE = GET_TIME_AHEAD( 3600 ) + + ENDIF + + END FUNCTION GET_I1dyn_TIME +!EOC +!------------------------------------------------------------------------------ +! GEOS-Chem Global Chemical Transport Model ! +!------------------------------------------------------------------------------ +!BOP +! ! !IROUTINE: Get_bc_time ! ! !DESCRIPTION: Function GET\_BC\_TIME returns the correct YYYYMMDD and HHMMSS @@ -2629,6 +2707,54 @@ END FUNCTION GET_FIRST_I3_TIME !------------------------------------------------------------------------------ !BOP ! +! !IROUTINE: Get_first_i1dyn_time +! +! !DESCRIPTION: Function GET\_FIRST\_I1dyn\_TIME returns the correct YYYYMMDD and +! HHMMSS values the first time that I-1 fields are read in from disk. +!\\ +!\\ +! !INTERFACE: +! + FUNCTION GET_FIRST_I1dyn_TIME() RESULT( DATE ) +! +! !RETURN VALUE: +! + INTEGER :: DATE(2) ! YYYYMMDD, HHMMSS values +! +! !REVISION HISTORY: +! 15 Jun 2024 - X. Wang - Initial version, for 0.125x0.15625 +! See https://github.com/geoschem/geos-chem for complete history +!EOP +!------------------------------------------------------------------------------ +!BOC +! +! !LOCAL VARIABLES: +! + INTEGER :: HH, MM, SS, SECS, OFFSET + + !================================================================== + ! Compute first I-6 time for all met field types + !================================================================== + + ! Split NYMS into hours, mins, seconds + CALL YMD_EXTRACT( NHMS, HH, MM, SS ) + + ! Compute seconds elapsed in the 3-hour interval + SECS = MOD( HH, 1 )*3600 + MM*60 + SS + + ! Compute offset to nearest I-6 time + OFFSET = -SECS + + ! Get YYYY/MM/DD and hh:mm:ss to nearest I-6 time + DATE = GET_TIME_AHEAD( OFFSET ) + + END FUNCTION GET_FIRST_I1dyn_TIME +!EOC +!------------------------------------------------------------------------------ +! GEOS-Chem Global Chemical Transport Model ! +!------------------------------------------------------------------------------ +!BOP +! ! !IROUTINE: Get_first_bc_time ! ! !DESCRIPTION: Function GET\_FIRST\_BC\_TIME returns the correct YYYYMMDD and @@ -3110,6 +3236,43 @@ END FUNCTION ITS_TIME_FOR_I3 !------------------------------------------------------------------------------ !BOP ! +! !IROUTINE: Its_Time_For_i1dyn +! +! !DESCRIPTION: Function ITS\_TIME\_FOR\_I1dyn returns TRUE if it is time to read +! in I1 (instantaneous 1-hr fields) and FALSE otherwise. +!\\ +!\\ +! !INTERFACE: +! + FUNCTION ITS_TIME_FOR_I1dyn() RESULT( FLAG ) +! +! !RETURN VALUE: +! + LOGICAL :: FLAG +! +! !REVISION HISTORY: +! 15 Jun 2024 - X. Wang - Initial version, for 0.125x0.15625 +! See https://github.com/geoschem/geos-chem for complete history +!EOP +!------------------------------------------------------------------------------ +!BOC +! +! !LOCAL VARAIABLES: +! + LOGICAL, SAVE :: FIRST = .TRUE. + + ! We read in I1dyn fields every hours at 00, 01, 02, ... GMT + FLAG = ( ( MOD( NHMS, 10000 ) == 0 ) .or. FIRST ) + + FIRST = .FALSE. + + END FUNCTION ITS_TIME_FOR_I1dyn +!EOC +!------------------------------------------------------------------------------ +! GEOS-Chem Global Chemical Transport Model ! +!------------------------------------------------------------------------------ +!BOP +! ! !IROUTINE: Its_Time_For_bc ! ! !DESCRIPTION: Function ITS\_TIME\_FOR\_BC returns TRUE if it is time to read diff --git a/Interfaces/GCClassic/main.F90 b/Interfaces/GCClassic/main.F90 index b74afbe3a..a413f30ad 100644 --- a/Interfaces/GCClassic/main.F90 +++ b/Interfaces/GCClassic/main.F90 @@ -1966,13 +1966,29 @@ PROGRAM GEOS_Chem !===================================================================== IF ( notDryRun ) THEN IF ((mod(get_hour(), 3) .eq. 0) .AND. (get_minute() .eq. 0)) THEN - CALL Copy_I3_Fields( State_Met ) + CALL Copy_I3_Fields( State_Met, State_Grid ) IF ( VerboseAndRoot ) THEN CALL Debug_Msg( '### MAIN: after COPY_I3_FIELDS' ) ENDIF ENDIF ENDIF + !===================================================================== + ! ***** C O P Y I - 1 d y n F I E L D S ***** + ! + ! The I-1 fields at the end of an outer timestep (every 1 hours) + ! become the fields at the beginning of the next timestep. + ! This update must occur before writing History. + !===================================================================== + IF ( notDryRun .and. TRIM(State_Grid%GridRes) == '0.125x0.15625' ) THEN + IF ((mod(get_hour(), 1) .eq. 0) .AND. (get_minute() .eq. 0)) THEN + CALL Copy_I1dyn_Fields( State_Met ) + IF ( VerboseAndRoot ) THEN + CALL Debug_Msg( '### MAIN: after COPY_I1dyn_FIELDS' ) + ENDIF + ENDIF + ENDIF + !--------------------------------------------------------------------- ! ***** H I S T O R Y W R I T E ***** !---------------------------------------------------------------------