v1.8 (14 Apr 2015) ****************** This document explains the changes made to Iris for this release (:doc:`View all changes `.) Features ======== .. _showcase: .. admonition:: Showcase: Rotate winds Iris can now rotate and unrotate wind vector data by transforming the wind vector data to another coordinate system. For example:: >>> from iris.analysis.cartography import rotate_winds >>> u_cube = iris.load_cube('my_rotated_u_wind_cube.pp') >>> v_cube = iris.load_cube('my_rotated_v_wind_cube.pp') >>> target_cs = iris.coord_systems.GeogCS(6371229.0) >>> u_prime, v_prime = rotate_winds(u_cube, v_cube, target_cs) .. admonition:: Showcase: Nearest-neighbour scheme A nearest-neighbour scheme for interpolation and regridding has been added to Iris. This joins the existing :class:`~iris.analysis.Linear` and :class:`~iris.analysis.AreaWeighted` interpolation and regridding schemes. For example:: >>> result = cube.interpolate(sample_points, iris.analysis.Nearest()) >>> regridded_cube = cube.regrid(target_grid, iris.analysis.Nearest()) .. admonition:: Showcase: Slices over a coordinate You can slice over one or more dimensions of a cube using :meth:`iris.cube.Cube.slices_over`. This provides similar functionality to :meth:`~iris.cube.Cube.slices` but with almost the opposite outcome. Using :meth:`~iris.cube.Cube.slices` to slice a cube on a selected dimension returns all possible slices of the cube with the selected dimension retaining its dimensionality. Using :meth:`~iris.cube.Cube.slices_over` to slice a cube on a selected dimension returns all possible slices of the cube over the selected dimension. To demonstrate this:: >>> cube = iris.load(iris.sample_data_path('colpex.pp'))[0] >>> print(cube.summary(shorten=True)) air_potential_temperature / (K) (time: 6; model_level_number: 10; grid_latitude: 83; grid_longitude: 83) >>> my_slice = next(cube.slices('time')) >>> my_slice_over = next(cube.slices_over('time')) >>> print(my_slice.summary(shorten=True)) air_potential_temperature / (K) (time: 6) >>> print(my_slice_over.summary(shorten=True)) air_potential_temperature / (K) (model_level_number: 10; grid_latitude: 83; grid_longitude: 83) * :func:`iris.cube.CubeList.concatenate` now works with `biggus `_ arrays and so now supports concatenation of cubes with deferred data. * Improvements to NetCDF saving through using biggus: * A cube's lazy data payload will still be lazy after saving; the data will not be loaded into memory by the save operation. * Cubes with data payloads larger than system memory can now be saved to NetCDF through biggus streaming the data to disk. * :func:`iris.util.demote_dim_coord_to_aux_coord` and :func:`iris.util.promote_aux_coord_to_dim_coord` allow a coordinate to be easily demoted or promoted within a cube. * :func:`iris.util.squeeze` removes all length 1 dimensions from a cube, and demotes any associated squeeze dimension :class:`~iris.coords.DimCoord` to be a scalar coordinate. * :meth:`iris.cube.Cube.slices_over`, which returns an iterator of all sub-cubes along a given coordinate or dimension index. * :meth:`iris.cube.Cube.interpolate` now accepts datetime.datetime and netcdftime.datetime instances for date or time coordinates. * Many new and updated translations between CF spec and STASH codes or GRIB2 parameter codes. * PP/FF loader creates a height coordinate at 1.5m or 10m for certain relevant stash codes. * Lazy aggregator support for the :class:`standard deviation ` aggregator has been added. * A speed improvement in calculation of :func:`iris.analysis.cartography.area_weights`. * Experimental support for unstructured grids has been added with :func:`iris.experimental.ugrid`. This has been implemented using `UGRID `_. * :meth:`iris.cube.CubeList.extract_overlapping` supports extraction of cubes over regions where common coordinates overlap, over multiple coordinates. * Warnings raised due to invalid units in loaded data have been suppressed. * Experimental low-level read and write access for FieldsFile variants is now supported via :class:`iris.experimental.um.FieldsFileVariant`. * PP loader will return cubes for all fields prior to a field with a problematic header before raising an exception. * NetCDF loader skips invalid global attributes, raising a warning rather than raising an exception. * A warning is now raised rather than an exception when constructing an :class:`~iris.aux_factory.AuxCoordFactory` fails. * Supported :class:`aux coordinate factories ` have been extended to include: * ``ocean sigma coordinate``, * ``ocean s coordinate``, * ``ocean s coordinate, generic form 1``, and * ``ocean s coordinate, generic form 2``. * :meth:`iris.cube.Cube.intersection` now supports taking a points-only intersection. Any bounds on intersected coordinates are ignored but retained. * The FF loader's known handled grids now includes ``Grid 21``. * A :class:`nearest neighbour ` scheme is now provided for :meth:`iris.cube.Cube.interpolate` and :meth:`iris.cube.Cube.regrid`. * :func:`iris.analysis.cartography.rotate_winds` supports transformation of wind vectors to a different coordinate system. * NumPy universal functions can now be applied to cubes using :func:`iris.analysis.maths.apply_ufunc`. * Generic functions can be applied to :class:`~iris.cube.Cube` instances using :class:`iris.analysis.maths.IFunc`. * The :class:`iris.analysis.Linear` scheme now supports regridding as well as interpolation. This enables :meth:`iris.cube.Cube.regrid` to perform bilinear regridding, which now replaces the experimental routine "iris.experimental.regrid.regrid_bilinear_rectilinear_src_and_grid". Bugs Fixed ========== * Fix in netCDF loader to correctly determine whether the longitude coordinate (including scalar coordinates) is circular. * :meth:`iris.cube.Cube.intersection` now supports bounds that extend slightly beyond 360 degrees. * Lateral Boundary Condition (LBC) type FieldFiles are now handled correctly by the FF loader. * Making a copy of a scalar cube with no data now correctly copies the data array. * Height coordinates in NAME trajectory output files have been changed to match other NAME output file formats. * Fixed datatype when loading an ``integer_constants`` array from a FieldsFile. * FF/PP loader adds appropriate cell methods for ``lbtim.ib = 3`` intervals. * An exception is raised if the units of the latitude and longitude coordinates of the cube passed into :func:`iris.analysis.cartography.area_weights` are not convertible to radians. * GRIB1 loader now creates a time coordinate for a time range indicator of 2. * NetCDF loader now loads units that are empty strings as dimensionless. v1.8.1 (03 Jun 2015) -------------------- * The PP loader now carefully handles floating point errors in date time conversions to hours. * The handling fill values for lazy data loaded from NetCDF files is altered, such that the _FillValue set in the file is preserved through lazy operations. * The risk that cube intersections could return incorrect results due to floating point tolerances is reduced. * The new GRIB2 loading code is altered to enable the loading of various data representation templates; the data value unpacking is handled by the GRIB API. * Saving cube collections to NetCDF, where multiple similar aux-factories exist within the cubes, is now carefully handled such that extra file variables are created where required in some cases. Deprecations ============ * The original GRIB loader has been deprecated and replaced with a new template-based GRIB loader. * Deprecated default NetCDF save behaviour of assigning the outermost dimension to be unlimited. Switch to the new behaviour with no auto assignment by setting :data:`iris.FUTURE.netcdf_no_unlimited` to True. * The former experimental method "iris.experimental.regrid.regrid_bilinear_rectilinear_src_and_grid" has been removed, as :class:`iris.analysis.Linear` now includes this functionality. Documentation ============= * A chapter on :doc:`merge and concatenate ` has been added to the :doc:`user guide `. * A section on installing Iris using `conda `_ has been added to the :doc:`install guide `. * Updates to the chapter on :doc:`regridding and interpolation ` have been added to the :doc:`user guide `.