From 37a8783b34445bfb56532db29f62f8ee02d8ec6b Mon Sep 17 00:00:00 2001 From: Max Kipp Date: Mon, 27 Apr 2026 09:59:25 -0400 Subject: [PATCH 01/18] Add consts file for tests --- tests/esmf_regrid/test_esmf_regrid.py | 36 ++++++++++------------- tests/geomod/test_geomod.py | 21 ++++--------- tests/input_forcing/test_input_forcing.py | 21 ++++--------- tests/test_consts.py | 13 ++++++++ tests/test_utils.py | 2 ++ 5 files changed, 40 insertions(+), 53 deletions(-) create mode 100644 tests/test_consts.py diff --git a/tests/esmf_regrid/test_esmf_regrid.py b/tests/esmf_regrid/test_esmf_regrid.py index f747f933..a1901c5f 100644 --- a/tests/esmf_regrid/test_esmf_regrid.py +++ b/tests/esmf_regrid/test_esmf_regrid.py @@ -18,18 +18,14 @@ test_utils = importlib.util.module_from_spec(spec) spec.loader.exec_module(test_utils) +consts = test_utils.test_consts + ClassAttrFetcher = test_utils.ClassAttrFetcher ### This disables a LOG call which was causing a crash at ioMod.py: LOG.debug(f"Wgrib2 command: {Wgrib2Cmd}", True) os.environ["MFE_SILENT"] = "true" -RETRO_FORCING_CONFIG_FILE__AORC_CONUS = ( - "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/configs/aorc_config.yml" -) -FORECAST_FORCING_CONFIG_FILE__SHORT_RANGE_CONUS = "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/configs/short_range_config.yml" - - ### These are output arrays which can contain extra unused elements which need to be removed during an equality check. REGRID_ARRAYS_TO_TRIM_EXTRA_ELEMENTS: tuple[str] = ( "regridded_forcings1", @@ -63,11 +59,9 @@ ### for example "element_ids" (for hydrofabric discretization, these are catchment IDs). EXTRA_ATTRS: tuple[ClassAttrFetcher] = (ClassAttrFetcher("geo_meta", "element_ids"),) -COMPOSITE_KEYS_TO_CHECK: tuple[str] = REGRID_KEYS_TO_CHECK + tuple( +COMPOSITE_KEYS_TO_CHECK__REGRID: tuple[str] = REGRID_KEYS_TO_CHECK + tuple( _.results_key_name for _ in EXTRA_ATTRS ) -GRID_TYPE = "hydrofabric" # ["gridded","hydrofabric","unstructured"] -KEYS_TO_EXCLUDE = ("uid64",) @pytest.mark.parametrize( @@ -75,33 +69,33 @@ [ ( regrid_aorc_aws, - RETRO_FORCING_CONFIG_FILE__AORC_CONUS, + consts.RETRO_FORCING_CONFIG_FILE__AORC_CONUS, 12, EXTRA_ATTRS, REGRID_ARRAYS_TO_TRIM_EXTRA_ELEMENTS, - COMPOSITE_KEYS_TO_CHECK, - KEYS_TO_EXCLUDE, - GRID_TYPE, + COMPOSITE_KEYS_TO_CHECK__REGRID, + consts.KEYS_TO_EXCLUDE, + consts.GRID_TYPE, ), ( regrid_conus_hrrr, - FORECAST_FORCING_CONFIG_FILE__SHORT_RANGE_CONUS, + consts.FORECAST_FORCING_CONFIG_FILE__SHORT_RANGE_CONUS, 5, EXTRA_ATTRS, REGRID_ARRAYS_TO_TRIM_EXTRA_ELEMENTS, - COMPOSITE_KEYS_TO_CHECK, - KEYS_TO_EXCLUDE, - GRID_TYPE, + COMPOSITE_KEYS_TO_CHECK__REGRID, + consts.KEYS_TO_EXCLUDE, + consts.GRID_TYPE, ), ( regrid_conus_rap, - FORECAST_FORCING_CONFIG_FILE__SHORT_RANGE_CONUS, + consts.FORECAST_FORCING_CONFIG_FILE__SHORT_RANGE_CONUS, 6, EXTRA_ATTRS, REGRID_ARRAYS_TO_TRIM_EXTRA_ELEMENTS, - COMPOSITE_KEYS_TO_CHECK, - KEYS_TO_EXCLUDE, - GRID_TYPE, + COMPOSITE_KEYS_TO_CHECK__REGRID, + consts.KEYS_TO_EXCLUDE, + consts.GRID_TYPE, ), ], indirect=True, diff --git a/tests/geomod/test_geomod.py b/tests/geomod/test_geomod.py index 85004048..32251162 100644 --- a/tests/geomod/test_geomod.py +++ b/tests/geomod/test_geomod.py @@ -11,28 +11,17 @@ test_utils = importlib.util.module_from_spec(spec) spec.loader.exec_module(test_utils) - -### This disables a LOG call which was causing a crash at ioMod.py: LOG.debug(f"Wgrib2 command: {Wgrib2Cmd}", True) -os.environ["MFE_SILENT"] = "true" - - -RETRO_FORCING_CONFIG_FILE__AORC_CONUS = ( - "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/configs/aorc_config.yml" -) -FORECAST_FORCING_CONFIG_FILE__SHORT_RANGE_CONUS = "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/configs/short_range_config.yml" -COMPOSITE_KEYS_TO_CHECK = () -GRID_TYPE = "hydrofabric" # ["gridded","hydrofabric","unstructured"] -KEYS_TO_EXCLUDE = ("uid64",) +consts = test_utils.test_consts @pytest.mark.parametrize( "bmi_forcing_fixture_geomod", [ ( - RETRO_FORCING_CONFIG_FILE__AORC_CONUS, - COMPOSITE_KEYS_TO_CHECK, - KEYS_TO_EXCLUDE, - GRID_TYPE, + consts.RETRO_FORCING_CONFIG_FILE__AORC_CONUS, + consts.COMPOSITE_KEYS_TO_CHECK, + consts.KEYS_TO_EXCLUDE, + consts.GRID_TYPE, ) ], indirect=True, diff --git a/tests/input_forcing/test_input_forcing.py b/tests/input_forcing/test_input_forcing.py index 481e5225..c6258a4a 100644 --- a/tests/input_forcing/test_input_forcing.py +++ b/tests/input_forcing/test_input_forcing.py @@ -11,28 +11,17 @@ test_utils = importlib.util.module_from_spec(spec) spec.loader.exec_module(test_utils) - -### This disables a LOG call which was causing a crash at ioMod.py: LOG.debug(f"Wgrib2 command: {Wgrib2Cmd}", True) -os.environ["MFE_SILENT"] = "true" - - -RETRO_FORCING_CONFIG_FILE__AORC_CONUS = ( - "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/configs/aorc_config.yml" -) -FORECAST_FORCING_CONFIG_FILE__SHORT_RANGE_CONUS = "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/configs/short_range_config.yml" -COMPOSITE_KEYS_TO_CHECK = () -GRID_TYPE = "hydrofabric" # ["gridded","hydrofabric","unstructured"] -KEYS_TO_EXCLUDE = ("uid64",) +consts = test_utils.test_consts @pytest.mark.parametrize( "bmi_forcing_fixture_input_forcing", [ ( - RETRO_FORCING_CONFIG_FILE__AORC_CONUS, - COMPOSITE_KEYS_TO_CHECK, - KEYS_TO_EXCLUDE, - GRID_TYPE, + consts.RETRO_FORCING_CONFIG_FILE__AORC_CONUS, + consts.COMPOSITE_KEYS_TO_CHECK, + consts.KEYS_TO_EXCLUDE, + consts.GRID_TYPE, 12, ) ], diff --git a/tests/test_consts.py b/tests/test_consts.py new file mode 100644 index 00000000..8bb8b4b3 --- /dev/null +++ b/tests/test_consts.py @@ -0,0 +1,13 @@ +import os + +### This disables a LOG call which was causing a crash at ioMod.py: LOG.debug(f"Wgrib2 command: {Wgrib2Cmd}", True) +os.environ["MFE_SILENT"] = "true" + + +RETRO_FORCING_CONFIG_FILE__AORC_CONUS = ( + "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/configs/aorc_config.yml" +) +FORECAST_FORCING_CONFIG_FILE__SHORT_RANGE_CONUS = "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/configs/short_range_config.yml" +COMPOSITE_KEYS_TO_CHECK = () +GRID_TYPE = "hydrofabric" # ["gridded","hydrofabric","unstructured"] +KEYS_TO_EXCLUDE = ("uid64",) diff --git a/tests/test_utils.py b/tests/test_utils.py index 513f4a76..77070ba7 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -31,6 +31,8 @@ serialize_to_json, ) +import test_consts # noqa: F401 # Used by test implementations, more convenient to have it in here rather than using more importlib + try: import esmpy as ESMF except ImportError: From d0897131201f2e384b79819677dd17f449e54ae5 Mon Sep 17 00:00:00 2001 From: Max Kipp Date: Wed, 29 Apr 2026 15:09:05 -0400 Subject: [PATCH 02/18] Improve test configuration to prepare for adding more tests --- tests/conftest.py | 103 ++++++++-------------- tests/esmf_regrid/test_esmf_regrid.py | 82 ++++++++--------- tests/geomod/test_geomod.py | 24 ++--- tests/input_forcing/test_input_forcing.py | 24 ++--- tests/test_config_classes.py | 39 ++++++++ tests/test_utils.py | 6 +- 6 files changed, 145 insertions(+), 133 deletions(-) create mode 100644 tests/test_config_classes.py diff --git a/tests/conftest.py b/tests/conftest.py index b1ed84ae..df83965f 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,6 +1,7 @@ """Conventional pytest file conftest.py. Automatically discovered and implicitly imported by pytest.""" import pytest + from test_utils import ( BMIForcingFixture, BMIForcingFixture_GeoMod, @@ -8,6 +9,13 @@ BMIForcingFixture_Regrid, ) +from test_config_classes import ( + TestConfig_Base, + TestConfig_GeoMod, + TestConfig_InputForcing, + TestConfig_Regrid, +) + from NextGen_Forcings_Engine_BMI.NextGen_Forcings_Engine.bmi_model import ( BMIMODEL, NWMv3_Forcing_Engine_BMI_model, @@ -25,14 +33,10 @@ def bmi_forcing_fixture(request) -> BMIForcingFixture: request: A built-in convention for pytest.fixture. It may be passed from @pytest.mark.parametrize usage elsewhere. """ - (config_file,) = request.param + cfg = request.param + assert isinstance(cfg, TestConfig_Base) bmi_model = NWMv3_Forcing_Engine_BMI_model() - bmi_model.initialize_with_params( - config_file=config_file, - b_date=None, - geogrid=None, - output_path=None, - ) + bmi_model.initialize_with_params(config_file=cfg.config_file) return BMIForcingFixture(bmi_model=bmi_model) @@ -49,32 +53,19 @@ def bmi_forcing_fixture_regrid( request: A built-in convention for pytest.fixture. It may be passed from @pytest.mark.parametrize usage elsewhere. """ - ( - regrid_func, - config_file, - force_key, - extra_attrs, - regrid_arrays_to_trim_extra_elements, - keys_to_check, - keys_to_exclude, - grid_type, - ) = request.param - - bmi_model = BMIMODEL[grid_type]() - bmi_model.initialize_with_params( - config_file=config_file, - b_date=None, - geogrid=None, - output_path=None, - ) + cfg = request.param + assert isinstance(cfg, TestConfig_Regrid) + + bmi_model = BMIMODEL[cfg.grid_type]() + bmi_model.initialize_with_params(config_file=cfg.config_file) return BMIForcingFixture_Regrid( bmi_model=bmi_model, - regrid_func=regrid_func, - force_key=force_key, - keys_to_exclude=keys_to_exclude, - extra_attrs=extra_attrs, - regrid_arrays_to_trim_extra_elements=regrid_arrays_to_trim_extra_elements, - keys_to_check=keys_to_check, + regrid_func=cfg.regrid_func, + force_key=cfg.force_key, + keys_to_exclude=cfg.keys_to_exclude, + extra_attrs=cfg.extra_attrs, + regrid_arrays_to_trim_extra_elements=cfg.regrid_arrays_to_trim_extra_elements, + keys_to_check=cfg.keys_to_check, ) @@ -92,24 +83,15 @@ def bmi_forcing_fixture_geomod( request: A built-in convention for pytest.fixture. It may be passed from @pytest.mark.parametrize usage elsewhere. """ - ( - config_file, - keys_to_check, - keys_to_exclude, - grid_type, - ) = request.param - - bmi_model = BMIMODEL[grid_type]() - bmi_model.initialize_with_params( - config_file=config_file, - b_date=None, - geogrid=None, - output_path=None, - ) + cfg = request.param + assert isinstance(cfg, TestConfig_GeoMod) + + bmi_model = BMIMODEL[cfg.grid_type]() + bmi_model.initialize_with_params(config_file=cfg.config_file) return BMIForcingFixture_GeoMod( bmi_model=bmi_model, - keys_to_check=keys_to_check, - keys_to_exclude=keys_to_exclude, + keys_to_check=cfg.keys_to_check, + keys_to_exclude=cfg.keys_to_exclude, ) @@ -137,21 +119,12 @@ def bmi_forcing_fixture_input_forcing( request: A built-in convention for pytest.fixture. It may be passed from @pytest.mark.parametrize usage elsewhere. """ - ( - config_file, - keys_to_check, - keys_to_exclude, - grid_type, - force_key, - ) = request.param - - bmi_model = BMIMODEL[grid_type]() - bmi_model.initialize_with_params( - config_file=config_file, - b_date=None, - geogrid=None, - output_path=None, - ) + cfg = request.param + assert isinstance(cfg, TestConfig_InputForcing) + + bmi_model = BMIMODEL[cfg.grid_type]() + bmi_model.initialize_with_params(config_file=cfg.config_file) + map_old_to_new_var_names = request.config.getoption("--map_old_to_new_var_names") if map_old_to_new_var_names == "True" or map_old_to_new_var_names is True: map_old_to_new_var_names = True @@ -164,8 +137,8 @@ def bmi_forcing_fixture_input_forcing( return BMIForcingFixture_InputForcing( bmi_model=bmi_model, - keys_to_check=keys_to_check, - keys_to_exclude=keys_to_exclude, - force_key=force_key, + keys_to_check=cfg.keys_to_check, + keys_to_exclude=cfg.keys_to_exclude, + force_key=cfg.force_key, map_old_to_new_var_names=map_old_to_new_var_names, ) diff --git a/tests/esmf_regrid/test_esmf_regrid.py b/tests/esmf_regrid/test_esmf_regrid.py index a1901c5f..5d04038f 100644 --- a/tests/esmf_regrid/test_esmf_regrid.py +++ b/tests/esmf_regrid/test_esmf_regrid.py @@ -1,5 +1,4 @@ import importlib.util -import logging import os import pytest @@ -19,8 +18,7 @@ spec.loader.exec_module(test_utils) consts = test_utils.test_consts - -ClassAttrFetcher = test_utils.ClassAttrFetcher +configs = test_utils.test_config_classes ### This disables a LOG call which was causing a crash at ioMod.py: LOG.debug(f"Wgrib2 command: {Wgrib2Cmd}", True) os.environ["MFE_SILENT"] = "true" @@ -57,49 +55,53 @@ ### While the InputForcings class instance is the primary source of test results data, ### this is used to add supplemental attributes to the results data, ### for example "element_ids" (for hydrofabric discretization, these are catchment IDs). -EXTRA_ATTRS: tuple[ClassAttrFetcher] = (ClassAttrFetcher("geo_meta", "element_ids"),) +EXTRA_ATTRS = [ + test_utils.ClassAttrFetcher("geo_meta", "element_ids"), +] COMPOSITE_KEYS_TO_CHECK__REGRID: tuple[str] = REGRID_KEYS_TO_CHECK + tuple( _.results_key_name for _ in EXTRA_ATTRS ) -@pytest.mark.parametrize( - "bmi_forcing_fixture_regrid", - [ - ( - regrid_aorc_aws, - consts.RETRO_FORCING_CONFIG_FILE__AORC_CONUS, - 12, - EXTRA_ATTRS, - REGRID_ARRAYS_TO_TRIM_EXTRA_ELEMENTS, - COMPOSITE_KEYS_TO_CHECK__REGRID, - consts.KEYS_TO_EXCLUDE, - consts.GRID_TYPE, - ), - ( - regrid_conus_hrrr, - consts.FORECAST_FORCING_CONFIG_FILE__SHORT_RANGE_CONUS, - 5, - EXTRA_ATTRS, - REGRID_ARRAYS_TO_TRIM_EXTRA_ELEMENTS, - COMPOSITE_KEYS_TO_CHECK__REGRID, - consts.KEYS_TO_EXCLUDE, - consts.GRID_TYPE, - ), - ( - regrid_conus_rap, - consts.FORECAST_FORCING_CONFIG_FILE__SHORT_RANGE_CONUS, - 6, - EXTRA_ATTRS, - REGRID_ARRAYS_TO_TRIM_EXTRA_ELEMENTS, - COMPOSITE_KEYS_TO_CHECK__REGRID, - consts.KEYS_TO_EXCLUDE, - consts.GRID_TYPE, - ), - ], - indirect=True, -) +CONFIG_KWARGS_COMMON = { + "extra_attrs": EXTRA_ATTRS, + "regrid_arrays_to_trim_extra_elements": REGRID_ARRAYS_TO_TRIM_EXTRA_ELEMENTS, + "keys_to_check": COMPOSITE_KEYS_TO_CHECK__REGRID, + "keys_to_exclude": consts.KEYS_TO_EXCLUDE, + "grid_type": consts.GRID_TYPE, +} + + +TEST_CONFIGS = [ + configs.TestConfig_Regrid( + **CONFIG_KWARGS_COMMON + | { + "regrid_func": regrid_aorc_aws, + "force_key": 12, + "config_file": consts.RETRO_FORCING_CONFIG_FILE__AORC_CONUS, + } + ), + configs.TestConfig_Regrid( + **CONFIG_KWARGS_COMMON + | { + "regrid_func": regrid_conus_hrrr, + "force_key": 5, + "config_file": consts.FORECAST_FORCING_CONFIG_FILE__SHORT_RANGE_CONUS, + } + ), + configs.TestConfig_Regrid( + **CONFIG_KWARGS_COMMON + | { + "regrid_func": regrid_conus_rap, + "force_key": 6, + "config_file": consts.FORECAST_FORCING_CONFIG_FILE__SHORT_RANGE_CONUS, + } + ), +] + + +@pytest.mark.parametrize("bmi_forcing_fixture_regrid", TEST_CONFIGS, indirect=True) def test_regrid( bmi_forcing_fixture_regrid: test_utils.BMIForcingFixture_Regrid, # pyright: ignore ) -> None: diff --git a/tests/geomod/test_geomod.py b/tests/geomod/test_geomod.py index 32251162..911ff144 100644 --- a/tests/geomod/test_geomod.py +++ b/tests/geomod/test_geomod.py @@ -12,20 +12,20 @@ spec.loader.exec_module(test_utils) consts = test_utils.test_consts +configs = test_utils.test_config_classes -@pytest.mark.parametrize( - "bmi_forcing_fixture_geomod", - [ - ( - consts.RETRO_FORCING_CONFIG_FILE__AORC_CONUS, - consts.COMPOSITE_KEYS_TO_CHECK, - consts.KEYS_TO_EXCLUDE, - consts.GRID_TYPE, - ) - ], - indirect=True, -) +TEST_CONFIGS = [ + configs.TestConfig_GeoMod( + config_file=consts.RETRO_FORCING_CONFIG_FILE__AORC_CONUS, + keys_to_check=consts.COMPOSITE_KEYS_TO_CHECK, + keys_to_exclude=consts.KEYS_TO_EXCLUDE, + grid_type=consts.GRID_TYPE, + ), +] + + +@pytest.mark.parametrize("bmi_forcing_fixture_geomod", TEST_CONFIGS, indirect=True) def test_geomod( bmi_forcing_fixture_geomod: test_utils.BMIForcingFixture_GeoMod, # pyright: ignore ) -> None: diff --git a/tests/input_forcing/test_input_forcing.py b/tests/input_forcing/test_input_forcing.py index c6258a4a..70f50bee 100644 --- a/tests/input_forcing/test_input_forcing.py +++ b/tests/input_forcing/test_input_forcing.py @@ -12,20 +12,22 @@ spec.loader.exec_module(test_utils) consts = test_utils.test_consts +configs = test_utils.test_config_classes + + +TEST_CONFIGS = [ + configs.TestConfig_InputForcing( + config_file=consts.RETRO_FORCING_CONFIG_FILE__AORC_CONUS, + keys_to_check=consts.COMPOSITE_KEYS_TO_CHECK, + keys_to_exclude=consts.KEYS_TO_EXCLUDE, + grid_type=consts.GRID_TYPE, + force_key=12, + ), +] @pytest.mark.parametrize( - "bmi_forcing_fixture_input_forcing", - [ - ( - consts.RETRO_FORCING_CONFIG_FILE__AORC_CONUS, - consts.COMPOSITE_KEYS_TO_CHECK, - consts.KEYS_TO_EXCLUDE, - consts.GRID_TYPE, - 12, - ) - ], - indirect=True, + "bmi_forcing_fixture_input_forcing", TEST_CONFIGS, indirect=True ) def test_input_forcing( bmi_forcing_fixture_input_forcing: test_utils.BMIForcingFixture_InputForcing, # pyright: ignore diff --git a/tests/test_config_classes.py b/tests/test_config_classes.py new file mode 100644 index 00000000..8d9fa962 --- /dev/null +++ b/tests/test_config_classes.py @@ -0,0 +1,39 @@ +from __future__ import annotations + +from dataclasses import dataclass +import typing + +if typing.TYPE_CHECKING: + from test_utils import ClassAttrFetcher + + +@dataclass +class TestConfig_Base: + """Configuration base class for tests""" + + config_file: str + keys_to_check: tuple[str] + keys_to_exclude: tuple[str] + grid_type: str + + +@dataclass +class TestConfig_GeoMod(TestConfig_Base): + """Configuration class for GeoMod Tests""" + + +@dataclass +class TestConfig_InputForcing(TestConfig_Base): + """Configuration class for InputForcing Tests""" + + force_key: int + + +@dataclass +class TestConfig_Regrid(TestConfig_Base): + """Configuration class for Regrid Tests""" + + force_key: int + regrid_func: typing.Callable + extra_attrs: list[ClassAttrFetcher] + regrid_arrays_to_trim_extra_elements: tuple[str] diff --git a/tests/test_utils.py b/tests/test_utils.py index 77070ba7..fc8b86c3 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -32,11 +32,7 @@ ) import test_consts # noqa: F401 # Used by test implementations, more convenient to have it in here rather than using more importlib - -try: - import esmpy as ESMF -except ImportError: - import ESMF +import test_config_classes # noqa: F401 # Used by test implementations, more convenient to have it in here rather than using more importlib OS_VAR__CREATE_TEST_EXPECT_DATA = "FORCING_PYTEST_WRITE_TEST_EXPECTED_DATA" From d97a95d9c7b55990c3588622df0af80111c03a12 Mon Sep 17 00:00:00 2001 From: Max Kipp Date: Wed, 29 Apr 2026 15:15:55 -0400 Subject: [PATCH 03/18] Docstrings --- tests/conftest.py | 29 +++++++---------------------- 1 file changed, 7 insertions(+), 22 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index df83965f..64a31994 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -24,14 +24,10 @@ @pytest.fixture def bmi_forcing_fixture(request) -> BMIForcingFixture: - """Construct minimal class of classes for running BMI forcing. - - Constructor for minimal class of classes for running BMI forcing. - For example usage, see: tests/esmf_regrid/test_esmf_regrid.test_regrid. + """Construct class for tests. Args: request: A built-in convention for pytest.fixture. It may be passed from @pytest.mark.parametrize usage elsewhere. - """ cfg = request.param assert isinstance(cfg, TestConfig_Base) @@ -44,14 +40,11 @@ def bmi_forcing_fixture(request) -> BMIForcingFixture: def bmi_forcing_fixture_regrid( request, ) -> BMIForcingFixture_Regrid: - """Construct minimal class of callas for running forcing ESMF regrid functions. - - Constructor for minimal class of classes for running forcing ESMF regrid functions. - For example usage, see: tests/esmf_regrid/test_esmf_regrid.test_regrid. + """Construct class for tests of ESMF regrid functions. + For example usage, see: tests/esmf_regrid/test_esmf_regrid.py. Args: request: A built-in convention for pytest.fixture. It may be passed from @pytest.mark.parametrize usage elsewhere. - """ cfg = request.param assert isinstance(cfg, TestConfig_Regrid) @@ -73,15 +66,11 @@ def bmi_forcing_fixture_regrid( def bmi_forcing_fixture_geomod( request, ) -> BMIForcingFixture_GeoMod: - """Construct minimal class of classes for running forcing GeoMod. - - Constructor for minimal class of classes for running forcing GeoMod. - - For example usage, see: tests/geomod/test_geomod.test_geomod. + """Construct class for tests of GeoMod. + For example usage, see: tests/geomod/test_geomod.py. Args: request: A built-in convention for pytest.fixture. It may be passed from @pytest.mark.parametrize usage elsewhere. - """ cfg = request.param assert isinstance(cfg, TestConfig_GeoMod) @@ -109,15 +98,11 @@ def pytest_addoption(parser): def bmi_forcing_fixture_input_forcing( request, ) -> BMIForcingFixture_InputForcing: - """Construct minimal class of class for running forcing input_forcing. - - Constructor for minimal class of classes for running forcing input_forcing. - - For example usage, see: tests/forcing_input/test_forcing_input.test_forcing_input. + """Construct class for tests of input_forcing. + For example usage, see: tests/input_forcing/test_input_forcing.py. Args: request: A built-in convention for pytest.fixture. It may be passed from @pytest.mark.parametrize usage elsewhere. - """ cfg = request.param assert isinstance(cfg, TestConfig_InputForcing) From 977386d4649786f1a29e09ebf025d0dc3270bb2b Mon Sep 17 00:00:00 2001 From: Max Kipp Date: Wed, 29 Apr 2026 15:24:06 -0400 Subject: [PATCH 04/18] Update tests readme --- tests/README.md | 61 +++++++------------------------------------------ 1 file changed, 8 insertions(+), 53 deletions(-) diff --git a/tests/README.md b/tests/README.md index 57f50950..4b05a67f 100644 --- a/tests/README.md +++ b/tests/README.md @@ -37,33 +37,10 @@ The test suite is organized into the following modules: - **`test_utils.py`** - Shared test utilities and fixtures - **`conftest.py`** - Pytest configuration and shared fixtures -## Prerequisites -### Setup requirements: - 1. Create the forcing config.yml files using RTE. - 2. Enter the RTE devcontainer. - -### Required Dependencies - -The test suite requires Python 3.11 or higher. Install the package with test dependencies inside of the `dev container`: - -```bash -# From the repository root directory -pip install -e ".[develop]" -``` - -Or install pytest directly inside of the `dev container`: - -```bash -pip install pytest -``` - -### Additional Requirements - -Ensure all main package dependencies are installed inside of the `dev container` (this typically should happen when the `dev container` is built): - -```bash -pip install -e . -``` +## Prerequisite Steps + 1. Clone the nwm-rte repository + 2. Build a Docker image using nwm-rte. + 3. Enter a Dev Container using nwm-rte. ## Running Tests @@ -121,34 +98,12 @@ The test suite is configured via `pytest.ini` at the repository root: - **Verbosity**: Full trace with verbose output (`-vv`) - **Test paths**: Pre-configured to discover tests in `esmf_regrid`, `geomod`, and `input_forcing` - ## Test Data Test data is stored in the `test_data/` directory. Tests may reference files from this location for input data and expected results validation. -## Writing New Tests +## Writing New Tests or Updating Expected Results Files -When adding new tests: - -1. Place test files in the appropriate subdirectory -2. Name test files with the `test_*.py` prefix -3. Name test functions with the `test_*` prefix -4. Use fixtures from `conftest.py` for common setup -5. Place test data files in `test_data/` with descriptive names - -Example test structure: - -```python -import pytest - -def test_my_feature(): - """Test description.""" - # Arrange - input_data = ... - - # Act - result = function_under_test(input_data) - - # Assert - assert result == expected_output -``` +When adding new tests, use the OS env var `FORCING_PYTEST_WRITE_TEST_EXPECTED_DATA` +to have your new test automatically write new "expected" data to `tests/test_data/expected_results/`, +then commit those files to the repository. See above for example calls. From 2034593480cab5601ab0aaa9ad5c160ce86472ae Mon Sep 17 00:00:00 2001 From: Max Kipp Date: Wed, 29 Apr 2026 15:25:50 -0400 Subject: [PATCH 05/18] Add readme for test forcing configuration files --- tests/test_data/configs/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 tests/test_data/configs/README.md diff --git a/tests/test_data/configs/README.md b/tests/test_data/configs/README.md new file mode 100644 index 00000000..25673a1c --- /dev/null +++ b/tests/test_data/configs/README.md @@ -0,0 +1,3 @@ +This folder contains BMI forcing configuration files that are used by the tests. + +Additional configuration of the tests themselves are found within the Python test scripts. From beecc36e40ac04eb2e82d1c501dea9e556fe142e Mon Sep 17 00:00:00 2001 From: Max Kipp Date: Thu, 30 Apr 2026 14:18:36 -0400 Subject: [PATCH 06/18] Refactor test configs --- tests/conftest.py | 105 ++++++---------- tests/esmf_regrid/test_esmf_regrid.py | 3 + tests/geomod/test_geomod.py | 3 + tests/input_forcing/test_input_forcing.py | 3 + tests/test_config_classes.py | 39 ++++-- tests/test_utils.py | 140 +++++++--------------- 6 files changed, 123 insertions(+), 170 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 64a31994..de5d7de5 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -16,10 +16,33 @@ TestConfig_Regrid, ) -from NextGen_Forcings_Engine_BMI.NextGen_Forcings_Engine.bmi_model import ( - BMIMODEL, - NWMv3_Forcing_Engine_BMI_model, -) + +def pytest_addoption(parser): + """Add command line options to pytest.""" + parser.addoption( + "--map_old_to_new_var_names", + action="store", + help="Argument to specify if old variables names should be mapped to new variable names.", + ) + + +def update_cfg_with_cli_inputs(cfg: TestConfig_Base, request) -> None: + """Update the test config in-place using values passed from CLI. + Args: + cfg: An instance of a test config. + request: pytest convention. May be passed from @pytest.mark.parametrize. + """ + map_old_to_new_var_names = request.config.getoption("--map_old_to_new_var_names") + if map_old_to_new_var_names is not None: + if map_old_to_new_var_names == "True" or map_old_to_new_var_names is True: + map_old_to_new_var_names = True + elif map_old_to_new_var_names == "False" or map_old_to_new_var_names is False: + map_old_to_new_var_names = False + else: + raise ValueError( + f"Unexpected value for arg: map_old_to_new_var_names. Expected True or False; received: {map_old_to_new_var_names}" + ) + cfg.map_old_to_new_var_names = map_old_to_new_var_names @pytest.fixture @@ -31,15 +54,12 @@ def bmi_forcing_fixture(request) -> BMIForcingFixture: """ cfg = request.param assert isinstance(cfg, TestConfig_Base) - bmi_model = NWMv3_Forcing_Engine_BMI_model() - bmi_model.initialize_with_params(config_file=cfg.config_file) - return BMIForcingFixture(bmi_model=bmi_model) + update_cfg_with_cli_inputs(cfg, request) + return BMIForcingFixture(cfg) @pytest.fixture -def bmi_forcing_fixture_regrid( - request, -) -> BMIForcingFixture_Regrid: +def bmi_forcing_fixture_regrid(request) -> BMIForcingFixture_Regrid: """Construct class for tests of ESMF regrid functions. For example usage, see: tests/esmf_regrid/test_esmf_regrid.py. @@ -48,24 +68,12 @@ def bmi_forcing_fixture_regrid( """ cfg = request.param assert isinstance(cfg, TestConfig_Regrid) - - bmi_model = BMIMODEL[cfg.grid_type]() - bmi_model.initialize_with_params(config_file=cfg.config_file) - return BMIForcingFixture_Regrid( - bmi_model=bmi_model, - regrid_func=cfg.regrid_func, - force_key=cfg.force_key, - keys_to_exclude=cfg.keys_to_exclude, - extra_attrs=cfg.extra_attrs, - regrid_arrays_to_trim_extra_elements=cfg.regrid_arrays_to_trim_extra_elements, - keys_to_check=cfg.keys_to_check, - ) + update_cfg_with_cli_inputs(cfg, request) + return BMIForcingFixture_Regrid(cfg) @pytest.fixture -def bmi_forcing_fixture_geomod( - request, -) -> BMIForcingFixture_GeoMod: +def bmi_forcing_fixture_geomod(request) -> BMIForcingFixture_GeoMod: """Construct class for tests of GeoMod. For example usage, see: tests/geomod/test_geomod.py. @@ -74,30 +82,12 @@ def bmi_forcing_fixture_geomod( """ cfg = request.param assert isinstance(cfg, TestConfig_GeoMod) - - bmi_model = BMIMODEL[cfg.grid_type]() - bmi_model.initialize_with_params(config_file=cfg.config_file) - return BMIForcingFixture_GeoMod( - bmi_model=bmi_model, - keys_to_check=cfg.keys_to_check, - keys_to_exclude=cfg.keys_to_exclude, - ) - - -def pytest_addoption(parser): - """Add command line options to pytest.""" - parser.addoption( - "--map_old_to_new_var_names", - action="store", - default=True, - help="Argument to specify if old variables names should be mapped to new variable names.", - ) + update_cfg_with_cli_inputs(cfg, request) + return BMIForcingFixture_GeoMod(cfg) @pytest.fixture -def bmi_forcing_fixture_input_forcing( - request, -) -> BMIForcingFixture_InputForcing: +def bmi_forcing_fixture_input_forcing(request) -> BMIForcingFixture_InputForcing: """Construct class for tests of input_forcing. For example usage, see: tests/input_forcing/test_input_forcing.py. @@ -106,24 +96,5 @@ def bmi_forcing_fixture_input_forcing( """ cfg = request.param assert isinstance(cfg, TestConfig_InputForcing) - - bmi_model = BMIMODEL[cfg.grid_type]() - bmi_model.initialize_with_params(config_file=cfg.config_file) - - map_old_to_new_var_names = request.config.getoption("--map_old_to_new_var_names") - if map_old_to_new_var_names == "True" or map_old_to_new_var_names is True: - map_old_to_new_var_names = True - elif map_old_to_new_var_names == "False" or map_old_to_new_var_names is False: - map_old_to_new_var_names = False - else: - raise ValueError( - f"Unexpected value for arg: map_old_to_new_var_names. Expected True or False; recieved: {map_old_to_new_var_names}" - ) - - return BMIForcingFixture_InputForcing( - bmi_model=bmi_model, - keys_to_check=cfg.keys_to_check, - keys_to_exclude=cfg.keys_to_exclude, - force_key=cfg.force_key, - map_old_to_new_var_names=map_old_to_new_var_names, - ) + update_cfg_with_cli_inputs(cfg, request) + return BMIForcingFixture_InputForcing(cfg) diff --git a/tests/esmf_regrid/test_esmf_regrid.py b/tests/esmf_regrid/test_esmf_regrid.py index 5d04038f..5e23a799 100644 --- a/tests/esmf_regrid/test_esmf_regrid.py +++ b/tests/esmf_regrid/test_esmf_regrid.py @@ -20,6 +20,8 @@ consts = test_utils.test_consts configs = test_utils.test_config_classes +TEST_FILE_NAME_PREFIX = "" + ### This disables a LOG call which was causing a crash at ioMod.py: LOG.debug(f"Wgrib2 command: {Wgrib2Cmd}", True) os.environ["MFE_SILENT"] = "true" @@ -70,6 +72,7 @@ "keys_to_check": COMPOSITE_KEYS_TO_CHECK__REGRID, "keys_to_exclude": consts.KEYS_TO_EXCLUDE, "grid_type": consts.GRID_TYPE, + "test_file_name_prefix": TEST_FILE_NAME_PREFIX, } diff --git a/tests/geomod/test_geomod.py b/tests/geomod/test_geomod.py index 911ff144..ab5c5553 100644 --- a/tests/geomod/test_geomod.py +++ b/tests/geomod/test_geomod.py @@ -14,6 +14,8 @@ consts = test_utils.test_consts configs = test_utils.test_config_classes +TEST_FILE_NAME_PREFIX = "geomod" + TEST_CONFIGS = [ configs.TestConfig_GeoMod( @@ -21,6 +23,7 @@ keys_to_check=consts.COMPOSITE_KEYS_TO_CHECK, keys_to_exclude=consts.KEYS_TO_EXCLUDE, grid_type=consts.GRID_TYPE, + test_file_name_prefix=TEST_FILE_NAME_PREFIX, ), ] diff --git a/tests/input_forcing/test_input_forcing.py b/tests/input_forcing/test_input_forcing.py index 70f50bee..bbfa02f7 100644 --- a/tests/input_forcing/test_input_forcing.py +++ b/tests/input_forcing/test_input_forcing.py @@ -14,6 +14,8 @@ consts = test_utils.test_consts configs = test_utils.test_config_classes +TEST_FILE_NAME_PREFIX = "input_forcing" + TEST_CONFIGS = [ configs.TestConfig_InputForcing( @@ -22,6 +24,7 @@ keys_to_exclude=consts.KEYS_TO_EXCLUDE, grid_type=consts.GRID_TYPE, force_key=12, + test_file_name_prefix=TEST_FILE_NAME_PREFIX, ), ] diff --git a/tests/test_config_classes.py b/tests/test_config_classes.py index 8d9fa962..f7df9406 100644 --- a/tests/test_config_classes.py +++ b/tests/test_config_classes.py @@ -7,31 +7,54 @@ from test_utils import ClassAttrFetcher -@dataclass +@dataclass(kw_only=True) class TestConfig_Base: - """Configuration base class for tests""" - + """Configuration base class for tests. + + Args: + test_file_name_prefix: Affects the test data results file names (expected and actual) + config_file: Forcing configuration file, e.g. "ngen-forcing/tests/test_data/configs/standard_ana_config.yml" + keys_to_check: The keys to check + keys_to_exclude: The keys to exclude from the test results json and from equality checks, for example because they contain non-deterministic values or values that are not relevant to the test. + grid_type: e.g. "hydrofabric" + map_old_to_new_var_names: Whether to map old variable names to new variable names in the expected results data, which is needed when updating the test expected outputs dataset but should be false for regular test runs. + Note: this is overridden by a CLI arg. See `pytest_addoption` in `conftest.py` for details. + """ + + test_file_name_prefix: str config_file: str keys_to_check: tuple[str] keys_to_exclude: tuple[str] grid_type: str + map_old_to_new_var_names: bool = True -@dataclass +@dataclass(kw_only=True) class TestConfig_GeoMod(TestConfig_Base): """Configuration class for GeoMod Tests""" -@dataclass +@dataclass(kw_only=True) class TestConfig_InputForcing(TestConfig_Base): - """Configuration class for InputForcing Tests""" + """Configuration class for InputForcing Tests. + + Args: + force_key: Force key to check (often associated with a particular source dataset) + """ force_key: int -@dataclass +@dataclass(kw_only=True) class TestConfig_Regrid(TestConfig_Base): - """Configuration class for Regrid Tests""" + """Configuration class for Regrid Tests. + + Args: + force_key: Should agree with the regrid function being tested, e.g. see ginputfunc.forcing_map + regrid_func: The regrid function that is being tested. + extra_attrs: These are extra attributes to be added to the test results JSON, to supplement the primary InputForcings attributes. + regrid_arrays_to_trim_extra_elements: These are output arrays which can contain extra unused elements which need to be removed during an equality check. + """ force_key: int regrid_func: typing.Callable diff --git a/tests/test_utils.py b/tests/test_utils.py index fc8b86c3..b288c5ee 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -31,8 +31,16 @@ serialize_to_json, ) +from NextGen_Forcings_Engine_BMI.NextGen_Forcings_Engine.bmi_model import BMIMODEL + import test_consts # noqa: F401 # Used by test implementations, more convenient to have it in here rather than using more importlib import test_config_classes # noqa: F401 # Used by test implementations, more convenient to have it in here rather than using more importlib +from test_config_classes import ( + TestConfig_Base, + TestConfig_GeoMod, + TestConfig_InputForcing, + TestConfig_Regrid, +) OS_VAR__CREATE_TEST_EXPECT_DATA = "FORCING_PYTEST_WRITE_TEST_EXPECTED_DATA" @@ -197,39 +205,33 @@ class BMIForcingFixture: For example usage, see: tests/esmf_regrid/test_esmf_regrid.test_regrid. """ - def __init__(self, bmi_model: NWMv3_Forcing_Engine_BMI_model_Base) -> None: + def __init__(self, cfg: TestConfig_Base) -> None: """Initialize BMIForcingFixture.""" - self.bmi_model: NWMv3_Forcing_Engine_BMI_model_Base = bmi_model - self.mpi_config: MpiConfig = bmi_model._mpi_meta - self.config_options: ConfigOptions = bmi_model._job_meta - self.geo_meta: GeoMeta = bmi_model.geo_meta + self.bmi_model: NWMv3_Forcing_Engine_BMI_model_Base = BMIMODEL[cfg.grid_type]() + self.bmi_model.initialize_with_params(config_file=cfg.config_file) + + self.mpi_config: MpiConfig = self.bmi_model._mpi_meta + self.config_options: ConfigOptions = self.bmi_model._job_meta + self.geo_meta: GeoMeta = self.bmi_model.geo_meta self.input_forcing_mod: dict = self.bmi_model._input_forcing_mod + self.keys_to_check = cfg.keys_to_check + self.keys_to_exclude = cfg.keys_to_exclude + self.map_old_to_new_var_names = cfg.map_old_to_new_var_names + self.test_file_name_prefix = cfg.test_file_name_prefix + class BMIForcingFixture_Class(BMIForcingFixture): """Test fixture for Class-based tests.""" - def __init__( - self, - bmi_model: NWMv3_Forcing_Engine_BMI_model_Base, - keys_to_check: tuple[str] = (), - keys_to_exclude: tuple[str] = (), - map_old_to_new_var_names: bool = True, - ) -> None: + def __init__(self, cfg: TestConfig_Base) -> None: """Initialize BMIForcingFixture_Class. Args: ---- - bmi_model: The BMI model to be used in the test fixture - keys_to_check: The keys to check - keys_to_exclude: The keys to exclude from the test results json and from equality checks, for example because they contain non-deterministic values or values that are not relevant to the test. - map_old_to_new_var_names: Whether to map old variable names to new variable names in the expected results data, which is needed when updating the test expected outputs dataset but should be false for regular test runs. + cfg: an instance of TestConfig_Base """ - super().__init__(bmi_model=bmi_model) - - self.keys_to_check = keys_to_check - self.keys_to_exclude = keys_to_exclude - self.map_old_to_new_var_names = map_old_to_new_var_names + super().__init__(cfg) self.expected_sub_dir = "test_data/expected_results" self.actual_sub_dir = "test_data/actual_results" @@ -308,6 +310,7 @@ def after_intitialization_check(self) -> None: This is useful for checking the state of the model immediately after initialization, before any updates have occurred. """ + logging.info("Starting after_intitialization_check()...") self.compare(self.deserial_actual("init"), self.deserial_expected("init")) def compare(self, actual: dict, expected: dict) -> None: @@ -339,6 +342,7 @@ def after_bmi_model_update(self, current_output_step: int) -> None: current_output_step: The current output step, which can be used to conditionally run different checks on the first step vs subsequent steps, since the first step behaves differently in some ways. """ + logging.info("Starting after_bmi_model_update()...") self.compare( self.deserial_actual("after_update", f"_step_{current_output_step}"), self.deserial_expected("after_update", f"_step_{current_output_step}"), @@ -346,6 +350,7 @@ def after_bmi_model_update(self, current_output_step: int) -> None: def after_finalize(self) -> None: """Run checks after bmi_model.finalize() has been called.""" + logging.info("Starting after_finalize()...") self.compare( self.deserial_actual("finalize"), self.deserial_expected("finalize") ) @@ -366,75 +371,32 @@ def expected_results_file_path( class BMIForcingFixture_GeoMod(BMIForcingFixture_Class): """Test fixture for GeoMod tests.""" - def __init__( - self, - bmi_model: NWMv3_Forcing_Engine_BMI_model_Base, - keys_to_check: tuple = (), - keys_to_exclude: tuple = (), - ) -> None: + def __init__(self, cfg: TestConfig_GeoMod) -> None: """Initialize BMIForcingFixture_GeoMod. Args: - ---- - bmi_model: the BMI model to be used in the test fixture - keys_to_chek: The keys to check - keys_to_exclude: The keys to exclude from the test results json and from equality checks, for example because they contain non-deterministic values or values that are not relevant to the test. - + cfg: an instance of TestConfig_GeoMod """ - super().__init__( - bmi_model=bmi_model, - keys_to_check=keys_to_check, - keys_to_exclude=keys_to_exclude, - ) + super().__init__(cfg) self.test_class = self.geo_meta - self.test_file_name_prefix = "geomod" - class BMIForcingFixture_InputForcing(BMIForcingFixture_Class): """Test fixture for InputForcing tests.""" - def __init__( - self, - bmi_model: NWMv3_Forcing_Engine_BMI_model_Base, - keys_to_check: tuple = (), - keys_to_exclude: tuple = (), - force_key: int = None, - map_old_to_new_var_names: bool = True, - ) -> None: + def __init__(self, cfg: TestConfig_InputForcing) -> None: """Initialize BMIForcingFixture_InputForcing. Args: - ---- - bmi_model: the BMI model to be used in the test fixture - keys_to_chek: The keys to check - keys_to_exclude: The keys to exclude from the test results json and from equality checks, for example because they contain non-deterministic values or values that are not relevant to the test. - force_key: Key for the forcing type - map_old_to_new_var_names: whether to map old variable names to new variable names in the expected results data, which is needed when updating the test expected outputs dataset but should be false for regular test runs. - + cfg: an instance of TestConfig_InputForcing """ - super().__init__( - bmi_model=bmi_model, - keys_to_check=keys_to_check, - keys_to_exclude=keys_to_exclude, - map_old_to_new_var_names=map_old_to_new_var_names, - ) - self.force_key = force_key + super().__init__(cfg) + self.force_key = cfg.force_key self.test_class = self.input_forcing_mod[self.force_key] - self.test_file_name_prefix = "input_forcing" class BMIForcingFixture_Regrid(BMIForcingFixture): - def __init__( - self, - bmi_model: NWMv3_Forcing_Engine_BMI_model_Base, - regrid_func: typing.Callable, - force_key: int, - extra_attrs: tuple[ClassAttrFetcher], - regrid_arrays_to_trim_extra_elements: tuple[str], - keys_to_check: tuple[str], - keys_to_exclude: tuple[str], - ) -> None: + def __init__(self, cfg: TestConfig_Regrid) -> None: """Writers of regrid tests must call the methods in this order. This is enforced by state attributes. self.pre_regrid() @@ -443,28 +405,20 @@ def __init__( self.post_regrid() Args: - ---- - bmi_model: the BMI model to be used in the test fixture - regrid_func: The regrid function that is being tested. - force_key: Should agree with the regrid function being tested, e.g. see ginputfunc.forcing_map - extra_attrs: These are extra attributes to be added to the test results JSON, to supplement the primary InputForcings attributes. - regrid_arrays_to_trim_extra_elements: These are output arrays which can contain extra unused elements which need to be removed during an equality check. - keys_to_check: These are keys to include in the "expected" test results json, and are checked for equality versus "actual" results from regrid operation. - keys_to_exclude: These are keys to exclude from the test results json and from equality checks, for example because they contain non-deterministic values or values that are not relevant to the test. - + cfg: An instance of TestConfig_Regrid """ - super().__init__(bmi_model=bmi_model) + assert isinstance(cfg, TestConfig_Regrid) + super().__init__(cfg) - self.regrid_func = regrid_func - self.regrid_arrays_to_trim_extra_elements = regrid_arrays_to_trim_extra_elements - self.keys_to_check = keys_to_check - self.keys_to_exclude = keys_to_exclude + self.regrid_func = cfg.regrid_func + self.regrid_arrays_to_trim_extra_elements = ( + cfg.regrid_arrays_to_trim_extra_elements + ) + self.force_key = cfg.force_key + self.extra_attrs: tuple[ClassAttrFetcher] = cfg.extra_attrs - self.force_key = force_key self.cull_force_keys_not_used_this_test() - self.extra_attrs: tuple[ClassAttrFetcher] = extra_attrs - self._state = None # Test fixture state used to help ensure things happen in the right order def cull_force_keys_not_used_this_test(self) -> None: @@ -500,9 +454,7 @@ def serialized_file_suffix(self) -> str: def regrid_results_file_name_expect(self) -> str: """File name for expected test results.""" test_dir = os.path.dirname(os.path.abspath(__file__)) - file_basename = ( - f"test_expect_{self.regrid_func.__name__}{self.serialized_file_suffix}.json" - ) + file_basename = f"test_expect_{self.test_file_name_prefix}{self.regrid_func.__name__}{self.serialized_file_suffix}.json" file_path = os.path.join( test_dir, "test_data", "expected_results", file_basename ) @@ -512,9 +464,7 @@ def regrid_results_file_name_expect(self) -> str: def regrid_results_file_name_actual(self) -> str: """File name for actual test results.""" test_dir = os.path.dirname(os.path.abspath(__file__)) - file_basename = ( - f"test_actual_{self.regrid_func.__name__}{self.serialized_file_suffix}.json" - ) + file_basename = f"test_actual_{self.test_file_name_prefix}{self.regrid_func.__name__}{self.serialized_file_suffix}.json" file_path = os.path.join(test_dir, "test_data", "actual_results", file_basename) return file_path From f9a561a92ca363e863bbc453e3f3fa8168349990 Mon Sep 17 00:00:00 2001 From: Max Kipp Date: Thu, 30 Apr 2026 14:44:13 -0400 Subject: [PATCH 07/18] Add test for CONUS Standard AnA --- pytest.ini | 1 + tests/README.md | 8 + tests/ana/test_ana.py | 48 +++++ tests/conftest.py | 16 ++ tests/test_config_classes.py | 5 + tests/test_consts.py | 2 + .../test_data/configs/standard_ana_config.yml | 63 +++++++ ...d_conus_after_update_n1_rank0__step_1.json | 172 ++++++++++++++++++ ...d_conus_after_update_n1_rank0__step_2.json | 172 ++++++++++++++++++ ...d_conus_after_update_n1_rank0__step_3.json | 172 ++++++++++++++++++ ...d_conus_after_update_n2_rank0__step_1.json | 145 +++++++++++++++ ...d_conus_after_update_n2_rank0__step_2.json | 145 +++++++++++++++ ...d_conus_after_update_n2_rank0__step_3.json | 145 +++++++++++++++ ...d_conus_after_update_n2_rank1__step_1.json | 136 ++++++++++++++ ...d_conus_after_update_n2_rank1__step_2.json | 136 ++++++++++++++ ...d_conus_after_update_n2_rank1__step_3.json | 136 ++++++++++++++ ...ana_standard_conus_finalize_n1_rank0_.json | 172 ++++++++++++++++++ ...ana_standard_conus_finalize_n2_rank0_.json | 145 +++++++++++++++ ...ana_standard_conus_finalize_n2_rank1_.json | 136 ++++++++++++++ tests/test_utils.py | 14 ++ 20 files changed, 1969 insertions(+) create mode 100644 tests/ana/test_ana.py create mode 100644 tests/test_data/configs/standard_ana_config.yml create mode 100644 tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n1_rank0__step_1.json create mode 100644 tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n1_rank0__step_2.json create mode 100644 tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n1_rank0__step_3.json create mode 100644 tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n2_rank0__step_1.json create mode 100644 tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n2_rank0__step_2.json create mode 100644 tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n2_rank0__step_3.json create mode 100644 tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n2_rank1__step_1.json create mode 100644 tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n2_rank1__step_2.json create mode 100644 tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n2_rank1__step_3.json create mode 100644 tests/test_data/expected_results/test_expected_ana_standard_conus_finalize_n1_rank0_.json create mode 100644 tests/test_data/expected_results/test_expected_ana_standard_conus_finalize_n2_rank0_.json create mode 100644 tests/test_data/expected_results/test_expected_ana_standard_conus_finalize_n2_rank1_.json diff --git a/pytest.ini b/pytest.ini index 5ac5cbe6..ef7fe920 100644 --- a/pytest.ini +++ b/pytest.ini @@ -8,3 +8,4 @@ testpaths = tests/esmf_regrid tests/geomod tests/input_forcing + tests/ana diff --git a/tests/README.md b/tests/README.md index 4b05a67f..dad3653c 100644 --- a/tests/README.md +++ b/tests/README.md @@ -66,6 +66,10 @@ Multiple processors: ( cd src/ngen-forcing && mpirun -n 2 pytest tests/geomod) # Input forcing tests Single processor: ( cd src/ngen-forcing && pytest tests/input_forcing) Multiple processors: ( cd src/ngen-forcing && mpirun -n 2 pytest tests/input_forcing) + +# Analysis and Assimilation tests +Single processor: ( cd src/ngen-forcing && pytest tests/ana ) +Multiple processors: ( cd src/ngen-forcing && mpirun -n 2 pytest tests/ana ) ``` Create new test output data (creates expected outputs for subsequent tests) @@ -81,6 +85,10 @@ Multiple processors: ( cd src/ngen-forcing && FORCING_PYTEST_WRITE_TEST_EXPECTED # Input forcing tests Single processor: ( cd src/ngen-forcing && FORCING_PYTEST_WRITE_TEST_EXPECTED_DATA=true pytest tests/input_forcing) Multiple processors: ( cd src/ngen-forcing && FORCING_PYTEST_WRITE_TEST_EXPECTED_DATA=true mpirun -n 2 pytest tests/input_forcing) + +# Analysis and Assimilation tests +Single processor: ( cd src/ngen-forcing && FORCING_PYTEST_WRITE_TEST_EXPECTED_DATA=true pytest tests/ana ) +Multiple processors: ( cd src/ngen-forcing && FORCING_PYTEST_WRITE_TEST_EXPECTED_DATA=true mpirun -n 2 pytest tests/ana ) ``` In the rare case where you want to create new `expected` data and run the tests using `old` variable names use the following for `Input Forcing Tests`: diff --git a/tests/ana/test_ana.py b/tests/ana/test_ana.py new file mode 100644 index 00000000..be42ba01 --- /dev/null +++ b/tests/ana/test_ana.py @@ -0,0 +1,48 @@ +import importlib.util +import logging +import os + +import pytest + +### Load import tests.test_utils as test_utils, referring explicitly to its path. +### This explicit load is necessary since March 2026 versions of ngen which introduced /ngen-app/ngen/extern/topoflow-glacier/tests +spec = importlib.util.spec_from_file_location( + "tests.test_utils", os.path.abspath("tests/test_utils.py") +) +test_utils = importlib.util.module_from_spec(spec) +spec.loader.exec_module(test_utils) + +consts = test_utils.test_consts +configs = test_utils.test_config_classes + + +TEST_CONFIGS = [ + configs.TestConfig_AnA( + config_file=consts.FORECAST_FORCING_CONFIG_FILE__ANA_CONUS, + keys_to_check=(), + keys_to_exclude=consts.KEYS_TO_EXCLUDE, + grid_type=consts.GRID_TYPE, + test_file_name_prefix="ana_standard_conus", + ), +] + + +@pytest.mark.parametrize("bmi_forcing_fixture_ana", TEST_CONFIGS, indirect=True) +def test_input_forcing( + bmi_forcing_fixture_ana: test_utils.BMIForcingFixture_AnA, # pyright: ignore +) -> None: + """Pytest function for testing Analysis and Assimilation.""" + ### Total number of timesteps needs to be at least 2, since the 1st one behaves differently than the others, e.g. see `if config_options.current_output_step == 1` throughout the code. + total_timesteps = 3 + + fixt = bmi_forcing_fixture_ana + # fixt.after_intitialization_check() # NOTE this is disabled because with -n 2, there are attrs initialized to arbitrary values. + for i in range(total_timesteps): + logging.info("Starting bmi_model.update()...") + fixt.bmi_model.update() + fixt.after_bmi_model_update( + current_output_step=i + 1, + ) + logging.info("Starting bmi_model.finalize()...") + fixt.bmi_model.finalize() + fixt.after_finalize() diff --git a/tests/conftest.py b/tests/conftest.py index de5d7de5..2a269c64 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -4,6 +4,7 @@ from test_utils import ( BMIForcingFixture, + BMIForcingFixture_AnA, BMIForcingFixture_GeoMod, BMIForcingFixture_InputForcing, BMIForcingFixture_Regrid, @@ -11,6 +12,7 @@ from test_config_classes import ( TestConfig_Base, + TestConfig_AnA, TestConfig_GeoMod, TestConfig_InputForcing, TestConfig_Regrid, @@ -98,3 +100,17 @@ def bmi_forcing_fixture_input_forcing(request) -> BMIForcingFixture_InputForcing assert isinstance(cfg, TestConfig_InputForcing) update_cfg_with_cli_inputs(cfg, request) return BMIForcingFixture_InputForcing(cfg) + + +@pytest.fixture +def bmi_forcing_fixture_ana(request) -> BMIForcingFixture_AnA: + """Construct class for tests of Analysis and Assimilation. + For example usage, see: tests/ana/test_ana.py. + + Args: + request: A built-in convention for pytest.fixture. It may be passed from @pytest.mark.parametrize usage elsewhere. + """ + cfg = request.param + assert isinstance(cfg, TestConfig_AnA) + update_cfg_with_cli_inputs(cfg, request) + return BMIForcingFixture_AnA(cfg) diff --git a/tests/test_config_classes.py b/tests/test_config_classes.py index f7df9406..9ffb1de2 100644 --- a/tests/test_config_classes.py +++ b/tests/test_config_classes.py @@ -60,3 +60,8 @@ class TestConfig_Regrid(TestConfig_Base): regrid_func: typing.Callable extra_attrs: list[ClassAttrFetcher] regrid_arrays_to_trim_extra_elements: tuple[str] + + +@dataclass(kw_only=True) +class TestConfig_AnA(TestConfig_Base): + """Configuration class for Analysis and Assimilation tests.""" diff --git a/tests/test_consts.py b/tests/test_consts.py index 8bb8b4b3..9e665a2f 100644 --- a/tests/test_consts.py +++ b/tests/test_consts.py @@ -8,6 +8,8 @@ "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/configs/aorc_config.yml" ) FORECAST_FORCING_CONFIG_FILE__SHORT_RANGE_CONUS = "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/configs/short_range_config.yml" +FORECAST_FORCING_CONFIG_FILE__ANA_CONUS = "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/configs/standard_ana_config.yml" + COMPOSITE_KEYS_TO_CHECK = () GRID_TYPE = "hydrofabric" # ["gridded","hydrofabric","unstructured"] KEYS_TO_EXCLUDE = ("uid64",) diff --git a/tests/test_data/configs/standard_ana_config.yml b/tests/test_data/configs/standard_ana_config.yml new file mode 100644 index 00000000..ed391adb --- /dev/null +++ b/tests/test_data/configs/standard_ana_config.yml @@ -0,0 +1,63 @@ +time_step_seconds: 3600 +initial_time: 0 +NWM_VERSION: 4.0 +NWM_CONFIG: standard_ana +InputForcings: [6, 5] +InputForcingDirectories: [/ngen-app/data/raw_input/RAP_ANA, /ngen-app/data/raw_input/HRRR_ANA] +InputForcingTypes: [GRIB2, GRIB2] +InputMandatory: [1, 1] +OutputFrequency: 60 +SubOutputHour: 0 +SubOutFreq: 0 +ScratchDir: /ngen-app/data/scratch/standard_ana +Output: 0 +compressOutput: 0 +floatOutput: 0 +AnAFlag: 1 +LookBack: 180 +RefcstBDateProc: '202507100900' +ForecastFrequency: 60 +ForecastShift: 0 +ForecastInputHorizons: [180, 180] +ForecastInputOffsets: [0, 0] +Geopackage: /workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg +GeogridIn: /workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/gauge_01123000_ESMF_Mesh.nc +SpatialMetaIn: '' +GRID_TYPE: hydrofabric +NodeCoords: nodeCoords +ElemCoords: centerCoords +ElemConn: elementConn +ElemID: element_id +NumElemConn: numElementConn +HGTVAR: Element_Elevation +SLOPE: Element_Slope +SLOPE_AZIMUTH: Element_Slope_Azmuith +IgnoredBorderWidths: [0, 0] +RegridOpt: [1, 1] +ForcingTemporalInterpolation: [0, 0] +TemperatureBiasCorrection: [0, 0] +PressureBiasCorrection: [0, 0] +HumidityBiasCorrection: [0, 0] +WindBiasCorrection: [0, 0] +SwBiasCorrection: [0, 0] +LwBiasCorrection: [0, 0] +PrecipBiasCorrection: [0, 0] +TemperatureDownscaling: [0, 0] +ShortwaveDownscaling: [0, 0] +PressureDownscaling: [0, 0] +PrecipDownscaling: [0, 0] +HumidityDownscaling: [0, 0] +DownscalingParamDirs: [/ngen-app/data, /ngen-app/data] +SuppPcp: [1, 2] +SuppPcpForcingTypes: [GRIB2, GRIB2] +SuppPcpDirectories: [/ngen-app/data/raw_input/MRMS_RO, /ngen-app/data/raw_input/MRMS_MS] +SuppPcpParamDir: /ngen-app/data/raw_input/RQI +RegridOptSuppPcp: [2, 2] +SuppPcpTemporalInterpolation: [0, 0] +SuppPcpInputOffsets: [0, 0] +SuppPcpMandatory: [1, 1] +RqiMethod: 0 +RqiThreshold: 0.0 +cfsEnsNumber: '' +custom_input_fcst_freq: [] +includeLQFrac: 1 diff --git a/tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n1_rank0__step_1.json b/tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n1_rank0__step_1.json new file mode 100644 index 00000000..bc722bea --- /dev/null +++ b/tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n1_rank0__step_1.json @@ -0,0 +1,172 @@ +{ + "idOut": null, + "outDate": "2025-07-10T07:00:00", + "outPath": null, + "out_ndv": -9999, + "output_global": [ + [ + -1.410295844078064, + -0.9769837260246277, + -1.0550719499588013, + -1.1564271450042725, + -1.038574457168579, + -1.1512030363082886, + -1.3210023641586304 + ], + [ + -1.075816035270691, + -1.7945302724838257, + -1.9976998567581177, + -2.2715940475463867, + -2.2515783309936523, + -1.9823459386825562, + -1.8057399988174438 + ], + [ + 414.9977722167969, + 414.0677185058594, + 422.7254638671875, + 425.6545104980469, + 426.2725830078125, + 424.894287109375, + 412.1449279785156 + ], + [ + 0.0009722222457639873, + 0.0008611110970377922, + 0.00016666667943354696, + 0.00011111111234640703, + 0.00013888889225199819, + 0.0, + 0.000750000006519258 + ], + [ + 294.3380432128906, + 294.4169006347656, + 294.9239196777344, + 294.8855285644531, + 295.153564453125, + 294.81158447265625, + 294.45782470703125 + ], + [ + 0.01567092351615429, + 0.015658782795071602, + 0.015821261331439018, + 0.01592061296105385, + 0.01596120186150074, + 0.015891123563051224, + 0.01563367433845997 + ], + [ + 99145.0234375, + 99279.625, + 99800.34375, + 99717.625, + 99945.6875, + 99710.90625, + 99270.46875 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + ], + "output_local": [ + [ + -1.410295844078064, + -0.9769837260246277, + -1.0550719499588013, + -1.1564271450042725, + -1.038574457168579, + -1.1512030363082886, + -1.3210023641586304 + ], + [ + -1.075816035270691, + -1.7945302724838257, + -1.9976998567581177, + -2.2715940475463867, + -2.2515783309936523, + -1.9823459386825562, + -1.8057399988174438 + ], + [ + 414.9977722167969, + 414.0677185058594, + 422.7254638671875, + 425.6545104980469, + 426.2725830078125, + 424.894287109375, + 412.1449279785156 + ], + [ + 0.0009722222457639873, + 0.0008611110970377922, + 0.00016666667943354696, + 0.00011111111234640703, + 0.00013888889225199819, + 0.0, + 0.000750000006519258 + ], + [ + 294.3380432128906, + 294.4169006347656, + 294.9239196777344, + 294.8855285644531, + 295.153564453125, + 294.81158447265625, + 294.45782470703125 + ], + [ + 0.01567092351615429, + 0.015658782795071602, + 0.015821261331439018, + 0.01592061296105385, + 0.01596120186150074, + 0.015891123563051224, + 0.01563367433845997 + ], + [ + 99145.0234375, + 99279.625, + 99800.34375, + 99717.625, + 99945.6875, + 99710.90625, + 99270.46875 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + ] +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n1_rank0__step_2.json b/tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n1_rank0__step_2.json new file mode 100644 index 00000000..1a577708 --- /dev/null +++ b/tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n1_rank0__step_2.json @@ -0,0 +1,172 @@ +{ + "idOut": null, + "outDate": "2025-07-10T08:00:00", + "outPath": null, + "out_ndv": -9999, + "output_global": [ + [ + -2.2241005897521973, + -1.807473063468933, + -1.245255708694458, + -1.508069634437561, + -1.683876395225525, + -1.100544810295105, + -1.967042326927185 + ], + [ + -0.9001779556274414, + -1.0442909002304077, + -1.4980731010437012, + -1.5387722253799438, + -1.4350796937942505, + -1.6279373168945312, + -0.774793803691864 + ], + [ + 397.1433410644531, + 405.2170104980469, + 416.85870361328125, + 415.1512756347656, + 414.35736083984375, + 418.4111328125, + 402.11065673828125 + ], + [ + 0.0005277777672745287, + 0.0008888888987712562, + 0.000722222204785794, + 0.0006666667177341878, + 0.000750000006519258, + 0.0007777777500450611, + 0.0010555555345490575 + ], + [ + 293.9549865722656, + 294.1123352050781, + 294.6629943847656, + 294.86199951171875, + 295.0794677734375, + 294.70306396484375, + 294.1600341796875 + ], + [ + 0.014883879572153091, + 0.015128380618989468, + 0.015394970774650574, + 0.01567152515053749, + 0.015849996358156204, + 0.015485675074160099, + 0.015181985683739185 + ], + [ + 99239.328125, + 99369.734375, + 99901.7265625, + 99841.3203125, + 100066.3828125, + 99823.4375, + 99365.671875 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + ], + "output_local": [ + [ + -2.2241005897521973, + -1.807473063468933, + -1.245255708694458, + -1.508069634437561, + -1.683876395225525, + -1.100544810295105, + -1.967042326927185 + ], + [ + -0.9001779556274414, + -1.0442909002304077, + -1.4980731010437012, + -1.5387722253799438, + -1.4350796937942505, + -1.6279373168945312, + -0.774793803691864 + ], + [ + 397.1433410644531, + 405.2170104980469, + 416.85870361328125, + 415.1512756347656, + 414.35736083984375, + 418.4111328125, + 402.11065673828125 + ], + [ + 0.0005277777672745287, + 0.0008888888987712562, + 0.000722222204785794, + 0.0006666667177341878, + 0.000750000006519258, + 0.0007777777500450611, + 0.0010555555345490575 + ], + [ + 293.9549865722656, + 294.1123352050781, + 294.6629943847656, + 294.86199951171875, + 295.0794677734375, + 294.70306396484375, + 294.1600341796875 + ], + [ + 0.014883879572153091, + 0.015128380618989468, + 0.015394970774650574, + 0.01567152515053749, + 0.015849996358156204, + 0.015485675074160099, + 0.015181985683739185 + ], + [ + 99239.328125, + 99369.734375, + 99901.7265625, + 99841.3203125, + 100066.3828125, + 99823.4375, + 99365.671875 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + ] +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n1_rank0__step_3.json b/tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n1_rank0__step_3.json new file mode 100644 index 00000000..e8f3302f --- /dev/null +++ b/tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n1_rank0__step_3.json @@ -0,0 +1,172 @@ +{ + "idOut": null, + "outDate": "2025-07-10T09:00:00", + "outPath": null, + "out_ndv": -9999, + "output_global": [ + [ + -0.09835651516914368, + -0.5334993600845337, + -1.0217965841293335, + -1.0319740772247314, + -0.8142603635787964, + -1.1877989768981934, + -0.292375385761261 + ], + [ + 0.3140997588634491, + 1.1746679544448853, + 2.0089995861053467, + 2.035417318344116, + 1.761492133140564, + 2.082761287689209, + 1.2768900394439697 + ], + [ + 417.97906494140625, + 410.6579895019531, + 421.15472412109375, + 420.8013916015625, + 418.1336975097656, + 422.92791748046875, + 414.14129638671875 + ], + [ + 0.005527777597308159, + 0.0034722222480922937, + 0.0007777777500450611, + 0.00016666667943354696, + 0.00016666667943354696, + 0.0003055555571336299, + 0.0034166667610406876 + ], + [ + 294.3316345214844, + 294.3771057128906, + 294.6235656738281, + 294.14996337890625, + 294.2622985839844, + 294.3876953125, + 294.4525451660156 + ], + [ + 0.015577448531985283, + 0.015614578500390053, + 0.015549663454294205, + 0.015084546990692616, + 0.015104496851563454, + 0.0153276352211833, + 0.01570560410618782 + ], + [ + 99125.8046875, + 99274.671875, + 99811.9453125, + 99760.21875, + 99994.4921875, + 99734.3515625, + 99265.09375 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + ], + "output_local": [ + [ + -0.09835651516914368, + -0.5334993600845337, + -1.0217965841293335, + -1.0319740772247314, + -0.8142603635787964, + -1.1877989768981934, + -0.292375385761261 + ], + [ + 0.3140997588634491, + 1.1746679544448853, + 2.0089995861053467, + 2.035417318344116, + 1.761492133140564, + 2.082761287689209, + 1.2768900394439697 + ], + [ + 417.97906494140625, + 410.6579895019531, + 421.15472412109375, + 420.8013916015625, + 418.1336975097656, + 422.92791748046875, + 414.14129638671875 + ], + [ + 0.005527777597308159, + 0.0034722222480922937, + 0.0007777777500450611, + 0.00016666667943354696, + 0.00016666667943354696, + 0.0003055555571336299, + 0.0034166667610406876 + ], + [ + 294.3316345214844, + 294.3771057128906, + 294.6235656738281, + 294.14996337890625, + 294.2622985839844, + 294.3876953125, + 294.4525451660156 + ], + [ + 0.015577448531985283, + 0.015614578500390053, + 0.015549663454294205, + 0.015084546990692616, + 0.015104496851563454, + 0.0153276352211833, + 0.01570560410618782 + ], + [ + 99125.8046875, + 99274.671875, + 99811.9453125, + 99760.21875, + 99994.4921875, + 99734.3515625, + 99265.09375 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + ] +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n2_rank0__step_1.json b/tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n2_rank0__step_1.json new file mode 100644 index 00000000..5f32dc0f --- /dev/null +++ b/tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n2_rank0__step_1.json @@ -0,0 +1,145 @@ +{ + "idOut": null, + "outDate": "2025-07-10T07:00:00", + "outPath": null, + "out_ndv": -9999, + "output_global": [ + [ + -1.410295844078064, + -0.9769837260246277, + -1.0550719499588013, + -1.1564271450042725, + -1.038574457168579, + -1.1512030363082886, + -1.3210023641586304 + ], + [ + -1.075816035270691, + -1.7945302724838257, + -1.9976998567581177, + -2.2715940475463867, + -2.2515783309936523, + -1.9823459386825562, + -1.8057399988174438 + ], + [ + 414.9977722167969, + 414.0677185058594, + 422.7254638671875, + 425.6545104980469, + 426.2725830078125, + 424.894287109375, + 412.1449279785156 + ], + [ + 0.0009722222457639873, + 0.0008611110970377922, + 0.00016666667943354696, + 0.00011111111234640703, + 0.00013888889225199819, + 0.0, + 0.000750000006519258 + ], + [ + 294.3380432128906, + 294.4169006347656, + 294.9239196777344, + 294.8855285644531, + 295.153564453125, + 294.81158447265625, + 294.45782470703125 + ], + [ + 0.01567092351615429, + 0.015658782795071602, + 0.015821261331439018, + 0.01592061296105385, + 0.01596120186150074, + 0.015891123563051224, + 0.01563367433845997 + ], + [ + 99145.0234375, + 99279.625, + 99800.34375, + 99717.625, + 99945.6875, + 99710.90625, + 99270.46875 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + ], + "output_local": [ + [ + -1.410295844078064, + -0.9769837260246277, + -1.0550719499588013, + -1.1564271450042725 + ], + [ + -1.075816035270691, + -1.7945302724838257, + -1.9976998567581177, + -2.2715940475463867 + ], + [ + 414.9977722167969, + 414.0677185058594, + 422.7254638671875, + 425.6545104980469 + ], + [ + 0.0009722222457639873, + 0.0008611110970377922, + 0.00016666667943354696, + 0.00011111111234640703 + ], + [ + 294.3380432128906, + 294.4169006347656, + 294.9239196777344, + 294.8855285644531 + ], + [ + 0.01567092351615429, + 0.015658782795071602, + 0.015821261331439018, + 0.01592061296105385 + ], + [ + 99145.0234375, + 99279.625, + 99800.34375, + 99717.625 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 1.0, + 1.0, + 1.0, + 1.0 + ] + ] +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n2_rank0__step_2.json b/tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n2_rank0__step_2.json new file mode 100644 index 00000000..f8c4f6c9 --- /dev/null +++ b/tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n2_rank0__step_2.json @@ -0,0 +1,145 @@ +{ + "idOut": null, + "outDate": "2025-07-10T08:00:00", + "outPath": null, + "out_ndv": -9999, + "output_global": [ + [ + -2.2241005897521973, + -1.807473063468933, + -1.245255708694458, + -1.508069634437561, + -1.683876395225525, + -1.100544810295105, + -1.967042326927185 + ], + [ + -0.9001779556274414, + -1.0442909002304077, + -1.4980731010437012, + -1.5387722253799438, + -1.4350796937942505, + -1.6279373168945312, + -0.774793803691864 + ], + [ + 397.1433410644531, + 405.2170104980469, + 416.85870361328125, + 415.1512756347656, + 414.35736083984375, + 418.4111328125, + 402.11065673828125 + ], + [ + 0.0005277777672745287, + 0.0008888888987712562, + 0.000722222204785794, + 0.0006666667177341878, + 0.000750000006519258, + 0.0007777777500450611, + 0.0010555555345490575 + ], + [ + 293.9549865722656, + 294.1123352050781, + 294.6629943847656, + 294.86199951171875, + 295.0794677734375, + 294.70306396484375, + 294.1600341796875 + ], + [ + 0.014883879572153091, + 0.015128380618989468, + 0.015394970774650574, + 0.01567152515053749, + 0.015849996358156204, + 0.015485675074160099, + 0.015181985683739185 + ], + [ + 99239.328125, + 99369.734375, + 99901.7265625, + 99841.3203125, + 100066.3828125, + 99823.4375, + 99365.671875 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + ], + "output_local": [ + [ + -2.2241005897521973, + -1.807473063468933, + -1.245255708694458, + -1.508069634437561 + ], + [ + -0.9001779556274414, + -1.0442909002304077, + -1.4980731010437012, + -1.5387722253799438 + ], + [ + 397.1433410644531, + 405.2170104980469, + 416.85870361328125, + 415.1512756347656 + ], + [ + 0.0005277777672745287, + 0.0008888888987712562, + 0.000722222204785794, + 0.0006666667177341878 + ], + [ + 293.9549865722656, + 294.1123352050781, + 294.6629943847656, + 294.86199951171875 + ], + [ + 0.014883879572153091, + 0.015128380618989468, + 0.015394970774650574, + 0.01567152515053749 + ], + [ + 99239.328125, + 99369.734375, + 99901.7265625, + 99841.3203125 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 1.0, + 1.0, + 1.0, + 1.0 + ] + ] +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n2_rank0__step_3.json b/tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n2_rank0__step_3.json new file mode 100644 index 00000000..165a36b8 --- /dev/null +++ b/tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n2_rank0__step_3.json @@ -0,0 +1,145 @@ +{ + "idOut": null, + "outDate": "2025-07-10T09:00:00", + "outPath": null, + "out_ndv": -9999, + "output_global": [ + [ + -0.09835651516914368, + -0.5334993600845337, + -1.0217965841293335, + -1.0319740772247314, + -0.8142603635787964, + -1.1877989768981934, + -0.292375385761261 + ], + [ + 0.3140997588634491, + 1.1746679544448853, + 2.0089995861053467, + 2.035417318344116, + 1.761492133140564, + 2.082761287689209, + 1.2768900394439697 + ], + [ + 417.97906494140625, + 410.6579895019531, + 421.15472412109375, + 420.8013916015625, + 418.1336975097656, + 422.92791748046875, + 414.14129638671875 + ], + [ + 0.005527777597308159, + 0.0034722222480922937, + 0.0007777777500450611, + 0.00016666667943354696, + 0.00016666667943354696, + 0.0003055555571336299, + 0.0034166667610406876 + ], + [ + 294.3316345214844, + 294.3771057128906, + 294.6235656738281, + 294.14996337890625, + 294.2622985839844, + 294.3876953125, + 294.4525451660156 + ], + [ + 0.015577448531985283, + 0.015614578500390053, + 0.015549663454294205, + 0.015084546990692616, + 0.015104496851563454, + 0.0153276352211833, + 0.01570560410618782 + ], + [ + 99125.8046875, + 99274.671875, + 99811.9453125, + 99760.21875, + 99994.4921875, + 99734.3515625, + 99265.09375 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + ], + "output_local": [ + [ + -0.09835651516914368, + -0.5334993600845337, + -1.0217965841293335, + -1.0319740772247314 + ], + [ + 0.3140997588634491, + 1.1746679544448853, + 2.0089995861053467, + 2.035417318344116 + ], + [ + 417.97906494140625, + 410.6579895019531, + 421.15472412109375, + 420.8013916015625 + ], + [ + 0.005527777597308159, + 0.0034722222480922937, + 0.0007777777500450611, + 0.00016666667943354696 + ], + [ + 294.3316345214844, + 294.3771057128906, + 294.6235656738281, + 294.14996337890625 + ], + [ + 0.015577448531985283, + 0.015614578500390053, + 0.015549663454294205, + 0.015084546990692616 + ], + [ + 99125.8046875, + 99274.671875, + 99811.9453125, + 99760.21875 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 1.0, + 1.0, + 1.0, + 1.0 + ] + ] +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n2_rank1__step_1.json b/tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n2_rank1__step_1.json new file mode 100644 index 00000000..52506b9e --- /dev/null +++ b/tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n2_rank1__step_1.json @@ -0,0 +1,136 @@ +{ + "idOut": null, + "outDate": "2025-07-10T07:00:00", + "outPath": null, + "out_ndv": -9999, + "output_global": [ + [ + -1.410295844078064, + -0.9769837260246277, + -1.0550719499588013, + -1.1564271450042725, + -1.038574457168579, + -1.1512030363082886, + -1.3210023641586304 + ], + [ + -1.075816035270691, + -1.7945302724838257, + -1.9976998567581177, + -2.2715940475463867, + -2.2515783309936523, + -1.9823459386825562, + -1.8057399988174438 + ], + [ + 414.9977722167969, + 414.0677185058594, + 422.7254638671875, + 425.6545104980469, + 426.2725830078125, + 424.894287109375, + 412.1449279785156 + ], + [ + 0.0009722222457639873, + 0.0008611110970377922, + 0.00016666667943354696, + 0.00011111111234640703, + 0.00013888889225199819, + 0.0, + 0.000750000006519258 + ], + [ + 294.3380432128906, + 294.4169006347656, + 294.9239196777344, + 294.8855285644531, + 295.153564453125, + 294.81158447265625, + 294.45782470703125 + ], + [ + 0.01567092351615429, + 0.015658782795071602, + 0.015821261331439018, + 0.01592061296105385, + 0.01596120186150074, + 0.015891123563051224, + 0.01563367433845997 + ], + [ + 99145.0234375, + 99279.625, + 99800.34375, + 99717.625, + 99945.6875, + 99710.90625, + 99270.46875 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + ], + "output_local": [ + [ + -1.038574457168579, + -1.1512030363082886, + -1.3210023641586304 + ], + [ + -2.2515783309936523, + -1.9823459386825562, + -1.8057399988174438 + ], + [ + 426.2725830078125, + 424.894287109375, + 412.1449279785156 + ], + [ + 0.00013888889225199819, + 0.0, + 0.000750000006519258 + ], + [ + 295.153564453125, + 294.81158447265625, + 294.45782470703125 + ], + [ + 0.01596120186150074, + 0.015891123563051224, + 0.01563367433845997 + ], + [ + 99945.6875, + 99710.90625, + 99270.46875 + ], + [ + 0.0, + 0.0, + 0.0 + ], + [ + 1.0, + 1.0, + 1.0 + ] + ] +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n2_rank1__step_2.json b/tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n2_rank1__step_2.json new file mode 100644 index 00000000..2045e0cf --- /dev/null +++ b/tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n2_rank1__step_2.json @@ -0,0 +1,136 @@ +{ + "idOut": null, + "outDate": "2025-07-10T08:00:00", + "outPath": null, + "out_ndv": -9999, + "output_global": [ + [ + -2.2241005897521973, + -1.807473063468933, + -1.245255708694458, + -1.508069634437561, + -1.683876395225525, + -1.100544810295105, + -1.967042326927185 + ], + [ + -0.9001779556274414, + -1.0442909002304077, + -1.4980731010437012, + -1.5387722253799438, + -1.4350796937942505, + -1.6279373168945312, + -0.774793803691864 + ], + [ + 397.1433410644531, + 405.2170104980469, + 416.85870361328125, + 415.1512756347656, + 414.35736083984375, + 418.4111328125, + 402.11065673828125 + ], + [ + 0.0005277777672745287, + 0.0008888888987712562, + 0.000722222204785794, + 0.0006666667177341878, + 0.000750000006519258, + 0.0007777777500450611, + 0.0010555555345490575 + ], + [ + 293.9549865722656, + 294.1123352050781, + 294.6629943847656, + 294.86199951171875, + 295.0794677734375, + 294.70306396484375, + 294.1600341796875 + ], + [ + 0.014883879572153091, + 0.015128380618989468, + 0.015394970774650574, + 0.01567152515053749, + 0.015849996358156204, + 0.015485675074160099, + 0.015181985683739185 + ], + [ + 99239.328125, + 99369.734375, + 99901.7265625, + 99841.3203125, + 100066.3828125, + 99823.4375, + 99365.671875 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + ], + "output_local": [ + [ + -1.683876395225525, + -1.100544810295105, + -1.967042326927185 + ], + [ + -1.4350796937942505, + -1.6279373168945312, + -0.774793803691864 + ], + [ + 414.35736083984375, + 418.4111328125, + 402.11065673828125 + ], + [ + 0.000750000006519258, + 0.0007777777500450611, + 0.0010555555345490575 + ], + [ + 295.0794677734375, + 294.70306396484375, + 294.1600341796875 + ], + [ + 0.015849996358156204, + 0.015485675074160099, + 0.015181985683739185 + ], + [ + 100066.3828125, + 99823.4375, + 99365.671875 + ], + [ + 0.0, + 0.0, + 0.0 + ], + [ + 1.0, + 1.0, + 1.0 + ] + ] +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n2_rank1__step_3.json b/tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n2_rank1__step_3.json new file mode 100644 index 00000000..8842a25a --- /dev/null +++ b/tests/test_data/expected_results/test_expected_ana_standard_conus_after_update_n2_rank1__step_3.json @@ -0,0 +1,136 @@ +{ + "idOut": null, + "outDate": "2025-07-10T09:00:00", + "outPath": null, + "out_ndv": -9999, + "output_global": [ + [ + -0.09835651516914368, + -0.5334993600845337, + -1.0217965841293335, + -1.0319740772247314, + -0.8142603635787964, + -1.1877989768981934, + -0.292375385761261 + ], + [ + 0.3140997588634491, + 1.1746679544448853, + 2.0089995861053467, + 2.035417318344116, + 1.761492133140564, + 2.082761287689209, + 1.2768900394439697 + ], + [ + 417.97906494140625, + 410.6579895019531, + 421.15472412109375, + 420.8013916015625, + 418.1336975097656, + 422.92791748046875, + 414.14129638671875 + ], + [ + 0.005527777597308159, + 0.0034722222480922937, + 0.0007777777500450611, + 0.00016666667943354696, + 0.00016666667943354696, + 0.0003055555571336299, + 0.0034166667610406876 + ], + [ + 294.3316345214844, + 294.3771057128906, + 294.6235656738281, + 294.14996337890625, + 294.2622985839844, + 294.3876953125, + 294.4525451660156 + ], + [ + 0.015577448531985283, + 0.015614578500390053, + 0.015549663454294205, + 0.015084546990692616, + 0.015104496851563454, + 0.0153276352211833, + 0.01570560410618782 + ], + [ + 99125.8046875, + 99274.671875, + 99811.9453125, + 99760.21875, + 99994.4921875, + 99734.3515625, + 99265.09375 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + ], + "output_local": [ + [ + -0.8142603635787964, + -1.1877989768981934, + -0.292375385761261 + ], + [ + 1.761492133140564, + 2.082761287689209, + 1.2768900394439697 + ], + [ + 418.1336975097656, + 422.92791748046875, + 414.14129638671875 + ], + [ + 0.00016666667943354696, + 0.0003055555571336299, + 0.0034166667610406876 + ], + [ + 294.2622985839844, + 294.3876953125, + 294.4525451660156 + ], + [ + 0.015104496851563454, + 0.0153276352211833, + 0.01570560410618782 + ], + [ + 99994.4921875, + 99734.3515625, + 99265.09375 + ], + [ + 0.0, + 0.0, + 0.0 + ], + [ + 1.0, + 1.0, + 1.0 + ] + ] +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_ana_standard_conus_finalize_n1_rank0_.json b/tests/test_data/expected_results/test_expected_ana_standard_conus_finalize_n1_rank0_.json new file mode 100644 index 00000000..e8f3302f --- /dev/null +++ b/tests/test_data/expected_results/test_expected_ana_standard_conus_finalize_n1_rank0_.json @@ -0,0 +1,172 @@ +{ + "idOut": null, + "outDate": "2025-07-10T09:00:00", + "outPath": null, + "out_ndv": -9999, + "output_global": [ + [ + -0.09835651516914368, + -0.5334993600845337, + -1.0217965841293335, + -1.0319740772247314, + -0.8142603635787964, + -1.1877989768981934, + -0.292375385761261 + ], + [ + 0.3140997588634491, + 1.1746679544448853, + 2.0089995861053467, + 2.035417318344116, + 1.761492133140564, + 2.082761287689209, + 1.2768900394439697 + ], + [ + 417.97906494140625, + 410.6579895019531, + 421.15472412109375, + 420.8013916015625, + 418.1336975097656, + 422.92791748046875, + 414.14129638671875 + ], + [ + 0.005527777597308159, + 0.0034722222480922937, + 0.0007777777500450611, + 0.00016666667943354696, + 0.00016666667943354696, + 0.0003055555571336299, + 0.0034166667610406876 + ], + [ + 294.3316345214844, + 294.3771057128906, + 294.6235656738281, + 294.14996337890625, + 294.2622985839844, + 294.3876953125, + 294.4525451660156 + ], + [ + 0.015577448531985283, + 0.015614578500390053, + 0.015549663454294205, + 0.015084546990692616, + 0.015104496851563454, + 0.0153276352211833, + 0.01570560410618782 + ], + [ + 99125.8046875, + 99274.671875, + 99811.9453125, + 99760.21875, + 99994.4921875, + 99734.3515625, + 99265.09375 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + ], + "output_local": [ + [ + -0.09835651516914368, + -0.5334993600845337, + -1.0217965841293335, + -1.0319740772247314, + -0.8142603635787964, + -1.1877989768981934, + -0.292375385761261 + ], + [ + 0.3140997588634491, + 1.1746679544448853, + 2.0089995861053467, + 2.035417318344116, + 1.761492133140564, + 2.082761287689209, + 1.2768900394439697 + ], + [ + 417.97906494140625, + 410.6579895019531, + 421.15472412109375, + 420.8013916015625, + 418.1336975097656, + 422.92791748046875, + 414.14129638671875 + ], + [ + 0.005527777597308159, + 0.0034722222480922937, + 0.0007777777500450611, + 0.00016666667943354696, + 0.00016666667943354696, + 0.0003055555571336299, + 0.0034166667610406876 + ], + [ + 294.3316345214844, + 294.3771057128906, + 294.6235656738281, + 294.14996337890625, + 294.2622985839844, + 294.3876953125, + 294.4525451660156 + ], + [ + 0.015577448531985283, + 0.015614578500390053, + 0.015549663454294205, + 0.015084546990692616, + 0.015104496851563454, + 0.0153276352211833, + 0.01570560410618782 + ], + [ + 99125.8046875, + 99274.671875, + 99811.9453125, + 99760.21875, + 99994.4921875, + 99734.3515625, + 99265.09375 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + ] +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_ana_standard_conus_finalize_n2_rank0_.json b/tests/test_data/expected_results/test_expected_ana_standard_conus_finalize_n2_rank0_.json new file mode 100644 index 00000000..165a36b8 --- /dev/null +++ b/tests/test_data/expected_results/test_expected_ana_standard_conus_finalize_n2_rank0_.json @@ -0,0 +1,145 @@ +{ + "idOut": null, + "outDate": "2025-07-10T09:00:00", + "outPath": null, + "out_ndv": -9999, + "output_global": [ + [ + -0.09835651516914368, + -0.5334993600845337, + -1.0217965841293335, + -1.0319740772247314, + -0.8142603635787964, + -1.1877989768981934, + -0.292375385761261 + ], + [ + 0.3140997588634491, + 1.1746679544448853, + 2.0089995861053467, + 2.035417318344116, + 1.761492133140564, + 2.082761287689209, + 1.2768900394439697 + ], + [ + 417.97906494140625, + 410.6579895019531, + 421.15472412109375, + 420.8013916015625, + 418.1336975097656, + 422.92791748046875, + 414.14129638671875 + ], + [ + 0.005527777597308159, + 0.0034722222480922937, + 0.0007777777500450611, + 0.00016666667943354696, + 0.00016666667943354696, + 0.0003055555571336299, + 0.0034166667610406876 + ], + [ + 294.3316345214844, + 294.3771057128906, + 294.6235656738281, + 294.14996337890625, + 294.2622985839844, + 294.3876953125, + 294.4525451660156 + ], + [ + 0.015577448531985283, + 0.015614578500390053, + 0.015549663454294205, + 0.015084546990692616, + 0.015104496851563454, + 0.0153276352211833, + 0.01570560410618782 + ], + [ + 99125.8046875, + 99274.671875, + 99811.9453125, + 99760.21875, + 99994.4921875, + 99734.3515625, + 99265.09375 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + ], + "output_local": [ + [ + -0.09835651516914368, + -0.5334993600845337, + -1.0217965841293335, + -1.0319740772247314 + ], + [ + 0.3140997588634491, + 1.1746679544448853, + 2.0089995861053467, + 2.035417318344116 + ], + [ + 417.97906494140625, + 410.6579895019531, + 421.15472412109375, + 420.8013916015625 + ], + [ + 0.005527777597308159, + 0.0034722222480922937, + 0.0007777777500450611, + 0.00016666667943354696 + ], + [ + 294.3316345214844, + 294.3771057128906, + 294.6235656738281, + 294.14996337890625 + ], + [ + 0.015577448531985283, + 0.015614578500390053, + 0.015549663454294205, + 0.015084546990692616 + ], + [ + 99125.8046875, + 99274.671875, + 99811.9453125, + 99760.21875 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 1.0, + 1.0, + 1.0, + 1.0 + ] + ] +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_ana_standard_conus_finalize_n2_rank1_.json b/tests/test_data/expected_results/test_expected_ana_standard_conus_finalize_n2_rank1_.json new file mode 100644 index 00000000..8842a25a --- /dev/null +++ b/tests/test_data/expected_results/test_expected_ana_standard_conus_finalize_n2_rank1_.json @@ -0,0 +1,136 @@ +{ + "idOut": null, + "outDate": "2025-07-10T09:00:00", + "outPath": null, + "out_ndv": -9999, + "output_global": [ + [ + -0.09835651516914368, + -0.5334993600845337, + -1.0217965841293335, + -1.0319740772247314, + -0.8142603635787964, + -1.1877989768981934, + -0.292375385761261 + ], + [ + 0.3140997588634491, + 1.1746679544448853, + 2.0089995861053467, + 2.035417318344116, + 1.761492133140564, + 2.082761287689209, + 1.2768900394439697 + ], + [ + 417.97906494140625, + 410.6579895019531, + 421.15472412109375, + 420.8013916015625, + 418.1336975097656, + 422.92791748046875, + 414.14129638671875 + ], + [ + 0.005527777597308159, + 0.0034722222480922937, + 0.0007777777500450611, + 0.00016666667943354696, + 0.00016666667943354696, + 0.0003055555571336299, + 0.0034166667610406876 + ], + [ + 294.3316345214844, + 294.3771057128906, + 294.6235656738281, + 294.14996337890625, + 294.2622985839844, + 294.3876953125, + 294.4525451660156 + ], + [ + 0.015577448531985283, + 0.015614578500390053, + 0.015549663454294205, + 0.015084546990692616, + 0.015104496851563454, + 0.0153276352211833, + 0.01570560410618782 + ], + [ + 99125.8046875, + 99274.671875, + 99811.9453125, + 99760.21875, + 99994.4921875, + 99734.3515625, + 99265.09375 + ], + [ + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0 + ], + [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ] + ], + "output_local": [ + [ + -0.8142603635787964, + -1.1877989768981934, + -0.292375385761261 + ], + [ + 1.761492133140564, + 2.082761287689209, + 1.2768900394439697 + ], + [ + 418.1336975097656, + 422.92791748046875, + 414.14129638671875 + ], + [ + 0.00016666667943354696, + 0.0003055555571336299, + 0.0034166667610406876 + ], + [ + 294.2622985839844, + 294.3876953125, + 294.4525451660156 + ], + [ + 0.015104496851563454, + 0.0153276352211833, + 0.01570560410618782 + ], + [ + 99994.4921875, + 99734.3515625, + 99265.09375 + ], + [ + 0.0, + 0.0, + 0.0 + ], + [ + 1.0, + 1.0, + 1.0 + ] + ] +} \ No newline at end of file diff --git a/tests/test_utils.py b/tests/test_utils.py index b288c5ee..63e356fe 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -40,6 +40,7 @@ TestConfig_GeoMod, TestConfig_InputForcing, TestConfig_Regrid, + TestConfig_AnA, ) OS_VAR__CREATE_TEST_EXPECT_DATA = "FORCING_PYTEST_WRITE_TEST_EXPECTED_DATA" @@ -395,6 +396,19 @@ def __init__(self, cfg: TestConfig_InputForcing) -> None: self.test_class = self.input_forcing_mod[self.force_key] +class BMIForcingFixture_AnA(BMIForcingFixture_Class): + """Test fixture for Analysis and Assimilation tests.""" + + def __init__(self, cfg: TestConfig_AnA) -> None: + """Initialize BMIForcingFixture_AnA. + + Args: + cfg: an instance of TestConfig_AnA + """ + super().__init__(cfg) + self.test_class = self.bmi_model._output_obj + + class BMIForcingFixture_Regrid(BMIForcingFixture): def __init__(self, cfg: TestConfig_Regrid) -> None: """Writers of regrid tests must call the methods in this order. This is enforced by state attributes. From 71bed79735c7ff867f6fe4d85de5f3f6a7e4710d Mon Sep 17 00:00:00 2001 From: Max Kipp Date: Thu, 30 Apr 2026 14:49:21 -0400 Subject: [PATCH 08/18] Removed unused code --- tests/conftest.py | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 2a269c64..b6e1415b 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -47,19 +47,6 @@ def update_cfg_with_cli_inputs(cfg: TestConfig_Base, request) -> None: cfg.map_old_to_new_var_names = map_old_to_new_var_names -@pytest.fixture -def bmi_forcing_fixture(request) -> BMIForcingFixture: - """Construct class for tests. - - Args: - request: A built-in convention for pytest.fixture. It may be passed from @pytest.mark.parametrize usage elsewhere. - """ - cfg = request.param - assert isinstance(cfg, TestConfig_Base) - update_cfg_with_cli_inputs(cfg, request) - return BMIForcingFixture(cfg) - - @pytest.fixture def bmi_forcing_fixture_regrid(request) -> BMIForcingFixture_Regrid: """Construct class for tests of ESMF regrid functions. From cbbada0b02de528256cf4f655182c24acca23bcd Mon Sep 17 00:00:00 2001 From: Max Kipp Date: Thu, 30 Apr 2026 15:00:21 -0400 Subject: [PATCH 09/18] Remove unused import --- tests/conftest.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/conftest.py b/tests/conftest.py index b6e1415b..5c9531ad 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -3,7 +3,6 @@ import pytest from test_utils import ( - BMIForcingFixture, BMIForcingFixture_AnA, BMIForcingFixture_GeoMod, BMIForcingFixture_InputForcing, From da65b10f7cbfcee45fee9b7a2b7a9a5597d08f22 Mon Sep 17 00:00:00 2001 From: Max Kipp Date: Thu, 7 May 2026 12:10:16 -0400 Subject: [PATCH 10/18] Update comment about test timesteps --- tests/ana/test_ana.py | 3 ++- tests/bmi_model/test_bmi_model.py | 3 ++- tests/esmf_regrid/test_esmf_regrid.py | 3 ++- tests/geomod/test_geomod.py | 3 ++- tests/input_forcing/test_input_forcing.py | 3 ++- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/tests/ana/test_ana.py b/tests/ana/test_ana.py index be42ba01..872f8e71 100644 --- a/tests/ana/test_ana.py +++ b/tests/ana/test_ana.py @@ -32,7 +32,8 @@ def test_input_forcing( bmi_forcing_fixture_ana: test_utils.BMIForcingFixture_AnA, # pyright: ignore ) -> None: """Pytest function for testing Analysis and Assimilation.""" - ### Total number of timesteps needs to be at least 2, since the 1st one behaves differently than the others, e.g. see `if config_options.current_output_step == 1` throughout the code. + ### Total number of timesteps needs to be at least 3, since the 1st and 2nd behaves differently than the others, + ### e.g. see `if config_options.current_output_step == 1` throughout the code and the regridded_forcings1 vs regridded_forcings2 weighting. total_timesteps = 3 fixt = bmi_forcing_fixture_ana diff --git a/tests/bmi_model/test_bmi_model.py b/tests/bmi_model/test_bmi_model.py index 9bc88036..85e388fb 100644 --- a/tests/bmi_model/test_bmi_model.py +++ b/tests/bmi_model/test_bmi_model.py @@ -33,7 +33,8 @@ def test_bmi_model( bmi_forcing_fixture_bmi_model: test_utils.BMIForcingFixture_BmiModel, # pyright: ignore ) -> None: """Pytest function for testing BMI model functionality.""" - ### Total number of timesteps needs to be at least 2, since the 1st one behaves differently than the others, e.g. see `if config_options.current_output_step == 1` throughout the code. + ### Total number of timesteps needs to be at least 3, since the 1st and 2nd behaves differently than the others, + ### e.g. see `if config_options.current_output_step == 1` throughout the code and the regridded_forcings1 vs regridded_forcings2 weighting. total_timesteps = 3 fixt = bmi_forcing_fixture_bmi_model diff --git a/tests/esmf_regrid/test_esmf_regrid.py b/tests/esmf_regrid/test_esmf_regrid.py index 5e23a799..b58776c6 100644 --- a/tests/esmf_regrid/test_esmf_regrid.py +++ b/tests/esmf_regrid/test_esmf_regrid.py @@ -114,7 +114,8 @@ def test_regrid( 2. Hydrofabric discretization, HRRR and RAP forcing (individually), CONUS domain. NOTE ^^^ this has been tested for the above conditions only ^^^ """ - ### Total number of timesteps needs to be at least 2, since the 1st one behaves differently than the others, e.g. see `if config_options.current_output_step == 1` throughout the code. + ### Total number of timesteps needs to be at least 3, since the 1st and 2nd behaves differently than the others, + ### e.g. see `if config_options.current_output_step == 1` throughout the code and the regridded_forcings1 vs regridded_forcings2 weighting. total_timesteps = 3 fixt = bmi_forcing_fixture_regrid diff --git a/tests/geomod/test_geomod.py b/tests/geomod/test_geomod.py index ab5c5553..3696414e 100644 --- a/tests/geomod/test_geomod.py +++ b/tests/geomod/test_geomod.py @@ -33,7 +33,8 @@ def test_geomod( bmi_forcing_fixture_geomod: test_utils.BMIForcingFixture_GeoMod, # pyright: ignore ) -> None: """Pytest function for testing GeoMod functionality.""" - ### Total number of timesteps needs to be at least 2, since the 1st one behaves differently than the others, e.g. see `if config_options.current_output_step == 1` throughout the code. + ### Total number of timesteps needs to be at least 3, since the 1st and 2nd behaves differently than the others, + ### e.g. see `if config_options.current_output_step == 1` throughout the code and the regridded_forcings1 vs regridded_forcings2 weighting. total_timesteps = 3 fixt = bmi_forcing_fixture_geomod diff --git a/tests/input_forcing/test_input_forcing.py b/tests/input_forcing/test_input_forcing.py index bbfa02f7..92773ea4 100644 --- a/tests/input_forcing/test_input_forcing.py +++ b/tests/input_forcing/test_input_forcing.py @@ -36,7 +36,8 @@ def test_input_forcing( bmi_forcing_fixture_input_forcing: test_utils.BMIForcingFixture_InputForcing, # pyright: ignore ) -> None: """Pytest function for testing InputForcing functionality.""" - ### Total number of timesteps needs to be at least 2, since the 1st one behaves differently than the others, e.g. see `if config_options.current_output_step == 1` throughout the code. + ### Total number of timesteps needs to be at least 3, since the 1st and 2nd behaves differently than the others, + ### e.g. see `if config_options.current_output_step == 1` throughout the code and the regridded_forcings1 vs regridded_forcings2 weighting. total_timesteps = 3 fixt = bmi_forcing_fixture_input_forcing From d3d3728bc5f3464e96a81e44e924b547894f9b90 Mon Sep 17 00:00:00 2001 From: Max Kipp Date: Thu, 7 May 2026 12:16:32 -0400 Subject: [PATCH 11/18] Format --- tests/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/README.md b/tests/README.md index 30abe0ff..319c27be 100644 --- a/tests/README.md +++ b/tests/README.md @@ -94,6 +94,7 @@ Multiple processors: ( cd src/ngen-forcing && FORCING_PYTEST_WRITE_TEST_EXPECTED # Analysis and Assimilation tests Single processor: ( cd src/ngen-forcing && FORCING_PYTEST_WRITE_TEST_EXPECTED_DATA=true pytest tests/ana ) Multiple processors: ( cd src/ngen-forcing && FORCING_PYTEST_WRITE_TEST_EXPECTED_DATA=true mpirun -n 2 pytest tests/ana ) + # BMI model tests Single processor: ( cd src/ngen-forcing && FORCING_PYTEST_WRITE_TEST_EXPECTED_DATA=true pytest tests/bmi_model) Multiple processors: ( cd src/ngen-forcing && FORCING_PYTEST_WRITE_TEST_EXPECTED_DATA=true mpirun -n 2 pytest tests/bmi_model) From cfb461fe29899a1e8baa46c96c1bc82c5971330d Mon Sep 17 00:00:00 2001 From: "Matthew.Deshotel" Date: Fri, 8 May 2026 10:30:39 -0500 Subject: [PATCH 12/18] use np.full instead of np.empty for deterministic results for tests --- .../NextGen_Forcings_Engine/core/regrid.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/NextGen_Forcings_Engine_BMI/NextGen_Forcings_Engine/core/regrid.py b/NextGen_Forcings_Engine_BMI/NextGen_Forcings_Engine/core/regrid.py index 1b4a5713..1a09ddf5 100755 --- a/NextGen_Forcings_Engine_BMI/NextGen_Forcings_Engine/core/regrid.py +++ b/NextGen_Forcings_Engine_BMI/NextGen_Forcings_Engine/core/regrid.py @@ -11353,11 +11353,11 @@ def check_regrid_status( [force_count, wrf_hydro_geo_meta.ny_local_elem], np.float32 ) elif config_options.grid_type == "hydrofabric": - input_forcings.regridded_forcings1 = np.empty( - [force_count, wrf_hydro_geo_meta.ny_local], np.float32 + input_forcings.regridded_forcings1 = np.full( + [force_count, wrf_hydro_geo_meta.ny_local], np.nan,dtype=np.float32 #NOTE changed to np.full to be deterministic for unit tests. ) - input_forcings.regridded_forcings2 = np.empty( - [force_count, wrf_hydro_geo_meta.ny_local], np.float32 + input_forcings.regridded_forcings2 = np.full( + [force_count, wrf_hydro_geo_meta.ny_local], np.nan,dtype=np.float32 #NOTE changed to np.full to be deterministic for unit tests. ) if mpi_config.rank == 0: From b349d0be53d9ac14be90702045945f0d8e4a2ffb Mon Sep 17 00:00:00 2001 From: "Matthew.Deshotel" Date: Fri, 8 May 2026 10:31:42 -0500 Subject: [PATCH 13/18] add supp precip test --- tests/README.md | 23 +++++++ tests/conftest.py | 16 +++++ tests/input_forcing/test_input_forcing.py | 4 +- tests/supp_precip/test_supp_precip.py | 57 ++++++++++++++++ tests/test_config_classes.py | 11 +++ tests/test_consts.py | 1 + .../configs/short_range_puertorico_config.yml | 63 ++++++++++++++++++ .../esmf_mesh/gauge_50027000_ESMF_Mesh.nc | Bin 0 -> 81213 bytes tests/test_data/gpkg/gauge_50027000.gpkg | Bin 0 -> 335872 bytes tests/test_utils.py | 16 +++++ 10 files changed, 190 insertions(+), 1 deletion(-) create mode 100644 tests/supp_precip/test_supp_precip.py create mode 100644 tests/test_data/configs/short_range_puertorico_config.yml create mode 100644 tests/test_data/esmf_mesh/gauge_50027000_ESMF_Mesh.nc create mode 100644 tests/test_data/gpkg/gauge_50027000.gpkg diff --git a/tests/README.md b/tests/README.md index 319c27be..45d748d5 100644 --- a/tests/README.md +++ b/tests/README.md @@ -34,7 +34,9 @@ The test suite is organized into the following modules: - **`esmf_regrid/`** - Tests for ESMF regridding functionality - **`geomod/`** - Tests for geomod components - **`input_forcing/`** - Tests for input forcing data processing +- **`supp_precip/`** - Tests for supp precip data processing - **`bmi_model/`** - Tests for the BMI model lifecycle +- **`config_options/`** - Tests config options - **`test_utils.py`** - Shared test utilities and fixtures - **`conftest.py`** - Pytest configuration and shared fixtures @@ -68,6 +70,10 @@ Multiple processors: ( cd src/ngen-forcing && mpirun -n 2 pytest tests/geomod) Single processor: ( cd src/ngen-forcing && pytest tests/input_forcing) Multiple processors: ( cd src/ngen-forcing && mpirun -n 2 pytest tests/input_forcing) +# Supp precip tests +Single processor: ( cd src/ngen-forcing && pytest tests/supp_precip) +Multiple processors: ( cd src/ngen-forcing && mpirun -n 2 pytest tests/supp_precip) + # Analysis and Assimilation tests Single processor: ( cd src/ngen-forcing && pytest tests/ana ) Multiple processors: ( cd src/ngen-forcing && mpirun -n 2 pytest tests/ana ) @@ -75,6 +81,10 @@ Multiple processors: ( cd src/ngen-forcing && mpirun -n 2 pytest tests/ana ) # BMI model tests Single processor: ( cd src/ngen-forcing && pytest tests/bmi_model) Multiple processors: ( cd src/ngen-forcing && mpirun -n 2 pytest tests/bmi_model) + +# config options tests +Single processor: ( cd src/ngen-forcing && pytest tests/config_options) +Multiple processors: ( cd src/ngen-forcing && mpirun -n 2 pytest tests/config_options) ``` Create new test output data (creates expected outputs for subsequent tests) @@ -91,6 +101,10 @@ Multiple processors: ( cd src/ngen-forcing && FORCING_PYTEST_WRITE_TEST_EXPECTED Single processor: ( cd src/ngen-forcing && FORCING_PYTEST_WRITE_TEST_EXPECTED_DATA=true pytest tests/input_forcing) Multiple processors: ( cd src/ngen-forcing && FORCING_PYTEST_WRITE_TEST_EXPECTED_DATA=true mpirun -n 2 pytest tests/input_forcing) +# Supp precip tests +Single processor: ( cd src/ngen-forcing && FORCING_PYTEST_WRITE_TEST_EXPECTED_DATA=true pytest tests/supp_precip) +Multiple processors: ( cd src/ngen-forcing && FORCING_PYTEST_WRITE_TEST_EXPECTED_DATA=true mpirun -n 2 pytest tests/supp_precip) + # Analysis and Assimilation tests Single processor: ( cd src/ngen-forcing && FORCING_PYTEST_WRITE_TEST_EXPECTED_DATA=true pytest tests/ana ) Multiple processors: ( cd src/ngen-forcing && FORCING_PYTEST_WRITE_TEST_EXPECTED_DATA=true mpirun -n 2 pytest tests/ana ) @@ -98,6 +112,10 @@ Multiple processors: ( cd src/ngen-forcing && FORCING_PYTEST_WRITE_TEST_EXPECTED # BMI model tests Single processor: ( cd src/ngen-forcing && FORCING_PYTEST_WRITE_TEST_EXPECTED_DATA=true pytest tests/bmi_model) Multiple processors: ( cd src/ngen-forcing && FORCING_PYTEST_WRITE_TEST_EXPECTED_DATA=true mpirun -n 2 pytest tests/bmi_model) + +# config_options tests +Single processor: ( cd src/ngen-forcing && FORCING_PYTEST_WRITE_TEST_EXPECTED_DATA=true pytest tests/config_options) +Multiple processors: ( cd src/ngen-forcing && FORCING_PYTEST_WRITE_TEST_EXPECTED_DATA=true mpirun -n 2 pytest tests/config_options) ``` In the rare case where you want to create new `expected` data and run the tests using `old` variable names use the following for `Input Forcing Tests`: @@ -105,6 +123,11 @@ In the rare case where you want to create new `expected` data and run the tests # Input forcing tests Single processor: ( cd src/ngen-forcing && FORCING_PYTEST_WRITE_TEST_EXPECTED_DATA=true pytest tests/input_forcing --map_old_to_new_var_names False) Multiple processors: ( cd src/ngen-forcing && FORCING_PYTEST_WRITE_TEST_EXPECTED_DATA=true mpirun -n 2 pytest tests/input_forcing --map_old_to_new_var_names False) + +# Supp precip tests +Single processor: ( cd src/ngen-forcing && FORCING_PYTEST_WRITE_TEST_EXPECTED_DATA=true pytest tests/supp_precip --map_old_to_new_var_names False) +Multiple processors: ( cd src/ngen-forcing && FORCING_PYTEST_WRITE_TEST_EXPECTED_DATA=true mpirun -n 2 pytest tests/supp_precip --map_old_to_new_var_names False) + ``` ## Test Configuration diff --git a/tests/conftest.py b/tests/conftest.py index db0893f4..1ea9e209 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -8,6 +8,7 @@ TestConfig_GeoMod, TestConfig_InputForcing, TestConfig_Regrid, + TestConfig_SuppPrecip, ) from test_utils import ( BMIForcingFixture_AnA, @@ -15,6 +16,7 @@ BMIForcingFixture_GeoMod, BMIForcingFixture_InputForcing, BMIForcingFixture_Regrid, + BMIForcingFixture_SuppPrecip, ) @@ -88,6 +90,20 @@ def bmi_forcing_fixture_input_forcing(request) -> BMIForcingFixture_InputForcing return BMIForcingFixture_InputForcing(cfg) +@pytest.fixture +def bmi_forcing_fixture_supp_precip(request) -> BMIForcingFixture_SuppPrecip: + """Construct class for tests of supp_precip. + For example usage, see: tests/supp_precip/test_supp_precip.py. + + Args: + request: A built-in convention for pytest.fixture. It may be passed from @pytest.mark.parametrize usage elsewhere. + """ + cfg = request.param + assert isinstance(cfg, TestConfig_SuppPrecip) + update_cfg_with_cli_inputs(cfg, request) + return BMIForcingFixture_SuppPrecip(cfg) + + @pytest.fixture def bmi_forcing_fixture_ana(request) -> BMIForcingFixture_AnA: """Construct class for tests of Analysis and Assimilation. diff --git a/tests/input_forcing/test_input_forcing.py b/tests/input_forcing/test_input_forcing.py index 92773ea4..d4d5b05f 100644 --- a/tests/input_forcing/test_input_forcing.py +++ b/tests/input_forcing/test_input_forcing.py @@ -21,7 +21,9 @@ configs.TestConfig_InputForcing( config_file=consts.RETRO_FORCING_CONFIG_FILE__AORC_CONUS, keys_to_check=consts.COMPOSITE_KEYS_TO_CHECK, - keys_to_exclude=consts.KEYS_TO_EXCLUDE, + keys_to_exclude=tuple( + set(consts.KEYS_TO_EXCLUDE) | {"config_options", "geo_meta", "mpi_config"} + ), grid_type=consts.GRID_TYPE, force_key=12, test_file_name_prefix=TEST_FILE_NAME_PREFIX, diff --git a/tests/supp_precip/test_supp_precip.py b/tests/supp_precip/test_supp_precip.py new file mode 100644 index 00000000..64bc2198 --- /dev/null +++ b/tests/supp_precip/test_supp_precip.py @@ -0,0 +1,57 @@ +import importlib.util +import os + +import pytest + +### Load import tests.test_utils as test_utils, referring explicitly to its path. +### This explicit load is necessary since March 2026 versions of ngen which introduced /ngen-app/ngen/extern/topoflow-glacier/tests +spec = importlib.util.spec_from_file_location( + "tests.test_utils", os.path.abspath("tests/test_utils.py") +) +test_utils = importlib.util.module_from_spec(spec) +spec.loader.exec_module(test_utils) + +consts = test_utils.test_consts +configs = test_utils.test_config_classes + +TEST_FILE_NAME_PREFIX = "supp_precip" + +### This disables a LOG call which was causing a crash at ioMod.py: LOG.debug(f"Wgrib2 command: {Wgrib2Cmd}", True) +os.environ["MFE_SILENT"] = "true" + +TEST_CONFIGS = [ + configs.TestConfig_SuppPrecip( + config_file=consts.FORECAST_FORCING_CONFIG_FILE__SHORT_RANGE_PR, + keys_to_check=consts.COMPOSITE_KEYS_TO_CHECK, + keys_to_exclude=tuple( + set(consts.KEYS_TO_EXCLUDE) | {"config_options", "geo_meta", "mpi_config"} + ), + grid_type=consts.GRID_TYPE, + force_key=15, + test_file_name_prefix=TEST_FILE_NAME_PREFIX, + ), +] + + +@pytest.mark.parametrize("bmi_forcing_fixture_supp_precip", TEST_CONFIGS, indirect=True) +def test_supp_precip( + bmi_forcing_fixture_supp_precip: test_utils.BMIForcingFixture_SuppPrecip, # pyright: ignore +) -> None: + """Pytest function for testing SuppPrecip functionality.""" + ### Total number of timesteps needs to be at least 2, since the 1st one behaves differently than the others, e.g. see `if config_options.current_output_step == 1` throughout the code. + total_timesteps = 3 + + fixt = bmi_forcing_fixture_supp_precip + if len(fixt.input_forcing_mod) != 1: + raise ValueError( + f"Expected 1 key for input_forcing_mod, got {len(fixt.input_forcing_mod)}: {list(fixt.input_forcing_mod.keys())}" + ) + + fixt.after_intitialization_check() + for i in range(total_timesteps): + fixt.bmi_model.update() + fixt.after_bmi_model_update( + current_output_step=i + 1, + ) + fixt.bmi_model.finalize() + fixt.after_finalize() diff --git a/tests/test_config_classes.py b/tests/test_config_classes.py index 72910d33..8f9d8c29 100644 --- a/tests/test_config_classes.py +++ b/tests/test_config_classes.py @@ -45,6 +45,17 @@ class TestConfig_InputForcing(TestConfig_Base): force_key: int +@dataclass(kw_only=True) +class TestConfig_SuppPrecip(TestConfig_Base): + """Configuration class for SuppPrecip Tests. + + Args: + force_key: Force key to check (often associated with a particular source dataset) + """ + + force_key: int + + @dataclass(kw_only=True) class TestConfig_Regrid(TestConfig_Base): """Configuration class for Regrid Tests. diff --git a/tests/test_consts.py b/tests/test_consts.py index 9e665a2f..e2bce408 100644 --- a/tests/test_consts.py +++ b/tests/test_consts.py @@ -8,6 +8,7 @@ "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/configs/aorc_config.yml" ) FORECAST_FORCING_CONFIG_FILE__SHORT_RANGE_CONUS = "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/configs/short_range_config.yml" +FORECAST_FORCING_CONFIG_FILE__SHORT_RANGE_PR = "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/configs/short_range_puertorico_config.yml" FORECAST_FORCING_CONFIG_FILE__ANA_CONUS = "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/configs/standard_ana_config.yml" COMPOSITE_KEYS_TO_CHECK = () diff --git a/tests/test_data/configs/short_range_puertorico_config.yml b/tests/test_data/configs/short_range_puertorico_config.yml new file mode 100644 index 00000000..6abd611f --- /dev/null +++ b/tests/test_data/configs/short_range_puertorico_config.yml @@ -0,0 +1,63 @@ +time_step_seconds: 3600 +initial_time: 0 +NWM_VERSION: 4.0 +NWM_CONFIG: short_range_puertorico +InputForcings: [14] +InputForcingDirectories: [/ngen-app/data/raw_input/PR_NAM] +InputForcingTypes: [GRIB2] +InputMandatory: [1] +OutputFrequency: 60 +SubOutputHour: 0 +SubOutFreq: 0 +ScratchDir: /ngen-app/data/scratch/short_range_puertorico/ +Output: 0 +compressOutput: 0 +floatOutput: 0 +AnAFlag: 0 +LookBack: -9999 +RefcstBDateProc: '202507100000' +ForecastFrequency: 60 +ForecastShift: 0 +ForecastInputHorizons: [2880] +ForecastInputOffsets: [0] +Geopackage: /workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_50027000.gpkg +GeogridIn: /workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/gauge_50027000_ESMF_Mesh.nc +SpatialMetaIn: '' +GRID_TYPE: hydrofabric +NodeCoords: nodeCoords +ElemID: element_id +ElemCoords: centerCoords +ElemConn: elementConn +NumElemConn: numElementConn +HGTVAR: Element_Elevation +SLOPE: Element_Slope +SLOPE_AZIMUTH: Element_Slope_Azmuith +IgnoredBorderWidths: [0] +RegridOpt: [1] +ForcingTemporalInterpolation: [0] +TemperatureBiasCorrection: [0] +PressureBiasCorrection: [0] +HumidityBiasCorrection: [0] +WindBiasCorrection: [0] +SwBiasCorrection: [0] +LwBiasCorrection: [0] +PrecipBiasCorrection: [0] +TemperatureDownscaling: [0] +ShortwaveDownscaling: [0] +PressureDownscaling: [0] +PrecipDownscaling: [0] +HumidityDownscaling: [0] +DownscalingParamDirs: [/ngen-app/data] +SuppPcp: [15] +SuppPcpForcingTypes: [GRIB2] +SuppPcpDirectories: [/ngen-app/data/raw_input/NBM_PR] +SuppPcpParamDir: /ngen-app/data +RegridOptSuppPcp: [1] +SuppPcpTemporalInterpolation: [0] +SuppPcpInputOffsets: [0] +SuppPcpMandatory: [1] +RqiMethod: 0 +RqiThreshold: 0.9 +cfsEnsNumber: '' +custom_input_fcst_freq: [] +includeLQFrac: 1 diff --git a/tests/test_data/esmf_mesh/gauge_50027000_ESMF_Mesh.nc b/tests/test_data/esmf_mesh/gauge_50027000_ESMF_Mesh.nc new file mode 100644 index 0000000000000000000000000000000000000000..af851518b04eda345349582d8f6b41a7ece89653 GIT binary patch literal 81213 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 literal 0 HcmV?d00001 diff --git a/tests/test_data/gpkg/gauge_50027000.gpkg b/tests/test_data/gpkg/gauge_50027000.gpkg new file mode 100644 index 0000000000000000000000000000000000000000..7a81ba26d33ae174004c4f1689864fb5f89bb722 GIT binary patch literal 335872 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 z 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 F{{UotX`}!E literal 0 HcmV?d00001 diff --git a/tests/test_utils.py b/tests/test_utils.py index f1f4fa4a..b99852c6 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -18,6 +18,7 @@ TestConfig_GeoMod, TestConfig_InputForcing, TestConfig_Regrid, + TestConfig_SuppPrecip, ) from NextGen_Forcings_Engine_BMI.NextGen_Forcings_Engine.bmi_model import ( @@ -214,6 +215,7 @@ def __init__(self, cfg: TestConfig_Base) -> None: self.config_options: ConfigOptions = self.bmi_model._job_meta self.geo_meta: GeoMeta = self.bmi_model.geo_meta self.input_forcing_mod: dict = self.bmi_model._input_forcing_mod + self.supp_precip_mod: dict = self.bmi_model._supp_pcp_mod self.keys_to_check = cfg.keys_to_check self.keys_to_exclude = cfg.keys_to_exclude @@ -395,6 +397,20 @@ def __init__(self, cfg: TestConfig_InputForcing) -> None: self.test_class = self.input_forcing_mod[self.force_key] +class BMIForcingFixture_SuppPrecip(BMIForcingFixture_Class): + """Test fixture for SuppPrecip tests.""" + + def __init__(self, cfg: TestConfig_SuppPrecip) -> None: + """Initialize BMIForcingFixture_SuppPrecip. + + Args: + cfg: an instance of TestConfig_SuppPrecip + """ + super().__init__(cfg) + self.force_key = cfg.force_key + self.test_class = self.supp_precip_mod[self.force_key] + + class BMIForcingFixture_AnA(BMIForcingFixture_Class): """Test fixture for Analysis and Assimilation tests.""" From 8a7eadcdf1f26a768e52110c72cb1c4d59d2ffd9 Mon Sep 17 00:00:00 2001 From: "Matthew.Deshotel" Date: Fri, 8 May 2026 11:02:12 -0500 Subject: [PATCH 14/18] add test for config_options --- tests/config_options/test_config_options.py | 54 +++++++++++++++++++++ tests/conftest.py | 16 ++++++ tests/test_config_classes.py | 5 ++ tests/test_utils.py | 14 ++++++ 4 files changed, 89 insertions(+) create mode 100644 tests/config_options/test_config_options.py diff --git a/tests/config_options/test_config_options.py b/tests/config_options/test_config_options.py new file mode 100644 index 00000000..159c297c --- /dev/null +++ b/tests/config_options/test_config_options.py @@ -0,0 +1,54 @@ +import importlib.util +import os + +import pytest + +### Load import tests.test_utils as test_utils, referring explicitly to its path. +### This explicit load is necessary since March 2026 versions of ngen which introduced /ngen-app/ngen/extern/topoflow-glacier/tests +spec = importlib.util.spec_from_file_location( + "tests.test_utils", os.path.abspath("tests/test_utils.py") +) +test_utils = importlib.util.module_from_spec(spec) +spec.loader.exec_module(test_utils) + +consts = test_utils.test_consts +configs = test_utils.test_config_classes + +TEST_FILE_NAME_PREFIX = "config_options" + +TEST_CONFIGS = [ + configs.TestConfig_ConfigOptions( + config_file=consts.RETRO_FORCING_CONFIG_FILE__AORC_CONUS, + keys_to_check=consts.COMPOSITE_KEYS_TO_CHECK, + keys_to_exclude=consts.KEYS_TO_EXCLUDE, + grid_type=consts.GRID_TYPE, + test_file_name_prefix=TEST_FILE_NAME_PREFIX, + ), +] + + +@pytest.mark.parametrize( + "bmi_forcing_fixture_configoptions", TEST_CONFIGS, indirect=True +) +def test_geomod( + bmi_forcing_fixture_configoptions: test_utils.BMIForcingFixture_GeoMod, # pyright: ignore +) -> None: + """Pytest function for testing ConfigOptions functionality.""" + ### Total number of timesteps needs to be at least 3, since the 1st and 2nd behaves differently than the others, + ### e.g. see `if config_options.current_output_step == 1` throughout the code and the regridded_forcings1 vs regridded_forcings2 weighting. + total_timesteps = 3 + + fixt = bmi_forcing_fixture_configoptions + if len(fixt.input_forcing_mod) != 1: + raise ValueError( + f"Expected 1 key for input_forcing_mod, got {len(fixt.input_forcing_mod)}: {list(fixt.input_forcing_mod.keys())}" + ) + + fixt.after_intitialization_check() + for i in range(total_timesteps): + fixt.bmi_model.update() + fixt.after_bmi_model_update( + current_output_step=i + 1, + ) + fixt.bmi_model.finalize() + fixt.after_finalize() diff --git a/tests/conftest.py b/tests/conftest.py index 1ea9e209..5f76ca03 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -5,6 +5,7 @@ TestConfig_AnA, TestConfig_Base, TestConfig_BmiModel, + TestConfig_ConfigOptions, TestConfig_GeoMod, TestConfig_InputForcing, TestConfig_Regrid, @@ -13,6 +14,7 @@ from test_utils import ( BMIForcingFixture_AnA, BMIForcingFixture_BmiModel, + BMIForcingFixture_ConfigOptions, BMIForcingFixture_GeoMod, BMIForcingFixture_InputForcing, BMIForcingFixture_Regrid, @@ -76,6 +78,20 @@ def bmi_forcing_fixture_geomod(request) -> BMIForcingFixture_GeoMod: return BMIForcingFixture_GeoMod(cfg) +@pytest.fixture +def bmi_forcing_fixture_configoptions(request) -> BMIForcingFixture_ConfigOptions: + """Construct class for tests of ConfigOptions. + For example usage, see: tests/config_options/test_config_options.py. + + Args: + request: A built-in convention for pytest.fixture. It may be passed from @pytest.mark.parametrize usage elsewhere. + """ + cfg = request.param + assert isinstance(cfg, TestConfig_ConfigOptions) + update_cfg_with_cli_inputs(cfg, request) + return BMIForcingFixture_ConfigOptions(cfg) + + @pytest.fixture def bmi_forcing_fixture_input_forcing(request) -> BMIForcingFixture_InputForcing: """Construct class for tests of input_forcing. diff --git a/tests/test_config_classes.py b/tests/test_config_classes.py index 8f9d8c29..b296993a 100644 --- a/tests/test_config_classes.py +++ b/tests/test_config_classes.py @@ -34,6 +34,11 @@ class TestConfig_GeoMod(TestConfig_Base): """Configuration class for GeoMod Tests""" +@dataclass(kw_only=True) +class TestConfig_ConfigOptions(TestConfig_Base): + """Configuration class for ConfigOptions Tests""" + + @dataclass(kw_only=True) class TestConfig_InputForcing(TestConfig_Base): """Configuration class for InputForcing Tests. diff --git a/tests/test_utils.py b/tests/test_utils.py index b99852c6..f684cc3f 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -15,6 +15,7 @@ TestConfig_AnA, TestConfig_Base, TestConfig_BmiModel, + TestConfig_ConfigOptions, TestConfig_GeoMod, TestConfig_InputForcing, TestConfig_Regrid, @@ -383,6 +384,19 @@ def __init__(self, cfg: TestConfig_GeoMod) -> None: self.test_class = self.geo_meta +class BMIForcingFixture_ConfigOptions(BMIForcingFixture_Class): + """Test fixture for ConfigOptions tests.""" + + def __init__(self, cfg: TestConfig_ConfigOptions) -> None: + """Initialize BMIForcingFixture_ConfigOptions. + + Args: + cfg: an instance of TestConfig_ConfigOptions + """ + super().__init__(cfg) + self.test_class = self.config_options + + class BMIForcingFixture_InputForcing(BMIForcingFixture_Class): """Test fixture for InputForcing tests.""" From 3d5927f7bd53e3df5ad923ad3c6789e51684be08 Mon Sep 17 00:00:00 2001 From: "Matthew.Deshotel" Date: Fri, 8 May 2026 12:11:08 -0500 Subject: [PATCH 15/18] exclude mpi_config and config_options --- tests/geomod/test_geomod.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/geomod/test_geomod.py b/tests/geomod/test_geomod.py index 3696414e..a001c6d3 100644 --- a/tests/geomod/test_geomod.py +++ b/tests/geomod/test_geomod.py @@ -21,7 +21,9 @@ configs.TestConfig_GeoMod( config_file=consts.RETRO_FORCING_CONFIG_FILE__AORC_CONUS, keys_to_check=consts.COMPOSITE_KEYS_TO_CHECK, - keys_to_exclude=consts.KEYS_TO_EXCLUDE, + keys_to_exclude=tuple( + set(consts.KEYS_TO_EXCLUDE) | {"config_options", "mpi_config"} + ), grid_type=consts.GRID_TYPE, test_file_name_prefix=TEST_FILE_NAME_PREFIX, ), From bdbaea3997718743a04eb29d18f94738978eee1b Mon Sep 17 00:00:00 2001 From: "Matthew.Deshotel" Date: Fri, 8 May 2026 12:11:39 -0500 Subject: [PATCH 16/18] update expected test data --- ...options_after_update_n1_rank0__step_1.json | 352 ++++++++++++++++ ...options_after_update_n1_rank0__step_2.json | 352 ++++++++++++++++ ...options_after_update_n1_rank0__step_3.json | 352 ++++++++++++++++ ...options_after_update_n2_rank0__step_1.json | 352 ++++++++++++++++ ...options_after_update_n2_rank0__step_2.json | 352 ++++++++++++++++ ...options_after_update_n2_rank0__step_3.json | 352 ++++++++++++++++ ...options_after_update_n2_rank1__step_1.json | 352 ++++++++++++++++ ...options_after_update_n2_rank1__step_2.json | 352 ++++++++++++++++ ...options_after_update_n2_rank1__step_3.json | 352 ++++++++++++++++ ...ted_config_options_finalize_n1_rank0_.json | 352 ++++++++++++++++ ...ted_config_options_finalize_n2_rank0_.json | 352 ++++++++++++++++ ...ted_config_options_finalize_n2_rank1_.json | 352 ++++++++++++++++ ...xpected_config_options_init_n1_rank0_.json | 162 +++++++ ...xpected_config_options_init_n2_rank0_.json | 162 +++++++ ...xpected_config_options_init_n2_rank1_.json | 162 +++++++ ..._geomod_after_update_n1_rank0__step_1.json | 151 +++++++ ..._geomod_after_update_n1_rank0__step_2.json | 151 +++++++ ..._geomod_after_update_n1_rank0__step_3.json | 151 +++++++ ..._geomod_after_update_n2_rank0__step_1.json | 148 +++++++ ..._geomod_after_update_n2_rank0__step_2.json | 148 +++++++ ..._geomod_after_update_n2_rank0__step_3.json | 148 +++++++ ..._geomod_after_update_n2_rank1__step_1.json | 147 +++++++ ..._geomod_after_update_n2_rank1__step_2.json | 147 +++++++ ..._geomod_after_update_n2_rank1__step_3.json | 147 +++++++ ...st_expected_geomod_finalize_n1_rank0_.json | 151 +++++++ ...st_expected_geomod_finalize_n2_rank0_.json | 148 +++++++ ...st_expected_geomod_finalize_n2_rank1_.json | 147 +++++++ .../test_expected_geomod_init_n1_rank0_.json | 151 +++++++ .../test_expected_geomod_init_n2_rank0_.json | 148 +++++++ .../test_expected_geomod_init_n2_rank1_.json | 147 +++++++ ...forcing_after_update_n1_rank0__step_1.json | 72 ++-- ...forcing_after_update_n1_rank0__step_2.json | 44 +- ...forcing_after_update_n1_rank0__step_3.json | 30 +- ...forcing_after_update_n2_rank0__step_1.json | 54 +-- ...forcing_after_update_n2_rank0__step_2.json | 40 +- ...forcing_after_update_n2_rank0__step_3.json | 32 +- ...forcing_after_update_n2_rank1__step_1.json | 48 ++- ...forcing_after_update_n2_rank1__step_2.json | 38 +- ...forcing_after_update_n2_rank1__step_3.json | 36 +- ...cted_input_forcing_finalize_n1_rank0_.json | 30 +- ...cted_input_forcing_finalize_n2_rank0_.json | 32 +- ...cted_input_forcing_finalize_n2_rank1_.json | 36 +- ...expected_input_forcing_init_n1_rank0_.json | 30 +- ...expected_input_forcing_init_n2_rank0_.json | 30 +- ...expected_input_forcing_init_n2_rank1_.json | 30 +- ..._precip_after_update_n1_rank0__step_1.json | 397 ++++++++++++++++++ ..._precip_after_update_n1_rank0__step_2.json | 397 ++++++++++++++++++ ..._precip_after_update_n1_rank0__step_3.json | 397 ++++++++++++++++++ ..._precip_after_update_n2_rank0__step_1.json | 361 ++++++++++++++++ ..._precip_after_update_n2_rank0__step_2.json | 361 ++++++++++++++++ ..._precip_after_update_n2_rank0__step_3.json | 361 ++++++++++++++++ ..._precip_after_update_n2_rank1__step_1.json | 352 ++++++++++++++++ ..._precip_after_update_n2_rank1__step_2.json | 352 ++++++++++++++++ ..._precip_after_update_n2_rank1__step_3.json | 352 ++++++++++++++++ ...pected_supp_precip_finalize_n1_rank0_.json | 397 ++++++++++++++++++ ...pected_supp_precip_finalize_n2_rank0_.json | 361 ++++++++++++++++ ...pected_supp_precip_finalize_n2_rank1_.json | 352 ++++++++++++++++ ...t_expected_supp_precip_init_n1_rank0_.json | 88 ++++ ...t_expected_supp_precip_init_n2_rank0_.json | 80 ++++ ...t_expected_supp_precip_init_n2_rank1_.json | 78 ++++ 60 files changed, 11947 insertions(+), 261 deletions(-) create mode 100644 tests/test_data/expected_results/test_expected_config_options_after_update_n1_rank0__step_1.json create mode 100644 tests/test_data/expected_results/test_expected_config_options_after_update_n1_rank0__step_2.json create mode 100644 tests/test_data/expected_results/test_expected_config_options_after_update_n1_rank0__step_3.json create mode 100644 tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank0__step_1.json create mode 100644 tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank0__step_2.json create mode 100644 tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank0__step_3.json create mode 100644 tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank1__step_1.json create mode 100644 tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank1__step_2.json create mode 100644 tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank1__step_3.json create mode 100644 tests/test_data/expected_results/test_expected_config_options_finalize_n1_rank0_.json create mode 100644 tests/test_data/expected_results/test_expected_config_options_finalize_n2_rank0_.json create mode 100644 tests/test_data/expected_results/test_expected_config_options_finalize_n2_rank1_.json create mode 100644 tests/test_data/expected_results/test_expected_config_options_init_n1_rank0_.json create mode 100644 tests/test_data/expected_results/test_expected_config_options_init_n2_rank0_.json create mode 100644 tests/test_data/expected_results/test_expected_config_options_init_n2_rank1_.json create mode 100644 tests/test_data/expected_results/test_expected_supp_precip_after_update_n1_rank0__step_1.json create mode 100644 tests/test_data/expected_results/test_expected_supp_precip_after_update_n1_rank0__step_2.json create mode 100644 tests/test_data/expected_results/test_expected_supp_precip_after_update_n1_rank0__step_3.json create mode 100644 tests/test_data/expected_results/test_expected_supp_precip_after_update_n2_rank0__step_1.json create mode 100644 tests/test_data/expected_results/test_expected_supp_precip_after_update_n2_rank0__step_2.json create mode 100644 tests/test_data/expected_results/test_expected_supp_precip_after_update_n2_rank0__step_3.json create mode 100644 tests/test_data/expected_results/test_expected_supp_precip_after_update_n2_rank1__step_1.json create mode 100644 tests/test_data/expected_results/test_expected_supp_precip_after_update_n2_rank1__step_2.json create mode 100644 tests/test_data/expected_results/test_expected_supp_precip_after_update_n2_rank1__step_3.json create mode 100644 tests/test_data/expected_results/test_expected_supp_precip_finalize_n1_rank0_.json create mode 100644 tests/test_data/expected_results/test_expected_supp_precip_finalize_n2_rank0_.json create mode 100644 tests/test_data/expected_results/test_expected_supp_precip_finalize_n2_rank1_.json create mode 100644 tests/test_data/expected_results/test_expected_supp_precip_init_n1_rank0_.json create mode 100644 tests/test_data/expected_results/test_expected_supp_precip_init_n2_rank0_.json create mode 100644 tests/test_data/expected_results/test_expected_supp_precip_init_n2_rank1_.json diff --git a/tests/test_data/expected_results/test_expected_config_options_after_update_n1_rank0__step_1.json b/tests/test_data/expected_results/test_expected_config_options_after_update_n1_rank0__step_1.json new file mode 100644 index 00000000..266f31b4 --- /dev/null +++ b/tests/test_data/expected_results/test_expected_config_options_after_update_n1_rank0__step_1.json @@ -0,0 +1,352 @@ +{ + "ExactExtract": null, + "actual_output_steps": 71, + "ana_flag": 0, + "aorc_alaska_source": "s3://ngwpc-data/AORC/Alaska", + "aorc_alaska_url": "{source}/{year}/{year}{month:02d}/AK_AORC-OWP_{date}.nc4", + "aorc_conus_source": "s3://noaa-nws-aorc-v1-1-1km", + "aorc_conus_year_url": "{source}/{year}.zarr", + "aws": true, + "aws_obj": { + "attrs": {}, + "coords": { + "spatial_ref": { + "attrs": { + "crs_wkt": "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]", + "geographic_crs_name": "WGS 84", + "grid_mapping_name": "latitude_longitude", + "horizontal_datum_name": "World Geodetic System 1984", + "inverse_flattening": 298.257223563, + "longitude_of_prime_meridian": 0.0, + "prime_meridian_name": "Greenwich", + "reference_ellipsoid_name": "WGS 84", + "semi_major_axis": 6378137.0, + "semi_minor_axis": 6356752.314245179, + "spatial_ref": "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]" + }, + "data": 0, + "dims": [] + }, + "time": { + "attrs": { + "long_name": "verification time generated by wgrib2 function verftime()", + "reference_date": "2013.01.01 00:00:00 UTC", + "reference_time": 1356998400.0, + "reference_time_description": "kind of product unclear, reference date is variable, min found reference date is given", + "reference_time_type": 0, + "time_step": 0.0, + "time_step_setting": "auto" + }, + "data": "ERR_NOT_JSON_SERIALIZABLE:TYPE:", + "dims": [] + }, + "x": { + "attrs": { + "long_name": "longitude", + "units": "degrees_east" + }, + "data": "hash_-7248319024934117860", + "dims": [ + "x" + ] + }, + "y": { + "attrs": { + "long_name": "latitude", + "units": "degrees_north" + }, + "data": "hash_-6585113156651046999", + "dims": [ + "y" + ] + } + }, + "data_vars": { + "APCP_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Total Precipitation", + "short_name": "APCP_surface", + "units": "kg/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "DLWRF_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Downward Long-Wave Rad. Flux", + "short_name": "DLWRF_surface", + "units": "W/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "DSWRF_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Downward Short-Wave Rad. Flux", + "short_name": "DSWRF_surface", + "units": "W/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "PRES_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Pressure", + "short_name": "PRES_surface", + "units": "Pa" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "SPFH_2maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "2 m above ground", + "long_name": "Specific Humidity", + "short_name": "SPFH_2maboveground", + "units": "kg/kg" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "TMP_2maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "2 m above ground", + "long_name": "Temperature", + "short_name": "TMP_2maboveground", + "units": "K" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "UGRD_10maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "10 m above ground", + "long_name": "U-Component of Wind", + "short_name": "UGRD_10maboveground", + "units": "m/s" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "VGRD_10maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "10 m above ground", + "long_name": "V-Component of Wind", + "short_name": "VGRD_10maboveground", + "units": "m/s" + }, + "data": null, + "dims": [ + "y", + "x" + ] + } + }, + "dims": { + "x": 14, + "y": 28 + } + }, + "aws_time": null, + "b_date_proc": "2013-07-01T00:00:00", + "bmi_time": 3600, + "bmi_time_index": 1, + "cfsv2EnsMember": null, + "config_path": null, + "cosalpha_var": null, + "currentCustomForceNum": 0, + "currentForceNum": 1, + "current_fcst_cycle": "2013-07-01T00:00:00", + "current_output_date": "2013-07-01T01:00:00", + "current_output_step": 1, + "current_time": "2013-07-01T01:00:00", + "customFcstFreq": [], + "customSuppPcpFreq": null, + "cycle_length_minutes": 4260, + "dScaleParamDirs": [ + "/ngen-app/data" + ], + "d_program_init": "2026-05-08T17:05:06", + "e_date_proc": null, + "elemconn_var": "elementConn", + "elemcoords_var": "centerCoords", + "element_id_var": "element_id", + "errFlag": 0, + "errMsg": null, + "fcst_freq": 60, + "fcst_input_horizons": [ + 4260 + ], + "fcst_input_offsets": [ + 0 + ], + "fcst_shift": 0, + "first_fcst_cycle": "2013-07-01T00:00:00", + "forceTemoralInterp": [ + 0 + ], + "forcing_output": 0, + "future_time": null, + "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/dc9ed271e02b6416_gauge_01123000_ESMF_Mesh.nc", + "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", + "globalNdv": -9999.0, + "grid_meta": null, + "grid_type": "hydrofabric", + "hgt_elem_var": null, + "hgt_var": null, + "ignored_border_widths": [ + 0 + ], + "include_lqfrac": 1, + "input_force_dirs": [ + "s3://null" + ], + "input_force_mandatory": [ + 0 + ], + "input_force_types": [ + "GRIB2" + ], + "input_forcings": [ + 12 + ], + "lat_var": null, + "logFile": null, + "logHandle": null, + "lon_var": null, + "look_back": -9999, + "lwBiasCorrectOpt": [ + 0 + ], + "nFcsts": 1, + "nodecoords_var": "nodeCoords", + "num_output_steps": 71, + "num_supp_output_steps": null, + "number_custom_inputs": 0, + "number_inputs": 1, + "number_supp_pcp": 0, + "numelemconn_var": "numElementConn", + "nwmConfig": "AORC", + "nwmVersion": 4.0, + "nwm_domain": null, + "nwm_geogrid": null, + "nwm_source": "s3://noaa-nwm-retrospective-3-0-pds", + "nwm_url": null, + "output_freq": 60, + "paramFlagArray": null, + "precipBiasCorrectOpt": [ + 0 + ], + "precipDownscaleOpt": [ + 0 + ], + "precip_only_flag": false, + "prev_output_date": "2013-07-01T00:00:00", + "process_window": null, + "psfcBiasCorrectOpt": [ + 0 + ], + "psfcDownscaleOpt": [ + 0 + ], + "q2BiasCorrectOpt": [ + 0 + ], + "q2dDownscaleOpt": [ + 0 + ], + "realtime_flag": false, + "refcst_flag": true, + "regrid_opt": [ + 1 + ], + "regrid_opt_supp_pcp": null, + "rqiMethod": null, + "rqiThresh": 1.0, + "runCfsNldasBiasCorrect": false, + "scratch_dir": "/ngen-app/data/scratch/AORC/b428b6743c39a6d8", + "sinalpha_var": null, + "slope_azimuth_var": null, + "slope_azimuth_var_elem": null, + "slope_var": null, + "slope_var_elem": null, + "spatial_meta": null, + "statusMsg": "func esmf_regridobj_call_retry finished after 1 attempts.", + "sub_output_freq": null, + "sub_output_hour": null, + "suppTemporalInterp": null, + "supp_pcp_max_hours": null, + "supp_precip_dirs": null, + "supp_precip_file_types": [], + "supp_precip_forcings": [], + "supp_precip_mandatory": null, + "supp_precip_param_dir": null, + "swBiasCorrectOpt": [ + 0 + ], + "swDownscaleOpt": [ + 0 + ], + "t2BiasCorrectOpt": [ + 0 + ], + "t2dDownscaleOpt": [ + 0 + ], + "useCompression": 0, + "useFloats": 0, + "use_data_at_current_time": true, + "weightsDir": null, + "windBiasCorrect": [ + 0 + ] +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_config_options_after_update_n1_rank0__step_2.json b/tests/test_data/expected_results/test_expected_config_options_after_update_n1_rank0__step_2.json new file mode 100644 index 00000000..206a3fc0 --- /dev/null +++ b/tests/test_data/expected_results/test_expected_config_options_after_update_n1_rank0__step_2.json @@ -0,0 +1,352 @@ +{ + "ExactExtract": null, + "actual_output_steps": 71, + "ana_flag": 0, + "aorc_alaska_source": "s3://ngwpc-data/AORC/Alaska", + "aorc_alaska_url": "{source}/{year}/{year}{month:02d}/AK_AORC-OWP_{date}.nc4", + "aorc_conus_source": "s3://noaa-nws-aorc-v1-1-1km", + "aorc_conus_year_url": "{source}/{year}.zarr", + "aws": true, + "aws_obj": { + "attrs": {}, + "coords": { + "spatial_ref": { + "attrs": { + "crs_wkt": "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]", + "geographic_crs_name": "WGS 84", + "grid_mapping_name": "latitude_longitude", + "horizontal_datum_name": "World Geodetic System 1984", + "inverse_flattening": 298.257223563, + "longitude_of_prime_meridian": 0.0, + "prime_meridian_name": "Greenwich", + "reference_ellipsoid_name": "WGS 84", + "semi_major_axis": 6378137.0, + "semi_minor_axis": 6356752.314245179, + "spatial_ref": "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]" + }, + "data": 0, + "dims": [] + }, + "time": { + "attrs": { + "long_name": "verification time generated by wgrib2 function verftime()", + "reference_date": "2013.01.01 00:00:00 UTC", + "reference_time": 1356998400.0, + "reference_time_description": "kind of product unclear, reference date is variable, min found reference date is given", + "reference_time_type": 0, + "time_step": 0.0, + "time_step_setting": "auto" + }, + "data": "ERR_NOT_JSON_SERIALIZABLE:TYPE:", + "dims": [] + }, + "x": { + "attrs": { + "long_name": "longitude", + "units": "degrees_east" + }, + "data": "hash_-7248319024934117860", + "dims": [ + "x" + ] + }, + "y": { + "attrs": { + "long_name": "latitude", + "units": "degrees_north" + }, + "data": "hash_-6585113156651046999", + "dims": [ + "y" + ] + } + }, + "data_vars": { + "APCP_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Total Precipitation", + "short_name": "APCP_surface", + "units": "kg/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "DLWRF_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Downward Long-Wave Rad. Flux", + "short_name": "DLWRF_surface", + "units": "W/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "DSWRF_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Downward Short-Wave Rad. Flux", + "short_name": "DSWRF_surface", + "units": "W/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "PRES_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Pressure", + "short_name": "PRES_surface", + "units": "Pa" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "SPFH_2maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "2 m above ground", + "long_name": "Specific Humidity", + "short_name": "SPFH_2maboveground", + "units": "kg/kg" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "TMP_2maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "2 m above ground", + "long_name": "Temperature", + "short_name": "TMP_2maboveground", + "units": "K" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "UGRD_10maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "10 m above ground", + "long_name": "U-Component of Wind", + "short_name": "UGRD_10maboveground", + "units": "m/s" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "VGRD_10maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "10 m above ground", + "long_name": "V-Component of Wind", + "short_name": "VGRD_10maboveground", + "units": "m/s" + }, + "data": null, + "dims": [ + "y", + "x" + ] + } + }, + "dims": { + "x": 14, + "y": 28 + } + }, + "aws_time": null, + "b_date_proc": "2013-07-01T00:00:00", + "bmi_time": 7200, + "bmi_time_index": 2, + "cfsv2EnsMember": null, + "config_path": null, + "cosalpha_var": null, + "currentCustomForceNum": 0, + "currentForceNum": 1, + "current_fcst_cycle": "2013-07-01T00:00:00", + "current_output_date": "2013-07-01T02:00:00", + "current_output_step": 2, + "current_time": "2013-07-01T02:00:00", + "customFcstFreq": [], + "customSuppPcpFreq": null, + "cycle_length_minutes": 4260, + "dScaleParamDirs": [ + "/ngen-app/data" + ], + "d_program_init": "2026-05-08T17:05:06", + "e_date_proc": null, + "elemconn_var": "elementConn", + "elemcoords_var": "centerCoords", + "element_id_var": "element_id", + "errFlag": 0, + "errMsg": null, + "fcst_freq": 60, + "fcst_input_horizons": [ + 4260 + ], + "fcst_input_offsets": [ + 0 + ], + "fcst_shift": 0, + "first_fcst_cycle": "2013-07-01T00:00:00", + "forceTemoralInterp": [ + 0 + ], + "forcing_output": 0, + "future_time": null, + "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/dc9ed271e02b6416_gauge_01123000_ESMF_Mesh.nc", + "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", + "globalNdv": -9999.0, + "grid_meta": null, + "grid_type": "hydrofabric", + "hgt_elem_var": null, + "hgt_var": null, + "ignored_border_widths": [ + 0 + ], + "include_lqfrac": 1, + "input_force_dirs": [ + "s3://null" + ], + "input_force_mandatory": [ + 0 + ], + "input_force_types": [ + "GRIB2" + ], + "input_forcings": [ + 12 + ], + "lat_var": null, + "logFile": null, + "logHandle": null, + "lon_var": null, + "look_back": -9999, + "lwBiasCorrectOpt": [ + 0 + ], + "nFcsts": 1, + "nodecoords_var": "nodeCoords", + "num_output_steps": 71, + "num_supp_output_steps": null, + "number_custom_inputs": 0, + "number_inputs": 1, + "number_supp_pcp": 0, + "numelemconn_var": "numElementConn", + "nwmConfig": "AORC", + "nwmVersion": 4.0, + "nwm_domain": null, + "nwm_geogrid": null, + "nwm_source": "s3://noaa-nwm-retrospective-3-0-pds", + "nwm_url": null, + "output_freq": 60, + "paramFlagArray": null, + "precipBiasCorrectOpt": [ + 0 + ], + "precipDownscaleOpt": [ + 0 + ], + "precip_only_flag": false, + "prev_output_date": "2013-07-01T00:00:00", + "process_window": null, + "psfcBiasCorrectOpt": [ + 0 + ], + "psfcDownscaleOpt": [ + 0 + ], + "q2BiasCorrectOpt": [ + 0 + ], + "q2dDownscaleOpt": [ + 0 + ], + "realtime_flag": false, + "refcst_flag": true, + "regrid_opt": [ + 1 + ], + "regrid_opt_supp_pcp": null, + "rqiMethod": null, + "rqiThresh": 1.0, + "runCfsNldasBiasCorrect": false, + "scratch_dir": "/ngen-app/data/scratch/AORC/b428b6743c39a6d8", + "sinalpha_var": null, + "slope_azimuth_var": null, + "slope_azimuth_var_elem": null, + "slope_var": null, + "slope_var_elem": null, + "spatial_meta": null, + "statusMsg": "func esmf_regridobj_call_retry finished after 1 attempts.", + "sub_output_freq": null, + "sub_output_hour": null, + "suppTemporalInterp": null, + "supp_pcp_max_hours": null, + "supp_precip_dirs": null, + "supp_precip_file_types": [], + "supp_precip_forcings": [], + "supp_precip_mandatory": null, + "supp_precip_param_dir": null, + "swBiasCorrectOpt": [ + 0 + ], + "swDownscaleOpt": [ + 0 + ], + "t2BiasCorrectOpt": [ + 0 + ], + "t2dDownscaleOpt": [ + 0 + ], + "useCompression": 0, + "useFloats": 0, + "use_data_at_current_time": true, + "weightsDir": null, + "windBiasCorrect": [ + 0 + ] +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_config_options_after_update_n1_rank0__step_3.json b/tests/test_data/expected_results/test_expected_config_options_after_update_n1_rank0__step_3.json new file mode 100644 index 00000000..e0fd5530 --- /dev/null +++ b/tests/test_data/expected_results/test_expected_config_options_after_update_n1_rank0__step_3.json @@ -0,0 +1,352 @@ +{ + "ExactExtract": null, + "actual_output_steps": 71, + "ana_flag": 0, + "aorc_alaska_source": "s3://ngwpc-data/AORC/Alaska", + "aorc_alaska_url": "{source}/{year}/{year}{month:02d}/AK_AORC-OWP_{date}.nc4", + "aorc_conus_source": "s3://noaa-nws-aorc-v1-1-1km", + "aorc_conus_year_url": "{source}/{year}.zarr", + "aws": true, + "aws_obj": { + "attrs": {}, + "coords": { + "spatial_ref": { + "attrs": { + "crs_wkt": "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]", + "geographic_crs_name": "WGS 84", + "grid_mapping_name": "latitude_longitude", + "horizontal_datum_name": "World Geodetic System 1984", + "inverse_flattening": 298.257223563, + "longitude_of_prime_meridian": 0.0, + "prime_meridian_name": "Greenwich", + "reference_ellipsoid_name": "WGS 84", + "semi_major_axis": 6378137.0, + "semi_minor_axis": 6356752.314245179, + "spatial_ref": "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]" + }, + "data": 0, + "dims": [] + }, + "time": { + "attrs": { + "long_name": "verification time generated by wgrib2 function verftime()", + "reference_date": "2013.01.01 00:00:00 UTC", + "reference_time": 1356998400.0, + "reference_time_description": "kind of product unclear, reference date is variable, min found reference date is given", + "reference_time_type": 0, + "time_step": 0.0, + "time_step_setting": "auto" + }, + "data": "ERR_NOT_JSON_SERIALIZABLE:TYPE:", + "dims": [] + }, + "x": { + "attrs": { + "long_name": "longitude", + "units": "degrees_east" + }, + "data": "hash_-7248319024934117860", + "dims": [ + "x" + ] + }, + "y": { + "attrs": { + "long_name": "latitude", + "units": "degrees_north" + }, + "data": "hash_-6585113156651046999", + "dims": [ + "y" + ] + } + }, + "data_vars": { + "APCP_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Total Precipitation", + "short_name": "APCP_surface", + "units": "kg/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "DLWRF_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Downward Long-Wave Rad. Flux", + "short_name": "DLWRF_surface", + "units": "W/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "DSWRF_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Downward Short-Wave Rad. Flux", + "short_name": "DSWRF_surface", + "units": "W/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "PRES_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Pressure", + "short_name": "PRES_surface", + "units": "Pa" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "SPFH_2maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "2 m above ground", + "long_name": "Specific Humidity", + "short_name": "SPFH_2maboveground", + "units": "kg/kg" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "TMP_2maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "2 m above ground", + "long_name": "Temperature", + "short_name": "TMP_2maboveground", + "units": "K" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "UGRD_10maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "10 m above ground", + "long_name": "U-Component of Wind", + "short_name": "UGRD_10maboveground", + "units": "m/s" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "VGRD_10maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "10 m above ground", + "long_name": "V-Component of Wind", + "short_name": "VGRD_10maboveground", + "units": "m/s" + }, + "data": null, + "dims": [ + "y", + "x" + ] + } + }, + "dims": { + "x": 14, + "y": 28 + } + }, + "aws_time": null, + "b_date_proc": "2013-07-01T00:00:00", + "bmi_time": 10800, + "bmi_time_index": 3, + "cfsv2EnsMember": null, + "config_path": null, + "cosalpha_var": null, + "currentCustomForceNum": 0, + "currentForceNum": 1, + "current_fcst_cycle": "2013-07-01T00:00:00", + "current_output_date": "2013-07-01T03:00:00", + "current_output_step": 3, + "current_time": "2013-07-01T03:00:00", + "customFcstFreq": [], + "customSuppPcpFreq": null, + "cycle_length_minutes": 4260, + "dScaleParamDirs": [ + "/ngen-app/data" + ], + "d_program_init": "2026-05-08T17:05:06", + "e_date_proc": null, + "elemconn_var": "elementConn", + "elemcoords_var": "centerCoords", + "element_id_var": "element_id", + "errFlag": 0, + "errMsg": null, + "fcst_freq": 60, + "fcst_input_horizons": [ + 4260 + ], + "fcst_input_offsets": [ + 0 + ], + "fcst_shift": 0, + "first_fcst_cycle": "2013-07-01T00:00:00", + "forceTemoralInterp": [ + 0 + ], + "forcing_output": 0, + "future_time": null, + "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/dc9ed271e02b6416_gauge_01123000_ESMF_Mesh.nc", + "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", + "globalNdv": -9999.0, + "grid_meta": null, + "grid_type": "hydrofabric", + "hgt_elem_var": null, + "hgt_var": null, + "ignored_border_widths": [ + 0 + ], + "include_lqfrac": 1, + "input_force_dirs": [ + "s3://null" + ], + "input_force_mandatory": [ + 0 + ], + "input_force_types": [ + "GRIB2" + ], + "input_forcings": [ + 12 + ], + "lat_var": null, + "logFile": null, + "logHandle": null, + "lon_var": null, + "look_back": -9999, + "lwBiasCorrectOpt": [ + 0 + ], + "nFcsts": 1, + "nodecoords_var": "nodeCoords", + "num_output_steps": 71, + "num_supp_output_steps": null, + "number_custom_inputs": 0, + "number_inputs": 1, + "number_supp_pcp": 0, + "numelemconn_var": "numElementConn", + "nwmConfig": "AORC", + "nwmVersion": 4.0, + "nwm_domain": null, + "nwm_geogrid": null, + "nwm_source": "s3://noaa-nwm-retrospective-3-0-pds", + "nwm_url": null, + "output_freq": 60, + "paramFlagArray": null, + "precipBiasCorrectOpt": [ + 0 + ], + "precipDownscaleOpt": [ + 0 + ], + "precip_only_flag": false, + "prev_output_date": "2013-07-01T00:00:00", + "process_window": null, + "psfcBiasCorrectOpt": [ + 0 + ], + "psfcDownscaleOpt": [ + 0 + ], + "q2BiasCorrectOpt": [ + 0 + ], + "q2dDownscaleOpt": [ + 0 + ], + "realtime_flag": false, + "refcst_flag": true, + "regrid_opt": [ + 1 + ], + "regrid_opt_supp_pcp": null, + "rqiMethod": null, + "rqiThresh": 1.0, + "runCfsNldasBiasCorrect": false, + "scratch_dir": "/ngen-app/data/scratch/AORC/b428b6743c39a6d8", + "sinalpha_var": null, + "slope_azimuth_var": null, + "slope_azimuth_var_elem": null, + "slope_var": null, + "slope_var_elem": null, + "spatial_meta": null, + "statusMsg": "func esmf_regridobj_call_retry finished after 1 attempts.", + "sub_output_freq": null, + "sub_output_hour": null, + "suppTemporalInterp": null, + "supp_pcp_max_hours": null, + "supp_precip_dirs": null, + "supp_precip_file_types": [], + "supp_precip_forcings": [], + "supp_precip_mandatory": null, + "supp_precip_param_dir": null, + "swBiasCorrectOpt": [ + 0 + ], + "swDownscaleOpt": [ + 0 + ], + "t2BiasCorrectOpt": [ + 0 + ], + "t2dDownscaleOpt": [ + 0 + ], + "useCompression": 0, + "useFloats": 0, + "use_data_at_current_time": true, + "weightsDir": null, + "windBiasCorrect": [ + 0 + ] +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank0__step_1.json b/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank0__step_1.json new file mode 100644 index 00000000..bc7d45c1 --- /dev/null +++ b/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank0__step_1.json @@ -0,0 +1,352 @@ +{ + "ExactExtract": null, + "actual_output_steps": 71, + "ana_flag": 0, + "aorc_alaska_source": "s3://ngwpc-data/AORC/Alaska", + "aorc_alaska_url": "{source}/{year}/{year}{month:02d}/AK_AORC-OWP_{date}.nc4", + "aorc_conus_source": "s3://noaa-nws-aorc-v1-1-1km", + "aorc_conus_year_url": "{source}/{year}.zarr", + "aws": true, + "aws_obj": { + "attrs": {}, + "coords": { + "spatial_ref": { + "attrs": { + "crs_wkt": "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]", + "geographic_crs_name": "WGS 84", + "grid_mapping_name": "latitude_longitude", + "horizontal_datum_name": "World Geodetic System 1984", + "inverse_flattening": 298.257223563, + "longitude_of_prime_meridian": 0.0, + "prime_meridian_name": "Greenwich", + "reference_ellipsoid_name": "WGS 84", + "semi_major_axis": 6378137.0, + "semi_minor_axis": 6356752.314245179, + "spatial_ref": "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]" + }, + "data": 0, + "dims": [] + }, + "time": { + "attrs": { + "long_name": "verification time generated by wgrib2 function verftime()", + "reference_date": "2013.01.01 00:00:00 UTC", + "reference_time": 1356998400.0, + "reference_time_description": "kind of product unclear, reference date is variable, min found reference date is given", + "reference_time_type": 0, + "time_step": 0.0, + "time_step_setting": "auto" + }, + "data": "ERR_NOT_JSON_SERIALIZABLE:TYPE:", + "dims": [] + }, + "x": { + "attrs": { + "long_name": "longitude", + "units": "degrees_east" + }, + "data": "hash_-7248319024934117860", + "dims": [ + "x" + ] + }, + "y": { + "attrs": { + "long_name": "latitude", + "units": "degrees_north" + }, + "data": "hash_-6585113156651046999", + "dims": [ + "y" + ] + } + }, + "data_vars": { + "APCP_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Total Precipitation", + "short_name": "APCP_surface", + "units": "kg/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "DLWRF_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Downward Long-Wave Rad. Flux", + "short_name": "DLWRF_surface", + "units": "W/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "DSWRF_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Downward Short-Wave Rad. Flux", + "short_name": "DSWRF_surface", + "units": "W/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "PRES_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Pressure", + "short_name": "PRES_surface", + "units": "Pa" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "SPFH_2maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "2 m above ground", + "long_name": "Specific Humidity", + "short_name": "SPFH_2maboveground", + "units": "kg/kg" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "TMP_2maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "2 m above ground", + "long_name": "Temperature", + "short_name": "TMP_2maboveground", + "units": "K" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "UGRD_10maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "10 m above ground", + "long_name": "U-Component of Wind", + "short_name": "UGRD_10maboveground", + "units": "m/s" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "VGRD_10maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "10 m above ground", + "long_name": "V-Component of Wind", + "short_name": "VGRD_10maboveground", + "units": "m/s" + }, + "data": null, + "dims": [ + "y", + "x" + ] + } + }, + "dims": { + "x": 14, + "y": 28 + } + }, + "aws_time": null, + "b_date_proc": "2013-07-01T00:00:00", + "bmi_time": 3600, + "bmi_time_index": 1, + "cfsv2EnsMember": null, + "config_path": null, + "cosalpha_var": null, + "currentCustomForceNum": 0, + "currentForceNum": 1, + "current_fcst_cycle": "2013-07-01T00:00:00", + "current_output_date": "2013-07-01T01:00:00", + "current_output_step": 1, + "current_time": "2013-07-01T01:00:00", + "customFcstFreq": [], + "customSuppPcpFreq": null, + "cycle_length_minutes": 4260, + "dScaleParamDirs": [ + "/ngen-app/data" + ], + "d_program_init": "2026-05-08T17:05:24", + "e_date_proc": null, + "elemconn_var": "elementConn", + "elemcoords_var": "centerCoords", + "element_id_var": "element_id", + "errFlag": 0, + "errMsg": null, + "fcst_freq": 60, + "fcst_input_horizons": [ + 4260 + ], + "fcst_input_offsets": [ + 0 + ], + "fcst_shift": 0, + "first_fcst_cycle": "2013-07-01T00:00:00", + "forceTemoralInterp": [ + 0 + ], + "forcing_output": 0, + "future_time": null, + "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/3b7f3fe7676d69c3_gauge_01123000_ESMF_Mesh.nc", + "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", + "globalNdv": -9999.0, + "grid_meta": null, + "grid_type": "hydrofabric", + "hgt_elem_var": null, + "hgt_var": null, + "ignored_border_widths": [ + 0 + ], + "include_lqfrac": 1, + "input_force_dirs": [ + "s3://null" + ], + "input_force_mandatory": [ + 0 + ], + "input_force_types": [ + "GRIB2" + ], + "input_forcings": [ + 12 + ], + "lat_var": null, + "logFile": null, + "logHandle": null, + "lon_var": null, + "look_back": -9999, + "lwBiasCorrectOpt": [ + 0 + ], + "nFcsts": 1, + "nodecoords_var": "nodeCoords", + "num_output_steps": 71, + "num_supp_output_steps": null, + "number_custom_inputs": 0, + "number_inputs": 1, + "number_supp_pcp": 0, + "numelemconn_var": "numElementConn", + "nwmConfig": "AORC", + "nwmVersion": 4.0, + "nwm_domain": null, + "nwm_geogrid": null, + "nwm_source": "s3://noaa-nwm-retrospective-3-0-pds", + "nwm_url": null, + "output_freq": 60, + "paramFlagArray": null, + "precipBiasCorrectOpt": [ + 0 + ], + "precipDownscaleOpt": [ + 0 + ], + "precip_only_flag": false, + "prev_output_date": "2013-07-01T00:00:00", + "process_window": null, + "psfcBiasCorrectOpt": [ + 0 + ], + "psfcDownscaleOpt": [ + 0 + ], + "q2BiasCorrectOpt": [ + 0 + ], + "q2dDownscaleOpt": [ + 0 + ], + "realtime_flag": false, + "refcst_flag": true, + "regrid_opt": [ + 1 + ], + "regrid_opt_supp_pcp": null, + "rqiMethod": null, + "rqiThresh": 1.0, + "runCfsNldasBiasCorrect": false, + "scratch_dir": "/ngen-app/data/scratch/AORC/a00fc45eee325b1d", + "sinalpha_var": null, + "slope_azimuth_var": null, + "slope_azimuth_var_elem": null, + "slope_var": null, + "slope_var_elem": null, + "spatial_meta": null, + "statusMsg": "func esmf_regridobj_call_retry finished after 1 attempts.", + "sub_output_freq": null, + "sub_output_hour": null, + "suppTemporalInterp": null, + "supp_pcp_max_hours": null, + "supp_precip_dirs": null, + "supp_precip_file_types": [], + "supp_precip_forcings": [], + "supp_precip_mandatory": null, + "supp_precip_param_dir": null, + "swBiasCorrectOpt": [ + 0 + ], + "swDownscaleOpt": [ + 0 + ], + "t2BiasCorrectOpt": [ + 0 + ], + "t2dDownscaleOpt": [ + 0 + ], + "useCompression": 0, + "useFloats": 0, + "use_data_at_current_time": true, + "weightsDir": null, + "windBiasCorrect": [ + 0 + ] +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank0__step_2.json b/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank0__step_2.json new file mode 100644 index 00000000..42492757 --- /dev/null +++ b/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank0__step_2.json @@ -0,0 +1,352 @@ +{ + "ExactExtract": null, + "actual_output_steps": 71, + "ana_flag": 0, + "aorc_alaska_source": "s3://ngwpc-data/AORC/Alaska", + "aorc_alaska_url": "{source}/{year}/{year}{month:02d}/AK_AORC-OWP_{date}.nc4", + "aorc_conus_source": "s3://noaa-nws-aorc-v1-1-1km", + "aorc_conus_year_url": "{source}/{year}.zarr", + "aws": true, + "aws_obj": { + "attrs": {}, + "coords": { + "spatial_ref": { + "attrs": { + "crs_wkt": "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]", + "geographic_crs_name": "WGS 84", + "grid_mapping_name": "latitude_longitude", + "horizontal_datum_name": "World Geodetic System 1984", + "inverse_flattening": 298.257223563, + "longitude_of_prime_meridian": 0.0, + "prime_meridian_name": "Greenwich", + "reference_ellipsoid_name": "WGS 84", + "semi_major_axis": 6378137.0, + "semi_minor_axis": 6356752.314245179, + "spatial_ref": "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]" + }, + "data": 0, + "dims": [] + }, + "time": { + "attrs": { + "long_name": "verification time generated by wgrib2 function verftime()", + "reference_date": "2013.01.01 00:00:00 UTC", + "reference_time": 1356998400.0, + "reference_time_description": "kind of product unclear, reference date is variable, min found reference date is given", + "reference_time_type": 0, + "time_step": 0.0, + "time_step_setting": "auto" + }, + "data": "ERR_NOT_JSON_SERIALIZABLE:TYPE:", + "dims": [] + }, + "x": { + "attrs": { + "long_name": "longitude", + "units": "degrees_east" + }, + "data": "hash_-7248319024934117860", + "dims": [ + "x" + ] + }, + "y": { + "attrs": { + "long_name": "latitude", + "units": "degrees_north" + }, + "data": "hash_-6585113156651046999", + "dims": [ + "y" + ] + } + }, + "data_vars": { + "APCP_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Total Precipitation", + "short_name": "APCP_surface", + "units": "kg/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "DLWRF_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Downward Long-Wave Rad. Flux", + "short_name": "DLWRF_surface", + "units": "W/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "DSWRF_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Downward Short-Wave Rad. Flux", + "short_name": "DSWRF_surface", + "units": "W/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "PRES_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Pressure", + "short_name": "PRES_surface", + "units": "Pa" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "SPFH_2maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "2 m above ground", + "long_name": "Specific Humidity", + "short_name": "SPFH_2maboveground", + "units": "kg/kg" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "TMP_2maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "2 m above ground", + "long_name": "Temperature", + "short_name": "TMP_2maboveground", + "units": "K" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "UGRD_10maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "10 m above ground", + "long_name": "U-Component of Wind", + "short_name": "UGRD_10maboveground", + "units": "m/s" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "VGRD_10maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "10 m above ground", + "long_name": "V-Component of Wind", + "short_name": "VGRD_10maboveground", + "units": "m/s" + }, + "data": null, + "dims": [ + "y", + "x" + ] + } + }, + "dims": { + "x": 14, + "y": 28 + } + }, + "aws_time": null, + "b_date_proc": "2013-07-01T00:00:00", + "bmi_time": 7200, + "bmi_time_index": 2, + "cfsv2EnsMember": null, + "config_path": null, + "cosalpha_var": null, + "currentCustomForceNum": 0, + "currentForceNum": 1, + "current_fcst_cycle": "2013-07-01T00:00:00", + "current_output_date": "2013-07-01T02:00:00", + "current_output_step": 2, + "current_time": "2013-07-01T02:00:00", + "customFcstFreq": [], + "customSuppPcpFreq": null, + "cycle_length_minutes": 4260, + "dScaleParamDirs": [ + "/ngen-app/data" + ], + "d_program_init": "2026-05-08T17:05:24", + "e_date_proc": null, + "elemconn_var": "elementConn", + "elemcoords_var": "centerCoords", + "element_id_var": "element_id", + "errFlag": 0, + "errMsg": null, + "fcst_freq": 60, + "fcst_input_horizons": [ + 4260 + ], + "fcst_input_offsets": [ + 0 + ], + "fcst_shift": 0, + "first_fcst_cycle": "2013-07-01T00:00:00", + "forceTemoralInterp": [ + 0 + ], + "forcing_output": 0, + "future_time": null, + "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/3b7f3fe7676d69c3_gauge_01123000_ESMF_Mesh.nc", + "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", + "globalNdv": -9999.0, + "grid_meta": null, + "grid_type": "hydrofabric", + "hgt_elem_var": null, + "hgt_var": null, + "ignored_border_widths": [ + 0 + ], + "include_lqfrac": 1, + "input_force_dirs": [ + "s3://null" + ], + "input_force_mandatory": [ + 0 + ], + "input_force_types": [ + "GRIB2" + ], + "input_forcings": [ + 12 + ], + "lat_var": null, + "logFile": null, + "logHandle": null, + "lon_var": null, + "look_back": -9999, + "lwBiasCorrectOpt": [ + 0 + ], + "nFcsts": 1, + "nodecoords_var": "nodeCoords", + "num_output_steps": 71, + "num_supp_output_steps": null, + "number_custom_inputs": 0, + "number_inputs": 1, + "number_supp_pcp": 0, + "numelemconn_var": "numElementConn", + "nwmConfig": "AORC", + "nwmVersion": 4.0, + "nwm_domain": null, + "nwm_geogrid": null, + "nwm_source": "s3://noaa-nwm-retrospective-3-0-pds", + "nwm_url": null, + "output_freq": 60, + "paramFlagArray": null, + "precipBiasCorrectOpt": [ + 0 + ], + "precipDownscaleOpt": [ + 0 + ], + "precip_only_flag": false, + "prev_output_date": "2013-07-01T00:00:00", + "process_window": null, + "psfcBiasCorrectOpt": [ + 0 + ], + "psfcDownscaleOpt": [ + 0 + ], + "q2BiasCorrectOpt": [ + 0 + ], + "q2dDownscaleOpt": [ + 0 + ], + "realtime_flag": false, + "refcst_flag": true, + "regrid_opt": [ + 1 + ], + "regrid_opt_supp_pcp": null, + "rqiMethod": null, + "rqiThresh": 1.0, + "runCfsNldasBiasCorrect": false, + "scratch_dir": "/ngen-app/data/scratch/AORC/a00fc45eee325b1d", + "sinalpha_var": null, + "slope_azimuth_var": null, + "slope_azimuth_var_elem": null, + "slope_var": null, + "slope_var_elem": null, + "spatial_meta": null, + "statusMsg": "func esmf_regridobj_call_retry finished after 1 attempts.", + "sub_output_freq": null, + "sub_output_hour": null, + "suppTemporalInterp": null, + "supp_pcp_max_hours": null, + "supp_precip_dirs": null, + "supp_precip_file_types": [], + "supp_precip_forcings": [], + "supp_precip_mandatory": null, + "supp_precip_param_dir": null, + "swBiasCorrectOpt": [ + 0 + ], + "swDownscaleOpt": [ + 0 + ], + "t2BiasCorrectOpt": [ + 0 + ], + "t2dDownscaleOpt": [ + 0 + ], + "useCompression": 0, + "useFloats": 0, + "use_data_at_current_time": true, + "weightsDir": null, + "windBiasCorrect": [ + 0 + ] +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank0__step_3.json b/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank0__step_3.json new file mode 100644 index 00000000..1330db80 --- /dev/null +++ b/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank0__step_3.json @@ -0,0 +1,352 @@ +{ + "ExactExtract": null, + "actual_output_steps": 71, + "ana_flag": 0, + "aorc_alaska_source": "s3://ngwpc-data/AORC/Alaska", + "aorc_alaska_url": "{source}/{year}/{year}{month:02d}/AK_AORC-OWP_{date}.nc4", + "aorc_conus_source": "s3://noaa-nws-aorc-v1-1-1km", + "aorc_conus_year_url": "{source}/{year}.zarr", + "aws": true, + "aws_obj": { + "attrs": {}, + "coords": { + "spatial_ref": { + "attrs": { + "crs_wkt": "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]", + "geographic_crs_name": "WGS 84", + "grid_mapping_name": "latitude_longitude", + "horizontal_datum_name": "World Geodetic System 1984", + "inverse_flattening": 298.257223563, + "longitude_of_prime_meridian": 0.0, + "prime_meridian_name": "Greenwich", + "reference_ellipsoid_name": "WGS 84", + "semi_major_axis": 6378137.0, + "semi_minor_axis": 6356752.314245179, + "spatial_ref": "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]" + }, + "data": 0, + "dims": [] + }, + "time": { + "attrs": { + "long_name": "verification time generated by wgrib2 function verftime()", + "reference_date": "2013.01.01 00:00:00 UTC", + "reference_time": 1356998400.0, + "reference_time_description": "kind of product unclear, reference date is variable, min found reference date is given", + "reference_time_type": 0, + "time_step": 0.0, + "time_step_setting": "auto" + }, + "data": "ERR_NOT_JSON_SERIALIZABLE:TYPE:", + "dims": [] + }, + "x": { + "attrs": { + "long_name": "longitude", + "units": "degrees_east" + }, + "data": "hash_-7248319024934117860", + "dims": [ + "x" + ] + }, + "y": { + "attrs": { + "long_name": "latitude", + "units": "degrees_north" + }, + "data": "hash_-6585113156651046999", + "dims": [ + "y" + ] + } + }, + "data_vars": { + "APCP_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Total Precipitation", + "short_name": "APCP_surface", + "units": "kg/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "DLWRF_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Downward Long-Wave Rad. Flux", + "short_name": "DLWRF_surface", + "units": "W/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "DSWRF_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Downward Short-Wave Rad. Flux", + "short_name": "DSWRF_surface", + "units": "W/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "PRES_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Pressure", + "short_name": "PRES_surface", + "units": "Pa" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "SPFH_2maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "2 m above ground", + "long_name": "Specific Humidity", + "short_name": "SPFH_2maboveground", + "units": "kg/kg" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "TMP_2maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "2 m above ground", + "long_name": "Temperature", + "short_name": "TMP_2maboveground", + "units": "K" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "UGRD_10maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "10 m above ground", + "long_name": "U-Component of Wind", + "short_name": "UGRD_10maboveground", + "units": "m/s" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "VGRD_10maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "10 m above ground", + "long_name": "V-Component of Wind", + "short_name": "VGRD_10maboveground", + "units": "m/s" + }, + "data": null, + "dims": [ + "y", + "x" + ] + } + }, + "dims": { + "x": 14, + "y": 28 + } + }, + "aws_time": null, + "b_date_proc": "2013-07-01T00:00:00", + "bmi_time": 10800, + "bmi_time_index": 3, + "cfsv2EnsMember": null, + "config_path": null, + "cosalpha_var": null, + "currentCustomForceNum": 0, + "currentForceNum": 1, + "current_fcst_cycle": "2013-07-01T00:00:00", + "current_output_date": "2013-07-01T03:00:00", + "current_output_step": 3, + "current_time": "2013-07-01T03:00:00", + "customFcstFreq": [], + "customSuppPcpFreq": null, + "cycle_length_minutes": 4260, + "dScaleParamDirs": [ + "/ngen-app/data" + ], + "d_program_init": "2026-05-08T17:05:24", + "e_date_proc": null, + "elemconn_var": "elementConn", + "elemcoords_var": "centerCoords", + "element_id_var": "element_id", + "errFlag": 0, + "errMsg": null, + "fcst_freq": 60, + "fcst_input_horizons": [ + 4260 + ], + "fcst_input_offsets": [ + 0 + ], + "fcst_shift": 0, + "first_fcst_cycle": "2013-07-01T00:00:00", + "forceTemoralInterp": [ + 0 + ], + "forcing_output": 0, + "future_time": null, + "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/3b7f3fe7676d69c3_gauge_01123000_ESMF_Mesh.nc", + "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", + "globalNdv": -9999.0, + "grid_meta": null, + "grid_type": "hydrofabric", + "hgt_elem_var": null, + "hgt_var": null, + "ignored_border_widths": [ + 0 + ], + "include_lqfrac": 1, + "input_force_dirs": [ + "s3://null" + ], + "input_force_mandatory": [ + 0 + ], + "input_force_types": [ + "GRIB2" + ], + "input_forcings": [ + 12 + ], + "lat_var": null, + "logFile": null, + "logHandle": null, + "lon_var": null, + "look_back": -9999, + "lwBiasCorrectOpt": [ + 0 + ], + "nFcsts": 1, + "nodecoords_var": "nodeCoords", + "num_output_steps": 71, + "num_supp_output_steps": null, + "number_custom_inputs": 0, + "number_inputs": 1, + "number_supp_pcp": 0, + "numelemconn_var": "numElementConn", + "nwmConfig": "AORC", + "nwmVersion": 4.0, + "nwm_domain": null, + "nwm_geogrid": null, + "nwm_source": "s3://noaa-nwm-retrospective-3-0-pds", + "nwm_url": null, + "output_freq": 60, + "paramFlagArray": null, + "precipBiasCorrectOpt": [ + 0 + ], + "precipDownscaleOpt": [ + 0 + ], + "precip_only_flag": false, + "prev_output_date": "2013-07-01T00:00:00", + "process_window": null, + "psfcBiasCorrectOpt": [ + 0 + ], + "psfcDownscaleOpt": [ + 0 + ], + "q2BiasCorrectOpt": [ + 0 + ], + "q2dDownscaleOpt": [ + 0 + ], + "realtime_flag": false, + "refcst_flag": true, + "regrid_opt": [ + 1 + ], + "regrid_opt_supp_pcp": null, + "rqiMethod": null, + "rqiThresh": 1.0, + "runCfsNldasBiasCorrect": false, + "scratch_dir": "/ngen-app/data/scratch/AORC/a00fc45eee325b1d", + "sinalpha_var": null, + "slope_azimuth_var": null, + "slope_azimuth_var_elem": null, + "slope_var": null, + "slope_var_elem": null, + "spatial_meta": null, + "statusMsg": "func esmf_regridobj_call_retry finished after 1 attempts.", + "sub_output_freq": null, + "sub_output_hour": null, + "suppTemporalInterp": null, + "supp_pcp_max_hours": null, + "supp_precip_dirs": null, + "supp_precip_file_types": [], + "supp_precip_forcings": [], + "supp_precip_mandatory": null, + "supp_precip_param_dir": null, + "swBiasCorrectOpt": [ + 0 + ], + "swDownscaleOpt": [ + 0 + ], + "t2BiasCorrectOpt": [ + 0 + ], + "t2dDownscaleOpt": [ + 0 + ], + "useCompression": 0, + "useFloats": 0, + "use_data_at_current_time": true, + "weightsDir": null, + "windBiasCorrect": [ + 0 + ] +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank1__step_1.json b/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank1__step_1.json new file mode 100644 index 00000000..bc7d45c1 --- /dev/null +++ b/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank1__step_1.json @@ -0,0 +1,352 @@ +{ + "ExactExtract": null, + "actual_output_steps": 71, + "ana_flag": 0, + "aorc_alaska_source": "s3://ngwpc-data/AORC/Alaska", + "aorc_alaska_url": "{source}/{year}/{year}{month:02d}/AK_AORC-OWP_{date}.nc4", + "aorc_conus_source": "s3://noaa-nws-aorc-v1-1-1km", + "aorc_conus_year_url": "{source}/{year}.zarr", + "aws": true, + "aws_obj": { + "attrs": {}, + "coords": { + "spatial_ref": { + "attrs": { + "crs_wkt": "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]", + "geographic_crs_name": "WGS 84", + "grid_mapping_name": "latitude_longitude", + "horizontal_datum_name": "World Geodetic System 1984", + "inverse_flattening": 298.257223563, + "longitude_of_prime_meridian": 0.0, + "prime_meridian_name": "Greenwich", + "reference_ellipsoid_name": "WGS 84", + "semi_major_axis": 6378137.0, + "semi_minor_axis": 6356752.314245179, + "spatial_ref": "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]" + }, + "data": 0, + "dims": [] + }, + "time": { + "attrs": { + "long_name": "verification time generated by wgrib2 function verftime()", + "reference_date": "2013.01.01 00:00:00 UTC", + "reference_time": 1356998400.0, + "reference_time_description": "kind of product unclear, reference date is variable, min found reference date is given", + "reference_time_type": 0, + "time_step": 0.0, + "time_step_setting": "auto" + }, + "data": "ERR_NOT_JSON_SERIALIZABLE:TYPE:", + "dims": [] + }, + "x": { + "attrs": { + "long_name": "longitude", + "units": "degrees_east" + }, + "data": "hash_-7248319024934117860", + "dims": [ + "x" + ] + }, + "y": { + "attrs": { + "long_name": "latitude", + "units": "degrees_north" + }, + "data": "hash_-6585113156651046999", + "dims": [ + "y" + ] + } + }, + "data_vars": { + "APCP_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Total Precipitation", + "short_name": "APCP_surface", + "units": "kg/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "DLWRF_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Downward Long-Wave Rad. Flux", + "short_name": "DLWRF_surface", + "units": "W/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "DSWRF_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Downward Short-Wave Rad. Flux", + "short_name": "DSWRF_surface", + "units": "W/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "PRES_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Pressure", + "short_name": "PRES_surface", + "units": "Pa" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "SPFH_2maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "2 m above ground", + "long_name": "Specific Humidity", + "short_name": "SPFH_2maboveground", + "units": "kg/kg" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "TMP_2maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "2 m above ground", + "long_name": "Temperature", + "short_name": "TMP_2maboveground", + "units": "K" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "UGRD_10maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "10 m above ground", + "long_name": "U-Component of Wind", + "short_name": "UGRD_10maboveground", + "units": "m/s" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "VGRD_10maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "10 m above ground", + "long_name": "V-Component of Wind", + "short_name": "VGRD_10maboveground", + "units": "m/s" + }, + "data": null, + "dims": [ + "y", + "x" + ] + } + }, + "dims": { + "x": 14, + "y": 28 + } + }, + "aws_time": null, + "b_date_proc": "2013-07-01T00:00:00", + "bmi_time": 3600, + "bmi_time_index": 1, + "cfsv2EnsMember": null, + "config_path": null, + "cosalpha_var": null, + "currentCustomForceNum": 0, + "currentForceNum": 1, + "current_fcst_cycle": "2013-07-01T00:00:00", + "current_output_date": "2013-07-01T01:00:00", + "current_output_step": 1, + "current_time": "2013-07-01T01:00:00", + "customFcstFreq": [], + "customSuppPcpFreq": null, + "cycle_length_minutes": 4260, + "dScaleParamDirs": [ + "/ngen-app/data" + ], + "d_program_init": "2026-05-08T17:05:24", + "e_date_proc": null, + "elemconn_var": "elementConn", + "elemcoords_var": "centerCoords", + "element_id_var": "element_id", + "errFlag": 0, + "errMsg": null, + "fcst_freq": 60, + "fcst_input_horizons": [ + 4260 + ], + "fcst_input_offsets": [ + 0 + ], + "fcst_shift": 0, + "first_fcst_cycle": "2013-07-01T00:00:00", + "forceTemoralInterp": [ + 0 + ], + "forcing_output": 0, + "future_time": null, + "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/3b7f3fe7676d69c3_gauge_01123000_ESMF_Mesh.nc", + "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", + "globalNdv": -9999.0, + "grid_meta": null, + "grid_type": "hydrofabric", + "hgt_elem_var": null, + "hgt_var": null, + "ignored_border_widths": [ + 0 + ], + "include_lqfrac": 1, + "input_force_dirs": [ + "s3://null" + ], + "input_force_mandatory": [ + 0 + ], + "input_force_types": [ + "GRIB2" + ], + "input_forcings": [ + 12 + ], + "lat_var": null, + "logFile": null, + "logHandle": null, + "lon_var": null, + "look_back": -9999, + "lwBiasCorrectOpt": [ + 0 + ], + "nFcsts": 1, + "nodecoords_var": "nodeCoords", + "num_output_steps": 71, + "num_supp_output_steps": null, + "number_custom_inputs": 0, + "number_inputs": 1, + "number_supp_pcp": 0, + "numelemconn_var": "numElementConn", + "nwmConfig": "AORC", + "nwmVersion": 4.0, + "nwm_domain": null, + "nwm_geogrid": null, + "nwm_source": "s3://noaa-nwm-retrospective-3-0-pds", + "nwm_url": null, + "output_freq": 60, + "paramFlagArray": null, + "precipBiasCorrectOpt": [ + 0 + ], + "precipDownscaleOpt": [ + 0 + ], + "precip_only_flag": false, + "prev_output_date": "2013-07-01T00:00:00", + "process_window": null, + "psfcBiasCorrectOpt": [ + 0 + ], + "psfcDownscaleOpt": [ + 0 + ], + "q2BiasCorrectOpt": [ + 0 + ], + "q2dDownscaleOpt": [ + 0 + ], + "realtime_flag": false, + "refcst_flag": true, + "regrid_opt": [ + 1 + ], + "regrid_opt_supp_pcp": null, + "rqiMethod": null, + "rqiThresh": 1.0, + "runCfsNldasBiasCorrect": false, + "scratch_dir": "/ngen-app/data/scratch/AORC/a00fc45eee325b1d", + "sinalpha_var": null, + "slope_azimuth_var": null, + "slope_azimuth_var_elem": null, + "slope_var": null, + "slope_var_elem": null, + "spatial_meta": null, + "statusMsg": "func esmf_regridobj_call_retry finished after 1 attempts.", + "sub_output_freq": null, + "sub_output_hour": null, + "suppTemporalInterp": null, + "supp_pcp_max_hours": null, + "supp_precip_dirs": null, + "supp_precip_file_types": [], + "supp_precip_forcings": [], + "supp_precip_mandatory": null, + "supp_precip_param_dir": null, + "swBiasCorrectOpt": [ + 0 + ], + "swDownscaleOpt": [ + 0 + ], + "t2BiasCorrectOpt": [ + 0 + ], + "t2dDownscaleOpt": [ + 0 + ], + "useCompression": 0, + "useFloats": 0, + "use_data_at_current_time": true, + "weightsDir": null, + "windBiasCorrect": [ + 0 + ] +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank1__step_2.json b/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank1__step_2.json new file mode 100644 index 00000000..42492757 --- /dev/null +++ b/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank1__step_2.json @@ -0,0 +1,352 @@ +{ + "ExactExtract": null, + "actual_output_steps": 71, + "ana_flag": 0, + "aorc_alaska_source": "s3://ngwpc-data/AORC/Alaska", + "aorc_alaska_url": "{source}/{year}/{year}{month:02d}/AK_AORC-OWP_{date}.nc4", + "aorc_conus_source": "s3://noaa-nws-aorc-v1-1-1km", + "aorc_conus_year_url": "{source}/{year}.zarr", + "aws": true, + "aws_obj": { + "attrs": {}, + "coords": { + "spatial_ref": { + "attrs": { + "crs_wkt": "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]", + "geographic_crs_name": "WGS 84", + "grid_mapping_name": "latitude_longitude", + "horizontal_datum_name": "World Geodetic System 1984", + "inverse_flattening": 298.257223563, + "longitude_of_prime_meridian": 0.0, + "prime_meridian_name": "Greenwich", + "reference_ellipsoid_name": "WGS 84", + "semi_major_axis": 6378137.0, + "semi_minor_axis": 6356752.314245179, + "spatial_ref": "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]" + }, + "data": 0, + "dims": [] + }, + "time": { + "attrs": { + "long_name": "verification time generated by wgrib2 function verftime()", + "reference_date": "2013.01.01 00:00:00 UTC", + "reference_time": 1356998400.0, + "reference_time_description": "kind of product unclear, reference date is variable, min found reference date is given", + "reference_time_type": 0, + "time_step": 0.0, + "time_step_setting": "auto" + }, + "data": "ERR_NOT_JSON_SERIALIZABLE:TYPE:", + "dims": [] + }, + "x": { + "attrs": { + "long_name": "longitude", + "units": "degrees_east" + }, + "data": "hash_-7248319024934117860", + "dims": [ + "x" + ] + }, + "y": { + "attrs": { + "long_name": "latitude", + "units": "degrees_north" + }, + "data": "hash_-6585113156651046999", + "dims": [ + "y" + ] + } + }, + "data_vars": { + "APCP_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Total Precipitation", + "short_name": "APCP_surface", + "units": "kg/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "DLWRF_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Downward Long-Wave Rad. Flux", + "short_name": "DLWRF_surface", + "units": "W/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "DSWRF_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Downward Short-Wave Rad. Flux", + "short_name": "DSWRF_surface", + "units": "W/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "PRES_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Pressure", + "short_name": "PRES_surface", + "units": "Pa" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "SPFH_2maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "2 m above ground", + "long_name": "Specific Humidity", + "short_name": "SPFH_2maboveground", + "units": "kg/kg" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "TMP_2maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "2 m above ground", + "long_name": "Temperature", + "short_name": "TMP_2maboveground", + "units": "K" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "UGRD_10maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "10 m above ground", + "long_name": "U-Component of Wind", + "short_name": "UGRD_10maboveground", + "units": "m/s" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "VGRD_10maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "10 m above ground", + "long_name": "V-Component of Wind", + "short_name": "VGRD_10maboveground", + "units": "m/s" + }, + "data": null, + "dims": [ + "y", + "x" + ] + } + }, + "dims": { + "x": 14, + "y": 28 + } + }, + "aws_time": null, + "b_date_proc": "2013-07-01T00:00:00", + "bmi_time": 7200, + "bmi_time_index": 2, + "cfsv2EnsMember": null, + "config_path": null, + "cosalpha_var": null, + "currentCustomForceNum": 0, + "currentForceNum": 1, + "current_fcst_cycle": "2013-07-01T00:00:00", + "current_output_date": "2013-07-01T02:00:00", + "current_output_step": 2, + "current_time": "2013-07-01T02:00:00", + "customFcstFreq": [], + "customSuppPcpFreq": null, + "cycle_length_minutes": 4260, + "dScaleParamDirs": [ + "/ngen-app/data" + ], + "d_program_init": "2026-05-08T17:05:24", + "e_date_proc": null, + "elemconn_var": "elementConn", + "elemcoords_var": "centerCoords", + "element_id_var": "element_id", + "errFlag": 0, + "errMsg": null, + "fcst_freq": 60, + "fcst_input_horizons": [ + 4260 + ], + "fcst_input_offsets": [ + 0 + ], + "fcst_shift": 0, + "first_fcst_cycle": "2013-07-01T00:00:00", + "forceTemoralInterp": [ + 0 + ], + "forcing_output": 0, + "future_time": null, + "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/3b7f3fe7676d69c3_gauge_01123000_ESMF_Mesh.nc", + "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", + "globalNdv": -9999.0, + "grid_meta": null, + "grid_type": "hydrofabric", + "hgt_elem_var": null, + "hgt_var": null, + "ignored_border_widths": [ + 0 + ], + "include_lqfrac": 1, + "input_force_dirs": [ + "s3://null" + ], + "input_force_mandatory": [ + 0 + ], + "input_force_types": [ + "GRIB2" + ], + "input_forcings": [ + 12 + ], + "lat_var": null, + "logFile": null, + "logHandle": null, + "lon_var": null, + "look_back": -9999, + "lwBiasCorrectOpt": [ + 0 + ], + "nFcsts": 1, + "nodecoords_var": "nodeCoords", + "num_output_steps": 71, + "num_supp_output_steps": null, + "number_custom_inputs": 0, + "number_inputs": 1, + "number_supp_pcp": 0, + "numelemconn_var": "numElementConn", + "nwmConfig": "AORC", + "nwmVersion": 4.0, + "nwm_domain": null, + "nwm_geogrid": null, + "nwm_source": "s3://noaa-nwm-retrospective-3-0-pds", + "nwm_url": null, + "output_freq": 60, + "paramFlagArray": null, + "precipBiasCorrectOpt": [ + 0 + ], + "precipDownscaleOpt": [ + 0 + ], + "precip_only_flag": false, + "prev_output_date": "2013-07-01T00:00:00", + "process_window": null, + "psfcBiasCorrectOpt": [ + 0 + ], + "psfcDownscaleOpt": [ + 0 + ], + "q2BiasCorrectOpt": [ + 0 + ], + "q2dDownscaleOpt": [ + 0 + ], + "realtime_flag": false, + "refcst_flag": true, + "regrid_opt": [ + 1 + ], + "regrid_opt_supp_pcp": null, + "rqiMethod": null, + "rqiThresh": 1.0, + "runCfsNldasBiasCorrect": false, + "scratch_dir": "/ngen-app/data/scratch/AORC/a00fc45eee325b1d", + "sinalpha_var": null, + "slope_azimuth_var": null, + "slope_azimuth_var_elem": null, + "slope_var": null, + "slope_var_elem": null, + "spatial_meta": null, + "statusMsg": "func esmf_regridobj_call_retry finished after 1 attempts.", + "sub_output_freq": null, + "sub_output_hour": null, + "suppTemporalInterp": null, + "supp_pcp_max_hours": null, + "supp_precip_dirs": null, + "supp_precip_file_types": [], + "supp_precip_forcings": [], + "supp_precip_mandatory": null, + "supp_precip_param_dir": null, + "swBiasCorrectOpt": [ + 0 + ], + "swDownscaleOpt": [ + 0 + ], + "t2BiasCorrectOpt": [ + 0 + ], + "t2dDownscaleOpt": [ + 0 + ], + "useCompression": 0, + "useFloats": 0, + "use_data_at_current_time": true, + "weightsDir": null, + "windBiasCorrect": [ + 0 + ] +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank1__step_3.json b/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank1__step_3.json new file mode 100644 index 00000000..1330db80 --- /dev/null +++ b/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank1__step_3.json @@ -0,0 +1,352 @@ +{ + "ExactExtract": null, + "actual_output_steps": 71, + "ana_flag": 0, + "aorc_alaska_source": "s3://ngwpc-data/AORC/Alaska", + "aorc_alaska_url": "{source}/{year}/{year}{month:02d}/AK_AORC-OWP_{date}.nc4", + "aorc_conus_source": "s3://noaa-nws-aorc-v1-1-1km", + "aorc_conus_year_url": "{source}/{year}.zarr", + "aws": true, + "aws_obj": { + "attrs": {}, + "coords": { + "spatial_ref": { + "attrs": { + "crs_wkt": "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]", + "geographic_crs_name": "WGS 84", + "grid_mapping_name": "latitude_longitude", + "horizontal_datum_name": "World Geodetic System 1984", + "inverse_flattening": 298.257223563, + "longitude_of_prime_meridian": 0.0, + "prime_meridian_name": "Greenwich", + "reference_ellipsoid_name": "WGS 84", + "semi_major_axis": 6378137.0, + "semi_minor_axis": 6356752.314245179, + "spatial_ref": "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]" + }, + "data": 0, + "dims": [] + }, + "time": { + "attrs": { + "long_name": "verification time generated by wgrib2 function verftime()", + "reference_date": "2013.01.01 00:00:00 UTC", + "reference_time": 1356998400.0, + "reference_time_description": "kind of product unclear, reference date is variable, min found reference date is given", + "reference_time_type": 0, + "time_step": 0.0, + "time_step_setting": "auto" + }, + "data": "ERR_NOT_JSON_SERIALIZABLE:TYPE:", + "dims": [] + }, + "x": { + "attrs": { + "long_name": "longitude", + "units": "degrees_east" + }, + "data": "hash_-7248319024934117860", + "dims": [ + "x" + ] + }, + "y": { + "attrs": { + "long_name": "latitude", + "units": "degrees_north" + }, + "data": "hash_-6585113156651046999", + "dims": [ + "y" + ] + } + }, + "data_vars": { + "APCP_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Total Precipitation", + "short_name": "APCP_surface", + "units": "kg/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "DLWRF_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Downward Long-Wave Rad. Flux", + "short_name": "DLWRF_surface", + "units": "W/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "DSWRF_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Downward Short-Wave Rad. Flux", + "short_name": "DSWRF_surface", + "units": "W/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "PRES_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Pressure", + "short_name": "PRES_surface", + "units": "Pa" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "SPFH_2maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "2 m above ground", + "long_name": "Specific Humidity", + "short_name": "SPFH_2maboveground", + "units": "kg/kg" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "TMP_2maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "2 m above ground", + "long_name": "Temperature", + "short_name": "TMP_2maboveground", + "units": "K" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "UGRD_10maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "10 m above ground", + "long_name": "U-Component of Wind", + "short_name": "UGRD_10maboveground", + "units": "m/s" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "VGRD_10maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "10 m above ground", + "long_name": "V-Component of Wind", + "short_name": "VGRD_10maboveground", + "units": "m/s" + }, + "data": null, + "dims": [ + "y", + "x" + ] + } + }, + "dims": { + "x": 14, + "y": 28 + } + }, + "aws_time": null, + "b_date_proc": "2013-07-01T00:00:00", + "bmi_time": 10800, + "bmi_time_index": 3, + "cfsv2EnsMember": null, + "config_path": null, + "cosalpha_var": null, + "currentCustomForceNum": 0, + "currentForceNum": 1, + "current_fcst_cycle": "2013-07-01T00:00:00", + "current_output_date": "2013-07-01T03:00:00", + "current_output_step": 3, + "current_time": "2013-07-01T03:00:00", + "customFcstFreq": [], + "customSuppPcpFreq": null, + "cycle_length_minutes": 4260, + "dScaleParamDirs": [ + "/ngen-app/data" + ], + "d_program_init": "2026-05-08T17:05:24", + "e_date_proc": null, + "elemconn_var": "elementConn", + "elemcoords_var": "centerCoords", + "element_id_var": "element_id", + "errFlag": 0, + "errMsg": null, + "fcst_freq": 60, + "fcst_input_horizons": [ + 4260 + ], + "fcst_input_offsets": [ + 0 + ], + "fcst_shift": 0, + "first_fcst_cycle": "2013-07-01T00:00:00", + "forceTemoralInterp": [ + 0 + ], + "forcing_output": 0, + "future_time": null, + "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/3b7f3fe7676d69c3_gauge_01123000_ESMF_Mesh.nc", + "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", + "globalNdv": -9999.0, + "grid_meta": null, + "grid_type": "hydrofabric", + "hgt_elem_var": null, + "hgt_var": null, + "ignored_border_widths": [ + 0 + ], + "include_lqfrac": 1, + "input_force_dirs": [ + "s3://null" + ], + "input_force_mandatory": [ + 0 + ], + "input_force_types": [ + "GRIB2" + ], + "input_forcings": [ + 12 + ], + "lat_var": null, + "logFile": null, + "logHandle": null, + "lon_var": null, + "look_back": -9999, + "lwBiasCorrectOpt": [ + 0 + ], + "nFcsts": 1, + "nodecoords_var": "nodeCoords", + "num_output_steps": 71, + "num_supp_output_steps": null, + "number_custom_inputs": 0, + "number_inputs": 1, + "number_supp_pcp": 0, + "numelemconn_var": "numElementConn", + "nwmConfig": "AORC", + "nwmVersion": 4.0, + "nwm_domain": null, + "nwm_geogrid": null, + "nwm_source": "s3://noaa-nwm-retrospective-3-0-pds", + "nwm_url": null, + "output_freq": 60, + "paramFlagArray": null, + "precipBiasCorrectOpt": [ + 0 + ], + "precipDownscaleOpt": [ + 0 + ], + "precip_only_flag": false, + "prev_output_date": "2013-07-01T00:00:00", + "process_window": null, + "psfcBiasCorrectOpt": [ + 0 + ], + "psfcDownscaleOpt": [ + 0 + ], + "q2BiasCorrectOpt": [ + 0 + ], + "q2dDownscaleOpt": [ + 0 + ], + "realtime_flag": false, + "refcst_flag": true, + "regrid_opt": [ + 1 + ], + "regrid_opt_supp_pcp": null, + "rqiMethod": null, + "rqiThresh": 1.0, + "runCfsNldasBiasCorrect": false, + "scratch_dir": "/ngen-app/data/scratch/AORC/a00fc45eee325b1d", + "sinalpha_var": null, + "slope_azimuth_var": null, + "slope_azimuth_var_elem": null, + "slope_var": null, + "slope_var_elem": null, + "spatial_meta": null, + "statusMsg": "func esmf_regridobj_call_retry finished after 1 attempts.", + "sub_output_freq": null, + "sub_output_hour": null, + "suppTemporalInterp": null, + "supp_pcp_max_hours": null, + "supp_precip_dirs": null, + "supp_precip_file_types": [], + "supp_precip_forcings": [], + "supp_precip_mandatory": null, + "supp_precip_param_dir": null, + "swBiasCorrectOpt": [ + 0 + ], + "swDownscaleOpt": [ + 0 + ], + "t2BiasCorrectOpt": [ + 0 + ], + "t2dDownscaleOpt": [ + 0 + ], + "useCompression": 0, + "useFloats": 0, + "use_data_at_current_time": true, + "weightsDir": null, + "windBiasCorrect": [ + 0 + ] +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_config_options_finalize_n1_rank0_.json b/tests/test_data/expected_results/test_expected_config_options_finalize_n1_rank0_.json new file mode 100644 index 00000000..6048ab13 --- /dev/null +++ b/tests/test_data/expected_results/test_expected_config_options_finalize_n1_rank0_.json @@ -0,0 +1,352 @@ +{ + "ExactExtract": null, + "actual_output_steps": 71, + "ana_flag": 0, + "aorc_alaska_source": "s3://ngwpc-data/AORC/Alaska", + "aorc_alaska_url": "{source}/{year}/{year}{month:02d}/AK_AORC-OWP_{date}.nc4", + "aorc_conus_source": "s3://noaa-nws-aorc-v1-1-1km", + "aorc_conus_year_url": "{source}/{year}.zarr", + "aws": true, + "aws_obj": { + "attrs": {}, + "coords": { + "spatial_ref": { + "attrs": { + "crs_wkt": "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]", + "geographic_crs_name": "WGS 84", + "grid_mapping_name": "latitude_longitude", + "horizontal_datum_name": "World Geodetic System 1984", + "inverse_flattening": 298.257223563, + "longitude_of_prime_meridian": 0.0, + "prime_meridian_name": "Greenwich", + "reference_ellipsoid_name": "WGS 84", + "semi_major_axis": 6378137.0, + "semi_minor_axis": 6356752.314245179, + "spatial_ref": "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]" + }, + "data": 0, + "dims": [] + }, + "time": { + "attrs": { + "long_name": "verification time generated by wgrib2 function verftime()", + "reference_date": "2013.01.01 00:00:00 UTC", + "reference_time": 1356998400.0, + "reference_time_description": "kind of product unclear, reference date is variable, min found reference date is given", + "reference_time_type": 0, + "time_step": 0.0, + "time_step_setting": "auto" + }, + "data": "ERR_NOT_JSON_SERIALIZABLE:TYPE:", + "dims": [] + }, + "x": { + "attrs": { + "long_name": "longitude", + "units": "degrees_east" + }, + "data": "hash_-7248319024934117860", + "dims": [ + "x" + ] + }, + "y": { + "attrs": { + "long_name": "latitude", + "units": "degrees_north" + }, + "data": "hash_-6585113156651046999", + "dims": [ + "y" + ] + } + }, + "data_vars": { + "APCP_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Total Precipitation", + "short_name": "APCP_surface", + "units": "kg/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "DLWRF_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Downward Long-Wave Rad. Flux", + "short_name": "DLWRF_surface", + "units": "W/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "DSWRF_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Downward Short-Wave Rad. Flux", + "short_name": "DSWRF_surface", + "units": "W/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "PRES_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Pressure", + "short_name": "PRES_surface", + "units": "Pa" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "SPFH_2maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "2 m above ground", + "long_name": "Specific Humidity", + "short_name": "SPFH_2maboveground", + "units": "kg/kg" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "TMP_2maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "2 m above ground", + "long_name": "Temperature", + "short_name": "TMP_2maboveground", + "units": "K" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "UGRD_10maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "10 m above ground", + "long_name": "U-Component of Wind", + "short_name": "UGRD_10maboveground", + "units": "m/s" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "VGRD_10maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "10 m above ground", + "long_name": "V-Component of Wind", + "short_name": "VGRD_10maboveground", + "units": "m/s" + }, + "data": null, + "dims": [ + "y", + "x" + ] + } + }, + "dims": { + "x": 14, + "y": 28 + } + }, + "aws_time": null, + "b_date_proc": "2013-07-01T00:00:00", + "bmi_time": 10800, + "bmi_time_index": 3, + "cfsv2EnsMember": null, + "config_path": null, + "cosalpha_var": null, + "currentCustomForceNum": 0, + "currentForceNum": 1, + "current_fcst_cycle": "2013-07-01T00:00:00", + "current_output_date": "2013-07-01T03:00:00", + "current_output_step": 3, + "current_time": "2013-07-01T03:00:00", + "customFcstFreq": [], + "customSuppPcpFreq": null, + "cycle_length_minutes": 4260, + "dScaleParamDirs": [ + "/ngen-app/data" + ], + "d_program_init": "2026-05-08T17:05:06", + "e_date_proc": null, + "elemconn_var": "elementConn", + "elemcoords_var": "centerCoords", + "element_id_var": "element_id", + "errFlag": 0, + "errMsg": null, + "fcst_freq": 60, + "fcst_input_horizons": [ + 4260 + ], + "fcst_input_offsets": [ + 0 + ], + "fcst_shift": 0, + "first_fcst_cycle": "2013-07-01T00:00:00", + "forceTemoralInterp": [ + 0 + ], + "forcing_output": 0, + "future_time": null, + "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/dc9ed271e02b6416_gauge_01123000_ESMF_Mesh.nc", + "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", + "globalNdv": -9999.0, + "grid_meta": null, + "grid_type": "hydrofabric", + "hgt_elem_var": null, + "hgt_var": null, + "ignored_border_widths": [ + 0 + ], + "include_lqfrac": 1, + "input_force_dirs": [ + "s3://null" + ], + "input_force_mandatory": [ + 0 + ], + "input_force_types": [ + "GRIB2" + ], + "input_forcings": [ + 12 + ], + "lat_var": null, + "logFile": null, + "logHandle": null, + "lon_var": null, + "look_back": -9999, + "lwBiasCorrectOpt": [ + 0 + ], + "nFcsts": 1, + "nodecoords_var": "nodeCoords", + "num_output_steps": 71, + "num_supp_output_steps": null, + "number_custom_inputs": 0, + "number_inputs": 1, + "number_supp_pcp": 0, + "numelemconn_var": "numElementConn", + "nwmConfig": "AORC", + "nwmVersion": 4.0, + "nwm_domain": null, + "nwm_geogrid": null, + "nwm_source": "s3://noaa-nwm-retrospective-3-0-pds", + "nwm_url": null, + "output_freq": 60, + "paramFlagArray": null, + "precipBiasCorrectOpt": [ + 0 + ], + "precipDownscaleOpt": [ + 0 + ], + "precip_only_flag": false, + "prev_output_date": "2013-07-01T00:00:00", + "process_window": null, + "psfcBiasCorrectOpt": [ + 0 + ], + "psfcDownscaleOpt": [ + 0 + ], + "q2BiasCorrectOpt": [ + 0 + ], + "q2dDownscaleOpt": [ + 0 + ], + "realtime_flag": false, + "refcst_flag": true, + "regrid_opt": [ + 1 + ], + "regrid_opt_supp_pcp": null, + "rqiMethod": null, + "rqiThresh": 1.0, + "runCfsNldasBiasCorrect": false, + "scratch_dir": "/ngen-app/data/scratch/AORC/b428b6743c39a6d8", + "sinalpha_var": null, + "slope_azimuth_var": null, + "slope_azimuth_var_elem": null, + "slope_var": null, + "slope_var_elem": null, + "spatial_meta": null, + "statusMsg": "Starting BMI finalize()", + "sub_output_freq": null, + "sub_output_hour": null, + "suppTemporalInterp": null, + "supp_pcp_max_hours": null, + "supp_precip_dirs": null, + "supp_precip_file_types": [], + "supp_precip_forcings": [], + "supp_precip_mandatory": null, + "supp_precip_param_dir": null, + "swBiasCorrectOpt": [ + 0 + ], + "swDownscaleOpt": [ + 0 + ], + "t2BiasCorrectOpt": [ + 0 + ], + "t2dDownscaleOpt": [ + 0 + ], + "useCompression": 0, + "useFloats": 0, + "use_data_at_current_time": true, + "weightsDir": null, + "windBiasCorrect": [ + 0 + ] +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_config_options_finalize_n2_rank0_.json b/tests/test_data/expected_results/test_expected_config_options_finalize_n2_rank0_.json new file mode 100644 index 00000000..ef38edea --- /dev/null +++ b/tests/test_data/expected_results/test_expected_config_options_finalize_n2_rank0_.json @@ -0,0 +1,352 @@ +{ + "ExactExtract": null, + "actual_output_steps": 71, + "ana_flag": 0, + "aorc_alaska_source": "s3://ngwpc-data/AORC/Alaska", + "aorc_alaska_url": "{source}/{year}/{year}{month:02d}/AK_AORC-OWP_{date}.nc4", + "aorc_conus_source": "s3://noaa-nws-aorc-v1-1-1km", + "aorc_conus_year_url": "{source}/{year}.zarr", + "aws": true, + "aws_obj": { + "attrs": {}, + "coords": { + "spatial_ref": { + "attrs": { + "crs_wkt": "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]", + "geographic_crs_name": "WGS 84", + "grid_mapping_name": "latitude_longitude", + "horizontal_datum_name": "World Geodetic System 1984", + "inverse_flattening": 298.257223563, + "longitude_of_prime_meridian": 0.0, + "prime_meridian_name": "Greenwich", + "reference_ellipsoid_name": "WGS 84", + "semi_major_axis": 6378137.0, + "semi_minor_axis": 6356752.314245179, + "spatial_ref": "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]" + }, + "data": 0, + "dims": [] + }, + "time": { + "attrs": { + "long_name": "verification time generated by wgrib2 function verftime()", + "reference_date": "2013.01.01 00:00:00 UTC", + "reference_time": 1356998400.0, + "reference_time_description": "kind of product unclear, reference date is variable, min found reference date is given", + "reference_time_type": 0, + "time_step": 0.0, + "time_step_setting": "auto" + }, + "data": "ERR_NOT_JSON_SERIALIZABLE:TYPE:", + "dims": [] + }, + "x": { + "attrs": { + "long_name": "longitude", + "units": "degrees_east" + }, + "data": "hash_-7248319024934117860", + "dims": [ + "x" + ] + }, + "y": { + "attrs": { + "long_name": "latitude", + "units": "degrees_north" + }, + "data": "hash_-6585113156651046999", + "dims": [ + "y" + ] + } + }, + "data_vars": { + "APCP_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Total Precipitation", + "short_name": "APCP_surface", + "units": "kg/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "DLWRF_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Downward Long-Wave Rad. Flux", + "short_name": "DLWRF_surface", + "units": "W/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "DSWRF_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Downward Short-Wave Rad. Flux", + "short_name": "DSWRF_surface", + "units": "W/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "PRES_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Pressure", + "short_name": "PRES_surface", + "units": "Pa" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "SPFH_2maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "2 m above ground", + "long_name": "Specific Humidity", + "short_name": "SPFH_2maboveground", + "units": "kg/kg" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "TMP_2maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "2 m above ground", + "long_name": "Temperature", + "short_name": "TMP_2maboveground", + "units": "K" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "UGRD_10maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "10 m above ground", + "long_name": "U-Component of Wind", + "short_name": "UGRD_10maboveground", + "units": "m/s" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "VGRD_10maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "10 m above ground", + "long_name": "V-Component of Wind", + "short_name": "VGRD_10maboveground", + "units": "m/s" + }, + "data": null, + "dims": [ + "y", + "x" + ] + } + }, + "dims": { + "x": 14, + "y": 28 + } + }, + "aws_time": null, + "b_date_proc": "2013-07-01T00:00:00", + "bmi_time": 10800, + "bmi_time_index": 3, + "cfsv2EnsMember": null, + "config_path": null, + "cosalpha_var": null, + "currentCustomForceNum": 0, + "currentForceNum": 1, + "current_fcst_cycle": "2013-07-01T00:00:00", + "current_output_date": "2013-07-01T03:00:00", + "current_output_step": 3, + "current_time": "2013-07-01T03:00:00", + "customFcstFreq": [], + "customSuppPcpFreq": null, + "cycle_length_minutes": 4260, + "dScaleParamDirs": [ + "/ngen-app/data" + ], + "d_program_init": "2026-05-08T17:05:24", + "e_date_proc": null, + "elemconn_var": "elementConn", + "elemcoords_var": "centerCoords", + "element_id_var": "element_id", + "errFlag": 0, + "errMsg": null, + "fcst_freq": 60, + "fcst_input_horizons": [ + 4260 + ], + "fcst_input_offsets": [ + 0 + ], + "fcst_shift": 0, + "first_fcst_cycle": "2013-07-01T00:00:00", + "forceTemoralInterp": [ + 0 + ], + "forcing_output": 0, + "future_time": null, + "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/3b7f3fe7676d69c3_gauge_01123000_ESMF_Mesh.nc", + "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", + "globalNdv": -9999.0, + "grid_meta": null, + "grid_type": "hydrofabric", + "hgt_elem_var": null, + "hgt_var": null, + "ignored_border_widths": [ + 0 + ], + "include_lqfrac": 1, + "input_force_dirs": [ + "s3://null" + ], + "input_force_mandatory": [ + 0 + ], + "input_force_types": [ + "GRIB2" + ], + "input_forcings": [ + 12 + ], + "lat_var": null, + "logFile": null, + "logHandle": null, + "lon_var": null, + "look_back": -9999, + "lwBiasCorrectOpt": [ + 0 + ], + "nFcsts": 1, + "nodecoords_var": "nodeCoords", + "num_output_steps": 71, + "num_supp_output_steps": null, + "number_custom_inputs": 0, + "number_inputs": 1, + "number_supp_pcp": 0, + "numelemconn_var": "numElementConn", + "nwmConfig": "AORC", + "nwmVersion": 4.0, + "nwm_domain": null, + "nwm_geogrid": null, + "nwm_source": "s3://noaa-nwm-retrospective-3-0-pds", + "nwm_url": null, + "output_freq": 60, + "paramFlagArray": null, + "precipBiasCorrectOpt": [ + 0 + ], + "precipDownscaleOpt": [ + 0 + ], + "precip_only_flag": false, + "prev_output_date": "2013-07-01T00:00:00", + "process_window": null, + "psfcBiasCorrectOpt": [ + 0 + ], + "psfcDownscaleOpt": [ + 0 + ], + "q2BiasCorrectOpt": [ + 0 + ], + "q2dDownscaleOpt": [ + 0 + ], + "realtime_flag": false, + "refcst_flag": true, + "regrid_opt": [ + 1 + ], + "regrid_opt_supp_pcp": null, + "rqiMethod": null, + "rqiThresh": 1.0, + "runCfsNldasBiasCorrect": false, + "scratch_dir": "/ngen-app/data/scratch/AORC/a00fc45eee325b1d", + "sinalpha_var": null, + "slope_azimuth_var": null, + "slope_azimuth_var_elem": null, + "slope_var": null, + "slope_var_elem": null, + "spatial_meta": null, + "statusMsg": "Starting BMI finalize()", + "sub_output_freq": null, + "sub_output_hour": null, + "suppTemporalInterp": null, + "supp_pcp_max_hours": null, + "supp_precip_dirs": null, + "supp_precip_file_types": [], + "supp_precip_forcings": [], + "supp_precip_mandatory": null, + "supp_precip_param_dir": null, + "swBiasCorrectOpt": [ + 0 + ], + "swDownscaleOpt": [ + 0 + ], + "t2BiasCorrectOpt": [ + 0 + ], + "t2dDownscaleOpt": [ + 0 + ], + "useCompression": 0, + "useFloats": 0, + "use_data_at_current_time": true, + "weightsDir": null, + "windBiasCorrect": [ + 0 + ] +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_config_options_finalize_n2_rank1_.json b/tests/test_data/expected_results/test_expected_config_options_finalize_n2_rank1_.json new file mode 100644 index 00000000..ef38edea --- /dev/null +++ b/tests/test_data/expected_results/test_expected_config_options_finalize_n2_rank1_.json @@ -0,0 +1,352 @@ +{ + "ExactExtract": null, + "actual_output_steps": 71, + "ana_flag": 0, + "aorc_alaska_source": "s3://ngwpc-data/AORC/Alaska", + "aorc_alaska_url": "{source}/{year}/{year}{month:02d}/AK_AORC-OWP_{date}.nc4", + "aorc_conus_source": "s3://noaa-nws-aorc-v1-1-1km", + "aorc_conus_year_url": "{source}/{year}.zarr", + "aws": true, + "aws_obj": { + "attrs": {}, + "coords": { + "spatial_ref": { + "attrs": { + "crs_wkt": "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]", + "geographic_crs_name": "WGS 84", + "grid_mapping_name": "latitude_longitude", + "horizontal_datum_name": "World Geodetic System 1984", + "inverse_flattening": 298.257223563, + "longitude_of_prime_meridian": 0.0, + "prime_meridian_name": "Greenwich", + "reference_ellipsoid_name": "WGS 84", + "semi_major_axis": 6378137.0, + "semi_minor_axis": 6356752.314245179, + "spatial_ref": "GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563]],PRIMEM[\"Greenwich\",0],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AXIS[\"Latitude\",NORTH],AXIS[\"Longitude\",EAST],AUTHORITY[\"EPSG\",\"4326\"]]" + }, + "data": 0, + "dims": [] + }, + "time": { + "attrs": { + "long_name": "verification time generated by wgrib2 function verftime()", + "reference_date": "2013.01.01 00:00:00 UTC", + "reference_time": 1356998400.0, + "reference_time_description": "kind of product unclear, reference date is variable, min found reference date is given", + "reference_time_type": 0, + "time_step": 0.0, + "time_step_setting": "auto" + }, + "data": "ERR_NOT_JSON_SERIALIZABLE:TYPE:", + "dims": [] + }, + "x": { + "attrs": { + "long_name": "longitude", + "units": "degrees_east" + }, + "data": "hash_-7248319024934117860", + "dims": [ + "x" + ] + }, + "y": { + "attrs": { + "long_name": "latitude", + "units": "degrees_north" + }, + "data": "hash_-6585113156651046999", + "dims": [ + "y" + ] + } + }, + "data_vars": { + "APCP_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Total Precipitation", + "short_name": "APCP_surface", + "units": "kg/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "DLWRF_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Downward Long-Wave Rad. Flux", + "short_name": "DLWRF_surface", + "units": "W/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "DSWRF_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Downward Short-Wave Rad. Flux", + "short_name": "DSWRF_surface", + "units": "W/m^2" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "PRES_surface": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "surface", + "long_name": "Pressure", + "short_name": "PRES_surface", + "units": "Pa" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "SPFH_2maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "2 m above ground", + "long_name": "Specific Humidity", + "short_name": "SPFH_2maboveground", + "units": "kg/kg" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "TMP_2maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "2 m above ground", + "long_name": "Temperature", + "short_name": "TMP_2maboveground", + "units": "K" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "UGRD_10maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "10 m above ground", + "long_name": "U-Component of Wind", + "short_name": "UGRD_10maboveground", + "units": "m/s" + }, + "data": null, + "dims": [ + "y", + "x" + ] + }, + "VGRD_10maboveground": { + "attrs": { + "AORC_Contact": "aorc.info@noaa.gov", + "aorc_version": "v1.1", + "crs": "EPSG:4326", + "level": "10 m above ground", + "long_name": "V-Component of Wind", + "short_name": "VGRD_10maboveground", + "units": "m/s" + }, + "data": null, + "dims": [ + "y", + "x" + ] + } + }, + "dims": { + "x": 14, + "y": 28 + } + }, + "aws_time": null, + "b_date_proc": "2013-07-01T00:00:00", + "bmi_time": 10800, + "bmi_time_index": 3, + "cfsv2EnsMember": null, + "config_path": null, + "cosalpha_var": null, + "currentCustomForceNum": 0, + "currentForceNum": 1, + "current_fcst_cycle": "2013-07-01T00:00:00", + "current_output_date": "2013-07-01T03:00:00", + "current_output_step": 3, + "current_time": "2013-07-01T03:00:00", + "customFcstFreq": [], + "customSuppPcpFreq": null, + "cycle_length_minutes": 4260, + "dScaleParamDirs": [ + "/ngen-app/data" + ], + "d_program_init": "2026-05-08T17:05:24", + "e_date_proc": null, + "elemconn_var": "elementConn", + "elemcoords_var": "centerCoords", + "element_id_var": "element_id", + "errFlag": 0, + "errMsg": null, + "fcst_freq": 60, + "fcst_input_horizons": [ + 4260 + ], + "fcst_input_offsets": [ + 0 + ], + "fcst_shift": 0, + "first_fcst_cycle": "2013-07-01T00:00:00", + "forceTemoralInterp": [ + 0 + ], + "forcing_output": 0, + "future_time": null, + "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/3b7f3fe7676d69c3_gauge_01123000_ESMF_Mesh.nc", + "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", + "globalNdv": -9999.0, + "grid_meta": null, + "grid_type": "hydrofabric", + "hgt_elem_var": null, + "hgt_var": null, + "ignored_border_widths": [ + 0 + ], + "include_lqfrac": 1, + "input_force_dirs": [ + "s3://null" + ], + "input_force_mandatory": [ + 0 + ], + "input_force_types": [ + "GRIB2" + ], + "input_forcings": [ + 12 + ], + "lat_var": null, + "logFile": null, + "logHandle": null, + "lon_var": null, + "look_back": -9999, + "lwBiasCorrectOpt": [ + 0 + ], + "nFcsts": 1, + "nodecoords_var": "nodeCoords", + "num_output_steps": 71, + "num_supp_output_steps": null, + "number_custom_inputs": 0, + "number_inputs": 1, + "number_supp_pcp": 0, + "numelemconn_var": "numElementConn", + "nwmConfig": "AORC", + "nwmVersion": 4.0, + "nwm_domain": null, + "nwm_geogrid": null, + "nwm_source": "s3://noaa-nwm-retrospective-3-0-pds", + "nwm_url": null, + "output_freq": 60, + "paramFlagArray": null, + "precipBiasCorrectOpt": [ + 0 + ], + "precipDownscaleOpt": [ + 0 + ], + "precip_only_flag": false, + "prev_output_date": "2013-07-01T00:00:00", + "process_window": null, + "psfcBiasCorrectOpt": [ + 0 + ], + "psfcDownscaleOpt": [ + 0 + ], + "q2BiasCorrectOpt": [ + 0 + ], + "q2dDownscaleOpt": [ + 0 + ], + "realtime_flag": false, + "refcst_flag": true, + "regrid_opt": [ + 1 + ], + "regrid_opt_supp_pcp": null, + "rqiMethod": null, + "rqiThresh": 1.0, + "runCfsNldasBiasCorrect": false, + "scratch_dir": "/ngen-app/data/scratch/AORC/a00fc45eee325b1d", + "sinalpha_var": null, + "slope_azimuth_var": null, + "slope_azimuth_var_elem": null, + "slope_var": null, + "slope_var_elem": null, + "spatial_meta": null, + "statusMsg": "Starting BMI finalize()", + "sub_output_freq": null, + "sub_output_hour": null, + "suppTemporalInterp": null, + "supp_pcp_max_hours": null, + "supp_precip_dirs": null, + "supp_precip_file_types": [], + "supp_precip_forcings": [], + "supp_precip_mandatory": null, + "supp_precip_param_dir": null, + "swBiasCorrectOpt": [ + 0 + ], + "swDownscaleOpt": [ + 0 + ], + "t2BiasCorrectOpt": [ + 0 + ], + "t2dDownscaleOpt": [ + 0 + ], + "useCompression": 0, + "useFloats": 0, + "use_data_at_current_time": true, + "weightsDir": null, + "windBiasCorrect": [ + 0 + ] +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_config_options_init_n1_rank0_.json b/tests/test_data/expected_results/test_expected_config_options_init_n1_rank0_.json new file mode 100644 index 00000000..1a7be2bd --- /dev/null +++ b/tests/test_data/expected_results/test_expected_config_options_init_n1_rank0_.json @@ -0,0 +1,162 @@ +{ + "ExactExtract": null, + "actual_output_steps": 71, + "ana_flag": 0, + "aorc_alaska_source": "s3://ngwpc-data/AORC/Alaska", + "aorc_alaska_url": "{source}/{year}/{year}{month:02d}/AK_AORC-OWP_{date}.nc4", + "aorc_conus_source": "s3://noaa-nws-aorc-v1-1-1km", + "aorc_conus_year_url": "{source}/{year}.zarr", + "aws": true, + "aws_obj": null, + "aws_time": null, + "b_date_proc": "2013-07-01T00:00:00", + "bmi_time": null, + "bmi_time_index": 0, + "cfsv2EnsMember": null, + "config_path": null, + "cosalpha_var": null, + "current_fcst_cycle": null, + "current_output_date": null, + "current_output_step": null, + "current_time": null, + "customFcstFreq": [], + "customSuppPcpFreq": null, + "cycle_length_minutes": 4260, + "dScaleParamDirs": [ + "/ngen-app/data" + ], + "d_program_init": "2026-05-08T17:05:06", + "e_date_proc": null, + "elemconn_var": "elementConn", + "elemcoords_var": "centerCoords", + "element_id_var": "element_id", + "errFlag": 0, + "errMsg": null, + "fcst_freq": 60, + "fcst_input_horizons": [ + 4260 + ], + "fcst_input_offsets": [ + 0 + ], + "fcst_shift": 0, + "first_fcst_cycle": null, + "forceTemoralInterp": [ + 0 + ], + "forcing_output": 0, + "future_time": null, + "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/dc9ed271e02b6416_gauge_01123000_ESMF_Mesh.nc", + "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", + "globalNdv": -9999.0, + "grid_meta": null, + "grid_type": "hydrofabric", + "hgt_elem_var": null, + "hgt_var": null, + "ignored_border_widths": [ + 0 + ], + "include_lqfrac": 1, + "input_force_dirs": [ + "s3://null" + ], + "input_force_mandatory": [ + 0 + ], + "input_force_types": [ + "GRIB2" + ], + "input_forcings": [ + 12 + ], + "lat_var": null, + "logFile": null, + "logHandle": null, + "lon_var": null, + "look_back": -9999, + "lwBiasCorrectOpt": [ + 0 + ], + "nFcsts": 1, + "nodecoords_var": "nodeCoords", + "num_output_steps": 71, + "num_supp_output_steps": null, + "number_custom_inputs": 0, + "number_inputs": 1, + "number_supp_pcp": 0, + "numelemconn_var": "numElementConn", + "nwmConfig": "AORC", + "nwmVersion": 4.0, + "nwm_domain": null, + "nwm_geogrid": null, + "nwm_source": "s3://noaa-nwm-retrospective-3-0-pds", + "nwm_url": null, + "output_freq": 60, + "paramFlagArray": null, + "precipBiasCorrectOpt": [ + 0 + ], + "precipDownscaleOpt": [ + 0 + ], + "precip_only_flag": false, + "prev_output_date": null, + "process_window": null, + "psfcBiasCorrectOpt": [ + 0 + ], + "psfcDownscaleOpt": [ + 0 + ], + "q2BiasCorrectOpt": [ + 0 + ], + "q2dDownscaleOpt": [ + 0 + ], + "realtime_flag": false, + "refcst_flag": true, + "regrid_opt": [ + 1 + ], + "regrid_opt_supp_pcp": null, + "rqiMethod": null, + "rqiThresh": 1.0, + "runCfsNldasBiasCorrect": false, + "scratch_dir": "/ngen-app/data/scratch/AORC/b428b6743c39a6d8", + "sinalpha_var": null, + "slope_azimuth_var": null, + "slope_azimuth_var_elem": null, + "slope_var": null, + "slope_var_elem": null, + "spatial_meta": null, + "statusMsg": null, + "sub_output_freq": null, + "sub_output_hour": null, + "suppTemporalInterp": null, + "supp_pcp_max_hours": null, + "supp_precip_dirs": null, + "supp_precip_file_types": [], + "supp_precip_forcings": [], + "supp_precip_mandatory": null, + "supp_precip_param_dir": null, + "swBiasCorrectOpt": [ + 0 + ], + "swDownscaleOpt": [ + 0 + ], + "t2BiasCorrectOpt": [ + 0 + ], + "t2dDownscaleOpt": [ + 0 + ], + "useCompression": 0, + "useFloats": 0, + "use_data_at_current_time": true, + "weightsDir": null, + "windBiasCorrect": [ + 0 + ] +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_config_options_init_n2_rank0_.json b/tests/test_data/expected_results/test_expected_config_options_init_n2_rank0_.json new file mode 100644 index 00000000..8e241d65 --- /dev/null +++ b/tests/test_data/expected_results/test_expected_config_options_init_n2_rank0_.json @@ -0,0 +1,162 @@ +{ + "ExactExtract": null, + "actual_output_steps": 71, + "ana_flag": 0, + "aorc_alaska_source": "s3://ngwpc-data/AORC/Alaska", + "aorc_alaska_url": "{source}/{year}/{year}{month:02d}/AK_AORC-OWP_{date}.nc4", + "aorc_conus_source": "s3://noaa-nws-aorc-v1-1-1km", + "aorc_conus_year_url": "{source}/{year}.zarr", + "aws": true, + "aws_obj": null, + "aws_time": null, + "b_date_proc": "2013-07-01T00:00:00", + "bmi_time": null, + "bmi_time_index": 0, + "cfsv2EnsMember": null, + "config_path": null, + "cosalpha_var": null, + "current_fcst_cycle": null, + "current_output_date": null, + "current_output_step": null, + "current_time": null, + "customFcstFreq": [], + "customSuppPcpFreq": null, + "cycle_length_minutes": 4260, + "dScaleParamDirs": [ + "/ngen-app/data" + ], + "d_program_init": "2026-05-08T17:05:24", + "e_date_proc": null, + "elemconn_var": "elementConn", + "elemcoords_var": "centerCoords", + "element_id_var": "element_id", + "errFlag": 0, + "errMsg": null, + "fcst_freq": 60, + "fcst_input_horizons": [ + 4260 + ], + "fcst_input_offsets": [ + 0 + ], + "fcst_shift": 0, + "first_fcst_cycle": null, + "forceTemoralInterp": [ + 0 + ], + "forcing_output": 0, + "future_time": null, + "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/3b7f3fe7676d69c3_gauge_01123000_ESMF_Mesh.nc", + "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", + "globalNdv": -9999.0, + "grid_meta": null, + "grid_type": "hydrofabric", + "hgt_elem_var": null, + "hgt_var": null, + "ignored_border_widths": [ + 0 + ], + "include_lqfrac": 1, + "input_force_dirs": [ + "s3://null" + ], + "input_force_mandatory": [ + 0 + ], + "input_force_types": [ + "GRIB2" + ], + "input_forcings": [ + 12 + ], + "lat_var": null, + "logFile": null, + "logHandle": null, + "lon_var": null, + "look_back": -9999, + "lwBiasCorrectOpt": [ + 0 + ], + "nFcsts": 1, + "nodecoords_var": "nodeCoords", + "num_output_steps": 71, + "num_supp_output_steps": null, + "number_custom_inputs": 0, + "number_inputs": 1, + "number_supp_pcp": 0, + "numelemconn_var": "numElementConn", + "nwmConfig": "AORC", + "nwmVersion": 4.0, + "nwm_domain": null, + "nwm_geogrid": null, + "nwm_source": "s3://noaa-nwm-retrospective-3-0-pds", + "nwm_url": null, + "output_freq": 60, + "paramFlagArray": null, + "precipBiasCorrectOpt": [ + 0 + ], + "precipDownscaleOpt": [ + 0 + ], + "precip_only_flag": false, + "prev_output_date": null, + "process_window": null, + "psfcBiasCorrectOpt": [ + 0 + ], + "psfcDownscaleOpt": [ + 0 + ], + "q2BiasCorrectOpt": [ + 0 + ], + "q2dDownscaleOpt": [ + 0 + ], + "realtime_flag": false, + "refcst_flag": true, + "regrid_opt": [ + 1 + ], + "regrid_opt_supp_pcp": null, + "rqiMethod": null, + "rqiThresh": 1.0, + "runCfsNldasBiasCorrect": false, + "scratch_dir": "/ngen-app/data/scratch/AORC/a00fc45eee325b1d", + "sinalpha_var": null, + "slope_azimuth_var": null, + "slope_azimuth_var_elem": null, + "slope_var": null, + "slope_var_elem": null, + "spatial_meta": null, + "statusMsg": null, + "sub_output_freq": null, + "sub_output_hour": null, + "suppTemporalInterp": null, + "supp_pcp_max_hours": null, + "supp_precip_dirs": null, + "supp_precip_file_types": [], + "supp_precip_forcings": [], + "supp_precip_mandatory": null, + "supp_precip_param_dir": null, + "swBiasCorrectOpt": [ + 0 + ], + "swDownscaleOpt": [ + 0 + ], + "t2BiasCorrectOpt": [ + 0 + ], + "t2dDownscaleOpt": [ + 0 + ], + "useCompression": 0, + "useFloats": 0, + "use_data_at_current_time": true, + "weightsDir": null, + "windBiasCorrect": [ + 0 + ] +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_config_options_init_n2_rank1_.json b/tests/test_data/expected_results/test_expected_config_options_init_n2_rank1_.json new file mode 100644 index 00000000..8e241d65 --- /dev/null +++ b/tests/test_data/expected_results/test_expected_config_options_init_n2_rank1_.json @@ -0,0 +1,162 @@ +{ + "ExactExtract": null, + "actual_output_steps": 71, + "ana_flag": 0, + "aorc_alaska_source": "s3://ngwpc-data/AORC/Alaska", + "aorc_alaska_url": "{source}/{year}/{year}{month:02d}/AK_AORC-OWP_{date}.nc4", + "aorc_conus_source": "s3://noaa-nws-aorc-v1-1-1km", + "aorc_conus_year_url": "{source}/{year}.zarr", + "aws": true, + "aws_obj": null, + "aws_time": null, + "b_date_proc": "2013-07-01T00:00:00", + "bmi_time": null, + "bmi_time_index": 0, + "cfsv2EnsMember": null, + "config_path": null, + "cosalpha_var": null, + "current_fcst_cycle": null, + "current_output_date": null, + "current_output_step": null, + "current_time": null, + "customFcstFreq": [], + "customSuppPcpFreq": null, + "cycle_length_minutes": 4260, + "dScaleParamDirs": [ + "/ngen-app/data" + ], + "d_program_init": "2026-05-08T17:05:24", + "e_date_proc": null, + "elemconn_var": "elementConn", + "elemcoords_var": "centerCoords", + "element_id_var": "element_id", + "errFlag": 0, + "errMsg": null, + "fcst_freq": 60, + "fcst_input_horizons": [ + 4260 + ], + "fcst_input_offsets": [ + 0 + ], + "fcst_shift": 0, + "first_fcst_cycle": null, + "forceTemoralInterp": [ + 0 + ], + "forcing_output": 0, + "future_time": null, + "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/3b7f3fe7676d69c3_gauge_01123000_ESMF_Mesh.nc", + "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", + "globalNdv": -9999.0, + "grid_meta": null, + "grid_type": "hydrofabric", + "hgt_elem_var": null, + "hgt_var": null, + "ignored_border_widths": [ + 0 + ], + "include_lqfrac": 1, + "input_force_dirs": [ + "s3://null" + ], + "input_force_mandatory": [ + 0 + ], + "input_force_types": [ + "GRIB2" + ], + "input_forcings": [ + 12 + ], + "lat_var": null, + "logFile": null, + "logHandle": null, + "lon_var": null, + "look_back": -9999, + "lwBiasCorrectOpt": [ + 0 + ], + "nFcsts": 1, + "nodecoords_var": "nodeCoords", + "num_output_steps": 71, + "num_supp_output_steps": null, + "number_custom_inputs": 0, + "number_inputs": 1, + "number_supp_pcp": 0, + "numelemconn_var": "numElementConn", + "nwmConfig": "AORC", + "nwmVersion": 4.0, + "nwm_domain": null, + "nwm_geogrid": null, + "nwm_source": "s3://noaa-nwm-retrospective-3-0-pds", + "nwm_url": null, + "output_freq": 60, + "paramFlagArray": null, + "precipBiasCorrectOpt": [ + 0 + ], + "precipDownscaleOpt": [ + 0 + ], + "precip_only_flag": false, + "prev_output_date": null, + "process_window": null, + "psfcBiasCorrectOpt": [ + 0 + ], + "psfcDownscaleOpt": [ + 0 + ], + "q2BiasCorrectOpt": [ + 0 + ], + "q2dDownscaleOpt": [ + 0 + ], + "realtime_flag": false, + "refcst_flag": true, + "regrid_opt": [ + 1 + ], + "regrid_opt_supp_pcp": null, + "rqiMethod": null, + "rqiThresh": 1.0, + "runCfsNldasBiasCorrect": false, + "scratch_dir": "/ngen-app/data/scratch/AORC/a00fc45eee325b1d", + "sinalpha_var": null, + "slope_azimuth_var": null, + "slope_azimuth_var_elem": null, + "slope_var": null, + "slope_var_elem": null, + "spatial_meta": null, + "statusMsg": null, + "sub_output_freq": null, + "sub_output_hour": null, + "suppTemporalInterp": null, + "supp_pcp_max_hours": null, + "supp_precip_dirs": null, + "supp_precip_file_types": [], + "supp_precip_forcings": [], + "supp_precip_mandatory": null, + "supp_precip_param_dir": null, + "swBiasCorrectOpt": [ + 0 + ], + "swDownscaleOpt": [ + 0 + ], + "t2BiasCorrectOpt": [ + 0 + ], + "t2dDownscaleOpt": [ + 0 + ], + "useCompression": 0, + "useFloats": 0, + "use_data_at_current_time": true, + "weightsDir": null, + "windBiasCorrect": [ + 0 + ] +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_geomod_after_update_n1_rank0__step_1.json b/tests/test_data/expected_results/test_expected_geomod_after_update_n1_rank0__step_1.json index dc6b5caf..12611f40 100644 --- a/tests/test_data/expected_results/test_expected_geomod_after_update_n1_rank0__step_1.json +++ b/tests/test_data/expected_results/test_expected_geomod_after_update_n1_rank0__step_1.json @@ -22,6 +22,37 @@ 11475, 11476 ], + "elementcoords_global": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "esmf_ds": null, "esmf_grid": { "_area": [ null, @@ -75,8 +106,116 @@ }, "esmf_lat": null, "esmf_lon": null, + "geogrid_ds": { + "attrs": { + "gridType": "unstructured", + "version": "0.9" + }, + "coords": {}, + "data_vars": { + "centerCoords": { + "attrs": { + "units": "degrees" + }, + "data": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "dims": [ + "elementCount", + "coordDim" + ] + }, + "elementConn": { + "attrs": { + "long_name": "Node Indices that define the element connectivity" + }, + "data": "hash_-5156445445542653928", + "dims": [ + "connectionCount" + ] + }, + "element_id": { + "attrs": { + "long_name": "Catchment ID for hydrofabric" + }, + "data": [ + 11466, + 11467, + 11468, + 11469, + 11470, + 11475, + 11476 + ], + "dims": [ + "elementCount" + ] + }, + "nodeCoords": { + "attrs": { + "units": "degrees" + }, + "data": null, + "dims": [ + "nodeCount", + "coordDim" + ] + }, + "numElementConn": { + "attrs": { + "long_name": "Number of nodes per element" + }, + "data": [ + 102, + 185, + 130, + 132, + 90, + 113, + 124 + ], + "dims": [ + "elementCount" + ] + } + }, + "dims": { + "connectionCount": 876, + "coordDim": 2, + "elementCount": 7, + "nodeCount": 653 + } + }, "height": null, "height_elem": null, + "heights_global": null, "inds": null, "lat_bounds": "hash_4066407811557226096", "latitude_grid": [ @@ -119,12 +258,24 @@ "ny_global_elem": null, "ny_local": 7, "ny_local_elem": null, + "pet_element_inds": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6 + ], "sina_grid": null, "slope": null, "slope_elem": null, + "slopes_global": null, "slp_azi": null, "slp_azi_elem": null, + "slp_azi_global": null, "spatial_global_atts": null, + "spatial_metadata_exists": false, "x_coord_atts": null, "x_coords": null, "x_lower_bound": null, diff --git a/tests/test_data/expected_results/test_expected_geomod_after_update_n1_rank0__step_2.json b/tests/test_data/expected_results/test_expected_geomod_after_update_n1_rank0__step_2.json index dc6b5caf..12611f40 100644 --- a/tests/test_data/expected_results/test_expected_geomod_after_update_n1_rank0__step_2.json +++ b/tests/test_data/expected_results/test_expected_geomod_after_update_n1_rank0__step_2.json @@ -22,6 +22,37 @@ 11475, 11476 ], + "elementcoords_global": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "esmf_ds": null, "esmf_grid": { "_area": [ null, @@ -75,8 +106,116 @@ }, "esmf_lat": null, "esmf_lon": null, + "geogrid_ds": { + "attrs": { + "gridType": "unstructured", + "version": "0.9" + }, + "coords": {}, + "data_vars": { + "centerCoords": { + "attrs": { + "units": "degrees" + }, + "data": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "dims": [ + "elementCount", + "coordDim" + ] + }, + "elementConn": { + "attrs": { + "long_name": "Node Indices that define the element connectivity" + }, + "data": "hash_-5156445445542653928", + "dims": [ + "connectionCount" + ] + }, + "element_id": { + "attrs": { + "long_name": "Catchment ID for hydrofabric" + }, + "data": [ + 11466, + 11467, + 11468, + 11469, + 11470, + 11475, + 11476 + ], + "dims": [ + "elementCount" + ] + }, + "nodeCoords": { + "attrs": { + "units": "degrees" + }, + "data": null, + "dims": [ + "nodeCount", + "coordDim" + ] + }, + "numElementConn": { + "attrs": { + "long_name": "Number of nodes per element" + }, + "data": [ + 102, + 185, + 130, + 132, + 90, + 113, + 124 + ], + "dims": [ + "elementCount" + ] + } + }, + "dims": { + "connectionCount": 876, + "coordDim": 2, + "elementCount": 7, + "nodeCount": 653 + } + }, "height": null, "height_elem": null, + "heights_global": null, "inds": null, "lat_bounds": "hash_4066407811557226096", "latitude_grid": [ @@ -119,12 +258,24 @@ "ny_global_elem": null, "ny_local": 7, "ny_local_elem": null, + "pet_element_inds": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6 + ], "sina_grid": null, "slope": null, "slope_elem": null, + "slopes_global": null, "slp_azi": null, "slp_azi_elem": null, + "slp_azi_global": null, "spatial_global_atts": null, + "spatial_metadata_exists": false, "x_coord_atts": null, "x_coords": null, "x_lower_bound": null, diff --git a/tests/test_data/expected_results/test_expected_geomod_after_update_n1_rank0__step_3.json b/tests/test_data/expected_results/test_expected_geomod_after_update_n1_rank0__step_3.json index dc6b5caf..12611f40 100644 --- a/tests/test_data/expected_results/test_expected_geomod_after_update_n1_rank0__step_3.json +++ b/tests/test_data/expected_results/test_expected_geomod_after_update_n1_rank0__step_3.json @@ -22,6 +22,37 @@ 11475, 11476 ], + "elementcoords_global": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "esmf_ds": null, "esmf_grid": { "_area": [ null, @@ -75,8 +106,116 @@ }, "esmf_lat": null, "esmf_lon": null, + "geogrid_ds": { + "attrs": { + "gridType": "unstructured", + "version": "0.9" + }, + "coords": {}, + "data_vars": { + "centerCoords": { + "attrs": { + "units": "degrees" + }, + "data": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "dims": [ + "elementCount", + "coordDim" + ] + }, + "elementConn": { + "attrs": { + "long_name": "Node Indices that define the element connectivity" + }, + "data": "hash_-5156445445542653928", + "dims": [ + "connectionCount" + ] + }, + "element_id": { + "attrs": { + "long_name": "Catchment ID for hydrofabric" + }, + "data": [ + 11466, + 11467, + 11468, + 11469, + 11470, + 11475, + 11476 + ], + "dims": [ + "elementCount" + ] + }, + "nodeCoords": { + "attrs": { + "units": "degrees" + }, + "data": null, + "dims": [ + "nodeCount", + "coordDim" + ] + }, + "numElementConn": { + "attrs": { + "long_name": "Number of nodes per element" + }, + "data": [ + 102, + 185, + 130, + 132, + 90, + 113, + 124 + ], + "dims": [ + "elementCount" + ] + } + }, + "dims": { + "connectionCount": 876, + "coordDim": 2, + "elementCount": 7, + "nodeCount": 653 + } + }, "height": null, "height_elem": null, + "heights_global": null, "inds": null, "lat_bounds": "hash_4066407811557226096", "latitude_grid": [ @@ -119,12 +258,24 @@ "ny_global_elem": null, "ny_local": 7, "ny_local_elem": null, + "pet_element_inds": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6 + ], "sina_grid": null, "slope": null, "slope_elem": null, + "slopes_global": null, "slp_azi": null, "slp_azi_elem": null, + "slp_azi_global": null, "spatial_global_atts": null, + "spatial_metadata_exists": false, "x_coord_atts": null, "x_coords": null, "x_lower_bound": null, diff --git a/tests/test_data/expected_results/test_expected_geomod_after_update_n2_rank0__step_1.json b/tests/test_data/expected_results/test_expected_geomod_after_update_n2_rank0__step_1.json index 2acf30ba..f185cbfb 100644 --- a/tests/test_data/expected_results/test_expected_geomod_after_update_n2_rank0__step_1.json +++ b/tests/test_data/expected_results/test_expected_geomod_after_update_n2_rank0__step_1.json @@ -19,6 +19,37 @@ 11475, 11476 ], + "elementcoords_global": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "esmf_ds": null, "esmf_grid": { "_area": [ null, @@ -66,8 +97,116 @@ }, "esmf_lat": null, "esmf_lon": null, + "geogrid_ds": { + "attrs": { + "gridType": "unstructured", + "version": "0.9" + }, + "coords": {}, + "data_vars": { + "centerCoords": { + "attrs": { + "units": "degrees" + }, + "data": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "dims": [ + "elementCount", + "coordDim" + ] + }, + "elementConn": { + "attrs": { + "long_name": "Node Indices that define the element connectivity" + }, + "data": "hash_-5156445445542653928", + "dims": [ + "connectionCount" + ] + }, + "element_id": { + "attrs": { + "long_name": "Catchment ID for hydrofabric" + }, + "data": [ + 11466, + 11467, + 11468, + 11469, + 11470, + 11475, + 11476 + ], + "dims": [ + "elementCount" + ] + }, + "nodeCoords": { + "attrs": { + "units": "degrees" + }, + "data": null, + "dims": [ + "nodeCount", + "coordDim" + ] + }, + "numElementConn": { + "attrs": { + "long_name": "Number of nodes per element" + }, + "data": [ + 102, + 185, + 130, + 132, + 90, + 113, + 124 + ], + "dims": [ + "elementCount" + ] + } + }, + "dims": { + "connectionCount": 876, + "coordDim": 2, + "elementCount": 7, + "nodeCount": 653 + } + }, "height": null, "height_elem": null, + "heights_global": null, "inds": null, "lat_bounds": "hash_4066407811557226096", "latitude_grid": [ @@ -101,12 +240,21 @@ "ny_global_elem": null, "ny_local": 4, "ny_local_elem": null, + "pet_element_inds": [ + 0, + 1, + 2, + 3 + ], "sina_grid": null, "slope": null, "slope_elem": null, + "slopes_global": null, "slp_azi": null, "slp_azi_elem": null, + "slp_azi_global": null, "spatial_global_atts": null, + "spatial_metadata_exists": false, "x_coord_atts": null, "x_coords": null, "x_lower_bound": null, diff --git a/tests/test_data/expected_results/test_expected_geomod_after_update_n2_rank0__step_2.json b/tests/test_data/expected_results/test_expected_geomod_after_update_n2_rank0__step_2.json index 2acf30ba..f185cbfb 100644 --- a/tests/test_data/expected_results/test_expected_geomod_after_update_n2_rank0__step_2.json +++ b/tests/test_data/expected_results/test_expected_geomod_after_update_n2_rank0__step_2.json @@ -19,6 +19,37 @@ 11475, 11476 ], + "elementcoords_global": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "esmf_ds": null, "esmf_grid": { "_area": [ null, @@ -66,8 +97,116 @@ }, "esmf_lat": null, "esmf_lon": null, + "geogrid_ds": { + "attrs": { + "gridType": "unstructured", + "version": "0.9" + }, + "coords": {}, + "data_vars": { + "centerCoords": { + "attrs": { + "units": "degrees" + }, + "data": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "dims": [ + "elementCount", + "coordDim" + ] + }, + "elementConn": { + "attrs": { + "long_name": "Node Indices that define the element connectivity" + }, + "data": "hash_-5156445445542653928", + "dims": [ + "connectionCount" + ] + }, + "element_id": { + "attrs": { + "long_name": "Catchment ID for hydrofabric" + }, + "data": [ + 11466, + 11467, + 11468, + 11469, + 11470, + 11475, + 11476 + ], + "dims": [ + "elementCount" + ] + }, + "nodeCoords": { + "attrs": { + "units": "degrees" + }, + "data": null, + "dims": [ + "nodeCount", + "coordDim" + ] + }, + "numElementConn": { + "attrs": { + "long_name": "Number of nodes per element" + }, + "data": [ + 102, + 185, + 130, + 132, + 90, + 113, + 124 + ], + "dims": [ + "elementCount" + ] + } + }, + "dims": { + "connectionCount": 876, + "coordDim": 2, + "elementCount": 7, + "nodeCount": 653 + } + }, "height": null, "height_elem": null, + "heights_global": null, "inds": null, "lat_bounds": "hash_4066407811557226096", "latitude_grid": [ @@ -101,12 +240,21 @@ "ny_global_elem": null, "ny_local": 4, "ny_local_elem": null, + "pet_element_inds": [ + 0, + 1, + 2, + 3 + ], "sina_grid": null, "slope": null, "slope_elem": null, + "slopes_global": null, "slp_azi": null, "slp_azi_elem": null, + "slp_azi_global": null, "spatial_global_atts": null, + "spatial_metadata_exists": false, "x_coord_atts": null, "x_coords": null, "x_lower_bound": null, diff --git a/tests/test_data/expected_results/test_expected_geomod_after_update_n2_rank0__step_3.json b/tests/test_data/expected_results/test_expected_geomod_after_update_n2_rank0__step_3.json index 2acf30ba..f185cbfb 100644 --- a/tests/test_data/expected_results/test_expected_geomod_after_update_n2_rank0__step_3.json +++ b/tests/test_data/expected_results/test_expected_geomod_after_update_n2_rank0__step_3.json @@ -19,6 +19,37 @@ 11475, 11476 ], + "elementcoords_global": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "esmf_ds": null, "esmf_grid": { "_area": [ null, @@ -66,8 +97,116 @@ }, "esmf_lat": null, "esmf_lon": null, + "geogrid_ds": { + "attrs": { + "gridType": "unstructured", + "version": "0.9" + }, + "coords": {}, + "data_vars": { + "centerCoords": { + "attrs": { + "units": "degrees" + }, + "data": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "dims": [ + "elementCount", + "coordDim" + ] + }, + "elementConn": { + "attrs": { + "long_name": "Node Indices that define the element connectivity" + }, + "data": "hash_-5156445445542653928", + "dims": [ + "connectionCount" + ] + }, + "element_id": { + "attrs": { + "long_name": "Catchment ID for hydrofabric" + }, + "data": [ + 11466, + 11467, + 11468, + 11469, + 11470, + 11475, + 11476 + ], + "dims": [ + "elementCount" + ] + }, + "nodeCoords": { + "attrs": { + "units": "degrees" + }, + "data": null, + "dims": [ + "nodeCount", + "coordDim" + ] + }, + "numElementConn": { + "attrs": { + "long_name": "Number of nodes per element" + }, + "data": [ + 102, + 185, + 130, + 132, + 90, + 113, + 124 + ], + "dims": [ + "elementCount" + ] + } + }, + "dims": { + "connectionCount": 876, + "coordDim": 2, + "elementCount": 7, + "nodeCount": 653 + } + }, "height": null, "height_elem": null, + "heights_global": null, "inds": null, "lat_bounds": "hash_4066407811557226096", "latitude_grid": [ @@ -101,12 +240,21 @@ "ny_global_elem": null, "ny_local": 4, "ny_local_elem": null, + "pet_element_inds": [ + 0, + 1, + 2, + 3 + ], "sina_grid": null, "slope": null, "slope_elem": null, + "slopes_global": null, "slp_azi": null, "slp_azi_elem": null, + "slp_azi_global": null, "spatial_global_atts": null, + "spatial_metadata_exists": false, "x_coord_atts": null, "x_coords": null, "x_lower_bound": null, diff --git a/tests/test_data/expected_results/test_expected_geomod_after_update_n2_rank1__step_1.json b/tests/test_data/expected_results/test_expected_geomod_after_update_n2_rank1__step_1.json index a3f11c93..2721b2c7 100644 --- a/tests/test_data/expected_results/test_expected_geomod_after_update_n2_rank1__step_1.json +++ b/tests/test_data/expected_results/test_expected_geomod_after_update_n2_rank1__step_1.json @@ -18,6 +18,37 @@ 11475, 11476 ], + "elementcoords_global": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "esmf_ds": null, "esmf_grid": { "_area": [ null, @@ -63,8 +94,116 @@ }, "esmf_lat": null, "esmf_lon": null, + "geogrid_ds": { + "attrs": { + "gridType": "unstructured", + "version": "0.9" + }, + "coords": {}, + "data_vars": { + "centerCoords": { + "attrs": { + "units": "degrees" + }, + "data": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "dims": [ + "elementCount", + "coordDim" + ] + }, + "elementConn": { + "attrs": { + "long_name": "Node Indices that define the element connectivity" + }, + "data": "hash_-5156445445542653928", + "dims": [ + "connectionCount" + ] + }, + "element_id": { + "attrs": { + "long_name": "Catchment ID for hydrofabric" + }, + "data": [ + 11466, + 11467, + 11468, + 11469, + 11470, + 11475, + 11476 + ], + "dims": [ + "elementCount" + ] + }, + "nodeCoords": { + "attrs": { + "units": "degrees" + }, + "data": null, + "dims": [ + "nodeCount", + "coordDim" + ] + }, + "numElementConn": { + "attrs": { + "long_name": "Number of nodes per element" + }, + "data": [ + 102, + 185, + 130, + 132, + 90, + 113, + 124 + ], + "dims": [ + "elementCount" + ] + } + }, + "dims": { + "connectionCount": 876, + "coordDim": 2, + "elementCount": 7, + "nodeCount": 653 + } + }, "height": null, "height_elem": null, + "heights_global": null, "inds": null, "lat_bounds": null, "latitude_grid": [ @@ -95,12 +234,20 @@ "ny_global_elem": null, "ny_local": 3, "ny_local_elem": null, + "pet_element_inds": [ + 4, + 5, + 6 + ], "sina_grid": null, "slope": null, "slope_elem": null, + "slopes_global": null, "slp_azi": null, "slp_azi_elem": null, + "slp_azi_global": null, "spatial_global_atts": null, + "spatial_metadata_exists": false, "x_coord_atts": null, "x_coords": null, "x_lower_bound": null, diff --git a/tests/test_data/expected_results/test_expected_geomod_after_update_n2_rank1__step_2.json b/tests/test_data/expected_results/test_expected_geomod_after_update_n2_rank1__step_2.json index a3f11c93..2721b2c7 100644 --- a/tests/test_data/expected_results/test_expected_geomod_after_update_n2_rank1__step_2.json +++ b/tests/test_data/expected_results/test_expected_geomod_after_update_n2_rank1__step_2.json @@ -18,6 +18,37 @@ 11475, 11476 ], + "elementcoords_global": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "esmf_ds": null, "esmf_grid": { "_area": [ null, @@ -63,8 +94,116 @@ }, "esmf_lat": null, "esmf_lon": null, + "geogrid_ds": { + "attrs": { + "gridType": "unstructured", + "version": "0.9" + }, + "coords": {}, + "data_vars": { + "centerCoords": { + "attrs": { + "units": "degrees" + }, + "data": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "dims": [ + "elementCount", + "coordDim" + ] + }, + "elementConn": { + "attrs": { + "long_name": "Node Indices that define the element connectivity" + }, + "data": "hash_-5156445445542653928", + "dims": [ + "connectionCount" + ] + }, + "element_id": { + "attrs": { + "long_name": "Catchment ID for hydrofabric" + }, + "data": [ + 11466, + 11467, + 11468, + 11469, + 11470, + 11475, + 11476 + ], + "dims": [ + "elementCount" + ] + }, + "nodeCoords": { + "attrs": { + "units": "degrees" + }, + "data": null, + "dims": [ + "nodeCount", + "coordDim" + ] + }, + "numElementConn": { + "attrs": { + "long_name": "Number of nodes per element" + }, + "data": [ + 102, + 185, + 130, + 132, + 90, + 113, + 124 + ], + "dims": [ + "elementCount" + ] + } + }, + "dims": { + "connectionCount": 876, + "coordDim": 2, + "elementCount": 7, + "nodeCount": 653 + } + }, "height": null, "height_elem": null, + "heights_global": null, "inds": null, "lat_bounds": null, "latitude_grid": [ @@ -95,12 +234,20 @@ "ny_global_elem": null, "ny_local": 3, "ny_local_elem": null, + "pet_element_inds": [ + 4, + 5, + 6 + ], "sina_grid": null, "slope": null, "slope_elem": null, + "slopes_global": null, "slp_azi": null, "slp_azi_elem": null, + "slp_azi_global": null, "spatial_global_atts": null, + "spatial_metadata_exists": false, "x_coord_atts": null, "x_coords": null, "x_lower_bound": null, diff --git a/tests/test_data/expected_results/test_expected_geomod_after_update_n2_rank1__step_3.json b/tests/test_data/expected_results/test_expected_geomod_after_update_n2_rank1__step_3.json index a3f11c93..2721b2c7 100644 --- a/tests/test_data/expected_results/test_expected_geomod_after_update_n2_rank1__step_3.json +++ b/tests/test_data/expected_results/test_expected_geomod_after_update_n2_rank1__step_3.json @@ -18,6 +18,37 @@ 11475, 11476 ], + "elementcoords_global": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "esmf_ds": null, "esmf_grid": { "_area": [ null, @@ -63,8 +94,116 @@ }, "esmf_lat": null, "esmf_lon": null, + "geogrid_ds": { + "attrs": { + "gridType": "unstructured", + "version": "0.9" + }, + "coords": {}, + "data_vars": { + "centerCoords": { + "attrs": { + "units": "degrees" + }, + "data": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "dims": [ + "elementCount", + "coordDim" + ] + }, + "elementConn": { + "attrs": { + "long_name": "Node Indices that define the element connectivity" + }, + "data": "hash_-5156445445542653928", + "dims": [ + "connectionCount" + ] + }, + "element_id": { + "attrs": { + "long_name": "Catchment ID for hydrofabric" + }, + "data": [ + 11466, + 11467, + 11468, + 11469, + 11470, + 11475, + 11476 + ], + "dims": [ + "elementCount" + ] + }, + "nodeCoords": { + "attrs": { + "units": "degrees" + }, + "data": null, + "dims": [ + "nodeCount", + "coordDim" + ] + }, + "numElementConn": { + "attrs": { + "long_name": "Number of nodes per element" + }, + "data": [ + 102, + 185, + 130, + 132, + 90, + 113, + 124 + ], + "dims": [ + "elementCount" + ] + } + }, + "dims": { + "connectionCount": 876, + "coordDim": 2, + "elementCount": 7, + "nodeCount": 653 + } + }, "height": null, "height_elem": null, + "heights_global": null, "inds": null, "lat_bounds": null, "latitude_grid": [ @@ -95,12 +234,20 @@ "ny_global_elem": null, "ny_local": 3, "ny_local_elem": null, + "pet_element_inds": [ + 4, + 5, + 6 + ], "sina_grid": null, "slope": null, "slope_elem": null, + "slopes_global": null, "slp_azi": null, "slp_azi_elem": null, + "slp_azi_global": null, "spatial_global_atts": null, + "spatial_metadata_exists": false, "x_coord_atts": null, "x_coords": null, "x_lower_bound": null, diff --git a/tests/test_data/expected_results/test_expected_geomod_finalize_n1_rank0_.json b/tests/test_data/expected_results/test_expected_geomod_finalize_n1_rank0_.json index dc6b5caf..12611f40 100644 --- a/tests/test_data/expected_results/test_expected_geomod_finalize_n1_rank0_.json +++ b/tests/test_data/expected_results/test_expected_geomod_finalize_n1_rank0_.json @@ -22,6 +22,37 @@ 11475, 11476 ], + "elementcoords_global": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "esmf_ds": null, "esmf_grid": { "_area": [ null, @@ -75,8 +106,116 @@ }, "esmf_lat": null, "esmf_lon": null, + "geogrid_ds": { + "attrs": { + "gridType": "unstructured", + "version": "0.9" + }, + "coords": {}, + "data_vars": { + "centerCoords": { + "attrs": { + "units": "degrees" + }, + "data": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "dims": [ + "elementCount", + "coordDim" + ] + }, + "elementConn": { + "attrs": { + "long_name": "Node Indices that define the element connectivity" + }, + "data": "hash_-5156445445542653928", + "dims": [ + "connectionCount" + ] + }, + "element_id": { + "attrs": { + "long_name": "Catchment ID for hydrofabric" + }, + "data": [ + 11466, + 11467, + 11468, + 11469, + 11470, + 11475, + 11476 + ], + "dims": [ + "elementCount" + ] + }, + "nodeCoords": { + "attrs": { + "units": "degrees" + }, + "data": null, + "dims": [ + "nodeCount", + "coordDim" + ] + }, + "numElementConn": { + "attrs": { + "long_name": "Number of nodes per element" + }, + "data": [ + 102, + 185, + 130, + 132, + 90, + 113, + 124 + ], + "dims": [ + "elementCount" + ] + } + }, + "dims": { + "connectionCount": 876, + "coordDim": 2, + "elementCount": 7, + "nodeCount": 653 + } + }, "height": null, "height_elem": null, + "heights_global": null, "inds": null, "lat_bounds": "hash_4066407811557226096", "latitude_grid": [ @@ -119,12 +258,24 @@ "ny_global_elem": null, "ny_local": 7, "ny_local_elem": null, + "pet_element_inds": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6 + ], "sina_grid": null, "slope": null, "slope_elem": null, + "slopes_global": null, "slp_azi": null, "slp_azi_elem": null, + "slp_azi_global": null, "spatial_global_atts": null, + "spatial_metadata_exists": false, "x_coord_atts": null, "x_coords": null, "x_lower_bound": null, diff --git a/tests/test_data/expected_results/test_expected_geomod_finalize_n2_rank0_.json b/tests/test_data/expected_results/test_expected_geomod_finalize_n2_rank0_.json index 2acf30ba..f185cbfb 100644 --- a/tests/test_data/expected_results/test_expected_geomod_finalize_n2_rank0_.json +++ b/tests/test_data/expected_results/test_expected_geomod_finalize_n2_rank0_.json @@ -19,6 +19,37 @@ 11475, 11476 ], + "elementcoords_global": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "esmf_ds": null, "esmf_grid": { "_area": [ null, @@ -66,8 +97,116 @@ }, "esmf_lat": null, "esmf_lon": null, + "geogrid_ds": { + "attrs": { + "gridType": "unstructured", + "version": "0.9" + }, + "coords": {}, + "data_vars": { + "centerCoords": { + "attrs": { + "units": "degrees" + }, + "data": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "dims": [ + "elementCount", + "coordDim" + ] + }, + "elementConn": { + "attrs": { + "long_name": "Node Indices that define the element connectivity" + }, + "data": "hash_-5156445445542653928", + "dims": [ + "connectionCount" + ] + }, + "element_id": { + "attrs": { + "long_name": "Catchment ID for hydrofabric" + }, + "data": [ + 11466, + 11467, + 11468, + 11469, + 11470, + 11475, + 11476 + ], + "dims": [ + "elementCount" + ] + }, + "nodeCoords": { + "attrs": { + "units": "degrees" + }, + "data": null, + "dims": [ + "nodeCount", + "coordDim" + ] + }, + "numElementConn": { + "attrs": { + "long_name": "Number of nodes per element" + }, + "data": [ + 102, + 185, + 130, + 132, + 90, + 113, + 124 + ], + "dims": [ + "elementCount" + ] + } + }, + "dims": { + "connectionCount": 876, + "coordDim": 2, + "elementCount": 7, + "nodeCount": 653 + } + }, "height": null, "height_elem": null, + "heights_global": null, "inds": null, "lat_bounds": "hash_4066407811557226096", "latitude_grid": [ @@ -101,12 +240,21 @@ "ny_global_elem": null, "ny_local": 4, "ny_local_elem": null, + "pet_element_inds": [ + 0, + 1, + 2, + 3 + ], "sina_grid": null, "slope": null, "slope_elem": null, + "slopes_global": null, "slp_azi": null, "slp_azi_elem": null, + "slp_azi_global": null, "spatial_global_atts": null, + "spatial_metadata_exists": false, "x_coord_atts": null, "x_coords": null, "x_lower_bound": null, diff --git a/tests/test_data/expected_results/test_expected_geomod_finalize_n2_rank1_.json b/tests/test_data/expected_results/test_expected_geomod_finalize_n2_rank1_.json index a3f11c93..2721b2c7 100644 --- a/tests/test_data/expected_results/test_expected_geomod_finalize_n2_rank1_.json +++ b/tests/test_data/expected_results/test_expected_geomod_finalize_n2_rank1_.json @@ -18,6 +18,37 @@ 11475, 11476 ], + "elementcoords_global": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "esmf_ds": null, "esmf_grid": { "_area": [ null, @@ -63,8 +94,116 @@ }, "esmf_lat": null, "esmf_lon": null, + "geogrid_ds": { + "attrs": { + "gridType": "unstructured", + "version": "0.9" + }, + "coords": {}, + "data_vars": { + "centerCoords": { + "attrs": { + "units": "degrees" + }, + "data": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "dims": [ + "elementCount", + "coordDim" + ] + }, + "elementConn": { + "attrs": { + "long_name": "Node Indices that define the element connectivity" + }, + "data": "hash_-5156445445542653928", + "dims": [ + "connectionCount" + ] + }, + "element_id": { + "attrs": { + "long_name": "Catchment ID for hydrofabric" + }, + "data": [ + 11466, + 11467, + 11468, + 11469, + 11470, + 11475, + 11476 + ], + "dims": [ + "elementCount" + ] + }, + "nodeCoords": { + "attrs": { + "units": "degrees" + }, + "data": null, + "dims": [ + "nodeCount", + "coordDim" + ] + }, + "numElementConn": { + "attrs": { + "long_name": "Number of nodes per element" + }, + "data": [ + 102, + 185, + 130, + 132, + 90, + 113, + 124 + ], + "dims": [ + "elementCount" + ] + } + }, + "dims": { + "connectionCount": 876, + "coordDim": 2, + "elementCount": 7, + "nodeCount": 653 + } + }, "height": null, "height_elem": null, + "heights_global": null, "inds": null, "lat_bounds": null, "latitude_grid": [ @@ -95,12 +234,20 @@ "ny_global_elem": null, "ny_local": 3, "ny_local_elem": null, + "pet_element_inds": [ + 4, + 5, + 6 + ], "sina_grid": null, "slope": null, "slope_elem": null, + "slopes_global": null, "slp_azi": null, "slp_azi_elem": null, + "slp_azi_global": null, "spatial_global_atts": null, + "spatial_metadata_exists": false, "x_coord_atts": null, "x_coords": null, "x_lower_bound": null, diff --git a/tests/test_data/expected_results/test_expected_geomod_init_n1_rank0_.json b/tests/test_data/expected_results/test_expected_geomod_init_n1_rank0_.json index dc6b5caf..12611f40 100644 --- a/tests/test_data/expected_results/test_expected_geomod_init_n1_rank0_.json +++ b/tests/test_data/expected_results/test_expected_geomod_init_n1_rank0_.json @@ -22,6 +22,37 @@ 11475, 11476 ], + "elementcoords_global": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "esmf_ds": null, "esmf_grid": { "_area": [ null, @@ -75,8 +106,116 @@ }, "esmf_lat": null, "esmf_lon": null, + "geogrid_ds": { + "attrs": { + "gridType": "unstructured", + "version": "0.9" + }, + "coords": {}, + "data_vars": { + "centerCoords": { + "attrs": { + "units": "degrees" + }, + "data": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "dims": [ + "elementCount", + "coordDim" + ] + }, + "elementConn": { + "attrs": { + "long_name": "Node Indices that define the element connectivity" + }, + "data": "hash_-5156445445542653928", + "dims": [ + "connectionCount" + ] + }, + "element_id": { + "attrs": { + "long_name": "Catchment ID for hydrofabric" + }, + "data": [ + 11466, + 11467, + 11468, + 11469, + 11470, + 11475, + 11476 + ], + "dims": [ + "elementCount" + ] + }, + "nodeCoords": { + "attrs": { + "units": "degrees" + }, + "data": null, + "dims": [ + "nodeCount", + "coordDim" + ] + }, + "numElementConn": { + "attrs": { + "long_name": "Number of nodes per element" + }, + "data": [ + 102, + 185, + 130, + 132, + 90, + 113, + 124 + ], + "dims": [ + "elementCount" + ] + } + }, + "dims": { + "connectionCount": 876, + "coordDim": 2, + "elementCount": 7, + "nodeCount": 653 + } + }, "height": null, "height_elem": null, + "heights_global": null, "inds": null, "lat_bounds": "hash_4066407811557226096", "latitude_grid": [ @@ -119,12 +258,24 @@ "ny_global_elem": null, "ny_local": 7, "ny_local_elem": null, + "pet_element_inds": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6 + ], "sina_grid": null, "slope": null, "slope_elem": null, + "slopes_global": null, "slp_azi": null, "slp_azi_elem": null, + "slp_azi_global": null, "spatial_global_atts": null, + "spatial_metadata_exists": false, "x_coord_atts": null, "x_coords": null, "x_lower_bound": null, diff --git a/tests/test_data/expected_results/test_expected_geomod_init_n2_rank0_.json b/tests/test_data/expected_results/test_expected_geomod_init_n2_rank0_.json index 2acf30ba..f185cbfb 100644 --- a/tests/test_data/expected_results/test_expected_geomod_init_n2_rank0_.json +++ b/tests/test_data/expected_results/test_expected_geomod_init_n2_rank0_.json @@ -19,6 +19,37 @@ 11475, 11476 ], + "elementcoords_global": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "esmf_ds": null, "esmf_grid": { "_area": [ null, @@ -66,8 +97,116 @@ }, "esmf_lat": null, "esmf_lon": null, + "geogrid_ds": { + "attrs": { + "gridType": "unstructured", + "version": "0.9" + }, + "coords": {}, + "data_vars": { + "centerCoords": { + "attrs": { + "units": "degrees" + }, + "data": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "dims": [ + "elementCount", + "coordDim" + ] + }, + "elementConn": { + "attrs": { + "long_name": "Node Indices that define the element connectivity" + }, + "data": "hash_-5156445445542653928", + "dims": [ + "connectionCount" + ] + }, + "element_id": { + "attrs": { + "long_name": "Catchment ID for hydrofabric" + }, + "data": [ + 11466, + 11467, + 11468, + 11469, + 11470, + 11475, + 11476 + ], + "dims": [ + "elementCount" + ] + }, + "nodeCoords": { + "attrs": { + "units": "degrees" + }, + "data": null, + "dims": [ + "nodeCount", + "coordDim" + ] + }, + "numElementConn": { + "attrs": { + "long_name": "Number of nodes per element" + }, + "data": [ + 102, + 185, + 130, + 132, + 90, + 113, + 124 + ], + "dims": [ + "elementCount" + ] + } + }, + "dims": { + "connectionCount": 876, + "coordDim": 2, + "elementCount": 7, + "nodeCount": 653 + } + }, "height": null, "height_elem": null, + "heights_global": null, "inds": null, "lat_bounds": "hash_4066407811557226096", "latitude_grid": [ @@ -101,12 +240,21 @@ "ny_global_elem": null, "ny_local": 4, "ny_local_elem": null, + "pet_element_inds": [ + 0, + 1, + 2, + 3 + ], "sina_grid": null, "slope": null, "slope_elem": null, + "slopes_global": null, "slp_azi": null, "slp_azi_elem": null, + "slp_azi_global": null, "spatial_global_atts": null, + "spatial_metadata_exists": false, "x_coord_atts": null, "x_coords": null, "x_lower_bound": null, diff --git a/tests/test_data/expected_results/test_expected_geomod_init_n2_rank1_.json b/tests/test_data/expected_results/test_expected_geomod_init_n2_rank1_.json index a3f11c93..2721b2c7 100644 --- a/tests/test_data/expected_results/test_expected_geomod_init_n2_rank1_.json +++ b/tests/test_data/expected_results/test_expected_geomod_init_n2_rank1_.json @@ -18,6 +18,37 @@ 11475, 11476 ], + "elementcoords_global": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "esmf_ds": null, "esmf_grid": { "_area": [ null, @@ -63,8 +94,116 @@ }, "esmf_lat": null, "esmf_lon": null, + "geogrid_ds": { + "attrs": { + "gridType": "unstructured", + "version": "0.9" + }, + "coords": {}, + "data_vars": { + "centerCoords": { + "attrs": { + "units": "degrees" + }, + "data": [ + [ + -72.04918711744217, + 41.824530105139985 + ], + [ + -72.0498876679477, + 41.79153684369973 + ], + [ + -72.05118870198277, + 41.739617787523294 + ], + [ + -72.04754380872834, + 41.68903878715741 + ], + [ + -72.0554434265969, + 41.66453348086255 + ], + [ + -72.03341338948294, + 41.721705460500516 + ], + [ + -72.07444419922648, + 41.77940007526497 + ] + ], + "dims": [ + "elementCount", + "coordDim" + ] + }, + "elementConn": { + "attrs": { + "long_name": "Node Indices that define the element connectivity" + }, + "data": "hash_-5156445445542653928", + "dims": [ + "connectionCount" + ] + }, + "element_id": { + "attrs": { + "long_name": "Catchment ID for hydrofabric" + }, + "data": [ + 11466, + 11467, + 11468, + 11469, + 11470, + 11475, + 11476 + ], + "dims": [ + "elementCount" + ] + }, + "nodeCoords": { + "attrs": { + "units": "degrees" + }, + "data": null, + "dims": [ + "nodeCount", + "coordDim" + ] + }, + "numElementConn": { + "attrs": { + "long_name": "Number of nodes per element" + }, + "data": [ + 102, + 185, + 130, + 132, + 90, + 113, + 124 + ], + "dims": [ + "elementCount" + ] + } + }, + "dims": { + "connectionCount": 876, + "coordDim": 2, + "elementCount": 7, + "nodeCount": 653 + } + }, "height": null, "height_elem": null, + "heights_global": null, "inds": null, "lat_bounds": null, "latitude_grid": [ @@ -95,12 +234,20 @@ "ny_global_elem": null, "ny_local": 3, "ny_local_elem": null, + "pet_element_inds": [ + 4, + 5, + 6 + ], "sina_grid": null, "slope": null, "slope_elem": null, + "slopes_global": null, "slp_azi": null, "slp_azi_elem": null, + "slp_azi_global": null, "spatial_global_atts": null, + "spatial_metadata_exists": false, "x_coord_atts": null, "x_coords": null, "x_lower_bound": null, diff --git a/tests/test_data/expected_results/test_expected_input_forcing_after_update_n1_rank0__step_1.json b/tests/test_data/expected_results/test_expected_input_forcing_after_update_n1_rank0__step_1.json index 797e0fd1..826ccefb 100644 --- a/tests/test_data/expected_results/test_expected_input_forcing_after_update_n1_rank0__step_1.json +++ b/tests/test_data/expected_results/test_expected_input_forcing_after_update_n1_rank0__step_1.json @@ -1,9 +1,9 @@ { - "border": 0, "coarse_input_forcings1": null, "coarse_input_forcings2": null, + "custom_count": 0, "cycle_freq": -9999, - "enforce": 0, + "dScaleParamDirs": "/ngen-app/data", "esmf_field_in": { "_data": null, "_finalized": false, @@ -278,10 +278,11 @@ "fcst_date2": null, "fcst_hour1": null, "fcst_hour2": null, + "fcst_input_horizons": 4260, + "fcst_input_offsets": 0, "file_ext": ".grib2", "file_in1": "s3://null/AORC-OWP_2013070101z.grib2", "file_in2": "s3://null/AORC-OWP_2013070101z.grib2", - "file_type": "GRIB2", "final_forcings": [ [ 1.100000023841858, @@ -356,13 +357,13 @@ 0.0 ], [ - 7.987401246651457e-44, - 8.127531093083939e-44, - 8.267660939516421e-44, - 8.407790785948902e-44, - 8.547920632381384e-44, - 8.688050478813866e-44, - 8.828180325246348e-44 + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN ] ], "final_forcings_elem": null, @@ -393,6 +394,8 @@ "8": "find_hourly_wrf_arw_neighbors", "9": "find_gfs_neighbors" }, + "forceTemoralInterp": 0, + "force_count": 9, "forecast_horizons": null, "globalPcpRate1": null, "globalPcpRate1_elem": null, @@ -420,7 +423,12 @@ NaN ], "height_elem": null, - "inDir": "s3://null", + "idx": 0, + "ignored_border_widths": 0, + "input_force_dirs": "s3://null", + "input_force_mandatory": 0, + "input_force_types": "GRIB2", + "input_forcings": 12, "input_map_output": [ 4, 5, @@ -454,7 +462,6 @@ "ny_local": 28, "ny_local_corner": null, "outFreq": null, - "paramDir": "/ngen-app/data", "precipBiasCorrectOpt": 0, "precipDownscaleOpt": 0, "product_name": "AORC", @@ -462,11 +469,10 @@ "psfcDownscaleOpt": 0, "psfcTmp": null, "psfcTmp_elem": null, - "q2dBiasCorrectOpt": 0, + "q2BiasCorrectOpt": 0, "q2dDownscaleOpt": 0, "regridComplete": false, "regridObj_elem": null, - "regridOpt": 1, "regrid_map": { "1": "regrid_conus_rap", "10": "regrid_custom_hourly_netcdf", @@ -494,6 +500,7 @@ "8": "regrid_hourly_wrf_arw", "9": "regrid_gfs" }, + "regrid_opt": 1, "regridded_forcings1": [ [ 1.100000023841858, @@ -568,13 +575,13 @@ 0.0 ], [ - 1.6255062186167878e-43, - 6.305843089461677e-44, - 6.866362475191604e-44, - 6.866362475191604e-44, - 7.286752014489049e-44, - 7.707141553786494e-44, - 6.726232628759122e-44 + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN ] ], "regridded_forcings1_elem": null, @@ -652,13 +659,13 @@ 0.0 ], [ - 7.987401246651457e-44, - 8.127531093083939e-44, - 8.267660939516421e-44, - 8.407790785948902e-44, - 8.547920632381384e-44, - 8.688050478813866e-44, - 8.828180325246348e-44 + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN ] ], "regridded_forcings2_elem": null, @@ -690,8 +697,8 @@ "rstFlag": 0, "skip": false, "swBiasCorrectOpt": 0, - "swDowscaleOpt": 0, - "t2dBiasCorrectOpt": 0, + "swDownscaleOpt": 0, + "t2BiasCorrectOpt": 0, "t2dDownscaleOpt": 0, "t2dTmp": null, "t2dTmp_elem": null, @@ -700,12 +707,9 @@ "1": "nearest_neighbor", "2": "weighted_average" }, - "timeInterpOpt": 0, "tmpFile": null, "tmpFileHeight": null, - "userCycleOffset": 0, - "userFcstHorizon": 4260, - "windBiasCorrectOpt": 0, + "windBiasCorrect": 0, "x_lower_bound": 0, "x_lower_bound_corner": null, "x_upper_bound": 14, diff --git a/tests/test_data/expected_results/test_expected_input_forcing_after_update_n1_rank0__step_2.json b/tests/test_data/expected_results/test_expected_input_forcing_after_update_n1_rank0__step_2.json index 6e61a1bf..a164e8a7 100644 --- a/tests/test_data/expected_results/test_expected_input_forcing_after_update_n1_rank0__step_2.json +++ b/tests/test_data/expected_results/test_expected_input_forcing_after_update_n1_rank0__step_2.json @@ -1,9 +1,9 @@ { - "border": 0, "coarse_input_forcings1": null, "coarse_input_forcings2": null, + "custom_count": 0, "cycle_freq": -9999, - "enforce": 0, + "dScaleParamDirs": "/ngen-app/data", "esmf_field_in": { "_data": null, "_finalized": false, @@ -278,10 +278,11 @@ "fcst_date2": null, "fcst_hour1": null, "fcst_hour2": null, + "fcst_input_horizons": 4260, + "fcst_input_offsets": 0, "file_ext": ".grib2", "file_in1": "s3://null/AORC-OWP_2013070102z.grib2", "file_in2": "s3://null/AORC-OWP_2013070102z.grib2", - "file_type": "GRIB2", "final_forcings": [ [ 1.100000023841858, @@ -393,6 +394,8 @@ "8": "find_hourly_wrf_arw_neighbors", "9": "find_gfs_neighbors" }, + "forceTemoralInterp": 0, + "force_count": 9, "forecast_horizons": null, "globalPcpRate1": null, "globalPcpRate1_elem": null, @@ -420,7 +423,12 @@ NaN ], "height_elem": null, - "inDir": "s3://null", + "idx": 0, + "ignored_border_widths": 0, + "input_force_dirs": "s3://null", + "input_force_mandatory": 0, + "input_force_types": "GRIB2", + "input_forcings": 12, "input_map_output": [ 4, 5, @@ -454,7 +462,6 @@ "ny_local": 28, "ny_local_corner": null, "outFreq": null, - "paramDir": "/ngen-app/data", "precipBiasCorrectOpt": 0, "precipDownscaleOpt": 0, "product_name": "AORC", @@ -462,11 +469,10 @@ "psfcDownscaleOpt": 0, "psfcTmp": null, "psfcTmp_elem": null, - "q2dBiasCorrectOpt": 0, + "q2BiasCorrectOpt": 0, "q2dDownscaleOpt": 0, "regridComplete": false, "regridObj_elem": null, - "regridOpt": 1, "regrid_map": { "1": "regrid_conus_rap", "10": "regrid_custom_hourly_netcdf", @@ -494,6 +500,7 @@ "8": "regrid_hourly_wrf_arw", "9": "regrid_gfs" }, + "regrid_opt": 1, "regridded_forcings1": [ [ 1.100000023841858, @@ -568,13 +575,13 @@ 0.0 ], [ - 7.987401246651457e-44, - 8.127531093083939e-44, - 8.267660939516421e-44, - 8.407790785948902e-44, - 8.547920632381384e-44, - 8.688050478813866e-44, - 8.828180325246348e-44 + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN ] ], "regridded_forcings1_elem": null, @@ -690,8 +697,8 @@ "rstFlag": 0, "skip": false, "swBiasCorrectOpt": 0, - "swDowscaleOpt": 0, - "t2dBiasCorrectOpt": 0, + "swDownscaleOpt": 0, + "t2BiasCorrectOpt": 0, "t2dDownscaleOpt": 0, "t2dTmp": null, "t2dTmp_elem": null, @@ -700,12 +707,9 @@ "1": "nearest_neighbor", "2": "weighted_average" }, - "timeInterpOpt": 0, "tmpFile": null, "tmpFileHeight": null, - "userCycleOffset": 0, - "userFcstHorizon": 4260, - "windBiasCorrectOpt": 0, + "windBiasCorrect": 0, "x_lower_bound": 0, "x_lower_bound_corner": null, "x_upper_bound": 14, diff --git a/tests/test_data/expected_results/test_expected_input_forcing_after_update_n1_rank0__step_3.json b/tests/test_data/expected_results/test_expected_input_forcing_after_update_n1_rank0__step_3.json index 67a6c576..576ad206 100644 --- a/tests/test_data/expected_results/test_expected_input_forcing_after_update_n1_rank0__step_3.json +++ b/tests/test_data/expected_results/test_expected_input_forcing_after_update_n1_rank0__step_3.json @@ -1,9 +1,9 @@ { - "border": 0, "coarse_input_forcings1": null, "coarse_input_forcings2": null, + "custom_count": 0, "cycle_freq": -9999, - "enforce": 0, + "dScaleParamDirs": "/ngen-app/data", "esmf_field_in": { "_data": null, "_finalized": false, @@ -278,10 +278,11 @@ "fcst_date2": null, "fcst_hour1": null, "fcst_hour2": null, + "fcst_input_horizons": 4260, + "fcst_input_offsets": 0, "file_ext": ".grib2", "file_in1": "s3://null/AORC-OWP_2013070103z.grib2", "file_in2": "s3://null/AORC-OWP_2013070103z.grib2", - "file_type": "GRIB2", "final_forcings": [ [ 1.0, @@ -393,6 +394,8 @@ "8": "find_hourly_wrf_arw_neighbors", "9": "find_gfs_neighbors" }, + "forceTemoralInterp": 0, + "force_count": 9, "forecast_horizons": null, "globalPcpRate1": null, "globalPcpRate1_elem": null, @@ -420,7 +423,12 @@ NaN ], "height_elem": null, - "inDir": "s3://null", + "idx": 0, + "ignored_border_widths": 0, + "input_force_dirs": "s3://null", + "input_force_mandatory": 0, + "input_force_types": "GRIB2", + "input_forcings": 12, "input_map_output": [ 4, 5, @@ -454,7 +462,6 @@ "ny_local": 28, "ny_local_corner": null, "outFreq": null, - "paramDir": "/ngen-app/data", "precipBiasCorrectOpt": 0, "precipDownscaleOpt": 0, "product_name": "AORC", @@ -462,11 +469,10 @@ "psfcDownscaleOpt": 0, "psfcTmp": null, "psfcTmp_elem": null, - "q2dBiasCorrectOpt": 0, + "q2BiasCorrectOpt": 0, "q2dDownscaleOpt": 0, "regridComplete": false, "regridObj_elem": null, - "regridOpt": 1, "regrid_map": { "1": "regrid_conus_rap", "10": "regrid_custom_hourly_netcdf", @@ -494,6 +500,7 @@ "8": "regrid_hourly_wrf_arw", "9": "regrid_gfs" }, + "regrid_opt": 1, "regridded_forcings1": [ [ 1.100000023841858, @@ -690,8 +697,8 @@ "rstFlag": 0, "skip": false, "swBiasCorrectOpt": 0, - "swDowscaleOpt": 0, - "t2dBiasCorrectOpt": 0, + "swDownscaleOpt": 0, + "t2BiasCorrectOpt": 0, "t2dDownscaleOpt": 0, "t2dTmp": null, "t2dTmp_elem": null, @@ -700,12 +707,9 @@ "1": "nearest_neighbor", "2": "weighted_average" }, - "timeInterpOpt": 0, "tmpFile": null, "tmpFileHeight": null, - "userCycleOffset": 0, - "userFcstHorizon": 4260, - "windBiasCorrectOpt": 0, + "windBiasCorrect": 0, "x_lower_bound": 0, "x_lower_bound_corner": null, "x_upper_bound": 14, diff --git a/tests/test_data/expected_results/test_expected_input_forcing_after_update_n2_rank0__step_1.json b/tests/test_data/expected_results/test_expected_input_forcing_after_update_n2_rank0__step_1.json index 1c3479b5..4d5d2692 100644 --- a/tests/test_data/expected_results/test_expected_input_forcing_after_update_n2_rank0__step_1.json +++ b/tests/test_data/expected_results/test_expected_input_forcing_after_update_n2_rank0__step_1.json @@ -1,9 +1,9 @@ { - "border": 0, "coarse_input_forcings1": null, "coarse_input_forcings2": null, + "custom_count": 0, "cycle_freq": -9999, - "enforce": 0, + "dScaleParamDirs": "/ngen-app/data", "esmf_field_in": { "_data": null, "_finalized": false, @@ -269,10 +269,11 @@ "fcst_date2": null, "fcst_hour1": null, "fcst_hour2": null, + "fcst_input_horizons": 4260, + "fcst_input_offsets": 0, "file_ext": ".grib2", "file_in1": "s3://null/AORC-OWP_2013070101z.grib2", "file_in2": "s3://null/AORC-OWP_2013070101z.grib2", - "file_type": "GRIB2", "final_forcings": [ [ 1.100000023841858, @@ -323,10 +324,10 @@ 0.0 ], [ - 9.18803377088496e-41, - 4.364694391755724e-40, - 0.0, - -6.165852519510108e+34 + NaN, + NaN, + NaN, + NaN ] ], "final_forcings_elem": null, @@ -357,6 +358,8 @@ "8": "find_hourly_wrf_arw_neighbors", "9": "find_gfs_neighbors" }, + "forceTemoralInterp": 0, + "force_count": 9, "forecast_horizons": null, "globalPcpRate1": null, "globalPcpRate1_elem": null, @@ -381,7 +384,12 @@ NaN ], "height_elem": null, - "inDir": "s3://null", + "idx": 0, + "ignored_border_widths": 0, + "input_force_dirs": "s3://null", + "input_force_mandatory": 0, + "input_force_types": "GRIB2", + "input_forcings": 12, "input_map_output": [ 4, 5, @@ -415,7 +423,6 @@ "ny_local": 14, "ny_local_corner": null, "outFreq": null, - "paramDir": "/ngen-app/data", "precipBiasCorrectOpt": 0, "precipDownscaleOpt": 0, "product_name": "AORC", @@ -423,11 +430,10 @@ "psfcDownscaleOpt": 0, "psfcTmp": null, "psfcTmp_elem": null, - "q2dBiasCorrectOpt": 0, + "q2BiasCorrectOpt": 0, "q2dDownscaleOpt": 0, "regridComplete": false, "regridObj_elem": null, - "regridOpt": 1, "regrid_map": { "1": "regrid_conus_rap", "10": "regrid_custom_hourly_netcdf", @@ -455,6 +461,7 @@ "8": "regrid_hourly_wrf_arw", "9": "regrid_gfs" }, + "regrid_opt": 1, "regridded_forcings1": [ [ 1.100000023841858, @@ -505,10 +512,10 @@ 0.0 ], [ - 9.18915480965642e-41, - 4.350345095481038e-40, - 0.0, - 0.11376953125 + NaN, + NaN, + NaN, + NaN ] ], "regridded_forcings1_elem": null, @@ -562,10 +569,10 @@ 0.0 ], [ - 9.18803377088496e-41, - 4.364694391755724e-40, - 0.0, - -6.165852519510108e+34 + NaN, + NaN, + NaN, + NaN ] ], "regridded_forcings2_elem": null, @@ -591,8 +598,8 @@ "rstFlag": 0, "skip": false, "swBiasCorrectOpt": 0, - "swDowscaleOpt": 0, - "t2dBiasCorrectOpt": 0, + "swDownscaleOpt": 0, + "t2BiasCorrectOpt": 0, "t2dDownscaleOpt": 0, "t2dTmp": null, "t2dTmp_elem": null, @@ -601,12 +608,9 @@ "1": "nearest_neighbor", "2": "weighted_average" }, - "timeInterpOpt": 0, "tmpFile": null, "tmpFileHeight": null, - "userCycleOffset": 0, - "userFcstHorizon": 4260, - "windBiasCorrectOpt": 0, + "windBiasCorrect": 0, "x_lower_bound": 0, "x_lower_bound_corner": null, "x_upper_bound": 14, diff --git a/tests/test_data/expected_results/test_expected_input_forcing_after_update_n2_rank0__step_2.json b/tests/test_data/expected_results/test_expected_input_forcing_after_update_n2_rank0__step_2.json index 01ccb117..4c35a31d 100644 --- a/tests/test_data/expected_results/test_expected_input_forcing_after_update_n2_rank0__step_2.json +++ b/tests/test_data/expected_results/test_expected_input_forcing_after_update_n2_rank0__step_2.json @@ -1,9 +1,9 @@ { - "border": 0, "coarse_input_forcings1": null, "coarse_input_forcings2": null, + "custom_count": 0, "cycle_freq": -9999, - "enforce": 0, + "dScaleParamDirs": "/ngen-app/data", "esmf_field_in": { "_data": null, "_finalized": false, @@ -112,7 +112,7 @@ "esmf_field_out": { "_data": [ 99263.83797955123, - 99864.20759754517, + 99864.20759754519, 99984.1178572765, 99951.00373610242 ], @@ -269,10 +269,11 @@ "fcst_date2": null, "fcst_hour1": null, "fcst_hour2": null, + "fcst_input_horizons": 4260, + "fcst_input_offsets": 0, "file_ext": ".grib2", "file_in1": "s3://null/AORC-OWP_2013070102z.grib2", "file_in2": "s3://null/AORC-OWP_2013070102z.grib2", - "file_type": "GRIB2", "final_forcings": [ [ 1.100000023841858, @@ -357,6 +358,8 @@ "8": "find_hourly_wrf_arw_neighbors", "9": "find_gfs_neighbors" }, + "forceTemoralInterp": 0, + "force_count": 9, "forecast_horizons": null, "globalPcpRate1": null, "globalPcpRate1_elem": null, @@ -381,7 +384,12 @@ NaN ], "height_elem": null, - "inDir": "s3://null", + "idx": 0, + "ignored_border_widths": 0, + "input_force_dirs": "s3://null", + "input_force_mandatory": 0, + "input_force_types": "GRIB2", + "input_forcings": 12, "input_map_output": [ 4, 5, @@ -415,7 +423,6 @@ "ny_local": 14, "ny_local_corner": null, "outFreq": null, - "paramDir": "/ngen-app/data", "precipBiasCorrectOpt": 0, "precipDownscaleOpt": 0, "product_name": "AORC", @@ -423,11 +430,10 @@ "psfcDownscaleOpt": 0, "psfcTmp": null, "psfcTmp_elem": null, - "q2dBiasCorrectOpt": 0, + "q2BiasCorrectOpt": 0, "q2dDownscaleOpt": 0, "regridComplete": false, "regridObj_elem": null, - "regridOpt": 1, "regrid_map": { "1": "regrid_conus_rap", "10": "regrid_custom_hourly_netcdf", @@ -455,6 +461,7 @@ "8": "regrid_hourly_wrf_arw", "9": "regrid_gfs" }, + "regrid_opt": 1, "regridded_forcings1": [ [ 1.100000023841858, @@ -505,10 +512,10 @@ 0.0 ], [ - 9.18803377088496e-41, - 4.364694391755724e-40, - 0.0, - -6.165852519510108e+34 + NaN, + NaN, + NaN, + NaN ] ], "regridded_forcings1_elem": null, @@ -591,8 +598,8 @@ "rstFlag": 0, "skip": false, "swBiasCorrectOpt": 0, - "swDowscaleOpt": 0, - "t2dBiasCorrectOpt": 0, + "swDownscaleOpt": 0, + "t2BiasCorrectOpt": 0, "t2dDownscaleOpt": 0, "t2dTmp": null, "t2dTmp_elem": null, @@ -601,12 +608,9 @@ "1": "nearest_neighbor", "2": "weighted_average" }, - "timeInterpOpt": 0, "tmpFile": null, "tmpFileHeight": null, - "userCycleOffset": 0, - "userFcstHorizon": 4260, - "windBiasCorrectOpt": 0, + "windBiasCorrect": 0, "x_lower_bound": 0, "x_lower_bound_corner": null, "x_upper_bound": 14, diff --git a/tests/test_data/expected_results/test_expected_input_forcing_after_update_n2_rank0__step_3.json b/tests/test_data/expected_results/test_expected_input_forcing_after_update_n2_rank0__step_3.json index 9970fd8b..0b68a282 100644 --- a/tests/test_data/expected_results/test_expected_input_forcing_after_update_n2_rank0__step_3.json +++ b/tests/test_data/expected_results/test_expected_input_forcing_after_update_n2_rank0__step_3.json @@ -1,9 +1,9 @@ { - "border": 0, "coarse_input_forcings1": null, "coarse_input_forcings2": null, + "custom_count": 0, "cycle_freq": -9999, - "enforce": 0, + "dScaleParamDirs": "/ngen-app/data", "esmf_field_in": { "_data": null, "_finalized": false, @@ -111,7 +111,7 @@ "esmf_field_in_elem": null, "esmf_field_out": { "_data": [ - 99363.83797955123, + 99363.83797955124, 99970.04062791045, 100085.72479451672, 100059.85331996171 @@ -269,10 +269,11 @@ "fcst_date2": null, "fcst_hour1": null, "fcst_hour2": null, + "fcst_input_horizons": 4260, + "fcst_input_offsets": 0, "file_ext": ".grib2", "file_in1": "s3://null/AORC-OWP_2013070103z.grib2", "file_in2": "s3://null/AORC-OWP_2013070103z.grib2", - "file_type": "GRIB2", "final_forcings": [ [ 1.0, @@ -357,6 +358,8 @@ "8": "find_hourly_wrf_arw_neighbors", "9": "find_gfs_neighbors" }, + "forceTemoralInterp": 0, + "force_count": 9, "forecast_horizons": null, "globalPcpRate1": null, "globalPcpRate1_elem": null, @@ -381,7 +384,12 @@ NaN ], "height_elem": null, - "inDir": "s3://null", + "idx": 0, + "ignored_border_widths": 0, + "input_force_dirs": "s3://null", + "input_force_mandatory": 0, + "input_force_types": "GRIB2", + "input_forcings": 12, "input_map_output": [ 4, 5, @@ -415,7 +423,6 @@ "ny_local": 14, "ny_local_corner": null, "outFreq": null, - "paramDir": "/ngen-app/data", "precipBiasCorrectOpt": 0, "precipDownscaleOpt": 0, "product_name": "AORC", @@ -423,11 +430,10 @@ "psfcDownscaleOpt": 0, "psfcTmp": null, "psfcTmp_elem": null, - "q2dBiasCorrectOpt": 0, + "q2BiasCorrectOpt": 0, "q2dDownscaleOpt": 0, "regridComplete": false, "regridObj_elem": null, - "regridOpt": 1, "regrid_map": { "1": "regrid_conus_rap", "10": "regrid_custom_hourly_netcdf", @@ -455,6 +461,7 @@ "8": "regrid_hourly_wrf_arw", "9": "regrid_gfs" }, + "regrid_opt": 1, "regridded_forcings1": [ [ 1.100000023841858, @@ -591,8 +598,8 @@ "rstFlag": 0, "skip": false, "swBiasCorrectOpt": 0, - "swDowscaleOpt": 0, - "t2dBiasCorrectOpt": 0, + "swDownscaleOpt": 0, + "t2BiasCorrectOpt": 0, "t2dDownscaleOpt": 0, "t2dTmp": null, "t2dTmp_elem": null, @@ -601,12 +608,9 @@ "1": "nearest_neighbor", "2": "weighted_average" }, - "timeInterpOpt": 0, "tmpFile": null, "tmpFileHeight": null, - "userCycleOffset": 0, - "userFcstHorizon": 4260, - "windBiasCorrectOpt": 0, + "windBiasCorrect": 0, "x_lower_bound": 0, "x_lower_bound_corner": null, "x_upper_bound": 14, diff --git a/tests/test_data/expected_results/test_expected_input_forcing_after_update_n2_rank1__step_1.json b/tests/test_data/expected_results/test_expected_input_forcing_after_update_n2_rank1__step_1.json index 641b95a6..2ee6bc95 100644 --- a/tests/test_data/expected_results/test_expected_input_forcing_after_update_n2_rank1__step_1.json +++ b/tests/test_data/expected_results/test_expected_input_forcing_after_update_n2_rank1__step_1.json @@ -1,9 +1,9 @@ { - "border": 0, "coarse_input_forcings1": null, "coarse_input_forcings2": null, + "custom_count": 0, "cycle_freq": -9999, - "enforce": 0, + "dScaleParamDirs": "/ngen-app/data", "esmf_field_in": { "_data": null, "_finalized": false, @@ -266,10 +266,11 @@ "fcst_date2": null, "fcst_hour1": null, "fcst_hour2": null, + "fcst_input_horizons": 4260, + "fcst_input_offsets": 0, "file_ext": ".grib2", "file_in1": "s3://null/AORC-OWP_2013070101z.grib2", "file_in2": "s3://null/AORC-OWP_2013070101z.grib2", - "file_type": "GRIB2", "final_forcings": [ [ 0.800000011920929, @@ -312,9 +313,9 @@ 0.0 ], [ - 2.5638655642978847e-09, - 0.0, - 0.0 + NaN, + NaN, + NaN ] ], "final_forcings_elem": null, @@ -345,6 +346,8 @@ "8": "find_hourly_wrf_arw_neighbors", "9": "find_gfs_neighbors" }, + "forceTemoralInterp": 0, + "force_count": 9, "forecast_horizons": null, "globalPcpRate1": null, "globalPcpRate1_elem": null, @@ -368,7 +371,12 @@ NaN ], "height_elem": null, - "inDir": "s3://null", + "idx": 0, + "ignored_border_widths": 0, + "input_force_dirs": "s3://null", + "input_force_mandatory": 0, + "input_force_types": "GRIB2", + "input_forcings": 12, "input_map_output": [ 4, 5, @@ -402,7 +410,6 @@ "ny_local": 14, "ny_local_corner": null, "outFreq": null, - "paramDir": "/ngen-app/data", "precipBiasCorrectOpt": 0, "precipDownscaleOpt": 0, "product_name": "AORC", @@ -410,11 +417,10 @@ "psfcDownscaleOpt": 0, "psfcTmp": null, "psfcTmp_elem": null, - "q2dBiasCorrectOpt": 0, + "q2BiasCorrectOpt": 0, "q2dDownscaleOpt": 0, "regridComplete": false, "regridObj_elem": null, - "regridOpt": 1, "regrid_map": { "1": "regrid_conus_rap", "10": "regrid_custom_hourly_netcdf", @@ -442,6 +448,7 @@ "8": "regrid_hourly_wrf_arw", "9": "regrid_gfs" }, + "regrid_opt": 1, "regridded_forcings1": [ [ 0.800000011920929, @@ -484,9 +491,9 @@ 0.0 ], [ - 2.5638655642978847e-09, - 0.0, - 0.0 + NaN, + NaN, + NaN ] ], "regridded_forcings1_elem": null, @@ -532,9 +539,9 @@ 0.0 ], [ - 2.5638655642978847e-09, - 0.0, - 0.0 + NaN, + NaN, + NaN ] ], "regridded_forcings2_elem": null, @@ -558,8 +565,8 @@ "rstFlag": 0, "skip": false, "swBiasCorrectOpt": 0, - "swDowscaleOpt": 0, - "t2dBiasCorrectOpt": 0, + "swDownscaleOpt": 0, + "t2BiasCorrectOpt": 0, "t2dDownscaleOpt": 0, "t2dTmp": null, "t2dTmp_elem": null, @@ -568,12 +575,9 @@ "1": "nearest_neighbor", "2": "weighted_average" }, - "timeInterpOpt": 0, "tmpFile": null, "tmpFileHeight": null, - "userCycleOffset": 0, - "userFcstHorizon": 4260, - "windBiasCorrectOpt": 0, + "windBiasCorrect": 0, "x_lower_bound": 0, "x_lower_bound_corner": null, "x_upper_bound": 14, diff --git a/tests/test_data/expected_results/test_expected_input_forcing_after_update_n2_rank1__step_2.json b/tests/test_data/expected_results/test_expected_input_forcing_after_update_n2_rank1__step_2.json index 3b3d7d69..72f41e1c 100644 --- a/tests/test_data/expected_results/test_expected_input_forcing_after_update_n2_rank1__step_2.json +++ b/tests/test_data/expected_results/test_expected_input_forcing_after_update_n2_rank1__step_2.json @@ -1,9 +1,9 @@ { - "border": 0, "coarse_input_forcings1": null, "coarse_input_forcings2": null, + "custom_count": 0, "cycle_freq": -9999, - "enforce": 0, + "dScaleParamDirs": "/ngen-app/data", "esmf_field_in": { "_data": null, "_finalized": false, @@ -113,7 +113,7 @@ "_data": [ 100253.86506548879, 99872.71103274089, - 99065.63984167963 + 99065.63984167964 ], "_finalized": false, "_grid": { @@ -266,10 +266,11 @@ "fcst_date2": null, "fcst_hour1": null, "fcst_hour2": null, + "fcst_input_horizons": 4260, + "fcst_input_offsets": 0, "file_ext": ".grib2", "file_in1": "s3://null/AORC-OWP_2013070102z.grib2", "file_in2": "s3://null/AORC-OWP_2013070102z.grib2", - "file_type": "GRIB2", "final_forcings": [ [ 0.699999988079071, @@ -345,6 +346,8 @@ "8": "find_hourly_wrf_arw_neighbors", "9": "find_gfs_neighbors" }, + "forceTemoralInterp": 0, + "force_count": 9, "forecast_horizons": null, "globalPcpRate1": null, "globalPcpRate1_elem": null, @@ -368,7 +371,12 @@ NaN ], "height_elem": null, - "inDir": "s3://null", + "idx": 0, + "ignored_border_widths": 0, + "input_force_dirs": "s3://null", + "input_force_mandatory": 0, + "input_force_types": "GRIB2", + "input_forcings": 12, "input_map_output": [ 4, 5, @@ -402,7 +410,6 @@ "ny_local": 14, "ny_local_corner": null, "outFreq": null, - "paramDir": "/ngen-app/data", "precipBiasCorrectOpt": 0, "precipDownscaleOpt": 0, "product_name": "AORC", @@ -410,11 +417,10 @@ "psfcDownscaleOpt": 0, "psfcTmp": null, "psfcTmp_elem": null, - "q2dBiasCorrectOpt": 0, + "q2BiasCorrectOpt": 0, "q2dDownscaleOpt": 0, "regridComplete": false, "regridObj_elem": null, - "regridOpt": 1, "regrid_map": { "1": "regrid_conus_rap", "10": "regrid_custom_hourly_netcdf", @@ -442,6 +448,7 @@ "8": "regrid_hourly_wrf_arw", "9": "regrid_gfs" }, + "regrid_opt": 1, "regridded_forcings1": [ [ 0.800000011920929, @@ -484,9 +491,9 @@ 0.0 ], [ - 2.5638655642978847e-09, - 0.0, - 0.0 + NaN, + NaN, + NaN ] ], "regridded_forcings1_elem": null, @@ -558,8 +565,8 @@ "rstFlag": 0, "skip": false, "swBiasCorrectOpt": 0, - "swDowscaleOpt": 0, - "t2dBiasCorrectOpt": 0, + "swDownscaleOpt": 0, + "t2BiasCorrectOpt": 0, "t2dDownscaleOpt": 0, "t2dTmp": null, "t2dTmp_elem": null, @@ -568,12 +575,9 @@ "1": "nearest_neighbor", "2": "weighted_average" }, - "timeInterpOpt": 0, "tmpFile": null, "tmpFileHeight": null, - "userCycleOffset": 0, - "userFcstHorizon": 4260, - "windBiasCorrectOpt": 0, + "windBiasCorrect": 0, "x_lower_bound": 0, "x_lower_bound_corner": null, "x_upper_bound": 14, diff --git a/tests/test_data/expected_results/test_expected_input_forcing_after_update_n2_rank1__step_3.json b/tests/test_data/expected_results/test_expected_input_forcing_after_update_n2_rank1__step_3.json index 094eaadb..d82d176a 100644 --- a/tests/test_data/expected_results/test_expected_input_forcing_after_update_n2_rank1__step_3.json +++ b/tests/test_data/expected_results/test_expected_input_forcing_after_update_n2_rank1__step_3.json @@ -1,9 +1,9 @@ { - "border": 0, "coarse_input_forcings1": null, "coarse_input_forcings2": null, + "custom_count": 0, "cycle_freq": -9999, - "enforce": 0, + "dScaleParamDirs": "/ngen-app/data", "esmf_field_in": { "_data": null, "_finalized": false, @@ -266,10 +266,11 @@ "fcst_date2": null, "fcst_hour1": null, "fcst_hour2": null, + "fcst_input_horizons": 4260, + "fcst_input_offsets": 0, "file_ext": ".grib2", "file_in1": "s3://null/AORC-OWP_2013070103z.grib2", "file_in2": "s3://null/AORC-OWP_2013070103z.grib2", - "file_type": "GRIB2", "final_forcings": [ [ 0.6000000238418579, @@ -345,6 +346,8 @@ "8": "find_hourly_wrf_arw_neighbors", "9": "find_gfs_neighbors" }, + "forceTemoralInterp": 0, + "force_count": 9, "forecast_horizons": null, "globalPcpRate1": null, "globalPcpRate1_elem": null, @@ -368,7 +371,12 @@ NaN ], "height_elem": null, - "inDir": "s3://null", + "idx": 0, + "ignored_border_widths": 0, + "input_force_dirs": "s3://null", + "input_force_mandatory": 0, + "input_force_types": "GRIB2", + "input_forcings": 12, "input_map_output": [ 4, 5, @@ -402,7 +410,6 @@ "ny_local": 14, "ny_local_corner": null, "outFreq": null, - "paramDir": "/ngen-app/data", "precipBiasCorrectOpt": 0, "precipDownscaleOpt": 0, "product_name": "AORC", @@ -410,11 +417,10 @@ "psfcDownscaleOpt": 0, "psfcTmp": null, "psfcTmp_elem": null, - "q2dBiasCorrectOpt": 0, + "q2BiasCorrectOpt": 0, "q2dDownscaleOpt": 0, "regridComplete": false, "regridObj_elem": null, - "regridOpt": 1, "regrid_map": { "1": "regrid_conus_rap", "10": "regrid_custom_hourly_netcdf", @@ -442,6 +448,7 @@ "8": "regrid_hourly_wrf_arw", "9": "regrid_gfs" }, + "regrid_opt": 1, "regridded_forcings1": [ [ 0.800000011920929, @@ -484,9 +491,9 @@ 0.0 ], [ - 2.5638655642978847e-09, - 0.0, - 0.0 + NaN, + NaN, + NaN ] ], "regridded_forcings1_elem": null, @@ -558,8 +565,8 @@ "rstFlag": 0, "skip": false, "swBiasCorrectOpt": 0, - "swDowscaleOpt": 0, - "t2dBiasCorrectOpt": 0, + "swDownscaleOpt": 0, + "t2BiasCorrectOpt": 0, "t2dDownscaleOpt": 0, "t2dTmp": null, "t2dTmp_elem": null, @@ -568,12 +575,9 @@ "1": "nearest_neighbor", "2": "weighted_average" }, - "timeInterpOpt": 0, "tmpFile": null, "tmpFileHeight": null, - "userCycleOffset": 0, - "userFcstHorizon": 4260, - "windBiasCorrectOpt": 0, + "windBiasCorrect": 0, "x_lower_bound": 0, "x_lower_bound_corner": null, "x_upper_bound": 14, diff --git a/tests/test_data/expected_results/test_expected_input_forcing_finalize_n1_rank0_.json b/tests/test_data/expected_results/test_expected_input_forcing_finalize_n1_rank0_.json index 67a6c576..576ad206 100644 --- a/tests/test_data/expected_results/test_expected_input_forcing_finalize_n1_rank0_.json +++ b/tests/test_data/expected_results/test_expected_input_forcing_finalize_n1_rank0_.json @@ -1,9 +1,9 @@ { - "border": 0, "coarse_input_forcings1": null, "coarse_input_forcings2": null, + "custom_count": 0, "cycle_freq": -9999, - "enforce": 0, + "dScaleParamDirs": "/ngen-app/data", "esmf_field_in": { "_data": null, "_finalized": false, @@ -278,10 +278,11 @@ "fcst_date2": null, "fcst_hour1": null, "fcst_hour2": null, + "fcst_input_horizons": 4260, + "fcst_input_offsets": 0, "file_ext": ".grib2", "file_in1": "s3://null/AORC-OWP_2013070103z.grib2", "file_in2": "s3://null/AORC-OWP_2013070103z.grib2", - "file_type": "GRIB2", "final_forcings": [ [ 1.0, @@ -393,6 +394,8 @@ "8": "find_hourly_wrf_arw_neighbors", "9": "find_gfs_neighbors" }, + "forceTemoralInterp": 0, + "force_count": 9, "forecast_horizons": null, "globalPcpRate1": null, "globalPcpRate1_elem": null, @@ -420,7 +423,12 @@ NaN ], "height_elem": null, - "inDir": "s3://null", + "idx": 0, + "ignored_border_widths": 0, + "input_force_dirs": "s3://null", + "input_force_mandatory": 0, + "input_force_types": "GRIB2", + "input_forcings": 12, "input_map_output": [ 4, 5, @@ -454,7 +462,6 @@ "ny_local": 28, "ny_local_corner": null, "outFreq": null, - "paramDir": "/ngen-app/data", "precipBiasCorrectOpt": 0, "precipDownscaleOpt": 0, "product_name": "AORC", @@ -462,11 +469,10 @@ "psfcDownscaleOpt": 0, "psfcTmp": null, "psfcTmp_elem": null, - "q2dBiasCorrectOpt": 0, + "q2BiasCorrectOpt": 0, "q2dDownscaleOpt": 0, "regridComplete": false, "regridObj_elem": null, - "regridOpt": 1, "regrid_map": { "1": "regrid_conus_rap", "10": "regrid_custom_hourly_netcdf", @@ -494,6 +500,7 @@ "8": "regrid_hourly_wrf_arw", "9": "regrid_gfs" }, + "regrid_opt": 1, "regridded_forcings1": [ [ 1.100000023841858, @@ -690,8 +697,8 @@ "rstFlag": 0, "skip": false, "swBiasCorrectOpt": 0, - "swDowscaleOpt": 0, - "t2dBiasCorrectOpt": 0, + "swDownscaleOpt": 0, + "t2BiasCorrectOpt": 0, "t2dDownscaleOpt": 0, "t2dTmp": null, "t2dTmp_elem": null, @@ -700,12 +707,9 @@ "1": "nearest_neighbor", "2": "weighted_average" }, - "timeInterpOpt": 0, "tmpFile": null, "tmpFileHeight": null, - "userCycleOffset": 0, - "userFcstHorizon": 4260, - "windBiasCorrectOpt": 0, + "windBiasCorrect": 0, "x_lower_bound": 0, "x_lower_bound_corner": null, "x_upper_bound": 14, diff --git a/tests/test_data/expected_results/test_expected_input_forcing_finalize_n2_rank0_.json b/tests/test_data/expected_results/test_expected_input_forcing_finalize_n2_rank0_.json index 9970fd8b..0b68a282 100644 --- a/tests/test_data/expected_results/test_expected_input_forcing_finalize_n2_rank0_.json +++ b/tests/test_data/expected_results/test_expected_input_forcing_finalize_n2_rank0_.json @@ -1,9 +1,9 @@ { - "border": 0, "coarse_input_forcings1": null, "coarse_input_forcings2": null, + "custom_count": 0, "cycle_freq": -9999, - "enforce": 0, + "dScaleParamDirs": "/ngen-app/data", "esmf_field_in": { "_data": null, "_finalized": false, @@ -111,7 +111,7 @@ "esmf_field_in_elem": null, "esmf_field_out": { "_data": [ - 99363.83797955123, + 99363.83797955124, 99970.04062791045, 100085.72479451672, 100059.85331996171 @@ -269,10 +269,11 @@ "fcst_date2": null, "fcst_hour1": null, "fcst_hour2": null, + "fcst_input_horizons": 4260, + "fcst_input_offsets": 0, "file_ext": ".grib2", "file_in1": "s3://null/AORC-OWP_2013070103z.grib2", "file_in2": "s3://null/AORC-OWP_2013070103z.grib2", - "file_type": "GRIB2", "final_forcings": [ [ 1.0, @@ -357,6 +358,8 @@ "8": "find_hourly_wrf_arw_neighbors", "9": "find_gfs_neighbors" }, + "forceTemoralInterp": 0, + "force_count": 9, "forecast_horizons": null, "globalPcpRate1": null, "globalPcpRate1_elem": null, @@ -381,7 +384,12 @@ NaN ], "height_elem": null, - "inDir": "s3://null", + "idx": 0, + "ignored_border_widths": 0, + "input_force_dirs": "s3://null", + "input_force_mandatory": 0, + "input_force_types": "GRIB2", + "input_forcings": 12, "input_map_output": [ 4, 5, @@ -415,7 +423,6 @@ "ny_local": 14, "ny_local_corner": null, "outFreq": null, - "paramDir": "/ngen-app/data", "precipBiasCorrectOpt": 0, "precipDownscaleOpt": 0, "product_name": "AORC", @@ -423,11 +430,10 @@ "psfcDownscaleOpt": 0, "psfcTmp": null, "psfcTmp_elem": null, - "q2dBiasCorrectOpt": 0, + "q2BiasCorrectOpt": 0, "q2dDownscaleOpt": 0, "regridComplete": false, "regridObj_elem": null, - "regridOpt": 1, "regrid_map": { "1": "regrid_conus_rap", "10": "regrid_custom_hourly_netcdf", @@ -455,6 +461,7 @@ "8": "regrid_hourly_wrf_arw", "9": "regrid_gfs" }, + "regrid_opt": 1, "regridded_forcings1": [ [ 1.100000023841858, @@ -591,8 +598,8 @@ "rstFlag": 0, "skip": false, "swBiasCorrectOpt": 0, - "swDowscaleOpt": 0, - "t2dBiasCorrectOpt": 0, + "swDownscaleOpt": 0, + "t2BiasCorrectOpt": 0, "t2dDownscaleOpt": 0, "t2dTmp": null, "t2dTmp_elem": null, @@ -601,12 +608,9 @@ "1": "nearest_neighbor", "2": "weighted_average" }, - "timeInterpOpt": 0, "tmpFile": null, "tmpFileHeight": null, - "userCycleOffset": 0, - "userFcstHorizon": 4260, - "windBiasCorrectOpt": 0, + "windBiasCorrect": 0, "x_lower_bound": 0, "x_lower_bound_corner": null, "x_upper_bound": 14, diff --git a/tests/test_data/expected_results/test_expected_input_forcing_finalize_n2_rank1_.json b/tests/test_data/expected_results/test_expected_input_forcing_finalize_n2_rank1_.json index 094eaadb..d82d176a 100644 --- a/tests/test_data/expected_results/test_expected_input_forcing_finalize_n2_rank1_.json +++ b/tests/test_data/expected_results/test_expected_input_forcing_finalize_n2_rank1_.json @@ -1,9 +1,9 @@ { - "border": 0, "coarse_input_forcings1": null, "coarse_input_forcings2": null, + "custom_count": 0, "cycle_freq": -9999, - "enforce": 0, + "dScaleParamDirs": "/ngen-app/data", "esmf_field_in": { "_data": null, "_finalized": false, @@ -266,10 +266,11 @@ "fcst_date2": null, "fcst_hour1": null, "fcst_hour2": null, + "fcst_input_horizons": 4260, + "fcst_input_offsets": 0, "file_ext": ".grib2", "file_in1": "s3://null/AORC-OWP_2013070103z.grib2", "file_in2": "s3://null/AORC-OWP_2013070103z.grib2", - "file_type": "GRIB2", "final_forcings": [ [ 0.6000000238418579, @@ -345,6 +346,8 @@ "8": "find_hourly_wrf_arw_neighbors", "9": "find_gfs_neighbors" }, + "forceTemoralInterp": 0, + "force_count": 9, "forecast_horizons": null, "globalPcpRate1": null, "globalPcpRate1_elem": null, @@ -368,7 +371,12 @@ NaN ], "height_elem": null, - "inDir": "s3://null", + "idx": 0, + "ignored_border_widths": 0, + "input_force_dirs": "s3://null", + "input_force_mandatory": 0, + "input_force_types": "GRIB2", + "input_forcings": 12, "input_map_output": [ 4, 5, @@ -402,7 +410,6 @@ "ny_local": 14, "ny_local_corner": null, "outFreq": null, - "paramDir": "/ngen-app/data", "precipBiasCorrectOpt": 0, "precipDownscaleOpt": 0, "product_name": "AORC", @@ -410,11 +417,10 @@ "psfcDownscaleOpt": 0, "psfcTmp": null, "psfcTmp_elem": null, - "q2dBiasCorrectOpt": 0, + "q2BiasCorrectOpt": 0, "q2dDownscaleOpt": 0, "regridComplete": false, "regridObj_elem": null, - "regridOpt": 1, "regrid_map": { "1": "regrid_conus_rap", "10": "regrid_custom_hourly_netcdf", @@ -442,6 +448,7 @@ "8": "regrid_hourly_wrf_arw", "9": "regrid_gfs" }, + "regrid_opt": 1, "regridded_forcings1": [ [ 0.800000011920929, @@ -484,9 +491,9 @@ 0.0 ], [ - 2.5638655642978847e-09, - 0.0, - 0.0 + NaN, + NaN, + NaN ] ], "regridded_forcings1_elem": null, @@ -558,8 +565,8 @@ "rstFlag": 0, "skip": false, "swBiasCorrectOpt": 0, - "swDowscaleOpt": 0, - "t2dBiasCorrectOpt": 0, + "swDownscaleOpt": 0, + "t2BiasCorrectOpt": 0, "t2dDownscaleOpt": 0, "t2dTmp": null, "t2dTmp_elem": null, @@ -568,12 +575,9 @@ "1": "nearest_neighbor", "2": "weighted_average" }, - "timeInterpOpt": 0, "tmpFile": null, "tmpFileHeight": null, - "userCycleOffset": 0, - "userFcstHorizon": 4260, - "windBiasCorrectOpt": 0, + "windBiasCorrect": 0, "x_lower_bound": 0, "x_lower_bound_corner": null, "x_upper_bound": 14, diff --git a/tests/test_data/expected_results/test_expected_input_forcing_init_n1_rank0_.json b/tests/test_data/expected_results/test_expected_input_forcing_init_n1_rank0_.json index 238cfa4c..4cb92980 100644 --- a/tests/test_data/expected_results/test_expected_input_forcing_init_n1_rank0_.json +++ b/tests/test_data/expected_results/test_expected_input_forcing_init_n1_rank0_.json @@ -1,9 +1,9 @@ { - "border": 0, "coarse_input_forcings1": null, "coarse_input_forcings2": null, + "custom_count": 0, "cycle_freq": -9999, - "enforce": 0, + "dScaleParamDirs": "/ngen-app/data", "esmf_field_in": null, "esmf_field_in_elem": null, "esmf_field_out": null, @@ -16,10 +16,11 @@ "fcst_date2": null, "fcst_hour1": null, "fcst_hour2": null, + "fcst_input_horizons": 4260, + "fcst_input_offsets": 0, "file_ext": ".grib2", "file_in1": null, "file_in2": null, - "file_type": "GRIB2", "final_forcings": [ [ NaN, @@ -131,6 +132,8 @@ "8": "find_hourly_wrf_arw_neighbors", "9": "find_gfs_neighbors" }, + "forceTemoralInterp": 0, + "force_count": 9, "forecast_horizons": null, "globalPcpRate1": null, "globalPcpRate1_elem": null, @@ -158,7 +161,12 @@ NaN ], "height_elem": null, - "inDir": "s3://null", + "idx": 0, + "ignored_border_widths": 0, + "input_force_dirs": "s3://null", + "input_force_mandatory": 0, + "input_force_types": "GRIB2", + "input_forcings": 12, "input_map_output": [ 4, 5, @@ -192,7 +200,6 @@ "ny_local": null, "ny_local_corner": null, "outFreq": null, - "paramDir": "/ngen-app/data", "precipBiasCorrectOpt": 0, "precipDownscaleOpt": 0, "product_name": "AORC", @@ -200,12 +207,11 @@ "psfcDownscaleOpt": 0, "psfcTmp": null, "psfcTmp_elem": null, - "q2dBiasCorrectOpt": 0, + "q2BiasCorrectOpt": 0, "q2dDownscaleOpt": 0, "regridComplete": false, "regridObj": null, "regridObj_elem": null, - "regridOpt": 1, "regrid_map": { "1": "regrid_conus_rap", "10": "regrid_custom_hourly_netcdf", @@ -233,6 +239,7 @@ "8": "regrid_hourly_wrf_arw", "9": "regrid_gfs" }, + "regrid_opt": 1, "regridded_forcings1": null, "regridded_forcings1_elem": null, "regridded_forcings2": null, @@ -265,8 +272,8 @@ "rstFlag": 0, "skip": false, "swBiasCorrectOpt": 0, - "swDowscaleOpt": 0, - "t2dBiasCorrectOpt": 0, + "swDownscaleOpt": 0, + "t2BiasCorrectOpt": 0, "t2dDownscaleOpt": 0, "t2dTmp": null, "t2dTmp_elem": null, @@ -275,12 +282,9 @@ "1": "nearest_neighbor", "2": "weighted_average" }, - "timeInterpOpt": 0, "tmpFile": null, "tmpFileHeight": null, - "userCycleOffset": 0, - "userFcstHorizon": 4260, - "windBiasCorrectOpt": 0, + "windBiasCorrect": 0, "x_lower_bound": null, "x_lower_bound_corner": null, "x_upper_bound": null, diff --git a/tests/test_data/expected_results/test_expected_input_forcing_init_n2_rank0_.json b/tests/test_data/expected_results/test_expected_input_forcing_init_n2_rank0_.json index 302e1df0..1cbbe391 100644 --- a/tests/test_data/expected_results/test_expected_input_forcing_init_n2_rank0_.json +++ b/tests/test_data/expected_results/test_expected_input_forcing_init_n2_rank0_.json @@ -1,9 +1,9 @@ { - "border": 0, "coarse_input_forcings1": null, "coarse_input_forcings2": null, + "custom_count": 0, "cycle_freq": -9999, - "enforce": 0, + "dScaleParamDirs": "/ngen-app/data", "esmf_field_in": null, "esmf_field_in_elem": null, "esmf_field_out": null, @@ -16,10 +16,11 @@ "fcst_date2": null, "fcst_hour1": null, "fcst_hour2": null, + "fcst_input_horizons": 4260, + "fcst_input_offsets": 0, "file_ext": ".grib2", "file_in1": null, "file_in2": null, - "file_type": "GRIB2", "final_forcings": [ [ NaN, @@ -104,6 +105,8 @@ "8": "find_hourly_wrf_arw_neighbors", "9": "find_gfs_neighbors" }, + "forceTemoralInterp": 0, + "force_count": 9, "forecast_horizons": null, "globalPcpRate1": null, "globalPcpRate1_elem": null, @@ -128,7 +131,12 @@ NaN ], "height_elem": null, - "inDir": "s3://null", + "idx": 0, + "ignored_border_widths": 0, + "input_force_dirs": "s3://null", + "input_force_mandatory": 0, + "input_force_types": "GRIB2", + "input_forcings": 12, "input_map_output": [ 4, 5, @@ -162,7 +170,6 @@ "ny_local": null, "ny_local_corner": null, "outFreq": null, - "paramDir": "/ngen-app/data", "precipBiasCorrectOpt": 0, "precipDownscaleOpt": 0, "product_name": "AORC", @@ -170,12 +177,11 @@ "psfcDownscaleOpt": 0, "psfcTmp": null, "psfcTmp_elem": null, - "q2dBiasCorrectOpt": 0, + "q2BiasCorrectOpt": 0, "q2dDownscaleOpt": 0, "regridComplete": false, "regridObj": null, "regridObj_elem": null, - "regridOpt": 1, "regrid_map": { "1": "regrid_conus_rap", "10": "regrid_custom_hourly_netcdf", @@ -203,6 +209,7 @@ "8": "regrid_hourly_wrf_arw", "9": "regrid_gfs" }, + "regrid_opt": 1, "regridded_forcings1": null, "regridded_forcings1_elem": null, "regridded_forcings2": null, @@ -229,8 +236,8 @@ "rstFlag": 0, "skip": false, "swBiasCorrectOpt": 0, - "swDowscaleOpt": 0, - "t2dBiasCorrectOpt": 0, + "swDownscaleOpt": 0, + "t2BiasCorrectOpt": 0, "t2dDownscaleOpt": 0, "t2dTmp": null, "t2dTmp_elem": null, @@ -239,12 +246,9 @@ "1": "nearest_neighbor", "2": "weighted_average" }, - "timeInterpOpt": 0, "tmpFile": null, "tmpFileHeight": null, - "userCycleOffset": 0, - "userFcstHorizon": 4260, - "windBiasCorrectOpt": 0, + "windBiasCorrect": 0, "x_lower_bound": null, "x_lower_bound_corner": null, "x_upper_bound": null, diff --git a/tests/test_data/expected_results/test_expected_input_forcing_init_n2_rank1_.json b/tests/test_data/expected_results/test_expected_input_forcing_init_n2_rank1_.json index db9a46a1..de6ce9a6 100644 --- a/tests/test_data/expected_results/test_expected_input_forcing_init_n2_rank1_.json +++ b/tests/test_data/expected_results/test_expected_input_forcing_init_n2_rank1_.json @@ -1,9 +1,9 @@ { - "border": 0, "coarse_input_forcings1": null, "coarse_input_forcings2": null, + "custom_count": 0, "cycle_freq": -9999, - "enforce": 0, + "dScaleParamDirs": "/ngen-app/data", "esmf_field_in": null, "esmf_field_in_elem": null, "esmf_field_out": null, @@ -16,10 +16,11 @@ "fcst_date2": null, "fcst_hour1": null, "fcst_hour2": null, + "fcst_input_horizons": 4260, + "fcst_input_offsets": 0, "file_ext": ".grib2", "file_in1": null, "file_in2": null, - "file_type": "GRIB2", "final_forcings": [ [ NaN, @@ -95,6 +96,8 @@ "8": "find_hourly_wrf_arw_neighbors", "9": "find_gfs_neighbors" }, + "forceTemoralInterp": 0, + "force_count": 9, "forecast_horizons": null, "globalPcpRate1": null, "globalPcpRate1_elem": null, @@ -118,7 +121,12 @@ NaN ], "height_elem": null, - "inDir": "s3://null", + "idx": 0, + "ignored_border_widths": 0, + "input_force_dirs": "s3://null", + "input_force_mandatory": 0, + "input_force_types": "GRIB2", + "input_forcings": 12, "input_map_output": [ 4, 5, @@ -152,7 +160,6 @@ "ny_local": null, "ny_local_corner": null, "outFreq": null, - "paramDir": "/ngen-app/data", "precipBiasCorrectOpt": 0, "precipDownscaleOpt": 0, "product_name": "AORC", @@ -160,12 +167,11 @@ "psfcDownscaleOpt": 0, "psfcTmp": null, "psfcTmp_elem": null, - "q2dBiasCorrectOpt": 0, + "q2BiasCorrectOpt": 0, "q2dDownscaleOpt": 0, "regridComplete": false, "regridObj": null, "regridObj_elem": null, - "regridOpt": 1, "regrid_map": { "1": "regrid_conus_rap", "10": "regrid_custom_hourly_netcdf", @@ -193,6 +199,7 @@ "8": "regrid_hourly_wrf_arw", "9": "regrid_gfs" }, + "regrid_opt": 1, "regridded_forcings1": null, "regridded_forcings1_elem": null, "regridded_forcings2": null, @@ -217,8 +224,8 @@ "rstFlag": 0, "skip": false, "swBiasCorrectOpt": 0, - "swDowscaleOpt": 0, - "t2dBiasCorrectOpt": 0, + "swDownscaleOpt": 0, + "t2BiasCorrectOpt": 0, "t2dDownscaleOpt": 0, "t2dTmp": null, "t2dTmp_elem": null, @@ -227,12 +234,9 @@ "1": "nearest_neighbor", "2": "weighted_average" }, - "timeInterpOpt": 0, "tmpFile": null, "tmpFileHeight": null, - "userCycleOffset": 0, - "userFcstHorizon": 4260, - "windBiasCorrectOpt": 0, + "windBiasCorrect": 0, "x_lower_bound": null, "x_lower_bound_corner": null, "x_upper_bound": null, diff --git a/tests/test_data/expected_results/test_expected_supp_precip_after_update_n1_rank0__step_1.json b/tests/test_data/expected_results/test_expected_supp_precip_after_update_n1_rank0__step_1.json new file mode 100644 index 00000000..d63276f2 --- /dev/null +++ b/tests/test_data/expected_results/test_expected_supp_precip_after_update_n1_rank0__step_1.json @@ -0,0 +1,397 @@ +{ + "enforce": 1, + "esmf_field_in": { + "_data": null, + "_finalized": false, + "_grid": { + "_area": [ + null, + null, + null, + null + ], + "_areatype": 6, + "_coord_sys": 1, + "_coords": [ + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ] + ], + "_decount": 1, + "_finalized": false, + "_has_corners": false, + "_lower_bounds": [ + [ + 0, + 0 + ], + null, + null, + null + ], + "_mask": [ + null, + null, + null, + null + ], + "_max_index": [ + 225, + 339 + ], + "_meta": {}, + "_ndims": 2, + "_num_peri_dims": 0, + "_ocgis": {}, + "_periodic_dim": null, + "_pole_dim": null, + "_pole_kind": null, + "_rank": 2, + "_size": [ + [ + 225, + 339 + ], + null, + null, + null + ], + "_staggerloc": [ + true, + false, + false, + false + ], + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + [ + 225, + 339 + ], + null, + null, + null + ] + }, + "_lower_bounds": [ + 0, + 0 + ], + "_meta": {}, + "_name": "NBM_CORE_PR_APCP_NATIVE", + "_ndbounds": null, + "_rank": 2, + "_staggerloc": 0, + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + 225, + 339 + ], + "_xd": 0 + }, + "esmf_field_out": { + "_data": [ + 0.014528336122961009, + 0.12875606365276365, + 0.5080000162124634, + 0.2705844906322781, + 0.0, + 0.0, + 0.0, + 0.08568306245137822, + 0.06162601396190727 + ], + "_finalized": false, + "_grid": { + "_area": [ + null, + null + ], + "_coord_sys": null, + "_coords": [ + [ + "hash_5956666910370932842", + "hash_398372956991710115" + ], + [ + [ + -66.60592401826192, + -66.56229876343377, + -66.58445759390953, + -66.59020754572474, + -66.58040387800175, + -66.61924544175804, + -66.61432182496434, + -66.54970733920212, + -66.54733995904326 + ], + [ + 18.28181486086812, + 18.270309542806565, + 18.3195853360751, + 18.300628771128547, + 18.271599906172842, + 18.27608475709033, + 18.257676718849797, + 18.292360723661034, + 18.24764748674116 + ] + ] + ], + "_finalized": false, + "_mask": [ + null, + null + ], + "_meta": {}, + "_parametric_dim": 2, + "_rank": 1, + "_size": [ + 3079, + 9 + ], + "_size_owned": [ + 3079, + 9 + ], + "_spatial_dim": null, + "_struct": {} + }, + "_lower_bounds": [ + 0 + ], + "_meta": {}, + "_name": "NBM_CORE_PR_APCPSUPP_PCP_REGRIDDED", + "_ndbounds": null, + "_rank": 1, + "_staggerloc": 1, + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + 9 + ], + "_xd": 0 + }, + "esmf_field_out_elem": null, + "esmf_field_out_poly": null, + "esmf_grid_in": { + "_area": [ + null, + null, + null, + null + ], + "_areatype": 6, + "_coord_sys": 1, + "_coords": [ + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ] + ], + "_decount": 1, + "_finalized": false, + "_has_corners": false, + "_lower_bounds": [ + [ + 0, + 0 + ], + null, + null, + null + ], + "_mask": [ + null, + null, + null, + null + ], + "_max_index": [ + 225, + 339 + ], + "_meta": {}, + "_ndims": 2, + "_num_peri_dims": 0, + "_ocgis": {}, + "_periodic_dim": null, + "_pole_dim": null, + "_pole_kind": null, + "_rank": 2, + "_size": [ + [ + 225, + 339 + ], + null, + null, + null + ], + "_staggerloc": [ + true, + false, + false, + false + ], + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + [ + 225, + 339 + ], + null, + null, + null + ] + }, + "esmf_lats": null, + "esmf_lons": null, + "fcst_date1": "2025-07-10T00:00:00", + "fcst_date2": "2025-07-10T01:00:00", + "fcst_hour1": 0, + "fcst_hour2": 1, + "file_ext": ".grib2", + "file_in1": "/ngen-app/data/raw_input/NBM_PR/blend.20250710/00/core/blend.t00z.core.f001.pr.grib2", + "file_in2": "/ngen-app/data/raw_input/NBM_PR/blend.20250710/00/core/blend.t00z.core.f001.pr.grib2", + "file_type": "GRIB2", + "final_supp_precip": [ + 4.035648998979013e-06, + 3.576557355700061e-05, + 0.0001411111152265221, + 7.516235928051174e-05, + 0.0, + 0.0, + 0.0, + 2.3800850613042712e-05, + 1.711833647277672e-05 + ], + "final_supp_precip_elem": null, + "global_x_lower": null, + "global_x_upper": null, + "global_y_lower": null, + "global_y_upper": null, + "grib_levels": [ + "BLAH" + ], + "grib_vars": null, + "has_cache": false, + "inDir": "/ngen-app/data/raw_input/NBM_PR", + "input_frequency": 60.0, + "keyValue": 15, + "netcdf_var_names": [ + "APCP_surface" + ], + "nx_global": 339, + "nx_local": 339, + "ny_global": 225, + "ny_local": 225, + "output_var_idx": 3, + "pcp_date1": null, + "pcp_date2": null, + "pcp_hour1": null, + "pcp_hour2": null, + "product_name": "NBM_CORE_PR_APCP", + "regridComplete": false, + "regridOpt": 1, + "regridded_mask": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "regridded_mask_elem": null, + "regridded_precip1": [ + 4.035648998979013e-06, + 3.576557355700061e-05, + 0.0001411111152265221, + 7.516235928051174e-05, + 0.0, + 0.0, + 0.0, + 2.3800850613042712e-05, + 1.711833647277672e-05 + ], + "regridded_precip1_elem": null, + "regridded_precip2": [ + 4.035648998979013e-06, + 3.576557355700061e-05, + 0.0001411111152265221, + 7.516235928051174e-05, + 0.0, + 0.0, + 0.0, + 2.3800850613042712e-05, + 1.711833647277672e-05 + ], + "regridded_precip2_elem": null, + "regridded_rqi1": [ + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0 + ], + "regridded_rqi1_elem": null, + "regridded_rqi2": [ + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0 + ], + "regridded_rqi2_elem": null, + "rqiMethod": 0, + "rqiThresh": 1.0, + "rqi_file_in1": null, + "rqi_file_in2": null, + "rqi_netcdf_var_names": null, + "timeInterpOpt": 0, + "tmpFile": null, + "userCycleOffset": 0, + "x_lower_bound": 0, + "x_upper_bound": 339, + "y_lower_bound": 0, + "y_upper_bound": 225 +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_supp_precip_after_update_n1_rank0__step_2.json b/tests/test_data/expected_results/test_expected_supp_precip_after_update_n1_rank0__step_2.json new file mode 100644 index 00000000..5a2b11f5 --- /dev/null +++ b/tests/test_data/expected_results/test_expected_supp_precip_after_update_n1_rank0__step_2.json @@ -0,0 +1,397 @@ +{ + "enforce": 1, + "esmf_field_in": { + "_data": null, + "_finalized": false, + "_grid": { + "_area": [ + null, + null, + null, + null + ], + "_areatype": 6, + "_coord_sys": 1, + "_coords": [ + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ] + ], + "_decount": 1, + "_finalized": false, + "_has_corners": false, + "_lower_bounds": [ + [ + 0, + 0 + ], + null, + null, + null + ], + "_mask": [ + null, + null, + null, + null + ], + "_max_index": [ + 225, + 339 + ], + "_meta": {}, + "_ndims": 2, + "_num_peri_dims": 0, + "_ocgis": {}, + "_periodic_dim": null, + "_pole_dim": null, + "_pole_kind": null, + "_rank": 2, + "_size": [ + [ + 225, + 339 + ], + null, + null, + null + ], + "_staggerloc": [ + true, + false, + false, + false + ], + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + [ + 225, + 339 + ], + null, + null, + null + ] + }, + "_lower_bounds": [ + 0, + 0 + ], + "_meta": {}, + "_name": "NBM_CORE_PR_APCP_NATIVE", + "_ndbounds": null, + "_rank": 2, + "_staggerloc": 0, + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + 225, + 339 + ], + "_xd": 0 + }, + "esmf_field_out": { + "_data": [ + 0.16467297020824123, + 0.0, + 0.0, + 0.0, + 0.1254085057251157, + 0.2540000081062317, + 0.2540000081062317, + 0.0, + 0.2540000081062317 + ], + "_finalized": false, + "_grid": { + "_area": [ + null, + null + ], + "_coord_sys": null, + "_coords": [ + [ + "hash_5956666910370932842", + "hash_398372956991710115" + ], + [ + [ + -66.60592401826192, + -66.56229876343377, + -66.58445759390953, + -66.59020754572474, + -66.58040387800175, + -66.61924544175804, + -66.61432182496434, + -66.54970733920212, + -66.54733995904326 + ], + [ + 18.28181486086812, + 18.270309542806565, + 18.3195853360751, + 18.300628771128547, + 18.271599906172842, + 18.27608475709033, + 18.257676718849797, + 18.292360723661034, + 18.24764748674116 + ] + ] + ], + "_finalized": false, + "_mask": [ + null, + null + ], + "_meta": {}, + "_parametric_dim": 2, + "_rank": 1, + "_size": [ + 3079, + 9 + ], + "_size_owned": [ + 3079, + 9 + ], + "_spatial_dim": null, + "_struct": {} + }, + "_lower_bounds": [ + 0 + ], + "_meta": {}, + "_name": "NBM_CORE_PR_APCPSUPP_PCP_REGRIDDED", + "_ndbounds": null, + "_rank": 1, + "_staggerloc": 1, + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + 9 + ], + "_xd": 0 + }, + "esmf_field_out_elem": null, + "esmf_field_out_poly": null, + "esmf_grid_in": { + "_area": [ + null, + null, + null, + null + ], + "_areatype": 6, + "_coord_sys": 1, + "_coords": [ + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ] + ], + "_decount": 1, + "_finalized": false, + "_has_corners": false, + "_lower_bounds": [ + [ + 0, + 0 + ], + null, + null, + null + ], + "_mask": [ + null, + null, + null, + null + ], + "_max_index": [ + 225, + 339 + ], + "_meta": {}, + "_ndims": 2, + "_num_peri_dims": 0, + "_ocgis": {}, + "_periodic_dim": null, + "_pole_dim": null, + "_pole_kind": null, + "_rank": 2, + "_size": [ + [ + 225, + 339 + ], + null, + null, + null + ], + "_staggerloc": [ + true, + false, + false, + false + ], + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + [ + 225, + 339 + ], + null, + null, + null + ] + }, + "esmf_lats": null, + "esmf_lons": null, + "fcst_date1": "2025-07-10T01:00:00", + "fcst_date2": "2025-07-10T02:00:00", + "fcst_hour1": 1, + "fcst_hour2": 2, + "file_ext": ".grib2", + "file_in1": "/ngen-app/data/raw_input/NBM_PR/blend.20250710/00/core/blend.t00z.core.f002.pr.grib2", + "file_in2": "/ngen-app/data/raw_input/NBM_PR/blend.20250710/00/core/blend.t00z.core.f001.pr.grib2", + "file_type": "GRIB2", + "final_supp_precip": [ + 4.574249032884836e-05, + 0.0, + 0.0, + 0.0, + 3.4835695259971544e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 0.0, + 7.055555761326104e-05 + ], + "final_supp_precip_elem": null, + "global_x_lower": null, + "global_x_upper": null, + "global_y_lower": null, + "global_y_upper": null, + "grib_levels": [ + "BLAH" + ], + "grib_vars": null, + "has_cache": false, + "inDir": "/ngen-app/data/raw_input/NBM_PR", + "input_frequency": 60.0, + "keyValue": 15, + "netcdf_var_names": [ + "APCP_surface" + ], + "nx_global": 339, + "nx_local": 339, + "ny_global": 225, + "ny_local": 225, + "output_var_idx": 3, + "pcp_date1": null, + "pcp_date2": null, + "pcp_hour1": null, + "pcp_hour2": null, + "product_name": "NBM_CORE_PR_APCP", + "regridComplete": false, + "regridOpt": 1, + "regridded_mask": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "regridded_mask_elem": null, + "regridded_precip1": [ + 4.035648998979013e-06, + 3.576557355700061e-05, + 0.0001411111152265221, + 7.516235928051174e-05, + 0.0, + 0.0, + 0.0, + 2.3800850613042712e-05, + 1.711833647277672e-05 + ], + "regridded_precip1_elem": null, + "regridded_precip2": [ + 4.574249032884836e-05, + 0.0, + 0.0, + 0.0, + 3.4835695259971544e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 0.0, + 7.055555761326104e-05 + ], + "regridded_precip2_elem": null, + "regridded_rqi1": [ + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0 + ], + "regridded_rqi1_elem": null, + "regridded_rqi2": [ + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0 + ], + "regridded_rqi2_elem": null, + "rqiMethod": 0, + "rqiThresh": 1.0, + "rqi_file_in1": null, + "rqi_file_in2": null, + "rqi_netcdf_var_names": null, + "timeInterpOpt": 0, + "tmpFile": null, + "userCycleOffset": 0, + "x_lower_bound": 0, + "x_upper_bound": 339, + "y_lower_bound": 0, + "y_upper_bound": 225 +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_supp_precip_after_update_n1_rank0__step_3.json b/tests/test_data/expected_results/test_expected_supp_precip_after_update_n1_rank0__step_3.json new file mode 100644 index 00000000..381971c4 --- /dev/null +++ b/tests/test_data/expected_results/test_expected_supp_precip_after_update_n1_rank0__step_3.json @@ -0,0 +1,397 @@ +{ + "enforce": 1, + "esmf_field_in": { + "_data": null, + "_finalized": false, + "_grid": { + "_area": [ + null, + null, + null, + null + ], + "_areatype": 6, + "_coord_sys": 1, + "_coords": [ + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ] + ], + "_decount": 1, + "_finalized": false, + "_has_corners": false, + "_lower_bounds": [ + [ + 0, + 0 + ], + null, + null, + null + ], + "_mask": [ + null, + null, + null, + null + ], + "_max_index": [ + 225, + 339 + ], + "_meta": {}, + "_ndims": 2, + "_num_peri_dims": 0, + "_ocgis": {}, + "_periodic_dim": null, + "_pole_dim": null, + "_pole_kind": null, + "_rank": 2, + "_size": [ + [ + 225, + 339 + ], + null, + null, + null + ], + "_staggerloc": [ + true, + false, + false, + false + ], + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + [ + 225, + 339 + ], + null, + null, + null + ] + }, + "_lower_bounds": [ + 0, + 0 + ], + "_meta": {}, + "_name": "NBM_CORE_PR_APCP_NATIVE", + "_ndbounds": null, + "_rank": 2, + "_staggerloc": 0, + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + 225, + 339 + ], + "_xd": 0 + }, + "esmf_field_out": { + "_data": [ + 0.2540000081062317, + 0.2540000081062317, + 0.2540000081062317, + 0.2540000081062317, + 0.2540000081062317, + 0.18961624786774367, + 0.2540000081062317, + 0.2540000081062317, + 0.2540000081062317 + ], + "_finalized": false, + "_grid": { + "_area": [ + null, + null + ], + "_coord_sys": null, + "_coords": [ + [ + "hash_5956666910370932842", + "hash_398372956991710115" + ], + [ + [ + -66.60592401826192, + -66.56229876343377, + -66.58445759390953, + -66.59020754572474, + -66.58040387800175, + -66.61924544175804, + -66.61432182496434, + -66.54970733920212, + -66.54733995904326 + ], + [ + 18.28181486086812, + 18.270309542806565, + 18.3195853360751, + 18.300628771128547, + 18.271599906172842, + 18.27608475709033, + 18.257676718849797, + 18.292360723661034, + 18.24764748674116 + ] + ] + ], + "_finalized": false, + "_mask": [ + null, + null + ], + "_meta": {}, + "_parametric_dim": 2, + "_rank": 1, + "_size": [ + 3079, + 9 + ], + "_size_owned": [ + 3079, + 9 + ], + "_spatial_dim": null, + "_struct": {} + }, + "_lower_bounds": [ + 0 + ], + "_meta": {}, + "_name": "NBM_CORE_PR_APCPSUPP_PCP_REGRIDDED", + "_ndbounds": null, + "_rank": 1, + "_staggerloc": 1, + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + 9 + ], + "_xd": 0 + }, + "esmf_field_out_elem": null, + "esmf_field_out_poly": null, + "esmf_grid_in": { + "_area": [ + null, + null, + null, + null + ], + "_areatype": 6, + "_coord_sys": 1, + "_coords": [ + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ] + ], + "_decount": 1, + "_finalized": false, + "_has_corners": false, + "_lower_bounds": [ + [ + 0, + 0 + ], + null, + null, + null + ], + "_mask": [ + null, + null, + null, + null + ], + "_max_index": [ + 225, + 339 + ], + "_meta": {}, + "_ndims": 2, + "_num_peri_dims": 0, + "_ocgis": {}, + "_periodic_dim": null, + "_pole_dim": null, + "_pole_kind": null, + "_rank": 2, + "_size": [ + [ + 225, + 339 + ], + null, + null, + null + ], + "_staggerloc": [ + true, + false, + false, + false + ], + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + [ + 225, + 339 + ], + null, + null, + null + ] + }, + "esmf_lats": null, + "esmf_lons": null, + "fcst_date1": "2025-07-10T02:00:00", + "fcst_date2": "2025-07-10T03:00:00", + "fcst_hour1": 2, + "fcst_hour2": 3, + "file_ext": ".grib2", + "file_in1": "/ngen-app/data/raw_input/NBM_PR/blend.20250710/00/core/blend.t00z.core.f003.pr.grib2", + "file_in2": "/ngen-app/data/raw_input/NBM_PR/blend.20250710/00/core/blend.t00z.core.f002.pr.grib2", + "file_type": "GRIB2", + "final_supp_precip": [ + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 5.267118103802204e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05 + ], + "final_supp_precip_elem": null, + "global_x_lower": null, + "global_x_upper": null, + "global_y_lower": null, + "global_y_upper": null, + "grib_levels": [ + "BLAH" + ], + "grib_vars": null, + "has_cache": false, + "inDir": "/ngen-app/data/raw_input/NBM_PR", + "input_frequency": 60.0, + "keyValue": 15, + "netcdf_var_names": [ + "APCP_surface" + ], + "nx_global": 339, + "nx_local": 339, + "ny_global": 225, + "ny_local": 225, + "output_var_idx": 3, + "pcp_date1": null, + "pcp_date2": null, + "pcp_hour1": null, + "pcp_hour2": null, + "product_name": "NBM_CORE_PR_APCP", + "regridComplete": false, + "regridOpt": 1, + "regridded_mask": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "regridded_mask_elem": null, + "regridded_precip1": [ + 4.035648998979013e-06, + 3.576557355700061e-05, + 0.0001411111152265221, + 7.516235928051174e-05, + 0.0, + 0.0, + 0.0, + 2.3800850613042712e-05, + 1.711833647277672e-05 + ], + "regridded_precip1_elem": null, + "regridded_precip2": [ + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 5.267118103802204e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05 + ], + "regridded_precip2_elem": null, + "regridded_rqi1": [ + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0 + ], + "regridded_rqi1_elem": null, + "regridded_rqi2": [ + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0 + ], + "regridded_rqi2_elem": null, + "rqiMethod": 0, + "rqiThresh": 1.0, + "rqi_file_in1": null, + "rqi_file_in2": null, + "rqi_netcdf_var_names": null, + "timeInterpOpt": 0, + "tmpFile": null, + "userCycleOffset": 0, + "x_lower_bound": 0, + "x_upper_bound": 339, + "y_lower_bound": 0, + "y_upper_bound": 225 +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_supp_precip_after_update_n2_rank0__step_1.json b/tests/test_data/expected_results/test_expected_supp_precip_after_update_n2_rank0__step_1.json new file mode 100644 index 00000000..1a401f17 --- /dev/null +++ b/tests/test_data/expected_results/test_expected_supp_precip_after_update_n2_rank0__step_1.json @@ -0,0 +1,361 @@ +{ + "enforce": 1, + "esmf_field_in": { + "_data": null, + "_finalized": false, + "_grid": { + "_area": [ + null, + null, + null, + null + ], + "_areatype": 6, + "_coord_sys": 1, + "_coords": [ + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ] + ], + "_decount": 1, + "_finalized": false, + "_has_corners": false, + "_lower_bounds": [ + [ + 0, + 0 + ], + null, + null, + null + ], + "_mask": [ + null, + null, + null, + null + ], + "_max_index": [ + 225, + 339 + ], + "_meta": {}, + "_ndims": 2, + "_num_peri_dims": 0, + "_ocgis": {}, + "_periodic_dim": null, + "_pole_dim": null, + "_pole_kind": null, + "_rank": 2, + "_size": [ + [ + 113, + 339 + ], + null, + null, + null + ], + "_staggerloc": [ + true, + false, + false, + false + ], + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + [ + 113, + 339 + ], + null, + null, + null + ] + }, + "_lower_bounds": [ + 0, + 0 + ], + "_meta": {}, + "_name": "NBM_CORE_PR_APCP_NATIVE", + "_ndbounds": null, + "_rank": 2, + "_staggerloc": 0, + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + 113, + 339 + ], + "_xd": 0 + }, + "esmf_field_out": { + "_data": [ + 0.014528336122961009, + 0.12875606365276365, + 0.5080000162124634, + 0.2705844906322781, + 0.0 + ], + "_finalized": false, + "_grid": { + "_area": [ + null, + null + ], + "_coord_sys": null, + "_coords": [ + [ + "hash_-8764384264248681935", + "hash_-8047490021897303354" + ], + [ + [ + -66.60592401826192, + -66.56229876343377, + -66.58445759390953, + -66.59020754572474, + -66.58040387800175 + ], + [ + 18.28181486086812, + 18.270309542806565, + 18.3195853360751, + 18.300628771128547, + 18.271599906172842 + ] + ] + ], + "_finalized": false, + "_mask": [ + null, + null + ], + "_meta": {}, + "_parametric_dim": 2, + "_rank": 1, + "_size": [ + 2594, + 5 + ], + "_size_owned": [ + 2594, + 5 + ], + "_spatial_dim": null, + "_struct": {} + }, + "_lower_bounds": [ + 0 + ], + "_meta": {}, + "_name": "NBM_CORE_PR_APCPSUPP_PCP_REGRIDDED", + "_ndbounds": null, + "_rank": 1, + "_staggerloc": 1, + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + 5 + ], + "_xd": 0 + }, + "esmf_field_out_elem": null, + "esmf_field_out_poly": null, + "esmf_grid_in": { + "_area": [ + null, + null, + null, + null + ], + "_areatype": 6, + "_coord_sys": 1, + "_coords": [ + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ] + ], + "_decount": 1, + "_finalized": false, + "_has_corners": false, + "_lower_bounds": [ + [ + 0, + 0 + ], + null, + null, + null + ], + "_mask": [ + null, + null, + null, + null + ], + "_max_index": [ + 225, + 339 + ], + "_meta": {}, + "_ndims": 2, + "_num_peri_dims": 0, + "_ocgis": {}, + "_periodic_dim": null, + "_pole_dim": null, + "_pole_kind": null, + "_rank": 2, + "_size": [ + [ + 113, + 339 + ], + null, + null, + null + ], + "_staggerloc": [ + true, + false, + false, + false + ], + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + [ + 113, + 339 + ], + null, + null, + null + ] + }, + "esmf_lats": null, + "esmf_lons": null, + "fcst_date1": "2025-07-10T00:00:00", + "fcst_date2": "2025-07-10T01:00:00", + "fcst_hour1": 0, + "fcst_hour2": 1, + "file_ext": ".grib2", + "file_in1": "/ngen-app/data/raw_input/NBM_PR/blend.20250710/00/core/blend.t00z.core.f001.pr.grib2", + "file_in2": "/ngen-app/data/raw_input/NBM_PR/blend.20250710/00/core/blend.t00z.core.f001.pr.grib2", + "file_type": "GRIB2", + "final_supp_precip": [ + 4.035648998979013e-06, + 3.576557355700061e-05, + 0.0001411111152265221, + 7.516235928051174e-05, + 0.0 + ], + "final_supp_precip_elem": null, + "global_x_lower": null, + "global_x_upper": null, + "global_y_lower": null, + "global_y_upper": null, + "grib_levels": [ + "BLAH" + ], + "grib_vars": null, + "has_cache": false, + "inDir": "/ngen-app/data/raw_input/NBM_PR", + "input_frequency": 60.0, + "keyValue": 15, + "netcdf_var_names": [ + "APCP_surface" + ], + "nx_global": 339, + "nx_local": 339, + "ny_global": 225, + "ny_local": 113, + "output_var_idx": 3, + "pcp_date1": null, + "pcp_date2": null, + "pcp_hour1": null, + "pcp_hour2": null, + "product_name": "NBM_CORE_PR_APCP", + "regridComplete": false, + "regridOpt": 1, + "regridded_mask": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "regridded_mask_elem": null, + "regridded_precip1": [ + 4.035648998979013e-06, + 3.576557355700061e-05, + 0.0001411111152265221, + 7.516235928051174e-05, + 0.0 + ], + "regridded_precip1_elem": null, + "regridded_precip2": [ + 4.035648998979013e-06, + 3.576557355700061e-05, + 0.0001411111152265221, + 7.516235928051174e-05, + 0.0 + ], + "regridded_precip2_elem": null, + "regridded_rqi1": [ + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0 + ], + "regridded_rqi1_elem": null, + "regridded_rqi2": [ + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0 + ], + "regridded_rqi2_elem": null, + "rqiMethod": 0, + "rqiThresh": 1.0, + "rqi_file_in1": null, + "rqi_file_in2": null, + "rqi_netcdf_var_names": null, + "timeInterpOpt": 0, + "tmpFile": null, + "userCycleOffset": 0, + "x_lower_bound": 0, + "x_upper_bound": 339, + "y_lower_bound": 0, + "y_upper_bound": 113 +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_supp_precip_after_update_n2_rank0__step_2.json b/tests/test_data/expected_results/test_expected_supp_precip_after_update_n2_rank0__step_2.json new file mode 100644 index 00000000..c7ce1a8f --- /dev/null +++ b/tests/test_data/expected_results/test_expected_supp_precip_after_update_n2_rank0__step_2.json @@ -0,0 +1,361 @@ +{ + "enforce": 1, + "esmf_field_in": { + "_data": null, + "_finalized": false, + "_grid": { + "_area": [ + null, + null, + null, + null + ], + "_areatype": 6, + "_coord_sys": 1, + "_coords": [ + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ] + ], + "_decount": 1, + "_finalized": false, + "_has_corners": false, + "_lower_bounds": [ + [ + 0, + 0 + ], + null, + null, + null + ], + "_mask": [ + null, + null, + null, + null + ], + "_max_index": [ + 225, + 339 + ], + "_meta": {}, + "_ndims": 2, + "_num_peri_dims": 0, + "_ocgis": {}, + "_periodic_dim": null, + "_pole_dim": null, + "_pole_kind": null, + "_rank": 2, + "_size": [ + [ + 113, + 339 + ], + null, + null, + null + ], + "_staggerloc": [ + true, + false, + false, + false + ], + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + [ + 113, + 339 + ], + null, + null, + null + ] + }, + "_lower_bounds": [ + 0, + 0 + ], + "_meta": {}, + "_name": "NBM_CORE_PR_APCP_NATIVE", + "_ndbounds": null, + "_rank": 2, + "_staggerloc": 0, + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + 113, + 339 + ], + "_xd": 0 + }, + "esmf_field_out": { + "_data": [ + 0.16467297020824123, + 0.0, + 0.0, + 0.0, + 0.1254085057251157 + ], + "_finalized": false, + "_grid": { + "_area": [ + null, + null + ], + "_coord_sys": null, + "_coords": [ + [ + "hash_-8764384264248681935", + "hash_-8047490021897303354" + ], + [ + [ + -66.60592401826192, + -66.56229876343377, + -66.58445759390953, + -66.59020754572474, + -66.58040387800175 + ], + [ + 18.28181486086812, + 18.270309542806565, + 18.3195853360751, + 18.300628771128547, + 18.271599906172842 + ] + ] + ], + "_finalized": false, + "_mask": [ + null, + null + ], + "_meta": {}, + "_parametric_dim": 2, + "_rank": 1, + "_size": [ + 2594, + 5 + ], + "_size_owned": [ + 2594, + 5 + ], + "_spatial_dim": null, + "_struct": {} + }, + "_lower_bounds": [ + 0 + ], + "_meta": {}, + "_name": "NBM_CORE_PR_APCPSUPP_PCP_REGRIDDED", + "_ndbounds": null, + "_rank": 1, + "_staggerloc": 1, + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + 5 + ], + "_xd": 0 + }, + "esmf_field_out_elem": null, + "esmf_field_out_poly": null, + "esmf_grid_in": { + "_area": [ + null, + null, + null, + null + ], + "_areatype": 6, + "_coord_sys": 1, + "_coords": [ + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ] + ], + "_decount": 1, + "_finalized": false, + "_has_corners": false, + "_lower_bounds": [ + [ + 0, + 0 + ], + null, + null, + null + ], + "_mask": [ + null, + null, + null, + null + ], + "_max_index": [ + 225, + 339 + ], + "_meta": {}, + "_ndims": 2, + "_num_peri_dims": 0, + "_ocgis": {}, + "_periodic_dim": null, + "_pole_dim": null, + "_pole_kind": null, + "_rank": 2, + "_size": [ + [ + 113, + 339 + ], + null, + null, + null + ], + "_staggerloc": [ + true, + false, + false, + false + ], + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + [ + 113, + 339 + ], + null, + null, + null + ] + }, + "esmf_lats": null, + "esmf_lons": null, + "fcst_date1": "2025-07-10T01:00:00", + "fcst_date2": "2025-07-10T02:00:00", + "fcst_hour1": 1, + "fcst_hour2": 2, + "file_ext": ".grib2", + "file_in1": "/ngen-app/data/raw_input/NBM_PR/blend.20250710/00/core/blend.t00z.core.f002.pr.grib2", + "file_in2": "/ngen-app/data/raw_input/NBM_PR/blend.20250710/00/core/blend.t00z.core.f001.pr.grib2", + "file_type": "GRIB2", + "final_supp_precip": [ + 4.574249032884836e-05, + 0.0, + 0.0, + 0.0, + 3.4835695259971544e-05 + ], + "final_supp_precip_elem": null, + "global_x_lower": null, + "global_x_upper": null, + "global_y_lower": null, + "global_y_upper": null, + "grib_levels": [ + "BLAH" + ], + "grib_vars": null, + "has_cache": false, + "inDir": "/ngen-app/data/raw_input/NBM_PR", + "input_frequency": 60.0, + "keyValue": 15, + "netcdf_var_names": [ + "APCP_surface" + ], + "nx_global": 339, + "nx_local": 339, + "ny_global": 225, + "ny_local": 113, + "output_var_idx": 3, + "pcp_date1": null, + "pcp_date2": null, + "pcp_hour1": null, + "pcp_hour2": null, + "product_name": "NBM_CORE_PR_APCP", + "regridComplete": false, + "regridOpt": 1, + "regridded_mask": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "regridded_mask_elem": null, + "regridded_precip1": [ + 4.035648998979013e-06, + 3.576557355700061e-05, + 0.0001411111152265221, + 7.516235928051174e-05, + 0.0 + ], + "regridded_precip1_elem": null, + "regridded_precip2": [ + 4.574249032884836e-05, + 0.0, + 0.0, + 0.0, + 3.4835695259971544e-05 + ], + "regridded_precip2_elem": null, + "regridded_rqi1": [ + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0 + ], + "regridded_rqi1_elem": null, + "regridded_rqi2": [ + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0 + ], + "regridded_rqi2_elem": null, + "rqiMethod": 0, + "rqiThresh": 1.0, + "rqi_file_in1": null, + "rqi_file_in2": null, + "rqi_netcdf_var_names": null, + "timeInterpOpt": 0, + "tmpFile": null, + "userCycleOffset": 0, + "x_lower_bound": 0, + "x_upper_bound": 339, + "y_lower_bound": 0, + "y_upper_bound": 113 +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_supp_precip_after_update_n2_rank0__step_3.json b/tests/test_data/expected_results/test_expected_supp_precip_after_update_n2_rank0__step_3.json new file mode 100644 index 00000000..a4e699c8 --- /dev/null +++ b/tests/test_data/expected_results/test_expected_supp_precip_after_update_n2_rank0__step_3.json @@ -0,0 +1,361 @@ +{ + "enforce": 1, + "esmf_field_in": { + "_data": null, + "_finalized": false, + "_grid": { + "_area": [ + null, + null, + null, + null + ], + "_areatype": 6, + "_coord_sys": 1, + "_coords": [ + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ] + ], + "_decount": 1, + "_finalized": false, + "_has_corners": false, + "_lower_bounds": [ + [ + 0, + 0 + ], + null, + null, + null + ], + "_mask": [ + null, + null, + null, + null + ], + "_max_index": [ + 225, + 339 + ], + "_meta": {}, + "_ndims": 2, + "_num_peri_dims": 0, + "_ocgis": {}, + "_periodic_dim": null, + "_pole_dim": null, + "_pole_kind": null, + "_rank": 2, + "_size": [ + [ + 113, + 339 + ], + null, + null, + null + ], + "_staggerloc": [ + true, + false, + false, + false + ], + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + [ + 113, + 339 + ], + null, + null, + null + ] + }, + "_lower_bounds": [ + 0, + 0 + ], + "_meta": {}, + "_name": "NBM_CORE_PR_APCP_NATIVE", + "_ndbounds": null, + "_rank": 2, + "_staggerloc": 0, + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + 113, + 339 + ], + "_xd": 0 + }, + "esmf_field_out": { + "_data": [ + 0.2540000081062317, + 0.2540000081062317, + 0.2540000081062317, + 0.2540000081062317, + 0.2540000081062317 + ], + "_finalized": false, + "_grid": { + "_area": [ + null, + null + ], + "_coord_sys": null, + "_coords": [ + [ + "hash_-8764384264248681935", + "hash_-8047490021897303354" + ], + [ + [ + -66.60592401826192, + -66.56229876343377, + -66.58445759390953, + -66.59020754572474, + -66.58040387800175 + ], + [ + 18.28181486086812, + 18.270309542806565, + 18.3195853360751, + 18.300628771128547, + 18.271599906172842 + ] + ] + ], + "_finalized": false, + "_mask": [ + null, + null + ], + "_meta": {}, + "_parametric_dim": 2, + "_rank": 1, + "_size": [ + 2594, + 5 + ], + "_size_owned": [ + 2594, + 5 + ], + "_spatial_dim": null, + "_struct": {} + }, + "_lower_bounds": [ + 0 + ], + "_meta": {}, + "_name": "NBM_CORE_PR_APCPSUPP_PCP_REGRIDDED", + "_ndbounds": null, + "_rank": 1, + "_staggerloc": 1, + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + 5 + ], + "_xd": 0 + }, + "esmf_field_out_elem": null, + "esmf_field_out_poly": null, + "esmf_grid_in": { + "_area": [ + null, + null, + null, + null + ], + "_areatype": 6, + "_coord_sys": 1, + "_coords": [ + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ] + ], + "_decount": 1, + "_finalized": false, + "_has_corners": false, + "_lower_bounds": [ + [ + 0, + 0 + ], + null, + null, + null + ], + "_mask": [ + null, + null, + null, + null + ], + "_max_index": [ + 225, + 339 + ], + "_meta": {}, + "_ndims": 2, + "_num_peri_dims": 0, + "_ocgis": {}, + "_periodic_dim": null, + "_pole_dim": null, + "_pole_kind": null, + "_rank": 2, + "_size": [ + [ + 113, + 339 + ], + null, + null, + null + ], + "_staggerloc": [ + true, + false, + false, + false + ], + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + [ + 113, + 339 + ], + null, + null, + null + ] + }, + "esmf_lats": null, + "esmf_lons": null, + "fcst_date1": "2025-07-10T02:00:00", + "fcst_date2": "2025-07-10T03:00:00", + "fcst_hour1": 2, + "fcst_hour2": 3, + "file_ext": ".grib2", + "file_in1": "/ngen-app/data/raw_input/NBM_PR/blend.20250710/00/core/blend.t00z.core.f003.pr.grib2", + "file_in2": "/ngen-app/data/raw_input/NBM_PR/blend.20250710/00/core/blend.t00z.core.f002.pr.grib2", + "file_type": "GRIB2", + "final_supp_precip": [ + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05 + ], + "final_supp_precip_elem": null, + "global_x_lower": null, + "global_x_upper": null, + "global_y_lower": null, + "global_y_upper": null, + "grib_levels": [ + "BLAH" + ], + "grib_vars": null, + "has_cache": false, + "inDir": "/ngen-app/data/raw_input/NBM_PR", + "input_frequency": 60.0, + "keyValue": 15, + "netcdf_var_names": [ + "APCP_surface" + ], + "nx_global": 339, + "nx_local": 339, + "ny_global": 225, + "ny_local": 113, + "output_var_idx": 3, + "pcp_date1": null, + "pcp_date2": null, + "pcp_hour1": null, + "pcp_hour2": null, + "product_name": "NBM_CORE_PR_APCP", + "regridComplete": false, + "regridOpt": 1, + "regridded_mask": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "regridded_mask_elem": null, + "regridded_precip1": [ + 4.035648998979013e-06, + 3.576557355700061e-05, + 0.0001411111152265221, + 7.516235928051174e-05, + 0.0 + ], + "regridded_precip1_elem": null, + "regridded_precip2": [ + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05 + ], + "regridded_precip2_elem": null, + "regridded_rqi1": [ + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0 + ], + "regridded_rqi1_elem": null, + "regridded_rqi2": [ + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0 + ], + "regridded_rqi2_elem": null, + "rqiMethod": 0, + "rqiThresh": 1.0, + "rqi_file_in1": null, + "rqi_file_in2": null, + "rqi_netcdf_var_names": null, + "timeInterpOpt": 0, + "tmpFile": null, + "userCycleOffset": 0, + "x_lower_bound": 0, + "x_upper_bound": 339, + "y_lower_bound": 0, + "y_upper_bound": 113 +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_supp_precip_after_update_n2_rank1__step_1.json b/tests/test_data/expected_results/test_expected_supp_precip_after_update_n2_rank1__step_1.json new file mode 100644 index 00000000..ef5684aa --- /dev/null +++ b/tests/test_data/expected_results/test_expected_supp_precip_after_update_n2_rank1__step_1.json @@ -0,0 +1,352 @@ +{ + "enforce": 1, + "esmf_field_in": { + "_data": null, + "_finalized": false, + "_grid": { + "_area": [ + null, + null, + null, + null + ], + "_areatype": 6, + "_coord_sys": 1, + "_coords": [ + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ] + ], + "_decount": 1, + "_finalized": false, + "_has_corners": false, + "_lower_bounds": [ + [ + 113, + 0 + ], + null, + null, + null + ], + "_mask": [ + null, + null, + null, + null + ], + "_max_index": [ + 225, + 339 + ], + "_meta": {}, + "_ndims": 2, + "_num_peri_dims": 0, + "_ocgis": {}, + "_periodic_dim": null, + "_pole_dim": null, + "_pole_kind": null, + "_rank": 2, + "_size": [ + [ + 112, + 339 + ], + null, + null, + null + ], + "_staggerloc": [ + true, + false, + false, + false + ], + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + [ + 225, + 339 + ], + null, + null, + null + ] + }, + "_lower_bounds": [ + 113, + 0 + ], + "_meta": {}, + "_name": "NBM_CORE_PR_APCP_NATIVE", + "_ndbounds": null, + "_rank": 2, + "_staggerloc": 0, + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + 225, + 339 + ], + "_xd": 0 + }, + "esmf_field_out": { + "_data": [ + 0.0, + 0.0, + 0.08568306245137822, + 0.06162601396190727 + ], + "_finalized": false, + "_grid": { + "_area": [ + null, + null + ], + "_coord_sys": null, + "_coords": [ + [ + "hash_-3785066934698869327", + "hash_44388240431464778" + ], + [ + [ + -66.61924544175804, + -66.61432182496434, + -66.54970733920212, + -66.54733995904326 + ], + [ + 18.27608475709033, + 18.257676718849797, + 18.292360723661034, + 18.24764748674116 + ] + ] + ], + "_finalized": false, + "_mask": [ + null, + null + ], + "_meta": {}, + "_parametric_dim": 2, + "_rank": 1, + "_size": [ + 1000, + 4 + ], + "_size_owned": [ + 485, + 4 + ], + "_spatial_dim": null, + "_struct": {} + }, + "_lower_bounds": [ + 0 + ], + "_meta": {}, + "_name": "NBM_CORE_PR_APCPSUPP_PCP_REGRIDDED", + "_ndbounds": null, + "_rank": 1, + "_staggerloc": 1, + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + 4 + ], + "_xd": 0 + }, + "esmf_field_out_elem": null, + "esmf_field_out_poly": null, + "esmf_grid_in": { + "_area": [ + null, + null, + null, + null + ], + "_areatype": 6, + "_coord_sys": 1, + "_coords": [ + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ] + ], + "_decount": 1, + "_finalized": false, + "_has_corners": false, + "_lower_bounds": [ + [ + 113, + 0 + ], + null, + null, + null + ], + "_mask": [ + null, + null, + null, + null + ], + "_max_index": [ + 225, + 339 + ], + "_meta": {}, + "_ndims": 2, + "_num_peri_dims": 0, + "_ocgis": {}, + "_periodic_dim": null, + "_pole_dim": null, + "_pole_kind": null, + "_rank": 2, + "_size": [ + [ + 112, + 339 + ], + null, + null, + null + ], + "_staggerloc": [ + true, + false, + false, + false + ], + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + [ + 225, + 339 + ], + null, + null, + null + ] + }, + "esmf_lats": null, + "esmf_lons": null, + "fcst_date1": "2025-07-10T00:00:00", + "fcst_date2": "2025-07-10T01:00:00", + "fcst_hour1": 0, + "fcst_hour2": 1, + "file_ext": ".grib2", + "file_in1": "/ngen-app/data/raw_input/NBM_PR/blend.20250710/00/core/blend.t00z.core.f001.pr.grib2", + "file_in2": "/ngen-app/data/raw_input/NBM_PR/blend.20250710/00/core/blend.t00z.core.f001.pr.grib2", + "file_type": "GRIB2", + "final_supp_precip": [ + 0.0, + 0.0, + 2.3800850613042712e-05, + 1.711833647277672e-05 + ], + "final_supp_precip_elem": null, + "global_x_lower": null, + "global_x_upper": null, + "global_y_lower": null, + "global_y_upper": null, + "grib_levels": [ + "BLAH" + ], + "grib_vars": null, + "has_cache": false, + "inDir": "/ngen-app/data/raw_input/NBM_PR", + "input_frequency": 60.0, + "keyValue": 15, + "netcdf_var_names": [ + "APCP_surface" + ], + "nx_global": 339, + "nx_local": 339, + "ny_global": 225, + "ny_local": 112, + "output_var_idx": 3, + "pcp_date1": null, + "pcp_date2": null, + "pcp_hour1": null, + "pcp_hour2": null, + "product_name": "NBM_CORE_PR_APCP", + "regridComplete": false, + "regridOpt": 1, + "regridded_mask": [ + 1.0, + 1.0, + 1.0, + 1.0 + ], + "regridded_mask_elem": null, + "regridded_precip1": [ + 0.0, + 0.0, + 2.3800850613042712e-05, + 1.711833647277672e-05 + ], + "regridded_precip1_elem": null, + "regridded_precip2": [ + 0.0, + 0.0, + 2.3800850613042712e-05, + 1.711833647277672e-05 + ], + "regridded_precip2_elem": null, + "regridded_rqi1": [ + -9999.0, + -9999.0, + -9999.0, + -9999.0 + ], + "regridded_rqi1_elem": null, + "regridded_rqi2": [ + -9999.0, + -9999.0, + -9999.0, + -9999.0 + ], + "regridded_rqi2_elem": null, + "rqiMethod": 0, + "rqiThresh": 1.0, + "rqi_file_in1": null, + "rqi_file_in2": null, + "rqi_netcdf_var_names": null, + "timeInterpOpt": 0, + "tmpFile": null, + "userCycleOffset": 0, + "x_lower_bound": 0, + "x_upper_bound": 339, + "y_lower_bound": 113, + "y_upper_bound": 225 +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_supp_precip_after_update_n2_rank1__step_2.json b/tests/test_data/expected_results/test_expected_supp_precip_after_update_n2_rank1__step_2.json new file mode 100644 index 00000000..53c6a5e8 --- /dev/null +++ b/tests/test_data/expected_results/test_expected_supp_precip_after_update_n2_rank1__step_2.json @@ -0,0 +1,352 @@ +{ + "enforce": 1, + "esmf_field_in": { + "_data": null, + "_finalized": false, + "_grid": { + "_area": [ + null, + null, + null, + null + ], + "_areatype": 6, + "_coord_sys": 1, + "_coords": [ + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ] + ], + "_decount": 1, + "_finalized": false, + "_has_corners": false, + "_lower_bounds": [ + [ + 113, + 0 + ], + null, + null, + null + ], + "_mask": [ + null, + null, + null, + null + ], + "_max_index": [ + 225, + 339 + ], + "_meta": {}, + "_ndims": 2, + "_num_peri_dims": 0, + "_ocgis": {}, + "_periodic_dim": null, + "_pole_dim": null, + "_pole_kind": null, + "_rank": 2, + "_size": [ + [ + 112, + 339 + ], + null, + null, + null + ], + "_staggerloc": [ + true, + false, + false, + false + ], + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + [ + 225, + 339 + ], + null, + null, + null + ] + }, + "_lower_bounds": [ + 113, + 0 + ], + "_meta": {}, + "_name": "NBM_CORE_PR_APCP_NATIVE", + "_ndbounds": null, + "_rank": 2, + "_staggerloc": 0, + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + 225, + 339 + ], + "_xd": 0 + }, + "esmf_field_out": { + "_data": [ + 0.2540000081062317, + 0.2540000081062317, + 0.0, + 0.2540000081062317 + ], + "_finalized": false, + "_grid": { + "_area": [ + null, + null + ], + "_coord_sys": null, + "_coords": [ + [ + "hash_-3785066934698869327", + "hash_44388240431464778" + ], + [ + [ + -66.61924544175804, + -66.61432182496434, + -66.54970733920212, + -66.54733995904326 + ], + [ + 18.27608475709033, + 18.257676718849797, + 18.292360723661034, + 18.24764748674116 + ] + ] + ], + "_finalized": false, + "_mask": [ + null, + null + ], + "_meta": {}, + "_parametric_dim": 2, + "_rank": 1, + "_size": [ + 1000, + 4 + ], + "_size_owned": [ + 485, + 4 + ], + "_spatial_dim": null, + "_struct": {} + }, + "_lower_bounds": [ + 0 + ], + "_meta": {}, + "_name": "NBM_CORE_PR_APCPSUPP_PCP_REGRIDDED", + "_ndbounds": null, + "_rank": 1, + "_staggerloc": 1, + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + 4 + ], + "_xd": 0 + }, + "esmf_field_out_elem": null, + "esmf_field_out_poly": null, + "esmf_grid_in": { + "_area": [ + null, + null, + null, + null + ], + "_areatype": 6, + "_coord_sys": 1, + "_coords": [ + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ] + ], + "_decount": 1, + "_finalized": false, + "_has_corners": false, + "_lower_bounds": [ + [ + 113, + 0 + ], + null, + null, + null + ], + "_mask": [ + null, + null, + null, + null + ], + "_max_index": [ + 225, + 339 + ], + "_meta": {}, + "_ndims": 2, + "_num_peri_dims": 0, + "_ocgis": {}, + "_periodic_dim": null, + "_pole_dim": null, + "_pole_kind": null, + "_rank": 2, + "_size": [ + [ + 112, + 339 + ], + null, + null, + null + ], + "_staggerloc": [ + true, + false, + false, + false + ], + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + [ + 225, + 339 + ], + null, + null, + null + ] + }, + "esmf_lats": null, + "esmf_lons": null, + "fcst_date1": "2025-07-10T01:00:00", + "fcst_date2": "2025-07-10T02:00:00", + "fcst_hour1": 1, + "fcst_hour2": 2, + "file_ext": ".grib2", + "file_in1": "/ngen-app/data/raw_input/NBM_PR/blend.20250710/00/core/blend.t00z.core.f002.pr.grib2", + "file_in2": "/ngen-app/data/raw_input/NBM_PR/blend.20250710/00/core/blend.t00z.core.f001.pr.grib2", + "file_type": "GRIB2", + "final_supp_precip": [ + 7.055555761326104e-05, + 7.055555761326104e-05, + 0.0, + 7.055555761326104e-05 + ], + "final_supp_precip_elem": null, + "global_x_lower": null, + "global_x_upper": null, + "global_y_lower": null, + "global_y_upper": null, + "grib_levels": [ + "BLAH" + ], + "grib_vars": null, + "has_cache": false, + "inDir": "/ngen-app/data/raw_input/NBM_PR", + "input_frequency": 60.0, + "keyValue": 15, + "netcdf_var_names": [ + "APCP_surface" + ], + "nx_global": 339, + "nx_local": 339, + "ny_global": 225, + "ny_local": 112, + "output_var_idx": 3, + "pcp_date1": null, + "pcp_date2": null, + "pcp_hour1": null, + "pcp_hour2": null, + "product_name": "NBM_CORE_PR_APCP", + "regridComplete": false, + "regridOpt": 1, + "regridded_mask": [ + 1.0, + 1.0, + 1.0, + 1.0 + ], + "regridded_mask_elem": null, + "regridded_precip1": [ + 0.0, + 0.0, + 2.3800850613042712e-05, + 1.711833647277672e-05 + ], + "regridded_precip1_elem": null, + "regridded_precip2": [ + 7.055555761326104e-05, + 7.055555761326104e-05, + 0.0, + 7.055555761326104e-05 + ], + "regridded_precip2_elem": null, + "regridded_rqi1": [ + -9999.0, + -9999.0, + -9999.0, + -9999.0 + ], + "regridded_rqi1_elem": null, + "regridded_rqi2": [ + -9999.0, + -9999.0, + -9999.0, + -9999.0 + ], + "regridded_rqi2_elem": null, + "rqiMethod": 0, + "rqiThresh": 1.0, + "rqi_file_in1": null, + "rqi_file_in2": null, + "rqi_netcdf_var_names": null, + "timeInterpOpt": 0, + "tmpFile": null, + "userCycleOffset": 0, + "x_lower_bound": 0, + "x_upper_bound": 339, + "y_lower_bound": 113, + "y_upper_bound": 225 +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_supp_precip_after_update_n2_rank1__step_3.json b/tests/test_data/expected_results/test_expected_supp_precip_after_update_n2_rank1__step_3.json new file mode 100644 index 00000000..cb4dc5e8 --- /dev/null +++ b/tests/test_data/expected_results/test_expected_supp_precip_after_update_n2_rank1__step_3.json @@ -0,0 +1,352 @@ +{ + "enforce": 1, + "esmf_field_in": { + "_data": null, + "_finalized": false, + "_grid": { + "_area": [ + null, + null, + null, + null + ], + "_areatype": 6, + "_coord_sys": 1, + "_coords": [ + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ] + ], + "_decount": 1, + "_finalized": false, + "_has_corners": false, + "_lower_bounds": [ + [ + 113, + 0 + ], + null, + null, + null + ], + "_mask": [ + null, + null, + null, + null + ], + "_max_index": [ + 225, + 339 + ], + "_meta": {}, + "_ndims": 2, + "_num_peri_dims": 0, + "_ocgis": {}, + "_periodic_dim": null, + "_pole_dim": null, + "_pole_kind": null, + "_rank": 2, + "_size": [ + [ + 112, + 339 + ], + null, + null, + null + ], + "_staggerloc": [ + true, + false, + false, + false + ], + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + [ + 225, + 339 + ], + null, + null, + null + ] + }, + "_lower_bounds": [ + 113, + 0 + ], + "_meta": {}, + "_name": "NBM_CORE_PR_APCP_NATIVE", + "_ndbounds": null, + "_rank": 2, + "_staggerloc": 0, + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + 225, + 339 + ], + "_xd": 0 + }, + "esmf_field_out": { + "_data": [ + 0.18961624786774367, + 0.2540000081062317, + 0.2540000081062317, + 0.2540000081062317 + ], + "_finalized": false, + "_grid": { + "_area": [ + null, + null + ], + "_coord_sys": null, + "_coords": [ + [ + "hash_-3785066934698869327", + "hash_44388240431464778" + ], + [ + [ + -66.61924544175804, + -66.61432182496434, + -66.54970733920212, + -66.54733995904326 + ], + [ + 18.27608475709033, + 18.257676718849797, + 18.292360723661034, + 18.24764748674116 + ] + ] + ], + "_finalized": false, + "_mask": [ + null, + null + ], + "_meta": {}, + "_parametric_dim": 2, + "_rank": 1, + "_size": [ + 1000, + 4 + ], + "_size_owned": [ + 485, + 4 + ], + "_spatial_dim": null, + "_struct": {} + }, + "_lower_bounds": [ + 0 + ], + "_meta": {}, + "_name": "NBM_CORE_PR_APCPSUPP_PCP_REGRIDDED", + "_ndbounds": null, + "_rank": 1, + "_staggerloc": 1, + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + 4 + ], + "_xd": 0 + }, + "esmf_field_out_elem": null, + "esmf_field_out_poly": null, + "esmf_grid_in": { + "_area": [ + null, + null, + null, + null + ], + "_areatype": 6, + "_coord_sys": 1, + "_coords": [ + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ] + ], + "_decount": 1, + "_finalized": false, + "_has_corners": false, + "_lower_bounds": [ + [ + 113, + 0 + ], + null, + null, + null + ], + "_mask": [ + null, + null, + null, + null + ], + "_max_index": [ + 225, + 339 + ], + "_meta": {}, + "_ndims": 2, + "_num_peri_dims": 0, + "_ocgis": {}, + "_periodic_dim": null, + "_pole_dim": null, + "_pole_kind": null, + "_rank": 2, + "_size": [ + [ + 112, + 339 + ], + null, + null, + null + ], + "_staggerloc": [ + true, + false, + false, + false + ], + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + [ + 225, + 339 + ], + null, + null, + null + ] + }, + "esmf_lats": null, + "esmf_lons": null, + "fcst_date1": "2025-07-10T02:00:00", + "fcst_date2": "2025-07-10T03:00:00", + "fcst_hour1": 2, + "fcst_hour2": 3, + "file_ext": ".grib2", + "file_in1": "/ngen-app/data/raw_input/NBM_PR/blend.20250710/00/core/blend.t00z.core.f003.pr.grib2", + "file_in2": "/ngen-app/data/raw_input/NBM_PR/blend.20250710/00/core/blend.t00z.core.f002.pr.grib2", + "file_type": "GRIB2", + "final_supp_precip": [ + 5.267118103802204e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05 + ], + "final_supp_precip_elem": null, + "global_x_lower": null, + "global_x_upper": null, + "global_y_lower": null, + "global_y_upper": null, + "grib_levels": [ + "BLAH" + ], + "grib_vars": null, + "has_cache": false, + "inDir": "/ngen-app/data/raw_input/NBM_PR", + "input_frequency": 60.0, + "keyValue": 15, + "netcdf_var_names": [ + "APCP_surface" + ], + "nx_global": 339, + "nx_local": 339, + "ny_global": 225, + "ny_local": 112, + "output_var_idx": 3, + "pcp_date1": null, + "pcp_date2": null, + "pcp_hour1": null, + "pcp_hour2": null, + "product_name": "NBM_CORE_PR_APCP", + "regridComplete": false, + "regridOpt": 1, + "regridded_mask": [ + 1.0, + 1.0, + 1.0, + 1.0 + ], + "regridded_mask_elem": null, + "regridded_precip1": [ + 0.0, + 0.0, + 2.3800850613042712e-05, + 1.711833647277672e-05 + ], + "regridded_precip1_elem": null, + "regridded_precip2": [ + 5.267118103802204e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05 + ], + "regridded_precip2_elem": null, + "regridded_rqi1": [ + -9999.0, + -9999.0, + -9999.0, + -9999.0 + ], + "regridded_rqi1_elem": null, + "regridded_rqi2": [ + -9999.0, + -9999.0, + -9999.0, + -9999.0 + ], + "regridded_rqi2_elem": null, + "rqiMethod": 0, + "rqiThresh": 1.0, + "rqi_file_in1": null, + "rqi_file_in2": null, + "rqi_netcdf_var_names": null, + "timeInterpOpt": 0, + "tmpFile": null, + "userCycleOffset": 0, + "x_lower_bound": 0, + "x_upper_bound": 339, + "y_lower_bound": 113, + "y_upper_bound": 225 +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_supp_precip_finalize_n1_rank0_.json b/tests/test_data/expected_results/test_expected_supp_precip_finalize_n1_rank0_.json new file mode 100644 index 00000000..381971c4 --- /dev/null +++ b/tests/test_data/expected_results/test_expected_supp_precip_finalize_n1_rank0_.json @@ -0,0 +1,397 @@ +{ + "enforce": 1, + "esmf_field_in": { + "_data": null, + "_finalized": false, + "_grid": { + "_area": [ + null, + null, + null, + null + ], + "_areatype": 6, + "_coord_sys": 1, + "_coords": [ + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ] + ], + "_decount": 1, + "_finalized": false, + "_has_corners": false, + "_lower_bounds": [ + [ + 0, + 0 + ], + null, + null, + null + ], + "_mask": [ + null, + null, + null, + null + ], + "_max_index": [ + 225, + 339 + ], + "_meta": {}, + "_ndims": 2, + "_num_peri_dims": 0, + "_ocgis": {}, + "_periodic_dim": null, + "_pole_dim": null, + "_pole_kind": null, + "_rank": 2, + "_size": [ + [ + 225, + 339 + ], + null, + null, + null + ], + "_staggerloc": [ + true, + false, + false, + false + ], + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + [ + 225, + 339 + ], + null, + null, + null + ] + }, + "_lower_bounds": [ + 0, + 0 + ], + "_meta": {}, + "_name": "NBM_CORE_PR_APCP_NATIVE", + "_ndbounds": null, + "_rank": 2, + "_staggerloc": 0, + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + 225, + 339 + ], + "_xd": 0 + }, + "esmf_field_out": { + "_data": [ + 0.2540000081062317, + 0.2540000081062317, + 0.2540000081062317, + 0.2540000081062317, + 0.2540000081062317, + 0.18961624786774367, + 0.2540000081062317, + 0.2540000081062317, + 0.2540000081062317 + ], + "_finalized": false, + "_grid": { + "_area": [ + null, + null + ], + "_coord_sys": null, + "_coords": [ + [ + "hash_5956666910370932842", + "hash_398372956991710115" + ], + [ + [ + -66.60592401826192, + -66.56229876343377, + -66.58445759390953, + -66.59020754572474, + -66.58040387800175, + -66.61924544175804, + -66.61432182496434, + -66.54970733920212, + -66.54733995904326 + ], + [ + 18.28181486086812, + 18.270309542806565, + 18.3195853360751, + 18.300628771128547, + 18.271599906172842, + 18.27608475709033, + 18.257676718849797, + 18.292360723661034, + 18.24764748674116 + ] + ] + ], + "_finalized": false, + "_mask": [ + null, + null + ], + "_meta": {}, + "_parametric_dim": 2, + "_rank": 1, + "_size": [ + 3079, + 9 + ], + "_size_owned": [ + 3079, + 9 + ], + "_spatial_dim": null, + "_struct": {} + }, + "_lower_bounds": [ + 0 + ], + "_meta": {}, + "_name": "NBM_CORE_PR_APCPSUPP_PCP_REGRIDDED", + "_ndbounds": null, + "_rank": 1, + "_staggerloc": 1, + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + 9 + ], + "_xd": 0 + }, + "esmf_field_out_elem": null, + "esmf_field_out_poly": null, + "esmf_grid_in": { + "_area": [ + null, + null, + null, + null + ], + "_areatype": 6, + "_coord_sys": 1, + "_coords": [ + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ] + ], + "_decount": 1, + "_finalized": false, + "_has_corners": false, + "_lower_bounds": [ + [ + 0, + 0 + ], + null, + null, + null + ], + "_mask": [ + null, + null, + null, + null + ], + "_max_index": [ + 225, + 339 + ], + "_meta": {}, + "_ndims": 2, + "_num_peri_dims": 0, + "_ocgis": {}, + "_periodic_dim": null, + "_pole_dim": null, + "_pole_kind": null, + "_rank": 2, + "_size": [ + [ + 225, + 339 + ], + null, + null, + null + ], + "_staggerloc": [ + true, + false, + false, + false + ], + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + [ + 225, + 339 + ], + null, + null, + null + ] + }, + "esmf_lats": null, + "esmf_lons": null, + "fcst_date1": "2025-07-10T02:00:00", + "fcst_date2": "2025-07-10T03:00:00", + "fcst_hour1": 2, + "fcst_hour2": 3, + "file_ext": ".grib2", + "file_in1": "/ngen-app/data/raw_input/NBM_PR/blend.20250710/00/core/blend.t00z.core.f003.pr.grib2", + "file_in2": "/ngen-app/data/raw_input/NBM_PR/blend.20250710/00/core/blend.t00z.core.f002.pr.grib2", + "file_type": "GRIB2", + "final_supp_precip": [ + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 5.267118103802204e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05 + ], + "final_supp_precip_elem": null, + "global_x_lower": null, + "global_x_upper": null, + "global_y_lower": null, + "global_y_upper": null, + "grib_levels": [ + "BLAH" + ], + "grib_vars": null, + "has_cache": false, + "inDir": "/ngen-app/data/raw_input/NBM_PR", + "input_frequency": 60.0, + "keyValue": 15, + "netcdf_var_names": [ + "APCP_surface" + ], + "nx_global": 339, + "nx_local": 339, + "ny_global": 225, + "ny_local": 225, + "output_var_idx": 3, + "pcp_date1": null, + "pcp_date2": null, + "pcp_hour1": null, + "pcp_hour2": null, + "product_name": "NBM_CORE_PR_APCP", + "regridComplete": false, + "regridOpt": 1, + "regridded_mask": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "regridded_mask_elem": null, + "regridded_precip1": [ + 4.035648998979013e-06, + 3.576557355700061e-05, + 0.0001411111152265221, + 7.516235928051174e-05, + 0.0, + 0.0, + 0.0, + 2.3800850613042712e-05, + 1.711833647277672e-05 + ], + "regridded_precip1_elem": null, + "regridded_precip2": [ + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 5.267118103802204e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05 + ], + "regridded_precip2_elem": null, + "regridded_rqi1": [ + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0 + ], + "regridded_rqi1_elem": null, + "regridded_rqi2": [ + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0 + ], + "regridded_rqi2_elem": null, + "rqiMethod": 0, + "rqiThresh": 1.0, + "rqi_file_in1": null, + "rqi_file_in2": null, + "rqi_netcdf_var_names": null, + "timeInterpOpt": 0, + "tmpFile": null, + "userCycleOffset": 0, + "x_lower_bound": 0, + "x_upper_bound": 339, + "y_lower_bound": 0, + "y_upper_bound": 225 +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_supp_precip_finalize_n2_rank0_.json b/tests/test_data/expected_results/test_expected_supp_precip_finalize_n2_rank0_.json new file mode 100644 index 00000000..a4e699c8 --- /dev/null +++ b/tests/test_data/expected_results/test_expected_supp_precip_finalize_n2_rank0_.json @@ -0,0 +1,361 @@ +{ + "enforce": 1, + "esmf_field_in": { + "_data": null, + "_finalized": false, + "_grid": { + "_area": [ + null, + null, + null, + null + ], + "_areatype": 6, + "_coord_sys": 1, + "_coords": [ + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ] + ], + "_decount": 1, + "_finalized": false, + "_has_corners": false, + "_lower_bounds": [ + [ + 0, + 0 + ], + null, + null, + null + ], + "_mask": [ + null, + null, + null, + null + ], + "_max_index": [ + 225, + 339 + ], + "_meta": {}, + "_ndims": 2, + "_num_peri_dims": 0, + "_ocgis": {}, + "_periodic_dim": null, + "_pole_dim": null, + "_pole_kind": null, + "_rank": 2, + "_size": [ + [ + 113, + 339 + ], + null, + null, + null + ], + "_staggerloc": [ + true, + false, + false, + false + ], + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + [ + 113, + 339 + ], + null, + null, + null + ] + }, + "_lower_bounds": [ + 0, + 0 + ], + "_meta": {}, + "_name": "NBM_CORE_PR_APCP_NATIVE", + "_ndbounds": null, + "_rank": 2, + "_staggerloc": 0, + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + 113, + 339 + ], + "_xd": 0 + }, + "esmf_field_out": { + "_data": [ + 0.2540000081062317, + 0.2540000081062317, + 0.2540000081062317, + 0.2540000081062317, + 0.2540000081062317 + ], + "_finalized": false, + "_grid": { + "_area": [ + null, + null + ], + "_coord_sys": null, + "_coords": [ + [ + "hash_-8764384264248681935", + "hash_-8047490021897303354" + ], + [ + [ + -66.60592401826192, + -66.56229876343377, + -66.58445759390953, + -66.59020754572474, + -66.58040387800175 + ], + [ + 18.28181486086812, + 18.270309542806565, + 18.3195853360751, + 18.300628771128547, + 18.271599906172842 + ] + ] + ], + "_finalized": false, + "_mask": [ + null, + null + ], + "_meta": {}, + "_parametric_dim": 2, + "_rank": 1, + "_size": [ + 2594, + 5 + ], + "_size_owned": [ + 2594, + 5 + ], + "_spatial_dim": null, + "_struct": {} + }, + "_lower_bounds": [ + 0 + ], + "_meta": {}, + "_name": "NBM_CORE_PR_APCPSUPP_PCP_REGRIDDED", + "_ndbounds": null, + "_rank": 1, + "_staggerloc": 1, + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + 5 + ], + "_xd": 0 + }, + "esmf_field_out_elem": null, + "esmf_field_out_poly": null, + "esmf_grid_in": { + "_area": [ + null, + null, + null, + null + ], + "_areatype": 6, + "_coord_sys": 1, + "_coords": [ + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ] + ], + "_decount": 1, + "_finalized": false, + "_has_corners": false, + "_lower_bounds": [ + [ + 0, + 0 + ], + null, + null, + null + ], + "_mask": [ + null, + null, + null, + null + ], + "_max_index": [ + 225, + 339 + ], + "_meta": {}, + "_ndims": 2, + "_num_peri_dims": 0, + "_ocgis": {}, + "_periodic_dim": null, + "_pole_dim": null, + "_pole_kind": null, + "_rank": 2, + "_size": [ + [ + 113, + 339 + ], + null, + null, + null + ], + "_staggerloc": [ + true, + false, + false, + false + ], + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + [ + 113, + 339 + ], + null, + null, + null + ] + }, + "esmf_lats": null, + "esmf_lons": null, + "fcst_date1": "2025-07-10T02:00:00", + "fcst_date2": "2025-07-10T03:00:00", + "fcst_hour1": 2, + "fcst_hour2": 3, + "file_ext": ".grib2", + "file_in1": "/ngen-app/data/raw_input/NBM_PR/blend.20250710/00/core/blend.t00z.core.f003.pr.grib2", + "file_in2": "/ngen-app/data/raw_input/NBM_PR/blend.20250710/00/core/blend.t00z.core.f002.pr.grib2", + "file_type": "GRIB2", + "final_supp_precip": [ + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05 + ], + "final_supp_precip_elem": null, + "global_x_lower": null, + "global_x_upper": null, + "global_y_lower": null, + "global_y_upper": null, + "grib_levels": [ + "BLAH" + ], + "grib_vars": null, + "has_cache": false, + "inDir": "/ngen-app/data/raw_input/NBM_PR", + "input_frequency": 60.0, + "keyValue": 15, + "netcdf_var_names": [ + "APCP_surface" + ], + "nx_global": 339, + "nx_local": 339, + "ny_global": 225, + "ny_local": 113, + "output_var_idx": 3, + "pcp_date1": null, + "pcp_date2": null, + "pcp_hour1": null, + "pcp_hour2": null, + "product_name": "NBM_CORE_PR_APCP", + "regridComplete": false, + "regridOpt": 1, + "regridded_mask": [ + 1.0, + 1.0, + 1.0, + 1.0, + 1.0 + ], + "regridded_mask_elem": null, + "regridded_precip1": [ + 4.035648998979013e-06, + 3.576557355700061e-05, + 0.0001411111152265221, + 7.516235928051174e-05, + 0.0 + ], + "regridded_precip1_elem": null, + "regridded_precip2": [ + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05 + ], + "regridded_precip2_elem": null, + "regridded_rqi1": [ + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0 + ], + "regridded_rqi1_elem": null, + "regridded_rqi2": [ + -9999.0, + -9999.0, + -9999.0, + -9999.0, + -9999.0 + ], + "regridded_rqi2_elem": null, + "rqiMethod": 0, + "rqiThresh": 1.0, + "rqi_file_in1": null, + "rqi_file_in2": null, + "rqi_netcdf_var_names": null, + "timeInterpOpt": 0, + "tmpFile": null, + "userCycleOffset": 0, + "x_lower_bound": 0, + "x_upper_bound": 339, + "y_lower_bound": 0, + "y_upper_bound": 113 +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_supp_precip_finalize_n2_rank1_.json b/tests/test_data/expected_results/test_expected_supp_precip_finalize_n2_rank1_.json new file mode 100644 index 00000000..cb4dc5e8 --- /dev/null +++ b/tests/test_data/expected_results/test_expected_supp_precip_finalize_n2_rank1_.json @@ -0,0 +1,352 @@ +{ + "enforce": 1, + "esmf_field_in": { + "_data": null, + "_finalized": false, + "_grid": { + "_area": [ + null, + null, + null, + null + ], + "_areatype": 6, + "_coord_sys": 1, + "_coords": [ + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ] + ], + "_decount": 1, + "_finalized": false, + "_has_corners": false, + "_lower_bounds": [ + [ + 113, + 0 + ], + null, + null, + null + ], + "_mask": [ + null, + null, + null, + null + ], + "_max_index": [ + 225, + 339 + ], + "_meta": {}, + "_ndims": 2, + "_num_peri_dims": 0, + "_ocgis": {}, + "_periodic_dim": null, + "_pole_dim": null, + "_pole_kind": null, + "_rank": 2, + "_size": [ + [ + 112, + 339 + ], + null, + null, + null + ], + "_staggerloc": [ + true, + false, + false, + false + ], + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + [ + 225, + 339 + ], + null, + null, + null + ] + }, + "_lower_bounds": [ + 113, + 0 + ], + "_meta": {}, + "_name": "NBM_CORE_PR_APCP_NATIVE", + "_ndbounds": null, + "_rank": 2, + "_staggerloc": 0, + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + 225, + 339 + ], + "_xd": 0 + }, + "esmf_field_out": { + "_data": [ + 0.18961624786774367, + 0.2540000081062317, + 0.2540000081062317, + 0.2540000081062317 + ], + "_finalized": false, + "_grid": { + "_area": [ + null, + null + ], + "_coord_sys": null, + "_coords": [ + [ + "hash_-3785066934698869327", + "hash_44388240431464778" + ], + [ + [ + -66.61924544175804, + -66.61432182496434, + -66.54970733920212, + -66.54733995904326 + ], + [ + 18.27608475709033, + 18.257676718849797, + 18.292360723661034, + 18.24764748674116 + ] + ] + ], + "_finalized": false, + "_mask": [ + null, + null + ], + "_meta": {}, + "_parametric_dim": 2, + "_rank": 1, + "_size": [ + 1000, + 4 + ], + "_size_owned": [ + 485, + 4 + ], + "_spatial_dim": null, + "_struct": {} + }, + "_lower_bounds": [ + 0 + ], + "_meta": {}, + "_name": "NBM_CORE_PR_APCPSUPP_PCP_REGRIDDED", + "_ndbounds": null, + "_rank": 1, + "_staggerloc": 1, + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + 4 + ], + "_xd": 0 + }, + "esmf_field_out_elem": null, + "esmf_field_out_poly": null, + "esmf_grid_in": { + "_area": [ + null, + null, + null, + null + ], + "_areatype": 6, + "_coord_sys": 1, + "_coords": [ + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ], + [ + null, + null + ] + ], + "_decount": 1, + "_finalized": false, + "_has_corners": false, + "_lower_bounds": [ + [ + 113, + 0 + ], + null, + null, + null + ], + "_mask": [ + null, + null, + null, + null + ], + "_max_index": [ + 225, + 339 + ], + "_meta": {}, + "_ndims": 2, + "_num_peri_dims": 0, + "_ocgis": {}, + "_periodic_dim": null, + "_pole_dim": null, + "_pole_kind": null, + "_rank": 2, + "_size": [ + [ + 112, + 339 + ], + null, + null, + null + ], + "_staggerloc": [ + true, + false, + false, + false + ], + "_struct": {}, + "_type": 6, + "_upper_bounds": [ + [ + 225, + 339 + ], + null, + null, + null + ] + }, + "esmf_lats": null, + "esmf_lons": null, + "fcst_date1": "2025-07-10T02:00:00", + "fcst_date2": "2025-07-10T03:00:00", + "fcst_hour1": 2, + "fcst_hour2": 3, + "file_ext": ".grib2", + "file_in1": "/ngen-app/data/raw_input/NBM_PR/blend.20250710/00/core/blend.t00z.core.f003.pr.grib2", + "file_in2": "/ngen-app/data/raw_input/NBM_PR/blend.20250710/00/core/blend.t00z.core.f002.pr.grib2", + "file_type": "GRIB2", + "final_supp_precip": [ + 5.267118103802204e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05 + ], + "final_supp_precip_elem": null, + "global_x_lower": null, + "global_x_upper": null, + "global_y_lower": null, + "global_y_upper": null, + "grib_levels": [ + "BLAH" + ], + "grib_vars": null, + "has_cache": false, + "inDir": "/ngen-app/data/raw_input/NBM_PR", + "input_frequency": 60.0, + "keyValue": 15, + "netcdf_var_names": [ + "APCP_surface" + ], + "nx_global": 339, + "nx_local": 339, + "ny_global": 225, + "ny_local": 112, + "output_var_idx": 3, + "pcp_date1": null, + "pcp_date2": null, + "pcp_hour1": null, + "pcp_hour2": null, + "product_name": "NBM_CORE_PR_APCP", + "regridComplete": false, + "regridOpt": 1, + "regridded_mask": [ + 1.0, + 1.0, + 1.0, + 1.0 + ], + "regridded_mask_elem": null, + "regridded_precip1": [ + 0.0, + 0.0, + 2.3800850613042712e-05, + 1.711833647277672e-05 + ], + "regridded_precip1_elem": null, + "regridded_precip2": [ + 5.267118103802204e-05, + 7.055555761326104e-05, + 7.055555761326104e-05, + 7.055555761326104e-05 + ], + "regridded_precip2_elem": null, + "regridded_rqi1": [ + -9999.0, + -9999.0, + -9999.0, + -9999.0 + ], + "regridded_rqi1_elem": null, + "regridded_rqi2": [ + -9999.0, + -9999.0, + -9999.0, + -9999.0 + ], + "regridded_rqi2_elem": null, + "rqiMethod": 0, + "rqiThresh": 1.0, + "rqi_file_in1": null, + "rqi_file_in2": null, + "rqi_netcdf_var_names": null, + "timeInterpOpt": 0, + "tmpFile": null, + "userCycleOffset": 0, + "x_lower_bound": 0, + "x_upper_bound": 339, + "y_lower_bound": 113, + "y_upper_bound": 225 +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_supp_precip_init_n1_rank0_.json b/tests/test_data/expected_results/test_expected_supp_precip_init_n1_rank0_.json new file mode 100644 index 00000000..5ea3f748 --- /dev/null +++ b/tests/test_data/expected_results/test_expected_supp_precip_init_n1_rank0_.json @@ -0,0 +1,88 @@ +{ + "enforce": 1, + "esmf_field_in": null, + "esmf_field_out": null, + "esmf_field_out_elem": null, + "esmf_field_out_poly": null, + "esmf_grid_in": null, + "esmf_lats": null, + "esmf_lons": null, + "fcst_hour1": null, + "fcst_hour2": null, + "file_ext": ".grib2", + "file_in1": null, + "file_in2": null, + "file_type": "GRIB2", + "final_supp_precip": [ + 0.0, + 5e-324, + 1e-323, + 1.5e-323, + 2e-323, + 2.5e-323, + 3e-323, + 3.5e-323, + 4e-323 + ], + "final_supp_precip_elem": null, + "global_x_lower": null, + "global_x_upper": null, + "global_y_lower": null, + "global_y_upper": null, + "grib_levels": [ + "BLAH" + ], + "grib_vars": null, + "has_cache": false, + "inDir": "/ngen-app/data/raw_input/NBM_PR", + "input_frequency": null, + "keyValue": 15, + "netcdf_var_names": [ + "APCP_surface" + ], + "nx_global": null, + "nx_local": null, + "ny_global": null, + "ny_local": null, + "output_var_idx": 3, + "pcp_date1": null, + "pcp_date2": null, + "pcp_hour1": null, + "pcp_hour2": null, + "product_name": "NBM_CORE_PR_APCP", + "regridComplete": false, + "regridObj": null, + "regridOpt": 1, + "regridded_mask": [ + 1.5806646677583937e-42, + 1.3200231533939777e-42, + 8.88423226381934e-43, + 6.9364273984078445e-43, + 6.656167705542881e-43, + 4.5962589629854e-43, + 3.461207206882298e-43, + 3.587324068671532e-43, + 3.1389085600875902e-43 + ], + "regridded_mask_elem": null, + "regridded_precip1": null, + "regridded_precip1_elem": null, + "regridded_precip2": null, + "regridded_precip2_elem": null, + "regridded_rqi1": null, + "regridded_rqi1_elem": null, + "regridded_rqi2": null, + "regridded_rqi2_elem": null, + "rqiMethod": 0, + "rqiThresh": 1.0, + "rqi_file_in1": null, + "rqi_file_in2": null, + "rqi_netcdf_var_names": null, + "timeInterpOpt": 0, + "tmpFile": null, + "userCycleOffset": 0, + "x_lower_bound": null, + "x_upper_bound": null, + "y_lower_bound": null, + "y_upper_bound": null +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_supp_precip_init_n2_rank0_.json b/tests/test_data/expected_results/test_expected_supp_precip_init_n2_rank0_.json new file mode 100644 index 00000000..b89253f4 --- /dev/null +++ b/tests/test_data/expected_results/test_expected_supp_precip_init_n2_rank0_.json @@ -0,0 +1,80 @@ +{ + "enforce": 1, + "esmf_field_in": null, + "esmf_field_out": null, + "esmf_field_out_elem": null, + "esmf_field_out_poly": null, + "esmf_grid_in": null, + "esmf_lats": null, + "esmf_lons": null, + "fcst_hour1": null, + "fcst_hour2": null, + "file_ext": ".grib2", + "file_in1": null, + "file_in2": null, + "file_type": "GRIB2", + "final_supp_precip": [ + 0.0, + 5e-324, + 1e-323, + 2.5e-323, + 4.4e-323 + ], + "final_supp_precip_elem": null, + "global_x_lower": null, + "global_x_upper": null, + "global_y_lower": null, + "global_y_upper": null, + "grib_levels": [ + "BLAH" + ], + "grib_vars": null, + "has_cache": false, + "inDir": "/ngen-app/data/raw_input/NBM_PR", + "input_frequency": null, + "keyValue": 15, + "netcdf_var_names": [ + "APCP_surface" + ], + "nx_global": null, + "nx_local": null, + "ny_global": null, + "ny_local": null, + "output_var_idx": 3, + "pcp_date1": null, + "pcp_date2": null, + "pcp_hour1": null, + "pcp_hour2": null, + "product_name": "NBM_CORE_PR_APCP", + "regridComplete": false, + "regridObj": null, + "regridOpt": 1, + "regridded_mask": [ + 128124608512.0, + 3.1006531120115227e-41, + 0.0, + 0.0, + 8.96831017167883e-44 + ], + "regridded_mask_elem": null, + "regridded_precip1": null, + "regridded_precip1_elem": null, + "regridded_precip2": null, + "regridded_precip2_elem": null, + "regridded_rqi1": null, + "regridded_rqi1_elem": null, + "regridded_rqi2": null, + "regridded_rqi2_elem": null, + "rqiMethod": 0, + "rqiThresh": 1.0, + "rqi_file_in1": null, + "rqi_file_in2": null, + "rqi_netcdf_var_names": null, + "timeInterpOpt": 0, + "tmpFile": null, + "userCycleOffset": 0, + "x_lower_bound": null, + "x_upper_bound": null, + "y_lower_bound": null, + "y_upper_bound": null +} \ No newline at end of file diff --git a/tests/test_data/expected_results/test_expected_supp_precip_init_n2_rank1_.json b/tests/test_data/expected_results/test_expected_supp_precip_init_n2_rank1_.json new file mode 100644 index 00000000..cc883d59 --- /dev/null +++ b/tests/test_data/expected_results/test_expected_supp_precip_init_n2_rank1_.json @@ -0,0 +1,78 @@ +{ + "enforce": 1, + "esmf_field_in": null, + "esmf_field_out": null, + "esmf_field_out_elem": null, + "esmf_field_out_poly": null, + "esmf_grid_in": null, + "esmf_lats": null, + "esmf_lons": null, + "fcst_hour1": null, + "fcst_hour2": null, + "file_ext": ".grib2", + "file_in1": null, + "file_in2": null, + "file_type": "GRIB2", + "final_supp_precip": [ + -3.210492043520574e-38, + 2.5385149594682076e+253, + -2.850362537409543e-84, + 3.22667548685709e+89 + ], + "final_supp_precip_elem": null, + "global_x_lower": null, + "global_x_upper": null, + "global_y_lower": null, + "global_y_upper": null, + "grib_levels": [ + "BLAH" + ], + "grib_vars": null, + "has_cache": false, + "inDir": "/ngen-app/data/raw_input/NBM_PR", + "input_frequency": null, + "keyValue": 15, + "netcdf_var_names": [ + "APCP_surface" + ], + "nx_global": null, + "nx_local": null, + "ny_global": null, + "ny_local": null, + "output_var_idx": 3, + "pcp_date1": null, + "pcp_date2": null, + "pcp_hour1": null, + "pcp_hour2": null, + "product_name": "NBM_CORE_PR_APCP", + "regridComplete": false, + "regridObj": null, + "regridOpt": 1, + "regridded_mask": [ + 1.401298464324817e-45, + 0.0, + 1.401298464324817e-45, + 0.0 + ], + "regridded_mask_elem": null, + "regridded_precip1": null, + "regridded_precip1_elem": null, + "regridded_precip2": null, + "regridded_precip2_elem": null, + "regridded_rqi1": null, + "regridded_rqi1_elem": null, + "regridded_rqi2": null, + "regridded_rqi2_elem": null, + "rqiMethod": 0, + "rqiThresh": 1.0, + "rqi_file_in1": null, + "rqi_file_in2": null, + "rqi_netcdf_var_names": null, + "timeInterpOpt": 0, + "tmpFile": null, + "userCycleOffset": 0, + "x_lower_bound": null, + "x_upper_bound": null, + "y_lower_bound": null, + "y_upper_bound": null +} \ No newline at end of file From 2d7fa2100c20da44ba8b3346d4d1a76df518b105 Mon Sep 17 00:00:00 2001 From: Max Kipp Date: Fri, 8 May 2026 17:11:54 -0400 Subject: [PATCH 17/18] Exclude some keys from config_options test --- tests/config_options/test_config_options.py | 4 +++- ...expected_config_options_after_update_n1_rank0__step_1.json | 3 --- ...expected_config_options_after_update_n1_rank0__step_2.json | 3 --- ...expected_config_options_after_update_n1_rank0__step_3.json | 3 --- ...expected_config_options_after_update_n2_rank0__step_1.json | 3 --- ...expected_config_options_after_update_n2_rank0__step_2.json | 3 --- ...expected_config_options_after_update_n2_rank0__step_3.json | 3 --- ...expected_config_options_after_update_n2_rank1__step_1.json | 3 --- ...expected_config_options_after_update_n2_rank1__step_2.json | 3 --- ...expected_config_options_after_update_n2_rank1__step_3.json | 3 --- .../test_expected_config_options_finalize_n1_rank0_.json | 3 --- .../test_expected_config_options_finalize_n2_rank0_.json | 3 --- .../test_expected_config_options_finalize_n2_rank1_.json | 3 --- .../test_expected_config_options_init_n1_rank0_.json | 3 --- .../test_expected_config_options_init_n2_rank0_.json | 3 --- .../test_expected_config_options_init_n2_rank1_.json | 3 --- 16 files changed, 3 insertions(+), 46 deletions(-) diff --git a/tests/config_options/test_config_options.py b/tests/config_options/test_config_options.py index 159c297c..530edee9 100644 --- a/tests/config_options/test_config_options.py +++ b/tests/config_options/test_config_options.py @@ -20,7 +20,9 @@ configs.TestConfig_ConfigOptions( config_file=consts.RETRO_FORCING_CONFIG_FILE__AORC_CONUS, keys_to_check=consts.COMPOSITE_KEYS_TO_CHECK, - keys_to_exclude=consts.KEYS_TO_EXCLUDE, + keys_to_exclude=tuple( + set(consts.KEYS_TO_EXCLUDE) | {"d_program_init", "geogrid", "scratch_dir"} + ), grid_type=consts.GRID_TYPE, test_file_name_prefix=TEST_FILE_NAME_PREFIX, ), diff --git a/tests/test_data/expected_results/test_expected_config_options_after_update_n1_rank0__step_1.json b/tests/test_data/expected_results/test_expected_config_options_after_update_n1_rank0__step_1.json index 266f31b4..32071782 100644 --- a/tests/test_data/expected_results/test_expected_config_options_after_update_n1_rank0__step_1.json +++ b/tests/test_data/expected_results/test_expected_config_options_after_update_n1_rank0__step_1.json @@ -215,7 +215,6 @@ "dScaleParamDirs": [ "/ngen-app/data" ], - "d_program_init": "2026-05-08T17:05:06", "e_date_proc": null, "elemconn_var": "elementConn", "elemcoords_var": "centerCoords", @@ -236,7 +235,6 @@ ], "forcing_output": 0, "future_time": null, - "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/dc9ed271e02b6416_gauge_01123000_ESMF_Mesh.nc", "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", "globalNdv": -9999.0, "grid_meta": null, @@ -313,7 +311,6 @@ "rqiMethod": null, "rqiThresh": 1.0, "runCfsNldasBiasCorrect": false, - "scratch_dir": "/ngen-app/data/scratch/AORC/b428b6743c39a6d8", "sinalpha_var": null, "slope_azimuth_var": null, "slope_azimuth_var_elem": null, diff --git a/tests/test_data/expected_results/test_expected_config_options_after_update_n1_rank0__step_2.json b/tests/test_data/expected_results/test_expected_config_options_after_update_n1_rank0__step_2.json index 206a3fc0..443ae3eb 100644 --- a/tests/test_data/expected_results/test_expected_config_options_after_update_n1_rank0__step_2.json +++ b/tests/test_data/expected_results/test_expected_config_options_after_update_n1_rank0__step_2.json @@ -215,7 +215,6 @@ "dScaleParamDirs": [ "/ngen-app/data" ], - "d_program_init": "2026-05-08T17:05:06", "e_date_proc": null, "elemconn_var": "elementConn", "elemcoords_var": "centerCoords", @@ -236,7 +235,6 @@ ], "forcing_output": 0, "future_time": null, - "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/dc9ed271e02b6416_gauge_01123000_ESMF_Mesh.nc", "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", "globalNdv": -9999.0, "grid_meta": null, @@ -313,7 +311,6 @@ "rqiMethod": null, "rqiThresh": 1.0, "runCfsNldasBiasCorrect": false, - "scratch_dir": "/ngen-app/data/scratch/AORC/b428b6743c39a6d8", "sinalpha_var": null, "slope_azimuth_var": null, "slope_azimuth_var_elem": null, diff --git a/tests/test_data/expected_results/test_expected_config_options_after_update_n1_rank0__step_3.json b/tests/test_data/expected_results/test_expected_config_options_after_update_n1_rank0__step_3.json index e0fd5530..df132555 100644 --- a/tests/test_data/expected_results/test_expected_config_options_after_update_n1_rank0__step_3.json +++ b/tests/test_data/expected_results/test_expected_config_options_after_update_n1_rank0__step_3.json @@ -215,7 +215,6 @@ "dScaleParamDirs": [ "/ngen-app/data" ], - "d_program_init": "2026-05-08T17:05:06", "e_date_proc": null, "elemconn_var": "elementConn", "elemcoords_var": "centerCoords", @@ -236,7 +235,6 @@ ], "forcing_output": 0, "future_time": null, - "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/dc9ed271e02b6416_gauge_01123000_ESMF_Mesh.nc", "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", "globalNdv": -9999.0, "grid_meta": null, @@ -313,7 +311,6 @@ "rqiMethod": null, "rqiThresh": 1.0, "runCfsNldasBiasCorrect": false, - "scratch_dir": "/ngen-app/data/scratch/AORC/b428b6743c39a6d8", "sinalpha_var": null, "slope_azimuth_var": null, "slope_azimuth_var_elem": null, diff --git a/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank0__step_1.json b/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank0__step_1.json index bc7d45c1..32071782 100644 --- a/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank0__step_1.json +++ b/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank0__step_1.json @@ -215,7 +215,6 @@ "dScaleParamDirs": [ "/ngen-app/data" ], - "d_program_init": "2026-05-08T17:05:24", "e_date_proc": null, "elemconn_var": "elementConn", "elemcoords_var": "centerCoords", @@ -236,7 +235,6 @@ ], "forcing_output": 0, "future_time": null, - "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/3b7f3fe7676d69c3_gauge_01123000_ESMF_Mesh.nc", "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", "globalNdv": -9999.0, "grid_meta": null, @@ -313,7 +311,6 @@ "rqiMethod": null, "rqiThresh": 1.0, "runCfsNldasBiasCorrect": false, - "scratch_dir": "/ngen-app/data/scratch/AORC/a00fc45eee325b1d", "sinalpha_var": null, "slope_azimuth_var": null, "slope_azimuth_var_elem": null, diff --git a/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank0__step_2.json b/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank0__step_2.json index 42492757..443ae3eb 100644 --- a/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank0__step_2.json +++ b/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank0__step_2.json @@ -215,7 +215,6 @@ "dScaleParamDirs": [ "/ngen-app/data" ], - "d_program_init": "2026-05-08T17:05:24", "e_date_proc": null, "elemconn_var": "elementConn", "elemcoords_var": "centerCoords", @@ -236,7 +235,6 @@ ], "forcing_output": 0, "future_time": null, - "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/3b7f3fe7676d69c3_gauge_01123000_ESMF_Mesh.nc", "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", "globalNdv": -9999.0, "grid_meta": null, @@ -313,7 +311,6 @@ "rqiMethod": null, "rqiThresh": 1.0, "runCfsNldasBiasCorrect": false, - "scratch_dir": "/ngen-app/data/scratch/AORC/a00fc45eee325b1d", "sinalpha_var": null, "slope_azimuth_var": null, "slope_azimuth_var_elem": null, diff --git a/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank0__step_3.json b/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank0__step_3.json index 1330db80..df132555 100644 --- a/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank0__step_3.json +++ b/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank0__step_3.json @@ -215,7 +215,6 @@ "dScaleParamDirs": [ "/ngen-app/data" ], - "d_program_init": "2026-05-08T17:05:24", "e_date_proc": null, "elemconn_var": "elementConn", "elemcoords_var": "centerCoords", @@ -236,7 +235,6 @@ ], "forcing_output": 0, "future_time": null, - "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/3b7f3fe7676d69c3_gauge_01123000_ESMF_Mesh.nc", "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", "globalNdv": -9999.0, "grid_meta": null, @@ -313,7 +311,6 @@ "rqiMethod": null, "rqiThresh": 1.0, "runCfsNldasBiasCorrect": false, - "scratch_dir": "/ngen-app/data/scratch/AORC/a00fc45eee325b1d", "sinalpha_var": null, "slope_azimuth_var": null, "slope_azimuth_var_elem": null, diff --git a/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank1__step_1.json b/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank1__step_1.json index bc7d45c1..32071782 100644 --- a/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank1__step_1.json +++ b/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank1__step_1.json @@ -215,7 +215,6 @@ "dScaleParamDirs": [ "/ngen-app/data" ], - "d_program_init": "2026-05-08T17:05:24", "e_date_proc": null, "elemconn_var": "elementConn", "elemcoords_var": "centerCoords", @@ -236,7 +235,6 @@ ], "forcing_output": 0, "future_time": null, - "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/3b7f3fe7676d69c3_gauge_01123000_ESMF_Mesh.nc", "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", "globalNdv": -9999.0, "grid_meta": null, @@ -313,7 +311,6 @@ "rqiMethod": null, "rqiThresh": 1.0, "runCfsNldasBiasCorrect": false, - "scratch_dir": "/ngen-app/data/scratch/AORC/a00fc45eee325b1d", "sinalpha_var": null, "slope_azimuth_var": null, "slope_azimuth_var_elem": null, diff --git a/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank1__step_2.json b/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank1__step_2.json index 42492757..443ae3eb 100644 --- a/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank1__step_2.json +++ b/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank1__step_2.json @@ -215,7 +215,6 @@ "dScaleParamDirs": [ "/ngen-app/data" ], - "d_program_init": "2026-05-08T17:05:24", "e_date_proc": null, "elemconn_var": "elementConn", "elemcoords_var": "centerCoords", @@ -236,7 +235,6 @@ ], "forcing_output": 0, "future_time": null, - "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/3b7f3fe7676d69c3_gauge_01123000_ESMF_Mesh.nc", "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", "globalNdv": -9999.0, "grid_meta": null, @@ -313,7 +311,6 @@ "rqiMethod": null, "rqiThresh": 1.0, "runCfsNldasBiasCorrect": false, - "scratch_dir": "/ngen-app/data/scratch/AORC/a00fc45eee325b1d", "sinalpha_var": null, "slope_azimuth_var": null, "slope_azimuth_var_elem": null, diff --git a/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank1__step_3.json b/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank1__step_3.json index 1330db80..df132555 100644 --- a/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank1__step_3.json +++ b/tests/test_data/expected_results/test_expected_config_options_after_update_n2_rank1__step_3.json @@ -215,7 +215,6 @@ "dScaleParamDirs": [ "/ngen-app/data" ], - "d_program_init": "2026-05-08T17:05:24", "e_date_proc": null, "elemconn_var": "elementConn", "elemcoords_var": "centerCoords", @@ -236,7 +235,6 @@ ], "forcing_output": 0, "future_time": null, - "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/3b7f3fe7676d69c3_gauge_01123000_ESMF_Mesh.nc", "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", "globalNdv": -9999.0, "grid_meta": null, @@ -313,7 +311,6 @@ "rqiMethod": null, "rqiThresh": 1.0, "runCfsNldasBiasCorrect": false, - "scratch_dir": "/ngen-app/data/scratch/AORC/a00fc45eee325b1d", "sinalpha_var": null, "slope_azimuth_var": null, "slope_azimuth_var_elem": null, diff --git a/tests/test_data/expected_results/test_expected_config_options_finalize_n1_rank0_.json b/tests/test_data/expected_results/test_expected_config_options_finalize_n1_rank0_.json index 6048ab13..6984d1b8 100644 --- a/tests/test_data/expected_results/test_expected_config_options_finalize_n1_rank0_.json +++ b/tests/test_data/expected_results/test_expected_config_options_finalize_n1_rank0_.json @@ -215,7 +215,6 @@ "dScaleParamDirs": [ "/ngen-app/data" ], - "d_program_init": "2026-05-08T17:05:06", "e_date_proc": null, "elemconn_var": "elementConn", "elemcoords_var": "centerCoords", @@ -236,7 +235,6 @@ ], "forcing_output": 0, "future_time": null, - "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/dc9ed271e02b6416_gauge_01123000_ESMF_Mesh.nc", "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", "globalNdv": -9999.0, "grid_meta": null, @@ -313,7 +311,6 @@ "rqiMethod": null, "rqiThresh": 1.0, "runCfsNldasBiasCorrect": false, - "scratch_dir": "/ngen-app/data/scratch/AORC/b428b6743c39a6d8", "sinalpha_var": null, "slope_azimuth_var": null, "slope_azimuth_var_elem": null, diff --git a/tests/test_data/expected_results/test_expected_config_options_finalize_n2_rank0_.json b/tests/test_data/expected_results/test_expected_config_options_finalize_n2_rank0_.json index ef38edea..6984d1b8 100644 --- a/tests/test_data/expected_results/test_expected_config_options_finalize_n2_rank0_.json +++ b/tests/test_data/expected_results/test_expected_config_options_finalize_n2_rank0_.json @@ -215,7 +215,6 @@ "dScaleParamDirs": [ "/ngen-app/data" ], - "d_program_init": "2026-05-08T17:05:24", "e_date_proc": null, "elemconn_var": "elementConn", "elemcoords_var": "centerCoords", @@ -236,7 +235,6 @@ ], "forcing_output": 0, "future_time": null, - "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/3b7f3fe7676d69c3_gauge_01123000_ESMF_Mesh.nc", "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", "globalNdv": -9999.0, "grid_meta": null, @@ -313,7 +311,6 @@ "rqiMethod": null, "rqiThresh": 1.0, "runCfsNldasBiasCorrect": false, - "scratch_dir": "/ngen-app/data/scratch/AORC/a00fc45eee325b1d", "sinalpha_var": null, "slope_azimuth_var": null, "slope_azimuth_var_elem": null, diff --git a/tests/test_data/expected_results/test_expected_config_options_finalize_n2_rank1_.json b/tests/test_data/expected_results/test_expected_config_options_finalize_n2_rank1_.json index ef38edea..6984d1b8 100644 --- a/tests/test_data/expected_results/test_expected_config_options_finalize_n2_rank1_.json +++ b/tests/test_data/expected_results/test_expected_config_options_finalize_n2_rank1_.json @@ -215,7 +215,6 @@ "dScaleParamDirs": [ "/ngen-app/data" ], - "d_program_init": "2026-05-08T17:05:24", "e_date_proc": null, "elemconn_var": "elementConn", "elemcoords_var": "centerCoords", @@ -236,7 +235,6 @@ ], "forcing_output": 0, "future_time": null, - "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/3b7f3fe7676d69c3_gauge_01123000_ESMF_Mesh.nc", "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", "globalNdv": -9999.0, "grid_meta": null, @@ -313,7 +311,6 @@ "rqiMethod": null, "rqiThresh": 1.0, "runCfsNldasBiasCorrect": false, - "scratch_dir": "/ngen-app/data/scratch/AORC/a00fc45eee325b1d", "sinalpha_var": null, "slope_azimuth_var": null, "slope_azimuth_var_elem": null, diff --git a/tests/test_data/expected_results/test_expected_config_options_init_n1_rank0_.json b/tests/test_data/expected_results/test_expected_config_options_init_n1_rank0_.json index 1a7be2bd..08d6d9a0 100644 --- a/tests/test_data/expected_results/test_expected_config_options_init_n1_rank0_.json +++ b/tests/test_data/expected_results/test_expected_config_options_init_n1_rank0_.json @@ -25,7 +25,6 @@ "dScaleParamDirs": [ "/ngen-app/data" ], - "d_program_init": "2026-05-08T17:05:06", "e_date_proc": null, "elemconn_var": "elementConn", "elemcoords_var": "centerCoords", @@ -46,7 +45,6 @@ ], "forcing_output": 0, "future_time": null, - "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/dc9ed271e02b6416_gauge_01123000_ESMF_Mesh.nc", "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", "globalNdv": -9999.0, "grid_meta": null, @@ -123,7 +121,6 @@ "rqiMethod": null, "rqiThresh": 1.0, "runCfsNldasBiasCorrect": false, - "scratch_dir": "/ngen-app/data/scratch/AORC/b428b6743c39a6d8", "sinalpha_var": null, "slope_azimuth_var": null, "slope_azimuth_var_elem": null, diff --git a/tests/test_data/expected_results/test_expected_config_options_init_n2_rank0_.json b/tests/test_data/expected_results/test_expected_config_options_init_n2_rank0_.json index 8e241d65..08d6d9a0 100644 --- a/tests/test_data/expected_results/test_expected_config_options_init_n2_rank0_.json +++ b/tests/test_data/expected_results/test_expected_config_options_init_n2_rank0_.json @@ -25,7 +25,6 @@ "dScaleParamDirs": [ "/ngen-app/data" ], - "d_program_init": "2026-05-08T17:05:24", "e_date_proc": null, "elemconn_var": "elementConn", "elemcoords_var": "centerCoords", @@ -46,7 +45,6 @@ ], "forcing_output": 0, "future_time": null, - "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/3b7f3fe7676d69c3_gauge_01123000_ESMF_Mesh.nc", "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", "globalNdv": -9999.0, "grid_meta": null, @@ -123,7 +121,6 @@ "rqiMethod": null, "rqiThresh": 1.0, "runCfsNldasBiasCorrect": false, - "scratch_dir": "/ngen-app/data/scratch/AORC/a00fc45eee325b1d", "sinalpha_var": null, "slope_azimuth_var": null, "slope_azimuth_var_elem": null, diff --git a/tests/test_data/expected_results/test_expected_config_options_init_n2_rank1_.json b/tests/test_data/expected_results/test_expected_config_options_init_n2_rank1_.json index 8e241d65..08d6d9a0 100644 --- a/tests/test_data/expected_results/test_expected_config_options_init_n2_rank1_.json +++ b/tests/test_data/expected_results/test_expected_config_options_init_n2_rank1_.json @@ -25,7 +25,6 @@ "dScaleParamDirs": [ "/ngen-app/data" ], - "d_program_init": "2026-05-08T17:05:24", "e_date_proc": null, "elemconn_var": "elementConn", "elemcoords_var": "centerCoords", @@ -46,7 +45,6 @@ ], "forcing_output": 0, "future_time": null, - "geogrid": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/esmf_mesh/3b7f3fe7676d69c3_gauge_01123000_ESMF_Mesh.nc", "geopackage": "/workspaces/nwm-rte/src/ngen-forcing/tests/test_data/gpkg/gauge_01123000.gpkg", "globalNdv": -9999.0, "grid_meta": null, @@ -123,7 +121,6 @@ "rqiMethod": null, "rqiThresh": 1.0, "runCfsNldasBiasCorrect": false, - "scratch_dir": "/ngen-app/data/scratch/AORC/a00fc45eee325b1d", "sinalpha_var": null, "slope_azimuth_var": null, "slope_azimuth_var_elem": null, From f1824bb557f04ed03dda5cc633cb87e51f974b67 Mon Sep 17 00:00:00 2001 From: Max Kipp Date: Fri, 8 May 2026 17:18:57 -0400 Subject: [PATCH 18/18] use np.full instead of np.empty for deterministic results for tests --- .../core/suppPrecipMod.py | 9 ++--- ...t_expected_supp_precip_init_n1_rank0_.json | 36 +++++++++---------- ...t_expected_supp_precip_init_n2_rank0_.json | 20 +++++------ ...t_expected_supp_precip_init_n2_rank1_.json | 16 ++++----- 4 files changed, 41 insertions(+), 40 deletions(-) diff --git a/NextGen_Forcings_Engine_BMI/NextGen_Forcings_Engine/core/suppPrecipMod.py b/NextGen_Forcings_Engine_BMI/NextGen_Forcings_Engine/core/suppPrecipMod.py index a8132f83..5d99be03 100755 --- a/NextGen_Forcings_Engine_BMI/NextGen_Forcings_Engine/core/suppPrecipMod.py +++ b/NextGen_Forcings_Engine_BMI/NextGen_Forcings_Engine/core/suppPrecipMod.py @@ -373,11 +373,12 @@ def initDict(ConfigOptions, GeoMetaWrfHydro): ) elif ConfigOptions.grid_type == "hydrofabric": # Initialize the local final grid of values - InputDict[supp_pcp_key].final_supp_precip = np.empty( - [GeoMetaWrfHydro.ny_local], np.float64 + # NOTE changed from np.empty to np.full for determinism of test data. + InputDict[supp_pcp_key].final_supp_precip = np.full( + [GeoMetaWrfHydro.ny_local], np.nan, dtype=np.float64 ) - InputDict[supp_pcp_key].regridded_mask = np.empty( - [GeoMetaWrfHydro.ny_local], np.float32 + InputDict[supp_pcp_key].regridded_mask = np.full( + [GeoMetaWrfHydro.ny_local], np.nan, dtype=np.float32 ) InputDict[supp_pcp_key].userCycleOffset = ConfigOptions.supp_input_offsets[ diff --git a/tests/test_data/expected_results/test_expected_supp_precip_init_n1_rank0_.json b/tests/test_data/expected_results/test_expected_supp_precip_init_n1_rank0_.json index 5ea3f748..43a55d40 100644 --- a/tests/test_data/expected_results/test_expected_supp_precip_init_n1_rank0_.json +++ b/tests/test_data/expected_results/test_expected_supp_precip_init_n1_rank0_.json @@ -14,15 +14,15 @@ "file_in2": null, "file_type": "GRIB2", "final_supp_precip": [ - 0.0, - 5e-324, - 1e-323, - 1.5e-323, - 2e-323, - 2.5e-323, - 3e-323, - 3.5e-323, - 4e-323 + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN ], "final_supp_precip_elem": null, "global_x_lower": null, @@ -54,15 +54,15 @@ "regridObj": null, "regridOpt": 1, "regridded_mask": [ - 1.5806646677583937e-42, - 1.3200231533939777e-42, - 8.88423226381934e-43, - 6.9364273984078445e-43, - 6.656167705542881e-43, - 4.5962589629854e-43, - 3.461207206882298e-43, - 3.587324068671532e-43, - 3.1389085600875902e-43 + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN, + NaN ], "regridded_mask_elem": null, "regridded_precip1": null, diff --git a/tests/test_data/expected_results/test_expected_supp_precip_init_n2_rank0_.json b/tests/test_data/expected_results/test_expected_supp_precip_init_n2_rank0_.json index b89253f4..81bc7814 100644 --- a/tests/test_data/expected_results/test_expected_supp_precip_init_n2_rank0_.json +++ b/tests/test_data/expected_results/test_expected_supp_precip_init_n2_rank0_.json @@ -14,11 +14,11 @@ "file_in2": null, "file_type": "GRIB2", "final_supp_precip": [ - 0.0, - 5e-324, - 1e-323, - 2.5e-323, - 4.4e-323 + NaN, + NaN, + NaN, + NaN, + NaN ], "final_supp_precip_elem": null, "global_x_lower": null, @@ -50,11 +50,11 @@ "regridObj": null, "regridOpt": 1, "regridded_mask": [ - 128124608512.0, - 3.1006531120115227e-41, - 0.0, - 0.0, - 8.96831017167883e-44 + NaN, + NaN, + NaN, + NaN, + NaN ], "regridded_mask_elem": null, "regridded_precip1": null, diff --git a/tests/test_data/expected_results/test_expected_supp_precip_init_n2_rank1_.json b/tests/test_data/expected_results/test_expected_supp_precip_init_n2_rank1_.json index cc883d59..692c6b33 100644 --- a/tests/test_data/expected_results/test_expected_supp_precip_init_n2_rank1_.json +++ b/tests/test_data/expected_results/test_expected_supp_precip_init_n2_rank1_.json @@ -14,10 +14,10 @@ "file_in2": null, "file_type": "GRIB2", "final_supp_precip": [ - -3.210492043520574e-38, - 2.5385149594682076e+253, - -2.850362537409543e-84, - 3.22667548685709e+89 + NaN, + NaN, + NaN, + NaN ], "final_supp_precip_elem": null, "global_x_lower": null, @@ -49,10 +49,10 @@ "regridObj": null, "regridOpt": 1, "regridded_mask": [ - 1.401298464324817e-45, - 0.0, - 1.401298464324817e-45, - 0.0 + NaN, + NaN, + NaN, + NaN ], "regridded_mask_elem": null, "regridded_precip1": null,