Exemple #1
0
    def test_t2_no_time_mean(self):
        cube = _get_single_time_cube(set_time_mean=False)
        expected = cftime.datetime(0, 0, 0)

        with mock.patch('iris.fileformats.pp.PPField3',
                        autospec=True) as pp_field:
            verify(cube, pp_field)
        actual = pp_field.t2
        self.assertEqual(expected, actual)
Exemple #2
0
    def test_t2_no_time_mean(self):
        cube = _get_single_time_cube(set_time_mean=False)
        expected = cftime.datetime(0, 0, 0)

        with mock.patch('iris.fileformats.pp.PPField3',
                        autospec=True) as pp_field:
            verify(cube, pp_field)
        actual = pp_field.t2
        self.assertEqual(expected, actual)
Exemple #3
0
    def test_lbproc_time_mean(self):
        cube = _get_single_time_cube(set_time_mean=True)
        expected = 128

        with mock.patch('iris.fileformats.pp.PPField3',
                        autospec=True) as pp_field:
            verify(cube, pp_field)
        actual = pp_field.lbproc

        self.assertEqual(expected, actual)
Exemple #4
0
    def test_lbproc_time_mean(self):
        cube = _get_single_time_cube(set_time_mean=True)
        expected = 128

        with mock.patch('iris.fileformats.pp.PPField3',
                        autospec=True) as pp_field:
            verify(cube, pp_field)
        actual = pp_field.lbproc

        self.assertEqual(expected, actual)
Exemple #5
0
    def test_t2_time_mean(self):
        cube = _get_single_time_cube(set_time_mean=True)
        tc = cube.coord(axis='t')
        expected = tc.units.num2date(30)

        with mock.patch('iris.fileformats.pp.PPField3',
                        autospec=True) as pp_field:
            verify(cube, pp_field)
        actual = pp_field.t2

        self.assertEqual(expected, actual)
Exemple #6
0
    def test_t1_no_time_mean(self):
        cube = _get_single_time_cube()
        tc = cube.coord(axis="t")
        expected = tc.units.num2date(15)

        with mock.patch("iris.fileformats.pp.PPField3",
                        autospec=True) as pp_field:
            verify(cube, pp_field)
        actual = pp_field.t1

        self.assertEqual(expected, actual)
Exemple #7
0
    def test_t2_time_mean(self):
        cube = _get_single_time_cube(set_time_mean=True)
        tc = cube.coord(axis='t')
        expected = tc.units.num2date(30)

        with mock.patch('iris.fileformats.pp.PPField3',
                        autospec=True) as pp_field:
            verify(cube, pp_field)
        actual = pp_field.t2

        self.assertEqual(expected, actual)
Exemple #8
0
    def test_lbft_no_forecast_time(self):
        # Different pattern here: checking that lbft hasn't been changed from
        # the default value.
        cube = _get_single_time_cube()
        mock_lbft = mock.sentinel.lbft

        with mock.patch('iris.fileformats.pp.PPField3',
                        autospec=True) as pp_field:
            pp_field.lbft = mock_lbft
            verify(cube, pp_field)
        actual = pp_field.lbft

        assert(mock_lbft is actual)
Exemple #9
0
    def test_lbtim_time_mean(self):
        cube = _get_single_time_cube(set_time_mean=True)
        expected_ib = 2  # Time mean
        expected_ic = 2  # 360 day calendar

        with mock.patch('iris.fileformats.pp.PPField3',
                        autospec=True) as pp_field:
            verify(cube, pp_field)
        actual_ib = pp_field.lbtim.ib
        actual_ic = pp_field.lbtim.ic

        self.assertEqual(expected_ib, actual_ib)
        self.assertEqual(expected_ic, actual_ic)
Exemple #10
0
    def test_lbft_no_forecast_time(self):
        # Different pattern here: checking that lbft hasn't been changed from
        # the default value.
        cube = _get_single_time_cube()
        mock_lbft = mock.sentinel.lbft

        with mock.patch('iris.fileformats.pp.PPField3',
                        autospec=True) as pp_field:
            pp_field.lbft = mock_lbft
            verify(cube, pp_field)
        actual = pp_field.lbft

        assert(mock_lbft is actual)
