def test_exception(self): """Test that an exception is raised if the operation requested is not a valid choice.""" plugin = ApplyOrographicEnhancement("invalid") msg = "Operation 'invalid' not supported for" with self.assertRaisesRegex(ValueError, msg): plugin.process(self.precip_cubes, self.oe_cube)
def test_subtract_with_mask(self): """Test the subtraction of cubelists containing cubes of orographic enhancement from cubes of precipitation rate, where a mask has been applied. Note the change for the upper right point within the expected1 array compared to the test_basic_subtract test.""" expected0 = np.array([[[0., 1., 2.], [1., 2., MIN_PRECIP_RATE_MMH], [0., 1., MIN_PRECIP_RATE_MMH]]]) expected1 = np.array([[[MIN_PRECIP_RATE_MMH, MIN_PRECIP_RATE_MMH, 1.], [2., 3., 1.], [2., 3., 1.]]]) # Mask values within the input precipitation cube that are equal to, # or below 1. precip_cubes = self.precip_cubes.copy() new_precip_cubes = iris.cube.CubeList([]) for precip_cube in precip_cubes: precip_cube.convert_units("mm/hr") masked = np.ma.masked_where(precip_cube.data <= 1, precip_cube.data) precip_cube.data = masked precip_cube.convert_units("m/s") new_precip_cubes.append(precip_cube) plugin = ApplyOrographicEnhancement("subtract") result = plugin.process(self.precip_cubes, self.oe_cube) self.assertIsInstance(result, iris.cube.CubeList) for aresult, precip_cube in zip(result, self.precip_cubes): self.assertEqual(aresult.metadata, precip_cube.metadata) for cube in result: cube.convert_units("mm/hr") self.assertArrayAlmostEqual(result[0].data.data, expected0) self.assertArrayAlmostEqual(result[1].data.data, expected1)
def test_add_with_mask(self): """Test the addition of cubelists containing cubes of precipitation rate and orographic enhancement, where a mask has been applied. Orographic enhancement is not added to the masked points (where precip rate <= 1 mm/hr).""" expected0 = np.array([[[0., 1., 2.], [1., 2., 7.], [0., 3., 4.]]]) expected1 = np.array([[[9., 9., 1.], [6., 5., 1.], [6., 5., 1.]]]) precip_cubes = self.precip_cubes.copy() # Mask values within the input precipitation cube that are equal to, # or below 1. new_precip_cubes = iris.cube.CubeList([]) for precip_cube in precip_cubes: precip_cube.convert_units("mm/hr") masked = np.ma.masked_where(precip_cube.data <= 1, precip_cube.data) precip_cube.data = masked precip_cube.convert_units("m/s") new_precip_cubes.append(precip_cube) plugin = ApplyOrographicEnhancement("add") result = plugin.process(self.precip_cubes, self.oe_cube) self.assertIsInstance(result, iris.cube.CubeList) for aresult, precip_cube in zip(result, self.precip_cubes): self.assertIsInstance(aresult.data, np.ma.MaskedArray) self.assertEqual(aresult.metadata, precip_cube.metadata) for cube in result: cube.convert_units("mm/hr") self.assertArrayAlmostEqual(result[0].data.data, expected0) self.assertArrayAlmostEqual(result[1].data.data, expected1)
def test_only_one_orographic_enhancement_cube(self): """Test where is an orographic enhancement cube with a single time point is supplied, so that multiple input precipitation fields are adjusted by the same orographic enhancement.""" expected0 = np.array([[ [0.0, 1.0, 2.0], [1.0, 2.0, MIN_PRECIP_RATE_MMH], [0.0, 1.0, MIN_PRECIP_RATE_MMH], ]]) expected1 = np.array([[ [4.0, 4.0, 1.0], [4.0, 4.0, MIN_PRECIP_RATE_MMH], [3.0, 3.0, MIN_PRECIP_RATE_MMH], ]]) sliced_oe_cube = self.oe_cube[0] # Change the time of precip to be within 30 mins of oe_cube. self.precip_cubes[1].coord("time").points = ( self.precip_cubes[1].coord("time").points - 2700) plugin = ApplyOrographicEnhancement("subtract") result = plugin.process(self.precip_cubes, sliced_oe_cube) self.assertIsInstance(result, iris.cube.CubeList) for aresult, precip_cube in zip(result, self.precip_cubes): self.assertEqual(aresult.metadata, precip_cube.metadata) for cube in result: cube.convert_units("mm/hr") self.assertArrayAlmostEqual(result[0].data, expected0) self.assertArrayAlmostEqual(result[1].data, expected1)
def test_basic_subtract(self): """Test the subtraction of a cube of orographic enhancement with multiple times from cubes of precipitation rate.""" expected0 = np.array( [ [ [0.0, 1.0, 2.0], [1.0, 2.0, MIN_PRECIP_RATE_MMH], [0.0, 1.0, MIN_PRECIP_RATE_MMH], ] ] ) expected1 = np.array( [ [ [MIN_PRECIP_RATE_MMH, MIN_PRECIP_RATE_MMH, MIN_PRECIP_RATE_MMH], [2.0, 3.0, 1.0], [2.0, 3.0, 1.0], ] ] ) plugin = ApplyOrographicEnhancement("subtract") result = plugin.process(self.precip_cubes, self.oe_cube) self.assertIsInstance(result, iris.cube.CubeList) for aresult, precip_cube in zip(result, self.precip_cubes): self.assertEqual(aresult.metadata, precip_cube.metadata) for cube in result: cube.convert_units("mm/hr") self.assertArrayAlmostEqual(result[0].data, expected0) self.assertArrayAlmostEqual(result[1].data, expected1)
def test_one_input_cube(self): """Test the addition of precipitation rate and orographic enhancement, where a single precipitation rate cube is provided.""" expected = np.array([[[0., 1., 2.], [1., 2., 7.], [0., 3., 4.]]]) plugin = ApplyOrographicEnhancement("add") result = plugin.process(self.precip_cubes[0], self.oe_cube) self.assertIsInstance(result, iris.cube.CubeList) for aresult, precip_cube in zip(result, self.precip_cubes): self.assertEqual(aresult.metadata, precip_cube.metadata) for cube in result: cube.convert_units("mm/hr") self.assertArrayAlmostEqual(result[0].data, expected)
def test_basic_add(self): """Test the addition of a precipitation rate cubelist and an orographic enhancement cube with multiple times.""" expected0 = np.array([[[0., 1., 2.], [1., 2., 7.], [0., 3., 4.]]]) expected1 = np.array([[[9., 9., 6.], [6., 5., 1.], [6., 5., 1.]]]) plugin = ApplyOrographicEnhancement("add") result = plugin.process(self.precip_cubes, self.oe_cube) self.assertIsInstance(result, iris.cube.CubeList) for aresult, precip_cube in zip(result, self.precip_cubes): self.assertEqual(aresult.metadata, precip_cube.metadata) for cube in result: cube.convert_units("mm/hr") self.assertArrayAlmostEqual(result[0].data, expected0) self.assertArrayAlmostEqual(result[1].data, expected1)
def test_only_one_orographic_enhancement_cube(self): """Test where is an orographic enhancement cube with a single time point is supplied, so that multiple input precipitation fields are adjusted by the same orographic enhancement.""" expected0 = np.array([[[[0., 1., 2.], [1., 2., MIN_PRECIP_RATE_MMH], [0., 1., MIN_PRECIP_RATE_MMH]]]]) expected1 = np.array([[[[4., 4., 1.], [4., 4., MIN_PRECIP_RATE_MMH], [3., 3., MIN_PRECIP_RATE_MMH]]]]) sliced_oe_cube = (iris.util.new_axis(self.oe_cube[:, 0, :, :], "time")) plugin = ApplyOrographicEnhancement("subtract") result = plugin.process(self.precip_cubes, sliced_oe_cube) self.assertIsInstance(result, iris.cube.CubeList) for aresult, precip_cube in zip(result, self.precip_cubes): self.assertEqual(aresult.metadata, precip_cube.metadata) for cube in result: cube.convert_units("mm/hr") self.assertArrayAlmostEqual(result[0].data, expected0) self.assertArrayAlmostEqual(result[1].data, expected1)