v3.13 (07 Aug 2025)#

This document explains the changes made to Iris for this release (View all changes.)

v3.13 Release Highlights

The highlights for this minor release of Iris include:

  • Extended iris.loading.LOAD_PROBLEMS to all NetCDF objects added to a Cube during loading, thus providing richer diagnostics to help understand loading issues.

  • Added support for loading and saving multiple Coordinate Reference Systems (CRS) for a Cube when using NetCDF. Additionally, we can now generate a Well-Known Text (WKT) representation of the CRS when saving, which can be useful for interoperability with other tools.

  • Made MeshCoord immutable, with automatic updates when the associated mesh changes.

  • Enabled correct loading and saving of bounds for CF Parametric Vertical Coordinates.

  • In terms of performance, we have made significant improvements to the memory usage of hybrid coordinates, which are now automatically rechunked to avoid excessive memory usage. This is particularly useful for large datasets with derived coordinates, and reference surfaces are now lazy by default. Additionally, weโ€™ve extended NetCDF compression to include auxiliary coordinates and ancillary variables, which can help reduce file sizes and improve loading times ๐Ÿš€

And finally, get in touch with us on GitHub if you have any issues or feature requests for improving Iris. Enjoy!

v3.13.1 (26 Aug 2025)#

v3.13.1 Patches

The patches in this release of Iris include:

  1. Improved compatibility with NumPy >= v1.25 for array comparisons, in response to deprecations around un-broadcastable arrays. See the full entry for more.

