From 4fda40ccdf95b4f733a7a15fc8e7652b8b73a6a9 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Thu, 13 Jan 2022 18:26:58 +0000 Subject: [PATCH 01/43] UGRID docs stub pages. --- docs/src/further_topics/index.rst | 1 + docs/src/further_topics/ugrid/data_model.rst | 11 +++++++++++ docs/src/further_topics/ugrid/index.rst | 9 +++++++++ docs/src/further_topics/ugrid/operations.rst | 12 ++++++++++++ docs/src/further_topics/ugrid/partner_packages.rst | 8 ++++++++ docs/src/index.rst | 3 ++- 6 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 docs/src/further_topics/ugrid/data_model.rst create mode 100644 docs/src/further_topics/ugrid/index.rst create mode 100644 docs/src/further_topics/ugrid/operations.rst create mode 100644 docs/src/further_topics/ugrid/partner_packages.rst diff --git a/docs/src/further_topics/index.rst b/docs/src/further_topics/index.rst index dc162d6a1e..6f03599e9c 100644 --- a/docs/src/further_topics/index.rst +++ b/docs/src/further_topics/index.rst @@ -20,6 +20,7 @@ that may be of interest to the more advanced or curious user. * :doc:`metadata` * :doc:`lenient_metadata` * :doc:`lenient_maths` +* :doc:`ugrid` .. _GitHub Documentation Issue: https://github.com/SciTools/iris/issues/new?assignees=&labels=New%3A+Documentation%2C+Type%3A+Documentation&template=documentation.md&title= diff --git a/docs/src/further_topics/ugrid/data_model.rst b/docs/src/further_topics/ugrid/data_model.rst new file mode 100644 index 0000000000..f52b93ba59 --- /dev/null +++ b/docs/src/further_topics/ugrid/data_model.rst @@ -0,0 +1,11 @@ +.. _ugrid_model: + +.. + The conventions page is [necessarily] not for a layperson. This is an + opportunity to explain UGRID at an Iris user's level - doesn't need to be + exhaustive, just get across what is needed for the user to understand why + their experience will be different to 'normal'. + * Describe what is different about the UGRID model. + * Relate to the objects in Iris' model. + * Relate to the printout of a Cube-with-Mesh. Possibly also the printout + of a Mesh, if that has been fixed to not be enormous. diff --git a/docs/src/further_topics/ugrid/index.rst b/docs/src/further_topics/ugrid/index.rst new file mode 100644 index 0000000000..7c3591c2bb --- /dev/null +++ b/docs/src/further_topics/ugrid/index.rst @@ -0,0 +1,9 @@ +.. _ugrid: + +.. + Punchy landing page - most content should be in other pages. + * Quick description of UGRID, link to official conventions page. + * Warnings about different experience, experimental/evolving content. + * Links to subsections. + "To find out why the experience is different, read about the Data Model" + "To find out how to work with UGRID data, read about Common Operations" diff --git a/docs/src/further_topics/ugrid/operations.rst b/docs/src/further_topics/ugrid/operations.rst new file mode 100644 index 0000000000..8e3b2b6a07 --- /dev/null +++ b/docs/src/further_topics/ugrid/operations.rst @@ -0,0 +1,12 @@ +.. _ugrid_operations: + +.. + Page should briefly demonstrate how to do the most popular Iris operations + with UGRID data. + * Start with summary table listing the operations, indicating if anything + is different or so-far-impossible with UGRID data. Each row should link + to the section (so it's an enhanced TOC). + * Mention the ugrid_partners page at the beginning and/or within applicable + demo sections. + * Demo of each operation. + * Operations planned for the future. diff --git a/docs/src/further_topics/ugrid/partner_packages.rst b/docs/src/further_topics/ugrid/partner_packages.rst new file mode 100644 index 0000000000..684f414d1f --- /dev/null +++ b/docs/src/further_topics/ugrid/partner_packages.rst @@ -0,0 +1,8 @@ +.. _ugrid_partners: + +.. + * Explain the optional GeoVista and iris-esmf-regrid dependencies, which + are powerful but big and should only be installed if the user needs + them. + * Brief description of each, and when you might use it. + * Link to docs if applicable (intersphinx?). diff --git a/docs/src/index.rst b/docs/src/index.rst index e59a6f0527..cab76bc4f6 100644 --- a/docs/src/index.rst +++ b/docs/src/index.rst @@ -123,7 +123,7 @@ For **Iris 2.4** and earlier documentation please see the .. _developers_guide: .. toctree:: - :maxdepth: 1 + :maxdepth: 2 :caption: Further Topics :hidden: @@ -131,6 +131,7 @@ For **Iris 2.4** and earlier documentation please see the further_topics/metadata further_topics/lenient_metadata further_topics/lenient_maths + further_topics/ugrid/index .. toctree:: From 1901782b960d9ef350666945938f3e99a703cbbd Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Thu, 13 Jan 2022 19:06:48 +0000 Subject: [PATCH 02/43] UGRID docs index page. --- docs/src/common_links.inc | 1 + docs/src/further_topics/ugrid/index.rst | 45 +++++++++++++++++++++---- docs/src/whatsnew/latest.rst | 13 ++++--- 3 files changed, 45 insertions(+), 14 deletions(-) diff --git a/docs/src/common_links.inc b/docs/src/common_links.inc index eb1ea60b7a..67fc493e3e 100644 --- a/docs/src/common_links.inc +++ b/docs/src/common_links.inc @@ -37,6 +37,7 @@ .. _test-iris-imagehash: https://github.com/SciTools/test-iris-imagehash .. _using git: https://docs.github.com/en/github/using-git .. _requirements/ci/: https://github.com/SciTools/iris/tree/main/requirements/ci +.. _CF-UGRID: https://ugrid-conventions.github.io/ugrid-conventions/ .. comment diff --git a/docs/src/further_topics/ugrid/index.rst b/docs/src/further_topics/ugrid/index.rst index 7c3591c2bb..a325c85d15 100644 --- a/docs/src/further_topics/ugrid/index.rst +++ b/docs/src/further_topics/ugrid/index.rst @@ -1,9 +1,40 @@ +.. include:: ../../common_links.inc + .. _ugrid: -.. - Punchy landing page - most content should be in other pages. - * Quick description of UGRID, link to official conventions page. - * Warnings about different experience, experimental/evolving content. - * Links to subsections. - "To find out why the experience is different, read about the Data Model" - "To find out how to work with UGRID data, read about Common Operations" +UGRID Support +************* + +Iris includes specialised handling of data that follows the +`CF-UGRID Conventions`__. UGRID-conformant data can be loaded from a file, +represented in Iris' data model, worked with, and saved as a UGRID-conformant +file. More detail is in this section and in the :mod:`iris.experimental.ugrid` +API documentation. + +The Headlines +~~~~~~~~~~~~~ + +UGRID is different + UGRID's mesh-located data is fundamentally different to grid-located data. + Many of Iris' existing operations need adapting before they can work with + mesh-located data, and in some cases entirely new concepts are needed. + **Read the detail here before jumping into your own code.** +Iris' UGRID support is experimental + This is a rapidly evolving part of the codebase at time of writing + (``Jan 2021``), as we continually expand the operations that work with mesh + data. **Be prepared for breaking changes even in minor releases.** +:ref:`Get involved! ` + We know meshes are an exciting new area for much of Earth science, so we hope + there are a lot of you with new files/ideas/wishlists, and we'd love to hear + more 🙂. + +More Detail +~~~~~~~~~~~ + +* :doc:`ugrid_model` - learn why the mesh experience is so different. +* :doc:`ugrid_partners` - meet Iris' partner packages providing powerful mesh +operations. +* :doc:`ugrid_operations` - experience how your workflows will look when +written for UGRID data. + +__ CF-UGRID_ diff --git a/docs/src/whatsnew/latest.rst b/docs/src/whatsnew/latest.rst index 5f1a7314dc..d1f2f19816 100644 --- a/docs/src/whatsnew/latest.rst +++ b/docs/src/whatsnew/latest.rst @@ -16,7 +16,7 @@ This document explains the changes made to Iris for this release The highlights for this minor release of Iris include: - * We've added experimental support for `UGRID`_ meshes which can now be loaded + * We've added experimental support for `CF-UGRID`_ meshes which can now be loaded and attached to a cube. * We've also dropped support for ``Python 3.7``. @@ -37,7 +37,7 @@ This document explains the changes made to Iris for this release =========== #. `@bjlittle`_, `@pp-mo`_, `@trexfeathers`_ and `@stephenworsley`_ added - support for unstructured meshes, as described by `UGRID`_. This involved + support for unstructured meshes, as described by `CF-UGRID`_. This involved adding a data model (:pull:`3968`, :pull:`4014`, :pull:`4027`, :pull:`4036`, :pull:`4053`, :pull:`4439`) and API (:pull:`4063`, :pull:`4064`), and supporting representation (:pull:`4033`, :pull:`4054`) of data on meshes. @@ -54,14 +54,14 @@ This document explains the changes made to Iris for this release :class:`~iris.cube.Cube` via a :class:`~iris.experimental.ugrid.mesh.MeshCoord`. #. `@trexfeathers`_ added support for loading unstructured mesh data from netcdf data, - for files using the `UGRID`_ conventions. + for files using the `CF-UGRID`_ conventions. The context manager :obj:`~iris.experimental.ugrid.load.PARSE_UGRID_ON_LOAD` provides a way to load UGRID files so that :class:`~iris.cube.Cube`\ s can be returned with a :class:`~iris.experimental.ugrid.mesh.Mesh` attached. (:pull:`4058`). #. `@pp-mo`_ added support to save cubes with meshes to netcdf files, using the - `UGRID`_ conventions. + `CF-UGRID`_ conventions. The existing :meth:`iris.save` function now does this, when saving cubes with meshes. A routine :meth:`iris.experimental.ugrid.save.save_mesh` allows saving :class:`~iris.experimental.ugrid.mesh.Mesh` objects to netcdf *without* any associated data @@ -82,7 +82,7 @@ This document explains the changes made to Iris for this release :class:`~iris.coords.AuxCoord` :attr:`~iris.coords.AuxCoord.points` and :class:`~iris.experimental.ugrid.mesh.Connectivity` :attr:`~iris.experimental.ugrid.mesh.Connectivity.indices` under the - `UGRID`_ model. (:pull:`4375`) + `CF-UGRID`_ model. (:pull:`4375`) #. `@bsherratt`_ added a `threshold` parameter to :meth:`~iris.cube.Cube.intersection` (:pull:`4363`) @@ -271,7 +271,7 @@ This document explains the changes made to Iris for this release :func:`~iris.analysis.cartography.wrap_lons` and updated affected tests using assertArrayAllClose following :issue:`3993`. (:pull:`4421`) - + #. `@rcomer`_ updated some tests to work with Matplotlib v3.5. (:pull:`4428`) #. `@rcomer`_ applied minor fixes to some regridding tests. (:pull:`4432`) @@ -304,7 +304,6 @@ This document explains the changes made to Iris for this release .. _GitHub: https://github.com/SciTools/iris/issues/new/choose .. _NEP-29: https://numpy.org/neps/nep-0029-deprecation_policy.html -.. _UGRID: http://ugrid-conventions.github.io/ugrid-conventions/ .. _sort-all: https://github.com/aio-libs/sort-all .. _faster documentation building: https://docs.readthedocs.io/en/stable/guides/conda.html#making-builds-faster-with-mamba .. _Metarelate: http://www.metarelate.net/ \ No newline at end of file From a6e92aeadbd7f0d78506b0e5ee17dba0887e8b6a Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Thu, 13 Jan 2022 19:29:14 +0000 Subject: [PATCH 03/43] Fleshed out UGRID docs stubs. --- docs/src/further_topics/ugrid/data_model.rst | 26 ++++++-- docs/src/further_topics/ugrid/operations.rst | 62 ++++++++++++++++--- .../further_topics/ugrid/partner_packages.rst | 9 +++ 3 files changed, 84 insertions(+), 13 deletions(-) diff --git a/docs/src/further_topics/ugrid/data_model.rst b/docs/src/further_topics/ugrid/data_model.rst index f52b93ba59..81fe5837f2 100644 --- a/docs/src/further_topics/ugrid/data_model.rst +++ b/docs/src/further_topics/ugrid/data_model.rst @@ -5,7 +5,25 @@ opportunity to explain UGRID at an Iris user's level - doesn't need to be exhaustive, just get across what is needed for the user to understand why their experience will be different to 'normal'. - * Describe what is different about the UGRID model. - * Relate to the objects in Iris' model. - * Relate to the printout of a Cube-with-Mesh. Possibly also the printout - of a Mesh, if that has been fixed to not be enormous. + + +The UGRID Data Model +******************** + +What's Different? +================= + +.. + IDEA: The unstructured mesh format maximises flexibility, but means that no + spatial information can be inferred from a structured data array. Much + less is implicit, much more information has to be stored explicitly. + + Diagram(s) - SVG so editable later. + +How Iris Represents This +======================== + +.. + Include API links to the various classes + + Include Cube/Mesh printout(s) diff --git a/docs/src/further_topics/ugrid/operations.rst b/docs/src/further_topics/ugrid/operations.rst index 8e3b2b6a07..9d3d88cd71 100644 --- a/docs/src/further_topics/ugrid/operations.rst +++ b/docs/src/further_topics/ugrid/operations.rst @@ -1,12 +1,56 @@ .. _ugrid_operations: +Working with UGRID Data +*********************** + +.. note:: Several of the operations below rely on the optional dependencies + mentioned in :ref:`ugrid_partners`. + +.. + Have a table here that lists the headings below, including a small note + about whether it's unchanged (e.g. Saving), has to be done differently + (e.g. Extraction), or isn't yet possible (e.g. Arithmetic). Each row + should link to the section below. Basically an enhanced TOC. + +.. + Below: use demo code over prose wherever workable. Headings aren't an + exhaustive list (can you think of any other popular operations?). + +Load +---- + +Summary +------- +.. + Possibly covered by the data_model page? + +Save +---- + +Plotting +-------- + +Regional Extraction +------------------- +.. + Highlight the uselessness of indexing. + +Regridding +---------- + +Equality +-------- +.. + Is this worth mentioning, given it just works the way it always has? + +Recombination +------------- + +Arithmetic +---------- +.. + Not possible yet - mention this. + .. - Page should briefly demonstrate how to do the most popular Iris operations - with UGRID data. - * Start with summary table listing the operations, indicating if anything - is different or so-far-impossible with UGRID data. Each row should link - to the section (so it's an enhanced TOC). - * Mention the ugrid_partners page at the beginning and/or within applicable - demo sections. - * Demo of each operation. - * Operations planned for the future. + Headings for other popular operations that aren't yet possible, including + if they're planned soon. diff --git a/docs/src/further_topics/ugrid/partner_packages.rst b/docs/src/further_topics/ugrid/partner_packages.rst index 684f414d1f..7f55c72d81 100644 --- a/docs/src/further_topics/ugrid/partner_packages.rst +++ b/docs/src/further_topics/ugrid/partner_packages.rst @@ -6,3 +6,12 @@ them. * Brief description of each, and when you might use it. * Link to docs if applicable (intersphinx?). + +Iris' UGRID Partner Packages +**************************** + +GeoVista +======== + +iris-esmf-regrid +================ From 83f350c3986b77ba1d40589020a7db1e6dcc3a3e Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Fri, 14 Jan 2022 16:24:17 +0000 Subject: [PATCH 04/43] Correct UGRID docs linkage. --- docs/src/further_topics/index.rst | 2 +- docs/src/further_topics/ugrid/data_model.rst | 2 +- docs/src/further_topics/ugrid/index.rst | 22 +++++++++++-------- docs/src/further_topics/ugrid/operations.rst | 4 ++-- .../further_topics/ugrid/partner_packages.rst | 2 +- docs/src/index.rst | 2 +- 6 files changed, 19 insertions(+), 15 deletions(-) diff --git a/docs/src/further_topics/index.rst b/docs/src/further_topics/index.rst index 6f03599e9c..4f9aadbc79 100644 --- a/docs/src/further_topics/index.rst +++ b/docs/src/further_topics/index.rst @@ -20,7 +20,7 @@ that may be of interest to the more advanced or curious user. * :doc:`metadata` * :doc:`lenient_metadata` * :doc:`lenient_maths` -* :doc:`ugrid` +* :ref:`ugrid` .. _GitHub Documentation Issue: https://github.com/SciTools/iris/issues/new?assignees=&labels=New%3A+Documentation%2C+Type%3A+Documentation&template=documentation.md&title= diff --git a/docs/src/further_topics/ugrid/data_model.rst b/docs/src/further_topics/ugrid/data_model.rst index 81fe5837f2..0cc648a614 100644 --- a/docs/src/further_topics/ugrid/data_model.rst +++ b/docs/src/further_topics/ugrid/data_model.rst @@ -1,4 +1,4 @@ -.. _ugrid_model: +.. _ugrid model: .. The conventions page is [necessarily] not for a layperson. This is an diff --git a/docs/src/further_topics/ugrid/index.rst b/docs/src/further_topics/ugrid/index.rst index a325c85d15..a44ed96e48 100644 --- a/docs/src/further_topics/ugrid/index.rst +++ b/docs/src/further_topics/ugrid/index.rst @@ -11,8 +11,6 @@ represented in Iris' data model, worked with, and saved as a UGRID-conformant file. More detail is in this section and in the :mod:`iris.experimental.ugrid` API documentation. -The Headlines -~~~~~~~~~~~~~ UGRID is different UGRID's mesh-located data is fundamentally different to grid-located data. @@ -28,13 +26,19 @@ Iris' UGRID support is experimental there are a lot of you with new files/ideas/wishlists, and we'd love to hear more 🙂. -More Detail -~~~~~~~~~~~ +.. toctree:: + :hidden: + :maxdepth: 1 + + data_model + partner_packages + operations + +* :doc:`data_model` - learn why the mesh experience is so different. +* :doc:`partner_packages` - meet Iris' partner packages providing powerful mesh operations. +* :doc:`operations` - experience how your workflows will look when written for UGRID data. + + -* :doc:`ugrid_model` - learn why the mesh experience is so different. -* :doc:`ugrid_partners` - meet Iris' partner packages providing powerful mesh -operations. -* :doc:`ugrid_operations` - experience how your workflows will look when -written for UGRID data. __ CF-UGRID_ diff --git a/docs/src/further_topics/ugrid/operations.rst b/docs/src/further_topics/ugrid/operations.rst index 9d3d88cd71..b3a448d1ac 100644 --- a/docs/src/further_topics/ugrid/operations.rst +++ b/docs/src/further_topics/ugrid/operations.rst @@ -1,10 +1,10 @@ -.. _ugrid_operations: +.. _ugrid operations: Working with UGRID Data *********************** .. note:: Several of the operations below rely on the optional dependencies - mentioned in :ref:`ugrid_partners`. + mentioned in :doc:`partner_packages`. .. Have a table here that lists the headings below, including a small note diff --git a/docs/src/further_topics/ugrid/partner_packages.rst b/docs/src/further_topics/ugrid/partner_packages.rst index 7f55c72d81..78fbe50abe 100644 --- a/docs/src/further_topics/ugrid/partner_packages.rst +++ b/docs/src/further_topics/ugrid/partner_packages.rst @@ -1,4 +1,4 @@ -.. _ugrid_partners: +.. _ugrid partners: .. * Explain the optional GeoVista and iris-esmf-regrid dependencies, which diff --git a/docs/src/index.rst b/docs/src/index.rst index cab76bc4f6..d6fc5f2f7e 100644 --- a/docs/src/index.rst +++ b/docs/src/index.rst @@ -123,7 +123,7 @@ For **Iris 2.4** and earlier documentation please see the .. _developers_guide: .. toctree:: - :maxdepth: 2 + :maxdepth: 1 :caption: Further Topics :hidden: From 8cea7f14e387b49a9423670e97bec55bfe7127df Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Fri, 14 Jan 2022 16:40:11 +0000 Subject: [PATCH 05/43] Minor adjustments to ugrid/index.rst. --- docs/src/further_topics/ugrid/index.rst | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/docs/src/further_topics/ugrid/index.rst b/docs/src/further_topics/ugrid/index.rst index a44ed96e48..89bb69b0d9 100644 --- a/docs/src/further_topics/ugrid/index.rst +++ b/docs/src/further_topics/ugrid/index.rst @@ -11,6 +11,7 @@ represented in Iris' data model, worked with, and saved as a UGRID-conformant file. More detail is in this section and in the :mod:`iris.experimental.ugrid` API documentation. +---- UGRID is different UGRID's mesh-located data is fundamentally different to grid-located data. @@ -26,19 +27,24 @@ Iris' UGRID support is experimental there are a lot of you with new files/ideas/wishlists, and we'd love to hear more 🙂. -.. toctree:: - :hidden: - :maxdepth: 1 +---- - data_model - partner_packages - operations +Read on to find out more... * :doc:`data_model` - learn why the mesh experience is so different. -* :doc:`partner_packages` - meet Iris' partner packages providing powerful mesh operations. +* :doc:`partner_packages` - meet some optional dependencies that provide powerful mesh operations. * :doc:`operations` - experience how your workflows will look when written for UGRID data. +.. + Need an actual TOC to get Sphinx working properly, but have hidden it in + favour of the custom bullets above. +.. toctree:: + :hidden: + :maxdepth: 1 + data_model + partner_packages + operations __ CF-UGRID_ From f46ce45acfc6a0c55e9e34abc0d951ea3ff76f55 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Mon, 17 Jan 2022 13:51:18 +0000 Subject: [PATCH 06/43] UGRID data model explanation. --- docs/src/further_topics/ugrid/data_model.rst | 183 +++++++++++++++++- .../ugrid/images/data_structured_grid.svg | 1 + .../ugrid/images/data_ugrid_mesh.svg | 1 + .../ugrid/images/ugrid_edge_data.svg | 1 + .../ugrid/images/ugrid_element_centres.svg | 1 + .../ugrid/images/ugrid_node_independence.svg | 1 + .../ugrid/images/ugrid_variable_faces.svg | 1 + 7 files changed, 184 insertions(+), 5 deletions(-) create mode 100644 docs/src/further_topics/ugrid/images/data_structured_grid.svg create mode 100644 docs/src/further_topics/ugrid/images/data_ugrid_mesh.svg create mode 100644 docs/src/further_topics/ugrid/images/ugrid_edge_data.svg create mode 100644 docs/src/further_topics/ugrid/images/ugrid_element_centres.svg create mode 100644 docs/src/further_topics/ugrid/images/ugrid_node_independence.svg create mode 100644 docs/src/further_topics/ugrid/images/ugrid_variable_faces.svg diff --git a/docs/src/further_topics/ugrid/data_model.rst b/docs/src/further_topics/ugrid/data_model.rst index 0cc648a614..6a930ad533 100644 --- a/docs/src/further_topics/ugrid/data_model.rst +++ b/docs/src/further_topics/ugrid/data_model.rst @@ -1,3 +1,5 @@ +.. include:: ../../common_links.inc + .. _ugrid model: .. @@ -10,15 +12,184 @@ The UGRID Data Model ******************** +.. important:: + + This page is intended to summarise what Iris users need to know about + the UGRID model. For full detail + `visit the official UGRID conventions site`__. + +Something to note straight away is that UGRID is designed as an addition to the +existing CF model. It concerns only spatial location of data, and even there +it can be limited just the horizontal location - X and Y - which is so far the +most popular use for UGRID. Other dimensions such as time and experimental run +numbers remain formatted as they always have been. + What's Different? ================= -.. - IDEA: The unstructured mesh format maximises flexibility, but means that no - spatial information can be inferred from a structured data array. Much - less is implicit, much more information has to be stored explicitly. +The UGRID format represents data's geographic location using an **unstructured +mesh**. This has significant pros and cons when compared to a structured grid. + +.. contents:: + :local: + +The Detail +---------- +Structured Grids +~~~~~~~~~~~~~~~~ +Assigning data to locations using a structured grid is essentially an act of +matching coordinate arrays to each dimension of the data array. The data can +also be represented as an area (instead of a point) by including a bounds array +for each coordinate array. + +.. figure:: images/data_structured_grid.svg + :alt: Diagram of how data is represented on a structured grid + + Data on a structured grid + + :download:`full size image ` + +UGRID Unstructured Meshes +~~~~~~~~~~~~~~~~~~~~~~~~~ +UGRID is based on a **mesh** instead of a grid. The most basic element in a +mesh is the 0-dimensional **node**: a single location in space. Every node in +the mesh is defined by indexing the 1-dimensional X and Y (and optionally Z) +coordinate arrays (the ``node_coordinates``) - e.g. ``(x[3], y[3])`` gives the +position of the fourth node. Since nodes can be anywhere in this space - +**unstructured** - the position in the array has nothing to do with spatial +position. + +If data is assigned to node location it must be stored in a 1D array of equal +length to the coordinate arrays. ``data[3]`` is at the position: +``(x[3], y[3])``. + +Data can also be assigned to higher dimensional elements - **edges**, **faces** +or **volumes**. These elements are constructed by connecting nodes together +using a 2-dimensional **connectivity** array. One dimension varies over each +element, while the other dimension varies over each node that makes up that +element; the values in the array are the node indices. E.g. we could make 2 +square faces from 6 nodes using this ``face_node_connectivity``: +``[[0, 1, 3, 2], [2, 3, 5, 4]]``. Remember that UGRID is **unstructured**, so +there is no significance to the order of the faces in the array. Data assigned +to a higher dimensional location must be stored in a 1D array of equal length +to that connectivity array, e.g. ``my_data = [0.33, 4.02]`` for our example. + +.. note:: + + Connectivities also exist to connect the higher dimensional elements, + e.g. ``face_edge_connectivity``. These are optional conveniences to + speed up certain operations and will not be discussed here. + +.. figure:: images/data_ugrid_mesh.svg + :alt: Diagram of how data is represented on a UGRID unstructured mesh + + Data on a UGRID Unstructured Mesh + + :download:`full size image ` + +---- + +UGRID also includes support for edges/faces/volumes to have associated 'centre' +coordinates - to allow point data to be assigned to these elements. 'Centre' is +just a convenience term - the points can exist anywhere within their respective +elements. + +.. figure:: images/ugrid_element_centres.svg + :alt: Diagram demonstrating UGRID face-centred data. + + Data can be assigned to UGRID edge/face/volume 'centres' + +UGRID's Flexibility +~~~~~~~~~~~~~~~~~~~ +Above we have seen how one could replicate data on a structured grid using +UGRID instead. But the utility of UGRID is the extra flexibility it offers. +Here are the main examples: + +* Every UGRID node is completely independent - every one can have unique X and + Y (and Z) coordinate values. + +.. figure:: images/ugrid_node_independence.svg + :alt: Diagram demonstrating the independence of each node in UGRID + :align: center + + Every UGRID node is completely independent + +* Faces and volumes can have variable node counts, i.e. different numbers of + sides. This is achieved by masking the unused 'slots' in the connectivity array. + +.. figure:: images/ugrid_variable_faces.svg + :alt: Diagram demonstrating UGRID faces with variable node counts + :align: center + + UGRID faces can have different node counts (using masking) + +* Data can be assigned to lines (edges) just as easily as points (nodes) or + areas (faces). + +.. figure:: images/ugrid_edge_data.svg + :alt: Diagram demonstrating data assigned to UGRID edges + :align: center + + Data can be assigned to UGRID edges + +What does this mean? +-------------------- +UGRID can represent much more varied spatial arrangements +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +UGRID's highly specific way of recording location (geometry) and shape +(topology) allows it to represent essentially **any** spatial arrangement of +data. There are therefore many applications that wouldn't be possible using a +structured grid, including: + +* `The UK Met Office's LFRic cubed-sphere `_ +* `Oceanic model outputs `_ + +.. todo: + a third example! + +UGRID 'payload' is much larger than with structured grids +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Coordinates are recorded per-node, and connectivities are recorded per-element. +This is opposed to a structured grid, where a single coordinate value is shared +by every data point/area along that line. + +For example: representing the Earth as a cubed-sphere leads to coordinates and +connectivities being **~8 times larger than the data itself**, as opposed to a +small fraction of the data size when using a structured grid. + +This further increases the emphasis on lazy loading and processing of data +using packages such as Dask. + +.. note:: + + UGRID's large, 1D data arrays are a very different shape to what Iris + users and developers are used to. It is suspected that optimal + performance will need new chunking strategies, but at time of writing + (``Jan 2022``) experience is still limited. + +.. todo: + Revisit when we have more information. + +Spatial operations on UGRID data are more complex +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Indexing a UGRID data array cannot be used for: + +#. Region selection +#. Neighbour identification + +This is because - unlike with a structured data array - relative position in +UGRID's 1-dimensional data arrays has no relation to relative position in +space. We must instead perform specialised operations using the information in +the connectivities present, or by translating the mesh into a format designed +for mesh analysis such as VTK. + +Such calculations can still be optimised to avoid them slowing workflows, but +the important take-away here is that **adaptation is needed when working UGRID +data**. + +.. todo: + mention GeoVista here - Diagram(s) - SVG so editable later. How Iris Represents This ======================== @@ -27,3 +198,5 @@ How Iris Represents This Include API links to the various classes Include Cube/Mesh printout(s) + +__ CF-UGRID_ \ No newline at end of file diff --git a/docs/src/further_topics/ugrid/images/data_structured_grid.svg b/docs/src/further_topics/ugrid/images/data_structured_grid.svg new file mode 100644 index 0000000000..66e8a614c4 --- /dev/null +++ b/docs/src/further_topics/ugrid/images/data_structured_grid.svg @@ -0,0 +1 @@ +23, 2819,211015255152030xyCoordinate ArraysxyCoordinate Arrays23, 2819, 21xyBounds Arraysderive point locationsassign data using dimensional indices,position in array == relative spatial positionderive area locations & shapesPoint DataArea DataData Array(bounded coordsalways have points too)my_variable \ No newline at end of file diff --git a/docs/src/further_topics/ugrid/images/data_ugrid_mesh.svg b/docs/src/further_topics/ugrid/images/data_ugrid_mesh.svg new file mode 100644 index 0000000000..f535edcf13 --- /dev/null +++ b/docs/src/further_topics/ugrid/images/data_ugrid_mesh.svg @@ -0,0 +1 @@ +5, 7, 8, 14`xy1212`node_coordinates`every node has its own x + y coordinatesderive node locations12Data Array1515xy`node_coordinates`[5][7][8][14]construct faces by connecting nodesderive ‘corner’ node locationsassign data using 1D indexing,position in array unrelated to spatial positionmatch indices with facesmatch indices with nodesNode DataFace Datamy_variable12 ×4`face_node_connectivity`face_nodes \ No newline at end of file diff --git a/docs/src/further_topics/ugrid/images/ugrid_edge_data.svg b/docs/src/further_topics/ugrid/images/ugrid_edge_data.svg new file mode 100644 index 0000000000..36cf89c28f --- /dev/null +++ b/docs/src/further_topics/ugrid/images/ugrid_edge_data.svg @@ -0,0 +1 @@ +`edge_node_connectivity`12 ×2 \ No newline at end of file diff --git a/docs/src/further_topics/ugrid/images/ugrid_element_centres.svg b/docs/src/further_topics/ugrid/images/ugrid_element_centres.svg new file mode 100644 index 0000000000..ef294577e7 --- /dev/null +++ b/docs/src/further_topics/ugrid/images/ugrid_element_centres.svg @@ -0,0 +1 @@ +`face_node_connectivity`xy`node_coordinates`xy`face_coordinates`151512 ×41212 \ No newline at end of file diff --git a/docs/src/further_topics/ugrid/images/ugrid_node_independence.svg b/docs/src/further_topics/ugrid/images/ugrid_node_independence.svg new file mode 100644 index 0000000000..ce6ca5a3a3 --- /dev/null +++ b/docs/src/further_topics/ugrid/images/ugrid_node_independence.svg @@ -0,0 +1 @@ +` \ No newline at end of file diff --git a/docs/src/further_topics/ugrid/images/ugrid_variable_faces.svg b/docs/src/further_topics/ugrid/images/ugrid_variable_faces.svg new file mode 100644 index 0000000000..3672975af5 --- /dev/null +++ b/docs/src/further_topics/ugrid/images/ugrid_variable_faces.svg @@ -0,0 +1 @@ +`face_node_connectivity`12 ×6 \ No newline at end of file From f36e9ae68e6b4ea9ae59d6e6da210de298d03f53 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Thu, 20 Jan 2022 17:47:17 +0000 Subject: [PATCH 07/43] UGRID partner packages docs page. --- .../ugrid/images/geovistalogo.svg | 573 ++++++++++++++++++ .../ugrid/images/iris-esmf-regrid.svg | 93 +++ .../further_topics/ugrid/partner_packages.rst | 84 ++- 3 files changed, 746 insertions(+), 4 deletions(-) create mode 100644 docs/src/further_topics/ugrid/images/geovistalogo.svg create mode 100644 docs/src/further_topics/ugrid/images/iris-esmf-regrid.svg diff --git a/docs/src/further_topics/ugrid/images/geovistalogo.svg b/docs/src/further_topics/ugrid/images/geovistalogo.svg new file mode 100644 index 0000000000..4c68f0ee3f --- /dev/null +++ b/docs/src/further_topics/ugrid/images/geovistalogo.svg @@ -0,0 +1,573 @@ + + + + + + + + + + + + + + + + + + + + + + + + Cartographic rendering and mesh analytics powered by PyVista. + GeoVista + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GeoVista + + \ No newline at end of file diff --git a/docs/src/further_topics/ugrid/images/iris-esmf-regrid.svg b/docs/src/further_topics/ugrid/images/iris-esmf-regrid.svg new file mode 100644 index 0000000000..e70a9386a7 --- /dev/null +++ b/docs/src/further_topics/ugrid/images/iris-esmf-regrid.svg @@ -0,0 +1,93 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + Iris + + diff --git a/docs/src/further_topics/ugrid/partner_packages.rst b/docs/src/further_topics/ugrid/partner_packages.rst index 78fbe50abe..4810842ca9 100644 --- a/docs/src/further_topics/ugrid/partner_packages.rst +++ b/docs/src/further_topics/ugrid/partner_packages.rst @@ -9,9 +9,85 @@ Iris' UGRID Partner Packages **************************** +Python is an easy to use language and has formed a very strong collaborative +scientific community, which is why Iris is written in Python. But it is not as +computationally strong as other languages, and this is a problem for working +with unstructured meshes where computations are higher in volume (more data) +and complexity (less consistency). So there are operations - which Python +can perform acceptably on a structured grids - but which would need too much +time/resource to perform on an unstructured mesh. New approaches are needed... -GeoVista -======== +Python packages already exist that enable the use of powerful mesh analysis +tools originally written in faster languages such as C. And the Iris team are +working on wrapper solutions to 'bridge the gap' between these packages and +Iris. -iris-esmf-regrid -================ +These solutions have been placed in their own 'partner packages' for several +reasons: + +* Can be useful to others who are not using Iris. + + * Everyone working with multi-dimensional geographic datasets shares common + problems that need solving. + * Wider user base = stronger community = better solutions. + +* Only some Iris users will need them - they are **optional** Iris dependencies. + + * They introduce a lot of new API. + * They introduce new large dependencies that take time to install and need + disk space. + +Below you can learn more about the partner packages and how they are useful. +Specifics of what operations would require their installation can be found in: +:doc:`operations`. + + +`GeoVista`_ +=========== +.. image:: images/geovistalogo.svg + :width: 300 + :class: no-scaled-link + +.. rubric:: "Cartographic rendering and mesh analytics powered by `PyVista`_" + +PyVista is described as "VTK for humans" - VTK is a very powerful toolkit for +working with meshes, and PyVista brings that power into the Python ecosystem. +GeoVista in turn makes it easy to use PyVista specifically for cartographic +work, designed from the start with the Iris +:class:`~iris.experimental.ugrid.Mesh` in mind. + +Applications +------------ +* Interactively plot mesh data: + + * On a 3D globe. + * On your favourite projection. + +* Extract a specific region from a mesh. +* Combine multiple meshes into one. + +`iris-esmf-regrid`_ +=================== +.. image:: images/iris-esmf-regrid.svg + :width: 300 + :class: no-scaled-link + +.. rubric:: "A collection of structured and unstructured ESMF regridding schemes for Iris" + +ESMF provide a sophisticated, performant regridding utility that supports a +variety of regridding types with both structured grids and unstructured meshes. +A Python interface does exist - ESMPy - however working with Iris +:class:`~iris.cube.Cube`\s and :class:`~iris.experimental.ugrid.Mesh`\es is +sub-optimal. iris-esmf-regrid provides easy Iris-ESMPy interoperability, as +well as a number of performance optimisations for this specific use case. + +Applications +------------ +* Regrid structured to unstructured. +* Regrid unstructured to structured. +* Regrid while maintaining data laziness. +* Save a prepared regridder for re-use in subsequent runs. + +.. _GeoVista: https://github.com/bjlittle/geovista +.. _PyVista: https://docs.pyvista.org/index.html +.. _iris-esmf-regrid: https://github.com/SciTools-incubator/iris-esmf-regrid From 9e74b93881d6cdb9475993d608839170b8d39bb2 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Thu, 20 Jan 2022 19:26:05 +0000 Subject: [PATCH 08/43] Detail on Iris UGRID data model. --- docs/src/further_topics/ugrid/data_model.rst | 98 ++++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/docs/src/further_topics/ugrid/data_model.rst b/docs/src/further_topics/ugrid/data_model.rst index 6a930ad533..ee788b0e31 100644 --- a/docs/src/further_topics/ugrid/data_model.rst +++ b/docs/src/further_topics/ugrid/data_model.rst @@ -199,4 +199,102 @@ How Iris Represents This Include Cube/Mesh printout(s) +.. note:: + + At time of writing (``Jan 2022``), neither 3D meshes nor 3D elements + (volumes) are supported. + +The Basics +---------- +The Iris :class:`~iris.cube.Cube` has two new attributes: + +* | :attr:`~iris.cube.Cube.mesh` + | The :class:`iris.experimental.ugrid.Mesh` that defines this + :class:`~iris.cube.Cube`\'s horizontal geography. +* | :attr:`~iris.cube.Cube.location` + | ``node``/``edge``/``face`` - the mesh element type with which this + :class:`~iris.cube.Cube`\'s :attr:`~iris.cube.Cube.data` is associated. + +These attributes will be ``None`` for a :class:`~iris.cube.Cube` with no +associated :class:`~iris.experimental.ugrid.Mesh`. + +A :class:`~iris.cube.Cube` with a :class:`~iris.experimental.ugrid.Mesh` will +have a single dimension for its horizontal geography - the **unstructured +dimension**. This dimension is the one that has multiple attached +:class:`iris.experimental.ugrid.MeshCoord`\s. + +.. todo: Cube printout + +The Detail +---------- +How UGRID information is stored +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. todo: Mesh printout? + +* | :class:`iris.experimental.ugrid.Mesh` + | Contains all information about the mesh. + | Includes: + + * 1-3 collections of :class:`iris.coords.AuxCoord`\s: + + * | **Required**: :attr:`~iris.experimental.ugrid.Mesh.node_coords` + | The nodes that are the basis for the mesh. + * | Optional: :attr:`~iris.experimental.ugrid.Mesh.edge_coords`, + :attr:`~iris.experimental.ugrid.Mesh.face_coords` + | For indicating the 'centres' of the edges/faces. + + * 1 or more :class:`iris.experimental.ugrid.Connectivity`\s: + + * | **Required for 1D (edge) elements**: + :attr:`~iris.experimental.ugrid.Mesh.edge_node_connectivity` + | Define the edges by connecting nodes. + * | **Required for 2D (face) elements**: + :attr:`~iris.experimental.ugrid.Mesh.face_node_connectivity` + | Define the faces by connecting nodes. + * Optional: any other connectivity type. See + :attr:`iris.experimental.ugrid.mesh.Connectivity.UGRID_CF_ROLES` for the + full list of types. + +.. todo: MeshCoord printout? + +* | :class:`iris.experimental.ugrid.MeshCoord` + | Described in detail in `MeshCoords`_. + | Stores the following information: + + * | :attr:`~iris.experimental.ugrid.MeshCoord.mesh` + | The :class:`~iris.experimental.ugrid.Mesh` associated with this + :class:`~iris.experimental.ugrid.MeshCoord`. Mirrored by the + :attr:`~iris.cube.Cube.mesh` attribute of any :class:`~iris.cube.Cube` + this :class:`~iris.experimental.ugrid.MeshCoord` is attached to (see + `The Basics`_) + + * | :attr:`~iris.experimental.ugrid.MeshCoord.location` + | ``node``/``edge``/``face`` - the element detailed by this + :class:`~iris.experimental.ugrid.MeshCoord`. Mirrored by the + :attr:`~iris.cube.Cube.location` attribute of any + :class:`~iris.cube.Cube` this + :class:`~iris.experimental.ugrid.MeshCoord` is attached to (see + `The Basics`_). + +MeshCoords +~~~~~~~~~~ +Links a :class:`~iris.cube.Cube` to a :class:`~iris.experimental.ugrid.Mesh` by +attaching to the :class:`~iris.cube.Cube` like any other +:class:`~iris.coords.Coord`. This allows :class:`~iris.cube.Cube`\s to exist +as they always have, with the management of structured dimensions unchanged. + +:class:`~iris.experimental.ugrid.MeshCoord`\s are generated using the +:meth:`iris.experimental.ugrid.Mesh.to_MeshCoords` method. Requiring a +``location`` argument, this interprets the +:class:`~iris.experimental.ugrid.Mesh`\'s +:attr:`~iris.experimental.ugrid.Mesh.node_coords` and if appropriate the +:attr:`~iris.experimental.ugrid.Mesh.edge_node_connectivity`/ +:attr:`~iris.experimental.ugrid.Mesh.face_node_connectivity`, +:attr:`~iris.experimental.ugrid.Mesh.edge_coords`/ +:attr:`~iris.experimental.ugrid.Mesh.face_coords` +to produce a :attr:`~iris.coords.Coord.points` array and a +:attr:`~iris.coords.Coord.bounds` array, creating this special +:class:`~iris.coords.Coord` instance. + + __ CF-UGRID_ \ No newline at end of file From 19894ca196eacf14805a266bafa62b8813422d74 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Fri, 21 Jan 2022 10:07:58 +0000 Subject: [PATCH 09/43] UGRID data model docs tweaks. --- docs/src/further_topics/ugrid/data_model.rst | 58 ++++++++++++-------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/docs/src/further_topics/ugrid/data_model.rst b/docs/src/further_topics/ugrid/data_model.rst index ee788b0e31..e539d82e41 100644 --- a/docs/src/further_topics/ugrid/data_model.rst +++ b/docs/src/further_topics/ugrid/data_model.rst @@ -138,11 +138,11 @@ UGRID can represent much more varied spatial arrangements ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ UGRID's highly specific way of recording location (geometry) and shape (topology) allows it to represent essentially **any** spatial arrangement of -data. There are therefore many applications that wouldn't be possible using a +data. There are therefore many new applications that aren't possible using a structured grid, including: * `The UK Met Office's LFRic cubed-sphere `_ -* `Oceanic model outputs `_ +* `Oceanic model outputs `_ .. todo: a third example! @@ -172,6 +172,8 @@ using packages such as Dask. Spatial operations on UGRID data are more complex ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Detail: :doc:`operations` + Indexing a UGRID data array cannot be used for: #. Region selection @@ -187,9 +189,6 @@ Such calculations can still be optimised to avoid them slowing workflows, but the important take-away here is that **adaptation is needed when working UGRID data**. -.. todo: - mention GeoVista here - How Iris Represents This ======================== @@ -206,22 +205,25 @@ How Iris Represents This The Basics ---------- -The Iris :class:`~iris.cube.Cube` has two new attributes: +The Iris :class:`~iris.cube.Cube` has several new members: * | :attr:`~iris.cube.Cube.mesh` - | The :class:`iris.experimental.ugrid.Mesh` that defines this + | The :class:`iris.experimental.ugrid.Mesh` that describes the :class:`~iris.cube.Cube`\'s horizontal geography. * | :attr:`~iris.cube.Cube.location` | ``node``/``edge``/``face`` - the mesh element type with which this :class:`~iris.cube.Cube`\'s :attr:`~iris.cube.Cube.data` is associated. +* | :meth:`~iris.cube.Cube.mesh_dim` + | The :class:`~iris.cube.Cube`\'s **unstructured dimension** - the one that + indexes over the horizontal :attr:`~iris.cube.Cube.data` positions. -These attributes will be ``None`` for a :class:`~iris.cube.Cube` with no +These members will all be ``None`` for a :class:`~iris.cube.Cube` with no associated :class:`~iris.experimental.ugrid.Mesh`. -A :class:`~iris.cube.Cube` with a :class:`~iris.experimental.ugrid.Mesh` will -have a single dimension for its horizontal geography - the **unstructured -dimension**. This dimension is the one that has multiple attached -:class:`iris.experimental.ugrid.MeshCoord`\s. +This :class:`~iris.cube.Cube`\'s unstructured dimension has multiple attached +:class:`iris.experimental.ugrid.MeshCoord`\s (one for each axis e.g. +``x``/``y``), which can be used to infer the points and bounds of any index on +the :class:`~iris.cube.Cube`\'s unstructured dimension. .. todo: Cube printout @@ -279,22 +281,32 @@ How UGRID information is stored MeshCoords ~~~~~~~~~~ Links a :class:`~iris.cube.Cube` to a :class:`~iris.experimental.ugrid.Mesh` by -attaching to the :class:`~iris.cube.Cube` like any other -:class:`~iris.coords.Coord`. This allows :class:`~iris.cube.Cube`\s to exist -as they always have, with the management of structured dimensions unchanged. - -:class:`~iris.experimental.ugrid.MeshCoord`\s are generated using the -:meth:`iris.experimental.ugrid.Mesh.to_MeshCoords` method. Requiring a -``location`` argument, this interprets the +attaching to the :class:`~iris.cube.Cube`\'s unstructured dimension, in the +same way that all :class:`~iris.coords.Coord`\s attach to +:class:`~iris.cube.Cube` dimensions. This allows a single +:class:`~iris.cube.Cube` to have a combination of unstructured and structured +dimensions (e.g. horizontal mesh plus vertical levels and a time series), +using the same logic for every dimension. + +:class:`~iris.experimental.ugrid.MeshCoord`\s are instantiated using a given +:class:`~iris.experimental.ugrid.Mesh`, ``location`` +("node"/"edge"/"face") and ``axis``. The process interprets the :class:`~iris.experimental.ugrid.Mesh`\'s :attr:`~iris.experimental.ugrid.Mesh.node_coords` and if appropriate the :attr:`~iris.experimental.ugrid.Mesh.edge_node_connectivity`/ -:attr:`~iris.experimental.ugrid.Mesh.face_node_connectivity`, +:attr:`~iris.experimental.ugrid.Mesh.face_node_connectivity` and :attr:`~iris.experimental.ugrid.Mesh.edge_coords`/ :attr:`~iris.experimental.ugrid.Mesh.face_coords` -to produce a :attr:`~iris.coords.Coord.points` array and a -:attr:`~iris.coords.Coord.bounds` array, creating this special -:class:`~iris.coords.Coord` instance. +to produce a :class:`~iris.coords.Coord` +:attr:`~iris.coords.Coord.points` and :attr:`~iris.coords.Coord.bounds` +representation of all the :class:`~iris.experimental.ugrid.Mesh`\'s +nodes/edges/faces for the given axis. + +A :class:`~iris.experimental.ugrid.Mesh` +method is available to create a :class:`~iris.experimental.ugrid.MeshCoord` for +every axis represented by that :class:`~iris.experimental.ugrid.Mesh`, +requiring only the ``location`` argument: +:meth:`~iris.experimental.ugrid.Mesh.to_MeshCoords`. __ CF-UGRID_ \ No newline at end of file From 77e3f95aa4bf4b57e1c60788fd0462191e6645ce Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Fri, 21 Jan 2022 11:53:41 +0000 Subject: [PATCH 10/43] Reduced emphasis on UGRID in docs. --- docs/src/further_topics/ugrid/data_model.rst | 123 +++++++++---------- docs/src/further_topics/ugrid/index.rst | 28 +++-- 2 files changed, 77 insertions(+), 74 deletions(-) diff --git a/docs/src/further_topics/ugrid/data_model.rst b/docs/src/further_topics/ugrid/data_model.rst index e539d82e41..7f38833e59 100644 --- a/docs/src/further_topics/ugrid/data_model.rst +++ b/docs/src/further_topics/ugrid/data_model.rst @@ -2,32 +2,30 @@ .. _ugrid model: -.. - The conventions page is [necessarily] not for a layperson. This is an - opportunity to explain UGRID at an Iris user's level - doesn't need to be - exhaustive, just get across what is needed for the user to understand why - their experience will be different to 'normal'. - - -The UGRID Data Model -******************** +The Mesh Data Model +******************* .. important:: - This page is intended to summarise what Iris users need to know about - the UGRID model. For full detail + This page is intended to summarise the essentials that Iris users need + to know about meshes. For exhaustive details on UGRID itself: `visit the official UGRID conventions site`__. -Something to note straight away is that UGRID is designed as an addition to the -existing CF model. It concerns only spatial location of data, and even there -it can be limited just the horizontal location - X and Y - which is so far the -most popular use for UGRID. Other dimensions such as time and experimental run -numbers remain formatted as they always have been. +Evolution, not revolution +========================= +Mesh support has been designed wherever possible to fit within the existing +Iris model. Meshes concern only the spatial location of data, and can +optionally be limited to just the horizontal location (e.g. X and Y). Other +dimensions such as time or experimental re-runs (and often vertical levels) +retain their familiar structured format. + +The UGRID conventions themselves are designed as an addition to the existing CF +conventions, which are at the core of Iris' philosophy. What's Different? ================= -The UGRID format represents data's geographic location using an **unstructured +The mesh format represents data's geographic location using an **unstructured mesh**. This has significant pros and cons when compared to a structured grid. .. contents:: @@ -49,18 +47,18 @@ for each coordinate array. :download:`full size image ` -UGRID Unstructured Meshes -~~~~~~~~~~~~~~~~~~~~~~~~~ -UGRID is based on a **mesh** instead of a grid. The most basic element in a -mesh is the 0-dimensional **node**: a single location in space. Every node in -the mesh is defined by indexing the 1-dimensional X and Y (and optionally Z) -coordinate arrays (the ``node_coordinates``) - e.g. ``(x[3], y[3])`` gives the -position of the fourth node. Since nodes can be anywhere in this space - -**unstructured** - the position in the array has nothing to do with spatial -position. +Unstructured Meshes +~~~~~~~~~~~~~~~~~~~ +The most basic element in a mesh is the 0-dimensional **node**: a single +location in space. Every node in the mesh is defined by indexing the +1-dimensional X and Y (and optionally Z) coordinate arrays (the +``node_coordinates``) - e.g. ``(x[3], y[3])`` gives the position of the fourth +node. Note that this means each node has its own coordinates, independent of +every other node. Since nodes can be anywhere in the space - **unstructured** - +the position in the array has nothing to do with spatial position. If data is assigned to node location it must be stored in a 1D array of equal -length to the coordinate arrays. ``data[3]`` is at the position: +length to the number of nodes in the mesh. ``data[3]`` is at the position: ``(x[3], y[3])``. Data can also be assigned to higher dimensional elements - **edges**, **faces** @@ -69,10 +67,11 @@ using a 2-dimensional **connectivity** array. One dimension varies over each element, while the other dimension varies over each node that makes up that element; the values in the array are the node indices. E.g. we could make 2 square faces from 6 nodes using this ``face_node_connectivity``: -``[[0, 1, 3, 2], [2, 3, 5, 4]]``. Remember that UGRID is **unstructured**, so +``[[0, 1, 3, 2], [2, 3, 5, 4]]``. Remember that meshes are **unstructured**, so there is no significance to the order of the faces in the array. Data assigned to a higher dimensional location must be stored in a 1D array of equal length -to that connectivity array, e.g. ``my_data = [0.33, 4.02]`` for our example. +to the number of elements in the mesh, e.g. ``my_data = [0.33, 4.02]`` for our +example. .. note:: @@ -81,64 +80,64 @@ to that connectivity array, e.g. ``my_data = [0.33, 4.02]`` for our example. speed up certain operations and will not be discussed here. .. figure:: images/data_ugrid_mesh.svg - :alt: Diagram of how data is represented on a UGRID unstructured mesh + :alt: Diagram of how data is represented on an unstructured mesh - Data on a UGRID Unstructured Mesh + Data on an Unstructured Mesh :download:`full size image ` ---- -UGRID also includes support for edges/faces/volumes to have associated 'centre' +The mesh model also supports edges/faces/volumes having associated 'centre' coordinates - to allow point data to be assigned to these elements. 'Centre' is just a convenience term - the points can exist anywhere within their respective elements. .. figure:: images/ugrid_element_centres.svg - :alt: Diagram demonstrating UGRID face-centred data. + :alt: Diagram demonstrating mesh face-centred data. - Data can be assigned to UGRID edge/face/volume 'centres' + Data can be assigned to mesh edge/face/volume 'centres' -UGRID's Flexibility -~~~~~~~~~~~~~~~~~~~ +Mesh Flexibility +~~~~~~~~~~~~~~~~ Above we have seen how one could replicate data on a structured grid using -UGRID instead. But the utility of UGRID is the extra flexibility it offers. +a mesh instead. But the utility of a mesh is the extra flexibility it offers. Here are the main examples: -* Every UGRID node is completely independent - every one can have unique X and +* Every node is completely independent - every one can have unique X and Y (and Z) coordinate values. .. figure:: images/ugrid_node_independence.svg - :alt: Diagram demonstrating the independence of each node in UGRID + :alt: Diagram demonstrating the independence of each mesh node :align: center - Every UGRID node is completely independent + Every mesh node is completely independent * Faces and volumes can have variable node counts, i.e. different numbers of sides. This is achieved by masking the unused 'slots' in the connectivity array. .. figure:: images/ugrid_variable_faces.svg - :alt: Diagram demonstrating UGRID faces with variable node counts + :alt: Diagram demonstrating mesh faces with variable node counts :align: center - UGRID faces can have different node counts (using masking) + Mesh faces can have different node counts (using masking) * Data can be assigned to lines (edges) just as easily as points (nodes) or areas (faces). .. figure:: images/ugrid_edge_data.svg - :alt: Diagram demonstrating data assigned to UGRID edges + :alt: Diagram demonstrating data assigned to mesh edges :align: center - Data can be assigned to UGRID edges + Data can be assigned to mesh edges What does this mean? -------------------- -UGRID can represent much more varied spatial arrangements -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -UGRID's highly specific way of recording location (geometry) and shape -(topology) allows it to represent essentially **any** spatial arrangement of -data. There are therefore many new applications that aren't possible using a +Meshes can represent much more varied spatial arrangements +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The highly specific way of recording location (geometry) and shape +(topology) allows meshes to represent essentially **any** spatial arrangement +of data. There are therefore many new applications that aren't possible using a structured grid, including: * `The UK Met Office's LFRic cubed-sphere `_ @@ -147,46 +146,46 @@ structured grid, including: .. todo: a third example! -UGRID 'payload' is much larger than with structured grids -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Mesh 'payload' is much larger than with structured grids +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Coordinates are recorded per-node, and connectivities are recorded per-element. This is opposed to a structured grid, where a single coordinate value is shared by every data point/area along that line. -For example: representing the Earth as a cubed-sphere leads to coordinates and +For example: representing a cubed-sphere using a mesh leads to coordinates and connectivities being **~8 times larger than the data itself**, as opposed to a -small fraction of the data size when using a structured grid. +small fraction of the data size when dividing a sphere using a structured grid. This further increases the emphasis on lazy loading and processing of data using packages such as Dask. .. note:: - UGRID's large, 1D data arrays are a very different shape to what Iris - users and developers are used to. It is suspected that optimal - performance will need new chunking strategies, but at time of writing - (``Jan 2022``) experience is still limited. + The large, 1D data arrays associated with meshes are a very different + shape to what Iris users and developers are used to. It is suspected + that optimal performance will need new chunking strategies, but at time + of writing (``Jan 2022``) experience is still limited. .. todo: Revisit when we have more information. -Spatial operations on UGRID data are more complex -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Spatial operations on mesh data are more complex +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Detail: :doc:`operations` -Indexing a UGRID data array cannot be used for: +Indexing a mesh data array cannot be used for: #. Region selection #. Neighbour identification This is because - unlike with a structured data array - relative position in -UGRID's 1-dimensional data arrays has no relation to relative position in +a mesh's 1-dimensional data arrays has no relation to relative position in space. We must instead perform specialised operations using the information in the connectivities present, or by translating the mesh into a format designed for mesh analysis such as VTK. Such calculations can still be optimised to avoid them slowing workflows, but -the important take-away here is that **adaptation is needed when working UGRID +the important take-away here is that **adaptation is needed when working mesh data**. diff --git a/docs/src/further_topics/ugrid/index.rst b/docs/src/further_topics/ugrid/index.rst index 89bb69b0d9..caf3950fad 100644 --- a/docs/src/further_topics/ugrid/index.rst +++ b/docs/src/further_topics/ugrid/index.rst @@ -2,23 +2,27 @@ .. _ugrid: -UGRID Support -************* +Mesh Support +************ -Iris includes specialised handling of data that follows the -`CF-UGRID Conventions`__. UGRID-conformant data can be loaded from a file, -represented in Iris' data model, worked with, and saved as a UGRID-conformant -file. More detail is in this section and in the :mod:`iris.experimental.ugrid` -API documentation. +Iris includes specialised handling of mesh-located data (as opposed to +grid-located data). Iris and its :ref:`partner packages ` are +designed to make working with mesh-located data as simple as possible, with new +capabilities being added all the time. More detail is in this section and in +the :mod:`iris.experimental.ugrid` API documentation. + +This mesh support is based on the `CF-UGRID Conventions`__; UGRID-conformant +meshes + data can be loaded from a file into Iris' data model, and meshes + +data represented in Iris' data model can be saved as a UGRID-conformant file. ---- -UGRID is different - UGRID's mesh-located data is fundamentally different to grid-located data. +Meshes are different + Mesh-located data is fundamentally different to grid-located data. Many of Iris' existing operations need adapting before they can work with mesh-located data, and in some cases entirely new concepts are needed. - **Read the detail here before jumping into your own code.** -Iris' UGRID support is experimental + **Read the detail in these pages before jumping into your own code.** +Iris' mesh support is experimental This is a rapidly evolving part of the codebase at time of writing (``Jan 2021``), as we continually expand the operations that work with mesh data. **Be prepared for breaking changes even in minor releases.** @@ -33,7 +37,7 @@ Read on to find out more... * :doc:`data_model` - learn why the mesh experience is so different. * :doc:`partner_packages` - meet some optional dependencies that provide powerful mesh operations. -* :doc:`operations` - experience how your workflows will look when written for UGRID data. +* :doc:`operations` - experience how your workflows will look when written for mesh data. .. Need an actual TOC to get Sphinx working properly, but have hidden it in From c670b92d1d6c1a89b32ed220c743300b4a9290f4 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Fri, 21 Jan 2022 12:17:35 +0000 Subject: [PATCH 11/43] UGRID partner packages rephrasing. --- .../further_topics/ugrid/partner_packages.rst | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/docs/src/further_topics/ugrid/partner_packages.rst b/docs/src/further_topics/ugrid/partner_packages.rst index 4810842ca9..b20d862ab9 100644 --- a/docs/src/further_topics/ugrid/partner_packages.rst +++ b/docs/src/further_topics/ugrid/partner_packages.rst @@ -12,10 +12,10 @@ Iris' UGRID Partner Packages Python is an easy to use language and has formed a very strong collaborative scientific community, which is why Iris is written in Python. But it is not as computationally strong as other languages, and this is a problem for working -with unstructured meshes where computations are higher in volume (more data) -and complexity (less consistency). So there are operations - which Python -can perform acceptably on a structured grids - but which would need too much -time/resource to perform on an unstructured mesh. New approaches are needed... +with unstructured meshes where computations are higher in volume and complexity +(see :doc:`data_model`). So there are operations - which Python can perform +acceptably on a structured grids - which would need too much time/resource to +perform on an unstructured mesh. New approaches are needed... Python packages already exist that enable the use of powerful mesh analysis tools originally written in faster languages such as C. And the Iris team are @@ -41,6 +41,13 @@ Below you can learn more about the partner packages and how they are useful. Specifics of what operations would require their installation can be found in: :doc:`operations`. +.. important:: **Experimental** + + As with Iris' mesh support, these packages are still in the + experimental stages. They would love your feedback, but as immature + packages their API, documentation, test coverage and CI are still + 'under construction'. + `GeoVista`_ =========== @@ -75,11 +82,11 @@ Applications .. rubric:: "A collection of structured and unstructured ESMF regridding schemes for Iris" ESMF provide a sophisticated, performant regridding utility that supports a -variety of regridding types with both structured grids and unstructured meshes. -A Python interface does exist - ESMPy - however working with Iris -:class:`~iris.cube.Cube`\s and :class:`~iris.experimental.ugrid.Mesh`\es is -sub-optimal. iris-esmf-regrid provides easy Iris-ESMPy interoperability, as -well as a number of performance optimisations for this specific use case. +variety of regridding types with both structured grids and unstructured meshes, +and this also has a flexible Python interface - ESMPy. iris-esmf-regrid takes +advantage of having a specific use-case - regridding Iris +:class:`~iris.cube.Cube`\s - to provide ESMPy-Iris wrappers that make the +process as easy as possible, with highly optimised performance. Applications ------------ From 4a7f6e23224569eb1ef6063ca12d33726b8ee75e Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Fri, 21 Jan 2022 12:18:18 +0000 Subject: [PATCH 12/43] Remove UGRID partner package comment. --- docs/src/further_topics/ugrid/partner_packages.rst | 7 ------- 1 file changed, 7 deletions(-) diff --git a/docs/src/further_topics/ugrid/partner_packages.rst b/docs/src/further_topics/ugrid/partner_packages.rst index b20d862ab9..a4ba02eb69 100644 --- a/docs/src/further_topics/ugrid/partner_packages.rst +++ b/docs/src/further_topics/ugrid/partner_packages.rst @@ -1,12 +1,5 @@ .. _ugrid partners: -.. - * Explain the optional GeoVista and iris-esmf-regrid dependencies, which - are powerful but big and should only be installed if the user needs - them. - * Brief description of each, and when you might use it. - * Link to docs if applicable (intersphinx?). - Iris' UGRID Partner Packages **************************** Python is an easy to use language and has formed a very strong collaborative From 2b4cce862c9fdb57f0c27abb407e8b23f87dc035 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Fri, 21 Jan 2022 13:44:24 +0000 Subject: [PATCH 13/43] Reduced emphasis on UGRID in docs. --- docs/src/further_topics/ugrid/operations.rst | 2 +- docs/src/further_topics/ugrid/partner_packages.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/src/further_topics/ugrid/operations.rst b/docs/src/further_topics/ugrid/operations.rst index b3a448d1ac..f467599bff 100644 --- a/docs/src/further_topics/ugrid/operations.rst +++ b/docs/src/further_topics/ugrid/operations.rst @@ -1,6 +1,6 @@ .. _ugrid operations: -Working with UGRID Data +Working with Mesh Data *********************** .. note:: Several of the operations below rely on the optional dependencies diff --git a/docs/src/further_topics/ugrid/partner_packages.rst b/docs/src/further_topics/ugrid/partner_packages.rst index a4ba02eb69..e245b51423 100644 --- a/docs/src/further_topics/ugrid/partner_packages.rst +++ b/docs/src/further_topics/ugrid/partner_packages.rst @@ -1,6 +1,6 @@ .. _ugrid partners: -Iris' UGRID Partner Packages +Iris' Mesh Partner Packages **************************** Python is an easy to use language and has formed a very strong collaborative scientific community, which is why Iris is written in Python. But it is not as From eb31ae655d07b3890c18d74c0090d0991c6ef3bf Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Fri, 21 Jan 2022 14:29:07 +0000 Subject: [PATCH 14/43] Comment about UGRID data model diagrams. --- docs/src/further_topics/ugrid/data_model.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/src/further_topics/ugrid/data_model.rst b/docs/src/further_topics/ugrid/data_model.rst index 7f38833e59..0b76fc7984 100644 --- a/docs/src/further_topics/ugrid/data_model.rst +++ b/docs/src/further_topics/ugrid/data_model.rst @@ -33,6 +33,14 @@ mesh**. This has significant pros and cons when compared to a structured grid. The Detail ---------- +.. + The diagram images are SVG's, so editable by any graphical software + (e.g. Inkscape). They were originally made in MS PowerPoint. + + Uses the IBM Colour Blind Palette (see + http://ibm-design-language.eu-de.mybluemix.net/design/language/resources/color-library + ) + Structured Grids ~~~~~~~~~~~~~~~~ Assigning data to locations using a structured grid is essentially an act of From 226812dc438ffa4b69d181640836b86e8061ec49 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Fri, 21 Jan 2022 18:04:34 +0000 Subject: [PATCH 15/43] Start documenting UGRID operations examples. --- docs/src/further_topics/ugrid/operations.rst | 178 ++++++++++++++++++- 1 file changed, 175 insertions(+), 3 deletions(-) diff --git a/docs/src/further_topics/ugrid/operations.rst b/docs/src/further_topics/ugrid/operations.rst index f467599bff..a66837c946 100644 --- a/docs/src/further_topics/ugrid/operations.rst +++ b/docs/src/further_topics/ugrid/operations.rst @@ -16,6 +16,181 @@ Working with Mesh Data Below: use demo code over prose wherever workable. Headings aren't an exhaustive list (can you think of any other popular operations?). +Making a Cube with a Mesh +------------------------- +Creating Iris objects from scratch is a highly useful skill for testing code +and improving understanding of how Iris works. This knowledge will likely prove +particularly useful when converting data into the Iris mesh data model from +structured formats and non-UGRID mesh formats. + +The objects created in this example will be used where possible in the +subsequent example operations on this page. + +Create a :class:`~iris.experimental.ugrid.Mesh` : + +.. doctest:: ugrid_operations + + >>> import numpy as np + + >>> from iris.coords import AuxCoord + >>> from iris.experimental.ugrid import Connectivity, Mesh + + # Going to create the following mesh + # (node indices are shown to aid understanding): + # + # 0----1 + # | |\ + # | + |+\ + # 2----3--4 + + >>> node_x = AuxCoord( + ... points=[3.0, 3.0, 0.0, 0.0, 0.0], + ... standard_name="longitude", + ... units="degrees_east", + ... long_name="node_x_coordinates", + ... ) + >>> node_y = AuxCoord(points=[0.0, 5.0, 0.0, 5.0, 8.0], standard_name="latitude") + + >>> face_x = AuxCoord([2.0, 6.0], "longitude") + >>> face_y = AuxCoord([1.0, 1.0], "latitude") + + >>> edge_node_c = Connectivity( + ... indices=[[0, 1], [0, 2], [1, 3], [1, 4], [2, 3], [3, 4]], + ... cf_role="edge_node_connectivity", + ... attributes={"demo": "Supports every standard CF property"}, + ... ) + + # Create some dead-centre edge coordinates. + >>> edge_x, edge_y = [ + ... AuxCoord( + ... node_coord.points[edge_node_c.indices_by_src()].mean(axis=1), + ... node_coord.standard_name, + ... ) + ... for node_coord in (node_x, node_y) + ... ] + + >>> face_indices = np.ma.masked_where(999, [[0, 1, 3, 2], [1, 4, 3, 999]]) + >>> face_node_c = Connectivity( + ... indices=face_indices, cf_role="face_node_connectivity" + ... ) + + >>> my_mesh = Mesh( + ... long_name="my_mesh", + ... topology_dimension=2, # Supports 2D (face) elements. + ... node_coords_and_axes=[(node_x, "x"), (node_y, "y")], + ... connectivities=[edge_node_c, face_node_c], + ... edge_coords_and_axes=[(edge_x, "x"), (edge_y, "y")], + ... face_coords_and_axes=[(face_x, "x"), (face_y, "y")], + ... ) + +Link the :class:`~iris.experimental.ugrid.Mesh` to new +:class:`~iris.cube.Cube`\s : + +.. doctest:: ugrid_operations + + >>> import numpy as np + + >>> from iris.coords import DimCoord + >>> from iris.cube import Cube, CubeList + + >>> vertical_levels = DimCoord([0, 1, 2], "height") + + >>> my_cube_list = CubeList() + >>> for conn in (edge_node_c, face_node_c): + ... location = conn.src_location + ... mesh_coord_x, mesh_coord_y = my_mesh.to_MeshCoords(location) + ... data_shape = (len(conn.indices_by_src()), len(vertical_levels.points)) + ... data_array = np.arange(np.prod(data_shape)).reshape(data_shape) + ... + ... my_cube_list.append( + ... Cube( + ... data=data_array, + ... long_name=f"{location}_data", + ... units="K", + ... dim_coords_and_dims=[(vertical_levels, 1)], + ... aux_coords_and_dims=[(mesh_coord_x, 0), (mesh_coord_y, 0)], + ... ) + ... ) + + >>> print(my_cube_list) + 0: edge_data / (K) (-- : 6; height: 3) + 1: face_data / (K) (-- : 2; height: 3) + >>> for cube in my_cube_list: + ... print(f"{cube.name()}: {cube.mesh.name()}, {cube.location}") + edge_data: my_mesh, edge + face_data: my_mesh, face + +Save +---- +.. doctest:: ugrid_operations + + >>> from subprocess import run + + >>> from iris import save + >>> from iris.experimental.ugrid import save_mesh + + >>> target_path = "my_cube_list.nc" + >>> save(my_cube_list, target_path) + >>> ncdump_result = run(["ncdump", "-h", target_path], capture_output=True) + >>> print(ncdump_result.stdout.decode().replace("\t", " ")) + netcdf my_cube_list { + dimensions: + Mesh2d_node = 5 ; + Mesh2d_edge = 6 ; + Mesh2d_face = 2 ; + height = 3 ; + my_mesh_face_N_nodes = 4 ; + my_mesh_edge_N_nodes = 2 ; + variables: + int my_mesh ; + my_mesh:cf_role = "mesh_topology" ; + my_mesh:topology_dimension = 2 ; + my_mesh:long_name = "my_mesh" ; + my_mesh:node_coordinates = "longitude latitude" ; + my_mesh:edge_coordinates = "longitude_0 latitude_0" ; + my_mesh:face_coordinates = "longitude_1 latitude_1" ; + my_mesh:face_node_connectivity = "mesh2d_face" ; + my_mesh:edge_node_connectivity = "mesh2d_edge" ; + double longitude(Mesh2d_node) ; + longitude:units = "degrees_east" ; + longitude:standard_name = "longitude" ; + longitude:long_name = "node_x_coordinates" ; + double latitude(Mesh2d_node) ; + latitude:standard_name = "latitude" ; + double longitude_0(Mesh2d_edge) ; + longitude_0:standard_name = "longitude" ; + double latitude_0(Mesh2d_edge) ; + latitude_0:standard_name = "latitude" ; + double longitude_1(Mesh2d_face) ; + longitude_1:standard_name = "longitude" ; + double latitude_1(Mesh2d_face) ; + latitude_1:standard_name = "latitude" ; + int64 mesh2d_face(Mesh2d_face, my_mesh_face_N_nodes) ; + mesh2d_face:_FillValue = -1LL ; + mesh2d_face:cf_role = "face_node_connectivity" ; + mesh2d_face:start_index = 0LL ; + int64 mesh2d_edge(Mesh2d_edge, my_mesh_edge_N_nodes) ; + mesh2d_edge:demo = "Supports every standard CF property" ; + mesh2d_edge:cf_role = "edge_node_connectivity" ; + mesh2d_edge:start_index = 0LL ; + int64 edge_data(Mesh2d_edge, height) ; + edge_data:long_name = "edge_data" ; + edge_data:units = "K" ; + edge_data:mesh = "my_mesh" ; + edge_data:location = "edge" ; + int64 height(height) ; + height:standard_name = "height" ; + int64 face_data(Mesh2d_face, height) ; + face_data:long_name = "face_data" ; + face_data:units = "K" ; + face_data:mesh = "my_mesh" ; + face_data:location = "face" ; + + // global attributes: + :Conventions = "CF-1.7" ; + } + + Load ---- @@ -24,9 +199,6 @@ Summary .. Possibly covered by the data_model page? -Save ----- - Plotting -------- From 49f1dc41e94cab9974edd0c2cb49dbde6b56aba2 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Mon, 24 Jan 2022 11:51:54 +0000 Subject: [PATCH 16/43] Improved linking between UGRID doc pages. --- docs/src/further_topics/ugrid/data_model.rst | 7 +++++++ docs/src/further_topics/ugrid/partner_packages.rst | 7 ++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/docs/src/further_topics/ugrid/data_model.rst b/docs/src/further_topics/ugrid/data_model.rst index 0b76fc7984..325e29e5d3 100644 --- a/docs/src/further_topics/ugrid/data_model.rst +++ b/docs/src/further_topics/ugrid/data_model.rst @@ -139,6 +139,8 @@ Here are the main examples: Data can be assigned to mesh edges +.. _ugrid implications: + What does this mean? -------------------- Meshes can represent much more varied spatial arrangements @@ -205,6 +207,11 @@ How Iris Represents This Include Cube/Mesh printout(s) +.. seealso:: + + Remember this is a prose summary. Precise documentation is at: + :mod:`iris.experimental.ugrid`. + .. note:: At time of writing (``Jan 2022``), neither 3D meshes nor 3D elements diff --git a/docs/src/further_topics/ugrid/partner_packages.rst b/docs/src/further_topics/ugrid/partner_packages.rst index e245b51423..46c07b96f2 100644 --- a/docs/src/further_topics/ugrid/partner_packages.rst +++ b/docs/src/further_topics/ugrid/partner_packages.rst @@ -6,9 +6,10 @@ Python is an easy to use language and has formed a very strong collaborative scientific community, which is why Iris is written in Python. But it is not as computationally strong as other languages, and this is a problem for working with unstructured meshes where computations are higher in volume and complexity -(see :doc:`data_model`). So there are operations - which Python can perform -acceptably on a structured grids - which would need too much time/resource to -perform on an unstructured mesh. New approaches are needed... +(:ref:`see the data model detail `). So there are +operations - which Python can perform acceptably on a structured grids - which +need unworkably large time/resource to perform on an unstructured mesh. New +approaches are needed... Python packages already exist that enable the use of powerful mesh analysis tools originally written in faster languages such as C. And the Iris team are From 1d94cc892fcefdc2da2abdd32e593d1fb659d3b8 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Mon, 24 Jan 2022 12:15:35 +0000 Subject: [PATCH 17/43] UGRID docs review actions. --- docs/src/further_topics/ugrid/data_model.rst | 2 +- docs/src/further_topics/ugrid/index.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/src/further_topics/ugrid/data_model.rst b/docs/src/further_topics/ugrid/data_model.rst index 325e29e5d3..7490eb0f3a 100644 --- a/docs/src/further_topics/ugrid/data_model.rst +++ b/docs/src/further_topics/ugrid/data_model.rst @@ -16,7 +16,7 @@ Evolution, not revolution Mesh support has been designed wherever possible to fit within the existing Iris model. Meshes concern only the spatial location of data, and can optionally be limited to just the horizontal location (e.g. X and Y). Other -dimensions such as time or experimental re-runs (and often vertical levels) +dimensions such as time or ensemble member (and often vertical levels) retain their familiar structured format. The UGRID conventions themselves are designed as an addition to the existing CF diff --git a/docs/src/further_topics/ugrid/index.rst b/docs/src/further_topics/ugrid/index.rst index caf3950fad..81ba24428a 100644 --- a/docs/src/further_topics/ugrid/index.rst +++ b/docs/src/further_topics/ugrid/index.rst @@ -24,7 +24,7 @@ Meshes are different **Read the detail in these pages before jumping into your own code.** Iris' mesh support is experimental This is a rapidly evolving part of the codebase at time of writing - (``Jan 2021``), as we continually expand the operations that work with mesh + (``Jan 2022``), as we continually expand the operations that work with mesh data. **Be prepared for breaking changes even in minor releases.** :ref:`Get involved! ` We know meshes are an exciting new area for much of Earth science, so we hope From 9f057182b8ff5ffdd155fac18722d969e73fe74a Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Mon, 24 Jan 2022 17:52:52 +0000 Subject: [PATCH 18/43] Example UGRID operations. --- docs/src/further_topics/ugrid/data_model.rst | 2 + docs/src/further_topics/ugrid/operations.rst | 265 +++++++++++++++++-- 2 files changed, 238 insertions(+), 29 deletions(-) diff --git a/docs/src/further_topics/ugrid/data_model.rst b/docs/src/further_topics/ugrid/data_model.rst index 7490eb0f3a..4f005dc2b5 100644 --- a/docs/src/further_topics/ugrid/data_model.rst +++ b/docs/src/further_topics/ugrid/data_model.rst @@ -292,6 +292,8 @@ How UGRID information is stored :class:`~iris.experimental.ugrid.MeshCoord` is attached to (see `The Basics`_). +.. _ugrid MeshCoords: + MeshCoords ~~~~~~~~~~ Links a :class:`~iris.cube.Cube` to a :class:`~iris.experimental.ugrid.Mesh` by diff --git a/docs/src/further_topics/ugrid/operations.rst b/docs/src/further_topics/ugrid/operations.rst index a66837c946..3d03ae5b23 100644 --- a/docs/src/further_topics/ugrid/operations.rst +++ b/docs/src/further_topics/ugrid/operations.rst @@ -6,18 +6,17 @@ Working with Mesh Data .. note:: Several of the operations below rely on the optional dependencies mentioned in :doc:`partner_packages`. -.. - Have a table here that lists the headings below, including a small note - about whether it's unchanged (e.g. Saving), has to be done differently - (e.g. Extraction), or isn't yet possible (e.g. Arithmetic). Each row - should link to the section below. Basically an enhanced TOC. +.. contents:: + :local: .. Below: use demo code over prose wherever workable. Headings aren't an exhaustive list (can you think of any other popular operations?). -Making a Cube with a Mesh -------------------------- +Making a Mesh +------------- +|new| +~~~~~ Creating Iris objects from scratch is a highly useful skill for testing code and improving understanding of how Iris works. This knowledge will likely prove particularly useful when converting data into the Iris mesh data model from @@ -26,8 +25,6 @@ structured formats and non-UGRID mesh formats. The objects created in this example will be used where possible in the subsequent example operations on this page. -Create a :class:`~iris.experimental.ugrid.Mesh` : - .. doctest:: ugrid_operations >>> import numpy as np @@ -83,8 +80,13 @@ Create a :class:`~iris.experimental.ugrid.Mesh` : ... face_coords_and_axes=[(face_x, "x"), (face_y, "y")], ... ) -Link the :class:`~iris.experimental.ugrid.Mesh` to new -:class:`~iris.cube.Cube`\s : +Making a Cube (with a Mesh) +--------------------------- +|unchanged| +~~~~~~~~~~~ +Creating a :class:`~iris.cube.Cube` is unchanged; the +:class:`~iris.experimental.ugrid.Mesh` is linked via a +:class:`~iris.experimental.ugrid.MeshCoord` (see :ref:`ugrid MeshCoords`): .. doctest:: ugrid_operations @@ -95,14 +97,14 @@ Link the :class:`~iris.experimental.ugrid.Mesh` to new >>> vertical_levels = DimCoord([0, 1, 2], "height") - >>> my_cube_list = CubeList() + >>> my_cubelist = CubeList() >>> for conn in (edge_node_c, face_node_c): ... location = conn.src_location ... mesh_coord_x, mesh_coord_y = my_mesh.to_MeshCoords(location) ... data_shape = (len(conn.indices_by_src()), len(vertical_levels.points)) ... data_array = np.arange(np.prod(data_shape)).reshape(data_shape) ... - ... my_cube_list.append( + ... my_cubelist.append( ... Cube( ... data=data_array, ... long_name=f"{location}_data", @@ -112,28 +114,37 @@ Link the :class:`~iris.experimental.ugrid.Mesh` to new ... ) ... ) - >>> print(my_cube_list) + >>> print(my_cubelist) 0: edge_data / (K) (-- : 6; height: 3) 1: face_data / (K) (-- : 2; height: 3) - >>> for cube in my_cube_list: + + >>> for cube in my_cubelist: ... print(f"{cube.name()}: {cube.mesh.name()}, {cube.location}") edge_data: my_mesh, edge face_data: my_mesh, face Save ---- +|unchanged| +~~~~~~~~~~~ +.. note:: UGRID saving support is limited to the NetCDF file format. + +The Iris saving process automatically detects if the :class:`~iris.cube.Cube` +has an associated :class:`~iris.experimental.ugrid.Mesh` and automatically +saves the file in a UGRID-conformant format: + .. doctest:: ugrid_operations >>> from subprocess import run >>> from iris import save - >>> from iris.experimental.ugrid import save_mesh - >>> target_path = "my_cube_list.nc" - >>> save(my_cube_list, target_path) - >>> ncdump_result = run(["ncdump", "-h", target_path], capture_output=True) + >>> cubelist_path = "my_cubelist.nc" + >>> save(my_cubelist, cubelist_path) + + >>> ncdump_result = run(["ncdump", "-h", cubelist_path], capture_output=True) >>> print(ncdump_result.stdout.decode().replace("\t", " ")) - netcdf my_cube_list { + netcdf my_cubelist { dimensions: Mesh2d_node = 5 ; Mesh2d_edge = 6 ; @@ -191,38 +202,234 @@ Save } +The :func:`iris.experimental.ugrid.save_mesh` function allows +:class:`~iris.experimental.ugrid.Mesh`\es to be saved to file without +associated :class:`~iris.cube.Cube`\s: + +.. doctest:: ugrid_operations + + >>> from subprocess import run + + >>> from iris.experimental.ugrid import save_mesh + + >>> mesh_path = "my_mesh.nc" + >>> save_mesh(my_mesh, mesh_path) + + >>> ncdump_result = run(["ncdump", "-h", mesh_path], capture_output=True) + >>> print(ncdump_result.stdout.decode().replace("\t", " ")) + netcdf my_mesh { + dimensions: + Mesh2d_node = 5 ; + Mesh2d_edge = 6 ; + Mesh2d_face = 2 ; + my_mesh_face_N_nodes = 4 ; + my_mesh_edge_N_nodes = 2 ; + variables: + int my_mesh ; + my_mesh:cf_role = "mesh_topology" ; + my_mesh:topology_dimension = 2 ; + my_mesh:long_name = "my_mesh" ; + my_mesh:node_coordinates = "longitude latitude" ; + my_mesh:edge_coordinates = "longitude_0 latitude_0" ; + my_mesh:face_coordinates = "longitude_1 latitude_1" ; + my_mesh:face_node_connectivity = "mesh2d_face" ; + my_mesh:edge_node_connectivity = "mesh2d_edge" ; + double longitude(Mesh2d_node) ; + longitude:units = "degrees_east" ; + longitude:standard_name = "longitude" ; + longitude:long_name = "node_x_coordinates" ; + double latitude(Mesh2d_node) ; + latitude:standard_name = "latitude" ; + double longitude_0(Mesh2d_edge) ; + longitude_0:standard_name = "longitude" ; + double latitude_0(Mesh2d_edge) ; + latitude_0:standard_name = "latitude" ; + double longitude_1(Mesh2d_face) ; + longitude_1:standard_name = "longitude" ; + double latitude_1(Mesh2d_face) ; + latitude_1:standard_name = "latitude" ; + int64 mesh2d_face(Mesh2d_face, my_mesh_face_N_nodes) ; + mesh2d_face:_FillValue = -1LL ; + mesh2d_face:cf_role = "face_node_connectivity" ; + mesh2d_face:start_index = 0LL ; + int64 mesh2d_edge(Mesh2d_edge, my_mesh_edge_N_nodes) ; + mesh2d_edge:demo = "Supports every standard CF property" ; + mesh2d_edge:cf_role = "edge_node_connectivity" ; + mesh2d_edge:start_index = 0LL ; + + // global attributes: + :Conventions = "CF-1.7" ; + } + + Load ---- +|different| - UGRID parsing is opt-in +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. note:: UGRID loading support is limited to the NetCDF file format. + +While Iris' UGRID support remains :mod:`~iris.experimental`, parsing UGRID when +loading a file remains **optional**. To load UGRID data from a file into the +Iris mesh data model, use the +:const:`iris.experimental.ugrid.PARSE_UGRID_ON_LOAD` context manager: + +.. doctest:: ugrid_operations + + >>> from iris import load + >>> from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD + + >>> with PARSE_UGRID_ON_LOAD.context(): + ... loaded_cubelist = load(cubelist_path) + + # Sort CubeList to ensure consistent result. + >>> loaded_cubelist.sort(key=lambda cube: cube.name()) + >>> print(loaded_cubelist) + 0: edge_data / (K) (-- : 6; height: 3) + 1: face_data / (K) (-- : 2; height: 3) + +All the existing loading functionality still operates on UGRID-compliant +data - :class:`~iris.Constraint`\s, callbacks, :func:`~iris.load_cube` +etcetera: + +.. doctest:: ugrid_operations + + >>> from iris import Constraint, load_cube + + >>> with PARSE_UGRID_ON_LOAD.context(): + ... ground_cubelist = load(cubelist_path, Constraint(height=0)) + ... face_cube = load_cube(cubelist_path, "face_data") + + # Sort CubeList to ensure consistent result. + >>> ground_cubelist.sort(key=lambda cube: cube.name()) + >>> print(ground_cubelist) + 0: edge_data / (K) (-- : 6) + 1: face_data / (K) (-- : 2) + + >>> print(face_cube) + face_data / (K) (-- : 2; height: 3) + Dimension coordinates: + height - x + Mesh coordinates: + latitude x - + longitude x - + Attributes: + Conventions CF-1.7 + +.. note:: + + We recommend caution if constraining on coordinates associated with a + :class:`~iris.experimental.ugrid.Mesh`. An individual coordinate value + might not be shared by any other data points, and using a coordinate range + will demand notably higher performance given the size of the dimension + versus structured grids + (:ref:`see the data model detail `). + +The :func:`iris.experimental.ugrid.load_mesh` and +:func:`~iris.experimental.ugrid.load_meshes` functions allow only +:class:`~iris.experimental.ugrid.Mesh`\es to be loaded from a file without +creating any associated :class:`~iris.cube.Cube`\s: + +.. doctest:: ugrid_operations + + >>> from iris.experimental.ugrid import load_mesh + + >>> with PARSE_UGRID_ON_LOAD.context(): + ... loaded_mesh = load_mesh(cubelist_path) + +.. todo: print(loaded_mesh) - once printouts have been improved. Summary ------- +.. todo: populate or remove + .. Possibly covered by the data_model page? Plotting -------- +|different| - plot with GeoVista +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. todo: populate! Regional Extraction ------------------- +|different| - use GeoVista for mesh analysis +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. todo: populate! + .. Highlight the uselessness of indexing. Regridding ---------- +|different| - use iris-esmf-regrid for mesh regridders +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. todo: populate! Equality -------- -.. - Is this worth mentioning, given it just works the way it always has? +|unchanged| +~~~~~~~~~~~ +:class:`~iris.experimental.ugrid.Mesh` comparison is supported: -Recombination -------------- +.. doctest:: ugrid_operations + + >>> from copy import deepcopy + + >>> same_mesh = deepcopy(my_mesh) + >>> print(my_mesh == same_mesh) + True + + >>> different_mesh = deepcopy(my_mesh) + >>> different_mesh.edge_node_connectivity.indices[0] = [0, 4] + >>> print(my_mesh == different_mesh) + False + +Associated :class:`~iris.experimental.ugrid.Mesh`\es are included in +:class:`~iris.cube.Cube` comparisons: + +.. doctest:: ugrid_operations + + >>> edge_cube = my_cubelist.extract_cube("edge_data") + >>> different_cube = deepcopy(edge_cube) + >>> for coord in different_cube.coords(mesh_coords=True): + ... different_cube.remove_coord(coord.name()) + >>> different_coords = different_mesh.to_MeshCoords(location="edge") + >>> for coord in different_coords: + ... different_cube.add_aux_coord(coord, edge_cube.mesh_dim()) + + >>> print(edge_cube == different_cube) + False + +.. note:: + + Keep an eye on memory demand when comparing large + :class:`~iris.experimental.ugrid.Mesh`\es, but note that + :class:`~iris.experimental.ugrid.Mesh`\ equality is enabled for lazy + processing (:doc:`/userguide/real_and_lazy_data`), so if the + :class:`~iris.experimental.ugrid.Mesh`\es being compared are lazy the + process will use less memory than their total size. + +Combining Cubes +--------------- +|different| +~~~~~~~~~~~ +.. todo: populate! Arithmetic ---------- -.. - Not possible yet - mention this. +|pending| +~~~~~~~~~ +:class:`~iris.cube.Cube` Arithmetic (described in :doc:`/userguide/cube_maths`) +has not yet been adapted to handle :class:`~iris.cube.Cube`\s that include +:class:`~iris.experimental.ugrid.MeshCoord`\s. -.. - Headings for other popular operations that aren't yet possible, including - if they're planned soon. + +.. todo: + Enumerate other popular operations that aren't yet possible + (and are they planned soon?) + +.. |new| replace:: ✨ New +.. |unchanged| replace:: ♻️ Unchanged +.. |different| replace:: ⚠️ Different +.. |pending| replace:: 🚧 Support Pending \ No newline at end of file From 73f3f1b221ff59be5d102b4413da4be48afae22a Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Tue, 25 Jan 2022 13:06:00 +0000 Subject: [PATCH 19/43] More UGRID operations documenting. --- docs/src/further_topics/ugrid/operations.rst | 651 ++++++++++--------- 1 file changed, 349 insertions(+), 302 deletions(-) diff --git a/docs/src/further_topics/ugrid/operations.rst b/docs/src/further_topics/ugrid/operations.rst index 3d03ae5b23..2a0d58fd05 100644 --- a/docs/src/further_topics/ugrid/operations.rst +++ b/docs/src/further_topics/ugrid/operations.rst @@ -6,8 +6,30 @@ Working with Mesh Data .. note:: Several of the operations below rely on the optional dependencies mentioned in :doc:`partner_packages`. -.. contents:: - :local: +.. list-table:: + :align: left + :widths: 35, 75 + + * - `Making a Mesh`_ + - |tagline: making a mesh| + * - `Making a Cube`_ + - |tagline: making a cube| + * - `Save`_ + - |tagline: save| + * - `Load`_ + - |tagline: load| + * - `Plotting`_ + - |tagline: plotting| + * - `Regional Extraction`_ + - |tagline: regional extraction| + * - `Regridding`_ + - |tagline: regridding| + * - `Equality`_ + - |tagline: equality| + * - `Combining Cubes`_ + - |tagline: combining cubes| + * - `Arithmetic`_ + - |tagline: arithmetic| .. Below: use demo code over prose wherever workable. Headings aren't an @@ -15,8 +37,12 @@ Working with Mesh Data Making a Mesh ------------- -|new| -~~~~~ +.. |tagline: making a mesh| replace:: |new| + +.. rubric:: |tagline: making a mesh| + +**Already have a file?** Consider skipping to `Load`_. + Creating Iris objects from scratch is a highly useful skill for testing code and improving understanding of how Iris works. This knowledge will likely prove particularly useful when converting data into the Iris mesh data model from @@ -25,247 +51,263 @@ structured formats and non-UGRID mesh formats. The objects created in this example will be used where possible in the subsequent example operations on this page. -.. doctest:: ugrid_operations - - >>> import numpy as np - - >>> from iris.coords import AuxCoord - >>> from iris.experimental.ugrid import Connectivity, Mesh - - # Going to create the following mesh - # (node indices are shown to aid understanding): - # - # 0----1 - # | |\ - # | + |+\ - # 2----3--4 - - >>> node_x = AuxCoord( - ... points=[3.0, 3.0, 0.0, 0.0, 0.0], - ... standard_name="longitude", - ... units="degrees_east", - ... long_name="node_x_coordinates", - ... ) - >>> node_y = AuxCoord(points=[0.0, 5.0, 0.0, 5.0, 8.0], standard_name="latitude") - - >>> face_x = AuxCoord([2.0, 6.0], "longitude") - >>> face_y = AuxCoord([1.0, 1.0], "latitude") - - >>> edge_node_c = Connectivity( - ... indices=[[0, 1], [0, 2], [1, 3], [1, 4], [2, 3], [3, 4]], - ... cf_role="edge_node_connectivity", - ... attributes={"demo": "Supports every standard CF property"}, - ... ) - - # Create some dead-centre edge coordinates. - >>> edge_x, edge_y = [ - ... AuxCoord( - ... node_coord.points[edge_node_c.indices_by_src()].mean(axis=1), - ... node_coord.standard_name, - ... ) - ... for node_coord in (node_x, node_y) - ... ] - - >>> face_indices = np.ma.masked_where(999, [[0, 1, 3, 2], [1, 4, 3, 999]]) - >>> face_node_c = Connectivity( - ... indices=face_indices, cf_role="face_node_connectivity" - ... ) - - >>> my_mesh = Mesh( - ... long_name="my_mesh", - ... topology_dimension=2, # Supports 2D (face) elements. - ... node_coords_and_axes=[(node_x, "x"), (node_y, "y")], - ... connectivities=[edge_node_c, face_node_c], - ... edge_coords_and_axes=[(edge_x, "x"), (edge_y, "y")], - ... face_coords_and_axes=[(face_x, "x"), (face_y, "y")], - ... ) +.. dropdown:: :opticon:`code` + + .. doctest:: ugrid_operations + + >>> import numpy as np + + >>> from iris.coords import AuxCoord + >>> from iris.experimental.ugrid import Connectivity, Mesh + + # Going to create the following mesh + # (node indices are shown to aid understanding): + # + # 0----1 + # | |\ + # | + |+\ + # 2----3--4 + + >>> node_x = AuxCoord( + ... points=[3.0, 3.0, 0.0, 0.0, 0.0], + ... standard_name="longitude", + ... units="degrees_east", + ... long_name="node_x_coordinates", + ... ) + >>> node_y = AuxCoord(points=[0.0, 5.0, 0.0, 5.0, 8.0], standard_name="latitude") + + >>> face_x = AuxCoord([2.0, 6.0], "longitude") + >>> face_y = AuxCoord([1.0, 1.0], "latitude") + + >>> edge_node_c = Connectivity( + ... indices=[[0, 1], [0, 2], [1, 3], [1, 4], [2, 3], [3, 4]], + ... cf_role="edge_node_connectivity", + ... attributes={"demo": "Supports every standard CF property"}, + ... ) + + # Create some dead-centre edge coordinates. + >>> edge_x, edge_y = [ + ... AuxCoord( + ... node_coord.points[edge_node_c.indices_by_src()].mean(axis=1), + ... node_coord.standard_name, + ... ) + ... for node_coord in (node_x, node_y) + ... ] + + >>> face_indices = np.ma.masked_where(999, [[0, 1, 3, 2], [1, 4, 3, 999]]) + >>> face_node_c = Connectivity( + ... indices=face_indices, cf_role="face_node_connectivity" + ... ) + + >>> my_mesh = Mesh( + ... long_name="my_mesh", + ... topology_dimension=2, # Supports 2D (face) elements. + ... node_coords_and_axes=[(node_x, "x"), (node_y, "y")], + ... connectivities=[edge_node_c, face_node_c], + ... edge_coords_and_axes=[(edge_x, "x"), (edge_y, "y")], + ... face_coords_and_axes=[(face_x, "x"), (face_y, "y")], + ... ) + +.. _making a cube: Making a Cube (with a Mesh) --------------------------- -|unchanged| -~~~~~~~~~~~ +.. |tagline: making a cube| replace:: |unchanged| + +.. rubric:: |tagline: making a cube| + Creating a :class:`~iris.cube.Cube` is unchanged; the :class:`~iris.experimental.ugrid.Mesh` is linked via a :class:`~iris.experimental.ugrid.MeshCoord` (see :ref:`ugrid MeshCoords`): -.. doctest:: ugrid_operations - - >>> import numpy as np - - >>> from iris.coords import DimCoord - >>> from iris.cube import Cube, CubeList - - >>> vertical_levels = DimCoord([0, 1, 2], "height") - - >>> my_cubelist = CubeList() - >>> for conn in (edge_node_c, face_node_c): - ... location = conn.src_location - ... mesh_coord_x, mesh_coord_y = my_mesh.to_MeshCoords(location) - ... data_shape = (len(conn.indices_by_src()), len(vertical_levels.points)) - ... data_array = np.arange(np.prod(data_shape)).reshape(data_shape) - ... - ... my_cubelist.append( - ... Cube( - ... data=data_array, - ... long_name=f"{location}_data", - ... units="K", - ... dim_coords_and_dims=[(vertical_levels, 1)], - ... aux_coords_and_dims=[(mesh_coord_x, 0), (mesh_coord_y, 0)], - ... ) - ... ) - - >>> print(my_cubelist) - 0: edge_data / (K) (-- : 6; height: 3) - 1: face_data / (K) (-- : 2; height: 3) - - >>> for cube in my_cubelist: - ... print(f"{cube.name()}: {cube.mesh.name()}, {cube.location}") - edge_data: my_mesh, edge - face_data: my_mesh, face +.. dropdown:: :opticon:`code` + + .. doctest:: ugrid_operations + + >>> import numpy as np + + >>> from iris.coords import DimCoord + >>> from iris.cube import Cube, CubeList + + >>> vertical_levels = DimCoord([0, 1, 2], "height") + + >>> my_cubelist = CubeList() + >>> for conn in (edge_node_c, face_node_c): + ... location = conn.src_location + ... mesh_coord_x, mesh_coord_y = my_mesh.to_MeshCoords(location) + ... data_shape = (len(conn.indices_by_src()), len(vertical_levels.points)) + ... data_array = np.arange(np.prod(data_shape)).reshape(data_shape) + ... + ... my_cubelist.append( + ... Cube( + ... data=data_array, + ... long_name=f"{location}_data", + ... units="K", + ... dim_coords_and_dims=[(vertical_levels, 1)], + ... aux_coords_and_dims=[(mesh_coord_x, 0), (mesh_coord_y, 0)], + ... ) + ... ) + + >>> print(my_cubelist) + 0: edge_data / (K) (-- : 6; height: 3) + 1: face_data / (K) (-- : 2; height: 3) + + >>> for cube in my_cubelist: + ... print(f"{cube.name()}: {cube.mesh.name()}, {cube.location}") + edge_data: my_mesh, edge + face_data: my_mesh, face Save ---- -|unchanged| -~~~~~~~~~~~ +.. |tagline: save| replace:: |unchanged| + +.. rubric:: |tagline: save| + .. note:: UGRID saving support is limited to the NetCDF file format. The Iris saving process automatically detects if the :class:`~iris.cube.Cube` has an associated :class:`~iris.experimental.ugrid.Mesh` and automatically saves the file in a UGRID-conformant format: -.. doctest:: ugrid_operations - - >>> from subprocess import run - - >>> from iris import save - - >>> cubelist_path = "my_cubelist.nc" - >>> save(my_cubelist, cubelist_path) - - >>> ncdump_result = run(["ncdump", "-h", cubelist_path], capture_output=True) - >>> print(ncdump_result.stdout.decode().replace("\t", " ")) - netcdf my_cubelist { - dimensions: - Mesh2d_node = 5 ; - Mesh2d_edge = 6 ; - Mesh2d_face = 2 ; - height = 3 ; - my_mesh_face_N_nodes = 4 ; - my_mesh_edge_N_nodes = 2 ; - variables: - int my_mesh ; - my_mesh:cf_role = "mesh_topology" ; - my_mesh:topology_dimension = 2 ; - my_mesh:long_name = "my_mesh" ; - my_mesh:node_coordinates = "longitude latitude" ; - my_mesh:edge_coordinates = "longitude_0 latitude_0" ; - my_mesh:face_coordinates = "longitude_1 latitude_1" ; - my_mesh:face_node_connectivity = "mesh2d_face" ; - my_mesh:edge_node_connectivity = "mesh2d_edge" ; - double longitude(Mesh2d_node) ; - longitude:units = "degrees_east" ; - longitude:standard_name = "longitude" ; - longitude:long_name = "node_x_coordinates" ; - double latitude(Mesh2d_node) ; - latitude:standard_name = "latitude" ; - double longitude_0(Mesh2d_edge) ; - longitude_0:standard_name = "longitude" ; - double latitude_0(Mesh2d_edge) ; - latitude_0:standard_name = "latitude" ; - double longitude_1(Mesh2d_face) ; - longitude_1:standard_name = "longitude" ; - double latitude_1(Mesh2d_face) ; - latitude_1:standard_name = "latitude" ; - int64 mesh2d_face(Mesh2d_face, my_mesh_face_N_nodes) ; - mesh2d_face:_FillValue = -1LL ; - mesh2d_face:cf_role = "face_node_connectivity" ; - mesh2d_face:start_index = 0LL ; - int64 mesh2d_edge(Mesh2d_edge, my_mesh_edge_N_nodes) ; - mesh2d_edge:demo = "Supports every standard CF property" ; - mesh2d_edge:cf_role = "edge_node_connectivity" ; - mesh2d_edge:start_index = 0LL ; - int64 edge_data(Mesh2d_edge, height) ; - edge_data:long_name = "edge_data" ; - edge_data:units = "K" ; - edge_data:mesh = "my_mesh" ; - edge_data:location = "edge" ; - int64 height(height) ; - height:standard_name = "height" ; - int64 face_data(Mesh2d_face, height) ; - face_data:long_name = "face_data" ; - face_data:units = "K" ; - face_data:mesh = "my_mesh" ; - face_data:location = "face" ; - - // global attributes: - :Conventions = "CF-1.7" ; - } - +.. dropdown:: :opticon:`code` + + .. doctest:: ugrid_operations + + >>> from subprocess import run + + >>> from iris import save + + >>> cubelist_path = "my_cubelist.nc" + >>> save(my_cubelist, cubelist_path) + + >>> ncdump_result = run(["ncdump", "-h", cubelist_path], capture_output=True) + >>> print(ncdump_result.stdout.decode().replace("\t", " ")) + netcdf my_cubelist { + dimensions: + Mesh2d_node = 5 ; + Mesh2d_edge = 6 ; + Mesh2d_face = 2 ; + height = 3 ; + my_mesh_face_N_nodes = 4 ; + my_mesh_edge_N_nodes = 2 ; + variables: + int my_mesh ; + my_mesh:cf_role = "mesh_topology" ; + my_mesh:topology_dimension = 2 ; + my_mesh:long_name = "my_mesh" ; + my_mesh:node_coordinates = "longitude latitude" ; + my_mesh:edge_coordinates = "longitude_0 latitude_0" ; + my_mesh:face_coordinates = "longitude_1 latitude_1" ; + my_mesh:face_node_connectivity = "mesh2d_face" ; + my_mesh:edge_node_connectivity = "mesh2d_edge" ; + double longitude(Mesh2d_node) ; + longitude:units = "degrees_east" ; + longitude:standard_name = "longitude" ; + longitude:long_name = "node_x_coordinates" ; + double latitude(Mesh2d_node) ; + latitude:standard_name = "latitude" ; + double longitude_0(Mesh2d_edge) ; + longitude_0:standard_name = "longitude" ; + double latitude_0(Mesh2d_edge) ; + latitude_0:standard_name = "latitude" ; + double longitude_1(Mesh2d_face) ; + longitude_1:standard_name = "longitude" ; + double latitude_1(Mesh2d_face) ; + latitude_1:standard_name = "latitude" ; + int64 mesh2d_face(Mesh2d_face, my_mesh_face_N_nodes) ; + mesh2d_face:_FillValue = -1LL ; + mesh2d_face:cf_role = "face_node_connectivity" ; + mesh2d_face:start_index = 0LL ; + int64 mesh2d_edge(Mesh2d_edge, my_mesh_edge_N_nodes) ; + mesh2d_edge:demo = "Supports every standard CF property" ; + mesh2d_edge:cf_role = "edge_node_connectivity" ; + mesh2d_edge:start_index = 0LL ; + int64 edge_data(Mesh2d_edge, height) ; + edge_data:long_name = "edge_data" ; + edge_data:units = "K" ; + edge_data:mesh = "my_mesh" ; + edge_data:location = "edge" ; + int64 height(height) ; + height:standard_name = "height" ; + int64 face_data(Mesh2d_face, height) ; + face_data:long_name = "face_data" ; + face_data:units = "K" ; + face_data:mesh = "my_mesh" ; + face_data:location = "face" ; + + // global attributes: + :Conventions = "CF-1.7" ; + } + The :func:`iris.experimental.ugrid.save_mesh` function allows :class:`~iris.experimental.ugrid.Mesh`\es to be saved to file without associated :class:`~iris.cube.Cube`\s: -.. doctest:: ugrid_operations - - >>> from subprocess import run - - >>> from iris.experimental.ugrid import save_mesh - - >>> mesh_path = "my_mesh.nc" - >>> save_mesh(my_mesh, mesh_path) - - >>> ncdump_result = run(["ncdump", "-h", mesh_path], capture_output=True) - >>> print(ncdump_result.stdout.decode().replace("\t", " ")) - netcdf my_mesh { - dimensions: - Mesh2d_node = 5 ; - Mesh2d_edge = 6 ; - Mesh2d_face = 2 ; - my_mesh_face_N_nodes = 4 ; - my_mesh_edge_N_nodes = 2 ; - variables: - int my_mesh ; - my_mesh:cf_role = "mesh_topology" ; - my_mesh:topology_dimension = 2 ; - my_mesh:long_name = "my_mesh" ; - my_mesh:node_coordinates = "longitude latitude" ; - my_mesh:edge_coordinates = "longitude_0 latitude_0" ; - my_mesh:face_coordinates = "longitude_1 latitude_1" ; - my_mesh:face_node_connectivity = "mesh2d_face" ; - my_mesh:edge_node_connectivity = "mesh2d_edge" ; - double longitude(Mesh2d_node) ; - longitude:units = "degrees_east" ; - longitude:standard_name = "longitude" ; - longitude:long_name = "node_x_coordinates" ; - double latitude(Mesh2d_node) ; - latitude:standard_name = "latitude" ; - double longitude_0(Mesh2d_edge) ; - longitude_0:standard_name = "longitude" ; - double latitude_0(Mesh2d_edge) ; - latitude_0:standard_name = "latitude" ; - double longitude_1(Mesh2d_face) ; - longitude_1:standard_name = "longitude" ; - double latitude_1(Mesh2d_face) ; - latitude_1:standard_name = "latitude" ; - int64 mesh2d_face(Mesh2d_face, my_mesh_face_N_nodes) ; - mesh2d_face:_FillValue = -1LL ; - mesh2d_face:cf_role = "face_node_connectivity" ; - mesh2d_face:start_index = 0LL ; - int64 mesh2d_edge(Mesh2d_edge, my_mesh_edge_N_nodes) ; - mesh2d_edge:demo = "Supports every standard CF property" ; - mesh2d_edge:cf_role = "edge_node_connectivity" ; - mesh2d_edge:start_index = 0LL ; - - // global attributes: - :Conventions = "CF-1.7" ; - } - +.. dropdown:: :opticon:`code` + + .. doctest:: ugrid_operations + + >>> from subprocess import run + + >>> from iris.experimental.ugrid import save_mesh + + >>> mesh_path = "my_mesh.nc" + >>> save_mesh(my_mesh, mesh_path) + + >>> ncdump_result = run(["ncdump", "-h", mesh_path], capture_output=True) + >>> print(ncdump_result.stdout.decode().replace("\t", " ")) + netcdf my_mesh { + dimensions: + Mesh2d_node = 5 ; + Mesh2d_edge = 6 ; + Mesh2d_face = 2 ; + my_mesh_face_N_nodes = 4 ; + my_mesh_edge_N_nodes = 2 ; + variables: + int my_mesh ; + my_mesh:cf_role = "mesh_topology" ; + my_mesh:topology_dimension = 2 ; + my_mesh:long_name = "my_mesh" ; + my_mesh:node_coordinates = "longitude latitude" ; + my_mesh:edge_coordinates = "longitude_0 latitude_0" ; + my_mesh:face_coordinates = "longitude_1 latitude_1" ; + my_mesh:face_node_connectivity = "mesh2d_face" ; + my_mesh:edge_node_connectivity = "mesh2d_edge" ; + double longitude(Mesh2d_node) ; + longitude:units = "degrees_east" ; + longitude:standard_name = "longitude" ; + longitude:long_name = "node_x_coordinates" ; + double latitude(Mesh2d_node) ; + latitude:standard_name = "latitude" ; + double longitude_0(Mesh2d_edge) ; + longitude_0:standard_name = "longitude" ; + double latitude_0(Mesh2d_edge) ; + latitude_0:standard_name = "latitude" ; + double longitude_1(Mesh2d_face) ; + longitude_1:standard_name = "longitude" ; + double latitude_1(Mesh2d_face) ; + latitude_1:standard_name = "latitude" ; + int64 mesh2d_face(Mesh2d_face, my_mesh_face_N_nodes) ; + mesh2d_face:_FillValue = -1LL ; + mesh2d_face:cf_role = "face_node_connectivity" ; + mesh2d_face:start_index = 0LL ; + int64 mesh2d_edge(Mesh2d_edge, my_mesh_edge_N_nodes) ; + mesh2d_edge:demo = "Supports every standard CF property" ; + mesh2d_edge:cf_role = "edge_node_connectivity" ; + mesh2d_edge:start_index = 0LL ; + + // global attributes: + :Conventions = "CF-1.7" ; + } + Load ---- -|different| - UGRID parsing is opt-in -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. |tagline: load| replace:: |different| - UGRID parsing is opt-in + +.. rubric:: |tagline: load| + .. note:: UGRID loading support is limited to the NetCDF file format. While Iris' UGRID support remains :mod:`~iris.experimental`, parsing UGRID when @@ -273,47 +315,51 @@ loading a file remains **optional**. To load UGRID data from a file into the Iris mesh data model, use the :const:`iris.experimental.ugrid.PARSE_UGRID_ON_LOAD` context manager: -.. doctest:: ugrid_operations +.. dropdown:: :opticon:`code` - >>> from iris import load - >>> from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD + .. doctest:: ugrid_operations - >>> with PARSE_UGRID_ON_LOAD.context(): - ... loaded_cubelist = load(cubelist_path) + >>> from iris import load + >>> from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD - # Sort CubeList to ensure consistent result. - >>> loaded_cubelist.sort(key=lambda cube: cube.name()) - >>> print(loaded_cubelist) - 0: edge_data / (K) (-- : 6; height: 3) - 1: face_data / (K) (-- : 2; height: 3) + >>> with PARSE_UGRID_ON_LOAD.context(): + ... loaded_cubelist = load(cubelist_path) + + # Sort CubeList to ensure consistent result. + >>> loaded_cubelist.sort(key=lambda cube: cube.name()) + >>> print(loaded_cubelist) + 0: edge_data / (K) (-- : 6; height: 3) + 1: face_data / (K) (-- : 2; height: 3) All the existing loading functionality still operates on UGRID-compliant data - :class:`~iris.Constraint`\s, callbacks, :func:`~iris.load_cube` etcetera: -.. doctest:: ugrid_operations +.. dropdown:: :opticon:`code` + + .. doctest:: ugrid_operations - >>> from iris import Constraint, load_cube + >>> from iris import Constraint, load_cube - >>> with PARSE_UGRID_ON_LOAD.context(): - ... ground_cubelist = load(cubelist_path, Constraint(height=0)) - ... face_cube = load_cube(cubelist_path, "face_data") + >>> with PARSE_UGRID_ON_LOAD.context(): + ... ground_cubelist = load(cubelist_path, Constraint(height=0)) + ... face_cube = load_cube(cubelist_path, "face_data") - # Sort CubeList to ensure consistent result. - >>> ground_cubelist.sort(key=lambda cube: cube.name()) - >>> print(ground_cubelist) - 0: edge_data / (K) (-- : 6) - 1: face_data / (K) (-- : 2) + # Sort CubeList to ensure consistent result. + >>> ground_cubelist.sort(key=lambda cube: cube.name()) + >>> print(ground_cubelist) + 0: edge_data / (K) (-- : 6) + 1: face_data / (K) (-- : 2) - >>> print(face_cube) - face_data / (K) (-- : 2; height: 3) - Dimension coordinates: - height - x - Mesh coordinates: - latitude x - - longitude x - - Attributes: - Conventions CF-1.7 + >>> print(face_cube) + face_data / (K) (-- : 2; height: 3) + Dimension coordinates: + height - x + Mesh coordinates: + latitude x - + longitude x - + Attributes: + Conventions CF-1.7 .. note:: @@ -329,32 +375,31 @@ The :func:`iris.experimental.ugrid.load_mesh` and :class:`~iris.experimental.ugrid.Mesh`\es to be loaded from a file without creating any associated :class:`~iris.cube.Cube`\s: -.. doctest:: ugrid_operations +.. dropdown:: :opticon:`code` - >>> from iris.experimental.ugrid import load_mesh + .. doctest:: ugrid_operations - >>> with PARSE_UGRID_ON_LOAD.context(): - ... loaded_mesh = load_mesh(cubelist_path) + >>> from iris.experimental.ugrid import load_mesh -.. todo: print(loaded_mesh) - once printouts have been improved. + >>> with PARSE_UGRID_ON_LOAD.context(): + ... loaded_mesh = load_mesh(cubelist_path) -Summary -------- -.. todo: populate or remove - -.. - Possibly covered by the data_model page? +.. todo: print(loaded_mesh) - once printouts have been improved. Plotting -------- -|different| - plot with GeoVista -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. |tagline: plotting| replace:: |different| - plot with GeoVista + +.. rubric:: |tagline: plotting| + .. todo: populate! Regional Extraction ------------------- -|different| - use GeoVista for mesh analysis -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. |tagline: regional extraction| replace:: |different| - use GeoVista for mesh analysis + +.. rubric:: |tagline: regional extraction| + .. todo: populate! .. @@ -362,44 +407,23 @@ Regional Extraction Regridding ---------- -|different| - use iris-esmf-regrid for mesh regridders -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. |tagline: regridding| replace:: |different| - use iris-esmf-regrid for mesh regridders + +.. rubric:: |tagline: regridding| + .. todo: populate! Equality -------- -|unchanged| -~~~~~~~~~~~ -:class:`~iris.experimental.ugrid.Mesh` comparison is supported: - -.. doctest:: ugrid_operations - - >>> from copy import deepcopy - - >>> same_mesh = deepcopy(my_mesh) - >>> print(my_mesh == same_mesh) - True - - >>> different_mesh = deepcopy(my_mesh) - >>> different_mesh.edge_node_connectivity.indices[0] = [0, 4] - >>> print(my_mesh == different_mesh) - False +.. |tagline: equality| replace:: |unchanged| -Associated :class:`~iris.experimental.ugrid.Mesh`\es are included in -:class:`~iris.cube.Cube` comparisons: +.. rubric:: |tagline: equality| -.. doctest:: ugrid_operations - - >>> edge_cube = my_cubelist.extract_cube("edge_data") - >>> different_cube = deepcopy(edge_cube) - >>> for coord in different_cube.coords(mesh_coords=True): - ... different_cube.remove_coord(coord.name()) - >>> different_coords = different_mesh.to_MeshCoords(location="edge") - >>> for coord in different_coords: - ... different_cube.add_aux_coord(coord, edge_cube.mesh_dim()) - - >>> print(edge_cube == different_cube) - False +:class:`~iris.experimental.ugrid.Mesh` comparison is supported, and comparing +two ':class:`~iris.experimental.ugrid.Mesh`-:class:`~iris.cube.Cube`\s' will +include a comparison of the respective +:class:`~iris.experimental.ugrid.Mesh`\es, with no extra action needed by the +user. .. note:: @@ -412,14 +436,37 @@ Associated :class:`~iris.experimental.ugrid.Mesh`\es are included in Combining Cubes --------------- -|different| -~~~~~~~~~~~ -.. todo: populate! +.. |tagline: combining cubes| replace:: |pending| + +.. rubric:: |tagline: combining cubes| + +Merging or concatenating :class:`~iris.cube.Cube`\s (described in +:doc:`/userguide/merge_and_concat`) with two different +:class:`~iris.experimental.ugrid.Mesh`\es is not possible - a +:class:`~iris.cube.Cube` must be associated with just a single +:class:`~iris.experimental.ugrid.Mesh`, and merge/concatenate are not yet +capable of combining multiple :class:`~iris.experimental.ugrid.Mesh`\es into +one. + +:class:`~iris.cube.Cube`\s that include +:class:`~iris.experimental.ugrid.MeshCoord`\s can still be merged/concatenated +on dimensions other than the :meth:`~iris.cube.Cube.mesh_dim`, since such +:class:`~iris.cube.Cube`\s will by definition share the same +:class:`~iris.experimental.ugrid.Mesh`. + +.. seealso:: + + You may wish to investigate + :func:`iris.experimental.ugrid.recombine_submeshes`, which can be used + for a very specific type of :class:`~iris.experimental.ugrid.Mesh` + combination not detailed here. Arithmetic ---------- -|pending| -~~~~~~~~~ +.. |tagline: arithmetic| replace:: |pending| + +.. rubric:: |tagline: arithmetic| + :class:`~iris.cube.Cube` Arithmetic (described in :doc:`/userguide/cube_maths`) has not yet been adapted to handle :class:`~iris.cube.Cube`\s that include :class:`~iris.experimental.ugrid.MeshCoord`\s. From a0b405c3b4432e6e172616620cb6a1563b083a57 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Tue, 25 Jan 2022 14:25:10 +0000 Subject: [PATCH 20/43] UGRID docs review actions from @pp-mo. --- docs/src/further_topics/ugrid/data_model.rst | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/docs/src/further_topics/ugrid/data_model.rst b/docs/src/further_topics/ugrid/data_model.rst index 4f005dc2b5..1297964a99 100644 --- a/docs/src/further_topics/ugrid/data_model.rst +++ b/docs/src/further_topics/ugrid/data_model.rst @@ -66,8 +66,8 @@ every other node. Since nodes can be anywhere in the space - **unstructured** - the position in the array has nothing to do with spatial position. If data is assigned to node location it must be stored in a 1D array of equal -length to the number of nodes in the mesh. ``data[3]`` is at the position: -``(x[3], y[3])``. +length to the number of nodes in the mesh. So for an example data array called +``data``: ``data[3]`` is at the position ``(x[3], y[3])``. Data can also be assigned to higher dimensional elements - **edges**, **faces** or **volumes**. These elements are constructed by connecting nodes together @@ -258,6 +258,10 @@ How UGRID information is stored * | Optional: :attr:`~iris.experimental.ugrid.Mesh.edge_coords`, :attr:`~iris.experimental.ugrid.Mesh.face_coords` | For indicating the 'centres' of the edges/faces. + | **NOTE:** generating a :class:`~iris.experimental.ugrid.MeshCoord` from + a :class:`~iris.experimental.ugrid.Mesh` currently (``Jan 2022``) + requires centre coordinates for the given ``location``; to be rectified + in future. * 1 or more :class:`iris.experimental.ugrid.Connectivity`\s: @@ -318,11 +322,10 @@ to produce a :class:`~iris.coords.Coord` representation of all the :class:`~iris.experimental.ugrid.Mesh`\'s nodes/edges/faces for the given axis. -A :class:`~iris.experimental.ugrid.Mesh` -method is available to create a :class:`~iris.experimental.ugrid.MeshCoord` for +The method :meth:`iris.experimental.ugrid.Mesh.to_MeshCoords` is available to +create a :class:`~iris.experimental.ugrid.MeshCoord` for every axis represented by that :class:`~iris.experimental.ugrid.Mesh`, -requiring only the ``location`` argument: -:meth:`~iris.experimental.ugrid.Mesh.to_MeshCoords`. +given only the ``location`` argument __ CF-UGRID_ \ No newline at end of file From 3c0e5f85bff8e008226dc9d8a88da47b9b6f4db1 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Tue, 25 Jan 2022 18:29:40 +0000 Subject: [PATCH 21/43] UGRID docs review actions from @wjbenfold. --- docs/src/further_topics/ugrid/data_model.rst | 99 ++++++++++++------- .../ugrid/images/data_structured_grid.svg | 2 +- .../ugrid/images/data_ugrid_mesh.svg | 2 +- .../ugrid/images/ugrid_edge_data.svg | 2 +- .../ugrid/images/ugrid_element_centres.svg | 2 +- .../ugrid/images/ugrid_node_independence.svg | 2 +- .../ugrid/images/ugrid_variable_faces.svg | 2 +- .../further_topics/ugrid/partner_packages.rst | 2 +- 8 files changed, 70 insertions(+), 43 deletions(-) diff --git a/docs/src/further_topics/ugrid/data_model.rst b/docs/src/further_topics/ugrid/data_model.rst index 1297964a99..7f132c6a35 100644 --- a/docs/src/further_topics/ugrid/data_model.rst +++ b/docs/src/further_topics/ugrid/data_model.rst @@ -14,8 +14,8 @@ The Mesh Data Model Evolution, not revolution ========================= Mesh support has been designed wherever possible to fit within the existing -Iris model. Meshes concern only the spatial location of data, and can -optionally be limited to just the horizontal location (e.g. X and Y). Other +Iris model. Meshes concern only the spatial geography of data, and can +optionally be limited to just the horizontal geography (e.g. X and Y). Other dimensions such as time or ensemble member (and often vertical levels) retain their familiar structured format. @@ -25,7 +25,7 @@ conventions, which are at the core of Iris' philosophy. What's Different? ================= -The mesh format represents data's geographic location using an **unstructured +The mesh format represents data's geography using an **unstructured mesh**. This has significant pros and cons when compared to a structured grid. .. contents:: @@ -41,8 +41,8 @@ The Detail http://ibm-design-language.eu-de.mybluemix.net/design/language/resources/color-library ) -Structured Grids -~~~~~~~~~~~~~~~~ +Structured Grids (the old world) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Assigning data to locations using a structured grid is essentially an act of matching coordinate arrays to each dimension of the data array. The data can also be represented as an area (instead of a point) by including a bounds array @@ -55,37 +55,64 @@ for each coordinate array. :download:`full size image ` -Unstructured Meshes -~~~~~~~~~~~~~~~~~~~ -The most basic element in a mesh is the 0-dimensional **node**: a single -location in space. Every node in the mesh is defined by indexing the -1-dimensional X and Y (and optionally Z) coordinate arrays (the -``node_coordinates``) - e.g. ``(x[3], y[3])`` gives the position of the fourth -node. Note that this means each node has its own coordinates, independent of -every other node. Since nodes can be anywhere in the space - **unstructured** - -the position in the array has nothing to do with spatial position. - -If data is assigned to node location it must be stored in a 1D array of equal -length to the number of nodes in the mesh. So for an example data array called -``data``: ``data[3]`` is at the position ``(x[3], y[3])``. - -Data can also be assigned to higher dimensional elements - **edges**, **faces** -or **volumes**. These elements are constructed by connecting nodes together -using a 2-dimensional **connectivity** array. One dimension varies over each -element, while the other dimension varies over each node that makes up that -element; the values in the array are the node indices. E.g. we could make 2 -square faces from 6 nodes using this ``face_node_connectivity``: -``[[0, 1, 3, 2], [2, 3, 5, 4]]``. Remember that meshes are **unstructured**, so -there is no significance to the order of the faces in the array. Data assigned -to a higher dimensional location must be stored in a 1D array of equal length -to the number of elements in the mesh, e.g. ``my_data = [0.33, 4.02]`` for our -example. +Unstructured Meshes (the new world) +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +A mesh is made up of different types of **element**: + +.. list-table:: + :widths: 15, 15, 70 + + * - 0D + - ``node`` + - The 'core' of the mesh. A point position in space, constructed from + 2 or 3 coordinates (2D or 3D space). + * - 1D + - ``edge`` + - Constructed by connecting 2 nodes. + * - 2D + - ``face`` + - Constructed by connecting 3 or more nodes. + * - 3D + - ``volume`` + - Constructed by connecting 4 or more nodes (which must each have 3 + coordinates - 3D space). + +Every node in the mesh is defined by indexing the 1-dimensional X and Y (and +optionally Z) coordinate arrays (the ``node_coordinates``) - e.g. +``(x[3], y[3])`` gives the position of the fourth node. Note that this means +each node has its own coordinates, independent of every other node. + +Any higher dimensional element - an edge/face/volume - is described by a +sequence of the indices of the nodes that make up that element. E.g. a +triangular face made from connecting the first, third and fourth nodes: +``[0, 2, 3]``. These 1D sequences combine into a 2D array enumerating **all** +the elements of that type - edge/face/volume - called a **connectivity**. +E.g. we could make a mesh of 4 nodes, with 2 triangles described using this +``face_node_connectivity``: ``[[0, 2, 3], [3, 2, 1]]`` (note the shared nodes). + +.. note:: More on Connectivities: + + * The element type described by a connectivity is known as its + **location**; ``edge`` in ``edge_node_connectivity``. + * According to the UGRID conventions, the nodes in a face should be + listed in "anti-clockwise order from above". + * Connectivities also exist to connect the higher dimensional elements, + e.g. ``face_edge_connectivity``. These are optional conveniences to + speed up certain operations and will not be discussed here. -.. note:: +.. important:: + + **Meshes are unstructured**. Elements are enumerated along a single + **unstructured dimension** represented by either the coordinate or + connectivity arrays detailed above - and an element's position within + its respective array has nothing to do with its spatial position. - Connectivities also exist to connect the higher dimensional elements, - e.g. ``face_edge_connectivity``. These are optional conveniences to - speed up certain operations and will not be discussed here. +A data variable associated with a mesh has a **location** of either ``node``, +``edge``, ``face`` or ``volume``. The data is stored in a 1D array with one +datum per element, matched to its element by matching the datum index with the +coordinate or connectivity index. So for an example data array called ``foo``: +``foo[3]`` would be at position ``(x[3], y[3])`` if it were node-located, or at +``faces[3]`` if it were face-located. .. figure:: images/data_ugrid_mesh.svg :alt: Diagram of how data is represented on an unstructured mesh @@ -107,7 +134,7 @@ elements. Data can be assigned to mesh edge/face/volume 'centres' Mesh Flexibility -~~~~~~~~~~~~~~~~ +++++++++++++++++ Above we have seen how one could replicate data on a structured grid using a mesh instead. But the utility of a mesh is the extra flexibility it offers. Here are the main examples: @@ -145,7 +172,7 @@ What does this mean? -------------------- Meshes can represent much more varied spatial arrangements ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The highly specific way of recording location (geometry) and shape +The highly specific way of recording position (geometry) and shape (topology) allows meshes to represent essentially **any** spatial arrangement of data. There are therefore many new applications that aren't possible using a structured grid, including: diff --git a/docs/src/further_topics/ugrid/images/data_structured_grid.svg b/docs/src/further_topics/ugrid/images/data_structured_grid.svg index 66e8a614c4..e398186d22 100644 --- a/docs/src/further_topics/ugrid/images/data_structured_grid.svg +++ b/docs/src/further_topics/ugrid/images/data_structured_grid.svg @@ -1 +1 @@ -23, 2819,211015255152030xyCoordinate ArraysxyCoordinate Arrays23, 2819, 21xyBounds Arraysderive point locationsassign data using dimensional indices,position in array == relative spatial positionderive area locations & shapesPoint DataArea DataData Array(bounded coordsalways have points too)my_variable \ No newline at end of file +23, 2819,211015255152030xyCoordinate ArraysxyCoordinate Arrays23, 2819, 21xyBounds Arraysderive point locationsassign data using dimensional indices,position in array == relative spatial positionderive area locations & shapesPoint DataArea DataData Array(bounded coordsalways have points too)my_variable \ No newline at end of file diff --git a/docs/src/further_topics/ugrid/images/data_ugrid_mesh.svg b/docs/src/further_topics/ugrid/images/data_ugrid_mesh.svg index f535edcf13..ab7302346b 100644 --- a/docs/src/further_topics/ugrid/images/data_ugrid_mesh.svg +++ b/docs/src/further_topics/ugrid/images/data_ugrid_mesh.svg @@ -1 +1 @@ -5, 7, 8, 14`xy1212`node_coordinates`every node has its own x + y coordinatesderive node locations12Data Array1515xy`node_coordinates`[5][7][8][14]construct faces by connecting nodesderive ‘corner’ node locationsassign data using 1D indexing,position in array unrelated to spatial positionmatch indices with facesmatch indices with nodesNode DataFace Datamy_variable12 ×4`face_node_connectivity`face_nodes \ No newline at end of file +5, 7, 8, 14`xy1212`node_coordinates`every node has its own x + y coordinatesderive node locations1515xy`node_coordinates`[5][7][8][14]construct faces by connecting nodesderive ‘corner’ node locationsassign data using 1D indexing,position in array unrelated to spatial positionmatch indices with facesmatch indices with nodesNode DataFace Data12Data Arraymy_variable12 ×4`face_node_connectivity`face_nodes \ No newline at end of file diff --git a/docs/src/further_topics/ugrid/images/ugrid_edge_data.svg b/docs/src/further_topics/ugrid/images/ugrid_edge_data.svg index 36cf89c28f..374ef57388 100644 --- a/docs/src/further_topics/ugrid/images/ugrid_edge_data.svg +++ b/docs/src/further_topics/ugrid/images/ugrid_edge_data.svg @@ -1 +1 @@ -`edge_node_connectivity`12 ×2 \ No newline at end of file +`edge_node_connectivity`12 ×2 \ No newline at end of file diff --git a/docs/src/further_topics/ugrid/images/ugrid_element_centres.svg b/docs/src/further_topics/ugrid/images/ugrid_element_centres.svg index ef294577e7..13b885d600 100644 --- a/docs/src/further_topics/ugrid/images/ugrid_element_centres.svg +++ b/docs/src/further_topics/ugrid/images/ugrid_element_centres.svg @@ -1 +1 @@ -`face_node_connectivity`xy`node_coordinates`xy`face_coordinates`151512 ×41212 \ No newline at end of file +`face_node_connectivity`xy`node_coordinates`xy`face_coordinates`151512 ×41212`face_coordinates``node_coordinates` \ No newline at end of file diff --git a/docs/src/further_topics/ugrid/images/ugrid_node_independence.svg b/docs/src/further_topics/ugrid/images/ugrid_node_independence.svg index ce6ca5a3a3..8e1d789954 100644 --- a/docs/src/further_topics/ugrid/images/ugrid_node_independence.svg +++ b/docs/src/further_topics/ugrid/images/ugrid_node_independence.svg @@ -1 +1 @@ -` \ No newline at end of file +` \ No newline at end of file diff --git a/docs/src/further_topics/ugrid/images/ugrid_variable_faces.svg b/docs/src/further_topics/ugrid/images/ugrid_variable_faces.svg index 3672975af5..378978abc3 100644 --- a/docs/src/further_topics/ugrid/images/ugrid_variable_faces.svg +++ b/docs/src/further_topics/ugrid/images/ugrid_variable_faces.svg @@ -1 +1 @@ -`face_node_connectivity`12 ×6 \ No newline at end of file +`face_node_connectivity`12 ×6 \ No newline at end of file diff --git a/docs/src/further_topics/ugrid/partner_packages.rst b/docs/src/further_topics/ugrid/partner_packages.rst index 46c07b96f2..e35645684c 100644 --- a/docs/src/further_topics/ugrid/partner_packages.rst +++ b/docs/src/further_topics/ugrid/partner_packages.rst @@ -7,7 +7,7 @@ scientific community, which is why Iris is written in Python. But it is not as computationally strong as other languages, and this is a problem for working with unstructured meshes where computations are higher in volume and complexity (:ref:`see the data model detail `). So there are -operations - which Python can perform acceptably on a structured grids - which +operations - which Python can perform acceptably on structured grids - which need unworkably large time/resource to perform on an unstructured mesh. New approaches are needed... From ea895e2109f5bfe9b7862ea82326235887e7d4c8 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Tue, 25 Jan 2022 18:38:34 +0000 Subject: [PATCH 22/43] Minor UGRID docs corrections. --- docs/src/further_topics/ugrid/data_model.rst | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/src/further_topics/ugrid/data_model.rst b/docs/src/further_topics/ugrid/data_model.rst index 7f132c6a35..6035874d6c 100644 --- a/docs/src/further_topics/ugrid/data_model.rst +++ b/docs/src/further_topics/ugrid/data_model.rst @@ -104,7 +104,7 @@ E.g. we could make a mesh of 4 nodes, with 2 triangles described using this **Meshes are unstructured**. Elements are enumerated along a single **unstructured dimension** represented by either the coordinate or - connectivity arrays detailed above - and an element's position within + connectivity arrays detailed above, and an element's position within its respective array has nothing to do with its spatial position. A data variable associated with a mesh has a **location** of either ``node``, @@ -145,6 +145,7 @@ Here are the main examples: .. figure:: images/ugrid_node_independence.svg :alt: Diagram demonstrating the independence of each mesh node :align: center + :width: 300 Every mesh node is completely independent @@ -154,6 +155,7 @@ Here are the main examples: .. figure:: images/ugrid_variable_faces.svg :alt: Diagram demonstrating mesh faces with variable node counts :align: center + :width: 300 Mesh faces can have different node counts (using masking) @@ -163,6 +165,7 @@ Here are the main examples: .. figure:: images/ugrid_edge_data.svg :alt: Diagram demonstrating data assigned to mesh edges :align: center + :width: 300 Data can be assigned to mesh edges From 0e96826424ca327578b40c22cda8d665859f605e Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Wed, 26 Jan 2022 12:09:58 +0000 Subject: [PATCH 23/43] UGRID docs updates for new Connectivity names. --- docs/src/further_topics/ugrid/operations.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/src/further_topics/ugrid/operations.rst b/docs/src/further_topics/ugrid/operations.rst index 2a0d58fd05..7dc5c0a6b9 100644 --- a/docs/src/further_topics/ugrid/operations.rst +++ b/docs/src/further_topics/ugrid/operations.rst @@ -88,7 +88,7 @@ subsequent example operations on this page. # Create some dead-centre edge coordinates. >>> edge_x, edge_y = [ ... AuxCoord( - ... node_coord.points[edge_node_c.indices_by_src()].mean(axis=1), + ... node_coord.points[edge_node_c.indices_by_location()].mean(axis=1), ... node_coord.standard_name, ... ) ... for node_coord in (node_x, node_y) @@ -133,9 +133,9 @@ Creating a :class:`~iris.cube.Cube` is unchanged; the >>> my_cubelist = CubeList() >>> for conn in (edge_node_c, face_node_c): - ... location = conn.src_location + ... location = conn.location ... mesh_coord_x, mesh_coord_y = my_mesh.to_MeshCoords(location) - ... data_shape = (len(conn.indices_by_src()), len(vertical_levels.points)) + ... data_shape = (len(conn.indices_by_location()), len(vertical_levels.points)) ... data_array = np.arange(np.prod(data_shape)).reshape(data_shape) ... ... my_cubelist.append( From 7a27b3f81cfda1f4acfd396681611452918523e9 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Wed, 26 Jan 2022 16:04:44 +0000 Subject: [PATCH 24/43] More example UGRID operations. --- docs/src/further_topics/ugrid/operations.rst | 315 +++++++++++++++++- .../further_topics/ugrid/partner_packages.rst | 4 + 2 files changed, 316 insertions(+), 3 deletions(-) diff --git a/docs/src/further_topics/ugrid/operations.rst b/docs/src/further_topics/ugrid/operations.rst index 7dc5c0a6b9..2e91000f1d 100644 --- a/docs/src/further_topics/ugrid/operations.rst +++ b/docs/src/further_topics/ugrid/operations.rst @@ -400,10 +400,148 @@ Regional Extraction .. rubric:: |tagline: regional extraction| -.. todo: populate! +As described in :doc:`data_model`, indexing for a range along a +:class:`~iris.cube.Cube`\'s :meth:`~iris.cube.Cube.mesh_dim` will not provide +a contiguous region, since **position on the unstructured dimension is +unrelated to spatial position**. This means that subsetted +:class:`~iris.experimental.ugrid.MeshCoord`\s cannot be reliably interpreted +as intended, and subsetting a :class:`~iris.experimental.ugrid.MeshCoord` is +therefore set to return an :class:`~iris.coords.AuxCoord` instead - breaking +the link between :class:`~iris.cube.Cube` and +:class:`~iris.experimental.ugrid.Mesh`: + +.. dropdown:: :opticon:`code` + + .. doctest:: ugrid_operations + + >>> edge_cube = my_cubelist.extract_cube("edge_data") + >>> print(edge_cube) + edge_data / (K) (-- : 6; height: 3) + Dimension coordinates: + height - x + Mesh coordinates: + latitude x - + longitude x - + Attributes: + Conventions CF-1.7 + + # Sub-setted MeshCoords have become AuxCoords. + >>> print(edge_cube[:-1]) + edge_data / (K) (-- : 5; height: 3) + Dimension coordinates: + height - x + Auxiliary coordinates: + latitude x - + longitude x - + Attributes: + Conventions CF-1.7 + +Extracting a region therefore requires extra steps - to determine the spatial +position of the data points before they can be analysed as inside/outside the +selected region. The recommended way to do this is using tools provided by +:ref:`ugrid geovista`, which is optimised for performant mesh analysis: .. - Highlight the uselessness of indexing. + Not using doctest here as want to keep GeoVista as optional dependency. + +.. dropdown:: :opticon:`code` + + .. code-block:: python + + >>> from geovista import Transform + >>> from geovista.geodesic import BBox + >>> from iris import load_cube + >>> from iris.experimental.ugrid import Mesh, PARSE_UGRID_ON_LOAD + + # Need a larger dataset to demonstrate this operation. + # You could also download this file from github.com/SciTools/iris-test-data. + >>> from iris.tests import get_data_path + >>> file_path = get_data_path( + ... [ + ... "NetCDF", + ... "unstructured_grid", + ... "lfric_ngvat_2D_72t_face_half_levels_main_conv_rain.nc", + ... ] + ... ) + + >>> with PARSE_UGRID_ON_LOAD.context(): + ... global_cube = load_cube(file_path, "conv_rain") + >>> print(global_cube) + surface_convective_rainfall_rate / (kg m-2 s-1) (-- : 72; -- : 864) + Mesh coordinates: + latitude - x + longitude - x + Auxiliary coordinates: + time x - + Cell methods: + point time + Attributes: + Conventions UGRID + description Created by xios + interval_operation 300 s + interval_write 300 s + name lfric_ngvat_2D_72t_face_half_levels_main_conv_rain + online_operation instant + timeStamp 2020-Oct-18 21:18:35 GMT + title Created by xios + uuid b3dc0fb4-9828-4663-a5ac-2a5763280159 + + # Convert the Mesh to a GeoVista PolyData object. + >>> lons, lats = global_cube.mesh.node_coords + >>> face_node = global_cube.mesh.face_node_connectivity + >>> indices = face_node.indices_by_location() + >>> global_polydata = Transform.from_unstructured( + ... lons.points, lats.points, indices, start_index=face_node.start_index + ... ) + + # Define a region of 4 corners connected by great circles. + # Specialised sub-classes of BBox are also available e.g. panel/wedge. + >>> region = BBox(lons=[0, 70, 70, 0], lats=[-25, -25, 45, 45]) + # 'Apply' the region to the PolyData object. + >>> region_polydata = region.enclosed(global_polydata, preference="center") + # Get the remaining face indices, to use for indexing the Cube. + >>> indices = region_polydata["vtkOriginalCellIds"] + + >>> print(type(indices)) + + # 101 is smaller than the original 864. + >>> print(len(indices)) + 101 + >>> print(indices[:10]) + [ 6 7 8 9 10 11 18 19 20 21] + + # Use the face indices to subset the global cube. + >>> region_cube = global_cube[:, indices] + + # In this case we **know** the indices correspond to a contiguous + # region, so we will convert the sub-setted Cube back into a + # Cube-with-Mesh. + >>> new_mesh = Mesh.from_coords(*region_cube.coords(dimensions=1)) + >>> new_mesh_coords = new_mesh.to_MeshCoords(global_cube.location) + >>> for coord in new_mesh_coords: + ... region_cube.remove_coord(coord.name()) + ... region_cube.add_aux_coord(coord, 1) + + # A Mesh-Cube with a subset (101) of the original 864 faces. + >>> print(region_cube) + surface_convective_rainfall_rate / (kg m-2 s-1) (-- : 72; -- : 101) + Mesh coordinates: + latitude - x + longitude - x + Auxiliary coordinates: + time x - + Cell methods: + point time + Attributes: + Conventions UGRID + description Created by xios + interval_operation 300 s + interval_write 300 s + name lfric_ngvat_2D_72t_face_half_levels_main_conv_rain + online_operation instant + timeStamp 2020-Oct-18 21:18:35 GMT + title Created by xios + uuid b3dc0fb4-9828-4663-a5ac-2a5763280159 Regridding ---------- @@ -411,7 +549,178 @@ Regridding .. rubric:: |tagline: regridding| -.. todo: populate! +Regridding to or from a mesh requires different logic than Iris' existing +regridders, which are designed for structured grids. For this we recommend +ESMF's powerful regridding tools, which integrate with Iris' mesh data model +via the :ref:`ugrid iris-esmf-regrid` package. + +.. todo: inter-sphinx links when available. + +Regridding is achieved via the +:class:`esmf_regrid.experimental.unstructured_scheme.MeshToGridESMFRegridder` +and +:class:`~esmf_regrid.experimental.unstructured_scheme.GridToMeshESMFRegridder` +classes. Regridding from a source :class:`~iris.cube.Cube` to a target +:class:`~iris.cube.Cube` involves initialising and then calling one of these +classes. Initialising is done by passing in the source and target +:class:`~iris.cube.Cube` as arguments. The regridder is then called by passing +the source :class:`~iris.cube.Cube` as an argument. We can demonstrate this +with the +:class:`~esmf_regrid.experimental.unstructured_scheme.MeshToGridESMFRegridder`: + +.. + Not using doctest here as want to keep iris-esmf-regrid as optional dependency. + +.. dropdown:: :opticon:`code` + + .. code-block:: python + + >>> from esmf_regrid.experimental.unstructured_scheme import MeshToGridESMFRegridder + >>> from iris import load, load_cube + >>> from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD + + # You could also download these files from github.com/SciTools/iris-test-data. + >>> from iris.tests import get_data_path + >>> mesh_file = get_data_path( + ... ["NetCDF", "unstructured_grid", "lfric_surface_mean.nc"] + ... ) + >>> grid_file = get_data_path( + ... ["NetCDF", "regrid", "regrid_template_global_latlon.nc"] + ... ) + + # Load a list of cubes defined on the same Mesh. + >>> with PARSE_UGRID_ON_LOAD.context(): + ... mesh_cubes = load(mesh_file) + + # Extract a specific cube. + >>> mesh_cube1 = mesh_cubes.extract_cube("sea_surface_temperature") + >>> print(mesh_cube1) + sea_surface_temperature / (K) (-- : 1; -- : 13824) + Mesh coordinates: + latitude - x + longitude - x + Auxiliary coordinates: + time x - + Cell methods: + mean time (300 s) + mean time_counter + Attributes: + Conventions UGRID + description Created by xios + interval_operation 300 s + interval_write 1 d + name lfric_surface + online_operation average + timeStamp 2020-Feb-07 16:23:14 GMT + title Created by xios + uuid 489bcef5-3d1c-4529-be42-4ab5f8c8497b + + # Load the target grid. + >>> sample_grid = load_cube(grid_file) + >>> print(sample_grid) + sample_grid / (unknown) (latitude: 180; longitude: 360) + Dimension coordinates: + latitude x - + longitude - x + Attributes: + Conventions CF-1.7 + + # Initialise the regridder. + >>> rg = MeshToGridESMFRegridder(mesh_cube1, sample_grid) + + # Regrid the mesh cube cube. + >>> result1 = rg(mesh_cube1) + >>> print(result1) + sea_surface_temperature / (K) (-- : 1; latitude: 180; longitude: 360) + Dimension coordinates: + latitude - x - + longitude - - x + Auxiliary coordinates: + time x - - + Cell methods: + mean time (300 s) + mean time_counter + Attributes: + Conventions UGRID + description Created by xios + interval_operation 300 s + interval_write 1 d + name lfric_surface + online_operation average + timeStamp 2020-Feb-07 16:23:14 GMT + title Created by xios + uuid 489bcef5-3d1c-4529-be42-4ab5f8c8497b + +.. note:: + + **All** :class:`~iris.cube.Cube` :attr:`~iris.cube.Cube.attributes` are + retained when regridding, so watch out for any attributes that reference + the format (there are several in these examples) - you may want to manually + remove them to avoid later confusion. + +The initialisation process is computationally expensive so we use caching to +improve performance. Once a regridder has been initialised, it can be used on +any :class:`~iris.cube.Cube` which has been defined on the same +:class:`~iris.experimental.ugrid.Mesh` (or on the same **grid** in the case of +:class:`~esmf_regrid.experimental.unstructured_scheme.GridToMeshESMFRegridder`). +Since calling a regridder is usually a lot faster than initialising, reusing +regridders can save a lot of time. We can demonstrate the reuse of the +previously initialised regridder: + +.. dropdown:: :opticon:`code` + + .. code-block:: python + + # Extract a different cube defined on te same Mesh. + >>> mesh_cube2 = mesh_cubes.extract_cube("precipitation_flux") + >>> print(mesh_cube2) + precipitation_flux / (kg m-2 s-1) (-- : 1; -- : 13824) + Mesh coordinates: + latitude - x + longitude - x + Auxiliary coordinates: + time x - + Cell methods: + mean time (300 s) + mean time_counter + Attributes: + Conventions UGRID + description Created by xios + interval_operation 300 s + interval_write 1 d + name lfric_surface + online_operation average + timeStamp 2020-Feb-07 16:23:14 GMT + title Created by xios + uuid 489bcef5-3d1c-4529-be42-4ab5f8c8497b + + # Regrid the new mesh cube using the same regridder. + >>> result2 = rg(mesh_cube2) + >>> print(result2) + precipitation_flux / (kg m-2 s-1) (-- : 1; latitude: 180; longitude: 360) + Dimension coordinates: + latitude - x - + longitude - - x + Auxiliary coordinates: + time x - - + Cell methods: + mean time (300 s) + mean time_counter + Attributes: + Conventions UGRID + description Created by xios + interval_operation 300 s + interval_write 1 d + name lfric_surface + online_operation average + timeStamp 2020-Feb-07 16:23:14 GMT + title Created by xios + uuid 489bcef5-3d1c-4529-be42-4ab5f8c8497b + +Support also exists for saving and loading previously initialised regridders - +:func:`esmf_regrid.experimental.io.save_regridder` and +:func:`~esmf_regrid.experimental.io.load_regridder` - so that they can be +re-used by future scripts. Equality -------- diff --git a/docs/src/further_topics/ugrid/partner_packages.rst b/docs/src/further_topics/ugrid/partner_packages.rst index e35645684c..85e5418bcc 100644 --- a/docs/src/further_topics/ugrid/partner_packages.rst +++ b/docs/src/further_topics/ugrid/partner_packages.rst @@ -43,6 +43,8 @@ Specifics of what operations would require their installation can be found in: 'under construction'. +.. _`ugrid geovista`: + `GeoVista`_ =========== .. image:: images/geovistalogo.svg @@ -67,6 +69,8 @@ Applications * Extract a specific region from a mesh. * Combine multiple meshes into one. +.. _`ugrid iris-esmf-regrid`: + `iris-esmf-regrid`_ =================== .. image:: images/iris-esmf-regrid.svg From aee2be5e819f40caabcf0e09a1cad2f98ce520c6 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Thu, 27 Jan 2022 10:13:18 +0000 Subject: [PATCH 25/43] UGRID region extraction example tweaks. --- docs/src/further_topics/ugrid/operations.rst | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/docs/src/further_topics/ugrid/operations.rst b/docs/src/further_topics/ugrid/operations.rst index 2e91000f1d..691aae6a8e 100644 --- a/docs/src/further_topics/ugrid/operations.rst +++ b/docs/src/further_topics/ugrid/operations.rst @@ -20,8 +20,8 @@ Working with Mesh Data - |tagline: load| * - `Plotting`_ - |tagline: plotting| - * - `Regional Extraction`_ - - |tagline: regional extraction| + * - `Region Extraction`_ + - |tagline: region extraction| * - `Regridding`_ - |tagline: regridding| * - `Equality`_ @@ -394,11 +394,11 @@ Plotting .. todo: populate! -Regional Extraction -------------------- -.. |tagline: regional extraction| replace:: |different| - use GeoVista for mesh analysis +Region Extraction +----------------- +.. |tagline: region extraction| replace:: |different| - use GeoVista for mesh analysis -.. rubric:: |tagline: regional extraction| +.. rubric:: |tagline: region extraction| As described in :doc:`data_model`, indexing for a range along a :class:`~iris.cube.Cube`\'s :meth:`~iris.cube.Cube.mesh_dim` will not provide @@ -422,8 +422,6 @@ the link between :class:`~iris.cube.Cube` and Mesh coordinates: latitude x - longitude x - - Attributes: - Conventions CF-1.7 # Sub-setted MeshCoords have become AuxCoords. >>> print(edge_cube[:-1]) @@ -433,8 +431,6 @@ the link between :class:`~iris.cube.Cube` and Auxiliary coordinates: latitude x - longitude x - - Attributes: - Conventions CF-1.7 Extracting a region therefore requires extra steps - to determine the spatial position of the data points before they can be analysed as inside/outside the From 3692c1cfa51f15181437b22088f3f223d0037a93 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Thu, 27 Jan 2022 14:30:49 +0000 Subject: [PATCH 26/43] UGRID docs review actions from @lbdreyer. --- docs/src/further_topics/ugrid/data_model.rst | 293 +++++++++++++++--- .../ugrid/images/ugrid_node_independence.svg | 2 +- docs/src/further_topics/ugrid/operations.rst | 2 +- 3 files changed, 251 insertions(+), 46 deletions(-) diff --git a/docs/src/further_topics/ugrid/data_model.rst b/docs/src/further_topics/ugrid/data_model.rst index 6035874d6c..733f3b33b3 100644 --- a/docs/src/further_topics/ugrid/data_model.rst +++ b/docs/src/further_topics/ugrid/data_model.rst @@ -46,14 +46,26 @@ Structured Grids (the old world) Assigning data to locations using a structured grid is essentially an act of matching coordinate arrays to each dimension of the data array. The data can also be represented as an area (instead of a point) by including a bounds array -for each coordinate array. - -.. figure:: images/data_structured_grid.svg - :alt: Diagram of how data is represented on a structured grid - - Data on a structured grid - - :download:`full size image ` +for each coordinate array. :numref:`data_structured_grid` visualises an +example. + +.. _data_structured_grid: +.. figure:: images/data_structured_grid.svg + :alt: Diagram of how data is represented on a structured grid + :align: right + :width: 1280 + + Data on a structured grid. + + 1D coordinate arrays (pink circles) are combined to construct a structured + grid of points (pink crosses). 2D bounds arrays (blue circles) can also be + used to describe the 1D boundaries (blue lines) at either side of each + rank of points; each point therefore having four bounds (x+y, upper+lower), + together describing a quadrilateral area around that point. Data from the + 2D data array (orange circles) can be assigned to these point locations + (orange diamonds) or area locations (orange quads) by matching the relative + positions in the data array to the relative spatial positions - see the + black outlined shapes as examples of this in action. Unstructured Meshes (the new world) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -112,26 +124,49 @@ A data variable associated with a mesh has a **location** of either ``node``, datum per element, matched to its element by matching the datum index with the coordinate or connectivity index. So for an example data array called ``foo``: ``foo[3]`` would be at position ``(x[3], y[3])`` if it were node-located, or at -``faces[3]`` if it were face-located. - -.. figure:: images/data_ugrid_mesh.svg - :alt: Diagram of how data is represented on an unstructured mesh - - Data on an Unstructured Mesh - - :download:`full size image ` +``faces[3]`` if it were face-located. :numref:`data_ugrid_mesh` visualises an +example of what is described above. + +.. _data_ugrid_mesh: +.. figure:: images/data_ugrid_mesh.svg + :alt: Diagram of how data is represented on an unstructured mesh + :align: right + :width: 1280 + + Data on an unstructured mesh + + 1D coordinate arrays (pink circles) describe node positions in space (pink + crosses). A 2D connectivity array (blue circles) describes faces by + connecting four nodes - by referencing their indices - into a face outline + (blue outlines on the map). Data from the 1D data array (orange circles) + can be assigned to these node locations (orange diamonds) or face locations + (orange quads) by matching the indices in the data array to the indices in + the coordinate arrays (for nodes) or connectivity array (for faces). See + the black outlined shapes as examples of index matching in action, and the + black stippled shapes to demonstrate that relative array position confers + no relative spatial information. ---- The mesh model also supports edges/faces/volumes having associated 'centre' coordinates - to allow point data to be assigned to these elements. 'Centre' is just a convenience term - the points can exist anywhere within their respective -elements. +elements. See :numref:`ugrid_element_centres` for a visualised example. -.. figure:: images/ugrid_element_centres.svg - :alt: Diagram demonstrating mesh face-centred data. +.. _ugrid_element_centres: +.. figure:: images/ugrid_element_centres.svg + :alt: Diagram demonstrating mesh face-centred data. + :align: right + :width: 1280 - Data can be assigned to mesh edge/face/volume 'centres' + Data can be assigned to mesh edge/face/volume 'centres' + + 1D *node* coordinate arrays (pink circles) describe node positions in + space (pink crosses). A 2D connectivity array (blue circles) describes + faces by connecting four nodes into a face outline (blue outlines on the + map). Further 1D *face* coordinate arrays (pink circles) describe a + 'centre' point position (pink stars) for each face enumerated in the + connectivity array. Mesh Flexibility ++++++++++++++++ @@ -139,35 +174,56 @@ Above we have seen how one could replicate data on a structured grid using a mesh instead. But the utility of a mesh is the extra flexibility it offers. Here are the main examples: -* Every node is completely independent - every one can have unique X and - Y (and Z) coordinate values. +Every node is completely independent - every one can have unique X andY (and Z) coordinate values. See :numref:`ugrid_node_independence`. + +.. _ugrid_node_independence: +.. figure:: images/ugrid_node_independence.svg + :alt: Diagram demonstrating the independence of each mesh node + :align: right + :width: 300 + + Every mesh node is completely independent -.. figure:: images/ugrid_node_independence.svg - :alt: Diagram demonstrating the independence of each mesh node - :align: center - :width: 300 + The same array shape and structure used to describe the node positions + (pink crosses) in a regular grid (left-hand maps) is equally able to + describe **any** position for these nodes (e.g. the right-hand maps), + simply by changing the array values. The quadrilateral faces (blue + outlines) can therefore be given any quadrilateral shape by re-positioning + their constituent nodes. - Every mesh node is completely independent +Faces and volumes can have variable node counts, i.e. different numbers of +sides. This is achieved by masking the unused 'slots' in the connectivity +array. See :numref:`ugrid_variable_faces`. -* Faces and volumes can have variable node counts, i.e. different numbers of - sides. This is achieved by masking the unused 'slots' in the connectivity array. +.. _ugrid_variable_faces: +.. figure:: images/ugrid_variable_faces.svg + :alt: Diagram demonstrating mesh faces with variable node counts + :align: right + :width: 300 -.. figure:: images/ugrid_variable_faces.svg - :alt: Diagram demonstrating mesh faces with variable node counts - :align: center - :width: 300 + Mesh faces can have different node counts (using masking) - Mesh faces can have different node counts (using masking) + The 2D connectivity array (blue circles) describes faces by connecting + nodes (pink crosses) to make up a face (blue outlines). The faces can use + different numbers of nodes by shaping the connectivity array to accommodate + the face with the most nodes, then masking unused node 'slots' + (black circles) for faces with fewer nodes than the maximum. -* Data can be assigned to lines (edges) just as easily as points (nodes) or - areas (faces). +Data can be assigned to lines (edges) just as easily as points (nodes) or +areas (faces). See :numref:`ugrid_edge_data`. -.. figure:: images/ugrid_edge_data.svg - :alt: Diagram demonstrating data assigned to mesh edges - :align: center - :width: 300 +.. _ugrid_edge_data: +.. figure:: images/ugrid_edge_data.svg + :alt: Diagram demonstrating data assigned to mesh edges + :align: right + :width: 300 - Data can be assigned to mesh edges + Data can be assigned to mesh edges + + The 2D connectivity array (blue circles) describes edges by connecting 2 + nodes (pink crosses) to make up an edge (blue lines). Data can be assigned + to the edges (orange lines) by matching the indices of the 1D data array + (not shown) to the indices in the connectivity array. .. _ugrid implications: @@ -221,7 +277,7 @@ Indexing a mesh data array cannot be used for: This is because - unlike with a structured data array - relative position in a mesh's 1-dimensional data arrays has no relation to relative position in space. We must instead perform specialised operations using the information in -the connectivities present, or by translating the mesh into a format designed +the mesh's connectivities, or by translating the mesh into a format designed for mesh analysis such as VTK. Such calculations can still be optimised to avoid them slowing workflows, but @@ -269,7 +325,93 @@ This :class:`~iris.cube.Cube`\'s unstructured dimension has multiple attached ``x``/``y``), which can be used to infer the points and bounds of any index on the :class:`~iris.cube.Cube`\'s unstructured dimension. -.. todo: Cube printout +.. testsetup:: ugrid_summaries + + import numpy as np + + from iris.coords import AuxCoord, DimCoord + from iris.cube import Cube, CubeList + from iris.experimental.ugrid import Connectivity, Mesh + + node_x = AuxCoord( + points=[3.0, 3.0, 0.0, 0.0, 0.0], + standard_name="longitude", + units="degrees_east", + ) + node_y = AuxCoord( + points=[0.0, 5.0, 0.0, 5.0, 8.0], + standard_name="latitude", + units="degrees_north", + ) + + edge_node_c = Connectivity( + indices=[[0, 1], [0, 2], [1, 3], [1, 4], [2, 3], [3, 4]], + cf_role="edge_node_connectivity", + ) + + face_indices = np.ma.masked_equal([[0, 1, 3, 2], [1, 4, 3, 999]], 999) + face_node_c = Connectivity( + indices=face_indices, cf_role="face_node_connectivity" + ) + + def centre_coords(conn): + indexing = np.ma.filled(conn.indices, 0) + x, y = [ + AuxCoord( + node_coord.points[indexing].mean(axis=conn.connected_axis), + node_coord.standard_name, + units=node_coord.units, + ) + for node_coord in (node_x, node_y) + ] + return [(x, "x"), (y, "y")] + + my_mesh = Mesh( + long_name="my_mesh", + topology_dimension=2, + node_coords_and_axes=[(node_x, "x"), (node_y, "y")], + connectivities=[edge_node_c, face_node_c], + edge_coords_and_axes=centre_coords(edge_node_c), + face_coords_and_axes=centre_coords(face_node_c), + ) + + vertical_levels = DimCoord([0, 1, 2], "height") + + def location_cube(conn): + location = conn.location + mesh_coord_x, mesh_coord_y = my_mesh.to_MeshCoords(location) + data_shape = (conn.shape[conn.location_axis], len(vertical_levels.points)) + data_array = np.arange(np.prod(data_shape)).reshape(data_shape) + + return Cube( + data=data_array, + long_name=f"{location}_data", + units="K", + dim_coords_and_dims=[(vertical_levels, 1)], + aux_coords_and_dims=[(mesh_coord_x, 0), (mesh_coord_y, 0)], + ) + + edge_cube = location_cube(edge_node_c) + face_cube = location_cube(face_node_c) + +.. doctest:: ugrid_summaries + + >>> print(edge_cube) + edge_data / (K) (-- : 6; height: 3) + Dimension coordinates: + height - x + Mesh coordinates: + latitude x - + longitude x - + + >>> print(edge_cube.location) + edge + + >>> print(edge_cube.mesh_dim()) + 0 + + >>> print(edge_cube.mesh.summary(shorten=True)) + The Detail ---------- @@ -281,6 +423,12 @@ How UGRID information is stored | Contains all information about the mesh. | Includes: + * | :attr:`~iris.experimental.ugrid.Mesh.topology_dimension` + | The maximum dimensionality of shape (1D=edge, 2D=face) supported + by this :class:`~iris.experimental.ugrid.Mesh`. Determines which + :class:`~iris.experimental.ugrid.Connectivity`\s are required/optional + (see below). + * 1-3 collections of :class:`iris.coords.AuxCoord`\s: * | **Required**: :attr:`~iris.experimental.ugrid.Mesh.node_coords` @@ -305,7 +453,29 @@ How UGRID information is stored :attr:`iris.experimental.ugrid.mesh.Connectivity.UGRID_CF_ROLES` for the full list of types. -.. todo: MeshCoord printout? +.. doctest:: ugrid_summaries + + >>> print(edge_cube.mesh) + Mesh : 'my_mesh' + topology_dimension: 2 + node + node_dimension: 'Mesh2d_node' + node coordinates + + + edge + edge_dimension: 'Mesh2d_edge' + edge_node_connectivity: + edge coordinates + + + face + face_dimension: 'Mesh2d_face' + face_node_connectivity: + face coordinates + + + long_name: 'my_mesh' * | :class:`iris.experimental.ugrid.MeshCoord` | Described in detail in `MeshCoords`_. @@ -357,5 +527,40 @@ create a :class:`~iris.experimental.ugrid.MeshCoord` for every axis represented by that :class:`~iris.experimental.ugrid.Mesh`, given only the ``location`` argument +.. doctest:: ugrid_summaries + + >>> for coord in edge_cube.coords(mesh_coords=True): + ... print(coord) + MeshCoord : latitude / (degrees_north) + mesh: + location: 'edge' + points: [2.5, 0. , 5. , 6.5, 2.5, 6.5] + bounds: [ + [0., 5.], + [0., 0.], + [5., 5.], + [5., 8.], + [0., 5.], + [5., 8.]] + shape: (6,) bounds(6, 2) + dtype: float64 + standard_name: 'latitude' + axis: 'y' + MeshCoord : longitude / (degrees_east) + mesh: + location: 'edge' + points: [3. , 1.5, 1.5, 1.5, 0. , 0. ] + bounds: [ + [3., 3.], + [3., 0.], + [3., 0.], + [3., 0.], + [0., 0.], + [0., 0.]] + shape: (6,) bounds(6, 2) + dtype: float64 + standard_name: 'longitude' + axis: 'x' + __ CF-UGRID_ \ No newline at end of file diff --git a/docs/src/further_topics/ugrid/images/ugrid_node_independence.svg b/docs/src/further_topics/ugrid/images/ugrid_node_independence.svg index 8e1d789954..ba72c42ffa 100644 --- a/docs/src/further_topics/ugrid/images/ugrid_node_independence.svg +++ b/docs/src/further_topics/ugrid/images/ugrid_node_independence.svg @@ -1 +1 @@ -` \ No newline at end of file +` \ No newline at end of file diff --git a/docs/src/further_topics/ugrid/operations.rst b/docs/src/further_topics/ugrid/operations.rst index 691aae6a8e..f607f0470f 100644 --- a/docs/src/further_topics/ugrid/operations.rst +++ b/docs/src/further_topics/ugrid/operations.rst @@ -94,7 +94,7 @@ subsequent example operations on this page. ... for node_coord in (node_x, node_y) ... ] - >>> face_indices = np.ma.masked_where(999, [[0, 1, 3, 2], [1, 4, 3, 999]]) + >>> face_indices = np.ma.masked_equal([[0, 1, 3, 2], [1, 4, 3, 999]], 999) >>> face_node_c = Connectivity( ... indices=face_indices, cf_role="face_node_connectivity" ... ) From a31546293bde29313aa7d24dd647ac27476c6604 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Thu, 27 Jan 2022 15:12:37 +0000 Subject: [PATCH 27/43] Second round UGRID docs review actions from @wjbenfold. --- docs/src/further_topics/ugrid/data_model.rst | 8 +++---- docs/src/further_topics/ugrid/operations.rst | 2 +- .../further_topics/ugrid/partner_packages.rst | 22 +++++++++---------- docs/src/whatsnew/latest.rst | 14 +++++++----- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/docs/src/further_topics/ugrid/data_model.rst b/docs/src/further_topics/ugrid/data_model.rst index 733f3b33b3..630b45958f 100644 --- a/docs/src/further_topics/ugrid/data_model.rst +++ b/docs/src/further_topics/ugrid/data_model.rst @@ -114,10 +114,10 @@ E.g. we could make a mesh of 4 nodes, with 2 triangles described using this .. important:: - **Meshes are unstructured**. Elements are enumerated along a single - **unstructured dimension** represented by either the coordinate or - connectivity arrays detailed above, and an element's position within - its respective array has nothing to do with its spatial position. + **Meshes are unstructured**. The mesh elements - represented in the + coordinate and connectivity arrays detailed above - are enumerated + along a single **unstructured dimension**. An element's position along + this dimension has nothing to do with its spatial position. A data variable associated with a mesh has a **location** of either ``node``, ``edge``, ``face`` or ``volume``. The data is stored in a 1D array with one diff --git a/docs/src/further_topics/ugrid/operations.rst b/docs/src/further_topics/ugrid/operations.rst index f607f0470f..db1de16d75 100644 --- a/docs/src/further_topics/ugrid/operations.rst +++ b/docs/src/further_topics/ugrid/operations.rst @@ -1,7 +1,7 @@ .. _ugrid operations: Working with Mesh Data -*********************** +********************** .. note:: Several of the operations below rely on the optional dependencies mentioned in :doc:`partner_packages`. diff --git a/docs/src/further_topics/ugrid/partner_packages.rst b/docs/src/further_topics/ugrid/partner_packages.rst index 85e5418bcc..4fe7ae62f1 100644 --- a/docs/src/further_topics/ugrid/partner_packages.rst +++ b/docs/src/further_topics/ugrid/partner_packages.rst @@ -3,18 +3,16 @@ Iris' Mesh Partner Packages **************************** Python is an easy to use language and has formed a very strong collaborative -scientific community, which is why Iris is written in Python. But it is not as -computationally strong as other languages, and this is a problem for working -with unstructured meshes where computations are higher in volume and complexity -(:ref:`see the data model detail `). So there are -operations - which Python can perform acceptably on structured grids - which -need unworkably large time/resource to perform on an unstructured mesh. New -approaches are needed... - -Python packages already exist that enable the use of powerful mesh analysis -tools originally written in faster languages such as C. And the Iris team are -working on wrapper solutions to 'bridge the gap' between these packages and -Iris. +scientific community, which is why Iris is written in Python. *Performant* +Python relies on calls down to C, which is ideal for structured grid work since +they can be directly represented as NumPy arrays. This is more difficult when +working with unstructured meshes where extra steps are needed to determine data +position (:ref:`see the data model detail `), and we need +to find ways of again passing the operations down to more optimised languages. + +The Iris team are therefore developing 'wrapper' packages, which make it quick +and easy to analyse Iris mesh data via some popular Python packages that use +powerful tools under the hood, working in C and other languages. These solutions have been placed in their own 'partner packages' for several reasons: diff --git a/docs/src/whatsnew/latest.rst b/docs/src/whatsnew/latest.rst index feac113c13..6ba122e4d7 100644 --- a/docs/src/whatsnew/latest.rst +++ b/docs/src/whatsnew/latest.rst @@ -16,8 +16,10 @@ This document explains the changes made to Iris for this release The highlights for this minor release of Iris include: - * We've added experimental support for `CF-UGRID`_ meshes which can now be loaded - and attached to a cube. + * We've added experimental support for + :ref:`Meshes `, which can now be loaded and + attached to a cube. Mesh support is based on the based on `CF-UGRID`_ + model. * We've also dropped support for ``Python 3.7``. And finally, get in touch with us on `GitHub`_ if you have any issues or @@ -37,7 +39,7 @@ This document explains the changes made to Iris for this release =========== #. `@bjlittle`_, `@pp-mo`_, `@trexfeathers`_ and `@stephenworsley`_ added - support for unstructured meshes, as described by `CF-UGRID`_. This involved + support for :ref:`unstructured meshes `. This involved adding a data model (:pull:`3968`, :pull:`4014`, :pull:`4027`, :pull:`4036`, :pull:`4053`, :pull:`4439`) and API (:pull:`4063`, :pull:`4064`), and supporting representation (:pull:`4033`, :pull:`4054`) of data on meshes. @@ -60,8 +62,8 @@ This document explains the changes made to Iris for this release returned with a :class:`~iris.experimental.ugrid.mesh.Mesh` attached. (:pull:`4058`). -#. `@pp-mo`_ added support to save cubes with meshes to netcdf files, using the - `CF-UGRID`_ conventions. +#. `@pp-mo`_ added support to save cubes with :ref:`meshes ` to netcdf + files, using the `CF-UGRID`_ conventions. The existing :meth:`iris.save` function now does this, when saving cubes with meshes. A routine :meth:`iris.experimental.ugrid.save.save_mesh` allows saving :class:`~iris.experimental.ugrid.mesh.Mesh` objects to netcdf *without* any associated data @@ -82,7 +84,7 @@ This document explains the changes made to Iris for this release :class:`~iris.coords.AuxCoord` :attr:`~iris.coords.AuxCoord.points` and :class:`~iris.experimental.ugrid.mesh.Connectivity` :attr:`~iris.experimental.ugrid.mesh.Connectivity.indices` under the - `CF-UGRID`_ model. (:pull:`4375`) + :ref:`mesh model `. (:pull:`4375`) #. `@bsherratt`_ added a `threshold` parameter to :meth:`~iris.cube.Cube.intersection` (:pull:`4363`) From 20113ca5305a99af4e0e3e3ce76d83729dfe9705 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Thu, 27 Jan 2022 15:22:59 +0000 Subject: [PATCH 28/43] UGRID docs review action from @stephenworsley. --- docs/src/further_topics/ugrid/partner_packages.rst | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/src/further_topics/ugrid/partner_packages.rst b/docs/src/further_topics/ugrid/partner_packages.rst index 4fe7ae62f1..9bffc4962d 100644 --- a/docs/src/further_topics/ugrid/partner_packages.rst +++ b/docs/src/further_topics/ugrid/partner_packages.rst @@ -88,8 +88,11 @@ Applications ------------ * Regrid structured to unstructured. * Regrid unstructured to structured. -* Regrid while maintaining data laziness. -* Save a prepared regridder for re-use in subsequent runs. +* Regrid with dask integration, computing in parallel and maintaining data + laziness. +* | Save a prepared regridder for re-use in subsequent runs. + | Regridders can even be re-used on sources with different masks - a + significant efficiency gain. .. _GeoVista: https://github.com/bjlittle/geovista .. _PyVista: https://docs.pyvista.org/index.html From ef47b6b7d0aad7ec7e5b28ea5375f1cfae9db106 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Thu, 27 Jan 2022 15:29:16 +0000 Subject: [PATCH 29/43] Add UGRID Operations Summary subheading. --- docs/src/further_topics/ugrid/operations.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/src/further_topics/ugrid/operations.rst b/docs/src/further_topics/ugrid/operations.rst index db1de16d75..55c695b651 100644 --- a/docs/src/further_topics/ugrid/operations.rst +++ b/docs/src/further_topics/ugrid/operations.rst @@ -6,6 +6,8 @@ Working with Mesh Data .. note:: Several of the operations below rely on the optional dependencies mentioned in :doc:`partner_packages`. +Operations Summary +------------------ .. list-table:: :align: left :widths: 35, 75 From 4a996af40df7b2611780ebaaa3242fcc26f9373e Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Thu, 27 Jan 2022 15:38:11 +0000 Subject: [PATCH 30/43] Mention the unstructured dimension more in UGRID docs. --- docs/src/further_topics/ugrid/data_model.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/src/further_topics/ugrid/data_model.rst b/docs/src/further_topics/ugrid/data_model.rst index 630b45958f..e26fa75ab2 100644 --- a/docs/src/further_topics/ugrid/data_model.rst +++ b/docs/src/further_topics/ugrid/data_model.rst @@ -122,7 +122,8 @@ E.g. we could make a mesh of 4 nodes, with 2 triangles described using this A data variable associated with a mesh has a **location** of either ``node``, ``edge``, ``face`` or ``volume``. The data is stored in a 1D array with one datum per element, matched to its element by matching the datum index with the -coordinate or connectivity index. So for an example data array called ``foo``: +coordinate or connectivity index along the **unstructured dimension**. So for +an example data array called ``foo``: ``foo[3]`` would be at position ``(x[3], y[3])`` if it were node-located, or at ``faces[3]`` if it were face-located. :numref:`data_ugrid_mesh` visualises an example of what is described above. From 30c9c69ee87c0903b36d0ffcc6ef29b6f41660b2 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Thu, 27 Jan 2022 17:25:31 +0000 Subject: [PATCH 31/43] UGRID docs plotting example. --- docs/src/further_topics/ugrid/data_model.rst | 2 +- docs/src/further_topics/ugrid/operations.rst | 145 ++++++++++++++++++- 2 files changed, 145 insertions(+), 2 deletions(-) diff --git a/docs/src/further_topics/ugrid/data_model.rst b/docs/src/further_topics/ugrid/data_model.rst index e26fa75ab2..5b9f8296a6 100644 --- a/docs/src/further_topics/ugrid/data_model.rst +++ b/docs/src/further_topics/ugrid/data_model.rst @@ -331,7 +331,7 @@ the :class:`~iris.cube.Cube`\'s unstructured dimension. import numpy as np from iris.coords import AuxCoord, DimCoord - from iris.cube import Cube, CubeList + from iris.cube import Cube from iris.experimental.ugrid import Connectivity, Mesh node_x = AuxCoord( diff --git a/docs/src/further_topics/ugrid/operations.rst b/docs/src/further_topics/ugrid/operations.rst index 55c695b651..2526d74e8a 100644 --- a/docs/src/further_topics/ugrid/operations.rst +++ b/docs/src/further_topics/ugrid/operations.rst @@ -394,7 +394,150 @@ Plotting .. rubric:: |tagline: plotting| -.. todo: populate! +The Cartopy-Matplotlib combination is not optimised for displaying the high +number of irregular shapes associated with meshes. Thankfully mesh +visualisation is already popular in many other fields (e.g. CGI, gaming, +SEM microscopy), so there is a wealth of tooling available, which +:ref:`ugrid geovista` harnesses for cartographic plotting. + +GeoVista's default behaviour is to convert lat-lon information into full XYZ +coordinates so the data is visualised on the surface of a 3D globe. The plots +are interactive by default, so it's easy to explore the data in detail. + +2D projections have also been demonstrated in proofs of concept, and will +be added to API in the near future. + +This first example uses GeoVista to plot the ``face_cube`` that we created +earlier: + +.. dropdown:: :opticon:`code` + + .. code-block:: python + + >>> from geovista import GeoPlotter, Transform + >>> from geovista.common import to_xyz + + + # We'll re-use this to plot some real global data later. + >>> def cube_faces_to_polydata(cube): + ... lons, lats = cube.mesh.node_coords + ... face_node = cube.mesh.face_node_connectivity + ... indices = face_node.indices_by_location() + ... + ... mesh = Transform.from_unstructured( + ... lons.points, + ... lats.points, + ... indices, + ... data=cube.data, + ... name=f"{cube.name()} / {cube.units}", + ... start_index=face_node.start_index, + ... ) + ... return mesh + + >>> print(face_cube) + face_data / (K) (-- : 2; height: 3) + Dimension coordinates: + height - x + Mesh coordinates: + latitude x - + longitude x - + Attributes: + Conventions CF-1.7 + + # Convert our mesh+data to a PolyData object. + # Just plotting a single height level. + >>> face_polydata = cube_faces_to_polydata(face_cube[:, 0]) + >>> print(face_polydata) + PolyData (0x7fb854a9ce80) + N Cells: 2 + N Points: 5 + X Bounds: 9.903e-01, 1.000e+00 + Y Bounds: 0.000e+00, 5.234e-02 + Z Bounds: 6.123e-17, 1.392e-01 + N Arrays: 2 + + # Create the GeoVista plotter and add our mesh+data to it. + >>> my_plotter = GeoPlotter() + >>> my_plotter.add_coastlines(color="black") + >>> my_plotter.add_base_layer(color="grey") + >>> my_plotter.add_mesh(face_polydata) + + # Centre the camera on the data. + >>> camera_region = to_xyz( + ... face_cube.coord("longitude").points, + ... face_cube.coord("latitude").points, + ... radius=3, + ... ) + >>> camera_pos = camera_region.mean(axis=0) + >>> my_plotter.camera.position = camera_pos + + >>> my_plotter.show() + + .. image:: images/plotting_basic.png + :alt: A GeoVista plot of the basic example Mesh. + + This artificial data makes West Africa rather chilly! + +Here's another example using a global cubed-sphere data set: + +.. dropdown:: :opticon:`code` + + .. code-block:: python + + >>> from iris import load_cube + >>> from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD + + # Demonstrating with a global data set. + # You could also download this file from github.com/SciTools/iris-test-data. + >>> from iris.tests import get_data_path + >>> file_path = get_data_path( + ... [ + ... "NetCDF", + ... "unstructured_grid", + ... "lfric_surface_mean.nc", + ... ] + ... ) + >>> with PARSE_UGRID_ON_LOAD.context(): + ... global_cube = load_cube(file_path, "tstar_sea") + >>> print(global_cube) + sea_surface_temperature / (K) (-- : 1; -- : 13824) + Mesh coordinates: + latitude - x + longitude - x + Auxiliary coordinates: + time x - + Cell methods: + mean time (300 s) + mean time_counter + Attributes: + Conventions UGRID + description Created by xios + interval_operation 300 s + interval_write 1 d + name lfric_surface + online_operation average + timeStamp 2020-Feb-07 16:23:14 GMT + title Created by xios + uuid 489bcef5-3d1c-4529-be42-4ab5f8c8497b + + >>> global_polydata = cube_faces_to_polydata(global_cube) + >>> print(global_polydata) + PolyData (0x7f761b536160) + N Cells: 13824 + N Points: 13826 + X Bounds: -1.000e+00, 1.000e+00 + Y Bounds: -1.000e+00, 1.000e+00 + Z Bounds: -1.000e+00, 1.000e+00 + N Arrays: 2 + + >>> my_plotter = GeoPlotter() + >>> my_plotter.add_coastlines() + >>> my_plotter.add_mesh(global_polydata, show_edges=True) + + >>> my_plotter.show() + + .. image:: images/plotting_global.png + :alt: A GeoVista plot of a global sea surface temperature Mesh. Region Extraction ----------------- From 954770a715fc624692a4e5fc073204245ad49015 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Thu, 27 Jan 2022 17:30:37 +0000 Subject: [PATCH 32/43] UGRID docs tidy-up. --- docs/src/further_topics/ugrid/data_model.rst | 2 -- docs/src/further_topics/ugrid/operations.rst | 23 +++++++++++++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/docs/src/further_topics/ugrid/data_model.rst b/docs/src/further_topics/ugrid/data_model.rst index 5b9f8296a6..98ddb39703 100644 --- a/docs/src/further_topics/ugrid/data_model.rst +++ b/docs/src/further_topics/ugrid/data_model.rst @@ -418,8 +418,6 @@ The Detail ---------- How UGRID information is stored ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.. todo: Mesh printout? - * | :class:`iris.experimental.ugrid.Mesh` | Contains all information about the mesh. | Includes: diff --git a/docs/src/further_topics/ugrid/operations.rst b/docs/src/further_topics/ugrid/operations.rst index 2526d74e8a..44aff4ff21 100644 --- a/docs/src/further_topics/ugrid/operations.rst +++ b/docs/src/further_topics/ugrid/operations.rst @@ -386,7 +386,28 @@ creating any associated :class:`~iris.cube.Cube`\s: >>> with PARSE_UGRID_ON_LOAD.context(): ... loaded_mesh = load_mesh(cubelist_path) -.. todo: print(loaded_mesh) - once printouts have been improved. + >>> print(loaded_mesh) + Mesh : 'my_mesh' + topology_dimension: 2 + node + node_dimension: 'Mesh2d_node' + node coordinates + shape(5,)> + shape(5,)> + edge + edge_dimension: 'Mesh2d_edge' + edge_node_connectivity: shape(6, 2)> + edge coordinates + shape(6,)> + shape(6,)> + face + face_dimension: 'Mesh2d_face' + face_node_connectivity: shape(2, 4)> + face coordinates + shape(2,)> + shape(2,)> + long_name: 'my_mesh' + var_name: 'my_mesh' Plotting -------- From b8b23e729873b46aee8c4d29d6ef01b6082e5e3b Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Thu, 27 Jan 2022 17:36:10 +0000 Subject: [PATCH 33/43] UGRID docs plotting example. --- .../ugrid/images/plotting_basic.png | Bin 0 -> 40644 bytes .../ugrid/images/plotting_global.png | Bin 0 -> 133531 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/src/further_topics/ugrid/images/plotting_basic.png create mode 100644 docs/src/further_topics/ugrid/images/plotting_global.png diff --git a/docs/src/further_topics/ugrid/images/plotting_basic.png b/docs/src/further_topics/ugrid/images/plotting_basic.png new file mode 100644 index 0000000000000000000000000000000000000000..d781170b609eee7449003daf830af0a7ea2715c2 GIT binary patch literal 40644 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

