v2.2 (11 Oct 2018)
******************

This document explains the changes made to Iris for this release
(:doc:`View all changes <index>`.)


Features
========

.. _showcase:

.. admonition:: 2-Dimensional Coordinate Plotting

  The Iris plot functions :func:`~iris.plot.pcolor` and
  :func:`~iris.plot.pcolormesh` now accommodate the plotting of 2-dimensional
  coordinates as well as 1-dimensional coordinates.

  To enable this feature, each coordinate passed in for plotting will be
  automatically checked for contiguity.  Coordinate bounds must either be
  contiguous, or the cube's data must be masked at the discontiguities in
  order to avoid plotting errors.

  The Iris plot function :func:`iris.plot.quiver` has been added, and this
  also works with 2-dimensional plot coordinates.

.. admonition:: 2-Dimensional Grid Vectors

  The Iris functions :func:`iris.analysis.cartography.gridcell_angles` and
  :func:`iris.analysis.cartography.rotate_grid_vectors` have been added,
  allowing you to convert gridcell-oriented vectors to true-North/East ones.

.. admonition:: NetCDF Data Variable Chunk Sizes

  NetCDF data variable chunk sizes are now utilised at load time for
  significant performance improvements.

* The :class:`iris.fileformats.um.FieldCollation` objects, which are passed
  into load callbacks when using
  :func:`iris.fileformats.um.structured_um_loading`, now
  have the additional properties:
  :data:`iris.fileformats.um.FieldCollation.data_filepath` and
  :data:`iris.fileformats.um.FieldCollation.data_field_indices`.
  These provide the file locations of the original data fields, which are
  otherwise lost in the structured loading process.

* :func:`iris.util.reverse` can now be used to reverse a cube by specifying
  one or more coordinates.

* Time mean fields can now be saved to PP files as a cell method.

* Cube aggregators :func:`iris.analysis.MIN`, :func:`iris.analysis.MAX`,
  :func:`iris.analysis.SUM` and :func:`iris.analysis.COUNT` now perform lazy
  aggregation by utilizing dask.

* Error messages thrown upon failed addition of an
  :class:`~iris.aux_factory.AuxCoordFactory` now include the name of the
  required (but absent) coordinate as well as the name of the cube.

* The function :func:`iris.util.find_discontiguities` can be used to check for
  discontiguities in the bounds arrays of cube coordinates.  Additionally,
  discontiguous points in coordinates can be explicitly masked
  using another new feature :func:`iris.util.mask_cube`.

* :func:`iris.util.array_equal` now has a 'withnans' keyword, which provides
  a NaN-tolerant array comparison.


Bugs Fixed
==========

* The bug has been fixed that prevented printing time coordinates with bounds
  when the time coordinate was measured on a long interval (that is, ``months``
  or ``years``).

* "Gracefully filling..." warnings are now only issued when the coordinate or
  bound data is actually masked.


v2.2.1 (28 May 2019)
--------------------

* Iris can now correctly unpack a column of header objects when saving a
  pandas DataFrame to a cube.
  
* fixed a bug in :meth:`iris.util.new_axis` : copying the resulting cube
  resulted in an exception, if it contained an aux-factory.

* :class:`iris.coords.AuxCoord`'s can now test as 'equal' even when the points
  or bounds arrays contain NaN values, if values are the same at all points.
  Previously this would fail, as conventionally "NaN != NaN" in normal
  floating-point arithmetic.


Internal
========

* Iris is now using the latest version release of dask (currently 0.19.3)

* Proj4 has been temporarily pinned to version < 5 while problems with the
  Mollweide projection are addressed.

* Matplotlib has been pinned to version < 3 temporarily while we account for
  its changes in all SciTools libraries.


Documentation
=============

* Iris' `INSTALL` document has been updated to include guidance for running
  tests.

* A link has been added to the Developers' Guide to make it easier to find the
  Pull Request Check List.

