From 58fddad570cd737fd00eb25a350d4aeb20b2b16d Mon Sep 17 00:00:00 2001 From: marqh Date: Wed, 22 Apr 2015 10:37:47 +0000 Subject: [PATCH 1/2] numerical tolerance --- lib/iris/cube.py | 8 ++++++-- lib/iris/tests/unit/cube/test_Cube.py | 8 ++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/lib/iris/cube.py b/lib/iris/cube.py index 7d60457c01..a58d4f3361 100644 --- a/lib/iris/cube.py +++ b/lib/iris/cube.py @@ -2113,7 +2113,6 @@ def _intersect(self, name_or_coord, minimum, maximum, if modulus is None: raise ValueError('coordinate units with no modulus are not yet' ' supported') - subsets, points, bounds = self._intersect_modulus(coord, minimum, maximum, min_inclusive, @@ -2234,7 +2233,12 @@ def _intersect_modulus(self, coord, minimum, maximum, min_inclusive, # and call the new bounds = the new points + the difference. pre_wrap_delta = np.diff(coord.bounds[inside_indices]) post_wrap_delta = np.diff(bounds[inside_indices]) - split_cell_indices, _ = np.where(pre_wrap_delta != post_wrap_delta) + close_enough = np.allclose(pre_wrap_delta, post_wrap_delta) + if close_enough: + split_cell_indices = np.array(()) + else: + split_cell_indices, _ = np.where(pre_wrap_delta != + post_wrap_delta) if split_cell_indices.size: # Recalculate the extended minimum. indices = inside_indices[split_cell_indices] diff --git a/lib/iris/tests/unit/cube/test_Cube.py b/lib/iris/tests/unit/cube/test_Cube.py index b09b602252..a44684f8d3 100644 --- a/lib/iris/tests/unit/cube/test_Cube.py +++ b/lib/iris/tests/unit/cube/test_Cube.py @@ -1051,6 +1051,14 @@ def test_decrementing_wrapped(self): self.assertEqual(result.data[0, 0, 0], 350) self.assertEqual(result.data[0, 0, -1], 10) + def test_numerical_tolerance(self): + # test the tolerance on the coordinate value is not causing a + # modulus wrapping + cube = create_cube(28.5, 68.5, bounds=True) + result = cube.intersection(longitude=(27.74, 68.61)) + self.assertAlmostEqual(result.coord('longitude').points[0], 28.5) + self.assertAlmostEqual(result.coord('longitude').points[-1], 67.5) + def unrolled_cube(): data = np.arange(5, dtype='f4') From c881ec80735ccf155449d2c2dc17eca0704cbfa5 Mon Sep 17 00:00:00 2001 From: marqh Date: Wed, 22 Apr 2015 13:09:20 +0000 Subject: [PATCH 2/2] review refactor --- lib/iris/cube.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/iris/cube.py b/lib/iris/cube.py index a58d4f3361..9533dbd222 100644 --- a/lib/iris/cube.py +++ b/lib/iris/cube.py @@ -2234,12 +2234,10 @@ def _intersect_modulus(self, coord, minimum, maximum, min_inclusive, pre_wrap_delta = np.diff(coord.bounds[inside_indices]) post_wrap_delta = np.diff(bounds[inside_indices]) close_enough = np.allclose(pre_wrap_delta, post_wrap_delta) - if close_enough: - split_cell_indices = np.array(()) - else: + if not close_enough: split_cell_indices, _ = np.where(pre_wrap_delta != post_wrap_delta) - if split_cell_indices.size: + # Recalculate the extended minimum. indices = inside_indices[split_cell_indices] cells = bounds[indices]