From ecd7d7380ec486387e826557093a79d6f1ff8308 Mon Sep 17 00:00:00 2001 From: NeilBarton-NOAA Date: Wed, 7 Feb 2024 21:08:20 +0000 Subject: [PATCH 1/7] initial changes for EP5a ICs --- parm/config/gefs/config.stage_ic | 6 ++++++ parm/config/gefs/yaml/defaults.yaml | 2 ++ scripts/exglobal_stage_ic.sh | 23 +++++++++++++---------- workflow/rocoto/gefs_tasks.py | 15 ++++++++------- 4 files changed, 29 insertions(+), 17 deletions(-) diff --git a/parm/config/gefs/config.stage_ic b/parm/config/gefs/config.stage_ic index e2bb0af2b8..b332ee1826 100644 --- a/parm/config/gefs/config.stage_ic +++ b/parm/config/gefs/config.stage_ic @@ -8,6 +8,12 @@ echo "BEGIN: config.stage_ic" source "${EXPDIR}/config.resources" stage_ic case "${CASE}" in + "C384") + export CPL_ATMIC="" + export CPL_ICEIC="" + export CPL_OCNIC="" + export CPL_WAVIC="" + ;; "C48") export CPL_ATMIC="gefs_test" export CPL_ICEIC="gefs_test" diff --git a/parm/config/gefs/yaml/defaults.yaml b/parm/config/gefs/yaml/defaults.yaml index 84dfcbf718..c128b3a920 100644 --- a/parm/config/gefs/yaml/defaults.yaml +++ b/parm/config/gefs/yaml/defaults.yaml @@ -5,3 +5,5 @@ base: DO_JEDILANDDA: "NO" DO_MERGENSST: "NO" FHMAX_GFS: 120 + BASE_CPLIC: "/scratch2/NCEPDEV/stmp3/Neil.Barton/ICs" + diff --git a/scripts/exglobal_stage_ic.sh b/scripts/exglobal_stage_ic.sh index 58b37f3114..0efc769149 100755 --- a/scripts/exglobal_stage_ic.sh +++ b/scripts/exglobal_stage_ic.sh @@ -77,8 +77,10 @@ for MEMDIR in "${MEMDIR_ARRAY[@]}"; do if [[ "${DO_OCN:-}" = "YES" ]]; then RUN=${rCDUMP} YMD=${gPDY} HH=${gcyc} generate_com COM_OCEAN_RESTART_PREV:COM_OCEAN_RESTART_TMPL [[ ! -d "${COM_OCEAN_RESTART_PREV}" ]] && mkdir -p "${COM_OCEAN_RESTART_PREV}" - src="${BASE_CPLIC}/${CPL_OCNIC:-}/${PDY}${cyc}/${MEMDIR}/ocean/${PDY}.${cyc}0000.MOM.res.nc" - tgt="${COM_OCEAN_RESTART_PREV}/${PDY}.${cyc}0000.MOM.res.nc" + #src="${BASE_CPLIC}/${CPL_OCNIC:-}/${PDY}${cyc}/${MEMDIR}/ocean/${PDY}.${cyc}0000.MOM.res.nc" + #tgt="${COM_OCEAN_RESTART_PREV}/${PDY}.${cyc}0000.MOM.res.nc" + src="${BASE_CPLIC}/${CPL_OCNIC:-}/${PDY}${cyc}/${MEMDIR}/ocean/ORAS5.mx${OCNRES}.ic.nc" + tgt="${COM_OCEAN_RESTART_PREV}/ORAS5.mx${OCNRES}.ic.nc" ${NCP} "${src}" "${tgt}" rc=$? ((rc != 0)) && error_message "${src}" "${tgt}" "${rc}" @@ -88,14 +90,15 @@ for MEMDIR in "${MEMDIR_ARRAY[@]}"; do # Nothing more to do for these resolutions ;; "025" ) - for nn in $(seq 1 3); do - src="${BASE_CPLIC}/${CPL_OCNIC:-}/${PDY}${cyc}/${MEMDIR}/ocean/${PDY}.${cyc}0000.MOM.res_${nn}.nc" - tgt="${COM_OCEAN_RESTART_PREV}/${PDY}.${cyc}0000.MOM.res_${nn}.nc" - ${NCP} "${src}" "${tgt}" - rc=$? - ((rc != 0)) && error_message "${src}" "${tgt}" "${rc}" - err=$((err + rc)) - done + # Nothing to do for ORAS5 initialization + #for nn in $(seq 1 3); do + # src="${BASE_CPLIC}/${CPL_OCNIC:-}/${PDY}${cyc}/${MEMDIR}/ocean/${PDY}.${cyc}0000.MOM.res_${nn}.nc" + # tgt="${COM_OCEAN_RESTART_PREV}/${PDY}.${cyc}0000.MOM.res_${nn}.nc" + # ${NCP} "${src}" "${tgt}" + # rc=$? + # ((rc != 0)) && error_message "${src}" "${tgt}" "${rc}" + # err=$((err + rc)) + #done ;; *) echo "FATAL ERROR: Unsupported ocean resolution ${OCNRES}" diff --git a/workflow/rocoto/gefs_tasks.py b/workflow/rocoto/gefs_tasks.py index 154383f627..8bb3712fc9 100644 --- a/workflow/rocoto/gefs_tasks.py +++ b/workflow/rocoto/gefs_tasks.py @@ -30,15 +30,16 @@ def stage_ic(self): if self.app_config.do_ocean: ocn_res = f"{self._base.get('OCNRES', '025'):03d}" prefix = f"{cpl_ic['BASE_CPLIC']}/{cpl_ic['CPL_OCNIC']}/@Y@m@d@H/mem000/ocean" - data = f"{prefix}/@Y@m@d.@H0000.MOM.res.nc" + #data = f"{prefix}/@Y@m@d.@H0000.MOM.res.nc" + data = f"{prefix}/ORAS5.mx{ocn_res}.ic.nc" dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) - if ocn_res in ['025']: - # 0.25 degree ocean model also has these additional restarts - for res in [f'res_{res_index}' for res_index in range(1, 4)]: - data = f"{prefix}/@Y@m@d.@H0000.MOM.{res}.nc" - dep_dict = {'type': 'data', 'data': data} - deps.append(rocoto.add_dependency(dep_dict)) + #if ocn_res in ['025']: + # # 0.25 degree ocean model also has these additional restarts + # for res in [f'res_{res_index}' for res_index in range(1, 4)]: + # data = f"{prefix}/@Y@m@d.@H0000.MOM.{res}.nc" + # dep_dict = {'type': 'data', 'data': data} + # deps.append(rocoto.add_dependency(dep_dict)) # Ice ICs if self.app_config.do_ice: From e5e91f1c03bdc877ee7700e969869fffaf6c2a17 Mon Sep 17 00:00:00 2001 From: NeilBarton-NOAA Date: Thu, 8 Feb 2024 22:33:56 +0000 Subject: [PATCH 2/7] start running with EP5 --- parm/config/gefs/config.fcst | 6 +++++- parm/config/gefs/config.ufs | 6 +++--- ush/forecast_postdet.sh | 21 +++++++++++---------- ush/parsing_namelists_MOM6.sh | 18 ++++++++++++++++++ 4 files changed, 37 insertions(+), 14 deletions(-) diff --git a/parm/config/gefs/config.fcst b/parm/config/gefs/config.fcst index 6f4a11f7c4..fffc512e05 100644 --- a/parm/config/gefs/config.fcst +++ b/parm/config/gefs/config.fcst @@ -129,7 +129,11 @@ tbp="" if [[ "${progsigma}" == ".true." ]]; then tbp="_progsigma" ; fi # Radiation options -export IAER=1011 ; #spectral band mapping method for aerosol optical properties +if [[ "${DO_AERO}" == "YES" ]]; then + export IAER=1011 ; #spectral band mapping method for aerosol optical properties +else + export IAER=2011 ; #spectral band mapping method for aerosol optical properties +fi export iovr_lw=3 ; #de-correlation length cloud overlap method (Barker, 2008) export iovr_sw=3 ; #de-correlation length cloud overlap method (Barker, 2008) export iovr=3 ; #de-correlation length cloud overlap method (Barker, 2008) diff --git a/parm/config/gefs/config.ufs b/parm/config/gefs/config.ufs index 2031d0b538..2fe49cfa22 100644 --- a/parm/config/gefs/config.ufs +++ b/parm/config/gefs/config.ufs @@ -172,7 +172,7 @@ case "${fv3_res}" in export layout_y=8 export layout_x_gfs=8 export layout_y_gfs=8 - export nthreads_fv3=1 + export nthreads_fv3=2 export nthreads_fv3_gfs=2 export cdmbgwd="1.1,0.72,1.0,1.0" # mountain blocking, ogwd, cgwd, cgwd src scaling export cdmbgwd_gsl="5.0,5.0,1.0,1.0" # settings for GSL drag suite @@ -363,7 +363,7 @@ if [[ "${skip_mom6}" == "false" ]]; then FRUNOFF="runoff.daitren.clim.${NX_GLB}x${NY_GLB}.v20180328.nc" CHLCLIM="seawifs-clim-1997-2010.${NX_GLB}x${NY_GLB}.v20180328.nc" MOM6_RIVER_RUNOFF='True' - MOM6_RESTART_SETTING="r" + MOM6_RESTART_SETTING="n" eps_imesh="1.0e-1" if [[ "${DO_JEDIOCNVAR:-NO}" = "YES" ]]; then MOM6_DIAG_COORD_DEF_Z_FILE="oceanda_zgrid_75L.nc" @@ -422,7 +422,7 @@ if [[ "${skip_cice6}" == "false" ]]; then cice6_processor_shape="slenderX2" ;; "025") - ntasks_cice6=120 + ntasks_cice6=72 cice6_processor_shape="slenderX2" ;; *) diff --git a/ush/forecast_postdet.sh b/ush/forecast_postdet.sh index 8e40d6c881..bd31e89c40 100755 --- a/ush/forecast_postdet.sh +++ b/ush/forecast_postdet.sh @@ -679,16 +679,17 @@ MOM6_postdet() { echo "SUB ${FUNCNAME[0]}: MOM6 after run type determination" # Copy MOM6 ICs - ${NLN} "${COM_OCEAN_RESTART_PREV}/${sPDY}.${scyc}0000.MOM.res.nc" "${DATA}/INPUT/MOM.res.nc" - case ${OCNRES} in - "025") - for nn in $(seq 1 4); do - if [[ -f "${COM_OCEAN_RESTART_PREV}/${sPDY}.${scyc}0000.MOM.res_${nn}.nc" ]]; then - ${NLN} "${COM_OCEAN_RESTART_PREV}/${sPDY}.${scyc}0000.MOM.res_${nn}.nc" "${DATA}/INPUT/MOM.res_${nn}.nc" - fi - done - ;; - esac + ${NLN} "${COM_OCEAN_RESTART_PREV}/ORAS5.mx${OCNRES}.ic.nc" "${DATA}/INPUT/ORAS5.mx${OCNRES}.ic.nc" + #${NLN} "${COM_OCEAN_RESTART_PREV}/${sPDY}.${scyc}0000.MOM.res.nc" "${DATA}/INPUT/MOM.res.nc" + #case ${OCNRES} in + # "025") + # for nn in $(seq 1 4); do + # if [[ -f "${COM_OCEAN_RESTART_PREV}/${sPDY}.${scyc}0000.MOM.res_${nn}.nc" ]]; then + # ${NLN} "${COM_OCEAN_RESTART_PREV}/${sPDY}.${scyc}0000.MOM.res_${nn}.nc" "${DATA}/INPUT/MOM.res_${nn}.nc" + # fi + # done + # ;; + #esac # Link increment if [[ "${DO_JEDIOCNVAR:-NO}" = "YES" ]]; then diff --git a/ush/parsing_namelists_MOM6.sh b/ush/parsing_namelists_MOM6.sh index ca93edb526..f3ca0a630a 100755 --- a/ush/parsing_namelists_MOM6.sh +++ b/ush/parsing_namelists_MOM6.sh @@ -117,6 +117,24 @@ atparse < "${template}" >> "${DATA}/INPUT/MOM_input" echo "Rendered MOM_input:" cat "${DATA}/INPUT/MOM_input" +#ORAS5 +ln=$(grep -wn "Z-space file on a latitude-longitude grid." ${DATA}/INPUT/MOM_input | cut -d: -f1) && ln=$(( ln + 1 )) +sed -i "${ln} i THICKNESS_CONFIG = 'thickness_file'" ${DATA}/INPUT/MOM_input && ln=$(( ln + 1 )) +sed -i "${ln} i THICKNESS_FILE = 'ORAS5.mx025.ic.nc'" ${DATA}/INPUT/MOM_input && ln=$(( ln + 1 )) +sed -i "${ln} i TS_CONFIG = 'file'" ${DATA}/INPUT/MOM_input && ln=$(( ln + 1 )) +sed -i "${ln} i TS_FILE = 'ORAS5.mx025.ic.nc'" ${DATA}/INPUT/MOM_input && ln=$(( ln + 1 )) +sed -i "${ln} i TEMP_IC_VAR = 'Temp'" ${DATA}/INPUT/MOM_input && ln=$(( ln + 1 )) +sed -i "${ln} i VELOCITY_CONFIG = 'file'" ${DATA}/INPUT/MOM_input && ln=$(( ln + 1 )) +sed -i "${ln} i VELOCITY_FILE = 'ORAS5.mx025.ic.nc'" ${DATA}/INPUT/MOM_input +sed -i "s:PARALLEL_RESTARTFILES = True:PARALLEL_RESTARTFILES = False:g" ${DATA}/INPUT/MOM_input +sed -i "s:INIT_LAYERS_FROM_Z_FILE = True:INIT_LAYERS_FROM_Z_FILE = False:g" ${DATA}/INPUT/MOM_input +sed -i 's:TEMP_SALT_Z_INIT_FILE = "MOM6_IC_TS.nc":!TEMP_SALT_Z_INIT_FILE = "ORAS5.mx025.ic.nc":g' ${DATA}/INPUT/MOM_input +sed -i 's:Z_INIT_FILE_PTEMP_VAR = "temp":!Z_INIT_FILE_PTEMP_VAR = "temp":g' ${DATA}/INPUT/MOM_input +sed -i 's:Z_INIT_FILE_SALT_VAR = "salt":!Z_INIT_FILE_SALT_VAR = "salt":g' ${DATA}/INPUT/MOM_input +sed -i 's:Z_INIT_ALE_REMAPPING = True:!Z_INIT_ALE_REMAPPING = True:g' ${DATA}/INPUT/MOM_input +sed -i 's:Z_INIT_REMAP_OLD_ALG = True:!Z_INIT_REMAP_OLD_ALG = True:g' ${DATA}/INPUT/MOM_input + + # ================================================================ # data_table # ---------- From cd28564e92e69365b98a7f1045481bbcd8d2a197 Mon Sep 17 00:00:00 2001 From: NeilBarton-NOAA Date: Tue, 13 Feb 2024 23:05:18 +0000 Subject: [PATCH 3/7] finalize running EP5d --- parm/config/gefs/config.efcs | 30 ++--- parm/config/gefs/config.fcst | 4 +- scripts/exgdas_enkf_fcst.sh | 2 +- scripts/exglobal_stage_ic.sh | 9 ++ ush/forecast_postdet.sh | 71 ++++++++-- ush/gefs_fireclimo_blend.py | 247 ++++++++++++++++++++++++++++++++++ ush/parsing_namelists_FV3.sh | 34 ++++- ush/parsing_namelists_MOM6.sh | 29 +--- 8 files changed, 372 insertions(+), 54 deletions(-) create mode 100755 ush/gefs_fireclimo_blend.py diff --git a/parm/config/gefs/config.efcs b/parm/config/gefs/config.efcs index 9593408848..e688845261 100644 --- a/parm/config/gefs/config.efcs +++ b/parm/config/gefs/config.efcs @@ -24,6 +24,9 @@ source "${EXPDIR}/config.ufs" ${string} # Get task specific resources source "${EXPDIR}/config.resources" efcs +# Turn on the use of wildfire emissions bleneded to climatology +export BLENDED_WILDFIRE_EMISSIONS=T + # Use serial I/O for ensemble (lustre?) export OUTPUT_FILETYPE_ATM="netcdf" export OUTPUT_FILETYPE_SFC="netcdf" @@ -36,23 +39,20 @@ export RERUN_EFCSGRP="NO" export WRITE_DOPOST=".true." # Stochastic physics parameters (only for ensemble forecasts) +# ATM export DO_SKEB="YES" -export SKEB=0.3 -export SKEB_TAU=21600. -export SKEB_LSCALE=250000. -export SKEBNORM=0 -export SKEB_NPASS=30 -export SKEB_VDOF=5 -export DO_SHUM="YES" -export SHUM=0.005 -export SHUM_TAU=21600. -export SHUM_LSCALE=500000. export DO_SPPT="YES" -export SPPT=0.5 -export SPPT_TAU=21600. -export SPPT_LSCALE=500000. -export SPPT_LOGIT=".true." -export SPPT_SFCLIMIT=".true." +export DO_SHUM="NO" +# OCN +export DO_OCN_SPPT="YES" +export DO_OCN_PERT_EPBL="YES" +export ODA_INCUPD="True" +export ODA_TEMPINC_VAR='t_pert' +export ODA_SALTINC_VAR='s_pert' +export ODA_THK_VAR='h_anl' +export ODA_UINC_VAR='u_pert' +export ODA_VINC_VAR='v_pert' +export ODA_INCUPD_NHOURS=0.0 export restart_interval=${restart_interval_gfs} diff --git a/parm/config/gefs/config.fcst b/parm/config/gefs/config.fcst index fffc512e05..a3038575f0 100644 --- a/parm/config/gefs/config.fcst +++ b/parm/config/gefs/config.fcst @@ -130,9 +130,9 @@ if [[ "${progsigma}" == ".true." ]]; then tbp="_progsigma" ; fi # Radiation options if [[ "${DO_AERO}" == "YES" ]]; then - export IAER=1011 ; #spectral band mapping method for aerosol optical properties -else export IAER=2011 ; #spectral band mapping method for aerosol optical properties +else + export IAER=1011 ; #spectral band mapping method for aerosol optical properties fi export iovr_lw=3 ; #de-correlation length cloud overlap method (Barker, 2008) export iovr_sw=3 ; #de-correlation length cloud overlap method (Barker, 2008) diff --git a/scripts/exgdas_enkf_fcst.sh b/scripts/exgdas_enkf_fcst.sh index fd6136ddd2..05e0634511 100755 --- a/scripts/exgdas_enkf_fcst.sh +++ b/scripts/exgdas_enkf_fcst.sh @@ -84,7 +84,7 @@ fi # gfs_physics_nml export FHSWR=${FHSWR_ENKF:-${FHSWR:-3600.}} export FHLWR=${FHLWR_ENKF:-${FHLWR:-3600.}} -export IEMS=${IEMS_ENKF:-${IEMS:-1}} +export IEMS=${IEMS_ENKF:-${IEMS:-2}} export ISOL=${ISOL_ENKF:-${ISOL:-2}} export IAER=${IAER_ENKF:-${IAER:-111}} export ICO2=${ICO2_ENKF:-${ICO2:-2}} diff --git a/scripts/exglobal_stage_ic.sh b/scripts/exglobal_stage_ic.sh index 0efc769149..aaf704f441 100755 --- a/scripts/exglobal_stage_ic.sh +++ b/scripts/exglobal_stage_ic.sh @@ -106,6 +106,15 @@ for MEMDIR in "${MEMDIR_ARRAY[@]}"; do err=$((err + rc)) ;; esac + + # Ocean Perturbation Files + if [[ "${MEMDIR}" != "mem000" ]]; then + src="${BASE_CPLIC}/${CPL_OCNIC:-}/${PDY}${cyc}/${MEMDIR}/ocean/${PDY}.${cyc}0000.mom6_increment.nc" + tgt="${COM_OCEAN_RESTART_PREV}/${PDY}.${cyc}0000.mom6_increment.nc" + ${NCP} "${src}" "${tgt}" + rc=$? + ((rc != 0)) && error_message "${src}" "${tgt}" "${rc}" + fi # TODO: Do mediator restarts exists in a ATMW configuration? # TODO: No mediator is presumably involved in an ATMA configuration diff --git a/ush/forecast_postdet.sh b/ush/forecast_postdet.sh index bd31e89c40..7b70e7c72b 100755 --- a/ush/forecast_postdet.sh +++ b/ush/forecast_postdet.sh @@ -242,12 +242,12 @@ EOF MM=$(printf %02d "${month}") ${NLN} "${FIXaer}/merra2.aerclim.2003-2014.m${MM}.nc" "aeroclim.m${MM}.nc" done - ${NLN} "${FIXlut}/optics_BC.v1_3.dat" "${DATA}/optics_BC.dat" - ${NLN} "${FIXlut}/optics_OC.v1_3.dat" "${DATA}/optics_OC.dat" - ${NLN} "${FIXlut}/optics_DU.v15_3.dat" "${DATA}/optics_DU.dat" - ${NLN} "${FIXlut}/optics_SS.v3_3.dat" "${DATA}/optics_SS.dat" - ${NLN} "${FIXlut}/optics_SU.v1_3.dat" "${DATA}/optics_SU.dat" fi + ${NLN} "${FIXlut}/optics_BC.v1_3.dat" "${DATA}/optics_BC.dat" + ${NLN} "${FIXlut}/optics_OC.v1_3.dat" "${DATA}/optics_OC.dat" + ${NLN} "${FIXlut}/optics_DU.v15_3.dat" "${DATA}/optics_DU.dat" + ${NLN} "${FIXlut}/optics_SS.v3_3.dat" "${DATA}/optics_SS.dat" + ${NLN} "${FIXlut}/optics_SU.v1_3.dat" "${DATA}/optics_SU.dat" ${NLN} "${FIXam}/global_co2historicaldata_glob.txt" "${DATA}/co2historicaldata_glob.txt" ${NLN} "${FIXam}/co2monthlycyc.txt" "${DATA}/co2monthlycyc.txt" @@ -433,23 +433,45 @@ EOF # Stochastic Physics Options if [[ ${SET_STP_SEED:-"YES"} = "YES" ]]; then - ISEED_SKEB=$((current_cycle*1000 + MEMBER*10 + 1)) + ISEED_SPPT=$((CDATE*10000 + ${MEMBER#0}*100 + 3)),$((CDATE*10000 + ${MEMBER#0}*100 + 4)),$((CDATE*10000 + ${MEMBER#0}*100 + 5)),$((CDATE*10000 + ${MEMBER#0}*100 + 6)),$((CDATE*10000 + ${MEMBER#0}*100 + 7)) + ISEED_CA=$(( (CDATE*10000 + ${MEMBER#0}*100 + 18) % 2147483647 )) + ISEED_SKEB=0 ISEED_SHUM=$((current_cycle*1000 + MEMBER*10 + 2)) - ISEED_SPPT=$((current_cycle*1000 + MEMBER*10 + 3)) - ISEED_CA=$(( (current_cycle*1000 + MEMBER*10 + 4) % 2147483647 )) ISEED_LNDP=$(( (current_cycle*1000 + MEMBER*10 + 5) % 2147483647 )) else ISEED=${ISEED:-0} fi if [[ ${DO_SKEB} = "YES" ]]; then do_skeb=".true." + SKEB=${SKEB:-0.8,-999,-999,-999,-999} + iseed_skeb=${ISEED_SKEB} + SKEB_TAU=${SKEB_TAU:-2.16E4,1.728E5,2.592E6,7.776E6,3.1536E7} + SKEB_LSCALE=${SKEB_LSCALE:-500.E3,1000.E3,2000.E3,2000.E3,2000.E3} + SKEBNORM=${SKEBNORM:-1} fi if [[ ${DO_SPPT} = "YES" ]]; then do_sppt=".true." + SPPT=${SPPT:-0.56,0.28,0.14,0.056,0.028} + iseed_sppt=${ISEED_SPPT} + SPPT_TAU=${SPPT_TAU:-2.16E4,2.592E5,2.592E6,7.776E6,3.1536E7} + SPPT_LSCALE=${SPPT_LSCALE:-500.E3,1000.E3,2000.E3,2000.E3,2000.E3} + sppt_logit=.TRUE. + sppt_sfclimit=.true. + use_zmtnlck=.true. fi if [[ ${DO_SHUM} = "YES" ]]; then do_shum=".true." fi + if [[ ${DO_OCN_SPPT} = "YES" ]]; then + OCNSPPT=${OCNSPPT:-0.8,0.4,0.2,0.08,0.04} + OCNSPPT_TAU=${OCNSPPT_TAU:-2.16E4,2.592E5,2.592E6,7.776E6,3.1536E7} + OCNSPPT_LSCALE=${OCNSPPT_LSCALE:-500.E3,1000.E3,2000.E3,2000.E3,2000.E3} + fi + if [[ ${DO_OCN_PERT_EPBL} = "YES" ]]; then + EPBL=${EPBL:-0.8,0.4,0.2,0.08,0.04} + EPBL_TAU=${EPBL_TAU:-2.16E4,2.592E5,2.592E6,7.776E6,3.1536E7} + EPBL_LSCALE=${EPBL_LSCALE:-500.E3,1000.E3,2000.E3,2000.E3,2000.E3} + fi if [[ ${DO_LAND_PERT} = "YES" ]]; then lndp_type=${lndp_type:-2} LNDP_TAU=${LNDP_TAU:-21600} @@ -700,6 +722,10 @@ MOM6_postdet() { ${NLN} "${COM_OCEAN_ANALYSIS}/${RUN}.t${cyc}z.ocninc.nc" "${DATA}/INPUT/mom6_increment.nc" fi + if [[ "${DO_OCN_SPPT}" == "YES" ]]; then + ${NLN} "${COM_OCEAN_RESTART_PREV}/${sPDY}.${scyc}0000.mom6_increment.nc" "${DATA}/INPUT/mom6_increment.nc" + fi + # Copy MOM6 fixed files ${NCP} "${FIXmom}/${OCNRES}/"* "${DATA}/INPUT/" @@ -737,8 +763,8 @@ MOM6_postdet() { # largest signed integer if [[ "${DO_OCN_SPPT}" = "YES" ]] || [[ "${DO_OCN_PERT_EPBL}" = "YES" ]]; then if [[ ${SET_STP_SEED:-"YES"} = "YES" ]]; then - ISEED_OCNSPPT=$(( (current_cycle*1000 + MEMBER*10 + 6) % 2147483647 )) - ISEED_EPBL=$(( (current_cycle*1000 + MEMBER*10 + 7) % 2147483647 )) + ISEED_OCNSPPT=$((CDATE*10000 + ${MEMBER#0}*100 + 8)),$((CDATE*10000 + ${MEMBER#0}*100 + 9)),$((CDATE*10000 + ${MEMBER#0}*100 + 10)),$((CDATE*10000 + ${MEMBER#0}*100 + 11)),$((CDATE*10000 + ${MEMBER#0}*100 + 12)) + ISEED_EPBL=$((CDATE*10000 + ${MEMBER#0}*100 + 13)),$((CDATE*10000 + ${MEMBER#0}*100 + 14)),$((CDATE*10000 + ${MEMBER#0}*100 + 15)),$((CDATE*10000 + ${MEMBER#0}*100 + 16)),$((CDATE*10000 + ${MEMBER#0}*100 + 17)) else ISEED=${ISEED:-0} fi @@ -1000,6 +1026,11 @@ GOCART_rc() { if (( status != 0 )); then exit "${status}"; fi fi fi + + if [[ ${BLENDED_WILDFIRE_EMISSIONS} == T ]]; then + fire_org='ExtData/nexus/QFED/%y4/%m2/qfed2.emis_so2.006.%y4%m2%d2.nc4' + sed -i "s:${fire_org}:${fire_out}:g" ${DATA}/AERO_ExtData.rc + fi } GOCART_postdet() { @@ -1015,6 +1046,26 @@ GOCART_postdet() { rm -f "${COM_CHEM_HISTORY}/gocart.inst_aod.${vdate:0:8}_${vdate:8:2}00z.nc4" fi + # Blended Wildire Emissions + BLENDED_WILDFIRE_EMISSIONS=${BLENDED_WILDFIRE_EMISSIONS:-F} + if [[ ${BLENDED_WILDFIRE_EMISSIONS} == T ]]; then + local EMISSION_DIR=/scratch1/RDARCH/rda-arl-gpu/Barry.Baker/emissions/nexus/GBBEPx/v4/climMean + local fhmax_day=$(( ${FHMAX_GFS} / 24 )) + local fire_in="/scratch1/RDARCH/rda-arl-gpu/Barry.Baker/emissions/nexus/QFED/${vdate:0:4}/${vdate:4:2}/qfed2.emis_*.${PDY}.nc4" + fire_out="${COM_TOP}/mem000/model_data/chem/input/QFED_Blended_${PDY}_${fhmax_day}.nc" + if [[ ! -f ${fire_out} ]]; then + set +x + module purge + source ~Neil.Barton/.profile + set -x + mkdir -p $(dirname ${fire_out}) + ${HOMEgfs}/ush/gefs_fireclimo_blend.py -s ${PDY} -n ${fhmax_day} -c ${EMISSION_DIR} -f ${fire_in} -o ${fire_out} -r 0.95 + source ${HOMEgfs}/ush/load_fv3gfs_modules.sh + + + fi + fi + #To Do: Temporarily removing this as this will crash gocart, adding copy statement at the end #${NLN} "${COM_CHEM_HISTORY}/gocart.inst_aod.${vdate:0:8}_${vdate:8:2}00z.nc4" \ # "${DATA}/gocart.inst_aod.${vdate:0:8}_${vdate:8:2}00z.nc4" diff --git a/ush/gefs_fireclimo_blend.py b/ush/gefs_fireclimo_blend.py new file mode 100755 index 0000000000..20ec00347c --- /dev/null +++ b/ush/gefs_fireclimo_blend.py @@ -0,0 +1,247 @@ +#!/usr/bin/env python + +import xarray as xr +import pandas as pd +from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter + +def open_qfed(fname): + from glob import glob + from numpy import sort + vrs = ['BC','CH4','CO','CO2','NH3','NOx','OC','PM2.5','SO2'] + qfed_vars = ['bc','ch4','co','co2','nh3','no','oc','pm25','so2'] + das = [] + # print(fname) + + + if len(fname) > 1: + files = sort(fname) + else: + files = sort(glob(fname)) + + for v in files: + good = [ i for i in qfed_vars if i in v] + if good: + print('opening:',v,good) + dset = xr.open_dataset(v,decode_cf=False) + var_index = vrs[qfed_vars.index(good[0])] # variable index + da = dset['biomass'] + das.append(da) +# print(len(das)) + dset_dict = {} + for index,v in enumerate(vrs): + # print(index,v) + dset_dict[v] = das[index] + dset = xr.Dataset(dset_dict) + return dset + + +def write_ncf(dset, outfile): + """ + Write the given dataset to a NetCDF file with specified encoding. + + Parameters: + - dset (xarray.Dataset): The dataset to be written to the NetCDF file. + - outfile (str): The path and filename of the output NetCDF file. + + Returns: + None + """ + print('Output File:', outfile) + encoding = {} + for v in dset.data_vars: + encoding[v] = dict(zlib=True, complevel=4) + if 'latitude' in dset: + encoding['latitude'] = dict(zlib=True, complevel=4) + encoding['longitude'] = dict(zlib=True, complevel=4) + if 'lat_b' in dset: + encoding["lat_b"] = dict(zlib=True, complevel=4) + encoding["lon_b"] = dict(zlib=True, complevel=4) + if 'time' in dset: + encoding['time'] = dict(dtype='i4') + dset.load().to_netcdf(outfile, encoding=encoding) + +def create_climatology(emissions, climatology, lat_coarse=50, lon_coarse=50): + """ + Create scaled climatology data based on emission data. + + Parameters: + emissions (xarray.DataArray): Emission data. + climatology (xarray.Dataset): Input climatology data. + lat_coarse (int, optional): Coarsening factor for latitude. Defaults to 50. + lon_coarse (int, optional): Coarsening factor for longitude. Defaults to 50. + + Returns: + xarray.Dataset: Scaled climatology data. + + """ + # Create a copy of the climatology + clim = climatology.copy() + + # Coarsen the climatology + clim_coarse = climatology.coarsen(lat=lat_coarse, lon=lon_coarse, boundary='trim').sum() + + # Calculate the ratio of emissions to climatology and handle NaN values + ratio = (emissions.squeeze().data / clim_coarse.where(clim_coarse > 0)).fillna(0) + + # Interpolate the ratio to match the coordinates of the climatology + ratio_interp = ratio.interp(lat=clim.lat, lon=clim.lon, method='nearest') + + # Loop through each time slice and scale the climatology + for index, time_slice in enumerate(clim.time): + # Get the current time slice of the climatology + clim_slice = clim.data[index, :, :] + + # Calculate the weighted alpha ratio parameter + alpha = 1. - 1. / (index + 1) + + # Scale the current time slice + scaled_slice = clim_slice * ratio_interp[index, :, :] + + # Update the climatology with the scaled time slice + clim.data[index, :, :] = scaled_slice.squeeze().data + + return clim.compute() + + +def make_fire_emission(d=None, climos=None, ratio=0.9, scale_climo=True, n_forecast_days=35, obsfile='GBBEPx_all01GRID.emissions_v004_20190601.nc',climo_directory='climMean'): + """ + Generate fire emissions data for a given date and forecast period. + + Parameters: + - d (str or pd.Timestamp): The date for which fire emissions are generated. + - climos (dict): Dictionary containing pre-calculated climatology data for scaling. + - ratio (float): The ratio of original data to climatology data for blending. + - scale_climo (bool): Flag indicating whether to scale the climatology data. + - n_forecast_days (int): Number of forecast days. + - obsfile (str): Path to the file containing observed fire emissions data. + - climo_directory (str): Directory containing climatology files. + + Returns: + - list: A list of xarray.Dataset objects representing fire emissions data for each forecast day. + """ + import pandas as pd + import numpy as np + from glob import glob + # get the timestamp + dd = pd.Timestamp(d) + + #open fire emission + if len(obsfile) > 1: + if "QFED" in obsfile[0]: + g = open_qfed(obsfile) + else: + g = xr.open_mfdataset(obsfile, decode_cf=False) + else: + if 'QFED' in obsfile: + g = open_qfed(obsfile) + else: + g = xr.open_mfdataset(obsfile, decode_cf=False) + + # climo files to open + final = dd + pd.Timedelta('{} days'.format(n_forecast_days)) + if dd.is_leap_year: + dates = pd.DatetimeIndex([ d + pd.DateOffset(years=1) + pd.DateOffset(days=n) for n in range(n_forecast_days)]) + else: + dates = pd.date_range(start=dd,end=final,freq='D') + files = [t.strftime('{}/GBBEPx-all01GRID_v4r0_climMean_%m%d.nc'.format(climo_directory)) for t in dates] + + # open climo file + climo = xr.open_mfdataset(files) + climo = climo.interp(lat=g['lat'],lon=g['lon']) + + # make weighted climo + gc = g.coarsen(lat=150,lon=150,boundary='trim').sum() + + dsets = [] + climos = {} + for tslice in np.arange(n_forecast_days): + #print(tslice) + #make copy of original data + if tslice==0: + dset = g.copy() + else: + dset = dsets[tslice-1].copy() + + # fix time in copy + + import pandas as pd + + dset.update({'time': [float(tslice*24)]}) + dset.time.attrs = g.time.attrs + + for v in g.data_vars: + if scale_climo == False: + if tslice > 5: + dset[v].data = (ratio * dset[v] + (1 - ratio) * climo[v].data[tslice, :, :]) + else: + if tslice == 0: + print('creating climatology scaling for', v) + climos[v] = create_climatology(gc[v], climo[v], lon_coarse=150, lat_coarse=150) + else: + # cn = create_climdata(gc[v],climo[v]) + # print(cn) + if tslice > 5: + dset[v].data = (ratio * dset[v] + (1 - ratio) * climos[v].data[tslice, :, :]) + else: + dset[v] = dset[v] + dsets.append(dset) + return dsets + +if __name__ == '__main__': + parser = ArgumentParser(description='Regrid MERRA2 to FV3 native netcdf input files', formatter_class=ArgumentDefaultsHelpFormatter) + parser.add_argument( + '-s', + '--start_date', + type=str, + default=None, + help='start day of processing. *Note: leave blank for Real-time format YYYY-mm-dd') + parser.add_argument( + '-n', + '--n_forecast_days', + type=int, + default=None, + help='number of days to process') + parser.add_argument('-c', + '--climo_directory', + default='/scratch1/RDARCH/rda-arl-gpu/Barry.Baker/emissions/nexus/GBBEPx/v4/climMean', + help='Directory of the climate data') + parser.add_argument('-f', + '--fire_file', + default='/scratch1/RDARCH/rda-arl-gpu/Barry.Baker/emissions/nexus/QFED/2021/', + help='input fire emission file/files', + nargs='+') + parser.add_argument('-o', + '--output_filename', + default='/scratch1/RDARCH/rda-arl-gpu/Barry.Baker/emissions/nexus/QFED/2021/', + help='output file name') + parser.add_argument('-r', + '--ratio', + default=0.95, + type=float, + help='weighting ratio') + args = parser.parse_args() + + start_date = args.start_date + n_forecast_days = args.n_forecast_days + climate_directory = args.climo_directory + observation_file = args.fire_file + outfname = args.output_filename + ratio = float(args.ratio) + + start = pd.Timestamp(start_date) + + dsets = make_fire_emission(d=start, + n_forecast_days=n_forecast_days, + climo_directory=climate_directory, + obsfile=observation_file, + ratio=ratio) + dset = xr.concat(dsets, dim='time').fillna(0.) + dset['time'] = dset.time.astype('int') + dset['time'].attrs['units'] = start.strftime('hours since %Y-%m-%d 12:00:00') + + # write netcdf file out + write_ncf(dset,outfname) + + + + diff --git a/ush/parsing_namelists_FV3.sh b/ush/parsing_namelists_FV3.sh index 83e0c10525..cea7281be5 100755 --- a/ush/parsing_namelists_FV3.sh +++ b/ush/parsing_namelists_FV3.sh @@ -383,6 +383,14 @@ cat >> input.nml <> input.nml <> input.nml << EOF @@ -596,14 +604,14 @@ EOF skeb_tau = ${SKEB_TAU:-"-999."} skeb_lscale = ${SKEB_LSCALE:-"-999."} skebnorm = ${SKEBNORM:-"1"} - skeb_npass = ${SKEB_nPASS:-"30"} + skeb_npass = ${SKEB_NPASS:-"30"} skeb_vdof = ${SKEB_VDOF:-"5"} EOF fi if [[ ${DO_SHUM} = "YES" ]]; then cat >> input.nml << EOF - shum = ${SHUM} + shum = ${SHUM:-"0.005"} iseed_shum = ${ISEED_SHUM:-${ISEED}} shum_tau = ${SHUM_TAU:-"-999."} shum_lscale = ${SHUM_LSCALE:-"-999."} @@ -619,7 +627,29 @@ EOF sppt_logit = ${SPPT_LOGIT:-".true."} sppt_sfclimit = ${SPPT_SFCLIMIT:-".true."} use_zmtnblck = ${use_zmtnblck:-".true."} + pbl_taper = ${pbl_taper:-"0,0,0,0.125,0.25,0.5,0.75"} +EOF + + fi + + if [[ "${DO_OCN_SPPT}" == "YES" ]]; then + cat >> input.nml <> input.nml <> input.nml << EOF diff --git a/ush/parsing_namelists_MOM6.sh b/ush/parsing_namelists_MOM6.sh index f3ca0a630a..8d8df06f20 100755 --- a/ush/parsing_namelists_MOM6.sh +++ b/ush/parsing_namelists_MOM6.sh @@ -24,25 +24,6 @@ EOF #&nam_stochy # new_lscale=.true. #EOF - -if [[ "${DO_OCN_SPPT}" == "YES" ]]; then - cat >> input.nml <> input.nml <> input.nml < Date: Wed, 14 Feb 2024 21:29:18 +0000 Subject: [PATCH 4/7] changes for using g-w modules with python --- modulefiles/module_base.hera.lua | 1 + ush/forecast_postdet.sh | 11 ++-------- ush/gefs_fireclimo_blend.py | 36 +++++++++++++++++++++++++------- 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/modulefiles/module_base.hera.lua b/modulefiles/module_base.hera.lua index 311fb0a1cf..31df384298 100644 --- a/modulefiles/module_base.hera.lua +++ b/modulefiles/module_base.hera.lua @@ -33,6 +33,7 @@ load(pathJoin("wgrib2", (os.getenv("wgrib2_ver") or "None"))) load(pathJoin("py-netcdf4", (os.getenv("py_netcdf4_ver") or "None"))) load(pathJoin("py-pyyaml", (os.getenv("py_pyyaml_ver") or "None"))) load(pathJoin("py-jinja2", (os.getenv("py_jinja2_ver") or "None"))) +load(pathJoin("py-xarray", (os.getenv("py_xarray_ver") or "None"))) -- MET/METplus are not available for use with spack-stack, yet --load(pathJoin("met", (os.getenv("met_ver") or "None"))) diff --git a/ush/forecast_postdet.sh b/ush/forecast_postdet.sh index 7b70e7c72b..31887ca53e 100755 --- a/ush/forecast_postdet.sh +++ b/ush/forecast_postdet.sh @@ -435,7 +435,7 @@ EOF if [[ ${SET_STP_SEED:-"YES"} = "YES" ]]; then ISEED_SPPT=$((CDATE*10000 + ${MEMBER#0}*100 + 3)),$((CDATE*10000 + ${MEMBER#0}*100 + 4)),$((CDATE*10000 + ${MEMBER#0}*100 + 5)),$((CDATE*10000 + ${MEMBER#0}*100 + 6)),$((CDATE*10000 + ${MEMBER#0}*100 + 7)) ISEED_CA=$(( (CDATE*10000 + ${MEMBER#0}*100 + 18) % 2147483647 )) - ISEED_SKEB=0 + ISEED_SKEB=$((current_cycle*1000 + MEMBER*10 +1)) ISEED_SHUM=$((current_cycle*1000 + MEMBER*10 + 2)) ISEED_LNDP=$(( (current_cycle*1000 + MEMBER*10 + 5) % 2147483647 )) else @@ -1054,15 +1054,8 @@ GOCART_postdet() { local fire_in="/scratch1/RDARCH/rda-arl-gpu/Barry.Baker/emissions/nexus/QFED/${vdate:0:4}/${vdate:4:2}/qfed2.emis_*.${PDY}.nc4" fire_out="${COM_TOP}/mem000/model_data/chem/input/QFED_Blended_${PDY}_${fhmax_day}.nc" if [[ ! -f ${fire_out} ]]; then - set +x - module purge - source ~Neil.Barton/.profile - set -x mkdir -p $(dirname ${fire_out}) - ${HOMEgfs}/ush/gefs_fireclimo_blend.py -s ${PDY} -n ${fhmax_day} -c ${EMISSION_DIR} -f ${fire_in} -o ${fire_out} -r 0.95 - source ${HOMEgfs}/ush/load_fv3gfs_modules.sh - - + ${HOMEgfs}/ush/gefs_fireclimo_blend.py -s ${PDY} -n ${fhmax_day} -c ${EMISSION_DIR} -f ${fire_in} -o ${fire_out} -r 0.95 fi fi diff --git a/ush/gefs_fireclimo_blend.py b/ush/gefs_fireclimo_blend.py index 20ec00347c..7944e5675e 100755 --- a/ush/gefs_fireclimo_blend.py +++ b/ush/gefs_fireclimo_blend.py @@ -10,9 +10,9 @@ def open_qfed(fname): vrs = ['BC','CH4','CO','CO2','NH3','NOx','OC','PM2.5','SO2'] qfed_vars = ['bc','ch4','co','co2','nh3','no','oc','pm25','so2'] das = [] - # print(fname) - + print('') + print('Opening QFED Files...') if len(fname) > 1: files = sort(fname) else: @@ -21,19 +21,38 @@ def open_qfed(fname): for v in files: good = [ i for i in qfed_vars if i in v] if good: - print('opening:',v,good) + print(' opening:',v,good) dset = xr.open_dataset(v,decode_cf=False) var_index = vrs[qfed_vars.index(good[0])] # variable index da = dset['biomass'] das.append(da) -# print(len(das)) dset_dict = {} for index,v in enumerate(vrs): - # print(index,v) dset_dict[v] = das[index] dset = xr.Dataset(dset_dict) return dset +def open_climatology(fname): + from glob import glob + from numpy import sort + + # array to house datasets + das = [] + print('') + print('Opening Climatology Files...') + + if len(fname) > 1: + files = sort(fname) + else: + files = sort(glob(fname)) + #print(files) + xr.open_dataset(files[0]) + for i,f in enumerate(files): + print(' opening:',f) + das.append(xr.open_dataset(f, engine='netcdf4')) + + return xr.concat(das, dim='time') + def write_ncf(dset, outfile): """ @@ -84,7 +103,7 @@ def create_climatology(emissions, climatology, lat_coarse=50, lon_coarse=50): ratio = (emissions.squeeze().data / clim_coarse.where(clim_coarse > 0)).fillna(0) # Interpolate the ratio to match the coordinates of the climatology - ratio_interp = ratio.interp(lat=clim.lat, lon=clim.lon, method='nearest') + ratio_interp = ratio.sel(lat=clim.lat, lon=clim.lon, method='nearest') # Loop through each time slice and scale the climatology for index, time_slice in enumerate(clim.time): @@ -146,8 +165,9 @@ def make_fire_emission(d=None, climos=None, ratio=0.9, scale_climo=True, n_forec files = [t.strftime('{}/GBBEPx-all01GRID_v4r0_climMean_%m%d.nc'.format(climo_directory)) for t in dates] # open climo file - climo = xr.open_mfdataset(files) - climo = climo.interp(lat=g['lat'],lon=g['lon']) + #climo = xr.open_mfdataset(files) + climo = open_climatology(files) + climo = climo.sel(lat=g['lat'],lon=g['lon'],method='nearest') # make weighted climo gc = g.coarsen(lat=150,lon=150,boundary='trim').sum() From ccc244662a4adc85b444127024fedaaa7be8eb1e Mon Sep 17 00:00:00 2001 From: NeilBarton-NOAA Date: Wed, 14 Feb 2024 21:57:15 +0000 Subject: [PATCH 5/7] adding version of xarray --- versions/run.spack.ver | 1 + 1 file changed, 1 insertion(+) diff --git a/versions/run.spack.ver b/versions/run.spack.ver index c1c13f58df..0812d3389e 100644 --- a/versions/run.spack.ver +++ b/versions/run.spack.ver @@ -21,6 +21,7 @@ export prod_util_ver=1.2.2 export py_netcdf4_ver=1.5.8 export py_pyyaml_ver=5.4.1 export py_jinja2_ver=3.1.2 +export py_xarray_ver=2022.3.0 export obsproc_run_ver=1.1.2 export prepobs_run_ver=1.0.1 From f20fc3ea18dace5fd96b8f9ed2f8f0a0c117d3b9 Mon Sep 17 00:00:00 2001 From: NeilBarton-NOAA Date: Thu, 15 Feb 2024 15:54:41 +0000 Subject: [PATCH 6/7] using AERO_INPUTS_DIR variable to run on wcoss2 --- ush/forecast_postdet.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ush/forecast_postdet.sh b/ush/forecast_postdet.sh index 31887ca53e..f83632a20e 100755 --- a/ush/forecast_postdet.sh +++ b/ush/forecast_postdet.sh @@ -1049,9 +1049,9 @@ GOCART_postdet() { # Blended Wildire Emissions BLENDED_WILDFIRE_EMISSIONS=${BLENDED_WILDFIRE_EMISSIONS:-F} if [[ ${BLENDED_WILDFIRE_EMISSIONS} == T ]]; then - local EMISSION_DIR=/scratch1/RDARCH/rda-arl-gpu/Barry.Baker/emissions/nexus/GBBEPx/v4/climMean + local EMISSION_DIR=${AERO_INPUTS_DIR}/nexus/GBBEPx/v4/climMean local fhmax_day=$(( ${FHMAX_GFS} / 24 )) - local fire_in="/scratch1/RDARCH/rda-arl-gpu/Barry.Baker/emissions/nexus/QFED/${vdate:0:4}/${vdate:4:2}/qfed2.emis_*.${PDY}.nc4" + local fire_in="${AERO_INPUTES_DIR}/nexus/QFED/${vdate:0:4}/${vdate:4:2}/qfed2.emis_*.${PDY}.nc4" fire_out="${COM_TOP}/mem000/model_data/chem/input/QFED_Blended_${PDY}_${fhmax_day}.nc" if [[ ! -f ${fire_out} ]]; then mkdir -p $(dirname ${fire_out}) From 462368423fd077f0a91adfafd881c96813f43f09 Mon Sep 17 00:00:00 2001 From: NeilBarton-NOAA Date: Thu, 15 Feb 2024 20:46:57 +0000 Subject: [PATCH 7/7] adding for running on wcoss2 --- parm/config/gefs/config.fcst | 2 ++ ush/forecast_postdet.sh | 2 +- ush/load_ufswm_modules.sh | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/parm/config/gefs/config.fcst b/parm/config/gefs/config.fcst index a3038575f0..8cbc8b71f1 100644 --- a/parm/config/gefs/config.fcst +++ b/parm/config/gefs/config.fcst @@ -21,6 +21,8 @@ string="--fv3 ${CASE}" # shellcheck disable=SC2086 source "${EXPDIR}/config.ufs" ${string} +# Turn on the use of wildfire emissions bleneded to climatology +export BLENDED_WILDFIRE_EMISSIONS=T # Get task specific resources source "${EXPDIR}/config.resources" fcst diff --git a/ush/forecast_postdet.sh b/ush/forecast_postdet.sh index f83632a20e..86b71a3c61 100755 --- a/ush/forecast_postdet.sh +++ b/ush/forecast_postdet.sh @@ -1051,7 +1051,7 @@ GOCART_postdet() { if [[ ${BLENDED_WILDFIRE_EMISSIONS} == T ]]; then local EMISSION_DIR=${AERO_INPUTS_DIR}/nexus/GBBEPx/v4/climMean local fhmax_day=$(( ${FHMAX_GFS} / 24 )) - local fire_in="${AERO_INPUTES_DIR}/nexus/QFED/${vdate:0:4}/${vdate:4:2}/qfed2.emis_*.${PDY}.nc4" + local fire_in="${AERO_INPUTS_DIR}/nexus/QFED/${vdate:0:4}/${vdate:4:2}/qfed2.emis_*.${PDY}.nc4" fire_out="${COM_TOP}/mem000/model_data/chem/input/QFED_Blended_${PDY}_${fhmax_day}.nc" if [[ ! -f ${fire_out} ]]; then mkdir -p $(dirname ${fire_out}) diff --git a/ush/load_ufswm_modules.sh b/ush/load_ufswm_modules.sh index 6477a8ff39..969b4c60ed 100755 --- a/ush/load_ufswm_modules.sh +++ b/ush/load_ufswm_modules.sh @@ -21,6 +21,7 @@ if [[ "${MACHINE_ID}" != "noaacloud" ]]; then module load libjpeg module load craype-network-ucx module load cray-mpich-ucx + module load python/3.8.6 else export UTILROOT=${prod_util_ROOT} fi