diff --git a/src/mswm/build_inputs.py b/src/mswm/build_inputs.py index 938fc6f0..abac43ba 100644 --- a/src/mswm/build_inputs.py +++ b/src/mswm/build_inputs.py @@ -593,11 +593,9 @@ def _parse_forcing_engine(self): # Raise error if forecast or cold start is run with CSV provider if self.forcing_provider == 'csv' and self.run_type in ('forecast', 'cold_start'): - try: - raise ValueError(f"Run type {self.run_type} requires bmi forcing provider") - except ValueError as e: - logger.critical(e) - raise + msg = f"Run type {self.run_type} requires bmi forcing provider, but {repr(self.forcing_provider)} was provided" + logger.critical(msg) + raise ValueError(msg) # Retrieve cold_start_time self.cold_start_datetime = self.forcingSec.get('cold_start_datetime', None) @@ -626,8 +624,9 @@ def _parse_forcing_engine(self): elif self.use_lagged_ens: # Check that use_lagged_ens is only used with medium_range configuration if self.forcing_configuration != "medium_range": - logger.critical(f"Lagged ensemble run must use medium range forcing configuration. {self.forcing_configuration} configuration cannot be used for a lagged ensemble.") - raise + msg = f"Lagged ensemble run must use medium range forcing configuration. {self.forcing_configuration} configuration cannot be used for a lagged ensemble." + logger.critical(msg) + raise ValueError(msg) self.forcing_configuration_str = f"{self.forcing_configuration}_{self.lagged_ens_mem}_config.yml" else: self.forcing_configuration_str = f"{self.forcing_configuration}_config.yml" diff --git a/src/mswm/manager.py b/src/mswm/manager.py index d5a7894b..68e84d3c 100644 --- a/src/mswm/manager.py +++ b/src/mswm/manager.py @@ -6,7 +6,7 @@ import argparse from mswm.build_inputs import RealizationBuilder, validate_topoflow_glacier - +from mswm.utils.input_configuration import InputConfig def build_default(input_path: str, use_cold_start: bool = False): """ @@ -26,9 +26,10 @@ def build_calib(input_path: str): return real_path -def build_fcst(input_path: str, valid_yaml: str, fcst_run_name: str, use_cold_start: bool = False, use_warm_start: bool = False, +def build_fcst(input_path: str | None, valid_yaml: str, fcst_run_name: str, use_cold_start: bool = False, use_warm_start: bool = False, use_hindcast: bool = False, use_lagged_ens: bool = False, hind_cycle: int | None = None, prev_hind_cycle: int | None = None, - lagged_ens_mem: str | None = None, forcing_lag: int | None = None, load_state_from: str = None, save_state: bool = False): + lagged_ens_mem: str | None = None, forcing_lag: int | None = None, load_state_from: str = None, save_state: bool = False, + config_overrides: InputConfig = None): """ Call RealizationBuilder class to generate forecast realization and config files """ @@ -36,7 +37,7 @@ def build_fcst(input_path: str, valid_yaml: str, fcst_run_name: str, use_cold_st use_cold_start=use_cold_start, use_warm_start=use_warm_start, use_lagged_ens=use_lagged_ens, use_hindcast=use_hindcast, hind_cycle=hind_cycle, prev_hind_cycle=prev_hind_cycle, lagged_ens_mem=lagged_ens_mem, forcing_lag=forcing_lag, - load_state_from=load_state_from, save_state=save_state) + load_state_from=load_state_from, save_state=save_state, config_overrides=config_overrides) real_path = rb.build_fcst_realization() return real_path