From f621b708ea273fbcf5e269c5c9bfebf9d3916d76 Mon Sep 17 00:00:00 2001 From: Peter Killick Date: Tue, 18 Nov 2014 14:25:45 +0000 Subject: [PATCH 1/3] Add merge and concatenate chapter to user guide --- docs/iris/src/userguide/concat.svg | 783 +++++++++++++++++++ docs/iris/src/userguide/index.rst | 1 + docs/iris/src/userguide/merge.svg | 715 +++++++++++++++++ docs/iris/src/userguide/merge_and_concat.rst | 644 +++++++++++++++ docs/iris/src/userguide/merge_and_concat.svg | 362 +++++++++ 5 files changed, 2505 insertions(+) create mode 100644 docs/iris/src/userguide/concat.svg create mode 100644 docs/iris/src/userguide/merge.svg create mode 100644 docs/iris/src/userguide/merge_and_concat.rst create mode 100644 docs/iris/src/userguide/merge_and_concat.svg diff --git a/docs/iris/src/userguide/concat.svg b/docs/iris/src/userguide/concat.svg new file mode 100644 index 0000000000..8caa7a0386 --- /dev/null +++ b/docs/iris/src/userguide/concat.svg @@ -0,0 +1,783 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + x + + + + + + + + + + + + + + + + + 0 + + 1 + 2 + 3 + 0 + 1 + 2 + 3 + + + + + + t + y + t + y + + + + + + + + + + + + diff --git a/docs/iris/src/userguide/index.rst b/docs/iris/src/userguide/index.rst index 1fe9b819ad..2273647af8 100644 --- a/docs/iris/src/userguide/index.rst +++ b/docs/iris/src/userguide/index.rst @@ -31,6 +31,7 @@ User guide table of contents subsetting_a_cube.rst plotting_a_cube.rst interpolation_and_regridding.rst + merge_and_concat.rst cube_statistics.rst cube_maths.rst citation.rst diff --git a/docs/iris/src/userguide/merge.svg b/docs/iris/src/userguide/merge.svg new file mode 100644 index 0000000000..3e6359c45e --- /dev/null +++ b/docs/iris/src/userguide/merge.svg @@ -0,0 +1,715 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + y + + + + + + + + + + + + + + + + + + + + + 0 + + 1 + 2 + 3 + 0 + 1 + 2 + 3 + + + + + + + + + x + z + x + z + + + diff --git a/docs/iris/src/userguide/merge_and_concat.rst b/docs/iris/src/userguide/merge_and_concat.rst new file mode 100644 index 0000000000..61a029cd42 --- /dev/null +++ b/docs/iris/src/userguide/merge_and_concat.rst @@ -0,0 +1,644 @@ +.. _merge_and_concat: + +===================== +Merge and Concatenate +===================== + +We saw in the :doc:`loading_iris_cubes` chapter that Iris tries to load as few cubes as +possible. This is done by collecting together multiple fields with a shared standard +name (and other key metadata) into a single multidimensional cube. The processes that +perform this behaviour in Iris are known as ``merge`` and ``concatenate``. + +This chapter describes the ``merge`` and ``concatenate`` processes; it explains +why common issues occur when using them and gives advice on how prevent these +issues from occurring. + +Both ``merge`` and ``concatenate`` take multiple cubes as input and +result in fewer cubes as output. The following diagram illustrates the two processes: + +.. image:: merge_and_concat.svg + :alt: Pictographic of merge and concatenation. + :align: center + +There is one major difference between the ``merge`` and ``concatenate`` processes. +The ``merge`` process combines multiple input cubes into a +single resultant cube with new dimensions created from the +*scalar coordinate values* of the input cubes. +The ``concatenate`` process process combines multiple input cubes into a +single resultant cube with the same *number of dimensions* as the input cubes, +but with the length of one or more dimensions extended by *joining together +sequential dimension coordinates*. + + +Let's imagine 28 individual cubes representing the +temperature at a location ``(y, x)``, one cube for each day of February. We can use +:meth:`~iris.cube.CubeList.merge` to combine the 28 ``(y, x)`` cubes into +a single ``(t, y, x)`` cube, where the length of the ``t`` dimension is 28. + +Now imagine 12 individual cubes representing daily temperature at a time and +location ``(t, y, x)``, one cube for each month in the year. We can use +:meth:`~iris.cube.CubeList.concatenate` to combine the 12 +``(t, y, x)`` cubes into a single ``(t, y, x)`` cube, where the length +of the ``t`` dimension is now 365. + + +Merge +----- + +We've seen that the ``merge`` process combines multiple input cubes into a +single resultant cube with new dimensions created from the +*scalar coordinate values* of the input cubes. + +In order to construct new coordinates for the new dimensions, the ``merge`` process requires input cubes +with scalar coordinates that can be combined together into monotonic sequences. +The order of the input cubes does not affect the ``merge`` process. + +The ``merge`` process can produce a cube that has more than one new dimension, +if the scalar coordinate sequences form an orthogonal basis. + +.. important:: + + The shape, metadata, attributes, coordinates, coordinates metadata, fill value and + other aspects of the input cubes must be consistent across all of the input cubes. + + The ``merge`` process will fail if these are not consistent. Such failures are + covered in the :ref:`merge_concat_common_issues` section. + + +The ``merge`` process can be accessed using two methods. The two methods are +:meth:`~iris.cube.CubeList.merge` and :meth:`~iris.cube.CubeList.merge_cube`, +which are described below. + + +Using CubeList.merge +==================== + +The :meth:`CubeList.merge ` method operates on a list +of cubes and returns a new :class:`~iris.cube.CubeList` containing the cubes +that have been merged. + +.. testsetup:: merge + + import numpy as np + import iris + def _xy_cube(z): + cube = iris.cube.Cube(np.arange(20).reshape(4, 5), 'air_temperature', units='kelvin') + cube.add_dim_coord(iris.coords.DimCoord(range(4), long_name='y'), 0) + cube.add_dim_coord(iris.coords.DimCoord(range(5), long_name='x'), 1) + cube.add_aux_coord(iris.coords.DimCoord(z, long_name='z', units='meters')) + return cube + cubes = iris.cube.CubeList([_xy_cube(1), _xy_cube(2), _xy_cube(3)]) + + +Let's have a look at the :meth:`~iris.cube.CubeList.merge` method in operation. +In this example we have a list of three lateral (*x*, *y*) cubes in a +variable called ``cubes``, each with a scalar ``z`` coordinate of +differing value. We can merge these cubes by stacking the scalar ``z`` coordinates to +make a new ``z`` dimension coordinate: + +.. doctest:: merge + :options: +ELLIPSIS, +NORMALIZE_WHITESPACE + + >>> print cubes + 0: air_temperature / (kelvin) (y: 4; x: 5) + 1: air_temperature / (kelvin) (y: 4; x: 5) + 2: air_temperature / (kelvin) (y: 4; x: 5) + + >>> print cubes[0] + air_temperature / (kelvin) (y: 4; x: 5) + ... + Scalar coordinates: + z: 1 meters + >>> print cubes[1] + air_temperature / (kelvin) (y: 4; x: 5) + ... + Scalar coordinates: + z: 2 meters + >>> print cubes[2] + air_temperature / (kelvin) (y: 4; x: 5) + ... + Scalar coordinates: + z: 3 meters + + >>> print cubes.merge() + 0: air_temperature / (kelvin) (z: 3; y: 4; x: 5) + +The following diagram illustrates what has taken place in this example: + +.. image:: merge.svg + :alt: Pictographic of merge. + :align: center + +The diagram illustrates that we have three input cubes of identical shape +that stack on the ``z`` dimension. +After merging our three input cubes we get a new :class:`~iris.cube.CubeList` containing +one cube with a new ``z`` coordinate. + + +Using CubeList.merge_cube +========================= + +The :meth:`~iris.cube.CubeList.merge_cube` method guarantees that *exactly one cube will be returned* +as a result of merging the input cubes. +If :meth:`~iris.cube.CubeList.merge_cube` cannot fulfil this guarantee, a descriptive error +will be raised providing details to help diagnose the differences between the input cubes. +In contrast, the :meth:`~iris.cube.CubeList.merge` method makes no check on the number of cubes returned. + +To demonstrate the differences between :meth:`~iris.cube.CubeList.merge` +and :meth:`~iris.cube.CubeList.merge_cube`, let's return to our three cubes +from the earlier merge example. + +For the purposes of this example a ``Conventions`` attribute has been added to the first +cube's :data:`~iris.cube.Cube.attributes` dictionary. +Remember that the attributes *must* be consistent across all cubes in order to merge +into a single cube: + +.. testsetup:: merge_vs_merge_cube + + import numpy as np + import iris + def _xy_cube(z): + cube = iris.cube.Cube(np.arange(20).reshape(4, 5), 'air_temperature', units='kelvin') + cube.add_dim_coord(iris.coords.DimCoord(range(4), long_name='y'), 0) + cube.add_dim_coord(iris.coords.DimCoord(range(5), long_name='x'), 1) + cube.add_aux_coord(iris.coords.DimCoord(z, long_name='z', units='meters')) + return cube + cubes = iris.cube.CubeList([_xy_cube(1), _xy_cube(2), _xy_cube(3)]) + cubes[0].attributes['Conventions'] = 'CF-1.5' + +.. doctest:: merge_vs_merge_cube + :options: +ELLIPSIS, +NORMALIZE_WHITESPACE + + >>> print cubes + 0: air_temperature / (kelvin) (y: 4; x: 5) + 1: air_temperature / (kelvin) (y: 4; x: 5) + 2: air_temperature / (kelvin) (y: 4; x: 5) + + >>> print cubes[0].attributes + {'Conventions': 'CF-1.5'} + >>> print cubes[1].attributes + {} + >>> print cubes[2].attributes + {} + + >>> print cubes.merge() + 0: air_temperature / (kelvin) (y: 4; x: 5) + 1: air_temperature / (kelvin) (z: 2; y: 4; x: 5) + + >>> print cubes.merge_cube() + Traceback (most recent call last): + ... + raise iris.exceptions.MergeError(msgs) + iris.exceptions.MergeError: failed to merge into a single cube. + cube.attributes keys differ: 'Conventions' + +Note that :meth:`~iris.cube.CubeList.merge` returns two cubes here. +All the cubes that can be merged have been. Any cubes that can't be merged are +included unchanged in the returned :class:`~iris.cube.CubeList`. +When :meth:`~iris.cube.CubeList.merge_cube` is called on ``cubes`` it raises a +descriptive error that highlights the difference in the ``attributes`` dictionaries. +It is this difference that is preventing ``cube`` being merged into a +single cube. An example of fixing an issue like this can be found in the +:ref:`merge_concat_common_issues` section. + + +Merge in Iris load +================== + +The CubeList's :meth:`~iris.cube.CubeList.merge` method is used internally +by the three main Iris load functions introduced in :doc:`loading_iris_cubes`. +For file formats such as GRIB and PP, which intrinsically store fields as many +individual 2D arrays, Iris loading uses the ``merge`` process to produce a +more intuitive higher dimensional cube of each phenomenon. + +Sometimes the ``merge`` process doesn't behave as expected. In almost all +cases this is due to the input cubes containing unexpected or inconsistent metadata. +For this reason, a fourth Iris file loading function, :func:`iris.load_raw`, exists. +The :func:`~iris.load_raw` function is intended as a diagnostic tool that can be used to +load cubes from files without the ``merge`` process taking place. The return value of +:func:`iris.load_raw` is always a :class:`~iris.cube.CubeList` instance. + + +Concatenate +----------- + +We've seen that the ``concatenate`` process process combines multiple input cubes into a +single resultant cube with the same *number of dimensions* as the input cubes, +but with the length of one or more dimensions extended by *joining together +sequential dimension coordinates*. + +In order to extend the dimensions lengths, the ``concatenate`` process requires input cubes +with dimension coordinates that can be combined together into monotonic sequences. +The order of the input cubes does not affect the ``concatenate`` process. + +.. important:: + + The shape, metadata, attributes, coordinates, coordinates metadata, fill value and + other aspects of the input cubes must be consistent across all of the input cubes. + + The ``concatenate`` process will fail if these are not consistent. Such failures are + covered in the :ref:`merge_concat_common_issues` section. + + +The ``concatenate`` process can be accessed using two methods. The two methods are +:meth:`~iris.cube.CubeList.concatenate` and :meth:`~iris.cube.CubeList.concatenate_cube`, +which are described below. + + +Using CubeList.concatenate +========================== + +The :meth:`CubeList.concatenate ` method operates on a list +of cubes and returns a new :class:`~iris.cube.CubeList` containing the cubes +that have been concatenated. + +Let's have a look at the :meth:`~iris.cube.CubeList.concatenate` method in operation. +In the example below we have three 3D (*x*, *y*, *t*) cubes whose ``t`` coordinates +have sequentially increasing ranges. +These cubes can be concatenated by combining the ``t`` coordinates of the input +cubes to form a new cube with an extended ``t`` coordinate: + +.. testsetup:: concatenate + + import numpy as np + import iris + def _xyt_cube(t): + cube = iris.cube.Cube(np.arange(12 * len(t)).reshape(-1, 3, 4), 'air_temperature', units='kelvin') + cube.add_dim_coord(iris.coords.DimCoord(range(3), long_name='y'), 1) + cube.add_dim_coord(iris.coords.DimCoord(range(4), long_name='x'), 2) + cube.add_dim_coord(iris.coords.DimCoord(t, long_name='t'), 0) + return cube + cubes = iris.cube.CubeList([_xyt_cube(np.arange(31)), _xyt_cube(np.arange(28) + 31), _xyt_cube(np.arange(31) + 59)]) + +.. doctest:: concatenate + :options: +ELLIPSIS, +NORMALIZE_WHITESPACE + + >>> print cubes + 0: air_temperature / (kelvin) (t: 31; y: 3; x: 4) + 1: air_temperature / (kelvin) (t: 28; y: 3; x: 4) + 2: air_temperature / (kelvin) (t: 31; y: 3; x: 4) + + >>> print cubes.concatenate() + 0: air_temperature / (kelvin) (t: 90; y: 3; x: 4) + + +The following diagram illustrates what has taken place in this example: + +.. image:: concat.svg + :alt: Pictographic of concatenate. + :align: center + +The diagram illustrates that we have three 3D input cubes +that line up on the ``t`` dimension. +After concatenating our three input cubes we get a new :class:`~iris.cube.CubeList` +containing one cube with an extended ``t`` coordinate. + + +Using CubeList.concatenate_cube +=============================== + +The :meth:`~iris.cube.CubeList.concatenate_cube` method guarantees that *exactly one +cube will be returned* as a result of concatenating the input cubes. +If :meth:`~iris.cube.CubeList.concatenate_cube` cannot fulfil this guarantee, a descriptive error +will be raised providing details to help diagnose the differences between the input cubes. +In contrast, the :meth:`~iris.cube.CubeList.concatenate` method makes no check on the number +of cubes returned. + +To demonstrate the differences between :meth:`~iris.cube.CubeList.concatenate` +and :meth:`~iris.cube.CubeList.concatenate_cube`, let's return to our three cubes +from the earlier merge example. + +For the purposes of this example we'll add a *History* attribute to the first +cube's :data:`~iris.cube.Cube.attributes` dictionary. +Remember that the attributes *must* be consistent across all cubes in order to +concatenate into a single cube: + +.. testsetup:: concatenate_vs_concatenate_cube + + import numpy as np + import iris + def _xyt_cube(t): + cube = iris.cube.Cube(np.arange(12 * len(t)).reshape(-1, 3, 4), 'air_temperature', units='kelvin') + cube.add_dim_coord(iris.coords.DimCoord(range(3), long_name='y'), 1) + cube.add_dim_coord(iris.coords.DimCoord(range(4), long_name='x'), 2) + cube.add_dim_coord(iris.coords.DimCoord(t, long_name='t'), 0) + return cube + cubes = iris.cube.CubeList([_xyt_cube(np.arange(31)), _xyt_cube(np.arange(28) + 31), _xyt_cube(np.arange(31) + 59)]) + cubes[0].attributes['History'] = 'Created 2010-06-30' + +.. doctest:: concatenate_vs_concatenate_cube + :options: +ELLIPSIS, +NORMALIZE_WHITESPACE + + >>> print cubes + 0: air_temperature / (kelvin) (t: 31; y: 3; x: 4) + 1: air_temperature / (kelvin) (t: 28; y: 3; x: 4) + 2: air_temperature / (kelvin) (t: 31; y: 3; x: 4) + + >>> print cubes[0].attributes + {'History': 'Created 2010-06-30'} + >>> print cubes[1].attributes + {} + + >>> print cubes.concatenate() + 0: air_temperature / (kelvin) (t: 31; y: 3; x: 4) + 1: air_temperature / (kelvin) (t: 59; y: 3; x: 4) + >>> print cubes.concatenate_cube() + Traceback (most recent call last): + ... + raise iris.exceptions.ConcatenateError(msgs) + iris.exceptions.ConcatenateError: failed to concatenate into a single cube. + Cube metadata differs for phenomenon: air_temperature + + +Note that :meth:`~iris.cube.CubeList.concatenate` returns two cubes here. +All the cubes that can be concatenated have been. Any cubes that can't be concatenated are +included unchanged in the returned :class:`~iris.cube.CubeList`. +When :meth:`~iris.cube.CubeList.concatenate_cube` is called on ``cubes`` it raises a +descriptive error that highlights the difference in the ``attributes`` dictionaries. +It is this difference that is preventing ``cube`` being concatenate into a +single cube. An example of fixing an issue like this can be found in the +:ref:`merge_concat_common_issues` section. + + +.. _merge_concat_common_issues: + +Common issues with merge and concatenate +---------------------------------------- + +The Iris algorithms that drive :meth:`~iris.cube.CubeList.merge` and +:meth:`~iris.cube.CubeList.concatenate` are complex and depend +on a number of different elements of the input cubes being consistent across +all input cubes. +If this consistency is not maintained then the +:meth:`~iris.cube.CubeList.merge` or +:meth:`~iris.cube.CubeList.concatenate` process can fail in a +seemingly arbitrary manner. + +The methods :meth:`~iris.cube.CubeList.merge_cube` and +:meth:`~iris.cube.CubeList.concatenate_cube` +were introduced to Iris to help you locate differences in input cubes +that prevent the input cubes merging or concatenating. +Nevertheless, certain difficulties with using +:meth:`~iris.cube.CubeList.merge` and +:meth:`~iris.cube.CubeList.concatenate` occur frequently. +This section describes these common difficulties, why they arise and +what you can do to avoid them. + + +Merge +===== + +.. _merge_issues_attrs_mismatch: + +**Attributes Mismatch** + +Differences in the :data:`~iris.cube.Cube.attributes` (a cube's metadata, including +coordinate metadata) of the input cubes probably cause the greatest amount of +merge-related difficulties. +In recognition of this, Iris has a helper function, +:func:`~iris.experimental.equalise_cubes.equalise_attributes`, to equalise +attributes differences in the input cubes. + +.. note:: + + The functionality provided by :func:`iris.util.describe_diff` and + :meth:`iris.cube.Cube.is_compatible` are **not** designed to give user + indication of whether two cubes can be merged. + +To demonstrate using :func:`~iris.experimental.equalise_cubes.equalise_attributes`, +let's return to our non-merging list of input cubes from the merge_cube example +from earlier. +We'll call :func:`~iris.experimental.equalise_cubes.equalise_attributes` on the +input cubes before merging the input cubes using :meth:`~iris.cube.CubeList.merge_cube`: + +.. doctest:: merge_vs_merge_cube + :options: +ELLIPSIS, +NORMALIZE_WHITESPACE + + >>> from iris.experimental.equalise_cubes import equalise_attributes + >>> print cubes + 0: air_temperature / (kelvin) (y: 4; x: 5) + 1: air_temperature / (kelvin) (y: 4; x: 5) + 2: air_temperature / (kelvin) (y: 4; x: 5) + + >>> print cubes[0].attributes + {'Conventions': 'CF-1.5'} + >>> print cubes[1].attributes + {} + >>> print cubes[2].attributes + {} + + >>> print cubes.merge_cube() + Traceback (most recent call last): + ... + raise iris.exceptions.MergeError(msgs) + iris.exceptions.MergeError: failed to merge into a single cube. + cube.attributes keys differ: 'Conventions' + + >>> equalise_attributes(cubes) + + >>> print cubes[0].attributes + {} + + >>> print cubes.merge_cube() + air_temperature / (kelvin) (z: 3; y: 4; x: 5) + Dimension coordinates: + z x - - + y - x - + x - - x + + +**Incomplete Data** + +Merging input cubes with inconsistent dimension lengths can cause misleading results. +This is a common problem when merging cubes generated by different ensemble members in a model run. + +The misleading results cause the merged cube to gain an anonymous leading dimension. +All the merged coordinates appear as auxiliary coordinates on the anonymous leading dimension. +This is shown in the example below:: + + >>> print cube + surface_temperature / (K) (-- : 5494; latitude: 325; longitude: 432) + Dimension coordinates: + latitude - x - + longitude - - x + Auxiliary coordinates: + forecast_month x - - + forecast_period x - - + forecast_reference_time x - - + realization x - - + time x - - + + +**Merging Duplicate Cubes** + +The Iris load process does not merge duplicate cubes (two or more identical cubes in +the input cubes) by default. +This behaviour can be changed by setting the ``unique`` keyword argument +to :meth:`~iris.cube.CubeList.merge` to ``False``. + +Merging duplicate cubes can cause misleading results. Let's demonstrate these +behaviours and misleading results with the following example. +In this example we have three input cubes. +The first has a scalar ``z`` coordinate with value 1, the second has a +scalar ``z`` coordinate with value 2 and the third has a scalar ``z`` +coordinate with value 1. +The first and third cubes are thus identical. +We will demonstrate the effect of merging the input cubes with ``unique=False`` +(duplicate cubes allowed) and ``unique=True`` (duplicate cubes not allowed): + +.. testsetup:: merge_duplicate + + import numpy as np + import iris + def _xy_cube(z): + cube = iris.cube.Cube(np.arange(20).reshape(4, 5), 'air_temperature', units='kelvin') + cube.add_dim_coord(iris.coords.DimCoord(range(4), long_name='y'), 0) + cube.add_dim_coord(iris.coords.DimCoord(range(5), long_name='x'), 1) + cube.add_aux_coord(iris.coords.DimCoord(z, long_name='z', units='meters')) + return cube + cubes = iris.cube.CubeList([_xy_cube(1), _xy_cube(2), _xy_cube(1)]) + +.. doctest:: merge_duplicate + :options: +ELLIPSIS, +NORMALIZE_WHITESPACE + + >>> print cubes + 0: air_temperature / (kelvin) (y: 4; x: 5) + 1: air_temperature / (kelvin) (y: 4; x: 5) + 2: air_temperature / (kelvin) (y: 4; x: 5) + + >>> print cubes.merge(unique=False) + 0: air_temperature / (kelvin) (z: 2; y: 4; x: 5) + 1: air_temperature / (kelvin) (z: 2; y: 4; x: 5) + + >>> print cubes.merge() # unique=True is the default. + Traceback (most recent call last): + ... + iris.exceptions.DuplicateDataError: failed to merge into a single cube. + Duplicate 'air_temperature' cube, with scalar coordinates z=Cell(point=1, bound=None) + + +Notice how merging the input cubes with duplicate cubes allowed produces a result +with **four** `z` coordinate values. +Closer inspection of these two resultant cubes demonstrates that the +scalar ``z`` coordinate with value 2 is found in both cubes. + +Trying to merge the input cubes with duplicate cubes not allowed raises an +error highlighting the presence of the duplicate cube. + + +**Single value coordinates** + +Coordinates containing only a single value can cause confusion when +combining input cubes. In Iris' terminology a **scalar** coordinate is a +coordinate of length 1 *which does not describe a data dimension*. Remember: +* The ``merge`` process combines multiple input cubes into a + single resultant cube with new dimensions created from the + *scalar coordinate values* of the input cubes. +* The ``concatenate`` process process combines multiple input cubes into a + single resultant cube with the same *number of dimensions* as the input cubes, + but with the length of one or more dimensions extended by *joining together + sequential dimension coordinates*. + + +Let's look at two example cubes to demonstrate this. + +If your cubes are similar to those below (the single value ``z`` coordinate +is not on a dimension) then use :meth:`~iris.cube.CubeList.merge` to +combine your cubes:: + + >>> print cubes[0] + air_temperature / (kelvin) (y: 4; x: 5) + Dimension coordinates: + x x - + y - x + Scalar coordinates: + z: 1 + >>> print cubes[1] + air_temperature / (kelvin) (y: 4; x: 5) + Dimension coordinates: + x x - + y - x + Scalar coordinates: + z: 2 + + +If your cubes are similar to those below (the single value ``z`` coordinate is +associated with a dimension) then use :meth:`~iris.cube.CubeList.concatenate` to +combine your cubes:: + + >>> print cubes + 0: air_temperature / (kelvin) (z: 1; y: 4; x: 5) + 1: air_temperature / (kelvin) (z: 1; y: 4; x: 5) + + +Concatenate +=========== + +**Time Units** + +Differences in the units of the time coordinates of the input cubes probably cause +the greatest amount of concatenate-related difficulties. +In recognition of this, Iris has a helper function, +:func:`~iris.util.unify_time_units`, to apply a common time unit to all the input cubes. + +To demonstrate using :func:`~iris.util.unify_time_units`, +let's adapt our list of input cubes from the ``concatenate_cube`` example from earlier. +We'll give the input cubes unequal time coordinate units and call +:func:`~iris.util.unify_time_units` on the input cubes before concatenating +the input cubes using :meth:`~iris.cube.CubeList.concatenate_cube`: + +.. testsetup:: concatenate_time_units + + import numpy as np + import iris + def _xyt_cube(t): + cube = iris.cube.Cube(np.arange(12 * len(t)).reshape(-1, 3, 4), 'air_temperature', units='kelvin') + cube.add_dim_coord(iris.coords.DimCoord(range(3), long_name='y'), 1) + cube.add_dim_coord(iris.coords.DimCoord(range(4), long_name='x'), 2) + cube.add_dim_coord(iris.coords.DimCoord(t, long_name='t'), 0) + return cube + cubes = iris.cube.CubeList([_xyt_cube(np.arange(31).astype(np.float64)), + _xyt_cube(np.arange(28).astype(np.float64) + 31), + _xyt_cube(np.arange(31).astype(np.float64) + 59)]) + cubes[0].coord('t').units = 'days since 1990-02-15' + cubes[1].coord('t').units = 'days since 1970-01-01' + cubes[2].coord('t').units = 'days since 1970-01-01' + +.. doctest:: concatenate_time_units + :options: +ELLIPSIS, +NORMALIZE_WHITESPACE + + >>> from iris.util import unify_time_units + >>> print cubes + 0: air_temperature / (kelvin) (t: 31; y: 3; x: 4) + 1: air_temperature / (kelvin) (t: 28; y: 3; x: 4) + 2: air_temperature / (kelvin) (t: 31; y: 3; x: 4) + + >>> print cubes[0].coord('t').units + days since 1990-02-15 + >>> print cubes[1].coord('t').units + days since 1970-01-01 + + >>> print cubes.concatenate_cube() + Traceback (most recent call last): + ... + ConcatenateError: failed to concatenate into a single cube. + Dimension coordinates metadata differ: t != t + + >>> unify_time_units(cubes) + + >>> print cubes[1].coord('t').units + days since 1990-02-15 + + >>> print cubes.concatenate_cube() + air_temperature / (kelvin) (t: 90; y: 3; x: 4) + Dimension coordinates: + t x - - + y - x - + x - - x + +**Attributes Mismatch** + +The ``concatenate`` process is affected by attributes mismatch on input cubes +in the same way that the ``merge`` process. +The :ref:`Attributes Mismatch ` section earlier in this +chapter gives further information on attributes mismatch. diff --git a/docs/iris/src/userguide/merge_and_concat.svg b/docs/iris/src/userguide/merge_and_concat.svg new file mode 100644 index 0000000000..d5f79713f0 --- /dev/null +++ b/docs/iris/src/userguide/merge_and_concat.svg @@ -0,0 +1,362 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + merge + + + + + + + + concatenate + + + + + + + + + + + + + From 08c5280800069fec728a99fb666a794521c6b060 Mon Sep 17 00:00:00 2001 From: Phil Elson Date: Fri, 21 Nov 2014 14:16:50 +0000 Subject: [PATCH 2/3] Minor corrections to merge and concatenate userguide. --- docs/iris/src/userguide/merge_and_concat.rst | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/docs/iris/src/userguide/merge_and_concat.rst b/docs/iris/src/userguide/merge_and_concat.rst index 61a029cd42..9b57f58ef7 100644 --- a/docs/iris/src/userguide/merge_and_concat.rst +++ b/docs/iris/src/userguide/merge_and_concat.rst @@ -253,7 +253,7 @@ of cubes and returns a new :class:`~iris.cube.CubeList` containing the cubes that have been concatenated. Let's have a look at the :meth:`~iris.cube.CubeList.concatenate` method in operation. -In the example below we have three 3D (*x*, *y*, *t*) cubes whose ``t`` coordinates +In the example below we have three 3D ``(t, y, x)`` cubes whose ``t`` coordinates have sequentially increasing ranges. These cubes can be concatenated by combining the ``t`` coordinates of the input cubes to form a new cube with an extended ``t`` coordinate: @@ -306,7 +306,7 @@ of cubes returned. To demonstrate the differences between :meth:`~iris.cube.CubeList.concatenate` and :meth:`~iris.cube.CubeList.concatenate_cube`, let's return to our three cubes -from the earlier merge example. +from the earlier concatenate example. For the purposes of this example we'll add a *History* attribute to the first cube's :data:`~iris.cube.Cube.attributes` dictionary. @@ -355,7 +355,7 @@ All the cubes that can be concatenated have been. Any cubes that can't be concat included unchanged in the returned :class:`~iris.cube.CubeList`. When :meth:`~iris.cube.CubeList.concatenate_cube` is called on ``cubes`` it raises a descriptive error that highlights the difference in the ``attributes`` dictionaries. -It is this difference that is preventing ``cube`` being concatenate into a +It is this difference that is preventing ``cube`` being concatenated into a single cube. An example of fixing an issue like this can be found in the :ref:`merge_concat_common_issues` section. @@ -392,9 +392,8 @@ Merge **Attributes Mismatch** -Differences in the :data:`~iris.cube.Cube.attributes` (a cube's metadata, including -coordinate metadata) of the input cubes probably cause the greatest amount of -merge-related difficulties. +Differences in the :data:`~iris.cube.Cube.attributes` the input cubes probably +cause the greatest amount of merge-related difficulties. In recognition of this, Iris has a helper function, :func:`~iris.experimental.equalise_cubes.equalise_attributes`, to equalise attributes differences in the input cubes. @@ -484,7 +483,8 @@ scalar ``z`` coordinate with value 2 and the third has a scalar ``z`` coordinate with value 1. The first and third cubes are thus identical. We will demonstrate the effect of merging the input cubes with ``unique=False`` -(duplicate cubes allowed) and ``unique=True`` (duplicate cubes not allowed): +(duplicate cubes allowed) and ``unique=True`` (duplicate cubes not allowed, which +is the default behaviour): .. testsetup:: merge_duplicate @@ -531,13 +531,14 @@ error highlighting the presence of the duplicate cube. Coordinates containing only a single value can cause confusion when combining input cubes. In Iris' terminology a **scalar** coordinate is a coordinate of length 1 *which does not describe a data dimension*. Remember: + * The ``merge`` process combines multiple input cubes into a single resultant cube with new dimensions created from the - *scalar coordinate values* of the input cubes. + **scalar** *coordinate values* of the input cubes. * The ``concatenate`` process process combines multiple input cubes into a single resultant cube with the same *number of dimensions* as the input cubes, but with the length of one or more dimensions extended by *joining together - sequential dimension coordinates*. + sequential* **dimension** *coordinates*. Let's look at two example cubes to demonstrate this. From 2717e6617cbed615b0243193745155098064a0b6 Mon Sep 17 00:00:00 2001 From: Phil Elson Date: Fri, 21 Nov 2014 14:44:05 +0000 Subject: [PATCH 3/3] Final tweaks to merge and concat userguide. --- docs/iris/src/userguide/concat.png | Bin 0 -> 20043 bytes docs/iris/src/userguide/concat.svg | 1 - docs/iris/src/userguide/merge.png | Bin 0 -> 21797 bytes docs/iris/src/userguide/merge.svg | 1 - docs/iris/src/userguide/merge_and_concat.png | Bin 0 -> 13250 bytes docs/iris/src/userguide/merge_and_concat.rst | 52 ++++++++++-------- docs/iris/src/userguide/multi_array.svg | 1 - .../src/userguide/multi_array_to_cube.svg | 1 - 8 files changed, 28 insertions(+), 28 deletions(-) create mode 100644 docs/iris/src/userguide/concat.png create mode 100644 docs/iris/src/userguide/merge.png create mode 100644 docs/iris/src/userguide/merge_and_concat.png diff --git a/docs/iris/src/userguide/concat.png b/docs/iris/src/userguide/concat.png new file mode 100644 index 0000000000000000000000000000000000000000..eb3d84046e2d55cb0d612f8e5a854e9144fd1912 GIT binary patch literal 20043 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 kp9l5 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 literal 0 HcmV?d00001 diff --git a/docs/iris/src/userguide/merge.svg b/docs/iris/src/userguide/merge.svg index 3e6359c45e..9326bc332b 100644 --- a/docs/iris/src/userguide/merge.svg +++ b/docs/iris/src/userguide/merge.svg @@ -15,7 +15,6 @@ version="1.1" inkscape:version="0.47 r22583" sodipodi:docname="merge.svg" - inkscape:export-filename="/home/h04/dkillick/sprints/sprint_24_101114/merge.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90"> z4pEC*hc7RDU%X05+Mjes;Yw4Ll7J__>W+YaF1jnK z>Jz{xfWR69-xEGjF?NUJhp~Tf6nWnIzz;8b+&1#K>tgHSZRuu%czb)_c=XuO-OBQb z%?%efySHo7j0kcCQAI20`@CEI<84G^cr3oL{)$G*%&I6N#a@JKh#^}yyX;Px)mJ+I z>jWxxmj9W(Fw%)6dJz(=g1PG8)W>jtrETK=z=w#kRyC=0w)!TyH1s7eJ8!S)GgHG7 z<-`&9$G*P>>}-F$Q&J?L@h�Dj3XE!XNZsZ`^-9UX>JT)&4quwA@Dh%jUm!`ff8~ ztM@H>Yq%uELFZ=|8XFqg_7?l|im(SZ`tQq5ezg4B^RGRsG`613mLXNrb7^U6Y9nFX zGbsyxYL_k>C^N{Yd zs{|J*-wa|XIoRoLnErk)M}1Dqz+k^TGvh(h5)|@F@wp#KiTnJIbRS>e;&)QskJZoq z<9R3QI3x|D*` z($Wr65)#IZYe^5Oxn41em;9=ApU3!a&jmiPvrFXmmYI79H?6s=rzh>TI_hb>W|CBi z!8|9qOqHXTUnk};fSD<2r#U=69`p0_8}jn-2yj-xZROGHkrEh3w?r$kFbbV(@rki9F+9>+lZ32RK3@no z+}hr*cq<#|=ZudZu4t1nf@f3jwJIC=`ZbxWw|A+njZN#Y84<6P)LYyO7qo9HD{Ipz zN+;H{auxq~0blFhwfIxn)17|tG_?flv$M0?M5-+sp>7*fpa0PiwN42%9elwHaINc2 zlMQs3{`b$F=f;i4FDTfR*Zh(^-le8?@2^h=wZUwqNJ>d<^K6NpoSdvQG&VYpjg8Us z9`{`1SspH3?}ZZU`2G8L)M0q0J*%|OgX!hvd^A?=Y$Yex9Q~;O z{XH)BGt-9W>FMdkH8tKW{{F{$w*yN@da^xST@Qb?w{wefalNMux9%IS^X&f8-@o1d zjF?_)KKi=((eASN_~c|zb$Gb44SQ4Bsbo`Alb5WltfwcTY75DoIJExKa%nRe2{G~V z_y=8%3PP{DuCraVVPRp`oL8^5c9;>zl2IDJVwI6(hkIzkk~&D7WI8xH8a+HZ8Y-)( z=;!6cp(gJVa~^G=hk0CDTs+iT{FMuDh0#ivP0ceXOw7&6`38$ER%?6iyCYwG7XiFh zN&v_9_kh5_RT!M5-=m{T%rU`)__>9J%O8V-gDK7GJa~zlEbm%}ld*KA30bv$iRUwX z-vt+W{SrQ-0NX;0~R9SM)`V>pb<|>l342zkanF z|K$2(DxzF+NZ3Doz(IKmzI_`Ha7>Q zzM$n(^V0sx84`oBhx+c1SF`zP`#mKYtvSadEWB;0s2K7PhTwR%#EOy-p zJ(+6Bhc$C5cQ`{mB9}MU0>dCHDELw984)dKIt$10ISw4VI={XyS7KOdPTSJV?@32b z@68Rf8aUY$XgE{yZ1HDjXa1L|&!Kib>2l3w+1VVEA9*jbv9TSuw6xUGUeg!s*u8HI zucM~@?v~JXF0Q$4?+M@VAc`FdN=jD_Vc}Rq8-GBWyNBy-&3$B$!`l$4HZ90t2alTPWxjg5_GmY4l)_f|&W z#4Fp%=pn1NNZr3TrKcb67#d0_y}dNu z8Ou%ApQkO?@ZfVuX9I5Zq2oxojaj@J?b_<9S@*ABF-qkW=Ff8!Ge6ufF_p;f;T84K z*<1T_%m*{CT2fNtHN_<6SL?mbstH}d@ZrNOdV$B5XQuFha&B^UbhJf3XQ{O`a2!U5&#ashf% zO)Bjzd(T+qo}SF?EcVxvj;a#gM$>(LPD+fughBJuz!5p7Id%(`A%4S>ce=-7DmqU$ zTj@#ddXh4q0LVQe%A?j!m*w9-IovMr^769vb>0Cu_`5Ovbw82+{vKf{F z`Jd@l3s2Ru;MdKw^YiqV85j-}U_=f{3Zug)Ha0h1NeBt^?^Zh*XYUL6>W~3kdFbf$ zM(?eTCH_bFPHVh5=$xO4i3uM*H=p^vSo-pe_*UT2jzuUQ=}|w!sq^@!O;uCVcYg5n zW08Fps=ulnhrIw4-C zUfSE+v-$4H_$z{%`w1+gu^TsT1Tked_w@9HL&bf*U+pwv7kQ=@^Enh>n-uVDxX4&| zqWe7oyutRi`~TkHePlqzdrrbGXoCTn28A-?pcR6{k1=Z22BBnFT}*e+!C`Z{?vQV z$6vd*WD6^m?Q(WATuQ35v$LO!`PP#WhSPW&7D*3#Dn`bFq+71+ayEC-wY9at!lDB? z4`Y5z4*|YOI#fwok5)eN)U@2)wELMB@4L5REDH1B=sqDelb8Oq%hSW7p$}lJy=_6@ z=FP1;dV0TdgzbK8a70rv3O;Dr$jHc`Tpg{7J-_?d*3He0f`MUyfr?5m&tvhITjB-z z_6!eCPnIklo;zLu>(Uxi;*tY6gMA2sBs&hpJKko+KeI*Tz|(e6;Q`XSaaqq$tW9 zsi>-UuJvYqh4C-2W~wXA(@r<>@$+Lf`SfI(=IKQ}NjQIvmV!dCOgW16B<>Yic|`>; z4^M|ezW$I<>oM^qysMOb9d9`Do;`oQ_jt52f8{Py7{#Zc^QVL5Hr=D~0v6_LZaXoF ziQzdpIrMO`riVbL92d?iqvY2#G&JHogIw7CYB|zG5l7TFrPXCJMU4NsWCEg3p(x$8 zpHfA^{u1LrfOd)Z(wq>HLgP7!m4$fK=rJaD4b(d0Oh zI68zaH`wbgO}Vf$5EJa(}a}FH#?RLZ3C<`LNv>p(BkvF$O#;`Km}+WWQX~k6 z;cA#YA%dnMo)Sjrkp|+7T#CP}l)Jba^%M^oDMuV9@!1Q=GU6$+>i5KTv4DN*^{)}eZ1lYQq^78J#wory+&3H8Jqq8+^I zmb0_7@m*bA1!h1-UknWm$qOB1o^1b=OOL!PJm+ntVI}FiW&PO4$43vyal>aRz7&h9 zbN@>%w^85tS0@FK5BM3f!D{HrJI8(!2x*mtT=F_iqiFCcawY7OHk!Vw)ccZ-@Z_;G zjtE|cw+=K%4+kS7qh^@tj;Fj`rZzSi)Y-^q0W8g_PZ@tRdEdVCBxbYnTc zM}pii{iI_%*ONTha~1AQ(v`q}-+-Kq%)l4)N1;w;$Vj?vwUe`$8E_aD)Iko#M%b3}MQ_(7BTRqr|*f zMa*ZkKB+t(5>fX&r<(swLIM{aIjgDRuvpR^4UL|A?w}05g}6<%{1*tH_U*l@y6%n+ zpO5x^SsBh_)huyvQ%c40j{SLQ1b_SV^rZQ9Bk>jCNp)Z3^^DweOjEdR&IoSHx#`Qn zy?E5U)gtSg5gDB9Z&hQto)r!*{hSQkH*4C<&i?l8TQe0kb)eV!M4-uH-eSbqy5kigMmu<#{XaVt&{y(5(M6 zS$JMaN=mAUE+5O;E?&B1*3;3E zEiOvfz`$^Aev7Jw^}!C*i5ebjk^p7iVHPzWMj?P%APVkB?+~;^A-|B7uJaXft2#jw zSZK4~BB(=w^GOXA8b;BR_kNA#*1ityc~8LfQ?D6;jsn^&a@+<%t_JHOct{6V z))*poA&GyGBeKX^NKMCUX<#ulDT!e=j`ywu!@rTazbos_=Ung*s}T_qPu)ro{fkUC zE61~2dV9UnbP^a$8qNV>3lUQ9TiHqU^-C`c36t20BjBQojEqd7yUNl$=+GpPIY%&3 z2Pvv5DO9*Rms1AA$1{?D%O+qBe4P!hguddDJ6hnVzhPE~hPIRaXtpcfrkU;#79bI@ znc0~VCBsAk3p!wk%FfQtY?^7(z6F`bV>K?5ub`_w6;QZ)eAPaihoHqDxhB6&LylNq z=)n0%n{suey2lvOs9W7;Ukic9aj!4*WtW;V+%3;=`cvoWTxG&C2gXG^ zje-Bujj8|c=IiD5_+?Hig_F(71f882w7+H{ZBqXWthBSeef}F<;k#Gen*qKg;jcXR ztBY2&FP@F12c7YTgof4>g9Mu?Y`UTP8BS+mW?;Bg2e@p5+RpcS{J5m`^mxC}u*j&a zp|)5jW)dtKx8maBbNfGaRiC+I&H5mQOcu zSPQ9m&C-mMsZjDR@72+Jv|vJ%gWXadH45{lC(FmT?99#0UC|U<3yb}oTKu&?2SD{m zo9a%0*zv#DPH%Ds7JU}Lof`=o+Y!8B zGth$yD0E3d@>P&^k}`=|gKRrZ5mMX&S`LKXqTXXs&pkP|GszmXLTa84Pc;oqOfVUT z8hci0^Vz5{56=g~3fu42%|p@g@iwP0=ngl|a9K%2%ZF;4N;_I7W9p3U1tbq2u2fJo^2`uGfpKO1aklku}A&nSE{pbx8vUNB+_!q?<&Z&a|oLtVooA*3CJiJB}o)DCn$=c!eyo;2i zqzRK%y`d7I&KI~&T3ub8Iloz5<>%%aIk0v5!F9O|3nX^?(6P;Wvz;wyhBv;86f}g) z%cBW#Je%PXGp3(!#RcrYgb}*D{j&5A44qOZXXn+asi_AO^c*;PGmWCE(_S%|a7{uqb@dbN5>OGQ6~zhwr&#sN28?-N}o1cy%doQJ`T7 zEY}Lp(CrFIC~{G zvw(nr(vYa9Rfc#rKvx?4b{6^`z$4pvt;TpGTPq_KOEB%Ej)Mi45N#X&JM5qteuk4= zcI##cT2F|LlFigi14E$r701>O!mtvg5oSd9HgEjmk^9oH}^XWn6 z7R3hPz@&%DtE&@EM?ch3D$3{Uo0~QGY<^=Be>@&r&)OEb3PtT}X=zzVO+|I2+LzXO zX}0CR3(9yfI9N09dXI+?G2rElj=X%!h)s8bW`q0u>(A+HmOTTe%}-_EiAzixd|ZR_ zM@5n|0_Ib_oxp6&O_A~UdI@~KLpJ#jvyA^<&zG^WV|!E6aqEe{!SU$k^E3a)Mn=E) zU(ySB#h07K5_CNVEZE)OPnWgrVc_2Q5h>}rvp@+fV$Hb0r!0>mq&d9kTdmh>ih?4Q z;FmNB7ezE3hw|&4d-?hf&MG%qU=@YG*GjDuMWHMi!#VjPDpARnnCOev%(_6aw^(xZ zF3-)*?wVu8^w(mn>4Op!d@{H-+no*mi;x7s*Hv+8X=$s@n5&_rgW=Z|7MGTm7(sQs z2h}nAId4=_%74$v+}_?^&BSE12CSbXX1GU_b!SZG^Og1w3Ws}RE{Utdr4~N=`U7@V z4ugNCM*VKN&8T?k>+65%isy?3y9sX86d-}Uk&KW~Uj~YhL5K$o(NXp*S6YJpev5FS zqzunt1$J>70Io{eWYGDkL#?Bw2H9w|hPs9Zvu)&ABvl;8oya6cX6Erym=D{=qfflQ zLFmN7YU%*Aa*D5~Ynyoj8gYDMV`Cs!J&{b@ARUji3)-gPBCybFVq(>q#l`#iA@PPGAWZs|CGpAHFK902$FG+0;pUj*V3_5ro*Lg0d?0401J)HjXtR^-#wh`PLf88|` zhS;yIFX`RE;sY&T?NrHps?He4BIV^I0_-vaY@uPnwuhBhKLd9!$;-*nknvh!D9!k$ zmP1T`W2RtmDHj?o6Ne#b%%xdK2il-q$sWVnd$jS8&W~F03Mc2x7K{m(ISlT9U`%s` zLl>Jb&@Z?O;_BZ_kxd_U#^XJd?ot|W2ZX#3~&?qan zTi$D?B__pMDr#ye;92@zvH^f=A|W7167yKl!QUWdQk8}Re|WUB7(VwiUG5&xqGHF( z!neT$_zqCK2|fb#Y{{iwA)bg21EBwL6_u3gv394+ZUg9U8Zm00^u((@XaHSM|Y-)qIzCy4vn=sZ0;oEQB9 zpFGXC2Bol6rC-GT1~_De;kIZ5g$FIt&M>X!M|!1NgEs* zBh*Ip|L<_4E;GbR<0;yDBvUEe68LdNLOtDGcSwq^afU_LleHy9!iyVzZEd}(2Tltx zX%T!yS-F!9rA4SMNjIIF1|d+Lnf+i1%7C!51zq{x7IJxhILc%fn;R zz;$B^3mxMVOI@+|3OHKK(}a|aHZ3g;3zIX=PQO2Xo&%_e-v$~I8Cvf8uWhxcxVW&( zEWFkSy2p<+nYTB>IsgxC8D#u+80eUprL(ZCbhf0G2CUG&xxQ@Wcsx=@{n<$iJ}(7h zFsa%@YkF{U;;lB6cqZOld(A9L!wA4<}%^5y+0Y$EX4WWLy9<6pB}_U0Zs1=T6%Jw9@fth}{}-F5qcIVK7e~fsZy4)J6&&hClcGXjxz$ zs)Wu5&!Kt}&3;Yh@%X2WWMMn65&+To@!cfon}?Tz+PE4F9h4Ec~7-<^2vUUn0-sAJ;?6u?fuIzkdU`HIj6?zl5w0(+ol5 z(*#?3?C-yS+}nRv|IR~j>P$sNm6ZhP@BOK}tHTg>y!{SfnED5M(oBJJu9f{~f~C zcj4r0<~jMHw$yR(e2+z;-JiQO9lkG#kEcDaz8(U!SvDPDIAmwXL#yNAb4<~lNQTT8 zuU?%tK&?O^`U`N%?k!}BQnaF+IKl*K?B&c7Zq~tSxl4mZ#uYcG?!I6j0Vw)&g zV8T|hCnqT}FfJw*O#vgmGaYaIWPUigO)mVDJzi0Qz~-j&XytR8uDI#o>sc!+PDEs6 zvbBD@OG402Y9YARkOa+Bxja%aA9-+a5CtTD8!CBVb-cF!=x^)G_&cu{bN5roxv1mN zXr<>Qn>vMqp)kewS*2fGFNcYVNl%|#gK>+bSG4XnBai)ImmWCe1U*+FmP@mMBv`2& zfk7&70-Lph21ST)m3;xs|2}!XR9LDAxw>o#m{BK}k~5*Q%pmO=gu31yo;^hms1uak zS*lAqJK9^7dI%KktCYt=%iSO%OK|Om;OSiNMVpO$uS|fU-Z=;f@W@qLS`Ujr z41z5q(Wh}2VH6bszm9+|`w^mc(v+3a>4*<1?Dtg#Ukzo5RG28KsBSiZy#Uie05>5s{P?N_=%^(u66T3TAP(Di79po#5405~V*MFk+lwg$;}IMCv!6-~~RZ$yJ9 zkRd`;+L8rJf2*NI;GkKij>h7jdU3f2x@d57-wuL}^A6l^>mAf5P6g=dKOX~Fq(Lhw z>S78|#rE^4%1V(au!s)D1IK=8oi7qxiLD8ahGOc?RB8mO=#Qnr_*Az&R(=Z=f>k4> zog&g{pEq{6NDCVxY(e%HEG#T&0Vjz)b?x{oPk>Wp61aH0-pt0`N)|D?DEBIiBAF_# z-9rZ(S88kjTmWa_PD6r1U+OK_FAnoRQh$JBnE=+bOh`GDGz;BzqbXqkSjL9Wi6Uuo zL0ZscloJFjWbeFSp{nW+dKX5)#K{x2m;ol+cUq#`Q?QT4XDNydsHJ6+pX zC!)g^a`a3npg*#}hbFiT*ufvU3cD$sp%ErnhojjY2*2;7r(z!sqP<|<%*@QM5Dwl2 z&$y=#C`)m*%jBAf=aN2L5P2a&13M$!--3V>1)1VK4KyFb(Ke{WU(oZo)M#QXa6j>d z-MXgWTZF-M_?;YV3c+x*cBAs&-p$i81}{Zh3%)2udGpJol;Z$_{C4bbqtRjNfQ~+I zjR;x5W@rUOn#;?}YhNBq@H)~Kuz!C(-q$Q?pbyAX%0fw*nF9NCiuH02(q7$w9V55zB6^Pla} zPwLY`tJ|}G|NfEzjr{^NRxxblDugFCfhN&8^7X6IUjOQeITOsW!#51&*|qqBpWNvI zU&g+vT?g%><={}TKllCZ{{MYYZe((EhwUE+JEPFUFl|sOQD9kY3+gF@Y^XW{+eq^U z=YPW&Z6LapdyT;mU^f<7)OkE2Q;C4B2&Uh$7CHFe-AC2Asb|}7DA<)kei>0xQtqyd zxGTdxns?B>ThnP}W@cu7U&6;%FK>S}aK;U41sF;IXtm=SP%F$nG`#smMc4IsXt)iE zjD(KBW+LBlj>0g?3!mCGUYr$TAwZ%1{OV4@J&}usT@#6K-nd$Y?2M0!}bjqD*ufsoWsMzRa1yL(Y#(N16t>uREjE9b+w(Qx9oZbjF6USl+t_f zjJfbHT@sy%j+=nB`VAspLw=)=4W&M=PWcqGpw7JC8ClocwB^Vo}8*BNmkMv1BRv07cl!Otb^ z*E)BlQ(QQmd0pKYg&1wfN<`9<;^#)NXK809pH(Pj?U`Ko#1Z!C%5DG1c+Q6C976W2 zAH79q?nYUAb;u{{HIypagx)4NEt9-%Fr~3+{mwq=mjVufAA`-KS)wZIJM(Se{*Ga{TpQTf)7y!Tkx;mizeQP z6!MK2#Y**tE%-iyci|IqMW4V``To2PB7;x_3n5Mj`T`I6lwhzCB7xxH`e>n95Dol| zTNdYIIM-nh8%Nefq`t~?1vi6AvEfPY|>dGH~?yaI63MxG4VK+)QUwn^;H~Nkx%%VJg>uTor5WniBQ{4aVCUy z)JhJo7cXV^rhsGAh2T!aL1|n43vG)MvX2uS2gl3Hr>&_VwAX352QOY$R4|ic*f?CXu#~w}>FZmDJnG z{}G}z+}`|?@?QJ>M5jvwCc2p7;WM;5=Q8raWg*ZFVyBioB!K|s_KYHk2z5~;lU5+i z2j>B0aN6NSHM;)ZngLQ=S-Oiac$Z*PgJ9F>_$512uoPu+sBPTnA?@jXd0|N>(g!z! zpZA6dXArJj8fC1WUoOO>Y`tJaIK_`RTWo6k`#P{)lqYP#NeQ;YvxUUQt)2@E*7;U2 zwXzQf?%zQVP{?0JeKUy|btD1gWznlN48D%|_C_+M&-$OTB2ugA&Q(D{i?h!kjUYu^ zEH30%&N-5^tDN`3xFYQwEq;d1?Jz51q}h+~TN(mZZ5y4gOm;{!1?PI{-=dedLwz%2 zKVnVM<=JR1w3fkrLKJLryf0{f=TlJ_mP@?6ENsg&1a9?L4z*+oT|OlD8HJzR#0Te6 z(%?M3KfD4Muboe1E!Wu{dU^Qjow902)^^|65E%& zsScm3g3pzyd_z3+o3QP0=ZZMMwN4v->?0|HT#+lMyCGfyhr!$T2n+~ΞCoJet$+` z2jl$T+|iQi$vP&P)_pXZ1go_Nx`%J^yi%zLU{MhTtq;YIbBD^^~!NOjS?7y6!TFrDWZ9o*rgtA3?rr*VMp$ zF8DaiVzs!iaFC^&eMf+(KjYc$Y5a`a#sot;?MuC0nX%;`Cy9Y0hRiKeG*aqPBMC?2 zyxdu92pIwDEGFx{;t^pB_nj4iX0_4tHplbhSd12~5!sY7>RbBF!B&l6F-{Kb9#8Q# z`3J_Z&(jokI!$o5%NG?DagKEANfDjgC2+mdzJFg~J89|;3a#4o@;+fozFfMJdk{aF zd=kZ97vJuOZC>D|6n%gXY#xgac|BV{VH=ET!rgegw^npxz2=!M<4;C7`8?N$DMf0s zvv=I6-+%0Z?NhAZ2r1y@_~hh#o}NwSI4%wU{c3^W?~0gk$!c9%`3uQ4fd|ZOjjq2L zQrbDy6}EG}%OJ}*){5>U|LqqFd|aovp1c9^Gsp+#Z9Oz}?8F zU^j~rOHrs$JThOrCQR&&Gcc>maa;o&+!okaPgh6BhQN})1dk>O<=`b9b%M<8hvn!2 z)|5rL#N5IjX#&)ZF0%{5GT6Nm)nc5d9=>wWB|F6l0}5H4caV?id5wbaGf6uo>Yj79 zC_K7}`M@GV+_6-76yoH9PclARj|3&a01L~zgp)GfNJ z1%K)qCh1aWJq^^$4g{=PKf@lr@fu2{E5<46^<;eMY8f!QWJA-<#ah(g96z*wJTXp=`vT`g1}&vebJAA86@@ zK0{k2*ctKJdiiwk^YZG||A^t|Qa^9n#lGjn!GVexsY|RqMueL;IU!gU8lhNq z*I^{248#HSR|141N^xcrQz_dQw`y(0deQpV?gf~bVB@1H+8?iSMT6B9G1PSp#?a2_ zgV!ZEFCWWc4SU^ueL~0)CmG7wx*=-#U1C(0)qs-X?F1+I(WURPH-|lZn*lW16*22M z#gRhWUXasZgO;nX$Df+?PofR@Y;0tVA{gZaJnU|e@?NK06KfcR_%Mp)+~OB-#@cx8 z|IXm$<^A`nkIf=mL>Ik780>`lCV=&^c_pxkgI>NVI0|Avi~_e*eqE&0RYvwJkIjVJ zDu1NQr86-y)(s^6uX35$mq@2_DE@|kmt?C3Sxz+em)Au_JtNDG=kB^tX97f#w@C8t zo!J)Ms(mu82$$B-QdPaouY3-LizRM+!RtOhAGMtgVZ?vV(BH8Q3Uk4!BYszGGX zZVbQeMIlI=xoh!VakJftQE?SyP%4yt_{ap6Vi7iR()bS2*$qza$I2` section earlier in this chapter gives further information on attributes mismatch. diff --git a/docs/iris/src/userguide/multi_array.svg b/docs/iris/src/userguide/multi_array.svg index 104af87a4a..d28f6d71d6 100644 --- a/docs/iris/src/userguide/multi_array.svg +++ b/docs/iris/src/userguide/multi_array.svg @@ -15,7 +15,6 @@ version="1.1" inkscape:version="0.47 r22583" sodipodi:docname="multi_array.svg" - inkscape:export-filename="/home/h02/itpe/fcm/iris/iris/active/docs/iris/src/userguide/multi_array.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90">