e`Lf7FWY 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

L31{&9EW6{B23pl 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 z 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 Date: Thu, 27 Jan 2022 18:54:58 +0000 Subject: [PATCH 34/43] UGRID docs lat-lon switcheroo. --- docs/src/further_topics/ugrid/data_model.rst | 28 +++++++++--------- .../ugrid/images/plotting_basic.png | Bin 40644 -> 42265 bytes docs/src/further_topics/ugrid/operations.rst | 10 +++---- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/src/further_topics/ugrid/data_model.rst b/docs/src/further_topics/ugrid/data_model.rst index 98ddb39703..3bdd074e50 100644 --- a/docs/src/further_topics/ugrid/data_model.rst +++ b/docs/src/further_topics/ugrid/data_model.rst @@ -335,12 +335,12 @@ the :class:`~iris.cube.Cube`\'s unstructured dimension. from iris.experimental.ugrid import Connectivity, Mesh node_x = AuxCoord( - points=[3.0, 3.0, 0.0, 0.0, 0.0], + points=[0.0, 5.0, 0.0, 5.0, 8.0], standard_name="longitude", units="degrees_east", ) node_y = AuxCoord( - points=[0.0, 5.0, 0.0, 5.0, 8.0], + points=[3.0, 3.0, 0.0, 0.0, 0.0], standard_name="latitude", units="degrees_north", ) @@ -533,14 +533,14 @@ given only the ``location`` argument MeshCoord : latitude / (degrees_north) mesh: location: 'edge' - points: [2.5, 0. , 5. , 6.5, 2.5, 6.5] + points: [3. , 1.5, 1.5, 1.5, 0. , 0. ] bounds: [ - [0., 5.], + [3., 3.], + [3., 0.], + [3., 0.], + [3., 0.], [0., 0.], - [5., 5.], - [5., 8.], - [0., 5.], - [5., 8.]] + [0., 0.]] shape: (6,) bounds(6, 2) dtype: float64 standard_name: 'latitude' @@ -548,14 +548,14 @@ given only the ``location`` argument MeshCoord : longitude / (degrees_east) mesh: location: 'edge' - points: [3. , 1.5, 1.5, 1.5, 0. , 0. ] + points: [2.5, 0. , 5. , 6.5, 2.5, 6.5] bounds: [ - [3., 3.], - [3., 0.], - [3., 0.], - [3., 0.], + [0., 5.], [0., 0.], - [0., 0.]] + [5., 5.], + [5., 8.], + [0., 5.], + [5., 8.]] shape: (6,) bounds(6, 2) dtype: float64 standard_name: 'longitude' diff --git a/docs/src/further_topics/ugrid/images/plotting_basic.png b/docs/src/further_topics/ugrid/images/plotting_basic.png index d781170b609eee7449003daf830af0a7ea2715c2..d5ee9efc825809c7e4ef5d8733b04aa50bdb45ef 100644 GIT binary patch literal 42265 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

e`Lf7FWY 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

