From 923dd257bce0824cabf225d2c4d8a8c74259e0a2 Mon Sep 17 00:00:00 2001 From: ecamp Date: Thu, 9 Aug 2012 19:07:27 +0100 Subject: [PATCH 1/4] Deprecation of Coord.cos() and Coord.sin(). Equivalent private functions added to calculus.py where they are used. --- .../analysis/calculus/cos_simple.xml | 2 + .../analysis/calculus/cos_simple_radians.xml | 2 + lib/iris/analysis/calculus.py | 71 +++++++++++--- lib/iris/analysis/maths.py | 11 +-- lib/iris/coords.py | 37 ++------ lib/iris_tests/test_analysis_calculus.py | 94 ++++++++++++++----- lib/iris_tests/test_coord_api.py | 5 +- 7 files changed, 151 insertions(+), 71 deletions(-) create mode 100644 etc/iris_tests_results/analysis/calculus/cos_simple.xml create mode 100644 etc/iris_tests_results/analysis/calculus/cos_simple_radians.xml diff --git a/etc/iris_tests_results/analysis/calculus/cos_simple.xml b/etc/iris_tests_results/analysis/calculus/cos_simple.xml new file mode 100644 index 0000000000..c03fc7b1d4 --- /dev/null +++ b/etc/iris_tests_results/analysis/calculus/cos_simple.xml @@ -0,0 +1,2 @@ + + diff --git a/etc/iris_tests_results/analysis/calculus/cos_simple_radians.xml b/etc/iris_tests_results/analysis/calculus/cos_simple_radians.xml new file mode 100644 index 0000000000..c03fc7b1d4 --- /dev/null +++ b/etc/iris_tests_results/analysis/calculus/cos_simple_radians.xml @@ -0,0 +1,2 @@ + + diff --git a/lib/iris/analysis/calculus.py b/lib/iris/analysis/calculus.py index a4b2504c9c..8b4decb843 100644 --- a/lib/iris/analysis/calculus.py +++ b/lib/iris/analysis/calculus.py @@ -342,6 +342,58 @@ def coord_func(coord): return result +def _coord_sin(coord): + """ + Return a coordinate which represents sin(coord). + + Args: + + * coord + Coord instance with values in either degrees or radians + + """ + return _trig_method(coord, numpy.sin) + + +def _coord_cos(coord): + """ + Return a coordinate which represents cos(coord). + + Args: + + * coord + Coord instance with values in either degrees or radians + + """ + return _trig_method(coord, numpy.cos) + + +def _trig_method(coord, trig_function): + """ + Return a coordinate which represents trig_function(coord). + + Args: + + * coord + Coord instance with points values in either degrees or radians + * trig_function + Reference to a trigonometric function e.g. numpy.sin + + """ + # If we are in degrees convert our coordinate to radians. + if coord.units == 'degrees': + coord = coord.unit_converted('radians') + + trig_coord = iris.coords.AuxCoord.from_coord(coord) + trig_coord.points = trig_function(coord.points) + if coord.has_bounds(): + trig_coord.bounds = trig_function(coord.bounds) + trig_coord.units = '1' + trig_coord.rename('{}({})'.format(trig_function.__name__, coord.name())) + + return trig_coord + + def curl(i_cube, j_cube, k_cube=None, ignore=None, update_history=True): r''' Calculate the 3d curl of the given vector of cubes. @@ -485,13 +537,10 @@ def curl(i_cube, j_cube, k_cube=None, ignore=None, update_history=True): if y_coord.name() != 'latitude' or x_coord.name() != 'longitude': raise ValueError('Expecting latitude as the y coord and longitude as the x coord for spherical curl.') - lat_coord = y_coord.unit_converted('radians') - # TODO: Can the use of lat_coord.cos() be replaced with lat_coord.nd_points.cos()? - # Then we can get rid of Coord.sin() and Coord.cos(). - lat_cos_coord = lat_coord.cos() - lon_coord = x_coord.unit_converted('radians') - + lat_coord = y_coord.unit_converted('radians') + lat_cos_coord = _coord_cos(lat_coord) + # TODO Implement some mechanism for conforming to a common grid temp = iris.analysis.maths.multiply(i_cube, lat_cos_coord, y_dim) dicos_dtheta = _curl_differentiate(temp, lat_coord) @@ -499,15 +548,11 @@ def curl(i_cube, j_cube, k_cube=None, ignore=None, update_history=True): # r curl component: 1/ ( r * cos(lat) ) * ( dicos_dtheta - d_j_cube_dphi ) # Since prototype_diff == dicos_dtheta we don't need to recalculate dicos_dtheta -# dicos_dtheta = _curl_differentiate(i_cube * lat_cos_coord, lat_coord) -# prototype_diff = dicos_dtheta -# dicos_dtheta = _curl_regrid(dicos_dtheta, prototype_diff) d_j_cube_dphi = _curl_differentiate(j_cube, lon_coord) d_j_cube_dphi = _curl_regrid(d_j_cube_dphi, prototype_diff) - - new_lat_cos_coord = d_j_cube_dphi.coord(name='latitude').cos() - lat_dim = d_j_cube_dphi.coord_dims(d_j_cube_dphi.coord(name='latitude'))[0] - + new_lat_coord = d_j_cube_dphi.coord(name='latitude') + new_lat_cos_coord = _coord_cos(new_lat_coord) + lat_dim = d_j_cube_dphi.coord_dims(new_lat_coord)[0] r_cmpt = iris.analysis.maths.divide(_curl_subtract(dicos_dtheta, d_j_cube_dphi), r * new_lat_cos_coord, dim=lat_dim) r_cmpt.units = r_cmpt.units / r_unit d_j_cube_dphi = dicos_dtheta = None diff --git a/lib/iris/analysis/maths.py b/lib/iris/analysis/maths.py index b537f89632..efc9c135dc 100644 --- a/lib/iris/analysis/maths.py +++ b/lib/iris/analysis/maths.py @@ -25,10 +25,9 @@ import numpy import iris.analysis -import iris.exceptions import iris.coords import iris.cube -from iris.analysis import coord_comparison +import iris.exceptions def abs(cube, update_history=True, in_place=False): @@ -273,9 +272,9 @@ def _add_subtract_common(operation_function, operation_symbol, operation_noun, o # Deal with cube addition/subtraction by cube # get a coordinate comparison of this cube and the cube to do the operation with - coord_comparison = iris.analysis.coord_comparison(cube, other) + coord_comp = iris.analysis.coord_comparison(cube, other) - if coord_comparison['transposable']: + if coord_comp['transposable']: raise ValueError('Cubes cannot be %s, differing axes. ' 'cube.transpose() may be required to re-order the axes.' % operation_past_tense) @@ -284,7 +283,7 @@ def _add_subtract_common(operation_function, operation_symbol, operation_noun, o warnings.warn('The "ignore" keyword has been deprecated in add/subtract. This functionality is now automatic. ' 'The provided value to "ignore" has been ignored, and has been automatically calculated.') - bad_coord_grps = (coord_comparison['ungroupable_and_dimensioned'] + coord_comparison['resamplable']) + bad_coord_grps = (coord_comp['ungroupable_and_dimensioned'] + coord_comp['resamplable']) if bad_coord_grps: raise ValueError('This operation cannot be performed as there are differing coordinates (%s) remaining ' 'which cannot be ignored.' % ', '.join({coord_grp.name() for coord_grp in bad_coord_grps})) @@ -296,7 +295,7 @@ def _add_subtract_common(operation_function, operation_symbol, operation_noun, o new_cube = cube.copy(data=operation_function(cube.data, other.data)) # If a coordinate is to be ignored - remove it - ignore = filter(None, [coord_grp[0] for coord_grp in coord_comparison['ignorable']]) + ignore = filter(None, [coord_grp[0] for coord_grp in coord_comp['ignorable']]) if not ignore: ignore_string = '' else: diff --git a/lib/iris/coords.py b/lib/iris/coords.py index 34680a5478..a19eea40b9 100644 --- a/lib/iris/coords.py +++ b/lib/iris/coords.py @@ -30,6 +30,7 @@ import numpy +import iris.analysis.calculus import iris.analysis.interpolate import iris.aux_factory import iris.exceptions @@ -781,43 +782,23 @@ def sin(self): """ Return a coordinate which represents sin(this coordinate). - .. note:: If coordinate is in degrees then it is converted into radians - before applying the sin() function. + .. deprecated:: + This method has been deprecated. """ - return self._trig_method(numpy.sin) + warnings.warn('Coord.sin() has been deprecated.') + return iris.analysis.calculus._coord_sin(self) def cos(self): """ Return a coordinate which represents cos(this coordinate). - .. note:: If coordinate is in degrees then it is converted into radians - before applying the cos() function. + .. deprecated:: + This method has been deprecated. """ - return self._trig_method(numpy.cos) - - def _trig_method(self, trig_function): - """ - Return a coordinate which represents trig_function(this coordinate). - - trig_function - a reference to the appropriate function (e.g. numpy.sin) - - """ - # If we are in degrees convert our coordinate to radians. - if self.units == 'degrees': - coord = self.unit_converted('radians') - else: - coord = self - - points = trig_function(coord.points) - bounds = trig_function(coord.bounds) if coord.bounds is not None else None - - # TODO: Does this imply AuxCoord should be a superclass of DimCoord? - coord = iris.coords.AuxCoord.from_coord(coord).copy(points=points, bounds=bounds) - coord.units = '1' - coord.rename('%s(%s)' % (trig_function.__name__, coord.name())) - return coord + warnings.warn('Coord.cos() has been deprecated.') + return iris.analysis.calculus._coord_cos(self) def unit_converted(self, new_unit): """Return a coordinate converted to a given unit.""" diff --git a/lib/iris_tests/test_analysis_calculus.py b/lib/iris_tests/test_analysis_calculus.py index 52ad5b9bc4..2c2e5ad816 100644 --- a/lib/iris_tests/test_analysis_calculus.py +++ b/lib/iris_tests/test_analysis_calculus.py @@ -42,7 +42,7 @@ def test_invalid(self): t = iris.analysis.calculus.cube_delta(cube, 'altitude') with self.assertRaises(ValueError): t = iris.analysis.calculus.cube_delta(cube, 'forecast_period') - + class TestDeltaAndMidpoint(tests.IrisTest): def _simple_filename(self, suffix): @@ -137,6 +137,49 @@ def test_singular_midpoint(self): iris.analysis.calculus._construct_midpoint_coord(lon) +class TestCoordTrig(tests.IrisTest): + def setUp(self): + points = numpy.arange(20, dtype=numpy.float32) * 2.3 + bounds = numpy.concatenate([[points - 0.5 * 2.3], + [points + 0.5 * 2.3]]).T + self.lat = iris.coords.AuxCoord(points, 'latitude', units='degrees', bounds=bounds) + self.rlat = iris.coords.AuxCoord(numpy.deg2rad(points), 'latitude', units='radians', bounds=numpy.deg2rad(bounds)) + + def test_sin(self): + sin_of_coord = iris.analysis.calculus._coord_sin(self.lat) + sin_of_coord_radians = iris.analysis.calculus._coord_sin(self.rlat) + + # Check the values are correct (within a tolerance) + numpy.testing.assert_array_almost_equal(numpy.sin(self.rlat.points), sin_of_coord.points) + numpy.testing.assert_array_almost_equal(numpy.sin(self.rlat.bounds), sin_of_coord.bounds) + + # Check that the results of the sin function are almost equal when operating on a coord with degrees and radians + numpy.testing.assert_array_almost_equal(sin_of_coord.points, sin_of_coord_radians.points) + numpy.testing.assert_array_almost_equal(sin_of_coord.bounds, sin_of_coord_radians.bounds) + + self.assertEqual(sin_of_coord.name(), 'sin(latitude)') + self.assertEqual(sin_of_coord.units, '1') + + def test_cos(self): + cos_of_coord = iris.analysis.calculus._coord_cos(self.lat) + cos_of_coord_radians = iris.analysis.calculus._coord_cos(self.rlat) + + # Check the values are correct (within a tolerance) + numpy.testing.assert_array_almost_equal(numpy.cos(self.rlat.points), cos_of_coord.points) + numpy.testing.assert_array_almost_equal(numpy.cos(self.rlat.bounds), cos_of_coord.bounds) + + # Check that the results of the cos function are almost equal when operating on a coord with degrees and radians + numpy.testing.assert_array_almost_equal(cos_of_coord.points, cos_of_coord_radians.points) + numpy.testing.assert_array_almost_equal(cos_of_coord.bounds, cos_of_coord_radians.bounds) + + # Now that we have tested the points & bounds, remove them and just test the xml + cos_of_coord = cos_of_coord.copy(points=numpy.array([1], dtype=numpy.float32)) + cos_of_coord_radians = cos_of_coord_radians.copy(points=numpy.array([1], dtype=numpy.float32)) + + self.assertXMLElement(cos_of_coord, ('analysis', 'calculus', 'cos_simple.xml')) + self.assertXMLElement(cos_of_coord_radians, ('analysis', 'calculus', 'cos_simple_radians.xml')) + + class TestCalculusSimple3(tests.IrisTest): def setUp(self): @@ -310,13 +353,17 @@ def test_contrived_differential1(self): y = cube.coord('latitude') y_dim = cube.coord_dims(y)[0] - cos_x_pts = x.cos().points.reshape(1, x.shape[0]) - cos_y_pts = y.cos().points.reshape(y.shape[0], 1) + cos_x_pts = numpy.cos(numpy.radians(x.points)).reshape(1, x.shape[0]) + cos_y_pts = numpy.cos(numpy.radians(y.points)).reshape(y.shape[0], 1) cube.data = cos_y_pts * cos_x_pts lon_coord = x.unit_converted('radians') - cos_lat_coord = y.cos() + lat_coord = y.unit_converted('radians') + cos_lat_coord = iris.coords.AuxCoord.from_coord(lat_coord) + cos_lat_coord.points = numpy.cos(lat_coord.points) + cos_lat_coord.units = '1' + cos_lat_coord.rename('cos({})'.format(lat_coord.name())) temp = iris.analysis.calculus.differentiate(cube, lon_coord) df_dlon = iris.analysis.maths.divide(temp, cos_lat_coord, y_dim) @@ -324,7 +371,7 @@ def test_contrived_differential1(self): x = df_dlon.coord('longitude') y = df_dlon.coord('latitude') - sin_x_pts = x.sin().points.reshape(1, x.shape[0]) + sin_x_pts = numpy.sin(numpy.radians(x.points)).reshape(1, x.shape[0]) y_ones = numpy.ones((y.shape[0] , 1)) data = - sin_x_pts * y_ones @@ -349,7 +396,7 @@ def test_contrived_differential2(self): numpy.testing.assert_array_almost_equal(result.data, r.data, decimal=6) - def test_contrived_non_sphrical_curl1(self): + def test_contrived_non_spherical_curl1(self): # testing : # F(x, y, z) = (y, 0, 0) # curl( F(x, y, z) ) = (0, 0, -1) @@ -370,7 +417,7 @@ def test_contrived_non_sphrical_curl1(self): self.assertEqual(r[1], None) self.assertCML(r[2], ('analysis', 'calculus', 'grad_contrived_non_spherical1.cml')) - def test_contrived_non_sphrical_curl2(self): + def test_contrived_non_spherical_curl2(self): # testing : # F(x, y, z) = (z^3, x+2, y^2) # curl( F(x, y, z) ) = (2y, 3z^2, 1) @@ -409,7 +456,7 @@ def test_contrived_non_sphrical_curl2(self): self.assertCML(r, ('analysis', 'calculus', 'curl_contrived_cartesian2.cml'), checksum=False) - def test_contrived_sphrical_curl1(self): + def test_contrived_spherical_curl1(self): # testing: # F(lon, lat, r) = (- r sin(lon), -r cos(lon) sin(lat), 0) # curl( F(x, y, z) ) = (0, 0, 0) @@ -419,10 +466,10 @@ def test_contrived_sphrical_curl1(self): x = cube.coord('longitude') y = cube.coord('latitude') - cos_x_pts = x.cos().points.reshape(1, x.shape[0]) - sin_x_pts = x.sin().points.reshape(1, x.shape[0]) - cos_y_pts = y.cos().points.reshape(y.shape[0], 1) - sin_y_pts = y.sin().points.reshape(y.shape[0], 1) + cos_x_pts = numpy.cos(numpy.radians(x.points)).reshape(1, x.shape[0]) + sin_x_pts = numpy.sin(numpy.radians(x.points)).reshape(1, x.shape[0]) + cos_y_pts = numpy.cos(numpy.radians(y.points)).reshape(y.shape[0], 1) + sin_y_pts = numpy.sin(numpy.radians(y.points)).reshape(y.shape[0], 1) y_ones = numpy.ones((cube.shape[0], 1)) u = cube.copy(data=-sin_x_pts * y_ones * radius) @@ -430,9 +477,6 @@ def test_contrived_sphrical_curl1(self): u.rename('u_wind') v.rename('v_wind') -# lon_coord = x.unit_converted('radians') -# cos_lat_coord = y.cos() - r = iris.analysis.calculus.curl(u, v)[2] result = r.copy(data=r.data * 0) @@ -450,10 +494,10 @@ def test_contrived_sphrical_curl2(self): x = cube.coord('longitude') y = cube.coord('latitude') - cos_x_pts = x.cos().points.reshape(1, x.shape[0]) - sin_x_pts = x.sin().points.reshape(1, x.shape[0]) - cos_y_pts = y.cos().points.reshape(y.shape[0], 1) - sin_y_pts = y.sin().points.reshape(y.shape[0], 1) + cos_x_pts = numpy.cos(numpy.radians(x.points)).reshape(1, x.shape[0]) + sin_x_pts = numpy.sin(numpy.radians(x.points)).reshape(1, x.shape[0]) + cos_y_pts = numpy.cos(numpy.radians(y.points)).reshape(y.shape[0], 1) + sin_y_pts = numpy.sin(numpy.radians(y.points)).reshape(y.shape[0], 1) y_ones = numpy.ones((cube.shape[0] , 1)) u = cube.copy(data=sin_y_pts * cos_x_pts * radius) @@ -462,15 +506,19 @@ def test_contrived_sphrical_curl2(self): v.rename('v_wind') lon_coord = x.unit_converted('radians') - cos_lat_coord = y.cos() - + lat_coord = y.unit_converted('radians') + cos_lat_coord = iris.coords.AuxCoord.from_coord(lat_coord) + cos_lat_coord.points = numpy.cos(lat_coord.points) + cos_lat_coord.units = '1' + cos_lat_coord.rename('cos({})'.format(lat_coord.name())) + r = iris.analysis.calculus.curl(u, v)[2] x = r.coord('longitude') y = r.coord('latitude') - cos_x_pts = x.cos().points.reshape(1, x.shape[0]) - cos_y_pts = y.cos().points.reshape(y.shape[0], 1) + cos_x_pts = numpy.cos(numpy.radians(x.points)).reshape(1, x.shape[0]) + cos_y_pts = numpy.cos(numpy.radians(y.points)).reshape(y.shape[0], 1) result = r.copy(data=2*cos_x_pts*cos_y_pts) diff --git a/lib/iris_tests/test_coord_api.py b/lib/iris_tests/test_coord_api.py index bf488cfe21..fd63ed73bd 100644 --- a/lib/iris_tests/test_coord_api.py +++ b/lib/iris_tests/test_coord_api.py @@ -438,7 +438,10 @@ def setUp(self): self.count = 20 self._build_coord() - + +# TODO - Remove this test class and results files when Coord.cos() and Coord.sin() are removed. +# This class tests two deprecated Coord methods. These methods are now private functions in +# analysis/calculus.py and corresponding tests are in test_analysis_calculus.py. class TestCoordTrig(TestCoordMaths): def test_sin(self): sin_of_coord = self.lon.sin() From 71dbaa47fddb16b41ea343d44d9813e404fca12f Mon Sep 17 00:00:00 2001 From: bblay Date: Thu, 16 Aug 2012 18:40:44 +0100 Subject: [PATCH 2/4] CF coord systems (without results) --- .../graphics/custom_file_loading.py | 5 +- .../coord_systems/CoordSystem_xml_element.xml | 2 + .../GeogCS_init_all_ellipsoid.xml | 2 + .../coord_systems/GeogCS_init_no_invf.xml | 2 + .../coord_systems/GeogCS_init_no_major.xml | 2 + .../coord_systems/GeogCS_init_no_minor.xml | 2 + .../coord_systems/GeogCS_init_no_param.xml | 2 + .../coord_systems/GeogCS_init_sphere.xml | 2 + .../RotatedGeogCS_from_geocs.xml | 2 + .../coord_systems/RotatedGeogCS_init.xml | 2 + .../coord_systems/TransverseMercator_osgb.xml | 2 + lib/iris/analysis/calculus.py | 30 +- lib/iris/analysis/cartography.py | 22 +- lib/iris/analysis/interpolate.py | 12 +- lib/iris/coord_systems.py | 537 +++++++++--------- lib/iris/coords.py | 2 +- lib/iris/cube.py | 6 +- lib/iris/etc/grib_rules.txt | 16 +- lib/iris/etc/pp_rules.txt | 18 +- lib/iris/etc/pp_save_rules.txt | 16 +- .../fileformats/_pyke_rules/fc_rules_cf.krb | 32 +- lib/iris/fileformats/grib.py | 52 +- lib/iris/fileformats/grib_save_rules.py | 26 +- lib/iris/fileformats/netcdf.py | 28 +- lib/iris/fileformats/pp.py | 27 +- lib/iris_tests/stock.py | 15 +- lib/iris_tests/system_test.py | 6 +- lib/iris_tests/test_aggregate_by.py | 8 +- lib/iris_tests/test_analysis.py | 10 +- lib/iris_tests/test_analysis_calculus.py | 12 +- lib/iris_tests/test_cdm.py | 9 - lib/iris_tests/test_coord_api.py | 12 +- lib/iris_tests/test_coordsystem.py | 125 +++- lib/iris_tests/test_cube_to_pp.py | 18 +- lib/iris_tests/test_grib_save.py | 2 +- lib/iris_tests/test_intersect.py | 6 +- lib/iris_tests/test_mapping.py | 13 +- lib/iris_tests/test_merge.py | 1 - lib/iris_tests/test_pp_cf.py | 5 +- lib/iris_tests/test_regrid.py | 10 +- lib/iris_tests/test_xml.py | 5 +- 41 files changed, 614 insertions(+), 492 deletions(-) create mode 100644 etc/iris_tests_results/coord_systems/CoordSystem_xml_element.xml create mode 100644 etc/iris_tests_results/coord_systems/GeogCS_init_all_ellipsoid.xml create mode 100644 etc/iris_tests_results/coord_systems/GeogCS_init_no_invf.xml create mode 100644 etc/iris_tests_results/coord_systems/GeogCS_init_no_major.xml create mode 100644 etc/iris_tests_results/coord_systems/GeogCS_init_no_minor.xml create mode 100644 etc/iris_tests_results/coord_systems/GeogCS_init_no_param.xml create mode 100644 etc/iris_tests_results/coord_systems/GeogCS_init_sphere.xml create mode 100644 etc/iris_tests_results/coord_systems/RotatedGeogCS_from_geocs.xml create mode 100644 etc/iris_tests_results/coord_systems/RotatedGeogCS_init.xml create mode 100644 etc/iris_tests_results/coord_systems/TransverseMercator_osgb.xml diff --git a/docs/iris/example_code/graphics/custom_file_loading.py b/docs/iris/example_code/graphics/custom_file_loading.py index aac3efab23..977156671e 100644 --- a/docs/iris/example_code/graphics/custom_file_loading.py +++ b/docs/iris/example_code/graphics/custom_file_loading.py @@ -164,10 +164,7 @@ def NAME_to_cube(filenames, callback): cube.add_aux_coord(time_coord) # build a coordinate system which can be referenced by latitude and longitude coordinates - lat_lon_coord_system = icoord_systems.LatLonCS( icoord_systems.SpheroidDatum("spherical", 6371229.0, flattening=0.0, units='m'), - icoord_systems.PrimeMeridian(label="Greenwich", value=0.0), - n_pole=icoord_systems.GeoPosition(90, 0), reference_longitude=0.0 - ) + lat_lon_coord_system = icoord_systems.GeogCS(6371229.0, units='m') # build regular latitude and longitude coordinates which have bounds start = header['X grid origin'] + header['X grid resolution'] diff --git a/etc/iris_tests_results/coord_systems/CoordSystem_xml_element.xml b/etc/iris_tests_results/coord_systems/CoordSystem_xml_element.xml new file mode 100644 index 0000000000..4e7dc4ea81 --- /dev/null +++ b/etc/iris_tests_results/coord_systems/CoordSystem_xml_element.xml @@ -0,0 +1,2 @@ + + diff --git a/etc/iris_tests_results/coord_systems/GeogCS_init_all_ellipsoid.xml b/etc/iris_tests_results/coord_systems/GeogCS_init_all_ellipsoid.xml new file mode 100644 index 0000000000..3dff789574 --- /dev/null +++ b/etc/iris_tests_results/coord_systems/GeogCS_init_all_ellipsoid.xml @@ -0,0 +1,2 @@ + + diff --git a/etc/iris_tests_results/coord_systems/GeogCS_init_no_invf.xml b/etc/iris_tests_results/coord_systems/GeogCS_init_no_invf.xml new file mode 100644 index 0000000000..3dff789574 --- /dev/null +++ b/etc/iris_tests_results/coord_systems/GeogCS_init_no_invf.xml @@ -0,0 +1,2 @@ + + diff --git a/etc/iris_tests_results/coord_systems/GeogCS_init_no_major.xml b/etc/iris_tests_results/coord_systems/GeogCS_init_no_major.xml new file mode 100644 index 0000000000..3dff789574 --- /dev/null +++ b/etc/iris_tests_results/coord_systems/GeogCS_init_no_major.xml @@ -0,0 +1,2 @@ + + diff --git a/etc/iris_tests_results/coord_systems/GeogCS_init_no_minor.xml b/etc/iris_tests_results/coord_systems/GeogCS_init_no_minor.xml new file mode 100644 index 0000000000..3dff789574 --- /dev/null +++ b/etc/iris_tests_results/coord_systems/GeogCS_init_no_minor.xml @@ -0,0 +1,2 @@ + + diff --git a/etc/iris_tests_results/coord_systems/GeogCS_init_no_param.xml b/etc/iris_tests_results/coord_systems/GeogCS_init_no_param.xml new file mode 100644 index 0000000000..ea44f16b18 --- /dev/null +++ b/etc/iris_tests_results/coord_systems/GeogCS_init_no_param.xml @@ -0,0 +1,2 @@ + + diff --git a/etc/iris_tests_results/coord_systems/GeogCS_init_sphere.xml b/etc/iris_tests_results/coord_systems/GeogCS_init_sphere.xml new file mode 100644 index 0000000000..a9422c3c4b --- /dev/null +++ b/etc/iris_tests_results/coord_systems/GeogCS_init_sphere.xml @@ -0,0 +1,2 @@ + + diff --git a/etc/iris_tests_results/coord_systems/RotatedGeogCS_from_geocs.xml b/etc/iris_tests_results/coord_systems/RotatedGeogCS_from_geocs.xml new file mode 100644 index 0000000000..4e7dc4ea81 --- /dev/null +++ b/etc/iris_tests_results/coord_systems/RotatedGeogCS_from_geocs.xml @@ -0,0 +1,2 @@ + + diff --git a/etc/iris_tests_results/coord_systems/RotatedGeogCS_init.xml b/etc/iris_tests_results/coord_systems/RotatedGeogCS_init.xml new file mode 100644 index 0000000000..a1b2ed871b --- /dev/null +++ b/etc/iris_tests_results/coord_systems/RotatedGeogCS_init.xml @@ -0,0 +1,2 @@ + + diff --git a/etc/iris_tests_results/coord_systems/TransverseMercator_osgb.xml b/etc/iris_tests_results/coord_systems/TransverseMercator_osgb.xml new file mode 100644 index 0000000000..723a45679a --- /dev/null +++ b/etc/iris_tests_results/coord_systems/TransverseMercator_osgb.xml @@ -0,0 +1,2 @@ + + diff --git a/lib/iris/analysis/calculus.py b/lib/iris/analysis/calculus.py index 8b4decb843..1053bec6fe 100644 --- a/lib/iris/analysis/calculus.py +++ b/lib/iris/analysis/calculus.py @@ -412,7 +412,7 @@ def curl(i_cube, j_cube, k_cube=None, ignore=None, update_history=True): Return (i_cmpt_curl_cube, j_cmpt_curl_cube, k_cmpt_curl_cube) - The calculation of curl is dependent on the type of :func:`iris.coord_systems.HorizontalCS` in the cube: + The calculation of curl is dependent on the type of :func:`iris.coord_systems.CoordSystem` in the cube: Cartesian curl @@ -441,10 +441,12 @@ def curl(i_cube, j_cube, k_cube=None, ignore=None, update_history=True): warnings.warn('The ignore keyword to iris.analysis.calculus.curl is deprecated, ignoring is now done automatically.') # get the radius of the earth - latlon_cs = i_cube.coord_system(iris.coord_systems.LatLonCS) - if latlon_cs and latlon_cs.datum.is_spherical(): - r = latlon_cs.datum.semi_major_axis - r_unit = latlon_cs.datum.units + latlon_cs = i_cube.coord_system(iris.coord_systems.GeogCS) + if latlon_cs and isinstance(latlon_cs, iris.coord_systems.RotatedGeogCS): + # TODO: Add a test for this + # TODO: This assumes spherical for an ellipsoid? + r = latlon_cs.semi_major_axis + r_unit = latlon_cs.units else: r = iris.analysis.cartography.DEFAULT_SPHERICAL_EARTH_RADIUS r_unit = iris.analysis.cartography.DEFAULT_SPHERICAL_EARTH_RADIUS_UNIT @@ -478,11 +480,10 @@ def curl(i_cube, j_cube, k_cube=None, ignore=None, update_history=True): y_dim = i_cube.coord_dims(y_coord)[0] - horiz_cs = i_cube.coord_system('HorizontalCS') - if horiz_cs is None: - raise ValueError('Could not get the horizontal CS of the cubes provided.') + horiz_cs = i_cube.coord_system('CoordSystem') - if horiz_cs.cs_type == iris.coord_systems.CARTESIAN_CS: + # Planar (non spherical) coords? + if horiz_cs is None or isinstance(horiz_cs, iris.coord_systems.MapProjection): # TODO Implement some mechanism for conforming to a common grid dj_dx = _curl_differentiate(j_cube, x_coord) @@ -525,15 +526,13 @@ def curl(i_cube, j_cube, k_cube=None, ignore=None, update_history=True): result = [i_cmpt, j_cmpt, k_cmpt] - elif horiz_cs.cs_type == iris.coord_systems.SPHERICAL_CS: + # Spherical coords. + elif isinstance(horiz_cs, iris.coord_systems.GeogCS): # A_\phi = i ; A_\theta = j ; A_\r = k # theta = lat ; phi = long ; # r_cmpt = 1/ ( r * cos(lat) ) * ( d/dtheta ( i_cube * sin( lat ) ) - d_j_cube_dphi ) # phi_cmpt = 1/r * ( d/dr (r * j_cube) - d_k_cube_dtheta) # theta_cmpt = 1/r * ( 1/cos(lat) * d_k_cube_dphi - d/dr (r * i_cube) - if not horiz_cs.datum.is_spherical(): - raise NotImplementedError('Cannot take the curl over a non-spherical datum.') - if y_coord.name() != 'latitude' or x_coord.name() != 'longitude': raise ValueError('Expecting latitude as the y coord and longitude as the x coord for spherical curl.') @@ -589,10 +588,9 @@ def curl(i_cube, j_cube, k_cube=None, ignore=None, update_history=True): d_k_cube_dphi = dri_dr = None result = [phi_cmpt, theta_cmpt, r_cmpt] - + else: - raise ValueError("Horizontal coord system neither cartesian nor spherical spheroid: %s %s (%s)" \ - % (type(horiz_cs), horiz_cs.cs_type, horiz_cs.datum)) + raise ValueError("Uknown cs type") for direction, cube in zip(vector_quantity_names, result): if cube is not None: diff --git a/lib/iris/analysis/cartography.py b/lib/iris/analysis/cartography.py index 46e909c15c..27dc0ebb27 100644 --- a/lib/iris/analysis/cartography.py +++ b/lib/iris/analysis/cartography.py @@ -110,7 +110,7 @@ def lat_lon_range(cube, mode=None): """ # get the lat and lon coords (might have "grid_" at the start of the name, if rotated). lat_coord, lon_coord = _get_lat_lon_coords(cube) - cs = cube.coord_system('LatLonCS') + cs = cube.coord_system('GeogCS') if lon_coord.has_bounds() != lat_coord.has_bounds(): raise ValueError('Cannot get the range of the latitude and longitude coordinates if they do ' @@ -123,7 +123,7 @@ def lat_lon_range(cube, mode=None): else: _mode = iris.coords.POINT_MODE - if cs.has_rotated_pole(): + if isinstance(cs, iris.coord_systems.RotatedGeogCS): if _mode == iris.coords.POINT_MODE: lats, lons = get_lat_lon_grids(cube) else: @@ -154,7 +154,7 @@ def get_lat_lon_grids(cube): """ # get the lat and lon coords (might have "grid_" at the start of the name, if rotated). lat_coord, lon_coord = _get_lat_lon_coords(cube) - cs = cube.coord_system('LatLonCS') + cs = cube.coord_system('GeogCS') if lon_coord.units != 'degrees': lon_coord = lon_coord.unit_converted('degrees') @@ -168,8 +168,8 @@ def get_lat_lon_grids(cube): lons, lats = numpy.meshgrid(lons, lats) # if the pole was rotated, then un-rotate it - if cs.has_rotated_pole(): - lons, lats = unrotate_pole(lons, lats, cs.n_pole.longitude, cs.n_pole.latitude) + if isinstance(cs, iris.coord_systems.RotatedGeogCS): + lons, lats = unrotate_pole(lons, lats, cs.grid_north_pole.lon, cs.grid_north_pole.lat) return (lats, lons) @@ -186,7 +186,7 @@ def get_lat_lon_contiguous_bounded_grids(cube): """ # get the lat and lon coords (might have "grid_" at the start of the name, if rotated). lat_coord, lon_coord = _get_lat_lon_coords(cube) - cs = cube.coord_system('LatLonCS') + cs = cube.coord_system('GeogCS') if lon_coord.units != 'degrees': lon_coord = lon_coord.unit_converted('degrees') @@ -196,8 +196,8 @@ def get_lat_lon_contiguous_bounded_grids(cube): lons = lon_coord.contiguous_bounds() lats = lat_coord.contiguous_bounds() lons, lats = numpy.meshgrid(lons, lats) - if cs.has_rotated_pole(): - lons, lats = iris.analysis.cartography.unrotate_pole(lons, lats, cs.n_pole.longitude, cs.n_pole.latitude) + if isinstance(cs, iris.coord_systems.RotatedGeogCS): + lons, lats = iris.analysis.cartography.unrotate_pole(lons, lats, cs.grid_north_pole.lon, cs.grid_north_pole.lat) return (lats, lons) @@ -254,9 +254,9 @@ def area_weights(cube): """ # Get the radius of the earth - latlon_cs = cube.coord_system(iris.coord_systems.LatLonCS) - if latlon_cs and latlon_cs.datum.is_spherical(): - radius_of_earth = latlon_cs.datum.semi_major_axis + latlon_cs = cube.coord_system(iris.coord_systems.GeogCS) + if latlon_cs: + radius_of_earth = latlon_cs.semi_major_axis else: warnings.warn("Using DEFAULT_SPHERICAL_EARTH_RADIUS.") radius_of_earth = DEFAULT_SPHERICAL_EARTH_RADIUS diff --git a/lib/iris/analysis/interpolate.py b/lib/iris/analysis/interpolate.py index cab360e9dc..5639e3af4d 100644 --- a/lib/iris/analysis/interpolate.py +++ b/lib/iris/analysis/interpolate.py @@ -358,7 +358,7 @@ def regrid(source_cube, grid_cube, mode='bilinear', **kwargs): by the grid_cube. Fundamental input requirements: - 1) Both cubes must have a HorizontalCS. + 1) Both cubes must have a CoordSystem. 2) The source 'x' and 'y' coordinates must not share data dimensions with any other coordinates. In addition, the algorithm currently used requires: @@ -386,12 +386,12 @@ def regrid(source_cube, grid_cube, mode='bilinear', **kwargs): """ # Condition 1 - source_cs = source_cube.coord_system(iris.coord_systems.HorizontalCS) - grid_cs = grid_cube.coord_system(iris.coord_systems.HorizontalCS) - if source_cs is None or grid_cs is None: - raise ValueError("The source and grid cubes must contain a HorizontalCS.") + source_cs = source_cube.coord_system(iris.coord_systems.CoordSystem) + grid_cs = grid_cube.coord_system(iris.coord_systems.CoordSystem) + if source_cs==None != grid_cs==None: + raise ValueError("The source and grid cubes must both have a CoordSystem or both have None.") - # Condition 2: We can only have one x coordinate and one y coordinate with the source HorizontalCS, and those coordinates + # Condition 2: We can only have one x coordinate and one y coordinate with the source CoordSystem, and those coordinates # must be the only ones occupying their respective dimension source_x = source_cube.coord(axis='x', coord_system=source_cs) source_y = source_cube.coord(axis='y', coord_system=source_cs) diff --git a/lib/iris/coord_systems.py b/lib/iris/coord_systems.py index f5b8993e10..c93306370c 100644 --- a/lib/iris/coord_systems.py +++ b/lib/iris/coord_systems.py @@ -24,136 +24,28 @@ import numpy -import iris.cube -import iris.exceptions -import iris.util - - -# Define Horizontal coordinate type constants -CARTESIAN_CS = 'cartesian' -SPHERICAL_CS = 'spherical' -# maintain a tuple of valid CS types -_VALID_CS_TYPES = (CARTESIAN_CS, SPHERICAL_CS) - - -USE_OLD_XML = True - - -class SpheroidDatum(iris.util._OrderedHashable): - """Defines the shape of the Earth.""" - - # Declare the attribute names relevant to the _OrderedHashable behaviour. - _names = ('label', 'semi_major_axis', 'semi_minor_axis', 'flattening', 'units') - - label = None - """The name of this spheroid definition.""" - - semi_major_axis = None - """The length of the semi-major axis, :math:`a`.""" - - semi_minor_axis = None - """The length of the semi-minor axis, :math:`b`.""" - - flattening = None - """The flattening, :math:`f`, or ellipticity. Defined as :math:`f = 1-\\frac{b}{a}`.""" - - units = None - """The unit of measure for the axes.""" - - def __init__(self, label='undefined spheroid', semi_major_axis=None, semi_minor_axis=None, - flattening=None, units='no unit'): - """ - If all three of semi_major_axis, semi_minor_axis, and flattening are None then - it defaults to a perfect sphere using the radius 6371229m. - - Otherwise, at least two of semi_major_axis, semi_minor_axis, and flattening - must be given. - - """ - #if radius/flattening are not specified, use defaults. - if (semi_major_axis is None) and (semi_minor_axis is None) and (flattening is None): - #Use the UM radius from http://fcm2/projects/UM/browser/UM/trunk/src/constants/earth_constants_mod.F90 - semi_major_axis = 6371229.0 - semi_minor_axis = 6371229.0 - flattening = 0.0 - units = iris.unit.Unit('m') - - #calculate the missing element (if any) from the major/minor/flattening triplet - else: - if semi_major_axis is None: - if semi_minor_axis is None or flattening is None: - raise ValueError("Must have at least two of the major/minor/flattening triplet") - semi_major_axis = semi_minor_axis / (1.0-flattening) - - elif semi_minor_axis is None: - if semi_major_axis is None or flattening is None: - raise ValueError("Must have at least two of the major/minor/flattening triplet") - semi_minor_axis = (1.0-flattening) * semi_major_axis - - elif flattening is None: - if semi_major_axis is None or semi_minor_axis is None: - raise ValueError("Must have at least two of the major/minor/flattening triplet") - flattening = 1.0 - (semi_minor_axis/semi_major_axis) - - self._init(label, semi_major_axis, semi_minor_axis, flattening, units) - - def is_spherical(self): - """Returns whether this datum describes a perfect sphere.""" - return self.flattening == 0.0 - - -class PrimeMeridian(iris.util._OrderedHashable): - """Defines the origin of the coordinate system.""" - - # Declare the attribute names relevant to the _OrderedHashable behaviour. - _names = ('label', 'value') - - label = None - """The name of the specific location which defines the reference point.""" - - value = None - """The longitude of the reference point.""" - - def __init__(self, label="Greenwich", value=0.0): - """ """ - self._init(label, value) - - -class GeoPosition(iris.util._OrderedHashable): - """Defines a geographic coordinate latitude/longitude pair.""" - - # Declare the attribute names relevant to the _OrderedHashable behaviour. - _names = ('latitude', 'longitude') - - latitude = None - """The latitude of the position in degrees.""" - - longitude = None - """The longitude of the position in degrees.""" +import iris +import iris.unit class CoordSystem(object): """Abstract base class for coordinate systems. - - A Coord holds an optional CoordSystem, which can be used to indicate - several Coords are defined to be 'in the same system'. - E.g lat and lon coords will hold a shared or identical LatLonCS. + """ __metaclass__ = ABCMeta + name = None + """CF: grid_mapping_name.""" + def __eq__(self, other): return self.__class__ == other.__class__ and self.__dict__ == other.__dict__ - + def __ne__(self, other): - # Must supply __ne__, Python does not defer to __eq__ for negative equality return not (self == other) - def assert_valid(self): - """Check the CS is in a valid state (else raises error).""" - pass - def xml_element(self, doc): """Default behaviour for coord systems.""" + xml_element_name = type(self).__name__ # lower case the first char xml_element_name = xml_element_name.replace(xml_element_name[0], xml_element_name[0].lower(), 1) @@ -162,14 +54,7 @@ def xml_element(self, doc): attrs = [] for k, v in self.__dict__.iteritems(): - if isinstance(v, iris.cube.Cube): - attrs.append([k, 'defined']) - else: - if USE_OLD_XML: - v = str(v).replace("units", "unit") - attrs.append([k, v]) - else: - attrs.append([k, v]) + attrs.append([k, v]) attrs.sort(key=lambda attr: attr[0]) @@ -178,179 +63,295 @@ def xml_element(self, doc): return coord_system_xml_element +# # TODO: Is there value in defining the units this coord system uses? Perhaps for validation purposes. +# def units(self): +# raise NotImplementedError() + + def _to_cartopy(self): + """Create a representation of ourself using a cartopy object.""" + raise NotImplementedError() + + +class GeogCS(CoordSystem): + """An geographic (ellipsoidal) coordinate system, defined by the shape of the Earth and a prime meridian.""" -class HorizontalCS(CoordSystem): - """Abstract CoordSystem for holding horizontal grid information.""" + name = "latitude_longitude" + + # TODO: Consider including a label, but don't currently see the need. + def __init__(self, semi_major_axis=None, semi_minor_axis=None, inverse_flattening=None, units=None, + longitude_of_prime_meridian=None): + """Creates a new GeogCS. + + Kwargs: + + * semi_major_axis - of ellipsoid + * semi_minor_axis - of ellipsoid + * inverse_flattening - of ellipsoid + * units - of measure of the radii + * longitude_of_prime_meridian - Can be used to specify the prime meridian on the ellipsoid. + Default = 0. + + If all three of semi_major_axis, semi_minor_axis, and inverse_flattening are None then + it defaults to a perfect sphere using the radius 6371229m. + + If just semi_major_axis is set, with no semi_minor_axis or inverse_flattening then + a perfect sphere is created from the given radius. - def __init__(self, datum): - """ """ - CoordSystem.__init__(self) + If just two of semi_major_axis, semi_minor_axis, and inverse_flattening are given + the missing element is calulated from the formula: + :math: + + flattening = (semi_major_axis - semi_minor_axis) / semi_major_axis + + Examples: + + default_cs = GeogCS() + airy1830 = GeogCS(semi_major_axis=6377563.396, semi_minor_axis=6356256.909, inverse_flattening=299.3249646, units="m") + airy1830 = GeogCS(semi_major_axis=6377563.396, semi_minor_axis=6356256.909, units="m") + custom_cs = GeogCS(6400, 6300, units="km") - self.datum = datum - self.cs_type = CARTESIAN_CS + """ + # Default (no ellipsoid parmas) + if (semi_major_axis is None) and (semi_minor_axis is None) and (inverse_flattening is None): + DEFAULT_RADII = 6371229.0 + semi_major_axis = DEFAULT_RADII + semi_minor_axis = DEFAULT_RADII + inverse_flattening = 0.0 + units = iris.unit.Unit('m') + + # Sphere (major axis only) + elif semi_major_axis is not None and (semi_minor_axis is None and inverse_flattening is None): + semi_minor_axis = semi_major_axis + inverse_flattening = 0.0 + + # Calculate missing param? + elif semi_major_axis is None: + if semi_minor_axis is None or inverse_flattening is None: + raise ValueError("Must have at least two of semi_major_axis, semi_minor_axis and inverse_flattening") + semi_major_axis = -semi_minor_axis / ((1.0 - inverse_flattening) / inverse_flattening) + + elif semi_minor_axis is None: + if semi_major_axis is None or inverse_flattening is None: + raise ValueError("Must have at least two of semi_major_axis, semi_minor_axis and inverse_flattening") + semi_minor_axis = semi_major_axis - (1.0 / inverse_flattening) * semi_major_axis + + elif inverse_flattening is None: + if semi_major_axis is None or semi_minor_axis is None: + raise ValueError("Must have at least two of semi_major_axis, semi_minor_axis and inverse_flattening") + if semi_major_axis == semi_minor_axis: + inverse_flattening = 0.0 + else: + inverse_flattening = 1.0 / ((semi_major_axis - semi_minor_axis) / semi_major_axis) + +# # Validate 3 given ellipsoid params +# else: +# rdiff = (semi_major_axis - semi_minor_axis) +# if rdiff: +# result = 1.0 / (rdiff / semi_major_axis) +# # TODO: assert_almost_equal is not helpful here, +# # it compares to n decimal places, +# # not n significant digits. +# numpy.testing.assert_almost_equal(result, inverse_flattening) +# elif semi_major_axis == 0.0: +# raise ValueError("Sphere cannot have zero radius") +# elif inverse_flattening != 0.0: +# raise ValueError("Expected zero inverse_flattening for sphere") + + self.semi_major_axis = float(semi_major_axis) + """Major radius of the ellipsoid.""" + + self.semi_minor_axis = float(semi_minor_axis) + """Minor radius of the ellipsoid.""" + + self.inverse_flattening = float(inverse_flattening) + """:math:`1/f` where :math:`f = (a-b)/a`""" + + self.units = iris.unit.Unit(units) + """Unit of measure of radii.""" + + self.longitude_of_prime_meridian = float(longitude_of_prime_meridian) if longitude_of_prime_meridian else 0.0 + """Describes 'zero' on the ellipsoid.""" def __repr__(self): - return "HorizontalCS(%r, %r)" % (self.datum, self.cs_type) + return "GeogCS(semi_major_axis=%r, semi_minor_axis=%r, inverse_flattening=%r, units='%r', longitude_of_prime_meridian=%r)" % \ + (self.semi_major_axis, self.semi_minor_axis, self.inverse_flattening, + self.units, self.longitude_of_prime_meridian) - def assert_valid(self): - if self.cs_type not in _VALID_CS_TYPES: - raise iris.exceptions.InvalidCubeError('"%s" is not a valid coordinate system type.' % self.cs_type) - CoordSystem.assert_valid(self) + def __str__(self): + return "GeogCS(semi_major_axis=%s, semi_minor_axis=%s, inverse_flattening=%s, units=%s, longitude_of_prime_meridian=%s)" % \ + (self.semi_major_axis, self.semi_minor_axis, self.inverse_flattening, + self.units, self.longitude_of_prime_meridian) +# def units(self): +# return "degrees" + + def _to_cartopy(self): + """Create a representation of ourself using a cartopy object.""" + raise NotImplementedError("Cartopy integration not yet implemented") + -class LatLonCS(HorizontalCS): - """Holds latitude/longitude grid information for both regular and rotated coordinates.""" - def __init__(self, datum, prime_meridian, n_pole, reference_longitude): - """ - Args: +class GeoPos(object): + """Store the position of the pole, for prettier code.""" + def __init__(self, lat, lon): + self.lat = float(lat) + self.lon = float(lon) + + def __repr__(self): + return "GeoPos(%r, %r)" % (self.lat, self.lon) + + def __eq__(self, b): + return self.__class__ == b.__class__ and self.__dict__ == b.__dict__ + + def __ne__(self, b): + return not (self == b) + + +class RotatedGeogCS(GeogCS): + """A :class:`GeogCS` with rotated pole.""" + + name = "rotated_latitude_longitude" + + def __init__(self, semi_major_axis=None, semi_minor_axis=None, inverse_flattening=None, units=None, + longitude_of_prime_meridian=None, grid_north_pole=None, north_pole_lon=0): + """For :class:`GeogCS` parameters see :func:`GeogCS.__init__.` - * datum: - An instance of :class:`iris.coord_systems.SpheroidDatum`. - * prime_meridian: - An instance of :class:`iris.coord_systems.PrimeMeridian`. - * n_pole: - An instance of :class:`iris.coord_systems.GeoPosition` containing the geographic - location of the, possibly rotated, North pole. - * reference_longitude: - The longitude of the standard North pole within the possibly rotated - coordinate system. + Args: + + * grid_north_pole - The true latlon position of the rotated pole: tuple(lat, lon). + CF: (grid_north_pole_latitude, grid_north_ple_longitude). - Example creation:: + Kwargs: - cs = LatLonCS(datum=SpheroidDatum(), - prime_meridian=PrimeMeridian(label="Greenwich", value=0.0), - n_pole=GeoPosition(90, 0), - reference_longitude=0.0 - ) + * north_pole_lon - Longitude of true north pole in rotated grid. Default = 0. + CF: north_pole_grid_longitude + + Example: - """ - if n_pole is not None and not isinstance(n_pole, GeoPosition): - raise TypeError("n_pole must be an instance of GeoPosition") + rotated_cs = RotatedGeogCS(grid_north_pole=(30,30)) + another_cs = RotatedGeogCS(6400, 6300, units="km", grid_north_pole=(30,30)) + + """ + GeogCS.__init__(self, semi_major_axis, semi_minor_axis, inverse_flattening, units, + longitude_of_prime_meridian) + + if grid_north_pole is None: + raise ValueError("No grid_north_pole specified") + elif not isinstance(grid_north_pole, GeoPos): + grid_north_pole = GeoPos(grid_north_pole[0], grid_north_pole[1]) - HorizontalCS.__init__(self, datum) - self.datum = datum - self.prime_meridian = prime_meridian - self.n_pole = n_pole - self.reference_longitude = reference_longitude - self.cs_type = SPHERICAL_CS + self.grid_north_pole = grid_north_pole + """A :class:`~GeoPos` describing the true latlon position of the rotated pole.""" + + # TODO: Confirm CF's "north_pole_lon" is the same as our old "reference longitude" + self.north_pole_lon = float(north_pole_lon) + """Longitude of true north pole in rotated grid.""" + + @classmethod + def from_geocs(cls, geocs, grid_north_pole, north_pole_lon=0): + """Construct a RotatedGeogCS from a GeogCS. See also :func:`RotatedGeogCS.__init__`""" + return RotatedGeogCS(geocs.semi_major_axis, geocs.semi_minor_axis, geocs.inverse_flattening, geocs.units, + geocs.longitude_of_prime_meridian, grid_north_pole=grid_north_pole, north_pole_lon=north_pole_lon) def __repr__(self): - return "LatLonCS(%r, %r, %r, %r)" % (self.datum, self.prime_meridian, self.n_pole, self.reference_longitude) + return "RotatedGeogCS(semi_major_axis=%r, semi_minor_axis=%r, inverse_flattening=%r, units='%r', longitude_of_prime_meridian=%r, grid_north_pole=%r, north_pole_lon=%r)" % \ + (self.semi_major_axis, self.semi_minor_axis, self.inverse_flattening, + self.units, self.longitude_of_prime_meridian, + self.grid_north_pole, self.north_pole_lon) - def has_rotated_pole(self): - return self.n_pole != GeoPosition(90, 0) + def __str__(self): + return "RotatedGeogCS(semi_major_axis=%s, semi_minor_axis=%s, inverse_flattening=%s, units=%s, longitude_of_prime_meridian=%s, grid_north_pole=%s, north_pole_lon=%s)" % \ + (self.semi_major_axis, self.semi_minor_axis, self.inverse_flattening, + self.units, self.longitude_of_prime_meridian, + self.grid_north_pole, self.north_pole_lon) +# def units(self): +# return "degrees" -class HybridHeightCS(CoordSystem): - """CoordSystem for holding hybrid height information.""" + def _to_cartopy(self): + """Create a representation of ourself using a cartopy object.""" + raise NotImplementedError("Cartopy integration not yet implemented") - def __init__(self, orography): - """ """ - CoordSystem.__init__(self) - self.orography = orography - def __repr__(self): - return "HybridHeightCS(%r)" % self.orography +class MapProjection(CoordSystem): + """Abstract base class for map projections. + + Describes a transformation from a :class:`GeogCS` to a plane, for mapping. + A planar coordinate system is produced by the transformation. + + """ + __metaclass__ = ABCMeta - def __deepcopy__(self, memo): - """DON'T duplicate the orography amongst instances - share it.""" - return HybridHeightCS(self.orography) + def __init__(self, geocs): + """Creates a MapProjection. - def orography_at_points(self, cube): - """ Return a 2D array (YxX) of orography heights for the given cube.""" - if self.orography is None: - raise TypeError("Regridding cannot be performed as the Orography does not exist (is None).") - return self.orography.regridded(cube, mode='nearest').data - - def orography_at_xy_corners(self, cube): - """Return (n, m, 4) array of orography at the 4 lon/lat corners of each cell.""" - # NB. If there are multiple definitive coordinates for an axis it doesn't matter which we use. - x_coord = cube.coord(axis='x', definitive=True) - y_coord = cube.coord(axis='y', definitive=True) - if (not x_coord.has_bounds()) or (not y_coord.has_bounds()): - raise iris.exceptions.IrisError("x or y coord without bounds") - if x_coord.ndim != 1: - raise iris.exceptions.CoordinateMultiDimError(x_coord) - if y_coord.ndim != 1: - raise iris.exceptions.CoordinateMultiDimError(y_coord) - orography = numpy.empty((y_coord.shape[0], x_coord.shape[0], 4)) # y, x, xyb - for iy, y_bound in enumerate(y_coord.bounds): - for ix, x_bound in enumerate(x_coord.bounds): - # Get the orography at the ll corners for this cell - interp_value = iris.analysis.interpolate.nearest_neighbour_data_value - orography[iy, ix, 0] = interp_value(self.orography, {x_coord.name: x_bound[0], y_coord.name: y_bound[0]}) - orography[iy, ix, 1] = interp_value(self.orography, {x_coord.name: x_bound[0], y_coord.name: y_bound[1]}) - orography[iy, ix, 2] = interp_value(self.orography, {x_coord.name: x_bound[1], y_coord.name: y_bound[1]}) - orography[iy, ix, 3] = interp_value(self.orography, {x_coord.name: x_bound[1], y_coord.name: y_bound[0]}) - return orography - - def orography_at_contiguous_corners(self, cube, use_x_bounds, use_y_bounds): - """Return an (n+1, m), (n, m+1), or (n+1, m+1) array of orography for cell corners/bounds.""" - x_coord = cube.coord(axis='x', definitive=True) - y_coord = cube.coord(axis='y', definitive=True) + Args: - if use_x_bounds: - x_values = x_coord.contiguous_bounds() - else: - x_values = x_coord.points - if use_y_bounds: - y_values = y_coord.contiguous_bounds() - else: - y_values = y_coord.points - - interp_value = iris.analysis.interpolate.nearest_neighbour_data_value - - orography = numpy.empty((len(y_values), len(x_values)), dtype=self.orography.data.dtype) - for iy, y in enumerate(y_values): - for ix, x in enumerate(x_values): - orography[iy, ix] = interp_value(self.orography, [(x_coord, x), (y_coord, y)]) - return orography - - def _height_3d(self, orography, level_height, sigma): - """Given a (Y, X) array of orography, return (Z, Y, X) array of heights.""" - # Re-shape the level_height and sigma values so we can use NumPy broadcasting - # to get our answer in one easy step. - level_height = numpy.reshape(level_height, (-1, 1, 1)) # z, -, - - sigma = numpy.reshape(sigma, (-1, 1, 1)) # z, -, - - return level_height + sigma * orography - - def heights(self, level_height, sigma, cube=None, _orography=None): + * geocs - A :class:`GeoCs` that describes the Earth, from which we project. + """ - Returns a 3-D array (ZxYxX) of heights above the geoid for the given cube points. + self.geocs = geocs - cube - defines the points at which we want heights - _orography - internal optimisation, array of precalculated orography at cube points +# def units(self): +# raise NotImplementedError() - """ + def _to_cartopy(self): + """Create a representation of ourself using a cartopy object.""" + raise NotImplementedError("Cartopy integration not yet implemented") - #check params - if (cube is None) and (_orography is None): - raise ValueError("No cube specified") - if (cube is not None) and (_orography is not None): - raise ValueError("Cannot accept cube and _orography together") - - # Get the orography height for the cell points - if _orography is None: - #regrid the orography to the cube's ll grid - orography = self.orography_at_points(cube) # y, x - else: - #it has already been calculated - if _orography.ndim != 2: - raise ValueError("_orography must be 2D") - orography = _orography - - return self._height_3d(orography, level_height.points, sigma.points) - - def heights_at_contiguous_corners(self, level_height, sigma, cube, use_x_bounds, use_y_bounds): - """ - Returns a 3-D array (ZxYxX) of heights above the geoid for the given cube points. - cube - defines the points at which we want heights - use_x_bounds - whether we should use point or bound positions along the x axis - use_y_bounds - whether we should use point or bound positions along the y axis + +class TransverseMercator(MapProjection): + """A cylindrical map projection, with XY coordinates measured in meters.""" + + name = "transverse_mercator" + + def __init__(self, geocs, origin, false_origin, scale_factor): + """Constructs a TransverseMercator object. + + Args: + + * geocs - A :class:`GeoCs` that describes the Earth, from which we project. + * origin - True latlon point of planar origin: tuple(lat, lon) in degrees. + CF: (latitude_of_projection_origin, longitude_of_central_meridian). + * false_origin - Offset from planar origin: (x, y) in meters. + Used to elliminate negative numbers in the area of interest. + CF: (false_easting, false_northing). + * scale_factor - Reduces the cylinder to slice through the ellipsoid (secant form). + Used to provide TWO longitudes of zero distortion in the area of interest. + CF: scale_factor_at_central_meridian. + + Example: + + airy1830 = GeogCS(6377563.396, 6356256.910, 299.3249646, "m") + osgb = TransverseMercator(airy1830, (49,-2), (40000,-10000), 0.9996012717) """ - orography = self.orography_at_contiguous_corners(cube, use_x_bounds, use_y_bounds) # y, x - return self._height_3d(orography, level_height.contiguous_bounds(), sigma.contiguous_bounds()) + MapProjection.__init__(self, geocs) + + if not isinstance(origin, GeoPos): + origin = GeoPos(origin[0], origin[1]) + + self.geocs = geocs + + self.origin = origin + """True latlon point of planar origin: tuple(lat, lon) in degrees.""" + + # TODO: Update GeoPos to not just be latlon + self.false_origin = (float(false_origin[0]), float(false_origin[1])) + """Offset from planar origin: (x, y) in meters.""" + + self.scale_factor = float(scale_factor) + """Reduces the cylinder to slice through the ellipsoid.""" + + def __repr__(self): + return "TransverseMercator(origin=%r, false_origin=%r, scale_factor=%r, geos=%r)" % \ + (self.origin, self.false_origin, self.scale_factor, self.geocs) + +# def units(self): +# return "meters" + + def _to_cartopy(self): + """Create a representation of ourself using a cartopy object.""" + raise NotImplementedError("Cartopy integration not yet implemented") diff --git a/lib/iris/coords.py b/lib/iris/coords.py index a19eea40b9..c46b4cb4aa 100644 --- a/lib/iris/coords.py +++ b/lib/iris/coords.py @@ -287,7 +287,7 @@ def __init__(self, points, standard_name=None, long_name=None, * attributes A dictionary containing other cf and user-defined attributes. * coord_system - A CoordSystem, e.g a LatLonCS for a longitude Coord. + A :class:`~iris.coord_systems.CoordSystem`, e.g a :class:`~iris.coord_systems.GeogCS` for a longitude Coord. """ self.standard_name = standard_name diff --git a/lib/iris/cube.py b/lib/iris/cube.py index 44bc86a5b8..aaad8dd6dd 100644 --- a/lib/iris/cube.py +++ b/lib/iris/cube.py @@ -756,8 +756,8 @@ def coord_system(self, spec): * spec The the name or type of a CoordSystem subclass. E.g - cube.coord_system("LatLonCS") - cube.coord_system(iris.coord_systems.LatLonCS) + cube.coord_system("GeogCS") + cube.coord_system(iris.coord_systems.GeogCS) If spec is provided as a type it can be a superclass of any CoordSystems found. @@ -2016,7 +2016,7 @@ def add(self, object_, replace=False): # Find all the superclasses of the given object, starting with the object's # class and continuing up to, but not including, the top-level superclass. superclasses = type.mro(type(object_)) - superclasses = superclasses[:superclasses.index(self._superclass)] + #superclasses = superclasses[:superclasses.index(self._superclass)] if not replace: # Ensure nothing else is already registered against those superclasses. # NB. This implies the _basic_map will also be empty for this object. diff --git a/lib/iris/etc/grib_rules.txt b/lib/iris/etc/grib_rules.txt index 4c96f33d40..7ea9b76cae 100644 --- a/lib/iris/etc/grib_rules.txt +++ b/lib/iris/etc/grib_rules.txt @@ -24,29 +24,29 @@ IF grib.gridType=="regular_ll" grib.jPointsAreConsecutive == 0 THEN -CoordAndDims(DimCoord(numpy.arange(grib.Nj, dtype=numpy.float64) * grib.jDirectionIncrementInDegrees * (grib.jScansPositively*2-1) + grib.latitudeOfFirstGridPointInDegrees, grib._y_coord_name, units='degrees', coord_system=LatLonCS( grib._spheroid_datum, grib._prime_meridian, GeoPosition(90.0, 0.0), 0.0)), 0) -CoordAndDims(DimCoord(numpy.arange(grib.Ni) * grib.iDirectionIncrementInDegrees * (grib.iScansNegatively*(-2)+1) + grib.longitudeOfFirstGridPointInDegrees, grib._x_coord_name, units='degrees', coord_system=LatLonCS( grib._spheroid_datum, grib._prime_meridian, GeoPosition(90.0, 0.0), 0.0)), 1) +CoordAndDims(DimCoord(numpy.arange(grib.Nj, dtype=numpy.float64) * grib.jDirectionIncrementInDegrees * (grib.jScansPositively*2-1) + grib.latitudeOfFirstGridPointInDegrees, grib._y_coord_name, units='degrees', coord_system=grib._geocs), 0) +CoordAndDims(DimCoord(numpy.arange(grib.Ni) * grib.iDirectionIncrementInDegrees * (grib.iScansNegatively*(-2)+1) + grib.longitudeOfFirstGridPointInDegrees, grib._x_coord_name, units='degrees', coord_system=grib._geocs), 1) IF grib.gridType=="regular_ll" grib.jPointsAreConsecutive == 1 THEN -CoordAndDims(DimCoord(numpy.arange(grib.Nj, dtype=numpy.float64) * grib.jDirectionIncrementInDegrees * (grib.jScansPositively*2-1) + grib.latitudeOfFirstGridPointInDegrees, grib._y_coord_name, units='degrees', coord_system=LatLonCS( grib._spheroid_datum, grib._prime_meridian, GeoPosition(90.0, 0.0), 0.0)), 1) -CoordAndDims(DimCoord(numpy.arange(grib.Ni, dtype=numpy.float64) * grib.iDirectionIncrementInDegrees * (grib.iScansNegatively*(-2)+1) + grib.longitudeOfFirstGridPointInDegrees, grib._x_coord_name, units='degrees', coord_system=LatLonCS( grib._spheroid_datum, grib._prime_meridian, GeoPosition(90.0, 0.0), 0.0)), 0) +CoordAndDims(DimCoord(numpy.arange(grib.Nj, dtype=numpy.float64) * grib.jDirectionIncrementInDegrees * (grib.jScansPositively*2-1) + grib.latitudeOfFirstGridPointInDegrees, grib._y_coord_name, units='degrees', coord_system=grib._geocs), 1) +CoordAndDims(DimCoord(numpy.arange(grib.Ni, dtype=numpy.float64) * grib.iDirectionIncrementInDegrees * (grib.iScansNegatively*(-2)+1) + grib.longitudeOfFirstGridPointInDegrees, grib._x_coord_name, units='degrees', coord_system=grib._geocs), 0) IF grib.gridType=="rotated_ll" grib.jPointsAreConsecutive == 0 THEN -CoordAndDims(DimCoord(numpy.arange(grib.Nj, dtype=numpy.float64) * grib.jDirectionIncrementInDegrees * (grib.jScansPositively*2-1) + grib.latitudeOfFirstGridPointInDegrees, grib._y_coord_name, units='degrees', coord_system=LatLonCS(grib._spheroid_datum, grib._prime_meridian, grib._northPole, grib._reference_longitude)), 0) -CoordAndDims(DimCoord(numpy.arange(grib.Ni, dtype=numpy.float64) * grib.iDirectionIncrementInDegrees * (grib.iScansNegatively*(-2)+1) + grib.longitudeOfFirstGridPointInDegrees, grib._x_coord_name, units='degrees', coord_system=LatLonCS(grib._spheroid_datum, grib._prime_meridian, grib._northPole, grib._reference_longitude)), 1) +CoordAndDims(DimCoord(numpy.arange(grib.Nj, dtype=numpy.float64) * grib.jDirectionIncrementInDegrees * (grib.jScansPositively*2-1) + grib.latitudeOfFirstGridPointInDegrees, grib._y_coord_name, units='degrees', coord_system=grib._geocs), 0) +CoordAndDims(DimCoord(numpy.arange(grib.Ni, dtype=numpy.float64) * grib.iDirectionIncrementInDegrees * (grib.iScansNegatively*(-2)+1) + grib.longitudeOfFirstGridPointInDegrees, grib._x_coord_name, units='degrees', coord_system=grib._geocs), 1) IF grib.gridType=="rotated_ll" grib.jPointsAreConsecutive == 1 THEN -CoordAndDims(DimCoord(numpy.arange(grib.Nj, dtype=numpy.float64) * grib.jDirectionIncrementInDegrees * (grib.jScansPositively*2-1) + grib.latitudeOfFirstGridPointInDegrees, grib._y_coord_name, units='degrees', coord_system=LatLonCS(grib._spheroid_datum, grib._prime_meridian, grib._northPole, grib._reference_longitude)), 1) -CoordAndDims(DimCoord(numpy.arange(grib.Ni, dtype=numpy.float64) * grib.iDirectionIncrementInDegrees * (grib.iScansNegatively*(-2)+1) + grib.longitudeOfFirstGridPointInDegrees, grib._x_coord_name, units='degrees', coord_system=LatLonCS(grib._spheroid_datum, grib._prime_meridian, grib._northPole, grib._reference_longitude)), 0) +CoordAndDims(DimCoord(numpy.arange(grib.Nj, dtype=numpy.float64) * grib.jDirectionIncrementInDegrees * (grib.jScansPositively*2-1) + grib.latitudeOfFirstGridPointInDegrees, grib._y_coord_name, units='degrees', coord_system=grib._geocs), 1) +CoordAndDims(DimCoord(numpy.arange(grib.Ni, dtype=numpy.float64) * grib.iDirectionIncrementInDegrees * (grib.iScansNegatively*(-2)+1) + grib.longitudeOfFirstGridPointInDegrees, grib._x_coord_name, units='degrees', coord_system=grib._geocs), 0) diff --git a/lib/iris/etc/pp_rules.txt b/lib/iris/etc/pp_rules.txt index 6efcef52ce..fe3a13fb7b 100644 --- a/lib/iris/etc/pp_rules.txt +++ b/lib/iris/etc/pp_rules.txt @@ -87,7 +87,7 @@ f.bdx != 0.0 len(f.lbcode) != 5 f.lbcode[0] == 1 THEN -CoordAndDims(DimCoord(f.regular_points("x"), standard_name=f._x_coord_name(), units='degrees', circular=(f.lbhem in [0, 4]), coord_system=f.horiz_coord_system()), 1) +CoordAndDims(DimCoord(f.regular_points("x"), standard_name=f._x_coord_name(), units='degrees', circular=(f.lbhem in [0, 4]), coord_system=f.geocs()), 1) # Regular longitude bounds IF @@ -95,7 +95,7 @@ f.bdx != 0.0 len(f.lbcode) != 5 f.lbcode[0] == 2 THEN -CoordAndDims(DimCoord(f.regular_points("x"), standard_name=f._x_coord_name(), units='degrees', circular=(f.lbhem in [0, 4]), coord_system=f.horiz_coord_system(), bounds=f.regular_bounds("x")), 1) +CoordAndDims(DimCoord(f.regular_points("x"), standard_name=f._x_coord_name(), units='degrees', circular=(f.lbhem in [0, 4]), coord_system=f.geocs(), bounds=f.regular_bounds("x")), 1) # Regular latitude points IF @@ -103,7 +103,7 @@ f.bdy != 0.0 len(f.lbcode) != 5 f.lbcode[0] == 1 THEN -CoordAndDims(DimCoord(f.regular_points("y"), standard_name=f._y_coord_name(), units='degrees', coord_system=f.horiz_coord_system()), 0) +CoordAndDims(DimCoord(f.regular_points("y"), standard_name=f._y_coord_name(), units='degrees', coord_system=f.geocs()), 0) # Regular latitude bounds IF @@ -111,7 +111,7 @@ f.bdy != 0.0 len(f.lbcode) != 5 f.lbcode[0] == 2 THEN -CoordAndDims(DimCoord(f.regular_points("y"), standard_name=f._y_coord_name(), units='degrees', coord_system=f.horiz_coord_system(), bounds=f.regular_bounds("y")), 0) +CoordAndDims(DimCoord(f.regular_points("y"), standard_name=f._y_coord_name(), units='degrees', coord_system=f.geocs(), bounds=f.regular_bounds("y")), 0) # Irregular latitude IF @@ -119,7 +119,7 @@ f.bdy == 0.0 len(f.lbcode) != 5 or (len(f.lbcode) == 5 and f.lbcode.iy == 10) # TODO What about lbcode in [2, 102]. How does this affect the bounds? THEN -CoordAndDims(DimCoord(f.y, standard_name=f._y_coord_name(), units='degrees', bounds=f.y_bounds, coord_system=f.horiz_coord_system()), 0) +CoordAndDims(DimCoord(f.y, standard_name=f._y_coord_name(), units='degrees', bounds=f.y_bounds, coord_system=f.geocs()), 0) # Irregular longitude IF @@ -127,7 +127,7 @@ f.bdx == 0.0 len(f.lbcode) != 5 or (len(f.lbcode) == 5 and f.lbcode.ix == 11) # TODO What about lbcode in [2, 102]. How does this affect the bounds? THEN -CoordAndDims(DimCoord(f.x, standard_name=f._x_coord_name(), units='degrees', bounds=f.x_bounds, circular=(f.lbhem in [0, 4]), coord_system=f.horiz_coord_system()), 1) +CoordAndDims(DimCoord(f.x, standard_name=f._x_coord_name(), units='degrees', bounds=f.x_bounds, circular=(f.lbhem in [0, 4]), coord_system=f.geocs()), 1) #################################################################################################### @@ -151,7 +151,7 @@ len(f.lbcode) == 5 f.lbcode.ix == 10 f.bdx != 0 THEN -CoordAndDims(DimCoord(f.regular_points("x"), standard_name=f._y_coord_name(), units='degrees', coord_system=f.horiz_coord_system()), 1) +CoordAndDims(DimCoord(f.regular_points("x"), standard_name=f._y_coord_name(), units='degrees', coord_system=f.geocs()), 1) IF len(f.lbcode) == 5 @@ -205,7 +205,7 @@ hasattr(f, 'upper_x_domain') all(f.lower_x_domain != -1.e+30) all(f.upper_x_domain != -1.e+30) THEN -CoordAndDims(AuxCoord((f.lower_x_domain + f.upper_x_domain) / 2.0, standard_name=f._x_coord_name(), units='degrees', bounds=numpy.array([f.lower_x_domain, f.upper_x_domain]).T, coord_system=f.horiz_coord_system()), 1 if f.lbcode.ix == 13 else 0) +CoordAndDims(AuxCoord((f.lower_x_domain + f.upper_x_domain) / 2.0, standard_name=f._x_coord_name(), units='degrees', bounds=numpy.array([f.lower_x_domain, f.upper_x_domain]).T, coord_system=f.geocs()), 1 if f.lbcode.ix == 13 else 0) # as a special case to some cross section lbcodes (currently only site), lats are encoded in lower_y_domain and upper_y_domain IF @@ -217,7 +217,7 @@ hasattr(f, 'upper_y_domain') all(f.lower_y_domain != -1.e+30) all(f.upper_y_domain != -1.e+30) THEN -CoordAndDims(AuxCoord((f.lower_y_domain + f.upper_y_domain) / 2.0, standard_name=f._y_coord_name(), units='degrees', bounds=numpy.array([f.lower_y_domain, f.upper_y_domain]).T, coord_system=f.horiz_coord_system()), 1 if f.lbcode.ix == 13 else 0) +CoordAndDims(AuxCoord((f.lower_y_domain + f.upper_y_domain) / 2.0, standard_name=f._y_coord_name(), units='degrees', bounds=numpy.array([f.lower_y_domain, f.upper_y_domain]).T, coord_system=f.geocs()), 1 if f.lbcode.ix == 13 else 0) #################################################################################################### diff --git a/lib/iris/etc/pp_save_rules.txt b/lib/iris/etc/pp_save_rules.txt index 8378c73f96..2360030a26 100644 --- a/lib/iris/etc/pp_save_rules.txt +++ b/lib/iris/etc/pp_save_rules.txt @@ -25,10 +25,16 @@ THEN pp.lbproc = 0 # Processing. Start at 0. IF - cm.coord_system("LatLonCS") is not None + cm.coord_system("RotatedGeogCS") is None THEN - pp.bplat = cm.coord_system("LatLonCS").n_pole.latitude - pp.bplon = cm.coord_system("LatLonCS").n_pole.longitude + pp.bplat = 90 + pp.bplon = 0 + +IF + cm.coord_system("RotatedGeogCS") is not None +THEN + pp.bplat = cm.coord_system("RotatedGeogCS").grid_north_pole.lat + pp.bplon = cm.coord_system("RotatedGeogCS").grid_north_pole.lon #UM - no version number @@ -383,8 +389,8 @@ THEN #rotated? IF # iris.fileformats.pp.is_cross_section(cm) == False - cm.coord_system("LatLonCS") is not None - cm.coord_system("LatLonCS").has_rotated_pole() + cm.coord_system("GeogCS") is not None + isinstance(cm.coord_system("GeogCS"), iris.coord_systems.RotatedGeogCS) THEN pp.lbcode = int(pp.lbcode) + 100 diff --git a/lib/iris/fileformats/_pyke_rules/fc_rules_cf.krb b/lib/iris/fileformats/_pyke_rules/fc_rules_cf.krb index 60c58693ef..129798683c 100644 --- a/lib/iris/fileformats/_pyke_rules/fc_rules_cf.krb +++ b/lib/iris/fileformats/_pyke_rules/fc_rules_cf.krb @@ -51,9 +51,7 @@ fc_default_grid_mapping_latitude_longitude notany facts_cf.grid_mapping($_) assert - python datum = iris.coord_systems.SpheroidDatum(label='spherical') - python meridian = iris.coord_systems.PrimeMeridian() - python coordinate_system = iris.coord_systems.LatLonCS(datum, meridian, iris.coord_systems.GeoPosition(90.0, 0.0), 0.0) + python coordinate_system = iris.coord_systems.GeogCS() python engine.provides['coordinate_system'] = coordinate_system facts_cf.provides(coordinate_system, latitude_longitude) python engine.rule_triggered.add(rule.name) @@ -73,7 +71,7 @@ fc_provides_grid_mapping_rotated_latitude_longitude check is_grid_mapping(engine, $grid_mapping, CF_GRID_MAPPING_ROTATED_LAT_LON) assert python cf_grid_var = engine.cf_var.cf_group.grid_mappings[$grid_mapping] - python coordinate_system = build_coordinate_system(engine, cf_grid_var) + python coordinate_system = build_rotated_coordinate_system(engine, cf_grid_var) python engine.provides['coordinate_system'] = coordinate_system facts_cf.provides(coordinate_system, rotated_latitude_longitude) python engine.rule_triggered.add(rule.name) @@ -674,19 +672,31 @@ fc_extras major = getattr(cf_grid_var, CF_ATTR_GRID_SEMI_MAJOR_AXIS, None) minor = getattr(cf_grid_var, CF_ATTR_GRID_SEMI_MINOR_AXIS, None) - inverse = getattr(cf_grid_var, CF_ATTR_GRID_INVERSE_FLATTENING, None) - flattening = 1 / inverse if inverse else None - datum = iris.coord_systems.SpheroidDatum(label='spherical', semi_major_axis=major, semi_minor_axis=minor, flattening=flattening, units=iris.unit.Unit('m')) + inverse_flattening = getattr(cf_grid_var, CF_ATTR_GRID_INVERSE_FLATTENING, None) - prime_meridian = iris.coord_systems.PrimeMeridian() + cs = iris.coord_systems.GeogCS(semi_major_axis=major, semi_minor_axis=minor, + inverse_flattening=inverse_flattening, units=iris.unit.Unit('m')) + + return cs + + def build_rotated_coordinate_system(engine, cf_grid_var): + """Create a rotated coordinate system from the CF-netCDF grid mapping variable.""" + + major = getattr(cf_grid_var, CF_ATTR_GRID_SEMI_MAJOR_AXIS, None) + minor = getattr(cf_grid_var, CF_ATTR_GRID_SEMI_MINOR_AXIS, None) + inverse_flattening = getattr(cf_grid_var, CF_ATTR_GRID_INVERSE_FLATTENING, None) north_pole_latitude = getattr(cf_grid_var, CF_ATTR_GRID_NORTH_POLE_LAT, 90.0) north_pole_longitude = getattr(cf_grid_var, CF_ATTR_GRID_NORTH_POLE_LON, 0.0) - geo_position = iris.coord_systems.GeoPosition(north_pole_latitude, north_pole_longitude) + pole_pos = iris.coord_systems.GeoPos(north_pole_latitude, north_pole_longitude) - reference_longitude = getattr(cf_grid_var, CF_ATTR_GRID_NORTH_POLE_GRID_LON, 0.0) + north_pole_lon = getattr(cf_grid_var, CF_ATTR_GRID_NORTH_POLE_GRID_LON, 0.0) + + rcs = iris.coord_systems.RotatedGeogCS(semi_major_axis=major, semi_minor_axis=minor, + inverse_flattening=inverse_flattening, units=iris.unit.Unit('m'), + grid_north_pole=pole_pos, north_pole_lon=north_pole_lon) - return iris.coord_systems.LatLonCS(datum, prime_meridian, geo_position, reference_longitude) + return rcs ################################################################################ diff --git a/lib/iris/fileformats/grib.py b/lib/iris/fileformats/grib.py index 46a16e81b2..f7214d9778 100644 --- a/lib/iris/fileformats/grib.py +++ b/lib/iris/fileformats/grib.py @@ -212,11 +212,8 @@ def _compute_extra_keys(self): '_firstLevelTypeUnits':unknown_string, '_firstLevel':-1.0, '_secondLevelTypeName':unknown_string, '_secondLevel':-1.0, '_originatingCentre':unknown_string, '_forecastTimeUnit':unknown_string, - '_spheroid_datum':coord_systems.SpheroidDatum(), # default spheroid - '_prime_meridian':coord_systems.PrimeMeridian(), # defaults to greenwhich - '_x_coord_name':unknown_string, '_y_coord_name':unknown_string, - # We won't be accessing these if we're regular_ll. - '_northPole':None, '_reference_longitude':None} + '_geocs':coord_systems.GeogCS(), # default cs + '_x_coord_name':unknown_string, '_y_coord_name':unknown_string} #reference date self.extra_keys['_referenceDateTime'] = datetime.datetime(int(self.year), int(self.month), int(self.day), int(self.hour), int(self.minute)) @@ -238,51 +235,42 @@ def _compute_extra_keys(self): else: self.extra_keys['_phenomenonDateTime'] = self._get_verification_date() - #rotated pole - gridType = gribapi.grib_get_string(self.grib_message, "gridType") - if gridType == 'rotated_ll': - southPoleLon = longitudeOfSouthernPoleInDegrees - southPoleLat = latitudeOfSouthernPoleInDegrees - self.extra_keys['_northPole'] = coord_systems.GeoPosition(-southPoleLat, math.fmod(southPoleLon + 180.0, 360.0)) - self.extra_keys['_reference_longitude'] = self.angleOfRotation - #else leave as default #shape of the earth #pre-defined sphere if self.shapeOfTheEarth == 0: - self.extra_keys['_spheroid_datum'] = coord_systems.SpheroidDatum(label='spherical', units='m', flattening=0.0, - semi_major_axis=6367470.0) + self.extra_keys['_geocs'] = coord_systems.GeogCS(semi_major_axis=6367470.0, units='m') + #custom sphere elif self.shapeOfTheEarth == 1: - self.extra_keys['_spheroid_datum'] = coord_systems.SpheroidDatum(label='spherical', units='m', flattening=0.0, + self.extra_keys['_geocs'] = coord_systems.GeogCS(units='m', semi_major_axis=self.scaledValueOfRadiusOfSphericalEarth * self.scaleFactorOfRadiusOfSphericalEarth) #IAU65 oblate sphere elif self.shapeOfTheEarth == 2: - self.extra_keys['_spheroid_datum'] = coord_systems.SpheroidDatum(label='IAU65', flattening=1.0/297.0, units='m', - semi_major_axis=6378160.0) + self.extra_keys['_geocs'] = coord_systems.GeogCS(units='m', inverse_flattening=297.0, + semi_major_axis=6378160.0) #custom oblate spheroid (km) elif self.shapeOfTheEarth == 3: - self.extra_keys['_spheroid_datum'] = coord_systems.SpheroidDatum(label='spherical', units='km', + self.extra_keys['_geocs'] = coord_systems.GeogCS(units='km', semi_major_axis=self.scaledValueOfEarthMajorAxis * self.scaleFactorOfEarthMajorAxis, semi_minor_axis=self.scaledValueOfEarthMinorAxis * self.scaleFactorOfEarthMinorAxis) #IAG-GRS80 oblate spheroid elif self.shapeOfTheEarth == 4: - self.extra_keys['_spheroid_datum'] = coord_systems.SpheroidDatum(label='IAG-GRS80', units='m', flattening=1.0/298.257222101, - semi_major_axis=6378137.0) + self.extra_keys['_geocs'] = coord_systems.GeogCS(units='m', inverse_flattening=298.257222101, + semi_major_axis=6378137.0) #WGS84 elif self.shapeOfTheEarth == 5: - self.extra_keys['_spheroid_datum'] = coord_systems.SpheroidDatum(label='WGS84', units='m', flattening=1.0/298.257223563, - semi_major_axis=6378137.0) + self.extra_keys['_geocs'] = coord_systems.GeogCS(units='m', inverse_flattening=298.257223563, + semi_major_axis=6378137.0) #pre-defined sphere elif self.shapeOfTheEarth == 6: - self.extra_keys['_spheroid_datum'] = coord_systems.SpheroidDatum(label='spherical', units='m', flattening=0.0, - semi_major_axis=6371229.0) + self.extra_keys['_geocs'] = coord_systems.GeogCS(semi_major_axis=6371229.0, units='m') #custom oblate spheroid (m) elif self.shapeOfTheEarth == 7: - self.extra_keys['_spheroid_datum'] = coord_systems.SpheroidDatum(label='spherical', units='m', + self.extra_keys['_geocs'] = coord_systems.GeogCS(units='m', semi_major_axis=self.scaledValueOfEarthMajorAxis * self.scaleFactorOfEarthMajorAxis, semi_minor_axis=self.scaledValueOfEarthMinorAxis * self.scaleFactorOfEarthMinorAxis) @@ -291,6 +279,18 @@ def _compute_extra_keys(self): else: raise ValueError("undefined shape of earth") + + + #rotated pole + gridType = gribapi.grib_get_string(self.grib_message, "gridType") + if gridType == 'rotated_ll': + # Replace the llcs with a rotated one + southPoleLon = longitudeOfSouthernPoleInDegrees + southPoleLat = latitudeOfSouthernPoleInDegrees + # TODO: Confirm the translation from angleOfRotation to north_pole_lon (usually 0 for both) + self.extra_keys['_geocs'] = iris.coord_systems.RotatedGeogCS.from_geocs(self.extra_keys['_geocs'], + grid_north_pole=(-southPoleLat, math.fmod(southPoleLon + 180.0, 360.0)), north_pole_lon=self.angleOfRotation) + #originating centre #TODO #574 Expand to include sub-centre diff --git a/lib/iris/fileformats/grib_save_rules.py b/lib/iris/fileformats/grib_save_rules.py index f3803ef73e..635eb1ea88 100644 --- a/lib/iris/fileformats/grib_save_rules.py +++ b/lib/iris/fileformats/grib_save_rules.py @@ -30,16 +30,12 @@ def gribbability_check(cube): "We always need the following things for grib saving." - # LatLonCS exists? + # GeogCS exists? cs0 = cube.coord(dimensions=[0]).coord_system cs1 = cube.coord(dimensions=[1]).coord_system - if not (isinstance(cs0, iris.coord_systems.LatLonCS) and isinstance(cs1, iris.coord_systems.LatLonCS)): - raise iris.exceptions.TranslationError("LatLonCS not present") + if not (isinstance(cs0, iris.coord_systems.GeogCS) and isinstance(cs1, iris.coord_systems.GeogCS)): + raise iris.exceptions.TranslationError("GeogCS not present") - # LatLonCS has a datum? - if not isinstance(cs0.datum, iris.coord_systems.SpheroidDatum): - raise iris.exceptions.TranslationError("LatLonCS does not have a datum") - # Regular? y_coord = cube.coord(dimensions=[0]) x_coord = cube.coord(dimensions=[1]) @@ -61,7 +57,7 @@ def gribbability_check(cube): def shape_of_the_earth(cube, grib): - # assume LatLonCS + # assume latlon cs = cube.coord(dimensions=[0]).coord_system # Turn them all missing to start with @@ -72,17 +68,17 @@ def shape_of_the_earth(cube, grib): gribapi.grib_set_long(grib, "scaleFactorOfEarthMinorAxis", 255) gribapi.grib_set_long(grib, "scaledValueOfEarthMinorAxis", -1) - if cs.datum.flattening == 0.0: + if cs.inverse_flattening == 0.0: gribapi.grib_set_long(grib, "shapeOfTheEarth", 1) gribapi.grib_set_long(grib, "scaleFactorOfRadiusOfSphericalEarth", 0) - gribapi.grib_set_long(grib, "scaledValueOfRadiusOfSphericalEarth", cs.datum.semi_major_axis) + gribapi.grib_set_long(grib, "scaledValueOfRadiusOfSphericalEarth", cs.semi_major_axis) else: gribapi.grib_set_long(grib, "shapeOfTheEarth", 7) gribapi.grib_set_long(grib, "scaleFactorOfEarthMajorAxis", 0) - gribapi.grib_set_long(grib, "scaledValueOfEarthMajorAxis", cs.datum.semi_major_axis) + gribapi.grib_set_long(grib, "scaledValueOfEarthMajorAxis", cs.semi_major_axis) gribapi.grib_set_long(grib, "scaleFactorOfEarthMinorAxis", 0) - gribapi.grib_set_long(grib, "scaledValueOfEarthMinorAxis", cs.datum.semi_minor_axis) + gribapi.grib_set_long(grib, "scaledValueOfEarthMinorAxis", cs.semi_minor_axis) def grid_dims(x_coord, y_coord, grib): @@ -145,8 +141,8 @@ def rotated_pole(cube, grib): # gribapi.grib_set_double(grib, "longitudeOfSouthernPoleInDegrees", float(cs.n_pole.longitude)) # gribapi.grib_set_double(grib, "angleOfRotationInDegrees", 0) # WORKAROUND - gribapi.grib_set_long(grib, "latitudeOfSouthernPole", -int(cs.n_pole.latitude*1000000)) - gribapi.grib_set_long(grib, "longitudeOfSouthernPole", int(((cs.n_pole.longitude+180)%360)*1000000)) + gribapi.grib_set_long(grib, "latitudeOfSouthernPole", -int(cs.grid_north_pole.lat*1000000)) + gribapi.grib_set_long(grib, "longitudeOfSouthernPole", int(((cs.grid_north_pole.lon+180)%360)*1000000)) gribapi.grib_set_long(grib, "angleOfRotation", 0) @@ -155,7 +151,7 @@ def grid_template(cube, grib): cs0 = cube.coord(dimensions=[0]).coord_system cs1 = cube.coord(dimensions=[1]).coord_system - if not cs0.has_rotated_pole(): + if not isinstance(cs0, iris.coord_systems.RotatedGeogCS): # template 3.0 gribapi.grib_set_long(grib, "gridDefinitionTemplateNumber", 0) diff --git a/lib/iris/fileformats/netcdf.py b/lib/iris/fileformats/netcdf.py index b44462ea23..54b4338f72 100644 --- a/lib/iris/fileformats/netcdf.py +++ b/lib/iris/fileformats/netcdf.py @@ -345,16 +345,16 @@ def _cf_coord_identity(coord): # Special cases # i) Rotated pole - if isinstance(coord.coord_system, iris.coord_systems.LatLonCS): + if isinstance(coord.coord_system, iris.coord_systems.GeogCS): if coord.name() in ['latitude', 'grid_latitude']: - if coord.coord_system.has_rotated_pole(): + if isinstance(coord.coord_system, iris.coord_systems.RotatedGeogCS): standard_name = 'grid_latitude' units = 'degrees' else: units = 'degrees_north' if coord.name() in ['longitude', 'grid_longitude']: - if coord.coord_system.has_rotated_pole(): + if isinstance(coord.coord_system, iris.coord_systems.RotatedGeogCS): standard_name = 'grid_longitude' units = 'degrees' else: @@ -533,28 +533,24 @@ def _create_cf_grid_mapping(dataset, cube, cf_var): data variable grid mapping attribute. """ - cs = cube.coord_system('HorizontalCS') + cs = cube.coord_system('CoordSystem') if cs is not None: - if isinstance(cs, iris.coord_systems.LatLonCS): - cf_grid_name = 'rotated_latitude_longitude' if cs.has_rotated_pole() else 'latitude_longitude' + if isinstance(cs, iris.coord_systems.GeogCS): + cf_grid_name = 'rotated_latitude_longitude' if isinstance(cs, iris.coord_systems.RotatedGeogCS) else 'latitude_longitude' if cf_grid_name not in dataset.variables: cf_var.grid_mapping = cf_grid_name cf_var_grid = dataset.createVariable(cf_grid_name, np.int32) cf_var_grid.grid_mapping_name = cf_grid_name cf_var_grid.longitude_of_prime_meridian = 0.0 + cf_var_grid.semi_major_axis = cs.semi_major_axis + cf_var_grid.semi_minor_axis = cs.semi_minor_axis - if cs.datum: - cf_var_grid.semi_major_axis = cs.datum.semi_major_axis - cf_var_grid.semi_minor_axis = cs.datum.semi_minor_axis - - if cs.has_rotated_pole(): - if cs.n_pole: - cf_var_grid.grid_north_pole_latitude = cs.n_pole.latitude - cf_var_grid.grid_north_pole_longitude = cs.n_pole.longitude - - cf_var_grid.north_pole_grid_longitude = cs.reference_longitude + if isinstance(cs, iris.coord_systems.RotatedGeogCS): + cf_var_grid.grid_north_pole_latitude = cs.grid_north_pole.lat + cf_var_grid.grid_north_pole_longitude = cs.grid_north_pole.lon + cf_var_grid.north_pole_grid_longitude = cs.north_pole_lon else: # Reference previously created grid mapping cf_var.grid_mapping = cf_grid_name diff --git a/lib/iris/fileformats/pp.py b/lib/iris/fileformats/pp.py index fe0592996a..ab9c0f8a6e 100644 --- a/lib/iris/fileformats/pp.py +++ b/lib/iris/fileformats/pp.py @@ -1073,29 +1073,30 @@ def regular_bounds(self, xy): def time_unit(self, time_unit, epoch='epoch'): return iris.unit.Unit('%s since %s' % (time_unit, epoch), calendar=self.calendar) - def horiz_coord_system(self): - """Return a LatLonCS for this PPField. + def geocs(self): + """Return a GeogCS for this PPField. Returns: - A LatLonCS with the appropriate earth shape, meridian and pole position. + A GeogCS or RotatedGeogCS. """ - return iris.coord_systems.LatLonCS( - iris.coord_systems.SpheroidDatum("spherical", 6371229.0, flattening=0.0, units=iris.unit.Unit('m')), - iris.coord_systems.PrimeMeridian(label="Greenwich", value=0.0), - iris.coord_systems.GeoPosition(self.bplat, self.bplon), 0.0) + geocs = iris.coord_systems.GeogCS(6371229.0, units='m') + if self.bplat != 90.0 or self.bplon != 0.0: + geocs = iris.coord_systems.RotatedGeogCS.from_geocs(geocs, grid_north_pole=(self.bplat, self.bplon)) + + return geocs def _x_coord_name(self): # TODO: Remove once we have the ability to derive this in the rules. x_name = "longitude" - if self.horiz_coord_system().has_rotated_pole(): + if isinstance(self.geocs(), iris.coord_systems.RotatedGeogCS): x_name = "grid_longitude" return x_name def _y_coord_name(self): # TODO: Remove once we have the ability to derive this in the rules. y_name = "latitude" - if self.horiz_coord_system().has_rotated_pole(): + if isinstance(self.geocs(), iris.coord_systems.RotatedGeogCS): y_name = "grid_latitude" return y_name @@ -1477,8 +1478,12 @@ def _grid_defn(cube): pass defn = None if ok: - defn = _GridDefn(tuple(x.points), tuple(y.points), - x.coord_system.n_pole) + if isinstance(x.coord_system, iris.coord_systems.RotatedGeogCS): + defn = _GridDefn(tuple(x.points), tuple(y.points), + x.coord_system.grid_north_pole) + else: + defn = _GridDefn(tuple(x.points), tuple(y.points), + iris.coord_systems.GeoPos(90, 0)) return defn diff --git a/lib/iris_tests/stock.py b/lib/iris_tests/stock.py index 4c3e050a6c..f4d45f9244 100644 --- a/lib/iris_tests/stock.py +++ b/lib/iris_tests/stock.py @@ -29,7 +29,7 @@ import iris.coords import iris.coords as icoords import iris.tests as tests -from iris.coord_systems import LatLonCS, GeoPosition, SpheroidDatum, PrimeMeridian +from iris.coord_systems import GeogCS, RotatedGeogCS def lat_lon_cube(): @@ -38,7 +38,7 @@ def lat_lon_cube(): """ cube = Cube(numpy.arange(12, dtype=numpy.int32).reshape((3, 4))) - cs = LatLonCS(None, 'pm', GeoPosition(90, 0), 0) + cs = GeogCS() cube.add_dim_coord(iris.coords.DimCoord(points=numpy.array([-1, 0, 1], dtype=numpy.int32), standard_name='latitude', units='degrees', coord_system=cs), 0) cube.add_dim_coord(iris.coords.DimCoord(points=numpy.array([-1, 0, 1, 2], dtype=numpy.int32), standard_name='longitude', units='degrees', coord_system=cs), 1) return cube @@ -325,10 +325,8 @@ def realistic_4d(): _source_pts, forecast_period_pts, data, orography = arrays - ll_cs = LatLonCS(SpheroidDatum(label='spherical', semi_major_axis=6371229.0, semi_minor_axis=6371229.0, - flattening=0.0, units='m'), PrimeMeridian(label='Greenwich', value=0.0), - GeoPosition(latitude=37.5, longitude=177.5), - 0.0) + ll_cs = RotatedGeogCS(semi_major_axis=6371229.0, semi_minor_axis=6371229.0, + inverse_flattening=0.0, units='m', grid_north_pole=(37.5, 177.5)) lat = icoords.DimCoord(lat_pts, standard_name='grid_latitude', units='degrees', bounds=lat_bnds, coord_system=ll_cs) @@ -377,10 +375,7 @@ def realistic_4d_w_missing_data(): # sort the arrays based on the order they were originally given. The names given are of the form 'arr_1' or 'arr_10' - ll_cs = LatLonCS(SpheroidDatum(label='spherical', semi_major_axis=6371229.0, semi_minor_axis=6371229.0, - flattening=0.0, units='m'), PrimeMeridian(label='Greenwich', value=0.0), - GeoPosition(latitude=0.0, longitude=90.0), - 0.0) + ll_cs = GeogCS(semi_major_axis=6371229.0, units='m') lat = iris.coords.DimCoord(numpy.arange(20, dtype=numpy.float32), standard_name='grid_latitude', units='degrees', coord_system=ll_cs) diff --git a/lib/iris_tests/system_test.py b/lib/iris_tests/system_test.py index 33f8331f54..dc44ce1d5f 100644 --- a/lib/iris_tests/system_test.py +++ b/lib/iris_tests/system_test.py @@ -34,7 +34,6 @@ import iris.tests as tests import iris.unit - class SystemInitialTest(tests.IrisTest): def system_test_supported_filetypes(self): @@ -44,10 +43,7 @@ def system_test_supported_filetypes(self): laty = np.linspace(0, 59, ny) lonx = np.linspace(30, 89, nx) - horiz_cs = lambda : iris.coord_systems.LatLonCS( - iris.coord_systems.SpheroidDatum("spherical", 6371229.0, flattening=0.0, units=iris.unit.Unit('m')), - iris.coord_systems.PrimeMeridian(label="Greenwich", value=0.0), - iris.coord_systems.GeoPosition(90.0, 0.0), 0.0) + horiz_cs = lambda : iris.coord_systems.GeogCS(6371229.0, units='m') cm = iris.cube.Cube(data=dataarray, long_name="System test data", units='m s-1') cm.add_dim_coord( diff --git a/lib/iris_tests/test_aggregate_by.py b/lib/iris_tests/test_aggregate_by.py index ed87c056c0..136c100c96 100644 --- a/lib/iris_tests/test_aggregate_by.py +++ b/lib/iris_tests/test_aggregate_by.py @@ -34,9 +34,7 @@ def setUp(self): # # common # - cs_latlon = iris.coord_systems.LatLonCS('datum?', 'prime_meridian?', - iris.coord_systems.GeoPosition(90, 0), - 'reference_lon?') + cs_latlon = iris.coord_systems.GeogCS() points = np.arange(3, dtype=np.float32) * 3 coord_lat = iris.coords.DimCoord(points, 'latitude', units='degrees', coord_system=cs_latlon) coord_lon = iris.coords.DimCoord(points, 'longitude', units='degrees', coord_system=cs_latlon) @@ -175,9 +173,7 @@ def test_easy(self): data = np.array([[6, 10, 12, 18], [8, 12, 14, 20], [18, 12, 10, 6]], dtype=np.float32) cube = iris.cube.Cube(data, long_name='temperature', units='kelvin') - llcs = iris.coord_systems.LatLonCS('datum?', 'prime_meridian?', - iris.coord_systems.GeoPosition(90, 0), - 'reference_lon?') + llcs = iris.coord_systems.GeogCS() cube.add_aux_coord(iris.coords.AuxCoord(np.array([0, 0, 10], dtype=np.float32), 'latitude', units='degrees', coord_system=llcs), 0) cube.add_aux_coord(iris.coords.AuxCoord(np.array([0, 0, 10, 10], dtype=np.float32), diff --git a/lib/iris_tests/test_analysis.py b/lib/iris_tests/test_analysis.py index d0f442849b..6b887af8d1 100644 --- a/lib/iris_tests/test_analysis.py +++ b/lib/iris_tests/test_analysis.py @@ -50,7 +50,7 @@ def assertComparisonDict(self, comarison_dict, reference_filename): def test_coord_comparison(self): cube1 = iris.cube.Cube(numpy.zeros((41, 41))) - lonlat_cs = iris.coord_systems.LatLonCS("datum?", "prime_meridian?", iris.coord_systems.GeoPosition(90, 0), "reference_longitude?") + lonlat_cs = iris.coord_systems.GeogCS() lon_points1 = -180 + 4.5 * numpy.arange(41, dtype=numpy.float32) lat_points = -90 + 4.5 * numpy.arange(41, dtype=numpy.float32) cube1.add_dim_coord(iris.coords.DimCoord(lon_points1, 'longitude', units='degrees', coord_system=lonlat_cs), 0) @@ -59,7 +59,7 @@ def test_coord_comparison(self): cube1.add_aux_coord(iris.coords.AuxCoord(['foobar'], long_name='f', units='no_unit')) cube2 = iris.cube.Cube(numpy.zeros((41, 41, 5))) - lonlat_cs = iris.coord_systems.LatLonCS("datum?", "prime_meridian?", iris.coord_systems.GeoPosition(90, 0), "reference_longitude?") + lonlat_cs = iris.coord_systems.GeogCS() lon_points2 = -160 + 4.5 * numpy.arange(41, dtype=numpy.float32) cube2.add_dim_coord(iris.coords.DimCoord(lon_points2, 'longitude', units='degrees', coord_system=lonlat_cs), 0) cube2.add_dim_coord(iris.coords.DimCoord(lat_points, 'latitude', units='degrees', coord_system=lonlat_cs), 1) @@ -107,7 +107,7 @@ def test_weighted_mean_little(self): weights = numpy.array([[9, 8, 7],[6, 5, 4],[3, 2, 1]], dtype=numpy.float32) cube = iris.cube.Cube(data, long_name="test_data", units="1") - hcs = iris.coord_systems.HorizontalCS(iris.coord_systems.SpheroidDatum()) + hcs = iris.coord_systems.GeogCS() lat_coord = iris.coords.DimCoord(numpy.array([1, 2, 3], dtype=numpy.float32), long_name="lat", units="1", coord_system=hcs) lon_coord = iris.coords.DimCoord(numpy.array([1, 2, 3], dtype=numpy.float32), long_name="lon", units="1", coord_system=hcs) cube.add_dim_coord(lat_coord, 0) @@ -372,8 +372,8 @@ def _check_both_conversions(self, cube): plt.scatter(lons, lats) self.check_graphic() - n_pole = cube.coord_system('LatLonCS').n_pole - rlons, rlats = iris.analysis.cartography.rotate_pole(lons, lats, n_pole.longitude, n_pole.latitude) + n_pole = cube.coord_system('RotatedGeogCS').grid_north_pole + rlons, rlats = iris.analysis.cartography.rotate_pole(lons, lats, n_pole.lon, n_pole.lat) plt.scatter(rlons, rlats) self.check_graphic() diff --git a/lib/iris_tests/test_analysis_calculus.py b/lib/iris_tests/test_analysis_calculus.py index 2c2e5ad816..e521c54228 100644 --- a/lib/iris_tests/test_analysis_calculus.py +++ b/lib/iris_tests/test_analysis_calculus.py @@ -186,7 +186,7 @@ def setUp(self): data = numpy.arange(2500, dtype=numpy.float32).reshape(50, 50) cube = iris.cube.Cube(data, standard_name="x_wind", units="km/h") - self.lonlat_cs = iris.coord_systems.LatLonCS(iris.coord_systems.SpheroidDatum(), iris.coord_systems.PrimeMeridian(), iris.coord_systems.GeoPosition(90, 0), "reference_longitude?") + self.lonlat_cs = iris.coord_systems.GeogCS() cube.add_dim_coord(DimCoord(numpy.arange(50, dtype=numpy.float32) * 4.5 -180, 'longitude', units='degrees', coord_system=self.lonlat_cs), 0) cube.add_dim_coord(DimCoord(numpy.arange(50, dtype=numpy.float32) * 4.5 -90, 'latitude', units='degrees', coord_system=self.lonlat_cs), 1) @@ -211,7 +211,7 @@ def setUp(self): [4, 5, 6, 7, 9]], dtype=numpy.float32) cube = iris.cube.Cube(data, standard_name="x_wind", units="km/h") - self.lonlat_cs = iris.coord_systems.LatLonCS(iris.coord_systems.SpheroidDatum(), iris.coord_systems.PrimeMeridian(), iris.coord_systems.GeoPosition(90, 0), "reference_longitude?") + self.lonlat_cs = iris.coord_systems.GeogCS() cube.add_dim_coord(DimCoord(numpy.arange(4, dtype=numpy.float32) * 90 -180, 'longitude', units='degrees', circular=True, coord_system=self.lonlat_cs), 0) cube.add_dim_coord(DimCoord(numpy.arange(5, dtype=numpy.float32) * 45 -90, 'latitude', units='degrees', coord_system=self.lonlat_cs), 1) @@ -293,15 +293,13 @@ def build_cube(data, spherical=False): dimz = data.ndim - 3 if data.ndim > 2 else None if spherical: - hcs = iris.coord_systems.LatLonCS( iris.coord_systems.SpheroidDatum(label="Tiny Earth", semi_major_axis=6321, flattening=0.0, units="m"), - iris.coord_systems.PrimeMeridian(), iris.coord_systems.GeoPosition(90, 0), "reference_longitude?") + hcs = iris.coord_systems.GeogCS(semi_major_axis=6321, units="m") cube.add_dim_coord(DimCoord(numpy.arange(-180, 180, 360./nx, dtype=numpy.float32), 'longitude', units='degrees', coord_system=hcs, circular=True), dimx) cube.add_dim_coord(DimCoord(numpy.arange(-90, 90, 180./ny, dtype=numpy.float32), 'latitude', units='degrees',coord_system=hcs), dimy) else: - hcs = iris.coord_systems.HorizontalCS("Cartesian Datum?") - cube.add_dim_coord(DimCoord(numpy.arange(nx, dtype=numpy.float32) * 2.21 + 2, long_name='x', units='meters', coord_system=hcs), dimx) - cube.add_dim_coord(DimCoord(numpy.arange(ny, dtype=numpy.float32) * 25 -50, long_name='y', units='meters', coord_system=hcs), dimy) + cube.add_dim_coord(DimCoord(numpy.arange(nx, dtype=numpy.float32) * 2.21 + 2, long_name='x', units='meters'), dimx) + cube.add_dim_coord(DimCoord(numpy.arange(ny, dtype=numpy.float32) * 25 -50, long_name='y', units='meters'), dimy) if nz is None: cube.add_aux_coord(DimCoord(numpy.array([10], dtype=numpy.float32), long_name='z', units='meters')) diff --git a/lib/iris_tests/test_cdm.py b/lib/iris_tests/test_cdm.py index 0a860f2afa..c47c38ffb0 100644 --- a/lib/iris_tests/test_cdm.py +++ b/lib/iris_tests/test_cdm.py @@ -308,15 +308,6 @@ def test_invalid_dimension_vector_coord(self): with self.assertRaises(ValueError): self.cube_2d.add_dim_coord(wobble, 99) - def test_invalid_coord_system(self): - cs = self.cube_2d.coord('latitude').coord_system - old_cs_type = cs.cs_type - cs.cs_type = -999 - try: - self.assertRaises(iris.exceptions.InvalidCubeError, cs.assert_valid) - finally: - cs.cs_type = old_cs_type - class TestQueryCoord(tests.IrisTest): def setUp(self): diff --git a/lib/iris_tests/test_coord_api.py b/lib/iris_tests/test_coord_api.py index fd63ed73bd..40dbc9dc70 100644 --- a/lib/iris_tests/test_coord_api.py +++ b/lib/iris_tests/test_coord_api.py @@ -173,12 +173,12 @@ def setUp(self): self.lat = iris.tests.stock.realistic_4d().coord('grid_latitude') def test_DimCoord(self): - result = "DimCoord(array([-0.1278, -0.1269, -0.126 , -0.1251, -0.1242, -0.1233, -0.1224,\n -0.1215, -0.1206, -0.1197], dtype=float32), bounds=array([[-0.12825, -0.12735],\n [-0.12735, -0.12645],\n [-0.12645, -0.12555],\n [-0.12555, -0.12465],\n [-0.12465, -0.12375],\n [-0.12375, -0.12285],\n [-0.12285, -0.12195],\n [-0.12195, -0.12105],\n [-0.12105, -0.12015],\n [-0.12015, -0.11925]], dtype=float32), standard_name='grid_latitude', units=Unit('degrees'), coord_system=LatLonCS(SpheroidDatum(label='spherical', semi_major_axis=6371229.0, semi_minor_axis=6371229.0, flattening=0.0, units='m'), PrimeMeridian(label='Greenwich', value=0.0), GeoPosition(latitude=37.5, longitude=177.5), 0.0))" + result = "DimCoord(array([-0.1278, -0.1269, -0.126 , -0.1251, -0.1242, -0.1233, -0.1224,\n -0.1215, -0.1206, -0.1197], dtype=float32), bounds=array([[-0.12825, -0.12735],\n [-0.12735, -0.12645],\n [-0.12645, -0.12555],\n [-0.12555, -0.12465],\n [-0.12465, -0.12375],\n [-0.12375, -0.12285],\n [-0.12285, -0.12195],\n [-0.12195, -0.12105],\n [-0.12105, -0.12015],\n [-0.12015, -0.11925]], dtype=float32), standard_name='grid_latitude', units=Unit('degrees'), coord_system=RotatedGeogCS(semi_major_axis=6371229.0, semi_minor_axis=6371229.0, inverse_flattening=0.0, units=m, longitude_of_prime_meridian=0.0, grid_north_pole=GeoPos(37.5, 177.5), north_pole_lon=0.0))" self.maxDiff = None self.assertMultiLineEqual(result, repr(self.lat[:10])) def test_AuxCoord(self): - result = "AuxCoord(array([-0.1278, -0.1269, -0.126 , -0.1251, -0.1242, -0.1233, -0.1224,\n -0.1215, -0.1206, -0.1197], dtype=float32), bounds=array([[-0.12825, -0.12735],\n [-0.12735, -0.12645],\n [-0.12645, -0.12555],\n [-0.12555, -0.12465],\n [-0.12465, -0.12375],\n [-0.12375, -0.12285],\n [-0.12285, -0.12195],\n [-0.12195, -0.12105],\n [-0.12105, -0.12015],\n [-0.12015, -0.11925]], dtype=float32), standard_name='grid_latitude', units=Unit('degrees'), coord_system=LatLonCS(SpheroidDatum(label='spherical', semi_major_axis=6371229.0, semi_minor_axis=6371229.0, flattening=0.0, units='m'), PrimeMeridian(label='Greenwich', value=0.0), GeoPosition(latitude=37.5, longitude=177.5), 0.0))" + result = "AuxCoord(array([-0.1278, -0.1269, -0.126 , -0.1251, -0.1242, -0.1233, -0.1224,\n -0.1215, -0.1206, -0.1197], dtype=float32), bounds=array([[-0.12825, -0.12735],\n [-0.12735, -0.12645],\n [-0.12645, -0.12555],\n [-0.12555, -0.12465],\n [-0.12465, -0.12375],\n [-0.12375, -0.12285],\n [-0.12285, -0.12195],\n [-0.12195, -0.12105],\n [-0.12105, -0.12015],\n [-0.12015, -0.11925]], dtype=float32), standard_name='grid_latitude', units=Unit('degrees'), coord_system=RotatedGeogCS(semi_major_axis=6371229.0, semi_minor_axis=6371229.0, inverse_flattening=0.0, units=m, longitude_of_prime_meridian=0.0, grid_north_pole=GeoPos(37.5, 177.5), north_pole_lon=0.0))" coord = iris.coords.AuxCoord.from_coord(self.lat[:10]) self.maxDiff = None self.assertMultiLineEqual(result, repr(coord)) @@ -205,8 +205,8 @@ def test_excluded_attributes(self): a.attributes.update({'standard_name': 'whoopsy'}) def test_coord_system(self): - a = iris.coords.AuxCoord(range(10), 'air_temperature', units='kelvin', coord_system=iris.coord_systems.HorizontalCS(None)) - result = "AuxCoord(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), standard_name='air_temperature', units=Unit('kelvin'), coord_system=HorizontalCS(None, 'cartesian'))" + a = iris.coords.AuxCoord(range(10), 'air_temperature', units='kelvin', coord_system=iris.coord_systems.GeogCS(6000, units="m")) + result = "AuxCoord(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), standard_name='air_temperature', units=Unit('kelvin'), coord_system=GeogCS(semi_major_axis=6000.0, semi_minor_axis=6000.0, inverse_flattening=0.0, units=m, longitude_of_prime_meridian=0.0))" self.assertEqual(result, str(a)) def test_bounded(self): @@ -244,8 +244,8 @@ def test_excluded_attributes(self): a.attributes.update({'standard_name': 'whoopsy'}) def test_coord_system(self): - a = iris.coords.DimCoord(range(10), 'air_temperature', units='kelvin', coord_system=iris.coord_systems.HorizontalCS(None)) - result = "DimCoord(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), standard_name='air_temperature', units=Unit('kelvin'), coord_system=HorizontalCS(None, 'cartesian'))" + a = iris.coords.DimCoord(range(10), 'air_temperature', units='kelvin', coord_system=iris.coord_systems.GeogCS(6000, units="m")) + result = "DimCoord(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), standard_name='air_temperature', units=Unit('kelvin'), coord_system=GeogCS(semi_major_axis=6000.0, semi_minor_axis=6000.0, inverse_flattening=0.0, units=m, longitude_of_prime_meridian=0.0))" self.assertEqual(result, str(a)) def test_bounded(self): diff --git a/lib/iris_tests/test_coordsystem.py b/lib/iris_tests/test_coordsystem.py index 5b5b3b9457..a2af18dc89 100644 --- a/lib/iris_tests/test_coordsystem.py +++ b/lib/iris_tests/test_coordsystem.py @@ -26,15 +26,25 @@ import iris.coords import iris.unit +from iris.coord_systems import * + logger = logging.getLogger('tests') + +def osgb(): + return TransverseMercator(GeogCS(6377563.396, 6356256.909, 299.3249646, "m"), + origin=(49,-2), false_origin=(-400,100), + scale_factor=0.9996012717) + + + class TestCoordSystemSame(tests.IrisTest): def setUp(self): - self.cs1 = iris.coord_systems.HorizontalCS(None) - self.cs2 = iris.coord_systems.HorizontalCS(None) - self.cs3 = iris.coord_systems.LatLonCS(None, None, None, None) + self.cs1 = iris.coord_systems.GeogCS() + self.cs2 = iris.coord_systems.GeogCS() + self.cs3 = iris.coord_systems.RotatedGeogCS(grid_north_pole=(30,30)) def test_simple(self): a = self.cs1 @@ -66,5 +76,114 @@ def test_different_public_attributes(self): self.assertNotEquals(a, b) +class Test_CoordSystem_xml_element(tests.IrisTest): + def test_rotated(self): + cs = RotatedGeogCS(grid_north_pole=(30,40)) + self.assertXMLElement(cs, tests.get_result_path(("coord_systems", "CoordSystem_xml_element.xml"))) + + +class Test_GeogCS_init(tests.IrisTest): + # Test Ellipsoid constructor + # Don't care about testing the units, it has no logic specific to this class. + + def test_no_params(self): + cs = GeogCS() + self.assertXMLElement(cs, tests.get_result_path(("coord_systems", "GeogCS_init_no_param.xml"))) + + def test_sphere_param(self): + cs = GeogCS(6543210, units="m") + self.assertXMLElement(cs, tests.get_result_path(("coord_systems", "GeogCS_init_sphere.xml"))) + + def test_all_ellipsoid_params(self): + cs = GeogCS(6543210, 6500000, 151.42814163388104, "m") + self.assertXMLElement(cs, tests.get_result_path(("coord_systems", "GeogCS_init_all_ellipsoid.xml"))) + + def test_no_major(self): + cs = GeogCS(semi_minor_axis=6500000, inverse_flattening=151.42814163388104, units="m") + self.assertXMLElement(cs, tests.get_result_path(("coord_systems", "GeogCS_init_no_major.xml"))) + + def test_no_minor(self): + cs = GeogCS(semi_major_axis=6543210, inverse_flattening=151.42814163388104, units="m") + self.assertXMLElement(cs, tests.get_result_path(("coord_systems", "GeogCS_init_no_minor.xml"))) + + def test_no_invf(self): + cs = GeogCS(semi_major_axis=6543210, semi_minor_axis=6500000, units="m") + self.assertXMLElement(cs, tests.get_result_path(("coord_systems", "GeogCS_init_no_invf.xml"))) + + def test_units(self): + # Just make sure they get conveted to a unit, not overly concerned about testing this param. + cs = GeogCS(6543210, units="m") + self.assertEqual(cs.units, iris.unit.Unit("m")) + + +class Test_GeogCS_repr(tests.IrisTest): + def test_repr(self): + cs = GeogCS(6543210, 6500000, 151.42814163388104, "m") + expected = "GeogCS(semi_major_axis=6543210.0, semi_minor_axis=6500000.0, inverse_flattening=151.42814163388104, units='Unit('m')', longitude_of_prime_meridian=0.0)" + self.assertEqual(expected, repr(cs)) + +class Test_GeogCS_str(tests.IrisTest): + def test_str(self): + cs = GeogCS(6543210, 6500000, 151.42814163388104, "m") + expected = "GeogCS(semi_major_axis=6543210.0, semi_minor_axis=6500000.0, inverse_flattening=151.428141634, units=m, longitude_of_prime_meridian=0.0)" + self.assertEqual(expected, str(cs)) + + +class Test_GeogCS_to_cartopy(tests.IrisTest): + def test_to_cartopy(self): + cs = GeogCS() + self.assertRaises(NotImplementedError, cs._to_cartopy) + + +class Test_RotatedGeogCS_init(tests.IrisTest): + def test_init(self): + rcs = RotatedGeogCS(grid_north_pole=(30,40), north_pole_lon=50) + self.assertXMLElement(rcs, tests.get_result_path(("coord_systems", "RotatedGeogCS_init.xml"))) + + +class Test_RotatedGeogCS_repr(tests.IrisTest): + def test_repr(self): + rcs = RotatedGeogCS(grid_north_pole=(30,40), north_pole_lon=50) + expected = "RotatedGeogCS(semi_major_axis=6371229.0, semi_minor_axis=6371229.0, inverse_flattening=0.0, units='Unit('m')', longitude_of_prime_meridian=0.0, grid_north_pole=GeoPos(30.0, 40.0), north_pole_lon=50.0)" + self.assertEqual(expected, repr(rcs)) + +class Test_RotatedGeogCS_str(tests.IrisTest): + def test_str(self): + rcs = RotatedGeogCS(grid_north_pole=(30,40), north_pole_lon=50) + expected = "RotatedGeogCS(semi_major_axis=6371229.0, semi_minor_axis=6371229.0, inverse_flattening=0.0, units=m, longitude_of_prime_meridian=0.0, grid_north_pole=GeoPos(30.0, 40.0), north_pole_lon=50.0)" + self.assertEqual(expected, str(rcs)) + + +class Test_RotatedGeogCS_from_geocs(tests.IrisTest): + def test_sphere(self): + cs = GeogCS() + rcs = RotatedGeogCS.from_geocs(cs, grid_north_pole=(30,40)) + self.assertXMLElement(rcs, tests.get_result_path(("coord_systems", "RotatedGeogCS_from_geocs.xml"))) + +class Test_RotatedGeogCS_tocartopy(tests.IrisTest): + def test_to_cartopy(self): + rcs = GeogCS() + self.assertRaises(NotImplementedError, rcs._to_cartopy) + + +class Test_TransverseMercator_init(tests.IrisTest): + def test_osgb(self): + tm = osgb() + self.assertXMLElement(tm, tests.get_result_path(("coord_systems", "TransverseMercator_osgb.xml"))) + + +class Test_TransverseMercator_repr(tests.IrisTest): + def test_osgb(self): + tm = osgb() + expected = "TransverseMercator(origin=GeoPos(49.0, -2.0), false_origin=(-400.0, 100.0), scale_factor=0.9996012717, geos=GeogCS(semi_major_axis=6377563.396, semi_minor_axis=6356256.909, inverse_flattening=299.3249646, units='Unit('m')', longitude_of_prime_meridian=0.0))" + self.assertEqual(expected, repr(tm)) + + +class Test_TransverseMercator_tocartopy(tests.IrisTest): + def test_to_cartopy(self): + tm = osgb() + self.assertRaises(NotImplementedError, tm._to_cartopy) + + if __name__ == "__main__": tests.main() diff --git a/lib/iris_tests/test_cube_to_pp.py b/lib/iris_tests/test_cube_to_pp.py index a83f7970e2..7f16218128 100644 --- a/lib/iris_tests/test_cube_to_pp.py +++ b/lib/iris_tests/test_cube_to_pp.py @@ -148,15 +148,15 @@ def test_non_standard_cross_sections(self): self.add_coords_to_cube_and_test( iris.coords.DimCoord(f.z, long_name='air_pressure', units='hPa', bounds=f.z_bounds), - iris.coords.DimCoord(f.y, standard_name='latitude', units='degrees', bounds=f.y_bounds, coord_system=f.horiz_coord_system())) + iris.coords.DimCoord(f.y, standard_name='latitude', units='degrees', bounds=f.y_bounds, coord_system=f.geocs())) self.add_coords_to_cube_and_test( iris.coords.DimCoord(f.z, long_name='depth', units='m', bounds=f.z_bounds), - iris.coords.DimCoord(f.y, standard_name='latitude', units='degrees', bounds=f.y_bounds, coord_system=f.horiz_coord_system())) + iris.coords.DimCoord(f.y, standard_name='latitude', units='degrees', bounds=f.y_bounds, coord_system=f.geocs())) self.add_coords_to_cube_and_test( iris.coords.DimCoord(f.z, long_name='eta', units='1', bounds=f.z_bounds), - iris.coords.DimCoord(f.y, standard_name='latitude', units='degrees', bounds=f.y_bounds, coord_system=f.horiz_coord_system())) + iris.coords.DimCoord(f.y, standard_name='latitude', units='degrees', bounds=f.y_bounds, coord_system=f.geocs())) self.add_coords_to_cube_and_test( iris.coords.DimCoord(f.z, long_name='air_pressure', units='hPa', bounds=f.z_bounds), @@ -174,17 +174,13 @@ class fakePPEnvironment(object): y_bounds = [[0.9,1.1], [1.9,2.1], [2.9,3.1], [3.9,4.1]] z_bounds = [[110.9,111.1], [221.9,222.1], [332.9,333.1], [443.9,444.1]] - def horiz_coord_system(self): - """Return a LatLonCS for this PPField. + def geocs(self): + """Return a GeogCS for this PPField. Returns: - A LatLonCS with the appropriate earth shape, meridian and pole position. + A GeogCS with the appropriate earth shape, meridian and pole position. """ - return iris.coord_systems.LatLonCS( - iris.coord_systems.SpheroidDatum("spherical", 6371229.0, - flattening=0.0, units=iris.unit.Unit('m')), - iris.coord_systems.PrimeMeridian(label="Greenwich", value=0.0), - iris.coord_systems.GeoPosition(90.0, 0.0), 0.0) + return iris.coord_systems.GeogCS(6371229.0, units=iris.unit.Unit('m')) @iris.tests.skip_data diff --git a/lib/iris_tests/test_grib_save.py b/lib/iris_tests/test_grib_save.py index 6d159b44e0..65ca4d7cdd 100644 --- a/lib/iris_tests/test_grib_save.py +++ b/lib/iris_tests/test_grib_save.py @@ -140,7 +140,7 @@ class TestHandmade(tests.IrisTest): def _lat_lon_cube_no_time(self): """Returns a cube with a latitude and longitude suitable for testing saving to PP/NetCDF etc.""" cube = iris.cube.Cube(numpy.arange(12, dtype=numpy.int32).reshape((3, 4))) - cs = iris.coord_systems.LatLonCS(iris.coord_systems.SpheroidDatum(), 'pm', iris.coord_systems.GeoPosition(90, 0), 0) + cs = iris.coord_systems.GeogCS() cube.add_dim_coord(iris.coords.DimCoord(numpy.arange(4) * 90 + -180, 'longitude', units='degrees', coord_system=cs), 1) cube.add_dim_coord(iris.coords.DimCoord(numpy.arange(3) * 45 + -90, 'latitude', units='degrees', coord_system=cs), 0) diff --git a/lib/iris_tests/test_intersect.py b/lib/iris_tests/test_intersect.py index a912cafb4f..5d8e7f338b 100644 --- a/lib/iris_tests/test_intersect.py +++ b/lib/iris_tests/test_intersect.py @@ -38,8 +38,7 @@ def test_simple_intersect(self): [4,5,6,7,8], [5,6,7,8,9]], dtype=numpy.int32)) - lonlat_cs = iris.coord_systems.LatLonCS("datum?", "prime_meridian?", - iris.coord_systems.GeoPosition(10, 20), "reference_longitude?") + lonlat_cs = iris.coord_systems.RotatedGeogCS(grid_north_pole=(10, 20)) cube.add_dim_coord(iris.coords.DimCoord(numpy.arange(5, dtype=numpy.float32) * 90 - 180, 'longitude', units='degrees', coord_system=lonlat_cs), 1) cube.add_dim_coord(iris.coords.DimCoord(numpy.arange(5, dtype=numpy.float32) * 45 - 90, 'latitude', units='degrees', coord_system=lonlat_cs), 0) cube.add_aux_coord(iris.coords.DimCoord(points=numpy.int32(11), long_name='pressure', units='Pa')) @@ -52,8 +51,7 @@ def test_simple_intersect(self): [4,5,6,7,8], [5,6,7,8,50]], dtype=numpy.int32)) - lonlat_cs = iris.coord_systems.LatLonCS("datum?", "prime_meridian?", - iris.coord_systems.GeoPosition(10, 20), "reference_longitude?") + lonlat_cs = iris.coord_systems.RotatedGeogCS(grid_north_pole=(10, 20)) cube2.add_dim_coord(iris.coords.DimCoord(numpy.arange(5, dtype=numpy.float32) * 90, 'longitude', units='degrees', coord_system=lonlat_cs), 1) cube2.add_dim_coord(iris.coords.DimCoord(numpy.arange(5, dtype=numpy.float32) * 45 - 90, 'latitude', units='degrees', coord_system=lonlat_cs), 0) cube2.add_aux_coord(iris.coords.DimCoord(points=numpy.int32(11), long_name='pressure', units='Pa')) diff --git a/lib/iris_tests/test_mapping.py b/lib/iris_tests/test_mapping.py index 8d306ffddf..5f35a95db8 100644 --- a/lib/iris_tests/test_mapping.py +++ b/lib/iris_tests/test_mapping.py @@ -59,9 +59,8 @@ def setUp(self): # Make a cube that can't be located on the globe. cube = iris.cube.Cube(src_cube.data) - cs = iris.coord_systems.HorizontalCS(None) - cube.add_dim_coord(iris.coords.DimCoord(numpy.arange(96, dtype=numpy.float32) * 100, long_name='x', units='m', coord_system=cs), 1) - cube.add_dim_coord(iris.coords.DimCoord(numpy.arange(73, dtype=numpy.float32) * 100, long_name='y', units='m', coord_system=cs), 0) + cube.add_dim_coord(iris.coords.DimCoord(numpy.arange(96, dtype=numpy.float32) * 100, long_name='x', units='m'), 1) + cube.add_dim_coord(iris.coords.DimCoord(numpy.arange(73, dtype=numpy.float32) * 100, long_name='y', units='m'), 0) cube.standard_name = 'air_temperature' cube.units = 'K' cube.assert_valid() @@ -75,8 +74,12 @@ def test_simple(self): def _pretend_unrotated(cube): lat = cube.coord('grid_latitude') lon = cube.coord('grid_longitude') - lat.coord_system.n_pole = iris.coord_systems.GeoPosition(90, 0) - lon.coord_system.n_pole = iris.coord_systems.GeoPosition(90, 0) + rcs = lat.coord_system + cs = iris.coord_systems.GeogCS(rcs.semi_major_axis, rcs.semi_minor_axis, + rcs.inverse_flattening, rcs.units, + rcs.longitude_of_prime_meridian) + lat.coord_system = cs + lon.coord_system = cs lat.standard_name = "latitude" lon.standard_name = "longitude" diff --git a/lib/iris_tests/test_merge.py b/lib/iris_tests/test_merge.py index f2c95a79ca..76968ab920 100644 --- a/lib/iris_tests/test_merge.py +++ b/lib/iris_tests/test_merge.py @@ -28,7 +28,6 @@ import iris.cube import iris.exceptions from iris.coords import DimCoord, AuxCoord -from iris.coord_systems import LatLonCS, GeoPosition import iris.coords import iris.tests.stock diff --git a/lib/iris_tests/test_pp_cf.py b/lib/iris_tests/test_pp_cf.py index f76de0bb3d..350f63f1bc 100644 --- a/lib/iris_tests/test_pp_cf.py +++ b/lib/iris_tests/test_pp_cf.py @@ -42,7 +42,10 @@ def callback_HadCM2_ts_SAT_ann_18602100_b_pp(cube, field, filename): def reset_pole(coord_name): coord = cube.coord(coord_name) coord.rename(coord.name().replace('grid_', '')) - coord.coord_system.n_pole = iris.coord_systems.GeoPosition(90.0, 0.0) + cs = coord.coord_system + coord.coord_system = iris.coord_systems.GeogCS(cs.semi_major_axis, cs.semi_minor_axis, + cs.inverse_flattening, cs.units, + cs.longitude_of_prime_meridian) reset_pole('grid_latitude') reset_pole('grid_longitude') cube.standard_name = 'air_temperature' diff --git a/lib/iris_tests/test_regrid.py b/lib/iris_tests/test_regrid.py index 8fa4828526..5a94f25748 100644 --- a/lib/iris_tests/test_regrid.py +++ b/lib/iris_tests/test_regrid.py @@ -26,7 +26,7 @@ from iris.analysis.interpolate import regrid_to_max_resolution from iris.cube import Cube from iris.coords import DimCoord -from iris.coord_systems import LatLonCS, GeoPosition +from iris.coord_systems import GeogCS @iris.tests.skip_data @@ -91,17 +91,17 @@ def test_regrid_3d(self): def test_regrid_max_resolution(self): low = Cube(numpy.arange(12).reshape((3, 4))) - cs = LatLonCS('datum', 'pm', GeoPosition(90, 0), 0) + cs = GeogCS() low.add_dim_coord(DimCoord(numpy.array([-1, 0, 1], dtype=numpy.int32), 'latitude', units='degrees', coord_system=cs), 0) low.add_dim_coord(DimCoord(numpy.array([-1, 0, 1, 2], dtype=numpy.int32), 'longitude', units='degrees', coord_system=cs), 1) med = Cube(numpy.arange(20).reshape((4, 5))) - cs = LatLonCS('datum', 'pm', GeoPosition(90, 0), 0) + cs = GeogCS() med.add_dim_coord(DimCoord(numpy.array([-1, 0, 1, 2], dtype=numpy.int32), 'latitude', units='degrees', coord_system=cs), 0) med.add_dim_coord(DimCoord(numpy.array([-2, -1, 0, 1, 2], dtype=numpy.int32), 'longitude', units='degrees', coord_system=cs), 1) high = Cube(numpy.arange(30).reshape((5, 6))) - cs = LatLonCS('datum', 'pm', GeoPosition(90, 0), 0) + cs = GeogCS() high.add_dim_coord(DimCoord(numpy.array([-2, -1, 0, 1, 2], dtype=numpy.int32), 'latitude', units='degrees', coord_system=cs), 0) high.add_dim_coord(DimCoord(numpy.array([-2, -1, 0, 1, 2, 3], dtype=numpy.int32), 'longitude', units='degrees', coord_system=cs), 1) @@ -111,7 +111,7 @@ def test_regrid_max_resolution(self): class TestRegridBilinear(tests.IrisTest): def setUp(self): - self.cs = LatLonCS(None, None, GeoPosition(90, 0), 0) + self.cs = GeogCS() # Source cube candidate for regridding. cube = Cube(numpy.arange(12, dtype=numpy.float32).reshape(3, 4), long_name='unknown') diff --git a/lib/iris_tests/test_xml.py b/lib/iris_tests/test_xml.py index 5e14c4721b..5e40d5703b 100644 --- a/lib/iris_tests/test_xml.py +++ b/lib/iris_tests/test_xml.py @@ -60,11 +60,10 @@ def test_handmade(self): cube.attributes['my_attribute'] = 'foobar' if rotated == False: - pole_pos = coord_systems.GeoPosition(90, 0) + lonlat_cs = coord_systems.GeogCS() else: - pole_pos = coord_systems.GeoPosition(30, 150) + lonlat_cs = coord_systems.RotatedGeogCS(grid_north_pole=(30, 150)) - lonlat_cs = coord_systems.LatLonCS("datum?", "prime_meridian?", pole_pos, "reference_longitude?") cube.add_dim_coord(coords.DimCoord(numpy.array([-180, -90, 0, 90, 180], dtype=ll_dtype), 'longitude', units='degrees', coord_system=lonlat_cs), 1) cube.add_dim_coord(coords.DimCoord(numpy.array([-90, -45, 0, 45, 90], dtype=ll_dtype), From 4aa3301df42c1d7d5c3a80ba5750545d6f46c93c Mon Sep 17 00:00:00 2001 From: bblay Date: Thu, 30 Aug 2012 16:00:22 +0100 Subject: [PATCH 3/4] review actions and immediate after effects - pre tests passing --- .../graphics/custom_file_loading.py | 2 +- .../GeogCS_init_all_ellipsoid.xml | 2 - .../coord_systems/GeogCS_init_no_param.xml | 2 - lib/iris/analysis/calculus.py | 37 +- lib/iris/analysis/cartography.py | 22 +- lib/iris/coord_systems.py | 347 ++++++++---------- lib/iris/etc/grib_rules.txt | 16 +- lib/iris/etc/pp_rules.txt | 18 +- lib/iris/etc/pp_save_rules.txt | 9 +- .../fileformats/_pyke_rules/fc_rules_cf.krb | 23 +- lib/iris/fileformats/grib.py | 38 +- lib/iris/fileformats/grib_save_rules.py | 32 +- lib/iris/fileformats/netcdf.py | 82 +++-- lib/iris/fileformats/pp.py | 28 +- lib/iris_tests/stock.py | 7 +- lib/iris_tests/system_test.py | 2 +- lib/iris_tests/test_aggregate_by.py | 4 +- lib/iris_tests/test_analysis.py | 11 +- lib/iris_tests/test_analysis_calculus.py | 6 +- lib/iris_tests/test_coord_api.py | 38 +- lib/iris_tests/test_coordsystem.py | 130 +++---- lib/iris_tests/test_cube_to_pp.py | 10 +- lib/iris_tests/test_grib_load.py | 2 +- lib/iris_tests/test_grib_save.py | 2 +- lib/iris_tests/test_intersect.py | 4 +- lib/iris_tests/test_mapping.py | 8 +- lib/iris_tests/test_pp_cf.py | 6 +- lib/iris_tests/test_regrid.py | 8 +- lib/iris_tests/test_xml.py | 4 +- 29 files changed, 448 insertions(+), 452 deletions(-) delete mode 100644 etc/iris_tests_results/coord_systems/GeogCS_init_all_ellipsoid.xml delete mode 100644 etc/iris_tests_results/coord_systems/GeogCS_init_no_param.xml diff --git a/docs/iris/example_code/graphics/custom_file_loading.py b/docs/iris/example_code/graphics/custom_file_loading.py index 977156671e..9e96ed52be 100644 --- a/docs/iris/example_code/graphics/custom_file_loading.py +++ b/docs/iris/example_code/graphics/custom_file_loading.py @@ -164,7 +164,7 @@ def NAME_to_cube(filenames, callback): cube.add_aux_coord(time_coord) # build a coordinate system which can be referenced by latitude and longitude coordinates - lat_lon_coord_system = icoord_systems.GeogCS(6371229.0, units='m') + lat_lon_coord_system = icoord_systems.GeogCS(6371229) # build regular latitude and longitude coordinates which have bounds start = header['X grid origin'] + header['X grid resolution'] diff --git a/etc/iris_tests_results/coord_systems/GeogCS_init_all_ellipsoid.xml b/etc/iris_tests_results/coord_systems/GeogCS_init_all_ellipsoid.xml deleted file mode 100644 index 3dff789574..0000000000 --- a/etc/iris_tests_results/coord_systems/GeogCS_init_all_ellipsoid.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/etc/iris_tests_results/coord_systems/GeogCS_init_no_param.xml b/etc/iris_tests_results/coord_systems/GeogCS_init_no_param.xml deleted file mode 100644 index ea44f16b18..0000000000 --- a/etc/iris_tests_results/coord_systems/GeogCS_init_no_param.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/lib/iris/analysis/calculus.py b/lib/iris/analysis/calculus.py index 1053bec6fe..62e94404f3 100644 --- a/lib/iris/analysis/calculus.py +++ b/lib/iris/analysis/calculus.py @@ -440,18 +440,6 @@ def curl(i_cube, j_cube, k_cube=None, ignore=None, update_history=True): ignore = None warnings.warn('The ignore keyword to iris.analysis.calculus.curl is deprecated, ignoring is now done automatically.') - # get the radius of the earth - latlon_cs = i_cube.coord_system(iris.coord_systems.GeogCS) - if latlon_cs and isinstance(latlon_cs, iris.coord_systems.RotatedGeogCS): - # TODO: Add a test for this - # TODO: This assumes spherical for an ellipsoid? - r = latlon_cs.semi_major_axis - r_unit = latlon_cs.units - else: - r = iris.analysis.cartography.DEFAULT_SPHERICAL_EARTH_RADIUS - r_unit = iris.analysis.cartography.DEFAULT_SPHERICAL_EARTH_RADIUS_UNIT - - # Get the vector quantity names (i.e. ['easterly', 'northerly', 'vertical']) vector_quantity_names, phenomenon_name = spatial_vectors_with_phenom_name(i_cube, j_cube, k_cube) @@ -483,7 +471,8 @@ def curl(i_cube, j_cube, k_cube=None, ignore=None, update_history=True): horiz_cs = i_cube.coord_system('CoordSystem') # Planar (non spherical) coords? - if horiz_cs is None or isinstance(horiz_cs, iris.coord_systems.MapProjection): + ellipsoidal = isinstance(horiz_cs, iris.coord_systems.GeogCS) or isinstance(horiz_cs, iris.coord_systems.RotatedGeogCS) + if not ellipsoidal: # TODO Implement some mechanism for conforming to a common grid dj_dx = _curl_differentiate(j_cube, x_coord) @@ -526,8 +515,8 @@ def curl(i_cube, j_cube, k_cube=None, ignore=None, update_history=True): result = [i_cmpt, j_cmpt, k_cmpt] - # Spherical coords. - elif isinstance(horiz_cs, iris.coord_systems.GeogCS): + # Spherical coords (GeogCS or RotatedGeogCS). + else: # A_\phi = i ; A_\theta = j ; A_\r = k # theta = lat ; phi = long ; # r_cmpt = 1/ ( r * cos(lat) ) * ( d/dtheta ( i_cube * sin( lat ) ) - d_j_cube_dphi ) @@ -535,6 +524,21 @@ def curl(i_cube, j_cube, k_cube=None, ignore=None, update_history=True): # theta_cmpt = 1/r * ( 1/cos(lat) * d_k_cube_dphi - d/dr (r * i_cube) if y_coord.name() != 'latitude' or x_coord.name() != 'longitude': raise ValueError('Expecting latitude as the y coord and longitude as the x coord for spherical curl.') + + # Get the radius of the earth - and check for sphericity + if isinstance(horiz_cs, iris.coord_systems.RotatedGeogCS): + # TODO: Add a test for this + # TODO: This assumes spherical for an ellipsoid? + r = latlon_cs.semi_major_axis + r_unit = latlon_cs.units + spherical = (horiz_cs.inverse_flattening == 0.0) + else: + r = iris.analysis.cartography.DEFAULT_SPHERICAL_EARTH_RADIUS + r_unit = iris.analysis.cartography.DEFAULT_SPHERICAL_EARTH_RADIUS_UNIT + spherical = True + + if not spherical: + raise Exception("Cannot take the curl over a non-spherical ellipsoid.") lon_coord = x_coord.unit_converted('radians') lat_coord = y_coord.unit_converted('radians') @@ -589,9 +593,6 @@ def curl(i_cube, j_cube, k_cube=None, ignore=None, update_history=True): result = [phi_cmpt, theta_cmpt, r_cmpt] - else: - raise ValueError("Uknown cs type") - for direction, cube in zip(vector_quantity_names, result): if cube is not None: cube.rename('%s curl of %s' % (direction, phenomenon_name)) diff --git a/lib/iris/analysis/cartography.py b/lib/iris/analysis/cartography.py index 27dc0ebb27..80fb353824 100644 --- a/lib/iris/analysis/cartography.py +++ b/lib/iris/analysis/cartography.py @@ -110,7 +110,7 @@ def lat_lon_range(cube, mode=None): """ # get the lat and lon coords (might have "grid_" at the start of the name, if rotated). lat_coord, lon_coord = _get_lat_lon_coords(cube) - cs = cube.coord_system('GeogCS') + cs = cube.coord_system('CoordSystem') if lon_coord.has_bounds() != lat_coord.has_bounds(): raise ValueError('Cannot get the range of the latitude and longitude coordinates if they do ' @@ -154,7 +154,7 @@ def get_lat_lon_grids(cube): """ # get the lat and lon coords (might have "grid_" at the start of the name, if rotated). lat_coord, lon_coord = _get_lat_lon_coords(cube) - cs = cube.coord_system('GeogCS') + cs = cube.coord_system('CoordSystem') if lon_coord.units != 'degrees': lon_coord = lon_coord.unit_converted('degrees') @@ -169,7 +169,7 @@ def get_lat_lon_grids(cube): # if the pole was rotated, then un-rotate it if isinstance(cs, iris.coord_systems.RotatedGeogCS): - lons, lats = unrotate_pole(lons, lats, cs.grid_north_pole.lon, cs.grid_north_pole.lat) + lons, lats = unrotate_pole(lons, lats, cs.grid_north_pole_longitude, cs.grid_north_pole_latitude) return (lats, lons) @@ -186,7 +186,7 @@ def get_lat_lon_contiguous_bounded_grids(cube): """ # get the lat and lon coords (might have "grid_" at the start of the name, if rotated). lat_coord, lon_coord = _get_lat_lon_coords(cube) - cs = cube.coord_system('GeogCS') + cs = cube.coord_system('CoordSystem') if lon_coord.units != 'degrees': lon_coord = lon_coord.unit_converted('degrees') @@ -197,7 +197,7 @@ def get_lat_lon_contiguous_bounded_grids(cube): lats = lat_coord.contiguous_bounds() lons, lats = numpy.meshgrid(lons, lats) if isinstance(cs, iris.coord_systems.RotatedGeogCS): - lons, lats = iris.analysis.cartography.unrotate_pole(lons, lats, cs.grid_north_pole.lon, cs.grid_north_pole.lat) + lons, lats = iris.analysis.cartography.unrotate_pole(lons, lats, cs.grid_north_pole_longitude, cs.grid_north_pole_latitude) return (lats, lons) @@ -254,9 +254,15 @@ def area_weights(cube): """ # Get the radius of the earth - latlon_cs = cube.coord_system(iris.coord_systems.GeogCS) - if latlon_cs: - radius_of_earth = latlon_cs.semi_major_axis + cs = cube.coord_system("CoordSystem") + if isinstance(cs, iris.coord_systems.GeogCS): + if cs.inverse_flattening != 0.0: + warnings.warn("Assuming spherical earth from ellipsoid.") + radius_of_earth = cs.semi_major_axis + elif isinstance(cs, iris.coord_systems.RotatedGeogCS) and cs.ellipsoid is not None: + if cs.ellipsoid.inverse_flattening != 0.0: + warnings.warn("Assuming spherical earth from ellipsoid.") + radius_of_earth = cs.ellipsoid.semi_major_axis else: warnings.warn("Using DEFAULT_SPHERICAL_EARTH_RADIUS.") radius_of_earth = DEFAULT_SPHERICAL_EARTH_RADIUS diff --git a/lib/iris/coord_systems.py b/lib/iris/coord_systems.py index c93306370c..6170c7e5ec 100644 --- a/lib/iris/coord_systems.py +++ b/lib/iris/coord_systems.py @@ -34,17 +34,18 @@ class CoordSystem(object): """ __metaclass__ = ABCMeta - name = None - """CF: grid_mapping_name.""" + grid_mapping_name = None def __eq__(self, other): return self.__class__ == other.__class__ and self.__dict__ == other.__dict__ def __ne__(self, other): + # Must supply __ne__, Python does not defer to __eq__ for negative equality return not (self == other) - def xml_element(self, doc): + def xml_element(self, doc, attrs=None): """Default behaviour for coord systems.""" + # attrs - optional list of (k,v) items, used for alternate output xml_element_name = type(self).__name__ # lower case the first char @@ -52,10 +53,8 @@ def xml_element(self, doc): coord_system_xml_element = doc.createElement(xml_element_name) - attrs = [] - for k, v in self.__dict__.iteritems(): - attrs.append([k, v]) - + if attrs is None: + attrs = self.__dict__.items() attrs.sort(key=lambda attr: attr[0]) for name, value in attrs: @@ -63,38 +62,27 @@ def xml_element(self, doc): return coord_system_xml_element -# # TODO: Is there value in defining the units this coord system uses? Perhaps for validation purposes. -# def units(self): -# raise NotImplementedError() - - def _to_cartopy(self): - """Create a representation of ourself using a cartopy object.""" - raise NotImplementedError() - class GeogCS(CoordSystem): """An geographic (ellipsoidal) coordinate system, defined by the shape of the Earth and a prime meridian.""" - name = "latitude_longitude" + grid_mapping_name = "latitude_longitude" # TODO: Consider including a label, but don't currently see the need. - def __init__(self, semi_major_axis=None, semi_minor_axis=None, inverse_flattening=None, units=None, - longitude_of_prime_meridian=None): - """Creates a new GeogCS. + def __init__(self, semi_major_axis=None, semi_minor_axis=None, inverse_flattening=None, + longitude_of_prime_meridian=0): + """ + Creates a new GeogCS. Kwargs: * semi_major_axis - of ellipsoid * semi_minor_axis - of ellipsoid * inverse_flattening - of ellipsoid - * units - of measure of the radii * longitude_of_prime_meridian - Can be used to specify the prime meridian on the ellipsoid. Default = 0. - If all three of semi_major_axis, semi_minor_axis, and inverse_flattening are None then - it defaults to a perfect sphere using the radius 6371229m. - - If just semi_major_axis is set, with no semi_minor_axis or inverse_flattening then + If just semi_major_axis is set, with no semi_minor_axis or inverse_flattening, then a perfect sphere is created from the given radius. If just two of semi_major_axis, semi_minor_axis, and inverse_flattening are given @@ -103,59 +91,48 @@ def __init__(self, semi_major_axis=None, semi_minor_axis=None, inverse_flattenin flattening = (semi_major_axis - semi_minor_axis) / semi_major_axis + Currently, Iris will not allow over-specification (all three ellipsoid paramaters). + Examples: - default_cs = GeogCS() - airy1830 = GeogCS(semi_major_axis=6377563.396, semi_minor_axis=6356256.909, inverse_flattening=299.3249646, units="m") - airy1830 = GeogCS(semi_major_axis=6377563.396, semi_minor_axis=6356256.909, units="m") - custom_cs = GeogCS(6400, 6300, units="km") + cs = GeogCS(6371229) + pp_cs = GeogCS(iris.fileformats.pp.EARTH_RADIUS) + airy1830 = GeogCS(semi_major_axis=6377563.396, semi_minor_axis=6356256.909, inverse_flattening=299.3249646) + airy1830 = GeogCS(semi_major_axis=6377563.396, semi_minor_axis=6356256.909) + custom_cs = GeogCS(6400000, 6300000) """ - # Default (no ellipsoid parmas) - if (semi_major_axis is None) and (semi_minor_axis is None) and (inverse_flattening is None): - DEFAULT_RADII = 6371229.0 - semi_major_axis = DEFAULT_RADII - semi_minor_axis = DEFAULT_RADII - inverse_flattening = 0.0 - units = iris.unit.Unit('m') + # No ellipsoid specified? + if (semi_major_axis is None) and (semi_minor_axis is None) and (inverse_flattening is None): # 0 0 0 + raise ValueError("No ellipsoid specified") + + # Ellipsoid over-specified? + if (semi_major_axis is not None) and (semi_minor_axis is not None) and (inverse_flattening is not None): # 1 1 1 + raise ValueError("Ellipsoid is overspecified") - # Sphere (major axis only) - elif semi_major_axis is not None and (semi_minor_axis is None and inverse_flattening is None): + # Perfect sphere (semi_major_axis only)? + elif semi_major_axis is not None and (semi_minor_axis is None and inverse_flattening is None): # 1 0 0 semi_minor_axis = semi_major_axis inverse_flattening = 0.0 - # Calculate missing param? - elif semi_major_axis is None: - if semi_minor_axis is None or inverse_flattening is None: - raise ValueError("Must have at least two of semi_major_axis, semi_minor_axis and inverse_flattening") + # Calculate semi_major_axis? + elif semi_major_axis is None and (semi_minor_axis is not None and inverse_flattening is not None): # 0 1 1 semi_major_axis = -semi_minor_axis / ((1.0 - inverse_flattening) / inverse_flattening) - elif semi_minor_axis is None: - if semi_major_axis is None or inverse_flattening is None: - raise ValueError("Must have at least two of semi_major_axis, semi_minor_axis and inverse_flattening") + # Calculate semi_minor_axis? + elif semi_minor_axis is None and (semi_major_axis is not None and inverse_flattening is not None): # 1 0 1 semi_minor_axis = semi_major_axis - (1.0 / inverse_flattening) * semi_major_axis - elif inverse_flattening is None: - if semi_major_axis is None or semi_minor_axis is None: - raise ValueError("Must have at least two of semi_major_axis, semi_minor_axis and inverse_flattening") + # Calculate inverse_flattening? + elif inverse_flattening is None and (semi_major_axis is not None and semi_minor_axis is not None): # 1 1 0 if semi_major_axis == semi_minor_axis: inverse_flattening = 0.0 else: inverse_flattening = 1.0 / ((semi_major_axis - semi_minor_axis) / semi_major_axis) - -# # Validate 3 given ellipsoid params -# else: -# rdiff = (semi_major_axis - semi_minor_axis) -# if rdiff: -# result = 1.0 / (rdiff / semi_major_axis) -# # TODO: assert_almost_equal is not helpful here, -# # it compares to n decimal places, -# # not n significant digits. -# numpy.testing.assert_almost_equal(result, inverse_flattening) -# elif semi_major_axis == 0.0: -# raise ValueError("Sphere cannot have zero radius") -# elif inverse_flattening != 0.0: -# raise ValueError("Expected zero inverse_flattening for sphere") + + # We didn't get enough to specify an ellipse. + else: + raise ValueError("Insufficient ellipsoid specification") self.semi_major_axis = float(semi_major_axis) """Major radius of the ellipsoid.""" @@ -166,192 +143,168 @@ def __init__(self, semi_major_axis=None, semi_minor_axis=None, inverse_flattenin self.inverse_flattening = float(inverse_flattening) """:math:`1/f` where :math:`f = (a-b)/a`""" - self.units = iris.unit.Unit(units) - """Unit of measure of radii.""" - - self.longitude_of_prime_meridian = float(longitude_of_prime_meridian) if longitude_of_prime_meridian else 0.0 + self.longitude_of_prime_meridian = float(longitude_of_prime_meridian) """Describes 'zero' on the ellipsoid.""" + + def _pretty_attrs(self): + attrs = [("semi_major_axis", self.semi_major_axis)] + if self.semi_major_axis != self.semi_minor_axis: + attrs.append(("semi_minor_axis", self.semi_minor_axis)) + if self.longitude_of_prime_meridian != 0.0: + attrs.append(("longitude_of_prime_meridian", self.longitude_of_prime_meridian)) + return attrs def __repr__(self): - return "GeogCS(semi_major_axis=%r, semi_minor_axis=%r, inverse_flattening=%r, units='%r', longitude_of_prime_meridian=%r)" % \ - (self.semi_major_axis, self.semi_minor_axis, self.inverse_flattening, - self.units, self.longitude_of_prime_meridian) + attrs = self._pretty_attrs() + # Special case for 1 pretty attr + if len(attrs) == 1 and attrs[0][0] == "semi_major_axis": + return "GeogCS(%r)" % self.semi_major_axis + else: + return "GeogCS(%s)" % ", ".join(["%s=%r" % (k,v) for k,v in attrs]) def __str__(self): - return "GeogCS(semi_major_axis=%s, semi_minor_axis=%s, inverse_flattening=%s, units=%s, longitude_of_prime_meridian=%s)" % \ - (self.semi_major_axis, self.semi_minor_axis, self.inverse_flattening, - self.units, self.longitude_of_prime_meridian) + attrs = self._pretty_attrs() + # Special case for 1 pretty attr + if len(attrs) == 1 and attrs[0][0] == "semi_major_axis": + return "GeogCS(%s)" % self.semi_major_axis + else: + return "GeogCS(%s)" % ", ".join(["%s=%s" % (k,v) for k,v in attrs]) -# def units(self): -# return "degrees" - - def _to_cartopy(self): - """Create a representation of ourself using a cartopy object.""" - raise NotImplementedError("Cartopy integration not yet implemented") - - - -class GeoPos(object): - """Store the position of the pole, for prettier code.""" - def __init__(self, lat, lon): - self.lat = float(lat) - self.lon = float(lon) - - def __repr__(self): - return "GeoPos(%r, %r)" % (self.lat, self.lon) - - def __eq__(self, b): - return self.__class__ == b.__class__ and self.__dict__ == b.__dict__ - - def __ne__(self, b): - return not (self == b) + def xml_element(self, doc): + # Special output for spheres + attrs = self._pretty_attrs() + if len(attrs) == 1 and attrs[0][0] == "semi_major_axis": + attrs = [("earth_radius", self.semi_major_axis)] + return CoordSystem.xml_element(self, doc, attrs) + -class RotatedGeogCS(GeogCS): +class RotatedGeogCS(CoordSystem): """A :class:`GeogCS` with rotated pole.""" - name = "rotated_latitude_longitude" + grid_mapping_name = "rotated_latitude_longitude" - def __init__(self, semi_major_axis=None, semi_minor_axis=None, inverse_flattening=None, units=None, - longitude_of_prime_meridian=None, grid_north_pole=None, north_pole_lon=0): + def __init__(self, grid_north_pole_latitude, grid_north_pole_longitude, + north_pole_grid_longitude=0, ellipsoid=None): """For :class:`GeogCS` parameters see :func:`GeogCS.__init__.` Args: - - * grid_north_pole - The true latlon position of the rotated pole: tuple(lat, lon). - CF: (grid_north_pole_latitude, grid_north_ple_longitude). + + * grid_north_pole_latitude - The true latitude of the rotated pole. + * grid_north_pole_longitude - The true longitude of the rotated pole. Kwargs: - * north_pole_lon - Longitude of true north pole in rotated grid. Default = 0. - CF: north_pole_grid_longitude + * north_pole_grid_longitude - Longitude of true north pole in rotated grid. + Default = 0. + * ellipsoid - Optional :class:`GeogCS` defining the ellipsoid. Example: - rotated_cs = RotatedGeogCS(grid_north_pole=(30,30)) - another_cs = RotatedGeogCS(6400, 6300, units="km", grid_north_pole=(30,30)) + rotated_cs = RotatedGeogCS(30, 30) + another_cs = RotatedGeogCS(30, 30, ellipsoid=GeogCS(6400000, 6300000)) - """ - GeogCS.__init__(self, semi_major_axis, semi_minor_axis, inverse_flattening, units, - longitude_of_prime_meridian) + """ + self.grid_north_pole_latitude = float(grid_north_pole_latitude) + """The true latitude of the rotated pole.""" - if grid_north_pole is None: - raise ValueError("No grid_north_pole specified") - elif not isinstance(grid_north_pole, GeoPos): - grid_north_pole = GeoPos(grid_north_pole[0], grid_north_pole[1]) - - - self.grid_north_pole = grid_north_pole - """A :class:`~GeoPos` describing the true latlon position of the rotated pole.""" + self.grid_north_pole_longitude = float(grid_north_pole_longitude) + """The true longitude of the rotated pole.""" - # TODO: Confirm CF's "north_pole_lon" is the same as our old "reference longitude" - self.north_pole_lon = float(north_pole_lon) + self.north_pole_grid_longitude = float(north_pole_grid_longitude) """Longitude of true north pole in rotated grid.""" - @classmethod - def from_geocs(cls, geocs, grid_north_pole, north_pole_lon=0): - """Construct a RotatedGeogCS from a GeogCS. See also :func:`RotatedGeogCS.__init__`""" - return RotatedGeogCS(geocs.semi_major_axis, geocs.semi_minor_axis, geocs.inverse_flattening, geocs.units, - geocs.longitude_of_prime_meridian, grid_north_pole=grid_north_pole, north_pole_lon=north_pole_lon) + self.ellipsoid = ellipsoid + """Ellipsoid definition.""" + + def _pretty_attrs(self): + attrs = [("grid_north_pole_latitude", self.grid_north_pole_latitude), + ("grid_north_pole_longitude", self.grid_north_pole_longitude)] + if self.north_pole_grid_longitude != 0.0: + attrs.append(("north_pole_grid_longitude", self.north_pole_grid_longitude)) + if self.ellipsoid is not None: + attrs.append(("ellipsoid", self.ellipsoid)) + return attrs def __repr__(self): - return "RotatedGeogCS(semi_major_axis=%r, semi_minor_axis=%r, inverse_flattening=%r, units='%r', longitude_of_prime_meridian=%r, grid_north_pole=%r, north_pole_lon=%r)" % \ - (self.semi_major_axis, self.semi_minor_axis, self.inverse_flattening, - self.units, self.longitude_of_prime_meridian, - self.grid_north_pole, self.north_pole_lon) + attrs = self._pretty_attrs() + result = "RotatedGeogCS(%s)" % ", ".join(["%s=%r" % (k,v) for k,v in attrs]) + # Extra prettiness + result = result.replace("grid_north_pole_latitude=", "").replace("grid_north_pole_longitude=", "") + return result def __str__(self): - return "RotatedGeogCS(semi_major_axis=%s, semi_minor_axis=%s, inverse_flattening=%s, units=%s, longitude_of_prime_meridian=%s, grid_north_pole=%s, north_pole_lon=%s)" % \ - (self.semi_major_axis, self.semi_minor_axis, self.inverse_flattening, - self.units, self.longitude_of_prime_meridian, - self.grid_north_pole, self.north_pole_lon) + attrs = self._pretty_attrs() + result = "RotatedGeogCS(%s)" % ", ".join(["%s=%s" % (k,v) for k,v in attrs]) + # Extra prettiness + result = result.replace("grid_north_pole_latitude=", "").replace("grid_north_pole_longitude=", "") + return result -# def units(self): -# return "degrees" + def xml_element(self, doc): + return CoordSystem.xml_element(self, doc, self._pretty_attrs()) - def _to_cartopy(self): - """Create a representation of ourself using a cartopy object.""" - raise NotImplementedError("Cartopy integration not yet implemented") +class TransverseMercator(CoordSystem): + """A cylindrical map projection, with XY coordinates measured in meters.""" -class MapProjection(CoordSystem): - """Abstract base class for map projections. - - Describes a transformation from a :class:`GeogCS` to a plane, for mapping. - A planar coordinate system is produced by the transformation. - - """ - __metaclass__ = ABCMeta - - def __init__(self, geocs): - """Creates a MapProjection. + grid_mapping_name = "transverse_mercator" + + def __init__(self, latitude_of_projection_origin, longitude_of_central_meridian, + false_easting, false_northing, scale_factor_at_central_meridian, + ellipsoid=None): + """Constructs a TransverseMercator object. Args: - * geocs - A :class:`GeoCs` that describes the Earth, from which we project. - - """ - self.geocs = geocs - -# def units(self): -# raise NotImplementedError() + * latitude_of_projection_origin + True latitude of planar origin in degrees. - def _to_cartopy(self): - """Create a representation of ourself using a cartopy object.""" - raise NotImplementedError("Cartopy integration not yet implemented") + * longitude_of_central_meridian + True longitude of planar origin in degrees. + * false_easting + X offset from planar origin in meters. + * false_northing + Y offset from planar origin in meters. -class TransverseMercator(MapProjection): - """A cylindrical map projection, with XY coordinates measured in meters.""" + * scale_factor_at_central_meridian + Reduces the cylinder to slice through the ellipsoid (secant form). + Used to provide TWO longitudes of zero distortion in the area of interest. - name = "transverse_mercator" + Kwargs: - def __init__(self, geocs, origin, false_origin, scale_factor): - """Constructs a TransverseMercator object. - - Args: - - * geocs - A :class:`GeoCs` that describes the Earth, from which we project. - * origin - True latlon point of planar origin: tuple(lat, lon) in degrees. - CF: (latitude_of_projection_origin, longitude_of_central_meridian). - * false_origin - Offset from planar origin: (x, y) in meters. - Used to elliminate negative numbers in the area of interest. - CF: (false_easting, false_northing). - * scale_factor - Reduces the cylinder to slice through the ellipsoid (secant form). - Used to provide TWO longitudes of zero distortion in the area of interest. - CF: scale_factor_at_central_meridian. + * ellipsoid + Optional :class:`GeogCS` defining the ellipsoid. Example: - airy1830 = GeogCS(6377563.396, 6356256.910, 299.3249646, "m") - osgb = TransverseMercator(airy1830, (49,-2), (40000,-10000), 0.9996012717) + airy1830 = GeogCS(6377563.396, 6356256.910) + osgb = TransverseMercator(airy1830, 49, -2, 40000, -10000, 0.9996012717) """ - MapProjection.__init__(self, geocs) - - if not isinstance(origin, GeoPos): - origin = GeoPos(origin[0], origin[1]) + self.latitude_of_projection_origin = float(latitude_of_projection_origin) + """True latitude of planar origin in degrees.""" - self.geocs = geocs + self.longitude_of_central_meridian = float(longitude_of_central_meridian) + """True longitude of planar origin in degrees.""" - self.origin = origin - """True latlon point of planar origin: tuple(lat, lon) in degrees.""" + self.false_easting = float(false_easting) + """X offset from planar origin in meters.""" + + self.false_northing = float(false_northing) + """Y offset from planar origin in meters.""" - # TODO: Update GeoPos to not just be latlon - self.false_origin = (float(false_origin[0]), float(false_origin[1])) - """Offset from planar origin: (x, y) in meters.""" + self.scale_factor_at_central_meridian = float(scale_factor_at_central_meridian) + """Reduces the cylinder to slice through the ellipsoid (secant form).""" - self.scale_factor = float(scale_factor) - """Reduces the cylinder to slice through the ellipsoid.""" + self.ellipsoid = ellipsoid + """Ellipsoid definition.""" def __repr__(self): - return "TransverseMercator(origin=%r, false_origin=%r, scale_factor=%r, geos=%r)" % \ - (self.origin, self.false_origin, self.scale_factor, self.geocs) - -# def units(self): -# return "meters" - - def _to_cartopy(self): - """Create a representation of ourself using a cartopy object.""" - raise NotImplementedError("Cartopy integration not yet implemented") + return "TransverseMercator(latitude_of_projection_origin=%r, "\ + "longitude_of_central_meridian=%r, false_easting=%r, false_northing=%r, "\ + "scale_factor_at_central_meridian=%r, ellipsoid=%r)" % \ + (self.latitude_of_projection_origin, self.longitude_of_central_meridian, + self.false_easting, self.false_northing, + self.scale_factor_at_central_meridian, self.ellipsoid) diff --git a/lib/iris/etc/grib_rules.txt b/lib/iris/etc/grib_rules.txt index 7ea9b76cae..995ad437a8 100644 --- a/lib/iris/etc/grib_rules.txt +++ b/lib/iris/etc/grib_rules.txt @@ -24,29 +24,29 @@ IF grib.gridType=="regular_ll" grib.jPointsAreConsecutive == 0 THEN -CoordAndDims(DimCoord(numpy.arange(grib.Nj, dtype=numpy.float64) * grib.jDirectionIncrementInDegrees * (grib.jScansPositively*2-1) + grib.latitudeOfFirstGridPointInDegrees, grib._y_coord_name, units='degrees', coord_system=grib._geocs), 0) -CoordAndDims(DimCoord(numpy.arange(grib.Ni) * grib.iDirectionIncrementInDegrees * (grib.iScansNegatively*(-2)+1) + grib.longitudeOfFirstGridPointInDegrees, grib._x_coord_name, units='degrees', coord_system=grib._geocs), 1) +CoordAndDims(DimCoord(numpy.arange(grib.Nj, dtype=numpy.float64) * grib.jDirectionIncrementInDegrees * (grib.jScansPositively*2-1) + grib.latitudeOfFirstGridPointInDegrees, grib._y_coord_name, units='degrees', coord_system=grib._geogCS), 0) +CoordAndDims(DimCoord(numpy.arange(grib.Ni) * grib.iDirectionIncrementInDegrees * (grib.iScansNegatively*(-2)+1) + grib.longitudeOfFirstGridPointInDegrees, grib._x_coord_name, units='degrees', coord_system=grib._geogCS), 1) IF grib.gridType=="regular_ll" grib.jPointsAreConsecutive == 1 THEN -CoordAndDims(DimCoord(numpy.arange(grib.Nj, dtype=numpy.float64) * grib.jDirectionIncrementInDegrees * (grib.jScansPositively*2-1) + grib.latitudeOfFirstGridPointInDegrees, grib._y_coord_name, units='degrees', coord_system=grib._geocs), 1) -CoordAndDims(DimCoord(numpy.arange(grib.Ni, dtype=numpy.float64) * grib.iDirectionIncrementInDegrees * (grib.iScansNegatively*(-2)+1) + grib.longitudeOfFirstGridPointInDegrees, grib._x_coord_name, units='degrees', coord_system=grib._geocs), 0) +CoordAndDims(DimCoord(numpy.arange(grib.Nj, dtype=numpy.float64) * grib.jDirectionIncrementInDegrees * (grib.jScansPositively*2-1) + grib.latitudeOfFirstGridPointInDegrees, grib._y_coord_name, units='degrees', coord_system=grib._geogCS), 1) +CoordAndDims(DimCoord(numpy.arange(grib.Ni, dtype=numpy.float64) * grib.iDirectionIncrementInDegrees * (grib.iScansNegatively*(-2)+1) + grib.longitudeOfFirstGridPointInDegrees, grib._x_coord_name, units='degrees', coord_system=grib._geogCS), 0) IF grib.gridType=="rotated_ll" grib.jPointsAreConsecutive == 0 THEN -CoordAndDims(DimCoord(numpy.arange(grib.Nj, dtype=numpy.float64) * grib.jDirectionIncrementInDegrees * (grib.jScansPositively*2-1) + grib.latitudeOfFirstGridPointInDegrees, grib._y_coord_name, units='degrees', coord_system=grib._geocs), 0) -CoordAndDims(DimCoord(numpy.arange(grib.Ni, dtype=numpy.float64) * grib.iDirectionIncrementInDegrees * (grib.iScansNegatively*(-2)+1) + grib.longitudeOfFirstGridPointInDegrees, grib._x_coord_name, units='degrees', coord_system=grib._geocs), 1) +CoordAndDims(DimCoord(numpy.arange(grib.Nj, dtype=numpy.float64) * grib.jDirectionIncrementInDegrees * (grib.jScansPositively*2-1) + grib.latitudeOfFirstGridPointInDegrees, grib._y_coord_name, units='degrees', coord_system=grib._geogCS), 0) +CoordAndDims(DimCoord(numpy.arange(grib.Ni, dtype=numpy.float64) * grib.iDirectionIncrementInDegrees * (grib.iScansNegatively*(-2)+1) + grib.longitudeOfFirstGridPointInDegrees, grib._x_coord_name, units='degrees', coord_system=grib._geogCS), 1) IF grib.gridType=="rotated_ll" grib.jPointsAreConsecutive == 1 THEN -CoordAndDims(DimCoord(numpy.arange(grib.Nj, dtype=numpy.float64) * grib.jDirectionIncrementInDegrees * (grib.jScansPositively*2-1) + grib.latitudeOfFirstGridPointInDegrees, grib._y_coord_name, units='degrees', coord_system=grib._geocs), 1) -CoordAndDims(DimCoord(numpy.arange(grib.Ni, dtype=numpy.float64) * grib.iDirectionIncrementInDegrees * (grib.iScansNegatively*(-2)+1) + grib.longitudeOfFirstGridPointInDegrees, grib._x_coord_name, units='degrees', coord_system=grib._geocs), 0) +CoordAndDims(DimCoord(numpy.arange(grib.Nj, dtype=numpy.float64) * grib.jDirectionIncrementInDegrees * (grib.jScansPositively*2-1) + grib.latitudeOfFirstGridPointInDegrees, grib._y_coord_name, units='degrees', coord_system=grib._geogCS), 1) +CoordAndDims(DimCoord(numpy.arange(grib.Ni, dtype=numpy.float64) * grib.iDirectionIncrementInDegrees * (grib.iScansNegatively*(-2)+1) + grib.longitudeOfFirstGridPointInDegrees, grib._x_coord_name, units='degrees', coord_system=grib._geogCS), 0) diff --git a/lib/iris/etc/pp_rules.txt b/lib/iris/etc/pp_rules.txt index fe3a13fb7b..5ca81b7c8d 100644 --- a/lib/iris/etc/pp_rules.txt +++ b/lib/iris/etc/pp_rules.txt @@ -87,7 +87,7 @@ f.bdx != 0.0 len(f.lbcode) != 5 f.lbcode[0] == 1 THEN -CoordAndDims(DimCoord(f.regular_points("x"), standard_name=f._x_coord_name(), units='degrees', circular=(f.lbhem in [0, 4]), coord_system=f.geocs()), 1) +CoordAndDims(DimCoord(f.regular_points("x"), standard_name=f._x_coord_name(), units='degrees', circular=(f.lbhem in [0, 4]), coord_system=f.coord_system()), 1) # Regular longitude bounds IF @@ -95,7 +95,7 @@ f.bdx != 0.0 len(f.lbcode) != 5 f.lbcode[0] == 2 THEN -CoordAndDims(DimCoord(f.regular_points("x"), standard_name=f._x_coord_name(), units='degrees', circular=(f.lbhem in [0, 4]), coord_system=f.geocs(), bounds=f.regular_bounds("x")), 1) +CoordAndDims(DimCoord(f.regular_points("x"), standard_name=f._x_coord_name(), units='degrees', circular=(f.lbhem in [0, 4]), coord_system=f.coord_system(), bounds=f.regular_bounds("x")), 1) # Regular latitude points IF @@ -103,7 +103,7 @@ f.bdy != 0.0 len(f.lbcode) != 5 f.lbcode[0] == 1 THEN -CoordAndDims(DimCoord(f.regular_points("y"), standard_name=f._y_coord_name(), units='degrees', coord_system=f.geocs()), 0) +CoordAndDims(DimCoord(f.regular_points("y"), standard_name=f._y_coord_name(), units='degrees', coord_system=f.coord_system()), 0) # Regular latitude bounds IF @@ -111,7 +111,7 @@ f.bdy != 0.0 len(f.lbcode) != 5 f.lbcode[0] == 2 THEN -CoordAndDims(DimCoord(f.regular_points("y"), standard_name=f._y_coord_name(), units='degrees', coord_system=f.geocs(), bounds=f.regular_bounds("y")), 0) +CoordAndDims(DimCoord(f.regular_points("y"), standard_name=f._y_coord_name(), units='degrees', coord_system=f.coord_system(), bounds=f.regular_bounds("y")), 0) # Irregular latitude IF @@ -119,7 +119,7 @@ f.bdy == 0.0 len(f.lbcode) != 5 or (len(f.lbcode) == 5 and f.lbcode.iy == 10) # TODO What about lbcode in [2, 102]. How does this affect the bounds? THEN -CoordAndDims(DimCoord(f.y, standard_name=f._y_coord_name(), units='degrees', bounds=f.y_bounds, coord_system=f.geocs()), 0) +CoordAndDims(DimCoord(f.y, standard_name=f._y_coord_name(), units='degrees', bounds=f.y_bounds, coord_system=f.coord_system()), 0) # Irregular longitude IF @@ -127,7 +127,7 @@ f.bdx == 0.0 len(f.lbcode) != 5 or (len(f.lbcode) == 5 and f.lbcode.ix == 11) # TODO What about lbcode in [2, 102]. How does this affect the bounds? THEN -CoordAndDims(DimCoord(f.x, standard_name=f._x_coord_name(), units='degrees', bounds=f.x_bounds, circular=(f.lbhem in [0, 4]), coord_system=f.geocs()), 1) +CoordAndDims(DimCoord(f.x, standard_name=f._x_coord_name(), units='degrees', bounds=f.x_bounds, circular=(f.lbhem in [0, 4]), coord_system=f.coord_system()), 1) #################################################################################################### @@ -151,7 +151,7 @@ len(f.lbcode) == 5 f.lbcode.ix == 10 f.bdx != 0 THEN -CoordAndDims(DimCoord(f.regular_points("x"), standard_name=f._y_coord_name(), units='degrees', coord_system=f.geocs()), 1) +CoordAndDims(DimCoord(f.regular_points("x"), standard_name=f._y_coord_name(), units='degrees', coord_system=f.coord_system()), 1) IF len(f.lbcode) == 5 @@ -205,7 +205,7 @@ hasattr(f, 'upper_x_domain') all(f.lower_x_domain != -1.e+30) all(f.upper_x_domain != -1.e+30) THEN -CoordAndDims(AuxCoord((f.lower_x_domain + f.upper_x_domain) / 2.0, standard_name=f._x_coord_name(), units='degrees', bounds=numpy.array([f.lower_x_domain, f.upper_x_domain]).T, coord_system=f.geocs()), 1 if f.lbcode.ix == 13 else 0) +CoordAndDims(AuxCoord((f.lower_x_domain + f.upper_x_domain) / 2.0, standard_name=f._x_coord_name(), units='degrees', bounds=numpy.array([f.lower_x_domain, f.upper_x_domain]).T, coord_system=f.coord_system()), 1 if f.lbcode.ix == 13 else 0) # as a special case to some cross section lbcodes (currently only site), lats are encoded in lower_y_domain and upper_y_domain IF @@ -217,7 +217,7 @@ hasattr(f, 'upper_y_domain') all(f.lower_y_domain != -1.e+30) all(f.upper_y_domain != -1.e+30) THEN -CoordAndDims(AuxCoord((f.lower_y_domain + f.upper_y_domain) / 2.0, standard_name=f._y_coord_name(), units='degrees', bounds=numpy.array([f.lower_y_domain, f.upper_y_domain]).T, coord_system=f.geocs()), 1 if f.lbcode.ix == 13 else 0) +CoordAndDims(AuxCoord((f.lower_y_domain + f.upper_y_domain) / 2.0, standard_name=f._y_coord_name(), units='degrees', bounds=numpy.array([f.lower_y_domain, f.upper_y_domain]).T, coord_system=f.coord_system()), 1 if f.lbcode.ix == 13 else 0) #################################################################################################### diff --git a/lib/iris/etc/pp_save_rules.txt b/lib/iris/etc/pp_save_rules.txt index 2360030a26..25081b0543 100644 --- a/lib/iris/etc/pp_save_rules.txt +++ b/lib/iris/etc/pp_save_rules.txt @@ -25,7 +25,7 @@ THEN pp.lbproc = 0 # Processing. Start at 0. IF - cm.coord_system("RotatedGeogCS") is None + cm.coord_system("GeogCS") is not None THEN pp.bplat = 90 pp.bplon = 0 @@ -33,8 +33,8 @@ THEN IF cm.coord_system("RotatedGeogCS") is not None THEN - pp.bplat = cm.coord_system("RotatedGeogCS").grid_north_pole.lat - pp.bplon = cm.coord_system("RotatedGeogCS").grid_north_pole.lon + pp.bplat = cm.coord_system("RotatedGeogCS").grid_north_pole_latitude + pp.bplon = cm.coord_system("RotatedGeogCS").grid_north_pole_longitude #UM - no version number @@ -389,8 +389,7 @@ THEN #rotated? IF # iris.fileformats.pp.is_cross_section(cm) == False - cm.coord_system("GeogCS") is not None - isinstance(cm.coord_system("GeogCS"), iris.coord_systems.RotatedGeogCS) + cm.coord_system("RotatedGeogCS") is not None THEN pp.lbcode = int(pp.lbcode) + 100 diff --git a/lib/iris/fileformats/_pyke_rules/fc_rules_cf.krb b/lib/iris/fileformats/_pyke_rules/fc_rules_cf.krb index 129798683c..08168bb690 100644 --- a/lib/iris/fileformats/_pyke_rules/fc_rules_cf.krb +++ b/lib/iris/fileformats/_pyke_rules/fc_rules_cf.krb @@ -51,7 +51,8 @@ fc_default_grid_mapping_latitude_longitude notany facts_cf.grid_mapping($_) assert - python coordinate_system = iris.coord_systems.GeogCS() + # TODO: Discuss/confirm this default ellipsoid. + python coordinate_system = iris.coord_systems.GeogCS(6371229) python engine.provides['coordinate_system'] = coordinate_system facts_cf.provides(coordinate_system, latitude_longitude) python engine.rule_triggered.add(rule.name) @@ -674,10 +675,7 @@ fc_extras minor = getattr(cf_grid_var, CF_ATTR_GRID_SEMI_MINOR_AXIS, None) inverse_flattening = getattr(cf_grid_var, CF_ATTR_GRID_INVERSE_FLATTENING, None) - cs = iris.coord_systems.GeogCS(semi_major_axis=major, semi_minor_axis=minor, - inverse_flattening=inverse_flattening, units=iris.unit.Unit('m')) - - return cs + return iris.coord_systems.GeogCS(major, minor) def build_rotated_coordinate_system(engine, cf_grid_var): """Create a rotated coordinate system from the CF-netCDF grid mapping variable.""" @@ -688,13 +686,18 @@ fc_extras north_pole_latitude = getattr(cf_grid_var, CF_ATTR_GRID_NORTH_POLE_LAT, 90.0) north_pole_longitude = getattr(cf_grid_var, CF_ATTR_GRID_NORTH_POLE_LON, 0.0) - pole_pos = iris.coord_systems.GeoPos(north_pole_latitude, north_pole_longitude) + if north_pole_latitude is None or north_pole_longitude is None: + warnings.warn('Rotated pole position is not fully specified') - north_pole_lon = getattr(cf_grid_var, CF_ATTR_GRID_NORTH_POLE_GRID_LON, 0.0) + north_pole_grid_lon = getattr(cf_grid_var, CF_ATTR_GRID_NORTH_POLE_GRID_LON, 0.0) + + ellipsoid = None + # TODO: Confirm this. What if minor is none and inv_flattening is present? + if major is not None: + ellipsoid = iris.coord_systems.GeogCS(major, minor) - rcs = iris.coord_systems.RotatedGeogCS(semi_major_axis=major, semi_minor_axis=minor, - inverse_flattening=inverse_flattening, units=iris.unit.Unit('m'), - grid_north_pole=pole_pos, north_pole_lon=north_pole_lon) + rcs = iris.coord_systems.RotatedGeogCS(north_pole_latitude, north_pole_longitude, + north_pole_grid_lon, ellipsoid) return rcs diff --git a/lib/iris/fileformats/grib.py b/lib/iris/fileformats/grib.py index f7214d9778..7079891ad7 100644 --- a/lib/iris/fileformats/grib.py +++ b/lib/iris/fileformats/grib.py @@ -212,7 +212,7 @@ def _compute_extra_keys(self): '_firstLevelTypeUnits':unknown_string, '_firstLevel':-1.0, '_secondLevelTypeName':unknown_string, '_secondLevel':-1.0, '_originatingCentre':unknown_string, '_forecastTimeUnit':unknown_string, - '_geocs':coord_systems.GeogCS(), # default cs + '_geogCS':None, '_x_coord_name':unknown_string, '_y_coord_name':unknown_string} #reference date @@ -240,37 +240,40 @@ def _compute_extra_keys(self): #pre-defined sphere if self.shapeOfTheEarth == 0: - self.extra_keys['_geocs'] = coord_systems.GeogCS(semi_major_axis=6367470.0, units='m') + self.extra_keys['_geogCS'] = coord_systems.GeogCS(semi_major_axis=6367470) #custom sphere elif self.shapeOfTheEarth == 1: - self.extra_keys['_geocs'] = coord_systems.GeogCS(units='m', - semi_major_axis=self.scaledValueOfRadiusOfSphericalEarth * self.scaleFactorOfRadiusOfSphericalEarth) + self.extra_keys['_geogCS'] = \ + coord_systems.GeogCS(self.scaledValueOfRadiusOfSphericalEarth * \ + self.scaleFactorOfRadiusOfSphericalEarth) #IAU65 oblate sphere elif self.shapeOfTheEarth == 2: - self.extra_keys['_geocs'] = coord_systems.GeogCS(units='m', inverse_flattening=297.0, - semi_major_axis=6378160.0) + self.extra_keys['_geogCS'] = coord_systems.GeogCS(6378160, inverse_flattening=297.0) + #custom oblate spheroid (km) elif self.shapeOfTheEarth == 3: - self.extra_keys['_geocs'] = coord_systems.GeogCS(units='km', - semi_major_axis=self.scaledValueOfEarthMajorAxis * self.scaleFactorOfEarthMajorAxis, - semi_minor_axis=self.scaledValueOfEarthMinorAxis * self.scaleFactorOfEarthMinorAxis) + self.extra_keys['_geogCS'] = coord_systems.GeogCS( + semi_major_axis=self.scaledValueOfEarthMajorAxis * self.scaleFactorOfEarthMajorAxis * 1000.0, + semi_minor_axis=self.scaledValueOfEarthMinorAxis * self.scaleFactorOfEarthMinorAxis * 1000.0) #IAG-GRS80 oblate spheroid elif self.shapeOfTheEarth == 4: - self.extra_keys['_geocs'] = coord_systems.GeogCS(units='m', inverse_flattening=298.257222101, - semi_major_axis=6378137.0) + self.extra_keys['_geogCS'] = coord_systems.GeogCS(6378137, None, 298.257222101) + #WGS84 elif self.shapeOfTheEarth == 5: - self.extra_keys['_geocs'] = coord_systems.GeogCS(units='m', inverse_flattening=298.257223563, - semi_major_axis=6378137.0) + self.extra_keys['_geogCS'] = \ + coord_systems.GeogCS(6378137, inverse_flattening=298.257223563) + #pre-defined sphere elif self.shapeOfTheEarth == 6: - self.extra_keys['_geocs'] = coord_systems.GeogCS(semi_major_axis=6371229.0, units='m') + self.extra_keys['_geogCS'] = coord_systems.GeogCS(6371229) + #custom oblate spheroid (m) elif self.shapeOfTheEarth == 7: - self.extra_keys['_geocs'] = coord_systems.GeogCS(units='m', + self.extra_keys['_geogCS'] = coord_systems.GeogCS( semi_major_axis=self.scaledValueOfEarthMajorAxis * self.scaleFactorOfEarthMajorAxis, semi_minor_axis=self.scaledValueOfEarthMinorAxis * self.scaleFactorOfEarthMinorAxis) @@ -288,8 +291,9 @@ def _compute_extra_keys(self): southPoleLon = longitudeOfSouthernPoleInDegrees southPoleLat = latitudeOfSouthernPoleInDegrees # TODO: Confirm the translation from angleOfRotation to north_pole_lon (usually 0 for both) - self.extra_keys['_geocs'] = iris.coord_systems.RotatedGeogCS.from_geocs(self.extra_keys['_geocs'], - grid_north_pole=(-southPoleLat, math.fmod(southPoleLon + 180.0, 360.0)), north_pole_lon=self.angleOfRotation) + self.extra_keys['_geogCS'] = \ + iris.coord_systems.RotatedGeogCS(-southPoleLat, math.fmod(southPoleLon + 180.0, 360.0), + self.angleOfRotation, self.extra_keys['_geogCS']) #originating centre diff --git a/lib/iris/fileformats/grib_save_rules.py b/lib/iris/fileformats/grib_save_rules.py index 635eb1ea88..8046cdea34 100644 --- a/lib/iris/fileformats/grib_save_rules.py +++ b/lib/iris/fileformats/grib_save_rules.py @@ -33,8 +33,10 @@ def gribbability_check(cube): # GeogCS exists? cs0 = cube.coord(dimensions=[0]).coord_system cs1 = cube.coord(dimensions=[1]).coord_system - if not (isinstance(cs0, iris.coord_systems.GeogCS) and isinstance(cs1, iris.coord_systems.GeogCS)): - raise iris.exceptions.TranslationError("GeogCS not present") + if cs0 is None or cs1 is None: + raise iris.exceptions.TranslationError("CoordSystem not present") + if cs0 != cs1: + raise iris.exceptions.TranslationError("Inconsistent CoordSystems") # Regular? y_coord = cube.coord(dimensions=[0]) @@ -68,17 +70,21 @@ def shape_of_the_earth(cube, grib): gribapi.grib_set_long(grib, "scaleFactorOfEarthMinorAxis", 255) gribapi.grib_set_long(grib, "scaledValueOfEarthMinorAxis", -1) - if cs.inverse_flattening == 0.0: + ellipsoid = cs + if isinstance(cs, iris.coord_systems.RotatedGeogCS): + ellipsoid = cs.ellipsoid + + if ellipsoid.inverse_flattening == 0.0: gribapi.grib_set_long(grib, "shapeOfTheEarth", 1) gribapi.grib_set_long(grib, "scaleFactorOfRadiusOfSphericalEarth", 0) - gribapi.grib_set_long(grib, "scaledValueOfRadiusOfSphericalEarth", cs.semi_major_axis) + gribapi.grib_set_long(grib, "scaledValueOfRadiusOfSphericalEarth", ellipsoid.semi_major_axis) else: gribapi.grib_set_long(grib, "shapeOfTheEarth", 7) gribapi.grib_set_long(grib, "scaleFactorOfEarthMajorAxis", 0) - gribapi.grib_set_long(grib, "scaledValueOfEarthMajorAxis", cs.semi_major_axis) + gribapi.grib_set_long(grib, "scaledValueOfEarthMajorAxis", ellipsoid.semi_major_axis) gribapi.grib_set_long(grib, "scaleFactorOfEarthMinorAxis", 0) - gribapi.grib_set_long(grib, "scaledValueOfEarthMinorAxis", cs.semi_minor_axis) + gribapi.grib_set_long(grib, "scaledValueOfEarthMinorAxis", ellipsoid.semi_minor_axis) def grid_dims(x_coord, y_coord, grib): @@ -141,29 +147,31 @@ def rotated_pole(cube, grib): # gribapi.grib_set_double(grib, "longitudeOfSouthernPoleInDegrees", float(cs.n_pole.longitude)) # gribapi.grib_set_double(grib, "angleOfRotationInDegrees", 0) # WORKAROUND - gribapi.grib_set_long(grib, "latitudeOfSouthernPole", -int(cs.grid_north_pole.lat*1000000)) - gribapi.grib_set_long(grib, "longitudeOfSouthernPole", int(((cs.grid_north_pole.lon+180)%360)*1000000)) + gribapi.grib_set_long(grib, "latitudeOfSouthernPole", -int(cs.grid_north_pole_latitude*1000000)) + gribapi.grib_set_long(grib, "longitudeOfSouthernPole", int(((cs.grid_north_pole_longitude+180)%360)*1000000)) gribapi.grib_set_long(grib, "angleOfRotation", 0) def grid_template(cube, grib): - cs0 = cube.coord(dimensions=[0]).coord_system - cs1 = cube.coord(dimensions=[1]).coord_system + cs = cube.coord(dimensions=[0]).coord_system - if not isinstance(cs0, iris.coord_systems.RotatedGeogCS): + if isinstance(cs, iris.coord_systems.GeogCS): # template 3.0 gribapi.grib_set_long(grib, "gridDefinitionTemplateNumber", 0) latlon_common(cube, grib) # rotated - else: + elif isinstance(cs, iris.coord_systems.RotatedGeogCS): # template 3.1 gribapi.grib_set_long(grib, "gridDefinitionTemplateNumber", 1) latlon_common(cube, grib) rotated_pole(cube, grib) + + else: + raise ValueError("Currently unhandled CoordSystem: %s" % cs) ############################## diff --git a/lib/iris/fileformats/netcdf.py b/lib/iris/fileformats/netcdf.py index 54b4338f72..81e01cc7d6 100644 --- a/lib/iris/fileformats/netcdf.py +++ b/lib/iris/fileformats/netcdf.py @@ -338,29 +338,23 @@ def load_cubes(filenames, callback=None): def _cf_coord_identity(coord): """Return (standard_name, long_name, unit) of the given :class:`iris.coords.Coord` instance.""" - # Default behaviour - standard_name = coord.standard_name - long_name = coord.long_name + units = str(coord.units) - - # Special cases - # i) Rotated pole - if isinstance(coord.coord_system, iris.coord_systems.GeogCS): - if coord.name() in ['latitude', 'grid_latitude']: - if isinstance(coord.coord_system, iris.coord_systems.RotatedGeogCS): - standard_name = 'grid_latitude' - units = 'degrees' - else: - units = 'degrees_north' - if coord.name() in ['longitude', 'grid_longitude']: - if isinstance(coord.coord_system, iris.coord_systems.RotatedGeogCS): - standard_name = 'grid_longitude' - units = 'degrees' - else: - units = 'degrees_east' + # TODO: Use #61 to get the units. + if isinstance(coord.coord_system, iris.coord_systems.GeogCS): + if "latitude" in coord.standard_name: + units = 'degrees_north' + elif "longitude" in coord.standard_name: + units = 'degrees_east' + + elif isinstance(coord.coord_system, iris.coord_systems.RotatedGeogCS): + units = 'degrees' - return standard_name, long_name, units + elif isinstance(coord.coord_system, iris.coord_systems.TransverseMercator): + units = 'm' + + return coord.standard_name, coord.long_name, units def _create_bounds(dataset, coord, cf_var, cf_name): @@ -533,29 +527,41 @@ def _create_cf_grid_mapping(dataset, cube, cf_var): data variable grid mapping attribute. """ + # TODO: What if there's more than one CoordSystem? cs = cube.coord_system('CoordSystem') - if cs is not None: - if isinstance(cs, iris.coord_systems.GeogCS): - cf_grid_name = 'rotated_latitude_longitude' if isinstance(cs, iris.coord_systems.RotatedGeogCS) else 'latitude_longitude' - - if cf_grid_name not in dataset.variables: - cf_var.grid_mapping = cf_grid_name - cf_var_grid = dataset.createVariable(cf_grid_name, np.int32) - cf_var_grid.grid_mapping_name = cf_grid_name - cf_var_grid.longitude_of_prime_meridian = 0.0 + + # Grid var not yet created? + if cs.grid_mapping_name not in dataset.variables: + cf_var_grid = dataset.createVariable(cs.grid_mapping_name, np.int32) + cf_var_grid.grid_mapping_name = cs.grid_mapping_name + + # latlon + if isinstance(cs, iris.coord_systems.GeogCS): + cf_var_grid.longitude_of_prime_meridian = cs.longitude_of_prime_meridian cf_var_grid.semi_major_axis = cs.semi_major_axis cf_var_grid.semi_minor_axis = cs.semi_minor_axis - - if isinstance(cs, iris.coord_systems.RotatedGeogCS): - cf_var_grid.grid_north_pole_latitude = cs.grid_north_pole.lat - cf_var_grid.grid_north_pole_longitude = cs.grid_north_pole.lon - cf_var_grid.north_pole_grid_longitude = cs.north_pole_lon + + # rotated latlon + elif isinstance(cs, iris.coord_systems.RotatedGeogCS): + if cs.ellipsoid: + cf_var_grid.longitude_of_prime_meridian = cs.ellipsoid.longitude_of_prime_meridian + cf_var_grid.semi_major_axis = cs.ellipsoid.semi_major_axis + cf_var_grid.semi_minor_axis = cs.ellipsoid.semi_minor_axis + cf_var_grid.grid_north_pole_latitude = cs.grid_north_pole_latitude + cf_var_grid.grid_north_pole_longitude = cs.grid_north_pole_longitude + cf_var_grid.north_pole_grid_longitude = cs.north_pole_grid_longitude + + # tmerc + elif isinstance(cs, iris.coord_systems.TransverseMercator): + warnings.warn('TransverseMercator coordinate system not yet handled') + + # other else: - # Reference previously created grid mapping - cf_var.grid_mapping = cf_grid_name - else: - warnings.warn('Unable to represent the horizontal coordinate system. The coordinate system type %r is not yet implemented.' % type(cs)) + warnings.warn('Unable to represent the horizontal coordinate system. The coordinate system type %r is not yet implemented.' % type(cs)) + + # Refer to grid var + cf_var.grid_mapping = cs.grid_mapping_name def _create_cf_data_variable(dataset, cube, dimension_names): diff --git a/lib/iris/fileformats/pp.py b/lib/iris/fileformats/pp.py index ab9c0f8a6e..9ba9a54be1 100644 --- a/lib/iris/fileformats/pp.py +++ b/lib/iris/fileformats/pp.py @@ -43,7 +43,11 @@ iris.proxy.apply_proxy('iris.fileformats.pp_packing', globals()) -__all__ = ['load', 'save', 'PPField', 'add_load_rules', 'reset_load_rules', 'add_save_rules', 'reset_save_rules', 'STASH'] +__all__ = ['load', 'save', 'PPField', 'add_load_rules', 'reset_load_rules', + 'add_save_rules', 'reset_save_rules', 'STASH', 'EARTH_RADIUS'] + + +EARTH_RADIUS = 6371229.0 # PP->Cube and Cube->PP rules are loaded on first use @@ -1073,30 +1077,30 @@ def regular_bounds(self, xy): def time_unit(self, time_unit, epoch='epoch'): return iris.unit.Unit('%s since %s' % (time_unit, epoch), calendar=self.calendar) - def geocs(self): - """Return a GeogCS for this PPField. + def coord_system(self): + """Return a CoordSystem for this PPField. Returns: - A GeogCS or RotatedGeogCS. + Currently, a :class:`~iris.coord_systems.GeogCS` or :class:`~iris.coord_systems.RotatedGeogCS`. """ - geocs = iris.coord_systems.GeogCS(6371229.0, units='m') + geog_cs = iris.coord_systems.GeogCS(EARTH_RADIUS) if self.bplat != 90.0 or self.bplon != 0.0: - geocs = iris.coord_systems.RotatedGeogCS.from_geocs(geocs, grid_north_pole=(self.bplat, self.bplon)) + geog_cs = iris.coord_systems.RotatedGeogCS(self.bplat, self.bplon, ellipsoid=geog_cs) - return geocs + return geog_cs def _x_coord_name(self): # TODO: Remove once we have the ability to derive this in the rules. x_name = "longitude" - if isinstance(self.geocs(), iris.coord_systems.RotatedGeogCS): + if isinstance(self.coord_system(), iris.coord_systems.RotatedGeogCS): x_name = "grid_longitude" return x_name def _y_coord_name(self): # TODO: Remove once we have the ability to derive this in the rules. y_name = "latitude" - if isinstance(self.geocs(), iris.coord_systems.RotatedGeogCS): + if isinstance(self.coord_system(), iris.coord_systems.RotatedGeogCS): y_name = "grid_latitude" return y_name @@ -1480,10 +1484,10 @@ def _grid_defn(cube): if ok: if isinstance(x.coord_system, iris.coord_systems.RotatedGeogCS): defn = _GridDefn(tuple(x.points), tuple(y.points), - x.coord_system.grid_north_pole) + (x.coord_system.grid_north_pole_latitude, + x.coord_system.grid_north_pole_longitude)) else: - defn = _GridDefn(tuple(x.points), tuple(y.points), - iris.coord_systems.GeoPos(90, 0)) + defn = _GridDefn(tuple(x.points), tuple(y.points), (90.0, 0.0)) return defn diff --git a/lib/iris_tests/stock.py b/lib/iris_tests/stock.py index f4d45f9244..58c2bfd0bf 100644 --- a/lib/iris_tests/stock.py +++ b/lib/iris_tests/stock.py @@ -38,7 +38,7 @@ def lat_lon_cube(): """ cube = Cube(numpy.arange(12, dtype=numpy.int32).reshape((3, 4))) - cs = GeogCS() + cs = GeogCS(6371229) cube.add_dim_coord(iris.coords.DimCoord(points=numpy.array([-1, 0, 1], dtype=numpy.int32), standard_name='latitude', units='degrees', coord_system=cs), 0) cube.add_dim_coord(iris.coords.DimCoord(points=numpy.array([-1, 0, 1, 2], dtype=numpy.int32), standard_name='longitude', units='degrees', coord_system=cs), 1) return cube @@ -325,8 +325,7 @@ def realistic_4d(): _source_pts, forecast_period_pts, data, orography = arrays - ll_cs = RotatedGeogCS(semi_major_axis=6371229.0, semi_minor_axis=6371229.0, - inverse_flattening=0.0, units='m', grid_north_pole=(37.5, 177.5)) + ll_cs = RotatedGeogCS(37.5, 177.5, ellipsoid=GeogCS(6371229.0)) lat = icoords.DimCoord(lat_pts, standard_name='grid_latitude', units='degrees', bounds=lat_bnds, coord_system=ll_cs) @@ -375,7 +374,7 @@ def realistic_4d_w_missing_data(): # sort the arrays based on the order they were originally given. The names given are of the form 'arr_1' or 'arr_10' - ll_cs = GeogCS(semi_major_axis=6371229.0, units='m') + ll_cs = GeogCS(6371229) lat = iris.coords.DimCoord(numpy.arange(20, dtype=numpy.float32), standard_name='grid_latitude', units='degrees', coord_system=ll_cs) diff --git a/lib/iris_tests/system_test.py b/lib/iris_tests/system_test.py index dc44ce1d5f..25d70ababf 100644 --- a/lib/iris_tests/system_test.py +++ b/lib/iris_tests/system_test.py @@ -43,7 +43,7 @@ def system_test_supported_filetypes(self): laty = np.linspace(0, 59, ny) lonx = np.linspace(30, 89, nx) - horiz_cs = lambda : iris.coord_systems.GeogCS(6371229.0, units='m') + horiz_cs = lambda : iris.coord_systems.GeogCS(6371229) cm = iris.cube.Cube(data=dataarray, long_name="System test data", units='m s-1') cm.add_dim_coord( diff --git a/lib/iris_tests/test_aggregate_by.py b/lib/iris_tests/test_aggregate_by.py index 136c100c96..8ac0e2087a 100644 --- a/lib/iris_tests/test_aggregate_by.py +++ b/lib/iris_tests/test_aggregate_by.py @@ -34,7 +34,7 @@ def setUp(self): # # common # - cs_latlon = iris.coord_systems.GeogCS() + cs_latlon = iris.coord_systems.GeogCS(6371229) points = np.arange(3, dtype=np.float32) * 3 coord_lat = iris.coords.DimCoord(points, 'latitude', units='degrees', coord_system=cs_latlon) coord_lon = iris.coords.DimCoord(points, 'longitude', units='degrees', coord_system=cs_latlon) @@ -173,7 +173,7 @@ def test_easy(self): data = np.array([[6, 10, 12, 18], [8, 12, 14, 20], [18, 12, 10, 6]], dtype=np.float32) cube = iris.cube.Cube(data, long_name='temperature', units='kelvin') - llcs = iris.coord_systems.GeogCS() + llcs = iris.coord_systems.GeogCS(6371229) cube.add_aux_coord(iris.coords.AuxCoord(np.array([0, 0, 10], dtype=np.float32), 'latitude', units='degrees', coord_system=llcs), 0) cube.add_aux_coord(iris.coords.AuxCoord(np.array([0, 0, 10, 10], dtype=np.float32), diff --git a/lib/iris_tests/test_analysis.py b/lib/iris_tests/test_analysis.py index 6b887af8d1..a4760a7f3f 100644 --- a/lib/iris_tests/test_analysis.py +++ b/lib/iris_tests/test_analysis.py @@ -50,7 +50,7 @@ def assertComparisonDict(self, comarison_dict, reference_filename): def test_coord_comparison(self): cube1 = iris.cube.Cube(numpy.zeros((41, 41))) - lonlat_cs = iris.coord_systems.GeogCS() + lonlat_cs = iris.coord_systems.GeogCS(6371229) lon_points1 = -180 + 4.5 * numpy.arange(41, dtype=numpy.float32) lat_points = -90 + 4.5 * numpy.arange(41, dtype=numpy.float32) cube1.add_dim_coord(iris.coords.DimCoord(lon_points1, 'longitude', units='degrees', coord_system=lonlat_cs), 0) @@ -59,7 +59,7 @@ def test_coord_comparison(self): cube1.add_aux_coord(iris.coords.AuxCoord(['foobar'], long_name='f', units='no_unit')) cube2 = iris.cube.Cube(numpy.zeros((41, 41, 5))) - lonlat_cs = iris.coord_systems.GeogCS() + lonlat_cs = iris.coord_systems.GeogCS(6371229) lon_points2 = -160 + 4.5 * numpy.arange(41, dtype=numpy.float32) cube2.add_dim_coord(iris.coords.DimCoord(lon_points2, 'longitude', units='degrees', coord_system=lonlat_cs), 0) cube2.add_dim_coord(iris.coords.DimCoord(lat_points, 'latitude', units='degrees', coord_system=lonlat_cs), 1) @@ -107,7 +107,7 @@ def test_weighted_mean_little(self): weights = numpy.array([[9, 8, 7],[6, 5, 4],[3, 2, 1]], dtype=numpy.float32) cube = iris.cube.Cube(data, long_name="test_data", units="1") - hcs = iris.coord_systems.GeogCS() + hcs = iris.coord_systems.GeogCS(6371229) lat_coord = iris.coords.DimCoord(numpy.array([1, 2, 3], dtype=numpy.float32), long_name="lat", units="1", coord_system=hcs) lon_coord = iris.coords.DimCoord(numpy.array([1, 2, 3], dtype=numpy.float32), long_name="lon", units="1", coord_system=hcs) cube.add_dim_coord(lat_coord, 0) @@ -372,8 +372,9 @@ def _check_both_conversions(self, cube): plt.scatter(lons, lats) self.check_graphic() - n_pole = cube.coord_system('RotatedGeogCS').grid_north_pole - rlons, rlats = iris.analysis.cartography.rotate_pole(lons, lats, n_pole.lon, n_pole.lat) + grid_north_pole_latitude = cube.coord_system('RotatedGeogCS').grid_north_pole_latitude + grid_north_pole_longitude = cube.coord_system('RotatedGeogCS').grid_north_pole_longitude + rlons, rlats = iris.analysis.cartography.rotate_pole(lons, lats, grid_north_pole_longitude, grid_north_pole_latitude) plt.scatter(rlons, rlats) self.check_graphic() diff --git a/lib/iris_tests/test_analysis_calculus.py b/lib/iris_tests/test_analysis_calculus.py index e521c54228..e7c4d5da6a 100644 --- a/lib/iris_tests/test_analysis_calculus.py +++ b/lib/iris_tests/test_analysis_calculus.py @@ -186,7 +186,7 @@ def setUp(self): data = numpy.arange(2500, dtype=numpy.float32).reshape(50, 50) cube = iris.cube.Cube(data, standard_name="x_wind", units="km/h") - self.lonlat_cs = iris.coord_systems.GeogCS() + self.lonlat_cs = iris.coord_systems.GeogCS(6371229) cube.add_dim_coord(DimCoord(numpy.arange(50, dtype=numpy.float32) * 4.5 -180, 'longitude', units='degrees', coord_system=self.lonlat_cs), 0) cube.add_dim_coord(DimCoord(numpy.arange(50, dtype=numpy.float32) * 4.5 -90, 'latitude', units='degrees', coord_system=self.lonlat_cs), 1) @@ -211,7 +211,7 @@ def setUp(self): [4, 5, 6, 7, 9]], dtype=numpy.float32) cube = iris.cube.Cube(data, standard_name="x_wind", units="km/h") - self.lonlat_cs = iris.coord_systems.GeogCS() + self.lonlat_cs = iris.coord_systems.GeogCS(6371229) cube.add_dim_coord(DimCoord(numpy.arange(4, dtype=numpy.float32) * 90 -180, 'longitude', units='degrees', circular=True, coord_system=self.lonlat_cs), 0) cube.add_dim_coord(DimCoord(numpy.arange(5, dtype=numpy.float32) * 45 -90, 'latitude', units='degrees', coord_system=self.lonlat_cs), 1) @@ -293,7 +293,7 @@ def build_cube(data, spherical=False): dimz = data.ndim - 3 if data.ndim > 2 else None if spherical: - hcs = iris.coord_systems.GeogCS(semi_major_axis=6321, units="m") + hcs = iris.coord_systems.GeogCS(6321) cube.add_dim_coord(DimCoord(numpy.arange(-180, 180, 360./nx, dtype=numpy.float32), 'longitude', units='degrees', coord_system=hcs, circular=True), dimx) cube.add_dim_coord(DimCoord(numpy.arange(-90, 90, 180./ny, dtype=numpy.float32), 'latitude', units='degrees',coord_system=hcs), dimy) diff --git a/lib/iris_tests/test_coord_api.py b/lib/iris_tests/test_coord_api.py index 40dbc9dc70..34ef35535a 100644 --- a/lib/iris_tests/test_coord_api.py +++ b/lib/iris_tests/test_coord_api.py @@ -153,7 +153,8 @@ def test_aux_xml(self): coord = iris.coords.AuxCoord(numpy.arange(10, dtype=numpy.int32), long_name='test', units='meter') coord_xml_element = coord.xml_element(doc) doc.appendChild(coord_xml_element) - r = '\n\n' + r = '\n\n' t = doc.toprettyxml(indent=" ") self.assertEqual(r, t) @@ -163,7 +164,8 @@ def test_dim_xml(self): coord.guess_bounds(0.5) coord_xml_element = coord.xml_element(doc) doc.appendChild(coord_xml_element) - r = '\n\n' + r = '\n\n' t = doc.toprettyxml(indent=" ") self.assertEqual(r, t) @@ -173,12 +175,24 @@ def setUp(self): self.lat = iris.tests.stock.realistic_4d().coord('grid_latitude') def test_DimCoord(self): - result = "DimCoord(array([-0.1278, -0.1269, -0.126 , -0.1251, -0.1242, -0.1233, -0.1224,\n -0.1215, -0.1206, -0.1197], dtype=float32), bounds=array([[-0.12825, -0.12735],\n [-0.12735, -0.12645],\n [-0.12645, -0.12555],\n [-0.12555, -0.12465],\n [-0.12465, -0.12375],\n [-0.12375, -0.12285],\n [-0.12285, -0.12195],\n [-0.12195, -0.12105],\n [-0.12105, -0.12015],\n [-0.12015, -0.11925]], dtype=float32), standard_name='grid_latitude', units=Unit('degrees'), coord_system=RotatedGeogCS(semi_major_axis=6371229.0, semi_minor_axis=6371229.0, inverse_flattening=0.0, units=m, longitude_of_prime_meridian=0.0, grid_north_pole=GeoPos(37.5, 177.5), north_pole_lon=0.0))" + result = "DimCoord(array([-0.1278, -0.1269, -0.126 , -0.1251, -0.1242, -0.1233, -0.1224,\n "\ + "-0.1215, -0.1206, -0.1197], dtype=float32), bounds=array([[-0.12825, -0.12735],\n "\ + "[-0.12735, -0.12645],\n [-0.12645, -0.12555],\n [-0.12555, -0.12465],\n "\ + "[-0.12465, -0.12375],\n [-0.12375, -0.12285],\n [-0.12285, -0.12195],\n "\ + "[-0.12195, -0.12105],\n [-0.12105, -0.12015],\n [-0.12015, -0.11925]], dtype=float32), "\ + "standard_name='grid_latitude', units=Unit('degrees'), coord_system=RotatedGeogCS(37.5, 177.5, "\ + "ellipsoid=GeogCS(6371229.0)))" self.maxDiff = None self.assertMultiLineEqual(result, repr(self.lat[:10])) def test_AuxCoord(self): - result = "AuxCoord(array([-0.1278, -0.1269, -0.126 , -0.1251, -0.1242, -0.1233, -0.1224,\n -0.1215, -0.1206, -0.1197], dtype=float32), bounds=array([[-0.12825, -0.12735],\n [-0.12735, -0.12645],\n [-0.12645, -0.12555],\n [-0.12555, -0.12465],\n [-0.12465, -0.12375],\n [-0.12375, -0.12285],\n [-0.12285, -0.12195],\n [-0.12195, -0.12105],\n [-0.12105, -0.12015],\n [-0.12015, -0.11925]], dtype=float32), standard_name='grid_latitude', units=Unit('degrees'), coord_system=RotatedGeogCS(semi_major_axis=6371229.0, semi_minor_axis=6371229.0, inverse_flattening=0.0, units=m, longitude_of_prime_meridian=0.0, grid_north_pole=GeoPos(37.5, 177.5), north_pole_lon=0.0))" + result = "AuxCoord(array([-0.1278, -0.1269, -0.126 , -0.1251, -0.1242, -0.1233, -0.1224,\n "\ + "-0.1215, -0.1206, -0.1197], dtype=float32), bounds=array([[-0.12825, -0.12735],\n "\ + "[-0.12735, -0.12645],\n [-0.12645, -0.12555],\n [-0.12555, -0.12465],\n "\ + "[-0.12465, -0.12375],\n [-0.12375, -0.12285],\n [-0.12285, -0.12195],\n "\ + "[-0.12195, -0.12105],\n [-0.12105, -0.12015],\n [-0.12015, -0.11925]], dtype=float32), "\ + "standard_name='grid_latitude', units=Unit('degrees'), coord_system=RotatedGeogCS(37.5, 177.5, "\ + "ellipsoid=GeogCS(6371229.0)))" coord = iris.coords.AuxCoord.from_coord(self.lat[:10]) self.maxDiff = None self.assertMultiLineEqual(result, repr(coord)) @@ -205,14 +219,16 @@ def test_excluded_attributes(self): a.attributes.update({'standard_name': 'whoopsy'}) def test_coord_system(self): - a = iris.coords.AuxCoord(range(10), 'air_temperature', units='kelvin', coord_system=iris.coord_systems.GeogCS(6000, units="m")) - result = "AuxCoord(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), standard_name='air_temperature', units=Unit('kelvin'), coord_system=GeogCS(semi_major_axis=6000.0, semi_minor_axis=6000.0, inverse_flattening=0.0, units=m, longitude_of_prime_meridian=0.0))" + a = iris.coords.AuxCoord(range(10), 'air_temperature', units='kelvin', coord_system=iris.coord_systems.GeogCS(6000)) + result = "AuxCoord(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), standard_name='air_temperature', units=Unit('kelvin'), "\ + "coord_system=GeogCS(6000.0))" self.assertEqual(result, str(a)) def test_bounded(self): a = iris.coords.AuxCoord(range(10), 'air_temperature', units='kelvin', bounds=numpy.arange(0, 20).reshape(10, 2)) result = ("AuxCoord(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])" - ", bounds=array([[ 0, 1],\n [ 2, 3],\n [ 4, 5],\n [ 6, 7],\n [ 8, 9],\n [10, 11],\n [12, 13],\n [14, 15],\n [16, 17],\n [18, 19]])" + ", bounds=array([[ 0, 1],\n [ 2, 3],\n [ 4, 5],\n [ 6, 7],\n [ 8, 9],\n "\ + "[10, 11],\n [12, 13],\n [14, 15],\n [16, 17],\n [18, 19]])" ", standard_name='air_temperature', units=Unit('kelvin'))" ) self.assertEqual(result, str(a)) @@ -244,14 +260,16 @@ def test_excluded_attributes(self): a.attributes.update({'standard_name': 'whoopsy'}) def test_coord_system(self): - a = iris.coords.DimCoord(range(10), 'air_temperature', units='kelvin', coord_system=iris.coord_systems.GeogCS(6000, units="m")) - result = "DimCoord(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), standard_name='air_temperature', units=Unit('kelvin'), coord_system=GeogCS(semi_major_axis=6000.0, semi_minor_axis=6000.0, inverse_flattening=0.0, units=m, longitude_of_prime_meridian=0.0))" + a = iris.coords.DimCoord(range(10), 'air_temperature', units='kelvin', coord_system=iris.coord_systems.GeogCS(6000)) + result = "DimCoord(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]), standard_name='air_temperature', units=Unit('kelvin'), "\ + "coord_system=GeogCS(6000.0))" self.assertEqual(result, str(a)) def test_bounded(self): a = iris.coords.DimCoord(range(10), 'air_temperature', units='kelvin', bounds=numpy.arange(0, 20).reshape(10, 2)) result = ("DimCoord(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])" - ", bounds=array([[ 0, 1],\n [ 2, 3],\n [ 4, 5],\n [ 6, 7],\n [ 8, 9],\n [10, 11],\n [12, 13],\n [14, 15],\n [16, 17],\n [18, 19]])" + ", bounds=array([[ 0, 1],\n [ 2, 3],\n [ 4, 5],\n [ 6, 7],\n [ 8, 9],\n "\ + "[10, 11],\n [12, 13],\n [14, 15],\n [16, 17],\n [18, 19]])" ", standard_name='air_temperature', units=Unit('kelvin'))" ) self.assertEqual(result, str(a)) diff --git a/lib/iris_tests/test_coordsystem.py b/lib/iris_tests/test_coordsystem.py index a2af18dc89..97899fb025 100644 --- a/lib/iris_tests/test_coordsystem.py +++ b/lib/iris_tests/test_coordsystem.py @@ -33,18 +33,19 @@ def osgb(): - return TransverseMercator(GeogCS(6377563.396, 6356256.909, 299.3249646, "m"), - origin=(49,-2), false_origin=(-400,100), - scale_factor=0.9996012717) + return TransverseMercator(latitude_of_projection_origin=49, longitude_of_central_meridian=-2, + false_easting=-400, false_northing=100, + scale_factor_at_central_meridian=0.9996012717, + ellipsoid=GeogCS(6377563.396, 6356256.909)) class TestCoordSystemSame(tests.IrisTest): def setUp(self): - self.cs1 = iris.coord_systems.GeogCS() - self.cs2 = iris.coord_systems.GeogCS() - self.cs3 = iris.coord_systems.RotatedGeogCS(grid_north_pole=(30,30)) + self.cs1 = iris.coord_systems.GeogCS(6371229) + self.cs2 = iris.coord_systems.GeogCS(6371229) + self.cs3 = iris.coord_systems.RotatedGeogCS(30, 30, ellipsoid=GeogCS(6371229)) def test_simple(self): a = self.cs1 @@ -78,112 +79,113 @@ def test_different_public_attributes(self): class Test_CoordSystem_xml_element(tests.IrisTest): def test_rotated(self): - cs = RotatedGeogCS(grid_north_pole=(30,40)) - self.assertXMLElement(cs, tests.get_result_path(("coord_systems", "CoordSystem_xml_element.xml"))) + cs = RotatedGeogCS(30, 40, ellipsoid=GeogCS(6371229)) + self.assertXMLElement(cs, ("coord_systems", "CoordSystem_xml_element.xml")) -class Test_GeogCS_init(tests.IrisTest): +class Test_GeogCS_construction(tests.IrisTest): # Test Ellipsoid constructor # Don't care about testing the units, it has no logic specific to this class. - def test_no_params(self): - cs = GeogCS() - self.assertXMLElement(cs, tests.get_result_path(("coord_systems", "GeogCS_init_no_param.xml"))) - def test_sphere_param(self): - cs = GeogCS(6543210, units="m") - self.assertXMLElement(cs, tests.get_result_path(("coord_systems", "GeogCS_init_sphere.xml"))) - - def test_all_ellipsoid_params(self): - cs = GeogCS(6543210, 6500000, 151.42814163388104, "m") - self.assertXMLElement(cs, tests.get_result_path(("coord_systems", "GeogCS_init_all_ellipsoid.xml"))) + cs = GeogCS(6543210) + self.assertXMLElement(cs, ("coord_systems", "GeogCS_init_sphere.xml")) def test_no_major(self): - cs = GeogCS(semi_minor_axis=6500000, inverse_flattening=151.42814163388104, units="m") - self.assertXMLElement(cs, tests.get_result_path(("coord_systems", "GeogCS_init_no_major.xml"))) + cs = GeogCS(semi_minor_axis=6500000, inverse_flattening=151.42814163388104) + self.assertXMLElement(cs, ("coord_systems", "GeogCS_init_no_major.xml")) def test_no_minor(self): - cs = GeogCS(semi_major_axis=6543210, inverse_flattening=151.42814163388104, units="m") - self.assertXMLElement(cs, tests.get_result_path(("coord_systems", "GeogCS_init_no_minor.xml"))) + cs = GeogCS(semi_major_axis=6543210, inverse_flattening=151.42814163388104) + self.assertXMLElement(cs, ("coord_systems", "GeogCS_init_no_minor.xml")) def test_no_invf(self): - cs = GeogCS(semi_major_axis=6543210, semi_minor_axis=6500000, units="m") - self.assertXMLElement(cs, tests.get_result_path(("coord_systems", "GeogCS_init_no_invf.xml"))) + cs = GeogCS(semi_major_axis=6543210, semi_minor_axis=6500000) + self.assertXMLElement(cs, ("coord_systems", "GeogCS_init_no_invf.xml")) - def test_units(self): - # Just make sure they get conveted to a unit, not overly concerned about testing this param. - cs = GeogCS(6543210, units="m") - self.assertEqual(cs.units, iris.unit.Unit("m")) + def test_invalid_ellipsoid_params(self): + # no params + self.assertRaises(ValueError, GeogCS) + + # over specified + self.assertRaises(ValueError, GeogCS, 6543210, 6500000, 151.42814163388104) + + # under specified + self.assertRaises(ValueError, GeogCS, None, 6500000, None) + self.assertRaises(ValueError, GeogCS, None, None, 151.42814163388104) class Test_GeogCS_repr(tests.IrisTest): def test_repr(self): - cs = GeogCS(6543210, 6500000, 151.42814163388104, "m") - expected = "GeogCS(semi_major_axis=6543210.0, semi_minor_axis=6500000.0, inverse_flattening=151.42814163388104, units='Unit('m')', longitude_of_prime_meridian=0.0)" + cs = GeogCS(6543210, 6500000) + expected = "GeogCS(semi_major_axis=6543210.0, semi_minor_axis=6500000.0)" self.assertEqual(expected, repr(cs)) class Test_GeogCS_str(tests.IrisTest): def test_str(self): - cs = GeogCS(6543210, 6500000, 151.42814163388104, "m") - expected = "GeogCS(semi_major_axis=6543210.0, semi_minor_axis=6500000.0, inverse_flattening=151.428141634, units=m, longitude_of_prime_meridian=0.0)" + cs = GeogCS(6543210, 6500000) + expected = "GeogCS(semi_major_axis=6543210.0, semi_minor_axis=6500000.0)" self.assertEqual(expected, str(cs)) -class Test_GeogCS_to_cartopy(tests.IrisTest): - def test_to_cartopy(self): - cs = GeogCS() - self.assertRaises(NotImplementedError, cs._to_cartopy) +class Test_RotatedGeogCS_construction(tests.IrisTest): + def test_init(self): + rcs = RotatedGeogCS(30, 40, north_pole_grid_longitude=50, ellipsoid=GeogCS(6371229)) + self.assertXMLElement(rcs, ("coord_systems", "RotatedGeogCS_init.xml")) + rcs = RotatedGeogCS(30, 40, north_pole_grid_longitude=50) + self.assertXMLElement(rcs, ("coord_systems", "RotatedGeogCS_init_a.xml")) -class Test_RotatedGeogCS_init(tests.IrisTest): - def test_init(self): - rcs = RotatedGeogCS(grid_north_pole=(30,40), north_pole_lon=50) - self.assertXMLElement(rcs, tests.get_result_path(("coord_systems", "RotatedGeogCS_init.xml"))) + rcs = RotatedGeogCS(30, 40) + self.assertXMLElement(rcs, ("coord_systems", "RotatedGeogCS_init_b.xml")) class Test_RotatedGeogCS_repr(tests.IrisTest): def test_repr(self): - rcs = RotatedGeogCS(grid_north_pole=(30,40), north_pole_lon=50) - expected = "RotatedGeogCS(semi_major_axis=6371229.0, semi_minor_axis=6371229.0, inverse_flattening=0.0, units='Unit('m')', longitude_of_prime_meridian=0.0, grid_north_pole=GeoPos(30.0, 40.0), north_pole_lon=50.0)" + rcs = RotatedGeogCS(30, 40, north_pole_grid_longitude=50, ellipsoid=GeogCS(6371229)) + expected = "RotatedGeogCS(30.0, 40.0, "\ + "north_pole_grid_longitude=50.0, ellipsoid=GeogCS(6371229.0))" + self.assertEqual(expected, repr(rcs)) + + rcs = RotatedGeogCS(30, 40, north_pole_grid_longitude=50) + expected = "RotatedGeogCS(30.0, 40.0, north_pole_grid_longitude=50.0)" + self.assertEqual(expected, repr(rcs)) + + rcs = RotatedGeogCS(30, 40) + expected = "RotatedGeogCS(30.0, 40.0)" self.assertEqual(expected, repr(rcs)) + class Test_RotatedGeogCS_str(tests.IrisTest): def test_str(self): - rcs = RotatedGeogCS(grid_north_pole=(30,40), north_pole_lon=50) - expected = "RotatedGeogCS(semi_major_axis=6371229.0, semi_minor_axis=6371229.0, inverse_flattening=0.0, units=m, longitude_of_prime_meridian=0.0, grid_north_pole=GeoPos(30.0, 40.0), north_pole_lon=50.0)" + rcs = RotatedGeogCS(30, 40, north_pole_grid_longitude=50, ellipsoid=GeogCS(6371229)) + expected = "RotatedGeogCS(30.0, 40.0, "\ + "north_pole_grid_longitude=50.0, ellipsoid=GeogCS(6371229.0))" self.assertEqual(expected, str(rcs)) + rcs = RotatedGeogCS(30, 40, north_pole_grid_longitude=50) + expected = "RotatedGeogCS(30.0, 40.0, north_pole_grid_longitude=50.0)" + self.assertEqual(expected, str(rcs)) -class Test_RotatedGeogCS_from_geocs(tests.IrisTest): - def test_sphere(self): - cs = GeogCS() - rcs = RotatedGeogCS.from_geocs(cs, grid_north_pole=(30,40)) - self.assertXMLElement(rcs, tests.get_result_path(("coord_systems", "RotatedGeogCS_from_geocs.xml"))) - -class Test_RotatedGeogCS_tocartopy(tests.IrisTest): - def test_to_cartopy(self): - rcs = GeogCS() - self.assertRaises(NotImplementedError, rcs._to_cartopy) + rcs = RotatedGeogCS(30, 40) + expected = "RotatedGeogCS(30.0, 40.0)" + self.assertEqual(expected, str(rcs)) -class Test_TransverseMercator_init(tests.IrisTest): +class Test_TransverseMercator_construction(tests.IrisTest): def test_osgb(self): tm = osgb() - self.assertXMLElement(tm, tests.get_result_path(("coord_systems", "TransverseMercator_osgb.xml"))) + self.assertXMLElement(tm, ("coord_systems", "TransverseMercator_osgb.xml")) class Test_TransverseMercator_repr(tests.IrisTest): def test_osgb(self): tm = osgb() - expected = "TransverseMercator(origin=GeoPos(49.0, -2.0), false_origin=(-400.0, 100.0), scale_factor=0.9996012717, geos=GeogCS(semi_major_axis=6377563.396, semi_minor_axis=6356256.909, inverse_flattening=299.3249646, units='Unit('m')', longitude_of_prime_meridian=0.0))" + expected = "TransverseMercator(latitude_of_projection_origin=49.0, longitude_of_central_meridian=-2.0, "\ + "false_easting=-400.0, false_northing=100.0, scale_factor_at_central_meridian=0.9996012717, "\ + "ellipsoid=GeogCS(semi_major_axis=6377563.396, semi_minor_axis=6356256.909))" self.assertEqual(expected, repr(tm)) -class Test_TransverseMercator_tocartopy(tests.IrisTest): - def test_to_cartopy(self): - tm = osgb() - self.assertRaises(NotImplementedError, tm._to_cartopy) - - if __name__ == "__main__": tests.main() diff --git a/lib/iris_tests/test_cube_to_pp.py b/lib/iris_tests/test_cube_to_pp.py index 7f16218128..740a9d2b59 100644 --- a/lib/iris_tests/test_cube_to_pp.py +++ b/lib/iris_tests/test_cube_to_pp.py @@ -148,15 +148,15 @@ def test_non_standard_cross_sections(self): self.add_coords_to_cube_and_test( iris.coords.DimCoord(f.z, long_name='air_pressure', units='hPa', bounds=f.z_bounds), - iris.coords.DimCoord(f.y, standard_name='latitude', units='degrees', bounds=f.y_bounds, coord_system=f.geocs())) + iris.coords.DimCoord(f.y, standard_name='latitude', units='degrees', bounds=f.y_bounds, coord_system=f.geog_cs())) self.add_coords_to_cube_and_test( iris.coords.DimCoord(f.z, long_name='depth', units='m', bounds=f.z_bounds), - iris.coords.DimCoord(f.y, standard_name='latitude', units='degrees', bounds=f.y_bounds, coord_system=f.geocs())) + iris.coords.DimCoord(f.y, standard_name='latitude', units='degrees', bounds=f.y_bounds, coord_system=f.geog_cs())) self.add_coords_to_cube_and_test( iris.coords.DimCoord(f.z, long_name='eta', units='1', bounds=f.z_bounds), - iris.coords.DimCoord(f.y, standard_name='latitude', units='degrees', bounds=f.y_bounds, coord_system=f.geocs())) + iris.coords.DimCoord(f.y, standard_name='latitude', units='degrees', bounds=f.y_bounds, coord_system=f.geog_cs())) self.add_coords_to_cube_and_test( iris.coords.DimCoord(f.z, long_name='air_pressure', units='hPa', bounds=f.z_bounds), @@ -174,13 +174,13 @@ class fakePPEnvironment(object): y_bounds = [[0.9,1.1], [1.9,2.1], [2.9,3.1], [3.9,4.1]] z_bounds = [[110.9,111.1], [221.9,222.1], [332.9,333.1], [443.9,444.1]] - def geocs(self): + def geog_cs(self): """Return a GeogCS for this PPField. Returns: A GeogCS with the appropriate earth shape, meridian and pole position. """ - return iris.coord_systems.GeogCS(6371229.0, units=iris.unit.Unit('m')) + return iris.coord_systems.GeogCS(6371229.0) @iris.tests.skip_data diff --git a/lib/iris_tests/test_grib_load.py b/lib/iris_tests/test_grib_load.py index a8397a2e5f..f365591cb0 100644 --- a/lib/iris_tests/test_grib_load.py +++ b/lib/iris_tests/test_grib_load.py @@ -131,7 +131,7 @@ def old_compat_load(name): self.assertCML(cube, ("grib_load", "earth_shape_grib1.cml")) def test_custom_rules(self): - """Test custom rule evaluation.""" + # Test custom rule evaluation. # Default behaviour # data_path = tests.get_data_path(('GRIB', 'global_t', 'global.grib2')) # cube = iris.load_strict(data_path) diff --git a/lib/iris_tests/test_grib_save.py b/lib/iris_tests/test_grib_save.py index 65ca4d7cdd..44cd7ea23d 100644 --- a/lib/iris_tests/test_grib_save.py +++ b/lib/iris_tests/test_grib_save.py @@ -140,7 +140,7 @@ class TestHandmade(tests.IrisTest): def _lat_lon_cube_no_time(self): """Returns a cube with a latitude and longitude suitable for testing saving to PP/NetCDF etc.""" cube = iris.cube.Cube(numpy.arange(12, dtype=numpy.int32).reshape((3, 4))) - cs = iris.coord_systems.GeogCS() + cs = iris.coord_systems.GeogCS(6371229) cube.add_dim_coord(iris.coords.DimCoord(numpy.arange(4) * 90 + -180, 'longitude', units='degrees', coord_system=cs), 1) cube.add_dim_coord(iris.coords.DimCoord(numpy.arange(3) * 45 + -90, 'latitude', units='degrees', coord_system=cs), 0) diff --git a/lib/iris_tests/test_intersect.py b/lib/iris_tests/test_intersect.py index 5d8e7f338b..205b6c406c 100644 --- a/lib/iris_tests/test_intersect.py +++ b/lib/iris_tests/test_intersect.py @@ -38,7 +38,7 @@ def test_simple_intersect(self): [4,5,6,7,8], [5,6,7,8,9]], dtype=numpy.int32)) - lonlat_cs = iris.coord_systems.RotatedGeogCS(grid_north_pole=(10, 20)) + lonlat_cs = iris.coord_systems.RotatedGeogCS(10, 20) cube.add_dim_coord(iris.coords.DimCoord(numpy.arange(5, dtype=numpy.float32) * 90 - 180, 'longitude', units='degrees', coord_system=lonlat_cs), 1) cube.add_dim_coord(iris.coords.DimCoord(numpy.arange(5, dtype=numpy.float32) * 45 - 90, 'latitude', units='degrees', coord_system=lonlat_cs), 0) cube.add_aux_coord(iris.coords.DimCoord(points=numpy.int32(11), long_name='pressure', units='Pa')) @@ -51,7 +51,7 @@ def test_simple_intersect(self): [4,5,6,7,8], [5,6,7,8,50]], dtype=numpy.int32)) - lonlat_cs = iris.coord_systems.RotatedGeogCS(grid_north_pole=(10, 20)) + lonlat_cs = iris.coord_systems.RotatedGeogCS(10, 20) cube2.add_dim_coord(iris.coords.DimCoord(numpy.arange(5, dtype=numpy.float32) * 90, 'longitude', units='degrees', coord_system=lonlat_cs), 1) cube2.add_dim_coord(iris.coords.DimCoord(numpy.arange(5, dtype=numpy.float32) * 45 - 90, 'latitude', units='degrees', coord_system=lonlat_cs), 0) cube2.add_aux_coord(iris.coords.DimCoord(points=numpy.int32(11), long_name='pressure', units='Pa')) diff --git a/lib/iris_tests/test_mapping.py b/lib/iris_tests/test_mapping.py index 5f35a95db8..d17ce17bc1 100644 --- a/lib/iris_tests/test_mapping.py +++ b/lib/iris_tests/test_mapping.py @@ -75,11 +75,9 @@ def _pretend_unrotated(cube): lat = cube.coord('grid_latitude') lon = cube.coord('grid_longitude') rcs = lat.coord_system - cs = iris.coord_systems.GeogCS(rcs.semi_major_axis, rcs.semi_minor_axis, - rcs.inverse_flattening, rcs.units, - rcs.longitude_of_prime_meridian) - lat.coord_system = cs - lon.coord_system = cs + + lat.coord_system = rcs.ellipsoid + lon.coord_system = rcs.ellipsoid lat.standard_name = "latitude" lon.standard_name = "longitude" diff --git a/lib/iris_tests/test_pp_cf.py b/lib/iris_tests/test_pp_cf.py index 350f63f1bc..70b1dba9df 100644 --- a/lib/iris_tests/test_pp_cf.py +++ b/lib/iris_tests/test_pp_cf.py @@ -42,10 +42,8 @@ def callback_HadCM2_ts_SAT_ann_18602100_b_pp(cube, field, filename): def reset_pole(coord_name): coord = cube.coord(coord_name) coord.rename(coord.name().replace('grid_', '')) - cs = coord.coord_system - coord.coord_system = iris.coord_systems.GeogCS(cs.semi_major_axis, cs.semi_minor_axis, - cs.inverse_flattening, cs.units, - cs.longitude_of_prime_meridian) + coord.coord_system = coord.coord_system.ellipsoid + reset_pole('grid_latitude') reset_pole('grid_longitude') cube.standard_name = 'air_temperature' diff --git a/lib/iris_tests/test_regrid.py b/lib/iris_tests/test_regrid.py index 5a94f25748..edb8887bdc 100644 --- a/lib/iris_tests/test_regrid.py +++ b/lib/iris_tests/test_regrid.py @@ -91,17 +91,17 @@ def test_regrid_3d(self): def test_regrid_max_resolution(self): low = Cube(numpy.arange(12).reshape((3, 4))) - cs = GeogCS() + cs = GeogCS(6371229) low.add_dim_coord(DimCoord(numpy.array([-1, 0, 1], dtype=numpy.int32), 'latitude', units='degrees', coord_system=cs), 0) low.add_dim_coord(DimCoord(numpy.array([-1, 0, 1, 2], dtype=numpy.int32), 'longitude', units='degrees', coord_system=cs), 1) med = Cube(numpy.arange(20).reshape((4, 5))) - cs = GeogCS() + cs = GeogCS(6371229) med.add_dim_coord(DimCoord(numpy.array([-1, 0, 1, 2], dtype=numpy.int32), 'latitude', units='degrees', coord_system=cs), 0) med.add_dim_coord(DimCoord(numpy.array([-2, -1, 0, 1, 2], dtype=numpy.int32), 'longitude', units='degrees', coord_system=cs), 1) high = Cube(numpy.arange(30).reshape((5, 6))) - cs = GeogCS() + cs = GeogCS(6371229) high.add_dim_coord(DimCoord(numpy.array([-2, -1, 0, 1, 2], dtype=numpy.int32), 'latitude', units='degrees', coord_system=cs), 0) high.add_dim_coord(DimCoord(numpy.array([-2, -1, 0, 1, 2, 3], dtype=numpy.int32), 'longitude', units='degrees', coord_system=cs), 1) @@ -111,7 +111,7 @@ def test_regrid_max_resolution(self): class TestRegridBilinear(tests.IrisTest): def setUp(self): - self.cs = GeogCS() + self.cs = GeogCS(6371229) # Source cube candidate for regridding. cube = Cube(numpy.arange(12, dtype=numpy.float32).reshape(3, 4), long_name='unknown') diff --git a/lib/iris_tests/test_xml.py b/lib/iris_tests/test_xml.py index 5e40d5703b..d86e446bfb 100644 --- a/lib/iris_tests/test_xml.py +++ b/lib/iris_tests/test_xml.py @@ -60,9 +60,9 @@ def test_handmade(self): cube.attributes['my_attribute'] = 'foobar' if rotated == False: - lonlat_cs = coord_systems.GeogCS() + lonlat_cs = coord_systems.GeogCS(6371229) else: - lonlat_cs = coord_systems.RotatedGeogCS(grid_north_pole=(30, 150)) + lonlat_cs = coord_systems.RotatedGeogCS(30, 150) cube.add_dim_coord(coords.DimCoord(numpy.array([-180, -90, 0, 90, 180], dtype=ll_dtype), 'longitude', units='degrees', coord_system=lonlat_cs), 1) From 4ac7ff36c5a43743cc09262edd14192c7f6ae5b6 Mon Sep 17 00:00:00 2001 From: bblay Date: Fri, 31 Aug 2012 10:36:17 +0100 Subject: [PATCH 4/4] test results --- .../COLPEX/uwind_and_orog.cml | 8 +- .../FF/qtgl.ssps_006_air_temperature_0.cml | 4 +- .../FF/qtgl.ssps_006_air_temperature_1.cml | 4 +- .../FF/qtgl.ssps_006_air_temperature_2.cml | 4 +- .../FF/qtgl.ssps_006_air_temperature_3.cml | 4 +- .../FF/qtgl.ssps_006_air_temperature_4.cml | 4 +- .../FF/qtgl.ssps_006_soil_temperature_0.cml | 4 +- .../FF/qtgl.ssps_006_soil_temperature_1.cml | 4 +- .../FF/qtgl.ssps_006_soil_temperature_2.cml | 4 +- .../FF/qtgl.ssps_006_soil_temperature_3.cml | 4 +- etc/iris_tests_results/analysis/abs.cml | 4 +- etc/iris_tests_results/analysis/addition.cml | 4 +- .../analysis/addition_coord_x.cml | 4 +- .../analysis/addition_coord_y.cml | 4 +- .../analysis/addition_different_std_name.cml | 4 +- .../analysis/addition_in_place.cml | 4 +- .../analysis/addition_in_place_coord.cml | 4 +- .../analysis/addition_scalar.cml | 4 +- .../analysis/aggregated_by/easy.cml | 4 +- .../analysis/aggregated_by/multi.cml | 4 +- .../analysis/aggregated_by/multi_shared.cml | 4 +- .../analysis/aggregated_by/single.cml | 4 +- .../analysis/aggregated_by/single_shared.cml | 4 +- .../analysis/areaweights_original.cml | 4 +- .../calculus/curl_contrived_cartesian2.cml | 24 +- .../calculus/delta_handmade_wrt_lat.cml | 4 +- .../calculus/delta_handmade_wrt_lon.cml | 4 +- .../calculus/delta_handmade_wrt_x.cml | 4 +- .../calculus/delta_handmade_wrt_y.cml | 4 +- .../analysis/calculus/grad_contrived1.cml | 6 +- .../analysis/calculus/grad_contrived2.cml | 6 +- .../grad_contrived_non_spherical1.cml | 8 +- .../analysis/calculus/handmade2_wrt_lat.cml | 4 +- .../analysis/calculus/handmade2_wrt_lon.cml | 4 +- .../analysis/calculus/handmade_wrt_lat.cml | 4 +- .../analysis/calculus/handmade_wrt_lon.cml | 4 +- .../analysis/calculus/handmade_wrt_x.cml | 4 +- .../analysis/calculus/handmade_wrt_y.cml | 4 +- etc/iris_tests_results/analysis/division.cml | 4 +- .../analysis/division_by_array.cml | 4 +- .../analysis/division_by_latitude.cml | 4 +- .../analysis/division_by_longitude.cml | 4 +- .../analysis/division_by_singular_coord.cml | 4 +- .../analysis/division_scalar.cml | 4 +- .../analysis/exponentiate.cml | 4 +- .../analysis/gmean_latitude.cml | 4 +- .../analysis/gmean_latitude_longitude.cml | 4 +- .../gmean_latitude_longitude_1call.cml | 4 +- .../analysis/hmean_latitude.cml | 4 +- .../analysis/hmean_latitude_longitude.cml | 4 +- .../hmean_latitude_longitude_1call.cml | 4 +- .../interpolation/linear/real_2dslice.cml | 4 +- .../interpolation/linear/real_2slices.cml | 4 +- .../linear/real_circular_2dslice.cml | 4 +- .../nearest_neighbour_extract_bounded.cml | 4 +- ...st_neighbour_extract_bounded_mid_point.cml | 4 +- .../nearest_neighbour_extract_latitude.cml | 4 +- ...t_neighbour_extract_latitude_longitude.cml | 4 +- etc/iris_tests_results/analysis/log.cml | 4 +- etc/iris_tests_results/analysis/log10.cml | 4 +- etc/iris_tests_results/analysis/log2.cml | 4 +- .../analysis/maths_original.cml | 4 +- .../analysis/max_latitude.cml | 4 +- .../analysis/max_latitude_longitude.cml | 4 +- .../analysis/max_latitude_longitude_1call.cml | 4 +- .../analysis/mean_latitude.cml | 4 +- .../analysis/mean_latitude_longitude.cml | 4 +- .../mean_latitude_longitude_1call.cml | 4 +- .../analysis/median_latitude.cml | 4 +- .../analysis/median_latitude_longitude.cml | 4 +- .../median_latitude_longitude_1call.cml | 4 +- .../analysis/min_latitude.cml | 4 +- .../analysis/min_latitude_longitude.cml | 4 +- .../analysis/min_latitude_longitude_1call.cml | 4 +- etc/iris_tests_results/analysis/multiply.cml | 4 +- .../analysis/multiply_different_std_name.cml | 4 +- etc/iris_tests_results/analysis/original.cml | 4 +- .../analysis/original_common.cml | 4 +- .../analysis/original_hmean.cml | 4 +- etc/iris_tests_results/analysis/sqrt.cml | 4 +- .../analysis/std_dev_latitude.cml | 4 +- .../analysis/std_dev_latitude_longitude.cml | 4 +- .../std_dev_latitude_longitude_1call.cml | 4 +- etc/iris_tests_results/analysis/subtract.cml | 4 +- .../analysis/subtract_array.cml | 4 +- .../analysis/subtract_coord_x.cml | 4 +- .../analysis/subtract_coord_y.cml | 4 +- .../analysis/subtract_scalar.cml | 4 +- .../analysis/sum_latitude.cml | 4 +- .../analysis/sum_latitude_longitude.cml | 4 +- .../analysis/sum_latitude_longitude_1call.cml | 4 +- .../analysis/variance_latitude.cml | 4 +- .../analysis/variance_latitude_longitude.cml | 4 +- .../variance_latitude_longitude_1call.cml | 4 +- .../analysis/weighted_mean_lat.cml | 4 +- .../analysis/weighted_mean_latlon.cml | 4 +- .../analysis/weighted_mean_lon.cml | 4 +- .../analysis/weighted_mean_original.cml | 4 +- .../analysis/weighted_mean_source.cml | 4 +- .../cdm/extract/lat_eq_10.cml | 4 +- .../cdm/extract/lat_gt_10.cml | 4 +- .../cdm/extract/lat_gt_10_and_lon_ge_10.cml | 4 +- etc/iris_tests_results/cdm/masked_cube.cml | 4 +- .../cdm/test_simple_cube_intersection.cml | 8 +- .../constrained_load/all_10_load_match.cml | 16 +- .../all_ml_10_22_load_match.cml | 16 +- .../constrained_load/attribute_constraint.cml | 4 +- ..._and_theta_level_gt_30_le_3_load_match.cml | 8 +- ...and_theta_level_gt_30_le_3_load_strict.cml | 8 +- .../constrained_load/theta_10_load_match.cml | 4 +- .../constrained_load/theta_10_load_strict.cml | 4 +- .../theta_and_all_10_load_match.cml | 20 +- .../theta_and_theta_10_load_strict.cml | 8 +- .../theta_and_theta_load_match.cml | 8 +- .../theta_and_theta_load_strict.cml | 8 +- .../theta_gt_30_le_3_load_match.cml | 4 +- .../theta_gt_30_le_3_load_strict.cml | 4 +- .../theta_lat_30_load_match.cml | 4 +- .../theta_lat_30_load_strict.cml | 4 +- .../theta_lat_gt_30_load_match.cml | 4 +- .../theta_lat_gt_30_load_strict.cml | 4 +- .../constrained_load/theta_load_match.cml | 4 +- .../constrained_load/theta_load_strict.cml | 4 +- .../coord_systems/CoordSystem_xml_element.xml | 2 +- .../coord_systems/GeogCS_init_no_invf.xml | 2 +- .../coord_systems/GeogCS_init_no_major.xml | 2 +- .../coord_systems/GeogCS_init_no_minor.xml | 2 +- .../coord_systems/GeogCS_init_sphere.xml | 2 +- .../RotatedGeogCS_from_geocs.xml | 2 - .../coord_systems/RotatedGeogCS_init.xml | 2 +- .../coord_systems/RotatedGeogCS_init_a.xml | 2 + .../coord_systems/RotatedGeogCS_init_b.xml | 2 + .../coord_systems/TransverseMercator_osgb.xml | 2 +- .../latitude_longitude_dual_stage.cml | 4 +- .../latitude_longitude_single_stage.cml | 4 +- ...latitude_model_level_number_dual_stage.cml | 4 +- ...titude_model_level_number_single_stage.cml | 4 +- .../latitude_time_dual_stage.cml | 4 +- .../latitude_time_single_stage.cml | 4 +- .../longitude_latitude_dual_stage.cml | 4 +- .../longitude_latitude_single_stage.cml | 4 +- ...ongitude_model_level_number_dual_stage.cml | 4 +- ...gitude_model_level_number_single_stage.cml | 4 +- .../longitude_time_dual_stage.cml | 4 +- .../longitude_time_single_stage.cml | 4 +- ...model_level_number_latitude_dual_stage.cml | 4 +- ...del_level_number_latitude_single_stage.cml | 4 +- ...odel_level_number_longitude_dual_stage.cml | 4 +- ...el_level_number_longitude_single_stage.cml | 4 +- .../model_level_number_time_dual_stage.cml | 4 +- .../model_level_number_time_single_stage.cml | 4 +- .../cube_collapsed/original.cml | 4 +- .../time_latitude_dual_stage.cml | 4 +- .../time_latitude_single_stage.cml | 4 +- .../time_longitude_dual_stage.cml | 4 +- .../time_longitude_single_stage.cml | 4 +- .../time_model_level_number_dual_stage.cml | 4 +- .../time_model_level_number_single_stage.cml | 4 +- .../triple_collapse_lat_ml_pt.cml | 4 +- .../triple_collapse_ml_pt_lon.cml | 4 +- .../cube_io/pickling/cubelist.cml | 8 +- .../cube_io/pickling/single_cube.cml | 4 +- .../cube_io/pickling/theta.cml | 4 +- .../cube_io/pp/load/global.cml | 4 +- .../cube_io/pp/no_std_name.cml | 4 +- .../real_data_dual_tuple_indexing1.cml | 4 +- .../real_data_dual_tuple_indexing2.cml | 4 +- .../real_data_dual_tuple_indexing3.cml | 4 +- .../cube_slice/real_empty_data_indexing.cml | 4 +- etc/iris_tests_results/derived/column.cml | 4 +- etc/iris_tests_results/derived/no_orog.cml | 4 +- .../derived/removed_orog.cml | 4 +- .../derived/removed_sigma.cml | 4 +- etc/iris_tests_results/derived/transposed.cml | 4 +- etc/iris_tests_results/file_load/5d_pp.dot | 8 +- .../file_load/coord_attributes.dot | 8 +- .../file_load/global_pp.dot | 8 +- .../file_load/theta_levels.cml | 152 ++++----- .../file_load/u_wind_levels.cml | 152 ++++----- .../file_load/v_wind_levels.cml | 152 ++++----- .../file_load/wind_levels.cml | 304 +++++++++--------- etc/iris_tests_results/grib_load/3_layer.cml | 12 +- .../grib_load/earth_shape_0.cml | 4 +- .../grib_load/earth_shape_1.cml | 4 +- .../grib_load/earth_shape_2.cml | 4 +- .../grib_load/earth_shape_3.cml | 4 +- .../grib_load/earth_shape_4.cml | 4 +- .../grib_load/earth_shape_5.cml | 4 +- .../grib_load/earth_shape_6.cml | 4 +- .../grib_load/earth_shape_7.cml | 4 +- .../grib_load/earth_shape_grib1.cml | 4 +- .../grib_load/ineg_jneg.cml | 4 +- .../grib_load/ineg_jpos.cml | 4 +- .../grib_load/ipos_jneg.cml | 4 +- .../grib_load/ipos_jpos.cml | 4 +- etc/iris_tests_results/grib_load/rotated.cml | 4 +- .../grib_load/time_bound.cml | 4 +- .../grib_load/y_fastest.cml | 4 +- etc/iris_tests_results/merge/dec.cml | 16 +- etc/iris_tests_results/merge/theta.cml | 4 +- .../merge/theta_two_forecast_periods.cml | 4 +- .../netcdf/netcdf_cell_methods.cml | 72 ++--- .../netcdf/netcdf_deferred_index_0.cml | 4 +- .../netcdf/netcdf_deferred_index_1.cml | 4 +- .../netcdf/netcdf_deferred_index_2.cml | 4 +- .../netcdf/netcdf_deferred_mix_0.cml | 4 +- .../netcdf/netcdf_deferred_mix_1.cml | 4 +- .../netcdf/netcdf_deferred_slice_0.cml | 4 +- .../netcdf/netcdf_deferred_slice_1.cml | 4 +- .../netcdf/netcdf_deferred_slice_2.cml | 4 +- .../netcdf/netcdf_deferred_tuple_0.cml | 4 +- .../netcdf/netcdf_deferred_tuple_1.cml | 4 +- .../netcdf/netcdf_deferred_tuple_2.cml | 4 +- .../netcdf/netcdf_global_xyt_hires.cml | 4 +- .../netcdf/netcdf_global_xyt_total.cml | 4 +- .../netcdf/netcdf_global_xyzt_gems.cml | 8 +- .../netcdf/netcdf_global_xyzt_gems_iter_0.cml | 4 +- .../netcdf/netcdf_global_xyzt_gems_iter_1.cml | 4 +- .../netcdf/netcdf_rotated_xy_land.cml | 4 +- .../netcdf_rotated_xyt_precipitation.cml | 4 +- .../netcdf/netcdf_save_hybrid_height.cdl | 4 +- .../netcdf/netcdf_save_load_hybrid_height.cml | 4 +- .../netcdf_save_load_ndim_auxiliary.cml | 4 +- .../netcdf/netcdf_save_ndim_auxiliary.cdl | 7 +- etc/iris_tests_results/pp_rules/global.cml | 4 +- .../pp_rules/lbproc_mean_max_min.cml | 20 +- .../pp_rules/rotated_uk.cml | 4 +- .../regrid/bilinear_larger.cml | 4 +- .../bilinear_larger_lon_extrapolate_left.cml | 4 +- .../bilinear_larger_lon_extrapolate_right.cml | 4 +- .../regrid/bilinear_smaller.cml | 4 +- .../bilinear_smaller_lon_align_left.cml | 4 +- .../bilinear_smaller_lon_align_right.cml | 4 +- .../regrid/low_med_high.cml | 12 +- .../regrid/theta_on_uwind_0d.cml | 4 +- .../regrid/theta_on_uwind_1d.cml | 4 +- .../regrid/theta_on_uwind_2d.cml | 4 +- .../regrid/theta_on_uwind_3d.cml | 4 +- .../regrid/uwind_on_theta_0d.cml | 4 +- .../regrid/uwind_on_theta_1d.cml | 4 +- .../regrid/uwind_on_theta_2d.cml | 4 +- .../regrid/uwind_on_theta_3d.cml | 4 +- etc/iris_tests_results/stock/realistic_4d.cml | 4 +- .../system/supported_filetype_.grib2.cml | 4 +- .../system/supported_filetype_.nc.cml | 4 +- .../system/supported_filetype_.pp.cml | 4 +- .../trajectory/big_cube.cml | 4 +- .../trajectory/constant_latitude.cml | 4 +- .../trajectory/single_point.cml | 4 +- etc/iris_tests_results/trajectory/zigzag.cml | 4 +- etc/iris_tests_results/trui/air_temp_T00.cml | 4 +- etc/iris_tests_results/trui/air_temp_T24.cml | 4 +- .../trui/air_temp_T24_subset.cml | 4 +- .../trui/air_temp_T24_subset_mean.cml | 4 +- .../trui/air_temp_trial_diff_T00_to_T24.cml | 4 +- .../mean_air_temp_trial_diff_T00_to_T24.cml | 4 +- .../uri_callback/grib_global.cml | 4 +- .../uri_callback/trui_init.cml | 4 +- .../uri_callback/trui_t24.cml | 4 +- ...000.03.236.000128.1990.12.01.00.00.b_0.cml | 4 +- ...000.03.236.004224.1990.12.01.00.00.b_0.cml | 4 +- ...000.03.236.008320.1990.12.01.00.00.b_0.cml | 4 +- ...000.16.202.000128.1860.09.01.00.00.b_0.cml | 4 +- ...0.00.000.000000.1860.01.01.00.00.f.b_0.cml | 4 +- ...000.44.101.131200.1920.09.01.00.00.b_0.cml | 2 +- .../from_netcdf/12187.b_0.cml | 4 +- .../from_netcdf/aaxzc_level_lat_orig.b_0.cml | 2 +- .../aaxzc_lon_lat_press_orig.b_0.cml | 4 +- .../from_netcdf/aaxzc_lon_lat_several.b_0.cml | 4 +- .../from_netcdf/aaxzc_n10r13xy.b_0.cml | 4 +- .../abcza_pa19591997_daily_29.b_0.cml | 4 +- .../abcza_pa19591997_daily_29.b_1.cml | 4 +- .../abcza_pa19591997_daily_29.b_2.cml | 4 +- .../from_netcdf/abxpa_press_lat.b_0.cml | 2 +- .../from_netcdf/integer.b_0.cml | 4 +- .../from_netcdf/model.b_0.cml | 4 +- .../from_netcdf/ocean_xsect.b_0.cml | 2 +- .../from_netcdf/st0fc699.b_0.cml | 4 +- .../from_netcdf/st0fc942.b_0.cml | 2 +- .../from_netcdf/st30211.b_0.cml | 4 +- ...00000.03.236.000128.1990.12.01.00.00.b.cml | 4 +- ...00000.03.236.004224.1990.12.01.00.00.b.cml | 4 +- ...00000.03.236.008320.1990.12.01.00.00.b.cml | 4 +- ...00000.16.202.000128.1860.09.01.00.00.b.cml | 4 +- ...000.00.000.000000.1860.01.01.00.00.f.b.cml | 4 +- ...00000.44.101.131200.1920.09.01.00.00.b.cml | 2 +- .../pp_to_cf_conversion/from_pp/12187.b.cml | 4 +- .../from_pp/HadCM2_ts_SAT_ann_18602100.b.cml | 4 +- .../from_pp/aaxzc_level_lat_orig.b.cml | 2 +- .../from_pp/aaxzc_lon_lat_press_orig.b.cml | 4 +- .../from_pp/aaxzc_lon_lat_several.b.cml | 4 +- .../from_pp/aaxzc_n10r13xy.b.cml | 4 +- .../from_pp/abcza_pa19591997_daily_29.b.cml | 12 +- .../from_pp/abxpa_press_lat.b.cml | 2 +- .../pp_to_cf_conversion/from_pp/integer.b.cml | 4 +- .../pp_to_cf_conversion/from_pp/model.b.cml | 4 +- .../from_pp/ocean_xsect.b.cml | 2 +- .../from_pp/st0fc699.b.cml | 4 +- .../from_pp/st0fc942.b.cml | 2 +- .../pp_to_cf_conversion/from_pp/st30211.b.cml | 4 +- .../to_netcdf/st0fc942.b_0.cdl | 4 +- etc/iris_tests_results/xml/handmade.cml | 64 ++-- etc/iris_tests_results/xml/pp.cml | 4 +- 303 files changed, 1099 insertions(+), 1116 deletions(-) delete mode 100644 etc/iris_tests_results/coord_systems/RotatedGeogCS_from_geocs.xml create mode 100644 etc/iris_tests_results/coord_systems/RotatedGeogCS_init_a.xml create mode 100644 etc/iris_tests_results/coord_systems/RotatedGeogCS_init_b.xml diff --git a/etc/iris_tests_results/COLPEX/uwind_and_orog.cml b/etc/iris_tests_results/COLPEX/uwind_and_orog.cml index 1fb8fcbb8e..ac686b6737 100644 --- a/etc/iris_tests_results/COLPEX/uwind_and_orog.cml +++ b/etc/iris_tests_results/COLPEX/uwind_and_orog.cml @@ -407,7 +407,7 @@ [0.35145, 0.36495], [0.36495, 0.37845]]" id="25a5f42bc937b908" points="[-0.5274, -0.5139, -0.5004, ..., 0.3447, 0.3582, 0.3717]" shape="(412,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + @@ -419,7 +419,7 @@ [360.066, 360.079], [360.079, 360.093]]" id="3bf28623a9db078e" points="[359.187, 359.2, 359.214, ..., 360.059, 360.072, 360.086]" shape="(412,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + @@ -525,7 +525,7 @@ [0.35145, 0.36495], [0.36495, 0.37845]]" id="25a5f42bc937b908" points="[-0.5274, -0.5139, -0.5004, ..., 0.3447, 0.3582, 0.3717]" shape="(412,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + @@ -537,7 +537,7 @@ [360.059, 360.072], [360.072, 360.086]]" id="3bf28623a9db078e" points="[359.18, 359.194, 359.207, ..., 360.052, 360.066, 360.079]" shape="(412,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/FF/qtgl.ssps_006_air_temperature_0.cml b/etc/iris_tests_results/FF/qtgl.ssps_006_air_temperature_0.cml index 8eaf7f499b..719631399d 100644 --- a/etc/iris_tests_results/FF/qtgl.ssps_006_air_temperature_0.cml +++ b/etc/iris_tests_results/FF/qtgl.ssps_006_air_temperature_0.cml @@ -19,13 +19,13 @@ - + - + diff --git a/etc/iris_tests_results/FF/qtgl.ssps_006_air_temperature_1.cml b/etc/iris_tests_results/FF/qtgl.ssps_006_air_temperature_1.cml index 23e7a3fccc..c0a6c4d456 100644 --- a/etc/iris_tests_results/FF/qtgl.ssps_006_air_temperature_1.cml +++ b/etc/iris_tests_results/FF/qtgl.ssps_006_air_temperature_1.cml @@ -22,13 +22,13 @@ - + - + diff --git a/etc/iris_tests_results/FF/qtgl.ssps_006_air_temperature_2.cml b/etc/iris_tests_results/FF/qtgl.ssps_006_air_temperature_2.cml index e4664ce8e3..8ba936a455 100644 --- a/etc/iris_tests_results/FF/qtgl.ssps_006_air_temperature_2.cml +++ b/etc/iris_tests_results/FF/qtgl.ssps_006_air_temperature_2.cml @@ -22,13 +22,13 @@ - + - + diff --git a/etc/iris_tests_results/FF/qtgl.ssps_006_air_temperature_3.cml b/etc/iris_tests_results/FF/qtgl.ssps_006_air_temperature_3.cml index 9e7cfc62fe..8fdbeb19c4 100644 --- a/etc/iris_tests_results/FF/qtgl.ssps_006_air_temperature_3.cml +++ b/etc/iris_tests_results/FF/qtgl.ssps_006_air_temperature_3.cml @@ -402,7 +402,7 @@ - + @@ -436,7 +436,7 @@ - + diff --git a/etc/iris_tests_results/FF/qtgl.ssps_006_air_temperature_4.cml b/etc/iris_tests_results/FF/qtgl.ssps_006_air_temperature_4.cml index 0e4c02ad9b..8f951e58bb 100644 --- a/etc/iris_tests_results/FF/qtgl.ssps_006_air_temperature_4.cml +++ b/etc/iris_tests_results/FF/qtgl.ssps_006_air_temperature_4.cml @@ -12,13 +12,13 @@ - + - + diff --git a/etc/iris_tests_results/FF/qtgl.ssps_006_soil_temperature_0.cml b/etc/iris_tests_results/FF/qtgl.ssps_006_soil_temperature_0.cml index 6d539c5f79..9924f92606 100644 --- a/etc/iris_tests_results/FF/qtgl.ssps_006_soil_temperature_0.cml +++ b/etc/iris_tests_results/FF/qtgl.ssps_006_soil_temperature_0.cml @@ -12,13 +12,13 @@ - + - + diff --git a/etc/iris_tests_results/FF/qtgl.ssps_006_soil_temperature_1.cml b/etc/iris_tests_results/FF/qtgl.ssps_006_soil_temperature_1.cml index dbfdfa108f..cd17a164a2 100644 --- a/etc/iris_tests_results/FF/qtgl.ssps_006_soil_temperature_1.cml +++ b/etc/iris_tests_results/FF/qtgl.ssps_006_soil_temperature_1.cml @@ -12,13 +12,13 @@ - + - + diff --git a/etc/iris_tests_results/FF/qtgl.ssps_006_soil_temperature_2.cml b/etc/iris_tests_results/FF/qtgl.ssps_006_soil_temperature_2.cml index 962edd3d3b..c2ce78c070 100644 --- a/etc/iris_tests_results/FF/qtgl.ssps_006_soil_temperature_2.cml +++ b/etc/iris_tests_results/FF/qtgl.ssps_006_soil_temperature_2.cml @@ -12,13 +12,13 @@ - + - + diff --git a/etc/iris_tests_results/FF/qtgl.ssps_006_soil_temperature_3.cml b/etc/iris_tests_results/FF/qtgl.ssps_006_soil_temperature_3.cml index 541eb207e8..32c5b9c870 100644 --- a/etc/iris_tests_results/FF/qtgl.ssps_006_soil_temperature_3.cml +++ b/etc/iris_tests_results/FF/qtgl.ssps_006_soil_temperature_3.cml @@ -12,13 +12,13 @@ - + - + diff --git a/etc/iris_tests_results/analysis/abs.cml b/etc/iris_tests_results/analysis/abs.cml index 5114cd5e51..1c82aa9f72 100644 --- a/etc/iris_tests_results/analysis/abs.cml +++ b/etc/iris_tests_results/analysis/abs.cml @@ -20,12 +20,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/addition.cml b/etc/iris_tests_results/analysis/addition.cml index 51acb9c6ae..ea4bbbb372 100644 --- a/etc/iris_tests_results/analysis/addition.cml +++ b/etc/iris_tests_results/analysis/addition.cml @@ -20,12 +20,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/addition_coord_x.cml b/etc/iris_tests_results/analysis/addition_coord_x.cml index 12f6e4dd2e..869bcfb002 100644 --- a/etc/iris_tests_results/analysis/addition_coord_x.cml +++ b/etc/iris_tests_results/analysis/addition_coord_x.cml @@ -20,12 +20,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/addition_coord_y.cml b/etc/iris_tests_results/analysis/addition_coord_y.cml index 12d6a0899b..0b1dfc1de5 100644 --- a/etc/iris_tests_results/analysis/addition_coord_y.cml +++ b/etc/iris_tests_results/analysis/addition_coord_y.cml @@ -20,12 +20,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/addition_different_std_name.cml b/etc/iris_tests_results/analysis/addition_different_std_name.cml index 3bca58b42e..eda7787a45 100644 --- a/etc/iris_tests_results/analysis/addition_different_std_name.cml +++ b/etc/iris_tests_results/analysis/addition_different_std_name.cml @@ -20,12 +20,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/addition_in_place.cml b/etc/iris_tests_results/analysis/addition_in_place.cml index 51acb9c6ae..ea4bbbb372 100644 --- a/etc/iris_tests_results/analysis/addition_in_place.cml +++ b/etc/iris_tests_results/analysis/addition_in_place.cml @@ -20,12 +20,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/addition_in_place_coord.cml b/etc/iris_tests_results/analysis/addition_in_place_coord.cml index b3333131ed..7e78d16735 100644 --- a/etc/iris_tests_results/analysis/addition_in_place_coord.cml +++ b/etc/iris_tests_results/analysis/addition_in_place_coord.cml @@ -20,12 +20,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/addition_scalar.cml b/etc/iris_tests_results/analysis/addition_scalar.cml index 212b0435d4..c7611779e9 100644 --- a/etc/iris_tests_results/analysis/addition_scalar.cml +++ b/etc/iris_tests_results/analysis/addition_scalar.cml @@ -20,12 +20,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/aggregated_by/easy.cml b/etc/iris_tests_results/analysis/aggregated_by/easy.cml index 850eb9f89e..12fa71c349 100644 --- a/etc/iris_tests_results/analysis/aggregated_by/easy.cml +++ b/etc/iris_tests_results/analysis/aggregated_by/easy.cml @@ -7,12 +7,12 @@ - + - + diff --git a/etc/iris_tests_results/analysis/aggregated_by/multi.cml b/etc/iris_tests_results/analysis/aggregated_by/multi.cml index 2e24cd5f40..8761085b60 100644 --- a/etc/iris_tests_results/analysis/aggregated_by/multi.cml +++ b/etc/iris_tests_results/analysis/aggregated_by/multi.cml @@ -10,7 +10,7 @@ - + @@ -18,7 +18,7 @@ - + diff --git a/etc/iris_tests_results/analysis/aggregated_by/multi_shared.cml b/etc/iris_tests_results/analysis/aggregated_by/multi_shared.cml index 80b0dfe2e7..6b2c0323f0 100644 --- a/etc/iris_tests_results/analysis/aggregated_by/multi_shared.cml +++ b/etc/iris_tests_results/analysis/aggregated_by/multi_shared.cml @@ -21,7 +21,7 @@ - + @@ -29,7 +29,7 @@ - + diff --git a/etc/iris_tests_results/analysis/aggregated_by/single.cml b/etc/iris_tests_results/analysis/aggregated_by/single.cml index 95158e98f1..d4130e86ee 100644 --- a/etc/iris_tests_results/analysis/aggregated_by/single.cml +++ b/etc/iris_tests_results/analysis/aggregated_by/single.cml @@ -10,12 +10,12 @@ - + - + diff --git a/etc/iris_tests_results/analysis/aggregated_by/single_shared.cml b/etc/iris_tests_results/analysis/aggregated_by/single_shared.cml index 981f0b649e..489df69c6a 100644 --- a/etc/iris_tests_results/analysis/aggregated_by/single_shared.cml +++ b/etc/iris_tests_results/analysis/aggregated_by/single_shared.cml @@ -10,12 +10,12 @@ - + - + diff --git a/etc/iris_tests_results/analysis/areaweights_original.cml b/etc/iris_tests_results/analysis/areaweights_original.cml index 2641a9e1d6..d740082153 100644 --- a/etc/iris_tests_results/analysis/areaweights_original.cml +++ b/etc/iris_tests_results/analysis/areaweights_original.cml @@ -22,12 +22,12 @@ -62.4999, -64.9999, -67.4999, -69.9999, -72.4999, -74.9999, -77.4999, -79.9999, -82.4999, -84.9999, -87.4999, -89.9999]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/calculus/curl_contrived_cartesian2.cml b/etc/iris_tests_results/analysis/calculus/curl_contrived_cartesian2.cml index cf3d480aa4..8bbb1df77e 100644 --- a/etc/iris_tests_results/analysis/calculus/curl_contrived_cartesian2.cml +++ b/etc/iris_tests_results/analysis/calculus/curl_contrived_cartesian2.cml @@ -14,17 +14,13 @@ 69.405, 71.615, 73.825, 76.035, 78.245, 80.455, 82.665, 84.875, 87.085, 89.295, 91.505, 93.715, 95.925, 98.135, 100.345, 102.555, 104.765, - 106.975, 109.185]" shape="(49,)" units="Unit('meters')" value_type="float32"> - - + 106.975, 109.185]" shape="(49,)" units="Unit('meters')" value_type="float32"/> - - + 475.0, 500.0, 525.0, 550.0]" shape="(25,)" units="Unit('meters')" value_type="float32"/> - - + 106.975, 109.185]" shape="(49,)" units="Unit('meters')" value_type="float32"/> - - + 475.0, 500.0, 525.0, 550.0]" shape="(25,)" units="Unit('meters')" value_type="float32"/> - - + 106.975, 109.185]" shape="(49,)" units="Unit('meters')" value_type="float32"/> - - + 475.0, 500.0, 525.0, 550.0]" shape="(25,)" units="Unit('meters')" value_type="float32"/> - + - + diff --git a/etc/iris_tests_results/analysis/calculus/delta_handmade_wrt_lon.cml b/etc/iris_tests_results/analysis/calculus/delta_handmade_wrt_lon.cml index a98776972e..b7565e998d 100644 --- a/etc/iris_tests_results/analysis/calculus/delta_handmade_wrt_lon.cml +++ b/etc/iris_tests_results/analysis/calculus/delta_handmade_wrt_lon.cml @@ -7,12 +7,12 @@ - + - + diff --git a/etc/iris_tests_results/analysis/calculus/delta_handmade_wrt_x.cml b/etc/iris_tests_results/analysis/calculus/delta_handmade_wrt_x.cml index 14e6faa3bf..936c94473b 100644 --- a/etc/iris_tests_results/analysis/calculus/delta_handmade_wrt_x.cml +++ b/etc/iris_tests_results/analysis/calculus/delta_handmade_wrt_x.cml @@ -7,12 +7,12 @@ - + - + diff --git a/etc/iris_tests_results/analysis/calculus/delta_handmade_wrt_y.cml b/etc/iris_tests_results/analysis/calculus/delta_handmade_wrt_y.cml index 48b19325af..f48d8507ee 100644 --- a/etc/iris_tests_results/analysis/calculus/delta_handmade_wrt_y.cml +++ b/etc/iris_tests_results/analysis/calculus/delta_handmade_wrt_y.cml @@ -7,12 +7,12 @@ - + - + diff --git a/etc/iris_tests_results/analysis/calculus/grad_contrived1.cml b/etc/iris_tests_results/analysis/calculus/grad_contrived1.cml index e4ff910171..1d40c80b45 100644 --- a/etc/iris_tests_results/analysis/calculus/grad_contrived1.cml +++ b/etc/iris_tests_results/analysis/calculus/grad_contrived1.cml @@ -1,6 +1,6 @@ - + @@ -11,7 +11,7 @@ w cmpt of the curl of u_wind and v_wind"/> -45.0, -39.0, -33.0, -27.0, -21.0, -15.0, -9.0, -3.0, 3.0, 9.0, 15.0, 21.0, 27.0, 33.0, 39.0, 45.0, 51.0, 57.0, 63.0, 69.0, 75.0, 81.0]" shape="(29,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + @@ -24,7 +24,7 @@ w cmpt of the curl of u_wind and v_wind"/> 60.0, 66.0, 72.0, 78.0, 84.0, 90.0, 96.0, 102.0, 108.0, 114.0, 120.0, 126.0, 132.0, 138.0, 144.0, 150.0, 156.0, 162.0, 168.0, 174.0]" shape="(60,)" standard_name="longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/analysis/calculus/grad_contrived2.cml b/etc/iris_tests_results/analysis/calculus/grad_contrived2.cml index fe14114f1b..438984969c 100644 --- a/etc/iris_tests_results/analysis/calculus/grad_contrived2.cml +++ b/etc/iris_tests_results/analysis/calculus/grad_contrived2.cml @@ -1,6 +1,6 @@ - + @@ -22,13 +22,13 @@ w cmpt of the curl of u_wind and v_wind"/> 55.2856, 57.857, 60.4284, 62.9999, 65.5713, 68.1427, 70.7141, 73.2856, 75.857, 78.4284, 80.9999, 83.5713, 86.1427]" shape="(69,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/calculus/grad_contrived_non_spherical1.cml b/etc/iris_tests_results/analysis/calculus/grad_contrived_non_spherical1.cml index 9fb1f6ff81..3a15bfce76 100644 --- a/etc/iris_tests_results/analysis/calculus/grad_contrived_non_spherical1.cml +++ b/etc/iris_tests_results/analysis/calculus/grad_contrived_non_spherical1.cml @@ -14,17 +14,13 @@ 69.405, 71.615, 73.825, 76.035, 78.245, 80.455, 82.665, 84.875, 87.085, 89.295, 91.505, 93.715, 95.925, 98.135, 100.345, 102.555, 104.765, - 106.975, 109.185]" shape="(49,)" units="Unit('meters')" value_type="float32"> - - + 106.975, 109.185]" shape="(49,)" units="Unit('meters')" value_type="float32"/> - - + 475.0, 500.0, 525.0, 550.0]" shape="(25,)" units="Unit('meters')" value_type="float32"/> diff --git a/etc/iris_tests_results/analysis/calculus/handmade2_wrt_lat.cml b/etc/iris_tests_results/analysis/calculus/handmade2_wrt_lat.cml index 936d697957..6b162f725d 100644 --- a/etc/iris_tests_results/analysis/calculus/handmade2_wrt_lat.cml +++ b/etc/iris_tests_results/analysis/calculus/handmade2_wrt_lat.cml @@ -14,7 +14,7 @@ 56.25, 60.75, 65.25, 69.75, 74.25, 78.75, 83.25, 87.75, 92.25, 96.75, 101.25, 105.75, 110.25, 114.75, 119.25, 123.75, 128.25]" shape="(49,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + @@ -26,7 +26,7 @@ -36.0, -31.5, -27.0, -22.5, -18.0, -13.5, -9.0, -4.5, 0.0, 4.5, 9.0, 13.5, 18.0, 22.5, 27.0, 31.5, 36.0, 40.5]" shape="(50,)" standard_name="longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/analysis/calculus/handmade2_wrt_lon.cml b/etc/iris_tests_results/analysis/calculus/handmade2_wrt_lon.cml index d68a53d5e5..6c46e888cc 100644 --- a/etc/iris_tests_results/analysis/calculus/handmade2_wrt_lon.cml +++ b/etc/iris_tests_results/analysis/calculus/handmade2_wrt_lon.cml @@ -13,7 +13,7 @@ 40.5, 45.0, 49.5, 54.0, 58.5, 63.0, 67.5, 72.0, 76.5, 81.0, 85.5, 90.0, 94.5, 99.0, 103.5, 108.0, 112.5, 117.0, 121.5, 126.0, 130.5]" shape="(50,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + @@ -26,7 +26,7 @@ -33.75, -29.25, -24.75, -20.25, -15.75, -11.25, -6.75, -2.25, 2.25, 6.75, 11.25, 15.75, 20.25, 24.75, 29.25, 33.75, 38.25]" shape="(49,)" standard_name="longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/analysis/calculus/handmade_wrt_lat.cml b/etc/iris_tests_results/analysis/calculus/handmade_wrt_lat.cml index 242e524faf..5240f17929 100644 --- a/etc/iris_tests_results/analysis/calculus/handmade_wrt_lat.cml +++ b/etc/iris_tests_results/analysis/calculus/handmade_wrt_lat.cml @@ -7,12 +7,12 @@ - + - + diff --git a/etc/iris_tests_results/analysis/calculus/handmade_wrt_lon.cml b/etc/iris_tests_results/analysis/calculus/handmade_wrt_lon.cml index ddab29700d..6b51bcf62f 100644 --- a/etc/iris_tests_results/analysis/calculus/handmade_wrt_lon.cml +++ b/etc/iris_tests_results/analysis/calculus/handmade_wrt_lon.cml @@ -7,12 +7,12 @@ - + - + diff --git a/etc/iris_tests_results/analysis/calculus/handmade_wrt_x.cml b/etc/iris_tests_results/analysis/calculus/handmade_wrt_x.cml index 21e081815f..1500bf0eb7 100644 --- a/etc/iris_tests_results/analysis/calculus/handmade_wrt_x.cml +++ b/etc/iris_tests_results/analysis/calculus/handmade_wrt_x.cml @@ -7,12 +7,12 @@ - + - + diff --git a/etc/iris_tests_results/analysis/calculus/handmade_wrt_y.cml b/etc/iris_tests_results/analysis/calculus/handmade_wrt_y.cml index 92f11afa21..4ad7234837 100644 --- a/etc/iris_tests_results/analysis/calculus/handmade_wrt_y.cml +++ b/etc/iris_tests_results/analysis/calculus/handmade_wrt_y.cml @@ -7,12 +7,12 @@ - + - + diff --git a/etc/iris_tests_results/analysis/division.cml b/etc/iris_tests_results/analysis/division.cml index 6e145899e9..74e73a06d9 100644 --- a/etc/iris_tests_results/analysis/division.cml +++ b/etc/iris_tests_results/analysis/division.cml @@ -20,12 +20,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/division_by_array.cml b/etc/iris_tests_results/analysis/division_by_array.cml index e5e6830382..c13639d5ab 100644 --- a/etc/iris_tests_results/analysis/division_by_array.cml +++ b/etc/iris_tests_results/analysis/division_by_array.cml @@ -20,12 +20,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/division_by_latitude.cml b/etc/iris_tests_results/analysis/division_by_latitude.cml index 43ac7123d8..86da8c498e 100644 --- a/etc/iris_tests_results/analysis/division_by_latitude.cml +++ b/etc/iris_tests_results/analysis/division_by_latitude.cml @@ -20,12 +20,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/division_by_longitude.cml b/etc/iris_tests_results/analysis/division_by_longitude.cml index bceef5320d..5a47116745 100644 --- a/etc/iris_tests_results/analysis/division_by_longitude.cml +++ b/etc/iris_tests_results/analysis/division_by_longitude.cml @@ -20,12 +20,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/division_by_singular_coord.cml b/etc/iris_tests_results/analysis/division_by_singular_coord.cml index 8a27b76fb6..4709572ec8 100644 --- a/etc/iris_tests_results/analysis/division_by_singular_coord.cml +++ b/etc/iris_tests_results/analysis/division_by_singular_coord.cml @@ -20,12 +20,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/division_scalar.cml b/etc/iris_tests_results/analysis/division_scalar.cml index 604026b9ee..d4e7dbdcb4 100644 --- a/etc/iris_tests_results/analysis/division_scalar.cml +++ b/etc/iris_tests_results/analysis/division_scalar.cml @@ -20,12 +20,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/exponentiate.cml b/etc/iris_tests_results/analysis/exponentiate.cml index d30bebbbaf..5a20ec1af6 100644 --- a/etc/iris_tests_results/analysis/exponentiate.cml +++ b/etc/iris_tests_results/analysis/exponentiate.cml @@ -20,12 +20,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/gmean_latitude.cml b/etc/iris_tests_results/analysis/gmean_latitude.cml index 83410aa301..f4842591a0 100644 --- a/etc/iris_tests_results/analysis/gmean_latitude.cml +++ b/etc/iris_tests_results/analysis/gmean_latitude.cml @@ -14,13 +14,13 @@ - + - + diff --git a/etc/iris_tests_results/analysis/gmean_latitude_longitude.cml b/etc/iris_tests_results/analysis/gmean_latitude_longitude.cml index b120e7c262..8e850e8461 100644 --- a/etc/iris_tests_results/analysis/gmean_latitude_longitude.cml +++ b/etc/iris_tests_results/analysis/gmean_latitude_longitude.cml @@ -15,12 +15,12 @@ Geometric mean of air_pressure_at_sea_level over grid_longitude"/> - + - + diff --git a/etc/iris_tests_results/analysis/gmean_latitude_longitude_1call.cml b/etc/iris_tests_results/analysis/gmean_latitude_longitude_1call.cml index 12384d114c..de2e19de3f 100644 --- a/etc/iris_tests_results/analysis/gmean_latitude_longitude_1call.cml +++ b/etc/iris_tests_results/analysis/gmean_latitude_longitude_1call.cml @@ -14,12 +14,12 @@ - + - + diff --git a/etc/iris_tests_results/analysis/hmean_latitude.cml b/etc/iris_tests_results/analysis/hmean_latitude.cml index f12c998f91..2dd180b939 100644 --- a/etc/iris_tests_results/analysis/hmean_latitude.cml +++ b/etc/iris_tests_results/analysis/hmean_latitude.cml @@ -14,13 +14,13 @@ - + - + diff --git a/etc/iris_tests_results/analysis/hmean_latitude_longitude.cml b/etc/iris_tests_results/analysis/hmean_latitude_longitude.cml index 2cbc7f03df..5cc4951107 100644 --- a/etc/iris_tests_results/analysis/hmean_latitude_longitude.cml +++ b/etc/iris_tests_results/analysis/hmean_latitude_longitude.cml @@ -15,12 +15,12 @@ Harmonic mean of air_pressure_at_sea_level over grid_longitude"/> - + - + diff --git a/etc/iris_tests_results/analysis/hmean_latitude_longitude_1call.cml b/etc/iris_tests_results/analysis/hmean_latitude_longitude_1call.cml index 2a039cf6bd..e8576c3d72 100644 --- a/etc/iris_tests_results/analysis/hmean_latitude_longitude_1call.cml +++ b/etc/iris_tests_results/analysis/hmean_latitude_longitude_1call.cml @@ -14,12 +14,12 @@ - + - + diff --git a/etc/iris_tests_results/analysis/interpolation/linear/real_2dslice.cml b/etc/iris_tests_results/analysis/interpolation/linear/real_2dslice.cml index 67e36697f7..64a7918e7d 100644 --- a/etc/iris_tests_results/analysis/interpolation/linear/real_2dslice.cml +++ b/etc/iris_tests_results/analysis/interpolation/linear/real_2dslice.cml @@ -14,7 +14,7 @@ - + @@ -69,7 +69,7 @@ - + diff --git a/etc/iris_tests_results/analysis/interpolation/linear/real_2slices.cml b/etc/iris_tests_results/analysis/interpolation/linear/real_2slices.cml index bcb2602a46..5b82ee2ae5 100644 --- a/etc/iris_tests_results/analysis/interpolation/linear/real_2slices.cml +++ b/etc/iris_tests_results/analysis/interpolation/linear/real_2slices.cml @@ -14,7 +14,7 @@ - + @@ -69,7 +69,7 @@ - + diff --git a/etc/iris_tests_results/analysis/interpolation/linear/real_circular_2dslice.cml b/etc/iris_tests_results/analysis/interpolation/linear/real_circular_2dslice.cml index 57a6238a18..919e45df59 100644 --- a/etc/iris_tests_results/analysis/interpolation/linear/real_circular_2dslice.cml +++ b/etc/iris_tests_results/analysis/interpolation/linear/real_circular_2dslice.cml @@ -14,7 +14,7 @@ - + @@ -69,7 +69,7 @@ - + diff --git a/etc/iris_tests_results/analysis/interpolation/nearest_neighbour_extract_bounded.cml b/etc/iris_tests_results/analysis/interpolation/nearest_neighbour_extract_bounded.cml index d92f5e0aa2..e01990fdc1 100644 --- a/etc/iris_tests_results/analysis/interpolation/nearest_neighbour_extract_bounded.cml +++ b/etc/iris_tests_results/analysis/interpolation/nearest_neighbour_extract_bounded.cml @@ -14,12 +14,12 @@ - + - + diff --git a/etc/iris_tests_results/analysis/interpolation/nearest_neighbour_extract_bounded_mid_point.cml b/etc/iris_tests_results/analysis/interpolation/nearest_neighbour_extract_bounded_mid_point.cml index d92f5e0aa2..e01990fdc1 100644 --- a/etc/iris_tests_results/analysis/interpolation/nearest_neighbour_extract_bounded_mid_point.cml +++ b/etc/iris_tests_results/analysis/interpolation/nearest_neighbour_extract_bounded_mid_point.cml @@ -14,12 +14,12 @@ - + - + diff --git a/etc/iris_tests_results/analysis/interpolation/nearest_neighbour_extract_latitude.cml b/etc/iris_tests_results/analysis/interpolation/nearest_neighbour_extract_latitude.cml index ec356088b3..eebf429bcc 100644 --- a/etc/iris_tests_results/analysis/interpolation/nearest_neighbour_extract_latitude.cml +++ b/etc/iris_tests_results/analysis/interpolation/nearest_neighbour_extract_latitude.cml @@ -14,12 +14,12 @@ - + - + diff --git a/etc/iris_tests_results/analysis/interpolation/nearest_neighbour_extract_latitude_longitude.cml b/etc/iris_tests_results/analysis/interpolation/nearest_neighbour_extract_latitude_longitude.cml index 8ae2542848..607ceac89c 100644 --- a/etc/iris_tests_results/analysis/interpolation/nearest_neighbour_extract_latitude_longitude.cml +++ b/etc/iris_tests_results/analysis/interpolation/nearest_neighbour_extract_latitude_longitude.cml @@ -14,12 +14,12 @@ - + - + diff --git a/etc/iris_tests_results/analysis/log.cml b/etc/iris_tests_results/analysis/log.cml index 127ac69868..5087241ee9 100644 --- a/etc/iris_tests_results/analysis/log.cml +++ b/etc/iris_tests_results/analysis/log.cml @@ -20,12 +20,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/log10.cml b/etc/iris_tests_results/analysis/log10.cml index 402d013709..0d326fb458 100644 --- a/etc/iris_tests_results/analysis/log10.cml +++ b/etc/iris_tests_results/analysis/log10.cml @@ -20,12 +20,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/log2.cml b/etc/iris_tests_results/analysis/log2.cml index 3bc158f255..239763986e 100644 --- a/etc/iris_tests_results/analysis/log2.cml +++ b/etc/iris_tests_results/analysis/log2.cml @@ -20,12 +20,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/maths_original.cml b/etc/iris_tests_results/analysis/maths_original.cml index 444a0cc459..2680de4f1f 100644 --- a/etc/iris_tests_results/analysis/maths_original.cml +++ b/etc/iris_tests_results/analysis/maths_original.cml @@ -21,12 +21,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/max_latitude.cml b/etc/iris_tests_results/analysis/max_latitude.cml index c5bf6d9496..523e17f1b1 100644 --- a/etc/iris_tests_results/analysis/max_latitude.cml +++ b/etc/iris_tests_results/analysis/max_latitude.cml @@ -14,13 +14,13 @@ - + - + diff --git a/etc/iris_tests_results/analysis/max_latitude_longitude.cml b/etc/iris_tests_results/analysis/max_latitude_longitude.cml index 3a1a52ada3..e77fc5e57a 100644 --- a/etc/iris_tests_results/analysis/max_latitude_longitude.cml +++ b/etc/iris_tests_results/analysis/max_latitude_longitude.cml @@ -15,12 +15,12 @@ Maximum of air_pressure_at_sea_level over grid_longitude"/> - + - + diff --git a/etc/iris_tests_results/analysis/max_latitude_longitude_1call.cml b/etc/iris_tests_results/analysis/max_latitude_longitude_1call.cml index ef73389515..bc5e374fc7 100644 --- a/etc/iris_tests_results/analysis/max_latitude_longitude_1call.cml +++ b/etc/iris_tests_results/analysis/max_latitude_longitude_1call.cml @@ -14,12 +14,12 @@ - + - + diff --git a/etc/iris_tests_results/analysis/mean_latitude.cml b/etc/iris_tests_results/analysis/mean_latitude.cml index 211abf52b7..81a1442fbf 100644 --- a/etc/iris_tests_results/analysis/mean_latitude.cml +++ b/etc/iris_tests_results/analysis/mean_latitude.cml @@ -14,13 +14,13 @@ - + - + diff --git a/etc/iris_tests_results/analysis/mean_latitude_longitude.cml b/etc/iris_tests_results/analysis/mean_latitude_longitude.cml index 1b6dd298cb..724c4a4feb 100644 --- a/etc/iris_tests_results/analysis/mean_latitude_longitude.cml +++ b/etc/iris_tests_results/analysis/mean_latitude_longitude.cml @@ -15,12 +15,12 @@ Mean of air_pressure_at_sea_level over grid_longitude"/> - + - + diff --git a/etc/iris_tests_results/analysis/mean_latitude_longitude_1call.cml b/etc/iris_tests_results/analysis/mean_latitude_longitude_1call.cml index 70e5592739..6ecc24beb9 100644 --- a/etc/iris_tests_results/analysis/mean_latitude_longitude_1call.cml +++ b/etc/iris_tests_results/analysis/mean_latitude_longitude_1call.cml @@ -14,12 +14,12 @@ - + - + diff --git a/etc/iris_tests_results/analysis/median_latitude.cml b/etc/iris_tests_results/analysis/median_latitude.cml index fb1c5a348b..ce8ce0c724 100644 --- a/etc/iris_tests_results/analysis/median_latitude.cml +++ b/etc/iris_tests_results/analysis/median_latitude.cml @@ -14,13 +14,13 @@ - + - + diff --git a/etc/iris_tests_results/analysis/median_latitude_longitude.cml b/etc/iris_tests_results/analysis/median_latitude_longitude.cml index 5c9fdea26c..86d43f4ab3 100644 --- a/etc/iris_tests_results/analysis/median_latitude_longitude.cml +++ b/etc/iris_tests_results/analysis/median_latitude_longitude.cml @@ -15,12 +15,12 @@ Median of air_pressure_at_sea_level over grid_longitude"/> - + - + diff --git a/etc/iris_tests_results/analysis/median_latitude_longitude_1call.cml b/etc/iris_tests_results/analysis/median_latitude_longitude_1call.cml index 105884859e..eb783229b2 100644 --- a/etc/iris_tests_results/analysis/median_latitude_longitude_1call.cml +++ b/etc/iris_tests_results/analysis/median_latitude_longitude_1call.cml @@ -14,12 +14,12 @@ - + - + diff --git a/etc/iris_tests_results/analysis/min_latitude.cml b/etc/iris_tests_results/analysis/min_latitude.cml index 89b4a138f1..b8003a2581 100644 --- a/etc/iris_tests_results/analysis/min_latitude.cml +++ b/etc/iris_tests_results/analysis/min_latitude.cml @@ -14,13 +14,13 @@ - + - + diff --git a/etc/iris_tests_results/analysis/min_latitude_longitude.cml b/etc/iris_tests_results/analysis/min_latitude_longitude.cml index 610d1ad45d..15bea2bedf 100644 --- a/etc/iris_tests_results/analysis/min_latitude_longitude.cml +++ b/etc/iris_tests_results/analysis/min_latitude_longitude.cml @@ -15,12 +15,12 @@ Minimum of air_pressure_at_sea_level over grid_longitude"/> - + - + diff --git a/etc/iris_tests_results/analysis/min_latitude_longitude_1call.cml b/etc/iris_tests_results/analysis/min_latitude_longitude_1call.cml index 9e0243a92a..17f359689e 100644 --- a/etc/iris_tests_results/analysis/min_latitude_longitude_1call.cml +++ b/etc/iris_tests_results/analysis/min_latitude_longitude_1call.cml @@ -14,12 +14,12 @@ - + - + diff --git a/etc/iris_tests_results/analysis/multiply.cml b/etc/iris_tests_results/analysis/multiply.cml index 34803ac74d..307a3f0e4d 100644 --- a/etc/iris_tests_results/analysis/multiply.cml +++ b/etc/iris_tests_results/analysis/multiply.cml @@ -20,12 +20,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/multiply_different_std_name.cml b/etc/iris_tests_results/analysis/multiply_different_std_name.cml index 2efb811464..bc4b1a41df 100644 --- a/etc/iris_tests_results/analysis/multiply_different_std_name.cml +++ b/etc/iris_tests_results/analysis/multiply_different_std_name.cml @@ -20,12 +20,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/original.cml b/etc/iris_tests_results/analysis/original.cml index a9dd374648..07ac3d1579 100644 --- a/etc/iris_tests_results/analysis/original.cml +++ b/etc/iris_tests_results/analysis/original.cml @@ -13,13 +13,13 @@ - + - + diff --git a/etc/iris_tests_results/analysis/original_common.cml b/etc/iris_tests_results/analysis/original_common.cml index a9290780de..459e8077c6 100644 --- a/etc/iris_tests_results/analysis/original_common.cml +++ b/etc/iris_tests_results/analysis/original_common.cml @@ -13,13 +13,13 @@ - + - + diff --git a/etc/iris_tests_results/analysis/original_hmean.cml b/etc/iris_tests_results/analysis/original_hmean.cml index da0b51220a..dfcd853ccd 100644 --- a/etc/iris_tests_results/analysis/original_hmean.cml +++ b/etc/iris_tests_results/analysis/original_hmean.cml @@ -13,13 +13,13 @@ - + - + diff --git a/etc/iris_tests_results/analysis/sqrt.cml b/etc/iris_tests_results/analysis/sqrt.cml index 1e5ff7562b..e76ab84a16 100644 --- a/etc/iris_tests_results/analysis/sqrt.cml +++ b/etc/iris_tests_results/analysis/sqrt.cml @@ -20,12 +20,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/std_dev_latitude.cml b/etc/iris_tests_results/analysis/std_dev_latitude.cml index 8ee426f636..7018fd6ab8 100644 --- a/etc/iris_tests_results/analysis/std_dev_latitude.cml +++ b/etc/iris_tests_results/analysis/std_dev_latitude.cml @@ -14,13 +14,13 @@ - + - + diff --git a/etc/iris_tests_results/analysis/std_dev_latitude_longitude.cml b/etc/iris_tests_results/analysis/std_dev_latitude_longitude.cml index 50a60cb185..3e22943dd6 100644 --- a/etc/iris_tests_results/analysis/std_dev_latitude_longitude.cml +++ b/etc/iris_tests_results/analysis/std_dev_latitude_longitude.cml @@ -15,12 +15,12 @@ Standard deviation of air_pressure_at_sea_level over grid_longitude (delta degre - + - + diff --git a/etc/iris_tests_results/analysis/std_dev_latitude_longitude_1call.cml b/etc/iris_tests_results/analysis/std_dev_latitude_longitude_1call.cml index f24823ecef..aeb5ce88ca 100644 --- a/etc/iris_tests_results/analysis/std_dev_latitude_longitude_1call.cml +++ b/etc/iris_tests_results/analysis/std_dev_latitude_longitude_1call.cml @@ -14,12 +14,12 @@ - + - + diff --git a/etc/iris_tests_results/analysis/subtract.cml b/etc/iris_tests_results/analysis/subtract.cml index 0f6ebb397c..26a0dc057e 100644 --- a/etc/iris_tests_results/analysis/subtract.cml +++ b/etc/iris_tests_results/analysis/subtract.cml @@ -20,12 +20,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/subtract_array.cml b/etc/iris_tests_results/analysis/subtract_array.cml index 45de391d56..9fbb152516 100644 --- a/etc/iris_tests_results/analysis/subtract_array.cml +++ b/etc/iris_tests_results/analysis/subtract_array.cml @@ -20,12 +20,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/subtract_coord_x.cml b/etc/iris_tests_results/analysis/subtract_coord_x.cml index 69d08053dd..15c231f4b0 100644 --- a/etc/iris_tests_results/analysis/subtract_coord_x.cml +++ b/etc/iris_tests_results/analysis/subtract_coord_x.cml @@ -20,12 +20,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/subtract_coord_y.cml b/etc/iris_tests_results/analysis/subtract_coord_y.cml index 2ea90d8fce..f22ba22484 100644 --- a/etc/iris_tests_results/analysis/subtract_coord_y.cml +++ b/etc/iris_tests_results/analysis/subtract_coord_y.cml @@ -20,12 +20,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/subtract_scalar.cml b/etc/iris_tests_results/analysis/subtract_scalar.cml index 2eeeb3e773..c517c2dce6 100644 --- a/etc/iris_tests_results/analysis/subtract_scalar.cml +++ b/etc/iris_tests_results/analysis/subtract_scalar.cml @@ -20,12 +20,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/sum_latitude.cml b/etc/iris_tests_results/analysis/sum_latitude.cml index c8b6e31088..40aec13594 100644 --- a/etc/iris_tests_results/analysis/sum_latitude.cml +++ b/etc/iris_tests_results/analysis/sum_latitude.cml @@ -14,13 +14,13 @@ - + - + diff --git a/etc/iris_tests_results/analysis/sum_latitude_longitude.cml b/etc/iris_tests_results/analysis/sum_latitude_longitude.cml index 964d1590d2..786581479c 100644 --- a/etc/iris_tests_results/analysis/sum_latitude_longitude.cml +++ b/etc/iris_tests_results/analysis/sum_latitude_longitude.cml @@ -15,12 +15,12 @@ Sum of air_pressure_at_sea_level over grid_longitude"/> - + - + diff --git a/etc/iris_tests_results/analysis/sum_latitude_longitude_1call.cml b/etc/iris_tests_results/analysis/sum_latitude_longitude_1call.cml index 634e8c513d..ab44b173c4 100644 --- a/etc/iris_tests_results/analysis/sum_latitude_longitude_1call.cml +++ b/etc/iris_tests_results/analysis/sum_latitude_longitude_1call.cml @@ -14,12 +14,12 @@ - + - + diff --git a/etc/iris_tests_results/analysis/variance_latitude.cml b/etc/iris_tests_results/analysis/variance_latitude.cml index 6a08a4a900..239aaf16ad 100644 --- a/etc/iris_tests_results/analysis/variance_latitude.cml +++ b/etc/iris_tests_results/analysis/variance_latitude.cml @@ -14,13 +14,13 @@ - + - + diff --git a/etc/iris_tests_results/analysis/variance_latitude_longitude.cml b/etc/iris_tests_results/analysis/variance_latitude_longitude.cml index bf4f50af3e..02518b94d3 100644 --- a/etc/iris_tests_results/analysis/variance_latitude_longitude.cml +++ b/etc/iris_tests_results/analysis/variance_latitude_longitude.cml @@ -15,12 +15,12 @@ Variance of air_pressure_at_sea_level over grid_longitude (delta degrees of free - + - + diff --git a/etc/iris_tests_results/analysis/variance_latitude_longitude_1call.cml b/etc/iris_tests_results/analysis/variance_latitude_longitude_1call.cml index e924f5b39d..4e6b9858e9 100644 --- a/etc/iris_tests_results/analysis/variance_latitude_longitude_1call.cml +++ b/etc/iris_tests_results/analysis/variance_latitude_longitude_1call.cml @@ -14,12 +14,12 @@ - + - + diff --git a/etc/iris_tests_results/analysis/weighted_mean_lat.cml b/etc/iris_tests_results/analysis/weighted_mean_lat.cml index 8480b6c203..5741ade1fa 100644 --- a/etc/iris_tests_results/analysis/weighted_mean_lat.cml +++ b/etc/iris_tests_results/analysis/weighted_mean_lat.cml @@ -10,12 +10,12 @@ - + - + diff --git a/etc/iris_tests_results/analysis/weighted_mean_latlon.cml b/etc/iris_tests_results/analysis/weighted_mean_latlon.cml index d6da753a9e..42d2bc3e89 100644 --- a/etc/iris_tests_results/analysis/weighted_mean_latlon.cml +++ b/etc/iris_tests_results/analysis/weighted_mean_latlon.cml @@ -10,12 +10,12 @@ - + - + diff --git a/etc/iris_tests_results/analysis/weighted_mean_lon.cml b/etc/iris_tests_results/analysis/weighted_mean_lon.cml index f624d932a7..88a065793d 100644 --- a/etc/iris_tests_results/analysis/weighted_mean_lon.cml +++ b/etc/iris_tests_results/analysis/weighted_mean_lon.cml @@ -10,12 +10,12 @@ - + - + diff --git a/etc/iris_tests_results/analysis/weighted_mean_original.cml b/etc/iris_tests_results/analysis/weighted_mean_original.cml index 2641a9e1d6..d740082153 100644 --- a/etc/iris_tests_results/analysis/weighted_mean_original.cml +++ b/etc/iris_tests_results/analysis/weighted_mean_original.cml @@ -22,12 +22,12 @@ -62.4999, -64.9999, -67.4999, -69.9999, -72.4999, -74.9999, -77.4999, -79.9999, -82.4999, -84.9999, -87.4999, -89.9999]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/analysis/weighted_mean_source.cml b/etc/iris_tests_results/analysis/weighted_mean_source.cml index 41ee123a57..8163d6931e 100644 --- a/etc/iris_tests_results/analysis/weighted_mean_source.cml +++ b/etc/iris_tests_results/analysis/weighted_mean_source.cml @@ -7,12 +7,12 @@ - + - + diff --git a/etc/iris_tests_results/cdm/extract/lat_eq_10.cml b/etc/iris_tests_results/cdm/extract/lat_eq_10.cml index 71f78229ca..baed65298e 100644 --- a/etc/iris_tests_results/cdm/extract/lat_eq_10.cml +++ b/etc/iris_tests_results/cdm/extract/lat_eq_10.cml @@ -14,7 +14,7 @@ - + @@ -69,7 +69,7 @@ - + diff --git a/etc/iris_tests_results/cdm/extract/lat_gt_10.cml b/etc/iris_tests_results/cdm/extract/lat_gt_10.cml index d9974e7f7e..57ed82cba2 100644 --- a/etc/iris_tests_results/cdm/extract/lat_gt_10.cml +++ b/etc/iris_tests_results/cdm/extract/lat_gt_10.cml @@ -23,7 +23,7 @@ 72.5, 73.75, 75.0, 76.25, 77.5, 78.75, 80.0, 81.25, 82.5, 83.75, 85.0, 86.25, 87.5, 88.75, 90.0]" shape="(64,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + @@ -78,7 +78,7 @@ - + diff --git a/etc/iris_tests_results/cdm/extract/lat_gt_10_and_lon_ge_10.cml b/etc/iris_tests_results/cdm/extract/lat_gt_10_and_lon_ge_10.cml index f6b688fd7f..68e19ad380 100644 --- a/etc/iris_tests_results/cdm/extract/lat_gt_10_and_lon_ge_10.cml +++ b/etc/iris_tests_results/cdm/extract/lat_gt_10_and_lon_ge_10.cml @@ -23,7 +23,7 @@ 72.5, 73.75, 75.0, 76.25, 77.5, 78.75, 80.0, 81.25, 82.5, 83.75, 85.0, 86.25, 87.5, 88.75, 90.0]" shape="(64,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + @@ -79,7 +79,7 @@ - + diff --git a/etc/iris_tests_results/cdm/masked_cube.cml b/etc/iris_tests_results/cdm/masked_cube.cml index f1049a3e6e..ae6b6f520b 100644 --- a/etc/iris_tests_results/cdm/masked_cube.cml +++ b/etc/iris_tests_results/cdm/masked_cube.cml @@ -13,14 +13,14 @@ - + - + diff --git a/etc/iris_tests_results/cdm/test_simple_cube_intersection.cml b/etc/iris_tests_results/cdm/test_simple_cube_intersection.cml index f474e91b6d..a65188f2fe 100644 --- a/etc/iris_tests_results/cdm/test_simple_cube_intersection.cml +++ b/etc/iris_tests_results/cdm/test_simple_cube_intersection.cml @@ -4,12 +4,12 @@ - + - + @@ -23,12 +23,12 @@ - + - + diff --git a/etc/iris_tests_results/constrained_load/all_10_load_match.cml b/etc/iris_tests_results/constrained_load/all_10_load_match.cml index 06c6ea27c6..aa04d47e66 100644 --- a/etc/iris_tests_results/constrained_load/all_10_load_match.cml +++ b/etc/iris_tests_results/constrained_load/all_10_load_match.cml @@ -14,7 +14,7 @@ - + @@ -26,7 +26,7 @@ - + @@ -64,7 +64,7 @@ - + @@ -77,7 +77,7 @@ - + @@ -116,7 +116,7 @@ - + @@ -128,7 +128,7 @@ - + @@ -166,7 +166,7 @@ - + @@ -178,7 +178,7 @@ - + diff --git a/etc/iris_tests_results/constrained_load/all_ml_10_22_load_match.cml b/etc/iris_tests_results/constrained_load/all_ml_10_22_load_match.cml index dbc8436e81..d5380f2771 100644 --- a/etc/iris_tests_results/constrained_load/all_ml_10_22_load_match.cml +++ b/etc/iris_tests_results/constrained_load/all_ml_10_22_load_match.cml @@ -14,7 +14,7 @@ - + @@ -27,7 +27,7 @@ - + @@ -66,7 +66,7 @@ - + @@ -80,7 +80,7 @@ - + @@ -120,7 +120,7 @@ - + @@ -133,7 +133,7 @@ - + @@ -172,7 +172,7 @@ - + @@ -185,7 +185,7 @@ - + diff --git a/etc/iris_tests_results/constrained_load/attribute_constraint.cml b/etc/iris_tests_results/constrained_load/attribute_constraint.cml index 22d3723ed5..7637dac34f 100644 --- a/etc/iris_tests_results/constrained_load/attribute_constraint.cml +++ b/etc/iris_tests_results/constrained_load/attribute_constraint.cml @@ -15,7 +15,7 @@ - + @@ -70,7 +70,7 @@ - + diff --git a/etc/iris_tests_results/constrained_load/theta_10_and_theta_level_gt_30_le_3_load_match.cml b/etc/iris_tests_results/constrained_load/theta_10_and_theta_level_gt_30_le_3_load_match.cml index 9c03996f47..6994ebb008 100644 --- a/etc/iris_tests_results/constrained_load/theta_10_and_theta_level_gt_30_le_3_load_match.cml +++ b/etc/iris_tests_results/constrained_load/theta_10_and_theta_level_gt_30_le_3_load_match.cml @@ -14,7 +14,7 @@ - + @@ -26,7 +26,7 @@ - + @@ -64,7 +64,7 @@ - + @@ -88,7 +88,7 @@ - + diff --git a/etc/iris_tests_results/constrained_load/theta_10_and_theta_level_gt_30_le_3_load_strict.cml b/etc/iris_tests_results/constrained_load/theta_10_and_theta_level_gt_30_le_3_load_strict.cml index 9c03996f47..6994ebb008 100644 --- a/etc/iris_tests_results/constrained_load/theta_10_and_theta_level_gt_30_le_3_load_strict.cml +++ b/etc/iris_tests_results/constrained_load/theta_10_and_theta_level_gt_30_le_3_load_strict.cml @@ -14,7 +14,7 @@ - + @@ -26,7 +26,7 @@ - + @@ -64,7 +64,7 @@ - + @@ -88,7 +88,7 @@ - + diff --git a/etc/iris_tests_results/constrained_load/theta_10_load_match.cml b/etc/iris_tests_results/constrained_load/theta_10_load_match.cml index dfb9c4261a..b811a51042 100644 --- a/etc/iris_tests_results/constrained_load/theta_10_load_match.cml +++ b/etc/iris_tests_results/constrained_load/theta_10_load_match.cml @@ -14,7 +14,7 @@ - + @@ -26,7 +26,7 @@ - + diff --git a/etc/iris_tests_results/constrained_load/theta_10_load_strict.cml b/etc/iris_tests_results/constrained_load/theta_10_load_strict.cml index dfb9c4261a..b811a51042 100644 --- a/etc/iris_tests_results/constrained_load/theta_10_load_strict.cml +++ b/etc/iris_tests_results/constrained_load/theta_10_load_strict.cml @@ -14,7 +14,7 @@ - + @@ -26,7 +26,7 @@ - + diff --git a/etc/iris_tests_results/constrained_load/theta_and_all_10_load_match.cml b/etc/iris_tests_results/constrained_load/theta_and_all_10_load_match.cml index 5452164af5..c85c1eb8de 100644 --- a/etc/iris_tests_results/constrained_load/theta_and_all_10_load_match.cml +++ b/etc/iris_tests_results/constrained_load/theta_and_all_10_load_match.cml @@ -14,7 +14,7 @@ - + @@ -69,7 +69,7 @@ - + @@ -153,7 +153,7 @@ - + @@ -165,7 +165,7 @@ - + @@ -203,7 +203,7 @@ - + @@ -216,7 +216,7 @@ - + @@ -255,7 +255,7 @@ - + @@ -267,7 +267,7 @@ - + @@ -305,7 +305,7 @@ - + @@ -317,7 +317,7 @@ - + diff --git a/etc/iris_tests_results/constrained_load/theta_and_theta_10_load_strict.cml b/etc/iris_tests_results/constrained_load/theta_and_theta_10_load_strict.cml index b238517c8b..52bf35c389 100644 --- a/etc/iris_tests_results/constrained_load/theta_and_theta_10_load_strict.cml +++ b/etc/iris_tests_results/constrained_load/theta_and_theta_10_load_strict.cml @@ -14,7 +14,7 @@ - + @@ -69,7 +69,7 @@ - + @@ -153,7 +153,7 @@ - + @@ -165,7 +165,7 @@ - + diff --git a/etc/iris_tests_results/constrained_load/theta_and_theta_load_match.cml b/etc/iris_tests_results/constrained_load/theta_and_theta_load_match.cml index bc8f27c7ab..b2b72d7be0 100644 --- a/etc/iris_tests_results/constrained_load/theta_and_theta_load_match.cml +++ b/etc/iris_tests_results/constrained_load/theta_and_theta_load_match.cml @@ -14,7 +14,7 @@ - + @@ -69,7 +69,7 @@ - + @@ -153,7 +153,7 @@ - + @@ -208,7 +208,7 @@ - + diff --git a/etc/iris_tests_results/constrained_load/theta_and_theta_load_strict.cml b/etc/iris_tests_results/constrained_load/theta_and_theta_load_strict.cml index bc8f27c7ab..b2b72d7be0 100644 --- a/etc/iris_tests_results/constrained_load/theta_and_theta_load_strict.cml +++ b/etc/iris_tests_results/constrained_load/theta_and_theta_load_strict.cml @@ -14,7 +14,7 @@ - + @@ -69,7 +69,7 @@ - + @@ -153,7 +153,7 @@ - + @@ -208,7 +208,7 @@ - + diff --git a/etc/iris_tests_results/constrained_load/theta_gt_30_le_3_load_match.cml b/etc/iris_tests_results/constrained_load/theta_gt_30_le_3_load_match.cml index 26a000abba..693839e18c 100644 --- a/etc/iris_tests_results/constrained_load/theta_gt_30_le_3_load_match.cml +++ b/etc/iris_tests_results/constrained_load/theta_gt_30_le_3_load_match.cml @@ -14,7 +14,7 @@ - + @@ -38,7 +38,7 @@ - + diff --git a/etc/iris_tests_results/constrained_load/theta_gt_30_le_3_load_strict.cml b/etc/iris_tests_results/constrained_load/theta_gt_30_le_3_load_strict.cml index 26a000abba..693839e18c 100644 --- a/etc/iris_tests_results/constrained_load/theta_gt_30_le_3_load_strict.cml +++ b/etc/iris_tests_results/constrained_load/theta_gt_30_le_3_load_strict.cml @@ -14,7 +14,7 @@ - + @@ -38,7 +38,7 @@ - + diff --git a/etc/iris_tests_results/constrained_load/theta_lat_30_load_match.cml b/etc/iris_tests_results/constrained_load/theta_lat_30_load_match.cml index 2266ce1be5..636794390b 100644 --- a/etc/iris_tests_results/constrained_load/theta_lat_30_load_match.cml +++ b/etc/iris_tests_results/constrained_load/theta_lat_30_load_match.cml @@ -14,7 +14,7 @@ - + @@ -69,7 +69,7 @@ - + diff --git a/etc/iris_tests_results/constrained_load/theta_lat_30_load_strict.cml b/etc/iris_tests_results/constrained_load/theta_lat_30_load_strict.cml index 2266ce1be5..636794390b 100644 --- a/etc/iris_tests_results/constrained_load/theta_lat_30_load_strict.cml +++ b/etc/iris_tests_results/constrained_load/theta_lat_30_load_strict.cml @@ -14,7 +14,7 @@ - + @@ -69,7 +69,7 @@ - + diff --git a/etc/iris_tests_results/constrained_load/theta_lat_gt_30_load_match.cml b/etc/iris_tests_results/constrained_load/theta_lat_gt_30_load_match.cml index 231317c0f9..e9f0348b6e 100644 --- a/etc/iris_tests_results/constrained_load/theta_lat_gt_30_load_match.cml +++ b/etc/iris_tests_results/constrained_load/theta_lat_gt_30_load_match.cml @@ -19,7 +19,7 @@ 72.5, 73.75, 75.0, 76.25, 77.5, 78.75, 80.0, 81.25, 82.5, 83.75, 85.0, 86.25, 87.5, 88.75, 90.0]" shape="(36,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + @@ -74,7 +74,7 @@ - + diff --git a/etc/iris_tests_results/constrained_load/theta_lat_gt_30_load_strict.cml b/etc/iris_tests_results/constrained_load/theta_lat_gt_30_load_strict.cml index 231317c0f9..e9f0348b6e 100644 --- a/etc/iris_tests_results/constrained_load/theta_lat_gt_30_load_strict.cml +++ b/etc/iris_tests_results/constrained_load/theta_lat_gt_30_load_strict.cml @@ -19,7 +19,7 @@ 72.5, 73.75, 75.0, 76.25, 77.5, 78.75, 80.0, 81.25, 82.5, 83.75, 85.0, 86.25, 87.5, 88.75, 90.0]" shape="(36,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + @@ -74,7 +74,7 @@ - + diff --git a/etc/iris_tests_results/constrained_load/theta_load_match.cml b/etc/iris_tests_results/constrained_load/theta_load_match.cml index 353facb5e1..14d5030cad 100644 --- a/etc/iris_tests_results/constrained_load/theta_load_match.cml +++ b/etc/iris_tests_results/constrained_load/theta_load_match.cml @@ -14,7 +14,7 @@ - + @@ -69,7 +69,7 @@ - + diff --git a/etc/iris_tests_results/constrained_load/theta_load_strict.cml b/etc/iris_tests_results/constrained_load/theta_load_strict.cml index 353facb5e1..14d5030cad 100644 --- a/etc/iris_tests_results/constrained_load/theta_load_strict.cml +++ b/etc/iris_tests_results/constrained_load/theta_load_strict.cml @@ -14,7 +14,7 @@ - + @@ -69,7 +69,7 @@ - + diff --git a/etc/iris_tests_results/coord_systems/CoordSystem_xml_element.xml b/etc/iris_tests_results/coord_systems/CoordSystem_xml_element.xml index 4e7dc4ea81..c76befa2e3 100644 --- a/etc/iris_tests_results/coord_systems/CoordSystem_xml_element.xml +++ b/etc/iris_tests_results/coord_systems/CoordSystem_xml_element.xml @@ -1,2 +1,2 @@ - + diff --git a/etc/iris_tests_results/coord_systems/GeogCS_init_no_invf.xml b/etc/iris_tests_results/coord_systems/GeogCS_init_no_invf.xml index 3dff789574..b294b6cd46 100644 --- a/etc/iris_tests_results/coord_systems/GeogCS_init_no_invf.xml +++ b/etc/iris_tests_results/coord_systems/GeogCS_init_no_invf.xml @@ -1,2 +1,2 @@ - + diff --git a/etc/iris_tests_results/coord_systems/GeogCS_init_no_major.xml b/etc/iris_tests_results/coord_systems/GeogCS_init_no_major.xml index 3dff789574..b294b6cd46 100644 --- a/etc/iris_tests_results/coord_systems/GeogCS_init_no_major.xml +++ b/etc/iris_tests_results/coord_systems/GeogCS_init_no_major.xml @@ -1,2 +1,2 @@ - + diff --git a/etc/iris_tests_results/coord_systems/GeogCS_init_no_minor.xml b/etc/iris_tests_results/coord_systems/GeogCS_init_no_minor.xml index 3dff789574..b294b6cd46 100644 --- a/etc/iris_tests_results/coord_systems/GeogCS_init_no_minor.xml +++ b/etc/iris_tests_results/coord_systems/GeogCS_init_no_minor.xml @@ -1,2 +1,2 @@ - + diff --git a/etc/iris_tests_results/coord_systems/GeogCS_init_sphere.xml b/etc/iris_tests_results/coord_systems/GeogCS_init_sphere.xml index a9422c3c4b..7244d027e7 100644 --- a/etc/iris_tests_results/coord_systems/GeogCS_init_sphere.xml +++ b/etc/iris_tests_results/coord_systems/GeogCS_init_sphere.xml @@ -1,2 +1,2 @@ - + diff --git a/etc/iris_tests_results/coord_systems/RotatedGeogCS_from_geocs.xml b/etc/iris_tests_results/coord_systems/RotatedGeogCS_from_geocs.xml deleted file mode 100644 index 4e7dc4ea81..0000000000 --- a/etc/iris_tests_results/coord_systems/RotatedGeogCS_from_geocs.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/etc/iris_tests_results/coord_systems/RotatedGeogCS_init.xml b/etc/iris_tests_results/coord_systems/RotatedGeogCS_init.xml index a1b2ed871b..76361000b1 100644 --- a/etc/iris_tests_results/coord_systems/RotatedGeogCS_init.xml +++ b/etc/iris_tests_results/coord_systems/RotatedGeogCS_init.xml @@ -1,2 +1,2 @@ - + diff --git a/etc/iris_tests_results/coord_systems/RotatedGeogCS_init_a.xml b/etc/iris_tests_results/coord_systems/RotatedGeogCS_init_a.xml new file mode 100644 index 0000000000..c61ff3c608 --- /dev/null +++ b/etc/iris_tests_results/coord_systems/RotatedGeogCS_init_a.xml @@ -0,0 +1,2 @@ + + diff --git a/etc/iris_tests_results/coord_systems/RotatedGeogCS_init_b.xml b/etc/iris_tests_results/coord_systems/RotatedGeogCS_init_b.xml new file mode 100644 index 0000000000..adfc9ae2f1 --- /dev/null +++ b/etc/iris_tests_results/coord_systems/RotatedGeogCS_init_b.xml @@ -0,0 +1,2 @@ + + diff --git a/etc/iris_tests_results/coord_systems/TransverseMercator_osgb.xml b/etc/iris_tests_results/coord_systems/TransverseMercator_osgb.xml index 723a45679a..6176d01aa5 100644 --- a/etc/iris_tests_results/coord_systems/TransverseMercator_osgb.xml +++ b/etc/iris_tests_results/coord_systems/TransverseMercator_osgb.xml @@ -1,2 +1,2 @@ - + diff --git a/etc/iris_tests_results/cube_collapsed/latitude_longitude_dual_stage.cml b/etc/iris_tests_results/cube_collapsed/latitude_longitude_dual_stage.cml index f6b965311b..1e94905f3d 100644 --- a/etc/iris_tests_results/cube_collapsed/latitude_longitude_dual_stage.cml +++ b/etc/iris_tests_results/cube_collapsed/latitude_longitude_dual_stage.cml @@ -13,12 +13,12 @@ Mean of air_potential_temperature over grid_longitude"/> - + - + diff --git a/etc/iris_tests_results/cube_collapsed/latitude_longitude_single_stage.cml b/etc/iris_tests_results/cube_collapsed/latitude_longitude_single_stage.cml index 3b50e07043..a105151433 100644 --- a/etc/iris_tests_results/cube_collapsed/latitude_longitude_single_stage.cml +++ b/etc/iris_tests_results/cube_collapsed/latitude_longitude_single_stage.cml @@ -12,12 +12,12 @@ - + - + diff --git a/etc/iris_tests_results/cube_collapsed/latitude_model_level_number_dual_stage.cml b/etc/iris_tests_results/cube_collapsed/latitude_model_level_number_dual_stage.cml index 38cc414010..520f4438da 100644 --- a/etc/iris_tests_results/cube_collapsed/latitude_model_level_number_dual_stage.cml +++ b/etc/iris_tests_results/cube_collapsed/latitude_model_level_number_dual_stage.cml @@ -13,7 +13,7 @@ Mean of air_potential_temperature over model_level_number"/> - + @@ -25,7 +25,7 @@ Mean of air_potential_temperature over model_level_number"/> [359.667, 359.668], [359.668, 359.669]]" id="3bf28623a9db078e" points="[359.58, 359.581, 359.581, ..., 359.667, 359.668, 359.669]" shape="(100,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/cube_collapsed/latitude_model_level_number_single_stage.cml b/etc/iris_tests_results/cube_collapsed/latitude_model_level_number_single_stage.cml index ed141cc6a7..d7415f5c95 100644 --- a/etc/iris_tests_results/cube_collapsed/latitude_model_level_number_single_stage.cml +++ b/etc/iris_tests_results/cube_collapsed/latitude_model_level_number_single_stage.cml @@ -12,7 +12,7 @@ - + @@ -24,7 +24,7 @@ [359.667, 359.668], [359.668, 359.669]]" id="3bf28623a9db078e" points="[359.58, 359.581, 359.581, ..., 359.667, 359.668, 359.669]" shape="(100,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/cube_collapsed/latitude_time_dual_stage.cml b/etc/iris_tests_results/cube_collapsed/latitude_time_dual_stage.cml index 22eeea3d0f..64e53aa8de 100644 --- a/etc/iris_tests_results/cube_collapsed/latitude_time_dual_stage.cml +++ b/etc/iris_tests_results/cube_collapsed/latitude_time_dual_stage.cml @@ -13,7 +13,7 @@ Mean of air_potential_temperature over time"/> - + @@ -25,7 +25,7 @@ Mean of air_potential_temperature over time"/> [359.667, 359.668], [359.668, 359.669]]" id="3bf28623a9db078e" points="[359.58, 359.581, 359.581, ..., 359.667, 359.668, 359.669]" shape="(100,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/cube_collapsed/latitude_time_single_stage.cml b/etc/iris_tests_results/cube_collapsed/latitude_time_single_stage.cml index 85dfbd8cc7..656607a931 100644 --- a/etc/iris_tests_results/cube_collapsed/latitude_time_single_stage.cml +++ b/etc/iris_tests_results/cube_collapsed/latitude_time_single_stage.cml @@ -12,7 +12,7 @@ - + @@ -24,7 +24,7 @@ [359.667, 359.668], [359.668, 359.669]]" id="3bf28623a9db078e" points="[359.58, 359.581, 359.581, ..., 359.667, 359.668, 359.669]" shape="(100,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/cube_collapsed/longitude_latitude_dual_stage.cml b/etc/iris_tests_results/cube_collapsed/longitude_latitude_dual_stage.cml index 839ffb8106..d245f257ae 100644 --- a/etc/iris_tests_results/cube_collapsed/longitude_latitude_dual_stage.cml +++ b/etc/iris_tests_results/cube_collapsed/longitude_latitude_dual_stage.cml @@ -13,12 +13,12 @@ Mean of air_potential_temperature over grid_latitude"/> - + - + diff --git a/etc/iris_tests_results/cube_collapsed/longitude_latitude_single_stage.cml b/etc/iris_tests_results/cube_collapsed/longitude_latitude_single_stage.cml index d96afeed9c..28a7cb34c7 100644 --- a/etc/iris_tests_results/cube_collapsed/longitude_latitude_single_stage.cml +++ b/etc/iris_tests_results/cube_collapsed/longitude_latitude_single_stage.cml @@ -12,12 +12,12 @@ - + - + diff --git a/etc/iris_tests_results/cube_collapsed/longitude_model_level_number_dual_stage.cml b/etc/iris_tests_results/cube_collapsed/longitude_model_level_number_dual_stage.cml index 51d252810a..c4b29d856a 100644 --- a/etc/iris_tests_results/cube_collapsed/longitude_model_level_number_dual_stage.cml +++ b/etc/iris_tests_results/cube_collapsed/longitude_model_level_number_dual_stage.cml @@ -20,12 +20,12 @@ Mean of air_potential_temperature over model_level_number"/> [-0.04005, -0.03915], [-0.03915, -0.03825]]" id="25a5f42bc937b908" points="[-0.1278, -0.1269, -0.126, ..., -0.0405, -0.0396, -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/cube_collapsed/longitude_model_level_number_single_stage.cml b/etc/iris_tests_results/cube_collapsed/longitude_model_level_number_single_stage.cml index eb236c11be..2772081189 100644 --- a/etc/iris_tests_results/cube_collapsed/longitude_model_level_number_single_stage.cml +++ b/etc/iris_tests_results/cube_collapsed/longitude_model_level_number_single_stage.cml @@ -19,12 +19,12 @@ [-0.04005, -0.03915], [-0.03915, -0.03825]]" id="25a5f42bc937b908" points="[-0.1278, -0.1269, -0.126, ..., -0.0405, -0.0396, -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/cube_collapsed/longitude_time_dual_stage.cml b/etc/iris_tests_results/cube_collapsed/longitude_time_dual_stage.cml index 8635f6a753..6317ea1a9e 100644 --- a/etc/iris_tests_results/cube_collapsed/longitude_time_dual_stage.cml +++ b/etc/iris_tests_results/cube_collapsed/longitude_time_dual_stage.cml @@ -20,12 +20,12 @@ Mean of air_potential_temperature over time"/> [-0.04005, -0.03915], [-0.03915, -0.03825]]" id="25a5f42bc937b908" points="[-0.1278, -0.1269, -0.126, ..., -0.0405, -0.0396, -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/cube_collapsed/longitude_time_single_stage.cml b/etc/iris_tests_results/cube_collapsed/longitude_time_single_stage.cml index 476b1421d8..a44bc14945 100644 --- a/etc/iris_tests_results/cube_collapsed/longitude_time_single_stage.cml +++ b/etc/iris_tests_results/cube_collapsed/longitude_time_single_stage.cml @@ -19,12 +19,12 @@ [-0.04005, -0.03915], [-0.03915, -0.03825]]" id="25a5f42bc937b908" points="[-0.1278, -0.1269, -0.126, ..., -0.0405, -0.0396, -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/cube_collapsed/model_level_number_latitude_dual_stage.cml b/etc/iris_tests_results/cube_collapsed/model_level_number_latitude_dual_stage.cml index 89474eb70b..3bbc6f09eb 100644 --- a/etc/iris_tests_results/cube_collapsed/model_level_number_latitude_dual_stage.cml +++ b/etc/iris_tests_results/cube_collapsed/model_level_number_latitude_dual_stage.cml @@ -13,7 +13,7 @@ Mean of air_potential_temperature over grid_latitude"/> - + @@ -25,7 +25,7 @@ Mean of air_potential_temperature over grid_latitude"/> [359.667, 359.668], [359.668, 359.669]]" id="3bf28623a9db078e" points="[359.58, 359.581, 359.581, ..., 359.667, 359.668, 359.669]" shape="(100,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/cube_collapsed/model_level_number_latitude_single_stage.cml b/etc/iris_tests_results/cube_collapsed/model_level_number_latitude_single_stage.cml index 1f9bbdbe91..49d6791a74 100644 --- a/etc/iris_tests_results/cube_collapsed/model_level_number_latitude_single_stage.cml +++ b/etc/iris_tests_results/cube_collapsed/model_level_number_latitude_single_stage.cml @@ -12,7 +12,7 @@ - + @@ -24,7 +24,7 @@ [359.667, 359.668], [359.668, 359.669]]" id="3bf28623a9db078e" points="[359.58, 359.581, 359.581, ..., 359.667, 359.668, 359.669]" shape="(100,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/cube_collapsed/model_level_number_longitude_dual_stage.cml b/etc/iris_tests_results/cube_collapsed/model_level_number_longitude_dual_stage.cml index ae48ffa803..b9f82d6534 100644 --- a/etc/iris_tests_results/cube_collapsed/model_level_number_longitude_dual_stage.cml +++ b/etc/iris_tests_results/cube_collapsed/model_level_number_longitude_dual_stage.cml @@ -20,12 +20,12 @@ Mean of air_potential_temperature over grid_longitude"/> [-0.04005, -0.03915], [-0.03915, -0.03825]]" id="25a5f42bc937b908" points="[-0.1278, -0.1269, -0.126, ..., -0.0405, -0.0396, -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/cube_collapsed/model_level_number_longitude_single_stage.cml b/etc/iris_tests_results/cube_collapsed/model_level_number_longitude_single_stage.cml index bfecb256ad..ba387cb519 100644 --- a/etc/iris_tests_results/cube_collapsed/model_level_number_longitude_single_stage.cml +++ b/etc/iris_tests_results/cube_collapsed/model_level_number_longitude_single_stage.cml @@ -19,12 +19,12 @@ [-0.04005, -0.03915], [-0.03915, -0.03825]]" id="25a5f42bc937b908" points="[-0.1278, -0.1269, -0.126, ..., -0.0405, -0.0396, -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/cube_collapsed/model_level_number_time_dual_stage.cml b/etc/iris_tests_results/cube_collapsed/model_level_number_time_dual_stage.cml index 9a384804b7..040e8dcd26 100644 --- a/etc/iris_tests_results/cube_collapsed/model_level_number_time_dual_stage.cml +++ b/etc/iris_tests_results/cube_collapsed/model_level_number_time_dual_stage.cml @@ -20,7 +20,7 @@ Mean of air_potential_temperature over time"/> [-0.04005, -0.03915], [-0.03915, -0.03825]]" id="25a5f42bc937b908" points="[-0.1278, -0.1269, -0.126, ..., -0.0405, -0.0396, -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + @@ -32,7 +32,7 @@ Mean of air_potential_temperature over time"/> [359.667, 359.668], [359.668, 359.669]]" id="3bf28623a9db078e" points="[359.58, 359.581, 359.581, ..., 359.667, 359.668, 359.669]" shape="(100,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/cube_collapsed/model_level_number_time_single_stage.cml b/etc/iris_tests_results/cube_collapsed/model_level_number_time_single_stage.cml index e1d0129ddd..3d8627f1f2 100644 --- a/etc/iris_tests_results/cube_collapsed/model_level_number_time_single_stage.cml +++ b/etc/iris_tests_results/cube_collapsed/model_level_number_time_single_stage.cml @@ -19,7 +19,7 @@ [-0.04005, -0.03915], [-0.03915, -0.03825]]" id="25a5f42bc937b908" points="[-0.1278, -0.1269, -0.126, ..., -0.0405, -0.0396, -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + @@ -31,7 +31,7 @@ [359.667, 359.668], [359.668, 359.669]]" id="3bf28623a9db078e" points="[359.58, 359.581, 359.581, ..., 359.667, 359.668, 359.669]" shape="(100,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/cube_collapsed/original.cml b/etc/iris_tests_results/cube_collapsed/original.cml index f4d075f04e..a6089348fe 100644 --- a/etc/iris_tests_results/cube_collapsed/original.cml +++ b/etc/iris_tests_results/cube_collapsed/original.cml @@ -18,7 +18,7 @@ [-0.04005, -0.03915], [-0.03915, -0.03825]]" id="25a5f42bc937b908" points="[-0.1278, -0.1269, -0.126, ..., -0.0405, -0.0396, -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + @@ -30,7 +30,7 @@ [359.667, 359.668], [359.668, 359.669]]" id="3bf28623a9db078e" points="[359.58, 359.581, 359.581, ..., 359.667, 359.668, 359.669]" shape="(100,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/cube_collapsed/time_latitude_dual_stage.cml b/etc/iris_tests_results/cube_collapsed/time_latitude_dual_stage.cml index 9109ded76b..03585c0a1d 100644 --- a/etc/iris_tests_results/cube_collapsed/time_latitude_dual_stage.cml +++ b/etc/iris_tests_results/cube_collapsed/time_latitude_dual_stage.cml @@ -13,7 +13,7 @@ Mean of air_potential_temperature over grid_latitude"/> - + @@ -25,7 +25,7 @@ Mean of air_potential_temperature over grid_latitude"/> [359.667, 359.668], [359.668, 359.669]]" id="3bf28623a9db078e" points="[359.58, 359.581, 359.581, ..., 359.667, 359.668, 359.669]" shape="(100,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/cube_collapsed/time_latitude_single_stage.cml b/etc/iris_tests_results/cube_collapsed/time_latitude_single_stage.cml index 6e52704e65..190426357f 100644 --- a/etc/iris_tests_results/cube_collapsed/time_latitude_single_stage.cml +++ b/etc/iris_tests_results/cube_collapsed/time_latitude_single_stage.cml @@ -12,7 +12,7 @@ - + @@ -24,7 +24,7 @@ [359.667, 359.668], [359.668, 359.669]]" id="3bf28623a9db078e" points="[359.58, 359.581, 359.581, ..., 359.667, 359.668, 359.669]" shape="(100,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/cube_collapsed/time_longitude_dual_stage.cml b/etc/iris_tests_results/cube_collapsed/time_longitude_dual_stage.cml index c5b54f739d..fd26fee627 100644 --- a/etc/iris_tests_results/cube_collapsed/time_longitude_dual_stage.cml +++ b/etc/iris_tests_results/cube_collapsed/time_longitude_dual_stage.cml @@ -20,12 +20,12 @@ Mean of air_potential_temperature over grid_longitude"/> [-0.04005, -0.03915], [-0.03915, -0.03825]]" id="25a5f42bc937b908" points="[-0.1278, -0.1269, -0.126, ..., -0.0405, -0.0396, -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/cube_collapsed/time_longitude_single_stage.cml b/etc/iris_tests_results/cube_collapsed/time_longitude_single_stage.cml index 6cc2fc57ba..858e2be6a3 100644 --- a/etc/iris_tests_results/cube_collapsed/time_longitude_single_stage.cml +++ b/etc/iris_tests_results/cube_collapsed/time_longitude_single_stage.cml @@ -19,12 +19,12 @@ [-0.04005, -0.03915], [-0.03915, -0.03825]]" id="25a5f42bc937b908" points="[-0.1278, -0.1269, -0.126, ..., -0.0405, -0.0396, -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/cube_collapsed/time_model_level_number_dual_stage.cml b/etc/iris_tests_results/cube_collapsed/time_model_level_number_dual_stage.cml index a2e0c5b352..5688800a3c 100644 --- a/etc/iris_tests_results/cube_collapsed/time_model_level_number_dual_stage.cml +++ b/etc/iris_tests_results/cube_collapsed/time_model_level_number_dual_stage.cml @@ -20,7 +20,7 @@ Mean of air_potential_temperature over model_level_number"/> [-0.04005, -0.03915], [-0.03915, -0.03825]]" id="25a5f42bc937b908" points="[-0.1278, -0.1269, -0.126, ..., -0.0405, -0.0396, -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + @@ -32,7 +32,7 @@ Mean of air_potential_temperature over model_level_number"/> [359.667, 359.668], [359.668, 359.669]]" id="3bf28623a9db078e" points="[359.58, 359.581, 359.581, ..., 359.667, 359.668, 359.669]" shape="(100,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/cube_collapsed/time_model_level_number_single_stage.cml b/etc/iris_tests_results/cube_collapsed/time_model_level_number_single_stage.cml index e7d3a89abf..2c0c40bd71 100644 --- a/etc/iris_tests_results/cube_collapsed/time_model_level_number_single_stage.cml +++ b/etc/iris_tests_results/cube_collapsed/time_model_level_number_single_stage.cml @@ -19,7 +19,7 @@ [-0.04005, -0.03915], [-0.03915, -0.03825]]" id="25a5f42bc937b908" points="[-0.1278, -0.1269, -0.126, ..., -0.0405, -0.0396, -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + @@ -31,7 +31,7 @@ [359.667, 359.668], [359.668, 359.669]]" id="3bf28623a9db078e" points="[359.58, 359.581, 359.581, ..., 359.667, 359.668, 359.669]" shape="(100,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/cube_collapsed/triple_collapse_lat_ml_pt.cml b/etc/iris_tests_results/cube_collapsed/triple_collapse_lat_ml_pt.cml index ebf44f431e..b2220bd5c4 100644 --- a/etc/iris_tests_results/cube_collapsed/triple_collapse_lat_ml_pt.cml +++ b/etc/iris_tests_results/cube_collapsed/triple_collapse_lat_ml_pt.cml @@ -12,7 +12,7 @@ - + @@ -24,7 +24,7 @@ [359.667, 359.668], [359.668, 359.669]]" id="3bf28623a9db078e" points="[359.58, 359.581, 359.581, ..., 359.667, 359.668, 359.669]" shape="(100,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/cube_collapsed/triple_collapse_ml_pt_lon.cml b/etc/iris_tests_results/cube_collapsed/triple_collapse_ml_pt_lon.cml index e60f0ce0bf..e764fe86a3 100644 --- a/etc/iris_tests_results/cube_collapsed/triple_collapse_ml_pt_lon.cml +++ b/etc/iris_tests_results/cube_collapsed/triple_collapse_ml_pt_lon.cml @@ -19,12 +19,12 @@ [-0.04005, -0.03915], [-0.03915, -0.03825]]" id="25a5f42bc937b908" points="[-0.1278, -0.1269, -0.126, ..., -0.0405, -0.0396, -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/cube_io/pickling/cubelist.cml b/etc/iris_tests_results/cube_io/pickling/cubelist.cml index feb26570ad..ad9be915be 100644 --- a/etc/iris_tests_results/cube_io/pickling/cubelist.cml +++ b/etc/iris_tests_results/cube_io/pickling/cubelist.cml @@ -406,7 +406,7 @@ [-0.04005, -0.03915], [-0.03915, -0.03825]]" id="25a5f42bc937b908" points="[-0.1278, -0.1269, -0.126, ..., -0.0405, -0.0396, -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + @@ -418,7 +418,7 @@ [359.667, 359.668], [359.668, 359.669]]" id="3bf28623a9db078e" points="[359.58, 359.581, 359.581, ..., 359.667, 359.668, 359.669]" shape="(100,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + @@ -523,7 +523,7 @@ [-0.04005, -0.03915], [-0.03915, -0.03825]]" id="25a5f42bc937b908" points="[-0.1278, -0.1269, -0.126, ..., -0.0405, -0.0396, -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + @@ -535,7 +535,7 @@ [359.667, 359.668], [359.668, 359.669]]" id="3bf28623a9db078e" points="[359.58, 359.581, 359.581, ..., 359.667, 359.668, 359.669]" shape="(100,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/cube_io/pickling/single_cube.cml b/etc/iris_tests_results/cube_io/pickling/single_cube.cml index 131287a922..6d1cdbc89f 100644 --- a/etc/iris_tests_results/cube_io/pickling/single_cube.cml +++ b/etc/iris_tests_results/cube_io/pickling/single_cube.cml @@ -406,7 +406,7 @@ [-0.04005, -0.03915], [-0.03915, -0.03825]]" id="25a5f42bc937b908" points="[-0.1278, -0.1269, -0.126, ..., -0.0405, -0.0396, -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + @@ -418,7 +418,7 @@ [359.667, 359.668], [359.668, 359.669]]" id="3bf28623a9db078e" points="[359.58, 359.581, 359.581, ..., 359.667, 359.668, 359.669]" shape="(100,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/cube_io/pickling/theta.cml b/etc/iris_tests_results/cube_io/pickling/theta.cml index 2004b11338..35e503068d 100644 --- a/etc/iris_tests_results/cube_io/pickling/theta.cml +++ b/etc/iris_tests_results/cube_io/pickling/theta.cml @@ -14,7 +14,7 @@ - + @@ -69,7 +69,7 @@ - + diff --git a/etc/iris_tests_results/cube_io/pp/load/global.cml b/etc/iris_tests_results/cube_io/pp/load/global.cml index 2641a9e1d6..d740082153 100644 --- a/etc/iris_tests_results/cube_io/pp/load/global.cml +++ b/etc/iris_tests_results/cube_io/pp/load/global.cml @@ -22,12 +22,12 @@ -62.4999, -64.9999, -67.4999, -69.9999, -72.4999, -74.9999, -77.4999, -79.9999, -82.4999, -84.9999, -87.4999, -89.9999]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/cube_io/pp/no_std_name.cml b/etc/iris_tests_results/cube_io/pp/no_std_name.cml index db986e3c57..870ed0150b 100644 --- a/etc/iris_tests_results/cube_io/pp/no_std_name.cml +++ b/etc/iris_tests_results/cube_io/pp/no_std_name.cml @@ -22,12 +22,12 @@ -62.4999, -64.9999, -67.4999, -69.9999, -72.4999, -74.9999, -77.4999, -79.9999, -82.4999, -84.9999, -87.4999, -89.9999]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/cube_slice/real_data_dual_tuple_indexing1.cml b/etc/iris_tests_results/cube_slice/real_data_dual_tuple_indexing1.cml index 8d7ec097f4..734bb20caf 100644 --- a/etc/iris_tests_results/cube_slice/real_data_dual_tuple_indexing1.cml +++ b/etc/iris_tests_results/cube_slice/real_data_dual_tuple_indexing1.cml @@ -11,12 +11,12 @@ - + - + diff --git a/etc/iris_tests_results/cube_slice/real_data_dual_tuple_indexing2.cml b/etc/iris_tests_results/cube_slice/real_data_dual_tuple_indexing2.cml index baedf2382a..b7c44e8d97 100644 --- a/etc/iris_tests_results/cube_slice/real_data_dual_tuple_indexing2.cml +++ b/etc/iris_tests_results/cube_slice/real_data_dual_tuple_indexing2.cml @@ -11,12 +11,12 @@ - + - + diff --git a/etc/iris_tests_results/cube_slice/real_data_dual_tuple_indexing3.cml b/etc/iris_tests_results/cube_slice/real_data_dual_tuple_indexing3.cml index 184daae61c..aa4f95c59f 100644 --- a/etc/iris_tests_results/cube_slice/real_data_dual_tuple_indexing3.cml +++ b/etc/iris_tests_results/cube_slice/real_data_dual_tuple_indexing3.cml @@ -11,12 +11,12 @@ - + - + diff --git a/etc/iris_tests_results/cube_slice/real_empty_data_indexing.cml b/etc/iris_tests_results/cube_slice/real_empty_data_indexing.cml index b6af60e881..8afa63bb2f 100644 --- a/etc/iris_tests_results/cube_slice/real_empty_data_indexing.cml +++ b/etc/iris_tests_results/cube_slice/real_empty_data_indexing.cml @@ -11,13 +11,13 @@ - + - + diff --git a/etc/iris_tests_results/derived/column.cml b/etc/iris_tests_results/derived/column.cml index 5fdf2969ec..6f8319507b 100644 --- a/etc/iris_tests_results/derived/column.cml +++ b/etc/iris_tests_results/derived/column.cml @@ -36,12 +36,12 @@ - + - + diff --git a/etc/iris_tests_results/derived/no_orog.cml b/etc/iris_tests_results/derived/no_orog.cml index dd55f1ce34..1b2ddaf862 100644 --- a/etc/iris_tests_results/derived/no_orog.cml +++ b/etc/iris_tests_results/derived/no_orog.cml @@ -43,7 +43,7 @@ [-0.04005, -0.03915], [-0.03915, -0.03825]]" id="25a5f42bc937b908" points="[-0.1278, -0.1269, -0.126, ..., -0.0405, -0.0396, -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + @@ -55,7 +55,7 @@ [359.667, 359.668], [359.668, 359.669]]" id="3bf28623a9db078e" points="[359.58, 359.581, 359.581, ..., 359.667, 359.668, 359.669]" shape="(100,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/derived/removed_orog.cml b/etc/iris_tests_results/derived/removed_orog.cml index 2a4e23c5b4..e6f792b0bd 100644 --- a/etc/iris_tests_results/derived/removed_orog.cml +++ b/etc/iris_tests_results/derived/removed_orog.cml @@ -43,7 +43,7 @@ [-0.04005, -0.03915], [-0.03915, -0.03825]]" id="25a5f42bc937b908" points="[-0.1278, -0.1269, -0.126, ..., -0.0405, -0.0396, -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + @@ -55,7 +55,7 @@ [359.667, 359.668], [359.668, 359.669]]" id="3bf28623a9db078e" points="[359.58, 359.581, 359.581, ..., 359.667, 359.668, 359.669]" shape="(100,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/derived/removed_sigma.cml b/etc/iris_tests_results/derived/removed_sigma.cml index b0a17e83e5..e68e049f63 100644 --- a/etc/iris_tests_results/derived/removed_sigma.cml +++ b/etc/iris_tests_results/derived/removed_sigma.cml @@ -393,7 +393,7 @@ [-0.04005, -0.03915], [-0.03915, -0.03825]]" id="25a5f42bc937b908" points="[-0.1278, -0.1269, -0.126, ..., -0.0405, -0.0396, -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + @@ -405,7 +405,7 @@ [359.667, 359.668], [359.668, 359.669]]" id="3bf28623a9db078e" points="[359.58, 359.581, 359.581, ..., 359.667, 359.668, 359.669]" shape="(100,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/derived/transposed.cml b/etc/iris_tests_results/derived/transposed.cml index 541f858d23..a54b52ca1d 100644 --- a/etc/iris_tests_results/derived/transposed.cml +++ b/etc/iris_tests_results/derived/transposed.cml @@ -405,7 +405,7 @@ [-0.04005, -0.03915], [-0.03915, -0.03825]]" id="25a5f42bc937b908" points="[-0.1278, -0.1269, -0.126, ..., -0.0405, -0.0396, -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + @@ -417,7 +417,7 @@ [359.667, 359.668], [359.668, 359.669]]" id="3bf28623a9db078e" points="[359.58, 359.581, 359.581, ..., 359.667, 359.668, 359.669]" shape="(100,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/file_load/5d_pp.dot b/etc/iris_tests_results/file_load/5d_pp.dot index 5d808cd869..275c353a17 100644 --- a/etc/iris_tests_results/file_load/5d_pp.dot +++ b/etc/iris_tests_results/file_load/5d_pp.dot @@ -74,8 +74,8 @@ digraph CubeGraph{ subgraph clusterCoordSystems { label = "CoordSystems" - "CoordSystem_LatLonCS_0" [ - label = "LatLonCS|cs_type: spherical\ndatum: SpheroidDatum(label='spherical', semi_major_axis=6371229.0, semi_minor_axis=6371229.0, flattening=0.0, units=Unit('m'))\nn_pole: GeoPosition(latitude=37.5, longitude=177.5)\nprime_meridian: PrimeMeridian(label='Greenwich', value=0.0)\nreference_longitude: 0.0" + "CoordSystem_RotatedGeogCS_0" [ + label = "RotatedGeogCS|ellipsoid: GeogCS(6371229.0)\ngrid_north_pole_latitude: 37.5\ngrid_north_pole_longitude: 177.5\nnorth_pole_grid_longitude: 0.0" ] } @@ -90,9 +90,9 @@ digraph CubeGraph{ ":Cube" -> "Coord_0" ":Cube" -> "Coord_1" - "Coord_2" -> "CoordSystem_LatLonCS_0" + "Coord_2" -> "CoordSystem_RotatedGeogCS_0" ":Cube" -> "Coord_2" - "Coord_3" -> "CoordSystem_LatLonCS_0" + "Coord_3" -> "CoordSystem_RotatedGeogCS_0" ":Cube" -> "Coord_3" ":Cube" -> "Coord_4" ":Cube" -> "Coord_5" diff --git a/etc/iris_tests_results/file_load/coord_attributes.dot b/etc/iris_tests_results/file_load/coord_attributes.dot index 8796ddb38d..377eef8a19 100644 --- a/etc/iris_tests_results/file_load/coord_attributes.dot +++ b/etc/iris_tests_results/file_load/coord_attributes.dot @@ -54,8 +54,8 @@ digraph CubeGraph{ subgraph clusterCoordSystems { label = "CoordSystems" - "CoordSystem_LatLonCS_0" [ - label = "LatLonCS|cs_type: spherical\ndatum: SpheroidDatum(label='spherical', semi_major_axis=6371229.0, semi_minor_axis=6371229.0, flattening=0.0, units=Unit('m'))\nn_pole: GeoPosition(latitude=90.0, longitude=0.0)\nprime_meridian: PrimeMeridian(label='Greenwich', value=0.0)\nreference_longitude: 0.0" + "CoordSystem_GeogCS_0" [ + label = "GeogCS|inverse_flattening: 0.0\nlongitude_of_prime_meridian: 0.0\nsemi_major_axis: 6371229.0\nsemi_minor_axis: 6371229.0" ] } @@ -69,9 +69,9 @@ digraph CubeGraph{ # Containment ":Cube" -> "Coord_0" - "Coord_1" -> "CoordSystem_LatLonCS_0" + "Coord_1" -> "CoordSystem_GeogCS_0" ":Cube" -> "Coord_1" - "Coord_2" -> "CoordSystem_LatLonCS_0" + "Coord_2" -> "CoordSystem_GeogCS_0" ":Cube" -> "Coord_2" ":Cube" -> "Coord_3" ":Cube" -> "Coord_4" diff --git a/etc/iris_tests_results/file_load/global_pp.dot b/etc/iris_tests_results/file_load/global_pp.dot index 8ebe9f6a47..0261f2a65d 100644 --- a/etc/iris_tests_results/file_load/global_pp.dot +++ b/etc/iris_tests_results/file_load/global_pp.dot @@ -54,8 +54,8 @@ digraph CubeGraph{ subgraph clusterCoordSystems { label = "CoordSystems" - "CoordSystem_LatLonCS_0" [ - label = "LatLonCS|cs_type: spherical\ndatum: SpheroidDatum(label='spherical', semi_major_axis=6371229.0, semi_minor_axis=6371229.0, flattening=0.0, units=Unit('m'))\nn_pole: GeoPosition(latitude=90.0, longitude=0.0)\nprime_meridian: PrimeMeridian(label='Greenwich', value=0.0)\nreference_longitude: 0.0" + "CoordSystem_GeogCS_0" [ + label = "GeogCS|inverse_flattening: 0.0\nlongitude_of_prime_meridian: 0.0\nsemi_major_axis: 6371229.0\nsemi_minor_axis: 6371229.0" ] } @@ -69,9 +69,9 @@ digraph CubeGraph{ # Containment ":Cube" -> "Coord_0" - "Coord_1" -> "CoordSystem_LatLonCS_0" + "Coord_1" -> "CoordSystem_GeogCS_0" ":Cube" -> "Coord_1" - "Coord_2" -> "CoordSystem_LatLonCS_0" + "Coord_2" -> "CoordSystem_GeogCS_0" ":Cube" -> "Coord_2" ":Cube" -> "Coord_3" ":Cube" -> "Coord_4" diff --git a/etc/iris_tests_results/file_load/theta_levels.cml b/etc/iris_tests_results/file_load/theta_levels.cml index 7b877ebef1..957a6ba5a8 100644 --- a/etc/iris_tests_results/file_load/theta_levels.cml +++ b/etc/iris_tests_results/file_load/theta_levels.cml @@ -14,7 +14,7 @@ - + @@ -26,7 +26,7 @@ - + @@ -64,7 +64,7 @@ - + @@ -76,7 +76,7 @@ - + @@ -114,7 +114,7 @@ - + @@ -126,7 +126,7 @@ - + @@ -164,7 +164,7 @@ - + @@ -176,7 +176,7 @@ - + @@ -214,7 +214,7 @@ - + @@ -226,7 +226,7 @@ - + @@ -264,7 +264,7 @@ - + @@ -276,7 +276,7 @@ - + @@ -314,7 +314,7 @@ - + @@ -326,7 +326,7 @@ - + @@ -364,7 +364,7 @@ - + @@ -376,7 +376,7 @@ - + @@ -414,7 +414,7 @@ - + @@ -426,7 +426,7 @@ - + @@ -464,7 +464,7 @@ - + @@ -476,7 +476,7 @@ - + @@ -514,7 +514,7 @@ - + @@ -526,7 +526,7 @@ - + @@ -564,7 +564,7 @@ - + @@ -576,7 +576,7 @@ - + @@ -614,7 +614,7 @@ - + @@ -626,7 +626,7 @@ - + @@ -664,7 +664,7 @@ - + @@ -676,7 +676,7 @@ - + @@ -714,7 +714,7 @@ - + @@ -726,7 +726,7 @@ - + @@ -764,7 +764,7 @@ - + @@ -776,7 +776,7 @@ - + @@ -814,7 +814,7 @@ - + @@ -826,7 +826,7 @@ - + @@ -864,7 +864,7 @@ - + @@ -876,7 +876,7 @@ - + @@ -914,7 +914,7 @@ - + @@ -926,7 +926,7 @@ - + @@ -964,7 +964,7 @@ - + @@ -976,7 +976,7 @@ - + @@ -1014,7 +1014,7 @@ - + @@ -1026,7 +1026,7 @@ - + @@ -1064,7 +1064,7 @@ - + @@ -1076,7 +1076,7 @@ - + @@ -1114,7 +1114,7 @@ - + @@ -1126,7 +1126,7 @@ - + @@ -1164,7 +1164,7 @@ - + @@ -1176,7 +1176,7 @@ - + @@ -1214,7 +1214,7 @@ - + @@ -1226,7 +1226,7 @@ - + @@ -1264,7 +1264,7 @@ - + @@ -1276,7 +1276,7 @@ - + @@ -1314,7 +1314,7 @@ - + @@ -1326,7 +1326,7 @@ - + @@ -1364,7 +1364,7 @@ - + @@ -1376,7 +1376,7 @@ - + @@ -1414,7 +1414,7 @@ - + @@ -1426,7 +1426,7 @@ - + @@ -1464,7 +1464,7 @@ - + @@ -1476,7 +1476,7 @@ - + @@ -1514,7 +1514,7 @@ - + @@ -1526,7 +1526,7 @@ - + @@ -1564,7 +1564,7 @@ - + @@ -1576,7 +1576,7 @@ - + @@ -1614,7 +1614,7 @@ - + @@ -1626,7 +1626,7 @@ - + @@ -1664,7 +1664,7 @@ - + @@ -1676,7 +1676,7 @@ - + @@ -1714,7 +1714,7 @@ - + @@ -1726,7 +1726,7 @@ - + @@ -1764,7 +1764,7 @@ - + @@ -1776,7 +1776,7 @@ - + @@ -1814,7 +1814,7 @@ - + @@ -1826,7 +1826,7 @@ - + @@ -1864,7 +1864,7 @@ - + @@ -1876,7 +1876,7 @@ - + diff --git a/etc/iris_tests_results/file_load/u_wind_levels.cml b/etc/iris_tests_results/file_load/u_wind_levels.cml index abf06027e4..37bad3d3a0 100644 --- a/etc/iris_tests_results/file_load/u_wind_levels.cml +++ b/etc/iris_tests_results/file_load/u_wind_levels.cml @@ -14,7 +14,7 @@ - + @@ -27,7 +27,7 @@ - + @@ -65,7 +65,7 @@ - + @@ -78,7 +78,7 @@ - + @@ -116,7 +116,7 @@ - + @@ -129,7 +129,7 @@ - + @@ -167,7 +167,7 @@ - + @@ -180,7 +180,7 @@ - + @@ -218,7 +218,7 @@ - + @@ -231,7 +231,7 @@ - + @@ -269,7 +269,7 @@ - + @@ -282,7 +282,7 @@ - + @@ -320,7 +320,7 @@ - + @@ -333,7 +333,7 @@ - + @@ -371,7 +371,7 @@ - + @@ -384,7 +384,7 @@ - + @@ -422,7 +422,7 @@ - + @@ -435,7 +435,7 @@ - + @@ -473,7 +473,7 @@ - + @@ -486,7 +486,7 @@ - + @@ -524,7 +524,7 @@ - + @@ -537,7 +537,7 @@ - + @@ -575,7 +575,7 @@ - + @@ -588,7 +588,7 @@ - + @@ -626,7 +626,7 @@ - + @@ -639,7 +639,7 @@ - + @@ -677,7 +677,7 @@ - + @@ -690,7 +690,7 @@ - + @@ -728,7 +728,7 @@ - + @@ -741,7 +741,7 @@ - + @@ -779,7 +779,7 @@ - + @@ -792,7 +792,7 @@ - + @@ -830,7 +830,7 @@ - + @@ -843,7 +843,7 @@ - + @@ -881,7 +881,7 @@ - + @@ -894,7 +894,7 @@ - + @@ -932,7 +932,7 @@ - + @@ -945,7 +945,7 @@ - + @@ -983,7 +983,7 @@ - + @@ -996,7 +996,7 @@ - + @@ -1034,7 +1034,7 @@ - + @@ -1047,7 +1047,7 @@ - + @@ -1085,7 +1085,7 @@ - + @@ -1098,7 +1098,7 @@ - + @@ -1136,7 +1136,7 @@ - + @@ -1149,7 +1149,7 @@ - + @@ -1187,7 +1187,7 @@ - + @@ -1200,7 +1200,7 @@ - + @@ -1238,7 +1238,7 @@ - + @@ -1251,7 +1251,7 @@ - + @@ -1289,7 +1289,7 @@ - + @@ -1302,7 +1302,7 @@ - + @@ -1340,7 +1340,7 @@ - + @@ -1353,7 +1353,7 @@ - + @@ -1391,7 +1391,7 @@ - + @@ -1404,7 +1404,7 @@ - + @@ -1442,7 +1442,7 @@ - + @@ -1455,7 +1455,7 @@ - + @@ -1493,7 +1493,7 @@ - + @@ -1506,7 +1506,7 @@ - + @@ -1544,7 +1544,7 @@ - + @@ -1557,7 +1557,7 @@ - + @@ -1595,7 +1595,7 @@ - + @@ -1608,7 +1608,7 @@ - + @@ -1646,7 +1646,7 @@ - + @@ -1659,7 +1659,7 @@ - + @@ -1697,7 +1697,7 @@ - + @@ -1710,7 +1710,7 @@ - + @@ -1748,7 +1748,7 @@ - + @@ -1761,7 +1761,7 @@ - + @@ -1799,7 +1799,7 @@ - + @@ -1812,7 +1812,7 @@ - + @@ -1850,7 +1850,7 @@ - + @@ -1863,7 +1863,7 @@ - + @@ -1901,7 +1901,7 @@ - + @@ -1914,7 +1914,7 @@ - + diff --git a/etc/iris_tests_results/file_load/v_wind_levels.cml b/etc/iris_tests_results/file_load/v_wind_levels.cml index c2171e44b8..910b04d1de 100644 --- a/etc/iris_tests_results/file_load/v_wind_levels.cml +++ b/etc/iris_tests_results/file_load/v_wind_levels.cml @@ -15,7 +15,7 @@ - + @@ -27,7 +27,7 @@ - + @@ -66,7 +66,7 @@ - + @@ -78,7 +78,7 @@ - + @@ -117,7 +117,7 @@ - + @@ -129,7 +129,7 @@ - + @@ -168,7 +168,7 @@ - + @@ -180,7 +180,7 @@ - + @@ -219,7 +219,7 @@ - + @@ -231,7 +231,7 @@ - + @@ -270,7 +270,7 @@ - + @@ -282,7 +282,7 @@ - + @@ -321,7 +321,7 @@ - + @@ -333,7 +333,7 @@ - + @@ -372,7 +372,7 @@ - + @@ -384,7 +384,7 @@ - + @@ -423,7 +423,7 @@ - + @@ -435,7 +435,7 @@ - + @@ -474,7 +474,7 @@ - + @@ -486,7 +486,7 @@ - + @@ -525,7 +525,7 @@ - + @@ -537,7 +537,7 @@ - + @@ -576,7 +576,7 @@ - + @@ -588,7 +588,7 @@ - + @@ -627,7 +627,7 @@ - + @@ -639,7 +639,7 @@ - + @@ -678,7 +678,7 @@ - + @@ -690,7 +690,7 @@ - + @@ -729,7 +729,7 @@ - + @@ -741,7 +741,7 @@ - + @@ -780,7 +780,7 @@ - + @@ -792,7 +792,7 @@ - + @@ -831,7 +831,7 @@ - + @@ -843,7 +843,7 @@ - + @@ -882,7 +882,7 @@ - + @@ -894,7 +894,7 @@ - + @@ -933,7 +933,7 @@ - + @@ -945,7 +945,7 @@ - + @@ -984,7 +984,7 @@ - + @@ -996,7 +996,7 @@ - + @@ -1035,7 +1035,7 @@ - + @@ -1047,7 +1047,7 @@ - + @@ -1086,7 +1086,7 @@ - + @@ -1098,7 +1098,7 @@ - + @@ -1137,7 +1137,7 @@ - + @@ -1149,7 +1149,7 @@ - + @@ -1188,7 +1188,7 @@ - + @@ -1200,7 +1200,7 @@ - + @@ -1239,7 +1239,7 @@ - + @@ -1251,7 +1251,7 @@ - + @@ -1290,7 +1290,7 @@ - + @@ -1302,7 +1302,7 @@ - + @@ -1341,7 +1341,7 @@ - + @@ -1353,7 +1353,7 @@ - + @@ -1392,7 +1392,7 @@ - + @@ -1404,7 +1404,7 @@ - + @@ -1443,7 +1443,7 @@ - + @@ -1455,7 +1455,7 @@ - + @@ -1494,7 +1494,7 @@ - + @@ -1506,7 +1506,7 @@ - + @@ -1545,7 +1545,7 @@ - + @@ -1557,7 +1557,7 @@ - + @@ -1596,7 +1596,7 @@ - + @@ -1608,7 +1608,7 @@ - + @@ -1647,7 +1647,7 @@ - + @@ -1659,7 +1659,7 @@ - + @@ -1698,7 +1698,7 @@ - + @@ -1710,7 +1710,7 @@ - + @@ -1749,7 +1749,7 @@ - + @@ -1761,7 +1761,7 @@ - + @@ -1800,7 +1800,7 @@ - + @@ -1812,7 +1812,7 @@ - + @@ -1851,7 +1851,7 @@ - + @@ -1863,7 +1863,7 @@ - + @@ -1902,7 +1902,7 @@ - + @@ -1914,7 +1914,7 @@ - + diff --git a/etc/iris_tests_results/file_load/wind_levels.cml b/etc/iris_tests_results/file_load/wind_levels.cml index 4d9196abfd..2f28608755 100644 --- a/etc/iris_tests_results/file_load/wind_levels.cml +++ b/etc/iris_tests_results/file_load/wind_levels.cml @@ -14,7 +14,7 @@ - + @@ -27,7 +27,7 @@ - + @@ -65,7 +65,7 @@ - + @@ -78,7 +78,7 @@ - + @@ -116,7 +116,7 @@ - + @@ -129,7 +129,7 @@ - + @@ -167,7 +167,7 @@ - + @@ -180,7 +180,7 @@ - + @@ -218,7 +218,7 @@ - + @@ -231,7 +231,7 @@ - + @@ -269,7 +269,7 @@ - + @@ -282,7 +282,7 @@ - + @@ -320,7 +320,7 @@ - + @@ -333,7 +333,7 @@ - + @@ -371,7 +371,7 @@ - + @@ -384,7 +384,7 @@ - + @@ -422,7 +422,7 @@ - + @@ -435,7 +435,7 @@ - + @@ -473,7 +473,7 @@ - + @@ -486,7 +486,7 @@ - + @@ -524,7 +524,7 @@ - + @@ -537,7 +537,7 @@ - + @@ -575,7 +575,7 @@ - + @@ -588,7 +588,7 @@ - + @@ -626,7 +626,7 @@ - + @@ -639,7 +639,7 @@ - + @@ -677,7 +677,7 @@ - + @@ -690,7 +690,7 @@ - + @@ -728,7 +728,7 @@ - + @@ -741,7 +741,7 @@ - + @@ -779,7 +779,7 @@ - + @@ -792,7 +792,7 @@ - + @@ -830,7 +830,7 @@ - + @@ -843,7 +843,7 @@ - + @@ -881,7 +881,7 @@ - + @@ -894,7 +894,7 @@ - + @@ -932,7 +932,7 @@ - + @@ -945,7 +945,7 @@ - + @@ -983,7 +983,7 @@ - + @@ -996,7 +996,7 @@ - + @@ -1034,7 +1034,7 @@ - + @@ -1047,7 +1047,7 @@ - + @@ -1085,7 +1085,7 @@ - + @@ -1098,7 +1098,7 @@ - + @@ -1136,7 +1136,7 @@ - + @@ -1149,7 +1149,7 @@ - + @@ -1187,7 +1187,7 @@ - + @@ -1200,7 +1200,7 @@ - + @@ -1238,7 +1238,7 @@ - + @@ -1251,7 +1251,7 @@ - + @@ -1289,7 +1289,7 @@ - + @@ -1302,7 +1302,7 @@ - + @@ -1340,7 +1340,7 @@ - + @@ -1353,7 +1353,7 @@ - + @@ -1391,7 +1391,7 @@ - + @@ -1404,7 +1404,7 @@ - + @@ -1442,7 +1442,7 @@ - + @@ -1455,7 +1455,7 @@ - + @@ -1493,7 +1493,7 @@ - + @@ -1506,7 +1506,7 @@ - + @@ -1544,7 +1544,7 @@ - + @@ -1557,7 +1557,7 @@ - + @@ -1595,7 +1595,7 @@ - + @@ -1608,7 +1608,7 @@ - + @@ -1646,7 +1646,7 @@ - + @@ -1659,7 +1659,7 @@ - + @@ -1697,7 +1697,7 @@ - + @@ -1710,7 +1710,7 @@ - + @@ -1748,7 +1748,7 @@ - + @@ -1761,7 +1761,7 @@ - + @@ -1799,7 +1799,7 @@ - + @@ -1812,7 +1812,7 @@ - + @@ -1850,7 +1850,7 @@ - + @@ -1863,7 +1863,7 @@ - + @@ -1901,7 +1901,7 @@ - + @@ -1914,7 +1914,7 @@ - + @@ -1953,7 +1953,7 @@ - + @@ -1965,7 +1965,7 @@ - + @@ -2004,7 +2004,7 @@ - + @@ -2016,7 +2016,7 @@ - + @@ -2055,7 +2055,7 @@ - + @@ -2067,7 +2067,7 @@ - + @@ -2106,7 +2106,7 @@ - + @@ -2118,7 +2118,7 @@ - + @@ -2157,7 +2157,7 @@ - + @@ -2169,7 +2169,7 @@ - + @@ -2208,7 +2208,7 @@ - + @@ -2220,7 +2220,7 @@ - + @@ -2259,7 +2259,7 @@ - + @@ -2271,7 +2271,7 @@ - + @@ -2310,7 +2310,7 @@ - + @@ -2322,7 +2322,7 @@ - + @@ -2361,7 +2361,7 @@ - + @@ -2373,7 +2373,7 @@ - + @@ -2412,7 +2412,7 @@ - + @@ -2424,7 +2424,7 @@ - + @@ -2463,7 +2463,7 @@ - + @@ -2475,7 +2475,7 @@ - + @@ -2514,7 +2514,7 @@ - + @@ -2526,7 +2526,7 @@ - + @@ -2565,7 +2565,7 @@ - + @@ -2577,7 +2577,7 @@ - + @@ -2616,7 +2616,7 @@ - + @@ -2628,7 +2628,7 @@ - + @@ -2667,7 +2667,7 @@ - + @@ -2679,7 +2679,7 @@ - + @@ -2718,7 +2718,7 @@ - + @@ -2730,7 +2730,7 @@ - + @@ -2769,7 +2769,7 @@ - + @@ -2781,7 +2781,7 @@ - + @@ -2820,7 +2820,7 @@ - + @@ -2832,7 +2832,7 @@ - + @@ -2871,7 +2871,7 @@ - + @@ -2883,7 +2883,7 @@ - + @@ -2922,7 +2922,7 @@ - + @@ -2934,7 +2934,7 @@ - + @@ -2973,7 +2973,7 @@ - + @@ -2985,7 +2985,7 @@ - + @@ -3024,7 +3024,7 @@ - + @@ -3036,7 +3036,7 @@ - + @@ -3075,7 +3075,7 @@ - + @@ -3087,7 +3087,7 @@ - + @@ -3126,7 +3126,7 @@ - + @@ -3138,7 +3138,7 @@ - + @@ -3177,7 +3177,7 @@ - + @@ -3189,7 +3189,7 @@ - + @@ -3228,7 +3228,7 @@ - + @@ -3240,7 +3240,7 @@ - + @@ -3279,7 +3279,7 @@ - + @@ -3291,7 +3291,7 @@ - + @@ -3330,7 +3330,7 @@ - + @@ -3342,7 +3342,7 @@ - + @@ -3381,7 +3381,7 @@ - + @@ -3393,7 +3393,7 @@ - + @@ -3432,7 +3432,7 @@ - + @@ -3444,7 +3444,7 @@ - + @@ -3483,7 +3483,7 @@ - + @@ -3495,7 +3495,7 @@ - + @@ -3534,7 +3534,7 @@ - + @@ -3546,7 +3546,7 @@ - + @@ -3585,7 +3585,7 @@ - + @@ -3597,7 +3597,7 @@ - + @@ -3636,7 +3636,7 @@ - + @@ -3648,7 +3648,7 @@ - + @@ -3687,7 +3687,7 @@ - + @@ -3699,7 +3699,7 @@ - + @@ -3738,7 +3738,7 @@ - + @@ -3750,7 +3750,7 @@ - + @@ -3789,7 +3789,7 @@ - + @@ -3801,7 +3801,7 @@ - + @@ -3840,7 +3840,7 @@ - + @@ -3852,7 +3852,7 @@ - + diff --git a/etc/iris_tests_results/grib_load/3_layer.cml b/etc/iris_tests_results/grib_load/3_layer.cml index 25fb8d6838..6cf51d21ad 100644 --- a/etc/iris_tests_results/grib_load/3_layer.cml +++ b/etc/iris_tests_results/grib_load/3_layer.cml @@ -8,13 +8,13 @@ - + - + @@ -55,13 +55,13 @@ -67.499954, -69.999953, -72.499952, -74.999951, -77.49995, -79.999949, -82.499948, -84.999947, -87.499946, -89.999945]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> - + - + @@ -89,13 +89,13 @@ - + - + diff --git a/etc/iris_tests_results/grib_load/earth_shape_0.cml b/etc/iris_tests_results/grib_load/earth_shape_0.cml index c4bf60b336..5480fe0474 100644 --- a/etc/iris_tests_results/grib_load/earth_shape_0.cml +++ b/etc/iris_tests_results/grib_load/earth_shape_0.cml @@ -25,13 +25,13 @@ -67.499954, -69.999953, -72.499952, -74.999951, -77.49995, -79.999949, -82.499948, -84.999947, -87.499946, -89.999945]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> - + - + diff --git a/etc/iris_tests_results/grib_load/earth_shape_1.cml b/etc/iris_tests_results/grib_load/earth_shape_1.cml index 7b5a7888fd..8250c0493b 100644 --- a/etc/iris_tests_results/grib_load/earth_shape_1.cml +++ b/etc/iris_tests_results/grib_load/earth_shape_1.cml @@ -25,13 +25,13 @@ -67.499954, -69.999953, -72.499952, -74.999951, -77.49995, -79.999949, -82.499948, -84.999947, -87.499946, -89.999945]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> - + - + diff --git a/etc/iris_tests_results/grib_load/earth_shape_2.cml b/etc/iris_tests_results/grib_load/earth_shape_2.cml index c14ce00bbe..8179c13e8f 100644 --- a/etc/iris_tests_results/grib_load/earth_shape_2.cml +++ b/etc/iris_tests_results/grib_load/earth_shape_2.cml @@ -25,13 +25,13 @@ -67.499954, -69.999953, -72.499952, -74.999951, -77.49995, -79.999949, -82.499948, -84.999947, -87.499946, -89.999945]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> - + - + diff --git a/etc/iris_tests_results/grib_load/earth_shape_3.cml b/etc/iris_tests_results/grib_load/earth_shape_3.cml index ef01d40df8..30fe3856ac 100644 --- a/etc/iris_tests_results/grib_load/earth_shape_3.cml +++ b/etc/iris_tests_results/grib_load/earth_shape_3.cml @@ -25,13 +25,13 @@ -67.499954, -69.999953, -72.499952, -74.999951, -77.49995, -79.999949, -82.499948, -84.999947, -87.499946, -89.999945]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> - + - + diff --git a/etc/iris_tests_results/grib_load/earth_shape_4.cml b/etc/iris_tests_results/grib_load/earth_shape_4.cml index 31447a26e6..e010728049 100644 --- a/etc/iris_tests_results/grib_load/earth_shape_4.cml +++ b/etc/iris_tests_results/grib_load/earth_shape_4.cml @@ -25,13 +25,13 @@ -67.499954, -69.999953, -72.499952, -74.999951, -77.49995, -79.999949, -82.499948, -84.999947, -87.499946, -89.999945]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> - + - + diff --git a/etc/iris_tests_results/grib_load/earth_shape_5.cml b/etc/iris_tests_results/grib_load/earth_shape_5.cml index 2acf184f3a..06ddbfc0bb 100644 --- a/etc/iris_tests_results/grib_load/earth_shape_5.cml +++ b/etc/iris_tests_results/grib_load/earth_shape_5.cml @@ -25,13 +25,13 @@ -67.499954, -69.999953, -72.499952, -74.999951, -77.49995, -79.999949, -82.499948, -84.999947, -87.499946, -89.999945]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> - + - + diff --git a/etc/iris_tests_results/grib_load/earth_shape_6.cml b/etc/iris_tests_results/grib_load/earth_shape_6.cml index 064ecfb579..344197ffb4 100644 --- a/etc/iris_tests_results/grib_load/earth_shape_6.cml +++ b/etc/iris_tests_results/grib_load/earth_shape_6.cml @@ -25,13 +25,13 @@ -67.499954, -69.999953, -72.499952, -74.999951, -77.49995, -79.999949, -82.499948, -84.999947, -87.499946, -89.999945]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> - + - + diff --git a/etc/iris_tests_results/grib_load/earth_shape_7.cml b/etc/iris_tests_results/grib_load/earth_shape_7.cml index c1c652eb5a..69d9d4bbf1 100644 --- a/etc/iris_tests_results/grib_load/earth_shape_7.cml +++ b/etc/iris_tests_results/grib_load/earth_shape_7.cml @@ -25,13 +25,13 @@ -67.499954, -69.999953, -72.499952, -74.999951, -77.49995, -79.999949, -82.499948, -84.999947, -87.499946, -89.999945]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> - + - + diff --git a/etc/iris_tests_results/grib_load/earth_shape_grib1.cml b/etc/iris_tests_results/grib_load/earth_shape_grib1.cml index 741580acb4..21b4bbc43d 100644 --- a/etc/iris_tests_results/grib_load/earth_shape_grib1.cml +++ b/etc/iris_tests_results/grib_load/earth_shape_grib1.cml @@ -7,13 +7,13 @@ - + - + diff --git a/etc/iris_tests_results/grib_load/ineg_jneg.cml b/etc/iris_tests_results/grib_load/ineg_jneg.cml index c5b0b3560c..e2c0c60d57 100644 --- a/etc/iris_tests_results/grib_load/ineg_jneg.cml +++ b/etc/iris_tests_results/grib_load/ineg_jneg.cml @@ -25,13 +25,13 @@ -67.499954, -69.999953, -72.499952, -74.999951, -77.49995, -79.999949, -82.499948, -84.999947, -87.499946, -89.999945]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> - + - + diff --git a/etc/iris_tests_results/grib_load/ineg_jpos.cml b/etc/iris_tests_results/grib_load/ineg_jpos.cml index f91fe61c99..d35cbc1ed4 100644 --- a/etc/iris_tests_results/grib_load/ineg_jpos.cml +++ b/etc/iris_tests_results/grib_load/ineg_jpos.cml @@ -25,13 +25,13 @@ 69.999998, 72.499997, 74.999996, 77.499995, 79.999994, 82.499993, 84.999992, 87.499991, 89.99999]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> - + - + diff --git a/etc/iris_tests_results/grib_load/ipos_jneg.cml b/etc/iris_tests_results/grib_load/ipos_jneg.cml index c4bf60b336..5480fe0474 100644 --- a/etc/iris_tests_results/grib_load/ipos_jneg.cml +++ b/etc/iris_tests_results/grib_load/ipos_jneg.cml @@ -25,13 +25,13 @@ -67.499954, -69.999953, -72.499952, -74.999951, -77.49995, -79.999949, -82.499948, -84.999947, -87.499946, -89.999945]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> - + - + diff --git a/etc/iris_tests_results/grib_load/ipos_jpos.cml b/etc/iris_tests_results/grib_load/ipos_jpos.cml index 00ce00dd5b..5cc5853d46 100644 --- a/etc/iris_tests_results/grib_load/ipos_jpos.cml +++ b/etc/iris_tests_results/grib_load/ipos_jpos.cml @@ -25,13 +25,13 @@ 69.999998, 72.499997, 74.999996, 77.499995, 79.999994, 82.499993, 84.999992, 87.499991, 89.99999]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> - + - + diff --git a/etc/iris_tests_results/grib_load/rotated.cml b/etc/iris_tests_results/grib_load/rotated.cml index d67dd343b2..587914c220 100644 --- a/etc/iris_tests_results/grib_load/rotated.cml +++ b/etc/iris_tests_results/grib_load/rotated.cml @@ -7,12 +7,12 @@ - + - + diff --git a/etc/iris_tests_results/grib_load/time_bound.cml b/etc/iris_tests_results/grib_load/time_bound.cml index c4bf60b336..5480fe0474 100644 --- a/etc/iris_tests_results/grib_load/time_bound.cml +++ b/etc/iris_tests_results/grib_load/time_bound.cml @@ -25,13 +25,13 @@ -67.499954, -69.999953, -72.499952, -74.999951, -77.49995, -79.999949, -82.499948, -84.999947, -87.499946, -89.999945]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> - + - + diff --git a/etc/iris_tests_results/grib_load/y_fastest.cml b/etc/iris_tests_results/grib_load/y_fastest.cml index 516affae51..6337d55ac1 100644 --- a/etc/iris_tests_results/grib_load/y_fastest.cml +++ b/etc/iris_tests_results/grib_load/y_fastest.cml @@ -25,13 +25,13 @@ -67.499954, -69.999953, -72.499952, -74.999951, -77.49995, -79.999949, -82.499948, -84.999947, -87.499946, -89.999945]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> - + - + diff --git a/etc/iris_tests_results/merge/dec.cml b/etc/iris_tests_results/merge/dec.cml index a304a52226..99026a368e 100644 --- a/etc/iris_tests_results/merge/dec.cml +++ b/etc/iris_tests_results/merge/dec.cml @@ -14,7 +14,7 @@ - + @@ -69,7 +69,7 @@ - + @@ -153,7 +153,7 @@ - + @@ -209,7 +209,7 @@ - + @@ -294,7 +294,7 @@ - + @@ -349,7 +349,7 @@ - + @@ -433,7 +433,7 @@ - + @@ -488,7 +488,7 @@ - + diff --git a/etc/iris_tests_results/merge/theta.cml b/etc/iris_tests_results/merge/theta.cml index 353facb5e1..14d5030cad 100644 --- a/etc/iris_tests_results/merge/theta.cml +++ b/etc/iris_tests_results/merge/theta.cml @@ -14,7 +14,7 @@ - + @@ -69,7 +69,7 @@ - + diff --git a/etc/iris_tests_results/merge/theta_two_forecast_periods.cml b/etc/iris_tests_results/merge/theta_two_forecast_periods.cml index 23c7fdcc81..4d53255e17 100644 --- a/etc/iris_tests_results/merge/theta_two_forecast_periods.cml +++ b/etc/iris_tests_results/merge/theta_two_forecast_periods.cml @@ -406,7 +406,7 @@ [0.35145, 0.36495], [0.36495, 0.37845]]" id="25a5f42bc937b908" points="[-0.5274, -0.5139, -0.5004, ..., 0.3447, 0.3582, 0.3717]" shape="(412,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + @@ -418,7 +418,7 @@ [360.059, 360.072], [360.072, 360.086]]" id="3bf28623a9db078e" points="[359.18, 359.194, 359.207, ..., 360.052, 360.066, 360.079]" shape="(412,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/netcdf/netcdf_cell_methods.cml b/etc/iris_tests_results/netcdf/netcdf_cell_methods.cml index b29c0545fb..bdf12fa919 100644 --- a/etc/iris_tests_results/netcdf/netcdf_cell_methods.cml +++ b/etc/iris_tests_results/netcdf/netcdf_cell_methods.cml @@ -4,12 +4,12 @@ - + - + @@ -28,12 +28,12 @@ - + - + @@ -53,12 +53,12 @@ - + - + @@ -82,12 +82,12 @@ - + - + @@ -109,12 +109,12 @@ - + - + @@ -136,12 +136,12 @@ - + - + @@ -159,12 +159,12 @@ - + - + @@ -182,12 +182,12 @@ - + - + @@ -206,12 +206,12 @@ - + - + @@ -230,12 +230,12 @@ - + - + @@ -257,12 +257,12 @@ - + - + @@ -280,12 +280,12 @@ - + - + @@ -304,12 +304,12 @@ - + - + @@ -328,12 +328,12 @@ - + - + @@ -355,12 +355,12 @@ - + - + @@ -449,12 +449,12 @@ - + - + @@ -472,12 +472,12 @@ - + - + @@ -496,12 +496,12 @@ - + - + diff --git a/etc/iris_tests_results/netcdf/netcdf_deferred_index_0.cml b/etc/iris_tests_results/netcdf/netcdf_deferred_index_0.cml index d3ee16fe94..3400a8c39e 100644 --- a/etc/iris_tests_results/netcdf/netcdf_deferred_index_0.cml +++ b/etc/iris_tests_results/netcdf/netcdf_deferred_index_0.cml @@ -9,12 +9,12 @@ - + - + diff --git a/etc/iris_tests_results/netcdf/netcdf_deferred_index_1.cml b/etc/iris_tests_results/netcdf/netcdf_deferred_index_1.cml index 4f6a0c252f..4db9ac1e2c 100644 --- a/etc/iris_tests_results/netcdf/netcdf_deferred_index_1.cml +++ b/etc/iris_tests_results/netcdf/netcdf_deferred_index_1.cml @@ -9,12 +9,12 @@ - + - + diff --git a/etc/iris_tests_results/netcdf/netcdf_deferred_index_2.cml b/etc/iris_tests_results/netcdf/netcdf_deferred_index_2.cml index 05b8b95bc5..626110b24b 100644 --- a/etc/iris_tests_results/netcdf/netcdf_deferred_index_2.cml +++ b/etc/iris_tests_results/netcdf/netcdf_deferred_index_2.cml @@ -9,12 +9,12 @@ - + - + diff --git a/etc/iris_tests_results/netcdf/netcdf_deferred_mix_0.cml b/etc/iris_tests_results/netcdf/netcdf_deferred_mix_0.cml index 191b76a9dd..14348b7d0d 100644 --- a/etc/iris_tests_results/netcdf/netcdf_deferred_mix_0.cml +++ b/etc/iris_tests_results/netcdf/netcdf_deferred_mix_0.cml @@ -9,12 +9,12 @@ - + - + diff --git a/etc/iris_tests_results/netcdf/netcdf_deferred_mix_1.cml b/etc/iris_tests_results/netcdf/netcdf_deferred_mix_1.cml index 51b45085a1..e95fb19835 100644 --- a/etc/iris_tests_results/netcdf/netcdf_deferred_mix_1.cml +++ b/etc/iris_tests_results/netcdf/netcdf_deferred_mix_1.cml @@ -9,12 +9,12 @@ - + - + diff --git a/etc/iris_tests_results/netcdf/netcdf_deferred_slice_0.cml b/etc/iris_tests_results/netcdf/netcdf_deferred_slice_0.cml index d9fbb79029..ed95b0866a 100644 --- a/etc/iris_tests_results/netcdf/netcdf_deferred_slice_0.cml +++ b/etc/iris_tests_results/netcdf/netcdf_deferred_slice_0.cml @@ -9,12 +9,12 @@ - + - + diff --git a/etc/iris_tests_results/netcdf/netcdf_deferred_slice_1.cml b/etc/iris_tests_results/netcdf/netcdf_deferred_slice_1.cml index f8299eee1b..d71ba808d2 100644 --- a/etc/iris_tests_results/netcdf/netcdf_deferred_slice_1.cml +++ b/etc/iris_tests_results/netcdf/netcdf_deferred_slice_1.cml @@ -9,12 +9,12 @@ - + - + diff --git a/etc/iris_tests_results/netcdf/netcdf_deferred_slice_2.cml b/etc/iris_tests_results/netcdf/netcdf_deferred_slice_2.cml index c0ffcb44d9..df73f3355f 100644 --- a/etc/iris_tests_results/netcdf/netcdf_deferred_slice_2.cml +++ b/etc/iris_tests_results/netcdf/netcdf_deferred_slice_2.cml @@ -9,12 +9,12 @@ - + - + diff --git a/etc/iris_tests_results/netcdf/netcdf_deferred_tuple_0.cml b/etc/iris_tests_results/netcdf/netcdf_deferred_tuple_0.cml index 56ffa1dd05..289f643114 100644 --- a/etc/iris_tests_results/netcdf/netcdf_deferred_tuple_0.cml +++ b/etc/iris_tests_results/netcdf/netcdf_deferred_tuple_0.cml @@ -9,12 +9,12 @@ - + - + diff --git a/etc/iris_tests_results/netcdf/netcdf_deferred_tuple_1.cml b/etc/iris_tests_results/netcdf/netcdf_deferred_tuple_1.cml index 6f1b303679..fd98a49b25 100644 --- a/etc/iris_tests_results/netcdf/netcdf_deferred_tuple_1.cml +++ b/etc/iris_tests_results/netcdf/netcdf_deferred_tuple_1.cml @@ -9,12 +9,12 @@ - + - + diff --git a/etc/iris_tests_results/netcdf/netcdf_deferred_tuple_2.cml b/etc/iris_tests_results/netcdf/netcdf_deferred_tuple_2.cml index facfb47ffa..93377e9608 100644 --- a/etc/iris_tests_results/netcdf/netcdf_deferred_tuple_2.cml +++ b/etc/iris_tests_results/netcdf/netcdf_deferred_tuple_2.cml @@ -9,12 +9,12 @@ - + - + diff --git a/etc/iris_tests_results/netcdf/netcdf_global_xyt_hires.cml b/etc/iris_tests_results/netcdf/netcdf_global_xyt_hires.cml index 5d5c8292d3..81b12ec7dc 100644 --- a/etc/iris_tests_results/netcdf/netcdf_global_xyt_hires.cml +++ b/etc/iris_tests_results/netcdf/netcdf_global_xyt_hires.cml @@ -31,7 +31,7 @@ [87.4911905887, 88.6247285576], [88.6247285576, 90.0]]" id="95f615fae348902" long_name="latitude" points="[-89.1415194265, -88.029428868, -86.9107708141, ..., 86.9107708141, 88.029428868, 89.1415194265]" shape="(160,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> - + @@ -42,7 +42,7 @@ [356.0625, 357.1875], [357.1875, 358.3125], [358.3125, 359.4375]]" id="3207b04384adbdec" long_name="longitude" points="[0.0, 1.125, 2.25, ..., 356.625, 357.75, 358.875]" shape="(320,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"> - + diff --git a/etc/iris_tests_results/netcdf/netcdf_global_xyt_total.cml b/etc/iris_tests_results/netcdf/netcdf_global_xyt_total.cml index 288b124b86..38fbea6592 100644 --- a/etc/iris_tests_results/netcdf/netcdf_global_xyt_total.cml +++ b/etc/iris_tests_results/netcdf/netcdf_global_xyt_total.cml @@ -9,12 +9,12 @@ - + - + diff --git a/etc/iris_tests_results/netcdf/netcdf_global_xyzt_gems.cml b/etc/iris_tests_results/netcdf/netcdf_global_xyzt_gems.cml index 5c9d9c1bcf..bbda8be1c7 100644 --- a/etc/iris_tests_results/netcdf/netcdf_global_xyzt_gems.cml +++ b/etc/iris_tests_results/netcdf/netcdf_global_xyzt_gems.cml @@ -8,12 +8,12 @@ - + - + @@ -38,12 +38,12 @@ - + - + diff --git a/etc/iris_tests_results/netcdf/netcdf_global_xyzt_gems_iter_0.cml b/etc/iris_tests_results/netcdf/netcdf_global_xyzt_gems_iter_0.cml index fb9d84d606..bf0238a9bf 100644 --- a/etc/iris_tests_results/netcdf/netcdf_global_xyzt_gems_iter_0.cml +++ b/etc/iris_tests_results/netcdf/netcdf_global_xyzt_gems_iter_0.cml @@ -8,12 +8,12 @@ - + - + diff --git a/etc/iris_tests_results/netcdf/netcdf_global_xyzt_gems_iter_1.cml b/etc/iris_tests_results/netcdf/netcdf_global_xyzt_gems_iter_1.cml index 06f147b9c9..167782cf7f 100644 --- a/etc/iris_tests_results/netcdf/netcdf_global_xyzt_gems_iter_1.cml +++ b/etc/iris_tests_results/netcdf/netcdf_global_xyzt_gems_iter_1.cml @@ -8,12 +8,12 @@ - + - + diff --git a/etc/iris_tests_results/netcdf/netcdf_rotated_xy_land.cml b/etc/iris_tests_results/netcdf/netcdf_rotated_xy_land.cml index 77671baf29..932bffe1ab 100644 --- a/etc/iris_tests_results/netcdf/netcdf_rotated_xy_land.cml +++ b/etc/iris_tests_results/netcdf/netcdf_rotated_xy_land.cml @@ -14,7 +14,7 @@ - + @@ -32,7 +32,7 @@ 9.19, 9.63, 10.07, 10.51, 10.95, 11.39, 11.83, 12.27, 12.71, 13.15, 13.59, 14.03, 14.47, 14.91, 15.35]" shape="(85,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/netcdf/netcdf_rotated_xyt_precipitation.cml b/etc/iris_tests_results/netcdf/netcdf_rotated_xyt_precipitation.cml index c351415790..fa3d7f502d 100644 --- a/etc/iris_tests_results/netcdf/netcdf_rotated_xyt_precipitation.cml +++ b/etc/iris_tests_results/netcdf/netcdf_rotated_xyt_precipitation.cml @@ -10,12 +10,12 @@ - + - + diff --git a/etc/iris_tests_results/netcdf/netcdf_save_hybrid_height.cdl b/etc/iris_tests_results/netcdf/netcdf_save_hybrid_height.cdl index 060dc036c9..6e94ae7d6d 100644 --- a/etc/iris_tests_results/netcdf/netcdf_save_hybrid_height.cdl +++ b/etc/iris_tests_results/netcdf/netcdf_save_hybrid_height.cdl @@ -17,8 +17,8 @@ variables: rotated_latitude_longitude:longitude_of_prime_meridian = 0. ; rotated_latitude_longitude:semi_major_axis = 6371229. ; rotated_latitude_longitude:semi_minor_axis = 6371229. ; - rotated_latitude_longitude:grid_north_pole_latitude = 37.5f ; - rotated_latitude_longitude:grid_north_pole_longitude = 177.5f ; + rotated_latitude_longitude:grid_north_pole_latitude = 37.5 ; + rotated_latitude_longitude:grid_north_pole_longitude = 177.5 ; rotated_latitude_longitude:north_pole_grid_longitude = 0. ; double time(time) ; time:axis = "T" ; diff --git a/etc/iris_tests_results/netcdf/netcdf_save_load_hybrid_height.cml b/etc/iris_tests_results/netcdf/netcdf_save_load_hybrid_height.cml index 074e7725f4..c92d536ffc 100644 --- a/etc/iris_tests_results/netcdf/netcdf_save_load_hybrid_height.cml +++ b/etc/iris_tests_results/netcdf/netcdf_save_load_hybrid_height.cml @@ -430,7 +430,7 @@ [0.35145, 0.36495], [0.36495, 0.37845]]" id="25a5f42bc937b908" points="[-0.5274, -0.5139, -0.5004, ..., 0.3447, 0.3582, 0.3717]" shape="(412,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + @@ -442,7 +442,7 @@ [360.059, 360.072], [360.072, 360.086]]" id="3bf28623a9db078e" points="[359.18, 359.194, 359.207, ..., 360.052, 360.066, 360.079]" shape="(412,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/netcdf/netcdf_save_load_ndim_auxiliary.cml b/etc/iris_tests_results/netcdf/netcdf_save_load_ndim_auxiliary.cml index 3f1edddbb4..99ec48ce85 100644 --- a/etc/iris_tests_results/netcdf/netcdf_save_load_ndim_auxiliary.cml +++ b/etc/iris_tests_results/netcdf/netcdf_save_load_ndim_auxiliary.cml @@ -10,12 +10,12 @@ - + - + diff --git a/etc/iris_tests_results/netcdf/netcdf_save_ndim_auxiliary.cdl b/etc/iris_tests_results/netcdf/netcdf_save_ndim_auxiliary.cdl index 28d8729a83..973ee65271 100644 --- a/etc/iris_tests_results/netcdf/netcdf_save_ndim_auxiliary.cdl +++ b/etc/iris_tests_results/netcdf/netcdf_save_ndim_auxiliary.cdl @@ -16,11 +16,8 @@ variables: precipitation_flux:coordinates = "latitude longitude" ; int rotated_latitude_longitude ; rotated_latitude_longitude:grid_mapping_name = "rotated_latitude_longitude" ; - rotated_latitude_longitude:longitude_of_prime_meridian = 0. ; - rotated_latitude_longitude:semi_major_axis = 6371229. ; - rotated_latitude_longitude:semi_minor_axis = 6371229. ; - rotated_latitude_longitude:grid_north_pole_latitude = 18.f ; - rotated_latitude_longitude:grid_north_pole_longitude = -140.75f ; + rotated_latitude_longitude:grid_north_pole_latitude = 18. ; + rotated_latitude_longitude:grid_north_pole_longitude = -140.75 ; rotated_latitude_longitude:north_pole_grid_longitude = 0. ; float time(time) ; time:axis = "T" ; diff --git a/etc/iris_tests_results/pp_rules/global.cml b/etc/iris_tests_results/pp_rules/global.cml index 2641a9e1d6..d740082153 100644 --- a/etc/iris_tests_results/pp_rules/global.cml +++ b/etc/iris_tests_results/pp_rules/global.cml @@ -22,12 +22,12 @@ -62.4999, -64.9999, -67.4999, -69.9999, -72.4999, -74.9999, -77.4999, -79.9999, -82.4999, -84.9999, -87.4999, -89.9999]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/pp_rules/lbproc_mean_max_min.cml b/etc/iris_tests_results/pp_rules/lbproc_mean_max_min.cml index 2eef13d974..036cd10675 100644 --- a/etc/iris_tests_results/pp_rules/lbproc_mean_max_min.cml +++ b/etc/iris_tests_results/pp_rules/lbproc_mean_max_min.cml @@ -18,12 +18,12 @@ - + - + @@ -54,12 +54,12 @@ - + - + @@ -94,12 +94,12 @@ - + - + @@ -134,12 +134,12 @@ - + - + @@ -164,12 +164,12 @@ - + - + diff --git a/etc/iris_tests_results/pp_rules/rotated_uk.cml b/etc/iris_tests_results/pp_rules/rotated_uk.cml index c0ad56add8..39bfa20afd 100644 --- a/etc/iris_tests_results/pp_rules/rotated_uk.cml +++ b/etc/iris_tests_results/pp_rules/rotated_uk.cml @@ -11,13 +11,13 @@ - + - + diff --git a/etc/iris_tests_results/regrid/bilinear_larger.cml b/etc/iris_tests_results/regrid/bilinear_larger.cml index c26e440dda..bc134acf2f 100644 --- a/etc/iris_tests_results/regrid/bilinear_larger.cml +++ b/etc/iris_tests_results/regrid/bilinear_larger.cml @@ -4,12 +4,12 @@ - + - + diff --git a/etc/iris_tests_results/regrid/bilinear_larger_lon_extrapolate_left.cml b/etc/iris_tests_results/regrid/bilinear_larger_lon_extrapolate_left.cml index 671dd98687..2bcea40b7d 100644 --- a/etc/iris_tests_results/regrid/bilinear_larger_lon_extrapolate_left.cml +++ b/etc/iris_tests_results/regrid/bilinear_larger_lon_extrapolate_left.cml @@ -4,12 +4,12 @@ - + - + diff --git a/etc/iris_tests_results/regrid/bilinear_larger_lon_extrapolate_right.cml b/etc/iris_tests_results/regrid/bilinear_larger_lon_extrapolate_right.cml index 870e65492c..2ddc5cead2 100644 --- a/etc/iris_tests_results/regrid/bilinear_larger_lon_extrapolate_right.cml +++ b/etc/iris_tests_results/regrid/bilinear_larger_lon_extrapolate_right.cml @@ -4,12 +4,12 @@ - + - + diff --git a/etc/iris_tests_results/regrid/bilinear_smaller.cml b/etc/iris_tests_results/regrid/bilinear_smaller.cml index e50cae7fbc..f797e74063 100644 --- a/etc/iris_tests_results/regrid/bilinear_smaller.cml +++ b/etc/iris_tests_results/regrid/bilinear_smaller.cml @@ -4,12 +4,12 @@ - + - + diff --git a/etc/iris_tests_results/regrid/bilinear_smaller_lon_align_left.cml b/etc/iris_tests_results/regrid/bilinear_smaller_lon_align_left.cml index 38aee43e86..9ce0e4f1c1 100644 --- a/etc/iris_tests_results/regrid/bilinear_smaller_lon_align_left.cml +++ b/etc/iris_tests_results/regrid/bilinear_smaller_lon_align_left.cml @@ -4,12 +4,12 @@ - + - + diff --git a/etc/iris_tests_results/regrid/bilinear_smaller_lon_align_right.cml b/etc/iris_tests_results/regrid/bilinear_smaller_lon_align_right.cml index d29f545b1a..829d10acd6 100644 --- a/etc/iris_tests_results/regrid/bilinear_smaller_lon_align_right.cml +++ b/etc/iris_tests_results/regrid/bilinear_smaller_lon_align_right.cml @@ -4,12 +4,12 @@ - + - + diff --git a/etc/iris_tests_results/regrid/low_med_high.cml b/etc/iris_tests_results/regrid/low_med_high.cml index 6ea0f5df17..bf37c6c6e5 100644 --- a/etc/iris_tests_results/regrid/low_med_high.cml +++ b/etc/iris_tests_results/regrid/low_med_high.cml @@ -4,12 +4,12 @@ - + - + @@ -20,12 +20,12 @@ - + - + @@ -36,12 +36,12 @@ - + - + diff --git a/etc/iris_tests_results/regrid/theta_on_uwind_0d.cml b/etc/iris_tests_results/regrid/theta_on_uwind_0d.cml index f0ec9b6cb6..55d0733630 100644 --- a/etc/iris_tests_results/regrid/theta_on_uwind_0d.cml +++ b/etc/iris_tests_results/regrid/theta_on_uwind_0d.cml @@ -11,12 +11,12 @@ - + - + diff --git a/etc/iris_tests_results/regrid/theta_on_uwind_1d.cml b/etc/iris_tests_results/regrid/theta_on_uwind_1d.cml index cf56770fcd..7feca448ba 100644 --- a/etc/iris_tests_results/regrid/theta_on_uwind_1d.cml +++ b/etc/iris_tests_results/regrid/theta_on_uwind_1d.cml @@ -11,7 +11,7 @@ - + @@ -19,7 +19,7 @@ [359.194, 359.207], [359.207, 359.22], [359.22, 359.234]]" id="3bf28623a9db078e" points="[359.187, 359.2, 359.214, 359.227]" shape="(4,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/regrid/theta_on_uwind_2d.cml b/etc/iris_tests_results/regrid/theta_on_uwind_2d.cml index 81e9fe5d67..4bdddd7af7 100644 --- a/etc/iris_tests_results/regrid/theta_on_uwind_2d.cml +++ b/etc/iris_tests_results/regrid/theta_on_uwind_2d.cml @@ -14,7 +14,7 @@ [-0.52065, -0.50715], [-0.50715, -0.49365], [-0.49365, -0.48015]]" id="25a5f42bc937b908" points="[-0.5274, -0.5139, -0.5004, -0.4869]" shape="(4,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + @@ -22,7 +22,7 @@ [359.194, 359.207], [359.207, 359.22], [359.22, 359.234]]" id="3bf28623a9db078e" points="[359.187, 359.2, 359.214, 359.227]" shape="(4,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/regrid/theta_on_uwind_3d.cml b/etc/iris_tests_results/regrid/theta_on_uwind_3d.cml index 3646b061b8..22ed9a447c 100644 --- a/etc/iris_tests_results/regrid/theta_on_uwind_3d.cml +++ b/etc/iris_tests_results/regrid/theta_on_uwind_3d.cml @@ -14,7 +14,7 @@ [-0.52065, -0.50715], [-0.50715, -0.49365], [-0.49365, -0.48015]]" id="25a5f42bc937b908" points="[-0.5274, -0.5139, -0.5004, -0.4869]" shape="(4,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + @@ -22,7 +22,7 @@ [359.194, 359.207], [359.207, 359.22], [359.22, 359.234]]" id="3bf28623a9db078e" points="[359.187, 359.2, 359.214, 359.227]" shape="(4,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/regrid/uwind_on_theta_0d.cml b/etc/iris_tests_results/regrid/uwind_on_theta_0d.cml index 25ddd25e27..4934f51877 100644 --- a/etc/iris_tests_results/regrid/uwind_on_theta_0d.cml +++ b/etc/iris_tests_results/regrid/uwind_on_theta_0d.cml @@ -11,12 +11,12 @@ - + - + diff --git a/etc/iris_tests_results/regrid/uwind_on_theta_1d.cml b/etc/iris_tests_results/regrid/uwind_on_theta_1d.cml index 7893a09b86..faae6aa915 100644 --- a/etc/iris_tests_results/regrid/uwind_on_theta_1d.cml +++ b/etc/iris_tests_results/regrid/uwind_on_theta_1d.cml @@ -11,14 +11,14 @@ - + - + diff --git a/etc/iris_tests_results/regrid/uwind_on_theta_2d.cml b/etc/iris_tests_results/regrid/uwind_on_theta_2d.cml index 876a4ae5d0..3abed2dbc3 100644 --- a/etc/iris_tests_results/regrid/uwind_on_theta_2d.cml +++ b/etc/iris_tests_results/regrid/uwind_on_theta_2d.cml @@ -12,14 +12,14 @@ - + - + diff --git a/etc/iris_tests_results/regrid/uwind_on_theta_3d.cml b/etc/iris_tests_results/regrid/uwind_on_theta_3d.cml index 479f346e5f..8bdf955f9e 100644 --- a/etc/iris_tests_results/regrid/uwind_on_theta_3d.cml +++ b/etc/iris_tests_results/regrid/uwind_on_theta_3d.cml @@ -12,14 +12,14 @@ - + - + diff --git a/etc/iris_tests_results/stock/realistic_4d.cml b/etc/iris_tests_results/stock/realistic_4d.cml index 6c0f487ec1..3109be6e99 100644 --- a/etc/iris_tests_results/stock/realistic_4d.cml +++ b/etc/iris_tests_results/stock/realistic_4d.cml @@ -405,7 +405,7 @@ [-0.04005, -0.03915], [-0.03915, -0.03825]]" id="25a5f42bc937b908" points="[-0.1278, -0.1269, -0.126, ..., -0.0405, -0.0396, -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + @@ -417,7 +417,7 @@ [359.667, 359.668], [359.668, 359.669]]" id="3bf28623a9db078e" points="[359.58, 359.581, 359.581, ..., 359.667, 359.668, 359.669]" shape="(100,)" standard_name="grid_longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/system/supported_filetype_.grib2.cml b/etc/iris_tests_results/system/supported_filetype_.grib2.cml index 702b175542..30c90319d6 100644 --- a/etc/iris_tests_results/system/supported_filetype_.grib2.cml +++ b/etc/iris_tests_results/system/supported_filetype_.grib2.cml @@ -14,7 +14,7 @@ 41.0, 42.0, 43.0, 44.0, 45.0, 46.0, 47.0, 48.0, 49.0, 50.0, 51.0, 52.0, 53.0, 54.0, 55.0, 56.0, 57.0, 58.0, 59.0]" shape="(60,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> - + @@ -26,7 +26,7 @@ 70.0, 71.0, 72.0, 73.0, 74.0, 75.0, 76.0, 77.0, 78.0, 79.0, 80.0, 81.0, 82.0, 83.0, 84.0, 85.0, 86.0, 87.0, 88.0, 89.0]" shape="(60,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"> - + diff --git a/etc/iris_tests_results/system/supported_filetype_.nc.cml b/etc/iris_tests_results/system/supported_filetype_.nc.cml index a1c68a0252..b0d0f4d310 100644 --- a/etc/iris_tests_results/system/supported_filetype_.nc.cml +++ b/etc/iris_tests_results/system/supported_filetype_.nc.cml @@ -17,7 +17,7 @@ 41.0, 42.0, 43.0, 44.0, 45.0, 46.0, 47.0, 48.0, 49.0, 50.0, 51.0, 52.0, 53.0, 54.0, 55.0, 56.0, 57.0, 58.0, 59.0]" shape="(60,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> - + @@ -29,7 +29,7 @@ 70.0, 71.0, 72.0, 73.0, 74.0, 75.0, 76.0, 77.0, 78.0, 79.0, 80.0, 81.0, 82.0, 83.0, 84.0, 85.0, 86.0, 87.0, 88.0, 89.0]" shape="(60,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"> - + diff --git a/etc/iris_tests_results/system/supported_filetype_.pp.cml b/etc/iris_tests_results/system/supported_filetype_.pp.cml index 14b08149ce..937b165780 100644 --- a/etc/iris_tests_results/system/supported_filetype_.pp.cml +++ b/etc/iris_tests_results/system/supported_filetype_.pp.cml @@ -14,7 +14,7 @@ 41.0, 42.0, 43.0, 44.0, 45.0, 46.0, 47.0, 48.0, 49.0, 50.0, 51.0, 52.0, 53.0, 54.0, 55.0, 56.0, 57.0, 58.0, 59.0]" shape="(60,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + @@ -26,7 +26,7 @@ 70.0, 71.0, 72.0, 73.0, 74.0, 75.0, 76.0, 77.0, 78.0, 79.0, 80.0, 81.0, 82.0, 83.0, 84.0, 85.0, 86.0, 87.0, 88.0, 89.0]" shape="(60,)" standard_name="longitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/trajectory/big_cube.cml b/etc/iris_tests_results/trajectory/big_cube.cml index a0584fc01a..b70252811d 100644 --- a/etc/iris_tests_results/trajectory/big_cube.cml +++ b/etc/iris_tests_results/trajectory/big_cube.cml @@ -12,13 +12,13 @@ - + - + diff --git a/etc/iris_tests_results/trajectory/constant_latitude.cml b/etc/iris_tests_results/trajectory/constant_latitude.cml index 03a3db605b..a661eeee9a 100644 --- a/etc/iris_tests_results/trajectory/constant_latitude.cml +++ b/etc/iris_tests_results/trajectory/constant_latitude.cml @@ -12,13 +12,13 @@ - + - + diff --git a/etc/iris_tests_results/trajectory/single_point.cml b/etc/iris_tests_results/trajectory/single_point.cml index d4e24894ac..f4a6318f2a 100644 --- a/etc/iris_tests_results/trajectory/single_point.cml +++ b/etc/iris_tests_results/trajectory/single_point.cml @@ -11,12 +11,12 @@ - + - + diff --git a/etc/iris_tests_results/trajectory/zigzag.cml b/etc/iris_tests_results/trajectory/zigzag.cml index e9ff1dd36b..34ae48c092 100644 --- a/etc/iris_tests_results/trajectory/zigzag.cml +++ b/etc/iris_tests_results/trajectory/zigzag.cml @@ -12,13 +12,13 @@ - + - + diff --git a/etc/iris_tests_results/trui/air_temp_T00.cml b/etc/iris_tests_results/trui/air_temp_T00.cml index 0cb24758f5..01ed358e78 100644 --- a/etc/iris_tests_results/trui/air_temp_T00.cml +++ b/etc/iris_tests_results/trui/air_temp_T00.cml @@ -11,13 +11,13 @@ - + - + diff --git a/etc/iris_tests_results/trui/air_temp_T24.cml b/etc/iris_tests_results/trui/air_temp_T24.cml index 7c5c5ac2ea..22a78d9a6b 100644 --- a/etc/iris_tests_results/trui/air_temp_T24.cml +++ b/etc/iris_tests_results/trui/air_temp_T24.cml @@ -11,13 +11,13 @@ - + - + diff --git a/etc/iris_tests_results/trui/air_temp_T24_subset.cml b/etc/iris_tests_results/trui/air_temp_T24_subset.cml index bc6f668639..1140a3daad 100644 --- a/etc/iris_tests_results/trui/air_temp_T24_subset.cml +++ b/etc/iris_tests_results/trui/air_temp_T24_subset.cml @@ -11,13 +11,13 @@ - + - + diff --git a/etc/iris_tests_results/trui/air_temp_T24_subset_mean.cml b/etc/iris_tests_results/trui/air_temp_T24_subset_mean.cml index 34e306b543..9d7f497957 100644 --- a/etc/iris_tests_results/trui/air_temp_T24_subset_mean.cml +++ b/etc/iris_tests_results/trui/air_temp_T24_subset_mean.cml @@ -12,13 +12,13 @@ - + - + diff --git a/etc/iris_tests_results/trui/air_temp_trial_diff_T00_to_T24.cml b/etc/iris_tests_results/trui/air_temp_trial_diff_T00_to_T24.cml index 67ef101c20..5464541fa5 100644 --- a/etc/iris_tests_results/trui/air_temp_trial_diff_T00_to_T24.cml +++ b/etc/iris_tests_results/trui/air_temp_trial_diff_T00_to_T24.cml @@ -7,13 +7,13 @@ - + - + diff --git a/etc/iris_tests_results/trui/mean_air_temp_trial_diff_T00_to_T24.cml b/etc/iris_tests_results/trui/mean_air_temp_trial_diff_T00_to_T24.cml index 5b4b69fa85..bb1bad2bb0 100644 --- a/etc/iris_tests_results/trui/mean_air_temp_trial_diff_T00_to_T24.cml +++ b/etc/iris_tests_results/trui/mean_air_temp_trial_diff_T00_to_T24.cml @@ -8,13 +8,13 @@ Mean of unknown over time"/> - + - + diff --git a/etc/iris_tests_results/uri_callback/grib_global.cml b/etc/iris_tests_results/uri_callback/grib_global.cml index 9f8e627c06..e9ed3a0f4d 100644 --- a/etc/iris_tests_results/uri_callback/grib_global.cml +++ b/etc/iris_tests_results/uri_callback/grib_global.cml @@ -25,13 +25,13 @@ -67.499954, -69.999953, -72.499952, -74.999951, -77.49995, -79.999949, -82.499948, -84.999947, -87.499946, -89.999945]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> - + - + diff --git a/etc/iris_tests_results/uri_callback/trui_init.cml b/etc/iris_tests_results/uri_callback/trui_init.cml index 1ead02bce3..abc336f68a 100644 --- a/etc/iris_tests_results/uri_callback/trui_init.cml +++ b/etc/iris_tests_results/uri_callback/trui_init.cml @@ -14,13 +14,13 @@ - + - + diff --git a/etc/iris_tests_results/uri_callback/trui_t24.cml b/etc/iris_tests_results/uri_callback/trui_t24.cml index 237cf56bdc..a3eed92c15 100644 --- a/etc/iris_tests_results/uri_callback/trui_t24.cml +++ b/etc/iris_tests_results/uri_callback/trui_t24.cml @@ -14,13 +14,13 @@ - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.03.236.000128.1990.12.01.00.00.b_0.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.03.236.000128.1990.12.01.00.00.b_0.cml index 6508b92c82..8bedae13b7 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.03.236.000128.1990.12.01.00.00.b_0.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.03.236.000128.1990.12.01.00.00.b_0.cml @@ -27,12 +27,12 @@ -45.0, -47.5, -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.03.236.004224.1990.12.01.00.00.b_0.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.03.236.004224.1990.12.01.00.00.b_0.cml index 334506cb31..7417ad235c 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.03.236.004224.1990.12.01.00.00.b_0.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.03.236.004224.1990.12.01.00.00.b_0.cml @@ -27,12 +27,12 @@ -45.0, -47.5, -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.03.236.008320.1990.12.01.00.00.b_0.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.03.236.008320.1990.12.01.00.00.b_0.cml index e8401146d3..0ed3874bec 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.03.236.008320.1990.12.01.00.00.b_0.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.03.236.008320.1990.12.01.00.00.b_0.cml @@ -28,12 +28,12 @@ -45.0, -47.5, -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.16.202.000128.1860.09.01.00.00.b_0.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.16.202.000128.1860.09.01.00.00.b_0.cml index ea88a76093..9b83942139 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.16.202.000128.1860.09.01.00.00.b_0.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.16.202.000128.1860.09.01.00.00.b_0.cml @@ -25,12 +25,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/001000000000.00.000.000000.1860.01.01.00.00.f.b_0.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/001000000000.00.000.000000.1860.01.01.00.00.f.b_0.cml index f938af4cc8..f3721274b0 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/001000000000.00.000.000000.1860.01.01.00.00.f.b_0.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/001000000000.00.000.000000.1860.01.01.00.00.f.b_0.cml @@ -14,13 +14,13 @@ - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/002000000000.44.101.131200.1920.09.01.00.00.b_0.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/002000000000.44.101.131200.1920.09.01.00.00.b_0.cml index c6bd84898a..70fc1fd5ce 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/002000000000.44.101.131200.1920.09.01.00.00.b_0.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/002000000000.44.101.131200.1920.09.01.00.00.b_0.cml @@ -31,7 +31,7 @@ 37.5, 40.0, 42.5, 45.0, 47.5, 50.0, 52.5, 55.0, 57.5, 60.0, 62.5, 65.0, 67.5, 70.0, 72.5, 75.0, 77.5, 80.0, 82.5, 85.0, 87.5, 90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/12187.b_0.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/12187.b_0.cml index 972e79957c..3edc48675f 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/12187.b_0.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/12187.b_0.cml @@ -15,7 +15,7 @@ - + @@ -66,7 +66,7 @@ - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_level_lat_orig.b_0.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_level_lat_orig.b_0.cml index bb53d0e2e1..61f38cc5d2 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_level_lat_orig.b_0.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_level_lat_orig.b_0.cml @@ -24,7 +24,7 @@ -45.0, -47.5, -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_lon_lat_press_orig.b_0.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_lon_lat_press_orig.b_0.cml index ec8259655d..2bde648572 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_lon_lat_press_orig.b_0.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_lon_lat_press_orig.b_0.cml @@ -24,12 +24,12 @@ -45.0, -47.5, -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_lon_lat_several.b_0.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_lon_lat_several.b_0.cml index 093490dc2f..b7810dc371 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_lon_lat_several.b_0.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_lon_lat_several.b_0.cml @@ -29,12 +29,12 @@ -45.0, -47.5, -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_n10r13xy.b_0.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_n10r13xy.b_0.cml index 9306ee3d32..8f053e980f 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_n10r13xy.b_0.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_n10r13xy.b_0.cml @@ -18,13 +18,13 @@ - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/abcza_pa19591997_daily_29.b_0.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/abcza_pa19591997_daily_29.b_0.cml index f008c7af59..bcff00dc66 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/abcza_pa19591997_daily_29.b_0.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/abcza_pa19591997_daily_29.b_0.cml @@ -28,12 +28,12 @@ -45.0, -47.5, -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/abcza_pa19591997_daily_29.b_1.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/abcza_pa19591997_daily_29.b_1.cml index d8faf7ea68..b75afc08e8 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/abcza_pa19591997_daily_29.b_1.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/abcza_pa19591997_daily_29.b_1.cml @@ -28,12 +28,12 @@ -45.0, -47.5, -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/abcza_pa19591997_daily_29.b_2.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/abcza_pa19591997_daily_29.b_2.cml index 8eed38ca12..1536c37286 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/abcza_pa19591997_daily_29.b_2.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/abcza_pa19591997_daily_29.b_2.cml @@ -25,12 +25,12 @@ -45.0, -47.5, -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/abxpa_press_lat.b_0.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/abxpa_press_lat.b_0.cml index 38efb227d3..ee49d77300 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/abxpa_press_lat.b_0.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/abxpa_press_lat.b_0.cml @@ -24,7 +24,7 @@ -45.0, -47.5, -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/integer.b_0.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/integer.b_0.cml index 242e1bce6a..3dcd29ed6c 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/integer.b_0.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/integer.b_0.cml @@ -24,12 +24,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/model.b_0.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/model.b_0.cml index d2a862902d..1de6e072ea 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/model.b_0.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/model.b_0.cml @@ -28,12 +28,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/ocean_xsect.b_0.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/ocean_xsect.b_0.cml index 07f111ba39..2afcad7550 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/ocean_xsect.b_0.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/ocean_xsect.b_0.cml @@ -41,7 +41,7 @@ - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/st0fc699.b_0.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/st0fc699.b_0.cml index d3bff044dc..46c9b65541 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/st0fc699.b_0.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/st0fc699.b_0.cml @@ -16,12 +16,12 @@ - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/st0fc942.b_0.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/st0fc942.b_0.cml index 27c3f7855e..4fe11fee1f 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/st0fc942.b_0.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/st0fc942.b_0.cml @@ -21,7 +21,7 @@ - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/st30211.b_0.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/st30211.b_0.cml index ca873f8c8e..a75ad7432c 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/st30211.b_0.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_netcdf/st30211.b_0.cml @@ -15,12 +15,12 @@ - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/000003000000.03.236.000128.1990.12.01.00.00.b.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/000003000000.03.236.000128.1990.12.01.00.00.b.cml index 4da9de8860..3069038d09 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/000003000000.03.236.000128.1990.12.01.00.00.b.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/000003000000.03.236.000128.1990.12.01.00.00.b.cml @@ -30,12 +30,12 @@ -45.0, -47.5, -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/000003000000.03.236.004224.1990.12.01.00.00.b.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/000003000000.03.236.004224.1990.12.01.00.00.b.cml index a92538a985..a7c3bbf8cc 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/000003000000.03.236.004224.1990.12.01.00.00.b.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/000003000000.03.236.004224.1990.12.01.00.00.b.cml @@ -30,12 +30,12 @@ -45.0, -47.5, -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/000003000000.03.236.008320.1990.12.01.00.00.b.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/000003000000.03.236.008320.1990.12.01.00.00.b.cml index 4556987b7b..1f86da20b2 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/000003000000.03.236.008320.1990.12.01.00.00.b.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/000003000000.03.236.008320.1990.12.01.00.00.b.cml @@ -31,12 +31,12 @@ -45.0, -47.5, -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/000003000000.16.202.000128.1860.09.01.00.00.b.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/000003000000.16.202.000128.1860.09.01.00.00.b.cml index 1b9cf989f8..302effa682 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/000003000000.16.202.000128.1860.09.01.00.00.b.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/000003000000.16.202.000128.1860.09.01.00.00.b.cml @@ -24,12 +24,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/001000000000.00.000.000000.1860.01.01.00.00.f.b.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/001000000000.00.000.000000.1860.01.01.00.00.f.b.cml index 356b5c936c..e6db5d4d4e 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/001000000000.00.000.000000.1860.01.01.00.00.f.b.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/001000000000.00.000.000000.1860.01.01.00.00.f.b.cml @@ -11,13 +11,13 @@ - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/002000000000.44.101.131200.1920.09.01.00.00.b.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/002000000000.44.101.131200.1920.09.01.00.00.b.cml index 24c2035ecd..7327ab0f40 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/002000000000.44.101.131200.1920.09.01.00.00.b.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/002000000000.44.101.131200.1920.09.01.00.00.b.cml @@ -34,7 +34,7 @@ 37.5, 40.0, 42.5, 45.0, 47.5, 50.0, 52.5, 55.0, 57.5, 60.0, 62.5, 65.0, 67.5, 70.0, 72.5, 75.0, 77.5, 80.0, 82.5, 85.0, 87.5, 90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/12187.b.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/12187.b.cml index c0eb39bd01..519bb76df6 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/12187.b.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/12187.b.cml @@ -14,7 +14,7 @@ - + @@ -69,7 +69,7 @@ - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/HadCM2_ts_SAT_ann_18602100.b.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/HadCM2_ts_SAT_ann_18602100.b.cml index 847c06f3f7..ee74daf3ca 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/HadCM2_ts_SAT_ann_18602100.b.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/HadCM2_ts_SAT_ann_18602100.b.cml @@ -13,14 +13,14 @@ - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/aaxzc_level_lat_orig.b.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/aaxzc_level_lat_orig.b.cml index 8495a98d6a..78996238df 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/aaxzc_level_lat_orig.b.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/aaxzc_level_lat_orig.b.cml @@ -23,7 +23,7 @@ -45.0, -47.5, -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/aaxzc_lon_lat_press_orig.b.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/aaxzc_lon_lat_press_orig.b.cml index 607bc95adc..5b648d2da4 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/aaxzc_lon_lat_press_orig.b.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/aaxzc_lon_lat_press_orig.b.cml @@ -23,12 +23,12 @@ -45.0, -47.5, -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/aaxzc_lon_lat_several.b.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/aaxzc_lon_lat_several.b.cml index fd84731891..e073b206c6 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/aaxzc_lon_lat_several.b.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/aaxzc_lon_lat_several.b.cml @@ -32,12 +32,12 @@ -45.0, -47.5, -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/aaxzc_n10r13xy.b.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/aaxzc_n10r13xy.b.cml index 92a5fe6072..87b265e1e4 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/aaxzc_n10r13xy.b.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/aaxzc_n10r13xy.b.cml @@ -17,13 +17,13 @@ - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/abcza_pa19591997_daily_29.b.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/abcza_pa19591997_daily_29.b.cml index 735ce320e6..6b0a6bb02b 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/abcza_pa19591997_daily_29.b.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/abcza_pa19591997_daily_29.b.cml @@ -31,12 +31,12 @@ -45.0, -47.5, -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + @@ -88,12 +88,12 @@ -45.0, -47.5, -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + @@ -138,12 +138,12 @@ -45.0, -47.5, -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/abxpa_press_lat.b.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/abxpa_press_lat.b.cml index 59a495c7ff..5aae725d65 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/abxpa_press_lat.b.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/abxpa_press_lat.b.cml @@ -23,7 +23,7 @@ -45.0, -47.5, -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/integer.b.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/integer.b.cml index 71a4b13dfa..8ba1d13a88 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/integer.b.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/integer.b.cml @@ -23,12 +23,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/model.b.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/model.b.cml index 213a4919ca..30e678e12f 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/model.b.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/model.b.cml @@ -27,12 +27,12 @@ -50.0, -52.5, -55.0, -57.5, -60.0, -62.5, -65.0, -67.5, -70.0, -72.5, -75.0, -77.5, -80.0, -82.5, -85.0, -87.5, -90.0]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/ocean_xsect.b.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/ocean_xsect.b.cml index 601cfcba15..06726f0298 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/ocean_xsect.b.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/ocean_xsect.b.cml @@ -44,7 +44,7 @@ - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/st0fc699.b.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/st0fc699.b.cml index 6a03802e65..ab5ca47d2e 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/st0fc699.b.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/st0fc699.b.cml @@ -15,12 +15,12 @@ - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/st0fc942.b.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/st0fc942.b.cml index 81c575d280..f4e7b36843 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/st0fc942.b.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/st0fc942.b.cml @@ -24,7 +24,7 @@ - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/st30211.b.cml b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/st30211.b.cml index d3b61758af..6552eddde5 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/st30211.b.cml +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/from_pp/st30211.b.cml @@ -14,12 +14,12 @@ - + - + diff --git a/etc/iris_tests_results/usecases/pp_to_cf_conversion/to_netcdf/st0fc942.b_0.cdl b/etc/iris_tests_results/usecases/pp_to_cf_conversion/to_netcdf/st0fc942.b_0.cdl index 5077bc360c..1a2892b205 100644 --- a/etc/iris_tests_results/usecases/pp_to_cf_conversion/to_netcdf/st0fc942.b_0.cdl +++ b/etc/iris_tests_results/usecases/pp_to_cf_conversion/to_netcdf/st0fc942.b_0.cdl @@ -17,8 +17,8 @@ variables: rotated_latitude_longitude:longitude_of_prime_meridian = 0. ; rotated_latitude_longitude:semi_major_axis = 6371229. ; rotated_latitude_longitude:semi_minor_axis = 6371229. ; - rotated_latitude_longitude:grid_north_pole_latitude = 0.f ; - rotated_latitude_longitude:grid_north_pole_longitude = 0.f ; + rotated_latitude_longitude:grid_north_pole_latitude = 0. ; + rotated_latitude_longitude:grid_north_pole_longitude = 0. ; rotated_latitude_longitude:north_pole_grid_longitude = 0. ; int pseudo_level(pseudo_level) ; pseudo_level:units = "1" ; diff --git a/etc/iris_tests_results/xml/handmade.cml b/etc/iris_tests_results/xml/handmade.cml index 03ed610216..60e841c3fd 100644 --- a/etc/iris_tests_results/xml/handmade.cml +++ b/etc/iris_tests_results/xml/handmade.cml @@ -10,12 +10,12 @@ - + - + @@ -41,12 +41,12 @@ - + - + @@ -72,12 +72,12 @@ - + - + @@ -107,12 +107,12 @@ - + - + @@ -142,12 +142,12 @@ - + - + @@ -173,12 +173,12 @@ - + - + @@ -204,12 +204,12 @@ - + - + @@ -239,12 +239,12 @@ - + - + @@ -274,12 +274,12 @@ - + - + @@ -305,12 +305,12 @@ - + - + @@ -336,12 +336,12 @@ - + - + @@ -371,12 +371,12 @@ - + - + @@ -406,12 +406,12 @@ - + - + @@ -437,12 +437,12 @@ - + - + @@ -468,12 +468,12 @@ - + - + @@ -503,12 +503,12 @@ - + - + diff --git a/etc/iris_tests_results/xml/pp.cml b/etc/iris_tests_results/xml/pp.cml index 2641a9e1d6..d740082153 100644 --- a/etc/iris_tests_results/xml/pp.cml +++ b/etc/iris_tests_results/xml/pp.cml @@ -22,12 +22,12 @@ -62.4999, -64.9999, -67.4999, -69.9999, -72.4999, -74.9999, -77.4999, -79.9999, -82.4999, -84.9999, -87.4999, -89.9999]" shape="(73,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + - +