From 4ad96952f0bccaedad3e9c558341fe5e28d813aa Mon Sep 17 00:00:00 2001 From: Rahul Mahajan Date: Fri, 13 Sep 2024 11:13:20 -0400 Subject: [PATCH 01/21] Disable native grid writes for non-JEDI experiments; update C384 compression options (#2914) - enables writing native grid model output when doing JEDI-atm DA - updates compression settings for C384 model output Fixes #2891 --- parm/config/gefs/config.ufs | 39 ++++++++++++------------------ parm/config/gfs/config.ufs | 31 +++++++++--------------- ush/forecast_postdet.sh | 8 +++--- ush/parsing_model_configure_FV3.sh | 6 ++++- 4 files changed, 37 insertions(+), 47 deletions(-) diff --git a/parm/config/gefs/config.ufs b/parm/config/gefs/config.ufs index bfc11e3c5a..bc3950490e 100644 --- a/parm/config/gefs/config.ufs +++ b/parm/config/gefs/config.ufs @@ -80,8 +80,8 @@ 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 cdmbgwd="0.071,2.1,1.0,1.0" # mountain blocking, ogwd, cgwd, cgwd src scaling + export xr_cnvcld=.false. # Do not 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 export n_split=4 @@ -104,8 +104,8 @@ 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 cdmbgwd="0.14,1.8,1.0,1.0" # mountain blocking, ogwd, cgwd, cgwd src scaling + export xr_cnvcld=".false." # Do not 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 export k_split=1 @@ -254,40 +254,33 @@ export ntasks_fv3_gfs export ntasks_quilt export ntasks_quilt_gfs -# Determine whether to use compression in the write grid component based on resolution +# Determine whether to use compression in the write grid component +# and whether to use parallel NetCDF based on resolution case ${fv3_res} in - "C48" | "C96" | "C192" | "C384") + "C48" | "C96" | "C192") zstandard_level=0 ideflate=0 quantize_nsd=0 + OUTPUT_FILETYPE_ATM="netcdf" + OUTPUT_FILETYPE_SFC="netcdf" ;; - "C768" | "C1152" | "C3072") + "C384" | "C768" | "C1152" | "C3072") zstandard_level=0 ideflate=1 quantize_nsd=5 - ;; - *) - echo "FATAL ERROR: Unrecognized FV3 resolution ${fv3_res}" - exit 15 - ;; -esac -export zstandard_level ideflate quantize_nsd - -# Determine whether to use parallel NetCDF based on resolution -case ${fv3_res} in - "C48" | "C96" | "C192" | "C384") - OUTPUT_FILETYPE_ATM="netcdf" - OUTPUT_FILETYPE_SFC="netcdf" - ;; - "C768" | "C1152" | "C3072") OUTPUT_FILETYPE_ATM="netcdf_parallel" - OUTPUT_FILETYPE_SFC="netcdf_parallel" + if [[ "${fv3_res}" == "C384" ]]; then + OUTPUT_FILETYPE_SFC="netcdf" # For C384, the write grid component is better off with serial netcdf + else + OUTPUT_FILETYPE_SFC="netcdf_parallel" + fi ;; *) echo "FATAL ERROR: Unrecognized FV3 resolution ${fv3_res}" exit 15 ;; esac +export zstandard_level ideflate quantize_nsd export OUTPUT_FILETYPE_ATM OUTPUT_FILETYPE_SFC # cpl defaults diff --git a/parm/config/gfs/config.ufs b/parm/config/gfs/config.ufs index b27845aec7..babbe1f2dd 100644 --- a/parm/config/gfs/config.ufs +++ b/parm/config/gfs/config.ufs @@ -356,40 +356,33 @@ export ntasks_fv3_gfs export ntasks_quilt_gdas export ntasks_quilt_gfs -# Determine whether to use compression in the write grid component based on resolution +# Determine whether to use compression in the write grid component +# and whether to use parallel NetCDF based on resolution case ${fv3_res} in - "C48" | "C96" | "C192" | "C384") + "C48" | "C96" | "C192") zstandard_level=0 ideflate=0 quantize_nsd=0 + OUTPUT_FILETYPE_ATM="netcdf" + OUTPUT_FILETYPE_SFC="netcdf" ;; - "C768" | "C1152" | "C3072") + "C384" | "C768" | "C1152" | "C3072") zstandard_level=0 ideflate=1 quantize_nsd=5 - ;; - *) - echo "FATAL ERROR: Unrecognized FV3 resolution ${fv3_res}" - exit 15 - ;; -esac -export zstandard_level ideflate quantize_nsd - -# Determine whether to use parallel NetCDF based on resolution -case ${fv3_res} in - "C48" | "C96" | "C192" | "C384") - OUTPUT_FILETYPE_ATM="netcdf" - OUTPUT_FILETYPE_SFC="netcdf" - ;; - "C768" | "C1152" | "C3072") OUTPUT_FILETYPE_ATM="netcdf_parallel" - OUTPUT_FILETYPE_SFC="netcdf_parallel" + if [[ "${fv3_res}" == "C384" ]]; then + OUTPUT_FILETYPE_SFC="netcdf" # For C384, the write grid component is better off with serial netcdf + else + OUTPUT_FILETYPE_SFC="netcdf_parallel" + fi ;; *) echo "FATAL ERROR: Unrecognized FV3 resolution ${fv3_res}" exit 15 ;; esac +export zstandard_level ideflate quantize_nsd export OUTPUT_FILETYPE_ATM OUTPUT_FILETYPE_SFC # cpl defaults diff --git a/ush/forecast_postdet.sh b/ush/forecast_postdet.sh index d13cb0df0c..58755d41d9 100755 --- a/ush/forecast_postdet.sh +++ b/ush/forecast_postdet.sh @@ -233,14 +233,14 @@ EOF ${NLN} "${COMOUT_ATMOS_HISTORY}/${RUN}.t${cyc}z.atmf${FH3}.nc" "atmf${f_hhmmss}.nc" ${NLN} "${COMOUT_ATMOS_HISTORY}/${RUN}.t${cyc}z.sfcf${FH3}.nc" "sfcf${f_hhmmss}.nc" ${NLN} "${COMOUT_ATMOS_HISTORY}/${RUN}.t${cyc}z.atm.logf${FH3}.txt" "log.atm.f${f_hhmmss}" - ${NLN} "${COMOUT_ATMOS_HISTORY}/${RUN}.t${cyc}z.cubed_sphere_grid_atmf${FH3}.nc" "cubed_sphere_grid_atmf${f_hhmmss}.nc" - ${NLN} "${COMOUT_ATMOS_HISTORY}/${RUN}.t${cyc}z.cubed_sphere_grid_sfcf${FH3}.nc" "cubed_sphere_grid_sfcf${f_hhmmss}.nc" else ${NLN} "${COMOUT_ATMOS_HISTORY}/${RUN}.t${cyc}z.atmf${FH3}.nc" "atmf${FH3}.nc" ${NLN} "${COMOUT_ATMOS_HISTORY}/${RUN}.t${cyc}z.sfcf${FH3}.nc" "sfcf${FH3}.nc" ${NLN} "${COMOUT_ATMOS_HISTORY}/${RUN}.t${cyc}z.atm.logf${FH3}.txt" "log.atm.f${FH3}" - ${NLN} "${COMOUT_ATMOS_HISTORY}/${RUN}.t${cyc}z.cubed_sphere_grid_atmf${FH3}.nc" "cubed_sphere_grid_atmf${FH3}.nc" - ${NLN} "${COMOUT_ATMOS_HISTORY}/${RUN}.t${cyc}z.cubed_sphere_grid_sfcf${FH3}.nc" "cubed_sphere_grid_sfcf${FH3}.nc" + if [[ "${DO_JEDIATMVAR:-}" == "YES" ]]; then + ${NLN} "${COMOUT_ATMOS_HISTORY}/${RUN}.t${cyc}z.cubed_sphere_grid_atmf${FH3}.nc" "cubed_sphere_grid_atmf${FH3}.nc" + ${NLN} "${COMOUT_ATMOS_HISTORY}/${RUN}.t${cyc}z.cubed_sphere_grid_sfcf${FH3}.nc" "cubed_sphere_grid_sfcf${FH3}.nc" + fi fi if [[ "${WRITE_DOPOST}" == ".true." ]]; then ${NLN} "${COMOUT_ATMOS_MASTER}/${RUN}.t${cyc}z.master.grb2f${FH3}" "GFSPRS.GrbF${FH2}" diff --git a/ush/parsing_model_configure_FV3.sh b/ush/parsing_model_configure_FV3.sh index 8f102fe298..7cf7bf8662 100755 --- a/ush/parsing_model_configure_FV3.sh +++ b/ush/parsing_model_configure_FV3.sh @@ -31,7 +31,11 @@ local WRITE_GROUP=${WRITE_GROUP:-1} local WRTTASK_PER_GROUP=${WRTTASK_PER_GROUP:-24} local ITASKS=1 local OUTPUT_HISTORY=${OUTPUT_HISTORY:-".true."} -local HISTORY_FILE_ON_NATIVE_GRID=".true." +if [[ "${DO_JEDIATMVAR:-}" == "YES" ]]; then + local HISTORY_FILE_ON_NATIVE_GRID=".true." +else + local HISTORY_FILE_ON_NATIVE_GRID=".false." +fi local WRITE_DOPOST=${WRITE_DOPOST:-".false."} local WRITE_NSFLIP=${WRITE_NSFLIP:-".false."} local NUM_FILES=${NUM_FILES:-2} From d8669822852a0922648606cf57509caa08fe40d2 Mon Sep 17 00:00:00 2001 From: Wei Huang Date: Fri, 13 Sep 2024 13:39:27 -0600 Subject: [PATCH 02/21] Support gefs C48 on Azure (#2881) Support global-worflow GEFS C48 on Azure Make env. var. and yaml file changes, so global-workflow GEFS C48 case can run properly on Google Cloud. Resolves #2882 --- env/AZUREPW.env | 48 +++++++++++++++++++++++ parm/config/gefs/config.base | 2 +- parm/config/gefs/config.resources | 4 ++ parm/config/gefs/config.resources.AZUREPW | 11 ++++++ workflow/hosts/azurepw.yaml | 2 +- 5 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 parm/config/gefs/config.resources.AZUREPW diff --git a/env/AZUREPW.env b/env/AZUREPW.env index 9e246a9cb4..c2faeb2bf6 100755 --- a/env/AZUREPW.env +++ b/env/AZUREPW.env @@ -43,6 +43,13 @@ if [[ "${step}" = "fcst" ]] || [[ "${step}" = "efcs" ]]; then export APRUN_UFS="${launcher} -n ${ufs_ntasks}" unset nnodes ufs_ntasks +elif [[ "${step}" = "waveinit" ]] || [[ "${step}" = "waveprep" ]] || [[ "${step}" = "wavepostsbs" ]] || [[ "${step}" = "wavepostbndpnt" ]] || [[ "${step}" = "wavepostbndpntbll" ]] || [[ "${step}" = "wavepostpnt" ]]; then + + export CFP_MP="YES" + if [[ "${step}" = "waveprep" ]]; then export MP_PULSE=0 ; fi + export wavempexec=${launcher} + export wave_mpmd=${mpmd_opt} + elif [[ "${step}" = "post" ]]; then export NTHREADS_NP=${NTHREADS1} @@ -52,4 +59,45 @@ elif [[ "${step}" = "post" ]]; then [[ ${NTHREADS_DWN} -gt ${max_threads_per_task} ]] && export NTHREADS_DWN=${max_threads_per_task} export APRUN_DWN="${launcher} -n ${ntasks_dwn}" +elif [[ "${step}" = "atmos_products" ]]; then + + export USE_CFP="YES" # Use MPMD for downstream product generation on Hera + +elif [[ "${step}" = "oceanice_products" ]]; then + + export NTHREADS_OCNICEPOST=${NTHREADS1} + export APRUN_OCNICEPOST="${launcher} -n 1 --cpus-per-task=${NTHREADS_OCNICEPOST}" + +elif [[ "${step}" = "ecen" ]]; then + + export NTHREADS_ECEN=${NTHREADSmax} + export APRUN_ECEN="${APRUN}" + + export NTHREADS_CHGRES=${threads_per_task_chgres:-12} + [[ ${NTHREADS_CHGRES} -gt ${max_tasks_per_node} ]] && export NTHREADS_CHGRES=${max_tasks_per_node} + export APRUN_CHGRES="time" + + export NTHREADS_CALCINC=${threads_per_task_calcinc:-1} + [[ ${NTHREADS_CALCINC} -gt ${max_threads_per_task} ]] && export NTHREADS_CALCINC=${max_threads_per_task} + export APRUN_CALCINC="${APRUN}" + +elif [[ "${step}" = "esfc" ]]; then + + export NTHREADS_ESFC=${NTHREADSmax} + export APRUN_ESFC="${APRUN}" + + export NTHREADS_CYCLE=${threads_per_task_cycle:-14} + [[ ${NTHREADS_CYCLE} -gt ${max_tasks_per_node} ]] && export NTHREADS_CYCLE=${max_tasks_per_node} + export APRUN_CYCLE="${APRUN}" + +elif [[ "${step}" = "epos" ]]; then + + export NTHREADS_EPOS=${NTHREADSmax} + export APRUN_EPOS="${APRUN}" + +elif [[ "${step}" = "fit2obs" ]]; then + + export NTHREADS_FIT2OBS=${NTHREADS1} + export MPIRUN="${APRUN}" + fi diff --git a/parm/config/gefs/config.base b/parm/config/gefs/config.base index 47474fb108..883957ed0c 100644 --- a/parm/config/gefs/config.base +++ b/parm/config/gefs/config.base @@ -342,7 +342,7 @@ export DELETE_COM_IN_ARCHIVE_JOB="YES" # NO=retain ROTDIR. YES default in arc 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/[csp]pw.yaml as part of AWS/AZURE/GOOGLE setup, not for general. +# 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 diff --git a/parm/config/gefs/config.resources b/parm/config/gefs/config.resources index 79f3426f56..a96bb02bd9 100644 --- a/parm/config/gefs/config.resources +++ b/parm/config/gefs/config.resources @@ -43,6 +43,10 @@ case ${machine} in export PARTITION_BATCH="compute" max_tasks_per_node=36 ;; + "AZUREPW") + export PARTITION_BATCH="compute" + max_tasks_per_node=24 + ;; "GOOGLEPW") export PARTITION_BATCH="compute" max_tasks_per_node=32 diff --git a/parm/config/gefs/config.resources.AZUREPW b/parm/config/gefs/config.resources.AZUREPW new file mode 100644 index 0000000000..96303139d8 --- /dev/null +++ b/parm/config/gefs/config.resources.AZUREPW @@ -0,0 +1,11 @@ +#! /usr/bin/env bash + +# AZURE-specific job resources + +export is_exclusive="True" +unset memory + +# shellcheck disable=SC2312 +for mem_var in $(env | grep '^memory_' | cut -d= -f1); do + unset "${mem_var}" +done diff --git a/workflow/hosts/azurepw.yaml b/workflow/hosts/azurepw.yaml index 2155c67dea..d59736e653 100644 --- a/workflow/hosts/azurepw.yaml +++ b/workflow/hosts/azurepw.yaml @@ -18,7 +18,7 @@ CHGRP_RSTPROD: 'YES' CHGRP_CMD: 'chgrp rstprod' # TODO: This is not yet supported. HPSSARCH: 'NO' HPSS_PROJECT: emc-global #TODO: See `ATARDIR` below. -BASE_CPLIC: '/bucket/global-workflow-shared-data/ICSDIR/prototype_ICs' +BASE_IC: '/bucket/global-workflow-shared-data/ICSDIR' LOCALARCH: 'NO' ATARDIR: '' # TODO: This will not yet work from AZURE. MAKE_NSSTBUFR: 'NO' From 19455ba32cffd47f409ca711bec80adb3fe7c3d4 Mon Sep 17 00:00:00 2001 From: Jeffrey Whitaker Date: Fri, 13 Sep 2024 18:22:20 -0600 Subject: [PATCH 03/21] add 1 deg ocean/ice info to parm/config/gfs/config.resources (#2922) Adds 1 deg ocean, ice information to config.resources so 1 deg ocean jobs can run --- parm/config/gfs/config.resources | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/parm/config/gfs/config.resources b/parm/config/gfs/config.resources index b50e1c5fbb..a89c72e951 100644 --- a/parm/config/gfs/config.resources +++ b/parm/config/gfs/config.resources @@ -527,6 +527,7 @@ case ${step} in case ${OCNRES} in "025") ntasks=480;; "050") ntasks=16;; + "100") ntasks=16;; "500") ntasks=16;; *) echo "FATAL ERROR: Resources not defined for job ${step} at resolution ${OCNRES}" @@ -550,6 +551,10 @@ case ${step} in ntasks=16 memory="96GB" ;; + "100") + ntasks=16 + memory="96GB" + ;; "500") ntasks=16 memory="24GB" @@ -576,6 +581,10 @@ case ${step} in ntasks=16 memory="96GB" ;; + "100") + ntasks=16 + memory="96GB" + ;; "500") ntasks=16 memory="24GB" @@ -602,6 +611,10 @@ case ${step} in ntasks=16 memory="96GB" ;; + "100") + ntasks=16 + memory="96GB" + ;; "500") ntasks=16 memory="24GB" @@ -630,6 +643,9 @@ case ${step} in "050") memory="32GB" ntasks=16;; + "100") + memory="32GB" + ntasks=16;; "500") memory="32GB" ntasks=8;; From a13bbef6a9341f09349d145642a068f438edd736 Mon Sep 17 00:00:00 2001 From: DavidBurrows-NCO <82525974+DavidBurrows-NCO@users.noreply.github.com> Date: Sat, 14 Sep 2024 10:35:39 -0400 Subject: [PATCH 04/21] Build GDASApp and unset memory in Gaea-C5 xml files (#2912) In preparation for GDASApp CI tests, add GDASApp build capability to global-workflow and remove memory specifications for Gaea-C5 xml setup (in Ref to #2727) Resolves #2535 Resolves #2910 Resolves #2911 --- parm/config/gfs/config.resources.GAEA | 1 + sorc/build_all.sh | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/parm/config/gfs/config.resources.GAEA b/parm/config/gfs/config.resources.GAEA index 51007b5b4f..a4d4ddfece 100644 --- a/parm/config/gfs/config.resources.GAEA +++ b/parm/config/gfs/config.resources.GAEA @@ -21,6 +21,7 @@ case ${step} in esac +unset memory # shellcheck disable=SC2312 for mem_var in $(env | grep '^memory_' | cut -d= -f1); do unset "${mem_var}" diff --git a/sorc/build_all.sh b/sorc/build_all.sh index 79ae3c937f..b2f4e6ce0e 100755 --- a/sorc/build_all.sh +++ b/sorc/build_all.sh @@ -145,7 +145,7 @@ build_opts["ww3prepost"]="${_wave_opt} ${_verbose_opt} ${_build_ufs_opt} ${_buil # Optional DA builds if [[ "${_build_ufsda}" == "YES" ]]; then - if [[ "${MACHINE_ID}" != "orion" && "${MACHINE_ID}" != "hera" && "${MACHINE_ID}" != "hercules" && "${MACHINE_ID}" != "wcoss2" && "${MACHINE_ID}" != "noaacloud" ]]; then + if [[ "${MACHINE_ID}" != "orion" && "${MACHINE_ID}" != "hera" && "${MACHINE_ID}" != "hercules" && "${MACHINE_ID}" != "wcoss2" && "${MACHINE_ID}" != "noaacloud" && "${MACHINE_ID}" != "gaea" ]]; then echo "NOTE: The GDAS App is not supported on ${MACHINE_ID}. Disabling build." else build_jobs["gdas"]=8 From b7f71e015671ae993df59f8da4f860627e834a02 Mon Sep 17 00:00:00 2001 From: AntonMFernando-NOAA <167725623+AntonMFernando-NOAA@users.noreply.github.com> Date: Sat, 14 Sep 2024 11:46:50 -0400 Subject: [PATCH 05/21] Cleanup job for GEFS (#2919) As forecast ensemble jobs are added to the global workflow, this PR ensures the output is being cleaned up properly once it is no longer needed. Resolves #833 --- parm/config/gefs/config.cleanup | 1 + parm/config/gefs/config.resources | 8 ++++++++ workflow/applications/gefs.py | 4 ++-- workflow/rocoto/gefs_tasks.py | 27 +++++++++++++++++++++++++++ 4 files changed, 38 insertions(+), 2 deletions(-) create mode 120000 parm/config/gefs/config.cleanup diff --git a/parm/config/gefs/config.cleanup b/parm/config/gefs/config.cleanup new file mode 120000 index 0000000000..839ed6c194 --- /dev/null +++ b/parm/config/gefs/config.cleanup @@ -0,0 +1 @@ +../gfs/config.cleanup \ No newline at end of file diff --git a/parm/config/gefs/config.resources b/parm/config/gefs/config.resources index a96bb02bd9..690fdf919a 100644 --- a/parm/config/gefs/config.resources +++ b/parm/config/gefs/config.resources @@ -295,6 +295,14 @@ case ${step} in export threads_per_task=1 export memory="4096M" ;; + + "cleanup") + export walltime="00:15:00" + export ntasks=1 + export tasks_per_node=1 + export threads_per_task=1 + export memory="4096M" + ;; *) echo "FATAL ERROR: Invalid job ${step} passed to ${BASH_SOURCE[0]}" exit 1 diff --git a/workflow/applications/gefs.py b/workflow/applications/gefs.py index 1db3c51287..afb4072596 100644 --- a/workflow/applications/gefs.py +++ b/workflow/applications/gefs.py @@ -17,7 +17,7 @@ def _get_app_configs(self): """ Returns the config_files that are involved in gefs """ - configs = ['stage_ic', 'fcst', 'atmos_products', 'arch'] + configs = ['stage_ic', 'fcst', 'atmos_products', 'arch', 'cleanup'] if self.nens > 0: configs += ['efcs', 'atmos_ensstat'] @@ -82,6 +82,6 @@ def get_task_names(self): if self.do_extractvars: tasks += ['extractvars'] - tasks += ['arch'] + tasks += ['arch', 'cleanup'] return {f"{self.run}": tasks} diff --git a/workflow/rocoto/gefs_tasks.py b/workflow/rocoto/gefs_tasks.py index 70a39cea5a..8a4f148f24 100644 --- a/workflow/rocoto/gefs_tasks.py +++ b/workflow/rocoto/gefs_tasks.py @@ -546,6 +546,9 @@ def arch(self): deps.append(rocoto.add_dependency(dep_dict)) dep_dict = {'type': 'metatask', 'name': 'wave_post_bndpnt_bull'} deps.append(rocoto.add_dependency(dep_dict)) + if self.app_config.do_extractvars: + dep_dict = {'type': 'metatask', 'name': 'extractvars'} + deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep=deps, dep_condition='and') resources = self.get_resource('arch') @@ -564,3 +567,27 @@ def arch(self): task = rocoto.create_task(task_dict) return task + + def cleanup(self): + deps = [] + dep_dict = {'type': 'task', 'name': 'arch'} + deps.append(rocoto.add_dependency(dep_dict)) + + dependencies = rocoto.create_dependency(dep=deps) + + resources = self.get_resource('cleanup') + task_name = 'cleanup' + task_dict = {'task_name': task_name, + 'resources': resources, + 'envars': self.envars, + 'cycledef': 'gefs', + 'dependency': dependencies, + 'command': f'{self.HOMEgfs}/jobs/rocoto/cleanup.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 From 03ee9f8faf301860f5ef6ae87163df76736f53d7 Mon Sep 17 00:00:00 2001 From: BoCui-NOAA <53531984+BoCui-NOAA@users.noreply.github.com> Date: Sun, 15 Sep 2024 22:51:28 -0400 Subject: [PATCH 06/21] Update config.resources for bufr sounding job postsnd (#2917) This PR updates the parm/config/gfs/config.resources and env/WCOSS2.env files for the BUFR sounding job "postsnd." It includes adjustments to resource settings such as tasks per node and memory allocations for various GFS resolutions, including C768, C1152, and others. Here are the proposed changes: C768: 7 nodes, 21 tasks per node C1152: 16 nodes, 9 tasks per node --- env/WCOSS2.env | 4 ++-- parm/config/gfs/config.resources | 18 ++++++++++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/env/WCOSS2.env b/env/WCOSS2.env index d2dae3ba93..cea24fb26b 100755 --- a/env/WCOSS2.env +++ b/env/WCOSS2.env @@ -272,12 +272,12 @@ elif [[ "${step}" = "postsnd" ]]; then export OMP_NUM_THREADS=1 export NTHREADS_POSTSND=${NTHREADS1} - export mpmd_opt="-ppn 21 ${mpmd_opt}" - export NTHREADS_POSTSNDCFP=${threads_per_task_postsndcfp:-1} [[ ${NTHREADS_POSTSNDCFP} -gt ${max_threads_per_task} ]] && export NTHREADS_POSTSNDCFP=${max_threads_per_task} export APRUN_POSTSNDCFP="${launcher} -np ${ntasks_postsndcfp} ${mpmd_opt}" + export mpmd_opt="-ppn ${tasks_per_node} ${mpmd_opt}" + elif [[ "${step}" = "awips" ]]; then export NTHREADS_AWIPS=${NTHREADS1} diff --git a/parm/config/gfs/config.resources b/parm/config/gfs/config.resources index a89c72e951..afc5939fcd 100644 --- a/parm/config/gfs/config.resources +++ b/parm/config/gfs/config.resources @@ -1208,9 +1208,23 @@ case ${step} in "postsnd") walltime="02:00:00" export ntasks=141 - threads_per_task=6 - export tasks_per_node=21 export ntasks_postsndcfp=9 + case ${CASE} in + "C768") + tasks_per_node=21 + threads_per_task=6 + memory="23GB" + ;; + "C1152") + tasks_per_node=9 + threads_per_task=14 + memory="50GB" + ;; + *) + tasks_per_node=21 + threads_per_task=6 + ;; + esac export tasks_per_node_postsndcfp=1 postsnd_req_cores=$(( tasks_per_node * threads_per_task )) if (( postsnd_req_cores > max_tasks_per_node )); then From 2602eac32fe9b538310ae25f154d219d8400fa0b Mon Sep 17 00:00:00 2001 From: mingshichen-noaa <48537176+mingshichen-noaa@users.noreply.github.com> Date: Mon, 16 Sep 2024 09:58:07 -0400 Subject: [PATCH 07/21] Update global atmos upp job to use COMIN/COMOUT (#2867) NCO has requested that each COM variable specify whether it is an input or an output. This completes that process for the global-workflow Unified Post Processor (UPP) task. Refs: https://github.com/NOAA-EMC/global-workflow/issues/2451 --- jobs/JGLOBAL_ATMOS_UPP | 7 +++++-- parm/post/upp.yaml | 28 ++++++++++++++-------------- scripts/exglobal_atmos_upp.py | 2 +- ush/python/pygfs/task/upp.py | 6 +++--- 4 files changed, 23 insertions(+), 20 deletions(-) diff --git a/jobs/JGLOBAL_ATMOS_UPP b/jobs/JGLOBAL_ATMOS_UPP index 1aa62cdbb3..0e70e97025 100755 --- a/jobs/JGLOBAL_ATMOS_UPP +++ b/jobs/JGLOBAL_ATMOS_UPP @@ -12,8 +12,11 @@ source "${HOMEgfs}/ush/jjob_header.sh" -e "upp" -c "base upp" ############################################## # Construct COM variables from templates -YMD=${PDY} HH=${cyc} declare_from_tmpl -rx COM_ATMOS_ANALYSIS COM_ATMOS_HISTORY COM_ATMOS_MASTER -if [[ ! -d ${COM_ATMOS_MASTER} ]]; then mkdir -m 775 -p "${COM_ATMOS_MASTER}"; fi +YMD=${PDY} HH=${cyc} declare_from_tmpl -rx \ + COMIN_ATMOS_ANALYSIS:COM_ATMOS_ANALYSIS_TMPL \ + COMIN_ATMOS_HISTORY:COM_ATMOS_HISTORY_TMPL \ + COMOUT_ATMOS_MASTER:COM_ATMOS_MASTER_TMPL +if [[ ! -d ${COMOUT_ATMOS_MASTER} ]]; then mkdir -p "${COMOUT_ATMOS_MASTER}"; fi ############################################################### diff --git a/parm/post/upp.yaml b/parm/post/upp.yaml index 41dbb7defb..dd9aed3358 100644 --- a/parm/post/upp.yaml +++ b/parm/post/upp.yaml @@ -19,12 +19,12 @@ analysis: data_in: copy: - ["{{ PARMgfs }}/post/gfs/postxconfig-NT-gfs-anl.txt", "{{ DATA }}/postxconfig-NT.txt"] - - ["{{ COM_ATMOS_ANALYSIS }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.atmanl.nc", "{{ DATA }}/{{ atmos_filename }}"] - - ["{{ COM_ATMOS_ANALYSIS }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.sfcanl.nc", "{{ DATA }}/{{ flux_filename }}"] + - ["{{ COMIN_ATMOS_ANALYSIS }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.atmanl.nc", "{{ DATA }}/{{ atmos_filename }}"] + - ["{{ COMIN_ATMOS_ANALYSIS }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.sfcanl.nc", "{{ DATA }}/{{ flux_filename }}"] data_out: copy: - - ["{{ DATA }}/GFSPRS.GrbF00", "{{ COM_ATMOS_MASTER }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.master.grb2anl"] - - ["{{ DATA }}/GFSPRS.GrbF00.idx", "{{ COM_ATMOS_MASTER }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.master.grb2ianl"] + - ["{{ DATA }}/GFSPRS.GrbF00", "{{ COMOUT_ATMOS_MASTER }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.master.grb2anl"] + - ["{{ DATA }}/GFSPRS.GrbF00.idx", "{{ COMOUT_ATMOS_MASTER }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.master.grb2ianl"] forecast: config: @@ -36,14 +36,14 @@ forecast: {% else %} - ["{{ PARMgfs }}/post/gfs/postxconfig-NT-gfs-two.txt", "{{ DATA }}/postxconfig-NT.txt"] {% endif %} - - ["{{ COM_ATMOS_HISTORY }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.atmf{{ '%03d' % forecast_hour }}.nc", "{{ DATA }}/{{ atmos_filename }}"] - - ["{{ COM_ATMOS_HISTORY }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.sfcf{{ '%03d' % forecast_hour }}.nc", "{{ DATA }}/{{ flux_filename }}"] + - ["{{ COMIN_ATMOS_HISTORY }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.atmf{{ '%03d' % forecast_hour }}.nc", "{{ DATA }}/{{ atmos_filename }}"] + - ["{{ COMIN_ATMOS_HISTORY }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.sfcf{{ '%03d' % forecast_hour }}.nc", "{{ DATA }}/{{ flux_filename }}"] data_out: copy: - - ["{{ DATA }}/GFSPRS.GrbF{{ '%02d' % forecast_hour }}", "{{ COM_ATMOS_MASTER }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.master.grb2f{{ '%03d' % forecast_hour }}"] - - ["{{ DATA }}/GFSFLX.GrbF{{ '%02d' % forecast_hour }}", "{{ COM_ATMOS_MASTER }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.sfluxgrbf{{ '%03d' % forecast_hour }}.grib2"] - - ["{{ DATA }}/GFSPRS.GrbF{{ '%02d' % forecast_hour }}.idx", "{{ COM_ATMOS_MASTER }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.master.grb2if{{ '%03d' % forecast_hour }}"] - - ["{{ DATA }}/GFSFLX.GrbF{{ '%02d' % forecast_hour }}.idx", "{{ COM_ATMOS_MASTER }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.sfluxgrbf{{ '%03d' % forecast_hour }}.grib2.idx"] + - ["{{ DATA }}/GFSPRS.GrbF{{ '%02d' % forecast_hour }}", "{{ COMOUT_ATMOS_MASTER }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.master.grb2f{{ '%03d' % forecast_hour }}"] + - ["{{ DATA }}/GFSFLX.GrbF{{ '%02d' % forecast_hour }}", "{{ COMOUT_ATMOS_MASTER }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.sfluxgrbf{{ '%03d' % forecast_hour }}.grib2"] + - ["{{ DATA }}/GFSPRS.GrbF{{ '%02d' % forecast_hour }}.idx", "{{ COMOUT_ATMOS_MASTER }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.master.grb2if{{ '%03d' % forecast_hour }}"] + - ["{{ DATA }}/GFSFLX.GrbF{{ '%02d' % forecast_hour }}.idx", "{{ COMOUT_ATMOS_MASTER }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.sfluxgrbf{{ '%03d' % forecast_hour }}.grib2.idx"] goes: config: @@ -82,9 +82,9 @@ goes: - ["{{ 'CRTM_FIX' | getenv }}/AerosolCoeff.bin", "{{ DATA }}/"] - ["{{ 'CRTM_FIX' | getenv }}/CloudCoeff.bin", "{{ DATA }}/"] - ["{{ PARMgfs }}/post/gfs/postxconfig-NT-gfs-goes.txt", "{{ DATA }}/postxconfig-NT.txt"] - - ["{{ COM_ATMOS_HISTORY }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.atmf{{ '%03d' % forecast_hour }}.nc", "{{ DATA }}/{{ atmos_filename }}"] - - ["{{ COM_ATMOS_HISTORY }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.sfcf{{ '%03d' % forecast_hour }}.nc", "{{ DATA }}/{{ flux_filename }}"] + - ["{{ COMIN_ATMOS_HISTORY }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.atmf{{ '%03d' % forecast_hour }}.nc", "{{ DATA }}/{{ atmos_filename }}"] + - ["{{ COMIN_ATMOS_HISTORY }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.sfcf{{ '%03d' % forecast_hour }}.nc", "{{ DATA }}/{{ flux_filename }}"] data_out: copy: - - ["{{ DATA }}/GFSGOES.GrbF{{ '%02d' % forecast_hour }}", "{{ COM_ATMOS_MASTER }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.special.grb2f{{ '%03d' % forecast_hour }}"] - - ["{{ DATA }}/GFSGOES.GrbF{{ '%02d' % forecast_hour }}.idx", "{{ COM_ATMOS_MASTER }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.special.grb2if{{ '%03d' % forecast_hour }}"] + - ["{{ DATA }}/GFSGOES.GrbF{{ '%02d' % forecast_hour }}", "{{ COMOUT_ATMOS_MASTER }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.special.grb2f{{ '%03d' % forecast_hour }}"] + - ["{{ DATA }}/GFSGOES.GrbF{{ '%02d' % forecast_hour }}.idx", "{{ COMOUT_ATMOS_MASTER }}/{{ RUN }}.t{{ current_cycle | strftime('%H') }}z.special.grb2if{{ '%03d' % forecast_hour }}"] diff --git a/scripts/exglobal_atmos_upp.py b/scripts/exglobal_atmos_upp.py index 6cdbc1bc51..f87f06d2c9 100755 --- a/scripts/exglobal_atmos_upp.py +++ b/scripts/exglobal_atmos_upp.py @@ -19,7 +19,7 @@ def main(): # Pull out all the configuration keys needed to run the rest of UPP steps keys = ['HOMEgfs', 'DATA', 'current_cycle', 'RUN', 'NET', - 'COM_ATMOS_ANALYSIS', 'COM_ATMOS_HISTORY', 'COM_ATMOS_MASTER', + 'COMIN_ATMOS_ANALYSIS', 'COMIN_ATMOS_HISTORY', 'COMOUT_ATMOS_MASTER', 'upp_run', 'APRUN_UPP', 'forecast_hour', 'valid_datetime', diff --git a/ush/python/pygfs/task/upp.py b/ush/python/pygfs/task/upp.py index 1b37b845f6..70955a7276 100644 --- a/ush/python/pygfs/task/upp.py +++ b/ush/python/pygfs/task/upp.py @@ -249,7 +249,7 @@ def _call_executable(exec_cmd: Executable) -> None: @logit(logger) def finalize(upp_run: Dict, upp_yaml: Dict) -> None: """Perform closing actions of the task. - Copy data back from the DATA/ directory to COM/ + Copy data back from the DATA/ directory to COMOUT/ Parameters ---------- @@ -259,6 +259,6 @@ def finalize(upp_run: Dict, upp_yaml: Dict) -> None: Fully resolved upp.yaml dictionary """ - # Copy "upp_run" specific generated data to COM/ directory - logger.info(f"Copy '{upp_run}' processed data to COM/ directory") + # Copy "upp_run" specific generated data to COMOUT/ directory + logger.info(f"Copy '{upp_run}' processed data to COMOUT/ directory") FileHandler(upp_yaml[upp_run].data_out).sync() From 7588d2bd17ef345216ae096d088b5470b6f31bcd Mon Sep 17 00:00:00 2001 From: Kate Friedman Date: Tue, 17 Sep 2024 20:59:59 -0400 Subject: [PATCH 08/21] Update to obsproc/v1.2.0 and prepobs/v1.1.0 (#2903) This PR updates the `develop` branch to use the newer operational `obsproc/v1.2.0` and `prepobs/v1.1.0`. The obsproc/prepobs installs in glopara space on supported platforms use tags cut from the `dev/gfsv17` branches in the respective repos. The installation of `prepobs/v1.1.0` on WCOSS2 is called "gfsv17_v1.1.0" to help avoid GFSv16 users using it instead of the operational module. Also, the `HOMEobsproc` path is updated to set an empty default for `obsproc_run_ver`. This both removes the need to set a default (and constantly update it, which is duplication) and avoid the unset variable error when the fcst jobs use their own load module script that does not know `obsproc_run_ver`: ``` export HOMEobsproc="${BASE_GIT:-}/obsproc/v${obsproc_run_ver:-}" ``` This PR also reverts the prepobs and fit2obs installs on MSU back to the glopara space from the temporary `/work/noaa/global/kfriedma/glopara` space installs. Lastly, this PR also includes updates to complete issue #2844 (merge `build.spack.ver` and `run.spack.ver`). Resolves #2291 Resolves #2840 Resolves #2844 --- modulefiles/module_base.gaea.lua | 6 ++---- modulefiles/module_base.hercules.lua | 6 ++---- modulefiles/module_base.jet.lua | 2 +- modulefiles/module_base.orion.lua | 6 ++---- modulefiles/module_base.wcoss2.lua | 2 +- parm/config/gfs/config.base | 2 +- versions/build.gaea.ver | 3 +-- versions/build.hera.ver | 2 +- versions/build.hercules.ver | 2 +- versions/build.jet.ver | 2 +- versions/build.noaacloud.ver | 2 +- versions/build.orion.ver | 2 +- versions/build.s4.ver | 2 +- versions/build.spack.ver | 27 --------------------------- versions/run.gaea.ver | 2 +- versions/run.hera.ver | 2 +- versions/run.hercules.ver | 3 +-- versions/run.jet.ver | 2 +- versions/run.noaacloud.ver | 2 +- versions/run.orion.ver | 3 +-- versions/run.s4.ver | 2 +- versions/run.wcoss2.ver | 6 +++--- versions/{run.spack.ver => spack.ver} | 17 ++++++++++++++--- workflow/hosts/orion.yaml | 2 +- 24 files changed, 41 insertions(+), 66 deletions(-) delete mode 100644 versions/build.spack.ver rename versions/{run.spack.ver => spack.ver} (68%) diff --git a/modulefiles/module_base.gaea.lua b/modulefiles/module_base.gaea.lua index b08e79c274..f379225380 100644 --- a/modulefiles/module_base.gaea.lua +++ b/modulefiles/module_base.gaea.lua @@ -38,10 +38,8 @@ load(pathJoin("py-xarray", (os.getenv("py_xarray_ver") or "None"))) setenv("WGRIB2","wgrib2") setenv("UTILROOT",(os.getenv("prod_util_ROOT") or "None")) ---prepend_path("MODULEPATH", pathJoin("/gpfs/f5/ufs-ard/world-shared/global/glopara/data/git/prepobs/v" .. (os.getenv("prepobs_run_ver") or "None"), "modulefiles")) ---load(pathJoin("prepobs", (os.getenv("prepobs_run_ver") or "None"))) -prepend_path("MODULEPATH", pathJoin("/gpfs/f5/ufs-ard/world-shared/global/glopara/data/git/prepobs/v1.1.0", "modulefiles")) -load(pathJoin("prepobs", "1.1.0")) +prepend_path("MODULEPATH", pathJoin("/gpfs/f5/ufs-ard/world-shared/global/glopara/data/git/prepobs/v" .. (os.getenv("prepobs_run_ver") or "None"), "modulefiles")) +load(pathJoin("prepobs", (os.getenv("prepobs_run_ver") or "None"))) prepend_path("MODULEPATH", pathJoin("/gpfs/f5/ufs-ard/world-shared/global/glopara/data/git/Fit2Obs/v" .. (os.getenv("fit2obs_ver") or "None"), "modulefiles")) load(pathJoin("fit2obs", (os.getenv("fit2obs_ver") or "None"))) diff --git a/modulefiles/module_base.hercules.lua b/modulefiles/module_base.hercules.lua index fdc5f58698..4245b0d6f9 100644 --- a/modulefiles/module_base.hercules.lua +++ b/modulefiles/module_base.hercules.lua @@ -43,12 +43,10 @@ setenv("WGRIB2","wgrib2") setenv("WGRIB","wgrib") setenv("UTILROOT",(os.getenv("prod_util_ROOT") or "None")) ---prepend_path("MODULEPATH", pathJoin"/work/noaa/global/glopara/git/prepobs/v" .. (os.getenv("prepobs_run_ver") or "None"), "modulefiles") -prepend_path("MODULEPATH", pathJoin("/work/noaa/global/kfriedma/glopara/git/prepobs/v" .. (os.getenv("prepobs_run_ver") or "None"), "modulefiles")) +prepend_path("MODULEPATH", pathJoin("/work/noaa/global/glopara/git_rocky9/prepobs/v" .. (os.getenv("prepobs_run_ver") or "None"), "modulefiles")) load(pathJoin("prepobs", (os.getenv("prepobs_run_ver") or "None"))) ---prepend_path("MODULEPATH", pathJoin("/work/noaa/global/glopara/git/Fit2Obs/v" .. (os.getenv("fit2obs_ver") or "None"), "modulefiles")) -prepend_path("MODULEPATH", pathJoin("/work/noaa/global/kfriedma/glopara/git/Fit2Obs/v" .. (os.getenv("fit2obs_ver") or "None"), "modulefiles")) +prepend_path("MODULEPATH", pathJoin("/work/noaa/global/glopara/git_rocky9/Fit2Obs/v" .. (os.getenv("fit2obs_ver") or "None"), "modulefiles")) load(pathJoin("fit2obs", (os.getenv("fit2obs_ver") or "None"))) whatis("Description: GFS run environment") diff --git a/modulefiles/module_base.jet.lua b/modulefiles/module_base.jet.lua index 76320688b0..2f00c301df 100644 --- a/modulefiles/module_base.jet.lua +++ b/modulefiles/module_base.jet.lua @@ -49,7 +49,7 @@ setenv("WGRIB2","wgrib2") setenv("WGRIB","wgrib") setenv("UTILROOT",(os.getenv("prod_util_ROOT") or "None")) -prepend_path("MODULEPATH", pathJoin("/lfs4/HFIP/hfv3gfs/glopara/git/prepobs/v" .. (os.getenv("prepobs_run_ver") or "None"), "modulefiles")) +prepend_path("MODULEPATH", pathJoin("/lfs5/HFIP/hfv3gfs/glopara/git/prepobs/v" .. (os.getenv("prepobs_run_ver") or "None"), "modulefiles")) load(pathJoin("prepobs", (os.getenv("prepobs_run_ver") or "None"))) prepend_path("MODULEPATH", pathJoin("/lfs4/HFIP/hfv3gfs/glopara/git/Fit2Obs/v" .. (os.getenv("fit2obs_ver") or "None"), "modulefiles")) diff --git a/modulefiles/module_base.orion.lua b/modulefiles/module_base.orion.lua index 5cee9e5e31..e7b51ed563 100644 --- a/modulefiles/module_base.orion.lua +++ b/modulefiles/module_base.orion.lua @@ -42,12 +42,10 @@ setenv("WGRIB2","wgrib2") setenv("WGRIB","wgrib") setenv("UTILROOT",(os.getenv("prod_util_ROOT") or "None")) ---prepend_path("MODULEPATH", pathJoin"/work/noaa/global/glopara/git/prepobs/v" .. (os.getenv("prepobs_run_ver") or "None"), "modulefiles") -prepend_path("MODULEPATH", pathJoin("/work/noaa/global/kfriedma/glopara/git/prepobs/v" .. (os.getenv("prepobs_run_ver") or "None"), "modulefiles")) +prepend_path("MODULEPATH", pathJoin("/work/noaa/global/glopara/git_rocky9/prepobs/v" .. (os.getenv("prepobs_run_ver") or "None"), "modulefiles")) load(pathJoin("prepobs", (os.getenv("prepobs_run_ver") or "None"))) ---prepend_path("MODULEPATH", pathJoin("/work/noaa/global/glopara/git/Fit2Obs/v" .. (os.getenv("fit2obs_ver") or "None"), "modulefiles")) -prepend_path("MODULEPATH", pathJoin("/work/noaa/global/kfriedma/glopara/git/Fit2Obs/v" .. (os.getenv("fit2obs_ver") or "None"), "modulefiles")) +prepend_path("MODULEPATH", pathJoin("/work/noaa/global/glopara/git_rocky9/Fit2Obs/v" .. (os.getenv("fit2obs_ver") or "None"), "modulefiles")) load(pathJoin("fit2obs", (os.getenv("fit2obs_ver") or "None"))) whatis("Description: GFS run environment") diff --git a/modulefiles/module_base.wcoss2.lua b/modulefiles/module_base.wcoss2.lua index 49d5abc678..830ea78b05 100644 --- a/modulefiles/module_base.wcoss2.lua +++ b/modulefiles/module_base.wcoss2.lua @@ -36,7 +36,7 @@ setenv("HPC_OPT", "/apps/ops/para/libs") load(pathJoin("met", (os.getenv("met_ver") or "None"))) load(pathJoin("metplus", (os.getenv("metplus_ver") or "None"))) -prepend_path("MODULEPATH", pathJoin("/lfs/h2/emc/global/save/emc.global/git/prepobs/v" .. (os.getenv("prepobs_run_ver") or "None"), "modulefiles")) +prepend_path("MODULEPATH", pathJoin("/lfs/h2/emc/global/save/emc.global/git/prepobs/gfsv17_v" .. (os.getenv("prepobs_run_ver") or "None"), "modulefiles")) load(pathJoin("prepobs", (os.getenv("prepobs_run_ver") or "None"))) prepend_path("MODULEPATH", pathJoin("/lfs/h2/emc/global/save/emc.global/git/Fit2Obs/v" .. (os.getenv("fit2obs_ver") or "None"), "modulefiles")) diff --git a/parm/config/gfs/config.base b/parm/config/gfs/config.base index 81b18030fa..784c334d82 100644 --- a/parm/config/gfs/config.base +++ b/parm/config/gfs/config.base @@ -95,7 +95,7 @@ export MODE="@MODE@" # cycled/forecast-only # Build paths relative to $HOMEgfs export FIXgsi="${HOMEgfs}/fix/gsi" export HOMEpost="${HOMEgfs}" -export HOMEobsproc="${BASE_GIT:-}/obsproc/v${obsproc_run_ver:-1.1.2}" +export HOMEobsproc="${BASE_GIT:-}/obsproc/v${obsproc_run_ver:-}" # CONVENIENT utility scripts and other environment parameters export NCP="/bin/cp -p" diff --git a/versions/build.gaea.ver b/versions/build.gaea.ver index b92fe8c1db..8b6e641eb6 100644 --- a/versions/build.gaea.ver +++ b/versions/build.gaea.ver @@ -1,6 +1,5 @@ export stack_intel_ver=2023.1.0 export stack_cray_mpich_ver=8.1.25 export spack_env=gsi-addon-dev - -source "${HOMEgfs:-}/versions/run.spack.ver" +source "${HOMEgfs:-}/versions/spack.ver" export spack_mod_path="/ncrc/proj/epic/spack-stack/spack-stack-${spack_stack_ver}/envs/${spack_env}/install/modulefiles/Core" diff --git a/versions/build.hera.ver b/versions/build.hera.ver index 337d5c32da..70afb90a29 100644 --- a/versions/build.hera.ver +++ b/versions/build.hera.ver @@ -1,5 +1,5 @@ export stack_intel_ver=2021.5.0 export stack_impi_ver=2021.5.1 export spack_env=gsi-addon-dev-rocky8 -source "${HOMEgfs:-}/versions/build.spack.ver" +source "${HOMEgfs:-}/versions/spack.ver" export spack_mod_path="/scratch1/NCEPDEV/nems/role.epic/spack-stack/spack-stack-${spack_stack_ver}/envs/${spack_env}/install/modulefiles/Core" diff --git a/versions/build.hercules.ver b/versions/build.hercules.ver index cab0c92111..2d7185d5e7 100644 --- a/versions/build.hercules.ver +++ b/versions/build.hercules.ver @@ -2,5 +2,5 @@ export stack_intel_ver=2021.9.0 export stack_impi_ver=2021.9.0 export intel_mkl_ver=2023.1.0 export spack_env=gsi-addon-env -source "${HOMEgfs:-}/versions/build.spack.ver" +source "${HOMEgfs:-}/versions/spack.ver" export spack_mod_path="/work/noaa/epic/role-epic/spack-stack/hercules/spack-stack-${spack_stack_ver}/envs/${spack_env}/install/modulefiles/Core" diff --git a/versions/build.jet.ver b/versions/build.jet.ver index 55c0ea0bd1..e103725d41 100644 --- a/versions/build.jet.ver +++ b/versions/build.jet.ver @@ -1,5 +1,5 @@ export stack_intel_ver=2021.5.0 export stack_impi_ver=2021.5.1 export spack_env=gsi-addon-dev -source "${HOMEgfs:-}/versions/build.spack.ver" +source "${HOMEgfs:-}/versions/spack.ver" export spack_mod_path="/lfs4/HFIP/hfv3gfs/role.epic/spack-stack/spack-stack-${spack_stack_ver}/envs/${spack_env}/install/modulefiles/Core" diff --git a/versions/build.noaacloud.ver b/versions/build.noaacloud.ver index ba47313675..fc288b76b5 100644 --- a/versions/build.noaacloud.ver +++ b/versions/build.noaacloud.ver @@ -1,5 +1,5 @@ export stack_intel_ver=2021.3.0 export stack_impi_ver=2021.3.0 export spack_env=gsi-addon-env -source "${HOMEgfs:-}/versions/build.spack.ver" +source "${HOMEgfs:-}/versions/spack.ver" export spack_mod_path="/contrib/spack-stack/spack-stack-${spack_stack_ver}/envs/gsi-addon-env/install/modulefiles/Core" diff --git a/versions/build.orion.ver b/versions/build.orion.ver index 834ecfc166..29e02f0873 100644 --- a/versions/build.orion.ver +++ b/versions/build.orion.ver @@ -1,5 +1,5 @@ export stack_intel_ver=2021.9.0 export stack_impi_ver=2021.9.0 export spack_env=gsi-addon-env-rocky9 -source "${HOMEgfs:-}/versions/build.spack.ver" +source "${HOMEgfs:-}/versions/spack.ver" export spack_mod_path="/work/noaa/epic/role-epic/spack-stack/orion/spack-stack-${spack_stack_ver}/envs/${spack_env}/install/modulefiles/Core" diff --git a/versions/build.s4.ver b/versions/build.s4.ver index e2731ccfb3..e2641c124f 100644 --- a/versions/build.s4.ver +++ b/versions/build.s4.ver @@ -1,5 +1,5 @@ export stack_intel_ver=2021.5.0 export stack_impi_ver=2021.5.0 export spack_env=gsi-addon-env -source "${HOMEgfs:-}/versions/build.spack.ver" +source "${HOMEgfs:-}/versions/spack.ver" export spack_mod_path="/data/prod/jedi/spack-stack/spack-stack-${spack_stack_ver}/envs/${spack_env}/install/modulefiles/Core" diff --git a/versions/build.spack.ver b/versions/build.spack.ver deleted file mode 100644 index 808f85dd16..0000000000 --- a/versions/build.spack.ver +++ /dev/null @@ -1,27 +0,0 @@ -export spack_stack_ver=1.6.0 - -export cmake_ver=3.23.1 - -export jasper_ver=2.0.32 -export libpng_ver=1.6.37 -export zlib_ver=1.2.13 -export esmf_ver=8.5.0 -export fms_ver=2023.02.01 - -export hdf5_ver=1.14.0 -export netcdf_c_ver=4.9.2 -export netcdf_fortran_ver=4.6.1 - -export bacio_ver=2.4.1 -export nemsio_ver=2.5.4 -export sigio_ver=2.3.2 -export w3emc_ver=2.10.0 -export bufr_ver=11.7.0 -export g2_ver=3.4.5 -export sp_ver=2.5.0 -export ip_ver=4.3.0 -export gsi_ncdiag_ver=1.1.2 -export g2tmpl_ver=1.10.2 -export crtm_ver=2.4.0.1 -export wgrib2_ver=2.0.8 -export grib_util_ver=1.3.0 diff --git a/versions/run.gaea.ver b/versions/run.gaea.ver index c3aceb445d..81aa70df57 100644 --- a/versions/run.gaea.ver +++ b/versions/run.gaea.ver @@ -4,5 +4,5 @@ export spack_env=gsi-addon-dev export perl_ver=5.38.2 -source "${HOMEgfs:-}/versions/run.spack.ver" +source "${HOMEgfs:-}/versions/spack.ver" export spack_mod_path="/ncrc/proj/epic/spack-stack/spack-stack-${spack_stack_ver}/envs/${spack_env}/install/modulefiles/Core" diff --git a/versions/run.hera.ver b/versions/run.hera.ver index 34f81bfe96..6ebc64d9f2 100644 --- a/versions/run.hera.ver +++ b/versions/run.hera.ver @@ -9,5 +9,5 @@ export R_ver=3.6.1 export gempak_ver=7.17.0 export perl_ver=5.38.0 -source "${HOMEgfs:-}/versions/run.spack.ver" +source "${HOMEgfs:-}/versions/spack.ver" export spack_mod_path="/scratch1/NCEPDEV/nems/role.epic/spack-stack/spack-stack-${spack_stack_ver}/envs/${spack_env}/install/modulefiles/Core" diff --git a/versions/run.hercules.ver b/versions/run.hercules.ver index ee8e4f8aea..2d7185d5e7 100644 --- a/versions/run.hercules.ver +++ b/versions/run.hercules.ver @@ -2,6 +2,5 @@ export stack_intel_ver=2021.9.0 export stack_impi_ver=2021.9.0 export intel_mkl_ver=2023.1.0 export spack_env=gsi-addon-env - -source "${HOMEgfs:-}/versions/run.spack.ver" +source "${HOMEgfs:-}/versions/spack.ver" export spack_mod_path="/work/noaa/epic/role-epic/spack-stack/hercules/spack-stack-${spack_stack_ver}/envs/${spack_env}/install/modulefiles/Core" diff --git a/versions/run.jet.ver b/versions/run.jet.ver index 3aa586ee42..1e41fd0036 100644 --- a/versions/run.jet.ver +++ b/versions/run.jet.ver @@ -10,5 +10,5 @@ export gempak_ver=7.4.2 # Adding perl as a module; With Rocky8, perl packages will not be from the OS export perl_ver=5.38.0 -source "${HOMEgfs:-}/versions/run.spack.ver" +source "${HOMEgfs:-}/versions/spack.ver" export spack_mod_path="/lfs4/HFIP/hfv3gfs/role.epic/spack-stack/spack-stack-${spack_stack_ver}/envs/${spack_env}/install/modulefiles/Core" diff --git a/versions/run.noaacloud.ver b/versions/run.noaacloud.ver index 4c9ac3cd42..1fc3779b2e 100644 --- a/versions/run.noaacloud.ver +++ b/versions/run.noaacloud.ver @@ -2,7 +2,7 @@ export stack_intel_ver=2021.3.0 export stack_impi_ver=2021.3.0 export spack_env=gsi-addon-env -source "${HOMEgfs:-}/versions/run.spack.ver" +source "${HOMEgfs:-}/versions/spack.ver" export spack_mod_path="/contrib/spack-stack/spack-stack-${spack_stack_ver}/envs/gsi-addon-env/install/modulefiles/Core" export cdo_ver=2.2.0 diff --git a/versions/run.orion.ver b/versions/run.orion.ver index 112636fb20..29e02f0873 100644 --- a/versions/run.orion.ver +++ b/versions/run.orion.ver @@ -1,6 +1,5 @@ export stack_intel_ver=2021.9.0 export stack_impi_ver=2021.9.0 export spack_env=gsi-addon-env-rocky9 - -source "${HOMEgfs:-}/versions/run.spack.ver" +source "${HOMEgfs:-}/versions/spack.ver" export spack_mod_path="/work/noaa/epic/role-epic/spack-stack/orion/spack-stack-${spack_stack_ver}/envs/${spack_env}/install/modulefiles/Core" diff --git a/versions/run.s4.ver b/versions/run.s4.ver index 6d0f4cbaca..43e690e19b 100644 --- a/versions/run.s4.ver +++ b/versions/run.s4.ver @@ -4,5 +4,5 @@ export spack_env=gsi-addon-env export ncl_ver=6.4.0-precompiled -source "${HOMEgfs:-}/versions/run.spack.ver" +source "${HOMEgfs:-}/versions/spack.ver" export spack_mod_path="/data/prod/jedi/spack-stack/spack-stack-${spack_stack_ver}/envs/${spack_env}/install/modulefiles/Core" diff --git a/versions/run.wcoss2.ver b/versions/run.wcoss2.ver index 7f653dd50e..f5b11b3a6f 100644 --- a/versions/run.wcoss2.ver +++ b/versions/run.wcoss2.ver @@ -44,10 +44,10 @@ export metplus_ver=3.1.1 # Development-only below -export obsproc_run_ver=1.1.2 -export prepobs_run_ver=1.0.2 +export obsproc_run_ver=1.2.0 +export prepobs_run_ver=1.1.0 export ens_tracker_ver=feature-GFSv17_com_reorg -export fit2obs_ver=1.1.2 +export fit2obs_ver=1.1.4 export mos_ver=5.4.3 export mos_shared_ver=2.7.2 diff --git a/versions/run.spack.ver b/versions/spack.ver similarity index 68% rename from versions/run.spack.ver rename to versions/spack.ver index 4a17d0ef27..1f553134f0 100644 --- a/versions/run.spack.ver +++ b/versions/spack.ver @@ -1,8 +1,12 @@ export spack_stack_ver=1.6.0 +export cmake_ver=3.23.1 export python_ver=3.11.6 export jasper_ver=2.0.32 export libpng_ver=1.6.37 +export zlib_ver=1.2.13 +export esmf_ver=8.5.0 +export fms_ver=2023.02.01 export cdo_ver=2.2.0 export nco_ver=5.0.6 @@ -10,7 +14,14 @@ export hdf5_ver=1.14.0 export netcdf_c_ver=4.9.2 export netcdf_fortran_ver=4.6.1 +export bacio_ver=2.4.1 +export nemsio_ver=2.5.4 +export sigio_ver=2.3.2 +export w3emc_ver=2.10.0 export bufr_ver=11.7.0 +export g2_ver=3.4.5 +export sp_ver=2.5.0 +export ip_ver=4.3.0 export gsi_ncdiag_ver=1.1.2 export g2tmpl_ver=1.10.2 export crtm_ver=2.4.0.1 @@ -29,8 +40,8 @@ export met_ver=9.1.3 export metplus_ver=3.1.1 export py_xarray_ver=2023.7.0 -export obsproc_run_ver=1.1.2 -export prepobs_run_ver=1.0.2 +export obsproc_run_ver=1.2.0 +export prepobs_run_ver=1.1.0 export ens_tracker_ver=feature-GFSv17_com_reorg -export fit2obs_ver=1.1.2 +export fit2obs_ver=1.1.4 diff --git a/workflow/hosts/orion.yaml b/workflow/hosts/orion.yaml index 81daea6168..4ec78fc8cc 100644 --- a/workflow/hosts/orion.yaml +++ b/workflow/hosts/orion.yaml @@ -1,4 +1,4 @@ -BASE_GIT: '/work/noaa/global/glopara/git' +BASE_GIT: '/work/noaa/global/glopara/git_rocky9' DMPDIR: '/work/noaa/rstprod/dump' BASE_IC: '/work/noaa/global/glopara/data/ICSDIR' PACKAGEROOT: '/work/noaa/global/glopara/nwpara' From c6e32621a71e71d250c64c5349d9249cfeec2cf4 Mon Sep 17 00:00:00 2001 From: Jiarui Dong Date: Thu, 19 Sep 2024 12:43:21 -0400 Subject: [PATCH 09/21] Remove the GTS BUFR2IODA part of the snow obs prep job (#2900) This PR removed the GTS BUFR2IODA part of the snow obs prep job, and replaced it with a direct read from BUFR snow data at runtime by the JEDI executable. Depends on NOAA-EMC/GDASApp#1276 --------- Co-authored-by: Cory Martin --- parm/config/gfs/config.prepsnowobs | 3 - parm/config/gfs/config.snowanl | 1 + scripts/exglobal_prep_snow_obs.py | 1 - sorc/gdas.cd | 2 +- ush/python/pygfs/task/snow_analysis.py | 84 ++------------------------ 5 files changed, 8 insertions(+), 83 deletions(-) diff --git a/parm/config/gfs/config.prepsnowobs b/parm/config/gfs/config.prepsnowobs index 60ca16ce9e..20bdd89ddf 100644 --- a/parm/config/gfs/config.prepsnowobs +++ b/parm/config/gfs/config.prepsnowobs @@ -8,11 +8,8 @@ echo "BEGIN: config.prepsnowobs" # Get task specific resources . "${EXPDIR}/config.resources" prepsnowobs -export GTS_OBS_LIST="${PARMgfs}/gdas/snow/prep/prep_gts.yaml.j2" export IMS_OBS_LIST="${PARMgfs}/gdas/snow/prep/prep_ims.yaml.j2" -export BUFR2IODAX="${EXECgfs}/bufr2ioda.x" - export CALCFIMSEXE="${EXECgfs}/calcfIMS.exe" export FIMS_NML_TMPL="${PARMgfs}/gdas/snow/prep/fims.nml.j2" diff --git a/parm/config/gfs/config.snowanl b/parm/config/gfs/config.snowanl index a2984f190b..b1460dfa67 100644 --- a/parm/config/gfs/config.snowanl +++ b/parm/config/gfs/config.snowanl @@ -9,6 +9,7 @@ echo "BEGIN: config.snowanl" source "${EXPDIR}/config.resources" snowanl export OBS_LIST="${PARMgfs}/gdas/snow/obs/lists/gdas_snow.yaml.j2" +export GTS_SNOW_STAGE_YAML="${PARMgfs}/gdas/snow/obs/config/bufr2ioda_mapping.yaml.j2" # Name of the JEDI executable and its yaml template export JEDIEXE="${EXECgfs}/gdas.x" diff --git a/scripts/exglobal_prep_snow_obs.py b/scripts/exglobal_prep_snow_obs.py index a6a9070151..aa1eb1bb7d 100755 --- a/scripts/exglobal_prep_snow_obs.py +++ b/scripts/exglobal_prep_snow_obs.py @@ -20,6 +20,5 @@ # Instantiate the snow prepare task SnowAnl = SnowAnalysis(config) - SnowAnl.prepare_GTS() if SnowAnl.task_config.cyc == 0: SnowAnl.prepare_IMS() diff --git a/sorc/gdas.cd b/sorc/gdas.cd index faa95efb18..7c1c181359 160000 --- a/sorc/gdas.cd +++ b/sorc/gdas.cd @@ -1 +1 @@ -Subproject commit faa95efb18f0f52acab2cf09b17f78406f9b48b1 +Subproject commit 7c1c181359c2c1952bab3dc1c481bbdb361aa472 diff --git a/ush/python/pygfs/task/snow_analysis.py b/ush/python/pygfs/task/snow_analysis.py index 9656b00a8e..4b991d2b34 100644 --- a/ush/python/pygfs/task/snow_analysis.py +++ b/ush/python/pygfs/task/snow_analysis.py @@ -54,83 +54,6 @@ def __init__(self, config): # Extend task_config with local_dict self.task_config = AttrDict(**self.task_config, **local_dict) - @logit(logger) - def prepare_GTS(self) -> None: - """Prepare the GTS data for a global snow analysis - - This method will prepare GTS data for a global snow analysis using JEDI. - This includes: - - processing GTS bufr snow depth observation data to IODA format - - Parameters - ---------- - Analysis: parent class for GDAS task - - Returns - ---------- - None - """ - - # create a temporary dict of all keys needed in this method - localconf = AttrDict() - keys = ['HOMEgfs', 'DATA', 'current_cycle', 'COM_OBS', 'COM_ATMOS_RESTART_PREV', - 'OPREFIX', 'CASE', 'OCNRES', 'ntiles'] - for key in keys: - localconf[key] = self.task_config[key] - - # Read and render the GTS_OBS_LIST yaml - logger.info(f"Reading {self.task_config.GTS_OBS_LIST}") - prep_gts_config = parse_j2yaml(self.task_config.GTS_OBS_LIST, localconf) - logger.debug(f"{self.task_config.GTS_OBS_LIST}:\n{pformat(prep_gts_config)}") - - # copy the GTS obs files from COM_OBS to DATA/obs - logger.info("Copying GTS obs for bufr2ioda.x") - FileHandler(prep_gts_config.gtsbufr).sync() - - logger.info("Link BUFR2IODAX into DATA/") - exe_src = self.task_config.BUFR2IODAX - exe_dest = os.path.join(localconf.DATA, os.path.basename(exe_src)) - if os.path.exists(exe_dest): - rm_p(exe_dest) - os.symlink(exe_src, exe_dest) - - # Create executable instance - exe = Executable(self.task_config.BUFR2IODAX) - - def _gtsbufr2iodax(exe, yaml_file): - if not os.path.isfile(yaml_file): - logger.exception(f"FATAL ERROR: {yaml_file} not found") - raise FileNotFoundError(yaml_file) - - logger.info(f"Executing {exe}") - try: - exe(yaml_file) - except OSError: - raise OSError(f"Failed to execute {exe} {yaml_file}") - except Exception: - raise WorkflowException(f"An error occured during execution of {exe} {yaml_file}") - - # Loop over entries in prep_gts_config.bufr2ioda keys - # 1. generate bufr2ioda YAML files - # 2. execute bufr2ioda.x - for name in prep_gts_config.bufr2ioda.keys(): - gts_yaml = os.path.join(self.task_config.DATA, f"bufr_{name}_snow.yaml") - logger.info(f"Generate BUFR2IODA YAML file: {gts_yaml}") - temp_yaml = parse_j2yaml(prep_gts_config.bufr2ioda[name], localconf) - save_as_yaml(temp_yaml, gts_yaml) - logger.info(f"Wrote bufr2ioda YAML to: {gts_yaml}") - - # execute BUFR2IODAX to convert {name} bufr data into IODA format - _gtsbufr2iodax(exe, gts_yaml) - - # Ensure the IODA snow depth GTS file is produced by the IODA converter - # If so, copy to COM_OBS/ - try: - FileHandler(prep_gts_config.gtsioda).sync() - except OSError as err: - logger.exception(f"{self.task_config.BUFR2IODAX} failed to produce GTS ioda files") - raise OSError(err) - @logit(logger) def prepare_IMS(self) -> None: """Prepare the IMS data for a global snow analysis @@ -248,7 +171,7 @@ def initialize(self) -> None: # create a temporary dict of all keys needed in this method localconf = AttrDict() - keys = ['DATA', 'current_cycle', 'COM_OBS', 'COM_ATMOS_RESTART_PREV', + keys = ['PARMgfs', 'DATA', 'current_cycle', 'COM_OBS', 'COM_ATMOS_RESTART_PREV', 'OPREFIX', 'CASE', 'OCNRES', 'ntiles'] for key in keys: localconf[key] = self.task_config[key] @@ -268,6 +191,11 @@ def initialize(self) -> None: logger.info("Staging ensemble backgrounds") FileHandler(self.get_ens_bkg_dict(localconf)).sync() + # stage GTS bufr2ioda mapping YAML files + logger.info(f"Staging GTS bufr2ioda mapping YAML files from {self.task_config.GTS_SNOW_STAGE_YAML}") + gts_mapping_list = parse_j2yaml(self.task_config.GTS_SNOW_STAGE_YAML, localconf) + FileHandler(gts_mapping_list).sync() + # Write out letkfoi YAML file save_as_yaml(self.task_config.jedi_config, self.task_config.jedi_yaml) logger.info(f"Wrote letkfoi YAML to: {self.task_config.jedi_yaml}") From 3c86873acfc2afed19dd38e72c47782ace60f610 Mon Sep 17 00:00:00 2001 From: David Huber <69919478+DavidHuber-NOAA@users.noreply.github.com> Date: Fri, 20 Sep 2024 07:16:55 -0400 Subject: [PATCH 10/21] Adjust C768 resources for Hera (#2819) This modifies the resources for gdasfcst (everywhere) and enkfgdaseupd (Hera only). For the fcst job, the number of write tasks is increased to prevent out of memory errors from the inline post. For the eupd, the number of tasks is decreased to prevent out of memory errors. The runtime for the eupd job was just over 10 minutes. Resolves #2506 Resolves #2498 Resolves #2916 --------- Co-authored-by: Walter Kolczynski - NOAA --- jobs/JGFS_ATMOS_CYCLONE_GENESIS | 5 ----- jobs/JGFS_ATMOS_CYCLONE_TRACKER | 5 ----- parm/config/gfs/config.base | 7 +++++++ parm/config/gfs/config.resources.HERA | 16 ++++++++++++++-- parm/config/gfs/config.resources.S4 | 2 +- parm/config/gfs/config.ufs | 2 +- sorc/gsi_utils.fd | 2 +- 7 files changed, 24 insertions(+), 15 deletions(-) diff --git a/jobs/JGFS_ATMOS_CYCLONE_GENESIS b/jobs/JGFS_ATMOS_CYCLONE_GENESIS index de130bf9aa..a80bcc1153 100755 --- a/jobs/JGFS_ATMOS_CYCLONE_GENESIS +++ b/jobs/JGFS_ATMOS_CYCLONE_GENESIS @@ -3,11 +3,6 @@ source "${HOMEgfs}/ush/preamble.sh" source "${HOMEgfs}/ush/jjob_header.sh" -e "genesis" -c "base genesis" -# Hack to temporary skip this as the tracker has not been build -# on Hercules Rocky 9 yet -# TODO: Remove this after tracker has been built for Rocky 9 #2639 -if [[ "${machine}" == 'HERCULES' ]]; then exit 0; fi - ############################################## # Set variables used in the exglobal script ############################################## diff --git a/jobs/JGFS_ATMOS_CYCLONE_TRACKER b/jobs/JGFS_ATMOS_CYCLONE_TRACKER index 067de2c4aa..24fe33f8ca 100755 --- a/jobs/JGFS_ATMOS_CYCLONE_TRACKER +++ b/jobs/JGFS_ATMOS_CYCLONE_TRACKER @@ -3,11 +3,6 @@ source "${HOMEgfs}/ush/preamble.sh" source "${HOMEgfs}/ush/jjob_header.sh" -e "tracker" -c "base tracker" -# Hack to temporary skip this as the tracker has not been build -# on Hercules Rocky 9 yet -# TODO: Remove this after tracker has been built for Rocky 9 #2639 -if [[ "${machine}" == 'HERCULES' ]]; then exit 0; fi - export COMPONENT="atmos" diff --git a/parm/config/gfs/config.base b/parm/config/gfs/config.base index 784c334d82..27fcbdd055 100644 --- a/parm/config/gfs/config.base +++ b/parm/config/gfs/config.base @@ -492,4 +492,11 @@ if [[ "${machine}" =~ "PW" ]]; then 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.resources.HERA b/parm/config/gfs/config.resources.HERA index e79d4c5b0a..d1b09fcc32 100644 --- a/parm/config/gfs/config.resources.HERA +++ b/parm/config/gfs/config.resources.HERA @@ -5,8 +5,9 @@ case ${step} in "anal") if [[ "${CASE}" == "C384" ]]; then - export ntasks=270 - export threads_per_task_anal=8 + export ntasks_gdas=270 + export ntasks_gfs=270 + export threads_per_task=8 export tasks_per_node=$(( max_tasks_per_node / threads_per_task )) fi ;; @@ -26,6 +27,10 @@ case ${step} in "eupd") case ${CASE} in + "C768") + export ntasks=80 + export threads_per_task=20 + ;; "C384") export ntasks=80 ;; @@ -43,6 +48,13 @@ case ${step} in export tasks_per_node=$(( max_tasks_per_node / threads_per_task )) ;; + "upp") + if (( "${CASE:1}" >= 768 )); then + # Run fewer tasks per node for memory + tasks_per_node=20 + fi + ;; + *) ;; esac diff --git a/parm/config/gfs/config.resources.S4 b/parm/config/gfs/config.resources.S4 index 1af64bf250..817494c7cd 100644 --- a/parm/config/gfs/config.resources.S4 +++ b/parm/config/gfs/config.resources.S4 @@ -32,7 +32,7 @@ case ${step} in *) ;; esac - export tasks_node=$(( max_tasks_per_node / threads_per_task )) + export tasks_per_node=$(( max_tasks_per_node / threads_per_task )) ;; "eobs") diff --git a/parm/config/gfs/config.ufs b/parm/config/gfs/config.ufs index babbe1f2dd..6309c4073b 100644 --- a/parm/config/gfs/config.ufs +++ b/parm/config/gfs/config.ufs @@ -281,7 +281,7 @@ case "${fv3_res}" in export rf_cutoff=100.0 export fv_sg_adj=450 export WRITE_GROUP_GDAS=2 - export WRTTASK_PER_GROUP_PER_THREAD_PER_TILE_GDAS=10 + export WRTTASK_PER_GROUP_PER_THREAD_PER_TILE_GDAS=15 export WRITE_GROUP_GFS=4 export WRTTASK_PER_GROUP_PER_THREAD_PER_TILE_GFS=20 #Note this should be 10 for WCOSS2 fi diff --git a/sorc/gsi_utils.fd b/sorc/gsi_utils.fd index 9382fd01c2..a6ea311e5c 160000 --- a/sorc/gsi_utils.fd +++ b/sorc/gsi_utils.fd @@ -1 +1 @@ -Subproject commit 9382fd01c2a626c8934c3f553d420a45de2b4dec +Subproject commit a6ea311e5c82369d255e3afdc99c1bce0c9a3014 From 7bdb3626118d8e33705dac44269f77729ccdb86a Mon Sep 17 00:00:00 2001 From: mingshichen-noaa <48537176+mingshichen-noaa@users.noreply.github.com> Date: Sat, 21 Sep 2024 02:15:17 -0400 Subject: [PATCH 11/21] Update global atmos vminmon job with COMIN/COMOUT for COM prefix (#2939) NCO has requested that each COM variable specify whether it is an input or an output. This completes that process for the global minimization monitor job. Refs #2451 --- jobs/JGLOBAL_ATMOS_VMINMON | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/jobs/JGLOBAL_ATMOS_VMINMON b/jobs/JGLOBAL_ATMOS_VMINMON index 8ad9b91792..26cdc73c95 100755 --- a/jobs/JGLOBAL_ATMOS_VMINMON +++ b/jobs/JGLOBAL_ATMOS_VMINMON @@ -17,16 +17,18 @@ export gcyc=${GDATE:8:2} ############################################# # TANKverf - WHERE OUTPUT DATA WILL RESIDE ############################################# -YMD=${PDY} HH=${cyc} declare_from_tmpl -rx COM_ATMOS_ANALYSIS -YMD=${PDY} HH=${cyc} declare_from_tmpl -rx COM_ATMOS_MINMON -YMD=${gPDY} HH=${gcyc} declare_from_tmpl -rx COM_ATMOS_MINMON_PREV:COM_ATMOS_MINMON_TMPL +YMD=${PDY} HH=${cyc} declare_from_tmpl -rx \ + COMIN_ATMOS_ANALYSIS:COM_ATMOS_ANALYSIS_TMPL \ + COMOUT_ATMOS_MINMON:COM_ATMOS_MINMON_TMPL -export gsistat="${COM_ATMOS_ANALYSIS}/${RUN}.t${cyc}z.gsistat" -export M_TANKverf=${M_TANKverf:-${COM_ATMOS_MINMON}} -export M_TANKverfM1=${M_TANKverfM1:-${COM_ATMOS_MINMON_PREV}} +YMD=${gPDY} HH=${gcyc} declare_from_tmpl -rx \ + COMIN_ATMOS_MINMON_PREV:COM_ATMOS_MINMON_TMPL -if [[ ! -d ${M_TANKverf} ]]; then mkdir -p -m 775 "${M_TANKverf}" ; fi -if [[ ! -d ${M_TANKverfM1} ]]; then mkdir -p -m 775 "${M_TANKverfM1}" ; fi +export gsistat="${COMIN_ATMOS_ANALYSIS}/${RUN}.t${cyc}z.gsistat" +export M_TANKverf=${M_TANKverf:-${COMOUT_ATMOS_MINMON}} +export M_TANKverfM1=${M_TANKverfM1:-${COMIN_ATMOS_MINMON_PREV}} + +if [[ ! -d ${M_TANKverf} ]]; then mkdir -p "${M_TANKverf}" ; fi ######################################################## # Execute the script. From fe57bb4df5dc3ab53d1f7e2ad2d3c77d734bd2fa Mon Sep 17 00:00:00 2001 From: Eric Sinsky - NOAA <48259628+EricSinsky-NOAA@users.noreply.github.com> Date: Mon, 23 Sep 2024 01:14:26 -0400 Subject: [PATCH 12/21] Remove need for a ice_prod dependency check script (#2809) # Description The main purpose of this PR is to remove the need for an ice_prod dependency check script `ush/check_ice_netcdf.sh`. The original purpose of the ice_prod dependency check script is to check for special case dependencies where `( cyc + FHMIN ) % FHOUT_ICE )) =! 0` (more details on this issue can be found in issue #2674 ). A bugfix for these special cases is expected to come from a PR in the ufs-weather-model. Resolves #2721 Refs #2721, #2674 --- ush/check_ice_netcdf.sh | 43 ---------------------- ush/forecast_predet.sh | 11 +----- ush/python/pygfs/task/oceanice_products.py | 16 +------- workflow/rocoto/gefs_tasks.py | 20 +++------- 4 files changed, 9 insertions(+), 81 deletions(-) delete mode 100755 ush/check_ice_netcdf.sh diff --git a/ush/check_ice_netcdf.sh b/ush/check_ice_netcdf.sh deleted file mode 100755 index 9d2d945a8b..0000000000 --- a/ush/check_ice_netcdf.sh +++ /dev/null @@ -1,43 +0,0 @@ -#! /usr/bin/env bash - -yyyy=${1?} -mm=${2?} -dd=${3?} -cyc=${4?} -fhr=${5?} -ROTDIR=${6?} -member=${7?} -FHOUT_ICE_GFS=${8?} - -fhri=$((10#${fhr})) - -#Will need to consider fhmin in the future to calculate the offset if we are to stick with this approach. -((offset = ( cyc ) % FHOUT_ICE_GFS)) - -if (( offset != 0 )); then - (( fhri = fhri - cyc )) - fhr3=$(printf %03i "${fhri}") - if (( fhri <= FHOUT_ICE_GFS )); then - (( interval = FHOUT_ICE_GFS - cyc )) - ncfile=${ROTDIR}/gefs.${yyyy}${mm}${dd}/${cyc}/mem${member}/model/ice/history/gefs.ice.t${cyc}z.${interval}hr_avg.f${fhr3}.nc - else - ncfile=${ROTDIR}/gefs.${yyyy}${mm}${dd}/${cyc}/mem${member}/model/ice/history/gefs.ice.t${cyc}z.${FHOUT_ICE_GFS}hr_avg.f${fhr3}.nc - fi -else - ncfile=${ROTDIR}/gefs.${yyyy}${mm}${dd}/${cyc}/mem${member}/model/ice/history/gefs.ice.t${cyc}z.${FHOUT_ICE_GFS}hr_avg.f${fhr}.nc -fi - -#Check if netcdf file exists. -if [[ ! -f "${ncfile}" ]];then - rc=1 -else - #Check if netcdf file is older than 2 minutes. - ncage="$(find "${ncfile}" -mmin -2)" - if [[ -n "${ncage}" ]]; then - rc=1 - else - rc=0 - fi -fi - -exit "${rc}" diff --git a/ush/forecast_predet.sh b/ush/forecast_predet.sh index 9e08a12dd8..d7c04ea699 100755 --- a/ush/forecast_predet.sh +++ b/ush/forecast_predet.sh @@ -642,15 +642,8 @@ CICE_predet(){ # CICE does not have a concept of high frequency output like FV3 # Convert output settings into an explicit list for CICE - if (( $(( ( cyc + FHMIN ) % FHOUT_ICE )) == 0 )); then - # shellcheck disable=SC2312 - mapfile -t CICE_OUTPUT_FH < <(seq "${FHMIN}" "${FHOUT_ICE}" "${FHMAX}") || exit 10 - else - CICE_OUTPUT_FH=("${FHMIN}") - # shellcheck disable=SC2312 - mapfile -t -O "${#CICE_OUTPUT_FH[@]}" CICE_OUTPUT_FH < <(seq "$(( FHMIN + $(( ( cyc + FHMIN ) % FHOUT_ICE )) ))" "${FHOUT_ICE}" "${FHMAX}") || exit 10 - CICE_OUTPUT_FH+=("${FHMAX}") - fi + # shellcheck disable=SC2312 + mapfile -t CICE_OUTPUT_FH < <(seq "${FHMIN}" "${FHOUT_ICE}" "${FHMAX}") || exit 10 # Fix files ${NCP} "${FIXgfs}/cice/${ICERES}/${CICE_GRID}" "${DATA}/" diff --git a/ush/python/pygfs/task/oceanice_products.py b/ush/python/pygfs/task/oceanice_products.py index 98b57ae801..39ec53b100 100644 --- a/ush/python/pygfs/task/oceanice_products.py +++ b/ush/python/pygfs/task/oceanice_products.py @@ -58,22 +58,10 @@ def __init__(self, config: Dict[str, Any]) -> None: valid_datetime = add_to_datetime(self.task_config.current_cycle, to_timedelta(f"{self.task_config.FORECAST_HOUR}H")) + forecast_hour = self.task_config.FORECAST_HOUR if self.task_config.COMPONENT == 'ice': - offset = int(self.task_config.current_cycle.strftime("%H")) % self.task_config.FHOUT_ICE_GFS - # For CICE cases where offset is not 0, forecast_hour needs to be adjusted based on the offset. - # TODO: Consider FHMIN when calculating offset. - if offset != 0: - forecast_hour = self.task_config.FORECAST_HOUR - int(self.task_config.current_cycle.strftime("%H")) - # For the first forecast hour, the interval may be different from the intervals of subsequent forecast hours - if forecast_hour <= self.task_config.FHOUT_ICE_GFS: - interval = self.task_config.FHOUT_ICE_GFS - int(self.task_config.current_cycle.strftime("%H")) - else: - interval = self.task_config.FHOUT_ICE_GFS - else: - forecast_hour = self.task_config.FORECAST_HOUR - interval = self.task_config.FHOUT_ICE_GFS + interval = self.task_config.FHOUT_ICE_GFS if self.task_config.COMPONENT == 'ocean': - forecast_hour = self.task_config.FORECAST_HOUR interval = self.task_config.FHOUT_OCN_GFS # TODO: This is a bit of a hack, but it works for now diff --git a/workflow/rocoto/gefs_tasks.py b/workflow/rocoto/gefs_tasks.py index 8a4f148f24..3b72677a58 100644 --- a/workflow/rocoto/gefs_tasks.py +++ b/workflow/rocoto/gefs_tasks.py @@ -213,21 +213,11 @@ def _atmosoceaniceprod(self, component: str): history_path = self._template_to_rocoto_cycstring(self._base[history_path_tmpl], {'MEMDIR': 'mem#member#'}) deps = [] data = f'{history_path}/{history_file_tmpl}' - if component in ['ocean']: - dep_dict = {'type': 'data', 'data': data, 'age': 120} - deps.append(rocoto.add_dependency(dep_dict)) - dep_dict = {'type': 'metatask', 'name': 'fcst_mem#member#'} - deps.append(rocoto.add_dependency(dep_dict)) - dependencies = rocoto.create_dependency(dep=deps, dep_condition='or') - elif component in ['ice']: - command = f"{self.HOMEgfs}/ush/check_ice_netcdf.sh @Y @m @d @H #fhr# &ROTDIR; #member# {fhout_ice_gfs}" - dep_dict = {'type': 'sh', 'command': command} - deps.append(rocoto.add_dependency(dep_dict)) - dependencies = rocoto.create_dependency(dep=deps) - else: - dep_dict = {'type': 'data', 'data': data, 'age': 120} - deps.append(rocoto.add_dependency(dep_dict)) - dependencies = rocoto.create_dependency(dep=deps) + dep_dict = {'type': 'data', 'data': data, 'age': 120} + deps.append(rocoto.add_dependency(dep_dict)) + dep_dict = {'type': 'metatask', 'name': 'fcst_mem#member#'} + deps.append(rocoto.add_dependency(dep_dict)) + dependencies = rocoto.create_dependency(dep=deps, dep_condition='or') postenvars = self.envars.copy() postenvar_dict = {'ENSMEM': '#member#', From ec634926f3b1ba1984b0735e17b76869659ceabe Mon Sep 17 00:00:00 2001 From: Walter Kolczynski - NOAA Date: Mon, 23 Sep 2024 11:15:27 -0400 Subject: [PATCH 13/21] Refine issue and PR templates (#2947) Refines the issue and PR templates to cover some shortcomings and pitfalls we have identified. The fix file issue template is expanded to cover other data sets managed under "glopara". Resolves #2589 --- .github/ISSUE_TEMPLATE/NCO_bug_report.yml | 2 +- .github/ISSUE_TEMPLATE/bug_report.yml | 14 +- .github/ISSUE_TEMPLATE/feature_request.yml | 17 ++- .github/ISSUE_TEMPLATE/fix_file.yml | 97 -------------- .github/ISSUE_TEMPLATE/production_update.yml | 29 ++-- .github/ISSUE_TEMPLATE/static_data.yml | 134 +++++++++++++++++++ .github/pull_request_template.md | 63 +++++---- 7 files changed, 212 insertions(+), 144 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/fix_file.yml create mode 100644 .github/ISSUE_TEMPLATE/static_data.yml diff --git a/.github/ISSUE_TEMPLATE/NCO_bug_report.yml b/.github/ISSUE_TEMPLATE/NCO_bug_report.yml index cc53205807..79632779aa 100644 --- a/.github/ISSUE_TEMPLATE/NCO_bug_report.yml +++ b/.github/ISSUE_TEMPLATE/NCO_bug_report.yml @@ -1,4 +1,4 @@ -name: NCO Bug report +name: NCO Bug Report description: Report something that is incorrect or broken labels: ["nco-bug", "triage"] assignees: diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 216293781c..d43d2eb3d7 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,4 +1,4 @@ -name: Bug report +name: Bug Report description: Report something that is incorrect or broken labels: ["bug", "triage"] @@ -9,6 +9,8 @@ body: Your bug may already be reported! Please search on the [Issue tracker](https://github.com/NOAA-EMC/global-workflow/issues) before creating one. + Is this actually a workflow bug? If not, please open an issue in the appropriate repository first. + - type: textarea id: current_behavior attributes: @@ -46,6 +48,13 @@ body: validations: required: true + - type: input + id: hash + attributes: + label: What global-workflow hash are you using? + validations: + required: true + - type: textarea id: reproduction_steps attributes: @@ -63,8 +72,9 @@ body: attributes: label: Additional information description: Provide context or any additional information about the bug. + placeholder: Optional validations: - required: true + required: false - type: textarea id: propsed_implementation diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml index 3aed58c520..7e0ddb2459 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yml +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -1,4 +1,4 @@ -name: Feature request +name: Feature Request description: Request new capability labels: ["feature", "triage"] @@ -10,8 +10,7 @@ body: - Something is wrong or broken - It is a request from NCO - It is initiating a production update - - Files need to be updated or added to fix - + - Files need to be updated in a directory managed by workflow CMs under "glopara" Please search on the [Issue tracker](https://github.com/NOAA-EMC/global-workflow/issues) to make sure the feature has not already been requested to avoid duplicates. @@ -34,7 +33,17 @@ body: id: criteria attributes: label: Acceptance Criteria - placeholder: What does it mean for this issue to be complete? + description: | + A checklist of criteria to be satisfied before this feature is considered complete. + + Examples: + - Forecast with option X completes successfully + - File X produced + - Output unchanged + placeholder: | + - [ ] Criterion #1 + - [ ] Criterion #2 + - [ ] Criterion #3 validations: required: true diff --git a/.github/ISSUE_TEMPLATE/fix_file.yml b/.github/ISSUE_TEMPLATE/fix_file.yml deleted file mode 100644 index 3f5b69cd1d..0000000000 --- a/.github/ISSUE_TEMPLATE/fix_file.yml +++ /dev/null @@ -1,97 +0,0 @@ -name: Fix File Update -description: Request fix files be added or updated -labels: ["Fix Files", "triage"] -assignees: - - KateFriedman-NOAA - - WalterKolczynski-NOAA - -body: - - type: dropdown - attributes: - label: Target fix directory - options: - - NEW - - aer - - am - - chem - - cice - - cpl - - datm - - gdas/crtm - - gdas/fv3jedi - - gdas/gsibec - - gldas - - glwu - - gsi - - lut - - mom6 - - orog - - raw - - reg2grb2 - - sfc_climo - - ugwd - - verif - - wave - multiple: true - validations: - required: true - - - type: checkboxes - attributes: - label: Type of change - options: - - label: Update existing files - - label: Remove files - - label: Add new files to existing directory - - label: Add new fix directory - validations: - required: true - - - type: dropdown - attributes: - label: Any workflow changes needed? - description: | - Any change other than adding files to an existing directory will require at least a new fix version. - options: - - No change needed - - Fix version only - - Fix version + additional changes - validations: - required: true - - - type: textarea - attributes: - label: Related issues - description: Please link any related issues in other repositories - placeholder: NOAA-EMC/repo#1234 - validations: - required: false - - - type: input - attributes: - label: Pickup location - description: | - Please provide a path to the data on either Hera or WCOSS. - - If this requires a version update, please provide the *entire* directory, including unchanged files from current fix. - placeholder: '/path/to/new/fix' - validations: - required: true - - - type: input - attributes: - label: Size - description: How much bigger/smaller is the new set from the existing set (in MB)? - placeholder: '0' - validations: - required: true - - - type: markdown - attributes: - value: | - # Tasks - - [ ] Discuss needs with global-workflow developer assigned to request. - - [ ] Add/update/remove fix file(s) in fix sets on supported platforms (global-workflow assignee task). - - [ ] Update "Fix File Management" spreadsheet (https://docs.google.com/spreadsheets/d/1BeIvcz6TO3If4YCqkUK-oz_kGS9q2wTjwLS-BBemSEY/edit?usp=sharing). - - [ ] Make related workflow/component updates. - diff --git a/.github/ISSUE_TEMPLATE/production_update.yml b/.github/ISSUE_TEMPLATE/production_update.yml index ac9ada505a..cb1fb588d8 100644 --- a/.github/ISSUE_TEMPLATE/production_update.yml +++ b/.github/ISSUE_TEMPLATE/production_update.yml @@ -33,18 +33,19 @@ body: validations: required: true - - type: markdown + - type: checkboxes attributes: - value: | - ** Tasks ** - - [ ] Create release branch - - [ ] Make workflow changes for upgrade in release branch (add additional checklist items as needed) - - [ ] Create release notes - - [ ] Cut hand-off tag for CDF - - [ ] Submit CDF to NCO - - [ ] Implementation into operations complete - - [ ] Merge release branch into operational branch - - [ ] Cut version tag from operational branch - - [ ] Release new version tag - - [ ] Announce to users - - [ ] Update Read-The-Docs operations status version in develop + label: Tasks + description: List of tasks to complete update. For use after issue is created. + options: + - label: Create release branch + - label: Make workflow changes for upgrade in release branch (add additional checklist items as needed) + - label: Create release notes + - label: Cut hand-off tag for CDF + - label: Submit CDF to NCO + - label: Implementation into operations complete + - label: Merge release branch into operational branch + - label: Cut version tag from operational branch + - label: Release new version tag + - label: Announce to users + - label: Update Read-The-Docs operations status version in develop diff --git a/.github/ISSUE_TEMPLATE/static_data.yml b/.github/ISSUE_TEMPLATE/static_data.yml new file mode 100644 index 0000000000..f29f155cf8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/static_data.yml @@ -0,0 +1,134 @@ +name: Static Data Update +description: Request static data be added or updated +labels: ["Static Data Mgmt"] +assignees: + - KateFriedman-NOAA + - WalterKolczynski-NOAA + +body: + - type: dropdown + attributes: + label: Type of static data + description: | + - Fix: large static files needed to run global-workflow + - Initial conditions: ICs needed to run one of global-workflow's included tests + - Experimental data: Temporary datasets needed for development that will be replaced by other sources for operations (e.g. data that will be in DCOM) + options: + - Fix + - Initial conditions + - Experimental data + validations: + required: true + + - type: dropdown + attributes: + label: Target directory + options: + - "Fix: aer" + - "Fix: am" + - "Fix: chem" + - "Fix: cice" + - "Fix: cpl" + - "Fix: datm" + - "Fix: gdas/crtm" + - "Fix: gdas/fv3jedi" + - "Fix: gdas/gsibec" + - "Fix: gldas" + - "Fix: glwu" + - "Fix: gsi" + - "Fix: lut" + - "Fix: mom6" + - "Fix: orog" + - "Fix: raw" + - "Fix: reg2grb2" + - "Fix: sfc_climo" + - "Fix: ugwd" + - "Fix: verif" + - "Fix: wave" + - "Fix: *NEW*" + - "ICs: C48/C48 mx500" + - "ICs: C96/C48" + - "ICs: C96 mx100" + - "ICs: C384/C192" + - "ICs: C384 mx025" + - "ICs: C768 mx025" + - "ICs: C1152 mx025" + - "ICs: *NEW RESOLUTION*" + - "Exp Data: GOCART emissions" + - "Exp Data: JEDI obs" + - "Exp Data: *NEW*" + multiple: true + validations: + required: true + + - type: checkboxes + attributes: + label: Type of change + options: + - label: Update existing files (Version update needed) + - label: Remove files (Version update needed) + - label: Add new files to existing directory + - label: Add new directory (Version update needed if fix) + validations: + required: true + + - type: dropdown + attributes: + label: Any workflow changes needed? + description: | + ANY fix or IC change other than adding files will require at least a new version. + options: + - No change needed + - Fix/IC version update only + - Fix/IC version update + additional changes + - Non-version changes only + validations: + required: true + + - type: textarea + attributes: + label: | + Please list all related issues. If this request requires a workflow update (including a fix version update), please open a *separate* global-workflow issue to track the change. + description: Please link any related issues + placeholder: NOAA-EMC/repo#1234 + validations: + required: false + + - type: input + attributes: + label: Pickup location + description: | + Please provide a path to the data on either Hera or WCOSS. + + If this requires a version update, please provide a CLEAN copy of the *entire* directory, including the structure and unchanged files from current directory. + + If this is just adding additional files, you may provide just the new files. The directory structure should still match the target. + placeholder: '/path/to/new/data' + validations: + required: true + + - type: input + attributes: + label: Size + description: How much data needs to be copied (size of pickup location in MB)? + placeholder: '0' + validations: + required: true + + - type: textarea + attributes: + label: Additional information + description: | + Please provide any additional information needed for this request. If this is a new directory, please provide a short description and a point of contact. + validations: + required: false + + - type: markdown + attributes: + value: | + # Tasks + - [ ] Discuss needs with global-workflow developer assigned to request + - [ ] Stage a CLEAN copy of data on Hera or WCOSS in the location provided above + - [ ] [global-workflow CM] Update data in "glopara"-managed space on supported platforms + - [ ] [Fix only] Update "Fix File Management" [spreadsheet](https://docs.google.com/spreadsheets/d/1BeIvcz6TO3If4YCqkUK-oz_kGS9q2wTjwLS-BBemSEY/edit?usp=sharing) + - [ ] Make related workflow/component updates (if any) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 3f8fe65065..9a1d61eb30 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,19 +1,28 @@ - - # Description - - + + # Type of change - -- Bug fix (fixes something broken) -- New feature (adds functionality) -- Maintenance (code refactor, clean-up, new CI test, etc.) +- [ ] 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)? YES/NO - Does this change require a documentation update? YES/NO - Does this change require an update to any of the following submodules? YES/NO (If YES, please add a link to any PRs that are pending.) - - [ ] EMC verif-global - - [ ] GDAS - - [ ] GFS-utils - - [ ] GSI - - [ ] GSI-monitor - - [ ] GSI-utils - - [ ] UFS-utils - - [ ] UFS-weather-model - - [ ] wxflow - + - [ ] EMC verif-global + - [ ] GDAS + - [ ] GFS-utils + - [ ] GSI + - [ ] GSI-monitor + - [ ] GSI-utils + - [ ] UFS-utils + - [ ] UFS-weather-model + - [ ] wxflow # How has this been tested?