From 0df74d7b4b6ee0ba0f74c9e9e524a69e1f80caee Mon Sep 17 00:00:00 2001 From: David Grumm Date: Fri, 14 Feb 2025 16:26:28 +0000 Subject: [PATCH 1/4] First commits for "Remove the eomg job issue #2525" --- workflow/applications/applications.py | 2 +- workflow/applications/gfs_cycled.py | 5 ++-- workflow/rocoto/gfs_tasks.py | 36 --------------------------- workflow/rocoto/tasks.py | 2 +- 4 files changed, 5 insertions(+), 40 deletions(-) diff --git a/workflow/applications/applications.py b/workflow/applications/applications.py index 88be488b47..516a8458e4 100644 --- a/workflow/applications/applications.py +++ b/workflow/applications/applications.py @@ -151,7 +151,7 @@ def _source_configs(self, conf: Configuration, run: str = "gfs", log: bool = Tru # All must source config.base first files = ['config.base'] - if config in ['eobs', 'eomg']: + if config in ['eobs']: files += ['config.anal', 'config.eobs'] elif config in ['eupd']: files += ['config.anal', 'config.eupd'] diff --git a/workflow/applications/gfs_cycled.py b/workflow/applications/gfs_cycled.py index 2bf793eafa..388c5f81e9 100644 --- a/workflow/applications/gfs_cycled.py +++ b/workflow/applications/gfs_cycled.py @@ -83,7 +83,7 @@ def _get_app_configs(self, run): configs += ['atmensanlinit', 'atmensanlobs', 'atmensanlsol', 'atmensanlletkf', 'atmensanlfv3inc', 'atmensanlfinal'] else: - configs += ['eobs', 'eomg', 'ediag', 'eupd'] + configs += ['eobs', 'ediag', 'eupd'] configs += ['ecen', 'esfc', 'efcs', 'echgres', 'epos', 'earc'] if options['do_fit2obs']: @@ -312,7 +312,8 @@ def get_task_names(self): 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'] + if options['lobsdiag_forenkf']: + task_names[run] += ['ediag'] task_names[run].append('esnowanl') if options['do_jedisnowda'] else 0 task_names[run].append('efcs') if 'gdas' in run else 0 diff --git a/workflow/rocoto/gfs_tasks.py b/workflow/rocoto/gfs_tasks.py index bce3036be7..b9927cd6e9 100644 --- a/workflow/rocoto/gfs_tasks.py +++ b/workflow/rocoto/gfs_tasks.py @@ -2462,42 +2462,6 @@ def eobs(self): return task - def eomg(self): - deps = [] - dep_dict = {'type': 'task', 'name': f'{self.run}_eobs'} - deps.append(rocoto.add_dependency(dep_dict)) - dependencies = rocoto.create_dependency(dep=deps) - - eomgenvars = self.envars.copy() - eomgenvars_dict = {'ENSMEM': '#member#', - 'MEMDIR': 'mem#member#' - } - for key, value in eomgenvars_dict.items(): - eomgenvars.append(rocoto.create_envar(name=key, value=str(value))) - - resources = self.get_resource('eomg') - task_name = f'{self.run}_eomg_mem#member#' - task_dict = {'task_name': task_name, - 'resources': resources, - 'dependency': dependencies, - 'envars': eomgenvars, - 'cycledef': self.run.replace('enkf', ''), - 'command': f'{self.HOMEgfs}/jobs/rocoto/eomg.sh', - 'job_name': f'{self.pslot}_{task_name}_@H', - 'log': f'{self.rotdir}/logs/@Y@m@d@H/{task_name}.log', - 'maxtries': '&MAXTRIES;' - } - - member_var_dict = {'member': ' '.join([str(mem).zfill(3) for mem in range(1, self.nmem + 1)])} - metatask_dict = {'task_name': f'{self.run}_eomg', - 'var_dict': member_var_dict, - 'task_dict': task_dict, - } - - task = rocoto.create_task(metatask_dict) - - return task - def ediag(self): deps = [] dep_dict = {'type': 'task', 'name': f'{self.run}_eobs'} diff --git a/workflow/rocoto/tasks.py b/workflow/rocoto/tasks.py index c491f26800..9a6f4fa4d4 100644 --- a/workflow/rocoto/tasks.py +++ b/workflow/rocoto/tasks.py @@ -18,7 +18,7 @@ class Tasks: 'prepoceanobs', 'marineanlinit', 'marineanlletkf', 'marinebmat', 'marineanlvar', 'ocnanalecen', 'marineanlchkpt', 'marineanlfinal', 'ocnanalvrfy', 'earc', 'ecen', 'echgres', 'ediag', 'efcs', - 'eobs', 'eomg', 'epos', 'esfc', 'eupd', + 'eobs', 'epos', 'esfc', 'eupd', 'atmensanlinit', 'atmensanlobs', 'atmensanlsol', 'atmensanlletkf', 'atmensanlfv3inc', 'atmensanlfinal', 'aeroanlinit', 'aeroanlvar', 'aeroanlfinal', 'aeroanlgenb', 'snowanl', 'esnowanl', From ecbdb87ab9f4bc6211c25ac1292eafc92862322d Mon Sep 17 00:00:00 2001 From: David Grumm Date: Fri, 14 Feb 2025 20:36:08 +0000 Subject: [PATCH 2/4] Fixed whitespace --- workflow/applications/gfs_cycled.py | 1 + 1 file changed, 1 insertion(+) diff --git a/workflow/applications/gfs_cycled.py b/workflow/applications/gfs_cycled.py index 388c5f81e9..aaa901970d 100644 --- a/workflow/applications/gfs_cycled.py +++ b/workflow/applications/gfs_cycled.py @@ -84,6 +84,7 @@ def _get_app_configs(self, run): 'atmensanlletkf', 'atmensanlfv3inc', 'atmensanlfinal'] else: configs += ['eobs', 'ediag', 'eupd'] + configs += ['ecen', 'esfc', 'efcs', 'echgres', 'epos', 'earc'] if options['do_fit2obs']: From 29122b02b37111088af863b8468f8a27684bce3c Mon Sep 17 00:00:00 2001 From: David Grumm Date: Tue, 25 Feb 2025 18:32:04 +0000 Subject: [PATCH 3/4] Updates based on reviewer comments --- parm/archive/enkf.yaml.j2 | 3 --- parm/config/gfs/config.anal | 4 ---- parm/config/gfs/config.eobs | 8 +------- parm/config/gfs/config.resources | 12 ++++-------- parm/config/gfs/config.resources.HERCULES | 2 +- scripts/exgdas_enkf_update.sh | 16 +--------------- scripts/exglobal_atmos_analysis.sh | 2 -- workflow/applications/gfs_cycled.py | 8 +++++--- workflow/rocoto/gfs_tasks.py | 4 +--- 9 files changed, 13 insertions(+), 46 deletions(-) diff --git a/parm/archive/enkf.yaml.j2 b/parm/archive/enkf.yaml.j2 index 12167198cb..69a9d83b64 100644 --- a/parm/archive/enkf.yaml.j2 +++ b/parm/archive/enkf.yaml.j2 @@ -28,9 +28,6 @@ enkf: {% set steps = ["atmensanlinit", "atmensanlletkf", "atmensanlfv3inc", "atmensanlfinal"] %} {% else %} {% set steps = ["eobs", "eupd"] %} - {% for mem in range(1, nmem_ens + 1) %} - {% do steps.append("eomg_mem" ~ '%03d' % mem) %} - {% endfor %} {% endif %} {% endif %} diff --git a/parm/config/gfs/config.anal b/parm/config/gfs/config.anal index 123bd6decd..8a35e5fc98 100644 --- a/parm/config/gfs/config.anal +++ b/parm/config/gfs/config.anal @@ -25,10 +25,6 @@ if [[ ${LEVS} = "128" ]]; then export SETUP="gpstop=55,nsig_ext=45,${SETUP:-}" fi -# Set namelist option for LETKF -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," diff --git a/parm/config/gfs/config.eobs b/parm/config/gfs/config.eobs index 7b7823e764..96076bbe0c 100644 --- a/parm/config/gfs/config.eobs +++ b/parm/config/gfs/config.eobs @@ -1,6 +1,6 @@ #! /usr/bin/env bash -########## config.eobs config.eomg ########## +########## config.eobs ########## # Ensemble innovation specific, dependency config.anal echo "BEGIN: config.eobs" @@ -8,9 +8,6 @@ echo "BEGIN: config.eobs" # Get task specific resources . $EXPDIR/config.resources eobs -# Number of enkf members per innovation job -export NMEM_EOMGGRP=8 -export RERUN_EOMGGRP="YES" # GSI namelist options related to observer for EnKF export OBSINPUT_INVOBS="dmesh(1)=225.0,dmesh(2)=225.0,dmesh(3)=225.0,dmesh(4)=100.0" @@ -24,7 +21,4 @@ fi export USE_RADSTAT="NO" # This can be only used when bias correction is non-zero. export GENDIAG="YES" # Diagnostic files must be created for EnKF -export lobsdiag_forenkf=".true." # write out jacobians from eobs - # need to specify .true. setting since config.anal sets to .false. - echo "END: config.eobs" diff --git a/parm/config/gfs/config.resources b/parm/config/gfs/config.resources index 23fe8cdf18..6cb6aa4696 100644 --- a/parm/config/gfs/config.resources +++ b/parm/config/gfs/config.resources @@ -21,7 +21,7 @@ if (( $# != 1 )); then echo "upp atmos_products" echo "tracker genesis genesis_fsu" echo "verfozn verfrad vminmon fit2obs metp arc_vrfy arc_tars cleanup" - echo "eobs ediag eomg eupd ecen esfc efcs epos earc_vrfy earc_tars" + echo "eobs ediag eupd ecen esfc efcs epos earc_vrfy earc_tars" echo "init_chem mom6ic oceanice_products" echo "waveinit waveprep wavepostsbs wavepostbndpnt wavepostbndpntbll wavepostpnt" echo "wavegempak waveawipsbulls waveawipsgridded" @@ -1158,13 +1158,9 @@ case ${step} in export is_exclusive=True ;; - "eobs" | "eomg") - if [[ "${step}" == "eobs" ]]; then - walltime="00:15:00" - else - walltime="00:30:00" - fi - + "eobs") + walltime="00:15:00" + case ${CASE} in "C1152" | "C768") ntasks=200;; "C384") ntasks=100;; diff --git a/parm/config/gfs/config.resources.HERCULES b/parm/config/gfs/config.resources.HERCULES index 65ea508e01..fe3f062326 100644 --- a/parm/config/gfs/config.resources.HERCULES +++ b/parm/config/gfs/config.resources.HERCULES @@ -3,7 +3,7 @@ # Hercules-specific job resources case ${step} in - "eobs" | "eomg") + "eobs") # The number of tasks and cores used must be the same for eobs # See https://github.com/NOAA-EMC/global-workflow/issues/2092 for details # For Hercules, this is only an issue at C384; use 20 tasks/node diff --git a/scripts/exgdas_enkf_update.sh b/scripts/exgdas_enkf_update.sh index 752cb07a6b..b27637916b 100755 --- a/scripts/exgdas_enkf_update.sh +++ b/scripts/exgdas_enkf_update.sh @@ -72,7 +72,6 @@ letkf_flag=${letkf_flag:-".false."} getkf=${getkf:-".false."} denkf=${denkf:-".false."} nobsl_max=${nobsl_max:-10000} -lobsdiag_forenkf=${lobsdiag_forenkf:-".false."} write_spread_diag=${write_spread_diag:-".false."} cnvw_option=${cnvw_option:-".false."} netcdf_diag=${netcdf_diag:-".true."} @@ -196,19 +195,6 @@ for imem in $(seq 1 $NMEM_ENS); do MEMDIR=${memchar} YMD=${PDY} HH=${cyc} declare_from_tmpl -x \ COM_ATMOS_ANALYSIS_MEM:COM_ATMOS_ANALYSIS_TMPL - if [ $lobsdiag_forenkf = ".false." ]; then - if [ $USE_CFP = "YES" ]; then - echo "${nm} ${DATA}/untar.sh ${memchar} ${COM_ATMOS_ANALYSIS_MEM}" | tee -a "${DATA}/mp_untar.sh" - if [ ${CFP_MP:-"NO"} = "YES" ]; then - nm=$((nm+1)) - fi - else - for ftype in $flist; do - fname="${COM_ATMOS_ANALYSIS_MEM}/${ftype}" - tar -xvf $fname - done - fi - fi mkdir -p "${COM_ATMOS_ANALYSIS_MEM}" for FHR in $nfhrs; do ${NLN} "${COM_ATMOS_HISTORY_MEM_PREV}/${GPREFIX}atmf00${FHR}${ENKF_SUFFIX}.nc" \ @@ -288,7 +274,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},taperanalperts=${taperanalperts}, + taperanalperts=${taperanalperts}, write_spread_diag=$write_spread_diag, modelspace_vloc=$modelspace_vloc, use_correlated_oberrs=${use_correlated_oberrs}, diff --git a/scripts/exglobal_atmos_analysis.sh b/scripts/exglobal_atmos_analysis.sh index bd11b81c39..6dabc0b534 100755 --- a/scripts/exglobal_atmos_analysis.sh +++ b/scripts/exglobal_atmos_analysis.sh @@ -56,7 +56,6 @@ cao_check=${cao_check:-".true."} ta2tb=${ta2tb:-".true."} # Diagnostic files options -lobsdiag_forenkf=${lobsdiag_forenkf:-".false."} netcdf_diag=${netcdf_diag:-".true."} binary_diag=${binary_diag:-".false."} @@ -723,7 +722,6 @@ cat > gsiparm.anl << EOF diag_precon=.true.,step_start=1.e-3,emiss_bc=.true.,nhr_obsbin=${nhr_obsbin:-3}, cwoption=3,imp_physics=${imp_physics},lupp=${lupp},cnvw_option=${cnvw_option},cao_check=${cao_check}, netcdf_diag=${netcdf_diag},binary_diag=${binary_diag}, - lobsdiag_forenkf=${lobsdiag_forenkf}, write_fv3_incr=${write_fv3_increment}, nhr_anal=${IAUFHRS}, ta2tb=${ta2tb}, diff --git a/workflow/applications/gfs_cycled.py b/workflow/applications/gfs_cycled.py index 8f9efa0689..a67c03801b 100644 --- a/workflow/applications/gfs_cycled.py +++ b/workflow/applications/gfs_cycled.py @@ -85,7 +85,10 @@ def _get_app_configs(self, run): else: configs += ['eobs', 'ediag', 'eupd'] - configs += ['ecen', 'esfc', 'efcs', 'echgres', 'epos', 'earc'] + configs += ['ecen', 'esfc', 'efcs', 'echgres', 'epos', 'earc_vrfy'] + + if options['do_archtar']: + configs += ['earc_tars'] if options['do_fit2obs']: configs += ['fit2obs'] @@ -314,8 +317,7 @@ def get_task_names(self): else: task_names[run] += ['eobs', 'eupd'] task_names[run].append('echgres') if 'gdas' in run else 0 - if options['lobsdiag_forenkf']: - task_names[run] += ['ediag'] + task_names[run] += ['ediag'] task_names[run].append('esnowanl') if options['do_jedisnowda'] else 0 task_names[run].append('efcs') if 'gdas' in run else 0 diff --git a/workflow/rocoto/gfs_tasks.py b/workflow/rocoto/gfs_tasks.py index 9113b55cc2..a28e857443 100644 --- a/workflow/rocoto/gfs_tasks.py +++ b/workflow/rocoto/gfs_tasks.py @@ -2620,9 +2620,7 @@ def eupd(self): deps = [] if self.options['lobsdiag_forenkf']: dep_dict = {'type': 'task', 'name': f'{self.run}_ediag'} - else: - dep_dict = {'type': 'metatask', 'name': f'{self.run}_eomg'} - deps.append(rocoto.add_dependency(dep_dict)) + deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep=deps) resources = self.get_resource('eupd') From 0162dc7f4a89d589b48d0d4182450dc11d2c70ac Mon Sep 17 00:00:00 2001 From: David Grumm Date: Fri, 28 Feb 2025 23:22:28 +0000 Subject: [PATCH 4/4] Address additional comments --- scripts/exgdas_enkf_update.sh | 2 +- scripts/exglobal_atmos_analysis.sh | 1 + workflow/rocoto/gfs_tasks.py | 5 ++--- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/exgdas_enkf_update.sh b/scripts/exgdas_enkf_update.sh index 85e0eb23d2..c3bbbbcd58 100755 --- a/scripts/exgdas_enkf_update.sh +++ b/scripts/exgdas_enkf_update.sh @@ -275,7 +275,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}, - taperanalperts=${taperanalperts}, + lobsdiag_forenkf=.true.,taperanalperts=${taperanalperts}, write_spread_diag=$write_spread_diag, modelspace_vloc=$modelspace_vloc, use_correlated_oberrs=${use_correlated_oberrs}, diff --git a/scripts/exglobal_atmos_analysis.sh b/scripts/exglobal_atmos_analysis.sh index 6dabc0b534..84a23dee31 100755 --- a/scripts/exglobal_atmos_analysis.sh +++ b/scripts/exglobal_atmos_analysis.sh @@ -722,6 +722,7 @@ cat > gsiparm.anl << EOF diag_precon=.true.,step_start=1.e-3,emiss_bc=.true.,nhr_obsbin=${nhr_obsbin:-3}, cwoption=3,imp_physics=${imp_physics},lupp=${lupp},cnvw_option=${cnvw_option},cao_check=${cao_check}, netcdf_diag=${netcdf_diag},binary_diag=${binary_diag}, + lobsdiag_forenkf=.true., write_fv3_incr=${write_fv3_increment}, nhr_anal=${IAUFHRS}, ta2tb=${ta2tb}, diff --git a/workflow/rocoto/gfs_tasks.py b/workflow/rocoto/gfs_tasks.py index a28e857443..b44560a468 100644 --- a/workflow/rocoto/gfs_tasks.py +++ b/workflow/rocoto/gfs_tasks.py @@ -2618,9 +2618,8 @@ def ediag(self): def eupd(self): deps = [] - if self.options['lobsdiag_forenkf']: - dep_dict = {'type': 'task', 'name': f'{self.run}_ediag'} - deps.append(rocoto.add_dependency(dep_dict)) + dep_dict = {'type': 'task', 'name': f'{self.run}_ediag'} + deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep=deps) resources = self.get_resource('eupd')