From 692e3fc891e32d7b7d1a55aca63bb43a3b8ad9b0 Mon Sep 17 00:00:00 2001 From: Cory Martin Date: Tue, 23 Aug 2022 16:13:38 -0400 Subject: [PATCH 1/4] Add in stubs for aerosol DA tasks + bugfix for setup_expt where cycled and ATMA are used (#990) This PR adds in stubs for aerosol DA tasks (jobs/rocoto shell scripts), the ability for setup_expt and setup_xml to include three aerosol DA related tasks, and in the process of adding this capability, fixes a bug in which the combination of ATMA and cycled revealed that @property was being used incorrectly. Fixes #981 --- jobs/rocoto/aeroanlfinal.sh | 12 +++++++ jobs/rocoto/aeroanlinit.sh | 12 +++++++ jobs/rocoto/aeroanlrun.sh | 12 +++++++ jobs/rocoto/atmanalpost.sh | 4 ++- jobs/rocoto/atmanalprep.sh | 4 ++- jobs/rocoto/atmanalrun.sh | 4 ++- jobs/rocoto/atmensanalpost.sh | 4 ++- jobs/rocoto/atmensanalprep.sh | 4 ++- jobs/rocoto/atmensanalrun.sh | 4 ++- workflow/applications.py | 6 ++++ workflow/rocoto/workflow_tasks.py | 53 +++++++++++++++++++++++++++++-- workflow/rocoto/workflow_xml.py | 2 +- workflow/setup_expt.py | 2 +- 13 files changed, 112 insertions(+), 11 deletions(-) create mode 100755 jobs/rocoto/aeroanlfinal.sh create mode 100755 jobs/rocoto/aeroanlinit.sh create mode 100755 jobs/rocoto/aeroanlrun.sh diff --git a/jobs/rocoto/aeroanlfinal.sh b/jobs/rocoto/aeroanlfinal.sh new file mode 100755 index 0000000000..1906cc1e7f --- /dev/null +++ b/jobs/rocoto/aeroanlfinal.sh @@ -0,0 +1,12 @@ +#! /usr/bin/env bash + +source "$HOMEgfs/ush/preamble.sh" + +############################################################### +# Source FV3GFS workflow modules +. $HOMEgfs/ush/load_fv3gfs_modules.sh +status=$? +[[ $status -ne 0 ]] && exit $status + +############################################################### +echo "Do nothing for now" diff --git a/jobs/rocoto/aeroanlinit.sh b/jobs/rocoto/aeroanlinit.sh new file mode 100755 index 0000000000..1906cc1e7f --- /dev/null +++ b/jobs/rocoto/aeroanlinit.sh @@ -0,0 +1,12 @@ +#! /usr/bin/env bash + +source "$HOMEgfs/ush/preamble.sh" + +############################################################### +# Source FV3GFS workflow modules +. $HOMEgfs/ush/load_fv3gfs_modules.sh +status=$? +[[ $status -ne 0 ]] && exit $status + +############################################################### +echo "Do nothing for now" diff --git a/jobs/rocoto/aeroanlrun.sh b/jobs/rocoto/aeroanlrun.sh new file mode 100755 index 0000000000..1906cc1e7f --- /dev/null +++ b/jobs/rocoto/aeroanlrun.sh @@ -0,0 +1,12 @@ +#! /usr/bin/env bash + +source "$HOMEgfs/ush/preamble.sh" + +############################################################### +# Source FV3GFS workflow modules +. $HOMEgfs/ush/load_fv3gfs_modules.sh +status=$? +[[ $status -ne 0 ]] && exit $status + +############################################################### +echo "Do nothing for now" diff --git a/jobs/rocoto/atmanalpost.sh b/jobs/rocoto/atmanalpost.sh index 90a9b9bace..a54b7d5a7d 100755 --- a/jobs/rocoto/atmanalpost.sh +++ b/jobs/rocoto/atmanalpost.sh @@ -1,4 +1,6 @@ -#!/bin/bash -x +#! /usr/bin/env bash + +source "$HOMEgfs/ush/preamble.sh" ############################################################### # Source FV3GFS workflow modules diff --git a/jobs/rocoto/atmanalprep.sh b/jobs/rocoto/atmanalprep.sh index e4b76c8407..c6df5287d7 100755 --- a/jobs/rocoto/atmanalprep.sh +++ b/jobs/rocoto/atmanalprep.sh @@ -1,4 +1,6 @@ -#!/bin/bash -x +#! /usr/bin/env bash + +source "$HOMEgfs/ush/preamble.sh" ############################################################### # Source FV3GFS workflow modules diff --git a/jobs/rocoto/atmanalrun.sh b/jobs/rocoto/atmanalrun.sh index cebe478b7e..0768f2f55d 100755 --- a/jobs/rocoto/atmanalrun.sh +++ b/jobs/rocoto/atmanalrun.sh @@ -1,4 +1,6 @@ -#!/bin/bash -x +#! /usr/bin/env bash + +source "$HOMEgfs/ush/preamble.sh" ############################################################### # Source FV3GFS workflow modules diff --git a/jobs/rocoto/atmensanalpost.sh b/jobs/rocoto/atmensanalpost.sh index ea6e490f20..f06f5aa01c 100755 --- a/jobs/rocoto/atmensanalpost.sh +++ b/jobs/rocoto/atmensanalpost.sh @@ -1,4 +1,6 @@ -#!/bin/bash -x +#! /usr/bin/env bash + +source "$HOMEgfs/ush/preamble.sh" ############################################################### # Source FV3GFS workflow modules diff --git a/jobs/rocoto/atmensanalprep.sh b/jobs/rocoto/atmensanalprep.sh index 5ed434c6bf..19ec88f87c 100755 --- a/jobs/rocoto/atmensanalprep.sh +++ b/jobs/rocoto/atmensanalprep.sh @@ -1,4 +1,6 @@ -#!/bin/bash -x +#! /usr/bin/env bash + +source "$HOMEgfs/ush/preamble.sh" ############################################################### # Source FV3GFS workflow modules diff --git a/jobs/rocoto/atmensanalrun.sh b/jobs/rocoto/atmensanalrun.sh index ddb3bb1432..5899eeaf40 100755 --- a/jobs/rocoto/atmensanalrun.sh +++ b/jobs/rocoto/atmensanalrun.sh @@ -1,4 +1,6 @@ -#!/bin/bash -x +#! /usr/bin/env bash + +source "$HOMEgfs/ush/preamble.sh" ############################################################### # Source FV3GFS workflow modules diff --git a/workflow/applications.py b/workflow/applications.py index 1766c4071f..713c68727c 100644 --- a/workflow/applications.py +++ b/workflow/applications.py @@ -217,6 +217,9 @@ def _cycled_configs(self): if self.do_wafs: configs += ['wafs', 'wafsgrib2', 'wafsblending', 'wafsgcip', 'wafsgrib20p25', 'wafsblending0p25'] + if self.do_aero: + configs += ['aeroanlinit', 'aeroanlrun', 'aeroanlfinal'] + return configs @property @@ -348,6 +351,9 @@ def _get_cycled_task_names(self): gdas_gfs_common_tasks_before_fcst += ['sfcanl', 'analcalc'] + if self.do_aero: + gdas_gfs_common_tasks_before_fcst += ['aeroanlinit', 'aeroanlrun', 'aeroanlfinal'] + gldas_tasks = ['gldas'] wave_prep_tasks = ['waveinit', 'waveprep'] wave_bndpnt_tasks = ['wavepostbndpnt', 'wavepostbndpntbll'] diff --git a/workflow/rocoto/workflow_tasks.py b/workflow/rocoto/workflow_tasks.py index c34605b52a..06321c3d7e 100644 --- a/workflow/rocoto/workflow_tasks.py +++ b/workflow/rocoto/workflow_tasks.py @@ -16,6 +16,7 @@ class Tasks: 'earc', 'ecen', 'echgres', 'ediag', 'efcs', 'eobs', 'eomg', 'epos', 'esfc', 'eupd', 'atmensanalprep', 'atmensanalrun', 'atmensanalpost', + 'aeroanlinit', 'aeroanlrun', 'aeroanlfinal', 'fcst', 'post', 'ocnpost', 'vrfy', 'metp', 'postsnd', 'awips', 'gempak', 'wafs', 'wafsblending', 'wafsblending0p25', @@ -450,6 +451,54 @@ def atmanalpost(self): return task + def aeroanlinit(self): + + suffix = self._base["SUFFIX"] + dump_suffix = self._base["DUMP_SUFFIX"] + gfs_cyc = self._base["gfs_cyc"] + dmpdir = self._base["DMPDIR"] + + deps = [] + dep_dict = {'type': 'metatask', 'name': 'gdaspost', 'offset': '-06:00:00'} + deps.append(rocoto.add_dependency(dep_dict)) + data = f'&ROTDIR;/gdas.@Y@m@d/@H/atmos/gdas.t@Hz.atmf009{suffix}' + dep_dict = {'type': 'data', 'data': data, 'offset': '-06:00:00'} + deps.append(rocoto.add_dependency(dep_dict)) + data = f'{dmpdir}/{self.cdump}{dump_suffix}.@Y@m@d/@H/{self.cdump}.t@Hz.updated.status.tm00.bufr_d' + dep_dict = {'type': 'data', 'data': data} + deps.append(rocoto.add_dependency(dep_dict)) + dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) + + resources = self.get_resource('aeroanlinit') + task = create_wf_task('aeroanlinit', resources, cdump=self.cdump, envar=self.envars, dependency=dependencies) + return task + + def aeroanlrun(self): + + deps = [] + dep_dict = {'type': 'task', 'name': f'{self.cdump}aeroanlinit'} + deps.append(rocoto.add_dependency(dep_dict)) + dependencies = rocoto.create_dependency(dep=deps) + + resources = self.get_resource('aeroanlrun') + task = create_wf_task('aeroanlrun', resources, cdump=self.cdump, envar=self.envars, dependency=dependencies) + + return task + + def aeroanlfinal(self): + + deps = [] + dep_dict = {'type': 'task', 'name': f'{self.cdump}aeroanlrun'} + deps.append(rocoto.add_dependency(dep_dict)) + dep_dict = {'type': 'cycleexist', 'offset': '-06:00:00'} + deps.append(rocoto.add_dependency(dep_dict)) + dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) + + resources = self.get_resource('aeroanlfinal') + task = create_wf_task('aeroanlfinal', resources, cdump=self.cdump, envar=self.envars, dependency=dependencies) + + return task + def gldas(self): deps = [] @@ -470,7 +519,7 @@ def fcst(self): 'cycled': self._fcst_cycled} try: - task = fcst_map[self.app_config.mode] + task = fcst_map[self.app_config.mode]() except KeyError: raise NotImplementedError(f'{self.app_config.mode} is not a valid type.\n' + 'Currently supported forecast types are:\n' + @@ -478,7 +527,6 @@ def fcst(self): return task - @property def _fcst_forecast_only(self): dependencies = [] @@ -531,7 +579,6 @@ def _fcst_forecast_only(self): return task - @property def _fcst_cycled(self): dep_dict = {'type': 'task', 'name': f'{self.cdump}sfcanl'} diff --git a/workflow/rocoto/workflow_xml.py b/workflow/rocoto/workflow_xml.py index e0786964f9..440ff93db5 100644 --- a/workflow/rocoto/workflow_xml.py +++ b/workflow/rocoto/workflow_xml.py @@ -113,7 +113,7 @@ def _get_cycledefs_cycled(self): sdate = self._base['SDATE'].strftime('%Y%m%d%H%M') edate = self._base['EDATE'].strftime('%Y%m%d%H%M') interval = self._base.get('INTERVAL', '06:00:00') - strings = [f'\t{sdate} {edate} {interval}'] + strings = [f'\t{sdate} {edate} {interval}\n'] if self._app_config.gfs_cyc != 0: sdate_gfs = self._base['SDATE_GFS'].strftime('%Y%m%d%H%M') diff --git a/workflow/setup_expt.py b/workflow/setup_expt.py index 566e936d24..85145f6472 100755 --- a/workflow/setup_expt.py +++ b/workflow/setup_expt.py @@ -228,7 +228,7 @@ def input_args(): cycled.add_argument('--nens', help='number of ensemble members', type=int, required=False, default=20) cycled.add_argument('--app', help='UFS application', type=str, - choices=['ATM', 'ATMW'], required=False, default='ATM') + choices=['ATM', 'ATMW', 'ATMA'], required=False, default='ATM') # forecast only mode additional arguments forecasts.add_argument('--app', help='UFS application', type=str, choices=[ From aae25112286e70e2f662b15f230bba958dfb897b Mon Sep 17 00:00:00 2001 From: benwgreen <54944233+benwgreen@users.noreply.github.com> Date: Wed, 24 Aug 2022 09:17:24 -0600 Subject: [PATCH 2/4] Bugfix in arch.sh to remove hardwired "htar" (#992) To support "LOCALARCH", $TARCMD is used instead of hardwiring "htar". One line had a hardwired htar; this PR changes "htar" to "$TARCMD". --- jobs/rocoto/arch.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jobs/rocoto/arch.sh b/jobs/rocoto/arch.sh index 05eb34e1ad..4e74f0ca26 100755 --- a/jobs/rocoto/arch.sh +++ b/jobs/rocoto/arch.sh @@ -213,7 +213,7 @@ if [ $CDUMP = "gfs" ]; then # Aerosols if [ $DO_AERO = "YES" ]; then for targrp in chem; do - htar -P -cvf $ATARDIR/$CDATE/${targrp}.tar $(cat $ARCH_LIST/${targrp}.txt) + $TARCMD -P -cvf $ATARDIR/$CDATE/${targrp}.tar $(cat $ARCH_LIST/${targrp}.txt) status=$? if [ $status -ne 0 -a $CDATE -ge $firstday ]; then echo "HTAR $CDATE ${targrp}.tar failed" From 3a8fc8ecd2fdbe8484dd882a512e765d3c70b307 Mon Sep 17 00:00:00 2001 From: Kate Friedman Date: Thu, 25 Aug 2022 13:49:24 -0400 Subject: [PATCH 3/4] Add missing "atmos" into job dependencies (#998) The "atmos" subfolder in the GDA was missing in the dependency path for the prep and atmanalprep jobs. Add it in for correctness. Updated dependencies in workflow/rocoto/workflow_tasks.py. Refs: #997 --- workflow/rocoto/workflow_tasks.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/workflow/rocoto/workflow_tasks.py b/workflow/rocoto/workflow_tasks.py index 06321c3d7e..4d2b980b94 100644 --- a/workflow/rocoto/workflow_tasks.py +++ b/workflow/rocoto/workflow_tasks.py @@ -245,7 +245,7 @@ def prep(self): data = f'&ROTDIR;/gdas.@Y@m@d/@H/atmos/gdas.t@Hz.atmf009{suffix}' dep_dict = {'type': 'data', 'data': data, 'offset': '-06:00:00'} deps.append(rocoto.add_dependency(dep_dict)) - data = f'{dmpdir}/{self.cdump}{dump_suffix}.@Y@m@d/@H/{self.cdump}.t@Hz.updated.status.tm00.bufr_d' + data = f'{dmpdir}/{self.cdump}{dump_suffix}.@Y@m@d/@H/atmos/{self.cdump}.t@Hz.updated.status.tm00.bufr_d' dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) @@ -406,7 +406,7 @@ def atmanalprep(self): data = f'&ROTDIR;/gdas.@Y@m@d/@H/atmos/gdas.t@Hz.atmf009{suffix}' dep_dict = {'type': 'data', 'data': data, 'offset': '-06:00:00'} deps.append(rocoto.add_dependency(dep_dict)) - data = f'{dmpdir}/{self.cdump}{dump_suffix}.@Y@m@d/@H/{self.cdump}.t@Hz.updated.status.tm00.bufr_d' + data = f'{dmpdir}/{self.cdump}{dump_suffix}.@Y@m@d/@H/atmos/{self.cdump}.t@Hz.updated.status.tm00.bufr_d' dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) @@ -464,7 +464,7 @@ def aeroanlinit(self): data = f'&ROTDIR;/gdas.@Y@m@d/@H/atmos/gdas.t@Hz.atmf009{suffix}' dep_dict = {'type': 'data', 'data': data, 'offset': '-06:00:00'} deps.append(rocoto.add_dependency(dep_dict)) - data = f'{dmpdir}/{self.cdump}{dump_suffix}.@Y@m@d/@H/{self.cdump}.t@Hz.updated.status.tm00.bufr_d' + data = f'{dmpdir}/{self.cdump}{dump_suffix}.@Y@m@d/@H/atmos/{self.cdump}.t@Hz.updated.status.tm00.bufr_d' dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) @@ -1032,7 +1032,7 @@ def atmensanalprep(self): data = f'&ROTDIR;/gdas.@Y@m@d/@H/atmos/gdas.t@Hz.atmf009{suffix}' dep_dict = {'type': 'data', 'data': data, 'offset': '-06:00:00'} deps.append(rocoto.add_dependency(dep_dict)) - data = f'{dmpdir}/{self.cdump}{dump_suffix}.@Y@m@d/@H/{self.cdump}.t@Hz.updated.status.tm00.bufr_d' + data = f'{dmpdir}/{self.cdump}{dump_suffix}.@Y@m@d/@H/atmos/{self.cdump}.t@Hz.updated.status.tm00.bufr_d' dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) dependencies = rocoto.create_dependency(dep_condition='and', dep=deps) From 1f142296279730566610e10fb93bd8beb636af07 Mon Sep 17 00:00:00 2001 From: Walter Kolczynski - NOAA Date: Thu, 25 Aug 2022 15:06:24 -0400 Subject: [PATCH 4/4] Fix preamble id (#996) I was too clever by half when writing the preamble and used a check for an argument that doesn't actually work. Using the more typical method works correctly. --- ush/preamble.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ush/preamble.sh b/ush/preamble.sh index bfa326f103..3effebb41f 100644 --- a/ush/preamble.sh +++ b/ush/preamble.sh @@ -19,7 +19,7 @@ # ####### set +x -if [[ -v '1' ]]; then +if (( $# > 0 )); then id="(${1})" else id=""