From 2b5b3d9b3c33692ccc64431bf9d1d009b8d86f0e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 22 Jan 2026 21:28:29 +0000 Subject: [PATCH 1/2] Initial plan From c9385a6d07852d3daf643e3ac3303b55aaf91551 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 22 Jan 2026 21:34:50 +0000 Subject: [PATCH 2/2] Implement log-based triggering for downstream GSI analysis jobs Co-authored-by: DavidHuber-NOAA <69919478+DavidHuber-NOAA@users.noreply.github.com> --- dev/scripts/exglobal_atmos_analysis.sh | 2 ++ dev/workflow/rocoto/gfs_tasks.py | 9 ++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/dev/scripts/exglobal_atmos_analysis.sh b/dev/scripts/exglobal_atmos_analysis.sh index 34ab78ae0d6..364fad751d1 100755 --- a/dev/scripts/exglobal_atmos_analysis.sh +++ b/dev/scripts/exglobal_atmos_analysis.sh @@ -891,6 +891,8 @@ if [[ "${SENDECF}" == "YES" && "${RUN}" != "enkf" ]]; then ecflow_client --event release_fcst fi +echo "${rCDUMP} ${PDY}${cyc} GSI done at $(date)" > "${COMOUT_ATMOS_ANALYSIS}/${APREFIX}gsi_analysis_status.log" + # Diagnostic files # if requested, GSI diagnostic file directories for use later if [[ "${GENDIAG}" == "YES" ]]; then diff --git a/dev/workflow/rocoto/gfs_tasks.py b/dev/workflow/rocoto/gfs_tasks.py index 2cbbf00968d..e5ccecc8469 100644 --- a/dev/workflow/rocoto/gfs_tasks.py +++ b/dev/workflow/rocoto/gfs_tasks.py @@ -298,7 +298,8 @@ def sfcanl(self): if self.options['do_jediatmvar']: dep_dict = {'type': 'task', 'name': f'{self.run}_atmanlfinal'} else: - dep_dict = {'type': 'task', 'name': f'{self.run}_anal'} + analysis_path = self._template_to_rocoto_cycstring(self._base['COM_ATMOS_ANALYSIS_TMPL']) + dep_dict = {'type': 'data', 'data': f'{analysis_path}/{self.run}.t@Hz.gsi_analysis_status.log'} deps.append(rocoto.add_dependency(dep_dict)) if self.options['do_jedisnowda']: dep_dict = {'type': 'task', 'name': f'{self.run}_snowanl'} @@ -334,7 +335,8 @@ def analcalc(self): if self.options['do_jediatmvar'] and not self.options['do_jediatmens']: dep_dict = {'type': 'task', 'name': f'{self.run}_atmanlfinal'} else: - dep_dict = {'type': 'task', 'name': f'{self.run}_anal'} + analysis_path = self._template_to_rocoto_cycstring(self._base['COM_ATMOS_ANALYSIS_TMPL']) + dep_dict = {'type': 'data', 'data': f'{analysis_path}/{self.run}.t@Hz.gsi_analysis_status.log'} deps.append(rocoto.add_dependency(dep_dict)) dep_dict = {'type': 'task', 'name': f'{self.run}_sfcanl'} deps.append(rocoto.add_dependency(dep_dict)) @@ -1847,7 +1849,8 @@ def verfrad(self): def vminmon(self): deps = [] - dep_dict = {'type': 'task', 'name': f'{self.run}_anal'} + analysis_path = self._template_to_rocoto_cycstring(self._base['COM_ATMOS_ANALYSIS_TMPL']) + dep_dict = {'type': 'data', 'data': f'{analysis_path}/{self.run}.t@Hz.gsi_analysis_status.log'} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep=deps)