Exemplo n.º 1
0
 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)
Exemplo n.º 2
0
    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)
Exemplo n.º 3
0
    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)
Exemplo n.º 4
0
 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)
Exemplo n.º 5
0
 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)
Exemplo n.º 6
0
 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)
Exemplo n.º 7
0
 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)