From 5496ebcee49294e0f5993991969dae99762f5f40 Mon Sep 17 00:00:00 2001 From: Ruth Comer <10599679+rcomer@users.noreply.github.com> Date: Thu, 30 Nov 2023 16:44:15 +0000 Subject: [PATCH] Fix pp save of realization coordinate (#5568) * Fix pp save of realization coordinate * Reduce lbrsvd to 4 elements Co-authored-by: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> * review actions * credit reviewer --------- Co-authored-by: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> --- docs/src/whatsnew/latest.rst | 3 +++ lib/iris/fileformats/pp_save_rules.py | 14 +++++++++++--- lib/iris/tests/unit/fileformats/pp/test_save.py | 12 ++++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/docs/src/whatsnew/latest.rst b/docs/src/whatsnew/latest.rst index de69eddd4e..4c6f06e13f 100644 --- a/docs/src/whatsnew/latest.rst +++ b/docs/src/whatsnew/latest.rst @@ -76,6 +76,9 @@ This document explains the changes made to Iris for this release #. `@acchamber`_ and `@rcomer`_ modified 2D plots so that time axes and their ticks have more sensible default labels. (:issue:`5426`, :pull:`5561`) +#. `@rcomer`_ and `@trexfeathers`_ (reviewer) added handling for realization + coordinates when saving pp files (:issue:`4747`, :pull:`5568`) + 💣 Incompatible Changes ======================= diff --git a/lib/iris/fileformats/pp_save_rules.py b/lib/iris/fileformats/pp_save_rules.py index 7db21d5f99..9effba3c0a 100644 --- a/lib/iris/fileformats/pp_save_rules.py +++ b/lib/iris/fileformats/pp_save_rules.py @@ -614,7 +614,7 @@ def _non_std_cross_section_rules(cube, pp): def _lbproc_rules(cube, pp): """ - Rules for setting the horizontal grid and pole location of the PP field. + Rules for setting the processing code of the PP field. Note: `pp.lbproc` must be set to 0 before these rules are run. @@ -844,7 +844,10 @@ def _vertical_rules(cube, pp): def _all_other_rules(cube, pp): """ - Rules for setting the horizontal grid and pole location of the PP field. + Fields currently managed by these rules: + + * lbfc (field code) + * lbrsvd[3] (ensemble member number) Args: cube: the cube being saved as a series of PP fields. @@ -859,13 +862,18 @@ def _all_other_rules(cube, pp): if check_items in CF_TO_LBFC: pp.lbfc = CF_TO_LBFC[check_items] - # Set STASH code. + # Set field code. if ( "STASH" in cube.attributes and str(cube.attributes["STASH"]) in STASH_TRANS ): pp.lbfc = STASH_TRANS[str(cube.attributes["STASH"])].field_code + # Set ensemble member number. + real_coord = scalar_coord(cube, "realization") + if real_coord is not None: + pp.lbrsvd[3] = real_coord.points[0] + return pp diff --git a/lib/iris/tests/unit/fileformats/pp/test_save.py b/lib/iris/tests/unit/fileformats/pp/test_save.py index fc0535f428..f49d389841 100644 --- a/lib/iris/tests/unit/fileformats/pp/test_save.py +++ b/lib/iris/tests/unit/fileformats/pp/test_save.py @@ -43,6 +43,18 @@ def test_grid_and_pole__scalar_dim_longitude(unit, modulus): assert field.lbnpt == lon.points.size +def test_realization(): + cube = stock.lat_lon_cube() + real_coord = DimCoord(42, standard_name="realization", units=1) + cube.add_aux_coord(real_coord) + with mock.patch("iris.fileformats.pp.PPField3", autospec=True) as pp_field: + pp_field.lbrsvd = list(range(4)) + verify(cube, pp_field) + member_number = pp_field.lbrsvd[3] + + assert member_number == 42 + + def _pp_save_ppfield_values(cube): """ Emulate saving a cube as PP, and capture the resulting PP field values.