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)
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"])
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)