From 113085c36b68d24543f37888ffe58d48852b3ea3 Mon Sep 17 00:00:00 2001 From: Rahul Mahajan Date: Thu, 28 Jul 2022 18:23:43 -0400 Subject: [PATCH] minimal intervention to create a data-atmosphere xml --- parm/config/config.base.emc.dyn | 7 ++++- parm/config/config.coupled_ic | 1 + workflow/applications.py | 30 ++++++++++++------- workflow/rocoto/workflow_tasks.py | 49 ++++++++++++++++++++++--------- workflow/setup_expt.py | 2 +- 5 files changed, 63 insertions(+), 26 deletions(-) diff --git a/parm/config/config.base.emc.dyn b/parm/config/config.base.emc.dyn index 722818b22a6..e26eb354045 100755 --- a/parm/config/config.base.emc.dyn +++ b/parm/config/config.base.emc.dyn @@ -152,6 +152,7 @@ export DBNROOT=${DBNROOT:-${UTILROOT}/fakedbn} export APP=@APP@ # Defaults: +export DO_ATM="YES" export DO_COUPLED="NO" export DO_WAVE="NO" export DO_OCN="NO" @@ -164,7 +165,6 @@ export cplwav2atm=".false." case "${APP}" in ATM) - echo "APP=ATM; will use defaults" export confignamevarfornems="atm" ;; ATMA) @@ -177,6 +177,11 @@ case "${APP}" in export WAVE_CDUMP="both" export confignamevarfornems="leapfrog_atm_wav" ;; + NG-GODAS) + export DO_ATM="NO" + export DO_OCN="YES" + export DO_ICE="YES" + ;; S2S*) export DO_COUPLED="YES" export DO_OCN="YES" diff --git a/parm/config/config.coupled_ic b/parm/config/config.coupled_ic index 7b4b6f51aa9..15f15efa0cd 100755 --- a/parm/config/config.coupled_ic +++ b/parm/config/config.coupled_ic @@ -17,5 +17,6 @@ export CPL_ATMIC=GEFS-NoahMP-aerosols-p8c export CPL_ICEIC=CPC export CPL_OCNIC=CPC3Dvar export CPL_WAVIC=GEFSwave20210528v2 +export CPL_DATM=CDEPS_DATM echo "END: config.coupled_ic" diff --git a/workflow/applications.py b/workflow/applications.py index 8256cd9699b..1766c4071fe 100644 --- a/workflow/applications.py +++ b/workflow/applications.py @@ -93,6 +93,7 @@ def __init__(self, configuration: Configuration) -> None: self.model_app = _base.get('APP', 'ATM') self.do_hybvar = _base.get('DOHYBVAR', False) + self.do_atm = _base.get('DO_ATM', True) self.do_wave = _base.get('DO_WAVE', False) self.do_wave_bnd = _base.get('DOBNDPNT_WAVE', False) self.do_ocean = _base.get('DO_OCN', False) @@ -181,12 +182,12 @@ def _cycled_configs(self): configs += ['sfcanl', 'analcalc', 'fcst', 'post', 'vrfy', 'arch'] - + if self.do_gldas: configs += ['gldas'] if self.do_hybvar: - if self.do_jediens: + if self.do_jediens: configs += ['atmensanalprep', 'atmensanalrun', 'atmensanalpost'] else: configs += ['eobs', 'eomg', 'ediag', 'eupd'] @@ -224,9 +225,14 @@ def _forecast_only_configs(self): Returns the config_files that are involved in the forecast-only app """ - configs = ['fcst', 'post', 'vrfy', 'arch'] + configs = ['fcst'] + + if self.do_atm: + configs += ['post', 'vrfy'] + + configs += ['arch'] - if self.model_app in ['S2S', 'S2SW', 'S2SWA']: + if self.model_app in ['S2S', 'S2SW', 'S2SWA', 'NG-GODAS']: configs += ['coupled_ic'] else: configs += ['init'] @@ -239,7 +245,7 @@ def _forecast_only_configs(self): if self.do_ocean or self.do_ice: configs += ['ocnpost'] - if self.do_metp: + if self.do_atm and self.do_metp: configs += ['metp'] if self.do_gempak: @@ -436,7 +442,7 @@ def _get_forecast_only_task_names(self): tasks = [] - if 'S2S' in self.model_app: + if self.model_app in ['S2S', 'S2SW', 'S2SWA', 'NG-GODAS']: tasks += ['coupled_ic'] else: if self.do_hpssarch: @@ -452,12 +458,16 @@ def _get_forecast_only_task_names(self): tasks += ['fcst'] - tasks += ['post'] - if 'S2S' in self.model_app: + if self.do_atm: + tasks += ['post'] + + if self.model_app in ['S2S', 'S2SW', 'S2SWA', 'NG-GODAS']: tasks += ['ocnpost'] - tasks += ['vrfy'] - if self.do_metp: + if self.do_atm: + tasks += ['vrfy'] + + if self.do_atm and self.do_metp: tasks += ['metp'] if self.do_wave: diff --git a/workflow/rocoto/workflow_tasks.py b/workflow/rocoto/workflow_tasks.py index 9154ac37f7c..22d4ee2c149 100644 --- a/workflow/rocoto/workflow_tasks.py +++ b/workflow/rocoto/workflow_tasks.py @@ -140,13 +140,20 @@ def coupled_ic(self): deps = [] # Atm ICs - atm_res = self._base.get('CASE', 'C384') - prefix = f"{cpl_ic['BASE_CPLIC']}/{cpl_ic['CPL_ATMIC']}/@Y@m@d@H/{self.cdump}" - for file in ['gfs_ctrl.nc'] + \ - [f'{datatype}_data.tile{tile}.nc' - for datatype in ['gfs', 'sfc'] - for tile in range(1, self.n_tiles + 1)]: - data = f"{prefix}/{atm_res}/INPUT/{file}" + if self.app_config.do_atm: + atm_res = self._base.get('CASE', 'C384') + prefix = f"{cpl_ic['BASE_CPLIC']}/{cpl_ic['CPL_ATMIC']}/@Y@m@d@H/{self.cdump}" + for file in ['gfs_ctrl.nc'] + \ + [f'{datatype}_data.tile{tile}.nc' + for datatype in ['gfs', 'sfc'] + for tile in range(1, self.n_tiles + 1)]: + data = f"{prefix}/{atm_res}/INPUT/{file}" + dep_dict = {'type': 'data', 'data': data} + deps.append(rocoto.add_dependency(dep_dict)) + else: # data-atmosphere + # TODO - need more information about how these forcings are stored + prefix = f"{cpl_ic['BASE_CPLIC']}/{cpl_ic['CPL_DATM']}/@Y@m@d@H" + data = f"{prefix}/gefs.@Y@m.nc" dep_dict = {'type': 'data', 'data': data} deps.append(rocoto.add_dependency(dep_dict)) @@ -474,14 +481,28 @@ def fcst(self): @property def _fcst_forecast_only(self): dependencies = [] + deps = [] - data = f'&ROTDIR;/{self.cdump}.@Y@m@d/@H/atmos/INPUT/sfc_data.tile6.nc' - dep_dict = {'type': 'data', 'data': data} - deps.append(rocoto.add_dependency(dep_dict)) - data = f'&ROTDIR;/{self.cdump}.@Y@m@d/@H/atmos/RESTART/@Y@m@d.@H0000.sfcanl_data.tile6.nc' - dep_dict = {'type': 'data', 'data': data} - deps.append(rocoto.add_dependency(dep_dict)) - dependencies.append(rocoto.create_dependency(dep_condition='or', dep=deps)) + if self.app_config.do_atm: + data = f'&ROTDIR;/{self.cdump}.@Y@m@d/@H/atmos/INPUT/sfc_data.tile6.nc' + dep_dict = {'type': 'data', 'data': data} + deps.append(rocoto.add_dependency(dep_dict)) + data = f'&ROTDIR;/{self.cdump}.@Y@m@d/@H/atmos/RESTART/@Y@m@d.@H0000.sfcanl_data.tile6.nc' + dep_dict = {'type': 'data', 'data': data} + deps.append(rocoto.add_dependency(dep_dict)) + dependencies.append(rocoto.create_dependency(dep_condition='or', dep=deps)) + + else: # data-atmosphere + data = f'&ICSDIR;/@Y@m@d@H/datm/gefs.@Y@m.nc' # GEFS forcing + dep_dict = {'type': 'data', 'data': data} + deps.append(rocoto.add_dependency(dep_dict)) + data = '&ICSDIR;/@Y@m@d@H/ocn/MOM.res.nc' # TODO - replace with actual ocean IC + dep_dict = {'type': 'data', 'data': data} + deps.append(rocoto.add_dependency(dep_dict)) + data = '&ICSDIR;/@Y@m@d@H/ice/cice5_model.res.nc' # TODO - replace with actual ice IC + dep_dict = {'type': 'data', 'data': data} + deps.append(rocoto.add_dependency(dep_dict)) + dependencies.append(rocoto.create_dependency(dep_condition='and', dep=deps)) if self.app_config.do_wave and self.cdump in self.app_config.wave_cdumps: wave_job = 'waveprep' if self.app_config.model_app in ['ATMW'] else 'waveinit' diff --git a/workflow/setup_expt.py b/workflow/setup_expt.py index 000f939cea9..566e936d24c 100755 --- a/workflow/setup_expt.py +++ b/workflow/setup_expt.py @@ -232,7 +232,7 @@ def input_args(): # forecast only mode additional arguments forecasts.add_argument('--app', help='UFS application', type=str, choices=[ - 'ATM', 'ATMA', 'ATMW', 'S2S', 'S2SW', 'S2SWA'], required=False, default='ATM') + 'ATM', 'ATMA', 'ATMW', 'S2S', 'S2SW', 'S2SWA', 'NG-GODAS'], required=False, default='ATM') args = parser.parse_args()