diff --git a/dev/job_cards/rocoto/prep.sh b/dev/job_cards/rocoto/prep.sh index 578b5bbf0f6..3c4efa7977a 100755 --- a/dev/job_cards/rocoto/prep.sh +++ b/dev/job_cards/rocoto/prep.sh @@ -150,6 +150,19 @@ export COMINgfs=${COMIN_ATMOS_HISTORY_GFS} export COMSP=${COMSP:-"${COMIN_OBS}/${RUN_local}.t${cyc}z."} +if [[ ${DOENKFONLY_ATM:-"NO"} == "YES" ]]; then + MEMDIR="ensstat" RUN="enkf${GDUMP}" YMD=${gPDY} HH=${gcyc} declare_from_tmpl -rx COMIN_ATMOS_HISTORY_ENS_STAT_PREV:COM_ATMOS_HISTORY_TMPL + MEMDIR="mem001" RUN="enkf${GDUMP}" YMD=${gPDY} HH=${gcyc} declare_from_tmpl -rx COMIN_ATMOS_HISTORY_ENS_MEM001_PREV:COM_ATMOS_HISTORY_TMPL + RUN="gdas" YMD=${gPDY} HH=${gcyc} declare_from_tmpl -rx COMOUT_ATMOS_HISTORY_DET_PREV:COM_ATMOS_HISTORY_TMPL + mkdir -p "${COMOUT_ATMOS_HISTORY_DET_PREV}" + ln -sf "${COMIN_ATMOS_HISTORY_ENS_MEM001_PREV}/enkfgdas.t${gcyc}z.log.f003.txt" "${COMOUT_ATMOS_HISTORY_DET_PREV}/gdas.t${gcyc}z.log.f003.txt" + ln -sf "${COMIN_ATMOS_HISTORY_ENS_MEM001_PREV}/enkfgdas.t${gcyc}z.log.f006.txt" "${COMOUT_ATMOS_HISTORY_DET_PREV}/gdas.t${gcyc}z.log.f006.txt" + ln -sf "${COMIN_ATMOS_HISTORY_ENS_MEM001_PREV}/enkfgdas.t${gcyc}z.log.f009.txt" "${COMOUT_ATMOS_HISTORY_DET_PREV}/gdas.t${gcyc}z.log.f009.txt" + ln -sf "${COMIN_ATMOS_HISTORY_ENS_STAT_PREV}/enkfgdas.t${gcyc}z.ensmean.atm.f003.nc" "${COMOUT_ATMOS_HISTORY_DET_PREV}/gdas.t${gcyc}z.atm.f003.nc" + ln -sf "${COMIN_ATMOS_HISTORY_ENS_STAT_PREV}/enkfgdas.t${gcyc}z.ensmean.atm.f006.nc" "${COMOUT_ATMOS_HISTORY_DET_PREV}/gdas.t${gcyc}z.atm.f006.nc" + ln -sf "${COMIN_ATMOS_HISTORY_ENS_STAT_PREV}/enkfgdas.t${gcyc}z.ensmean.atm.f009.nc" "${COMOUT_ATMOS_HISTORY_DET_PREV}/gdas.t${gcyc}z.atm.f009.nc" +fi + # Create or Copy prepbufr, prepbufr.acft_profiles, nsstbufr files # Do not fail on external errors if [[ ${MAKE_PREPBUFR:-"YES"} == "YES" ]]; then diff --git a/dev/job_cards/rocoto/prepatmanlbias.sh b/dev/job_cards/rocoto/prepatmanlbias.sh new file mode 100755 index 00000000000..2d576aa68ba --- /dev/null +++ b/dev/job_cards/rocoto/prepatmanlbias.sh @@ -0,0 +1,18 @@ +#! /usr/bin/env bash + +############################################################### +# Source UFSDA workflow modules +source "${HOMEgfs}/dev/ush/load_modules.sh" ufsda +status=$? +if [[ ${status} -ne 0 ]]; then + exit "${status}" +fi + +export job="prepatmanlbias" +export jobid="${job}.$$" + +############################################################### +# Execute the JJOB +"${HOMEgfs}/dev/jobs/JGLOBAL_ATM_PREP_ANL_BIAS" +status=$? +exit "${status}" diff --git a/dev/jobs/JGLOBAL_ATMENS_ANALYSIS_INITIALIZE b/dev/jobs/JGLOBAL_ATMENS_ANALYSIS_INITIALIZE index 35e2b21611c..42fce2ee9f4 100755 --- a/dev/jobs/JGLOBAL_ATMENS_ANALYSIS_INITIALIZE +++ b/dev/jobs/JGLOBAL_ATMENS_ANALYSIS_INITIALIZE @@ -19,8 +19,13 @@ GDUMP="gdas" RUN=${GDUMP} YMD=${PDY} HH=${cyc} declare_from_tmpl -rx \ COMIN_OBS:COM_OBS_TMPL -RUN=${GDUMP} YMD=${gPDY} HH=${gcyc} declare_from_tmpl -rx \ - COMIN_ATMOS_ANALYSIS_PREV:COM_ATMOS_ANALYSIS_TMPL +if [[ ${DOENKFONLY_ATM:-"NO"} == "YES" ]]; then + MEMDIR='ensstat' RUN="enkf${GDUMP}" YMD=${gPDY} HH=${gcyc} declare_from_tmpl -rx \ + COMIN_ATMOS_ANALYSIS_PREV:COM_ATMOS_ANALYSIS_TMPL +else + RUN=${GDUMP} YMD=${gPDY} HH=${gcyc} declare_from_tmpl -rx \ + COMIN_ATMOS_ANALYSIS_PREV:COM_ATMOS_ANALYSIS_TMPL +fi ############################################################### # Run relevant script diff --git a/dev/jobs/JGLOBAL_ATM_PREP_ANL_BIAS b/dev/jobs/JGLOBAL_ATM_PREP_ANL_BIAS new file mode 100755 index 00000000000..118cd134190 --- /dev/null +++ b/dev/jobs/JGLOBAL_ATM_PREP_ANL_BIAS @@ -0,0 +1,129 @@ +#! /usr/bin/env bash +export WIPE_DATA="NO" +export DATA=${DATA:-${DATAROOT}/${RUN}fetch_${cyc}} +source "${HOMEgfs}/ush/jjob_header.sh" -e "prepatmanlbias" -c "base prepatmanlbias" + +############################################## +# Set variables used in the script +############################################## + +############################################## +# Begin JOB SPECIFIC work +############################################## +# Ignore possible spelling error (nothing is misspelled) +# shellcheck disable=SC2153 +GDATE=$(date --utc +%Y%m%d%H -d "${PDY} ${cyc} - ${assim_freq} hours") +export gPDY=${GDATE:0:8} +export gcyc=${GDATE:8:2} +export gyy=${GDATE:0:4} +export gmm=${GDATE:4:2} +export gdd=${GDATE:6:2} +export GDUMP="gdas" + +# Generate COM variables from templates +MEMDIR="ensstat" RUN="enkf${GDUMP}" YMD=${gPDY} HH=${gcyc} declare_from_tmpl -rx \ + COMOUT_ATMOS_ANALYSIS_PREV:COM_ATMOS_ANALYSIS_TMPL + +# Process bias corrections files grabbed from HPSS in task gdas_fetchatmanlbias +BIASDIR=${DATA}/${GDUMP}.${gPDY}/${gcyc}/atmos +BIASFILES="${GDUMP}.t${gcyc}z.abias ${GDUMP}.t${gcyc}z.abias_air ${GDUMP}.t${gcyc}z.abias_int ${GDUMP}.t${gcyc}z.abias_pc ${GDUMP}.t${gcyc}z.radstat" + +ABIAS_SAT=${BIASDIR}/${GDUMP}.t${gcyc}z.abias +ABIASPC_SAT=${BIASDIR}/${GDUMP}.t${gcyc}z.abias_pc +ABIAS_SAT_JEDI_TAR=${COMOUT_ATMOS_ANALYSIS_PREV}/${GDUMP}.t${gcyc}z.rad_varbc_params.tar +ABIAS_AIR_JEDI_TAR=${COMOUT_ATMOS_ANALYSIS_PREV}/${GDUMP}.t${gcyc}z.air_varbc_params.tar + +SATBIAS2IODAX=${SATBIAS2IODAX:-${EXECgfs}/satbias2ioda.x} +SATBIAS2IODAY=${HOMEgfs}/sorc/gdas.cd/ush/satbias_converter.yaml.tmpl +OUTPUT=${DATA}/output + +if [[ ! -d "${COMOUT_ATMOS_ANALYSIS_PREV}" ]]; then mkdir -p "${COMOUT_ATMOS_ANALYSIS_PREV}"; fi +if [[ ! -d "${OUTPUT}" ]]; then mkdir -p "${OUTPUT}"; fi + +if [[ ${DO_JEDIATMENS} == "YES" ]]; then + # JEDI run + cd "${DATA}" || exit + if [[ ! -d "testrun/varbc" ]]; then mkdir -p "testrun/varbc"; fi + /bin/ln -sf "${ABIAS_SAT}" "./satbias_in" + /bin/ln -sf "${ABIASPC_SAT}" "./satbias_pc" + grep -i "NaN" satbias_in && echo "Stop. There are NaN in ${ABIAS}." && exit 1 + + # Get instruments from satbias_in + obsclass=$(grep "_" satbias_in | awk '{print $2}' | uniq) + + # Loop over instruments. Covert GSI abias to JEDI format + for instrument in ${obsclass}; do + echo "${instrument}" + /bin/cp -f "${SATBIAS2IODAY}" satbias_converter.yaml + sed -i -e "s/INSTRUMENT/${instrument}/g" satbias_converter.yaml + + ${SATBIAS2IODAX} satbias_converter.yaml + + export err=$? + if [[ ${err} -ne 0 ]]; then + err_exit "satbias2iodas.x failed for ${instrument}, ABORT!" + fi + + /bin/rm -f testrun/varbc/*nc + /bin/rm -f testrun/varbc/*txt + + cd ./testrun/varbc/ + grep "${instrument}" ../../satbias_in | awk '{print $2" "$3" "$4}' > \ + "${OUTPUT}"/gdas.t"${gcyc}"z."${instrument}".tlapse.txt + /bin/cp -p satbias_"${instrument}".nc4 "${OUTPUT}"/gdas.t"${gcyc}"z."${instrument}".satbias.nc + /bin/mv satbias_"${instrument}".nc4 "${OUTPUT}"/gdas.t"${gcyc}"z."${instrument}".satbias_cov.nc + cd "${DATA}" + /bin/rm -rf satbias_converter.yaml + done + + if [[ ${err} -eq 0 ]]; then + cd "${OUTPUT}" || exit + for file in ${BIASFILES}; do + cpreq "${BIASDIR}/${file}" "./enkf${file}.txt" + err=$? + if [[ ${err} -ne 0 ]]; then + err_exit "Error copying operational anl bias correction files" + fi + done + # TODO: Temporary solution and need to process abias_air for JEDI when ready + tar -cvf "${ABIAS_AIR_JEDI_TAR}" "./enkf${GDUMP}.t${gcyc}z.abias_air.txt" + rm -rf "./enkf${GDUMP}.t${gcyc}z.abias_air.txt" + tar -cvf "${ABIAS_SAT_JEDI_TAR}" ./*.nc ./*.txt + err=$? + fi + +else + # GSI run + for file in ${BIASFILES}; do + cpreq "${BIASDIR}/${file}" "${COMOUT_ATMOS_ANALYSIS_PREV}/enkf${file}.txt" + err=$? + if [[ ${err} -ne 0 ]]; then + err_exit "Error copying operational anl bias correction files" + fi + done +fi + +if [[ ${err} -ne 0 ]]; then + err_exit "Error executing ${EXSCRIPT}" +fi +set_trace + +############################################## +# End JOB SPECIFIC work +############################################## + +############################################## +# Final processing +############################################## +if [[ -e "${pgmout}" ]]; then + cat "${pgmout}" +fi + +################################### +# Remove temp directories +################################### +if [[ "${KEEPDATA}" != "YES" ]]; then + rm -rf "${DATA}" +fi + +exit 0 diff --git a/dev/jobs/JGLOBAL_ENKF_SELECT_OBS b/dev/jobs/JGLOBAL_ENKF_SELECT_OBS index af264f7d9c6..db4b842cf98 100755 --- a/dev/jobs/JGLOBAL_ENKF_SELECT_OBS +++ b/dev/jobs/JGLOBAL_ENKF_SELECT_OBS @@ -65,17 +65,31 @@ if [[ ${DONST} == "YES" ]]; then fi export PREPQCPF="${COMIN_OBS}/${OPREFIX}prepbufr.acft_profiles" -# Deterministic analysis and increment files -export SFCANL="${COMOUT_ATMOS_ANALYSIS_DET}/${APREFIX_DET}analysis.sfc.a006.nc" -export DTFANL="${COMOUT_ATMOS_ANALYSIS_DET}/${APREFIX_DET}increment.dtf.i006.nc" -export ATMANL="${COMOUT_ATMOS_ANALYSIS_DET}/${APREFIX_DET}analysis.atm.a006.nc" -export ATMINC="${COMOUT_ATMOS_ANALYSIS_DET}/${APREFIX_DET}increment.atm.i006.nc" - -# Guess Bias correction coefficients related to control -export GBIAS=${COMIN_ATMOS_ANALYSIS_DET_PREV}/${GPREFIX_DET}abias.txt -export GBIASPC=${COMIN_ATMOS_ANALYSIS_DET_PREV}/${GPREFIX_DET}abias_pc.txt -export GBIASAIR=${COMIN_ATMOS_ANALYSIS_DET_PREV}/${GPREFIX_DET}abias_air.txt -export GRADSTAT=${COMIN_ATMOS_ANALYSIS_DET_PREV}/${GPREFIX_DET}radstat.tar +if [[ ${DOENKFONLY_ATM:-"NO"} == "YES" ]]; then + # Ensemble analysis and increment files + export SFCANL="${COMOUT_ATMOS_ANALYSIS}/${APREFIX}analysis.sfc.a006.nc" + export DTFANL="${COMOUT_ATMOS_ANALYSIS}/${APREFIX}increment.dtf.i006.nc" + export ATMANL="${COMOUT_ATMOS_ANALYSIS}/${APREFIX}analysis.atm.a006.nc" + export ATMINC="${COMOUT_ATMOS_ANALYSIS}/${APREFIX}increment.atm.i006.nc" + + # Guess Bias correction coefficients related to ensemble + export GBIAS="${COMIN_ATMOS_ANALYSIS_PREV}/${GPREFIX}abias.txt" + export GBIASPC="${COMIN_ATMOS_ANALYSIS_PREV}/${GPREFIX}abias_pc.txt" + export GBIASAIR="${COMIN_ATMOS_ANALYSIS_PREV}/${GPREFIX}abias_air.txt" + export GRADSTAT="${COMIN_ATMOS_ANALYSIS_PREV}/${GPREFIX}radstat.tar" +else + # Deterministic analysis and increment files + export SFCANL="${COMOUT_ATMOS_ANALYSIS_DET}/${APREFIX_DET}analysis.sfc.a006.nc" + export DTFANL="${COMOUT_ATMOS_ANALYSIS_DET}/${APREFIX_DET}increment.dtf.i006.nc" + export ATMANL="${COMOUT_ATMOS_ANALYSIS_DET}/${APREFIX_DET}analysis.atm.a006.nc" + export ATMINC="${COMOUT_ATMOS_ANALYSIS_DET}/${APREFIX_DET}increment.atm.i006.nc" + + # Guess Bias correction coefficients related to control + export GBIAS="${COMIN_ATMOS_ANALYSIS_DET_PREV}/${GPREFIX_DET}abias.txt" + export GBIASPC="${COMIN_ATMOS_ANALYSIS_DET_PREV}/${GPREFIX_DET}abias_pc.txt" + export GBIASAIR="${COMIN_ATMOS_ANALYSIS_DET_PREV}/${GPREFIX_DET}abias_air.txt" + export GRADSTAT="${COMIN_ATMOS_ANALYSIS_DET_PREV}/${GPREFIX_DET}radstat.tar" +fi # Bias correction coefficients related to ensemble mean export ABIAS="${COMOUT_ATMOS_ANALYSIS}/${APREFIX}abias.txt" diff --git a/dev/jobs/JGLOBAL_FETCH b/dev/jobs/JGLOBAL_FETCH index 3648bd269da..693ddbd4a55 100755 --- a/dev/jobs/JGLOBAL_FETCH +++ b/dev/jobs/JGLOBAL_FETCH @@ -1,5 +1,5 @@ #! /usr/bin/env bash - +export DATA=${DATA:-${DATAROOT}/${RUN}fetch_${cyc}} source "${HOMEgfs}/ush/jjob_header.sh" -e "fetch" -c "base fetch" # Execute fetching diff --git a/dev/parm/config/gfs/config.atmensanl.j2 b/dev/parm/config/gfs/config.atmensanl.j2 index adb1108267f..4582f780fb5 100644 --- a/dev/parm/config/gfs/config.atmensanl.j2 +++ b/dev/parm/config/gfs/config.atmensanl.j2 @@ -16,5 +16,6 @@ export io_layout_x="{{ IO_LAYOUT_X }}" export io_layout_y="{{ IO_LAYOUT_Y }}" export TASK_CONFIG_YAML="${PARMgfs}/gdas/atm/atm_ens_config.yaml.j2" +export OBS_DIST_LOCALIZATIONS_YAML="${PARMgfs}/gdas/atm/atm_ens_obs_dist_localizations.yaml.j2" echo "END: config.atmensanl" diff --git a/dev/parm/config/gfs/config.base.j2 b/dev/parm/config/gfs/config.base.j2 index a624674aceb..757823925d1 100644 --- a/dev/parm/config/gfs/config.base.j2 +++ b/dev/parm/config/gfs/config.base.j2 @@ -398,6 +398,7 @@ export BUILD_GSINFO_DIR="${PARMgfs}/gsinfo" export NMEM_ENS_GFS="{{ NMEM_ENS_GFS }}" export NMEM_ENS_GFS_OFFSET="{{ NMEM_ENS_GFS_OFFSET }}" export DO_CALC_INCREMENT_ENKF_GFS="NO" +export DOENKFONLY_ATM="{{ DOENKFONLY_ATM }}" # EnKF output frequency if [[ "${DOHYBVAR}" = "YES" ]]; then @@ -521,6 +522,17 @@ if [[ "${machine}" == "URSA" || "${machine}" == "GAEAC6" || "${machine}" == "ORI export DO_METP=NO fi +if [[ "${DOENKFONLY_ATM:-NO}" == "YES" ]] ; then + export RECENTER_ENKF="NO" # Turn off recentering ensemble analysis + export DO_VERFOZN="NO" # Ozone data assimilation monitoring + export DO_VERFRAD="NO" # Radiance data assimilation monitoring + export DO_VMINMON="NO" # GSI minimization monitoring + export DO_METP="NO" # Run METPLUS jobs - set METPLUS settings in config.metp + export DO_FIT2OBS="NO" # Run fit to observations package + export DO_TRACKER="NO" # Hurricane track verification + export DO_GENESIS="NO" # Cyclone genesis verification +fi + # If starting ICs that are not at cycle hour export OFFSET_START_HOUR=0 diff --git a/dev/parm/config/gfs/config.esfc b/dev/parm/config/gfs/config.esfc index 0c35240dc31..0d12aace2af 100644 --- a/dev/parm/config/gfs/config.esfc +++ b/dev/parm/config/gfs/config.esfc @@ -26,6 +26,11 @@ if [[ "${DO_JEDIATMENS}" == "YES" || "${DO_JEDIATMVAR}" == "YES" ]]; then export DONST="NO" fi +# Turn off NST if DOENKFONLY_ATM is YES +if [[ "${DOENKFONLY_ATM:-NO}" == "YES" ]] ; then + export DONST="NO" +fi + if [[ "${RUN/enkf}" == "gfs" ]]; then echo "turning off gsi soilda for gfs run" DO_GSISOILDA="NO" diff --git a/dev/parm/config/gfs/config.fetch b/dev/parm/config/gfs/config.fetch index 86ab5e3e2f8..882db90d290 100644 --- a/dev/parm/config/gfs/config.fetch +++ b/dev/parm/config/gfs/config.fetch @@ -7,13 +7,31 @@ echo "BEGIN: config.fetch" # Get task specific resources source "${EXPDIR}/config.resources" fetch -# Determine start type -if [[ "${EXP_WARM_START}" == ".false." ]]; then - ic_type="cold" +if [[ "${PDY}${cyc}" -gt "${SDATE}" ]]; then + # fetch based on the second and following cycle + if [[ ${DOENKFONLY_ATM} == "YES" ]]; then + # determine GDAS version based on date + if [[ "${PDY}${cyc}" -ge "2022112900" ]]; then + gdas_version="v16.3" + elif [[ "${PDY}${cyc}" -ge "2022062700" ]]; then + gdas_version="v16.2" + else + gdas_version="prod" + fi + export gdas_version + export FETCH_YAML_TMPL="${PARMgfs}/fetch/${NET}_${APP}_gdas-anl-bias.yaml.j2" + export KEEPDATA="YES" + fi else - ic_type="warm" -fi + # fetch based on first cycle + # Determine start type + if [[ "${EXP_WARM_START}" == ".false." ]]; then + ic_type="cold" + else + ic_type="warm" + fi -export FETCH_YAML_TMPL="${PARMgfs}/fetch/${NET}_${APP}_${ic_type}_${MODE}.yaml.j2" + export FETCH_YAML_TMPL="${PARMgfs}/fetch/${NET}_${APP}_${ic_type}_${MODE}.yaml.j2" +fi echo "END: config.fetch" diff --git a/dev/parm/config/gfs/config.prep.j2 b/dev/parm/config/gfs/config.prep.j2 index a8b8f0c619a..450aed1a4df 100644 --- a/dev/parm/config/gfs/config.prep.j2 +++ b/dev/parm/config/gfs/config.prep.j2 @@ -15,6 +15,11 @@ export PROCESS_TROPCY=${PROCESS_TROPCY:-NO} export TROPCYQCRELOSH="${SCRgfs}/exglobal_atmos_tropcy_qc_reloc.sh" export COMINsyn=${COMINsyn:-$(compath.py "${envir}/com/gfs/${gfs_ver}")/syndat} +# If DOENKFONLY_ATM="YES", skip PROCESS_TROPCY +if [[ "${DOENKFONLY_ATM:-NO}" == "YES" ]] ; then + export PROCESS_TROPCY="NO" +fi + # Allow users to control the generation or use of either operational or # their processed prepbufr, prepbufr.acft_profiles, nsstbufr files export MAKE_PREPBUFR="YES" # Generate prepbufr, etc. files by executing obsproc diff --git a/dev/parm/config/gfs/config.prepatmanlbias b/dev/parm/config/gfs/config.prepatmanlbias new file mode 100644 index 00000000000..89bfd1a247a --- /dev/null +++ b/dev/parm/config/gfs/config.prepatmanlbias @@ -0,0 +1,11 @@ +#! /usr/bin/env bash + +########## config.prepatmiodaobs ########## +# Atm Operational Anl Bias Correction specific + +echo "BEGIN: config.prepatmanlbias" + +# Get task specific resources +. "${EXPDIR}/config.resources" prepatmanlbias + +echo "END: config.prepatmanlbias" diff --git a/dev/parm/config/gfs/config.resources b/dev/parm/config/gfs/config.resources index 9229d742f9c..04a111d08e5 100644 --- a/dev/parm/config/gfs/config.resources +++ b/dev/parm/config/gfs/config.resources @@ -12,7 +12,7 @@ if (( $# != 1 )); then echo "Must specify an input task argument to set resource variables!" echo "argument can be any one of the following:" echo "stage_ic aerosol_init fetch" - echo "prep prep_sfc" + echo "prep prep_sfc prepatmanlbias" echo "atmanlinit atmanlvar atmanlfv3inc atmanlfinal" echo "atmensanlinit atmensanlobs atmensanlsol atmensanlletkf atmensanlfv3inc atmensanlfinal ecen_fv3jedi analcalc_fv3jedi" echo "snowanl esnowanl" @@ -115,6 +115,13 @@ case ${step} in memory="${mem_node_max}" ;; + "prepatmanlbias") + walltime="00:30:00" + ntasks=1 + threads_per_task=1 + tasks_per_node=1 + ;; + "aerosol_init") walltime="00:05:00" ntasks=1 diff --git a/dev/parm/config/gfs/yaml/defaults.yaml b/dev/parm/config/gfs/yaml/defaults.yaml index 15ed548d145..b76dcb8ca93 100644 --- a/dev/parm/config/gfs/yaml/defaults.yaml +++ b/dev/parm/config/gfs/yaml/defaults.yaml @@ -24,6 +24,7 @@ base: FHMAX_ENKF_GFS: 12 DOHYBVAR_OCN: "NO" DOLETKF_OCN: "NO" + DOENKFONLY_ATM: "NO" DO_TEST_MODE: "NO" NMEM_ENS_GFS: 30 NMEM_ENS_GFS_OFFSET: 20 diff --git a/dev/scripts/exglobal_enkf_earc_tars.py b/dev/scripts/exglobal_enkf_earc_tars.py index 354d374a0c2..8c662192a2a 100755 --- a/dev/scripts/exglobal_enkf_earc_tars.py +++ b/dev/scripts/exglobal_enkf_earc_tars.py @@ -28,7 +28,8 @@ def main(): 'DOHYBVAR', 'DOIAU_ENKF', 'IAU_OFFSET', 'DOIAU', 'DO_CA', 'DO_CALC_INCREMENT', 'assim_freq', 'ARCH_CYC', 'DO_JEDISNOWDA', 'ARCH_WARMICFREQ', 'ARCH_FCSTICFREQ', 'DOHYBVAR_OCN', - 'DOLETKF_OCN', 'IAUFHRS_ENKF', 'NET', 'NMEM_ENS_GFS', 'DO_GSISOILDA', 'DO_LAND_IAU'] + 'DOLETKF_OCN', 'IAUFHRS_ENKF', 'NET', 'NMEM_ENS_GFS', 'DO_GSISOILDA', 'DO_LAND_IAU', + 'DOENKFONLY_ATM'] archive_dict = AttrDict() for key in keys: diff --git a/dev/workflow/applications/gfs_cycled.py b/dev/workflow/applications/gfs_cycled.py index 0d51aed74b4..45c77291030 100644 --- a/dev/workflow/applications/gfs_cycled.py +++ b/dev/workflow/applications/gfs_cycled.py @@ -73,6 +73,7 @@ def _get_run_options(self, conf: Configuration) -> Dict[str, Any]: run_options[run]['do_hybvar'] = base.get('DOHYBVAR', False) run_options[run]['do_hybvar_ocn'] = base.get('DOHYBVAR_OCN', False) + run_options[run]['do_enkfonly_atm'] = base.get('DOENKFONLY_ATM', False) run_options[run]['do_letkf_ocn'] = base.get('DOLETKF_OCN', False) run_options[run]['nens'] = base.get('NMEM_ENS', 0) if run_options[run]['do_hybvar']: @@ -106,6 +107,9 @@ def _get_app_configs(self, run): configs = ['prep'] + if options['do_enkfonly_atm']: + configs += ['fetch', 'prepatmanlbias'] + if options['do_prep_sfc']: configs += ['prep_sfc'] @@ -378,6 +382,12 @@ def get_task_names(self): task_names[run] += ['cleanup'] + # Reset tasks to run enkf-only for atm if do_enkfonly_atm=true + if options['do_enkfonly_atm']: + if run == 'gdas': + task_names[run] = [] + task_names[run] += ['prep', 'fetchatmanlbias', 'prepatmanlbias'] + # Ensemble tasks elif 'enkf' in run: @@ -416,4 +426,17 @@ def get_task_names(self): task_names[run] += ['cleanup'] + # Reset tasks to run enkf-only for atm if do_enkfonly_atm=true + if options['do_enkfonly_atm']: + task_names[run] = [] + task_names[run] += ['stage_ic'] + if options['do_jediatmens']: + task_names[run] += ['atmensanlinit', 'atmensanlfv3inc', 'atmensanlfinal'] + if options['lobsdiag_forenkf']: + task_names[run] += ['atmensanlobs', 'atmensanlsol'] + else: + task_names[run] += ['atmensanlletkf'] + else: + task_names[run] += ['eobs', 'eupd', 'ecen', 'ediag'] + task_names[run] += ['efcs', 'epos', 'esfc', 'earc_tars', 'cleanup'] return task_names diff --git a/dev/workflow/rocoto/gfs_tasks.py b/dev/workflow/rocoto/gfs_tasks.py index eaaf4cbb615..50f7c9acc56 100644 --- a/dev/workflow/rocoto/gfs_tasks.py +++ b/dev/workflow/rocoto/gfs_tasks.py @@ -36,6 +36,31 @@ def fetch(self): return task + def fetchatmanlbias(self): + deps = [] + dep_dict = {'type': 'metatask', 'name': 'enkfgdas_epmn', 'offset': f"-{timedelta_to_HMS(self._base['interval_gdas'])}"} + deps.append(rocoto.add_dependency(dep_dict)) + dependencies = rocoto.create_dependency(dep=deps) + + cycledef = self.run + + resources = self.get_resource('fetch') + task_name = f'{self.run}_fetchatmanlbias' + task_dict = {'task_name': task_name, + 'resources': resources, + 'dependency': dependencies, + 'envars': self.envars, + 'cycledef': cycledef, + 'command': f'{self.HOMEgfs}/dev/job_cards/rocoto/fetch.sh', + 'job_name': f'{self.pslot}_{task_name}_@H', + 'log': f'{self.rotdir}/logs/@Y@m@d@H/{task_name}.log', + 'maxtries': '&MAXTRIES;' + } + + task = rocoto.create_task(task_dict) + + return task + def stage_ic(self): dependencies = None @@ -109,11 +134,17 @@ def prep(self): deps = [] - dep_dict = {'type': 'metatask', 'name': 'gdas_atmos_prod', 'offset': f"-{timedelta_to_HMS(self._base['interval_gdas'])}"} - deps.append(rocoto.add_dependency(dep_dict)) - data = f'{atm_hist_path}/gdas.t@Hz.atm.f009.nc' - dep_dict = {'type': 'data', 'data': data, 'offset': f"-{timedelta_to_HMS(self._base['interval_gdas'])}"} - deps.append(rocoto.add_dependency(dep_dict)) + if self.options['do_enkfonly_atm']: + dep_dict = {'type': 'metatask', 'name': 'enkfgdas_epmn', 'offset': f"-{timedelta_to_HMS(self._base['interval_gdas'])}"} + deps.append(rocoto.add_dependency(dep_dict)) + else: + dep_dict = {'type': 'metatask', 'name': 'gdas_atmos_prod', 'offset': f"-{timedelta_to_HMS(self._base['interval_gdas'])}"} + deps.append(rocoto.add_dependency(dep_dict)) + dep_dict = {'type': 'metatask', 'name': 'gdas_fcst', 'offset': f"-{timedelta_to_HMS(self._base['interval_gdas'])}"} + deps.append(rocoto.add_dependency(dep_dict)) + data = f'{atm_hist_path}/gdas.t@Hz.atmf009.nc' + dep_dict = {'type': 'data', 'data': data, 'offset': f"-{timedelta_to_HMS(self._base['interval_gdas'])}"} + deps.append(rocoto.add_dependency(dep_dict)) data = f'{dump_path}/{self.run}.t@Hz.updated.status.tm00.bufr_d' dep_dict = {'type': 'data', 'data': data} if self.options['do_jediatmvar']: @@ -130,8 +161,6 @@ def prep(self): dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) deps.append(rocoto.add_dependency(dep_dict)) - dep_dict = {'type': 'metatask', 'name': 'gdas_fcst', 'offset': f"-{timedelta_to_HMS(self._base['interval_gdas'])}"} - deps.append(rocoto.add_dependency(dep_dict)) if self.options['do_prep_sfc']: dep_dict = {'type': 'task', 'name': f'{self.run}_prep_sfc'} deps.append(rocoto.add_dependency(dep_dict)) @@ -158,6 +187,30 @@ def prep(self): return task + def prepatmanlbias(self): + + deps = [] + dep_dict = {'type': 'task', 'name': f'{self.run}_fetchatmanlbias'} + deps.append(rocoto.add_dependency(dep_dict)) + dependencies = rocoto.create_dependency(dep=deps) + + resources = self.get_resource('prepatmanlbias') + task_name = f'{self.run}_prepatmanlbias' + task_dict = {'task_name': task_name, + 'resources': resources, + 'dependency': dependencies, + 'envars': self.envars, + 'cycledef': self.run.replace('enkf', ''), + 'command': f'{self.HOMEgfs}/dev/job_cards/rocoto/prepatmanlbias.sh', + 'job_name': f'{self.pslot}_{task_name}_@H', + 'log': f'{self.rotdir}/logs/@Y@m@d@H/{task_name}.log', + 'maxtries': '&MAXTRIES;' + } + + task = rocoto.create_task(task_dict) + + return task + def waveinit(self): resources = self.get_resource('waveinit') @@ -2431,9 +2484,9 @@ def cleanup(self): # All of the dependencies (half, full, and common) deps_all = [] if 'enkf' in self.run: - - dep_dict = {'type': 'task', 'name': f'{self.run}_earc_vrfy'} - deps_full.append(rocoto.add_dependency(dep_dict)) + if not self.options['do_enkfonly_atm']: + dep_dict = {'type': 'task', 'name': f'{self.run}_earc_vrfy'} + deps_full.append(rocoto.add_dependency(dep_dict)) if self.options['do_archcom']: if self.options['do_globusarch']: dep_dict = {'type': 'metatask', 'name': f'{self.run}_globus_earc'} @@ -2632,6 +2685,9 @@ def eobs(self): deps.append(rocoto.add_dependency(dep_dict)) dep_dict = {'type': 'metatask', 'name': 'enkfgdas_epmn', 'offset': f"-{timedelta_to_HMS(self._base['interval_gdas'])}"} deps.append(rocoto.add_dependency(dep_dict)) + if self.options['do_enkfonly_atm']: + dep_dict = {'type': 'task', 'name': f'{self.run.replace("enkf", "")}_prepatmanlbias'} + deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) resources = self.get_resource('eobs') @@ -2703,6 +2759,9 @@ def atmensanlinit(self): deps.append(rocoto.add_dependency(dep_dict)) dep_dict = {'type': 'metatask', 'name': 'enkfgdas_epmn', 'offset': f"-{timedelta_to_HMS(self._base['interval_gdas'])}"} deps.append(rocoto.add_dependency(dep_dict)) + if self.options['do_enkfonly_atm']: + dep_dict = {'type': 'task', 'name': f'{self.run.replace("enkf", "")}_prepatmanlbias'} + deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) cycledef = "gdas" @@ -2880,8 +2939,9 @@ def _get_ecengroups(): return grp, dep, lst deps = [] - dep_dict = {'type': 'task', 'name': f'{self.run.replace("enkf", "")}_analcalc'} - deps.append(rocoto.add_dependency(dep_dict)) + if not self.options['do_enkfonly_atm']: + dep_dict = {'type': 'task', 'name': f'{self.run.replace("enkf", "")}_analcalc'} + deps.append(rocoto.add_dependency(dep_dict)) dep_dict = {'type': 'task', 'name': f'{self.run}_eupd'} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) @@ -2981,8 +3041,9 @@ def esfc(self): dep_dict = {'type': 'task', 'name': f'{self.run}_atmensanlfinal'} deps.append(rocoto.add_dependency(dep_dict)) else: - dep_dict = {'type': 'task', 'name': f'{self.run.replace("enkf", "")}_analcalc'} - deps.append(rocoto.add_dependency(dep_dict)) + if not self.options['do_enkfonly_atm']: + dep_dict = {'type': 'task', 'name': f'{self.run.replace("enkf", "")}_analcalc'} + deps.append(rocoto.add_dependency(dep_dict)) dep_dict = {'type': 'task', 'name': f'{self.run}_eupd'} deps.append(rocoto.add_dependency(dep_dict)) if self.options['do_jedisnowda']: @@ -3011,8 +3072,9 @@ def efcs(self): deps = [] if self.options['do_jediatmens']: - dep_dict = {'type': 'task', 'name': f'{self.run}_ecen_fv3jedi'} - deps.append(rocoto.add_dependency(dep_dict)) + if not self.options['do_enkfonly_atm']: + dep_dict = {'type': 'task', 'name': f'{self.run}_ecen_fv3jedi'} + deps.append(rocoto.add_dependency(dep_dict)) else: dep_dict = {'type': 'metatask', 'name': f'{self.run}_ecmn'} deps.append(rocoto.add_dependency(dep_dict)) @@ -3194,8 +3256,9 @@ def earc_tars(self): dep_dict = {'type': 'metatask', 'name': f'{self.run}_epmn'} deps.append(rocoto.add_dependency(dep_dict)) if not self.options['do_jediatmens']: - dep_dict = {'type': 'task', 'name': f'{self.run}_echgres'} - deps.append(rocoto.add_dependency(dep_dict)) + if not self.options['do_enkfonly_atm']: + dep_dict = {'type': 'task', 'name': f'{self.run}_echgres'} + deps.append(rocoto.add_dependency(dep_dict)) if self._base.get('DOLETKF_OCN', True): dep_dict = {'type': 'task', 'name': f'{self.run}_marineanlletkf'} deps.append(rocoto.add_dependency(dep_dict)) diff --git a/dev/workflow/rocoto/tasks.py b/dev/workflow/rocoto/tasks.py index b5d48e994bb..78207483c16 100644 --- a/dev/workflow/rocoto/tasks.py +++ b/dev/workflow/rocoto/tasks.py @@ -17,7 +17,7 @@ class Tasks: 'prep_sfc', 'prep', 'anal', 'sfcanl', 'analcalc', 'analdiag', 'arch_vrfy', 'arch_tars', 'cleanup', 'ecen_fv3jedi', 'analcalc_fv3jedi', 'cleanup', 'atmanlinit', 'atmanlvar', 'atmanlfv3inc', 'atmanlfinal', - 'prep_emissions', 'prepoceanobs', + 'prep_emissions', 'prepoceanobs', 'prepatmanlbias', 'marineanlinit', 'marineanlletkf', 'marinebmatinit', 'marinebmat', 'marineanlvar', 'marineanlecen', 'marineanlchkpt', 'marineanlfinal', 'ocnanalvrfy', 'eobs', 'epos', 'esfc', 'eupd', diff --git a/parm/archive/enkf.yaml.j2 b/parm/archive/enkf.yaml.j2 index b5ced5e5898..19ccf69abb6 100644 --- a/parm/archive/enkf.yaml.j2 +++ b/parm/archive/enkf.yaml.j2 @@ -12,9 +12,11 @@ enkf: {% for grp in range(0, ngrps) %} - "logs/{{ cycle_YMDH }}/{{ RUN }}_epos{{ '%03d' % grp }}.log" {% endfor %} - {% if not DO_JEDIATMENS %} + {% if not DOENKFONLY_ATM %} + {% if not DO_JEDIATMENS %} - "logs/{{ cycle_YMDH }}/{{ RUN }}_echgres.log" - {% endif %} + {% endif %} + {% endif %} {% endif %} - "logs/{{ cycle_YMDH }}/{{ RUN }}_esfc.log" {% if not DO_JEDIATMENS %} @@ -25,13 +27,21 @@ enkf: {% if lobsdiag_forenkf %} {% if DO_JEDIATMENS %} - {% set steps = ["atmensanlinit", "atmensanlobs", "atmensanlsol", "atmensanlfv3inc", "atmensanlfinal", "ecen_fv3jedi"] %} + {% if DOENKFONLY_ATM %} + {% set steps = ["atmensanlinit", "atmensanlobs", "atmensanlsol", "atmensanlfv3inc", "atmensanlfinal"] %} + {% else %} + {% set steps = ["atmensanlinit", "atmensanlobs", "atmensanlsol", "atmensanlfv3inc", "atmensanlfinal", "ecen_fv3jedi"] %} + {% endif %} {% else %} {% set steps = ["eobs", "ediag", "eupd"] %} {% endif %} {% else %} {% if DO_JEDIATMENS %} - {% set steps = ["atmensanlinit", "atmensanlletkf", "atmensanlfv3inc", "atmensanlfinal", "ecen_fv3jedi"] %} + {% if DOENKFONLY_ATM %} + {% set steps = ["atmensanlinit", "atmensanlletkf", "atmensanlfv3inc", "atmensanlfinal"] %} + {% else %} + {% set steps = ["atmensanlinit", "atmensanlletkf", "atmensanlfv3inc", "atmensanlfinal", "ecen_fv3jedi"] %} + {% endif %} {% else %} {% set steps = ["eobs", "eupd"] %} {% endif %} @@ -46,7 +56,7 @@ enkf: # Ensemble resolution {% if is_gdas %} - {% if DOHYBVAR %} + {% if DOHYBVAR and not DOENKFONLY_ATM %} {% if DOIAU %} {% for fhr in range(3, fhmax + 1, 3) %} - "{{ COMIN_ATMOS_HISTORY | relpath(ROTDIR) }}/{{ head |replace('enkf','')}}ensres.atm.f{{ '%03d' % fhr }}.nc" @@ -77,17 +87,29 @@ enkf: {% else %} {% if lobsdiag_forenkf %} {% set da_stat_files = [] %} - {% set da_conf_files = ["atmensanlobs.yaml", - "atmensanlsol.yaml", - "atmensanlfv3inc.yaml", - "correction_increment.yaml", - "ensemble_recenter.yaml"] %} + {% if DOENKFONLY_ATM %} + {% set da_conf_files = ["atmensanlobs.yaml", + "atmensanlsol.yaml", + "atmensanlfv3inc.yaml"] %} + {% else %} + {% set da_conf_files = ["atmensanlobs.yaml", + "atmensanlsol.yaml", + "atmensanlfv3inc.yaml", + "correction_increment.yaml", + "ensemble_recenter.yaml"] %} + {% endif %} {% else %} - {% set da_stat_files = ["atmos_analysis.ioda_hofx.ens_mean.tar.gz"]%} - {% set da_conf_files = ["atmensanlletkf.yaml", - "atmensanlfv3inc.yaml", - "correction_increment.yaml", - "ensemble_recenter.yaml"] %} + {% if DOENKFONLY_ATM %} + {% set da_stat_files = ["atmos_analysis.ioda_hofx.ens_mean.tar.gz"]%} + {% set da_conf_files = ["atmensanlletkf.yaml", + "atmensanlfv3inc.yaml"] %} + {% else %} + {% set da_stat_files = ["atmos_analysis.ioda_hofx.ens_mean.tar.gz"]%} + {% set da_conf_files = ["atmensanlletkf.yaml", + "atmensanlfv3inc.yaml", + "correction_increment.yaml", + "ensemble_recenter.yaml"] %} + {% endif %} {% endif %} {% endif %} {% for file in da_stat_files %} diff --git a/parm/archive/enkf_grp.yaml.j2 b/parm/archive/enkf_grp.yaml.j2 index 6b6cbac9475..e6aac7aee45 100644 --- a/parm/archive/enkf_grp.yaml.j2 +++ b/parm/archive/enkf_grp.yaml.j2 @@ -24,17 +24,24 @@ enkf_grp: {% if DO_JEDIATMENS %} {% for iaufhr in IAUFHRS %} {% for itile in range(6) %} + {% if DOENKFONLY_ATM %} + - "{{ COMIN_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}csg_jedi_increment.atm.i{{ '%03d' % iaufhr }}.tile{{ itile+1 }}.nc" + {% else %} - "{{ COMIN_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}recentered_jedi_increment.atm.i{{ '%03d' % iaufhr }}.tile{{ itile+1 }}.nc" + {% endif %} + {% endfor %} {% endfor %} {% else %} {% if do_calc_increment %} - "{{ COMIN_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}analysis.atm.a006.nc" {% else %} - {% for iaufhr in IAUFHRS %} - {% set iaufhr = iaufhr %} + {% if not DOENKFONLY_ATM %} + {% for iaufhr in IAUFHRS %} + {% set iaufhr = iaufhr %} - "{{ COMIN_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}recentered_increment.atm.i{{ '%03d' % iaufhr }}.nc" - {% endfor %} # iaufhr in IAUFHRS + {% endfor %} # iaufhr in IAUFHRS + {% endif %} {% endif %} {% endif %} diff --git a/parm/archive/enkf_restarta_grp.yaml.j2 b/parm/archive/enkf_restarta_grp.yaml.j2 index 596d18f3aaf..e2d2c73a846 100644 --- a/parm/archive/enkf_restarta_grp.yaml.j2 +++ b/parm/archive/enkf_restarta_grp.yaml.j2 @@ -37,7 +37,11 @@ enkf_restarta_grp: {% if DO_JEDIATMENS %} {% for iaufhr in IAUFHRS %} {% for itile in range(6) %} + {% if DOENKFONLY_ATM %} + - "{{ COMIN_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}_jedi_increment.atm.i{{ '%03d' % iaufhr }}.tile{{ itile+1 }}.nc" + {% else %} - "{{ COMIN_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}recentered_jedi_increment.atm.i{{ '%03d' % iaufhr }}.tile{{ itile+1 }}.nc" + {% endif %} {% endfor %} {% endfor %} {% else %} @@ -45,7 +49,9 @@ enkf_restarta_grp: {% if do_calc_increment %} - "{{ COMIN_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}analysis.atm.a{{ '%03d' % iaufhr }}.nc" {% else %} + {% if not DOENKFONLY_ATM %} - "{{ COMIN_ATMOS_ANALYSIS_MEM | relpath(ROTDIR) }}/{{ head }}recentered_increment.atm.i{{ '%03d' % iaufhr }}.nc" + {% endif %} {% endif %} {% endfor %} # iaufhr in IAUFHRS {% endif %} diff --git a/parm/fetch/gfs_ATM_gdas-anl-bias.yaml.j2 b/parm/fetch/gfs_ATM_gdas-anl-bias.yaml.j2 new file mode 100644 index 00000000000..f2ddd8a09f6 --- /dev/null +++ b/parm/fetch/gfs_ATM_gdas-anl-bias.yaml.j2 @@ -0,0 +1,16 @@ +{% set cycle_YMDH = previous_cycle | to_YMDH %} +{% set cycle_Y = previous_cycle | strftime("%Y") %} +{% set cycle_YM = previous_cycle | strftime("%Y%m") %} +{% set cycle_YMD = previous_cycle | to_YMD %} +{% set cycle_HH = previous_cycle | strftime("%H") %} +target: + tarball : "/NCEPPROD/hpssprod/runhistory/rh{{ cycle_Y }}/{{ cycle_YM }}/{{ cycle_YMD }}/com_gfs_{{ gdas_version }}_gdas.{{ cycle_YMD }}_{{ cycle_HH }}.gdas_restart.tar" + on_hpss: True + contents: + # Atmospheric analysis + - ./gdas.{{ cycle_YMD }}/{{ cycle_HH }}/atmos/gdas.t{{ cycle_HH }}z.abias + - ./gdas.{{ cycle_YMD }}/{{ cycle_HH }}/atmos/gdas.t{{ cycle_HH }}z.abias_air + - ./gdas.{{ cycle_YMD }}/{{ cycle_HH }}/atmos/gdas.t{{ cycle_HH }}z.abias_int + - ./gdas.{{ cycle_YMD }}/{{ cycle_HH }}/atmos/gdas.t{{ cycle_HH }}z.abias_pc + - ./gdas.{{ cycle_YMD }}/{{ cycle_HH }}/atmos/gdas.t{{ cycle_HH }}z.radstat + destination: "{{ DATA }}" diff --git a/sorc/gdas.cd b/sorc/gdas.cd index 3e0593d7de3..bfb20db68d9 160000 --- a/sorc/gdas.cd +++ b/sorc/gdas.cd @@ -1 +1 @@ -Subproject commit 3e0593d7de31944b3aef5330c36f2ddfecba3014 +Subproject commit bfb20db68d99aa649cdad51ac6a65697a782c781 diff --git a/sorc/link_workflow.sh b/sorc/link_workflow.sh index 76f2a5de5a9..6b54f835685 100755 --- a/sorc/link_workflow.sh +++ b/sorc/link_workflow.sh @@ -439,6 +439,7 @@ fi # GDASApp executables if [[ -d "${HOMEgfs}/sorc/gdas.cd/install" ]]; then cp -f "${HOMEgfs}/sorc/gdas.cd/install/bin"/gdas* ./ + cp -f "${HOMEgfs}/sorc/gdas.cd/install/bin/satbias2ioda.x" ./satbias2ioda.x cp -f "${HOMEgfs}/sorc/gdas.cd/install/bin/apply_incr.exe" ./gdas_apply_incr.x fi diff --git a/sorc/wxflow b/sorc/wxflow index de88f849241..88c576d7693 160000 --- a/sorc/wxflow +++ b/sorc/wxflow @@ -1 +1 @@ -Subproject commit de88f849241a7e5d7563d99d6543544f7faf785d +Subproject commit 88c576d7693455bf015741605e63679e73b3e458 diff --git a/ush/forecast_postdet.sh b/ush/forecast_postdet.sh index aee9fe9bced..14e13cd9850 100755 --- a/ush/forecast_postdet.sh +++ b/ush/forecast_postdet.sh @@ -195,9 +195,14 @@ EOF read_increment=".true." if [[ "${DO_JEDIATMVAR:-NO}" == "YES" ]]; then - inc_files=("jedi_increment.atm.i006.tile1.nc" "jedi_increment.atm.i006.tile2.nc" "jedi_increment.atm.i006.tile3.nc" "jedi_increment.atm.i006.tile4.nc" "jedi_increment.atm.i006.tile5.nc" "jedi_increment.atm.i006.tile6.nc") increment_file_on_native_grid=".true." - res_latlon_dynamics="jedi_increment.atm.i006" + if [[ "${DOENKFONLY_ATM:-NO}" == "YES" ]]; then + inc_files=("csg_jedi_increment.atm.i006.tile1.nc" "csg_jedi_increment.atm.i006.tile2.nc" "csg_jedi_increment.atm.i006.tile3.nc" "csg_jedi_increment.atm.i006.tile4.nc" "csg_jedi_increment.atm.i006.tile5.nc" "csg_jedi_increment.atm.i006.tile6.nc") + res_latlon_dynamics="csg_jedi_increment.atm.i006" + else + inc_files=("jedi_increment.atm.i006.tile1.nc" "jedi_increment.atm.i006.tile2.nc" "jedi_increment.atm.i006.tile3.nc" "jedi_increment.atm.i006.tile4.nc" "jedi_increment.atm.i006.tile5.nc" "jedi_increment.atm.i006.tile6.nc") + res_latlon_dynamics="jedi_increment.atm.i006" + fi if [[ "${DO_JEDIATMENS:-NO}" == "NO" ]]; then inc_files=("increment.atm.i006.nc") res_latlon_dynamics="increment.atm.i006.nc" @@ -219,7 +224,11 @@ EOF fi if [[ "${RUN}" == "enkfgfs" ]] || [[ "${RUN}" == "enkfgdas" ]]; then - prefix_atminc="recentered_" + if [[ "${DOENKFONLY_ATM:-NO}" == "YES" ]]; then + prefix_atminc="" + else + prefix_atminc="recentered_" + fi else prefix_atminc="" fi