L31{&9EW6{B23pl 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 node_x = AuxCoord( - ... points=[3.0, 3.0, 0.0, 0.0, 0.0], + ... points=[0.0, 5.0, 0.0, 5.0, 8.0], ... standard_name="longitude", ... units="degrees_east", ... long_name="node_x_coordinates", ... ) - >>> node_y = AuxCoord(points=[0.0, 5.0, 0.0, 5.0, 8.0], standard_name="latitude") + >>> node_y = AuxCoord(points=[3.0, 3.0, 0.0, 0.0, 0.0], standard_name="latitude") >>> face_x = AuxCoord([2.0, 6.0], "longitude") >>> face_y = AuxCoord([1.0, 1.0], "latitude") @@ -469,12 +469,12 @@ earlier: # Just plotting a single height level. >>> face_polydata = cube_faces_to_polydata(face_cube[:, 0]) >>> print(face_polydata) - PolyData (0x7fb854a9ce80) + PolyData (0x7ff4861ff4c0) N Cells: 2 N Points: 5 X Bounds: 9.903e-01, 1.000e+00 - Y Bounds: 0.000e+00, 5.234e-02 - Z Bounds: 6.123e-17, 1.392e-01 + Y Bounds: 0.000e+00, 1.392e-01 + Z Bounds: 6.123e-17, 5.234e-02 N Arrays: 2 # Create the GeoVista plotter and add our mesh+data to it. From 4c2b19a76783d5dd5ca6d1af91e1887bb59b5058 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Fri, 28 Jan 2022 09:01:35 +0000 Subject: [PATCH 35/43] UGRID docs image fix. --- .../ugrid/images/plotting_basic.png | Bin 42265 -> 42338 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/src/further_topics/ugrid/images/plotting_basic.png b/docs/src/further_topics/ugrid/images/plotting_basic.png index d5ee9efc825809c7e4ef5d8733b04aa50bdb45ef..ba2b0b3329d8930508ece378d1317940f964f58e 100644 GIT binary patch delta 38975 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 z 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 Date: Fri, 28 Jan 2022 11:00:05 +0000 Subject: [PATCH 36/43] UGRID data model MeshCoord clarification. --- docs/src/further_topics/ugrid/data_model.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/src/further_topics/ugrid/data_model.rst b/docs/src/further_topics/ugrid/data_model.rst index 3bdd074e50..bbf119596e 100644 --- a/docs/src/further_topics/ugrid/data_model.rst +++ b/docs/src/further_topics/ugrid/data_model.rst @@ -482,14 +482,14 @@ How UGRID information is stored * | :attr:`~iris.experimental.ugrid.MeshCoord.mesh` | The :class:`~iris.experimental.ugrid.Mesh` associated with this - :class:`~iris.experimental.ugrid.MeshCoord`. Mirrored by the + :class:`~iris.experimental.ugrid.MeshCoord`. This determines the :attr:`~iris.cube.Cube.mesh` attribute of any :class:`~iris.cube.Cube` this :class:`~iris.experimental.ugrid.MeshCoord` is attached to (see `The Basics`_) * | :attr:`~iris.experimental.ugrid.MeshCoord.location` | ``node``/``edge``/``face`` - the element detailed by this - :class:`~iris.experimental.ugrid.MeshCoord`. Mirrored by the + :class:`~iris.experimental.ugrid.MeshCoord`. This determines the :attr:`~iris.cube.Cube.location` attribute of any :class:`~iris.cube.Cube` this :class:`~iris.experimental.ugrid.MeshCoord` is attached to (see From 67b1eb3765829eb70b5d4f2e581a8b8dde09b498 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Fri, 28 Jan 2022 11:10:58 +0000 Subject: [PATCH 37/43] Corrected UGRID docs example coords. --- docs/src/further_topics/ugrid/images/data_structured_grid.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/further_topics/ugrid/images/data_structured_grid.svg b/docs/src/further_topics/ugrid/images/data_structured_grid.svg index e398186d22..2f3a1ce342 100644 --- a/docs/src/further_topics/ugrid/images/data_structured_grid.svg +++ b/docs/src/further_topics/ugrid/images/data_structured_grid.svg @@ -1 +1 @@ -23, 2819,211015255152030xyCoordinate ArraysxyCoordinate Arrays23, 2819, 21xyBounds Arraysderive point locationsassign data using dimensional indices,position in array == relative spatial positionderive area locations & shapesPoint DataArea DataData Array(bounded coordsalways have points too)my_variable \ No newline at end of file +23, 28-19,-21101525-5-15-20-30xyCoordinate ArraysxyCoordinate Arrays23, 28-19, -21xyBounds Arraysderive point locationsassign data using dimensional indices,position in array == relative spatial positionderive area locations & shapesPoint DataArea DataData Array(bounded coordsalways have points too)my_variable* x+yare not lons+lats, just a demonstration! \ No newline at end of file From d2e504f66a1f46335ae441c9494956ffb2aafb09 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Fri, 28 Jan 2022 11:20:17 +0000 Subject: [PATCH 38/43] UGRID docs more Mesh and Cube printouts. --- docs/src/further_topics/ugrid/operations.rst | 32 ++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/docs/src/further_topics/ugrid/operations.rst b/docs/src/further_topics/ugrid/operations.rst index 340a727a38..de1f9bfa1c 100644 --- a/docs/src/further_topics/ugrid/operations.rst +++ b/docs/src/further_topics/ugrid/operations.rst @@ -110,6 +110,29 @@ subsequent example operations on this page. ... face_coords_and_axes=[(face_x, "x"), (face_y, "y")], ... ) + >>> print(my_mesh) + Mesh : 'my_mesh' + topology_dimension: 2 + node + node_dimension: 'Mesh2d_node' + node coordinates + + + edge + edge_dimension: 'Mesh2d_edge' + edge_node_connectivity: + edge coordinates + + + face + face_dimension: 'Mesh2d_face' + face_node_connectivity: + face coordinates + + + long_name: 'my_mesh' + + .. _making a cube: Making a Cube (with a Mesh) @@ -159,6 +182,15 @@ Creating a :class:`~iris.cube.Cube` is unchanged; the edge_data: my_mesh, edge face_data: my_mesh, face + >>> print(my_cubelist.extract_cube("edge_data")) + edge_data / (K) (-- : 6; height: 3) + Dimension coordinates: + height - x + Mesh coordinates: + latitude x - + longitude x - + + Save ---- .. |tagline: save| replace:: |unchanged| From 970db3ca5ea0b1c32a3ae7730b51a1df7db0d847 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Fri, 28 Jan 2022 12:06:51 +0000 Subject: [PATCH 39/43] UGRID docs be more explicit about region extraction. --- docs/src/further_topics/ugrid/operations.rst | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/src/further_topics/ugrid/operations.rst b/docs/src/further_topics/ugrid/operations.rst index de1f9bfa1c..84e817bf48 100644 --- a/docs/src/further_topics/ugrid/operations.rst +++ b/docs/src/further_topics/ugrid/operations.rst @@ -633,7 +633,17 @@ the link between :class:`~iris.cube.Cube` and Extracting a region therefore requires extra steps - to determine the spatial position of the data points before they can be analysed as inside/outside the selected region. The recommended way to do this is using tools provided by -:ref:`ugrid geovista`, which is optimised for performant mesh analysis: +:ref:`ugrid geovista`, which is optimised for performant mesh analysis. + +This approach centres around using :meth:`geovista.geodesic.BBox.enclosed` to +get the subset of the original mesh that is inside the +:class:`~geovista.geodesic.BBox`. This subset :class:`pyvista.PolyData` object +includes the original indices of each datapoint - the ``vtkOriginalCellIds`` +array, which can be used to index the original :class:`~iris.cube.Cube`. Since +we **know** that this subset :class:`~iris.cube.Cube` represents a regional +mesh, we then reconstruct a :class:`~iris.experimental.ugrid.Mesh` from the +:class:`~iris.cube.Cube`\'s :attr:`~iris.cube.Cube.aux_coords` using +:meth:`iris.experimental.ugrid.Mesh.from_coords`: .. Not using doctest here as want to keep GeoVista as optional dependency. From be5f51bc6a379de5f020ea418f0c88f57ecf5527 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Fri, 28 Jan 2022 12:07:12 +0000 Subject: [PATCH 40/43] UGRID docs be more generic about low level languages. --- docs/src/further_topics/ugrid/partner_packages.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/src/further_topics/ugrid/partner_packages.rst b/docs/src/further_topics/ugrid/partner_packages.rst index 9bffc4962d..8e36f4ffc2 100644 --- a/docs/src/further_topics/ugrid/partner_packages.rst +++ b/docs/src/further_topics/ugrid/partner_packages.rst @@ -4,7 +4,8 @@ Iris' Mesh Partner Packages **************************** Python is an easy to use language and has formed a very strong collaborative scientific community, which is why Iris is written in Python. *Performant* -Python relies on calls down to C, which is ideal for structured grid work since +Python relies on calls down to low level languages like C, which is ideal for +structured grid work since they can be directly represented as NumPy arrays. This is more difficult when working with unstructured meshes where extra steps are needed to determine data position (:ref:`see the data model detail `), and we need From 3d18be7cdcd8937d45bec9fd83046b2c8dc497d0 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Fri, 28 Jan 2022 12:11:04 +0000 Subject: [PATCH 41/43] UGRID docs cubed-sphere example explicitly 2-dimensional. --- docs/src/further_topics/ugrid/data_model.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/src/further_topics/ugrid/data_model.rst b/docs/src/further_topics/ugrid/data_model.rst index bbf119596e..4a2f64f627 100644 --- a/docs/src/further_topics/ugrid/data_model.rst +++ b/docs/src/further_topics/ugrid/data_model.rst @@ -249,9 +249,10 @@ Coordinates are recorded per-node, and connectivities are recorded per-element. This is opposed to a structured grid, where a single coordinate value is shared by every data point/area along that line. -For example: representing a cubed-sphere using a mesh leads to coordinates and -connectivities being **~8 times larger than the data itself**, as opposed to a -small fraction of the data size when dividing a sphere using a structured grid. +For example: representing the surface of a cubed-sphere using a mesh leads to +coordinates and connectivities being **~8 times larger than the data itself**, +as opposed to a small fraction of the data size when dividing a spherical +surface using a structured grid of longitudes and latitudes. This further increases the emphasis on lazy loading and processing of data using packages such as Dask. From 5f31e05b730ba2b2d7c50497cfd509bde11f6d71 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 28 Jan 2022 12:20:40 +0000 Subject: [PATCH 42/43] Make code-examples copybutton respect line continuations. --- docs/src/conf.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/src/conf.py b/docs/src/conf.py index 5a436f86cb..e2c9198ebf 100644 --- a/docs/src/conf.py +++ b/docs/src/conf.py @@ -200,7 +200,8 @@ def _dotv(version): # -- copybutton extension ----------------------------------------------------- # See https://sphinx-copybutton.readthedocs.io/en/latest/ -copybutton_prompt_text = ">>> " +copybutton_prompt_text = r">>> |\.\.\. " +copybutton_prompt_is_regexp = True # sphinx.ext.todo configuration ----------------------------------------------- # See https://www.sphinx-doc.org/en/master/usage/extensions/todo.html From 0761b58367fbf02e4247273ee67a78f44d1651c9 Mon Sep 17 00:00:00 2001 From: Martin Yeo Date: Fri, 28 Jan 2022 12:38:28 +0000 Subject: [PATCH 43/43] Sphinx copybutton fix. --- docs/src/conf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/src/conf.py b/docs/src/conf.py index e2c9198ebf..138e0aa7fc 100644 --- a/docs/src/conf.py +++ b/docs/src/conf.py @@ -202,6 +202,7 @@ def _dotv(version): # See https://sphinx-copybutton.readthedocs.io/en/latest/ copybutton_prompt_text = r">>> |\.\.\. " copybutton_prompt_is_regexp = True +copybutton_line_continuation_character = "\\" # sphinx.ext.todo configuration ----------------------------------------------- # See https://www.sphinx-doc.org/en/master/usage/extensions/todo.html