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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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])
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])
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
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
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])
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])
def convert_cube_to_field(self, cube): field = iris.fileformats.pp.PPField3() field.lbvc = 0 return verify(cube, field)
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])
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])
def convert_cube_to_field(self, cube): field = iris.fileformats.pp.PPField3() field.lbvc = 0 return verify(cube, field)
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])