๐Ÿ“ข Announcements#

  1. @bjlittle migrated the SciTools social community from X (formally Twitter) to Bluesky ๐Ÿฆ‹. (PR #6237)

โœจ Features#

  1. @trexfeathers and @ukmo-ccbunney extended the iris.loading.LOAD_PROBLEMS capturing to all NetCDF objects that are added to a Cube during loading, as well as a selection of other objects such as CoordSystem. Note this includes an improvement to how DimCoord is โ€˜gracefullyโ€™ converted to AuxCoord if it is masked - the mask is now preserved when it was not previously. See also: Load Problems. (PR #6465, PR #6529)

  2. @wjbenfold and @trexfeathers added crs_wkt to the attributes when saving a CoordSystem to a NetCDF file. Note that crs_wkt is considered supplementary by the CF conventions, with grid_mapping being the primary source of information, and crs_wkt not expected to contain conflicting information. Because of this, Iris generates CoordSystem exclusively from grid_mapping when loading, and writes a fresh crs_wkt whenever a CoordSystem is saved. If your use case goes beyond the CF conventions, you can modify the save and load process for your needs by using the Ncdata package. See CRS WKT in the CF Conventions for more. (Issue #3796, PR #6519)

  3. @ukmo-ccbunney and @trexfeathers added support for multiple coordinate systems and ordered coordinates when loading and saving NetCDF files. This allows for coordinates to be explicitly associated with a coordinate system via an extended syntax in the grid_mapping attribute of a NetCDF data variable. This extended syntax also supports specification of multiple coordinate systems per data variable. Setting the property cube.extended_grid_mapping = True will enable extended grid mapping syntax when saving a NetCDF file and also generate an associated well known text attribute (crs_wkt; as described in Issue #3796). See CRS Grid Mappings and Projections for more information. (Issue #3388:, PR #6536:)

  4. @ESadek-MO made MeshCoords immutable. iris.MeshCoords are now updated automatically when changing the attached mesh. All changes to the iris.MeshCoord should instead be done to the relevant iris.Coord located on the attached iris.MeshXY. This change also affects the behaviour when calling iris.MeshCoord.points and MeshCoord.bounds, which will return real data but will leave the iris.MeshCoord (and attached mesh) lazy. (Issue #4757, PR #6405)

  5. @pp-mo made it possible for the reference surfaces of derived coordinates, like orography, to be lazy. (PR #6517).

  6. @HGWright and @pp-mo enabled correct loading and saving of the bounds of CF parametric coordinates (that is, Iris derived coordinates). This was previously incorrect. However the fix is opt-in, controlled by the derived_bounds flag in the iris.FUTURE object, to avoid breaking existing code. (Issue #3678, PR #6481, PR #6540)

  7. @bjlittle extended zlib compression of Cube data payload when saving to NetCDF to also include any auxiliary coordinates and ancillary variables with the same shape. (Issue #6539, PR #6552)

  8. @pp-mo added support for saving and loading the special GRIB_PARAM attributes to NetCDF, as used by iris-grib to record the exact grib-file encoding of phenomenon types. This means that data sourced from GRIB grib files can be freely saved and re-loaded to NetCDF without loss of information. (Issue Iris-grib#596, PR #6566).

๐Ÿ› Bugs Fixed#

  1. @HGWright added a new warning to inform users that the boolean coordinate generated by iris.coord_categorisation.add_season_membership() is not saveable to NetCDF. (PR #6305)

  2. @bouweandela changed the convert_units method on cubes and coordinates so it also converts the values of the attributes "actual_range", "valid_max", "valid_min", and "valid_range". (PR #6416)

  3. @ukmo-ccbunney fixed loading and merging of masked data in scalar AuxCoords. (Issue #3584, PR #6468)

  4. @stephenworsley fixed the html representation of cubes in Jupyter when coordinates share the same name. (PR #6476)

  5. @schlunma fixed loading of NetCDF files with coordinates that have non-string units. (Issue #6505, PR #6506)

  6. @ukmo-ccbunney correctly set the bplon PP field parameter when saving a cube defined on Limited Area Model (LAM) grid to PP format. Activate this behaviour with the new Futures flag iris.FUTURE.lam_pole_offset=True. (Issue #3560, PR #6520)

  7. @stephenworsley fixed incompatibilities with numpy v2.3 affecting arrays of dates and array printing. (PR #6518)

  8. @stephenworsley fixed a bug which caused concatenate_cube() to fail when concatenating over multiple axes. (PR #6533)

  9. @bjlittle fixed as_data_frame() to correctly convert a scalar cube to a pandas.DataFrame. (Issue #6419, PR #6567)

๐Ÿ’ฃ Incompatible Changes#

  1. N/A

๐Ÿš€ Performance Enhancements#

  1. @pp-mo implemented automatic rechunking of hybrid (aka factory/derived) coordinates to avoid excessive memory usage. (Issue #6404, PR #6516)

๐Ÿ”ฅ Deprecations#

  1. N/A

๐Ÿ”— Dependencies#

  1. N/A

๐Ÿ“š Documentation#

  1. @trexfeathers and @ukmo-ccbunney added Load Problems to the user guide. (PR #6529)

  2. @trexfeathers and @ukmo-ccbunney added a new user guide page: Irisโ€™ Philosophy, for readers who are interested in why Iris is designed/maintained the way it is. Initial content: Code Maintenance, Loading Invalid File Content, Verbose Warnings. (PR #6529)

  3. @tkknight updated image to ensure it renders correctly using various web browsers on Windows and Linux. (PR #6560)

๐Ÿ’ผ Internal#

  1. @pp-mo replaced the PR-based linkchecks with a daily scheduled link checker based on lychee. (Issue #4140, PR #6386)

  2. @trexfeathers added a CI workflow to quickly validate that the benchmarking setup is still working. (PR #6496)

  3. @trexfeathers improved the stack trace for errors that occur during benchmark data generation, showing developers the root problem at-a-glance without needing local replication. (PR #6524)

  4. @bjlittle added support for Trusted Publishing of source distributions and binary wheels to PyPI and Test PyPI. (PR #6543)

  5. @ESadek-MO moved @rcomerโ€™s mocked_compute testing fixture into the conftest.py for the unit testing directory, and used this fixture in iris/tests/unit/analysis/maths/test__arith_dask_array.py and iris/tests/unit/util/maths/test_broadcast_to_shape.py. (Issue #5704, PR #6564)

  6. @DarkVoyager11 added a round trip integration test for NetCDF calendar attributes. (Issue #2985, PR #6562)

  7. @pp-mo made a unified mechanism for โ€˜managedโ€™ cube attributes: ones which get converted between an iris-internal and an in-file form for saving/loading to NetCDF, such as STASH objects in a STASH attribute. (PR #6566).