From 4e160a895bfb31c281e21557dd86c13954a1a967 Mon Sep 17 00:00:00 2001 From: Rahul Mahajan Date: Mon, 8 Jan 2024 13:10:15 -0500 Subject: [PATCH] Enable UPP for GOES processing (#2203) Wnables the creation of special master grib2 files from UPP for GOES processing --- parm/config/gfs/config.base.emc.dyn | 2 +- parm/config/gfs/yaml/defaults.yaml | 1 + workflow/applications/applications.py | 1 + workflow/applications/gfs_cycled.py | 3 +++ workflow/applications/gfs_forecast_only.py | 5 ++++- workflow/rocoto/gfs_tasks.py | 16 +++++++++++++--- workflow/rocoto/tasks.py | 2 +- 7 files changed, 24 insertions(+), 6 deletions(-) diff --git a/parm/config/gfs/config.base.emc.dyn b/parm/config/gfs/config.base.emc.dyn index abfd1ba180..467cc8bbfe 100644 --- a/parm/config/gfs/config.base.emc.dyn +++ b/parm/config/gfs/config.base.emc.dyn @@ -59,7 +59,7 @@ export NOSCRUB="@NOSCRUB@" export BASE_GIT="@BASE_GIT@" # Toggle to turn on/off GFS downstream processing. -export DO_GOES="NO" # GOES products +export DO_GOES="@DO_GOES@" # GOES products export DO_BUFRSND="NO" # BUFR sounding products export DO_GEMPAK="NO" # GEMPAK products export DO_AWIPS="NO" # AWIPS products diff --git a/parm/config/gfs/yaml/defaults.yaml b/parm/config/gfs/yaml/defaults.yaml index c0298edb18..ade83fa484 100644 --- a/parm/config/gfs/yaml/defaults.yaml +++ b/parm/config/gfs/yaml/defaults.yaml @@ -5,6 +5,7 @@ base: DO_JEDIOCNVAR: "NO" DO_JEDILANDDA: "NO" DO_MERGENSST: "NO" + DO_GOES: "NO" atmanl: IO_LAYOUT_X: 1 diff --git a/workflow/applications/applications.py b/workflow/applications/applications.py index 766d4aa508..d45b6a9abc 100644 --- a/workflow/applications/applications.py +++ b/workflow/applications/applications.py @@ -62,6 +62,7 @@ def __init__(self, conf: Configuration) -> None: self.do_genesis_fsu = _base.get('DO_GENESIS_FSU', False) self.do_metp = _base.get('DO_METP', False) self.do_upp = not _base.get('WRITE_DOPOST', True) + self.do_goes = _base.get('DO_GOES', False) self.do_mos = _base.get('DO_MOS', False) self.do_hpssarch = _base.get('HPSSARCH', False) diff --git a/workflow/applications/gfs_cycled.py b/workflow/applications/gfs_cycled.py index 29c6b18f43..448bbb4ec2 100644 --- a/workflow/applications/gfs_cycled.py +++ b/workflow/applications/gfs_cycled.py @@ -207,6 +207,9 @@ def get_task_names(self): gfs_tasks += ['atmupp'] gfs_tasks += ['atmprod'] + if self.do_goes: + gfs_tasks += ['goesupp'] + if self.do_vminmon: gfs_tasks += ['vminmon'] diff --git a/workflow/applications/gfs_forecast_only.py b/workflow/applications/gfs_forecast_only.py index 564fd382b9..1145863210 100644 --- a/workflow/applications/gfs_forecast_only.py +++ b/workflow/applications/gfs_forecast_only.py @@ -19,7 +19,7 @@ def _get_app_configs(self): if self.do_atm: - if self.do_upp: + if self.do_upp or self.do_goes: configs += ['upp'] configs += ['atmos_products'] @@ -102,6 +102,9 @@ def get_task_names(self): tasks += ['atmprod'] + if self.do_goes: + tasks += ['goesupp'] + if self.do_tracker: tasks += ['tracker'] diff --git a/workflow/rocoto/gfs_tasks.py b/workflow/rocoto/gfs_tasks.py index ba27dff207..05577935f8 100644 --- a/workflow/rocoto/gfs_tasks.py +++ b/workflow/rocoto/gfs_tasks.py @@ -936,6 +936,16 @@ def _get_ufs_postproc_grps(cdump, config): return grp, dep, lst def atmupp(self): + return self._upptask(upp_run='forecast', task_id='atmupp') + + def goesupp(self): + return self._upptask(upp_run='goes', task_id='goesupp') + + def _upptask(self, upp_run="forecast", task_id="atmupp"): + + VALID_UPP_RUN = ["forecast", "goes", "wafs"] + if upp_run not in VALID_UPP_RUN: + raise KeyError(f"{upp_run} is invalid; UPP_RUN options are: {('|').join(VALID_UPP_RUN)}") varname1, varname2, varname3 = 'grp', 'dep', 'lst' varval1, varval2, varval3 = self._get_ufs_postproc_grps(self.cdump, self._configs['upp']) @@ -943,7 +953,7 @@ def atmupp(self): postenvars = self.envars.copy() postenvar_dict = {'FHRLST': '#lst#', - 'UPP_RUN': 'forecast'} + 'UPP_RUN': upp_run} for key, value in postenvar_dict.items(): postenvars.append(rocoto.create_envar(name=key, value=str(value))) @@ -962,7 +972,7 @@ def atmupp(self): cycledef = 'gdas_half,gdas' if self.cdump in ['gdas'] else self.cdump resources = self.get_resource('upp') - task_name = f'{self.cdump}atmupp#{varname1}#' + task_name = f'{self.cdump}{task_id}#{varname1}#' task_dict = {'task_name': task_name, 'resources': resources, 'dependency': dependencies, @@ -974,7 +984,7 @@ def atmupp(self): 'maxtries': '&MAXTRIES;' } - metatask_dict = {'task_name': f'{self.cdump}atmupp', + metatask_dict = {'task_name': f'{self.cdump}{task_id}', 'task_dict': task_dict, 'var_dict': var_dict } diff --git a/workflow/rocoto/tasks.py b/workflow/rocoto/tasks.py index dee86d0d04..2436aca5aa 100644 --- a/workflow/rocoto/tasks.py +++ b/workflow/rocoto/tasks.py @@ -20,7 +20,7 @@ class Tasks: 'aeroanlinit', 'aeroanlrun', 'aeroanlfinal', 'preplandobs', 'landanl', 'fcst', - 'atmanlupp', 'atmanlprod', 'atmupp', 'atmprod', + 'atmanlupp', 'atmanlprod', 'atmupp', 'atmprod', 'goesupp', 'ocnpost', 'verfozn', 'verfrad', 'vminmon', 'metp',