diff --git a/workflow/applications/applications.py b/workflow/applications/applications.py index 67eceb02d2..1398bd5d06 100644 --- a/workflow/applications/applications.py +++ b/workflow/applications/applications.py @@ -64,10 +64,13 @@ def _init_finalize(self, conf: Configuration): for run in self.runs: self.configs[run] = self._source_configs(conf, run=run, log=False) + @abstractmethod def _get_run_options(self, conf: Configuration) -> Dict[str, Any]: ''' Determine the do_* and APP options for each RUN by sourcing config.base - for each RUN and collecting the flags into self.run_options + for each RUN and collecting the flags into self.run_options. Note that + this method is overloaded so additional NET- and MODE-dependent flags + can be set. ''' run_options = {run: {} for run in dict.fromkeys(self.runs)} @@ -96,7 +99,6 @@ def _get_run_options(self, conf: Configuration) -> Dict[str, Any]: run_options[run]['do_wave'] = run_base.get('DO_WAVE', False) run_options[run]['do_ocean'] = run_base.get('DO_OCN', False) run_options[run]['do_ice'] = run_base.get('DO_ICE', False) - run_options[run]['do_aero'] = run_base.get('DO_AERO', False) run_options[run]['do_prep_obs_aero'] = run_base.get('DO_PREP_OBS_AERO', False) run_options[run]['do_aero_anl'] = run_base.get('DO_AERO_ANL', False) run_options[run]['do_aero_fcst'] = run_base.get('DO_AERO_FCST', False) @@ -107,35 +109,9 @@ def _get_run_options(self, conf: Configuration) -> Dict[str, Any]: if not AppConfig.is_monotonic(run_options[run]['fcst_segments']): raise ValueError(f'Forecast segments do not increase monotonically: {",".join(self.fcst_segments)}') - # Append any MODE-specific options - run_options = self._netmode_run_options(run_base, run_options) - # Return the dictionary of run options return run_options - @abstractmethod - def _netmode_run_options(self, base: Dict[str, Any], run_options: Dict[str, Any]) -> Dict[str, Any]: - ''' - Defines run-based options for a given NET_MODE case. - - Parameters - ---------- - base: Dict - Parsed config.base settings - - run_options: Dict - A dictionary with valid RUN-based sub-dictionaries containing generic options. - - Returns - ------- - run_options: Dict - Output dictionary with additional options valid for the given NET and MODE. - ''' - - # Valid NET_MODE options are defined in the appropriate subclass. - - pass - @abstractmethod def _get_app_configs(self): pass diff --git a/workflow/applications/gefs.py b/workflow/applications/gefs.py index 3c5d0b7bb3..1463967f86 100644 --- a/workflow/applications/gefs.py +++ b/workflow/applications/gefs.py @@ -15,9 +15,12 @@ def __init__(self, conf: Configuration): self.run = base.get('RUN', 'gefs') self.runs = [self.run] - def _netmode_run_options(self, base: Dict[str, Any], run_options: Dict[str, Any]) -> Dict[str, Any]: + def _get_run_options(self, conf: Configuration) -> Dict[str, Any]: + + run_options = super()._get_run_options(conf) + + run_options[self.run]['nens'] = conf.parse_config('config.base').get('NMEM_ENS', 0) - run_options[self.run]['nens'] = base.get('NMEM_ENS', 0) return run_options def _get_app_configs(self, run): @@ -38,7 +41,7 @@ def _get_app_configs(self, run): if options['do_ocean'] or options['do_ice']: configs += ['oceanice_products'] - if options['do_aero']: + if options['do_aero_fcst']: configs += ['prep_emissions'] if options['do_extractvars']: @@ -63,7 +66,7 @@ def get_task_names(self): if options['do_wave']: tasks += ['waveinit'] - if options['do_aero']: + if options['do_aero_fcst']: tasks += ['prep_emissions'] tasks += ['fcst'] diff --git a/workflow/applications/gfs_cycled.py b/workflow/applications/gfs_cycled.py index e3c50a13ee..e6f14cbb9b 100644 --- a/workflow/applications/gfs_cycled.py +++ b/workflow/applications/gfs_cycled.py @@ -30,9 +30,13 @@ def __init__(self, conf: Configuration): self.runs.append("gfs") if base['gfs_cyc'] > 0 else 0 self.runs.append('enkfgfs') if 'gfs' in self.ens_runs and "gfs" in self.runs else 0 - def _netmode_run_options(self, base: Dict[str, Any], run_options: Dict[str, Any]) -> Dict[str, Any]: + def _get_run_options(self, conf: Configuration) -> Dict[str, Any]: + + run_options = super()._get_run_options(conf) for run in self.runs: + base = conf.parse_config('config.base', RUN=run) + run_options[run]['do_hybvar'] = base.get('DOHYBVAR', False) run_options[run]['nens'] = base.get('NMEM_ENS', 0) if run_options[run]['do_hybvar']: @@ -126,7 +130,7 @@ def _get_app_configs(self, run): if options['do_awips']: configs += ['waveawipsbulls', 'waveawipsgridded'] - if options['do_aero']: + if options['do_aero_anl']: configs += ['aeroanlgenb', 'aeroanlinit', 'aeroanlvar', 'aeroanlfinal'] if options['do_prep_obs_aero']: configs += ['prepobsaero'] diff --git a/workflow/applications/gfs_forecast_only.py b/workflow/applications/gfs_forecast_only.py index 665cbf7805..f825a25616 100644 --- a/workflow/applications/gfs_forecast_only.py +++ b/workflow/applications/gfs_forecast_only.py @@ -15,9 +15,11 @@ def __init__(self, conf: Configuration): self.run = base.get('RUN', 'gfs') self.runs = [self.run] - def _netmode_run_options(self, base: Dict[str, Any], run_options: Dict[str, Any]) -> Dict[str, Any]: + def _get_run_options(self, conf: Configuration) -> Dict[str, Any]: - run_options[self.run]['exp_warm_start'] = base.get('EXP_WARM_START', False) + run_options = super()._get_run_options(conf) + + run_options[self.run]['exp_warm_start'] = conf.parse_config('config.base').get('EXP_WARM_START', False) return run_options @@ -36,7 +38,7 @@ def _get_app_configs(self, run): configs += ['atmos_products'] - if options['do_aero']: + if options['do_aero_fcst']: if not options['exp_warm_start']: configs += ['aerosol_init'] diff --git a/workflow/rocoto/gefs_tasks.py b/workflow/rocoto/gefs_tasks.py index 7103ec3a42..dfa8ec5858 100644 --- a/workflow/rocoto/gefs_tasks.py +++ b/workflow/rocoto/gefs_tasks.py @@ -68,7 +68,7 @@ def fcst(self): dep_dict = {'type': 'task', 'name': f'gefs_wave_init'} dependencies.append(rocoto.add_dependency(dep_dict)) - if self.options['do_aero']: + if self.options['do_aero_fcst']: dep_dict = {'type': 'task', 'name': f'gefs_prep_emissions'} dependencies.append(rocoto.add_dependency(dep_dict)) @@ -114,7 +114,7 @@ def efcs(self): dep_dict = {'type': 'task', 'name': f'gefs_wave_init'} dependencies.append(rocoto.add_dependency(dep_dict)) - if self.options['do_aero']: + if self.options['do_aero_fcst']: dep_dict = {'type': 'task', 'name': f'gefs_prep_emissions'} dependencies.append(rocoto.add_dependency(dep_dict))