diff --git a/bin_mounted/ngen_rte/configs.py b/bin_mounted/ngen_rte/configs.py index 3db8060..246544c 100644 --- a/bin_mounted/ngen_rte/configs.py +++ b/bin_mounted/ngen_rte/configs.py @@ -16,6 +16,7 @@ InputConfig, ModulePropertiesConfig, NWMOutputConfig, + DataAssimilationConfig, ParallelConfig, ) from mswm.utils.settings import DEFAULT_DATETIME_FORMAT as DDF @@ -83,6 +84,8 @@ class RTEBaseConfig(BaseModelStrict): Output format(s) for output variables. Accepts 'CSV', 'NetCDF', or both. Defaults to ["CSV"] in MSWM. hydrofab_file: str | None = Field(default=None) Optional hydrofabric file path. If provided, bypasses MSWM Icefabric server API call. + reservoir_rfc_dir: str | None = Field(default=None) + Optional path to reservoir RFC forecast time-series directory. If provided, reservoir_da is set to True and passed to DataAssimilationConfig fcst_run_name: str | None = Field(default=None) Forecast run name. cycle_datetime: datetime | None = Field(default=None) @@ -117,6 +120,7 @@ class RTEBaseConfig(BaseModelStrict): nwm_output_vars: bool = Field(default=False) output_format: list[str] | None = Field(default=None) hydrofab_file: str | None = Field(default=None) + reservoir_rfc_dir: str | None = Field(default=None) fcst_run_name: str | None = Field(default=None) cycle_datetime: datetime | None = Field(default=None) lookback: int | None = Field(default=None) @@ -500,6 +504,15 @@ def mswm_DataFileConfig(self) -> DataFileConfig: ) ) return dfc + + @property + def mswm_DataAssimilationConfig(self) -> DataAssimilationConfig: + """MSWM DataAssimilationConfig instance""" + dac = DataAssimilationConfig( + reservoir_da=bool(self.reservoir_rfc_dir), + reservoir_rfc_dir=self.reservoir_rfc_dir, + ) + return dac @property def mswm_ParallelConfig(self) -> ParallelConfig: @@ -517,6 +530,7 @@ def mswm_InputConfig(self) -> InputConfig: calibration = self.mswm_CalibConfig forcing = self.mswm_ForcingConfig data_file = self.mswm_DataFileConfig + data_assimilation = self.mswm_DataAssimilationConfig parallel = self.mswm_ParallelConfig ic = InputConfig( General=general, @@ -526,6 +540,7 @@ def mswm_InputConfig(self) -> InputConfig: Calibration=calibration, Forcing=forcing, DataFile=data_file, + DataAssimilation=data_assimilation, Parallel=parallel, ) return ic diff --git a/bin_mounted/ngen_rte/run_config/cli_args.py b/bin_mounted/ngen_rte/run_config/cli_args.py index e7ac1c2..56f3292 100644 --- a/bin_mounted/ngen_rte/run_config/cli_args.py +++ b/bin_mounted/ngen_rte/run_config/cli_args.py @@ -530,3 +530,18 @@ def add_arg(parser: argparse.ArgumentParser, arg: ArgsKwargs) -> None: Script.REGIONALIZATION, ], ) + +RESERVOIR_RFC_DIR = ArgsKwargs( + args=["-rfc", "--reservoir_rfc_dir"], + kwargs={ + "type": str, + "default": None, + "help": "Path to reservoir RFC forecast time-series directory. If provided," + "reservoir data assimilation is enabled and reservoir_da is set to True.", + }, + scripts=[ + Script.FORECAST, + Script.DEFAULT, + Script.REGIONALIZATION, + ], +) diff --git a/run_default.sh b/run_default.sh index 9169c2f..7e656d7 100755 --- a/run_default.sh +++ b/run_default.sh @@ -53,6 +53,10 @@ docker_run python -um "ngen_rte.run_default" -n 2 -fconfig "medium_range_blend" # docker_run python -um "ngen_rte.run_default" -n 2 -fconfig "aorc" -dt "2013-07-25 00:00:00" -dur 2 -rname "default_aorc" -mf "snow-17,noah-owp-modular,smp,lasam,t-route" -rz "true" # docker_run python -um "ngen_rte.run_default" -n 2 -fconfig "aorc" -dt "2013-07-25 00:00:00" -dur 2 -rname "default_aorc" --output_format CSV NetCDF +# Reservoir RFC Data Assimilation (RFC reservoir test data only valid at "2026-07-13 12:00:00") +# docker_run python -um "ngen_rte.run_default" -n 2 -fconfig "short_range" -dt "2026-07-13 12:00:00" -rname "default_sr" -g "01205500" -rfc /ngwpc/run_ngen/data/rfc/reservoirs/timeseries/ +# docker_run python -um "ngen_rte.run_default" -n 2 -fconfig "short_range" -dt "2026-07-13 12:00:00" -rname "default_sr_no_da" -g "01205500" + # State saving and loading docker_run python -um "ngen_rte.run_default" -n 2 -fconfig "standard_ana" -dt "2026-03-30 06:00:00" -rname "default_ana" --save_state --save_state_dir /ngwpc/run_ngen/default/default_ana/${TEST_GAGE}/state_save_directory/ docker_run python -um "ngen_rte.run_default" -n 2 -fconfig "standard_ana" -dt "2026-03-30 06:00:00" -rname "default_ana" --save_state diff --git a/run_fcst.sh b/run_fcst.sh index 5a389e9..8778c7f 100755 --- a/run_fcst.sh +++ b/run_fcst.sh @@ -61,4 +61,7 @@ docker_run python -um "ngen_rte.run_forecast" -dt "2025-09-15 00:00:00" -rname " # docker_run python -um "ngen_rte.run_forecast" -n 2 -dt "2025-09-15 00:00:00" -rname "${fcst_run_name}_mr_le" -fconfig medium_range -le "mem5" "" "" # docker_run python -um "ngen_rte.run_forecast" -n 2 -dt "2025-09-15 00:00:00" -rname "${fcst_run_name}_mr_le" -fconfig medium_range -le "mem6" "" "" +# Reservoir RFC DA (RFC reservoir test data only valid at "2026-07-13 12:00:00", default 01123000 gage does not have a reservoir) +# docker_run python -um "ngen_rte.run_forecast" -dt "2025-07-13 12:00:00" -rname "${fcst_run_name}_short" -fconfig short_range -rfc /ngwpc/run_ngen/data/rfc/reservoirs/timeseries/ + exit 0 diff --git a/run_region_standalone.sh b/run_region_standalone.sh index c0ad526..d8e3ee1 100755 --- a/run_region_standalone.sh +++ b/run_region_standalone.sh @@ -49,6 +49,9 @@ docker_run python -um "ngen_rte.run_regionalization_standalone" -n 2 -faf "${TES # Medium Range docker_run python -um "ngen_rte.run_regionalization_standalone" -n 2 -faf "${TEST_FORM_ASSIGN_GAGE}" -cgf "${TEST_CAT_GRP_GAGE}" -fconfig "medium_range_blend" -dt "2026-03-30 06:00:00" -rname "region_mr" +# Reservoir RFC DA (RFC reservoir test data only valid at "2026-07-13 12:00:00", default gage 01123000 does not have a reservoir) +docker_run python -um "ngen_rte.run_regionalization_standalone" -n 2 -faf "${TEST_FORM_ASSIGN_VPU}" -cgf "${TEST_CAT_GRP_VPU}" -fconfig "short_range" -dt "2026-07-13 12:00:00" -rname "region_sr" -rfc /ngwpc/run_ngen/data/rfc/reservoirs/timeseries/ -v "03S" + # Medium Range Lagged Ensemble # docker_run python -um "ngen_rte.run_regionalization_standalone" -n 2 -faf "${TEST_FORM_ASSIGN_GAGE}" -cgf "${TEST_CAT_GRP_GAGE}" -fconfig "medium_range" -dt "2026-03-30 06:00:00" -rname "region_mr_le" -le "no_da" "" "" # docker_run python -um "ngen_rte.run_regionalization_standalone" -n 2 -faf "${TEST_FORM_ASSIGN_GAGE}" -cgf "${TEST_CAT_GRP_GAGE}" -fconfig "medium_range" -dt "2026-03-30 06:00:00" -rname "region_mr_le" -le "mem1" "" "" diff --git a/setup_data.sh b/setup_data.sh index de7c983..eeba3b5 100755 --- a/setup_data.sh +++ b/setup_data.sh @@ -52,5 +52,8 @@ s3_sync "${SOURCE_BUCKET_DEV}/${SOURCE_PREFIX_ROOT}/calib_params_tab_delimited" # Download ESMF mesh files for NWM forcing (CONUS and oCONUS) s3_sync "${SOURCE_BUCKET_DEV}/${SOURCE_PREFIX_ROOT}/esmf/esmf_mesh" "${RUN_NGEN_ROOT__HOST}/data/esmf_mesh" +# Download RFC reservoir gage timeseries data +s3_sync "${SOURCE_BUCKET_DEV}/${SOURCE_PREFIX_ROOT}/rfc/reservoirs/timeseries" "${RUN_NGEN_ROOT__HOST}/data/rfc/reservoirs/timeseries" + set -x exit 0