Exemple #11
0
    def test_lbtim_time_mean(self):
        cube = _get_single_time_cube(set_time_mean=True)
        expected_ib = 2  # Time mean
        expected_ic = 2  # 360 day calendar

        with mock.patch('iris.fileformats.pp.PPField3',
                        autospec=True) as pp_field:
            verify(cube, pp_field)
        actual_ib = pp_field.lbtim.ib
        actual_ic = pp_field.lbtim.ic

        self.assertEqual(expected_ib, actual_ib)
        self.assertEqual(expected_ic, actual_ic)
Exemple #12
0
    def test_potential_temperature_level_round_trip(self):
        # Check save+load for data on 'potential temperature' levels.

        # Use pp.load_cubes() to convert a fake PPField into a Cube.
        # NB. Use MagicMock so that SplittableInt header items, such as
        # LBCODE, support len().
        potm_value = 22.5
        field = self._mock_field(lbvc=19, blev=potm_value)
        load = mock.Mock(return_value=iter([field]))
        with mock.patch('iris.fileformats.pp.load', new=load):
            cube = next(iris.fileformats.pp.load_cubes('DUMMY'))

        self._test_coord(cube,
                         potm_value,
                         standard_name='air_potential_temperature')

        # Now use the save rules to convert the Cube back into a PPField.
        field = iris.fileformats.pp.PPField3()
        field.lbfc = 0
        field.lbvc = 0
        field = verify(cube, field)

        # Check the vertical coordinate is as originally specified.
        self.assertEqual(field.lbvc, 19)
        self.assertEqual(field.blev, potm_value)
Exemple #13
0
    def test_potential_temperature_level_round_trip(self):
        # Check save+load for data on 'potential temperature' levels.

        # Use pp.load_cubes() to convert a fake PPField into a Cube.
        # NB. Use MagicMock so that SplittableInt header items, such as
        # LBCODE, support len().
        potm_value = 22.5
        mock_data = np.zeros(1)
        mock_core_data = mock.MagicMock(return_value=mock_data)
        field = mock.MagicMock(lbvc=19, blev=potm_value,
                               lbuser=[0] * 7, lbrsvd=[0] * 4,
                               core_data=mock_core_data,
                               realised_dtype=mock_data.dtype)
        load = mock.Mock(return_value=iter([field]))
        with mock.patch('iris.fileformats.pp.load', new=load):
            cube = next(iris.fileformats.pp.load_cubes('DUMMY'))

        self._test_coord(cube, potm_value,
                         standard_name='air_potential_temperature')

        # Now use the save rules to convert the Cube back into a PPField.
        field = iris.fileformats.pp.PPField3()
        field.lbfc = 0
        field.lbvc = 0
        field = verify(cube, field)

        # Check the vertical coordinate is as originally specified.
        self.assertEqual(field.lbvc, 19)
        self.assertEqual(field.blev, potm_value)
Exemple #14
0
    def test_soil_depth_round_trip(self):
        # Use pp.load_cubes() to convert a fake PPField into a Cube.
        # NB. Use MagicMock so that SplittableInt header items, such as
        # LBCODE, support len().
        lower, point, upper = 1.2, 3.4, 5.6
        brsvd = [lower, 0, 0, 0]
        field = self._mock_field(lbvc=6,
                                 blev=point,
                                 brsvd=brsvd,
                                 brlev=upper,
                                 stash=iris.fileformats.pp.STASH(1, 0, 9))
        load = mock.Mock(return_value=iter([field]))
        with mock.patch('iris.fileformats.pp.load', new=load) as load:
            cube = next(iris.fileformats.pp.load_cubes('DUMMY'))

        self.assertIn('soil', cube.standard_name)
        self._test_coord(cube,
                         point,
                         bounds=[lower, upper],
                         standard_name='depth')

        # Now use the save rules to convert the Cube back into a PPField.
        field = iris.fileformats.pp.PPField3()
        field.lbfc = 0
        field.lbvc = 0
        field.brlev = None
        field.brsvd = [None] * 4
        field = verify(cube, field)

        # Check the vertical coordinate is as originally specified.
        self.assertEqual(field.lbvc, 6)
        self.assertEqual(field.blev, point)
        self.assertEqual(field.brsvd[0], lower)
        self.assertEqual(field.brlev, upper)
