From 1eb62f3f5a46950438ea1781605c585b13d28ca9 Mon Sep 17 00:00:00 2001 From: Jiarui Dong Date: Fri, 8 Nov 2024 21:36:26 -0500 Subject: [PATCH 01/20] Update snow obs processing job (#3055) This PR removes the `prepsnowobs` job, and add the IMS snow obs processing to the snow analysis job and it will only process the snow cover obs if the cycle is 00z. Resolves #2902 --------- Co-authored-by: Cory Martin Co-authored-by: David Huber <69919478+DavidHuber-NOAA@users.noreply.github.com> --- env/HERA.env | 6 ++-- env/HERCULES.env | 6 ++-- env/JET.env | 6 ++-- env/ORION.env | 6 ++-- env/S4.env | 6 ++-- env/WCOSS2.env | 6 ++-- jobs/JGLOBAL_PREP_SNOW_OBS | 50 ----------------------------- jobs/rocoto/prepsnowobs.sh | 26 --------------- jobs/rocoto/snowanl.sh | 8 +++++ parm/config/gfs/config.prepsnowobs | 18 ----------- parm/config/gfs/config.resources | 9 +----- parm/config/gfs/config.snowanl | 6 ++++ scripts/exglobal_prep_snow_obs.py | 24 -------------- scripts/exglobal_snow_analysis.py | 2 ++ workflow/applications/gfs_cycled.py | 4 +-- workflow/rocoto/gfs_tasks.py | 28 +--------------- workflow/rocoto/tasks.py | 2 +- 17 files changed, 33 insertions(+), 180 deletions(-) delete mode 100755 jobs/JGLOBAL_PREP_SNOW_OBS delete mode 100755 jobs/rocoto/prepsnowobs.sh delete mode 100644 parm/config/gfs/config.prepsnowobs delete mode 100755 scripts/exglobal_prep_snow_obs.py diff --git a/env/HERA.env b/env/HERA.env index 259461b1ac..f10bfcc537 100755 --- a/env/HERA.env +++ b/env/HERA.env @@ -52,10 +52,6 @@ if [[ "${step}" = "prep" ]] || [[ "${step}" = "prepbufr" ]]; then export sys_tp="HERA" export launcher_PREP="srun --hint=nomultithread" -elif [[ "${step}" = "prepsnowobs" ]]; then - - export APRUN_CALCFIMS="${APRUN_default}" - elif [[ "${step}" = "prep_emissions" ]]; then export APRUN="${APRUN_default}" @@ -116,6 +112,8 @@ elif [[ "${step}" = "prepobsaero" ]]; then elif [[ "${step}" = "snowanl" ]]; then + export APRUN_CALCFIMS="${launcher} -n 1" + export NTHREADS_SNOWANL=${NTHREADSmax} export APRUN_SNOWANL="${APRUN_default} --cpus-per-task=${NTHREADS_SNOWANL}" diff --git a/env/HERCULES.env b/env/HERCULES.env index bed1d11281..15e3928f08 100755 --- a/env/HERCULES.env +++ b/env/HERCULES.env @@ -50,10 +50,6 @@ case ${step} in export sys_tp="HERCULES" export launcher_PREP="srun --hint=nomultithread" ;; - "prepsnowobs") - - export APRUN_CALCFIMS="${APRUN_default}" - ;; "prep_emissions") export APRUN="${APRUN_default}" @@ -115,6 +111,8 @@ case ${step} in ;; "snowanl") + export APRUN_CALCFIMS="${launcher} -n 1" + export NTHREADS_SNOWANL=${NTHREADSmax} export APRUN_SNOWANL="${APRUN_default} --cpus-per-task=${NTHREADS_SNOWANL}" diff --git a/env/JET.env b/env/JET.env index dbc249d4d6..6465b69acd 100755 --- a/env/JET.env +++ b/env/JET.env @@ -40,10 +40,6 @@ if [[ "${step}" = "prep" ]] || [[ "${step}" = "prepbufr" ]]; then export sys_tp="JET" export launcher_PREP="srun" -elif [[ "${step}" = "prepsnowobs" ]]; then - - export APRUN_CALCFIMS="${launcher} -n 1" - elif [[ "${step}" = "prep_emissions" ]]; then export APRUN="${launcher} -n 1" @@ -99,6 +95,8 @@ elif [[ "${step}" = "prepobsaero" ]]; then elif [[ "${step}" = "snowanl" ]]; then + export APRUN_CALCFIMS="${launcher} -n 1" + export NTHREADS_SNOWANL=${NTHREADSmax} export APRUN_SNOWANL="${APRUN_default}" diff --git a/env/ORION.env b/env/ORION.env index 06ae2c1a63..1dc49e9362 100755 --- a/env/ORION.env +++ b/env/ORION.env @@ -47,10 +47,6 @@ if [[ "${step}" = "prep" ]] || [[ "${step}" = "prepbufr" ]]; then export sys_tp="ORION" export launcher_PREP="srun --hint=nomultithread" -elif [[ "${step}" = "prepsnowobs" ]]; then - - export APRUN_CALCFIMS="${launcher} -n 1" - elif [[ "${step}" = "prep_emissions" ]]; then export APRUN="${launcher} -n 1" @@ -106,6 +102,8 @@ elif [[ "${step}" = "prepobsaero" ]]; then elif [[ "${step}" = "snowanl" ]]; then + export APRUN_CALCFIMS="${launcher} -n 1" + export NTHREADS_SNOWANL=${NTHREADSmax} export APRUN_SNOWANL="${APRUN_default} --cpus-per-task=${NTHREADS_SNOWANL}" diff --git a/env/S4.env b/env/S4.env index 5d5ffd23b1..9a5baf29ed 100755 --- a/env/S4.env +++ b/env/S4.env @@ -40,10 +40,6 @@ if [[ "${step}" = "prep" ]] || [[ "${step}" = "prepbufr" ]]; then export sys_tp="S4" export launcher_PREP="srun" -elif [[ "${step}" = "prepsnowobs" ]]; then - - export APRUN_CALCFIMS="${APRUN_default}" - elif [[ "${step}" = "prep_emissions" ]]; then export APRUN="${APRUN_default}" @@ -99,6 +95,8 @@ elif [[ "${step}" = "prepobsaero" ]]; then elif [[ "${step}" = "snowanl" ]]; then + export APRUN_CALCFIMS="${launcher} -n 1" + export NTHREADS_SNOWANL=${NTHREADSmax} export APRUN_SNOWANL="${APRUN_default}" diff --git a/env/WCOSS2.env b/env/WCOSS2.env index c67c16f929..fff8f7b096 100755 --- a/env/WCOSS2.env +++ b/env/WCOSS2.env @@ -34,10 +34,6 @@ if [[ "${step}" = "prep" ]] || [[ "${step}" = "prepbufr" ]]; then export sys_tp="wcoss2" export launcher_PREP="mpiexec" -elif [[ "${step}" = "prepsnowobs" ]]; then - - export APRUN_CALCFIMS="${APRUN_default}" - elif [[ "${step}" = "prep_emissions" ]]; then export APRUN="${APRUN_default}" @@ -92,6 +88,8 @@ elif [[ "${step}" = "prepobsaero" ]]; then elif [[ "${step}" = "snowanl" ]]; then + export APRUN_CALCFIMS="${launcher} -n 1" + export NTHREADS_SNOWANL=${NTHREADSmax} export APRUN_SNOWANL="${APRUN_default}" diff --git a/jobs/JGLOBAL_PREP_SNOW_OBS b/jobs/JGLOBAL_PREP_SNOW_OBS deleted file mode 100755 index 0e3557697d..0000000000 --- a/jobs/JGLOBAL_PREP_SNOW_OBS +++ /dev/null @@ -1,50 +0,0 @@ -#! /usr/bin/env bash - -source "${HOMEgfs}/ush/preamble.sh" -export DATA=${DATA:-${DATAROOT}/${RUN}snowanl_${cyc}} -source "${HOMEgfs}/ush/jjob_header.sh" -e "prepsnowobs" -c "base prepsnowobs" - -############################################## -# Set variables used in the script -############################################## -# Ignore possible spelling error (nothing is misspelled) -# shellcheck disable=SC2153 -GDATE=$(date --utc +%Y%m%d%H -d "${PDY} ${cyc} - ${assim_freq} hours") -gPDY=${GDATE:0:8} -gcyc=${GDATE:8:2} -GDUMP="gdas" - -############################################## -# Begin JOB SPECIFIC work -############################################## -# Generate COM variables from templates -YMD=${PDY} HH=${cyc} declare_from_tmpl -rx COM_OBS - -RUN=${GDUMP} YMD=${gPDY} HH=${gcyc} declare_from_tmpl -rx \ - COM_ATMOS_RESTART_PREV:COM_ATMOS_RESTART_TMPL - -############################################################### -# Run relevant script -EXSCRIPT=${GDASSNOWPREPPY:-${SCRgfs}/exglobal_prep_snow_obs.py} -${EXSCRIPT} -status=$? -[[ ${status} -ne 0 ]] && (echo "FATAL ERROR: Error executing ${EXSCRIPT}, ABORT!"; exit "${status}") - -############################################## -# End JOB SPECIFIC work -############################################## - -############################################## -# Final processing -############################################## -if [[ -e "${pgmout}" ]] ; then - cat "${pgmout}" -fi - -########################################## -# Remove the Temporary working directory -########################################## -cd "${DATAROOT}" || exit 1 -[[ ${KEEPDATA} = "NO" ]] && rm -rf "${DATA}" - -exit 0 diff --git a/jobs/rocoto/prepsnowobs.sh b/jobs/rocoto/prepsnowobs.sh deleted file mode 100755 index 3f23bc16a5..0000000000 --- a/jobs/rocoto/prepsnowobs.sh +++ /dev/null @@ -1,26 +0,0 @@ -#! /usr/bin/env bash - -source "${HOMEgfs}/ush/preamble.sh" - -############################################################### -# Source UFSDA workflow modules -. "${HOMEgfs}/ush/load_ufsda_modules.sh" -status=$? -[[ ${status} -ne 0 ]] && exit "${status}" - -export job="prepsnowobs" -export jobid="${job}.$$" - -############################################################### -# setup python path for ioda utilities -# shellcheck disable=SC2311 -pyiodaPATH="${HOMEgfs}/sorc/gdas.cd/build/lib/python$(detect_py_ver)/" -gdasappPATH="${HOMEgfs}/sorc/gdas.cd/sorc/iodaconv/src:${pyiodaPATH}" -PYTHONPATH="${PYTHONPATH:+${PYTHONPATH}:}:${gdasappPATH}" -export PYTHONPATH - -############################################################### -# Execute the JJOB -"${HOMEgfs}/jobs/JGLOBAL_PREP_SNOW_OBS" -status=$? -exit "${status}" diff --git a/jobs/rocoto/snowanl.sh b/jobs/rocoto/snowanl.sh index 97df7a46c7..cf1ddd688b 100755 --- a/jobs/rocoto/snowanl.sh +++ b/jobs/rocoto/snowanl.sh @@ -11,6 +11,14 @@ status=$? export job="snowanl" export jobid="${job}.$$" +############################################################### +# setup python path for ioda utilities +# shellcheck disable=SC2311 +pyiodaPATH="${HOMEgfs}/sorc/gdas.cd/build/lib/python$(detect_py_ver)/" +gdasappPATH="${HOMEgfs}/sorc/gdas.cd/sorc/iodaconv/src:${pyiodaPATH}" +PYTHONPATH="${PYTHONPATH:+${PYTHONPATH}:}:${gdasappPATH}" +export PYTHONPATH + ############################################################### # Execute the JJOB "${HOMEgfs}/jobs/JGLOBAL_SNOW_ANALYSIS" diff --git a/parm/config/gfs/config.prepsnowobs b/parm/config/gfs/config.prepsnowobs deleted file mode 100644 index 20bdd89ddf..0000000000 --- a/parm/config/gfs/config.prepsnowobs +++ /dev/null @@ -1,18 +0,0 @@ -#! /usr/bin/env bash - -########## config.prepsnowobs ########## -# Snow Obs Prep specific - -echo "BEGIN: config.prepsnowobs" - -# Get task specific resources -. "${EXPDIR}/config.resources" prepsnowobs - -export IMS_OBS_LIST="${PARMgfs}/gdas/snow/prep/prep_ims.yaml.j2" - -export CALCFIMSEXE="${EXECgfs}/calcfIMS.exe" -export FIMS_NML_TMPL="${PARMgfs}/gdas/snow/prep/fims.nml.j2" - -export IMS2IODACONV="${USHgfs}/imsfv3_scf2ioda.py" - -echo "END: config.prepsnowobs" diff --git a/parm/config/gfs/config.resources b/parm/config/gfs/config.resources index 14e6f0d7fb..cddd1643fd 100644 --- a/parm/config/gfs/config.resources +++ b/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" - echo "prep prepsnowobs prepatmiodaobs" + echo "prep prepatmiodaobs" echo "atmanlinit atmanlvar atmanlfv3inc atmanlfinal" echo "atmensanlinit atmensanlobs atmensanlsol atmensanlletkf atmensanlfv3inc atmensanlfinal" echo "snowanl esnowrecen" @@ -152,13 +152,6 @@ case ${step} in memory="${mem_node_max}" ;; - "prepsnowobs") - walltime="00:05:00" - ntasks=1 - threads_per_task=1 - tasks_per_node=1 - ;; - "prepatmiodaobs") walltime="00:30:00" ntasks=1 diff --git a/parm/config/gfs/config.snowanl b/parm/config/gfs/config.snowanl index b1460dfa67..1aeaf58e46 100644 --- a/parm/config/gfs/config.snowanl +++ b/parm/config/gfs/config.snowanl @@ -19,6 +19,12 @@ export JEDIYAML="${PARMgfs}/gdas/snow/letkfoi/letkfoi.yaml.j2" export SNOWDEPTHVAR="snodl" export BESTDDEV="30." # Background Error Std. Dev. for LETKFOI +# Process IMS snowcover into snow depth +export IMS_OBS_LIST="${PARMgfs}/gdas/snow/prep/prep_ims.yaml.j2" +export CALCFIMSEXE="${EXECgfs}/calcfIMS.exe" +export FIMS_NML_TMPL="${PARMgfs}/gdas/snow/prep/fims.nml.j2" +export IMS2IODACONV="${USHgfs}/imsfv3_scf2ioda.py" + # Name of the executable that applies increment to bkg and its namelist template export APPLY_INCR_EXE="${EXECgfs}/apply_incr.exe" export APPLY_INCR_NML_TMPL="${PARMgfs}/gdas/snow/letkfoi/apply_incr_nml.j2" diff --git a/scripts/exglobal_prep_snow_obs.py b/scripts/exglobal_prep_snow_obs.py deleted file mode 100755 index aa1eb1bb7d..0000000000 --- a/scripts/exglobal_prep_snow_obs.py +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env python3 -# exglobal_prep_snow_obs.py -# This script creates a SnowAnalysis object -# and runs the prepare_GTS and prepare_IMS method -# which perform the pre-processing for GTS and IMS data -import os - -from wxflow import Logger, cast_strdict_as_dtypedict -from pygfs.task.snow_analysis import SnowAnalysis - - -# Initialize root logger -logger = Logger(level=os.environ.get("LOGGING_LEVEL", "DEBUG"), colored_log=True) - - -if __name__ == '__main__': - - # Take configuration from environment and cast it as python dictionary - config = cast_strdict_as_dtypedict(os.environ) - - # Instantiate the snow prepare task - SnowAnl = SnowAnalysis(config) - if SnowAnl.task_config.cyc == 0: - SnowAnl.prepare_IMS() diff --git a/scripts/exglobal_snow_analysis.py b/scripts/exglobal_snow_analysis.py index fe050f5af5..dd52b699dc 100755 --- a/scripts/exglobal_snow_analysis.py +++ b/scripts/exglobal_snow_analysis.py @@ -19,6 +19,8 @@ # Instantiate the snow analysis task anl = SnowAnalysis(config) + if anl.task_config.cyc == 0: + anl.prepare_IMS() anl.initialize() anl.execute() anl.finalize() diff --git a/workflow/applications/gfs_cycled.py b/workflow/applications/gfs_cycled.py index f92bf95fba..e85e8b159f 100644 --- a/workflow/applications/gfs_cycled.py +++ b/workflow/applications/gfs_cycled.py @@ -113,7 +113,7 @@ def _get_app_configs(self): configs += ['prepobsaero'] if self.do_jedisnowda: - configs += ['prepsnowobs', 'snowanl'] + configs += ['snowanl'] if self.do_hybvar: configs += ['esnowrecen'] @@ -156,7 +156,7 @@ def get_task_names(self): gdas_gfs_common_tasks_before_fcst += ['sfcanl', 'analcalc'] if self.do_jedisnowda: - gdas_gfs_common_tasks_before_fcst += ['prepsnowobs', 'snowanl'] + gdas_gfs_common_tasks_before_fcst += ['snowanl'] wave_prep_tasks = ['waveinit', 'waveprep'] wave_bndpnt_tasks = ['wavepostbndpnt', 'wavepostbndpntbll'] diff --git a/workflow/rocoto/gfs_tasks.py b/workflow/rocoto/gfs_tasks.py index d3bb68a6b8..461241450e 100644 --- a/workflow/rocoto/gfs_tasks.py +++ b/workflow/rocoto/gfs_tasks.py @@ -563,34 +563,10 @@ def aeroanlfinal(self): return task - def prepsnowobs(self): - - deps = [] - dep_dict = {'type': 'task', 'name': f'{self.run}_prep'} - deps.append(rocoto.add_dependency(dep_dict)) - dependencies = rocoto.create_dependency(dep=deps) - - resources = self.get_resource('prepsnowobs') - task_name = f'{self.run}_prepsnowobs' - task_dict = {'task_name': task_name, - 'resources': resources, - 'dependency': dependencies, - 'envars': self.envars, - 'cycledef': self.run.replace('enkf', ''), - 'command': f'{self.HOMEgfs}/jobs/rocoto/prepsnowobs.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 snowanl(self): deps = [] - dep_dict = {'type': 'task', 'name': f'{self.run}_prepsnowobs'} + dep_dict = {'type': 'task', 'name': f'{self.run}_prep'} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep=deps) @@ -613,8 +589,6 @@ def snowanl(self): def esnowrecen(self): deps = [] - dep_dict = {'type': 'task', 'name': f'{self.run.replace("enkf","")}_prepsnowobs'} - deps.append(rocoto.add_dependency(dep_dict)) dep_dict = {'type': 'task', 'name': f'{self.run.replace("enkf","")}_snowanl'} deps.append(rocoto.add_dependency(dep_dict)) dep_dict = {'type': 'metatask', 'name': f'{self.run}_epmn', 'offset': f"-{timedelta_to_HMS(self._base['interval_gdas'])}"} diff --git a/workflow/rocoto/tasks.py b/workflow/rocoto/tasks.py index b989def13f..df56f90718 100644 --- a/workflow/rocoto/tasks.py +++ b/workflow/rocoto/tasks.py @@ -20,7 +20,7 @@ class Tasks: 'eobs', 'eomg', 'epos', 'esfc', 'eupd', 'atmensanlinit', 'atmensanlobs', 'atmensanlsol', 'atmensanlletkf', 'atmensanlfv3inc', 'atmensanlfinal', 'aeroanlinit', 'aeroanlvar', 'aeroanlfinal', 'aeroanlgenb', - 'prepsnowobs', 'snowanl', 'esnowrecen', + 'snowanl', 'esnowrecen', 'fcst', 'atmanlupp', 'atmanlprod', 'atmupp', 'goesupp', 'atmos_prod', 'ocean_prod', 'ice_prod', From 3f683979770bd89b3325e3a7ca77104e6e0477bb Mon Sep 17 00:00:00 2001 From: mingshichen-noaa <48537176+mingshichen-noaa@users.noreply.github.com> Date: Fri, 8 Nov 2024 21:36:59 -0500 Subject: [PATCH 02/20] Update JGDAS ENKF ECEN job (#3050) NCO has requested that each COM variable specify whether it is an input or an output. This completes that process for the global jgdas enkf ecen job. Refs #2451 --- jobs/JGDAS_ENKF_ECEN | 6 ++--- scripts/exgdas_enkf_ecen.sh | 44 ++++++++++++++++++------------------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/jobs/JGDAS_ENKF_ECEN b/jobs/JGDAS_ENKF_ECEN index 38bf847b38..71efd6ede9 100755 --- a/jobs/JGDAS_ENKF_ECEN +++ b/jobs/JGDAS_ENKF_ECEN @@ -29,13 +29,13 @@ export GPREFIX="${GDUMP}.t${gcyc}z." export GPREFIX_ENS="${GDUMP_ENS}.t${gcyc}z." RUN=${RUN/enkf} YMD=${PDY} HH=${cyc} declare_from_tmpl -rx \ - COM_ATMOS_ANALYSIS_DET:COM_ATMOS_ANALYSIS_TMPL + COMIN_ATMOS_ANALYSIS_DET:COM_ATMOS_ANALYSIS_TMPL MEMDIR="ensstat" YMD=${PDY} HH=${cyc} declare_from_tmpl -rx \ - COM_ATMOS_ANALYSIS_STAT:COM_ATMOS_ANALYSIS_TMPL + COMOUT_ATMOS_ANALYSIS_STAT:COM_ATMOS_ANALYSIS_TMPL MEMDIR="ensstat" RUN=${GDUMP} YMD=${gPDY} HH=${gcyc} declare_from_tmpl -rx \ - COM_ATMOS_HISTORY_STAT_PREV:COM_ATMOS_HISTORY_TMPL + COMIN_ATMOS_HISTORY_STAT_PREV:COM_ATMOS_HISTORY_TMPL ############################################################### diff --git a/scripts/exgdas_enkf_ecen.sh b/scripts/exgdas_enkf_ecen.sh index 442b0b04a1..f84df82875 100755 --- a/scripts/exgdas_enkf_ecen.sh +++ b/scripts/exgdas_enkf_ecen.sh @@ -117,37 +117,37 @@ for imem in $(seq 1 $NMEM_ENS); do memchar="mem"$(printf %03i $imem) MEMDIR=${memchar} YMD=${PDY} HH=${cyc} declare_from_tmpl -x \ - COM_ATMOS_ANALYSIS_MEM:COM_ATMOS_ANALYSIS_TMPL + COMOUT_ATMOS_ANALYSIS_MEM:COM_ATMOS_ANALYSIS_TMPL MEMDIR=${gmemchar} RUN=${GDUMP_ENS} YMD=${gPDY} HH=${gcyc} declare_from_tmpl -x \ - COM_ATMOS_HISTORY_MEM_PREV:COM_ATMOS_HISTORY_TMPL + COMIN_ATMOS_HISTORY_MEM_PREV:COM_ATMOS_HISTORY_TMPL - ${NLN} "${COM_ATMOS_HISTORY_MEM_PREV}/${GPREFIX_ENS}atmf00${FHR}${ENKF_SUFFIX}.nc" "./atmges_${memchar}" + ${NLN} "${COMIN_ATMOS_HISTORY_MEM_PREV}/${GPREFIX_ENS}atmf00${FHR}${ENKF_SUFFIX}.nc" "./atmges_${memchar}" if [ $DO_CALC_INCREMENT = "YES" ]; then if [ $FHR -eq 6 ]; then - ${NLN} "${COM_ATMOS_ANALYSIS_MEM}/${APREFIX_ENS}atmanl.nc" "./atmanl_${memchar}" + ${NLN} "${COMOUT_ATMOS_ANALYSIS_MEM}/${APREFIX_ENS}atmanl.nc" "./atmanl_${memchar}" else - ${NLN} "${COM_ATMOS_ANALYSIS_MEM}/${APREFIX_ENS}atma00${FHR}.nc" "./atmanl_${memchar}" + ${NLN} "${COMOUT_ATMOS_ANALYSIS_MEM}/${APREFIX_ENS}atma00${FHR}.nc" "./atmanl_${memchar}" fi fi - mkdir -p "${COM_ATMOS_ANALYSIS_MEM}" + mkdir -p "${COMOUT_ATMOS_ANALYSIS_MEM}" if [ $FHR -eq 6 ]; then - ${NLN} "${COM_ATMOS_ANALYSIS_MEM}/${APREFIX_ENS}atminc.nc" "./atminc_${memchar}" + ${NLN} "${COMOUT_ATMOS_ANALYSIS_MEM}/${APREFIX_ENS}atminc.nc" "./atminc_${memchar}" else - ${NLN} "${COM_ATMOS_ANALYSIS_MEM}/${APREFIX_ENS}atmi00${FHR}.nc" "./atminc_${memchar}" + ${NLN} "${COMOUT_ATMOS_ANALYSIS_MEM}/${APREFIX_ENS}atmi00${FHR}.nc" "./atminc_${memchar}" fi if [[ $RECENTER_ENKF = "YES" ]]; then if [ $DO_CALC_INCREMENT = "YES" ]; then if [ $FHR -eq 6 ]; then - ${NLN} "${COM_ATMOS_ANALYSIS_MEM}/${APREFIX_ENS}ratmanl.nc" "./ratmanl_${memchar}" + ${NLN} "${COMOUT_ATMOS_ANALYSIS_MEM}/${APREFIX_ENS}ratmanl.nc" "./ratmanl_${memchar}" else - ${NLN} "${COM_ATMOS_ANALYSIS_MEM}/${APREFIX_ENS}ratma00${FHR}.nc" "./ratmanl_${memchar}" + ${NLN} "${COMOUT_ATMOS_ANALYSIS_MEM}/${APREFIX_ENS}ratma00${FHR}.nc" "./ratmanl_${memchar}" fi else if [ $FHR -eq 6 ]; then - ${NLN} "${COM_ATMOS_ANALYSIS_MEM}/${APREFIX_ENS}ratminc.nc" "./ratminc_${memchar}" + ${NLN} "${COMOUT_ATMOS_ANALYSIS_MEM}/${APREFIX_ENS}ratminc.nc" "./ratminc_${memchar}" else - ${NLN} "${COM_ATMOS_ANALYSIS_MEM}/${APREFIX_ENS}ratmi00${FHR}.nc" "./ratminc_${memchar}" + ${NLN} "${COMOUT_ATMOS_ANALYSIS_MEM}/${APREFIX_ENS}ratmi00${FHR}.nc" "./ratminc_${memchar}" fi fi fi @@ -156,9 +156,9 @@ done if [ $DO_CALC_INCREMENT = "YES" ]; then # Link ensemble mean analysis if [ $FHR -eq 6 ]; then - ${NLN} "${COM_ATMOS_ANALYSIS_STAT}/${APREFIX_ENS}atmanl.ensmean.nc" "./atmanl_ensmean" + ${NLN} "${COMOUT_ATMOS_ANALYSIS_STAT}/${APREFIX_ENS}atmanl.ensmean.nc" "./atmanl_ensmean" else - ${NLN} "${COM_ATMOS_ANALYSIS_STAT}/${APREFIX_ENS}atma00${FHR}.ensmean.nc" "./atmanl_ensmean" + ${NLN} "${COMOUT_ATMOS_ANALYSIS_STAT}/${APREFIX_ENS}atma00${FHR}.ensmean.nc" "./atmanl_ensmean" fi # Compute ensemble mean analysis @@ -176,9 +176,9 @@ if [ $DO_CALC_INCREMENT = "YES" ]; then else # Link ensemble mean increment if [ $FHR -eq 6 ]; then - ${NLN} "${COM_ATMOS_ANALYSIS_STAT}/${APREFIX_ENS}atminc.ensmean.nc" "./atminc_ensmean" + ${NLN} "${COMOUT_ATMOS_ANALYSIS_STAT}/${APREFIX_ENS}atminc.ensmean.nc" "./atminc_ensmean" else - ${NLN} "${COM_ATMOS_ANALYSIS_STAT}/${APREFIX_ENS}atmi00${FHR}.ensmean.nc" "./atminc_ensmean" + ${NLN} "${COMOUT_ATMOS_ANALYSIS_STAT}/${APREFIX_ENS}atmi00${FHR}.ensmean.nc" "./atminc_ensmean" fi # Compute ensemble mean increment @@ -195,8 +195,8 @@ else export err=$?; err_chk # If available, link to ensemble mean guess. Otherwise, compute ensemble mean guess - if [[ -s "${COM_ATMOS_HISTORY_STAT_PREV}/${GPREFIX_ENS}atmf00${FHR}.ensmean.nc" ]]; then - ${NLN} "${COM_ATMOS_HISTORY_STAT_PREV}/${GPREFIX_ENS}atmf00${FHR}.ensmean.nc" "./atmges_ensmean" + if [[ -s "${COMIN_ATMOS_HISTORY_STAT_PREV}/${GPREFIX_ENS}atmf00${FHR}.ensmean.nc" ]]; then + ${NLN} "${COMIN_ATMOS_HISTORY_STAT_PREV}/${GPREFIX_ENS}atmf00${FHR}.ensmean.nc" "./atmges_ensmean" else DATAPATH="./" ATMGESNAME="atmges" @@ -231,11 +231,11 @@ if [ $RECENTER_ENKF = "YES" ]; then # GSI EnVar analysis if [ $FHR -eq 6 ]; then - ATMANL_GSI="${COM_ATMOS_ANALYSIS_DET}/${APREFIX}atmanl.nc" - ATMANL_GSI_ENSRES="${COM_ATMOS_ANALYSIS_DET}/${APREFIX}atmanl.ensres.nc" + ATMANL_GSI="${COMIN_ATMOS_ANALYSIS_DET}/${APREFIX}atmanl.nc" + ATMANL_GSI_ENSRES="${COMIN_ATMOS_ANALYSIS_DET}/${APREFIX}atmanl.ensres.nc" else - ATMANL_GSI="${COM_ATMOS_ANALYSIS_DET}/${APREFIX}atma00${FHR}.nc" - ATMANL_GSI_ENSRES="${COM_ATMOS_ANALYSIS_DET}/${APREFIX}atma00${FHR}.ensres.nc" + ATMANL_GSI="${COMIN_ATMOS_ANALYSIS_DET}/${APREFIX}atma00${FHR}.nc" + ATMANL_GSI_ENSRES="${COMIN_ATMOS_ANALYSIS_DET}/${APREFIX}atma00${FHR}.ensres.nc" fi # if we already have a ensemble resolution GSI analysis then just link to it From e6df3b361c5efdde0e16dbaf8751be77543a23e6 Mon Sep 17 00:00:00 2001 From: TerrenceMcGuinness-NOAA Date: Tue, 12 Nov 2024 14:18:09 +0000 Subject: [PATCH 03/20] CI GitHub pipeline (hotfix) update for fetching repo name (#3084) # Description Simple bug fix to GitHub CI pipeline script for Parallel Works. Introduced a bug on its last update for setting the repo name in advance of running the GitHub CLI command for getting the repo owner and branch name of PRs. # Type of change - [x] Bug fix (fixes something broken) - [ ] New feature (adds functionality) - [ ] Maintenance (code refactor, clean-up, new CI test, etc.) # Change characteristics - Is this a breaking change (a change in existing functionality)? NO - Does this change require a documentation update? NO - Does this change require an update to any of the following submodules? # How has this been tested? Gets tested when update to default repo gets checked in. --------- Co-authored-by: Terry McGuinness --- .github/workflows/pw_aws_ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pw_aws_ci.yaml b/.github/workflows/pw_aws_ci.yaml index f398ca4baf..6225b0503a 100644 --- a/.github/workflows/pw_aws_ci.yaml +++ b/.github/workflows/pw_aws_ci.yaml @@ -72,9 +72,9 @@ jobs: id: get-branch run: | pr_number=${{ github.event.inputs.pr_number }} + repo=${{ github.repository }} if [ "$pr_number" -eq "0" ]; then branch=${{ github.event.inputs.ref }} - repo=${{ github.repository }} else branch=$(gh pr view $pr_number --repo $repo --json headRefName --jq '.headRefName') repo_owner=$(gh pr view $pr_number --repo $repo --json headRepositoryOwner --jq '.headRepositoryOwner.login') From 18724999f9903b58bd1ba399e95286e521f643eb Mon Sep 17 00:00:00 2001 From: TerrenceMcGuinness-NOAA Date: Wed, 13 Nov 2024 03:21:51 -0500 Subject: [PATCH 04/20] Remove RUNDIRS before running CI cases to cover re-run events (#3076) This Pr removes **pslot** dir (with hash) from local archive folder on CI case completion and also adds `cleanup_experiment` function in the BASH utilities to clean up after a CI case runs. This change consolidates cleanup actions and adds functionality to clean the local archive folders. Key changes: - Fixes bug for cleaning up the `RUNDIRS` directory before new experiments are run in the case the pipeline is being ran for a second time - Updated `$HOMEgfs/ci/scripts/check_ci.sh` to use the new `cleanup_experiment` function under the BASH CI system. - Added `cleanup_experiment `function in `$HOMEgfs/ci/scripts/utils/ci_utils.sh` to handle various cleanups including: - COMROOT/EXPDIR per case - ARCDIR and ATADIR directories for archive - STMP/RUNDIRS/${PSLOT} - Added get config var from EXPDIR utility [get_config_var.py](https://github.com/NOAA-EMC/global-workflow/pull/2961/files#diff-b780733ae1d45917730364e09a6c510e79d4cc8cffad6d9020c7961c53b987bc) for getting config values in BASH Resolves #2954 Resolves #3066 --- ci/Jenkinsfile | 1 + ci/scripts/check_ci.sh | 3 +-- ci/scripts/utils/ci_utils.sh | 26 ++++++++++++++++-- ci/scripts/utils/get_config_var.py | 43 ++++++++++++++++++++++++++++++ 4 files changed, 69 insertions(+), 4 deletions(-) create mode 100755 ci/scripts/utils/get_config_var.py diff --git a/ci/Jenkinsfile b/ci/Jenkinsfile index 6a2e064be0..b3bd6a917a 100644 --- a/ci/Jenkinsfile +++ b/ci/Jenkinsfile @@ -222,6 +222,7 @@ pipeline { def build_system = yaml_case.experiment.system try { sh(script: "${HOMEgfs}/ci/scripts/run-check_ci.sh ${CUSTOM_WORKSPACE} ${pslot} ${build_system}") + sh(script: "${HOMEgfs}/ci/scripts/utils/ci_utils_wrapper.sh cleanup_experiment ${CUSTOM_WORKSPACE}/RUNTESTS/EXPDIR/${pslot}") } catch (Exception error_experment) { sh(script: "${HOMEgfs}/ci/scripts/utils/ci_utils_wrapper.sh cancel_batch_jobs ${pslot}") ws(CUSTOM_WORKSPACE) { diff --git a/ci/scripts/check_ci.sh b/ci/scripts/check_ci.sh index 825d8f5e8b..a89a661042 100755 --- a/ci/scripts/check_ci.sh +++ b/ci/scripts/check_ci.sh @@ -168,8 +168,7 @@ for pr in ${pr_list}; do fi if [[ "${rocoto_state}" == "DONE" ]]; then #Remove Experment cases that completed successfully - rm -Rf "${pslot_dir}" - rm -Rf "${pr_dir}/RUNTESTS/COMROOT/${pslot}" + "${HOMEgfs}/ci/scripts/utils/ci_utils_wrapper.sh" cleanup_experiment "${pslot_dir}" rm -f "${output_ci_single}" # echo "\`\`\`" > "${output_ci_single}" DATE=$(date +'%D %r') diff --git a/ci/scripts/utils/ci_utils.sh b/ci/scripts/utils/ci_utils.sh index 2a51467d38..56b0571adc 100755 --- a/ci/scripts/utils/ci_utils.sh +++ b/ci/scripts/utils/ci_utils.sh @@ -122,7 +122,9 @@ function create_experiment () { source "${HOMEgfs}/ci/platforms/config.${MACHINE_ID}" source "${HOMEgfs}/workflow/gw_setup.sh" - # Remove RUNDIRS dir incase this is a retry + # Remove RUNDIRS dir incase this is a retry (STMP now in host file) + STMP=$("${HOMEgfs}/ci/scripts/utils/parse_yaml.py" -y "${HOMEgfs}/workflow/hosts/${MACHINE_ID}.yaml" -k STMP -s) + echo "Removing ${STMP}/RUNDIRS/${pslot} directory incase this is a retry" rm -Rf "${STMP}/RUNDIRS/${pslot}" "${HOMEgfs}/${system}/workflow/create_experiment.py" --overwrite --yaml "${yaml_config}" @@ -137,7 +139,6 @@ function publish_logs() { local PR_header="$1" local dir_path="$2" local file="$3" - local full_paths="" while IFS= read -r line; do full_path="${dir_path}/${line}" @@ -155,3 +156,24 @@ function publish_logs() { fi echo "${URL}" } + +function cleanup_experiment() { + + local EXPDIR="$1" + local pslot + local ARCDIR + local ATARDIR + local COMROOT + + EXPDIR="$1" + pslot=$(basename "${EXPDIR}") + + # Use the Python utility to get the required variables + read -r ARCDIR ATARDIR STMP COMROOT < <("${HOMEgfs}/ci/scripts/utils/get_config_var.py" ARCDIR ATARDIR STMP COMROOT "${EXPDIR}") || true + + rm -Rf "${ARCDIR:?}" + rm -Rf "${ATARDIR:?}" + rm -Rf "${COMROOT}/${pslot:?}" + rm -Rf "${EXPDIR}/${pslot:?}" + rm -Rf "${STMP}/RUNDIRS/${pslot:?}" +} diff --git a/ci/scripts/utils/get_config_var.py b/ci/scripts/utils/get_config_var.py new file mode 100755 index 0000000000..84559b8c14 --- /dev/null +++ b/ci/scripts/utils/get_config_var.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python3 + +import os +import argparse +from wxflow import Configuration + + +def get_config_vars(var_names, config_path): + """ + GET_CONFIG_VARS Get configuration variables from a config file or directory. + Parameters: + var_names (list of str): The names of the configuration variables to retrieve. + config_path (str): The path to the configuration file or directory. + Returns: + list of str: The values of the specified configuration variables. + """ + if os.path.isfile(config_path): + config_dir = os.path.dirname(config_path) + config_file = os.path.basename(config_path) + elif os.path.isdir(config_path): + config_dir = config_path + config_file = 'config.base' + config = Configuration(config_dir) + config_data = config.parse_config(config_file) + return [config_data[var_name] for var_name in var_names] + + +if __name__ == "__main__": + """ + Main entry point for the script. + Parses command-line arguments and retrieves the specified configuration variables. + """ + parser = argparse.ArgumentParser(description="Get configuration variables from a config file or directory.") + parser.add_argument("var_names", nargs='+', help="The names of the configuration variables to retrieve.") + parser.add_argument("config_path", help="The path to the configuration file or directory.") + + args = parser.parse_args() + + var_names = args.var_names + config_path = args.config_path + + values = get_config_vars(var_names, config_path) + print(" ".join(values)) From 3e78e586da58b9be7fc0caa2cb4437bffa337522 Mon Sep 17 00:00:00 2001 From: David Huber <69919478+DavidHuber-NOAA@users.noreply.github.com> Date: Wed, 13 Nov 2024 13:46:02 -0500 Subject: [PATCH 05/20] Move machine-based options from config.base to host files (#3053) This moves all machine-specific options to the workflow/hosts files from the config.* files. This also turns HPSS archiving on for WCOSS2 by default. This turns OFF UFS DA tests on WCOSS2. Resolves #2942 Resolves #3087 --------- Co-authored-by: Walter Kolczynski - NOAA Co-authored-by: Rahul Mahajan --- ci/cases/pr/C96C48_ufs_hybatmDA.yaml | 2 +- ci/cases/yamls/ufs_hybatmDA_defaults.ci.yaml | 1 - modulefiles/module_gwsetup.wcoss2.lua | 3 + parm/archive/gfs_downstream.yaml.j2 | 4 +- parm/config/gefs/config.base | 13 +-- parm/config/gfs/config.aero | 30 +------ parm/config/gfs/config.base | 20 +---- parm/config/gfs/config.prepoceanobs | 7 +- parm/config/gfs/yaml/defaults.yaml | 7 +- workflow/generate_workflows.sh | 2 + workflow/hosts/awspw.yaml | 4 + workflow/hosts/azurepw.yaml | 1 + workflow/hosts/gaea.yaml | 1 + workflow/hosts/googlepw.yaml | 1 + workflow/hosts/hera.yaml | 1 + workflow/hosts/hercules.yaml | 3 + workflow/hosts/jet.yaml | 1 + workflow/hosts/orion.yaml | 3 + workflow/hosts/s4.yaml | 1 + workflow/hosts/wcoss2.yaml | 1 + workflow/setup_expt.py | 89 +++++++++++++------- 21 files changed, 100 insertions(+), 95 deletions(-) diff --git a/ci/cases/pr/C96C48_ufs_hybatmDA.yaml b/ci/cases/pr/C96C48_ufs_hybatmDA.yaml index 41a8baa725..031054079a 100644 --- a/ci/cases/pr/C96C48_ufs_hybatmDA.yaml +++ b/ci/cases/pr/C96C48_ufs_hybatmDA.yaml @@ -21,4 +21,4 @@ skip_ci_on_hosts: - gaea - orion - hercules - + - wcoss2 diff --git a/ci/cases/yamls/ufs_hybatmDA_defaults.ci.yaml b/ci/cases/yamls/ufs_hybatmDA_defaults.ci.yaml index c4fa54dcc8..b956066f6b 100644 --- a/ci/cases/yamls/ufs_hybatmDA_defaults.ci.yaml +++ b/ci/cases/yamls/ufs_hybatmDA_defaults.ci.yaml @@ -17,4 +17,3 @@ nsst: NST_MODEL: "1" sfcanl: DONST: "NO" - diff --git a/modulefiles/module_gwsetup.wcoss2.lua b/modulefiles/module_gwsetup.wcoss2.lua index a2440569db..86bdad3c56 100644 --- a/modulefiles/module_gwsetup.wcoss2.lua +++ b/modulefiles/module_gwsetup.wcoss2.lua @@ -4,5 +4,8 @@ Load environment to run GFS workflow ci scripts on WCOSS2 prepend_path("MODULEPATH", "/apps/ops/test/nco/modulefiles/core") load(pathJoin("rocoto","1.3.5")) +load(pathJoin("PrgEnv-intel")) +load(pathJoin("intel","19.1.3.304")) +load(pathJoin("python", "3.8.6")) whatis("Description: GFS run setup environment") diff --git a/parm/archive/gfs_downstream.yaml.j2 b/parm/archive/gfs_downstream.yaml.j2 index ed5317b42c..94bdd1df56 100644 --- a/parm/archive/gfs_downstream.yaml.j2 +++ b/parm/archive/gfs_downstream.yaml.j2 @@ -6,7 +6,7 @@ gfs_downstream: - "{{ COMIN_ATMOS_GEMPAK | relpath(ROTDIR) }}/gfs_{{ cycle_YMDH }}.sfc" - "{{ COMIN_ATMOS_GEMPAK | relpath(ROTDIR) }}/gfs_{{ cycle_YMDH }}.snd" {% for i in range(1, NUM_SND_COLLECTIVES) %} - - "{{ COMIN_ATMOS_WMO | relpath(ROTDIR) }}/gfs_collective{{ i }}.postsnd_{{ cycle_HH }}" + - "{{ COMIN_ATMOS_BUFR | relpath(ROTDIR) }}/gfs_collective{{ i }}.fil" {% endfor %} - - "{{ COMIN_ATMOS_BUFR | relpath(ROTDIR) }}/bufr.t{{ cycle_HH }}z" + - "{{ COMIN_ATMOS_BUFR | relpath(ROTDIR) }}/bufr.??????.{{ cycle_YMDH }}" - "{{ COMIN_ATMOS_BUFR | relpath(ROTDIR) }}/gfs.t{{ cycle_HH }}z.bufrsnd.tar.gz" diff --git a/parm/config/gefs/config.base b/parm/config/gefs/config.base index 05aabaa323..e769015937 100644 --- a/parm/config/gefs/config.base +++ b/parm/config/gefs/config.base @@ -210,12 +210,11 @@ case "${APP}" in if [[ "${APP}" =~ ^S2SW ]]; then export DO_WAVE="YES" export WAVE_RUN="both" - export cplwav2atm=".true." fi ;; *) - echo "Unrecognized APP: ${1}" - exit 1 + echo "FATAL ERROR: Unrecognized APP: '${APP}'" + exit 2 ;; esac @@ -327,7 +326,7 @@ export HPSSARCH="@HPSSARCH@" # save data to HPSS archive export LOCALARCH="@LOCALARCH@" # save data to local archive if [[ ${HPSSARCH} = "YES" ]] && [[ ${LOCALARCH} = "YES" ]]; then echo "Both HPSS and local archiving selected. Please choose one or the other." - exit 2 + exit 3 fi export ARCH_CYC=00 # Archive data at this cycle for warm_start capability export ARCH_WARMICFREQ=4 # Archive frequency in days for warm_start capability @@ -338,10 +337,4 @@ export DELETE_COM_IN_ARCHIVE_JOB="YES" # NO=retain ROTDIR. YES default in arc # Number of regional collectives to create soundings for export NUM_SND_COLLECTIVES=${NUM_SND_COLLECTIVES:-9} -# The tracker, genesis, and METplus jobs are not supported on CSPs yet -# TODO: we should place these in workflow/hosts/[aws|azure|google]pw.yaml as part of CSP's setup, not for general. -if [[ "${machine}" =~ "PW" ]]; then - export DO_WAVE="NO" -fi - echo "END: config.base" diff --git a/parm/config/gfs/config.aero b/parm/config/gfs/config.aero index f49593a439..bbfb782636 100644 --- a/parm/config/gfs/config.aero +++ b/parm/config/gfs/config.aero @@ -2,36 +2,8 @@ # UFS-Aerosols settings -# Turn off warnings about unused variables -# shellcheck disable=SC2034 - - # Path to the input data tree -case ${machine} in - "HERA") - AERO_INPUTS_DIR="/scratch1/NCEPDEV/global/glopara/data/gocart_emissions" - ;; - "ORION" | "HERCULES") - AERO_INPUTS_DIR="/work2/noaa/global/wkolczyn/noscrub/global-workflow/gocart_emissions" - ;; - "S4") - AERO_INPUTS_DIR="/data/prod/glopara/gocart_emissions" - ;; - "WCOSS2") - AERO_INPUTS_DIR="/lfs/h2/emc/global/noscrub/emc.global/data/gocart_emissions" - ;; - "GAEA") - AERO_INPUTS_DIR="/gpfs/f5/epic/proj-shared/global/glopara/data/gocart_emissions" - ;; - "JET") - AERO_INPUTS_DIR="/lfs5/HFIP/hfv3gfs/glopara/data/gocart_emissions" - ;; - *) - echo "FATAL ERROR: Machine ${machine} unsupported for aerosols" - exit 2 - ;; -esac -export AERO_INPUTS_DIR +export AERO_INPUTS_DIR=@AERO_INPUTS_DIR@ export AERO_DIAG_TABLE="${PARMgfs}/ufs/fv3/diag_table.aero" export AERO_FIELD_TABLE="${PARMgfs}/ufs/fv3/field_table.aero" diff --git a/parm/config/gfs/config.base b/parm/config/gfs/config.base index ccb05abe88..4f702f9668 100644 --- a/parm/config/gfs/config.base +++ b/parm/config/gfs/config.base @@ -260,7 +260,7 @@ case "${APP}" in ;; *) echo "Unrecognized APP: '${APP}'" - exit 1 + exit 2 ;; esac @@ -462,7 +462,7 @@ export HPSSARCH="@HPSSARCH@" # save data to HPSS archive export LOCALARCH="@LOCALARCH@" # save data to local archive if [[ ${HPSSARCH} = "YES" ]] && [[ ${LOCALARCH} = "YES" ]]; then echo "Both HPSS and local archiving selected. Please choose one or the other." - exit 2 + exit 3 fi export ARCH_CYC=00 # Archive data at this cycle for warm_start capability export ARCH_WARMICFREQ=4 # Archive frequency in days for warm_start capability @@ -483,20 +483,4 @@ export OFFSET_START_HOUR=0 # Number of regional collectives to create soundings for export NUM_SND_COLLECTIVES=${NUM_SND_COLLECTIVES:-9} -# The tracker, genesis, and METplus jobs are not supported on CSPs yet -# TODO: we should place these in workflow/hosts/awspw.yaml as part of AWS/AZURE setup, not for general. -if [[ "${machine}" =~ "PW" ]]; then - export DO_TRACKER="NO" - export DO_GENESIS="NO" - export DO_METP="NO" - export DO_WAVE="NO" -fi - -# The tracker and genesis are not installed on Orion/Hercules yet; this requires spack-stack builds of the package. -# TODO: we should place these in workflow/hosts/[orion|hercules].yaml. -if [[ "${machine}" == "ORION" || "${machine}" == "HERCULES" ]]; then - export DO_TRACKER="NO" - export DO_GENESIS="NO" -fi - echo "END: config.base" diff --git a/parm/config/gfs/config.prepoceanobs b/parm/config/gfs/config.prepoceanobs index 0963a5c42d..3aeff8a3de 100644 --- a/parm/config/gfs/config.prepoceanobs +++ b/parm/config/gfs/config.prepoceanobs @@ -14,7 +14,12 @@ export OBS_LIST=@SOCA_OBS_LIST@ export OBS_YAML=${OBS_LIST} # ocean analysis needs own dmpdir until standard dmpdir has full ocean obs -export DMPDIR=@DMPDIR@ +use_exp_obs="@use_exp_obs@" +if [[ "${use_exp_obs}" == "YES" ]]; then + dmpdir_exp="@dmpdir_exp@" +fi + +export DMPDIR="${dmpdir_exp:-${DMPDIR}}" # For BUFR2IODA json and python scripts export JSON_TMPL_DIR="${PARMgfs}/gdas/ioda/bufr2ioda" diff --git a/parm/config/gfs/yaml/defaults.yaml b/parm/config/gfs/yaml/defaults.yaml index dfc67d1237..78caf46f5d 100644 --- a/parm/config/gfs/yaml/defaults.yaml +++ b/parm/config/gfs/yaml/defaults.yaml @@ -61,4 +61,9 @@ prepoceanobs: SOCA_INPUT_FIX_DIR: "${FIXgfs}/gdas/soca/72x35x25/soca" SOCA_OBS_LIST: "${PARMgfs}/gdas/soca/obs/obs_list.yaml" # TODO: This is also repeated in ocnanal OBSPREP_YAML: "${PARMgfs}/gdas/soca/obsprep/obsprep_config.yaml" - DMPDIR: "${BASE_DATA}/experimental_obs" + use_exp_obs: "YES" + dmpdir_exp: "${BASE_DATA}/experimental_obs" + +# config.aero has just a system-specific path to add. +# This is handled by the setup_expt.py, but it has to be told to write to it. +aero: {} diff --git a/workflow/generate_workflows.sh b/workflow/generate_workflows.sh index c2565140d3..6a4cb9910a 100755 --- a/workflow/generate_workflows.sh +++ b/workflow/generate_workflows.sh @@ -150,10 +150,12 @@ while [[ $# -gt 0 && "$1" != "--" ]]; do :) echo "[${BASH_SOURCE[0]}]: ${option} requires an argument" _usage + exit 1 ;; *) echo "[${BASH_SOURCE[0]}]: Unrecognized option: ${option}" _usage + exit 1 ;; esac done diff --git a/workflow/hosts/awspw.yaml b/workflow/hosts/awspw.yaml index ef17d8f2f4..b98c838faa 100644 --- a/workflow/hosts/awspw.yaml +++ b/workflow/hosts/awspw.yaml @@ -24,4 +24,8 @@ LOCALARCH: 'NO' ATARDIR: '' # TODO: This will not yet work from AWS. MAKE_NSSTBUFR: 'NO' MAKE_ACFTBUFR: 'NO' +DO_TRACKER: 'NO' +DO_GENESIS: 'NO' +DO_METP: 'NO' +SUPPORT_WAVES: 'NO' SUPPORTED_RESOLUTIONS: ['C48', 'C96'] # TODO: Test and support all cubed-sphere resolutions. diff --git a/workflow/hosts/azurepw.yaml b/workflow/hosts/azurepw.yaml index 1769f9ee19..4725e28962 100644 --- a/workflow/hosts/azurepw.yaml +++ b/workflow/hosts/azurepw.yaml @@ -24,4 +24,5 @@ LOCALARCH: 'NO' ATARDIR: '' # TODO: This will not yet work from AZURE. MAKE_NSSTBUFR: 'NO' MAKE_ACFTBUFR: 'NO' +SUPPORT_WAVES: 'NO' SUPPORTED_RESOLUTIONS: ['C48', 'C96'] # TODO: Test and support all cubed-sphere resolutions. diff --git a/workflow/hosts/gaea.yaml b/workflow/hosts/gaea.yaml index 5a37b5dabf..23ac75ca03 100644 --- a/workflow/hosts/gaea.yaml +++ b/workflow/hosts/gaea.yaml @@ -26,3 +26,4 @@ ATARDIR: '${NOSCRUB}/archive_rotdir/${PSLOT}' MAKE_NSSTBUFR: 'NO' MAKE_ACFTBUFR: 'NO' SUPPORTED_RESOLUTIONS: ['C1152', 'C768', 'C384', 'C192', 'C96', 'C48'] +AERO_INPUTS_DIR: /gpfs/f5/epic/proj-shared/global/glopara/data/gocart_emissions diff --git a/workflow/hosts/googlepw.yaml b/workflow/hosts/googlepw.yaml index daf6cd1eb2..1b979b6bc9 100644 --- a/workflow/hosts/googlepw.yaml +++ b/workflow/hosts/googlepw.yaml @@ -24,4 +24,5 @@ LOCALARCH: 'NO' ATARDIR: '' # TODO: This will not yet work from GOOGLE. MAKE_NSSTBUFR: 'NO' MAKE_ACFTBUFR: 'NO' +SUPPORT_WAVES: 'NO' SUPPORTED_RESOLUTIONS: ['C48', 'C96'] # TODO: Test and support all cubed-sphere resolutions. diff --git a/workflow/hosts/hera.yaml b/workflow/hosts/hera.yaml index fa2c351aa1..e9e749ad3c 100644 --- a/workflow/hosts/hera.yaml +++ b/workflow/hosts/hera.yaml @@ -28,3 +28,4 @@ SUPPORTED_RESOLUTIONS: ['C1152', 'C768', 'C384', 'C192', 'C96', 'C48'] COMINecmwf: /scratch1/NCEPDEV/global/glopara/data/external_gempak/ecmwf COMINnam: /scratch1/NCEPDEV/global/glopara/data/external_gempak/nam COMINukmet: /scratch1/NCEPDEV/global/glopara/data/external_gempak/ukmet +AERO_INPUTS_DIR: /scratch1/NCEPDEV/global/glopara/data/gocart_emissions diff --git a/workflow/hosts/hercules.yaml b/workflow/hosts/hercules.yaml index 73fde6cde6..f528761cf1 100644 --- a/workflow/hosts/hercules.yaml +++ b/workflow/hosts/hercules.yaml @@ -24,7 +24,10 @@ LOCALARCH: 'NO' ATARDIR: '${NOSCRUB}/archive_rotdir/${PSLOT}' MAKE_NSSTBUFR: 'NO' MAKE_ACFTBUFR: 'NO' +DO_TRACKER: 'NO' +DO_GENESIS: 'NO' SUPPORTED_RESOLUTIONS: ['C1152', 'C768', 'C384', 'C192', 'C96', 'C48'] COMINecmwf: /work/noaa/global/glopara/data/external_gempak/ecmwf COMINnam: /work/noaa/global/glopara/data/external_gempak/nam COMINukmet: /work/noaa/global/glopara/data/external_gempak/ukmet +AERO_INPUTS_DIR: /work2/noaa/global/wkolczyn/noscrub/global-workflow/gocart_emissions diff --git a/workflow/hosts/jet.yaml b/workflow/hosts/jet.yaml index a53224fe52..737e2e7f94 100644 --- a/workflow/hosts/jet.yaml +++ b/workflow/hosts/jet.yaml @@ -28,3 +28,4 @@ SUPPORTED_RESOLUTIONS: ['C384', 'C192', 'C96', 'C48'] COMINecmwf: /mnt/lfs5/HFIP/hfv3gfs/glopara/data/external_gempak/ecmwf COMINnam: /mnt/lfs5/HFIP/hfv3gfs/glopara/data/external_gempak/nam COMINukmet: /mnt/lfs5/HFIP/hfv3gfs/glopara/data/external_gempak/ukmet +AERO_INPUTS_DIR: /lfs5/HFIP/hfv3gfs/glopara/data/gocart_emissions diff --git a/workflow/hosts/orion.yaml b/workflow/hosts/orion.yaml index d47b2b2bab..985c24c6fb 100644 --- a/workflow/hosts/orion.yaml +++ b/workflow/hosts/orion.yaml @@ -24,7 +24,10 @@ LOCALARCH: 'NO' ATARDIR: '${NOSCRUB}/archive_rotdir/${PSLOT}' MAKE_NSSTBUFR: 'NO' MAKE_ACFTBUFR: 'NO' +DO_TRACKER: 'NO' +DO_GENESIS: 'NO' SUPPORTED_RESOLUTIONS: ['C1152', 'C768', 'C384', 'C192', 'C96', 'C48'] COMINecmwf: /work/noaa/global/glopara/data/external_gempak/ecmwf COMINnam: /work/noaa/global/glopara/data/external_gempak/nam COMINukmet: /work/noaa/global/glopara/data/external_gempak/ukmet +AERO_INPUTS_DIR: /work2/noaa/global/wkolczyn/noscrub/global-workflow/gocart_emissions diff --git a/workflow/hosts/s4.yaml b/workflow/hosts/s4.yaml index b93fefec39..2e77c112b1 100644 --- a/workflow/hosts/s4.yaml +++ b/workflow/hosts/s4.yaml @@ -25,3 +25,4 @@ ATARDIR: '${NOSCRUB}/archive_rotdir/${PSLOT}' MAKE_NSSTBUFR: 'YES' MAKE_ACFTBUFR: 'YES' SUPPORTED_RESOLUTIONS: ['C384', 'C192', 'C96', 'C48'] +AERO_INPUTS_DIR: /data/prod/glopara/gocart_emissions diff --git a/workflow/hosts/wcoss2.yaml b/workflow/hosts/wcoss2.yaml index 15f0705f91..4fb4b1d64a 100644 --- a/workflow/hosts/wcoss2.yaml +++ b/workflow/hosts/wcoss2.yaml @@ -28,3 +28,4 @@ SUPPORTED_RESOLUTIONS: ['C1152', 'C768', 'C384', 'C192', 'C96', 'C48'] COMINecmwf: /lfs/h2/emc/global/noscrub/emc.global/data/external_gempak/ecmwf COMINnam: /lfs/h2/emc/global/noscrub/emc.global/data/external_gempak/nam COMINukmet: /lfs/h2/emc/global/noscrub/emc.global/data/external_gempak/ukmet +AERO_INPUTS_DIR: /lfs/h2/emc/global/noscrub/emc.global/data/gocart_emissions diff --git a/workflow/setup_expt.py b/workflow/setup_expt.py index f32203e600..27da4943d3 100755 --- a/workflow/setup_expt.py +++ b/workflow/setup_expt.py @@ -7,7 +7,6 @@ import os import glob import shutil -import warnings from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter, SUPPRESS, ArgumentTypeError from hosts import Host @@ -29,7 +28,7 @@ def makedirs_if_missing(dirname): os.makedirs(dirname) -def fill_EXPDIR(inputs): +def fill_expdir(inputs): """ Method to copy config files from workflow to experiment directory INPUTS: @@ -50,18 +49,31 @@ def fill_EXPDIR(inputs): def update_configs(host, inputs): def _update_defaults(dict_in: dict) -> dict: + # Given an input dict_in of the form + # {defaults: {config_name: {var1: value1, ...}, }, config_name: {var1: value1, ...}} + # Replace values in ['defaults']['config_name']['var1'] with ['config_name']['var1'] + # and return the ['defaults'] subdictionary as its own new dictionary. defaults = dict_in.pop('defaults', AttrDict()) + if 'defaults' in defaults: + _update_defaults(defaults) defaults.update(dict_in) return defaults - # Read in the YAML file to fill out templates and override host defaults + # Convert the inputs to an AttrDict data = AttrDict(host.info, **inputs.__dict__) + + # Read in the YAML file to fill out templates data.HOMEgfs = _top yaml_path = inputs.yaml if not os.path.exists(yaml_path): - raise IOError(f'YAML file does not exist, check path:' + yaml_path) - yaml_dict = _update_defaults(AttrDict(parse_j2yaml(yaml_path, data))) + raise FileNotFoundError(f'YAML file does not exist, check path: {yaml_path}') + yaml_dict = parse_j2yaml(yaml_path, data) + + # yaml_dict is in the form {defaults: {key1: val1, ...}, base: {key1: val1, ...}, ...} + # _update_defaults replaces any keys/values in defaults with matching keys in base + yaml_dict = _update_defaults(yaml_dict) + # Override the YAML defaults with the host-specific capabilities # First update config.base edit_baseconfig(host, inputs, yaml_dict) @@ -73,7 +85,7 @@ def _update_defaults(dict_in: dict) -> dict: stage_dict = dict(stage_dict, **host_dict) stage_input = f'{inputs.configdir}/config.stage_ic' stage_output = f'{inputs.expdir}/{inputs.pslot}/config.stage_ic' - edit_config(stage_input, stage_output, stage_dict) + edit_config(stage_input, stage_output, host_dict, stage_dict) # Loop over other configs and update them with defaults for cfg in yaml_dict.keys(): @@ -81,7 +93,7 @@ def _update_defaults(dict_in: dict) -> dict: continue cfg_file = f'{inputs.expdir}/{inputs.pslot}/config.{cfg}' cfg_dict = get_template_dict(yaml_dict[cfg]) - edit_config(cfg_file, cfg_file, cfg_dict) + edit_config(cfg_file, cfg_file, host_dict, cfg_dict) return @@ -92,20 +104,19 @@ def edit_baseconfig(host, inputs, yaml_dict): to `EXPDIR/pslot/config.base` """ - tmpl_dict = { + # Create base_dict which holds templated variables to be written to config.base + base_dict = { "@HOMEgfs@": _top, "@MACHINE@": host.machine.upper()} - # Replace host related items - extend_dict = get_template_dict(host.info) - tmpl_dict = dict(tmpl_dict, **extend_dict) - if inputs.start in ["warm"]: is_warm_start = ".true." elif inputs.start in ["cold"]: is_warm_start = ".false." + else: + raise ValueError(f"Invalid start type: {inputs.start}") - extend_dict = dict() + # Construct a dictionary from user inputs extend_dict = { "@PSLOT@": inputs.pslot, "@SDATE@": datetime_to_YMDH(inputs.idate), @@ -121,35 +132,37 @@ def edit_baseconfig(host, inputs, yaml_dict): "@APP@": inputs.app, "@NMEM_ENS@": getattr(inputs, 'nens', 0) } - tmpl_dict = dict(tmpl_dict, **extend_dict) - extend_dict = dict() if getattr(inputs, 'nens', 0) > 0: - extend_dict = { - "@CASEENS@": f'C{inputs.resensatmos}', - } - tmpl_dict = dict(tmpl_dict, **extend_dict) + extend_dict['@CASEENS@'] = f'C{inputs.resensatmos}' - extend_dict = dict() if inputs.mode in ['cycled']: - extend_dict = { - "@DOHYBVAR@": "YES" if inputs.nens > 0 else "NO", - } - tmpl_dict = dict(tmpl_dict, **extend_dict) + extend_dict["@DOHYBVAR@"] = "YES" if inputs.nens > 0 else "NO" - try: - tmpl_dict = dict(tmpl_dict, **get_template_dict(yaml_dict['base'])) - except KeyError: - pass + # Further extend/redefine base_dict with extend_dict + base_dict = dict(base_dict, **extend_dict) + + # Add/override 'base'-specific declarations in base_dict + if 'base' in yaml_dict: + base_dict = dict(base_dict, **get_template_dict(yaml_dict['base'])) base_input = f'{inputs.configdir}/config.base' base_output = f'{inputs.expdir}/{inputs.pslot}/config.base' - edit_config(base_input, base_output, tmpl_dict) + edit_config(base_input, base_output, host.info, base_dict) return -def edit_config(input_config, output_config, config_dict): +def edit_config(input_config, output_config, host_info, config_dict): + """ + Given a templated input_config filename, parse it based on config_dict and + host_info and write it out to the output_config filename. + """ + + # Override defaults with machine-specific capabilties + # e.g. some machines are not able to run metp jobs + host_dict = get_template_dict(host_info) + config_dict = dict(config_dict, **host_dict) # Read input config with open(input_config, 'rt') as fi: @@ -173,9 +186,17 @@ def edit_config(input_config, output_config, config_dict): def get_template_dict(input_dict): + # Reads a templated input dictionary and updates the output + output_dict = dict() + for key, value in input_dict.items(): - output_dict[f'@{key}@'] = value + # In some cases, the same config may be templated twice + # Prevent adding additional "@"s + if "@" in key: + output_dict[f'{key}'] = value + else: + output_dict[f'@{key}@'] = value return output_dict @@ -350,6 +371,7 @@ def query_and_clean(dirname, force_clean=False): def validate_user_request(host, inputs): supp_res = host.info['SUPPORTED_RESOLUTIONS'] + supp_waves = host.info.get('SUPPORT_WAVES', 'YES') machine = host.machine for attr in ['resdetatmos', 'resensatmos']: try: @@ -359,6 +381,9 @@ def validate_user_request(host, inputs): if expt_res not in supp_res: raise NotImplementedError(f"Supported resolutions on {machine} are:\n{', '.join(supp_res)}") + if "W" in inputs.app and supp_waves == "NO": + raise NotImplementedError(f"Waves are not supported on {machine}") + def get_ocean_resolution(resdetatmos): """ @@ -397,7 +422,7 @@ def main(*argv): if create_expdir: makedirs_if_missing(expdir) - fill_EXPDIR(user_inputs) + fill_expdir(user_inputs) update_configs(host, user_inputs) print(f"*" * 100) From 57c8aa36ed6ae9a32797b0af0a8029fd843b99e3 Mon Sep 17 00:00:00 2001 From: Neil Barton <103681022+NeilBarton-NOAA@users.noreply.github.com> Date: Wed, 13 Nov 2024 18:57:17 -0500 Subject: [PATCH 06/20] SFS Runs at C96mx100 (#2960) Adds the ability to run C96mx100 with SFS options. Included in this PR is the ability to use the interpolated/coarse grained 1 degree MOM6 ICs. Staging the ATM and OCN perturbation files without using the +03 replay ICs. --------- Co-authored-by: Eric.Sinsky Co-authored-by: Walter Kolczynski - NOAA Co-authored-by: Rahul Mahajan --- .gitignore | 1 + ci/cases/sfs/C96mx100_S2S.yaml | 19 + ci/cases/yamls/gefs_defaults_ci.yaml | 8 + ci/cases/yamls/gefs_replay_ci.yaml | 4 + ci/cases/yamls/sfs_defaults.yaml | 33 ++ parm/config/gefs/config.atmos_products | 13 +- parm/config/gefs/config.base | 5 +- parm/config/gefs/config.efcs | 6 +- parm/config/gefs/config.fcst | 20 +- parm/config/gefs/config.stage_ic | 4 + parm/config/gefs/config.ufs | 11 +- parm/config/gefs/yaml/defaults.yaml | 13 + parm/config/gfs/config.ocn | 9 +- parm/config/gfs/config.stage_ic | 4 + parm/product/sfs.0p25.f000.paramlist.a.txt | 39 ++ parm/product/sfs.0p25.fFFF.paramlist.a.txt | 52 ++ parm/product/sfs.0p25.fFFF.paramlist.b.txt | 549 +++++++++++++++++++++ parm/stage/master_gefs.yaml.j2 | 4 +- scripts/exglobal_stage_ic.py | 3 +- sorc/build_all.sh | 10 +- sorc/build_ufs.sh | 5 +- sorc/link_workflow.sh | 2 +- ush/forecast_det.sh | 4 + ush/forecast_predet.sh | 13 +- ush/parsing_namelists_FV3.sh | 2 +- 25 files changed, 803 insertions(+), 30 deletions(-) create mode 100644 ci/cases/sfs/C96mx100_S2S.yaml create mode 100644 ci/cases/yamls/sfs_defaults.yaml create mode 100644 parm/product/sfs.0p25.f000.paramlist.a.txt create mode 100644 parm/product/sfs.0p25.fFFF.paramlist.a.txt create mode 100644 parm/product/sfs.0p25.fFFF.paramlist.b.txt diff --git a/.gitignore b/.gitignore index 4ec62993d3..49fb3f438a 100644 --- a/.gitignore +++ b/.gitignore @@ -69,6 +69,7 @@ parm/post/params_grib2_tbl_new parm/post/post_tag_gfs128 parm/post/gfs parm/post/gefs +parm/post/sfs parm/post/ocean.csv parm/post/ice.csv parm/post/ocnicepost.nml.jinja2 diff --git a/ci/cases/sfs/C96mx100_S2S.yaml b/ci/cases/sfs/C96mx100_S2S.yaml new file mode 100644 index 0000000000..6bdb9a4887 --- /dev/null +++ b/ci/cases/sfs/C96mx100_S2S.yaml @@ -0,0 +1,19 @@ +experiment: + system: gefs + mode: forecast-only + +arguments: + idate: 1994050100 + edate: 1994050100 + pslot: {{ 'pslot' | getenv }} + app: S2S + resdetatmos: 96 + resensatmos: 96 + resdetocean: 1 + start: 'cold' + nens: 10 + comroot: {{ 'RUNTESTS' | getenv }}/COMROOT + expdir: {{ 'RUNTESTS' | getenv }}/EXPDIR + icsdir: {{ 'TOPICDIR' | getenv }}/HR4/C96mx100 + yaml: {{ HOMEgfs }}/ci/cases/yamls/sfs_defaults.yaml + diff --git a/ci/cases/yamls/gefs_defaults_ci.yaml b/ci/cases/yamls/gefs_defaults_ci.yaml index 05a97edd90..a06aed638a 100644 --- a/ci/cases/yamls/gefs_defaults_ci.yaml +++ b/ci/cases/yamls/gefs_defaults_ci.yaml @@ -2,3 +2,11 @@ defaults: !INC {{ HOMEgfs }}/parm/config/gefs/yaml/defaults.yaml base: ACCOUNT: {{ 'HPC_ACCOUNT' | getenv }} + SFS_POST: "NO" + FHOUT_GFS: 6 +stage_ic: + USE_OCN_ENS_PERTURB_FILES: "NO" + USE_ATM_ENS_PERTURB_FILES: "NO" +ocn: + MOM6_INTERP_ICS: "NO" + diff --git a/ci/cases/yamls/gefs_replay_ci.yaml b/ci/cases/yamls/gefs_replay_ci.yaml index dfbd9ae065..b1155aade1 100644 --- a/ci/cases/yamls/gefs_replay_ci.yaml +++ b/ci/cases/yamls/gefs_replay_ci.yaml @@ -11,4 +11,8 @@ base: FHOUT_OCN_GFS: 24 FHOUT_ICE_GFS: 24 HOMEDIR: {{ 'RUNTESTS' | getenv }}/GLOBAL + SFS_POST: "NO" +stage_ic: + USE_OCN_ENS_PERTURB_FILES: "YES" + USE_ATM_ENS_PERTURB_FILES: "YES" diff --git a/ci/cases/yamls/sfs_defaults.yaml b/ci/cases/yamls/sfs_defaults.yaml new file mode 100644 index 0000000000..b1de60ce71 --- /dev/null +++ b/ci/cases/yamls/sfs_defaults.yaml @@ -0,0 +1,33 @@ +base: + DO_JEDIATMVAR: "NO" + DO_JEDIATMENS: "NO" + DO_JEDIOCNVAR: "NO" + DO_JEDISNOWDA: "NO" + DO_MERGENSST: "NO" + DO_BUFRSND: "NO" + DO_GEMPAK: "NO" + DO_AWIPS: "NO" + KEEPDATA: "YES" + DO_EXTRACTVARS: "NO" + FHMAX_GFS: 2976 + FHMAX_HF_GFS: 0 + FHOUT_HF_GFS: 1 + FHOUT_GFS: 24 + FHOUT_OCN_GFS: 24 + FHOUT_ICE_GFS: 24 + FCST_BREAKPOINTS: "" + REPLAY_ICS: "NO" + HPSSARCH: "NO" + LOCALARCH: "NO" + SFS_POST: "YES" + ACCOUNT: {{ 'HPC_ACCOUNT' | getenv }} +fcst: + TYPE: "hydro" + MONO: "mono" + reforecast: "YES" + FHZER: 24 +stage_ic: + USE_OCN_ENS_PERTURB_FILES: "YES" + USE_ATM_ENS_PERTURB_FILES: "YES" +ocn: + MOM6_INTERP_ICS: "YES" diff --git a/parm/config/gefs/config.atmos_products b/parm/config/gefs/config.atmos_products index 73614ba08e..e8aae324e1 100644 --- a/parm/config/gefs/config.atmos_products +++ b/parm/config/gefs/config.atmos_products @@ -25,9 +25,14 @@ fi export FLXGF="NO" # Create interpolated sflux.1p00 file # paramlist files for the different forecast hours and downsets -export paramlista="${PARMgfs}/product/gefs.0p25.fFFF.paramlist.a.txt" -export paramlista_anl="${PARMgfs}/product/gefs.0p25.anl.paramlist.a.txt" -export paramlista_f000="${PARMgfs}/product/gefs.0p25.f000.paramlist.a.txt" -export paramlistb="${PARMgfs}/product/gefs.0p25.fFFF.paramlist.b.txt" +if [[ ${SFS_POST} == "YES" ]]; then + export post_prefix='sfs' +else + export post_prefix='gefs' +fi +export paramlista="${PARMgfs}/product/${post_prefix}.0p25.fFFF.paramlist.a.txt" +export paramlista_anl="${PARMgfs}/product/${post_prefix}.0p25.anl.paramlist.a.txt" +export paramlista_f000="${PARMgfs}/product/${post_prefix}.0p25.f000.paramlist.a.txt" +export paramlistb="${PARMgfs}/product/${post_prefix}.0p25.fFFF.paramlist.b.txt" echo "END: config.atmos_products" diff --git a/parm/config/gefs/config.base b/parm/config/gefs/config.base index e769015937..13f286c494 100644 --- a/parm/config/gefs/config.base +++ b/parm/config/gefs/config.base @@ -64,6 +64,7 @@ export REALTIME="YES" # Experiment mode (cycled or forecast-only) export MODE="@MODE@" # cycled/forecast-only +export SFS_POST="@SFS_POST@" # TODO, place holder until RUN=SFS is developed #################################################### # DO NOT ADD MACHINE DEPENDENT STUFF BELOW THIS LINE @@ -237,7 +238,6 @@ else export OFFSET_START_HOUR=0 fi - # GFS output and frequency export FHMIN_GFS=0 export FHMAX_GFS="@FHMAX_GFS@" @@ -245,7 +245,7 @@ export FHMAX_GFS="@FHMAX_GFS@" breakpnts="@FCST_BREAKPOINTS@" export FCST_SEGMENTS="${FHMIN_GFS},${breakpnts:+${breakpnts},}${FHMAX_GFS}" -export FHOUT_GFS=6 +export FHOUT_GFS=@FHOUT_GFS@ export FHMAX_HF_GFS=@FHMAX_HF_GFS@ export FHOUT_HF_GFS=@FHOUT_HF_GFS@ export FHOUT_OCN_GFS=@FHOUT_OCN_GFS@ @@ -295,6 +295,7 @@ export ENSMEM=${ENSMEM:-"000"} export MEMDIR="mem${ENSMEM}" export DOIAU="NO" # While we are not doing IAU, we may want to warm start w/ IAU in the future + # Check if cycle is warm starting with IAU if [[ "${EXP_WARM_START}" = ".true." ]]; then if [[ "${DOIAU}" = "YES" ]]; then diff --git a/parm/config/gefs/config.efcs b/parm/config/gefs/config.efcs index 0086121450..27d7be235d 100644 --- a/parm/config/gefs/config.efcs +++ b/parm/config/gefs/config.efcs @@ -27,7 +27,11 @@ source "${EXPDIR}/config.ufs" ${string} source "${EXPDIR}/config.resources" efcs # Stochastic physics parameters (only for ensemble forecasts) -export DO_SKEB="YES" +if [[ "${CASE}" == "C96" ]] ; then + export DO_SKEB="NO" # SKEB turned off for C96 +else + export DO_SKEB="YES" # SKEB turned on for all other resolutions +fi export SKEB="0.8,-999,-999,-999,-999" export SKEB_TAU="2.16E4,2.592E5,2.592E6,7.776E6,3.1536E7" export SKEB_LSCALE="500.E3,1000.E3,2000.E3,2000.E3,2000.E3" diff --git a/parm/config/gefs/config.fcst b/parm/config/gefs/config.fcst index b2a9c10afe..c600c8edbf 100644 --- a/parm/config/gefs/config.fcst +++ b/parm/config/gefs/config.fcst @@ -44,6 +44,7 @@ export FHOUT=${FHOUT_GFS} export FHOUT_HF=${FHOUT_HF_GFS} export FHOUT_OCN=${FHOUT_OCN_GFS} export FHOUT_ICE=${FHOUT_ICE_GFS} +export FHZER=@FHZER@ # Get task specific resources source "${EXPDIR}/config.resources" fcst @@ -66,8 +67,8 @@ export FCSTEXEC="ufs_model.x" ####################################################################### # Model configuration -export TYPE="nh" -export MONO="non-mono" +export TYPE=@TYPE@ +export MONO=@MONO@ # Use stratosphere h2o physics export h2o_phys=".true." @@ -201,6 +202,11 @@ case ${imp_physics} in export hord_xx_nh_nonmono=5 export vtdm4_nh_nonmono=0.02 export nord=2 + if [[ "${TYPE}" == "nh"* ]]; then + export dddmp=0.1 + else + export dddmp=0. + fi export dddmp=0.1 export d4_bg=0.12 ;; @@ -221,7 +227,11 @@ case ${imp_physics} in export vtdm4_nh_nonmono=0.02 export nord=2 export d4_bg=0.12 - export dddmp=0.1 + if [[ "${TYPE}" == "nh"* ]]; then + export dddmp=0.1 + else + export dddmp=0. + fi ;; *) echo "Unknown microphysics option, ABORT!" ;; esac @@ -268,9 +278,7 @@ else export io_layout="1,1" fi -if (( OFFSET_START_HOUR != 0 )); then - export reforecast="YES" -fi +export reforecast=@reforecast@ # Remember config.efcs will over-ride these values for ensemble forecasts # if these variables are re-defined there. # Otherwise, the ensemble forecast will inherit from config.fcst diff --git a/parm/config/gefs/config.stage_ic b/parm/config/gefs/config.stage_ic index cac65c74b9..92c6bb2a9b 100644 --- a/parm/config/gefs/config.stage_ic +++ b/parm/config/gefs/config.stage_ic @@ -30,4 +30,8 @@ if [[ -z "${ICSDIR}" ]] ; then fi +#use of perturbations files for ensembles +export USE_OCN_ENS_PERTURB_FILES=@USE_OCN_ENS_PERTURB_FILES@ +export USE_ATM_ENS_PERTURB_FILES=@USE_ATM_ENS_PERTURB_FILES@ + echo "END: config.stage_ic" diff --git a/parm/config/gefs/config.ufs b/parm/config/gefs/config.ufs index bc3950490e..5b7ba4c0af 100644 --- a/parm/config/gefs/config.ufs +++ b/parm/config/gefs/config.ufs @@ -80,7 +80,7 @@ case "${fv3_res}" in export nthreads_fv3_gfs=1 export nthreads_ufs=1 export nthreads_ufs_gfs=1 - export xr_cnvcld=.false. # Do not pass conv. clouds to Xu-Randall cloud fraction + export xr_cnvcld=".true." # Pass conv. clouds to Xu-Randall cloud fraction export cdmbgwd="0.071,2.1,1.0,1.0" # mountain blocking, ogwd, cgwd, cgwd src scaling export cdmbgwd_gsl="40.0,1.77,1.0,1.0" # settings for GSL drag suite export k_split=1 @@ -98,13 +98,13 @@ case "${fv3_res}" in export DELTIM=600 export layout_x=2 export layout_y=2 - export layout_x_gfs=2 - export layout_y_gfs=2 + export layout_x_gfs=4 + export layout_y_gfs=4 export nthreads_fv3=1 export nthreads_fv3_gfs=1 export nthreads_ufs=1 export nthreads_ufs_gfs=1 - export xr_cnvcld=".false." # Do not pass conv. clouds to Xu-Randall cloud fraction + export xr_cnvcld=".true." # Pass conv. clouds to Xu-Randall cloud fraction export cdmbgwd="0.14,1.8,1.0,1.0" # mountain blocking, ogwd, cgwd, cgwd src scaling export cdmbgwd_gsl="20.0,2.5,1.0,1.0" # settings for GSL drag suite export knob_ugwp_tauamp=3.0e-3 # setting for UGWPv1 non-stationary GWD @@ -131,6 +131,7 @@ case "${fv3_res}" in export cdmbgwd="0.23,1.5,1.0,1.0" # mountain blocking, ogwd, cgwd, cgwd src scaling export cdmbgwd_gsl="10.0,3.5,1.0,1.0" # settings for GSL drag suite export knob_ugwp_tauamp=1.5e-3 # setting for UGWPv1 non-stationary GWD + export xr_cnvcld=".true." # Pass conv. clouds to Xu-Randall cloud fraction export k_split=2 export n_split=4 export tau=6.0 @@ -337,7 +338,7 @@ if [[ "${skip_mom6}" == "false" ]]; then DT_THERM_MOM6='3600' FRUNOFF="runoff.daitren.clim.1deg.nc" CHLCLIM="seawifs_1998-2006_smoothed_2X.nc" - MOM6_RESTART_SETTING='r' + MOM6_RESTART_SETTING=${MOM6_RESTART_SETTING:-'r'} MOM6_RIVER_RUNOFF='False' eps_imesh="2.5e-1" TOPOEDITS="ufs.topo_edits_011818.nc" diff --git a/parm/config/gefs/yaml/defaults.yaml b/parm/config/gefs/yaml/defaults.yaml index b5870b3e7e..f0e8772b67 100644 --- a/parm/config/gefs/yaml/defaults.yaml +++ b/parm/config/gefs/yaml/defaults.yaml @@ -15,7 +15,20 @@ base: FCST_BREAKPOINTS: "48" REPLAY_ICS: "NO" USE_OCN_PERTURB_FILES: "false" + FHOUT_GFS: 6 FHOUT_OCN_GFS: 6 FHOUT_ICE_GFS: 6 HPSSARCH: "NO" LOCALARCH: "NO" + SFS_POST: "NO" +fcst: + reforecast: "NO" + FHZER: 6 + TYPE: "nh" + MONO: "non-mono" +stage_ic: + USE_OCN_ENS_PERTURB_FILES: "NO" + USE_ATM_ENS_PERTURB_FILES: "NO" +ocn: + MOM6_INTERP_ICS: "NO" + diff --git a/parm/config/gfs/config.ocn b/parm/config/gfs/config.ocn index 317a76e58a..f7c7559f9a 100644 --- a/parm/config/gfs/config.ocn +++ b/parm/config/gfs/config.ocn @@ -24,6 +24,11 @@ else export ODA_INCUPD_NHOURS="3.0" fi - - +MOM6_INTERP_ICS=@MOM6_INTERP_ICS@ +if [[ "${MOM6_INTERP_ICS}" == "YES" ]]; then + export MOM6_RESTART_SETTING='n' + export MOM6_WARMSTART_FILE="MOM.res.nc" + export MOM6_INIT_FROM_Z='False' + export MOM6_INIT_UV='file' +fi echo "END: config.ocn" diff --git a/parm/config/gfs/config.stage_ic b/parm/config/gfs/config.stage_ic index 7aa0c25f32..d0113fac63 100644 --- a/parm/config/gfs/config.stage_ic +++ b/parm/config/gfs/config.stage_ic @@ -29,4 +29,8 @@ if [[ -z "${ICSDIR}" ]] ; then fi +#use of perturbations files for ensembles +export USE_OCN_ENS_PERTURB_FILES="NO" +export USE_ATM_ENS_PERTURB_FILES="NO" + echo "END: config.stage_ic" diff --git a/parm/product/sfs.0p25.f000.paramlist.a.txt b/parm/product/sfs.0p25.f000.paramlist.a.txt new file mode 100644 index 0000000000..4fdb8f9713 --- /dev/null +++ b/parm/product/sfs.0p25.f000.paramlist.a.txt @@ -0,0 +1,39 @@ +:HGT:surface: +:PRMSL:mean sea level: +:PRES:surface: +:TMP:2 m above ground: +:TMAX:2 m above ground: +:TMIN:2 m above ground: +:RH:2 m above ground: +:DPT:2 m above ground: +:UGRD:10 m above ground: +:VGRD:10 m above ground: +:APCP:surface: +:CRAIN:surface: +:CSNOW:surface: +:CFRZR:surface: +:CICEP:surface: +:PWAT:entire atmosphere (considered as a single layer): +:CAPE:180-0 mb above ground: +:CAPE:surface: +:CIN:180-0 mb above ground: +:CIN:surface: +:CPOFP:surface: +:HLCY:3000-0 m above ground: +:TCDC:entire atmosphere: +:WEASD:surface: +:SNOD:surface: +:ULWRF:top of atmosphere: +:DSWRF:surface: +:DLWRF:surface: +:USWRF:surface: +:ULWRF:surface: +:GUST:surface: +:SHTFL:surface: +:LHTFL:surface: +:ICETK:surface: +:TSOIL:0-0.1 +:SOILW:0-0.1 +:MSLET:mean sea level: +:VIS:surface: +:HGT:cloud ceiling: diff --git a/parm/product/sfs.0p25.fFFF.paramlist.a.txt b/parm/product/sfs.0p25.fFFF.paramlist.a.txt new file mode 100644 index 0000000000..7e5497f1d2 --- /dev/null +++ b/parm/product/sfs.0p25.fFFF.paramlist.a.txt @@ -0,0 +1,52 @@ +:PRMSL:mean sea level: +:PRES:surface: +:TMP:surface: +:TMP:2 m above ground: +:TMP:850 mb: +:TMP:500 mb: +:TMP:200 mb: +:TMAX:2 m above ground: +:TMIN:2 m above ground: +:RH:2 m above ground: +:DPT:2 m above ground: +:UGRD:10 m above ground: +:UGRD:850 mb: +:UGRD:500 mb: +:UGRD:200 mb: +:VGRD:10 m above ground: +:VGRD:850 mb: +:VGRD:500 mb: +:VGRD:200 mb: +:HGT:850 mb: +:HGT:500 mb: +:HGT:200 mb: +:APCP:surface: +:CRAIN:surface: +:CSNOW:surface: +:CFRZR:surface: +:CICEP:surface: +:FDNSSTMP:surface: +:PWAT:entire atmosphere (considered as a single layer): +:CAPE:180-0 mb above ground: +:CAPE:surface: +:CIN:180-0 mb above ground: +:CIN:surface: +:HLCY:3000-0 m above ground: +:TCDC:entire atmosphere (considered as a single layer): +:WEASD:surface: +:SNOD:surface: +:ULWRF:top of atmosphere: +:DSWRF:surface: +:CPOFP:surface: +:DLWRF:surface: +:USWRF:surface: +:ULWRF:surface: +:GUST:surface: +:SHTFL:surface: +:LHTFL:surface: +:ICETK:surface: +:TSOIL:0-0.1 +:SOILW:0-0.1 +:MSLET:mean sea level: +:VIS:surface: +:HGT:cloud ceiling: diff --git a/parm/product/sfs.0p25.fFFF.paramlist.b.txt b/parm/product/sfs.0p25.fFFF.paramlist.b.txt new file mode 100644 index 0000000000..3a44c0e042 --- /dev/null +++ b/parm/product/sfs.0p25.fFFF.paramlist.b.txt @@ -0,0 +1,549 @@ +############################# sorted pgrb2a + pgrb2b 201502 +:4LFTX:surface: +:5WAVH:500 mb: +:ABSV:1000 mb: +:ABSV:100 mb: +:ABSV:10 mb: +:ABSV:150 mb: +:ABSV:200 mb: +:ABSV:20 mb: +:ABSV:250 mb: +:ABSV:300 mb: +:ABSV:30 mb: +:ABSV:350 mb: +:ABSV:400 mb: +:ABSV:450 mb: +:ABSV:500 mb: +:ABSV:50 mb: +:ABSV:550 mb: +:ABSV:600 mb: +:ABSV:650 mb: +:ABSV:700 mb: +:ABSV:70 mb: +:ABSV:750 mb: +:ABSV:800 mb: +:ABSV:850 mb: +:ABSV:900 mb: +:ABSV:925 mb: +:ABSV:950 mb: +:ABSV:975 mb: +:ACPCP:surface: +:ALBDO:surface: +:BRTMP:top of atmosphere: +:CAPE:255-0 mb above ground: +:CDUVB:surface: +:CIN:255-0 mb above ground: +:CLWMR:1000 mb: +:CLWMR:100 mb: +:CLWMR:10 mb: +:CLWMR:150 mb: +:CLWMR:200 mb: +:CLWMR:20 mb: +:CLWMR:250 mb: +:CLWMR:300 mb: +:CLWMR:30 mb: +:CLWMR:350 mb: +:CLWMR:400 mb: +:CLWMR:450 mb: +:CLWMR:500 mb: +:CLWMR:50 mb: +:CLWMR:550 mb: +:CLWMR:600 mb: +:CLWMR:650 mb: +:CLWMR:700 mb: +:CLWMR:70 mb: +:CLWMR:750 mb: +:CLWMR:800 mb: +:CLWMR:850 mb: +:CLWMR:900 mb: +:CLWMR:925 mb: +:CLWMR:950 mb: +:CLWMR:975 mb: +:CNWAT:surface: +:CPRAT:surface: +:CWAT:entire atmosphere (considered as a single layer): +:CWORK:entire atmosphere (considered as a single layer): +:DPT:30-0 mb above ground: +:DUVB:surface: +:FLDCP:surface: +:FRICV:surface: +:GFLUX:surface: +:HGT:0C isotherm: +:HGT:1000 mb: +:HGT:100 mb: +:HGT:10 mb: +:HGT:1 mb: +:HGT:150 mb: +:HGT:200 mb: +:HGT:20 mb: +:HGT:2 mb: +:HGT:250 mb: +:HGT:300 mb: +:HGT:30 mb: +:HGT:3 mb: +:HGT:350 mb: +:HGT:400 mb: +:HGT:450 mb: +:HGT:500 mb: +:HGT:50 mb: +:HGT:5 mb: +:HGT:550 mb: +:HGT:600 mb: +:HGT:650 mb: +:HGT:700 mb: +:HGT:70 mb: +:HGT:7 mb: +:HGT:750 mb: +:HGT:800 mb: +:HGT:850 mb: +:HGT:900 mb: +:HGT:925 mb: +:HGT:950 mb: +:HGT:975 mb: +:HGT:highest tropospheric freezing level: +:HGT:max wind: +:HGT:PV=-1.5e-06 (Km^2/kg/s) surface: +:HGT:PV=1.5e-06 (Km^2/kg/s) surface: +:HGT:PV=-1e-06 (Km^2/kg/s) surface: +:HGT:PV=1e-06 (Km^2/kg/s) surface: +:HGT:PV=-2e-06 (Km^2/kg/s) surface: +:HGT:PV=2e-06 (Km^2/kg/s) surface: +:HGT:PV=-5e-07 (Km^2/kg/s) surface: +:HGT:PV=5e-07 (Km^2/kg/s) surface: +:HGT:surface: +:HGT:tropopause: +:HINDEX:surface: +:HPBL:surface: +:ICAHT:max wind: +:ICAHT:tropopause: +:ICEC:surface: +:ICIP:300 mb: +:ICIP:400 mb: +:ICIP:500 mb: +:ICIP:600 mb: +:ICIP:700 mb: +:ICIP:800 mb: +:ICSEV:300 mb: +:ICSEV:400 mb: +:ICSEV:500 mb: +:ICSEV:600 mb: +:ICSEV:700 mb: +:ICSEV:800 mb: +:LAND:surface: +:LFTX:surface: +:MNTSF:320 K isentropic level: +:NCPCP:surface: +:O3MR:100 mb: +:O3MR:10 mb: +:O3MR:125 mb: +:O3MR:150 mb: +:O3MR:1 mb: +:O3MR:200 mb: +:O3MR:20 mb: +:O3MR:250 mb: +:O3MR:2 mb: +:O3MR:300 mb: +:O3MR:30 mb: +:O3MR:350 mb: +:O3MR:3 mb: +:O3MR:400 mb: +:O3MR:50 mb: +:O3MR:5 mb: +:O3MR:70 mb: +:O3MR:7 mb: +:PEVPR:surface: +:PLI:30-0 mb above ground: +:PLPL:255-0 mb above ground: +:POT:0.995 sigma level: +:PRATE:surface: +:PRES:80 m above ground: +:PRES:convective cloud bottom level: +:PRES:convective cloud top level: +:PRES:high cloud bottom level: +:PRES:high cloud top level: +:PRES:low cloud bottom level: +:PRES:low cloud top level: +:PRES:max wind: +:PRES:mean sea level: +:PRES:middle cloud bottom level: +:PRES:middle cloud top level: +:PRES:PV=-1.5e-06 (Km^2/kg/s) surface: +:PRES:PV=1.5e-06 (Km^2/kg/s) surface: +:PRES:PV=-1e-06 (Km^2/kg/s) surface: +:PRES:PV=1e-06 (Km^2/kg/s) surface: +:PRES:PV=-2e-06 (Km^2/kg/s) surface: +:PRES:PV=2e-06 (Km^2/kg/s) surface: +:PRES:PV=-5e-07 (Km^2/kg/s) surface: +:PRES:PV=5e-07 (Km^2/kg/s) surface: +:PRES:tropopause: +:PVORT:310 K isentropic level: +:PVORT:320 K isentropic level: +:PVORT:350 K isentropic level: +:PVORT:450 K isentropic level: +:PVORT:550 K isentropic level: +:PVORT:650 K isentropic level: +:PWAT:30-0 mb above ground: +:RH:0.33-1 sigma layer: +:RH:0.44-0.72 sigma layer: +:RH:0.44-1 sigma layer: +:RH:0.72-0.94 sigma layer: +:RH:0.995 sigma level: +:RH:0C isotherm: +:RH:1000 mb: +:RH:100 mb: +:RH:10 mb: +:RH:120-90 mb above ground: +:RH:150-120 mb above ground: +:RH:150 mb: +:RH:180-150 mb above ground: +:RH:200 mb: +:RH:20 mb: +:RH:250 mb: +:RH:300 mb: +:RH:30-0 mb above ground: +:RH:30 mb: +:RH:350 mb: +:RH:400 mb: +:RH:450 mb: +:RH:500 mb: +:RH:50 mb: +:RH:550 mb: +:RH:600 mb: +:RH:60-30 mb above ground: +:RH:650 mb: +:RH:700 mb: +:RH:70 mb: +:RH:750 mb: +:RH:800 mb: +:RH:850 mb: +:RH:900 mb: +:RH:90-60 mb above ground: +:RH:925 mb: +:RH:950 mb: +:RH:975 mb: +:RH:entire atmosphere (considered as a single layer): +:RH:highest tropospheric freezing level: +:SFCR:surface: +:SNOWC:surface: +:SNOHF:surface: +:SOILL:0-0.1 m below ground: +:SOILL:0.1-0.4 m below ground: +:SOILL:0.4-1 m below ground: +:SOILL:1-2 m below ground: +:SOILW:0.1-0.4 m below ground: +:SOILW:0.4-1 m below ground: +:SOILW:1-2 m below ground: +:SPFH:1000 mb: +:SPFH:100 mb: +:SPFH:10 mb: +:SPFH:1 mb: +:SPFH:120-90 mb above ground: +:SPFH:150-120 mb above ground: +:SPFH:150 mb: +:SPFH:180-150 mb above ground: +:SPFH:200 mb: +:SPFH:20 mb: +:SPFH:2 mb: +:SPFH:250 mb: +:SPFH:2 m above ground: +:SPFH:300 mb: +:SPFH:30-0 mb above ground: +:SPFH:30 mb: +:SPFH:3 mb: +:SPFH:350 mb: +:SPFH:400 mb: +:SPFH:450 mb: +:SPFH:500 mb: +:SPFH:50 mb: +:SPFH:5 mb: +:SPFH:550 mb: +:SPFH:600 mb: +:SPFH:60-30 mb above ground: +:SPFH:650 mb: +:SPFH:700 mb: +:SPFH:70 mb: +:SPFH:7 mb: +:SPFH:750 mb: +:SPFH:800 mb: +:SPFH:80 m above ground: +:SPFH:850 mb: +:SPFH:900 mb: +:SPFH:90-60 mb above ground: +:SPFH:925 mb: +:SPFH:950 mb: +:SPFH:975 mb: +:SUNSD:surface: +:TCDC:475 mb: +:TCDC:boundary layer cloud layer: +:TCDC:convective cloud layer: +:TCDC:high cloud layer: +:TCDC:low cloud layer: +:TCDC:middle cloud layer: +:TMP:0.995 sigma level: +:TMP:1000 mb: +:TMP:100 m above ground: +:TMP:100 mb: +:TMP:10 mb: +:TMP:1 mb: +:TMP:120-90 mb above ground: +:TMP:150-120 mb above ground: +:TMP:150 mb: +:TMP:180-150 mb above ground: +:TMP:1829 m above mean sea level: +:TMP:200 mb: +:TMP:20 mb: +:TMP:2 mb: +:TMP:250 mb: +:TMP:2743 m above mean sea level: +:TMP:300 mb: +:TMP:30-0 mb above ground: +:TMP:305 m above mean sea level: +:TMP:30 mb: +:TMP:3 mb: +:TMP:320 K isentropic level: +:TMP:350 mb: +:TMP:3658 m above mean sea level: +:TMP:400 mb: +:TMP:450 K isentropic level: +:TMP:450 mb: +:TMP:4572 m above mean sea level: +:TMP:457 m above mean sea level: +:TMP:500 mb: +:TMP:50 mb: +:TMP:5 mb: +:TMP:550 K isentropic level: +:TMP:550 mb: +:TMP:600 mb: +:TMP:60-30 mb above ground: +:TMP:610 m above mean sea level: +:TMP:650 K isentropic level: +:TMP:650 mb: +:TMP:700 mb: +:TMP:70 mb: +:TMP:7 mb: +:TMP:750 mb: +:TMP:800 mb: +:TMP:80 m above ground: +:TMP:850 mb: +:TMP:900 mb: +:TMP:90-60 mb above ground: +:TMP:914 m above mean sea level: +:TMP:925 mb: +:TMP:950 mb: +:TMP:975 mb: +:TMP:high cloud top level: +:TMP:low cloud top level: +:TMP:max wind: +:TMP:middle cloud top level: +:TMP:PV=-1.5e-06 (Km^2/kg/s) surface: +:TMP:PV=1.5e-06 (Km^2/kg/s) surface: +:TMP:PV=-1e-06 (Km^2/kg/s) surface: +:TMP:PV=1e-06 (Km^2/kg/s) surface: +:TMP:PV=-2e-06 (Km^2/kg/s) surface: +:TMP:PV=2e-06 (Km^2/kg/s) surface: +:TMP:PV=-5e-07 (Km^2/kg/s) surface: +:TMP:PV=5e-07 (Km^2/kg/s) surface: +:TMP:tropopause: +:TOZNE:entire atmosphere (considered as a single layer): +:TSNOWP:surface: +:TSOIL:0.1-0.4 m below ground: +:TSOIL:0.4-1 m below ground: +:TSOIL:1-2 m below ground: +:UFLX:surface: +:UGRD:0.995 sigma level: +:UGRD:1000 mb: +:UGRD:100 m above ground: +:UGRD:100 mb: +:UGRD:10 mb: +:UGRD:1 mb: +:UGRD:120-90 mb above ground: +:UGRD:150-120 mb above ground: +:UGRD:150 mb: +:UGRD:180-150 mb above ground: +:UGRD:1829 m above mean sea level: +:UGRD:20 mb: +:UGRD:2 mb: +:UGRD:250 mb: +:UGRD:2743 m above mean sea level: +:UGRD:300 mb: +:UGRD:30-0 mb above ground: +:UGRD:305 m above mean sea level: +:UGRD:30 mb: +:UGRD:3 mb: +:UGRD:320 K isentropic level: +:UGRD:350 mb: +:UGRD:3658 m above mean sea level: +:UGRD:400 mb: +:UGRD:450 K isentropic level: +:UGRD:450 mb: +:UGRD:4572 m above mean sea level: +:UGRD:457 m above mean sea level: +:UGRD:50 mb: +:UGRD:5 mb: +:UGRD:550 K isentropic level: +:UGRD:550 mb: +:UGRD:600 mb: +:UGRD:60-30 mb above ground: +:UGRD:610 m above mean sea level: +:UGRD:650 K isentropic level: +:UGRD:650 mb: +:UGRD:700 mb: +:UGRD:70 mb: +:UGRD:7 mb: +:UGRD:750 mb: +:UGRD:800 mb: +:UGRD:80 m above ground: +:UGRD:900 mb: +:UGRD:90-60 mb above ground: +:UGRD:914 m above mean sea level: +:UGRD:925 mb: +:UGRD:950 mb: +:UGRD:975 mb: +:UGRD:max wind: +:UGRD:planetary boundary layer: +:UGRD:PV=-1.5e-06 (Km^2/kg/s) surface: +:UGRD:PV=1.5e-06 (Km^2/kg/s) surface: +:UGRD:PV=-1e-06 (Km^2/kg/s) surface: +:UGRD:PV=1e-06 (Km^2/kg/s) surface: +:UGRD:PV=-2e-06 (Km^2/kg/s) surface: +:UGRD:PV=2e-06 (Km^2/kg/s) surface: +:UGRD:PV=-5e-07 (Km^2/kg/s) surface: +:UGRD:PV=5e-07 (Km^2/kg/s) surface: +:UGRD:tropopause: +:U-GWD:surface: +:USTM:6000-0 m above ground: +:USWRF:top of atmosphere: +:APTMP:2 m above ground +:VFLX:surface: +:VGRD:0.995 sigma level: +:VGRD:1000 mb: +:VGRD:100 m above ground: +:VGRD:100 mb: +:VGRD:10 mb: +:VGRD:1 mb: +:VGRD:120-90 mb above ground: +:VGRD:150-120 mb above ground: +:VGRD:150 mb: +:VGRD:180-150 mb above ground: +:VGRD:1829 m above mean sea level: +:VGRD:200 mb: +:VGRD:20 mb: +:VGRD:2 mb: +:VGRD:250 mb: +:VGRD:2743 m above mean sea level: +:VGRD:300 mb: +:VGRD:30-0 mb above ground: +:VGRD:305 m above mean sea level: +:VGRD:30 mb: +:VGRD:3 mb: +:VGRD:320 K isentropic level: +:VGRD:350 mb: +:VGRD:3658 m above mean sea level: +:VGRD:400 mb: +:VGRD:450 K isentropic level: +:VGRD:450 mb: +:VGRD:4572 m above mean sea level: +:VGRD:457 m above mean sea level: +:VGRD:50 mb: +:VGRD:5 mb: +:VGRD:550 K isentropic level: +:VGRD:550 mb: +:VGRD:600 mb: +:VGRD:60-30 mb above ground: +:VGRD:610 m above mean sea level: +:VGRD:650 K isentropic level: +:VGRD:650 mb: +:VGRD:700 mb: +:VGRD:70 mb: +:VGRD:7 mb: +:VGRD:750 mb: +:VGRD:800 mb: +:VGRD:80 m above ground: +:VGRD:900 mb: +:VGRD:90-60 mb above ground: +:VGRD:914 m above mean sea level: +:VGRD:925 mb: +:VGRD:950 mb: +:VGRD:975 mb: +:VGRD:max wind: +:VGRD:planetary boundary layer: +:VGRD:PV=-1.5e-06 (Km^2/kg/s) surface: +:VGRD:PV=1.5e-06 (Km^2/kg/s) surface: +:VGRD:PV=-1e-06 (Km^2/kg/s) surface: +:VGRD:PV=1e-06 (Km^2/kg/s) surface: +:VGRD:PV=-2e-06 (Km^2/kg/s) surface: +:VGRD:PV=2e-06 (Km^2/kg/s) surface: +:VGRD:PV=-5e-07 (Km^2/kg/s) surface: +:VGRD:PV=5e-07 (Km^2/kg/s) surface: +:VGRD:tropopause: +:V-GWD:surface: +:VRATE:planetary boundary layer: +:VSTM:6000-0 m above ground: +:VVEL:0.995 sigma level: +:VVEL:1 mb: +:VVEL:2 mb: +:VVEL:3 mb: +:VVEL:5 mb: +:VVEL:7 mb: +:VVEL:10 mb: +:VVEL:20 mb: +:VVEL:30 mb: +:VVEL:50 mb: +:VVEL:70 mb: +:VVEL:1000 mb: +:VVEL:100 mb: +:VVEL:150 mb: +:VVEL:200 mb: +:VVEL:250 mb: +:VVEL:300 mb: +:VVEL:350 mb: +:VVEL:400 mb: +:VVEL:450 mb: +:VVEL:500 mb: +:VVEL:550 mb: +:VVEL:600 mb: +:VVEL:650 mb: +:VVEL:700 mb: +:VVEL:750 mb: +:VVEL:800 mb: +:VVEL:850 mb: +:VVEL:900 mb: +:VVEL:925 mb: +:VVEL:950 mb: +:VVEL:975 mb: +:VWSH:PV=-1.5e-06 (Km^2/kg/s) surface: +:VWSH:PV=1.5e-06 (Km^2/kg/s) surface: +:VWSH:PV=-1e-06 (Km^2/kg/s) surface: +:VWSH:PV=1e-06 (Km^2/kg/s) surface: +:VWSH:PV=-2e-06 (Km^2/kg/s) surface: +:VWSH:PV=2e-06 (Km^2/kg/s) surface: +:VWSH:PV=-5e-07 (Km^2/kg/s) surface: +:VWSH:PV=5e-07 (Km^2/kg/s) surface: +:VWSH:tropopause: +:WATR:surface: +:WILT:surface: +:PRES:1 hybrid level: +:HGT:1 hybrid level: +:TMP:1 hybrid level: +:RH:1 hybrid level: +:UGRD:1 hybrid level: +:VGRD:1 hybrid level: +:PRES:2 hybrid level: +:HGT:2 hybrid level: +:TMP:2 hybrid level: +:RH:2 hybrid level: +:UGRD:2 hybrid level: +:VGRD:2 hybrid level: +:PRES:3 hybrid level: +:HGT:3 hybrid level: +:TMP:3 hybrid level: +:RH:3 hybrid level: +:UGRD:3 hybrid level: +:VGRD:3 hybrid level: +:PRES:4 hybrid level: +:HGT:4 hybrid level: +:TMP:4 hybrid level: +:RH:4 hybrid level: +:UGRD:4 hybrid level: +:VGRD:4 hybrid level: +;############################ do not leave a blank line at the end diff --git a/parm/stage/master_gefs.yaml.j2 b/parm/stage/master_gefs.yaml.j2 index 2bfe3a9d58..4f8f645b02 100644 --- a/parm/stage/master_gefs.yaml.j2 +++ b/parm/stage/master_gefs.yaml.j2 @@ -114,7 +114,7 @@ {% endfilter %} {% endif %} -{% if REPLAY_ICS %} +{% if USE_ATM_ENS_PERTURB_FILES %} {% filter indent(width=4) %} {% include "atmosphere_ens_perturbations.yaml.j2" %} {% endfilter %} @@ -135,7 +135,7 @@ {% include "ocean_rerun.yaml.j2" %} {% endfilter %} {% endif %} -{% if REPLAY_ICS %} +{% if USE_OCN_ENS_PERTURB_FILES %} {% filter indent(width=4) %} {% include "ocean_ens_perturbations.yaml.j2" %} {% endfilter %} diff --git a/scripts/exglobal_stage_ic.py b/scripts/exglobal_stage_ic.py index d737d83b47..1a49c4f64d 100755 --- a/scripts/exglobal_stage_ic.py +++ b/scripts/exglobal_stage_ic.py @@ -22,7 +22,8 @@ def main(): 'assim_freq', 'current_cycle', 'previous_cycle', 'ROTDIR', 'ICSDIR', 'STAGE_IC_YAML_TMPL', 'DO_JEDIATMVAR', 'OCNRES', 'waveGRD', 'ntiles', 'DOIAU', 'DO_JEDIOCNVAR', - 'REPLAY_ICS', 'DO_WAVE', 'DO_OCN', 'DO_ICE', 'DO_NEST'] + 'REPLAY_ICS', 'DO_WAVE', 'DO_OCN', 'DO_ICE', 'DO_NEST', + 'USE_ATM_ENS_PERTURB_FILES', 'USE_OCN_ENS_PERTURB_FILES'] stage_dict = AttrDict() for key in keys: diff --git a/sorc/build_all.sh b/sorc/build_all.sh index b2f4e6ce0e..e75c853c39 100755 --- a/sorc/build_all.sh +++ b/sorc/build_all.sh @@ -16,7 +16,7 @@ function _usage() { Builds all of the global-workflow components by calling the individual build scripts in sequence. -Usage: ${BASH_SOURCE[0]} [-a UFS_app][-c build_config][-d][-f][-h][-j n][-v][-w] +Usage: ${BASH_SOURCE[0]} [-a UFS_app][-c build_config][-d][-f][-h][-j n][-v][-w][-y] -a UFS_app: Build a specific UFS app instead of the default -d: @@ -37,6 +37,8 @@ Usage: ${BASH_SOURCE[0]} [-a UFS_app][-c build_config][-d][-f][-h][-j n][-v][-w] Execute all build scripts with -v option to turn on verbose where supported -w: Use structured wave grid + -y: + Use hydrostatic version of FV3 EOF exit 1 } @@ -51,11 +53,12 @@ _build_gsi="NO" _build_debug="" _verbose_opt="" _wave_opt="" +_hydro_opt="" _build_job_max=20 _quick_kill="NO" # Reset option counter in case this script is sourced OPTIND=1 -while getopts ":a:dfghj:kuvw" option; do +while getopts ":a:dfghj:kuvwy" option; do case "${option}" in a) _build_ufs_opt+="-a ${OPTARG} ";; f) _build_ufs_opt+="-f ";; @@ -67,6 +70,7 @@ while getopts ":a:dfghj:kuvw" option; do u) _build_ufsda="YES" ;; v) _verbose_opt="-v";; w) _wave_opt="-w";; + y) _hydro_opt="-y";; :) echo "[${BASH_SOURCE[0]}]: ${option} requires an argument" _usage @@ -129,7 +133,7 @@ declare -A build_opts big_jobs=0 build_jobs["ufs"]=8 big_jobs=$((big_jobs+1)) -build_opts["ufs"]="${_wave_opt} ${_verbose_opt} ${_build_ufs_opt} ${_build_debug}" +build_opts["ufs"]="${_wave_opt} ${_hydro_opt} ${_verbose_opt} ${_build_ufs_opt} ${_build_debug}" build_jobs["upp"]=1 build_opts["upp"]="${_build_debug}" diff --git a/sorc/build_ufs.sh b/sorc/build_ufs.sh index 44c8c7a2ad..6432962a5a 100755 --- a/sorc/build_ufs.sh +++ b/sorc/build_ufs.sh @@ -7,8 +7,9 @@ cwd=$(pwd) APP="S2SWA" CCPP_SUITES="FV3_GFS_v17_p8_ugwpv1,FV3_GFS_v17_coupled_p8_ugwpv1,FV3_global_nest_v1" # TODO: does the g-w need to build with all these CCPP_SUITES? PDLIB="ON" +HYDRO="OFF" -while getopts ":da:fj:vw" option; do +while getopts ":da:fj:vwy" option; do case "${option}" in d) BUILD_TYPE="Debug";; a) APP="${OPTARG}";; @@ -16,6 +17,7 @@ while getopts ":da:fj:vw" option; do j) BUILD_JOBS="${OPTARG}";; v) export BUILD_VERBOSE="YES";; w) PDLIB="OFF";; + y) HYDRO="ON";; :) echo "[${BASH_SOURCE[0]}]: ${option} requires an argument" ;; @@ -32,6 +34,7 @@ source "./tests/module-setup.sh" MAKE_OPT="-DAPP=${APP} -D32BIT=ON -DCCPP_SUITES=${CCPP_SUITES}" [[ ${PDLIB:-"OFF"} = "ON" ]] && MAKE_OPT+=" -DPDLIB=ON" +[[ ${HYDRO:-"OFF"} = "ON" ]] && MAKE_OPT+=" -DHYDRO=ON" if [[ ${BUILD_TYPE:-"Release"} = "DEBUG" ]] ; then MAKE_OPT+=" -DDEBUG=ON" elif [[ "${FASTER:-OFF}" == ON ]] ; then diff --git a/sorc/link_workflow.sh b/sorc/link_workflow.sh index 3d81f7b7d4..b35b7ff35a 100755 --- a/sorc/link_workflow.sh +++ b/sorc/link_workflow.sh @@ -148,7 +148,7 @@ for file in params_grib2_tbl_new nam_micro_lookup.dat do ${LINK_OR_COPY} "${HOMEgfs}/sorc/upp.fd/parm/${file}" . done -for dir in gfs gefs +for dir in gfs gefs sfs do ${LINK_OR_COPY} "${HOMEgfs}/sorc/upp.fd/parm/${dir}" . done diff --git a/ush/forecast_det.sh b/ush/forecast_det.sh index 72064ac7f5..6d321aa620 100755 --- a/ush/forecast_det.sh +++ b/ush/forecast_det.sh @@ -82,6 +82,10 @@ UFS_det(){ # TODO: add checks for other MOM6 restarts as well mom6_rst_ok="NO" fi + MOM6_RESTART_SETTING='r' + MOM6_INIT_FROM_Z=True + MOM6_WARMSTART_FILE="none" + MOM6_INIT_UV="zero" fi # Check for CICE6 restart availability diff --git a/ush/forecast_predet.sh b/ush/forecast_predet.sh index d359a86622..43c9eb968f 100755 --- a/ush/forecast_predet.sh +++ b/ush/forecast_predet.sh @@ -332,9 +332,11 @@ FV3_predet(){ if [[ "${TYPE}" == "nh" ]]; then # monotonic and non-hydrostatic hord_mt=${hord_mt_nh_mono:-"10"} hord_xx=${hord_xx_nh_mono:-"10"} + hord_dp=-${hord_xx_nh_nonmono:-"-10"} else # monotonic and hydrostatic hord_mt=${hord_mt_hydro_mono:-"10"} hord_xx=${hord_xx_hydro_mono:-"10"} + hord_dp=-${hord_xx_nh_nonmono:-"-10"} fi else # non-monotonic options d_con=${d_con_nonmono:-"1."} @@ -342,9 +344,15 @@ FV3_predet(){ if [[ "${TYPE}" == "nh" ]]; then # non-monotonic and non-hydrostatic hord_mt=${hord_mt_nh_nonmono:-"5"} hord_xx=${hord_xx_nh_nonmono:-"5"} + hord_dp=${hord_xx_hydro_mono:-"-5"} else # non-monotonic and hydrostatic hord_mt=${hord_mt_hydro_nonmono:-"10"} hord_xx=${hord_xx_hydro_nonmono:-"10"} + hord_dp=${hord_xx_hydro_mono:-"10"} + kord_tm=${kord_tm_hydro_mono:-"-12"} + kord_mt=${kord_mt_hydro_mono:-"12"} + kord_wz=${kord_wz_hydro_mono:-"12"} + kord_tr=${kord_tr_hydro_mono:-"12"} fi fi @@ -543,9 +551,12 @@ FV3_predet(){ if [[ "${RUN}" =~ "gdas" || "${RUN}" =~ "gfs" ]]; then # RUN = gdas | enkfgdas | gfs | enkfgfs ${NCP} "${PARMgfs}/post/gfs/postxconfig-NT-gfs-two.txt" "${DATA}/postxconfig-NT.txt" ${NCP} "${PARMgfs}/post/gfs/postxconfig-NT-gfs-f00-two.txt" "${DATA}/postxconfig-NT_FH00.txt" - elif [[ "${RUN}" == "gefs" ]]; then # RUN = gefs + elif [[ "${RUN}" == "gefs" && "${SFS_POST:-NO}" == "NO" ]]; then # RUN = gefs ${NCP} "${PARMgfs}/post/gefs/postxconfig-NT-gefs.txt" "${DATA}/postxconfig-NT.txt" ${NCP} "${PARMgfs}/post/gefs/postxconfig-NT-gefs-f00.txt" "${DATA}/postxconfig-NT_FH00.txt" + elif [[ "${RUN}" == "gefs" && "${SFS_POST:-NO}" == "YES" ]]; then # RUN = sfs output + ${NCP} "${PARMgfs}/post/sfs/postxconfig-NT-sfs.txt" "${DATA}/postxconfig-NT.txt" + ${NCP} "${PARMgfs}/post/sfs/postxconfig-NT-sfs.txt" "${DATA}/postxconfig-NT_FH00.txt" fi fi } diff --git a/ush/parsing_namelists_FV3.sh b/ush/parsing_namelists_FV3.sh index 617ecff719..9279b284f8 100755 --- a/ush/parsing_namelists_FV3.sh +++ b/ush/parsing_namelists_FV3.sh @@ -163,7 +163,7 @@ cat > input.nml < Date: Fri, 15 Nov 2024 03:28:26 -0500 Subject: [PATCH 07/20] Update JGDAS ENKF POST job (#3090) NCO has requested that each COM variable specify whether it is an input or an output. This completes that process for the global jgdas enkf post job. Refs #2451 --- scripts/exgdas_enkf_post.sh | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/scripts/exgdas_enkf_post.sh b/scripts/exgdas_enkf_post.sh index 6e93284695..06ce2e16fb 100755 --- a/scripts/exgdas_enkf_post.sh +++ b/scripts/exgdas_enkf_post.sh @@ -66,31 +66,34 @@ export OMP_NUM_THREADS=$NTHREADS_EPOS # Forecast ensemble member files for imem in $(seq 1 $NMEM_ENS); do memchar="mem"$(printf %03i "${imem}") - MEMDIR=${memchar} YMD=${PDY} HH=${cyc} declare_from_tmpl -x COM_ATMOS_HISTORY:COM_ATMOS_HISTORY_TMPL + MEMDIR=${memchar} YMD=${PDY} HH=${cyc} declare_from_tmpl -x \ + COMIN_ATMOS_HISTORY:COM_ATMOS_HISTORY_TMPL for fhr in $(seq $FHMIN $FHOUT $FHMAX); do fhrchar=$(printf %03i $fhr) - ${NLN} "${COM_ATMOS_HISTORY}/${PREFIX}sfcf${fhrchar}.nc" "sfcf${fhrchar}_${memchar}" - ${NLN} "${COM_ATMOS_HISTORY}/${PREFIX}atmf${fhrchar}.nc" "atmf${fhrchar}_${memchar}" + ${NLN} "${COMIN_ATMOS_HISTORY}/${PREFIX}sfcf${fhrchar}.nc" "sfcf${fhrchar}_${memchar}" + ${NLN} "${COMIN_ATMOS_HISTORY}/${PREFIX}atmf${fhrchar}.nc" "atmf${fhrchar}_${memchar}" done done # Forecast ensemble mean and smoothed files -MEMDIR="ensstat" YMD=${PDY} HH=${cyc} declare_from_tmpl -rx COM_ATMOS_HISTORY_STAT:COM_ATMOS_HISTORY_TMPL -if [[ ! -d "${COM_ATMOS_HISTORY_STAT}" ]]; then mkdir -p "${COM_ATMOS_HISTORY_STAT}"; fi +MEMDIR="ensstat" YMD=${PDY} HH=${cyc} declare_from_tmpl -rx \ + COMOUT_ATMOS_HISTORY_STAT:COM_ATMOS_HISTORY_TMPL +if [[ ! -d "${COMOUT_ATMOS_HISTORY_STAT}" ]]; then mkdir -p "${COMOUT_ATMOS_HISTORY_STAT}"; fi for fhr in $(seq $FHMIN $FHOUT $FHMAX); do fhrchar=$(printf %03i $fhr) - ${NLN} "${COM_ATMOS_HISTORY_STAT}/${PREFIX}sfcf${fhrchar}.ensmean.nc" "sfcf${fhrchar}.ensmean" - ${NLN} "${COM_ATMOS_HISTORY_STAT}/${PREFIX}atmf${fhrchar}.ensmean.nc" "atmf${fhrchar}.ensmean" + ${NLN} "${COMOUT_ATMOS_HISTORY_STAT}/${PREFIX}sfcf${fhrchar}.ensmean.nc" "sfcf${fhrchar}.ensmean" + ${NLN} "${COMOUT_ATMOS_HISTORY_STAT}/${PREFIX}atmf${fhrchar}.ensmean.nc" "atmf${fhrchar}.ensmean" if [ $SMOOTH_ENKF = "YES" ]; then for imem in $(seq 1 $NMEM_ENS); do memchar="mem"$(printf %03i "${imem}") - MEMDIR="${memchar}" YMD=${PDY} HH=${cyc} declare_from_tmpl -x COM_ATMOS_HISTORY - ${NLN} "${COM_ATMOS_HISTORY}/${PREFIX}atmf${fhrchar}${ENKF_SUFFIX}.nc" "atmf${fhrchar}${ENKF_SUFFIX}_${memchar}" + MEMDIR="${memchar}" YMD=${PDY} HH=${cyc} declare_from_tmpl -x \ + COMIN_ATMOS_HISTORY:COM_ATMOS_HISTORY_TMPL + ${NLN} "${COMIN_ATMOS_HISTORY}/${PREFIX}atmf${fhrchar}${ENKF_SUFFIX}.nc" "atmf${fhrchar}${ENKF_SUFFIX}_${memchar}" done fi - [[ $ENKF_SPREAD = "YES" ]] && ${NLN} "${COM_ATMOS_HISTORY_STAT}/${PREFIX}atmf${fhrchar}.ensspread.nc" "atmf${fhrchar}.ensspread" + [[ $ENKF_SPREAD = "YES" ]] && ${NLN} "${COMOUT_ATMOS_HISTORY_STAT}/${PREFIX}atmf${fhrchar}.ensspread.nc" "atmf${fhrchar}.ensspread" done ################################################################################ @@ -145,7 +148,7 @@ if [ $SENDDBN = "YES" ]; then fhrchar=$(printf %03i $fhr) if [ $(expr $fhr % 3) -eq 0 ]; then if [ -s ./sfcf${fhrchar}.ensmean ]; then - ${DBNROOT}/bin/dbn_alert "MODEL" "GFS_ENKF" "${job}" "${COM_ATMOS_HISTORY_STAT}/${PREFIX}sfcf${fhrchar}.ensmean.nc" + ${DBNROOT}/bin/dbn_alert "MODEL" "GFS_ENKF" "${job}" "${COMOUT_ATMOS_HISTORY_STAT}/${PREFIX}sfcf${fhrchar}.ensmean.nc" fi fi done From 3209bea5f089986a4c1656c20cec36c61cc7619e Mon Sep 17 00:00:00 2001 From: CatherineThomas-NOAA <59020064+CatherineThomas-NOAA@users.noreply.github.com> Date: Fri, 15 Nov 2024 17:37:39 -0500 Subject: [PATCH 08/20] Enable tapering of atm ens perts at the model top (#3097) This commit turns on the tapering of atmospheric ensemble perturbations at the model top in the EnKF to reduce the upper layer ensemble spread. Resolves #3096 --------- Co-authored-by: Rahul Mahajan --- parm/config/gfs/config.eupd | 2 +- scripts/exgdas_enkf_update.sh | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/parm/config/gfs/config.eupd b/parm/config/gfs/config.eupd index 2ff48240ae..7b0c8994c2 100644 --- a/parm/config/gfs/config.eupd +++ b/parm/config/gfs/config.eupd @@ -28,7 +28,7 @@ export lnsigcutoff=2.75 # ignored if modelspace_vloc=.true. export lobsdiag_forenkf=".true." # use jacobian. must be .true. if modelspace_vloc=".true." # need to specify .true. setting since config.anal sets to .false. - +export taperanalperts=".true." export NAM_ENKF="smoothparm=35," echo "END: config.eupd" diff --git a/scripts/exgdas_enkf_update.sh b/scripts/exgdas_enkf_update.sh index e924274d39..752cb07a6b 100755 --- a/scripts/exgdas_enkf_update.sh +++ b/scripts/exgdas_enkf_update.sh @@ -77,6 +77,7 @@ write_spread_diag=${write_spread_diag:-".false."} cnvw_option=${cnvw_option:-".false."} netcdf_diag=${netcdf_diag:-".true."} modelspace_vloc=${modelspace_vloc:-".false."} # if true, 'vlocal_eig.dat' is needed +taperanalperts=${taperanalperts:-".false."} IAUFHRS_ENKF=${IAUFHRS_ENKF:-6} NMEM_ENS_MAX=${NMEM_ENS:-80} if [ "${RUN}" = "enkfgfs" ]; then @@ -287,7 +288,7 @@ cat > enkf.nml << EOFnml univaroz=.false.,adp_anglebc=.true.,angord=4,use_edges=.false.,emiss_bc=.true., letkf_flag=${letkf_flag},nobsl_max=${nobsl_max},denkf=${denkf},getkf=${getkf}., nhr_anal=${IAUFHRS_ENKF},nhr_state=${IAUFHRS_ENKF}, - lobsdiag_forenkf=$lobsdiag_forenkf, + lobsdiag_forenkf=${lobsdiag_forenkf},taperanalperts=${taperanalperts}, write_spread_diag=$write_spread_diag, modelspace_vloc=$modelspace_vloc, use_correlated_oberrs=${use_correlated_oberrs}, From 7ff942eb3e6749b95ff40773b20109258a33f17f Mon Sep 17 00:00:00 2001 From: DavidNew-NOAA <134300700+DavidNew-NOAA@users.noreply.github.com> Date: Tue, 19 Nov 2024 06:12:19 -0500 Subject: [PATCH 09/20] JCB-based obs+bias staging, Jedi class updates, and marine B-matrix refactoring (#2992) This PR is a companion to GDASApp PR NOAA-EMC/GDASApp#1312 (merged) and NOAA-EMC/jcb-gdas#31 (merged). This PR does three things: 1. It changes the observation and bias staging for the atmospheric analysis tasks to use JCB templates instead of reading the full JEDI input configuration dictionary in order to construct a list of files to stage. This is cleaner and places fewer constraints on how to initialize the analysis. 2. The ```Jedi``` constructor now takes as input a dictionary that is essentially subset of the ```task_config``` dictionary. This makes the code clearer and less opaque and makes debugging easier. Each dictionary is constructed from a YAML file with configuration parameters for each JEDI application that is run. 3. All JEDI applications and their input YAMLs are now initialized in the initialize job of the ```AtmAnalysis``` and ```AtmEnsAnalysis```. Before, in the ```atmensanl*``` jobs for example, the LETKF solver was initialized in the ```atmensanlinit```cjob, but the LETKF solver and FV3 increment converter were both initialized and executed in the ```atmensanlobs``` and ```atmensanlfv3inc``` jobs respectively. This makes more sense in terms of resource allocation. Addendum: I'm now rolling in the refactoring of the marine B-matrix task into this PR. That makes it also a companion of NOAA-EMC/GDASApp#1346 and NOAA-EMC/jcb-gdas#36. These new changes introduce the ```Jedi``` class and JCB into the marine B-matrix job. Partially resolvesNOAA-EMC/GDASApp#1296 --------- Co-authored-by: RussTreadon-NOAA Co-authored-by: Rahul Mahajan --- env/HERCULES.env | 7 +- env/WCOSS2.env | 10 +- parm/config/gfs/config.atmanl | 7 +- parm/config/gfs/config.atmanlfv3inc | 3 - parm/config/gfs/config.atmensanl | 13 +- parm/config/gfs/config.atmensanlfv3inc | 3 - parm/config/gfs/config.atmensanlobs | 2 - parm/config/gfs/config.atmensanlsol | 2 - parm/config/gfs/config.marineanl | 2 + parm/config/gfs/config.marineanlletkf | 2 +- parm/config/gfs/config.marinebmat | 8 - parm/config/gfs/config.resources.ORION | 3 +- parm/config/gfs/yaml/defaults.yaml | 9 +- parm/gdas/atmanl_jedi_config.yaml.j2 | 13 + parm/gdas/atmensanl_jedi_config.yaml.j2 | 27 ++ parm/gdas/soca_bmat_jedi_config.yaml.j2 | 42 ++ .../exglobal_atm_analysis_fv3_increment.py | 9 +- scripts/exglobal_atm_analysis_initialize.py | 9 +- scripts/exglobal_atm_analysis_variational.py | 8 +- .../exglobal_atmens_analysis_fv3_increment.py | 9 +- .../exglobal_atmens_analysis_initialize.py | 12 +- scripts/exglobal_atmens_analysis_letkf.py | 11 +- scripts/exglobal_atmens_analysis_obs.py | 10 +- scripts/exglobal_atmens_analysis_sol.py | 11 +- sorc/gdas.cd | 2 +- ush/python/pygfs/jedi/jedi.py | 440 +++++++++--------- ush/python/pygfs/task/atm_analysis.py | 102 ++-- ush/python/pygfs/task/atmens_analysis.py | 107 ++--- ush/python/pygfs/task/marine_analysis.py | 7 +- ush/python/pygfs/task/marine_bmat.py | 240 ++++------ versions/fix.ver | 2 +- 31 files changed, 547 insertions(+), 585 deletions(-) create mode 100644 parm/gdas/atmanl_jedi_config.yaml.j2 create mode 100644 parm/gdas/atmensanl_jedi_config.yaml.j2 create mode 100644 parm/gdas/soca_bmat_jedi_config.yaml.j2 diff --git a/env/HERCULES.env b/env/HERCULES.env index 15e3928f08..fccc2f87a5 100755 --- a/env/HERCULES.env +++ b/env/HERCULES.env @@ -145,7 +145,7 @@ case ${step} in export NTHREADS_OCNANALECEN=${threads_per_task_ocnanalecen:-${max_threads_per_task}} [[ ${NTHREADS_OCNANALECEN} -gt ${max_threads_per_task} ]] && export NTHREADS_OCNANALECEN=${max_threads_per_task} export APRUN_OCNANALECEN="${launcher} -n ${ntasks_ocnanalecen} --cpus-per-task=${NTHREADS_OCNANALECEN}" -;; + ;; "marineanlchkpt") export APRUNCFP="${launcher} -n \$ncmd ${mpmd_opt}" @@ -153,6 +153,11 @@ case ${step} in export NTHREADS_OCNANAL=${NTHREADSmax} export APRUN_MARINEANLCHKPT="${APRUN_default} --cpus-per-task=${NTHREADS_OCNANAL}" ;; + "marineanlletkf") + + export NTHREADS_MARINEANLLETKF=${NTHREADSmax} + export APRUN_MARINEANLLETKF="${APRUN_default}" + ;; "anal" | "analcalc") export MKL_NUM_THREADS=4 diff --git a/env/WCOSS2.env b/env/WCOSS2.env index fff8f7b096..27001bebd7 100755 --- a/env/WCOSS2.env +++ b/env/WCOSS2.env @@ -107,17 +107,15 @@ elif [[ "${step}" = "marinebmat" ]]; then export APRUNCFP="${launcher} -n \$ncmd --multi-prog" export APRUN_MARINEBMAT="${APRUN_default}" -elif [[ "${step}" = "ocnanalrun" ]]; then +elif [[ "${step}" = "marineanlvar" ]]; then export APRUNCFP="${launcher} -n \$ncmd --multi-prog" + export APRUN_MARINEANLVAR="${APRUN_default}" - export APRUN_OCNANAL="${APRUN_default}" - -elif [[ "${step}" = "ocnanalchkpt" ]]; then +elif [[ "${step}" = "marineanlchkpt" ]]; then export APRUNCFP="${launcher} -n \$ncmd --multi-prog" - - export APRUN_OCNANAL="${APRUN_default}" + export APRUN_MARINEANLCHKPT="${APRUN_default}" elif [[ "${step}" = "ocnanalecen" ]]; then diff --git a/parm/config/gfs/config.atmanl b/parm/config/gfs/config.atmanl index 9a06088ecc..1d700a479c 100644 --- a/parm/config/gfs/config.atmanl +++ b/parm/config/gfs/config.atmanl @@ -5,8 +5,7 @@ echo "BEGIN: config.atmanl" -export JCB_BASE_YAML="${PARMgfs}/gdas/atm/jcb-base.yaml.j2" -export JCB_ALGO_YAML=@JCB_ALGO_YAML@ +export JCB_ALGO_YAML_VAR=@JCB_ALGO_YAML_VAR@ export STATICB_TYPE=@STATICB_TYPE@ export LOCALIZATION_TYPE="bump" @@ -23,6 +22,8 @@ fi export CRTM_FIX_YAML="${PARMgfs}/gdas/atm_crtm_coeff.yaml.j2" export JEDI_FIX_YAML="${PARMgfs}/gdas/atm_jedi_fix.yaml.j2" + +export JEDI_CONFIG_YAML="${PARMgfs}/gdas/atmanl_jedi_config.yaml.j2" export VAR_BKG_STAGING_YAML="${PARMgfs}/gdas/staging/atm_var_bkg.yaml.j2" export BERROR_STAGING_YAML="${PARMgfs}/gdas/staging/atm_berror_${STATICB_TYPE}.yaml.j2" export FV3ENS_STAGING_YAML="${PARMgfs}/gdas/staging/atm_var_fv3ens.yaml.j2" @@ -33,6 +34,4 @@ export layout_y_atmanl=@LAYOUT_Y_ATMANL@ export io_layout_x=@IO_LAYOUT_X@ export io_layout_y=@IO_LAYOUT_Y@ -export JEDIEXE=${EXECgfs}/gdas.x - echo "END: config.atmanl" diff --git a/parm/config/gfs/config.atmanlfv3inc b/parm/config/gfs/config.atmanlfv3inc index ab7efa3a60..4e7714628e 100644 --- a/parm/config/gfs/config.atmanlfv3inc +++ b/parm/config/gfs/config.atmanlfv3inc @@ -8,7 +8,4 @@ echo "BEGIN: config.atmanlfv3inc" # Get task specific resources . "${EXPDIR}/config.resources" atmanlfv3inc -export JCB_ALGO=fv3jedi_fv3inc_variational -export JEDIEXE=${EXECgfs}/fv3jedi_fv3inc.x - echo "END: config.atmanlfv3inc" diff --git a/parm/config/gfs/config.atmensanl b/parm/config/gfs/config.atmensanl index f5a1278248..2726f655bd 100644 --- a/parm/config/gfs/config.atmensanl +++ b/parm/config/gfs/config.atmensanl @@ -5,17 +5,16 @@ echo "BEGIN: config.atmensanl" -export JCB_BASE_YAML="${PARMgfs}/gdas/atm/jcb-base.yaml.j2" -if [[ ${lobsdiag_forenkf} = ".false." ]] ; then - export JCB_ALGO_YAML=@JCB_ALGO_YAML_LETKF@ -else - export JCB_ALGO_YAML=@JCB_ALGO_YAML_OBS@ -fi +export JCB_ALGO_YAML_LETKF=@JCB_ALGO_YAML_LETKF@ +export JCB_ALGO_YAML_OBS=@JCB_ALGO_YAML_OBS@ +export JCB_ALGO_YAML_SOL=@JCB_ALGO_YAML_SOL@ export INTERP_METHOD='barycentric' export CRTM_FIX_YAML="${PARMgfs}/gdas/atm_crtm_coeff.yaml.j2" export JEDI_FIX_YAML="${PARMgfs}/gdas/atm_jedi_fix.yaml.j2" + +export JEDI_CONFIG_YAML="${PARMgfs}/gdas/atmensanl_jedi_config.yaml.j2" export LGETKF_BKG_STAGING_YAML="${PARMgfs}/gdas/staging/atm_lgetkf_bkg.yaml.j2" export layout_x_atmensanl=@LAYOUT_X_ATMENSANL@ @@ -24,6 +23,4 @@ export layout_y_atmensanl=@LAYOUT_Y_ATMENSANL@ export io_layout_x=@IO_LAYOUT_X@ export io_layout_y=@IO_LAYOUT_Y@ -export JEDIEXE=${EXECgfs}/gdas.x - echo "END: config.atmensanl" diff --git a/parm/config/gfs/config.atmensanlfv3inc b/parm/config/gfs/config.atmensanlfv3inc index 2dc73f3f6e..fe3337e5a2 100644 --- a/parm/config/gfs/config.atmensanlfv3inc +++ b/parm/config/gfs/config.atmensanlfv3inc @@ -8,7 +8,4 @@ echo "BEGIN: config.atmensanlfv3inc" # Get task specific resources . "${EXPDIR}/config.resources" atmensanlfv3inc -export JCB_ALGO=fv3jedi_fv3inc_lgetkf -export JEDIEXE=${EXECgfs}/fv3jedi_fv3inc.x - echo "END: config.atmensanlfv3inc" diff --git a/parm/config/gfs/config.atmensanlobs b/parm/config/gfs/config.atmensanlobs index dff3fa3095..c7e050b009 100644 --- a/parm/config/gfs/config.atmensanlobs +++ b/parm/config/gfs/config.atmensanlobs @@ -8,6 +8,4 @@ echo "BEGIN: config.atmensanlobs" # Get task specific resources . "${EXPDIR}/config.resources" atmensanlobs -export JCB_ALGO_YAML=@JCB_ALGO_YAML@ - echo "END: config.atmensanlobs" diff --git a/parm/config/gfs/config.atmensanlsol b/parm/config/gfs/config.atmensanlsol index dac161373b..8ef905d1bd 100644 --- a/parm/config/gfs/config.atmensanlsol +++ b/parm/config/gfs/config.atmensanlsol @@ -8,6 +8,4 @@ echo "BEGIN: config.atmensanlsol" # Get task specific resources . "${EXPDIR}/config.resources" atmensanlsol -export JCB_ALGO_YAML=@JCB_ALGO_YAML@ - echo "END: config.atmensanlsol" diff --git a/parm/config/gfs/config.marineanl b/parm/config/gfs/config.marineanl index a19fc015e2..0b55fa447d 100644 --- a/parm/config/gfs/config.marineanl +++ b/parm/config/gfs/config.marineanl @@ -5,6 +5,8 @@ echo "BEGIN: config.marineanl" +export JEDI_CONFIG_YAML="${PARMgfs}/gdas/soca_bmat_jedi_config.yaml.j2" + export MARINE_OBS_YAML_DIR="${PARMgfs}/gdas/soca/obs/config" export MARINE_OBS_LIST_YAML=@SOCA_OBS_LIST@ export SOCA_INPUT_FIX_DIR=@SOCA_INPUT_FIX_DIR@ diff --git a/parm/config/gfs/config.marineanlletkf b/parm/config/gfs/config.marineanlletkf index 8b84af4eaa..93f03f80ff 100644 --- a/parm/config/gfs/config.marineanlletkf +++ b/parm/config/gfs/config.marineanlletkf @@ -14,7 +14,7 @@ export MARINE_LETKF_STAGE_YAML_TMPL="${PARMgfs}/gdas/soca/letkf/letkf_stage.yaml export MARINE_LETKF_SAVE_YAML_TMPL="${PARMgfs}/gdas/soca/letkf/letkf_save.yaml.j2" export GRIDGEN_EXEC="${EXECgfs}/gdas_soca_gridgen.x" -export GRIDGEN_YAML="${PARMgfs}/gdas/soca/gridgen/gridgen.yaml" +export GRIDGEN_YAML="${HOMEgfs}/sorc/gdas.cd/parm/jcb-gdas/algorithm/marine/soca_gridgen.yaml.j2" export DIST_HALO_SIZE=500000 echo "END: config.marineanlletkf" diff --git a/parm/config/gfs/config.marinebmat b/parm/config/gfs/config.marinebmat index 00352737d0..d88739dced 100644 --- a/parm/config/gfs/config.marinebmat +++ b/parm/config/gfs/config.marinebmat @@ -8,12 +8,4 @@ echo "BEGIN: config.marinebmat" # Get task specific resources . "${EXPDIR}/config.resources" marinebmat -export BERROR_DIAGB_YAML="${PARMgfs}/gdas/soca/berror/soca_diagb.yaml.j2" -export BERROR_VTSCALES_YAML="${PARMgfs}/gdas/soca/berror/soca_vtscales.yaml.j2" -export BERROR_DIFFV_YAML="${PARMgfs}/gdas/soca/berror/soca_parameters_diffusion_vt.yaml.j2" -export BERROR_HZSCALES_YAML="${PARMgfs}/gdas/soca/berror/soca_setcorscales.yaml" -export BERROR_DIFFH_YAML="${PARMgfs}/gdas/soca/berror/soca_parameters_diffusion_hz.yaml.j2" -export BERROR_ENS_RECENTER_YAML="${PARMgfs}/gdas/soca/berror/soca_ensb.yaml.j2" -export BERROR_HYB_WEIGHTS_YAML="${PARMgfs}/gdas/soca/berror/soca_ensweights.yaml.j2" - echo "END: config.marinebmat" diff --git a/parm/config/gfs/config.resources.ORION b/parm/config/gfs/config.resources.ORION index 461b6f14f7..fceb8feeb1 100644 --- a/parm/config/gfs/config.resources.ORION +++ b/parm/config/gfs/config.resources.ORION @@ -25,7 +25,8 @@ case ${step} in ;; "atmanlvar") # Run on 8 nodes for memory requirement - export tasks_per_node=8 + export tasks_per_node_gdas=8 + export tasks_per_node_gfs=8 export walltime="00:45:00" ;; "atmensanlobs") diff --git a/parm/config/gfs/yaml/defaults.yaml b/parm/config/gfs/yaml/defaults.yaml index 78caf46f5d..d8cf76a47b 100644 --- a/parm/config/gfs/yaml/defaults.yaml +++ b/parm/config/gfs/yaml/defaults.yaml @@ -23,7 +23,7 @@ base: FHMAX_ENKF_GFS: 12 atmanl: - JCB_ALGO_YAML: "${PARMgfs}/gdas/atm/jcb-prototype_3dvar.yaml.j2" + JCB_ALGO_YAML_VAR: "${PARMgfs}/gdas/atm/jcb-prototype_3dvar.yaml.j2" STATICB_TYPE: "gsibec" LAYOUT_X_ATMANL: 8 LAYOUT_Y_ATMANL: 8 @@ -33,16 +33,11 @@ atmanl: atmensanl: JCB_ALGO_YAML_LETKF: "${PARMgfs}/gdas/atm/jcb-prototype_lgetkf.yaml.j2" JCB_ALGO_YAML_OBS: "${PARMgfs}/gdas/atm/jcb-prototype_lgetkf_observer.yaml.j2" + JCB_ALGO_YAML_SOL: "${PARMgfs}/gdas/atm/jcb-prototype_lgetkf_solver.yaml.j2" LAYOUT_X_ATMENSANL: 8 LAYOUT_Y_ATMENSANL: 8 IO_LAYOUT_X: 1 IO_LAYOUT_Y: 1 - -atmensanlobs: - JCB_ALGO_YAML: "${PARMgfs}/gdas/atm/jcb-prototype_lgetkf_observer.yaml.j2" - -atmensanlsol: - JCB_ALGO_YAML: "${PARMgfs}/gdas/atm/jcb-prototype_lgetkf_solver.yaml.j2" aeroanl: IO_LAYOUT_X: 1 diff --git a/parm/gdas/atmanl_jedi_config.yaml.j2 b/parm/gdas/atmanl_jedi_config.yaml.j2 new file mode 100644 index 0000000000..4046ba0931 --- /dev/null +++ b/parm/gdas/atmanl_jedi_config.yaml.j2 @@ -0,0 +1,13 @@ +atmanlvar: + rundir: '{{ DATA }}' + exe_src: '{{ EXECgfs }}/gdas.x' + mpi_cmd: '{{ APRUN_ATMANLVAR }}' + jedi_args: ['fv3jedi', 'variational'] + jcb_base_yaml: '{{ PARMgfs }}/gdas/atm/jcb-base.yaml.j2' + jcb_algo_yaml: '{{ JCB_ALGO_YAML_VAR }}' +atmanlfv3inc: + rundir: '{{ DATA }}' + exe_src: '{{ EXECgfs }}/fv3jedi_fv3inc.x' + mpi_cmd: '{{ APRUN_ATMANLFV3INC }}' + jcb_base_yaml: '{{ PARMgfs }}/gdas/atm/jcb-base.yaml.j2' + jcb_algo: fv3jedi_fv3inc_variational diff --git a/parm/gdas/atmensanl_jedi_config.yaml.j2 b/parm/gdas/atmensanl_jedi_config.yaml.j2 new file mode 100644 index 0000000000..9ab2ec6ace --- /dev/null +++ b/parm/gdas/atmensanl_jedi_config.yaml.j2 @@ -0,0 +1,27 @@ +atmensanlobs: + rundir: '{{ DATA }}' + exe_src: '{{ EXECgfs }}/gdas.x' + mpi_cmd: '{{ APRUN_ATMENSANLOBS }}' + jedi_args: ['fv3jedi', 'localensembleda'] + jcb_base_yaml: '{{ PARMgfs }}/gdas/atm/jcb-base.yaml.j2' + jcb_algo_yaml: '{{ JCB_ALGO_YAML_OBS }}' +atmensanlsol: + rundir: '{{ DATA }}' + exe_src: '{{ EXECgfs }}/gdas.x' + mpi_cmd: '{{ APRUN_ATMENSANLSOL }}' + jedi_args: ['fv3jedi', 'localensembleda'] + jcb_base_yaml: '{{ PARMgfs }}/gdas/atm/jcb-base.yaml.j2' + jcb_algo_yaml: '{{ JCB_ALGO_YAML_SOL }}' +atmensanlfv3inc: + rundir: '{{ DATA }}' + exe_src: '{{ EXECgfs }}/fv3jedi_fv3inc.x' + mpi_cmd: '{{ APRUN_ATMENSANLFV3INC }}' + jcb_base_yaml: '{{ PARMgfs }}/gdas/atm/jcb-base.yaml.j2' + jcb_algo: fv3jedi_fv3inc_lgetkf +atmensanlletkf: + rundir: '{{ DATA }}' + exe_src: '{{ EXECgfs }}/gdas.x' + mpi_cmd: '{{ APRUN_ATMENSANLLETKF }}' + jedi_args: ['fv3jedi', 'localensembleda'] + jcb_base_yaml: '{{ PARMgfs }}/gdas/atm/jcb-base.yaml.j2' + jcb_algo_yaml: '{{ JCB_ALGO_YAML_LETKF }}' diff --git a/parm/gdas/soca_bmat_jedi_config.yaml.j2 b/parm/gdas/soca_bmat_jedi_config.yaml.j2 new file mode 100644 index 0000000000..4e476d3117 --- /dev/null +++ b/parm/gdas/soca_bmat_jedi_config.yaml.j2 @@ -0,0 +1,42 @@ +gridgen: + rundir: '{{ DATA }}' + exe_src: '{{ EXECgfs }}/gdas_soca_gridgen.x' + mpi_cmd: '{{ APRUN_MARINEBMAT }}' + jcb_base_yaml: '{{ PARMgfs }}/gdas/soca/marine-jcb-base.yaml' + jcb_algo: soca_gridgen +soca_diagb: + rundir: '{{ DATA }}' + exe_src: '{{ EXECgfs }}/gdas_soca_diagb.x' + mpi_cmd: '{{ APRUN_MARINEBMAT }}' + jcb_base_yaml: '{{ PARMgfs }}/gdas/soca/marine-jcb-base.yaml' + jcb_algo: soca_diagb +soca_parameters_diffusion_vt: + rundir: '{{ DATA }}' + exe_src: '{{ EXECgfs }}/gdas_soca_error_covariance_toolbox.x' + mpi_cmd: '{{ APRUN_MARINEBMAT }}' + jcb_base_yaml: '{{ PARMgfs }}/gdas/soca/marine-jcb-base.yaml' + jcb_algo: soca_parameters_diffusion_vt +soca_setcorscales: + rundir: '{{ DATA }}' + exe_src: '{{ EXECgfs }}/gdas_soca_setcorscales.x' + mpi_cmd: '{{ APRUN_MARINEBMAT }}' + jcb_base_yaml: '{{ PARMgfs }}/gdas/soca/marine-jcb-base.yaml' + jcb_algo: soca_setcorscales +soca_parameters_diffusion_hz: + rundir: '{{ DATA }}' + exe_src: '{{ EXECgfs }}/gdas_soca_error_covariance_toolbox.x' + mpi_cmd: '{{ APRUN_MARINEBMAT }}' + jcb_base_yaml: '{{ PARMgfs }}/gdas/soca/marine-jcb-base.yaml' + jcb_algo: soca_parameters_diffusion_hz +soca_ensb: + rundir: '{{ DATA }}' + exe_src: '{{ EXECgfs }}/gdas_ens_handler.x' + mpi_cmd: '{{ APRUN_MARINEBMAT }}' + jcb_base_yaml: '{{ PARMgfs }}/gdas/soca/marine-jcb-base.yaml' + jcb_algo: soca_ensb +soca_ensweights: + rundir: '{{ DATA }}' + exe_src: '{{ EXECgfs }}/gdas_socahybridweights.x' + mpi_cmd: '{{ APRUN_MARINEBMAT }}' + jcb_base_yaml: '{{ PARMgfs }}/gdas/soca/marine-jcb-base.yaml' + jcb_algo: soca_ensweights diff --git a/scripts/exglobal_atm_analysis_fv3_increment.py b/scripts/exglobal_atm_analysis_fv3_increment.py index 72413ddbd4..c5a3e70943 100755 --- a/scripts/exglobal_atm_analysis_fv3_increment.py +++ b/scripts/exglobal_atm_analysis_fv3_increment.py @@ -1,8 +1,8 @@ #!/usr/bin/env python3 # exglobal_atm_analysis_fv3_increment.py # This script creates an AtmAnalysis object -# and runs the initialize_fv3inc and execute methods -# which convert the JEDI increment into an FV3 increment +# and runs the execute method which runs the JEDI +# FV3 increment converter import os from wxflow import Logger, cast_strdict_as_dtypedict @@ -18,8 +18,7 @@ config = cast_strdict_as_dtypedict(os.environ) # Instantiate the atm analysis object - AtmAnl = AtmAnalysis(config, 'atmanlfv3inc') + AtmAnl = AtmAnalysis(config) # Initialize and execute FV3 increment converter - AtmAnl.initialize_jedi() - AtmAnl.execute(config.APRUN_ATMANLFV3INC) + AtmAnl.execute('atmanlfv3inc') diff --git a/scripts/exglobal_atm_analysis_initialize.py b/scripts/exglobal_atm_analysis_initialize.py index 9deae07bb3..749d320111 100755 --- a/scripts/exglobal_atm_analysis_initialize.py +++ b/scripts/exglobal_atm_analysis_initialize.py @@ -2,8 +2,8 @@ # exglobal_atm_analysis_initialize.py # This script creates an AtmAnalysis class # and runs the initialize method -# which create and stage the runtime directory -# and create the YAML configuration +# which creates and stages the runtime directory +# and creates the YAML configuration # for a global atm variational analysis import os @@ -20,8 +20,7 @@ config = cast_strdict_as_dtypedict(os.environ) # Instantiate the atm analysis task - AtmAnl = AtmAnalysis(config, 'atmanlvar') + AtmAnl = AtmAnalysis(config) # Initialize JEDI variational analysis - AtmAnl.initialize_jedi() - AtmAnl.initialize_analysis() + AtmAnl.initialize() diff --git a/scripts/exglobal_atm_analysis_variational.py b/scripts/exglobal_atm_analysis_variational.py index 8359532069..9ad121f76c 100755 --- a/scripts/exglobal_atm_analysis_variational.py +++ b/scripts/exglobal_atm_analysis_variational.py @@ -1,8 +1,8 @@ #!/usr/bin/env python3 # exglobal_atm_analysis_variational.py # This script creates an AtmAnalysis object -# and runs the execute method -# which executes the global atm variational analysis +# and runs the execute method which runs the JEDI +# variational analysis application import os from wxflow import Logger, cast_strdict_as_dtypedict @@ -18,7 +18,7 @@ config = cast_strdict_as_dtypedict(os.environ) # Instantiate the atm analysis task - AtmAnl = AtmAnalysis(config, 'atmanlvar') + AtmAnl = AtmAnalysis(config) # Execute JEDI variational analysis - AtmAnl.execute(config.APRUN_ATMANLVAR, ['fv3jedi', 'variational']) + AtmAnl.execute('atmanlvar') diff --git a/scripts/exglobal_atmens_analysis_fv3_increment.py b/scripts/exglobal_atmens_analysis_fv3_increment.py index 48eb6a6a1e..4506b28033 100755 --- a/scripts/exglobal_atmens_analysis_fv3_increment.py +++ b/scripts/exglobal_atmens_analysis_fv3_increment.py @@ -1,8 +1,8 @@ #!/usr/bin/env python3 # exglobal_atmens_analysis_fv3_increment.py # This script creates an AtmEnsAnalysis object -# and runs the initialize_fv3inc and execute methods -# which convert the JEDI increment into an FV3 increment +# and runs the execute method which runs the JEDI +# FV3 increment converter application import os from wxflow import Logger, cast_strdict_as_dtypedict @@ -18,8 +18,7 @@ config = cast_strdict_as_dtypedict(os.environ) # Instantiate the atmens analysis object - AtmEnsAnl = AtmEnsAnalysis(config, 'atmensanlfv3inc') + AtmEnsAnl = AtmEnsAnalysis(config) # Initialize and execute JEDI FV3 increment converter - AtmEnsAnl.initialize_jedi() - AtmEnsAnl.execute(config.APRUN_ATMENSANLFV3INC) + AtmEnsAnl.execute('atmensanlfv3inc') diff --git a/scripts/exglobal_atmens_analysis_initialize.py b/scripts/exglobal_atmens_analysis_initialize.py index 326fe80628..124e755594 100755 --- a/scripts/exglobal_atmens_analysis_initialize.py +++ b/scripts/exglobal_atmens_analysis_initialize.py @@ -2,8 +2,8 @@ # exglobal_atmens_analysis_initialize.py # This script creates an AtmEnsAnalysis class # and runs the initialize method -# which create and stage the runtime directory -# and create the YAML configuration +# which creates and stages the runtime directory +# and creates the YAML configuration # for a global atm local ensemble analysis import os @@ -20,11 +20,7 @@ config = cast_strdict_as_dtypedict(os.environ) # Instantiate the atmens analysis task - if not config.lobsdiag_forenkf: - AtmEnsAnl = AtmEnsAnalysis(config, 'atmensanlletkf') - else: - AtmEnsAnl = AtmEnsAnalysis(config, 'atmensanlobs') + AtmEnsAnl = AtmEnsAnalysis(config) # Initialize JEDI ensemble DA analysis - AtmEnsAnl.initialize_jedi() - AtmEnsAnl.initialize_analysis() + AtmEnsAnl.initialize() diff --git a/scripts/exglobal_atmens_analysis_letkf.py b/scripts/exglobal_atmens_analysis_letkf.py index 45b06524fe..dea9ace5b8 100755 --- a/scripts/exglobal_atmens_analysis_letkf.py +++ b/scripts/exglobal_atmens_analysis_letkf.py @@ -1,8 +1,8 @@ #!/usr/bin/env python3 # exglobal_atmens_analysis_letkf.py # This script creates an AtmEnsAnalysis object -# and runs the execute method which executes -# the global atm local ensemble analysis +# and initializes and runs the full JEDI LETKF +# application import os from wxflow import Logger, cast_strdict_as_dtypedict @@ -18,7 +18,10 @@ config = cast_strdict_as_dtypedict(os.environ) # Instantiate the atmens analysis task - AtmEnsAnl = AtmEnsAnalysis(config, 'atmensanlletkf') + AtmEnsAnl = AtmEnsAnalysis(config) + + # Initalize JEDI full ensemble DA application + AtmEnsAnl.initialize_letkf() # Execute the JEDI ensemble DA analysis - AtmEnsAnl.execute(config.APRUN_ATMENSANLLETKF, ['fv3jedi', 'localensembleda']) + AtmEnsAnl.execute('atmensanlletkf') diff --git a/scripts/exglobal_atmens_analysis_obs.py b/scripts/exglobal_atmens_analysis_obs.py index c701f8cb4e..b09c67703f 100755 --- a/scripts/exglobal_atmens_analysis_obs.py +++ b/scripts/exglobal_atmens_analysis_obs.py @@ -1,8 +1,8 @@ #!/usr/bin/env python3 # exglobal_atmens_analysis_obs.py # This script creates an AtmEnsAnalysis object -# and runs the execute method -# which executes the global atm local ensemble analysis in observer mode +# and runs the execute method which runs the JEDI LETKF +# application in observer mode import os from wxflow import Logger, cast_strdict_as_dtypedict @@ -18,7 +18,7 @@ config = cast_strdict_as_dtypedict(os.environ) # Instantiate the atmens analysis task - AtmEnsAnl = AtmEnsAnalysis(config, 'atmensanlobs') + AtmEnsAnl = AtmEnsAnalysis(config) - # Initialize and execute JEDI ensembler DA analysis in observer mode - AtmEnsAnl.execute(config.APRUN_ATMENSANLOBS, ['fv3jedi', 'localensembleda']) + # Execute JEDI ensembler DA analysis in observer mode + AtmEnsAnl.execute('atmensanlobs') diff --git a/scripts/exglobal_atmens_analysis_sol.py b/scripts/exglobal_atmens_analysis_sol.py index be78e694b1..85dc228a5a 100755 --- a/scripts/exglobal_atmens_analysis_sol.py +++ b/scripts/exglobal_atmens_analysis_sol.py @@ -1,8 +1,8 @@ #!/usr/bin/env python3 # exglobal_atmens_analysis_sol.py # This script creates an AtmEnsAnalysis object -# and runs the execute method -# which executes the global atm local ensemble analysis in solver mode +# and runs the execute method which runs the JEDI LETKF +# application in solver mode import os from wxflow import Logger, cast_strdict_as_dtypedict @@ -18,8 +18,7 @@ config = cast_strdict_as_dtypedict(os.environ) # Instantiate the atmens analysis task - AtmEnsAnl = AtmEnsAnalysis(config, 'atmensanlsol') + AtmEnsAnl = AtmEnsAnalysis(config) - # Initialize and execute JEDI ensemble DA analysis in solver mode - AtmEnsAnl.initialize_jedi() - AtmEnsAnl.execute(config.APRUN_ATMENSANLSOL, ['fv3jedi', 'localensembleda']) + # Execute JEDI ensemble DA analysis in solver mode + AtmEnsAnl.execute('atmensanlsol') diff --git a/sorc/gdas.cd b/sorc/gdas.cd index 764f58cebd..e514b92656 160000 --- a/sorc/gdas.cd +++ b/sorc/gdas.cd @@ -1 +1 @@ -Subproject commit 764f58cebdf64f3695d89538994a50183e5884d9 +Subproject commit e514b926561bfc8fa3de741876505aff74255c95 diff --git a/ush/python/pygfs/jedi/jedi.py b/ush/python/pygfs/jedi/jedi.py index 415a0a3c08..2806ba4bce 100644 --- a/ush/python/pygfs/jedi/jedi.py +++ b/ush/python/pygfs/jedi/jedi.py @@ -4,145 +4,190 @@ import tarfile from logging import getLogger from typing import List, Dict, Any, Optional +from pprint import pformat from jcb import render -from wxflow import (AttrDict, - FileHandler, +from wxflow import (AttrDict, FileHandler, Task, Executable, chdir, rm_p, - parse_j2yaml, + parse_j2yaml, save_as_yaml, logit, - Task, - Executable, WorkflowException) logger = getLogger(__name__.split('.')[-1]) +required_jedi_keys = ['rundir', 'exe_src', 'mpi_cmd'] +optional_jedi_keys = ['jedi_args', 'jcb_base_yaml', 'jcb_algo', 'jcb_algo_yaml'] + class Jedi: """ Class for initializing and executing JEDI applications """ + @logit(logger, name="Jedi") - def __init__(self, task_config: AttrDict, yaml_name: Optional[str] = None) -> None: + def __init__(self, config: Dict[str, Any]) -> None: """Constructor for JEDI objects This method will construct a Jedi object. This includes: - - save a copy of task_config for provenance - - set the default JEDI YAML and executable names - - set an empty AttrDict for the JEDI config - - set the default directory for J2-YAML templates + - create the jedi_config AttrDict and extend it with additional required entries + - save a copy of jedi_config Parameters ---------- - task_config: AttrDict - Attribute-dictionary of all configuration variables associated with a GDAS task. - yaml_name: str, optional - Name of YAML file for JEDI configuration + config: AttrDict + Attribute-dictionary of all configuration variables required for the Jedi class Returns ---------- None """ - # For provenance, save incoming task_config as a private attribute of JEDI object - self._task_config = task_config - - _exe_name = os.path.basename(task_config.JEDIEXE) - - self.exe = os.path.join(task_config.DATA, _exe_name) - if yaml_name: - self.yaml = os.path.join(task_config.DATA, yaml_name + '.yaml') - else: - self.yaml = os.path.join(task_config.DATA, os.path.splitext(_exe_name)[0] + '.yaml') - self.config = AttrDict() - self.j2tmpl_dir = os.path.join(task_config.PARMgfs, 'gdas') + # Make sure input dictionary for Jedi class constructor has the required keys + if 'yaml_name' not in config: + logger.error(f"FATAL ERROR: Key 'yaml_name' not found in config") + raise KeyError(f"FATAL ERROR: Key 'yaml_name' not found in config") + for key in required_jedi_keys: + if key not in config: + logger.error(f"FATAL ERROR: Required key '{key}' not found in config") + raise KeyError(f"FATAL ERROR: Required key '{key}' not found in config") + + # Create the configuration dictionary for JEDI object + local_dict = AttrDict( + { + 'exe': os.path.join(config.rundir, os.path.basename(config.exe_src)), + 'yaml': os.path.join(config.rundir, config.yaml_name + '.yaml'), + 'input_config': None + } + ) + self.jedi_config = AttrDict(**config, **local_dict) + + # Set optional keys in jedi_config to None if not already present + for key in optional_jedi_keys: + if key not in self.jedi_config: + self.jedi_config[key] = None + + # Save a copy of jedi_config + self._jedi_config = self.jedi_config.deepcopy() @logit(logger) - def set_config(self, task_config: AttrDict, algorithm: Optional[str] = None) -> AttrDict: - """Compile a JEDI configuration dictionary from a template file and save to a YAML file + def initialize(self, task_config: AttrDict) -> None: + """Initialize JEDI application + + This method will initialize a JEDI application. + This includes: + - generating JEDI input YAML config + - saving JEDI input YAML config to run directory + - linking the JEDI executable to run directory Parameters ---------- - task_config : AttrDict - Dictionary of all configuration variables associated with a GDAS task. - algorithm (optional) : str - Name of the algorithm used to generate the JEDI configuration dictionary. - It will override the algorithm set in the task_config.JCB_<>_YAML file. + task_config: AttrDict + Attribute-dictionary of all configuration variables associated with a GDAS task. Returns ---------- None """ - if 'JCB_BASE_YAML' in task_config.keys(): - # Step 1: Fill templates of the JCB base YAML file - jcb_config = parse_j2yaml(task_config.JCB_BASE_YAML, task_config) - - # Step 2: If algorithm is present then override the algorithm in the JEDI - # config. Otherwise, if the algorithm J2-YAML is present, fill - # its templates and merge. - if algorithm: - jcb_config['algorithm'] = algorithm - elif 'JCB_ALGO' in task_config.keys(): - jcb_config['algorithm'] = task_config.JCB_ALGO - elif 'JCB_ALGO_YAML' in task_config.keys(): - jcb_algo_config = parse_j2yaml(task_config.JCB_ALGO_YAML, task_config) - jcb_config.update(jcb_algo_config) - - # Step 3: Generate the JEDI YAML using JCB - self.config = render(jcb_config) - elif 'JEDIYAML' in task_config.keys(): - # Generate JEDI YAML without using JCB - self.config = parse_j2yaml(task_config.JEDIYAML, task_config, - searchpath=self.j2tmpl_dir) - else: - logger.exception(f"FATAL ERROR: Unable to compile JEDI configuration dictionary, ABORT!") - raise KeyError(f"FATAL ERROR: Task config must contain JCB_BASE_YAML or JEDIYAML") + # Render JEDI config dictionary + logger.info(f"Generating JEDI YAML config: {self.jedi_config.yaml}") + self.jedi_config.input_config = self.render_jcb(task_config) + logger.debug(f"JEDI config:\n{pformat(self.jedi_config.input_config)}") + + # Save JEDI config dictionary to YAML in run directory + logger.debug(f"Writing JEDI YAML config to: {self.jedi_config.yaml}") + save_as_yaml(self.jedi_config.input_config, self.jedi_config.yaml) + + # Link JEDI executable to run directory + logger.info(f"Linking JEDI executable {self.jedi_config.exe_src} to {self.jedi_config.exe}") + self.link_exe() @logit(logger) - def execute(self, task_config: AttrDict, aprun_cmd: str, jedi_args: Optional[List] = None) -> None: + def execute(self) -> None: """Execute JEDI application Parameters ---------- - task_config: AttrDict - Attribute-dictionary of all configuration variables associated with a GDAS task. - aprun_cmd: str - String comprising the run command for the JEDI executable. - jedi_args (optional): List - List of strings comprising optional input arguments for the JEDI executable. + None Returns ---------- - jedi_config: AttrDict - Attribute-dictionary of JEDI configuration rendered from a template. + None """ - chdir(task_config.DATA) + chdir(self.jedi_config.rundir) - exec_cmd = Executable(aprun_cmd) - exec_cmd.add_default_arg(self.exe) - if jedi_args: - for arg in jedi_args: + exec_cmd = Executable(self.jedi_config.mpi_cmd) + exec_cmd.add_default_arg(self.jedi_config.exe) + if self.jedi_config.jedi_args is not None: + for arg in self.jedi_config.jedi_args: exec_cmd.add_default_arg(arg) - exec_cmd.add_default_arg(self.yaml) + exec_cmd.add_default_arg(self.jedi_config.yaml) + logger.info(f"Executing {exec_cmd}") try: exec_cmd() except OSError: + logger.error(f"FATAL ERROR: Failed to execute {exec_cmd}") raise OSError(f"FATAL ERROR: Failed to execute {exec_cmd}") except Exception: + logger.error(f"FATAL ERROR: An error occurred during execution of {exec_cmd}") raise WorkflowException(f"FATAL ERROR: An error occurred during execution of {exec_cmd}") - @staticmethod @logit(logger) - def link_exe(task_config: AttrDict) -> None: + def render_jcb(self, task_config: AttrDict, algorithm: Optional[str] = None) -> AttrDict: + """Compile a JEDI configuration dictionary from a template file and save to a YAML file + + Parameters + ---------- + task_config : AttrDict + Dictionary of all configuration variables associated with a GDAS task. + algorithm (optional) : str + Name of the algorithm used to generate the JEDI configuration dictionary. + It will override the algorithm set in the jedi_config.jcb_algo_yaml file. + + Returns + ---------- + jedi_input_config: AttrDict + Attribute-dictionary of JEDI configuration rendered from a template. + """ + + # Fill JCB base YAML template and build JCB config dictionary + if self.jedi_config.jcb_base_yaml is not None: + jcb_config = parse_j2yaml(self.jedi_config.jcb_base_yaml, task_config) + else: + logger.error(f"FATAL ERROR: JCB base YAML must be specified in order to render YAML using JCB") + raise KeyError(f"FATAL ERROR: JCB base YAML must be specified in order to render YAML using JCB") + + # Add JCB algorithm YAML, if it exists, to JCB config dictionary + if self.jedi_config.jcb_algo_yaml is not None: + jcb_config.update(parse_j2yaml(self.jedi_config.jcb_algo_yaml, task_config)) + + # Set algorithm in JCB config dictionary + if algorithm is not None: + jcb_config['algorithm'] = algorithm + elif self.jedi_config.jcb_algo is not None: + jcb_config['algorithm'] = self.jedi_config.jcb_algo + elif 'algorithm' in jcb_config: + pass + else: + logger.error(f"FATAL ERROR: JCB algorithm must be specified as input to jedi.render_jcb(), " + + "in JEDI configuration dictionary as jcb_algo, or in JCB algorithm YAML") + raise Exception(f"FATAL ERROR: JCB algorithm must be specified as input to jedi.render_jcb(), " + + "in JEDI configuration dictionary as jcb_algo, or in JCB algorithm YAML") + + # Generate JEDI YAML config by rendering JCB config dictionary + jedi_input_config = render(jcb_config) + + return jedi_input_config + + @logit(logger) + def link_exe(self) -> None: """Link JEDI executable to run directory Parameters ---------- - task_config: AttrDict - Attribute-dictionary of all configuration variables associated with a GDAS task. + None Returns ---------- @@ -152,185 +197,156 @@ def link_exe(task_config: AttrDict) -> None: # TODO: linking is not permitted per EE2. # Needs work in JEDI to be able to copy the exec. [NOAA-EMC/GDASApp#1254] logger.warn("Linking is not permitted per EE2.") - exe_dest = os.path.join(task_config.DATA, os.path.basename(task_config.JEDIEXE)) - if os.path.exists(exe_dest): - rm_p(exe_dest) - os.symlink(task_config.JEDIEXE, exe_dest) + if not os.path.exists(self.jedi_config.exe): + os.symlink(self.jedi_config.exe_src, self.jedi_config.exe) + @staticmethod @logit(logger) - def get_obs_dict(self, task_config: AttrDict) -> Dict[str, Any]: - """Compile a dictionary of observation files to copy - - This method extracts 'observers' from the JEDI yaml and from that list, extracts a list of - observation files that are to be copied to the run directory - from the observation input directory + def get_jedi_dict(jedi_config_yaml: str, task_config: AttrDict, expected_block_names: Optional[list] = None): + """Get dictionary of Jedi objects from YAML specifying their configuration dictionaries Parameters ---------- - task_config: AttrDict - Attribute-dictionary of all configuration variables associated with a GDAS task. + jedi_config_yaml : str + path to YAML specifying configuration dictionaries for Jedi objects + task_config : str + attribute-dictionary of all configuration variables associated with a GDAS task + expected_block_names (optional) : str + list of names of blocks expected to be in jedi_config_yaml YAML file Returns ---------- - obs_dict: Dict - a dictionary containing the list of observation files to copy for FileHandler + None """ - observations = find_value_in_nested_dict(self.config, 'observations') + # Initialize dictionary of Jedi objects + jedi_dict = AttrDict() - copylist = [] - for ob in observations['observers']: - obfile = ob['obs space']['obsdatain']['engine']['obsfile'] - basename = os.path.basename(obfile) - copylist.append([os.path.join(task_config.COM_OBS, basename), obfile]) - obs_dict = { - 'mkdir': [os.path.join(task_config.DATA, 'obs')], - 'copy': copylist - } - return obs_dict + # Parse J2-YAML file for dictionary of JEDI configuration dictionaries + jedi_config_dict = parse_j2yaml(jedi_config_yaml, task_config) - @logit(logger) - def get_bias_dict(self, task_config: AttrDict, bias_file) -> Dict[str, Any]: - """Compile a dictionary of observation files to copy + # Loop through dictionary of Jedi configuration dictionaries + for block_name in jedi_config_dict: + # yaml_name key is set to name for this block + jedi_config_dict[block_name]['yaml_name'] = block_name + + # Make sure all required keys present + for key in required_jedi_keys: + if key not in jedi_config_dict[block_name]: + logger.error(f"FATAL ERROR: Required key {key} not found in {jedi_config_yaml} for block {block_name}.") + raise KeyError(f"FATAL ERROR: Required key {key} not found in {jedi_config_yaml} for block {block_name}.") + + # Set optional keys to None + for key in optional_jedi_keys: + if key not in jedi_config_dict[block_name]: + jedi_config_dict[block_name][key] = None + + # Construct JEDI object + jedi_dict[block_name] = Jedi(jedi_config_dict[block_name]) - This method extracts 'observers' from the JEDI yaml and determines from that list - if bias correction tar files are to be copied to the run directory - from the component directory. + # Make sure jedi_dict has the blocks we expect + if expected_block_names: + for block_name in expected_block_names: + if block_name not in jedi_dict: + logger.error(f"FATAL ERROR: Expected block {block_name} not present {jedi_config_yaml}") + raise Exception(f"FATAL ERROR: Expected block {block_name} not present {jedi_config_yaml}") + if len(jedi_dict) > len(expected_block_names): + logger.error(f"FATAL ERROR: {jedi_config_yaml} specifies more Jedi objects than expected.") + raise Exception(f"FATAL ERROR: {jedi_config_yaml} specifies more Jedi objects than expected.") + + # Return dictionary of JEDI objects + return jedi_dict + + @staticmethod + @logit(logger) + def remove_redundant(input_list: List) -> List: + """Remove reduncancies from list with possible redundant, non-mutable elements Parameters ---------- - task_config: AttrDict - Attribute-dictionary of all configuration variables associated with a GDAS task. - bias_file - name of bias correction tar file + input_list : List + List with possible redundant, non-mutable elements Returns ---------- - bias_dict: Dict - a dictionary containing the list of observation bias files to copy for FileHandler + output_list : List + Input list but with redundancies removed """ - observations = find_value_in_nested_dict(self.config, 'observations') - - copylist = [] - for ob in observations['observers']: - if 'obs bias' in ob.keys(): - obfile = ob['obs bias']['input file'] - obdir = os.path.dirname(obfile) - basename = os.path.basename(obfile) - prefix = '.'.join(basename.split('.')[:-3]) - bfile = f"{prefix}.{bias_file}" - tar_file = os.path.join(obdir, bfile) - copylist.append([os.path.join(task_config.VarBcDir, bfile), tar_file]) - break + output_list = [] + for item in input_list: + if item not in output_list: + output_list.append(item) - bias_dict = { - 'mkdir': [os.path.join(task_config.DATA, 'bc')], - 'copy': copylist - } - - return bias_dict + return output_list @staticmethod @logit(logger) - def extract_tar(tar_file: str) -> None: - """Extract files from a tarball + def extract_tar_from_filehandler_dict(filehandler_dict) -> None: + """Extract tarballs from FileHandler input dictionary - This method extract files from a tarball + This method extracts files from tarballs specified in a FileHander + input dictionary for the 'copy' action. Parameters ---------- - tar_file - path/name of tarball + filehandler_dict + Input dictionary for FileHandler Returns ---------- None """ - # extract files from tar file - tar_path = os.path.dirname(tar_file) - try: - with tarfile.open(tar_file, "r") as tarball: - tarball.extractall(path=tar_path) - logger.info(f"Extract {tarball.getnames()}") - except tarfile.ReadError as err: - if tarfile.is_tarfile(tar_file): - logger.error(f"FATAL ERROR: {tar_file} could not be read") - raise tarfile.ReadError(f"FATAL ERROR: unable to read {tar_file}") + for item in filehandler_dict['copy']: + # Use the filename from the destination entry if it's a file path + # Otherwise, it's a directory, so use the source entry filename + if os.path.isfile(item[1]): + filename = os.path.basename(item[1]) else: - logger.info() - except tarfile.ExtractError as err: - logger.exception(f"FATAL ERROR: unable to extract from {tar_file}") - raise tarfile.ExtractError("FATAL ERROR: unable to extract from {tar_file}") + filename = os.path.basename(item[0]) + + # Check if file is a tar ball + if os.path.splitext(filename)[1] == '.tar': + tar_file = f"{os.path.dirname(item[1])}/{filename}" + + # Extract tarball + logger.info(f"Extract files from {tar_file}") + extract_tar(tar_file) @logit(logger) -def find_value_in_nested_dict(nested_dict: Dict, target_key: str) -> Any: - """ - Recursively search through a nested dictionary and return the value for the target key. - This returns the first target key it finds. So if a key exists in a subsequent - nested dictionary, it will not be found. +def extract_tar(tar_file: str) -> None: + """Extract files from a tarball + + This method extract files from a tarball Parameters ---------- - nested_dict : Dict - Dictionary to search - target_key : str - Key to search for + tar_file + path/name of tarball Returns - ------- - Any - Value of the target key - - Raises - ------ - KeyError - If key is not found in dictionary - - TODO: if this gives issues due to landing on an incorrect key in the nested - dictionary, we will have to implement a more concrete method to search for a key - given a more complete address. See resolved conversations in PR 2387 - - # Example usage: - nested_dict = { - 'a': { - 'b': { - 'c': 1, - 'd': { - 'e': 2, - 'f': 3 - } - }, - 'g': 4 - }, - 'h': { - 'i': 5 - }, - 'j': { - 'k': 6 - } - } - - user_key = input("Enter the key to search for: ") - result = find_value_in_nested_dict(nested_dict, user_key) + ---------- + None """ - if not isinstance(nested_dict, dict): - raise TypeError(f"Input is not of type(dict)") - - result = nested_dict.get(target_key) - if result is not None: - return result - - for value in nested_dict.values(): - if isinstance(value, dict): - try: - result = find_value_in_nested_dict(value, target_key) - if result is not None: - return result - except KeyError: - pass - - raise KeyError(f"Key '{target_key}' not found in the nested dictionary") + # extract files from tar file + tar_path = os.path.dirname(tar_file) + try: + with tarfile.open(tar_file, "r") as tarball: + tarball.extractall(path=tar_path) + logger.info(f"Extract {tarball.getnames()}") + except tarfile.FileExistsError as err: + logger.exception(f"FATAL ERROR: {tar_file} does not exist") + raise tarfile.FileExistsError(f"FATAL ERROR: {tar_file} does not exist") + except tarfile.ReadError as err: + if tarfile.is_tarfile(tar_file): + logger.error(f"FATAL ERROR: tar archive {tar_file} could not be read") + raise tarfile.ReadError(f"FATAL ERROR: tar archive {tar_file} could not be read") + else: + logger.error(f"FATAL ERROR: {tar_file} is not a tar archive") + raise tarfile.ReadError(f"FATAL ERROR: {tar_file} is not a tar archive") + except tarfile.ExtractError as err: + logger.exception(f"FATAL ERROR: unable to extract from {tar_file}") + raise tarfile.ExtractError("FATAL ERROR: unable to extract from {tar_file}") diff --git a/ush/python/pygfs/task/atm_analysis.py b/ush/python/pygfs/task/atm_analysis.py index 5f67ea9d72..5c3aa0f764 100644 --- a/ush/python/pygfs/task/atm_analysis.py +++ b/ush/python/pygfs/task/atm_analysis.py @@ -6,8 +6,7 @@ import tarfile from logging import getLogger from pprint import pformat -from typing import Optional, Dict, Any - +from typing import Any, Dict, List, Optional from wxflow import (AttrDict, FileHandler, add_to_datetime, to_fv3time, to_timedelta, to_YMDH, @@ -24,20 +23,18 @@ class AtmAnalysis(Task): Class for JEDI-based global atm analysis tasks """ @logit(logger, name="AtmAnalysis") - def __init__(self, config: Dict[str, Any], yaml_name: Optional[str] = None): + def __init__(self, config: Dict[str, Any]): """Constructor global atm analysis task This method will construct a global atm analysis task. This includes: - extending the task_config attribute AttrDict to include parameters required for this task - - instantiate the Jedi attribute object + - instantiate the Jedi attribute objects Parameters ---------- config: Dict dictionary object containing task configuration - yaml_name: str, optional - name of YAML file for JEDI configuration Returns ---------- @@ -73,46 +70,17 @@ def __init__(self, config: Dict[str, Any], yaml_name: Optional[str] = None): # Extend task_config with local_dict self.task_config = AttrDict(**self.task_config, **local_dict) - # Create JEDI object - self.jedi = Jedi(self.task_config, yaml_name) - - @logit(logger) - def initialize_jedi(self): - """Initialize JEDI application - - This method will initialize a JEDI application used in the global atm analysis. - This includes: - - generating and saving JEDI YAML config - - linking the JEDI executable - - Parameters - ---------- - None - - Returns - ---------- - None - """ - - # get JEDI-to-FV3 increment converter config and save to YAML file - logger.info(f"Generating JEDI YAML config: {self.jedi.yaml}") - self.jedi.set_config(self.task_config) - logger.debug(f"JEDI config:\n{pformat(self.jedi.config)}") - - # save JEDI config to YAML file - logger.debug(f"Writing JEDI YAML config to: {self.jedi.yaml}") - save_as_yaml(self.jedi.config, self.jedi.yaml) - - # link JEDI executable - logger.info(f"Linking JEDI executable {self.task_config.JEDIEXE} to {self.jedi.exe}") - self.jedi.link_exe(self.task_config) + # Create dictionary of Jedi objects + expected_keys = ['atmanlvar', 'atmanlfv3inc'] + self.jedi_dict = Jedi.get_jedi_dict(self.task_config.JEDI_CONFIG_YAML, self.task_config, expected_keys) @logit(logger) - def initialize_analysis(self) -> None: + def initialize(self) -> None: """Initialize a global atm analysis This method will initialize a global atm analysis. This includes: + - initialize JEDI applications - staging observation files - staging bias correction files - staging CRTM fix files @@ -129,26 +97,33 @@ def initialize_analysis(self) -> None: ---------- None """ - super().initialize() + + # initialize JEDI variational application + logger.info(f"Initializing JEDI variational DA application") + self.jedi_dict['atmanlvar'].initialize(self.task_config) + + # initialize JEDI FV3 increment conversion application + logger.info(f"Initializing JEDI FV3 increment conversion application") + self.jedi_dict['atmanlfv3inc'].initialize(self.task_config) # stage observations - logger.info(f"Staging list of observation files generated from JEDI config") - obs_dict = self.jedi.get_obs_dict(self.task_config) + logger.info(f"Staging list of observation files") + obs_dict = self.jedi_dict['atmanlvar'].render_jcb(self.task_config, 'atm_obs_staging') FileHandler(obs_dict).sync() logger.debug(f"Observation files:\n{pformat(obs_dict)}") # stage bias corrections - logger.info(f"Staging list of bias correction files generated from JEDI config") - self.task_config.VarBcDir = f"{self.task_config.COM_ATMOS_ANALYSIS_PREV}" - bias_file = f"rad_varbc_params.tar" - bias_dict = self.jedi.get_bias_dict(self.task_config, bias_file) - FileHandler(bias_dict).sync() - logger.debug(f"Bias correction files:\n{pformat(bias_dict)}") - - # extract bias corrections - tar_file = os.path.join(self.task_config.DATA, 'obs', f"{self.task_config.GPREFIX}{bias_file}") - logger.info(f"Extract bias correction files from {tar_file}") - self.jedi.extract_tar(tar_file) + logger.info(f"Staging list of bias correction files") + bias_dict = self.jedi_dict['atmanlvar'].render_jcb(self.task_config, 'atm_bias_staging') + if bias_dict['copy'] is None: + logger.info(f"No bias correction files to stage") + else: + bias_dict['copy'] = Jedi.remove_redundant(bias_dict['copy']) + FileHandler(bias_dict).sync() + logger.debug(f"Bias correction files:\n{pformat(bias_dict)}") + + # extract bias corrections + Jedi.extract_tar_from_filehandler_dict(bias_dict) # stage CRTM fix files logger.info(f"Staging CRTM fix files from {self.task_config.CRTM_FIX_YAML}") @@ -193,29 +168,20 @@ def initialize_analysis(self) -> None: FileHandler({'mkdir': newdirs}).sync() @logit(logger) - def execute(self, aprun_cmd: str, jedi_args: Optional[str] = None) -> None: - """Run JEDI executable - - This method will run JEDI executables for the global atm analysis + def execute(self, jedi_dict_key: str) -> None: + """Execute JEDI application of atm analysis Parameters ---------- - aprun_cmd : str - Run command for JEDI application on HPC system - jedi_args : List - List of additional optional arguments for JEDI application + jedi_dict_key + key specifying particular Jedi object in self.jedi_dict Returns ---------- None """ - if jedi_args: - logger.info(f"Executing {self.jedi.exe} {' '.join(jedi_args)} {self.jedi.yaml}") - else: - logger.info(f"Executing {self.jedi.exe} {self.jedi.yaml}") - - self.jedi.execute(self.task_config, aprun_cmd, jedi_args) + self.jedi_dict[jedi_dict_key].execute() @logit(logger) def finalize(self) -> None: diff --git a/ush/python/pygfs/task/atmens_analysis.py b/ush/python/pygfs/task/atmens_analysis.py index 4b2f8ebbf4..81cae238bb 100644 --- a/ush/python/pygfs/task/atmens_analysis.py +++ b/ush/python/pygfs/task/atmens_analysis.py @@ -28,20 +28,18 @@ class AtmEnsAnalysis(Task): Class for JEDI-based global atmens analysis tasks """ @logit(logger, name="AtmEnsAnalysis") - def __init__(self, config: Dict[str, Any], yaml_name: Optional[str] = None): + def __init__(self, config: Dict[str, Any]): """Constructor global atmens analysis task This method will construct a global atmens analysis task. This includes: - extending the task_config attribute AttrDict to include parameters required for this task - - instantiate the Jedi attribute object + - instantiate the Jedi attribute objects Parameters ---------- config: Dict dictionary object containing task configuration - yaml_name: str, optional - name of YAML file for JEDI configuration Returns ---------- @@ -73,46 +71,17 @@ def __init__(self, config: Dict[str, Any], yaml_name: Optional[str] = None): # Extend task_config with local_dict self.task_config = AttrDict(**self.task_config, **local_dict) - # Create JEDI object - self.jedi = Jedi(self.task_config, yaml_name) + # Create dictionary of JEDI objects + expected_keys = ['atmensanlobs', 'atmensanlsol', 'atmensanlfv3inc', 'atmensanlletkf'] + self.jedi_dict = Jedi.get_jedi_dict(self.task_config.JEDI_CONFIG_YAML, self.task_config, expected_keys) @logit(logger) - def initialize_jedi(self): - """Initialize JEDI application - - This method will initialize a JEDI application used in the global atmens analysis. - This includes: - - generating and saving JEDI YAML config - - linking the JEDI executable - - Parameters - ---------- - None - - Returns - ---------- - None - """ - - # get JEDI config and save to YAML file - logger.info(f"Generating JEDI config: {self.jedi.yaml}") - self.jedi.set_config(self.task_config) - logger.debug(f"JEDI config:\n{pformat(self.jedi.config)}") - - # save JEDI config to YAML file - logger.info(f"Writing JEDI config to YAML file: {self.jedi.yaml}") - save_as_yaml(self.jedi.config, self.jedi.yaml) - - # link JEDI-to-FV3 increment converter executable - logger.info(f"Linking JEDI executable {self.task_config.JEDIEXE} to {self.jedi.exe}") - self.jedi.link_exe(self.task_config) - - @logit(logger) - def initialize_analysis(self) -> None: + def initialize(self) -> None: """Initialize a global atmens analysis This method will initialize a global atmens analysis. This includes: + - initialize JEDI applications - staging observation files - staging bias correction files - staging CRTM fix files @@ -128,26 +97,34 @@ def initialize_analysis(self) -> None: ---------- None """ - super().initialize() + + # initialize JEDI LETKF observer application + logger.info(f"Initializing JEDI LETKF observer application") + self.jedi_dict['atmensanlobs'].initialize(self.task_config) + + # initialize JEDI LETKF solver application + logger.info(f"Initializing JEDI LETKF solver application") + self.jedi_dict['atmensanlsol'].initialize(self.task_config) + + # initialize JEDI FV3 increment conversion application + logger.info(f"Initializing JEDI FV3 increment conversion application") + self.jedi_dict['atmensanlfv3inc'].initialize(self.task_config) # stage observations - logger.info(f"Staging list of observation files generated from JEDI config") - obs_dict = self.jedi.get_obs_dict(self.task_config) + logger.info(f"Staging list of observation files") + obs_dict = self.jedi_dict['atmensanlobs'].render_jcb(self.task_config, 'atm_obs_staging') FileHandler(obs_dict).sync() logger.debug(f"Observation files:\n{pformat(obs_dict)}") # stage bias corrections - logger.info(f"Staging list of bias correction files generated from JEDI config") - self.task_config.VarBcDir = f"{self.task_config.COM_ATMOS_ANALYSIS_PREV}" - bias_file = f"rad_varbc_params.tar" - bias_dict = self.jedi.get_bias_dict(self.task_config, bias_file) + logger.info(f"Staging list of bias correction files") + bias_dict = self.jedi_dict['atmensanlobs'].render_jcb(self.task_config, 'atm_bias_staging') + bias_dict['copy'] = Jedi.remove_redundant(bias_dict['copy']) FileHandler(bias_dict).sync() logger.debug(f"Bias correction files:\n{pformat(bias_dict)}") # extract bias corrections - tar_file = os.path.join(self.task_config.DATA, 'obs', f"{self.task_config.GPREFIX}{bias_file}") - logger.info(f"Extract bias correction files from {tar_file}") - self.jedi.extract_tar(tar_file) + Jedi.extract_tar_from_filehandler_dict(bias_dict) # stage CRTM fix files logger.info(f"Staging CRTM fix files from {self.task_config.CRTM_FIX_YAML}") @@ -176,28 +153,38 @@ def initialize_analysis(self) -> None: FileHandler({'mkdir': newdirs}).sync() @logit(logger) - def execute(self, aprun_cmd: str, jedi_args: Optional[str] = None) -> None: - """Run JEDI executable + def initialize_letkf(self) -> None: + """Initialize a global atmens analysis - This method will run JEDI executables for the global atmens analysis + Note: This would normally be done in AtmEnsAnalysis.initialize(), but that method + now initializes the split observer-solver. This method is just for testing. Parameters ---------- - aprun_cmd : str - Run command for JEDI application on HPC system - jedi_args : List - List of additional optional arguments for JEDI application + None + Returns ---------- None """ - if jedi_args: - logger.info(f"Executing {self.jedi.exe} {' '.join(jedi_args)} {self.jedi.yaml}") - else: - logger.info(f"Executing {self.jedi.exe} {self.jedi.yaml}") + self.jedi_dict['atmensanlletkf'].initialize(self.task_config) + + @logit(logger) + def execute(self, jedi_dict_key: str) -> None: + """Execute JEDI application of atmens analysis + + Parameters + ---------- + jedi_dict_key + key specifying a particular Jedi object in self.jedi_dict + + Returns + ---------- + None + """ - self.jedi.execute(self.task_config, aprun_cmd, jedi_args) + self.jedi_dict[jedi_dict_key].execute() @logit(logger) def finalize(self) -> None: diff --git a/ush/python/pygfs/task/marine_analysis.py b/ush/python/pygfs/task/marine_analysis.py index e7b7b5e948..75cc28c7b3 100644 --- a/ush/python/pygfs/task/marine_analysis.py +++ b/ush/python/pygfs/task/marine_analysis.py @@ -15,7 +15,7 @@ from wxflow import (AttrDict, FileHandler, add_to_datetime, to_timedelta, to_YMD, - parse_j2yaml, + parse_j2yaml, parse_yaml, logit, Executable, Task, @@ -200,7 +200,7 @@ def _prep_variational_yaml(self: Task) -> None: # Add the things to the envconfig in order to template JCB files envconfig_jcb['PARMgfs'] = self.task_config.PARMgfs - envconfig_jcb['nmem_ens'] = self.task_config.NMEM_ENS + envconfig_jcb['NMEM_ENS'] = self.task_config.NMEM_ENS envconfig_jcb['berror_model'] = 'marine_background_error_static_diffusion' if self.task_config.NMEM_ENS > 3: envconfig_jcb['berror_model'] = 'marine_background_error_hybrid_diffusion_diffusion' @@ -234,6 +234,9 @@ def _prep_variational_yaml(self: Task) -> None: jcb_config['window_begin'] = self.task_config.MARINE_WINDOW_BEGIN.strftime('%Y-%m-%dT%H:%M:%SZ') jcb_config['window_middle'] = self.task_config.MARINE_WINDOW_MIDDLE.strftime('%Y-%m-%dT%H:%M:%SZ') + # Current hack so that this is not done directly in the JCB base yaml + jcb_config['marine_pseudo_model_states'] = parse_yaml('bkg_list.yaml') + # Render the full JEDI configuration file using JCB jedi_config = render(jcb_config) diff --git a/ush/python/pygfs/task/marine_bmat.py b/ush/python/pygfs/task/marine_bmat.py index a4a5b4f144..a21699227b 100644 --- a/ush/python/pygfs/task/marine_bmat.py +++ b/ush/python/pygfs/task/marine_bmat.py @@ -9,21 +9,40 @@ FileHandler, add_to_datetime, to_timedelta, chdir, - parse_j2yaml, + parse_j2yaml, save_as_yaml, logit, Executable, Task) +from pygfs.jedi import Jedi + logger = getLogger(__name__.split('.')[-1]) class MarineBMat(Task): """ - Class for global marine B-matrix tasks + Class for global marine B-matrix tasks. """ @logit(logger, name="MarineBMat") def __init__(self, config): + """Constructor for marine B-matrix task + + This method will construct the marine B-matrix task object + This includes: + - extending the task_config AttrDict to include parameters required for this task + - instantiate the Jedi attribute objects + + Parameters + ---------- + config: Dict + dictionary object containing task configuration + + Returns + ---------- + None + """ super().__init__(config) + _home_gdas = os.path.join(self.task_config.HOMEgfs, 'sorc', 'gdas.cd') _calc_scale_exec = os.path.join(self.task_config.HOMEgfs, 'ush', 'soca', 'calc_scales.py') _window_begin = add_to_datetime(self.task_config.current_cycle, @@ -38,18 +57,26 @@ def __init__(self, config): local_dict = AttrDict( { 'PARMsoca': os.path.join(self.task_config.PARMgfs, 'gdas', 'soca'), + 'CALC_SCALE_EXEC': _calc_scale_exec, 'MARINE_WINDOW_BEGIN': _window_begin, - 'MARINE_WINDOW_END': _window_end, 'MARINE_WINDOW_MIDDLE': self.task_config.current_cycle, + 'MARINE_WINDOW_END': _window_end, + 'MARINE_WINDOW_LENGTH': f"PT{self.task_config['assim_freq']}H", 'ENSPERT_RELPATH': _enspert_relpath, - 'CALC_SCALE_EXEC': _calc_scale_exec, - 'APREFIX': f"{self.task_config.RUN}.t{self.task_config.cyc:02d}z." + 'MOM6_LEVS': mdau.get_mom6_levels(str(self.task_config.OCNRES)), + 'APREFIX': f"{self.task_config.RUN}.t{self.task_config.cyc:02d}z.", + 'OPREFIX': f"{self.task_config.RUN}.t{self.task_config.cyc:02d}z." } ) # Extend task_config with local_dict self.task_config = AttrDict(**self.task_config, **local_dict) + # Create dictionary of Jedi objects + expected_keys = ['gridgen', 'soca_diagb', 'soca_parameters_diffusion_vt', 'soca_setcorscales', + 'soca_parameters_diffusion_hz', 'soca_ensb', 'soca_ensweights'] + self.jedi_dict = Jedi.get_jedi_dict(self.task_config.JEDI_CONFIG_YAML, self.task_config, expected_keys) + @logit(logger) def initialize(self: Task) -> None: """Initialize a global B-matrix @@ -60,10 +87,18 @@ def initialize(self: Task) -> None: - staging SOCA fix files - staging static ensemble members (optional) - staging ensemble members (optional) - - generating the YAML files for the JEDI and GDASApp executables + - initializing the soca_vtscales Python script + - initializing the JEDI applications - creating output directories + + Parameters + ---------- + None + + Returns + ---------- + None """ - super().initialize() # stage fix files logger.info(f"Staging SOCA fix files from {self.task_config.SOCA_INPUT_FIX_DIR}") @@ -78,54 +113,32 @@ def initialize(self: Task) -> None: bkg_list = parse_j2yaml(self.task_config.MARINE_DET_STAGE_BKG_YAML_TMPL, self.task_config) FileHandler(bkg_list).sync() - # stage the soca utility yamls (gridgen, fields and ufo mapping yamls) + # stage the soca utility yamls (fields and ufo mapping yamls) logger.info(f"Staging SOCA utility yaml files") soca_utility_list = parse_j2yaml(self.task_config.MARINE_UTILITY_YAML_TMPL, self.task_config) FileHandler(soca_utility_list).sync() - # generate the variance partitioning YAML file - logger.info(f"Generate variance partitioning YAML file from {self.task_config.BERROR_DIAGB_YAML}") - diagb_config = parse_j2yaml(path=self.task_config.BERROR_DIAGB_YAML, data=self.task_config) - diagb_config.save(os.path.join(self.task_config.DATA, 'soca_diagb.yaml')) - - # generate the vertical decorrelation scale YAML file - logger.info(f"Generate the vertical correlation scale YAML file from {self.task_config.BERROR_VTSCALES_YAML}") - vtscales_config = parse_j2yaml(path=self.task_config.BERROR_VTSCALES_YAML, data=self.task_config) - vtscales_config.save(os.path.join(self.task_config.DATA, 'soca_vtscales.yaml')) - - # generate vertical diffusion scale YAML file - logger.info(f"Generate vertical diffusion YAML file from {self.task_config.BERROR_DIFFV_YAML}") - diffvz_config = parse_j2yaml(path=self.task_config.BERROR_DIFFV_YAML, data=self.task_config) - diffvz_config.save(os.path.join(self.task_config.DATA, 'soca_parameters_diffusion_vt.yaml')) - - # generate the horizontal diffusion YAML files - if True: # TODO(G): skip this section once we have optimized the scales - # stage the correlation scale configuration - logger.info(f"Generate correlation scale YAML file from {self.task_config.BERROR_HZSCALES_YAML}") - FileHandler({'copy': [[self.task_config.BERROR_HZSCALES_YAML, - os.path.join(self.task_config.DATA, 'soca_setcorscales.yaml')]]}).sync() - - # generate horizontal diffusion scale YAML file - logger.info(f"Generate horizontal diffusion scale YAML file from {self.task_config.BERROR_DIFFH_YAML}") - diffhz_config = parse_j2yaml(path=self.task_config.BERROR_DIFFH_YAML, data=self.task_config) - diffhz_config.save(os.path.join(self.task_config.DATA, 'soca_parameters_diffusion_hz.yaml')) + # initialize vtscales python script + vtscales_config = self.jedi_dict['soca_parameters_diffusion_vt'].render_jcb(self.task_config, 'soca_vtscales') + save_as_yaml(vtscales_config, os.path.join(self.task_config.DATA, 'soca_vtscales.yaml')) + FileHandler({'copy': [[os.path.join(self.task_config.CALC_SCALE_EXEC), + os.path.join(self.task_config.DATA, 'calc_scales.x')]]}).sync() + + # initialize JEDI applications + self.jedi_dict['gridgen'].initialize(self.task_config) + self.jedi_dict['soca_diagb'].initialize(self.task_config) + self.jedi_dict['soca_parameters_diffusion_vt'].initialize(self.task_config) + self.jedi_dict['soca_setcorscales'].initialize(self.task_config) + self.jedi_dict['soca_parameters_diffusion_hz'].initialize(self.task_config) + if self.task_config.DOHYBVAR == "YES" or self.task_config.NMEM_ENS > 2: + self.jedi_dict['soca_ensb'].initialize(self.task_config) + self.jedi_dict['soca_ensweights'].initialize(self.task_config) - # hybrid EnVAR case + # stage ensemble members for the hybrid background error if self.task_config.DOHYBVAR == "YES" or self.task_config.NMEM_ENS > 2: - # stage ensemble membersfiles for use in hybrid background error logger.debug(f"Stage ensemble members for the hybrid background error") mdau.stage_ens_mem(self.task_config) - # generate ensemble recentering/rebalancing YAML file - logger.debug("Generate ensemble recentering YAML file") - ensrecenter_config = parse_j2yaml(path=self.task_config.BERROR_ENS_RECENTER_YAML, data=self.task_config) - ensrecenter_config.save(os.path.join(self.task_config.DATA, 'soca_ensb.yaml')) - - # generate ensemble weights YAML file - logger.debug("Generate hybrid-weigths YAML file") - hybridweights_config = parse_j2yaml(path=self.task_config.BERROR_HYB_WEIGHTS_YAML, data=self.task_config) - hybridweights_config.save(os.path.join(self.task_config.DATA, 'soca_ensweights.yaml')) - # create the symbolic link to the static B-matrix directory link_target = os.path.join(self.task_config.DATAstaticb) link_name = os.path.join(self.task_config.DATA, 'staticb') @@ -134,130 +147,44 @@ def initialize(self: Task) -> None: os.symlink(link_target, link_name) @logit(logger) - def gridgen(self: Task) -> None: - # link gdas_soca_gridgen.x - mdau.link_executable(self.task_config, 'gdas_soca_gridgen.x') - exec_cmd = Executable(self.task_config.APRUN_MARINEBMAT) - exec_name = os.path.join(self.task_config.DATA, 'gdas_soca_gridgen.x') - exec_cmd.add_default_arg(exec_name) - exec_cmd.add_default_arg('gridgen.yaml') - - mdau.run(exec_cmd) + def execute(self) -> None: + """Generate the full B-matrix - @logit(logger) - def variance_partitioning(self: Task) -> None: - # link the variance partitioning executable, gdas_soca_diagb.x - mdau.link_executable(self.task_config, 'gdas_soca_diagb.x') - exec_cmd = Executable(self.task_config.APRUN_MARINEBMAT) - exec_name = os.path.join(self.task_config.DATA, 'gdas_soca_diagb.x') - exec_cmd.add_default_arg(exec_name) - exec_cmd.add_default_arg('soca_diagb.yaml') + This method will generate the full B-matrix according to the configuration. + This includes: + - running all JEDI application and Python scripts required to generate the B-matrix - mdau.run(exec_cmd) + Parameters + ---------- + None - @logit(logger) - def horizontal_diffusion(self: Task) -> None: - """Generate the horizontal diffusion coefficients + Returns + ---------- + None """ - # link the executable that computes the correlation scales, gdas_soca_setcorscales.x, - # and prepare the command to run it - mdau.link_executable(self.task_config, 'gdas_soca_setcorscales.x') - exec_cmd = Executable(self.task_config.APRUN_MARINEBMAT) - exec_name = os.path.join(self.task_config.DATA, 'gdas_soca_setcorscales.x') - exec_cmd.add_default_arg(exec_name) - exec_cmd.add_default_arg('soca_setcorscales.yaml') - # create a files containing the correlation scales - mdau.run(exec_cmd) + self.jedi_dict['gridgen'].execute() - # link the executable that computes the correlation scales, gdas_soca_error_covariance_toolbox.x, - # and prepare the command to run it - mdau.link_executable(self.task_config, 'gdas_soca_error_covariance_toolbox.x') - exec_cmd = Executable(self.task_config.APRUN_MARINEBMAT) - exec_name = os.path.join(self.task_config.DATA, 'gdas_soca_error_covariance_toolbox.x') - exec_cmd.add_default_arg(exec_name) - exec_cmd.add_default_arg('soca_parameters_diffusion_hz.yaml') + # variance partitioning + self.jedi_dict['soca_diagb'].execute() - # compute the coefficients of the diffusion operator - mdau.run(exec_cmd) + # horizontal diffusion + self.jedi_dict['soca_setcorscales'].execute() + self.jedi_dict['soca_parameters_diffusion_hz'].execute() - @logit(logger) - def vertical_diffusion(self: Task) -> None: - """Generate the vertical diffusion coefficients - """ - # compute the vertical correlation scales based on the MLD - FileHandler({'copy': [[os.path.join(self.task_config.CALC_SCALE_EXEC), - os.path.join(self.task_config.DATA, 'calc_scales.x')]]}).sync() + # vertical diffusion exec_cmd = Executable("python") exec_name = os.path.join(self.task_config.DATA, 'calc_scales.x') exec_cmd.add_default_arg(exec_name) exec_cmd.add_default_arg('soca_vtscales.yaml') mdau.run(exec_cmd) - # link the executable that computes the correlation scales, gdas_soca_error_covariance_toolbox.x, - # and prepare the command to run it - mdau.link_executable(self.task_config, 'gdas_soca_error_covariance_toolbox.x') - exec_cmd = Executable(self.task_config.APRUN_MARINEBMAT) - exec_name = os.path.join(self.task_config.DATA, 'gdas_soca_error_covariance_toolbox.x') - exec_cmd.add_default_arg(exec_name) - exec_cmd.add_default_arg('soca_parameters_diffusion_vt.yaml') - - # compute the coefficients of the diffusion operator - mdau.run(exec_cmd) - - @logit(logger) - def ensemble_perturbations(self: Task) -> None: - """Generate the 3D ensemble of perturbation for the 3DEnVAR - - This method will generate ensemble perturbations re-balanced w.r.t the - deterministic background. - This includes: - - computing a storing the unbalanced ensemble perturbations' statistics - - recentering the ensemble members around the deterministic background and - accounting for the nonlinear steric recentering - - saving the recentered ensemble statistics - """ - mdau.link_executable(self.task_config, 'gdas_ens_handler.x') - exec_cmd = Executable(self.task_config.APRUN_MARINEBMAT) - exec_name = os.path.join(self.task_config.DATA, 'gdas_ens_handler.x') - exec_cmd.add_default_arg(exec_name) - exec_cmd.add_default_arg('soca_ensb.yaml') + self.jedi_dict['soca_parameters_diffusion_vt'].execute() - # generate the ensemble perturbations - mdau.run(exec_cmd) - - @logit(logger) - def hybrid_weight(self: Task) -> None: - """Generate the hybrid weights for the 3DEnVAR - - This method will generate the 3D fields hybrid weights for the 3DEnVAR for each - variables. - TODO(G): Currently implemented for the specific case of the static ensemble members only - """ - mdau.link_executable(self.task_config, 'gdas_socahybridweights.x') - exec_cmd = Executable(self.task_config.APRUN_MARINEBMAT) - exec_name = os.path.join(self.task_config.DATA, 'gdas_socahybridweights.x') - exec_cmd.add_default_arg(exec_name) - exec_cmd.add_default_arg('soca_ensweights.yaml') - - # compute the ensemble weights - mdau.run(exec_cmd) - - @logit(logger) - def execute(self: Task) -> None: - """Generate the full B-matrix - - This method will generate the full B-matrix according to the configuration. - """ - chdir(self.task_config.DATA) - self.gridgen() # TODO: This should be optional in case the geometry file was staged - self.variance_partitioning() - self.horizontal_diffusion() # TODO: Make this optional once we've converged on an acceptable set of scales - self.vertical_diffusion() # hybrid EnVAR case if self.task_config.DOHYBVAR == "YES" or self.task_config.NMEM_ENS > 2: - self.ensemble_perturbations() # TODO: refactor this from the old scripts - self.hybrid_weight() # TODO: refactor this from the old scripts + self.jedi_dict['soca_ensb'].execute() + self.jedi_dict['soca_ensweights'].execute() @logit(logger) def finalize(self: Task) -> None: @@ -270,6 +197,13 @@ def finalize(self: Task) -> None: - keep the re-balanced ensemble perturbation files in DATAenspert - ... + Parameters + ---------- + None + + Returns + ---------- + None """ # Copy the soca grid if it was created grid_file = os.path.join(self.task_config.DATA, 'soca_gridspec.nc') diff --git a/versions/fix.ver b/versions/fix.ver index b175791196..4739ce778a 100644 --- a/versions/fix.ver +++ b/versions/fix.ver @@ -8,7 +8,7 @@ export cice_ver=20240416 export cpl_ver=20230526 export datm_ver=20220805 export gdas_crtm_ver=20220805 -export gdas_fv3jedi_ver=20241022 +export gdas_fv3jedi_ver=20241115 export gdas_soca_ver=20240802 export gdas_gsibec_ver=20240416 export gdas_obs_ver=20240213 From 1563594f6b723b40cd84badf73f24f3630fc45c6 Mon Sep 17 00:00:00 2001 From: BoCui-NOAA <53531984+BoCui-NOAA@users.noreply.github.com> Date: Tue, 19 Nov 2024 17:05:25 -0500 Subject: [PATCH 10/20] Add new stations to GFS BUFR sounding products (#3107) Andrew Benjamin requested the addition of new buff sounding stations to the GFS system. He provided an updated global station list that includes 121 new stations and 3 updated ones. Based on this list, several parameter files for GFSv17 have been updated, including grid point location files for C76, C768, and C1152 resolutions. --- parm/product/bufr_ij_gfs_C1152.txt | 127 +++++++++++++++++++++++++++- parm/product/bufr_ij_gfs_C768.txt | 127 +++++++++++++++++++++++++++- parm/product/bufr_ij_gfs_C96.txt | 127 +++++++++++++++++++++++++++- parm/product/bufr_stalist.meteo.gfs | 127 +++++++++++++++++++++++++++- 4 files changed, 496 insertions(+), 12 deletions(-) diff --git a/parm/product/bufr_ij_gfs_C1152.txt b/parm/product/bufr_ij_gfs_C1152.txt index 321026f3d1..e8c6e3fc34 100644 --- a/parm/product/bufr_ij_gfs_C1152.txt +++ b/parm/product/bufr_ij_gfs_C1152.txt @@ -111,9 +111,9 @@ 111 3499 558 46.42 -86.65 112 3461 651 39.16 -89.67 113 3308 588 44.05 -101.60 - 114 3505 594 43.58 -86.24 - 115 3517 596 43.43 -85.30 - 116 3528 597 43.37 -84.44 + 114 3502 589 43.96 -86.41 + 115 3514 592 43.73 -85.51 + 116 3524 594 43.62 -84.74 117 3274 712 34.38 -104.23 118 3994 554 46.70 -48.00 119 3903 548 47.20 -55.10 @@ -2113,3 +2113,124 @@ 2113 1641 1351 -15.51 128.15 2114 4514 416 57.48 -7.36 2115 130 456 54.38 10.13 + 2116 3685 625 41.24 -72.12 + 2117 3584 733 32.70 -80.00 + 2118 3468 539 47.91 -89.14 + 2119 3478 554 46.67 -88.35 + 2120 3037 573 45.24 -122.77 + 2121 2612 886 20.79 -156.01 + 2122 2608 887 20.71 -156.25 + 2123 2618 898 19.82 -155.47 + 2124 2563 870 22.04 -159.78 + 2125 2613 867 22.27 -155.86 + 2126 2617 903 19.47 -155.59 + 2127 2338 791 28.20 -177.38 + 2128 2568 868 22.21 -159.44 + 2129 2589 877 21.45 -157.77 + 2130 2617 907 19.10 -155.57 + 2131 3587 660 38.43 -79.84 + 2132 3657 578 44.85 -74.33 + 2133 3671 581 44.56 -73.33 + 2134 3670 576 45.00 -73.33 + 2135 3676 594 43.60 -72.82 + 2136 3675 581 44.59 -72.92 + 2137 3674 589 43.98 -73.03 + 2138 3491 718 33.90 -87.31 + 2139 3508 731 32.91 -85.96 + 2140 3584 733 32.70 -80.00 + 2141 3614 607 42.57 -77.71 + 2142 3582 783 28.85 -80.23 + 2143 3581 768 30.02 -80.25 + 2144 3488 770 29.80 -87.50 + 2145 3536 787 28.50 -83.75 + 2146 3531 778 29.25 -84.20 + 2147 3577 770 29.80 -80.60 + 2148 3507 771 29.77 -86.03 + 2149 3033 580 44.64 -123.06 + 2150 3052 569 45.52 -121.59 + 2151 3015 562 46.10 -124.50 + 2152 3015 581 44.60 -124.50 + 2153 2998 564 45.90 -125.80 + 2154 3529 670 37.63 -84.33 + 2155 3250 655 38.81 -106.12 + 2156 3258 635 40.38 -105.52 + 2157 3263 660 38.43 -105.10 + 2158 3510 620 41.53 -85.79 + 2159 3519 619 41.64 -85.08 + 2160 3306 665 38.00 -101.75 + 2161 3698 612 42.18 -71.17 + 2162 3690 607 42.55 -71.76 + 2163 3679 607 42.59 -72.60 + 2164 3704 606 42.62 -70.67 + 2165 3699 616 41.87 -71.02 + 2166 3679 610 42.33 -72.63 + 2167 3618 647 39.41 -77.37 + 2168 3621 651 39.17 -77.17 + 2169 3700 589 43.99 -70.95 + 2170 3542 594 43.56 -83.34 + 2171 3536 611 42.22 -83.75 + 2172 3411 547 47.22 -93.52 + 2173 3419 567 45.70 -92.95 + 2174 3407 574 45.16 -93.84 + 2175 3415 612 42.15 -93.22 + 2176 3452 540 47.84 -90.38 + 2177 3219 557 46.48 -108.54 + 2178 3693 588 44.03 -71.49 + 2179 3256 685 36.45 -105.67 + 2180 3248 693 35.88 -106.27 + 2181 3568 624 41.21 -81.25 + 2182 3527 637 40.20 -84.53 + 2183 3624 641 39.93 -76.88 + 2184 3641 637 40.23 -75.55 + 2185 3674 603 42.89 -73.04 + 2186 3445 556 46.55 -90.92 + 2187 3599 662 38.27 -78.90 + 2188 3040 672 37.51 -122.50 + 2189 3175 632 40.62 -111.99 + 2190 3178 706 34.85 -111.79 + 2191 3183 713 34.26 -111.34 + 2192 3209 715 34.13 -109.31 + 2193 3172 700 35.31 -112.19 + 2194 3212 696 35.65 -109.07 + 2195 3185 689 36.14 -111.24 + 2196 3206 689 36.15 -109.55 + 2197 3172 682 36.71 -112.22 + 2198 3197 682 36.73 -110.25 + 2199 3166 688 36.24 -112.69 + 2200 3157 697 35.53 -113.43 + 2201 3160 709 34.58 -113.18 + 2202 3194 694 35.79 -110.51 + 2203 3212 679 36.92 -109.09 + 2204 3211 685 36.47 -109.15 + 2205 307 666 37.94 23.94 + 2206 3683 873 21.77 -72.27 + 2207 1930 385 59.91 150.72 + 2208 2029 471 53.17 158.45 + 2209 979 372 60.95 76.48 + 2210 4528 468 53.43 -6.25 + 2211 4499 544 47.48 -8.54 + 2212 362 1487 -26.14 28.23 + 2213 33 524 49.02 2.53 + 2214 93 593 43.65 7.21 + 2215 4563 634 40.47 -3.58 + 2216 4286 679 36.97 -25.17 + 2217 4492 656 38.77 -9.13 + 2218 112 568 45.63 8.72 + 2219 854 300 66.53 66.67 + 2220 1303 431 56.28 101.75 + 2221 1336 483 52.27 104.32 + 2222 1731 531 48.53 135.19 + 2223 447 742 32.00 34.90 + 2224 1619 672 37.47 126.43 + 2225 1632 682 36.72 127.50 + 2226 1619 723 33.50 126.48 + 2227 1670 722 33.58 130.45 + 2228 1343 1003 11.60 104.86 + 2229 4434 1029 9.57 -13.62 + 2230 711 1419 -20.89 55.53 + 2231 3508 744 31.86 -86.01 + 2232 3429 658 38.59 -92.16 + 2233 3024 570 45.42 -123.82 + 2234 3828 976 13.75 -60.95 + 2235 3818 998 12.00 -61.78 + 2236 3654 1259 -8.37 -74.57 diff --git a/parm/product/bufr_ij_gfs_C768.txt b/parm/product/bufr_ij_gfs_C768.txt index 568717de72..41906ee438 100644 --- a/parm/product/bufr_ij_gfs_C768.txt +++ b/parm/product/bufr_ij_gfs_C768.txt @@ -111,9 +111,9 @@ 111 2333 372 46.42 -86.65 112 2307 434 39.16 -89.67 113 2206 392 44.05 -101.60 - 114 2337 396 43.58 -86.24 - 115 2345 397 43.43 -85.30 - 116 2352 398 43.37 -84.44 + 114 2335 393 43.96 -86.41 + 115 2343 395 43.73 -85.51 + 116 2349 396 43.62 -84.74 117 2183 475 34.38 -104.23 118 2663 369 46.70 -48.00 119 2602 365 47.20 -55.10 @@ -2113,3 +2113,124 @@ 2113 1094 900 -15.51 128.15 2114 3010 277 57.48 -7.36 2115 87 304 54.38 10.13 + 2116 2457 416 41.24 -72.12 + 2117 2390 489 32.70 -80.00 + 2118 2312 359 47.91 -89.14 + 2119 2319 370 46.67 -88.35 + 2120 2025 382 45.24 -122.77 + 2121 1741 591 20.79 -156.01 + 2122 1739 591 20.71 -156.25 + 2123 1746 599 19.82 -155.47 + 2124 1709 580 22.04 -159.78 + 2125 1742 578 22.27 -155.86 + 2126 1745 602 19.47 -155.59 + 2127 1559 527 28.20 -177.38 + 2128 1712 578 22.21 -159.44 + 2129 1726 585 21.45 -157.77 + 2130 1745 605 19.10 -155.57 + 2131 2391 440 38.43 -79.84 + 2132 2438 385 44.85 -74.33 + 2133 2447 388 44.56 -73.33 + 2134 2447 385 45.00 -73.33 + 2135 2451 396 43.60 -72.82 + 2136 2450 387 44.59 -72.92 + 2137 2449 393 43.98 -73.03 + 2138 2327 479 33.90 -87.31 + 2139 2339 487 32.91 -85.96 + 2140 2390 489 32.70 -80.00 + 2141 2409 405 42.57 -77.71 + 2142 2388 522 28.85 -80.23 + 2143 2388 512 30.02 -80.25 + 2144 2326 514 29.80 -87.50 + 2145 2358 525 28.50 -83.75 + 2146 2354 518 29.25 -84.20 + 2147 2385 514 29.80 -80.60 + 2148 2338 514 29.77 -86.03 + 2149 2022 387 44.64 -123.06 + 2150 2035 379 45.52 -121.59 + 2151 2010 374 46.10 -124.50 + 2152 2010 387 44.60 -124.50 + 2153 1999 376 45.90 -125.80 + 2154 2353 447 37.63 -84.33 + 2155 2167 437 38.81 -106.12 + 2156 2172 423 40.38 -105.52 + 2157 2176 440 38.43 -105.10 + 2158 2340 413 41.53 -85.79 + 2159 2346 413 41.64 -85.08 + 2160 2204 444 38.00 -101.75 + 2161 2465 408 42.18 -71.17 + 2162 2460 405 42.55 -71.76 + 2163 2453 404 42.59 -72.60 + 2164 2469 404 42.62 -70.67 + 2165 2466 411 41.87 -71.02 + 2166 2453 407 42.33 -72.63 + 2167 2412 432 39.41 -77.37 + 2168 2414 434 39.17 -77.17 + 2169 2467 392 43.99 -70.95 + 2170 2361 396 43.56 -83.34 + 2171 2358 408 42.22 -83.75 + 2172 2274 365 47.22 -93.52 + 2173 2279 378 45.70 -92.95 + 2174 2272 383 45.16 -93.84 + 2175 2277 408 42.15 -93.22 + 2176 2301 360 47.84 -90.38 + 2177 2146 371 46.48 -108.54 + 2178 2462 392 44.03 -71.49 + 2179 2171 457 36.45 -105.67 + 2180 2166 462 35.88 -106.27 + 2181 2379 416 41.21 -81.25 + 2182 2351 425 40.20 -84.53 + 2183 2416 427 39.93 -76.88 + 2184 2428 425 40.23 -75.55 + 2185 2449 402 42.89 -73.04 + 2186 2297 371 46.55 -90.92 + 2187 2399 441 38.27 -78.90 + 2188 2027 448 37.51 -122.50 + 2189 2117 421 40.62 -111.99 + 2190 2119 471 34.85 -111.79 + 2191 2122 476 34.26 -111.34 + 2192 2140 477 34.13 -109.31 + 2193 2115 467 35.31 -112.19 + 2194 2142 464 35.65 -109.07 + 2195 2123 460 36.14 -111.24 + 2196 2138 459 36.15 -109.55 + 2197 2115 455 36.71 -112.22 + 2198 2132 454 36.73 -110.25 + 2199 2111 459 36.24 -112.69 + 2200 2105 465 35.53 -113.43 + 2201 2107 473 34.58 -113.18 + 2202 2129 462 35.79 -110.51 + 2203 2142 453 36.92 -109.09 + 2204 2141 457 36.47 -109.15 + 2205 205 444 37.94 23.94 + 2206 2456 582 21.77 -72.27 + 2207 1287 257 59.91 150.72 + 2208 1353 314 53.17 158.45 + 2209 653 248 60.95 76.48 + 2210 3019 312 53.43 -6.25 + 2211 3000 363 47.48 -8.54 + 2212 241 991 -26.14 28.23 + 2213 22 350 49.02 2.53 + 2214 62 395 43.65 7.21 + 2215 3042 423 40.47 -3.58 + 2216 2858 452 36.97 -25.17 + 2217 2995 437 38.77 -9.13 + 2218 75 378 45.63 8.72 + 2219 569 200 66.53 66.67 + 2220 869 288 56.28 101.75 + 2221 891 322 52.27 104.32 + 2222 1154 354 48.53 135.19 + 2223 298 495 32.00 34.90 + 2224 1079 448 37.47 126.43 + 2225 1088 455 36.72 127.50 + 2226 1080 482 33.50 126.48 + 2227 1114 481 33.58 130.45 + 2228 895 669 11.60 104.86 + 2229 2956 686 9.57 -13.62 + 2230 474 946 -20.89 55.53 + 2231 2339 496 31.86 -86.01 + 2232 2286 439 38.59 -92.16 + 2233 2016 380 45.42 -123.82 + 2234 2552 651 13.75 -60.95 + 2235 2545 666 12.00 -61.78 + 2236 2436 839 -8.37 -74.57 diff --git a/parm/product/bufr_ij_gfs_C96.txt b/parm/product/bufr_ij_gfs_C96.txt index c005cc3170..53dc3f2f9a 100644 --- a/parm/product/bufr_ij_gfs_C96.txt +++ b/parm/product/bufr_ij_gfs_C96.txt @@ -111,9 +111,9 @@ 111 292 46 46.42 -86.65 112 289 54 39.16 -89.67 113 276 49 44.05 -101.60 - 114 293 49 43.58 -86.24 - 115 294 50 43.43 -85.30 - 116 294 50 43.37 -84.44 + 114 292 49 43.96 -86.41 + 115 293 49 43.73 -85.51 + 116 294 49 43.62 -84.74 117 273 59 34.38 -104.23 118 333 46 46.70 -48.00 119 326 46 47.20 -55.10 @@ -2113,3 +2113,124 @@ 2113 137 113 -15.51 128.15 2114 377 35 57.48 -7.36 2115 11 38 54.38 10.13 + 2116 308 53 41.24 -72.12 + 2117 299 61 32.70 -80.00 + 2118 289 45 47.91 -89.14 + 2119 290 46 46.67 -88.35 + 2120 254 48 45.24 -122.77 + 2121 218 74 20.79 -156.01 + 2122 218 74 20.71 -156.25 + 2123 219 75 19.82 -155.47 + 2124 214 72 22.04 -159.78 + 2125 218 72 22.27 -155.86 + 2126 219 75 19.47 -155.59 + 2127 195 66 28.20 -177.38 + 2128 214 72 22.21 -159.44 + 2129 216 73 21.45 -157.77 + 2130 219 76 19.10 -155.57 + 2131 299 55 38.43 -79.84 + 2132 305 48 44.85 -74.33 + 2133 304 50 44.56 -73.33 + 2134 304 50 45.00 -73.33 + 2135 307 49 43.60 -72.82 + 2136 307 48 44.59 -72.92 + 2137 307 49 43.98 -73.03 + 2138 291 60 33.90 -87.31 + 2139 293 61 32.91 -85.96 + 2140 299 61 32.70 -80.00 + 2141 302 50 42.57 -77.71 + 2142 299 65 28.85 -80.23 + 2143 299 64 30.02 -80.25 + 2144 291 65 29.80 -87.50 + 2145 295 66 28.50 -83.75 + 2146 295 65 29.25 -84.20 + 2147 299 64 29.80 -80.60 + 2148 293 65 29.77 -86.03 + 2149 253 48 44.64 -123.06 + 2150 255 47 45.52 -121.59 + 2151 252 47 46.10 -124.50 + 2152 252 48 44.60 -124.50 + 2153 250 47 45.90 -125.80 + 2154 295 56 37.63 -84.33 + 2155 271 54 38.81 -106.12 + 2156 272 53 40.38 -105.52 + 2157 272 55 38.43 -105.10 + 2158 293 52 41.53 -85.79 + 2159 294 51 41.64 -85.08 + 2160 276 55 38.00 -101.75 + 2161 309 51 42.18 -71.17 + 2162 308 50 42.55 -71.76 + 2163 307 50 42.59 -72.60 + 2164 309 50 42.62 -70.67 + 2165 309 51 41.87 -71.02 + 2166 307 51 42.33 -72.63 + 2167 302 54 39.41 -77.37 + 2168 302 54 39.17 -77.17 + 2169 309 49 43.99 -70.95 + 2170 296 49 43.56 -83.34 + 2171 295 51 42.22 -83.75 + 2172 285 46 47.22 -93.52 + 2173 285 47 45.70 -92.95 + 2174 284 48 45.16 -93.84 + 2175 285 51 42.15 -93.22 + 2176 288 45 47.84 -90.38 + 2177 269 46 46.48 -108.54 + 2178 308 49 44.03 -71.49 + 2179 272 57 36.45 -105.67 + 2180 271 58 35.88 -106.27 + 2181 298 52 41.21 -81.25 + 2182 294 53 40.20 -84.53 + 2183 302 53 39.93 -76.88 + 2184 304 53 40.23 -75.55 + 2185 307 50 42.89 -73.04 + 2186 288 46 46.55 -90.92 + 2187 300 55 38.27 -78.90 + 2188 254 56 37.51 -122.50 + 2189 265 53 40.62 -111.99 + 2190 265 59 34.85 -111.79 + 2191 266 59 34.26 -111.34 + 2192 268 59 34.13 -109.31 + 2193 265 58 35.31 -112.19 + 2194 268 58 35.65 -109.07 + 2195 266 57 36.14 -111.24 + 2196 268 57 36.15 -109.55 + 2197 265 57 36.71 -112.22 + 2198 267 57 36.73 -110.25 + 2199 264 57 36.24 -112.69 + 2200 264 58 35.53 -113.43 + 2201 264 59 34.58 -113.18 + 2202 267 58 35.79 -110.51 + 2203 268 57 36.92 -109.09 + 2204 268 57 36.47 -109.15 + 2205 26 55 37.94 23.94 + 2206 307 73 21.77 -72.27 + 2207 161 32 59.91 150.72 + 2208 170 39 53.17 158.45 + 2209 82 31 60.95 76.48 + 2210 378 39 53.43 -6.25 + 2211 375 45 47.48 -8.54 + 2212 31 124 -26.14 28.23 + 2213 3 44 49.02 2.53 + 2214 8 49 43.65 7.21 + 2215 381 53 40.47 -3.58 + 2216 358 56 36.97 -25.17 + 2217 375 55 38.77 -9.13 + 2218 10 47 45.63 8.72 + 2219 72 25 66.53 66.67 + 2220 109 36 56.28 101.75 + 2221 112 40 52.27 104.32 + 2222 145 44 48.53 135.19 + 2223 38 62 32.00 34.90 + 2224 135 56 37.47 126.43 + 2225 136 57 36.72 127.50 + 2226 135 60 33.50 126.48 + 2227 140 60 33.58 130.45 + 2228 112 84 11.60 104.86 + 2229 370 86 9.57 -13.62 + 2230 60 118 -20.89 55.53 + 2231 293 62 31.86 -86.01 + 2232 286 55 38.59 -92.16 + 2233 252 47 45.42 -123.82 + 2234 319 81 13.75 -60.95 + 2235 319 83 12.00 -61.78 + 2236 305 105 -8.37 -74.57 diff --git a/parm/product/bufr_stalist.meteo.gfs b/parm/product/bufr_stalist.meteo.gfs index 51d4108bac..0f3f76f23b 100755 --- a/parm/product/bufr_stalist.meteo.gfs +++ b/parm/product/bufr_stalist.meteo.gfs @@ -111,9 +111,9 @@ 000240 46.42N 86.65W KP53 11 MUNISING MI 187 Usr Rqst 10-11 000241 39.16N 89.67W K3LF 11 LITCHFIELD IL 210 Usr Rqst 11-11 000247 44.05N 101.60W PHP 10 PHILIP_AIRPORT, SD 673 Weiss 2-99 -000251 43.58N 86.24W KLDM 12 LUDINGTON MI 244 KGRR 1-02 -000252 43.43N 85.30W KRQB 12 BIG RAPIDS MI 276 KGRR 1-02 -000253 43.37N 84.44W KMOP 12 MOUNT PLEASANT MI 213 KGRR 1-02 +000251 43.96N 86.41W KLDM 12 LUDINGTON MI 244 KGRR 1-02 +000252 43.73N 85.51W KRQB 12 BIG RAPIDS MI 276 KGRR 1-02 +000253 43.62N 84.74W KMOP 12 MOUNT PLEASANT MI 213 KGRR 1-02 000254 34.38N 104.23W FTSR 12 FORT SUMNER NM 1231 Usr Rqst 4-02 000255 46.70N 48.00W WTRO 21 WHITE ROSE OIL RIG 0 Usr Rqst 12-03 000256 47.20N 55.10W MRYS 00 MARYSTOWN NF 0 Usr Rqst 12-03 @@ -2113,3 +2113,124 @@ 999913 15.51S 128.15E WYN 00 Wyndham aerodrome Australia 14 Usr Rqst 1-19 999914 57.48N 7.36W EGPL 00 Benbecula, Scotland, UK 6 Usr Rqst 1-19 999918 54.38N 10.13E EDHK 11 KIEL-HOLTENAU AIRPORT -999 Usr Rqst 1-17 +000530 41.24N 72.12W LIW 21 NEAR LONG ISL TWIN FK NY 9999 Usr Rqst 5-23 +000531 32.70N 80.00W CEA 11 CHARLESTON EXEC ARPT SC 6 Usr Rqst 5-23 +000532 47.91N 89.14W WINM 11 WINDIGO MI 293 Usr Rqst 5-23 +000533 46.67N 88.35W HERM 11 HERMAN MI 530 Usr Rqst 5-23 +000534 45.24N 122.77W KUAO 11 AURORA AIRPORT OR 59 Usr Rqst 5-23 +000535 20.79N 156.01W PHHN 11 HANA AIRPORT HI 24 Usr Rqst 5-23 +000536 20.71N 156.25W HLKL 11 HALEAKALA SUMMIT HI 3055 Usr Rqst 5-23 +000537 19.82N 155.47W MKEA 11 MAUNA KEA SUMMIT HI 4207 Usr Rqst 5-23 +000538 22.04N 159.78W PHBK 11 BARKING SANDS HI 7 Usr Rqst 5-23 +000539 22.27N 155.86W PHUP 11 UPOLU AIRPORT HI 29 Usr Rqst 5-23 +000540 19.47N 155.59W MLOA 11 MAUNA LOA SUMMIT HI 4169 Usr Rqst 5-23 +000541 28.20N 177.38W PMDY 11 HENDERSON FIELD HI 5 Usr Rqst 5-23 +000542 22.21N 159.44W HI01 11 PRINCEVILLE AIRPORT HI 105 Usr Rqst 5-23 +000543 21.45N 157.77W PHNG 11 KANEOHE BAY MCAS HI 7 Usr Rqst 5-23 +000544 19.10N 155.57W SCPE 11 SOUTH CAPE HI 355 Usr Rqst 5-23 +000545 38.43N 79.84W GBO 11 GREEN BANK OBSERVATORY WV 807 Usr Rqst 5-23 +000546 44.85N 74.33W MALO 11 MALONE NY 240 Usr Rqst 5-23 +000547 44.56N 73.33W CLCR 21 COLCHESTER REEF VT 29 Usr Rqst 5-23 +000548 45.00N 73.33W ALBU 21 ALBAUGH VT 38 Usr Rqst 5-23 +000549 43.60N 72.82W KLGN 11 KILLINGTON PEAK VT 1289 Usr Rqst 5-23 +000550 44.59N 72.92W NUND 11 NORTH UNDERHILL VT 315 Usr Rqst 5-23 +000551 43.98N 73.03W RIPT 11 RIPTON VT 512 Usr Rqst 5-23 +000552 33.90N 87.31W KJFX 11 JASPER AL 100 Usr Rqst 5-23 +000553 32.91N 85.96W KALX 11 ALEXANDER CITY AL 209 Usr Rqst 5-23 +000554 32.70N 80.00W KJZI 11 CHARLESTON EXEC ARPT SC 6 Usr Rqst 5-23 +000555 42.57N 77.71W KDSV 11 DANSVILLE NY 215 Usr Rqst 5-23 +000556 28.85N 80.23W NCPE 21 NORTH CAPE FL 9999 Usr Rqst 5-23 +000557 30.02N 80.25W JAXX 21 OFF JACKSONVILLE FL 9999 Usr Rqst 5-23 +000558 29.80N 87.50W PENX 21 OFF PENSACOLA FL 9999 Usr Rqst 5-23 +000559 28.50N 83.75W TPXX 21 OFF TAMPA FL 9999 Usr Rqst 5-23 +000560 29.25N 84.20W TLHX 21 OFF TALLAHASSEE FL 9999 Usr Rqst 5-23 +000561 29.80N 80.60W DABX 21 OFF DAYTONA BEACH FL 9999 Usr Rqst 5-23 +000562 29.77N 86.03W PANX 21 OFF PANAMA CITY FL 9999 Usr Rqst 5-23 +000563 44.64N 123.06W KS12 11 ALBANY OR 60 Usr Rqst 5-23 +000564 45.52N 121.59W PRKD 11 PARKDALE OR 526 Usr Rqst 5-23 +000565 46.10N 124.50W OC29 21 BUOY 29 OR 9999 Usr Rqst 5-23 +000566 44.60N 124.50W OC50 21 BUOY 50 OR 9999 Usr Rqst 5-23 +000567 45.90N 125.80W OC89 21 BUOY 89 OR 9999 Usr Rqst 5-23 +000568 37.63N 84.33W KRGA 10 CENTAL KY REGION ARPT KY 305 Usr Rqst 8-24 +000569 38.81N 106.12W AEJ 10 BUENA VISTA AIRPORT CO 2422 Usr Rqst 8-24 +000570 40.38N 105.52W ESTP 10 ESTES PARK CO 2295 Usr Rqst 8-24 +000571 38.43N 105.10W CANO 10 CANON CITY CO 1658 Usr Rqst 8-24 +000572 41.53N 85.79W GSH 10 GOSHEN MUNICIPAL ARPT IN 252 Usr Rqst 8-24 +000573 41.64N 85.08W ANQ 10 ANGOLA AIRPORT IN 303 Usr Rqst 8-24 +000574 38.00N 101.75W SYSE 10 SYRACUSE, KS KS 1013 Usr Rqst 8-24 +000575 42.18N 71.17W OWD 10 NORWOOD MEMORIAL ARPT MA 15 Usr Rqst 8-24 +000576 42.55N 71.76W FIT 10 FITCHBURG_(ASOS) MA 106 Usr Rqst 8-24 +000577 42.59N 72.60W GRNF 10 GREENFIELD MA 74 Usr Rqst 8-24 +000578 42.62N 70.67W GLOU 10 GLOUCESTER MA 16 Usr Rqst 8-24 +000579 41.87N 71.02W TAN 10 TAUNTON_(ASOS) MA 13 Usr Rqst 8-24 +000580 42.33N 72.63W NTHH 10 NORTHHAMPTON MA 41 Usr Rqst 8-24 +000581 39.41N 77.37W FDK 10 FREDERICK_MUNI_APT MD 92 Usr Rqst 8-24 +000582 39.17N 77.17W GAI 10 GAITHERSBURG MD 116 Usr Rqst 8-24 +000583 43.99N 70.95W IZG 10 FRYEBERG_(ASOS) ME 135 Usr Rqst 8-24 +000584 43.56N 83.34W NERA 10 NEW ERA, MI MI 230 Usr Rqst 8-24 +000585 42.22N 83.75W ARB 10 ANN_ARBOR_MUNI_(ASOS) MI 256 Usr Rqst 8-24 +000586 47.22N 93.52W GPZ 10 GRAND_RAPIDS(AWOS) MN 413 Usr Rqst 8-24 +000587 45.70N 92.95W ROS 10 RUSH_CITY MN 281 Usr Rqst 8-24 +000588 45.16N 93.84W 8Y2 10 BUFFALO_MUNI_ARPT MN 295 Usr Rqst 8-24 +000589 42.15N 93.22W ANE 10 MINNEAPOLIS/BLAINE MN 278 Usr Rqst 8-24 +000590 47.84N 90.38W CKC 10 GRAND_MARAIS/COOK_CO MN 548 Usr Rqst 8-24 +000591 46.48N 108.54W KRPX 10 ROUNDUP MT 1064 Usr Rqst 8-24 +000592 44.03N 71.49W KCMA 10 KANCAMAGUS PASS NH 872 Usr Rqst 8-24 +000593 36.45N 105.67W SKX 10 TAOS_MUNI_APT(AWOS) NM 2161 Usr Rqst 8-24 +000594 35.88N 106.27W LAM 10 LOS_ALAMOS_AIRPORT NM 2186 Usr Rqst 8-24 +000595 41.21N 81.25W 29G 10 RAVENNA_PORTAGE_CO_APT NM 365 Usr Rqst 8-24 +000596 40.20N 84.53W VES 10 VERSAILLES_DARK_CO_APT OH 307 Usr Rqst 8-24 +000597 39.93N 76.88W THV 10 YORK_AIRPORT_(ASOS) PA 148 Usr Rqst 8-24 +000598 40.23N 75.55W PTTO 10 POTTSTOWN, PA PA 92 Usr Rqst 8-24 +000599 42.89N 73.04W WDFD 10 WOODFORD ST PARK VT 703 Usr Rqst 8-24 +000600 46.55N 90.92W ASWI 10 ASHLAND AIRPORT WI 251 Usr Rqst 8-24 +000605 38.27N 78.90W SHD 10 STAUNTON/SHENANDOAH VA 366 Usr Rqst 8-24 +000615 37.51N 122.50W KHAF 10 HALF MOON BAY APT CA 20 Usr Rqst 8-24 +000616 40.62N 111.99W KSVR 10 SOUTH VALLEY APT UT 1404 Usr Rqst 8-24 +001007 34.85N 111.79W KSEZ 10 SEDONA_AIRPORT AZ 1472 Usr Rqst 8/24 +001008 34.26N 111.34W KPAN 10 PAYSON_AIRPORT AZ 1572 Usr Rqst 8/24 +001009 34.13N 109.31W KJTC 10 SPRINGERVILLE MUNI APT AZ 2150 Usr Rqst 8/24 +001010 35.31N 112.19W KCMR 10 WILLIAMS AZ 2039 Usr Rqst 8/24 +001011 35.65N 109.07W KRQE 10 WINDOW_ROCK_(ASOS) AZ 2054 Usr Rqst 8/24 +001012 36.14N 111.24W TUBA 10 TUBA CITY AZ 1499 Usr Rqst 8/24 +001013 36.15N 109.55W CHN 10 CHINLE AZ 1687 Usr Rqst 8/24 +001014 36.71N 112.22W JLK 10 JACOB LAKE AZ 2897 Usr Rqst 8/24 +001015 36.73N 110.25W KAYA 10 KAYENTA AZ 1716 Usr Rqst 8/24 +001016 36.24N 112.69W SUP 10 SUPAI AZ 1012 Usr Rqst 8/24 +001017 35.53N 113.43W PCHS 10 PEACH SPRINGS AZ 1478 Usr Rqst 8/24 +001018 34.58N 113.18W BDD 10 BAGDAD AZ 1189 Usr Rqst 8/24 +001019 35.79N 110.51W SMA 10 SECOND MESA AZ 1737 Usr Rqst 8/24 +001020 36.92N 109.09W TNP 10 TEEC NOS POS AZ 1592 Usr Rqst 8/24 +001021 36.47N 109.15W BOP 10 BUFFALO PASS AZ 2496 Usr Rqst 8/24 +001500 37.94N 23.94E LGAV 11 ATHENS, GREECE 94 Usr Rqst 5-23 +001501 21.77N 72.27W MBPV 11 PROVIDENCIALES, T_C 9 Usr Rqst 5-23 +001502 59.91N 150.72E UHMM 11 MAGADAN, RUSSIA 175 Usr Rqst 5-23 +001503 53.17N 158.45E UHPP 11 PETROPAVLOVSK, RUSSIA 39 Usr Rqst 5-23 +001504 60.95N 76.48E USNN 11 NIZHNEVARTOVSK, RUSSIA 54 Usr Rqst 5-23 +039690 53.43N 6.25W EIDW 11 DUBLIN, IRELAND 68 Usr Rqst 5-23 +066700 47.48N 8.54W LSZH 11 ZURICH, SWITZERLAND 426 Usr Rqst 5-23 +068368 26.14S 28.23E FAJS 11 JOHANNESBURG / TAMBO 1695 Usr Rqst 5-23 +071570 49.02N 2.53E LFPG 11 PARIS/ROISSY-EN-FRANCE 119 Usr Rqst 5-23 +076900 43.65N 7.21E LFMN 11 NICE 4 Usr Rqst 5-23 +082210 40.47N 3.58W LEMD 11 MADRID 631 Usr Rqst 5-23 +085150 36.97N 25.17W LPAZ 11 SANTA MARIA ISL, PORTUGAL 96 Usr Rqst 5-23 +085360 38.77N 9.13W LPPT 11 LISBON, PORTUGAL 114 Usr Rqst 5-23 +160660 45.63N 8.72E LIMC 11 MILANO/MILAN 234 Usr Rqst 5-23 +233300 66.53N 66.67E USDD 11 SALEKHARD, RUSSIA 15 Usr Rqst 5-23 +303090 56.28N 101.75E UIBB 11 BRATSK, RUSSIA 411 Usr Rqst 5-23 +307100 52.27N 104.32E UIII 11 DZERZHINSK, RUSSIA 467 Usr Rqst 5-23 +317350 48.53N 135.19E UHHH 11 KHABAROVSK, RUSSIA 75 Usr Rqst 5-23 +401800 32.00N 34.90E LLBG 11 TEL AVIV, ISRAEL 40 Usr Rqst 5-23 +471130 37.47N 126.43E RKSI 11 SEOUL INCHEON, SOUTH KOREA 7 Usr Rqst 5-23 +471280 36.72N 127.50E RKTU 11 CHONGIU, SOUTH KOREA 53 Usr Rqst 5-23 +471820 33.50N 126.48E RKPC 11 CHEJU, SOUTH KOREA 36 Usr Rqst 5-23 +478080 33.58N 130.45E RJFF 11 FUKUOKA, JAPAN 9 Usr Rqst 5-23 +489910 11.60N 104.86E VDPP 11 PHNOM-PENH, CAMBODIA 10 Usr Rqst 5-23 +618320 9.57N 13.62W GUCY 11 CONAKRY, GUINEA 26 Usr Rqst 5-23 +619800 20.89S 55.53E FMEE 11 ROLAND GARROS, REUNION 20 Usr Rqst 5-23 +722267 31.86N 86.01W KTOI 11 TROY_MUNICIPAL AL 121 Usr Rqst 5-23 +724458 38.59N 92.16W KJEF 11 JEFFERSON CITY ARPT MO 169 Usr Rqst 5-23 +726963 45.42N 123.82W KTMK 11 TILLAMOOK OR 11 Usr Rqst 5-23 +789480 13.75N 60.95W TLPL 11 HEWANORRA, ST LUCIA 3 Usr Rqst 5-23 +789580 12.00N 61.78W TGPY 11 ST GEORGES, GRENADA 6 Usr Rqst 5-23 +845150 8.37S 74.57W SPCL 11 PUCALLPA, PERU 148 Usr Rqst 5-23 From 313a461e13ab0baf843c831d526226ac9df64716 Mon Sep 17 00:00:00 2001 From: Walter Kolczynski - NOAA Date: Fri, 22 Nov 2024 09:07:18 -0500 Subject: [PATCH 11/20] Make aerosol output frequency variable (#2982) # Description The `AERO_HISTORY.rc` file that controls the GOCART output is turned into a template usint `@[ ]` syntax to allow for variable output times. A new "parsing" script is created for GOCART that handles parsing the `AERO_HISTORY.rc` file through `atparse`. Other manip- ulation of these files is also moved to the new parsing script to be consistent with other components. A new variable, `FHOUT_AERO` is introduced to control the output frequency of the GOCART output. This is initially set to 3 to match other components (this is a change from the current value of 6). Since some aerosol fields are also included as part of the atmos output, it may be desirable to meld this back into `FHOUT` later. However, the atmos output has two frequencies (`FHOUT_HF` and `FHOUT`), a feature not supported by other components. The RUN lists for aero fcst, aero analysis, and waves is simplified to avoid confusion, since there is no need for them to only be set if the components are on. Resolves #2072 --- parm/archive/gdas.yaml.j2 | 2 +- parm/archive/gfs_arcdir.yaml.j2 | 2 +- parm/archive/gfsa.yaml.j2 | 2 +- parm/archive/master_gfs.yaml.j2 | 2 +- parm/config/gefs/config.base | 12 ++----- parm/config/gefs/yaml/defaults.yaml | 4 ++- parm/config/gfs/config.base | 13 +++----- parm/ufs/gocart/AERO_HISTORY.rc | 32 +++++++++--------- ush/forecast_postdet.sh | 37 ++++++++++---------- ush/forecast_predet.sh | 6 ++-- ush/parsing_namelists_GOCART.sh | 52 +++++++++++++++++++++++++++++ 11 files changed, 103 insertions(+), 61 deletions(-) create mode 100644 ush/parsing_namelists_GOCART.sh diff --git a/parm/archive/gdas.yaml.j2 b/parm/archive/gdas.yaml.j2 index 1e9597ba1c..7a9e402138 100644 --- a/parm/archive/gdas.yaml.j2 +++ b/parm/archive/gdas.yaml.j2 @@ -67,7 +67,7 @@ gdas: - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}oznstat" - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}radstat" {% endif %} - {% if AERO_ANL_RUN == "gdas" or AERO_ANL_RUN == "both" %} + {% if DO_AERO and (AERO_ANL_RUN == "gdas" or AERO_ANL_RUN == "both") %} - "{{ COMIN_CHEM_ANALYSIS | relpath(ROTDIR) }}/{{ head }}aerostat" {% endif %} {% if DO_PREP_OBS_AERO %} diff --git a/parm/archive/gfs_arcdir.yaml.j2 b/parm/archive/gfs_arcdir.yaml.j2 index 57dbc78885..58e2cdc699 100644 --- a/parm/archive/gfs_arcdir.yaml.j2 +++ b/parm/archive/gfs_arcdir.yaml.j2 @@ -50,7 +50,7 @@ ARCDIR ~ "/snowstat." ~ RUN ~ "." ~ cycle_YMDH ~ ".tgz"]) %} {% endif %} - {% if AERO_ANL_RUN == RUN or AERO_ANL_RUN == "both" %} + {% if DO_AERO and (AERO_ANL_RUN == RUN or AERO_ANL_RUN == "both") %} {% do det_anl_files.append([COMIN_CHEM_ANALYSIS ~ "/" ~ head ~ "aerostat", ARCDIR ~ "/aerostat." ~ RUN ~ "." ~ cycle_YMDH ]) %} {% endif %} diff --git a/parm/archive/gfsa.yaml.j2 b/parm/archive/gfsa.yaml.j2 index dcf059d871..7cb3c770fd 100644 --- a/parm/archive/gfsa.yaml.j2 +++ b/parm/archive/gfsa.yaml.j2 @@ -38,7 +38,7 @@ gfsa: {% else %} - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}gsistat" {% endif %} - {% if AERO_ANL_RUN == "gfs" or AERO_ANL_RUN == "both" %} + {% if DO_AERO and (AERO_ANL_RUN == "gfs" or AERO_ANL_RUN == "both") %} - "{{ COMIN_CHEM_ANALYSIS | relpath(ROTDIR) }}/{{ head }}aerostat" {% endif %} {% if DO_PREP_OBS_AERO %} diff --git a/parm/archive/master_gfs.yaml.j2 b/parm/archive/master_gfs.yaml.j2 index ab9a00c95e..3f7c2e9d14 100644 --- a/parm/archive/master_gfs.yaml.j2 +++ b/parm/archive/master_gfs.yaml.j2 @@ -33,7 +33,7 @@ datasets: {% endfilter %} {% endif %} -{% if AERO_FCST_RUN == "gfs" or AERO_FCST_RUN == "both" %} +{% if DO_AERO and (AERO_FCST_RUN == "gfs" or AERO_FCST_RUN == "both") %} # Aerosol forecasts {% filter indent(width=4) %} {% include "chem.yaml.j2" %} diff --git a/parm/config/gefs/config.base b/parm/config/gefs/config.base index 13f286c494..bf34504f09 100644 --- a/parm/config/gefs/config.base +++ b/parm/config/gefs/config.base @@ -136,9 +136,8 @@ export DO_OCN="NO" export DO_ICE="NO" export DO_AERO="NO" export DO_EXTRACTVARS="@DO_EXTRACTVARS@" # Option to process and extract a subset of products to save on disk -export AERO_FCST_RUN="" # When to run aerosol forecast: gdas, gfs, or both -export AERO_ANL_RUN="" # When to run aerosol analysis: gdas, gfs, or both -export WAVE_RUN="" # When to include wave suite: gdas, gfs, or both +export AERO_FCST_RUN="gefs" # When to run aerosol forecast: gdas, gfs, or both +export WAVE_RUN="gefs" # When to include wave suite: gdas, gfs, or both export DOBNDPNT_WAVE="NO" # The GEFS buoys file does not currently have any boundary points export DOIBP_WAV="NO" # Option to create point outputs from input boundary points export FRAC_GRID=".true." @@ -184,13 +183,10 @@ case "${APP}" in ;; ATMA) export DO_AERO="YES" - export AERO_ANL_RUN="both" - export AERO_FCST_RUN="gdas" ;; ATMW) export DO_COUPLED="YES" export DO_WAVE="YES" - export WAVE_RUN="both" ;; NG-GODAS) export DO_ATM="NO" @@ -204,13 +200,10 @@ case "${APP}" in if [[ "${APP}" =~ A$ ]]; then export DO_AERO="YES" - export AERO_ANL_RUN="both" - export AERO_FCST_RUN="gdas" fi if [[ "${APP}" =~ ^S2SW ]]; then export DO_WAVE="YES" - export WAVE_RUN="both" fi ;; *) @@ -225,6 +218,7 @@ export FHMAX=9 export FHOUT=3 # Will be changed to 1 in config.base if (DOHYBVAR set to NO and l4densvar set to false) export FHOUT_OCN=3 export FHOUT_ICE=3 +export FHOUT_AERO=3 # GFS cycle info export INTERVAL_GFS=@INTERVAL_GFS@ # Frequency of GFS forecast diff --git a/parm/config/gefs/yaml/defaults.yaml b/parm/config/gefs/yaml/defaults.yaml index f0e8772b67..cda90c5485 100644 --- a/parm/config/gefs/yaml/defaults.yaml +++ b/parm/config/gefs/yaml/defaults.yaml @@ -31,4 +31,6 @@ stage_ic: USE_ATM_ENS_PERTURB_FILES: "NO" ocn: MOM6_INTERP_ICS: "NO" - +# config.aero has just a system-specific path to add. +# This is handled by the setup_expt.py, but it has to be told to write to it. +aero: {} diff --git a/parm/config/gfs/config.base b/parm/config/gfs/config.base index 4f702f9668..b0d4fbf42a 100644 --- a/parm/config/gfs/config.base +++ b/parm/config/gfs/config.base @@ -176,9 +176,9 @@ export DO_OCN="NO" export DO_ICE="NO" export DO_AERO="NO" export DO_PREP_OBS_AERO="NO" -export AERO_FCST_RUN="" # When to run aerosol forecast: gdas, gfs, or both -export AERO_ANL_RUN="" # When to run aerosol analysis: gdas, gfs, or both -export WAVE_RUN="" # When to include wave suite: gdas, gfs, or both +export AERO_FCST_RUN="gdas" # When to run aerosol forecast: gdas, gfs, or both +export AERO_ANL_RUN="both" # When to run aerosol analysis: gdas, gfs, or both +export WAVE_RUN="both" # When to include wave suite: gdas, gfs, or both export DOBNDPNT_WAVE="NO" export DOIBP_WAV="NO" # Option to create point outputs from input boundary points export FRAC_GRID=".true." @@ -229,13 +229,10 @@ case "${APP}" in ;; ATMA) export DO_AERO="YES" - export AERO_ANL_RUN="both" - export AERO_FCST_RUN="gdas" ;; ATMW) export DO_COUPLED="YES" export DO_WAVE="YES" - export WAVE_RUN="both" ;; NG-GODAS) export DO_ATM="NO" @@ -249,13 +246,10 @@ case "${APP}" in if [[ "${APP}" =~ A$ ]]; then export DO_AERO="YES" - export AERO_ANL_RUN="both" - export AERO_FCST_RUN="gdas" fi if [[ "${APP}" =~ ^S2SW ]]; then export DO_WAVE="YES" - export WAVE_RUN="both" fi ;; *) @@ -278,6 +272,7 @@ export FHMAX=9 export FHOUT=3 # Will be changed to 1 in config.base if (DOHYBVAR set to NO and l4densvar set to false) export FHOUT_OCN=3 export FHOUT_ICE=3 +export FHOUT_AERO=3 # Cycle to run EnKF (set to BOTH for both gfs and gdas) export EUPD_CYC="@EUPD_CYC@" diff --git a/parm/ufs/gocart/AERO_HISTORY.rc b/parm/ufs/gocart/AERO_HISTORY.rc index 4c7df15b2a..db1b934f5f 100644 --- a/parm/ufs/gocart/AERO_HISTORY.rc +++ b/parm/ufs/gocart/AERO_HISTORY.rc @@ -58,7 +58,7 @@ PC720x361-DC.LM: 72 inst_du_ss.mode: 'instantaneous', inst_du_ss.grid_label: PC720x361-DC , inst_du_ss.splitField: 1, - inst_du_ss.frequency: 120000 , + inst_du_ss.frequency: @[inst_du_ss_freq] , inst_du_ss.duration: 010000 , inst_du_ss.ref_time: 000000 , inst_du_ss.nbits: 10, @@ -72,7 +72,7 @@ PC720x361-DC.LM: 72 tavg_du_ss.mode: 'time-averaged', tavg_du_ss.grid_label: PC720x361-DC , tavg_du_ss.splitField: 1, - tavg_du_ss.frequency: 120000 , + tavg_du_ss.frequency: @[tavg_du_ss_freq] , tavg_du_ss.duration: 010000 , tavg_du_ss.ref_time: 000000 , tavg_du_ss.nbits: 10, @@ -85,7 +85,7 @@ PC720x361-DC.LM: 72 inst_ca.template: '%y4%m2%d2_%h2%n2z.nc4', inst_ca.mode: 'instantaneous', inst_ca.grid_label: PC720x361-DC , - inst_ca.frequency: 120000 , + inst_ca.frequency: @[inst_ca_freq] , inst_ca.duration: 010000 , inst_ca.ref_time: 000000 , inst_ca.nbits: 10, @@ -100,7 +100,7 @@ PC720x361-DC.LM: 72 inst_ni.template: '%y4%m2%d2_%h2%n2z.nc4', inst_ni.mode: 'instantaneous', inst_ni.grid_label: PC720x361-DC , - inst_ni.frequency: 120000 , + inst_ni.frequency: @[inst_ni_freq] , inst_ni.duration: 010000 , inst_ni.ref_time: 000000 , inst_ni.nbits: 10, @@ -116,7 +116,7 @@ PC720x361-DC.LM: 72 inst_su.template: '%y4%m2%d2_%h2%n2z.nc4', inst_su.mode: 'instantaneous', inst_su.grid_label: PC720x361-DC , - inst_su.frequency: 120000 , + inst_su.frequency: @[inst_su_freq] , inst_su.duration: 010000 , inst_su.ref_time: 000000 , inst_su.nbits: 10, @@ -135,7 +135,7 @@ PC720x361-DC.LM: 72 inst_du_bin.mode: 'instantaneous' inst_du_bin.grid_label: PC720x361-DC , inst_du_bin.splitField: 1, - inst_du_bin.frequency: 010000 , + inst_du_bin.frequency: @[inst_du_bin_freq] , inst_du_bin.duration: 010000 , inst_du_bin.ref_time: 000000 , inst_du_bin.nbits: 10, @@ -152,7 +152,7 @@ PC720x361-DC.LM: 72 tavg_du_bin.mode: 'time-averaged' tavg_du_bin.grid_label: PC720x361-DC , tavg_du_bin.splitField: 1, - tavg_du_bin.frequency: 030000 , + tavg_du_bin.frequency: @[tavg_du_bin_freq] , tavg_du_bin.duration: 010000 , tavg_du_bin.ref_time: 000000 , tavg_du_bin.nbits: 10, @@ -169,7 +169,7 @@ PC720x361-DC.LM: 72 inst_ss_bin.mode: 'instantaneous' inst_ss_bin.grid_label: PC720x361-DC , inst_ss_bin.splitField: 1, - inst_ss_bin.frequency: 060000 , + inst_ss_bin.frequency: @[inst_ss_bin_freq] , inst_ss_bin.duration: 010000 , inst_ss_bin.ref_time: 000000 , inst_ss_bin.nbits: 10, @@ -186,7 +186,7 @@ PC720x361-DC.LM: 72 inst_ca_bin.mode: 'instantaneous' inst_ca_bin.grid_label: PC720x361-DC , inst_ca_bin.splitField: 1, - inst_ca_bin.frequency: 120000 , + inst_ca_bin.frequency: @[inst_ca_bin_freq] , inst_ca_bin.duration: 010000 , inst_ca_bin.ref_time: 000000 , inst_ca_bin.nbits: 10, @@ -208,7 +208,7 @@ PC720x361-DC.LM: 72 inst_ni_bin.mode: 'instantaneous', inst_ni_bin.grid_label: PC720x361-DC , inst_ni_bin.splitField: 1, - inst_ni_bin.frequency: 120000 , + inst_ni_bin.frequency: @[inst_ni_bin_freq] , inst_ni_bin.duration: 010000 , inst_ni_bin.ref_time: 000000 , inst_ni_bin.nbits: 10, @@ -225,7 +225,7 @@ PC720x361-DC.LM: 72 inst_su_bin.mode: 'instantaneous', inst_su_bin.grid_label: PC720x361-DC , inst_su_bin.splitField: 1, - inst_su_bin.frequency: 120000 , + inst_su_bin.frequency: @[inst_su_bin_freq] , inst_su_bin.duration: 010000 , inst_su_bin.ref_time: 000000 , inst_su_bin.nbits: 10, @@ -244,7 +244,7 @@ PC720x361-DC.LM: 72 inst_2d.template: '%y4%m2%d2_%h2%n2z.nc4', inst_2d.archive: '%c/Y%y4', inst_2d.mode: 'instantaneous' - inst_2d.frequency: 030000, + inst_2d.frequency: @[inst_2d_freq], inst_2d.duration: 030000, inst_2d.ref_time: 000000, inst_2d.grid_label: PC720x361-DC @@ -343,7 +343,7 @@ PC720x361-DC.LM: 72 inst_3d.template: '%y4%m2%d2_%h2%n2z.nc4' , inst_3d.archive: '%c/Y%y4' , inst_3d.mode: 'instantaneous' - inst_3d.frequency: 060000, + inst_3d.frequency: @[inst_3d_freq], inst_3d.duration: 010000, inst_3d.ref_time: 000000, inst_3d.grid_label: PC720x361-DC @@ -381,7 +381,7 @@ PC720x361-DC.LM: 72 inst_aod.template: '%y4%m2%d2_%h2%n2z.nc4' , inst_aod.archive: '%c/Y%y4' , inst_aod.mode: 'instantaneous' - inst_aod.frequency: 060000, + inst_aod.frequency: @[inst_aod_freq], inst_aod.duration: 010000, inst_aod.ref_time: 000000, inst_aod.grid_label: PC720x361-DC @@ -398,7 +398,7 @@ PC720x361-DC.LM: 72 tavg_2d_rad.template: '%y4%m2%d2_%h2%n2z.nc4', tavg_2d_rad.archive: '%c/Y%y4', tavg_2d_rad.mode: 'time-averaged', - tavg_2d_rad.frequency: 120000, + tavg_2d_rad.frequency: @[tavg_2d_rad_freq], tavg_2d_rad.duration: 120000, tavg_2d_rad.ref_time: 000000, tavg_2d_rad.grid_label: PC720x361-DC @@ -432,7 +432,7 @@ PC720x361-DC.LM: 72 tavg_3d_rad.template: '%y4%m2%d2_%h2%n2z.nc4', tavg_3d_rad.archive: '%c/Y%y4', tavg_3d_rad.mode: 'time-averaged', - tavg_3d_rad.frequency: 120000, + tavg_3d_rad.frequency: @[tavg_3d_rad_freq], tavg_3d_rad.duration: 120000, tavg_3d_rad.ref_time: 000000, tavg_3d_rad.grid_label: PC720x361-DC diff --git a/ush/forecast_postdet.sh b/ush/forecast_postdet.sh index 25b2e28d75..310fcf0afa 100755 --- a/ush/forecast_postdet.sh +++ b/ush/forecast_postdet.sh @@ -689,30 +689,15 @@ GOCART_rc() { [[ ${status} -ne 0 ]] && exit "${status}" fi - # copying GOCART configuration files - if [[ -n "${AERO_CONFIG_DIR}" ]]; then - ${NCP} "${AERO_CONFIG_DIR}"/*.rc "${DATA}" - status=$? - [[ ${status} -ne 0 ]] && exit "${status}" - # attempt to generate ExtData configuration file if not provided - if [[ ! -f "${DATA}/AERO_ExtData.rc" ]]; then - { \ - echo "PrimaryExports%%" ; \ - cat "${AERO_CONFIG_DIR}/ExtData.other" ; \ - cat "${AERO_CONFIG_DIR}/ExtData.${AERO_EMIS_FIRE:-none}" ; \ - echo "%%" ; \ - } > "${DATA}/AERO_ExtData.rc" - status=$? - if (( status != 0 )); then exit "${status}"; fi - fi - fi + source "${USHgfs}/parsing_namelists_GOCART.sh" + GOCART_namelists } GOCART_postdet() { echo "SUB ${FUNCNAME[0]}: Linking output data for GOCART" local vdate - for fhr in ${GOCART_OUTPUT_FH}; do + for fhr in $(GOCART_output_fh); do vdate=$(date --utc -d "${current_cycle:0:8} ${current_cycle:8:2} + ${fhr} hours" +%Y%m%d%H) # Temporarily delete existing files due to noclobber in GOCART @@ -726,6 +711,18 @@ GOCART_postdet() { done } +GOCART_output_fh() { + # This has to be called during postdet after FHROT has been set + local aero_min + local gocart_output_fh + # GOCART produces no AOD files at the initial forecast time, so start the time + # after the forecast start (accounting for FHROT) + aero_min=$(( ${IAU_FHROT:-0} > FHMIN ? IAU_FHROT + FHOUT_AERO : FHMIN + FHOUT_AERO )) + gocart_output_fh=$(seq -s ' ' "$(( aero_min ))" "${FHOUT_AERO}" "${GOCART_MAX}") + + echo "${gocart_output_fh}" +} + GOCART_out() { echo "SUB ${FUNCNAME[0]}: Copying output data for GOCART" @@ -733,8 +730,8 @@ GOCART_out() { # TODO: this should be linked but there are issues where gocart crashing if it is linked local fhr local vdate - for fhr in ${GOCART_OUTPUT_FH}; do - if (( fhr == 0 )); then continue; fi + + for fhr in $(GOCART_output_fh); do vdate=$(date --utc -d "${current_cycle:0:8} ${current_cycle:8:2} + ${fhr} hours" +%Y%m%d%H) ${NCP} "${DATA}/gocart.inst_aod.${vdate:0:8}_${vdate:8:2}00z.nc4" \ "${COMOUT_CHEM_HISTORY}/gocart.inst_aod.${vdate:0:8}_${vdate:8:2}00z.nc4" diff --git a/ush/forecast_predet.sh b/ush/forecast_predet.sh index 43c9eb968f..3c3dd719ef 100755 --- a/ush/forecast_predet.sh +++ b/ush/forecast_predet.sh @@ -724,6 +724,8 @@ GOCART_predet(){ if [[ ! -d "${COMOUT_CHEM_HISTORY}" ]]; then mkdir -p "${COMOUT_CHEM_HISTORY}"; fi - GOCART_OUTPUT_FH=$(seq -s ' ' "${FHMIN}" "6" "${FHMAX}") - # TODO: AERO_HISTORY.rc has hardwired output frequency to 6 hours + # FHMAX gets modified when IAU is on, so keep origianl value for GOCART output + GOCART_MAX=${FHMAX} + + # GOCART output times can't be computed here because they may depend on FHROT } diff --git a/ush/parsing_namelists_GOCART.sh b/ush/parsing_namelists_GOCART.sh new file mode 100644 index 0000000000..e39f0808ab --- /dev/null +++ b/ush/parsing_namelists_GOCART.sh @@ -0,0 +1,52 @@ +#! /usr/bin/env bash + +# Disable variable not used warnings +# shellcheck disable=SC2034 +GOCART_namelists() { + # copying GOCART configuration files + if [[ -n "${AERO_CONFIG_DIR}" ]]; then + + local base_in + local fhout_aero_padded + fhout_aero_padded=$(printf "%02d" "${FHOUT_AERO}") + # Only instantaneous AOD is output right now + local inst_aod_freq="${fhout_aero_padded}0000" + + # Other gocart fields not currently used + local inst_du_ss_freq="120000" + local tavg_du_ss_freq="120000" + local inst_ca_freq="120000" + local inst_ni_freq="120000" + local inst_su_freq="120000" + local inst_du_bin_freq="010000" + local tavg_du_bin_freq="030000" + local inst_ss_bin_freq="060000" + local inst_ca_bin_freq="120000" + local inst_ni_bin_freq="120000" + local inst_su_bin_freq="120000" + local inst_2d_freq="030000" + local inst_3d_freq="060000" + local tavg_2d_rad_freq="120000" + local tavg_3d_rad_freq="120000" + + for template_in in "${AERO_CONFIG_DIR}/"*.rc; do + base_in="$(basename "${template_in}")" + atparse < "${template_in}" >> "${DATA}/${base_in}" + status=$? + [[ ${status} -ne 0 ]] && exit "${status}" + done + + # attempt to generate ExtData configuration file if not provided + if [[ ! -f "${DATA}/AERO_ExtData.rc" ]]; then + { \ + echo "PrimaryExports%%" ; \ + cat "${AERO_CONFIG_DIR}/ExtData.other" ; \ + cat "${AERO_CONFIG_DIR}/ExtData.${AERO_EMIS_FIRE:-none}" ; \ + echo "%%" ; \ + } > "${DATA}/AERO_ExtData.rc" + # shellcheck disable=SC2320 + status=$? + if (( status != 0 )); then exit "${status}"; fi + fi + fi +} From efc25be5d82889bb9d4ec6f290d6c69f418768e0 Mon Sep 17 00:00:00 2001 From: Cory Martin Date: Sat, 23 Nov 2024 11:29:18 -0500 Subject: [PATCH 12/20] Speed up GSI analysis jobs in CI testing (#3115) This PR adds `DO_TEST_MODE`, which can be used for other things in the future but for now sets the GSI to run just 5 iterations per outer loop to reduce runtime for CI testing. Resolves #3114 --- ci/cases/gfsv17/ocnanal.yaml | 1 + ci/cases/yamls/atmaerosnowDA_defaults_ci.yaml | 1 + ci/cases/yamls/gfs_defaults_ci.yaml | 1 + ci/cases/yamls/gfs_extended_ci.yaml | 1 + ci/cases/yamls/soca_gfs_defaults_ci.yaml | 1 + parm/config/gefs/config.base | 1 + parm/config/gefs/yaml/defaults.yaml | 1 + parm/config/gfs/config.anal | 5 +++++ parm/config/gfs/config.base | 1 + parm/config/gfs/yaml/defaults.yaml | 1 + 10 files changed, 14 insertions(+) diff --git a/ci/cases/gfsv17/ocnanal.yaml b/ci/cases/gfsv17/ocnanal.yaml index d559f544e4..b0605c9c16 100644 --- a/ci/cases/gfsv17/ocnanal.yaml +++ b/ci/cases/gfsv17/ocnanal.yaml @@ -15,6 +15,7 @@ base: DO_VRFY_OCEANDA: "NO" FHMAX_GFS: 240 ACCOUNT: {{ 'HPC_ACCOUNT' | getenv }} + DO_TEST_MODE: "YES" marineanl: SOCA_INPUT_FIX_DIR: {{ HOMEgfs }}/fix/gdas/soca/1440x1080x75/soca diff --git a/ci/cases/yamls/atmaerosnowDA_defaults_ci.yaml b/ci/cases/yamls/atmaerosnowDA_defaults_ci.yaml index 6d978e25ef..24f629128a 100644 --- a/ci/cases/yamls/atmaerosnowDA_defaults_ci.yaml +++ b/ci/cases/yamls/atmaerosnowDA_defaults_ci.yaml @@ -3,3 +3,4 @@ defaults: base: DO_JEDISNOWDA: "YES" ACCOUNT: {{ 'HPC_ACCOUNT' | getenv }} + DO_TEST_MODE: "YES" diff --git a/ci/cases/yamls/gfs_defaults_ci.yaml b/ci/cases/yamls/gfs_defaults_ci.yaml index d09f78b8b8..65d440ac93 100644 --- a/ci/cases/yamls/gfs_defaults_ci.yaml +++ b/ci/cases/yamls/gfs_defaults_ci.yaml @@ -2,3 +2,4 @@ defaults: !INC {{ HOMEgfs }}/parm/config/gfs/yaml/defaults.yaml base: ACCOUNT: {{ 'HPC_ACCOUNT' | getenv }} + DO_TEST_MODE: "YES" diff --git a/ci/cases/yamls/gfs_extended_ci.yaml b/ci/cases/yamls/gfs_extended_ci.yaml index 8caa942eed..e60350ad8a 100644 --- a/ci/cases/yamls/gfs_extended_ci.yaml +++ b/ci/cases/yamls/gfs_extended_ci.yaml @@ -12,3 +12,4 @@ base: FCST_BREAKPOINTS: 192 FHMAX_GFS: 384 FHMAX_HF_GFS: 120 + DO_TEST_MODE: "YES" diff --git a/ci/cases/yamls/soca_gfs_defaults_ci.yaml b/ci/cases/yamls/soca_gfs_defaults_ci.yaml index 3d75cc911a..38d55e3574 100644 --- a/ci/cases/yamls/soca_gfs_defaults_ci.yaml +++ b/ci/cases/yamls/soca_gfs_defaults_ci.yaml @@ -3,3 +3,4 @@ defaults: base: ACCOUNT: {{ 'HPC_ACCOUNT' | getenv }} DO_JEDIOCNVAR: "YES" + DO_TEST_MODE: "YES" diff --git a/parm/config/gefs/config.base b/parm/config/gefs/config.base index bf34504f09..848cdcfbda 100644 --- a/parm/config/gefs/config.base +++ b/parm/config/gefs/config.base @@ -65,6 +65,7 @@ export REALTIME="YES" # Experiment mode (cycled or forecast-only) export MODE="@MODE@" # cycled/forecast-only export SFS_POST="@SFS_POST@" # TODO, place holder until RUN=SFS is developed +export DO_TEST_MODE="@DO_TEST_MODE@" # option to change configuration for automated testing #################################################### # DO NOT ADD MACHINE DEPENDENT STUFF BELOW THIS LINE diff --git a/parm/config/gefs/yaml/defaults.yaml b/parm/config/gefs/yaml/defaults.yaml index cda90c5485..48cf912dcb 100644 --- a/parm/config/gefs/yaml/defaults.yaml +++ b/parm/config/gefs/yaml/defaults.yaml @@ -21,6 +21,7 @@ base: HPSSARCH: "NO" LOCALARCH: "NO" SFS_POST: "NO" + DO_TEST_MODE: "NO" fcst: reforecast: "NO" FHZER: 6 diff --git a/parm/config/gfs/config.anal b/parm/config/gfs/config.anal index 27ff8742e4..123bd6decd 100644 --- a/parm/config/gfs/config.anal +++ b/parm/config/gfs/config.anal @@ -29,6 +29,11 @@ fi export lobsdiag_forenkf=".false." # anal does not need to write out jacobians # set to .true. in config.eobs and config.eupd +# Reduce number of iterations for testing mode +if [[ ${DO_TEST_MODE} = "YES" ]]; then + export SETUP="${SETUP:-}niter(1)=5,niter(2)=5," +fi + # Do not process the following datasets export GSNDBF=${GSNDBF:-/dev/null} export AMSREBF=${AMSREBF:-/dev/null} diff --git a/parm/config/gfs/config.base b/parm/config/gfs/config.base index b0d4fbf42a..8150d2e39c 100644 --- a/parm/config/gfs/config.base +++ b/parm/config/gfs/config.base @@ -88,6 +88,7 @@ export REALTIME="YES" # Experiment mode (cycled or forecast-only) export MODE="@MODE@" # cycled/forecast-only +export DO_TEST_MODE="@DO_TEST_MODE@" # option to change configuration for automated testing #################################################### # DO NOT ADD MACHINE DEPENDENT STUFF BELOW THIS LINE diff --git a/parm/config/gfs/yaml/defaults.yaml b/parm/config/gfs/yaml/defaults.yaml index d8cf76a47b..05dfc90332 100644 --- a/parm/config/gfs/yaml/defaults.yaml +++ b/parm/config/gfs/yaml/defaults.yaml @@ -21,6 +21,7 @@ base: GSI_SOILANAL: "NO" EUPD_CYC: "gdas" FHMAX_ENKF_GFS: 12 + DO_TEST_MODE: "NO" atmanl: JCB_ALGO_YAML_VAR: "${PARMgfs}/gdas/atm/jcb-prototype_3dvar.yaml.j2" From 1ba8985c0bb731488663e519b51dfe3ba3f756a1 Mon Sep 17 00:00:00 2001 From: Anna Shlyaeva Date: Sat, 23 Nov 2024 13:20:57 -0700 Subject: [PATCH 13/20] Run one executable for soca2cice (instead of two) (#3118) Run a single executable to add soca increments to cice restart files, processing arctic and antarctic simultaneously to save on runtime and I/O. Resolves NOAA-EMC/GDASApp#1367 --------- Co-authored-by: shlyaeva Co-authored-by: RussTreadon-NOAA <26926959+RussTreadon-NOAA@users.noreply.github.com> Co-authored-by: RussTreadon-NOAA --- scripts/exglobal_marine_analysis_checkpoint.py | 5 ++--- sorc/gdas.cd | 2 +- ush/python/pygfs/task/marine_analysis.py | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/scripts/exglobal_marine_analysis_checkpoint.py b/scripts/exglobal_marine_analysis_checkpoint.py index 84b180b287..c47a2e3a0e 100755 --- a/scripts/exglobal_marine_analysis_checkpoint.py +++ b/scripts/exglobal_marine_analysis_checkpoint.py @@ -24,6 +24,5 @@ # Prepare the SOCA increment for MOM6 IAU MarineAnl.checkpoint_mom6_iau('socaincr2mom6.yaml') - # Insert the seaice analysis into the CICE6 restarts in 2 sequential stages - MarineAnl.checkpoint_cice6('soca_2cice_arctic.yaml') - MarineAnl.checkpoint_cice6('soca_2cice_antarctic.yaml') + # Insert the seaice analysis into the CICE6 restart + MarineAnl.checkpoint_cice6('soca_2cice_global.yaml') diff --git a/sorc/gdas.cd b/sorc/gdas.cd index e514b92656..9ab7994a0c 160000 --- a/sorc/gdas.cd +++ b/sorc/gdas.cd @@ -1 +1 @@ -Subproject commit e514b926561bfc8fa3de741876505aff74255c95 +Subproject commit 9ab7994a0caf6b201613dd7e7ceae482ffa600e0 diff --git a/ush/python/pygfs/task/marine_analysis.py b/ush/python/pygfs/task/marine_analysis.py index 75cc28c7b3..4f8fa760c0 100644 --- a/ush/python/pygfs/task/marine_analysis.py +++ b/ush/python/pygfs/task/marine_analysis.py @@ -284,7 +284,7 @@ def _prep_checkpoint(self: Task) -> None: # render the SOCA to CICE YAML file for the Arctic and Antarctic logger.info("render the SOCA to CICE YAML file for the Arctic and Antarctic") - varchgyamls = ['soca_2cice_arctic.yaml', 'soca_2cice_antarctic.yaml'] + varchgyamls = ['soca_2cice_global.yaml'] for varchgyaml in varchgyamls: soca2cice_config = parse_j2yaml(path=os.path.join(self.task_config.MARINE_JCB_GDAS_ALGO, f'{varchgyaml}.j2'), data=soca2cice_param) From e41eff2b8e1867eb90a6ccfd852b8687036d6e9f Mon Sep 17 00:00:00 2001 From: David Huber <69919478+DavidHuber-NOAA@users.noreply.github.com> Date: Tue, 26 Nov 2024 08:10:53 -0500 Subject: [PATCH 14/20] Allow APP to differ between RUNs (#2943) This enables APP to be specified for each RUN. This also removes the need for a `_no_run` configuration dictionary and somewhat simplifies the `_init_finalize` method. Resolves #2908 Resolves #2956 --- ci/Jenkinsfile | 2 +- jobs/JGLOBAL_FORECAST | 2 +- parm/archive/gdas.yaml.j2 | 2 +- parm/archive/gfs_arcdir.yaml.j2 | 2 +- parm/archive/gfsa.yaml.j2 | 2 +- parm/archive/master_gfs.yaml.j2 | 2 +- parm/config/gefs/config.base | 8 +- parm/config/gefs/config.efcs | 4 +- parm/config/gefs/config.fcst | 16 +- parm/config/gefs/config.resources | 4 +- parm/config/gfs/config.base | 34 +- parm/config/gfs/config.efcs | 2 +- parm/config/gfs/config.fcst | 16 +- parm/config/gfs/config.resources | 4 +- scripts/exglobal_archive.py | 6 +- ush/python/pygfs/task/archive.py | 2 +- workflow/applications/applications.py | 149 +++---- workflow/applications/gefs.py | 44 +- workflow/applications/gfs_cycled.py | 461 +++++++++++---------- workflow/applications/gfs_forecast_only.py | 93 +++-- workflow/rocoto/gefs_tasks.py | 47 +-- workflow/rocoto/gefs_xml.py | 2 +- workflow/rocoto/gfs_cycled_xml.py | 2 +- workflow/rocoto/gfs_forecast_only_xml.py | 6 +- workflow/rocoto/gfs_tasks.py | 100 +++-- workflow/rocoto/tasks.py | 9 +- workflow/rocoto/workflow_xml.py | 7 +- 27 files changed, 515 insertions(+), 513 deletions(-) diff --git a/ci/Jenkinsfile b/ci/Jenkinsfile index b3bd6a917a..3c889e51d5 100644 --- a/ci/Jenkinsfile +++ b/ci/Jenkinsfile @@ -5,7 +5,7 @@ def cases = '' def GH = 'none' // Location of the custom workspaces for each machine in the CI system. They are persitent for each iteration of the PR. def NodeName = [hera: 'Hera-EMC', orion: 'Orion-EMC', hercules: 'Hercules-EMC', gaea: 'Gaea'] -def custom_workspace = [hera: '/scratch1/NCEPDEV/global/CI', orion: '/work2/noaa/stmp/CI/ORION', hercules: '/work2/noaa/global/CI/HERCULES', gaea: '/gpfs/f5/epic/proj-shared/global/CI'] +def custom_workspace = [hera: '/scratch1/NCEPDEV/global/CI_dh', orion: '/work2/noaa/stmp/CI/ORION', hercules: '/work2/noaa/global/CI/HERCULES', gaea: '/gpfs/f5/epic/proj-shared/global/CI'] def repo_url = 'git@github.com:NOAA-EMC/global-workflow.git' def STATUS = 'Passed' diff --git a/jobs/JGLOBAL_FORECAST b/jobs/JGLOBAL_FORECAST index e64a91d21c..0572f1d2d9 100755 --- a/jobs/JGLOBAL_FORECAST +++ b/jobs/JGLOBAL_FORECAST @@ -77,7 +77,7 @@ if [[ "${DO_ICE}" == "YES" ]]; then COMIN_ICE_RESTART_PREV:COM_ICE_RESTART_TMPL fi -if [[ "${DO_AERO}" == "YES" ]]; then +if [[ "${DO_AERO_FCST}" == "YES" ]]; then YMD="${PDY}" HH="${cyc}" declare_from_tmpl -rx \ COMOUT_CHEM_HISTORY:COM_CHEM_HISTORY_TMPL fi diff --git a/parm/archive/gdas.yaml.j2 b/parm/archive/gdas.yaml.j2 index 7a9e402138..fa8919a589 100644 --- a/parm/archive/gdas.yaml.j2 +++ b/parm/archive/gdas.yaml.j2 @@ -67,7 +67,7 @@ gdas: - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}oznstat" - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}radstat" {% endif %} - {% if DO_AERO and (AERO_ANL_RUN == "gdas" or AERO_ANL_RUN == "both") %} + {% if DO_AERO_ANL %} - "{{ COMIN_CHEM_ANALYSIS | relpath(ROTDIR) }}/{{ head }}aerostat" {% endif %} {% if DO_PREP_OBS_AERO %} diff --git a/parm/archive/gfs_arcdir.yaml.j2 b/parm/archive/gfs_arcdir.yaml.j2 index 58e2cdc699..98803b473c 100644 --- a/parm/archive/gfs_arcdir.yaml.j2 +++ b/parm/archive/gfs_arcdir.yaml.j2 @@ -50,7 +50,7 @@ ARCDIR ~ "/snowstat." ~ RUN ~ "." ~ cycle_YMDH ~ ".tgz"]) %} {% endif %} - {% if DO_AERO and (AERO_ANL_RUN == RUN or AERO_ANL_RUN == "both") %} + {% if DO_AERO_ANL %} {% do det_anl_files.append([COMIN_CHEM_ANALYSIS ~ "/" ~ head ~ "aerostat", ARCDIR ~ "/aerostat." ~ RUN ~ "." ~ cycle_YMDH ]) %} {% endif %} diff --git a/parm/archive/gfsa.yaml.j2 b/parm/archive/gfsa.yaml.j2 index 7cb3c770fd..4efe281120 100644 --- a/parm/archive/gfsa.yaml.j2 +++ b/parm/archive/gfsa.yaml.j2 @@ -38,7 +38,7 @@ gfsa: {% else %} - "{{ COMIN_ATMOS_ANALYSIS | relpath(ROTDIR) }}/{{ head }}gsistat" {% endif %} - {% if DO_AERO and (AERO_ANL_RUN == "gfs" or AERO_ANL_RUN == "both") %} + {% if DO_AERO_ANL %} - "{{ COMIN_CHEM_ANALYSIS | relpath(ROTDIR) }}/{{ head }}aerostat" {% endif %} {% if DO_PREP_OBS_AERO %} diff --git a/parm/archive/master_gfs.yaml.j2 b/parm/archive/master_gfs.yaml.j2 index 3f7c2e9d14..e7187d70d5 100644 --- a/parm/archive/master_gfs.yaml.j2 +++ b/parm/archive/master_gfs.yaml.j2 @@ -33,7 +33,7 @@ datasets: {% endfilter %} {% endif %} -{% if DO_AERO and (AERO_FCST_RUN == "gfs" or AERO_FCST_RUN == "both") %} +{% if DO_AERO_FCST %} # Aerosol forecasts {% filter indent(width=4) %} {% include "chem.yaml.j2" %} diff --git a/parm/config/gefs/config.base b/parm/config/gefs/config.base index 848cdcfbda..acfc39db33 100644 --- a/parm/config/gefs/config.base +++ b/parm/config/gefs/config.base @@ -135,10 +135,8 @@ export DO_COUPLED="NO" export DO_WAVE="NO" export DO_OCN="NO" export DO_ICE="NO" -export DO_AERO="NO" export DO_EXTRACTVARS="@DO_EXTRACTVARS@" # Option to process and extract a subset of products to save on disk -export AERO_FCST_RUN="gefs" # When to run aerosol forecast: gdas, gfs, or both -export WAVE_RUN="gefs" # When to include wave suite: gdas, gfs, or both +export DO_AERO_FCST="NO" export DOBNDPNT_WAVE="NO" # The GEFS buoys file does not currently have any boundary points export DOIBP_WAV="NO" # Option to create point outputs from input boundary points export FRAC_GRID=".true." @@ -183,7 +181,7 @@ case "${APP}" in ATM) ;; ATMA) - export DO_AERO="YES" + export DO_AERO_FCST="YES" ;; ATMW) export DO_COUPLED="YES" @@ -200,7 +198,7 @@ case "${APP}" in export DO_ICE="YES" if [[ "${APP}" =~ A$ ]]; then - export DO_AERO="YES" + export DO_AERO_FCST="YES" fi if [[ "${APP}" =~ ^S2SW ]]; then diff --git a/parm/config/gefs/config.efcs b/parm/config/gefs/config.efcs index 27d7be235d..6bf0ed0a18 100644 --- a/parm/config/gefs/config.efcs +++ b/parm/config/gefs/config.efcs @@ -6,7 +6,7 @@ echo "BEGIN: config.efcs" # Turn off components in ensemble -# export DO_AERO="NO" +# export DO_AERO_FCST="NO" # export DO_OCN="NO" # export DO_ICE="NO" # export DO_WAVE="NO" @@ -19,7 +19,7 @@ string="--fv3 ${CASE}" [[ "${DO_OCN}" == "YES" ]] && string="${string} --mom6 ${OCNRES}" [[ "${DO_ICE}" == "YES" ]] && string="${string} --cice6 ${ICERES}" [[ "${DO_WAVE}" == "YES" ]] && string="${string} --ww3 ${waveGRD// /;}" -[[ "${DO_AERO}" == "YES" ]] && string="${string} --gocart" +[[ "${DO_AERO_FCST}" == "YES" ]] && string="${string} --gocart" # shellcheck disable=SC2086 source "${EXPDIR}/config.ufs" ${string} diff --git a/parm/config/gefs/config.fcst b/parm/config/gefs/config.fcst index c600c8edbf..0461c7e909 100644 --- a/parm/config/gefs/config.fcst +++ b/parm/config/gefs/config.fcst @@ -8,24 +8,12 @@ echo "BEGIN: config.fcst" export USE_ESMF_THREADING="YES" # Toggle to use ESMF-managed threading or traditional threading in UFSWM export COPY_FINAL_RESTARTS="NO" # Toggle to copy restarts from the end of GFS/GEFS Run (GDAS is handled seperately) -# Turn off waves if not used for this RUN -case ${WAVE_RUN} in - both | "${RUN/enkf}" ) ;; # Don't change - *) DO_WAVE="NO" ;; # Turn waves off -esac - -# Turn off aerosols if not used for this RUN -case ${AERO_FCST_RUN} in - both | "${RUN/enkf}" ) ;; # Don't change - *) DO_AERO="NO" ;; # Turn waves off -esac - # Source model specific information that is resolution dependent string="--fv3 ${CASE}" [[ "${DO_OCN}" == "YES" ]] && string="${string} --mom6 ${OCNRES}" [[ "${DO_ICE}" == "YES" ]] && string="${string} --cice6 ${ICERES}" [[ "${DO_WAVE}" == "YES" ]] && string="${string} --ww3 ${waveGRD// /;}" -[[ "${DO_AERO}" == "YES" ]] && string="${string} --gocart" +[[ "${DO_AERO_FCST}" == "YES" ]] && string="${string} --gocart" # We are counting on $string being multiple arguments # shellcheck disable=SC2086 source "${EXPDIR}/config.ufs" ${string} @@ -142,7 +130,7 @@ tbp="" if [[ "${progsigma}" == ".true." ]]; then tbp="_progsigma" ; fi # Radiation options -if [[ "${DO_AERO}" == "YES" ]]; then +if [[ "${DO_AERO_FCST}" == "YES" ]]; then export IAER=2011 # spectral band mapping method for aerosol optical properties else export IAER=1011 diff --git a/parm/config/gefs/config.resources b/parm/config/gefs/config.resources index 690fdf919a..a730ea401c 100644 --- a/parm/config/gefs/config.resources +++ b/parm/config/gefs/config.resources @@ -65,7 +65,7 @@ case ${step} in export ntasks=1 export tasks_per_node=1 export threads_per_task=1 - export is_exclusive=True + export memory="4096M" ;; "waveinit") @@ -144,7 +144,7 @@ case ${step} in echo "MEDIATOR using (threads, PETS) = (${MEDTHREADS}, ${MEDPETS})" CHMPETS=0; CHMTHREADS=0 - if [[ "${DO_AERO}" == "YES" ]]; then + if [[ "${DO_AERO_FCST}" == "YES" ]]; then # GOCART shares the same grid and forecast tasks as FV3 (do not add write grid component tasks). (( CHMTHREADS = ATMTHREADS )) (( CHMPETS = FV3PETS )) diff --git a/parm/config/gfs/config.base b/parm/config/gfs/config.base index 8150d2e39c..91f353360f 100644 --- a/parm/config/gfs/config.base +++ b/parm/config/gfs/config.base @@ -160,6 +160,7 @@ export APP=@APP@ shopt -s extglob # Adjust APP based on RUN +# If a component (WAVES, etc) needs to be turned off by RUN, set it here case "${RUN}" in enkf*) # Turn off aerosols and waves APP="${APP/%+([WA])}" @@ -175,11 +176,12 @@ export DO_COUPLED="NO" export DO_WAVE="NO" export DO_OCN="NO" export DO_ICE="NO" -export DO_AERO="NO" +DO_AERO="NO" export DO_PREP_OBS_AERO="NO" -export AERO_FCST_RUN="gdas" # When to run aerosol forecast: gdas, gfs, or both -export AERO_ANL_RUN="both" # When to run aerosol analysis: gdas, gfs, or both -export WAVE_RUN="both" # When to include wave suite: gdas, gfs, or both +aero_fcst_runs="gdas" # When to run aerosol forecast: gdas, gfs, or both +aero_anl_runs="gdas gfs" # When to run aerosol analysis: gdas, gfs, or both +export DO_AERO_FCST="NO" +export DO_AERO_ANL="NO" export DOBNDPNT_WAVE="NO" export DOIBP_WAV="NO" # Option to create point outputs from input boundary points export FRAC_GRID=".true." @@ -221,7 +223,7 @@ case "${CASE}" in ;; *) echo "FATAL ERROR: Unrecognized CASE ${CASE}, ABORT!" - exit 1 + exit 2 ;; esac @@ -229,7 +231,7 @@ case "${APP}" in ATM) ;; ATMA) - export DO_AERO="YES" + DO_AERO="YES" ;; ATMW) export DO_COUPLED="YES" @@ -246,7 +248,7 @@ case "${APP}" in export DO_ICE="YES" if [[ "${APP}" =~ A$ ]]; then - export DO_AERO="YES" + DO_AERO="YES" fi if [[ "${APP}" =~ ^S2SW ]]; then @@ -254,11 +256,21 @@ case "${APP}" in fi ;; *) - echo "Unrecognized APP: '${APP}'" - exit 2 + echo "FATAL ERROR: Unrecognized APP: '${APP}'" + exit 3 ;; esac +# Aerosol forecasts and analyses may be RUN-dependent +if [[ "${DO_AERO}" == "YES" ]]; then + if [[ ${aero_anl_runs} =~ ${RUN} ]]; then + export DO_AERO_ANL="YES" + fi + if [[ ${aero_fcst_runs} =~ ${RUN} ]]; then + export DO_AERO_FCST="YES" + fi +fi + # Surface cycle update frequency if [[ "${RUN}" =~ "gdas" ]] ; then export FHCYC=1 @@ -457,8 +469,8 @@ export FHMAX_FITS=132 export HPSSARCH="@HPSSARCH@" # save data to HPSS archive export LOCALARCH="@LOCALARCH@" # save data to local archive if [[ ${HPSSARCH} = "YES" ]] && [[ ${LOCALARCH} = "YES" ]]; then - echo "Both HPSS and local archiving selected. Please choose one or the other." - exit 3 + echo "FATAL ERROR: Both HPSS and local archiving selected. Please choose one or the other." + exit 4 fi export ARCH_CYC=00 # Archive data at this cycle for warm_start capability export ARCH_WARMICFREQ=4 # Archive frequency in days for warm_start capability diff --git a/parm/config/gfs/config.efcs b/parm/config/gfs/config.efcs index 1837cf0619..d27fd13cfa 100644 --- a/parm/config/gfs/config.efcs +++ b/parm/config/gfs/config.efcs @@ -13,7 +13,7 @@ string="--fv3 ${CASE}" [[ "${DO_OCN}" == "YES" ]] && string="${string} --mom6 ${OCNRES}" [[ "${DO_ICE}" == "YES" ]] && string="${string} --cice6 ${ICERES}" [[ "${DO_WAVE}" == "YES" ]] && string="${string} --ww3 ${waveGRD// /;}" -[[ "${DO_AERO}" == "YES" ]] && string="${string} --gocart" +[[ "${DO_AERO_FCST}" == "YES" ]] && string="${string} --gocart" # We are counting on $string being multiple arguments # shellcheck disable=SC2086 source "${EXPDIR}/config.ufs" ${string} diff --git a/parm/config/gfs/config.fcst b/parm/config/gfs/config.fcst index 571e6cafb5..b154d37114 100644 --- a/parm/config/gfs/config.fcst +++ b/parm/config/gfs/config.fcst @@ -8,24 +8,12 @@ echo "BEGIN: config.fcst" export USE_ESMF_THREADING="YES" # Toggle to use ESMF-managed threading or traditional threading in UFSWM export COPY_FINAL_RESTARTS="NO" # Toggle to copy restarts from the end of GFS/GEFS Run (GDAS is handled seperately) -# Turn off waves if not used for this RUN -case ${WAVE_RUN} in - both | "${RUN/enkf}" ) ;; # Don't change - *) DO_WAVE="NO" ;; # Turn waves off -esac - -# Turn off aerosols if not used for this RUN -case ${AERO_FCST_RUN} in - both | "${RUN/enkf}" ) ;; # Don't change - *) DO_AERO="NO" ;; # Turn aerosols off -esac - # Source model specific information that is resolution dependent string="--fv3 ${CASE}" [[ "${DO_OCN}" == "YES" ]] && string="${string} --mom6 ${OCNRES}" [[ "${DO_ICE}" == "YES" ]] && string="${string} --cice6 ${ICERES}" [[ "${DO_WAVE}" == "YES" ]] && string="${string} --ww3 ${waveGRD// /;}" -[[ "${DO_AERO}" == "YES" ]] && string="${string} --gocart" +[[ "${DO_AERO_FCST}" == "YES" ]] && string="${string} --gocart" # We are counting on $string being multiple arguments # shellcheck disable=SC2086 source "${EXPDIR}/config.ufs" ${string} @@ -157,7 +145,7 @@ tbp="" if [[ "${progsigma}" == ".true." ]]; then tbp="_progsigma" ; fi # Radiation options -if [[ "${DO_AERO}" == "YES" ]]; then +if [[ "${DO_AERO_FCST}" == "YES" ]]; then export IAER=2011 # spectral band mapping method for aerosol optical properties else export IAER=1011 diff --git a/parm/config/gfs/config.resources b/parm/config/gfs/config.resources index cddd1643fd..bc2a89054e 100644 --- a/parm/config/gfs/config.resources +++ b/parm/config/gfs/config.resources @@ -809,7 +809,7 @@ case ${step} in echo "MEDIATOR using (threads, PETS) = (${MEDTHREADS}, ${MEDPETS})" CHMPETS=0; CHMTHREADS=0 - if [[ "${DO_AERO}" == "YES" ]]; then + if [[ "${DO_AERO_FCST}" == "YES" ]]; then # GOCART shares the same grid and forecast tasks as FV3 (do not add write grid component tasks). (( CHMTHREADS = ATMTHREADS )) (( CHMPETS = FV3PETS )) @@ -1036,7 +1036,7 @@ case ${step} in ntasks=1 tasks_per_node=1 threads_per_task=1 - export is_exclusive=True + memory="4096M" ;; "atmensanlinit") diff --git a/scripts/exglobal_archive.py b/scripts/exglobal_archive.py index 4ee9e5ed0e..2d3fa58313 100755 --- a/scripts/exglobal_archive.py +++ b/scripts/exglobal_archive.py @@ -3,7 +3,7 @@ import os from pygfs.task.archive import Archive -from wxflow import AttrDict, Logger, cast_strdict_as_dtypedict, chdir, logit +from wxflow import AttrDict, Logger, cast_strdict_as_dtypedict, logit # initialize root logger logger = Logger(level=os.environ.get("LOGGING_LEVEL", "DEBUG"), colored_log=True) @@ -19,7 +19,7 @@ def main(): # Pull out all the configuration keys needed to run the rest of archive steps keys = ['ATARDIR', 'current_cycle', 'FHMIN', 'FHMAX', 'FHOUT', 'RUN', 'PDY', - 'DO_VERFRAD', 'DO_VMINMON', 'DO_VERFOZN', 'DO_ICE', 'DO_AERO', 'DO_PREP_OBS_AERO', + 'DO_VERFRAD', 'DO_VMINMON', 'DO_VERFOZN', 'DO_ICE', 'DO_PREP_OBS_AERO', 'PARMgfs', 'DO_OCN', 'DO_WAVE', 'WRITE_DOPOST', 'PSLOT', 'HPSSARCH', 'DO_MOS', 'DO_JEDISNOWDA', 'LOCALARCH', 'REALTIME', 'ROTDIR', 'ARCH_WARMICFREQ', 'ARCH_FCSTICFREQ', 'ARCH_CYC', 'assim_freq', 'ARCDIR', 'SDATE', @@ -29,7 +29,7 @@ def main(): 'DOIAU', 'OCNRES', 'ICERES', 'NUM_SND_COLLECTIVES', 'FHOUT_WAV', 'FHOUT_HF_WAV', 'FHMAX_WAV', 'FHMAX_HF_WAV', 'FHMAX_WAV_GFS', 'restart_interval_gdas', 'restart_interval_gfs', - 'AERO_ANL_RUN', 'AERO_FCST_RUN', 'DOIBP_WAV', 'DO_JEDIOCNVAR', + 'DO_AERO_ANL', 'DO_AERO_FCST', 'DOIBP_WAV', 'DO_JEDIOCNVAR', 'NMEM_ENS', 'DO_JEDIATMVAR', 'DO_VRFY_OCEANDA', 'FHMAX_FITS', 'waveGRD', 'IAUFHRS', 'DO_FIT2OBS', 'NET', 'FHOUT_HF_GFS', 'FHMAX_HF_GFS', 'REPLAY_ICS', 'OFFSET_START_HOUR'] diff --git a/ush/python/pygfs/task/archive.py b/ush/python/pygfs/task/archive.py index 108cd2ed27..f1d8cdf865 100644 --- a/ush/python/pygfs/task/archive.py +++ b/ush/python/pygfs/task/archive.py @@ -50,7 +50,7 @@ def configure(self, arch_dict: Dict[str, Any]) -> (Dict[str, Any], List[Dict[str Parameters ---------- arch_dict : Dict[str, Any] - Task specific keys, e.g. runtime options (DO_AERO, DO_ICE, etc) + Task specific keys, e.g. runtime options (DO_AERO_FCST, DO_ICE, etc) Return ------ diff --git a/workflow/applications/applications.py b/workflow/applications/applications.py index ecd320d708..22e299df20 100644 --- a/workflow/applications/applications.py +++ b/workflow/applications/applications.py @@ -1,9 +1,8 @@ #!/usr/bin/env python3 from typing import Dict, List, Any -from datetime import timedelta from hosts import Host -from wxflow import Configuration, to_timedelta +from wxflow import Configuration from abc import ABC, ABCMeta, abstractmethod __all__ = ['AppConfig'] @@ -31,94 +30,83 @@ def __init__(self, conf: Configuration) -> None: self.scheduler = Host().scheduler + # Get the most basic settings from config.base to determine + # experiment type ({NET}_{MODE}) base = conf.parse_config('config.base') self.mode = base['MODE'] - if self.mode not in self.VALID_MODES: raise NotImplementedError(f'{self.mode} is not a valid application mode.\n' f'Valid application modes are:\n' f'{", ".join(self.VALID_MODES)}\n') self.net = base['NET'] - self.model_app = base.get('APP', 'ATM') - self.do_atm = base.get('DO_ATM', True) - self.do_wave = base.get('DO_WAVE', False) - self.do_wave_bnd = base.get('DOBNDPNT_WAVE', False) - self.do_ocean = base.get('DO_OCN', False) - self.do_ice = base.get('DO_ICE', False) - self.do_aero = base.get('DO_AERO', False) - self.do_prep_obs_aero = base.get('DO_PREP_OBS_AERO', False) - self.do_bufrsnd = base.get('DO_BUFRSND', False) - self.do_gempak = base.get('DO_GEMPAK', False) - self.do_awips = base.get('DO_AWIPS', False) - self.do_verfozn = base.get('DO_VERFOZN', True) - self.do_verfrad = base.get('DO_VERFRAD', True) - self.do_vminmon = base.get('DO_VMINMON', True) - self.do_tracker = base.get('DO_TRACKER', True) - self.do_genesis = base.get('DO_GENESIS', True) - self.do_genesis_fsu = base.get('DO_GENESIS_FSU', False) - self.do_metp = base.get('DO_METP', False) - self.do_upp = not base.get('WRITE_DOPOST', True) - self.do_goes = base.get('DO_GOES', False) - self.do_mos = base.get('DO_MOS', False) - self.do_extractvars = base.get('DO_EXTRACTVARS', False) - - self.do_hpssarch = base.get('HPSSARCH', False) - - self.nens = base.get('NMEM_ENS', 0) - self.fcst_segments = base.get('FCST_SEGMENTS', None) - self.interval_gfs = to_timedelta(f"{base.get('INTERVAL_GFS')}H") - - if not AppConfig.is_monotonic(self.fcst_segments): - raise ValueError(f'Forecast segments do not increase monotonically: {",".join(self.fcst_segments)}') - - self.wave_runs = None - if self.do_wave: - wave_run = base.get('WAVE_RUN', 'BOTH').lower() - if wave_run in ['both']: - self.wave_runs = ['gfs', 'gdas'] - elif wave_run in ['gfs', 'gdas']: - self.wave_runs = [wave_run] - - self.aero_anl_runs = None - self.aero_fcst_runs = None - if self.do_aero: - aero_anl_run = base.get('AERO_ANL_RUN', 'BOTH').lower() - if aero_anl_run in ['both']: - self.aero_anl_runs = ['gfs', 'gdas'] - elif aero_anl_run in ['gfs', 'gdas']: - self.aero_anl_runs = [aero_anl_run] - aero_fcst_run = base.get('AERO_FCST_RUN', None).lower() - if aero_fcst_run in ['both']: - self.aero_fcst_runs = ['gfs', 'gdas'] - elif aero_fcst_run in ['gfs', 'gdas']: - self.aero_fcst_runs = [aero_fcst_run] + print(f"Generating the XML for a {self.mode}_{self.net} case") def _init_finalize(self, conf: Configuration): - print("Finalizing initialize") - - # Get a list of all possible config_files that would be part of the application - self.configs_names = self._get_app_configs() - - # Source the config files for the jobs in the application without specifying a RUN - self.configs = {'_no_run': self._source_configs(conf)} - - # Update the base config dictionary based on application - self.configs['_no_run']['base'] = self._update_base(self.configs['_no_run']['base']) + ''' + Finalize object initialization calling subclass methods + ''' - # Save base in the internal state since it is often needed - base = self.configs['_no_run']['base'] + # Get run-, net-, and mode-based options + self.run_options = self._get_run_options(conf) - # Get task names for the application + # Get task names and runs for the application self.task_names = self.get_task_names() - # Finally, source the configuration files for each valid `RUN` - for run in self.task_names.keys(): + # Initialize the configs and model_apps dictionaries + self.configs = dict.fromkeys(self.runs) + + # Now configure the experiment for each valid run + for run in self.runs: self.configs[run] = self._source_configs(conf, run=run, log=False) - # Update the base config dictionary based on application and RUN - self.configs[run]['base'] = self._update_base(self.configs[run]['base']) + def _get_run_options(self, conf: Configuration) -> Dict[str, Any]: + ''' + Determine the do_* and APP options for each RUN by sourcing config.base + for each RUN and collecting the flags into self.run_options. Note that + this method is overloaded so additional NET- and MODE-dependent flags + can be set. + ''' + + run_options = {run: {} for run in dict.fromkeys(self.runs)} + for run in self.runs: + # Read config.base with RUN specified + run_base = conf.parse_config('config.base', RUN=run) + + run_options[run]['app'] = run_base.get('APP', 'ATM') + run_options[run]['do_wave_bnd'] = run_base.get('DOBNDPNT_WAVE', False) + run_options[run]['do_bufrsnd'] = run_base.get('DO_BUFRSND', False) + run_options[run]['do_gempak'] = run_base.get('DO_GEMPAK', False) + run_options[run]['do_awips'] = run_base.get('DO_AWIPS', False) + run_options[run]['do_verfozn'] = run_base.get('DO_VERFOZN', True) + run_options[run]['do_verfrad'] = run_base.get('DO_VERFRAD', True) + run_options[run]['do_vminmon'] = run_base.get('DO_VMINMON', True) + run_options[run]['do_tracker'] = run_base.get('DO_TRACKER', True) + run_options[run]['do_genesis'] = run_base.get('DO_GENESIS', True) + run_options[run]['do_genesis_fsu'] = run_base.get('DO_GENESIS_FSU', False) + run_options[run]['do_metp'] = run_base.get('DO_METP', False) + run_options[run]['do_upp'] = not run_base.get('WRITE_DOPOST', True) + run_options[run]['do_goes'] = run_base.get('DO_GOES', False) + run_options[run]['do_mos'] = run_base.get('DO_MOS', False) + run_options[run]['do_extractvars'] = run_base.get('DO_EXTRACTVARS', False) + + run_options[run]['do_atm'] = run_base.get('DO_ATM', True) + run_options[run]['do_wave'] = run_base.get('DO_WAVE', False) + run_options[run]['do_ocean'] = run_base.get('DO_OCN', False) + run_options[run]['do_ice'] = run_base.get('DO_ICE', False) + run_options[run]['do_prep_obs_aero'] = run_base.get('DO_PREP_OBS_AERO', False) + run_options[run]['do_aero_anl'] = run_base.get('DO_AERO_ANL', False) + run_options[run]['do_aero_fcst'] = run_base.get('DO_AERO_FCST', False) + + run_options[run]['do_hpssarch'] = run_base.get('HPSSARCH', False) + run_options[run]['fcst_segments'] = run_base.get('FCST_SEGMENTS', None) + + if not AppConfig.is_monotonic(run_options[run]['fcst_segments']): + raise ValueError(f'Forecast segments do not increase monotonically: {",".join(self.fcst_segments)}') + + # Return the dictionary of run options + return run_options @abstractmethod def _get_app_configs(self): @@ -150,13 +138,12 @@ def _source_configs(self, conf: Configuration, run: str = "gfs", log: bool = Tru Every config depends on "config.base" """ - configs = dict() - - # Return config.base as well - configs['base'] = conf.parse_config('config.base', RUN=run) + # Include config.base by its lonesome and update it + configs = {'base': conf.parse_config('config.base', RUN=run)} + configs['base'] = self._update_base(configs['base']) # Source the list of all config_files involved in the application - for config in self.configs_names: + for config in self._get_app_configs(run): # All must source config.base first files = ['config.base'] @@ -182,9 +169,9 @@ def _source_configs(self, conf: Configuration, run: str = "gfs", log: bool = Tru return configs @abstractmethod - def get_task_names(self, run="_no_run") -> Dict[str, List[str]]: + def get_task_names(self, run: str) -> Dict[str, List[str]]: ''' - Create a list of task names for each RUN valid for the configuation. + Create a list of valid RUNs and a dict of task names for each RUN valid for the configuation. Parameters ---------- @@ -192,7 +179,7 @@ def get_task_names(self, run="_no_run") -> Dict[str, List[str]]: Returns ------- - Dict[str, List[str]]: Lists of tasks for each RUN. + Dict[str, List[str]]: Lists of all tasks for each RUN. ''' pass diff --git a/workflow/applications/gefs.py b/workflow/applications/gefs.py index 9d1d5c3dc4..33545eb2ec 100644 --- a/workflow/applications/gefs.py +++ b/workflow/applications/gefs.py @@ -1,4 +1,5 @@ from applications.applications import AppConfig +from typing import Dict, Any from wxflow import Configuration @@ -12,28 +13,38 @@ def __init__(self, conf: Configuration): base = conf.parse_config('config.base') self.run = base.get('RUN', 'gefs') + self.runs = [self.run] - def _get_app_configs(self): + def _get_run_options(self, conf: Configuration) -> Dict[str, Any]: + + run_options = super()._get_run_options(conf) + + run_options[self.run]['nens'] = conf.parse_config('config.base').get('NMEM_ENS', 0) + + return run_options + + def _get_app_configs(self, run): """ Returns the config_files that are involved in gefs """ + options = self.run_options[run] configs = ['stage_ic', 'fcst', 'atmos_products', 'arch', 'cleanup'] - if self.nens > 0: + if options['nens'] > 0: configs += ['efcs', 'atmos_ensstat'] - if self.do_wave: + if options['do_wave']: configs += ['waveinit', 'wavepostsbs', 'wavepostpnt'] - if self.do_wave_bnd: + if options['do_wave_bnd']: configs += ['wavepostbndpnt', 'wavepostbndpntbll'] - if self.do_ocean or self.do_ice: + if options['do_ocean'] or options['do_ice']: configs += ['oceanice_products'] - if self.do_aero: + if options['do_aero_fcst']: configs += ['prep_emissions'] - if self.do_extractvars: + if options['do_extractvars']: configs += ['extractvars'] return configs @@ -48,37 +59,38 @@ def _update_base(base_in): def get_task_names(self): + options = self.run_options[self.run] tasks = ['stage_ic'] - if self.do_wave: + if options['do_wave']: tasks += ['waveinit'] - if self.do_aero: + if options['do_aero_fcst']: tasks += ['prep_emissions'] tasks += ['fcst'] - if self.nens > 0: + if options['nens'] > 0: tasks += ['efcs'] tasks += ['atmos_prod'] - if self.nens > 0: + if options['nens'] > 0: tasks += ['atmos_ensstat'] - if self.do_ocean: + if options['do_ocean']: tasks += ['ocean_prod'] - if self.do_ice: + if options['do_ice']: tasks += ['ice_prod'] - if self.do_wave: + if options['do_wave']: tasks += ['wavepostsbs'] - if self.do_wave_bnd: + if options['do_wave_bnd']: tasks += ['wavepostbndpnt', 'wavepostbndpntbll'] tasks += ['wavepostpnt'] - if self.do_extractvars: + if options['do_extractvars']: tasks += ['extractvars', 'arch'] tasks += ['cleanup'] diff --git a/workflow/applications/gfs_cycled.py b/workflow/applications/gfs_cycled.py index e85e8b159f..2d16b6a59c 100644 --- a/workflow/applications/gfs_cycled.py +++ b/workflow/applications/gfs_cycled.py @@ -1,7 +1,6 @@ -from typing import Dict, Any from applications.applications import AppConfig -from wxflow import Configuration, to_timedelta -from datetime import timedelta +from typing import Dict, Any +from wxflow import Configuration class GFSCycledAppConfig(AppConfig): @@ -11,113 +10,136 @@ class GFSCycledAppConfig(AppConfig): def __init__(self, conf: Configuration): super().__init__(conf) + # Re-read config.base without RUN specified to get the basic settings for + # cycled cases to be able to determine valid runs base = conf.parse_config('config.base') - self.do_hybvar = base.get('DOHYBVAR', False) - self.do_fit2obs = base.get('DO_FIT2OBS', True) - self.do_jediatmvar = base.get('DO_JEDIATMVAR', False) - self.do_jediatmens = base.get('DO_JEDIATMENS', False) - self.do_jediocnvar = base.get('DO_JEDIOCNVAR', False) - self.do_jedisnowda = base.get('DO_JEDISNOWDA', False) - self.do_mergensst = base.get('DO_MERGENSST', False) - self.do_vrfy_oceanda = base.get('DO_VRFY_OCEANDA', False) - - self.lobsdiag_forenkf = False - self.eupd_runs = None - if self.do_hybvar: - self.lobsdiag_forenkf = base.get('lobsdiag_forenkf', False) - eupd_run = base.get('EUPD_CYC', 'gdas').lower() - if eupd_run in ['both']: - self.eupd_runs = ['gfs', 'gdas'] - elif eupd_run in ['gfs', 'gdas']: - self.eupd_runs = [eupd_run] - - def _get_app_configs(self): + + self.ens_runs = [] + + if base.get('DOHYBVAR', False): + ens_run = base.get('EUPD_CYC', 'gdas').lower() + if ens_run in ['both']: + self.ens_runs = ['gfs', 'gdas'] + elif ens_run in ['gfs', 'gdas']: + self.ens_runs = [ens_run] + + # Now construct self.runs the desired XML order (gdas, enkfgdas, gfs, enkfgfs) + self.runs = ["gdas"] # We always have a 'gdas' run + self.runs.append('enkfgdas') if 'gdas' in self.ens_runs else 0 + self.runs.append("gfs") if base['INTERVAL_GFS'] > 0 else 0 + self.runs.append('enkfgfs') if 'gfs' in self.ens_runs and "gfs" in self.runs else 0 + + def _get_run_options(self, conf: Configuration) -> Dict[str, Any]: + + run_options = super()._get_run_options(conf) + + for run in self.runs: + base = conf.parse_config('config.base', RUN=run) + + run_options[run]['do_hybvar'] = base.get('DOHYBVAR', False) + run_options[run]['nens'] = base.get('NMEM_ENS', 0) + if run_options[run]['do_hybvar']: + run_options[run]['lobsdiag_forenkf'] = base.get('lobsdiag_forenkf', False) + + run_options[run]['do_fit2obs'] = base.get('DO_FIT2OBS', True) + run_options[run]['do_jediatmvar'] = base.get('DO_JEDIATMVAR', False) + run_options[run]['do_jediatmens'] = base.get('DO_JEDIATMENS', False) + run_options[run]['do_jediocnvar'] = base.get('DO_JEDIOCNVAR', False) + run_options[run]['do_jedisnowda'] = base.get('DO_JEDISNOWDA', False) + run_options[run]['do_mergensst'] = base.get('DO_MERGENSST', False) + run_options[run]['do_vrfy_oceanda'] = base.get('DO_VRFY_OCEANDA', False) + + return run_options + + def _get_app_configs(self, run): """ - Returns the config_files that are involved in the cycled app + Returns the config files that are involved in the cycled app """ + options = self.run_options[run] configs = ['prep'] - if self.do_jediatmvar: + if options['do_jediatmvar']: configs += ['prepatmiodaobs', 'atmanlinit', 'atmanlvar', 'atmanlfv3inc', 'atmanlfinal'] else: configs += ['anal', 'analdiag'] - if self.do_jediocnvar: + if options['do_jediocnvar']: configs += ['prepoceanobs', 'marineanlinit', 'marinebmat', 'marineanlvar'] - if self.do_hybvar: + if options['do_hybvar']: configs += ['marineanlletkf', 'ocnanalecen'] configs += ['marineanlchkpt', 'marineanlfinal'] - if self.do_vrfy_oceanda: + if options['do_vrfy_oceanda']: configs += ['ocnanalvrfy'] - if self.do_ocean or self.do_ice: + if options['do_ocean'] or options['do_ice']: configs += ['oceanice_products'] configs += ['stage_ic', 'sfcanl', 'analcalc', 'fcst', 'upp', 'atmos_products', 'arch', 'cleanup'] - if self.do_hybvar: - if self.do_jediatmens: - configs += ['atmensanlinit', 'atmensanlobs', 'atmensanlsol', 'atmensanlletkf', 'atmensanlfv3inc', 'atmensanlfinal'] + if options['do_hybvar']: + if options['do_jediatmens']: + configs += ['atmensanlinit', 'atmensanlobs', 'atmensanlsol', + 'atmensanlletkf', 'atmensanlfv3inc', 'atmensanlfinal'] else: configs += ['eobs', 'eomg', 'ediag', 'eupd'] configs += ['ecen', 'esfc', 'efcs', 'echgres', 'epos', 'earc'] - if self.do_fit2obs: + if options['do_fit2obs']: configs += ['fit2obs'] - if self.do_verfozn: + if options['do_verfozn']: configs += ['verfozn'] - if self.do_verfrad: + if options['do_verfrad']: configs += ['verfrad'] - if self.do_vminmon: + if options['do_vminmon']: configs += ['vminmon'] - if self.do_tracker: + if options['do_tracker']: configs += ['tracker'] - if self.do_genesis: + if options['do_genesis']: configs += ['genesis'] - if self.do_genesis_fsu: + if options['do_genesis_fsu']: configs += ['genesis_fsu'] - if self.do_metp: + if options['do_metp']: configs += ['metp'] - if self.do_gempak: + if options['do_gempak']: configs += ['gempak'] - if self.do_goes: + if options['do_goes']: configs += ['npoess'] - if self.do_bufrsnd: + if options['do_bufrsnd']: configs += ['postsnd'] - if self.do_awips: + if options['do_awips']: configs += ['awips'] - if self.do_wave: + if options['do_wave']: configs += ['waveinit', 'waveprep', 'wavepostsbs', 'wavepostpnt'] - if self.do_wave_bnd: + if options['do_wave_bnd']: configs += ['wavepostbndpnt', 'wavepostbndpntbll'] - if self.do_gempak: + if options['do_gempak']: configs += ['wavegempak'] - if self.do_awips: + if options['do_awips']: configs += ['waveawipsbulls', 'waveawipsgridded'] - if self.do_aero: + if options['do_aero_anl']: configs += ['aeroanlgenb', 'aeroanlinit', 'aeroanlvar', 'aeroanlfinal'] - if self.do_prep_obs_aero: + if options['do_prep_obs_aero']: configs += ['prepobsaero'] - if self.do_jedisnowda: + if options['do_jedisnowda']: configs += ['snowanl'] - if self.do_hybvar: + if options['do_hybvar']: configs += ['esnowrecen'] - if self.do_mos: + if options['do_mos']: configs += ['mos_stn_prep', 'mos_grd_prep', 'mos_ext_stn_prep', 'mos_ext_grd_prep', 'mos_stn_fcst', 'mos_grd_fcst', 'mos_ext_stn_fcst', 'mos_ext_grd_fcst', 'mos_stn_prdgen', 'mos_grd_prdgen', 'mos_ext_stn_prdgen', 'mos_ext_grd_prdgen', @@ -132,178 +154,169 @@ def _update_base(base_in): def get_task_names(self): """ - Get the task names for all the tasks in the cycled application. - Note that the order of the task names matters in the XML. - This is the place where that order is set. + Get the task names for each valid run in this cycled configuration. + NOTE: The order of the task names matters in the XML. + This is the place where that order is set. """ - gdas_gfs_common_tasks_before_fcst = ['prep'] - gdas_gfs_common_cleanup_tasks = ['arch', 'cleanup'] - - if self.do_jediatmvar: - gdas_gfs_common_tasks_before_fcst += ['prepatmiodaobs', 'atmanlinit', 'atmanlvar', 'atmanlfv3inc', 'atmanlfinal'] - else: - gdas_gfs_common_tasks_before_fcst += ['anal'] - - if self.do_jediocnvar: - gdas_gfs_common_tasks_before_fcst += ['prepoceanobs', 'marineanlinit', 'marinebmat', 'marineanlvar'] - if self.do_hybvar: - gdas_gfs_common_tasks_before_fcst += ['marineanlletkf', 'ocnanalecen'] - gdas_gfs_common_tasks_before_fcst += ['marineanlchkpt', 'marineanlfinal'] - if self.do_vrfy_oceanda: - gdas_gfs_common_tasks_before_fcst += ['ocnanalvrfy'] - - gdas_gfs_common_tasks_before_fcst += ['sfcanl', 'analcalc'] - - if self.do_jedisnowda: - gdas_gfs_common_tasks_before_fcst += ['snowanl'] - - wave_prep_tasks = ['waveinit', 'waveprep'] - wave_bndpnt_tasks = ['wavepostbndpnt', 'wavepostbndpntbll'] - wave_post_tasks = ['wavepostsbs', 'wavepostpnt'] - - hybrid_tasks = [] - hybrid_after_eupd_tasks = [] - if self.do_hybvar: - if self.do_jediatmens: - hybrid_tasks += ['atmensanlinit', 'atmensanlfv3inc', 'atmensanlfinal', 'echgres'] - hybrid_tasks += ['atmensanlobs', 'atmensanlsol'] if self.lobsdiag_forenkf else ['atmensanlletkf'] - else: - hybrid_tasks += ['eobs', 'eupd', 'echgres'] - hybrid_tasks += ['ediag'] if self.lobsdiag_forenkf else ['eomg'] - if self.do_jedisnowda: - hybrid_tasks += ['esnowrecen'] - hybrid_after_eupd_tasks += ['stage_ic', 'ecen', 'esfc', 'efcs', 'epos', 'earc', 'cleanup'] - - # Collect all "gdas" cycle tasks - gdas_tasks = gdas_gfs_common_tasks_before_fcst.copy() - - if not self.do_jediatmvar: - gdas_tasks += ['analdiag'] - - if self.do_wave and 'gdas' in self.wave_runs: - gdas_tasks += wave_prep_tasks - - if self.do_aero and 'gdas' in self.aero_anl_runs: - gdas_tasks += ['aeroanlgenb', 'aeroanlinit', 'aeroanlvar', 'aeroanlfinal'] - if self.do_prep_obs_aero: - gdas_tasks += ['prepobsaero'] - - gdas_tasks += ['stage_ic', 'atmanlupp', 'atmanlprod', 'fcst'] - - if self.do_upp: - gdas_tasks += ['atmupp'] - gdas_tasks += ['atmos_prod'] - - if self.do_wave and 'gdas' in self.wave_runs: - if self.do_wave_bnd: - gdas_tasks += wave_bndpnt_tasks - gdas_tasks += wave_post_tasks - - if self.do_fit2obs: - gdas_tasks += ['fit2obs'] - - if self.do_verfozn: - gdas_tasks += ['verfozn'] - - if self.do_verfrad: - gdas_tasks += ['verfrad'] - - if self.do_vminmon: - gdas_tasks += ['vminmon'] - - if self.do_gempak: - gdas_tasks += ['gempak', 'gempakmetancdc'] - - gdas_tasks += gdas_gfs_common_cleanup_tasks - - # Collect "gfs" cycle tasks - gfs_tasks = gdas_gfs_common_tasks_before_fcst.copy() - - if self.do_wave and 'gfs' in self.wave_runs: - gfs_tasks += wave_prep_tasks - - if self.do_aero and 'gfs' in self.aero_anl_runs: - gfs_tasks += ['aeroanlinit', 'aeroanlvar', 'aeroanlfinal'] - if self.do_prep_obs_aero: - gfs_tasks += ['prepobsaero'] - - gfs_tasks += ['atmanlupp', 'atmanlprod', 'fcst'] - - if self.do_ocean: - gfs_tasks += ['ocean_prod'] - - if self.do_ice: - gfs_tasks += ['ice_prod'] - - if self.do_upp: - gfs_tasks += ['atmupp'] - gfs_tasks += ['atmos_prod'] - - if self.do_goes: - gfs_tasks += ['goesupp'] - - if self.do_vminmon: - gfs_tasks += ['vminmon'] - - if self.do_tracker: - gfs_tasks += ['tracker'] - - if self.do_genesis: - gfs_tasks += ['genesis'] - - if self.do_genesis_fsu: - gfs_tasks += ['genesis_fsu'] - - if self.do_metp: - gfs_tasks += ['metp'] - - if self.do_wave and 'gfs' in self.wave_runs: - if self.do_wave_bnd: - gfs_tasks += wave_bndpnt_tasks - gfs_tasks += wave_post_tasks - if self.do_gempak: - gfs_tasks += ['wavegempak'] - if self.do_awips: - gfs_tasks += ['waveawipsbulls', 'waveawipsgridded'] - - if self.do_bufrsnd: - gfs_tasks += ['postsnd'] - - if self.do_gempak: - gfs_tasks += ['gempak'] - gfs_tasks += ['gempakmeta'] - gfs_tasks += ['gempakncdcupapgif'] - if self.do_goes: - gfs_tasks += ['npoess_pgrb2_0p5deg'] - gfs_tasks += ['gempakpgrb2spec'] - - if self.do_awips: - gfs_tasks += ['awips_20km_1p0deg', 'fbwind'] - - if self.do_mos: - gfs_tasks += ['mos_stn_prep', 'mos_grd_prep', 'mos_ext_stn_prep', 'mos_ext_grd_prep', - 'mos_stn_fcst', 'mos_grd_fcst', 'mos_ext_stn_fcst', 'mos_ext_grd_fcst', - 'mos_stn_prdgen', 'mos_grd_prdgen', 'mos_ext_stn_prdgen', 'mos_ext_grd_prdgen', - 'mos_wx_prdgen', 'mos_wx_ext_prdgen'] - - gfs_tasks += gdas_gfs_common_cleanup_tasks - - tasks = dict() - tasks['gdas'] = gdas_tasks - - if self.do_hybvar and 'gdas' in self.eupd_runs: - enkfgdas_tasks = hybrid_tasks + hybrid_after_eupd_tasks - tasks['enkfgdas'] = enkfgdas_tasks - - # Add RUN=gfs tasks if running early cycle - if self.interval_gfs > to_timedelta("0H"): - tasks['gfs'] = gfs_tasks + # Start with a dictionary of empty task lists for each valid run + task_names = {run: [] for run in self.runs} - if self.do_hybvar and 'gfs' in self.eupd_runs: - enkfgfs_tasks = hybrid_tasks + hybrid_after_eupd_tasks - enkfgfs_tasks.remove("echgres") - enkfgfs_tasks.remove("esnowrecen") - tasks['enkfgfs'] = enkfgfs_tasks + for run in self.runs: + options = self.run_options[run] - return tasks + # Common gdas and gfs tasks before fcst + if run in ['gdas', 'gfs']: + task_names[run] += ['prep'] + if options['do_jediatmvar']: + task_names[run] += ['prepatmiodaobs', 'atmanlinit', 'atmanlvar', 'atmanlfv3inc', 'atmanlfinal'] + else: + task_names[run] += ['anal'] + + if options['do_jediocnvar']: + task_names[run] += ['prepoceanobs', 'marineanlinit', 'marinebmat', 'marineanlvar'] + if options['do_hybvar']: + task_names[run] += ['marineanlletkf', 'ocnanalecen'] + task_names[run] += ['marineanlchkpt', 'marineanlfinal'] + if options['do_vrfy_oceanda']: + task_names[run] += ['ocnanalvrfy'] + + task_names[run] += ['sfcanl', 'analcalc'] + + if options['do_jedisnowda']: + task_names[run] += ['snowanl'] + + wave_prep_tasks = ['waveinit', 'waveprep'] + wave_bndpnt_tasks = ['wavepostbndpnt', 'wavepostbndpntbll'] + wave_post_tasks = ['wavepostsbs', 'wavepostpnt'] + + # gdas- and gfs-specific analysis tasks + if run == 'gdas': + if not options['do_jediatmvar']: + task_names[run] += ['analdiag'] + + if options['do_wave']: + task_names[run] += wave_prep_tasks + + if options['do_aero_anl']: + task_names[run] += ['aeroanlgenb'] + + else: + if options['do_wave']: + task_names[run] += wave_prep_tasks + + if options['do_aero_anl']: + task_names[run] += ['aeroanlinit', 'aeroanlvar', 'aeroanlfinal'] + + if options['do_prep_obs_aero']: + task_names[run] += ['prepobsaero'] + + # Staging is gdas-specific + if run == 'gdas': + task_names[run] += ['stage_ic'] + + task_names[run] += ['atmanlupp', 'atmanlprod', 'fcst'] + + # gfs-specific products + if run == 'gfs': + if options['do_ocean']: + task_names[run] += ['ocean_prod'] + + if options['do_ice']: + task_names[run] += ['ice_prod'] + + if options['do_upp']: + task_names[run] += ['atmupp'] + task_names[run] += ['atmos_prod'] + + # GOES post-processing (gfs only) + if run == 'gfs': + if options['do_goes']: + task_names[run] += ['goesupp'] + + # Only fit to obs and verify ozone and radiance during gdas cycles + if run == "gdas": + if options['do_fit2obs']: + task_names[run] += ['fit2obs'] + if options['do_verfozn']: + task_names[run] += ['verfozn'] + if options['do_verfrad']: + task_names[run] += ['verfrad'] + + if options['do_vminmon']: + task_names[run] += ['vminmon'] + + # gfs-only verification/tracking + if run == 'gfs': + if options['do_tracker']: + task_names[run] += ['tracker'] + + if options['do_genesis']: + task_names[run] += ['genesis'] + + if options['do_genesis_fsu']: + task_names[run] += ['genesis_fsu'] + + if options['do_metp']: + task_names[run] += ['metp'] + + if options['do_wave']: + if options['do_wave_bnd']: + task_names[run] += wave_bndpnt_tasks + task_names[run] += wave_post_tasks + # wave gempak and awips jobs are gfs-specific + if run == 'gfs': + if options['do_gempak']: + task_names[run] += ['wavegempak'] + if options['do_awips']: + task_names[run] += ['waveawipsbulls', 'waveawipsgridded'] + + # gdas- and gfs-specific downstream products + if run == 'gdas': + if options['do_gempak']: + task_names[run] += ['gempak', 'gempakmetancdc'] + else: + if options['do_bufrsnd']: + task_names[run] += ['postsnd'] + + if options['do_gempak']: + task_names[run] += ['gempak'] + task_names[run] += ['gempakmeta'] + task_names[run] += ['gempakncdcupapgif'] + if options['do_goes']: + task_names[run] += ['npoess_pgrb2_0p5deg'] + task_names[run] += ['gempakpgrb2spec'] + + if options['do_awips']: + task_names[run] += ['awips_20km_1p0deg', 'fbwind'] + + if options['do_mos']: + task_names[run] += ['mos_stn_prep', 'mos_grd_prep', 'mos_ext_stn_prep', 'mos_ext_grd_prep', + 'mos_stn_fcst', 'mos_grd_fcst', 'mos_ext_stn_fcst', 'mos_ext_grd_fcst', + 'mos_stn_prdgen', 'mos_grd_prdgen', 'mos_ext_stn_prdgen', + 'mos_ext_grd_prdgen', 'mos_wx_prdgen', 'mos_wx_ext_prdgen'] + + # Last two items + task_names[run] += ['arch', 'cleanup'] + + # Ensemble tasks + elif 'enkf' in run: + + if options['do_jediatmens']: + task_names[run] += ['atmensanlinit', 'atmensanlfv3inc', 'atmensanlfinal'] + # Only run echgres for the gdas cycle + task_names[run] += ['echgres'] if 'gdas' in run else 0 + if options['lobsdiag_forenkf']: + task_names[run] += ['atmensanlobs', 'atmensanlsol'] + else: + task_names[run] += ['atmensanlletkf'] + + else: + task_names[run] += ['eobs', 'eupd'] + task_names[run].append('echgres') if 'gdas' in run else 0 + task_names[run] += ['ediag'] if options['lobsdiag_forenkf'] else ['eomg'] + task_names[run].append('esnowrecen') if options['do_jedisnowda'] and 'gdas' in run else 0 + + task_names[run] += ['stage_ic', 'ecen', 'esfc', 'efcs', 'epos', 'earc', 'cleanup'] + + return task_names diff --git a/workflow/applications/gfs_forecast_only.py b/workflow/applications/gfs_forecast_only.py index fb1d2cdb8f..fffdab6ef9 100644 --- a/workflow/applications/gfs_forecast_only.py +++ b/workflow/applications/gfs_forecast_only.py @@ -1,5 +1,6 @@ from applications.applications import AppConfig from wxflow import Configuration +from typing import Dict, Any class GFSForecastOnlyAppConfig(AppConfig): @@ -11,62 +12,70 @@ def __init__(self, conf: Configuration): super().__init__(conf) base = conf.parse_config('config.base') - self.aero_fcst_run = base.get('AERO_FCST_RUN', 'BOTH').lower() self.run = base.get('RUN', 'gfs') - self.exp_warm_start = base.get('EXP_WARM_START', False) + self.runs = [self.run] - def _get_app_configs(self): + def _get_run_options(self, conf: Configuration) -> Dict[str, Any]: + + run_options = super()._get_run_options(conf) + + run_options[self.run]['exp_warm_start'] = conf.parse_config('config.base').get('EXP_WARM_START', False) + + return run_options + + def _get_app_configs(self, run): """ Returns the config_files that are involved in the forecast-only app """ + options = self.run_options[run] configs = ['stage_ic', 'fcst', 'arch', 'cleanup'] - if self.do_atm: + if options['do_atm']: - if self.do_upp or self.do_goes: + if options['do_upp'] or options['do_goes']: configs += ['upp'] configs += ['atmos_products'] - if self.do_aero: - if not self.exp_warm_start: + if options['do_aero_fcst']: + if not options['exp_warm_start']: configs += ['aerosol_init'] - if self.do_tracker: + if options['do_tracker']: configs += ['tracker'] - if self.do_genesis: + if options['do_genesis']: configs += ['genesis'] - if self.do_genesis_fsu: + if options['do_genesis_fsu']: configs += ['genesis_fsu'] - if self.do_metp: + if options['do_metp']: configs += ['metp'] - if self.do_bufrsnd: + if options['do_bufrsnd']: configs += ['postsnd'] - if self.do_gempak: + if options['do_gempak']: configs += ['gempak'] - if self.do_awips: + if options['do_awips']: configs += ['awips'] - if self.do_ocean or self.do_ice: + if options['do_ocean'] or options['do_ice']: configs += ['oceanice_products'] - if self.do_wave: + if options['do_wave']: configs += ['waveinit', 'waveprep', 'wavepostsbs', 'wavepostpnt'] - if self.do_wave_bnd: + if options['do_wave_bnd']: configs += ['wavepostbndpnt', 'wavepostbndpntbll'] - if self.do_gempak: + if options['do_gempak']: configs += ['wavegempak'] - if self.do_awips: + if options['do_awips']: configs += ['waveawipsbulls', 'waveawipsgridded'] - if self.do_mos: + if options['do_mos']: configs += ['mos_stn_prep', 'mos_grd_prep', 'mos_ext_stn_prep', 'mos_ext_grd_prep', 'mos_stn_fcst', 'mos_grd_fcst', 'mos_ext_stn_fcst', 'mos_ext_grd_fcst', 'mos_stn_prdgen', 'mos_grd_prdgen', 'mos_ext_stn_prdgen', 'mos_ext_grd_prdgen', @@ -90,66 +99,64 @@ def get_task_names(self): """ tasks = ['stage_ic'] + options = self.run_options[self.run] - if self.do_aero: - aero_fcst_run = self.aero_fcst_run - if self.run in aero_fcst_run or aero_fcst_run == "both": - if not self.exp_warm_start: - tasks += ['aerosol_init'] + if options['do_aero_fcst'] and not options['exp_warm_start']: + tasks += ['aerosol_init'] - if self.do_wave: + if options['do_wave']: tasks += ['waveinit'] # tasks += ['waveprep'] # TODO - verify if waveprep is executed in forecast-only mode when APP=ATMW|S2SW tasks += ['fcst'] - if self.do_atm: + if options['do_atm']: - if self.do_upp: + if options['do_upp']: tasks += ['atmupp'] tasks += ['atmos_prod'] - if self.do_goes: + if options['do_goes']: tasks += ['goesupp'] - if self.do_tracker: + if options['do_tracker']: tasks += ['tracker'] - if self.do_genesis: + if options['do_genesis']: tasks += ['genesis'] - if self.do_genesis_fsu: + if options['do_genesis_fsu']: tasks += ['genesis_fsu'] - if self.do_metp: + if options['do_metp']: tasks += ['metp'] - if self.do_bufrsnd: + if options['do_bufrsnd']: tasks += ['postsnd'] - if self.do_gempak: + if options['do_gempak']: tasks += ['gempak', 'gempakmeta', 'gempakncdcupapgif', 'gempakpgrb2spec'] - if self.do_awips: + if options['do_awips']: tasks += ['awips_20km_1p0deg', 'fbwind'] - if self.do_ocean: + if options['do_ocean']: tasks += ['ocean_prod'] - if self.do_ice: + if options['do_ice']: tasks += ['ice_prod'] - if self.do_wave: - if self.do_wave_bnd: + if options['do_wave']: + if options['do_wave_bnd']: tasks += ['wavepostbndpnt', 'wavepostbndpntbll'] tasks += ['wavepostsbs', 'wavepostpnt'] - if self.do_gempak: + if options['do_gempak']: tasks += ['wavegempak'] - if self.do_awips: + if options['do_awips']: tasks += ['waveawipsbulls', 'waveawipsgridded'] - if self.do_mos: + if options['do_mos']: tasks += ['mos_stn_prep', 'mos_grd_prep', 'mos_ext_stn_prep', 'mos_ext_grd_prep', 'mos_stn_fcst', 'mos_grd_fcst', 'mos_ext_stn_fcst', 'mos_ext_grd_fcst', 'mos_stn_prdgen', 'mos_grd_prdgen', 'mos_ext_stn_prdgen', 'mos_ext_grd_prdgen', diff --git a/workflow/rocoto/gefs_tasks.py b/workflow/rocoto/gefs_tasks.py index e9338c90df..468ce01008 100644 --- a/workflow/rocoto/gefs_tasks.py +++ b/workflow/rocoto/gefs_tasks.py @@ -1,7 +1,6 @@ from applications.applications import AppConfig from rocoto.tasks import Tasks import rocoto.rocoto as rocoto -from datetime import datetime, timedelta class GEFSTasks(Tasks): @@ -44,10 +43,6 @@ def waveinit(self): return task def prep_emissions(self): - deps = [] - dep_dict = {'type': 'task', 'name': f'gefs_stage_ic'} - deps.append(rocoto.add_dependency(dep_dict)) - dependencies = rocoto.create_dependency(dep=deps) resources = self.get_resource('prep_emissions') task_name = 'gefs_prep_emissions' @@ -69,17 +64,17 @@ def fcst(self): dep_dict = {'type': 'task', 'name': f'gefs_stage_ic'} dependencies.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_wave: + if self.options['do_wave']: dep_dict = {'type': 'task', 'name': f'gefs_wave_init'} dependencies.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_aero: + if self.options['do_aero_fcst']: dep_dict = {'type': 'task', 'name': f'gefs_prep_emissions'} dependencies.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=dependencies) - num_fcst_segments = len(self.app_config.fcst_segments) - 1 + num_fcst_segments = len(self.options['fcst_segments']) - 1 fcst_vars = self.envars.copy() fcst_envars_dict = {'FCST_SEGMENT': '#seg#'} @@ -115,17 +110,17 @@ def efcs(self): dep_dict = {'type': 'task', 'name': f'gefs_stage_ic'} dependencies.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_wave: + if self.options['do_wave']: dep_dict = {'type': 'task', 'name': f'gefs_wave_init'} dependencies.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_aero: + if self.options['do_aero_fcst']: dep_dict = {'type': 'task', 'name': f'gefs_prep_emissions'} dependencies.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=dependencies) - num_fcst_segments = len(self.app_config.fcst_segments) - 1 + num_fcst_segments = len(self.options['fcst_segments']) - 1 resources = self.get_resource('efcs') # Kludge to work around bug in rocoto with serial metatasks nested @@ -434,7 +429,7 @@ def wavepostpnt(self): deps = [] dep_dict = {'type': 'metatask', 'name': f'gefs_fcst_mem#member#'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_wave_bnd: + if self.options['do_wave_bnd']: dep_dict = {'type': 'task', 'name': f'gefs_wave_post_bndpnt_bull_mem#member#'} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) @@ -471,16 +466,16 @@ def wavepostpnt(self): def extractvars(self): deps = [] - if self.app_config.do_wave: + if self.options['do_wave']: dep_dict = {'type': 'task', 'name': 'gefs_wave_post_grid_mem#member#'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_ocean: + if self.options['do_ocean']: dep_dict = {'type': 'metatask', 'name': 'gefs_ocean_prod_#member#'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_ice: + if self.options['do_ice']: dep_dict = {'type': 'metatask', 'name': 'gefs_ice_prod_#member#'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_atm: + if self.options['do_atm']: dep_dict = {'type': 'metatask', 'name': 'gefs_atmos_prod_#member#'} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) @@ -520,23 +515,23 @@ def arch(self): deps.append(rocoto.add_dependency(dep_dict)) dep_dict = {'type': 'metatask', 'name': 'gefs_atmos_ensstat'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_ice: + if self.options['do_ice']: dep_dict = {'type': 'metatask', 'name': 'gefs_ice_prod'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_ocean: + if self.options['do_ocean']: dep_dict = {'type': 'metatask', 'name': 'gefs_ocean_prod'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_wave: + if self.options['do_wave']: dep_dict = {'type': 'metatask', 'name': 'gefs_wave_post_grid'} deps.append(rocoto.add_dependency(dep_dict)) dep_dict = {'type': 'metatask', 'name': 'gefs_wave_post_pnt'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_wave_bnd: + if self.options['do_wave_bnd']: dep_dict = {'type': 'metatask', 'name': 'gefs_wave_post_bndpnt'} deps.append(rocoto.add_dependency(dep_dict)) dep_dict = {'type': 'metatask', 'name': 'gefs_wave_post_bndpnt_bull'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_extractvars: + if self.options['do_extractvars']: dep_dict = {'type': 'metatask', 'name': 'gefs_extractvars'} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep=deps, dep_condition='and') @@ -560,7 +555,7 @@ def arch(self): def cleanup(self): deps = [] - if self.app_config.do_extractvars: + if self.options['do_extractvars']: dep_dict = {'type': 'task', 'name': 'arch'} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep=deps) @@ -569,18 +564,18 @@ def cleanup(self): deps.append(rocoto.add_dependency(dep_dict)) dep_dict = {'type': 'metatask', 'name': 'gefs_atmos_ensstat'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_ice: + if self.options['do_ice']: dep_dict = {'type': 'metatask', 'name': 'gefs_ice_prod'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_ocean: + if self.options['do_ocean']: dep_dict = {'type': 'metatask', 'name': 'gefs_ocean_prod'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_wave: + if self.options['do_wave']: dep_dict = {'type': 'metatask', 'name': 'gefs_wave_post_grid'} deps.append(rocoto.add_dependency(dep_dict)) dep_dict = {'type': 'metatask', 'name': 'gefs_wave_post_pnt'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_wave_bnd: + if self.options['do_wave_bnd']: dep_dict = {'type': 'metatask', 'name': 'gefs_wave_post_bndpnt'} deps.append(rocoto.add_dependency(dep_dict)) dep_dict = {'type': 'metatask', 'name': 'gefs_wave_post_bndpnt_bull'} diff --git a/workflow/rocoto/gefs_xml.py b/workflow/rocoto/gefs_xml.py index a5dfd5140e..f0ea407e34 100644 --- a/workflow/rocoto/gefs_xml.py +++ b/workflow/rocoto/gefs_xml.py @@ -16,7 +16,7 @@ def __init__(self, app_config: AppConfig, rocoto_config: Dict) -> None: def get_cycledefs(self): sdate = self._base['SDATE_GFS'] edate = self._base['EDATE'] - interval = self._app_config.interval_gfs + interval = self._base['interval_gfs'] sdate_str = sdate.strftime("%Y%m%d%H%M") edate_str = edate.strftime("%Y%m%d%H%M") interval_str = timedelta_to_HMS(interval) diff --git a/workflow/rocoto/gfs_cycled_xml.py b/workflow/rocoto/gfs_cycled_xml.py index eef77ba7fc..dfeefd1402 100644 --- a/workflow/rocoto/gfs_cycled_xml.py +++ b/workflow/rocoto/gfs_cycled_xml.py @@ -24,7 +24,7 @@ def get_cycledefs(self): sdate_str = sdate.strftime("%Y%m%d%H%M") strings.append(f'\t{sdate_str} {edate_str} {interval_str}') - interval_gfs = self._app_config.interval_gfs + interval_gfs = self._base['interval_gfs'] if interval_gfs > to_timedelta("0H"): sdate_gfs = self._base['SDATE_GFS'] diff --git a/workflow/rocoto/gfs_forecast_only_xml.py b/workflow/rocoto/gfs_forecast_only_xml.py index a4d5b0878b..018bdfaef2 100644 --- a/workflow/rocoto/gfs_forecast_only_xml.py +++ b/workflow/rocoto/gfs_forecast_only_xml.py @@ -14,15 +14,15 @@ def __init__(self, app_config: AppConfig, rocoto_config: Dict) -> None: def get_cycledefs(self): sdate_gfs = self._base['SDATE_GFS'] edate_gfs = self._base['EDATE'] - interval_gfs = self._app_config.interval_gfs + interval_gfs = self._base['interval_gfs'] strings = [] sdate_gfs_str = sdate_gfs.strftime("%Y%m%d%H%M") edate_gfs_str = edate_gfs.strftime("%Y%m%d%H%M") interval_gfs_str = timedelta_to_HMS(interval_gfs) strings.append(f'\t{sdate_gfs_str} {edate_gfs_str} {interval_gfs_str}') - date2 = sdate_gfs + interval_gfs - if date2 <= edate_gfs: + date2_gfs = sdate_gfs + interval_gfs + if date2_gfs <= edate_gfs: date2_gfs_str = date2_gfs.strftime("%Y%m%d%H%M") strings.append(f'\t{date2_gfs_str} {edate_gfs_str} {interval_gfs_str}') diff --git a/workflow/rocoto/gfs_tasks.py b/workflow/rocoto/gfs_tasks.py index 461241450e..616248c110 100644 --- a/workflow/rocoto/gfs_tasks.py +++ b/workflow/rocoto/gfs_tasks.py @@ -44,7 +44,7 @@ def prep(self): dump_path = self._template_to_rocoto_cycstring(self._base["COM_OBSDMP_TMPL"], {'DMPDIR': dmpdir, 'DUMP_SUFFIX': dump_suffix}) - gfs_enkf = True if self.app_config.do_hybvar and 'gfs' in self.app_config.eupd_runs else False + gfs_enkf = True if self.options['do_hybvar'] and 'gfs' in self.app_config.ens_runs else False deps = [] dep_dict = {'type': 'metatask', 'name': 'gdas_atmos_prod', 'offset': f"-{timedelta_to_HMS(self._base['interval_gdas'])}"} @@ -58,7 +58,7 @@ def prep(self): dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) cycledef = self.run - if self.run in ['gfs'] and gfs_enkf and self.app_config.interval_gfs != 6: + if self.run in ['gfs'] and gfs_enkf and self._base['INTERVAL_GFS'] != 6: cycledef = 'gdas' resources = self.get_resource('prep') @@ -148,9 +148,9 @@ def aerosol_init(self): # Calculate offset based on RUN = gfs | gdas interval = None if self.run in ['gfs']: - interval = self._base['INTERVAL_GFS'] + interval = self._base['interval_gfs'] elif self.run in ['gdas']: - interval = self._base['INTERVAL'] + interval = self._base['interval'] offset = timedelta_to_HMS(-interval) # Files from previous cycle @@ -187,7 +187,7 @@ def anal(self): deps = [] dep_dict = {'type': 'task', 'name': f'{self.run}_prep'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_hybvar: + if self.options['do_hybvar']: 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_condition='and', dep=deps) @@ -214,12 +214,12 @@ def anal(self): def sfcanl(self): deps = [] - if self.app_config.do_jediatmvar: + if self.options['do_jediatmvar']: dep_dict = {'type': 'task', 'name': f'{self.run}_atmanlfinal'} else: dep_dict = {'type': 'task', 'name': f'{self.run}_anal'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_jedisnowda: + if self.options['do_jedisnowda']: dep_dict = {'type': 'task', 'name': f'{self.run}_snowanl'} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) @@ -246,14 +246,14 @@ def sfcanl(self): def analcalc(self): deps = [] - if self.app_config.do_jediatmvar: + if self.options['do_jediatmvar']: dep_dict = {'type': 'task', 'name': f'{self.run}_atmanlfinal'} else: dep_dict = {'type': 'task', 'name': f'{self.run}_anal'} deps.append(rocoto.add_dependency(dep_dict)) dep_dict = {'type': 'task', 'name': f'{self.run}_sfcanl'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_hybvar and self.run in ['gdas']: + if self.options['do_hybvar'] and self.run in ['gdas']: dep_dict = {'type': 'task', 'name': 'enkfgdas_echgres', 'offset': f"-{timedelta_to_HMS(self._base['interval_gdas'])}"} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) @@ -328,7 +328,7 @@ def atmanlinit(self): deps = [] dep_dict = {'type': 'task', 'name': f'{self.run}_prepatmiodaobs'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_hybvar: + if self.options['do_hybvar']: 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_condition='and', dep=deps) @@ -336,7 +336,7 @@ def atmanlinit(self): dependencies = rocoto.create_dependency(dep=deps) interval_gfs = self._base["INTERVAL_GFS"] - gfs_enkf = True if self.app_config.do_hybvar and 'gfs' in self.app_config.eupd_runs else False + gfs_enkf = True if self.options['do_hybvar'] and 'gfs' in self.app_config.ens_runs else False cycledef = self.run if self.run in ['gfs'] and gfs_enkf and interval_gfs != 6: @@ -486,7 +486,7 @@ def aeroanlinit(self): dep_dict = {'type': 'task', 'name': f'{self.run}_prep'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_prep_obs_aero: + if self.options['do_prep_obs_aero']: dep_dict = {'type': 'task', 'name': f'{self.run}_prepobsaero'} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) @@ -770,12 +770,12 @@ def ocnanalecen(self): def marineanlchkpt(self): deps = [] - if self.app_config.do_hybvar: + if self.options['do_hybvar']: dep_dict = {'type': 'task', 'name': f'{self.run}_ocnanalecen'} else: dep_dict = {'type': 'task', 'name': f'{self.run}_marineanlvar'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_mergensst: + if self.options['do_mergensst']: data = f'&ROTDIR;/{self.run}.@Y@m@d/@H/atmos/{self.run}.t@Hz.sfcanl.nc' dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) @@ -866,18 +866,16 @@ def _fcst_forecast_only(self): dep_dict = {'type': 'task', 'name': f'{self.run}_stage_ic'} dependencies.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_wave and self.run in self.app_config.wave_runs: - wave_job = 'waveprep' if self.app_config.model_app in ['ATMW'] else 'waveinit' + if self.options['do_wave']: + wave_job = 'waveprep' if self.options['app'] in ['ATMW'] else 'waveinit' dep_dict = {'type': 'task', 'name': f'{self.run}_{wave_job}'} dependencies.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_aero and \ - self.run in self.app_config.aero_fcst_runs and \ - not self._base['EXP_WARM_START']: + if self.options['do_aero_fcst'] and not self._base['EXP_WARM_START']: # Calculate offset based on RUN = gfs | gdas interval = None if self.run in ['gfs']: - interval = to_timedelta(f"{self._base['INTERVAL_GFS']}H") + interval = self._base['interval_gfs'] elif self.run in ['gdas']: interval = self._base['assim_freq'] offset = timedelta_to_HMS(-interval) @@ -891,7 +889,7 @@ def _fcst_forecast_only(self): dependencies = rocoto.create_dependency(dep_condition='and', dep=dependencies) if self.run in ['gfs']: - num_fcst_segments = len(self.app_config.fcst_segments) - 1 + num_fcst_segments = len(self.options['fcst_segments']) - 1 else: num_fcst_segments = 1 @@ -930,15 +928,15 @@ def _fcst_cycled(self): dep = rocoto.add_dependency(dep_dict) dependencies = rocoto.create_dependency(dep=dep) - if self.app_config.do_jediocnvar: + if self.options['do_jediocnvar']: dep_dict = {'type': 'task', 'name': f'{self.run}_marineanlfinal'} dependencies.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_aero and self.run in self.app_config.aero_anl_runs: + if self.options['do_aero_anl']: dep_dict = {'type': 'task', 'name': f'{self.run}_aeroanlfinal'} dependencies.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_jedisnowda: + if self.options['do_jedisnowda']: dep_dict = {'type': 'task', 'name': f'{self.run}_snowanl'} dependencies.append(rocoto.add_dependency(dep_dict)) @@ -949,7 +947,7 @@ def _fcst_cycled(self): dependencies.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='or', dep=dependencies) - if self.app_config.do_wave and self.run in self.app_config.wave_runs: + if self.options['do_wave']: dep_dict = {'type': 'task', 'name': f'{self.run}_waveprep'} dependencies.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=dependencies) @@ -957,7 +955,7 @@ def _fcst_cycled(self): cycledef = 'gdas_half,gdas' if self.run in ['gdas'] else self.run if self.run in ['gfs']: - num_fcst_segments = len(self.app_config.fcst_segments) - 1 + num_fcst_segments = len(self.options['fcst_segments']) - 1 else: num_fcst_segments = 1 @@ -1264,7 +1262,7 @@ def wavepostpnt(self): deps = [] dep_dict = {'type': 'metatask', 'name': f'{self.run}_fcst'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_wave_bnd: + if self.options['do_wave_bnd']: dep_dict = {'type': 'task', 'name': f'{self.run}_wavepostbndpntbll'} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) @@ -1834,8 +1832,8 @@ def metp(self): deps = [] dep_dict = {'type': 'task', 'name': f'{self.run}_arch'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.interval_gfs < to_timedelta('24H'): - n_lookback = self.app_config.interval_gfs // to_timedelta('6H') + if self._base["interval_gfs"] < to_timedelta("24H"): + n_lookback = self._base["interval_gfs"] // to_timedelta("6H") for lookback in range(1, n_lookback + 1): deps2 = [] dep_dict = {'type': 'taskvalid', 'name': f'{self.run}_arch', 'condition': 'not'} @@ -2242,54 +2240,54 @@ def arch(self): if self.run in ['gfs']: dep_dict = {'type': 'task', 'name': f'{self.run}_atmanlprod'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_vminmon: + if self.options['do_vminmon']: dep_dict = {'type': 'task', 'name': f'{self.run}_vminmon'} deps.append(rocoto.add_dependency(dep_dict)) elif self.run in ['gdas']: dep_dict = {'type': 'task', 'name': f'{self.run}_atmanlprod'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_fit2obs: + if self.options['do_fit2obs']: dep_dict = {'type': 'task', 'name': f'{self.run}_fit2obs'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_verfozn: + if self.options['do_verfozn']: dep_dict = {'type': 'task', 'name': f'{self.run}_verfozn'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_verfrad: + if self.options['do_verfrad']: dep_dict = {'type': 'task', 'name': f'{self.run}_verfrad'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_vminmon: + if self.options['do_vminmon']: dep_dict = {'type': 'task', 'name': f'{self.run}_vminmon'} deps.append(rocoto.add_dependency(dep_dict)) - if self.run in ['gfs'] and self.app_config.do_tracker: + if self.run in ['gfs'] and self.options['do_tracker']: dep_dict = {'type': 'task', 'name': f'{self.run}_tracker'} deps.append(rocoto.add_dependency(dep_dict)) - if self.run in ['gfs'] and self.app_config.do_genesis: + if self.run in ['gfs'] and self.options['do_genesis']: dep_dict = {'type': 'task', 'name': f'{self.run}_genesis'} deps.append(rocoto.add_dependency(dep_dict)) - if self.run in ['gfs'] and self.app_config.do_genesis_fsu: + if self.run in ['gfs'] and self.options['do_genesis_fsu']: dep_dict = {'type': 'task', 'name': f'{self.run}_genesis_fsu'} deps.append(rocoto.add_dependency(dep_dict)) # Post job dependencies dep_dict = {'type': 'metatask', 'name': f'{self.run}_atmos_prod'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_wave: + if self.options['do_wave']: dep_dict = {'type': 'task', 'name': f'{self.run}_wavepostsbs'} deps.append(rocoto.add_dependency(dep_dict)) dep_dict = {'type': 'task', 'name': f'{self.run}_wavepostpnt'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_wave_bnd: + if self.options['do_wave_bnd']: dep_dict = {'type': 'task', 'name': f'{self.run}_wavepostbndpnt'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_ocean: + if self.options['do_ocean']: if self.run in ['gfs']: dep_dict = {'type': 'metatask', 'name': f'{self.run}_ocean_prod'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_ice: + if self.options['do_ice']: if self.run in ['gfs']: dep_dict = {'type': 'metatask', 'name': f'{self.run}_ice_prod'} deps.append(rocoto.add_dependency(dep_dict)) # MOS job dependencies - if self.run in ['gfs'] and self.app_config.do_mos: + if self.run in ['gfs'] and self.options['do_mos']: mos_jobs = ["stn_prep", "grd_prep", "ext_stn_prep", "ext_grd_prep", "stn_fcst", "grd_fcst", "ext_stn_fcst", "ext_grd_fcst", "stn_prdgen", "grd_prdgen", "ext_stn_prdgen", "ext_grd_prdgen", @@ -2327,7 +2325,7 @@ def cleanup(self): dep_dict = {'type': 'task', 'name': f'{self.run}_arch'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_gempak: + if self.options['do_gempak']: if self.run in ['gdas']: dep_dict = {'type': 'task', 'name': f'{self.run}_gempakmetancdc'} deps.append(rocoto.add_dependency(dep_dict)) @@ -2336,13 +2334,13 @@ def cleanup(self): deps.append(rocoto.add_dependency(dep_dict)) dep_dict = {'type': 'task', 'name': f'{self.run}_gempakncdcupapgif'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_goes: + if self.options['do_goes']: dep_dict = {'type': 'metatask', 'name': f'{self.run}_gempakgrb2spec'} deps.append(rocoto.add_dependency(dep_dict)) dep_dict = {'type': 'task', 'name': f'{self.run}_npoess_pgrb2_0p5deg'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_metp and self.run in ['gfs']: + if self.options['do_metp'] and self.run in ['gfs']: deps2 = [] # taskvalid only handles regular tasks, so just check the first metp job exists dep_dict = {'type': 'taskvalid', 'name': f'{self.run}_metpg2g1', 'condition': 'not'} @@ -2457,7 +2455,7 @@ def ediag(self): def eupd(self): deps = [] - if self.app_config.lobsdiag_forenkf: + if self.options['lobsdiag_forenkf']: dep_dict = {'type': 'task', 'name': f'{self.run}_ediag'} else: dep_dict = {'type': 'metatask', 'name': f'{self.run}_eomg'} @@ -2588,7 +2586,7 @@ def atmensanlletkf(self): def atmensanlfv3inc(self): deps = [] - if self.app_config.lobsdiag_forenkf: + if self.options['lobsdiag_forenkf']: dep_dict = {'type': 'task', 'name': f'{self.run}_atmensanlsol'} else: dep_dict = {'type': 'task', 'name': f'{self.run}_atmensanlletkf'} @@ -2666,7 +2664,7 @@ def _get_ecengroups(): deps = [] dep_dict = {'type': 'task', 'name': f'{self.run.replace("enkf","")}_analcalc'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_jediatmens: + if self.options['do_jediatmens']: dep_dict = {'type': 'task', 'name': f'{self.run}_atmensanlfinal'} else: dep_dict = {'type': 'task', 'name': f'{self.run}_eupd'} @@ -2707,17 +2705,15 @@ def _get_ecengroups(): def esfc(self): - # eupd_run = 'gdas' if 'gdas' in self.app_config.eupd_runs else 'gfs' - deps = [] dep_dict = {'type': 'task', 'name': f'{self.run.replace("enkf","")}_analcalc'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_jediatmens: + if self.options['do_jediatmens']: dep_dict = {'type': 'task', 'name': f'{self.run}_atmensanlfinal'} else: dep_dict = {'type': 'task', 'name': f'{self.run}_eupd'} deps.append(rocoto.add_dependency(dep_dict)) - if self.app_config.do_jedisnowda: + if self.options['do_jedisnowda']: dep_dict = {'type': 'task', 'name': f'{self.run}_esnowrecen'} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) diff --git a/workflow/rocoto/tasks.py b/workflow/rocoto/tasks.py index df56f90718..2aee48835f 100644 --- a/workflow/rocoto/tasks.py +++ b/workflow/rocoto/tasks.py @@ -10,7 +10,7 @@ class Tasks: - SERVICE_TASKS = ['arch', 'earc'] + SERVICE_TASKS = ['arch', 'earc', 'stage_ic', 'cleanup'] VALID_TASKS = ['aerosol_init', 'stage_ic', 'prep', 'anal', 'sfcanl', 'analcalc', 'analdiag', 'arch', "cleanup", 'prepatmiodaobs', 'atmanlinit', 'atmanlvar', 'atmanlfv3inc', 'atmanlfinal', @@ -44,6 +44,9 @@ def __init__(self, app_config: AppConfig, run: str) -> None: # Get the configs for the specified RUN self._configs = self.app_config.configs[run] + # Get the workflow options for the specified RUN + self.options = self.app_config.run_options[run] + # Update the base config for the application self._configs['base'] = self.app_config._update_base(self._configs['base']) @@ -245,6 +248,6 @@ def get_task(self, task_name, *args, **kwargs): try: return getattr(self, task_name, *args, **kwargs)() except AttributeError: - raise AttributeError(f'"{task_name}" is not a valid task.\n' + - 'Valid tasks are:\n' + + raise AttributeError(f'"{task_name}" is not a valid task.\n' + f'Valid tasks are:\n' f'{", ".join(Tasks.VALID_TASKS)}') diff --git a/workflow/rocoto/workflow_xml.py b/workflow/rocoto/workflow_xml.py index 3ad7c4bd91..bed19ad5ee 100644 --- a/workflow/rocoto/workflow_xml.py +++ b/workflow/rocoto/workflow_xml.py @@ -7,6 +7,7 @@ from typing import Dict from applications.applications import AppConfig from rocoto.workflow_tasks import get_wf_tasks +from wxflow import to_timedelta import rocoto.rocoto as rocoto from abc import ABC, abstractmethod @@ -18,8 +19,10 @@ def __init__(self, app_config: AppConfig, rocoto_config: Dict) -> None: self._app_config = app_config self.rocoto_config = rocoto_config - # Use the generic config.base (without RUN specified) - self._base = self._app_config.configs['_no_run']['base'] + # Use the first config.base (sourced with an arbitrary RUN) + self._base = self._app_config.configs[next(iter(self._app_config.configs))]['base'] + self._base['interval_gdas'] = to_timedelta(f'{self._base["assim_freq"]}H') + self._base['interval_gfs'] = to_timedelta(f'{self._base["INTERVAL_GFS"]}H') self.preamble = self._get_preamble() self.definitions = self._get_definitions() From 8bfd1b5ed7a40b7f5014d37630e87c27cacd896a Mon Sep 17 00:00:00 2001 From: Wei Huang Date: Tue, 26 Nov 2024 12:47:43 -0700 Subject: [PATCH 15/20] Update docs related to NOAA CSPs (#3043) With CSPs now capable or compile and run global-workflow for ATM forecast only, coupled, and gefs, and many changes at ParallelWorks, Docs should be updated to reflect all these changes. Resolves #3042 --- docs/source/_static/noaacsp_cluster_1.png | Bin 533258 -> 0 bytes docs/source/_static/noaacsp_cluster_2.png | Bin 60914 -> 0 bytes docs/source/_static/noaacsp_cluster_3.png | Bin 43629 -> 0 bytes docs/source/_static/noaacsp_cluster_4.png | Bin 40199 -> 0 bytes docs/source/_static/noaacsp_cluster_5.png | Bin 25067 -> 0 bytes docs/source/_static/noaacsp_cluster_6.png | Bin 942486 -> 0 bytes docs/source/_static/noaacsp_instance_1.png | Bin 387751 -> 0 bytes docs/source/_static/noaacsp_instance_2.png | Bin 559873 -> 0 bytes docs/source/_static/noaacsp_instance_3.png | Bin 552558 -> 0 bytes docs/source/_static/noaacsp_instance_4.png | Bin 517596 -> 0 bytes docs/source/_static/noaacsp_login.png | Bin 366311 -> 0 bytes docs/source/_static/noaacsp_using_1.png | Bin 604564 -> 0 bytes docs/source/_static/noaacsp_using_2.png | Bin 146340 -> 0 bytes docs/source/conf.py | 4 +- docs/source/index.rst | 1 + docs/source/noaa_csp.rst | 458 +++++++++++++++------ docs/source/references.bib | 0 17 files changed, 343 insertions(+), 120 deletions(-) delete mode 100644 docs/source/_static/noaacsp_cluster_1.png delete mode 100644 docs/source/_static/noaacsp_cluster_2.png delete mode 100644 docs/source/_static/noaacsp_cluster_3.png delete mode 100644 docs/source/_static/noaacsp_cluster_4.png delete mode 100644 docs/source/_static/noaacsp_cluster_5.png delete mode 100644 docs/source/_static/noaacsp_cluster_6.png delete mode 100644 docs/source/_static/noaacsp_instance_1.png delete mode 100644 docs/source/_static/noaacsp_instance_2.png delete mode 100644 docs/source/_static/noaacsp_instance_3.png delete mode 100644 docs/source/_static/noaacsp_instance_4.png delete mode 100644 docs/source/_static/noaacsp_login.png delete mode 100644 docs/source/_static/noaacsp_using_1.png delete mode 100644 docs/source/_static/noaacsp_using_2.png create mode 100644 docs/source/references.bib diff --git a/docs/source/_static/noaacsp_cluster_1.png b/docs/source/_static/noaacsp_cluster_1.png deleted file mode 100644 index 3fdc0e68b8cf8b6d7d4ea79a33e8c8c0d60e6350..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 533258 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 &O|-v-T#1ot!nWk1U)sx&Xy#k0^4`x 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
Lw$`*;2z}w^cTVRf^-Q{ln@_~M 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