diff --git a/.mailmap b/.mailmap index 4e357a68bb..7b9cabe858 100644 --- a/.mailmap +++ b/.mailmap @@ -28,6 +28,7 @@ Mark Worsfold <35810969+MarkWorsfold@users.nore Meabh NicGuidhir Neil Crosswaite <43375279+neilCrosswaite@users.noreply.github.com> Paul Abernethy +Peter Jordan <52462411+mo-peterjordan@users.noreply.github.com> Shafiat Dewan <87321907+ShafiatDewan@users.noreply.github.com> <87321907+ShafiatDewan@users.noreply.github.com> Shubhendra Singh Chauhan Simon Jackson diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7f41be145f..f33452165c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -55,6 +55,7 @@ below: - Katharine Hurst (Met Office, UK) - Simon Jackson (Met Office, UK) - Caroline Jones (Met Office, UK) + - Peter Jordan (Met Office, UK) - Bruno P. Kinoshita (NIWA, NZ) - Lucy Liu (Bureau of Meteorology, Australia) - Daniel Mentiplay (Bureau of Meteorology, Australia) diff --git a/improver/cli/generate_metadata_cube.py b/improver/cli/generate_metadata_cube.py index 7dfdf870f8..7eebe26364 100644 --- a/improver/cli/generate_metadata_cube.py +++ b/improver/cli/generate_metadata_cube.py @@ -45,7 +45,8 @@ def process( time_period: int = None, json_input: cli.inputjson = None, ensemble_members: int = 8, - grid_spacing: float = None, + x_grid_spacing: float = None, + y_grid_spacing: float = None, domain_corner: cli.comma_separated_list_of_float = None, npoints: int = 71, ): @@ -78,8 +79,10 @@ def process( ensemble_members (Optional[int]): Number of ensemble members. Default 8. Will not be used if "realizations", "percentiles" or "thresholds" provided in json_input. - grid_spacing (Optional[float]): - Resolution of grid (metres or degrees). + x_grid_spacing (Optional[float]): + Resolution of grid along the x-axis (metres or degrees). + y_grid_spacing (Optional[float]): + Resolution of grid along the y-axis (metres or degrees). domain_corner (Optional[Tuple[float, float]]): Bottom left corner of grid domain (y,x) (degrees for latlon or metres for equalarea). diff --git a/improver/synthetic_data/generate_metadata.py b/improver/synthetic_data/generate_metadata.py index 0f086d7eee..a78c71bb12 100644 --- a/improver/synthetic_data/generate_metadata.py +++ b/improver/synthetic_data/generate_metadata.py @@ -192,11 +192,12 @@ def generate_metadata( kwargs["time_bounds"] = time_bounds # If grid_spacing not specified, use default for requested spatial grid - if "grid_spacing" not in kwargs or kwargs["grid_spacing"] is None: - if "spatial_grid" not in kwargs: - kwargs["spatial_grid"] = DEFAULT_SPATIAL_GRID + for spacing_axis in ["x_grid_spacing", "y_grid_spacing"]: + if spacing_axis not in kwargs or kwargs[spacing_axis] is None: + if "spatial_grid" not in kwargs: + kwargs["spatial_grid"] = DEFAULT_SPATIAL_GRID - kwargs["grid_spacing"] = DEFAULT_GRID_SPACING[kwargs["spatial_grid"]] + kwargs[spacing_axis] = DEFAULT_GRID_SPACING[kwargs["spatial_grid"]] # Create ndimensional array of zeros if "height_levels" not in kwargs: diff --git a/improver/synthetic_data/set_up_test_cubes.py b/improver/synthetic_data/set_up_test_cubes.py index 846fff0b3b..4300fec53c 100644 --- a/improver/synthetic_data/set_up_test_cubes.py +++ b/improver/synthetic_data/set_up_test_cubes.py @@ -63,7 +63,8 @@ def construct_yx_coords( ypoints: int, xpoints: int, spatial_grid: str, - grid_spacing: Optional[float] = None, + x_grid_spacing: Optional[float] = None, + y_grid_spacing: Optional[float] = None, domain_corner: Optional[Tuple[float, float]] = None, ) -> Tuple[DimCoord, DimCoord]: """ @@ -76,9 +77,14 @@ def construct_yx_coords( Number of grid points required along the x-axis spatial_grid: Specifier to produce either a "latlon" or "equalarea" grid - grid_spacing: - Grid resolution (degrees for latlon or metres for equalarea). If not provided, - defaults to 10 degrees for "latlon" grid or 2000 metres for "equalarea" grid + x_grid_spacing: + Grid resolution along the x axis. Degrees for latlon or metres for equalarea. + If not provided, defaults to 10 degrees for "latlon" grid or 2000 metres for + "equalarea" grid + y_grid_spacing: + Grid resolution along the y axis. Degrees for latlon or metres for equalarea. + If not provided, defaults to 10 degrees for "latlon" grid or 2000 metres for + "equalarea" grid domain_corner: Bottom left corner of grid domain (y,x) (degrees for latlon or metres for equalarea). If not provided, a grid is created centred around (0,0). @@ -89,12 +95,18 @@ def construct_yx_coords( if spatial_grid not in GRID_COORD_ATTRIBUTES.keys(): raise ValueError("Grid type {} not recognised".format(spatial_grid)) - if grid_spacing is None: - grid_spacing = GRID_COORD_ATTRIBUTES[spatial_grid]["default_grid_spacing"] + if x_grid_spacing is None: + x_grid_spacing = GRID_COORD_ATTRIBUTES[spatial_grid]["default_grid_spacing"] + if y_grid_spacing is None: + y_grid_spacing = GRID_COORD_ATTRIBUTES[spatial_grid]["default_grid_spacing"] if domain_corner is None: - domain_corner = _set_domain_corner(ypoints, xpoints, grid_spacing) - y_array, x_array = _create_yx_arrays(ypoints, xpoints, domain_corner, grid_spacing) + domain_corner = _set_domain_corner( + ypoints, xpoints, x_grid_spacing, y_grid_spacing + ) + y_array, x_array = _create_yx_arrays( + ypoints, xpoints, domain_corner, x_grid_spacing, y_grid_spacing + ) y_coord = DimCoord( y_array, @@ -119,7 +131,11 @@ def construct_yx_coords( def _create_yx_arrays( - ypoints: int, xpoints: int, domain_corner: Tuple[float, float], grid_spacing: float, + ypoints: int, + xpoints: int, + domain_corner: Tuple[float, float], + x_grid_spacing: float, + y_grid_spacing: float, ) -> Tuple[ndarray, ndarray]: """ Creates arrays for constructing y and x DimCoords. @@ -128,13 +144,14 @@ def _create_yx_arrays( ypoints xpoints domain_corner - grid_spacing + x_grid_spacing + y_grid_spacing Returns: Tuple containing arrays of y and x coordinate values """ - y_stop = domain_corner[0] + (grid_spacing * (ypoints - 1)) - x_stop = domain_corner[1] + (grid_spacing * (xpoints - 1)) + y_stop = domain_corner[0] + (y_grid_spacing * (ypoints - 1)) + x_stop = domain_corner[1] + (x_grid_spacing * (xpoints - 1)) y_array = np.linspace(domain_corner[0], y_stop, ypoints, dtype=np.float32) x_array = np.linspace(domain_corner[1], x_stop, xpoints, dtype=np.float32) @@ -143,7 +160,7 @@ def _create_yx_arrays( def _set_domain_corner( - ypoints: int, xpoints: int, grid_spacing: float + ypoints: int, xpoints: int, x_grid_spacing: float, y_grid_spacing: float ) -> Tuple[float, float]: """ Set domain corner to create a grid around 0,0. @@ -151,13 +168,14 @@ def _set_domain_corner( Args: ypoints xpoints - grid_spacing + x_grid_spacing + y_grid_spacing Returns: (y,x) values of the bottom left corner of the domain """ - y_start = 0 - ((ypoints - 1) * grid_spacing) / 2 - x_start = 0 - ((xpoints - 1) * grid_spacing) / 2 + y_start = 0 - ((ypoints - 1) * y_grid_spacing) / 2 + x_start = 0 - ((xpoints - 1) * x_grid_spacing) / 2 return y_start, x_start @@ -387,7 +405,8 @@ def set_up_variable_cube( include_scalar_coords: Optional[List[Coord]] = None, attributes: Optional[Dict[str, str]] = None, standard_grid_metadata: Optional[str] = None, - grid_spacing: Optional[float] = None, + x_grid_spacing: Optional[float] = None, + y_grid_spacing: Optional[float] = None, domain_corner: Optional[Tuple[float, float]] = None, height_levels: Optional[Union[List[float], ndarray]] = None, pressure: bool = False, @@ -431,8 +450,10 @@ def set_up_variable_cube( Recognised mosg__model_configuration for which to set up Met Office standard grid attributes. Should be 'uk_det', 'uk_ens', 'gl_det' or 'gl_ens'. - grid_spacing: - Grid resolution (degrees for latlon or metres for equalarea). + x_grid_spacing: + Grid resolution along the x axis (degrees for latlon or metres for equalarea). + y_grid_spacing: + Grid resolution along the y axis (degrees for latlon or metres for equalarea). domain_corner: Bottom left corner of grid domain (y,x) (degrees for latlon or metres for equalarea). height_levels: @@ -453,7 +474,8 @@ def set_up_variable_cube( ypoints, xpoints, spatial_grid, - grid_spacing=grid_spacing, + x_grid_spacing=x_grid_spacing, + y_grid_spacing=y_grid_spacing, domain_corner=domain_corner, ) diff --git a/improver_tests/acceptance/test_generate_metadata_cube.py b/improver_tests/acceptance/test_generate_metadata_cube.py index 8dcf114257..00ef3de2d3 100644 --- a/improver_tests/acceptance/test_generate_metadata_cube.py +++ b/improver_tests/acceptance/test_generate_metadata_cube.py @@ -70,7 +70,9 @@ def test_ensemble_members(tmp_path): "120", "--ensemble-members", "4", - "--grid-spacing", + "--x-grid-spacing", + "1000", + "--y-grid-spacing", "1000", "--domain-corner", "0,0", diff --git a/improver_tests/blending/calculate_weights_and_blend/test_WeightAndBlend.py b/improver_tests/blending/calculate_weights_and_blend/test_WeightAndBlend.py index 0e4ca6bb0b..e907bb4af5 100644 --- a/improver_tests/blending/calculate_weights_and_blend/test_WeightAndBlend.py +++ b/improver_tests/blending/calculate_weights_and_blend/test_WeightAndBlend.py @@ -92,7 +92,8 @@ def set_up_masked_cubes(): frt=cycletime, spatial_grid="equalarea", standard_grid_metadata="uk_det", - grid_spacing=grid_spacing, + x_grid_spacing=grid_spacing, + y_grid_spacing=grid_spacing, ) # set up a masked nowcast cube with more rain @@ -108,7 +109,8 @@ def set_up_masked_cubes(): frt=cycletime, spatial_grid="equalarea", attributes={"mosg__model_configuration": "nc_det"}, - grid_spacing=grid_spacing, + x_grid_spacing=grid_spacing, + y_grid_spacing=grid_spacing, ) return iris.cube.CubeList([ukv_cube, nowcast_cube]), cycletime_string diff --git a/improver_tests/categorical/decision_tree/__init__.py b/improver_tests/categorical/decision_tree/__init__.py index 4169c99301..a7f8ed517a 100644 --- a/improver_tests/categorical/decision_tree/__init__.py +++ b/improver_tests/categorical/decision_tree/__init__.py @@ -84,7 +84,12 @@ def set_up_wxcube( if lat_lon: kwargs.update( - {"spatial_grid": "latlon", "domain_corner": (49, -8), "grid_spacing": 1} + { + "spatial_grid": "latlon", + "domain_corner": (49, -8), + "x_grid_spacing": 1, + "y_grid_spacing": 1, + } ) cube = set_up_variable_cube(data, **kwargs) diff --git a/improver_tests/generate_ancillaries/test_OrographicSmoothingCoefficients.py b/improver_tests/generate_ancillaries/test_OrographicSmoothingCoefficients.py index 97063f972a..fc1d9cc04e 100644 --- a/improver_tests/generate_ancillaries/test_OrographicSmoothingCoefficients.py +++ b/improver_tests/generate_ancillaries/test_OrographicSmoothingCoefficients.py @@ -55,7 +55,8 @@ def orography_fixture() -> Cube: name="surface_altitude", units="m", spatial_grid="equalarea", - grid_spacing=1000, + x_grid_spacing=1000, + y_grid_spacing=1000, domain_corner=(-1000, -1000), ) return cube @@ -102,7 +103,8 @@ def mask_fixture() -> Cube: name="land_binary_mask", units="1", spatial_grid="equalarea", - grid_spacing=1000, + x_grid_spacing=1000, + y_grid_spacing=1000, domain_corner=(-2000, -2000), ) return mask diff --git a/improver_tests/lightning/test_LightningFromCapePrecip.py b/improver_tests/lightning/test_LightningFromCapePrecip.py index 7a2b554f2b..bb20b79b57 100644 --- a/improver_tests/lightning/test_LightningFromCapePrecip.py +++ b/improver_tests/lightning/test_LightningFromCapePrecip.py @@ -62,7 +62,8 @@ def cape_cube_fixture() -> Cube: attributes=None, standard_grid_metadata="gl_ens", domain_corner=(-60, 0), - grid_spacing=20, + x_grid_spacing=20, + y_grid_spacing=20, ) return cube @@ -85,7 +86,8 @@ def precip_cube_fixture() -> Cube: attributes=None, standard_grid_metadata="gl_ens", domain_corner=(-60, 0), - grid_spacing=20, + x_grid_spacing=20, + y_grid_spacing=20, ) return cube @@ -107,7 +109,8 @@ def expected_cube_fixture() -> Cube: time_bounds=(datetime(2017, 11, 10, 4, 0), datetime(2017, 11, 10, 5, 0)), attributes=MANDATORY_ATTRIBUTE_DEFAULTS, domain_corner=(-60, 0), - grid_spacing=20, + x_grid_spacing=20, + y_grid_spacing=20, ) cube = add_coordinate( cube, diff --git a/improver_tests/nowcasting/optical_flow/__init__.py b/improver_tests/nowcasting/optical_flow/__init__.py index a0cb0163eb..02d9aed51d 100644 --- a/improver_tests/nowcasting/optical_flow/__init__.py +++ b/improver_tests/nowcasting/optical_flow/__init__.py @@ -53,6 +53,7 @@ def set_up_test_cube(data, name, units, time): spatial_grid="equalarea", time=time, frt=time, - grid_spacing=2000, + x_grid_spacing=2000, + y_grid_spacing=2000, domain_corner=(0, 0), ) diff --git a/improver_tests/precipitation_type/convection/test_ConvectionRatioFromComponents.py b/improver_tests/precipitation_type/convection/test_ConvectionRatioFromComponents.py index 0e93c74673..d15c960e3e 100644 --- a/improver_tests/precipitation_type/convection/test_ConvectionRatioFromComponents.py +++ b/improver_tests/precipitation_type/convection/test_ConvectionRatioFromComponents.py @@ -62,7 +62,8 @@ def input_cubes(): data.copy(), name="lwe_convective_precipitation_rate", units="m s-1", - grid_spacing=10, + x_grid_spacing=10, + y_grid_spacing=10, domain_corner=(-90, -180), attributes=GLOBAL_ATTRIBUTES, ) @@ -72,7 +73,8 @@ def input_cubes(): data.copy(), name="lwe_stratiform_precipitation_rate", units="m s-1", - grid_spacing=10, + x_grid_spacing=10, + y_grid_spacing=10, domain_corner=(-90, -180), attributes=GLOBAL_ATTRIBUTES, ) diff --git a/improver_tests/psychrometric_calculations/test_PhaseChangeLevel.py b/improver_tests/psychrometric_calculations/test_PhaseChangeLevel.py index b64c3b5c6d..7e6129a96e 100644 --- a/improver_tests/psychrometric_calculations/test_PhaseChangeLevel.py +++ b/improver_tests/psychrometric_calculations/test_PhaseChangeLevel.py @@ -410,7 +410,8 @@ def setUp(self): name="orographic_height", units="m", spatial_grid="equalarea", - grid_spacing=2000.0, + x_grid_spacing=2000.0, + y_grid_spacing=2000.0, ) self.expected_data = [ [50, 50, 50, 20, 5], @@ -424,7 +425,8 @@ def setUp(self): name="orographic_height", units="m", spatial_grid="latlon", - grid_spacing=0.01, + x_grid_spacing=0.01, + y_grid_spacing=0.01, ) def test_basic(self): diff --git a/improver_tests/regrid/test_AdjustLandSeaPoints.py b/improver_tests/regrid/test_AdjustLandSeaPoints.py index 1875b036e2..a84df6f620 100644 --- a/improver_tests/regrid/test_AdjustLandSeaPoints.py +++ b/improver_tests/regrid/test_AdjustLandSeaPoints.py @@ -255,7 +255,8 @@ def setUp(self): "precipitation_amount", "kg m^-2", "equalarea", - grid_spacing=2000, + x_grid_spacing=2000, + y_grid_spacing=2000, domain_corner=(0, -50000), ) diff --git a/improver_tests/regrid/test_RegridLandSea.py b/improver_tests/regrid/test_RegridLandSea.py index 4a56866a44..832da22fce 100644 --- a/improver_tests/regrid/test_RegridLandSea.py +++ b/improver_tests/regrid/test_RegridLandSea.py @@ -74,7 +74,8 @@ def setUp(self): spatial_grid="latlon", standard_grid_metadata="gl_det", domain_corner=domain_corner, - grid_spacing=2, + x_grid_spacing=2, + y_grid_spacing=2, ) # set up dummy landmask on source grid diff --git a/improver_tests/spotdata/test_SpotExtraction.py b/improver_tests/spotdata/test_SpotExtraction.py index 6abb8b9825..1f3e17a895 100755 --- a/improver_tests/spotdata/test_SpotExtraction.py +++ b/improver_tests/spotdata/test_SpotExtraction.py @@ -85,7 +85,8 @@ def setUp(self): units="K", attributes=attributes, domain_corner=(0, 0), - grid_spacing=10, + x_grid_spacing=10, + y_grid_spacing=10, time=time, frt=frt, ) diff --git a/improver_tests/synthetic_data/test_generate_metadata.py b/improver_tests/synthetic_data/test_generate_metadata.py index 913360fa93..3cecd1524c 100644 --- a/improver_tests/synthetic_data/test_generate_metadata.py +++ b/improver_tests/synthetic_data/test_generate_metadata.py @@ -194,7 +194,7 @@ def test_name_unknown_with_units(): def test_set_spatial_grid(spatial_grid): """ Tests different spatial grids generates cubes with default values for that spatial grid """ - cube = generate_metadata(MANDATORY_ATTRIBUTE_DEFAULTS, spatial_grid=spatial_grid,) + cube = generate_metadata(MANDATORY_ATTRIBUTE_DEFAULTS, spatial_grid=spatial_grid) expected_spatial_grid_attributes = SPATIAL_GRID_ATTRIBUTE_DEFAULTS[spatial_grid] @@ -449,7 +449,11 @@ def test_set_grid_spacing(): """ Tests cube generated with specified grid_spacing and the rest of the values set as default values """ grid_spacing = 5 - cube = generate_metadata(MANDATORY_ATTRIBUTE_DEFAULTS, grid_spacing=grid_spacing) + cube = generate_metadata( + MANDATORY_ATTRIBUTE_DEFAULTS, + x_grid_spacing=grid_spacing, + y_grid_spacing=grid_spacing, + ) assert np.diff(cube.coord(axis="y").points)[0] == grid_spacing assert np.diff(cube.coord(axis="x").points)[0] == grid_spacing diff --git a/improver_tests/synthetic_data/test_set_up_test_cubes.py b/improver_tests/synthetic_data/test_set_up_test_cubes.py index a4b87b5a11..76d82d2e09 100644 --- a/improver_tests/synthetic_data/test_set_up_test_cubes.py +++ b/improver_tests/synthetic_data/test_set_up_test_cubes.py @@ -79,22 +79,32 @@ def test_lat_lon_values(self): def test_lat_lon_grid_spacing(self): """Test latitude and longitude point values created around 0,0 with provided grid spacing""" - y_coord, x_coord = construct_yx_coords(3, 3, "latlon", grid_spacing=1) + y_coord, x_coord = construct_yx_coords( + 3, 3, "latlon", x_grid_spacing=10, y_grid_spacing=10 + ) + self.assertArrayEqual(x_coord.points, [-10.0, 0.0, 10.0]) + self.assertArrayEqual(y_coord.points, [-10.0, 0.0, 10.0]) + + y_coord, x_coord = construct_yx_coords( + 3, 3, "latlon", x_grid_spacing=1, y_grid_spacing=2 + ) self.assertArrayEqual(x_coord.points, [-1.0, 0.0, 1.0]) - self.assertArrayEqual(y_coord.points, [-1.0, 0.0, 1.0]) + self.assertArrayEqual(y_coord.points, [-2.0, 0.0, 2.0]) - y_coord, x_coord = construct_yx_coords(4, 4, "latlon", grid_spacing=1) + y_coord, x_coord = construct_yx_coords( + 4, 4, "latlon", x_grid_spacing=1, y_grid_spacing=3 + ) self.assertArrayEqual(x_coord.points, [-1.5, -0.5, 0.5, 1.5]) - self.assertArrayEqual(y_coord.points, [-1.5, -0.5, 0.5, 1.5]) + self.assertArrayEqual(y_coord.points, [-4.5, -1.5, 1.5, 4.5]) def test_lat_lon_grid_spacing_domain_corner(self): """Test latitude and longitude point values start at domain corner with provided grid spacing""" y_coord, x_coord = construct_yx_coords( - 3, 3, "latlon", grid_spacing=2, domain_corner=(15, 12) + 3, 3, "latlon", x_grid_spacing=2, y_grid_spacing=3, domain_corner=(15, 12) ) self.assertArrayEqual(x_coord.points, [12.0, 14.0, 16.0]) - self.assertArrayEqual(y_coord.points, [15.0, 17.0, 19.0]) + self.assertArrayEqual(y_coord.points, [15.0, 18.0, 21.0]) def test_lat_lon_domain_corner(self): """Test grid points generated with default grid spacing if domain corner @@ -118,22 +128,37 @@ def test_proj_xy(self): def test_equal_area_grid_spacing(self): """Test projection_y_coordinate and projection_x_coordinate point values created around 0,0 with provided grid spacing""" - y_coord, x_coord = construct_yx_coords(3, 3, "equalarea", grid_spacing=1) + y_coord, x_coord = construct_yx_coords( + 3, 3, "equalarea", x_grid_spacing=10, y_grid_spacing=10 + ) + self.assertArrayEqual(x_coord.points, [-10.0, 0.0, 10.0]) + self.assertArrayEqual(y_coord.points, [-10.0, 0.0, 10.0]) + + y_coord, x_coord = construct_yx_coords( + 3, 3, "equalarea", x_grid_spacing=1, y_grid_spacing=2 + ) self.assertArrayEqual(x_coord.points, [-1.0, 0.0, 1.0]) - self.assertArrayEqual(y_coord.points, [-1.0, 0.0, 1.0]) + self.assertArrayEqual(y_coord.points, [-2.0, 0.0, 2.0]) - y_coord, x_coord = construct_yx_coords(4, 4, "equalarea", grid_spacing=1) + y_coord, x_coord = construct_yx_coords( + 4, 4, "equalarea", x_grid_spacing=1, y_grid_spacing=3 + ) self.assertArrayEqual(x_coord.points, [-1.5, -0.5, 0.5, 1.5]) - self.assertArrayEqual(y_coord.points, [-1.5, -0.5, 0.5, 1.5]) + self.assertArrayEqual(y_coord.points, [-4.5, -1.5, 1.5, 4.5]) def test_equal_area_grid_spacing_domain_corner(self): """Test projection_y_coordinate and projection_x_coordinate point values start at domain corner with provided grid spacing""" y_coord, x_coord = construct_yx_coords( - 3, 3, "equalarea", grid_spacing=2, domain_corner=(15, 12) + 3, + 3, + "equalarea", + x_grid_spacing=2, + y_grid_spacing=3, + domain_corner=(15, 12), ) self.assertArrayEqual(x_coord.points, [12.0, 14.0, 16.0]) - self.assertArrayEqual(y_coord.points, [15.0, 17.0, 19.0]) + self.assertArrayEqual(y_coord.points, [15.0, 18.0, 21.0]) def test_equal_area_domain_corner(self): """Test grid points generated with default grid spacing if domain @@ -516,9 +541,13 @@ def test_standard_grid_metadata_global(self): def test_latlon_grid_spacing(self): """Test ability to set up lat-lon grid around 0,0 with specified grid spacing""" - grid_spacing = 1 + x_grid_spacing = 1 + y_grid_spacing = 2 result = set_up_variable_cube( - self.data, spatial_grid="latlon", grid_spacing=grid_spacing + self.data, + spatial_grid="latlon", + x_grid_spacing=x_grid_spacing, + y_grid_spacing=y_grid_spacing, ) self.assertEqual(result.coord_dims("latitude"), (0,)) @@ -530,8 +559,8 @@ def test_latlon_grid_spacing(self): lon_spacing = abs( result.coord("longitude").points[0] - result.coord("longitude").points[1] ) - self.assertEqual(lat_spacing, grid_spacing) - self.assertEqual(lon_spacing, grid_spacing) + self.assertEqual(lat_spacing, y_grid_spacing) + self.assertEqual(lon_spacing, x_grid_spacing) self.assertEqual( abs(result.coord("latitude").points[0]), abs(result.coord("latitude").points[-1]), @@ -543,9 +572,13 @@ def test_latlon_grid_spacing(self): def test_equalarea_grid_spacing(self): """Test ability to set up equalarea grid around 0,0 with specified grid spacing""" - grid_spacing = 1 + x_grid_spacing = 1 + y_grid_spacing = 2 result = set_up_variable_cube( - self.data, spatial_grid="equalarea", grid_spacing=grid_spacing + self.data, + spatial_grid="equalarea", + x_grid_spacing=x_grid_spacing, + y_grid_spacing=y_grid_spacing, ) self.assertEqual(result.coord_dims("projection_y_coordinate"), (0,)) self.assertEqual(result.coord_dims("projection_x_coordinate"), (1,)) @@ -558,8 +591,8 @@ def test_equalarea_grid_spacing(self): result.coord("projection_x_coordinate").points[0] - result.coord("projection_x_coordinate").points[1] ) - self.assertEqual(y_spacing, grid_spacing) - self.assertEqual(x_spacing, grid_spacing) + self.assertEqual(y_spacing, y_grid_spacing) + self.assertEqual(x_spacing, x_grid_spacing) self.assertEqual( abs(result.coord("projection_y_coordinate").points[0]), abs(result.coord("projection_y_coordinate").points[-1]), @@ -571,12 +604,14 @@ def test_equalarea_grid_spacing(self): def test_latlon_domain_corner_grid_spacing(self): """Test ability to set up lat-lon grid from domain corner with grid spacing""" - grid_spacing = 1 + x_grid_spacing = 1 + y_grid_spacing = 2 domain_corner = (-17, -10) result = set_up_variable_cube( self.data, spatial_grid="latlon", - grid_spacing=grid_spacing, + x_grid_spacing=x_grid_spacing, + y_grid_spacing=y_grid_spacing, domain_corner=domain_corner, ) @@ -589,19 +624,21 @@ def test_latlon_domain_corner_grid_spacing(self): lon_spacing = abs( result.coord("longitude").points[0] - result.coord("longitude").points[1] ) - self.assertEqual(lat_spacing, grid_spacing) - self.assertEqual(lon_spacing, grid_spacing) + self.assertEqual(lat_spacing, y_grid_spacing) + self.assertEqual(lon_spacing, x_grid_spacing) self.assertEqual(result.coord("latitude").points[0], domain_corner[0]) self.assertEqual(result.coord("longitude").points[0], domain_corner[1]) def test_equalarea_domain_corner_grid_spacing(self): """Test ability to set up equalarea grid from domain corner with grid spacing""" - grid_spacing = 1 + x_grid_spacing = 1 + y_grid_spacing = 2 domain_corner = (1100, 300) result = set_up_variable_cube( self.data, spatial_grid="equalarea", - grid_spacing=grid_spacing, + x_grid_spacing=x_grid_spacing, + y_grid_spacing=y_grid_spacing, domain_corner=domain_corner, ) @@ -616,8 +653,8 @@ def test_equalarea_domain_corner_grid_spacing(self): result.coord("projection_x_coordinate").points[0] - result.coord("projection_x_coordinate").points[1] ) - self.assertEqual(y_spacing, grid_spacing) - self.assertEqual(x_spacing, grid_spacing) + self.assertEqual(y_spacing, y_grid_spacing) + self.assertEqual(x_spacing, x_grid_spacing) self.assertEqual( result.coord("projection_y_coordinate").points[0], domain_corner[0] ) diff --git a/improver_tests/threshold/test_LatitudeDependentThreshold.py b/improver_tests/threshold/test_LatitudeDependentThreshold.py index 2948f2c0e9..c816b3906c 100644 --- a/improver_tests/threshold/test_LatitudeDependentThreshold.py +++ b/improver_tests/threshold/test_LatitudeDependentThreshold.py @@ -116,7 +116,8 @@ def setUp(self): attributes=attributes, standard_grid_metadata="uk_det", domain_corner=(-60, 0), - grid_spacing=20, + x_grid_spacing=20, + y_grid_spacing=20, ) self.masked_cube = self.cube.copy() diff --git a/improver_tests/utilities/cube_extraction/test_cube_extraction.py b/improver_tests/utilities/cube_extraction/test_cube_extraction.py index 68b8d58410..e45a9a1cdf 100644 --- a/improver_tests/utilities/cube_extraction/test_cube_extraction.py +++ b/improver_tests/utilities/cube_extraction/test_cube_extraction.py @@ -88,7 +88,8 @@ def set_up_precip_probability_cube(): variable_name="precipitation_rate", threshold_units="m s-1", spatial_grid="equalarea", - grid_spacing=1, + x_grid_spacing=1, + y_grid_spacing=1, domain_corner=(0, 0), ) @@ -106,7 +107,8 @@ def set_up_global_gridded_cube(): units="degC", spatial_grid="latlon", domain_corner=(45, -2), - grid_spacing=2, + x_grid_spacing=2, + y_grid_spacing=2, ) @@ -117,7 +119,8 @@ def set_up_uk_gridded_cube(): units="degC", spatial_grid="equalarea", domain_corner=(-5000, -5000), - grid_spacing=2000, + x_grid_spacing=2000, + y_grid_spacing=2000, ) @@ -460,7 +463,8 @@ def test_subset_global_grid_pacific(self): units="degC", spatial_grid="latlon", domain_corner=(0, 175), - grid_spacing=2, + x_grid_spacing=2, + y_grid_spacing=2, ) lower_bound = -1.0e-7 upper_bound = 4 + 1.0e-7 diff --git a/improver_tests/utilities/solar/test_DayNightMask.py b/improver_tests/utilities/solar/test_DayNightMask.py index aee40ea3d9..f467b2dae8 100644 --- a/improver_tests/utilities/solar/test_DayNightMask.py +++ b/improver_tests/utilities/solar/test_DayNightMask.py @@ -148,14 +148,16 @@ def setUp(self): data, "precipitation_amount", "kg m^-2", - grid_spacing=1, + x_grid_spacing=1, + y_grid_spacing=1, domain_corner=(49, -8), ) self.cube_360 = set_up_variable_cube( data, "precipitation_amount", "kg m^-2", - grid_spacing=1, + x_grid_spacing=1, + y_grid_spacing=1, domain_corner=(49, 345), ) self.spot_cube = create_spot_cube(xrange=10, yrange=10) @@ -211,7 +213,8 @@ def setUp(self): "precipitation_amount", "kg m^-2", "equalarea", - grid_spacing=2000, + x_grid_spacing=2000, + y_grid_spacing=2000, domain_corner=(0, -30000), time=vt, frt=vt, @@ -225,7 +228,8 @@ def setUp(self): "precipitation_amount", "kg m^-2", "equalarea", - grid_spacing=2000, + x_grid_spacing=2000, + y_grid_spacing=2000, domain_corner=(0, -30000), time=vt + bounds, time_bounds=(vt, vt + bounds), @@ -237,7 +241,8 @@ def setUp(self): data, "precipitation_amount", "kg m^-2", - grid_spacing=1, + x_grid_spacing=1, + y_grid_spacing=1, domain_corner=(49, -8), time=vt, frt=vt, @@ -246,7 +251,8 @@ def setUp(self): data, "precipitation_amount", "kg m^-2", - grid_spacing=1, + x_grid_spacing=1, + y_grid_spacing=1, domain_corner=(49, 345), time=vt, frt=vt, diff --git a/improver_tests/utilities/test_OccurrenceWithinVicinity.py b/improver_tests/utilities/test_OccurrenceWithinVicinity.py index 80e1fd5a0c..24a14506b2 100644 --- a/improver_tests/utilities/test_OccurrenceWithinVicinity.py +++ b/improver_tests/utilities/test_OccurrenceWithinVicinity.py @@ -58,7 +58,8 @@ def land_mask_cube_generator(shape: Tuple[int, int] = (5, 5)) -> Cube: name="land_binary_mask", units="1", spatial_grid="equalarea", - grid_spacing=2000.0, + x_grid_spacing=2000.0, + y_grid_spacing=2000.0, domain_corner=(0.0, 0.0), ) @@ -95,7 +96,8 @@ def cube() -> Cube: return set_up_variable_cube( np.zeros((5, 5), dtype=np.float32), spatial_grid="equalarea", - grid_spacing=2000.0, + x_grid_spacing=2000.0, + y_grid_spacing=2000.0, domain_corner=(0.0, 0.0), ) @@ -106,7 +108,8 @@ def latlon_cube() -> Cube: return set_up_variable_cube( np.zeros((5, 5), dtype=np.float32), spatial_grid="latlon", - grid_spacing=1.0, + x_grid_spacing=1.0, + y_grid_spacing=1.0, domain_corner=(0.0, 0.0), ) @@ -328,7 +331,8 @@ def cube_with_realizations_fixture() -> Cube: "lwe_precipitation_rate", "m s-1", "equalarea", - grid_spacing=2000.0, + x_grid_spacing=2000.0, + y_grid_spacing=2000.0, domain_corner=(0.0, 0.0), ) diff --git a/improver_tests/utilities/test_TemporalInterpolation.py b/improver_tests/utilities/test_TemporalInterpolation.py index be00c42841..64c72f00d1 100644 --- a/improver_tests/utilities/test_TemporalInterpolation.py +++ b/improver_tests/utilities/test_TemporalInterpolation.py @@ -105,7 +105,8 @@ def diagnostic_cube( frt=frt, spatial_grid=spatial_grid, domain_corner=domain_corner, - grid_spacing=grid_spacing, + x_grid_spacing=grid_spacing, + y_grid_spacing=grid_spacing, realizations=realizations, ) diff --git a/improver_tests/utilities/test_spatial.py b/improver_tests/utilities/test_spatial.py index efcf2fbce2..814dd8affb 100644 --- a/improver_tests/utilities/test_spatial.py +++ b/improver_tests/utilities/test_spatial.py @@ -529,7 +529,8 @@ def setUp(self): "precipitation_amount", "kg m^-2", "equalarea", - grid_spacing=2000, + x_grid_spacing=2000, + y_grid_spacing=2000, domain_corner=(-1000, -1000), ) self.expected_proj_x = np.array( @@ -568,7 +569,8 @@ def setUp(self): "precipitation_amount", "kg m^-2", "equalarea", - grid_spacing=2000000, + x_grid_spacing=2000000, + y_grid_spacing=2000000, domain_corner=(-1000000, -1000000), ) self.expected_lons = np.array( diff --git a/improver_tests/wind_calculations/wind_downscaling/test_RoughnessCorrection.py b/improver_tests/wind_calculations/wind_downscaling/test_RoughnessCorrection.py index 62a2ccab44..598d29876c 100644 --- a/improver_tests/wind_calculations/wind_downscaling/test_RoughnessCorrection.py +++ b/improver_tests/wind_calculations/wind_downscaling/test_RoughnessCorrection.py @@ -56,7 +56,8 @@ def _make_flat_cube(data, name, unit): units=unit, spatial_grid="equalarea", domain_corner=(-1036000, -1158000), - grid_spacing=2000, + x_grid_spacing=2000, + y_grid_spacing=2000, ) for axis in ["x", "y"]: points = flat_cube.coord(axis=axis).points