Exemple #15
0
    def test_soil_level_round_trip(self):
        # Use pp.load_cubes() to convert a fake PPField into a Cube.
        # NB. Use MagicMock so that SplittableInt header items, such as
        # LBCODE, support len().
        soil_level = 1234
        field = self._mock_field(lbvc=6,
                                 lblev=soil_level,
                                 stash=iris.fileformats.pp.STASH(1, 0, 9))
        load = mock.Mock(return_value=iter([field]))
        with mock.patch('iris.fileformats.pp.load', new=load) as load:
            cube = next(iris.fileformats.pp.load_cubes('DUMMY'))

        self.assertIn('soil', cube.standard_name)
        self._test_coord(cube, soil_level, long_name='soil_model_level_number')

        # Now use the save rules to convert the Cube back into a PPField.
        field = iris.fileformats.pp.PPField3()
        field.lbfc = 0
        field.lbvc = 0
        field.brsvd = [None] * 4
        field.brlev = None
        field = verify(cube, field)

        # Check the vertical coordinate is as originally specified.
        self.assertEqual(field.lbvc, 6)
        self.assertEqual(field.lblev, soil_level)
        self.assertEqual(field.blev, soil_level)
        self.assertEqual(field.brsvd[0], 0)
        self.assertEqual(field.brlev, 0)
Exemple #16
0
    def test_soil_depth_round_trip(self):
        # Use pp.load_cubes() to convert a fake PPField into a Cube.
        # NB. Use MagicMock so that SplittableInt header items, such as
        # LBCODE, support len().
        lower, point, upper = 1.2, 3.4, 5.6
        brsvd = [lower, 0, 0, 0]
        mock_data = np.zeros(1)
        mock_core_data = mock.MagicMock(return_value=mock_data)
        field = mock.MagicMock(lbvc=6, blev=point,
                               stash=iris.fileformats.pp.STASH(1, 0, 9),
                               lbuser=[0] * 7, lbrsvd=[0] * 4,
                               brsvd=brsvd, brlev=upper,
                               core_data=mock_core_data,
                               realised_dtype=mock_data.dtype)
        load = mock.Mock(return_value=iter([field]))
        with mock.patch('iris.fileformats.pp.load', new=load) as load:
            cube = next(iris.fileformats.pp.load_cubes('DUMMY'))

        self.assertIn('soil', cube.standard_name)
        self._test_coord(cube, point, bounds=[lower, upper],
                         standard_name='depth')

        # Now use the save rules to convert the Cube back into a PPField.
        field = iris.fileformats.pp.PPField3()
        field.lbfc = 0
        field.lbvc = 0
        field.brlev = None
        field.brsvd = [None] * 4
        field = verify(cube, field)

        # Check the vertical coordinate is as originally specified.
        self.assertEqual(field.lbvc, 6)
        self.assertEqual(field.blev, point)
        self.assertEqual(field.brsvd[0], lower)
        self.assertEqual(field.brlev, upper)
Exemple #17
0
    def test_hybrid_pressure_with_non_standard_coords(self):
        # Check the save rules are using the AuxFactory to find the
        # hybrid pressure coordinates and not relying on their names.
        ny, nx = 30, 40
        sigma_lower, sigma, sigma_upper = 0.75, 0.8, 0.75
        delta_lower, delta, delta_upper = 0.15, 0.2, 0.25

        cube = Cube(np.zeros((ny, nx)), 'air_temperature')
        level_coord = AuxCoord(0, 'model_level_number')
        cube.add_aux_coord(level_coord)
        delta_coord = AuxCoord(delta, bounds=[[delta_lower, delta_upper]],
                               long_name='moog', units='Pa')
        sigma_coord = AuxCoord(sigma, bounds=[[sigma_lower, sigma_upper]],
                               long_name='mavis')
        surface_air_pressure_coord = AuxCoord(np.zeros((ny, nx)),
                                              'surface_air_pressure',
                                              units='Pa')
        cube.add_aux_coord(delta_coord)
        cube.add_aux_coord(sigma_coord)
        cube.add_aux_coord(surface_air_pressure_coord, (0, 1))
        cube.add_aux_factory(HybridPressureFactory(
            delta_coord, sigma_coord, surface_air_pressure_coord))

        field = iris.fileformats.pp.PPField3()
        field.lbfc = 0
        field.lbvc = 0
        field.brsvd = [None, None]
        field.lbuser = [None] * 7
        field = verify(cube, field)

        self.assertEqual(field.bhlev, delta)
        self.assertEqual(field.bhrlev, delta_lower)
        self.assertEqual(field.blev, sigma)
        self.assertEqual(field.brlev, sigma_lower)
        self.assertEqual(field.brsvd, [sigma_upper, delta_upper])
