示例#1
0
    def test_forecast_period_and_model_configuration_dict(self):
        """Test blending models over forecast_period with a configuration
        dictionary."""
        # set up data cubes with forecast periods [ 6. 7. 8.] hours
        time_points = [
            dt(2017, 1, 10, 9),
            dt(2017, 1, 10, 10),
            dt(2017, 1, 10, 11)
        ]
        cube1 = set_up_basic_model_config_cube(frt=dt(2017, 1, 10, 3),
                                               time_points=time_points)
        cube2 = cube1.copy()
        cube2.coord("model_id").points = [2000]
        cube2.coord("model_configuration").points = ["uk_ens"]
        cubes = iris.cube.CubeList([cube1, cube2])

        expected_weights = np.array([[1.0, 1.0, 0.8], [0.0, 0.0, 0.2]])

        plugin = ChooseWeightsLinear(self.weighting_coord_name,
                                     self.config_dict_fp)
        result = plugin.process(cubes)
        self.assertIsInstance(result, iris.cube.Cube)
        self.assertArrayAlmostEqual(result.data, expected_weights)
        self.assertAlmostEqual(result.name(), "weights")
        result_coords = {coord.name() for coord in result.coords()}
        self.assertSetEqual(result_coords,
                            self.expected_coords_model_blend_weights)
示例#2
0
    def test_forecast_period_and_model_configuration_three_models_dict(self):
        """Test blending three models over forecast period with a
        configuration dictionary returns a sorted weights cube."""
        time_points = [
            dt(2017, 1, 10, 9), dt(2017, 1, 10, 10), dt(2017, 1, 10, 11)]
        cube1 = set_up_basic_model_config_cube(
            frt=dt(2017, 1, 10, 3), time_points=time_points)
        cubes = iris.cube.CubeList([cube1])
        for i, model in enumerate(["uk_ens", "gl_ens"]):
            cube = cube1.copy()
            cube.coord("model_id").points = [1000*(i+2)]
            cube.coord("model_configuration").points = [model]
            cubes.append(cube)

        expected_weights = np.array([[1., 1., 0.72],
                                     [0., 0., 0.18],
                                     [0., 0., 0.1]])

        self.config_dict_fp["gl_ens"] = {"forecast_period": [7, 16, 48, 54],
                                         "weights": [0, 1, 1, 1],
                                         "units": "hours"}

        plugin = ChooseWeightsLinear(
            self.weighting_coord_name, self.config_dict_fp)
        result = plugin.process(cubes)
        self.assertIsInstance(result, iris.cube.Cube)
        self.assertArrayAlmostEqual(result.data, expected_weights)
        self.assertAlmostEqual(result.name(), "weights")
        self.assertArrayAlmostEqual(result.coord('model_id').points,
                                    [1000, 2000, 3000])
        self.assertArrayEqual(
            result.coord('model_configuration').points,
            ["uk_det", "uk_ens", "gl_ens"])
示例#3
0
    def test_height_and_realization_dict(self):
        """Test blending members with a configuration dictionary."""
        cube = set_up_variable_cube(274.0 * np.ones((2, 2, 2), dtype=np.float32))
        cube = add_coordinate(cube, [10.0, 20.0], "height", coord_units="m")
        cubes = iris.cube.CubeList([])
        for cube_slice in cube.slices_over("realization"):
            cubes.append(cube_slice)

        expected_weights = np.array([[1.0, 0.5], [0.0, 0.5]])

        config_dict = {
            0: {"height": [15, 25], "weights": [1, 0], "units": "m"},
            1: {"height": [15, 25], "weights": [0, 1], "units": "m"},
        }
        plugin = ChooseWeightsLinear(
            "height", config_dict, config_coord_name="realization"
        )
        result = plugin.process(cubes)

        self.assertIsInstance(result, iris.cube.Cube)
        self.assertArrayAlmostEqual(result.data, expected_weights)
        self.assertAlmostEqual(result.name(), "weights")
        expected_coords = {
            "time",
            "forecast_reference_time",
            "forecast_period",
            "height",
            "realization",
        }
        result_coords = {coord.name() for coord in result.coords()}
        self.assertSetEqual(result_coords, expected_coords)