diff --git a/lib/iris/analysis/maths.py b/lib/iris/analysis/maths.py index 0de97b02f3..46efe76689 100644 --- a/lib/iris/analysis/maths.py +++ b/lib/iris/analysis/maths.py @@ -944,6 +944,10 @@ def _math_op_common( new_cube.data = ma.masked_array(0, 1, dtype=new_dtype) iris.analysis.clear_phenomenon_identity(new_cube) + for cm in cube.cell_measures(): + new_cube.remove_cell_measure(cm) + for av in cube.ancillary_variables(): + new_cube.remove_ancillary_variable(av) new_cube.units = new_unit return new_cube diff --git a/lib/iris/tests/unit/analysis/maths/__init__.py b/lib/iris/tests/unit/analysis/maths/__init__.py index e706e53292..64065e420b 100644 --- a/lib/iris/tests/unit/analysis/maths/__init__.py +++ b/lib/iris/tests/unit/analysis/maths/__init__.py @@ -11,7 +11,7 @@ from numpy import ma from iris.analysis import MEAN -from iris.coords import DimCoord +from iris.coords import DimCoord, CellMeasure, AncillaryVariable from iris.cube import Cube import iris.tests as tests import iris.tests.stock as stock @@ -212,3 +212,36 @@ def test_masked_constant_not_in_place(self): self.assertMaskedArrayEqual(ma.masked_array(0, 1), res.data) self.assertEqual(dtype, res.dtype) self.assertIsNot(res, cube) + + +class CubeArithmeticAncillaryHandlingTestMixin(metaclass=ABCMeta): + @property + @abstractmethod + def cube_func(self): + # Define an iris arithmetic function to be called + # I.E. 'iris.analysis.maths.xx'. + pass + + def test_cell_measure_removal(self): + cube1 = Cube([0]) + cm = CellMeasure([0], long_name="cm") + cube1.add_cell_measure(cm) + cube2 = Cube([0]) + res1 = cube1 + cube2 + res2 = cube2 + cube1 + res3 = cube1 + cube1 + self.assertEqual(res1.cell_measures(), []) + self.assertEqual(res2.cell_measures(), []) + self.assertEqual(res3.cell_measures(), []) + + def test_ancillary_removal(self): + cube1 = Cube([0]) + av = AncillaryVariable([0], long_name="av") + cube1.add_ancillary_variable(av) + cube2 = Cube([0]) + res1 = cube1 + cube2 + res2 = cube2 + cube1 + res3 = cube1 + cube1 + self.assertEqual(res1.ancillary_variables(), []) + self.assertEqual(res2.ancillary_variables(), []) + self.assertEqual(res3.ancillary_variables(), []) diff --git a/lib/iris/tests/unit/analysis/maths/test_add.py b/lib/iris/tests/unit/analysis/maths/test_add.py index 22f54e0a91..3a39c17447 100644 --- a/lib/iris/tests/unit/analysis/maths/test_add.py +++ b/lib/iris/tests/unit/analysis/maths/test_add.py @@ -17,6 +17,7 @@ CubeArithmeticCoordsTest, CubeArithmeticMaskedConstantTestMixin, CubeArithmeticMaskingTestMixin, + CubeArithmeticAncillaryHandlingTestMixin, ) @@ -70,5 +71,14 @@ def cube_func(self): return add +@tests.iristest_timing_decorator +class TestAncillaryHandling( + tests.IrisTest_nometa, CubeArithmeticAncillaryHandlingTestMixin +): + @property + def cube_func(self): + return add + + if __name__ == "__main__": tests.main() diff --git a/lib/iris/tests/unit/analysis/maths/test_divide.py b/lib/iris/tests/unit/analysis/maths/test_divide.py index c184a2cacc..305f58ca60 100644 --- a/lib/iris/tests/unit/analysis/maths/test_divide.py +++ b/lib/iris/tests/unit/analysis/maths/test_divide.py @@ -18,6 +18,7 @@ CubeArithmeticBroadcastingTestMixin, CubeArithmeticMaskingTestMixin, CubeArithmeticCoordsTest, + CubeArithmeticAncillaryHandlingTestMixin, ) @@ -86,5 +87,14 @@ def test_reversed_points(self): divide(cube1, cube2) +@tests.iristest_timing_decorator +class TestAncillaryHandling( + tests.IrisTest_nometa, CubeArithmeticAncillaryHandlingTestMixin +): + @property + def cube_func(self): + return divide + + if __name__ == "__main__": tests.main() diff --git a/lib/iris/tests/unit/analysis/maths/test_multiply.py b/lib/iris/tests/unit/analysis/maths/test_multiply.py index ed19f5bf09..6dfeb17056 100644 --- a/lib/iris/tests/unit/analysis/maths/test_multiply.py +++ b/lib/iris/tests/unit/analysis/maths/test_multiply.py @@ -17,6 +17,7 @@ CubeArithmeticCoordsTest, CubeArithmeticMaskedConstantTestMixin, CubeArithmeticMaskingTestMixin, + CubeArithmeticAncillaryHandlingTestMixin, ) @@ -70,5 +71,14 @@ def cube_func(self): return multiply +@tests.iristest_timing_decorator +class TestAncillaryHandling( + tests.IrisTest_nometa, CubeArithmeticAncillaryHandlingTestMixin +): + @property + def cube_func(self): + return multiply + + if __name__ == "__main__": tests.main()