Exemple #18
0
    def test_hybrid_pressure_with_non_standard_coords(self):
        # Check the save rules are using the AuxFactory to find the
        # hybrid pressure coordinates and not relying on their names.
        ny, nx = 30, 40
        sigma_lower, sigma, sigma_upper = 0.75, 0.8, 0.75
        delta_lower, delta, delta_upper = 0.15, 0.2, 0.25

        cube = Cube(np.zeros((ny, nx)), 'air_temperature')
        level_coord = AuxCoord(0, 'model_level_number')
        cube.add_aux_coord(level_coord)
        delta_coord = AuxCoord(delta, bounds=[[delta_lower, delta_upper]],
                               long_name='moog', units='Pa')
        sigma_coord = AuxCoord(sigma, bounds=[[sigma_lower, sigma_upper]],
                               long_name='mavis')
        surface_air_pressure_coord = AuxCoord(np.zeros((ny, nx)),
                                              'surface_air_pressure',
                                              units='Pa')
        cube.add_aux_coord(delta_coord)
        cube.add_aux_coord(sigma_coord)
        cube.add_aux_coord(surface_air_pressure_coord, (0, 1))
        cube.add_aux_factory(HybridPressureFactory(
            delta_coord, sigma_coord, surface_air_pressure_coord))

        field = iris.fileformats.pp.PPField3()
        field.lbfc = 0
        field.lbvc = 0
        field.brsvd = [None, None]
        field.lbuser = [None] * 7
        field = verify(cube, field)

        self.assertEqual(field.bhlev, delta)
        self.assertEqual(field.bhrlev, delta_lower)
        self.assertEqual(field.blev, sigma)
        self.assertEqual(field.brlev, sigma_lower)
        self.assertEqual(field.brsvd, [sigma_upper, delta_upper])
Exemple #19
0
 def convert_cube_to_field(self, cube):
     # Use the save rules to convert the Cube back into a PPField.
     field = iris.fileformats.pp.PPField3()
     field.lbfc = 0
     field.lbvc = 0
     field.lbtim = 0
     field = verify(cube, field)
     return field
Exemple #20
0
 def convert_cube_to_field(self, cube):
     # Use the save rules to convert the Cube back into a PPField.
     field = iris.fileformats.pp.PPField3()
     field.lbfc = 0
     field.lbvc = 0
     field.lbtim = 0
     field = verify(cube, field)
     return field
Exemple #21
0
    def test_hybrid_height_round_trip_no_reference(self):
        # Use pp.load_cubes() to convert fake PPFields into Cubes.
        # NB. Use MagicMock so that SplittableInt header items, such as
        # LBCODE, support len().
        # Make a fake data field which needs the reference surface.
        model_level = 5678
        sigma_lower, sigma, sigma_upper = 0.85, 0.9, 0.95
        delta_lower, delta, delta_upper = 0.05, 0.1, 0.15
        data_field = self._field_with_data(lbvc=65,
                                           lblev=model_level,
                                           bhlev=sigma,
                                           bhrlev=sigma_lower,
                                           blev=delta,
                                           brlev=delta_lower,
                                           brsvd=[delta_upper, sigma_upper])

        # Convert field to a cube.
        load = mock.Mock(return_value=iter([data_field]))
        with mock.patch('iris.fileformats.pp.load', new=load) as load, \
                mock.patch('warnings.warn') as warn:
            data_cube, = iris.fileformats.pp.load_cubes('DUMMY')

        msg = "Unable to create instance of HybridHeightFactory. " \
              "The source data contains no field(s) for 'orography'."
        warn.assert_called_once_with(msg)

        # Check the data cube is set up to use hybrid height.
        self._test_coord(data_cube,
                         model_level,
                         standard_name='model_level_number')
        self._test_coord(data_cube,
                         delta, [delta_lower, delta_upper],
                         long_name='level_height')
        self._test_coord(data_cube,
                         sigma, [sigma_lower, sigma_upper],
                         long_name='sigma')
        # Check that no aux factory is created (due to missing
        # reference surface).
        aux_factories = data_cube.aux_factories
        self.assertEqual(len(aux_factories), 0)

        # Now use the save rules to convert the Cube back into a PPField.
        data_field = iris.fileformats.pp.PPField3()
        data_field.lbfc = 0
        data_field.lbvc = 0
        data_field.brsvd = [None, None]
        data_field.lbuser = [None] * 7
        data_field = verify(data_cube, data_field)

        # Check the data field has the vertical coordinate as originally
        # specified.
        self.assertEqual(data_field.lbvc, 65)
        self.assertEqual(data_field.lblev, model_level)
        self.assertEqual(data_field.bhlev, sigma)
        self.assertEqual(data_field.bhrlev, sigma_lower)
        self.assertEqual(data_field.blev, delta)
        self.assertEqual(data_field.brlev, delta_lower)
        self.assertEqual(data_field.brsvd, [delta_upper, sigma_upper])
Exemple #22
0
    def test_hybrid_height_with_non_standard_coords(self):
        # Check the save rules are using the AuxFactory to find the
        # hybrid height coordinates and not relying on their names.
        ny, nx = 30, 40
        sigma_lower, sigma, sigma_upper = 0.75, 0.8, 0.75
        delta_lower, delta, delta_upper = 150, 200, 250

        cube = Cube(np.zeros((ny, nx)), "air_temperature")
        level_coord = AuxCoord(0, "model_level_number", units="1")
        cube.add_aux_coord(level_coord)
        delta_coord = AuxCoord(
            delta,
            bounds=[[delta_lower, delta_upper]],
            long_name="moog",
            units="m",
        )
        sigma_coord = AuxCoord(
            sigma,
            bounds=[[sigma_lower, sigma_upper]],
            long_name="mavis",
            units="1",
        )
        surface_altitude_coord = AuxCoord(
            np.zeros((ny, nx)), "surface_altitude", units="m"
        )
        cube.add_aux_coord(delta_coord)
        cube.add_aux_coord(sigma_coord)
        cube.add_aux_coord(surface_altitude_coord, (0, 1))
        cube.add_aux_factory(
            HybridHeightFactory(
                delta_coord, sigma_coord, surface_altitude_coord
            )
        )

        field = iris.fileformats.pp.PPField3()
        field.lbfc = 0
        field.lbvc = 0
        field.brsvd = [None, None]
        field.lbuser = [None] * 7
        field = verify(cube, field)

        self.assertEqual(field.blev, delta)
        self.assertEqual(field.brlev, delta_lower)
        self.assertEqual(field.bhlev, sigma)
        self.assertEqual(field.bhrlev, sigma_lower)
        self.assertEqual(field.brsvd, [delta_upper, sigma_upper])
Exemple #23
0
 def convert_cube_to_field(self, cube):
     field = iris.fileformats.pp.PPField3()
     field.lbvc = 0
     return verify(cube, field)
Exemple #24
0
    def test_hybrid_height_round_trip_no_reference(self):
        # Use pp.load_cubes() to convert fake PPFields into Cubes.
        # NB. Use MagicMock so that SplittableInt header items, such as
        # LBCODE, support len().
        def field_with_data(scale=1):
            x, y = 40, 30
            mock_data = np.arange(1200).reshape(y, x) * scale
            mock_core_data = mock.MagicMock(return_value=mock_data)
            field = mock.MagicMock(core_data=mock_core_data,
                                   realised_dtype=mock_data.dtype,
                                   lbcode=[1],
                                   lbnpt=x, lbrow=y, bzx=350, bdx=1.5,
                                   bzy=40, bdy=1.5, lbuser=[0] * 7,
                                   lbrsvd=[0] * 4)
            field._x_coord_name = lambda: 'longitude'
            field._y_coord_name = lambda: 'latitude'
            field.coord_system = lambda: None
            return field

        # Make a fake data field which needs the reference surface.
        model_level = 5678
        sigma_lower, sigma, sigma_upper = 0.85, 0.9, 0.95
        delta_lower, delta, delta_upper = 0.05, 0.1, 0.15
        data_field = field_with_data()
        data_field.configure_mock(lbvc=65, lblev=model_level,
                                  bhlev=sigma, bhrlev=sigma_lower,
                                  blev=delta, brlev=delta_lower,
                                  brsvd=[delta_upper, sigma_upper])

        # Convert field to a cube.
        load = mock.Mock(return_value=iter([data_field]))
        with mock.patch('iris.fileformats.pp.load', new=load) as load, \
                mock.patch('warnings.warn') as warn:
            data_cube, = iris.fileformats.pp.load_cubes('DUMMY')

        msg = "Unable to create instance of HybridHeightFactory. " \
              "The source data contains no field(s) for 'orography'."
        warn.assert_called_once_with(msg)

        # Check the data cube is set up to use hybrid height.
        self._test_coord(data_cube, model_level,
                         standard_name='model_level_number')
        self._test_coord(data_cube, delta, [delta_lower, delta_upper],
                         long_name='level_height')
        self._test_coord(data_cube, sigma, [sigma_lower, sigma_upper],
                         long_name='sigma')
        # Check that no aux factory is created (due to missing
        # reference surface).
        aux_factories = data_cube.aux_factories
        self.assertEqual(len(aux_factories), 0)

        # Now use the save rules to convert the Cube back into a PPField.
        data_field = iris.fileformats.pp.PPField3()
        data_field.lbfc = 0
        data_field.lbvc = 0
        data_field.brsvd = [None, None]
        data_field.lbuser = [None] * 7
        data_field = verify(data_cube, data_field)

        # Check the data field has the vertical coordinate as originally
        # specified.
        self.assertEqual(data_field.lbvc, 65)
        self.assertEqual(data_field.lblev, model_level)
        self.assertEqual(data_field.bhlev, sigma)
        self.assertEqual(data_field.bhrlev, sigma_lower)
        self.assertEqual(data_field.blev, delta)
        self.assertEqual(data_field.brlev, delta_lower)
        self.assertEqual(data_field.brsvd, [delta_upper, sigma_upper])
Exemple #25
0
    def test_hybrid_pressure_round_trip(self):
        # Use pp.load_cubes() to convert fake PPFields into Cubes.
        # NB. Use MagicMock so that SplittableInt header items, such as
        # LBCODE, support len().
        def field_with_data(scale=1):
            x, y = 40, 30
            mock_data = np.arange(1200).reshape(y, x) * scale
            mock_core_data = mock.MagicMock(return_value=mock_data)
            field = mock.MagicMock(core_data=mock_core_data,
                                   realised_dtype=mock_data.dtype,
                                   lbcode=[1],
                                   lbnpt=x, lbrow=y, bzx=350, bdx=1.5,
                                   bzy=40, bdy=1.5, lbuser=[0] * 7,
                                   lbrsvd=[0] * 4)

            field._x_coord_name = lambda: 'longitude'
            field._y_coord_name = lambda: 'latitude'
            field.coord_system = lambda: None
            return field

        # Make a fake reference surface field.
        pressure_field = field_with_data(10)
        pressure_field.stash = iris.fileformats.pp.STASH(1, 0, 409)
        pressure_field.lbuser[3] = 409

        # Make a fake data field which needs the reference surface.
        model_level = 5678
        sigma_lower, sigma, sigma_upper = 0.85, 0.9, 0.95
        delta_lower, delta, delta_upper = 0.05, 0.1, 0.15
        data_field = field_with_data()
        data_field.configure_mock(lbvc=9, lblev=model_level,
                                  bhlev=delta, bhrlev=delta_lower,
                                  blev=sigma, brlev=sigma_lower,
                                  brsvd=[sigma_upper, delta_upper])

        # Convert both fields to cubes.
        load = mock.Mock(return_value=iter([pressure_field, data_field]))
        with mock.patch('iris.fileformats.pp.load', new=load) as load:
            pressure_cube, data_cube = iris.fileformats.pp.load_cubes('DUMMY')

        # Check the reference surface cube looks OK.
        self.assertEqual(pressure_cube.standard_name, 'surface_air_pressure')
        self.assertEqual(pressure_cube.units, 'Pa')

        # Check the data cube is set up to use hybrid-pressure.
        self._test_coord(data_cube, model_level,
                         standard_name='model_level_number')
        self._test_coord(data_cube, delta, [delta_lower, delta_upper],
                         long_name='level_pressure')
        self._test_coord(data_cube, sigma, [sigma_lower, sigma_upper],
                         long_name='sigma')
        aux_factories = data_cube.aux_factories
        self.assertEqual(len(aux_factories), 1)
        surface_coord = aux_factories[0].dependencies['surface_air_pressure']
        self.assertArrayEqual(surface_coord.points,
                              np.arange(12000, step=10).reshape(30, 40))

        # Now use the save rules to convert the Cubes back into PPFields.
        pressure_field = iris.fileformats.pp.PPField3()
        pressure_field.lbfc = 0
        pressure_field.lbvc = 0
        pressure_field.brsvd = [None, None]
        pressure_field.lbuser = [None] * 7
        pressure_field = verify(pressure_cube, pressure_field)

        data_field = iris.fileformats.pp.PPField3()
        data_field.lbfc = 0
        data_field.lbvc = 0
        data_field.brsvd = [None, None]
        data_field.lbuser = [None] * 7
        data_field = verify(data_cube, data_field)

        # The reference surface field should have STASH=409
        self.assertArrayEqual(pressure_field.lbuser,
                              [None, None, None, 409, None, None, 1])

        # Check the data field has the vertical coordinate as originally
        # specified.
        self.assertEqual(data_field.lbvc, 9)
        self.assertEqual(data_field.lblev, model_level)
        self.assertEqual(data_field.bhlev, delta)
        self.assertEqual(data_field.bhrlev, delta_lower)
        self.assertEqual(data_field.blev, sigma)
        self.assertEqual(data_field.brlev, sigma_lower)
        self.assertEqual(data_field.brsvd, [sigma_upper, delta_upper])
Exemple #26
0
 def convert_cube_to_field(self, cube):
     field = iris.fileformats.pp.PPField3()
     field.lbvc = 0
     return verify(cube, field)
Exemple #27
0
    def test_hybrid_pressure_round_trip(self):
        # Use pp.load_cubes() to convert fake PPFields into Cubes.
        # NB. Use MagicMock so that SplittableInt header items, such as
        # LBCODE, support len().

        # Make a fake reference surface field.
        pressure_field = self._field_with_data(10,
                                               stash=iris.fileformats.pp.STASH(
                                                   1, 0, 409),
                                               lbuser=[0, 0, 0, 409, 0, 0, 0])

        # Make a fake data field which needs the reference surface.
        model_level = 5678
        sigma_lower, sigma, sigma_upper = 0.85, 0.9, 0.95
        delta_lower, delta, delta_upper = 0.05, 0.1, 0.15
        data_field = self._field_with_data(lbvc=9,
                                           lblev=model_level,
                                           bhlev=delta,
                                           bhrlev=delta_lower,
                                           blev=sigma,
                                           brlev=sigma_lower,
                                           brsvd=[sigma_upper, delta_upper])

        # Convert both fields to cubes.
        load = mock.Mock(return_value=iter([pressure_field, data_field]))
        with mock.patch('iris.fileformats.pp.load', new=load) as load:
            pressure_cube, data_cube = iris.fileformats.pp.load_cubes('DUMMY')

        # Check the reference surface cube looks OK.
        self.assertEqual(pressure_cube.standard_name, 'surface_air_pressure')
        self.assertEqual(pressure_cube.units, 'Pa')

        # Check the data cube is set up to use hybrid-pressure.
        self._test_coord(data_cube,
                         model_level,
                         standard_name='model_level_number')
        self._test_coord(data_cube,
                         delta, [delta_lower, delta_upper],
                         long_name='level_pressure')
        self._test_coord(data_cube,
                         sigma, [sigma_lower, sigma_upper],
                         long_name='sigma')
        aux_factories = data_cube.aux_factories
        self.assertEqual(len(aux_factories), 1)
        surface_coord = aux_factories[0].dependencies['surface_air_pressure']
        self.assertArrayEqual(surface_coord.points,
                              np.arange(12000, step=10).reshape(30, 40))

        # Now use the save rules to convert the Cubes back into PPFields.
        pressure_field = iris.fileformats.pp.PPField3()
        pressure_field.lbfc = 0
        pressure_field.lbvc = 0
        pressure_field.brsvd = [None, None]
        pressure_field.lbuser = [None] * 7
        pressure_field = verify(pressure_cube, pressure_field)

        data_field = iris.fileformats.pp.PPField3()
        data_field.lbfc = 0
        data_field.lbvc = 0
        data_field.brsvd = [None, None]
        data_field.lbuser = [None] * 7
        data_field = verify(data_cube, data_field)

        # The reference surface field should have STASH=409
        self.assertArrayEqual(pressure_field.lbuser,
                              [None, None, None, 409, None, None, 1])

        # Check the data field has the vertical coordinate as originally
        # specified.
        self.assertEqual(data_field.lbvc, 9)
        self.assertEqual(data_field.lblev, model_level)
        self.assertEqual(data_field.bhlev, delta)
        self.assertEqual(data_field.bhrlev, delta_lower)
        self.assertEqual(data_field.blev, sigma)
        self.assertEqual(data_field.brlev, sigma_lower)
        self.assertEqual(data_field.brsvd, [sigma_upper, delta_upper])