diff --git a/docs/src/further_topics/ugrid/data_model.rst b/docs/src/further_topics/ugrid/data_model.rst index d7282c71d8..9e74647e96 100644 --- a/docs/src/further_topics/ugrid/data_model.rst +++ b/docs/src/further_topics/ugrid/data_model.rst @@ -298,7 +298,7 @@ How Iris Represents This .. seealso:: Remember this is a prose summary. Precise documentation is at: - :mod:`iris.experimental.ugrid`. + :mod:`iris.ugrid`. .. note:: @@ -310,7 +310,7 @@ The Basics The Iris :class:`~iris.cube.Cube` has several new members: * | :attr:`~iris.cube.Cube.mesh` - | The :class:`iris.experimental.ugrid.MeshXY` that describes the + | The :class:`iris.ugrid.MeshXY` 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 @@ -320,10 +320,10 @@ The Iris :class:`~iris.cube.Cube` has several new members: indexes over the horizontal :attr:`~iris.cube.Cube.data` positions. These members will all be ``None`` for a :class:`~iris.cube.Cube` with no -associated :class:`~iris.experimental.ugrid.MeshXY`. +associated :class:`~iris.ugrid.MeshXY`. This :class:`~iris.cube.Cube`\'s unstructured dimension has multiple attached -:class:`iris.experimental.ugrid.MeshCoord`\s (one for each axis e.g. +:class:`iris.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. @@ -333,7 +333,7 @@ the :class:`~iris.cube.Cube`\'s unstructured dimension. from iris.coords import AuxCoord, DimCoord from iris.cube import Cube - from iris.experimental.ugrid import Connectivity, MeshXY + from iris.ugrid import Connectivity, MeshXY node_x = AuxCoord( points=[0.0, 5.0, 0.0, 5.0, 8.0], @@ -422,38 +422,38 @@ The Detail ---------- How UGRID information is stored ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -* | :class:`iris.experimental.ugrid.MeshXY` +* | :class:`iris.ugrid.MeshXY` | Contains all information about the mesh. | Includes: - * | :attr:`~iris.experimental.ugrid.MeshXY.topology_dimension` + * | :attr:`~iris.ugrid.MeshXY.topology_dimension` | The maximum dimensionality of shape (1D=edge, 2D=face) supported - by this :class:`~iris.experimental.ugrid.MeshXY`. Determines which - :class:`~iris.experimental.ugrid.Connectivity`\s are required/optional + by this :class:`~iris.ugrid.MeshXY`. Determines which + :class:`~iris.ugrid.Connectivity`\s are required/optional (see below). * 1-3 collections of :class:`iris.coords.AuxCoord`\s: - * | **Required**: :attr:`~iris.experimental.ugrid.MeshXY.node_coords` + * | **Required**: :attr:`~iris.ugrid.MeshXY.node_coords` | The nodes that are the basis for the mesh. - * | Optional: :attr:`~iris.experimental.ugrid.MeshXY.edge_coords`, - :attr:`~iris.experimental.ugrid.MeshXY.face_coords` + * | Optional: :attr:`~iris.ugrid.Mesh.edge_coords`, + :attr:`~iris.ugrid.MeshXY.face_coords` | For indicating the 'centres' of the edges/faces. - | **NOTE:** generating a :class:`~iris.experimental.ugrid.MeshCoord` from - a :class:`~iris.experimental.ugrid.MeshXY` currently (``Jan 2022``) + | **NOTE:** generating a :class:`~iris.ugrid.MeshCoord` from + a :class:`~iris.ugrid.MeshXY` currently (``Jan 2022``) requires centre coordinates for the given ``location``; to be rectified in future. - * 1 or more :class:`iris.experimental.ugrid.Connectivity`\s: + * 1 or more :class:`iris.ugrid.Connectivity`\s: * | **Required for 1D (edge) elements**: - :attr:`~iris.experimental.ugrid.MeshXY.edge_node_connectivity` + :attr:`~iris.ugrid.MeshXY.edge_node_connectivity` | Define the edges by connecting nodes. * | **Required for 2D (face) elements**: - :attr:`~iris.experimental.ugrid.MeshXY.face_node_connectivity` + :attr:`~iris.ugrid.MeshXY.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 + :attr:`iris.ugrid.mesh.Connectivity.UGRID_CF_ROLES` for the full list of types. .. doctest:: ugrid_summaries @@ -480,30 +480,30 @@ How UGRID information is stored long_name: 'my_mesh' -* | :class:`iris.experimental.ugrid.MeshCoord` +* | :class:`iris.ugrid.MeshCoord` | Described in detail in `MeshCoords`_. | Stores the following information: - * | :attr:`~iris.experimental.ugrid.MeshCoord.mesh` - | The :class:`~iris.experimental.ugrid.MeshXY` associated with this - :class:`~iris.experimental.ugrid.MeshCoord`. This determines the + * | :attr:`~iris.ugrid.MeshCoord.mesh` + | The :class:`~iris.ugrid.MeshXY` associated with this + :class:`~iris.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 + this :class:`~iris.ugrid.MeshCoord` is attached to (see `The Basics`_) - * | :attr:`~iris.experimental.ugrid.MeshCoord.location` + * | :attr:`~iris.ugrid.MeshCoord.location` | ``node``/``edge``/``face`` - the element detailed by this - :class:`~iris.experimental.ugrid.MeshCoord`. This determines the + :class:`~iris.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 + :class:`~iris.ugrid.MeshCoord` is attached to (see `The Basics`_). .. _ugrid MeshCoords: MeshCoords ~~~~~~~~~~ -Links a :class:`~iris.cube.Cube` to a :class:`~iris.experimental.ugrid.MeshXY` by +Links a :class:`~iris.cube.Cube` to a :class:`~iris.ugrid.MeshXY` by 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 @@ -511,23 +511,23 @@ same way that all :class:`~iris.coords.Coord`\s attach to 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.MeshXY`, ``location`` +:class:`~iris.ugrid.MeshCoord`\s are instantiated using a given +:class:`~iris.ugrid.MeshXY`, ``location`` ("node"/"edge"/"face") and ``axis``. The process interprets the -:class:`~iris.experimental.ugrid.MeshXY`\'s -:attr:`~iris.experimental.ugrid.MeshXY.node_coords` and if appropriate the -:attr:`~iris.experimental.ugrid.MeshXY.edge_node_connectivity`/ -:attr:`~iris.experimental.ugrid.MeshXY.face_node_connectivity` and -:attr:`~iris.experimental.ugrid.MeshXY.edge_coords`/ -:attr:`~iris.experimental.ugrid.MeshXY.face_coords` +:class:`~iris.ugrid.MeshXY`\'s +:attr:`~iris.ugrid.MeshXY.node_coords` and if appropriate the +:attr:`~iris.ugrid.MeshXY.edge_node_connectivity`/ +:attr:`~iris.ugrid.MeshXY.face_node_connectivity` and +:attr:`~iris.ugrid.MeshXY.edge_coords`/ +:attr:`~iris.ugrid.MeshXY.face_coords` 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.MeshXY`\'s +representation of all the :class:`~iris.ugrid.MeshXY`\'s nodes/edges/faces for the given axis. -The method :meth:`iris.experimental.ugrid.MeshXY.to_MeshCoords` is available to -create a :class:`~iris.experimental.ugrid.MeshCoord` for -every axis represented by that :class:`~iris.experimental.ugrid.MeshXY`, +The method :meth:`iris.ugrid.MeshXY.to_MeshCoords` is available to +create a :class:`~iris.ugrid.MeshCoord` for +every axis represented by that :class:`~iris.ugrid.MeshXY`, given only the ``location`` argument .. doctest:: ugrid_summaries diff --git a/docs/src/further_topics/ugrid/index.rst b/docs/src/further_topics/ugrid/index.rst index c45fd271a2..e21730bb6e 100644 --- a/docs/src/further_topics/ugrid/index.rst +++ b/docs/src/further_topics/ugrid/index.rst @@ -9,7 +9,7 @@ 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. +the :mod:`iris.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 + diff --git a/docs/src/further_topics/ugrid/operations.rst b/docs/src/further_topics/ugrid/operations.rst index 80ff284f66..f7b9eb2fca 100644 --- a/docs/src/further_topics/ugrid/operations.rst +++ b/docs/src/further_topics/ugrid/operations.rst @@ -61,7 +61,7 @@ subsequent example operations on this page. >>> import numpy as np >>> from iris.coords import AuxCoord - >>> from iris.experimental.ugrid import Connectivity, MeshXY + >>> from iris.ugrid import Connectivity, MeshXY # Going to create the following mesh # (node indices are shown to aid understanding): @@ -143,8 +143,8 @@ Making a Cube (with a Mesh) .. rubric:: |tagline: making a cube| Creating a :class:`~iris.cube.Cube` is unchanged; the -:class:`~iris.experimental.ugrid.MeshXY` is linked via a -:class:`~iris.experimental.ugrid.MeshCoord` (see :ref:`ugrid MeshCoords`): +:class:`~iris.ugrid.MeshXY` is linked via a +:class:`~iris.ugrid.MeshCoord` (see :ref:`ugrid MeshCoords`): .. dropdown:: Code :icon: code @@ -205,7 +205,7 @@ 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.MeshXY` and automatically +has an associated :class:`~iris.ugrid.MeshXY` and automatically saves the file in a UGRID-conformant format: .. dropdown:: Code @@ -282,8 +282,8 @@ saves the file in a UGRID-conformant format: } -The :func:`iris.experimental.ugrid.save_mesh` function allows -:class:`~iris.experimental.ugrid.MeshXY`\es to be saved to file without +The :func:`iris.ugrid.save_mesh` function allows +:class:`~iris.ugrid.MeshXY`\es to be saved to file without associated :class:`~iris.cube.Cube`\s: .. dropdown:: Code @@ -293,7 +293,7 @@ associated :class:`~iris.cube.Cube`\s: >>> from subprocess import run - >>> from iris.experimental.ugrid import save_mesh + >>> from iris.ugrid import save_mesh >>> mesh_path = "my_mesh.nc" >>> save_mesh(my_mesh, mesh_path) @@ -356,7 +356,7 @@ Load 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: +:const:`iris.ugrid.PARSE_UGRID_ON_LOAD` context manager: .. dropdown:: Code :icon: code @@ -364,7 +364,7 @@ Iris mesh data model, use the .. doctest:: ugrid_operations >>> from iris import load - >>> from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD + >>> from iris.ugrid import PARSE_UGRID_ON_LOAD >>> with PARSE_UGRID_ON_LOAD.context(): ... loaded_cubelist = load(cubelist_path) @@ -412,15 +412,15 @@ etcetera: .. note:: We recommend caution if constraining on coordinates associated with a - :class:`~iris.experimental.ugrid.MeshXY`. An individual coordinate value + :class:`~iris.ugrid.MeshXY`. 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.MeshXY`\es to be loaded from a file without +The :func:`iris.ugrid.load_mesh` and +:func:`~iris.ugrid.load_meshes` functions allow only +:class:`~iris.ugrid.MeshXY`\es to be loaded from a file without creating any associated :class:`~iris.cube.Cube`\s: .. dropdown:: Code @@ -428,7 +428,7 @@ creating any associated :class:`~iris.cube.Cube`\s: .. doctest:: ugrid_operations - >>> from iris.experimental.ugrid import load_mesh + >>> from iris.ugrid import load_mesh >>> with PARSE_UGRID_ON_LOAD.context(): ... loaded_mesh = load_mesh(cubelist_path) @@ -493,7 +493,7 @@ GeoVista :external+geovista:doc:`generated/gallery/index`. >>> from iris import load_cube, sample_data_path >>> from iris.experimental.geovista import cube_to_polydata - >>> from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD + >>> from iris.ugrid import PARSE_UGRID_ON_LOAD >>> with PARSE_UGRID_ON_LOAD.context(): ... sample_mesh_cube = load_cube(sample_data_path("mesh_C4_synthetic_float.nc")) @@ -541,11 +541,11 @@ 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 +:class:`~iris.ugrid.MeshCoord`\s cannot be reliably interpreted +as intended, and subsetting a :class:`~iris.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.MeshXY`: +:class:`~iris.ugrid.MeshXY`: .. dropdown:: Code :icon: code @@ -595,7 +595,7 @@ below: >>> from geovista.geodesic import BBox >>> from iris import load_cube, sample_data_path >>> from iris.experimental.geovista import cube_to_polydata, extract_unstructured_region - >>> from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD + >>> from iris.ugrid import PARSE_UGRID_ON_LOAD >>> with PARSE_UGRID_ON_LOAD.context(): ... sample_mesh_cube = load_cube(sample_data_path("mesh_C4_synthetic_float.nc")) @@ -667,7 +667,7 @@ with the >>> from esmf_regrid.experimental.unstructured_scheme import MeshToGridESMFRegridder >>> from iris import load, load_cube - >>> from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD + >>> from iris.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 @@ -751,7 +751,7 @@ with the 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.MeshXY` (or on the same **grid** in the case of +:class:`~iris.ugrid.MeshXY` (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 @@ -819,19 +819,19 @@ Equality .. rubric:: |tagline: equality| -:class:`~iris.experimental.ugrid.MeshXY` comparison is supported, and comparing -two ':class:`~iris.experimental.ugrid.MeshXY`-:class:`~iris.cube.Cube`\s' will +:class:`~iris.ugrid.MeshXY` comparison is supported, and comparing +two ':class:`~iris.ugrid.MeshXY`-:class:`~iris.cube.Cube`\s' will include a comparison of the respective -:class:`~iris.experimental.ugrid.MeshXY`\es, with no extra action needed by the +:class:`~iris.ugrid.MeshXY`\es, with no extra action needed by the user. .. note:: Keep an eye on memory demand when comparing large - :class:`~iris.experimental.ugrid.MeshXY`\es, but note that - :class:`~iris.experimental.ugrid.MeshXY`\ equality is enabled for lazy + :class:`~iris.ugrid.MeshXY`\es, but note that + :class:`~iris.ugrid.MeshXY`\ equality is enabled for lazy processing (:doc:`/userguide/real_and_lazy_data`), so if the - :class:`~iris.experimental.ugrid.MeshXY`\es being compared are lazy the + :class:`~iris.ugrid.MeshXY`\es being compared are lazy the process will use less memory than their total size. Combining Cubes @@ -842,23 +842,23 @@ Combining Cubes Merging or concatenating :class:`~iris.cube.Cube`\s (described in :doc:`/userguide/merge_and_concat`) with two different -:class:`~iris.experimental.ugrid.MeshXY`\es is not possible - a +:class:`~iris.ugrid.MeshXY`\es is not possible - a :class:`~iris.cube.Cube` must be associated with just a single -:class:`~iris.experimental.ugrid.MeshXY`, and merge/concatenate are not yet -capable of combining multiple :class:`~iris.experimental.ugrid.MeshXY`\es into +:class:`~iris.ugrid.MeshXY`, and merge/concatenate are not yet +capable of combining multiple :class:`~iris.ugrid.MeshXY`\es into one. :class:`~iris.cube.Cube`\s that include -:class:`~iris.experimental.ugrid.MeshCoord`\s can still be merged/concatenated +:class:`~iris.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.MeshXY`. +:class:`~iris.ugrid.MeshXY`. .. 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.MeshXY` + :func:`iris.ugrid.recombine_submeshes`, which can be used + for a very specific type of :class:`~iris.ugrid.MeshXY` combination not detailed here. Arithmetic @@ -869,7 +869,7 @@ Arithmetic Cube Arithmetic (described in :doc:`/userguide/cube_maths`) has been extended to handle :class:`~iris.cube.Cube`\s that include -:class:`~iris.experimental.ugrid.MeshCoord`\s, and hence have a ``cube.mesh``. +:class:`~iris.ugrid.MeshCoord`\s, and hence have a ``cube.mesh``. Cubes with meshes can be combined in arithmetic operations like "ordinary" cubes. They can combine with other cubes without that mesh diff --git a/docs/src/further_topics/ugrid/other_meshes.rst b/docs/src/further_topics/ugrid/other_meshes.rst index df83c8c4f6..19f220be82 100644 --- a/docs/src/further_topics/ugrid/other_meshes.rst +++ b/docs/src/further_topics/ugrid/other_meshes.rst @@ -25,7 +25,7 @@ A FESOM mesh encoded in a NetCDF file includes: To represent the Voronoi Polygons as faces, the corner coordinates will be used as the **nodes** when creating the Iris -:class:`~iris.experimental.ugrid.mesh.MeshXY`. +:class:`~iris.ugrid.mesh.MeshXY`. .. dropdown:: Code :icon: code @@ -33,7 +33,7 @@ as the **nodes** when creating the Iris .. code-block:: python >>> import iris - >>> from iris.experimental.ugrid import MeshXY + >>> from iris.ugrid import MeshXY >>> temperature_cube = iris.load_cube("my_file.nc", "sea_surface_temperature") @@ -113,7 +113,7 @@ An SMC grid encoded in a NetCDF file includes: From this information we can derive face corner coordinates, which will be used as the **nodes** when creating the Iris -:class:`~iris.experimental.ugrid.mesh.MeshXY`. +:class:`~iris.ugrid.mesh.MeshXY`. .. dropdown:: Code @@ -122,7 +122,7 @@ as the **nodes** when creating the Iris .. code-block:: python >>> import iris - >>> from iris.experimental.ugrid import MeshXY + >>> from iris.ugrid import MeshXY >>> import numpy as np @@ -265,7 +265,7 @@ dimensions into a single mesh dimension. Since Iris cubes don't support a "resh >>> import iris >>> from iris.coords import AuxCoord, CellMeasure >>> from iris.cube import Cube - >>> from iris.experimental.ugrid.mesh import MeshXY, Connectivity + >>> from iris.ugrid.mesh import MeshXY, Connectivity >>> filepath = iris.sample_data_path('orca2_votemper.nc') diff --git a/docs/src/further_topics/ugrid/partner_packages.rst b/docs/src/further_topics/ugrid/partner_packages.rst index 87a61ae0fe..5dea58b752 100644 --- a/docs/src/further_topics/ugrid/partner_packages.rst +++ b/docs/src/further_topics/ugrid/partner_packages.rst @@ -58,7 +58,7 @@ 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.MeshXY` in mind. +:class:`~iris.ugrid.MeshXY` in mind. Applications ------------ diff --git a/lib/iris/analysis/_regrid.py b/lib/iris/analysis/_regrid.py index 6c10b8c404..31ceafb025 100644 --- a/lib/iris/analysis/_regrid.py +++ b/lib/iris/analysis/_regrid.py @@ -998,7 +998,7 @@ def _create_cube(data, src, src_dims, tgt_coords, num_tgt_dims, regrid_callback) The dimensions of the X and Y coordinate within the source Cube. tgt_coords : tuple of :class:`iris.coords.Coord Either two 1D :class:`iris.coords.DimCoord`, two 1D - :class:`iris.experimental.ugrid.DimCoord` or two n-D + :class:`iris.ugrid.DimCoord` or two n-D :class:`iris.coords.AuxCoord` representing the new grid's X and Y coordinates. num_tgt_dims : int diff --git a/lib/iris/common/metadata.py b/lib/iris/common/metadata.py index e11ea71462..c705054725 100644 --- a/lib/iris/common/metadata.py +++ b/lib/iris/common/metadata.py @@ -1602,7 +1602,8 @@ def metadata_manager_factory(cls, **kwargs): #: Convenience collection of lenient metadata combine services. # TODO: change lists back to tuples once CellMeasureMetadata is re-integrated -# here (currently in experimental.ugrid). +# here (currently in iris.ugrid). +# TODO: complete iris.ugrid replacement SERVICES_COMBINE = [ AncillaryVariableMetadata.combine, BaseMetadata.combine, diff --git a/lib/iris/common/resolve.py b/lib/iris/common/resolve.py index 8b5f0cdc7f..d678d13cf8 100644 --- a/lib/iris/common/resolve.py +++ b/lib/iris/common/resolve.py @@ -71,7 +71,7 @@ class _PreparedItem: axis: Any = None def create_coord(self, metadata): - from iris.experimental.ugrid.mesh import MeshCoord + from iris.ugrid.mesh import MeshCoord if issubclass(self.container, MeshCoord): # Make a MeshCoord, for which we have mesh/location/axis. @@ -741,7 +741,7 @@ def _create_prepared_item( if container is None: container = type(coord) - from iris.experimental.ugrid.mesh import MeshCoord + from iris.ugrid.mesh import MeshCoord if issubclass(container, MeshCoord): # Build a prepared-item to make a MeshCoord. diff --git a/lib/iris/coords.py b/lib/iris/coords.py index e563b56498..40b131e496 100644 --- a/lib/iris/coords.py +++ b/lib/iris/coords.py @@ -844,7 +844,8 @@ def xml_element(self, doc): if isinstance(self, Coord): values_term = "points" # TODO: replace with isinstance(self, Connectivity) once Connectivity - # is re-integrated here (currently in experimental.ugrid). + # is re-integrated here (currently in iris.ugrid). + # TODO: complete iris.ugrid replacement elif hasattr(self, "indices"): values_term = "indices" else: diff --git a/lib/iris/cube.py b/lib/iris/cube.py index 47b66b6ead..eb4b82fd73 100644 --- a/lib/iris/cube.py +++ b/lib/iris/cube.py @@ -2088,7 +2088,7 @@ def coords( If ``None``, returns all coordinates. mesh_coords : optional Set to ``True`` to return only coordinates which are - :class:`~iris.experimental.ugrid.MeshCoord`\'s. + :class:`~iris.ugrid.MeshCoord`\'s. Set to ``False`` to return only non-mesh coordinates. If ``None``, returns all coordinates. @@ -2115,7 +2115,7 @@ def coords( if mesh_coords is not None: # Select on mesh or non-mesh. mesh_coords = bool(mesh_coords) - # Use duck typing to avoid importing from iris.experimental.ugrid, + # Use duck typing to avoid importing from iris.ugrid, # which could be a circular import. if mesh_coords: # *only* MeshCoords @@ -2245,7 +2245,7 @@ def coord( If ``None``, returns all coordinates. mesh_coords : optional Set to ``True`` to return only coordinates which are - :class:`~iris.experimental.ugrid.MeshCoord`\'s. + :class:`~iris.ugrid.MeshCoord`\'s. Set to ``False`` to return only non-mesh coordinates. If ``None``, returns all coordinates. @@ -2365,18 +2365,18 @@ def _any_meshcoord(self): @property def mesh(self): - r"""Return the unstructured :class:`~iris.experimental.ugrid.MeshXY` associated with the cube. + r"""Return the unstructured :class:`~iris.ugrid.MeshXY` associated with the cube. - Return the unstructured :class:`~iris.experimental.ugrid.MeshXY` + Return the unstructured :class:`~iris.ugrid.MeshXY` associated with the cube, if the cube has any - :class:`~iris.experimental.ugrid.MeshCoord`, + :class:`~iris.ugrid.MeshCoord`, or ``None`` if it has none. Returns ------- - :class:`iris.experimental.ugrid.mesh.MeshXY` or None + :class:`iris.ugrid.mesh.MeshXY` or None The mesh of the cube - :class:`~iris.experimental.ugrid.MeshCoord`'s, + :class:`~iris.ugrid.MeshCoord`'s, or ``None``. """ @@ -2390,14 +2390,14 @@ def location(self): r"""Return the mesh "location" of the cube data. Return the mesh "location" of the cube data, if the cube has any - :class:`~iris.experimental.ugrid.MeshCoord`, + :class:`~iris.ugrid.MeshCoord`, or ``None`` if it has none. Returns ------- str or None The mesh location of the cube - :class:`~iris.experimental.ugrid.MeshCoords` + :class:`~iris.ugrid.MeshCoords` (i.e. one of 'face' / 'edge' / 'node'), or ``None``. """ @@ -2410,14 +2410,14 @@ def mesh_dim(self): r"""Return the cube dimension of the mesh. Return the cube dimension of the mesh, if the cube has any - :class:`~iris.experimental.ugrid.MeshCoord`, + :class:`~iris.ugrid.MeshCoord`, or ``None`` if it has none. Returns ------- int or None The cube dimension which the cube - :class:`~iris.experimental.ugrid.MeshCoord` map to, + :class:`~iris.ugrid.MeshCoord` map to, or ``None``. """ diff --git a/lib/iris/experimental/geovista.py b/lib/iris/experimental/geovista.py index 3f42f09e03..690e19d543 100644 --- a/lib/iris/experimental/geovista.py +++ b/lib/iris/experimental/geovista.py @@ -8,7 +8,7 @@ from geovista.common import VTK_CELL_IDS, VTK_POINT_IDS from iris.exceptions import CoordinateNotFoundError -from iris.experimental.ugrid import MeshXY +from iris.ugrid import MeshXY def _get_coord(cube, axis): @@ -52,7 +52,7 @@ def cube_to_polydata(cube, **kwargs): If a :class:`~iris.cube.Cube` with too many dimensions is passed. Only the horizontal data can be represented, meaning a 2D Cube, or 1D Cube if the horizontal space is described by - :class:`~iris.experimental.ugrid.MeshCoord`\ s. + :class:`~iris.ugrid.MeshCoord`\ s. Examples -------- diff --git a/lib/iris/experimental/ugrid.py b/lib/iris/experimental/ugrid.py new file mode 100644 index 0000000000..bbc8ef93b3 --- /dev/null +++ b/lib/iris/experimental/ugrid.py @@ -0,0 +1,77 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. + +"""Legacy import location for mesh support. + +See :mod:`iris.ugrid` for the new, correct import location. + +Notes +----- +This import path alios is provided for backwards compatibility, but will be removed +in a future release : Please re-write code to import from the new module path. + +This legacy import module will be removed in a future release. +N.B. it does **not** need to wait for a major release, since the former API was +experimental. + +.. deprecated:: 3.10 + All the former :mod:`iris.experimental.ugrid` modules have been relocated to + :mod:`iris.ugrid` and its submodules. Please re-write code to import from the new + module path. + This import path alios is provided for backwards compatibility, but will be removed + in a future release : N.B. removing this does **not** need to wait for a major + release, since the former API was experimental. + +""" + +from __future__ import annotations + +from .._deprecation import warn_deprecated +from ..ugrid.load import PARSE_UGRID_ON_LOAD, load_mesh, load_meshes +from ..ugrid.mesh import Connectivity as _Connectivity +from ..ugrid.mesh import MeshCoord as _MeshCoord +from ..ugrid.mesh import MeshXY as _MeshXY +from ..ugrid.save import save_mesh +from ..ugrid.utils import recombine_submeshes + + +# NOTE: publishing the original Mesh, MeshCoord and Connectivity here causes a Sphinx +# Sphinx warning, E.G.: +# "WARNING: duplicate object description of iris.ugrid.mesh.Mesh, other instance +# in generated/api/iris.experimental.ugrid, use :no-index: for one of them" +# For some reason, this only happens for the classes, and not the functions. +# +# This is a fatal problem, i.e. breaks the build since we are building with -W. +# We couldn't fix this with "autodoc_suppress_warnings", so the solution for now is to +# wrap the classes. Which is really ugly. +# TODO: remove this when we remove iris.experimental.ugrid +class MeshXY(_MeshXY): + pass + + +class MeshCoord(_MeshCoord): + pass + + +class Connectivity(_Connectivity): + pass + + +__all__ = [ + "Connectivity", + "MeshCoord", + "MeshXY", + "PARSE_UGRID_ON_LOAD", + "load_mesh", + "load_meshes", + "recombine_submeshes", + "save_mesh", +] + +warn_deprecated( + "All the former :mod:`iris.experimental.ugrid` modules have been relocated to " + "module 'iris.ugrid' and its submodules. " + "Please re-write code to import from the new module path." +) diff --git a/lib/iris/fileformats/cf.py b/lib/iris/fileformats/cf.py index 3247aa1960..b4c754e4a6 100644 --- a/lib/iris/fileformats/cf.py +++ b/lib/iris/fileformats/cf.py @@ -1056,7 +1056,8 @@ class CFReader: CFMeasureVariable, ) - # TODO: remove once iris.experimental.ugrid.CFUGridReader is folded in. + # TODO: remove once iris.ugrid.CFUGridReader is folded in. + # TODO: complete iris.ugrid replacement CFGroup = CFGroup def __init__(self, file_source, warn=False, monotonic=False): @@ -1174,7 +1175,8 @@ def _build_cf_groups(self): def _build(cf_variable): # TODO: isinstance(cf_variable, UGridMeshVariable) - # UGridMeshVariable currently in experimental.ugrid - circular import. + # UGridMeshVariable currently in iris.ugrid - circular import. + # TODO: complete iris.ugrid replacement is_mesh_var = cf_variable.cf_identity == "mesh" ugrid_coord_names = [] ugrid_coords = getattr(self.cf_group, "ugrid_coords", None) diff --git a/lib/iris/fileformats/netcdf/loader.py b/lib/iris/fileformats/netcdf/loader.py index 5276657195..2bdfed9fff 100644 --- a/lib/iris/fileformats/netcdf/loader.py +++ b/lib/iris/fileformats/netcdf/loader.py @@ -578,15 +578,16 @@ def load_cubes(file_sources, callback=None, constraints=None): Generator of loaded NetCDF :class:`iris.cube.Cube`. """ - # TODO: rationalise UGRID/mesh handling once experimental.ugrid is folded + # TODO: rationalise UGRID/mesh handling once iris.ugrid is folded + # TODO: complete iris.ugrid replacement # into standard behaviour. # Deferred import to avoid circular imports. - from iris.experimental.ugrid.cf import CFUGridReader - from iris.experimental.ugrid.load import ( + from iris.io import run_callback + from iris.ugrid.cf import CFUGridReader + from iris.ugrid.load import ( _build_mesh_coords, _meshes_from_cf, ) - from iris.io import run_callback # Create a low-level data-var filter from the original load constraints, if they are suitable. var_callback = _translate_constraints_to_var_callback(constraints) @@ -683,8 +684,8 @@ def __init__(self, var_dim_chunksizes=None): :class:`~iris.coords.AncillaryVariable` etc. This can be overridden, if required, by variable-specific settings. - For this purpose, :class:`~iris.experimental.ugrid.mesh.MeshCoord` and - :class:`~iris.experimental.ugrid.mesh.Connectivity` are not + For this purpose, :class:`~iris.ugrid.mesh.MeshCoord` and + :class:`~iris.ugrid.mesh.Connectivity` are not :class:`~iris.cube.Cube` components, and chunk control on a :class:`~iris.cube.Cube` data-variable will not affect them. diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index 179adaf9cd..1981091717 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -271,7 +271,7 @@ def _setncattr(variable, name, attribute): return variable.setncattr(name, attribute) -# NOTE : this matches :class:`iris.experimental.ugrid.mesh.MeshXY.ELEMENTS`, +# NOTE : this matches :class:`iris.ugrid.mesh.MeshXY.ELEMENTS`, # but in the preferred order for coord/connectivity variables in the file. MESH_ELEMENTS = ("node", "edge", "face") @@ -766,7 +766,7 @@ def _add_mesh(self, cube_or_mesh): Parameters ---------- - cube_or_mesh : :class:`iris.cube.Cube` or :class:`iris.experimental.ugrid.MeshXY` + cube_or_mesh : :class:`iris.cube.Cube` or :class:`iris.ugrid.MeshXY` The Cube or Mesh being saved to the netCDF file. Returns @@ -941,7 +941,7 @@ def _add_aux_coords(self, cube, cf_var_cube, dimension_names): dimension_names : list Names associated with the dimensions of the cube. """ - from iris.experimental.ugrid.mesh import ( + from iris.ugrid.mesh import ( MeshEdgeCoords, MeshFaceCoords, MeshNodeCoords, @@ -1120,7 +1120,7 @@ def _get_dim_names(self, cube_or_mesh): Parameters ---------- - cube_or_mesh : :class:`iris.cube.Cube` or :class:`iris.experimental.ugrid.MeshXY` + cube_or_mesh : :class:`iris.cube.Cube` or :class:`iris.ugrid.MeshXY` The Cube or Mesh being saved to the netCDF file. Returns @@ -1482,7 +1482,7 @@ def _get_coord_variable_name(self, cube_or_mesh, coord): Parameters ---------- - cube_or_mesh : :class:`iris.cube.Cube` or :class:`iris.experimental.ugrid.MeshXY` + cube_or_mesh : :class:`iris.cube.Cube` or :class:`iris.ugrid.MeshXY` The Cube or Mesh being saved to the netCDF file. coord : :class:`iris.coords._DimensionalMetadata` An instance of a coordinate (or similar), for which a CF-netCDF @@ -1524,7 +1524,7 @@ def _get_coord_variable_name(self, cube_or_mesh, coord): # element-coordinate of the mesh. # Name it for it's first dim, i.e. mesh-dim of its location. - from iris.experimental.ugrid.mesh import Connectivity + from iris.ugrid.mesh import Connectivity # At present, a location-coord cannot be nameless, as the # MeshXY code relies on guess_coord_axis. @@ -1544,7 +1544,7 @@ def _get_mesh_variable_name(self, mesh): Parameters ---------- - mesh : :class:`iris.experimental.ugrid.mesh.MeshXY` + mesh : :class:`iris.ugrid.mesh.MeshXY` An instance of a Mesh for which a CF-netCDF variable name is required. @@ -1570,7 +1570,7 @@ def _create_mesh(self, mesh): Parameters ---------- - mesh : :class:`iris.experimental.ugrid.mesh.MeshXY` + mesh : :class:`iris.ugrid.mesh.MeshXY` The Mesh to be saved to CF-netCDF file. Returns @@ -1660,7 +1660,7 @@ def _create_generic_cf_array_var( Parameters ---------- - cube_or_mesh : :class:`iris.cube.Cube` or :class:`iris.experimental.ugrid.MeshXY` + cube_or_mesh : :class:`iris.cube.Cube` or :class:`iris.ugrid.MeshXY` The Cube or Mesh being saved to the netCDF file. cube_dim_names : list of str The name of each dimension of the cube. diff --git a/lib/iris/tests/integration/experimental/test_meshcoord_coordsys.py b/lib/iris/tests/integration/experimental/test_meshcoord_coordsys.py index d9ec782108..7a1ac80823 100644 --- a/lib/iris/tests/integration/experimental/test_meshcoord_coordsys.py +++ b/lib/iris/tests/integration/experimental/test_meshcoord_coordsys.py @@ -8,8 +8,8 @@ import iris from iris.coord_systems import GeogCS -from iris.experimental.ugrid.load import PARSE_UGRID_ON_LOAD from iris.tests.stock.netcdf import ncgen_from_cdl +from iris.ugrid.load import PARSE_UGRID_ON_LOAD TEST_CDL = """ netcdf mesh_test { diff --git a/lib/iris/tests/integration/experimental/test_ugrid_load.py b/lib/iris/tests/integration/ugrid/test_ugrid_load.py similarity index 95% rename from lib/iris/tests/integration/experimental/test_ugrid_load.py rename to lib/iris/tests/integration/ugrid/test_ugrid_load.py index 4325532fc6..2281e54b3c 100644 --- a/lib/iris/tests/integration/experimental/test_ugrid_load.py +++ b/lib/iris/tests/integration/ugrid/test_ugrid_load.py @@ -4,8 +4,9 @@ # See LICENSE in the root of the repository for full licensing details. """Integration tests for NetCDF-UGRID file loading. -todo: fold these tests into netcdf tests when experimental.ugrid is folded into +todo: fold these tests into netcdf tests when iris.ugrid is folded into standard behaviour. +TODO: complete iris.ugrid replacement """ @@ -18,12 +19,12 @@ import pytest from iris import Constraint, load -from iris.experimental.ugrid.load import load_mesh, load_meshes -from iris.experimental.ugrid.mesh import MeshXY from iris.tests.stock.netcdf import ( _file_from_cdl_template as create_file_from_cdl_template, ) from iris.tests.unit.tests.stock.test_netcdf import XIOSFileMixin +from iris.ugrid.load import load_mesh, load_meshes +from iris.ugrid.mesh import MeshXY from iris.warnings import IrisCfWarning @@ -58,7 +59,7 @@ def common_test(self, load_filename, assert_filename): ) self.assertEqual(1, len(cube_list)) cube = cube_list[0] - self.assertCML(cube, ["experimental", "ugrid", assert_filename]) + self.assertCML(cube, ["ugrid", assert_filename]) def test_2D_1t_face_half_levels(self): self.common_test( @@ -125,7 +126,7 @@ def test_multiple_phenomena(self): ["NetCDF", "unstructured_grid", "lfric_surface_mean.nc"] ), ) - self.assertCML(cube_list, ("experimental", "ugrid", "surface_mean.cml")) + self.assertCML(cube_list, ("ugrid", "surface_mean.cml")) class TestTolerantLoading(XIOSFileMixin): diff --git a/lib/iris/tests/integration/experimental/test_ugrid_save.py b/lib/iris/tests/integration/ugrid/test_ugrid_save.py similarity index 100% rename from lib/iris/tests/integration/experimental/test_ugrid_save.py rename to lib/iris/tests/integration/ugrid/test_ugrid_save.py diff --git a/lib/iris/tests/integration/experimental/ugrid_conventions_examples/README.txt b/lib/iris/tests/integration/ugrid/ugrid_conventions_examples/README.txt similarity index 100% rename from lib/iris/tests/integration/experimental/ugrid_conventions_examples/README.txt rename to lib/iris/tests/integration/ugrid/ugrid_conventions_examples/README.txt diff --git a/lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex1_1d_mesh.cdl b/lib/iris/tests/integration/ugrid/ugrid_conventions_examples/ugrid_ex1_1d_mesh.cdl similarity index 100% rename from lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex1_1d_mesh.cdl rename to lib/iris/tests/integration/ugrid/ugrid_conventions_examples/ugrid_ex1_1d_mesh.cdl diff --git a/lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex2_2d_triangular.cdl b/lib/iris/tests/integration/ugrid/ugrid_conventions_examples/ugrid_ex2_2d_triangular.cdl similarity index 100% rename from lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex2_2d_triangular.cdl rename to lib/iris/tests/integration/ugrid/ugrid_conventions_examples/ugrid_ex2_2d_triangular.cdl diff --git a/lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex3_2d_flexible.cdl b/lib/iris/tests/integration/ugrid/ugrid_conventions_examples/ugrid_ex3_2d_flexible.cdl similarity index 100% rename from lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex3_2d_flexible.cdl rename to lib/iris/tests/integration/ugrid/ugrid_conventions_examples/ugrid_ex3_2d_flexible.cdl diff --git a/lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex4_3d_layered.cdl b/lib/iris/tests/integration/ugrid/ugrid_conventions_examples/ugrid_ex4_3d_layered.cdl similarity index 100% rename from lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex4_3d_layered.cdl rename to lib/iris/tests/integration/ugrid/ugrid_conventions_examples/ugrid_ex4_3d_layered.cdl diff --git a/lib/iris/tests/results/experimental/ugrid/2D_1t_face_half_levels.cml b/lib/iris/tests/results/ugrid/2D_1t_face_half_levels.cml similarity index 100% rename from lib/iris/tests/results/experimental/ugrid/2D_1t_face_half_levels.cml rename to lib/iris/tests/results/ugrid/2D_1t_face_half_levels.cml diff --git a/lib/iris/tests/results/experimental/ugrid/2D_72t_face_half_levels.cml b/lib/iris/tests/results/ugrid/2D_72t_face_half_levels.cml similarity index 100% rename from lib/iris/tests/results/experimental/ugrid/2D_72t_face_half_levels.cml rename to lib/iris/tests/results/ugrid/2D_72t_face_half_levels.cml diff --git a/lib/iris/tests/results/experimental/ugrid/3D_1t_face_full_levels.cml b/lib/iris/tests/results/ugrid/3D_1t_face_full_levels.cml similarity index 100% rename from lib/iris/tests/results/experimental/ugrid/3D_1t_face_full_levels.cml rename to lib/iris/tests/results/ugrid/3D_1t_face_full_levels.cml diff --git a/lib/iris/tests/results/experimental/ugrid/3D_1t_face_half_levels.cml b/lib/iris/tests/results/ugrid/3D_1t_face_half_levels.cml similarity index 100% rename from lib/iris/tests/results/experimental/ugrid/3D_1t_face_half_levels.cml rename to lib/iris/tests/results/ugrid/3D_1t_face_half_levels.cml diff --git a/lib/iris/tests/results/experimental/ugrid/3D_snow_pseudo_levels.cml b/lib/iris/tests/results/ugrid/3D_snow_pseudo_levels.cml similarity index 100% rename from lib/iris/tests/results/experimental/ugrid/3D_snow_pseudo_levels.cml rename to lib/iris/tests/results/ugrid/3D_snow_pseudo_levels.cml diff --git a/lib/iris/tests/results/experimental/ugrid/3D_soil_pseudo_levels.cml b/lib/iris/tests/results/ugrid/3D_soil_pseudo_levels.cml similarity index 100% rename from lib/iris/tests/results/experimental/ugrid/3D_soil_pseudo_levels.cml rename to lib/iris/tests/results/ugrid/3D_soil_pseudo_levels.cml diff --git a/lib/iris/tests/results/experimental/ugrid/3D_tile_pseudo_levels.cml b/lib/iris/tests/results/ugrid/3D_tile_pseudo_levels.cml similarity index 100% rename from lib/iris/tests/results/experimental/ugrid/3D_tile_pseudo_levels.cml rename to lib/iris/tests/results/ugrid/3D_tile_pseudo_levels.cml diff --git a/lib/iris/tests/results/experimental/ugrid/3D_veg_pseudo_levels.cml b/lib/iris/tests/results/ugrid/3D_veg_pseudo_levels.cml similarity index 100% rename from lib/iris/tests/results/experimental/ugrid/3D_veg_pseudo_levels.cml rename to lib/iris/tests/results/ugrid/3D_veg_pseudo_levels.cml diff --git a/lib/iris/tests/results/experimental/ugrid/surface_mean.cml b/lib/iris/tests/results/ugrid/surface_mean.cml similarity index 100% rename from lib/iris/tests/results/experimental/ugrid/surface_mean.cml rename to lib/iris/tests/results/ugrid/surface_mean.cml diff --git a/lib/iris/tests/stock/__init__.py b/lib/iris/tests/stock/__init__.py index e6ef0356a6..f664ce012b 100644 --- a/lib/iris/tests/stock/__init__.py +++ b/lib/iris/tests/stock/__init__.py @@ -15,6 +15,7 @@ import numpy as np import numpy.ma as ma +from iris import ugrid from iris.analysis import cartography import iris.aux_factory from iris.coord_systems import GeogCS, RotatedGeogCS @@ -22,7 +23,6 @@ import iris.coords as icoords from iris.coords import AncillaryVariable, AuxCoord, CellMeasure, CellMethod, DimCoord from iris.cube import Cube -from iris.experimental import ugrid from iris.util import mask_cube from ._stock_2d_latlons import ( # noqa diff --git a/lib/iris/tests/stock/mesh.py b/lib/iris/tests/stock/mesh.py index 6333374d6c..22dcff18ce 100644 --- a/lib/iris/tests/stock/mesh.py +++ b/lib/iris/tests/stock/mesh.py @@ -8,7 +8,7 @@ from iris.coords import AuxCoord, DimCoord from iris.cube import Cube -from iris.experimental.ugrid.mesh import Connectivity, MeshCoord, MeshXY +from iris.ugrid.mesh import Connectivity, MeshCoord, MeshXY # Default creation controls for creating a test MeshXY. # Note: we're not creating any kind of sensible 'normal' mesh here, the numbers diff --git a/lib/iris/tests/unit/common/metadata/test_metadata_manager_factory.py b/lib/iris/tests/unit/common/metadata/test_metadata_manager_factory.py index e9ec42e04b..49449ad63b 100644 --- a/lib/iris/tests/unit/common/metadata/test_metadata_manager_factory.py +++ b/lib/iris/tests/unit/common/metadata/test_metadata_manager_factory.py @@ -21,7 +21,7 @@ CubeMetadata, metadata_manager_factory, ) -from iris.experimental.ugrid.metadata import ConnectivityMetadata +from iris.ugrid.metadata import ConnectivityMetadata BASES = [ AncillaryVariableMetadata, diff --git a/lib/iris/tests/unit/common/mixin/test_CFVariableMixin.py b/lib/iris/tests/unit/common/mixin/test_CFVariableMixin.py index 020f18a358..57d56ecfe7 100644 --- a/lib/iris/tests/unit/common/mixin/test_CFVariableMixin.py +++ b/lib/iris/tests/unit/common/mixin/test_CFVariableMixin.py @@ -21,7 +21,7 @@ CubeMetadata, ) from iris.common.mixin import CFVariableMixin, LimitedAttributeDict -from iris.experimental.ugrid.metadata import ConnectivityMetadata +from iris.ugrid.metadata import ConnectivityMetadata class Test__getter(tests.IrisTest): diff --git a/lib/iris/tests/unit/coords/test__DimensionalMetadata.py b/lib/iris/tests/unit/coords/test__DimensionalMetadata.py index 6aaa26e5a9..60d4459ff3 100644 --- a/lib/iris/tests/unit/coords/test__DimensionalMetadata.py +++ b/lib/iris/tests/unit/coords/test__DimensionalMetadata.py @@ -21,9 +21,9 @@ DimCoord, _DimensionalMetadata, ) -from iris.experimental.ugrid.mesh import Connectivity from iris.tests.stock import climatology_3d as cube_with_climatology from iris.tests.stock.mesh import sample_meshcoord +from iris.ugrid.mesh import Connectivity class Test___init____abstractmethod(tests.IrisTest): diff --git a/lib/iris/tests/unit/experimental/ugrid/metadata/__init__.py b/lib/iris/tests/unit/experimental/ugrid/metadata/__init__.py deleted file mode 100644 index a8ad2bc014..0000000000 --- a/lib/iris/tests/unit/experimental/ugrid/metadata/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -# Copyright Iris contributors -# -# This file is part of Iris and is released under the BSD license. -# See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :mod:`iris.experimental.ugrid.metadata` package.""" diff --git a/lib/iris/tests/unit/experimental/ugrid/utils/__init__.py b/lib/iris/tests/unit/experimental/ugrid/utils/__init__.py deleted file mode 100644 index ea8202f8fb..0000000000 --- a/lib/iris/tests/unit/experimental/ugrid/utils/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -# Copyright Iris contributors -# -# This file is part of Iris and is released under the BSD license. -# See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :mod:`iris.experimental.ugrid.utils` package.""" diff --git a/lib/iris/tests/unit/fileformats/netcdf/loader/test_load_cubes.py b/lib/iris/tests/unit/fileformats/netcdf/loader/test_load_cubes.py index 571a749bf0..c90f710110 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/loader/test_load_cubes.py +++ b/lib/iris/tests/unit/fileformats/netcdf/loader/test_load_cubes.py @@ -21,10 +21,10 @@ import numpy as np from iris.coords import AncillaryVariable, CellMeasure -from iris.experimental.ugrid.mesh import MeshCoord from iris.fileformats.netcdf import logger from iris.fileformats.netcdf.loader import load_cubes from iris.tests.stock.netcdf import ncgen_from_cdl +from iris.ugrid.mesh import MeshCoord def setUpModule(): diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__ugrid.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__ugrid.py index e86ecf9a52..c8b422c7b3 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__ugrid.py +++ b/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__ugrid.py @@ -22,10 +22,10 @@ from iris import save from iris.coords import AuxCoord from iris.cube import Cube, CubeList -from iris.experimental.ugrid.mesh import Connectivity, MeshXY -from iris.experimental.ugrid.save import save_mesh from iris.fileformats.netcdf import _thread_safe_nc from iris.tests.stock import realistic_4d +from iris.ugrid.mesh import Connectivity, MeshXY +from iris.ugrid.save import save_mesh XY_LOCS = ("x", "y") XY_NAMES = ("longitude", "latitude") @@ -196,7 +196,7 @@ def make_cube(mesh=None, location="face", **kwargs): Parameters ---------- - mesh : :class:`iris.experimental.ugrid.mesh.MeshXY` or None, optional + mesh : :class:`iris.ugrid.mesh.MeshXY` or None, optional If None, use 'default_mesh()' location : str, optional, default="face" Which mesh element to map the cube to. diff --git a/lib/iris/tests/unit/tests/stock/test_netcdf.py b/lib/iris/tests/unit/tests/stock/test_netcdf.py index c218385425..521f03e053 100644 --- a/lib/iris/tests/unit/tests/stock/test_netcdf.py +++ b/lib/iris/tests/unit/tests/stock/test_netcdf.py @@ -8,12 +8,12 @@ import tempfile from iris import load_cube -from iris.experimental.ugrid.mesh import MeshCoord, MeshXY # Import iris.tests first so that some things can be initialised before # importing anything else. -import iris.tests as tests +import iris.tests as tests # isort:skip from iris.tests.stock import netcdf +from iris.ugrid.mesh import MeshCoord, MeshXY class XIOSFileMixin(tests.IrisTest): diff --git a/lib/iris/tests/unit/experimental/ugrid/__init__.py b/lib/iris/tests/unit/ugrid/__init__.py similarity index 72% rename from lib/iris/tests/unit/experimental/ugrid/__init__.py rename to lib/iris/tests/unit/ugrid/__init__.py index 27d7921e5f..d80eae287c 100644 --- a/lib/iris/tests/unit/experimental/ugrid/__init__.py +++ b/lib/iris/tests/unit/ugrid/__init__.py @@ -2,4 +2,4 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :mod:`iris.experimental.ugrid` package.""" +"""Unit tests for the :mod:`iris.ugrid` package.""" diff --git a/lib/iris/tests/unit/experimental/ugrid/cf/__init__.py b/lib/iris/tests/unit/ugrid/cf/__init__.py similarity index 71% rename from lib/iris/tests/unit/experimental/ugrid/cf/__init__.py rename to lib/iris/tests/unit/ugrid/cf/__init__.py index 19507555c7..dc57b9d980 100644 --- a/lib/iris/tests/unit/experimental/ugrid/cf/__init__.py +++ b/lib/iris/tests/unit/ugrid/cf/__init__.py @@ -2,4 +2,4 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :mod:`iris.experimental.ugrid.cf` package.""" +"""Unit tests for the :mod:`iris.ugrid.cf` package.""" diff --git a/lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridAuxiliaryCoordinateVariable.py b/lib/iris/tests/unit/ugrid/cf/test_CFUGridAuxiliaryCoordinateVariable.py similarity index 96% rename from lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridAuxiliaryCoordinateVariable.py rename to lib/iris/tests/unit/ugrid/cf/test_CFUGridAuxiliaryCoordinateVariable.py index f283dd22db..abd4442d3b 100644 --- a/lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridAuxiliaryCoordinateVariable.py +++ b/lib/iris/tests/unit/ugrid/cf/test_CFUGridAuxiliaryCoordinateVariable.py @@ -2,10 +2,11 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :class:`iris.experimental.ugrid.cf.CFUGridAuxiliaryCoordinateVariable` class. +"""Unit tests for the :class:`iris.ugrid.cf.CFUGridAuxiliaryCoordinateVariable` class. -todo: fold these tests into cf tests when experimental.ugrid is folded into +todo: fold these tests into cf tests when iris.ugrid is folded into standard behaviour. +TODO: complete iris.ugrid replacement """ @@ -19,10 +20,10 @@ import numpy as np import pytest -from iris.experimental.ugrid.cf import CFUGridAuxiliaryCoordinateVariable -from iris.tests.unit.experimental.ugrid.cf.test_CFUGridReader import ( +from iris.tests.unit.ugrid.cf.test_CFUGridReader import ( netcdf_ugrid_variable, ) +from iris.ugrid.cf import CFUGridAuxiliaryCoordinateVariable import iris.warnings diff --git a/lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridConnectivityVariable.py b/lib/iris/tests/unit/ugrid/cf/test_CFUGridConnectivityVariable.py similarity index 95% rename from lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridConnectivityVariable.py rename to lib/iris/tests/unit/ugrid/cf/test_CFUGridConnectivityVariable.py index d412b8838a..743410a849 100644 --- a/lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridConnectivityVariable.py +++ b/lib/iris/tests/unit/ugrid/cf/test_CFUGridConnectivityVariable.py @@ -2,10 +2,11 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :class:`iris.experimental.ugrid.cf.CFUGridConnectivityVariable` class. +"""Unit tests for the :class:`iris.ugrid.cf.CFUGridConnectivityVariable` class. -todo: fold these tests into cf tests when experimental.ugrid is folded into +todo: fold these tests into cf tests when iris.ugrid is folded into standard behaviour. +TODO: complete iris.ugrid replacement """ @@ -19,11 +20,11 @@ import numpy as np import pytest -from iris.experimental.ugrid.cf import CFUGridConnectivityVariable -from iris.experimental.ugrid.mesh import Connectivity -from iris.tests.unit.experimental.ugrid.cf.test_CFUGridReader import ( +from iris.tests.unit.ugrid.cf.test_CFUGridReader import ( netcdf_ugrid_variable, ) +from iris.ugrid.cf import CFUGridConnectivityVariable +from iris.ugrid.mesh import Connectivity import iris.warnings diff --git a/lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridGroup.py b/lib/iris/tests/unit/ugrid/cf/test_CFUGridGroup.py similarity index 93% rename from lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridGroup.py rename to lib/iris/tests/unit/ugrid/cf/test_CFUGridGroup.py index 6db067fe25..0226ec76e2 100644 --- a/lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridGroup.py +++ b/lib/iris/tests/unit/ugrid/cf/test_CFUGridGroup.py @@ -2,10 +2,11 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :class:`iris.experimental.ugrid.cf.CFUGridGroup` class. +"""Unit tests for the :class:`iris.ugrid.cf.CFUGridGroup` class. -todo: fold these tests into cf tests when experimental.ugrid is folded into +todo: fold these tests into cf tests when iris.ugrid is folded into standard behaviour. +TODO: complete iris.ugrid replacement """ @@ -15,13 +16,13 @@ from unittest.mock import MagicMock -from iris.experimental.ugrid.cf import ( +from iris.fileformats.cf import CFCoordinateVariable, CFDataVariable +from iris.ugrid.cf import ( CFUGridAuxiliaryCoordinateVariable, CFUGridConnectivityVariable, CFUGridGroup, CFUGridMeshVariable, ) -from iris.fileformats.cf import CFCoordinateVariable, CFDataVariable class Tests(tests.IrisTest): diff --git a/lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridMeshVariable.py b/lib/iris/tests/unit/ugrid/cf/test_CFUGridMeshVariable.py similarity index 97% rename from lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridMeshVariable.py rename to lib/iris/tests/unit/ugrid/cf/test_CFUGridMeshVariable.py index 32c96cacbc..f93c1e89a1 100644 --- a/lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridMeshVariable.py +++ b/lib/iris/tests/unit/ugrid/cf/test_CFUGridMeshVariable.py @@ -2,10 +2,11 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :class:`iris.experimental.ugrid.cf.CFUGridMeshVariable` class. +"""Unit tests for the :class:`iris.ugrid.cf.CFUGridMeshVariable` class. -todo: fold these tests into cf tests when experimental.ugrid is folded into +todo: fold these tests into cf tests when ugrid is folded into standard behaviour. +TODO: complete iris.ugrid replacement """ @@ -19,10 +20,10 @@ import numpy as np import pytest -from iris.experimental.ugrid.cf import CFUGridMeshVariable -from iris.tests.unit.experimental.ugrid.cf.test_CFUGridReader import ( +from iris.tests.unit.ugrid.cf.test_CFUGridReader import ( netcdf_ugrid_variable, ) +from iris.ugrid.cf import CFUGridMeshVariable import iris.warnings diff --git a/lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridReader.py b/lib/iris/tests/unit/ugrid/cf/test_CFUGridReader.py similarity index 94% rename from lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridReader.py rename to lib/iris/tests/unit/ugrid/cf/test_CFUGridReader.py index 14278d3dff..5f36958e9a 100644 --- a/lib/iris/tests/unit/experimental/ugrid/cf/test_CFUGridReader.py +++ b/lib/iris/tests/unit/ugrid/cf/test_CFUGridReader.py @@ -2,10 +2,11 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :class:`iris.experimental.ugrid.cf.CFUGridGroup` class. +"""Unit tests for the :class:`iris.ugrid.cf.CFUGridGroup` class. -todo: fold these tests into cf tests when experimental.ugrid is folded into +todo: fold these tests into cf tests when iris.ugrid is folded into standard behaviour. +TODO: complete iris.ugrid replacement """ @@ -15,15 +16,15 @@ from unittest import mock -from iris.experimental.ugrid.cf import ( +from iris.fileformats.cf import CFCoordinateVariable, CFDataVariable +from iris.tests.unit.fileformats.cf.test_CFReader import netcdf_variable +from iris.ugrid.cf import ( CFUGridAuxiliaryCoordinateVariable, CFUGridConnectivityVariable, CFUGridGroup, CFUGridMeshVariable, CFUGridReader, ) -from iris.fileformats.cf import CFCoordinateVariable, CFDataVariable -from iris.tests.unit.fileformats.cf.test_CFReader import netcdf_variable def netcdf_ugrid_variable( @@ -90,7 +91,7 @@ def setUpClass(cls): def setUp(self): # Restrict the CFUGridReader functionality to only performing # translations and building first level cf-groups for variables. - self.patch("iris.experimental.ugrid.cf.CFUGridReader._reset") + self.patch("iris.ugrid.cf.CFUGridReader._reset") self.patch( "iris.fileformats.netcdf._thread_safe_nc.DatasetWrapper", return_value=self.dataset, diff --git a/lib/iris/tests/unit/experimental/ugrid/mesh/__init__.py b/lib/iris/tests/unit/ugrid/load/__init__.py similarity index 70% rename from lib/iris/tests/unit/experimental/ugrid/mesh/__init__.py rename to lib/iris/tests/unit/ugrid/load/__init__.py index d485782c11..b3552cc441 100644 --- a/lib/iris/tests/unit/experimental/ugrid/mesh/__init__.py +++ b/lib/iris/tests/unit/ugrid/load/__init__.py @@ -2,4 +2,4 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :mod:`iris.experimental.ugrid.mesh` package.""" +"""Unit tests for the :mod:`iris.ugrid.load` package.""" diff --git a/lib/iris/tests/unit/experimental/ugrid/load/test_ParseUgridOnLoad.py b/lib/iris/tests/unit/ugrid/load/test_ParseUgridOnLoad.py similarity index 80% rename from lib/iris/tests/unit/experimental/ugrid/load/test_ParseUgridOnLoad.py rename to lib/iris/tests/unit/ugrid/load/test_ParseUgridOnLoad.py index 0c78fa5880..e47dfe8d50 100644 --- a/lib/iris/tests/unit/experimental/ugrid/load/test_ParseUgridOnLoad.py +++ b/lib/iris/tests/unit/ugrid/load/test_ParseUgridOnLoad.py @@ -2,7 +2,7 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :class:`iris.experimental.ugrid.load.ParseUgridOnLoad` class. +"""Unit tests for the :class:`iris.ugrid.load.ParseUgridOnLoad` class. TODO: remove this module when ParseUGridOnLoad itself is removed. @@ -11,7 +11,7 @@ import pytest from iris._deprecation import IrisDeprecation -from iris.experimental.ugrid.load import PARSE_UGRID_ON_LOAD, ParseUGridOnLoad +from iris.ugrid.load import PARSE_UGRID_ON_LOAD, ParseUGridOnLoad def test_creation(): diff --git a/lib/iris/tests/unit/experimental/ugrid/load/test_load_mesh.py b/lib/iris/tests/unit/ugrid/load/test_load_mesh.py similarity index 86% rename from lib/iris/tests/unit/experimental/ugrid/load/test_load_mesh.py rename to lib/iris/tests/unit/ugrid/load/test_load_mesh.py index 6d1bbe995c..5f2308c68e 100644 --- a/lib/iris/tests/unit/experimental/ugrid/load/test_load_mesh.py +++ b/lib/iris/tests/unit/ugrid/load/test_load_mesh.py @@ -2,20 +2,20 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :func:`iris.experimental.ugrid.load.load_mesh` function.""" +"""Unit tests for the :func:`iris.ugrid.load.load_mesh` function.""" # Import iris.tests first so that some things can be initialised before # importing anything else. import iris.tests as tests # isort:skip -from iris.experimental.ugrid.load import load_mesh +from iris.ugrid.load import load_mesh class Tests(tests.IrisTest): # All 'real' tests have been done for load_meshes(). Here we just check # that load_mesh() works with load_meshes() correctly, using mocking. def setUp(self): - self.load_meshes_mock = self.patch("iris.experimental.ugrid.load.load_meshes") + self.load_meshes_mock = self.patch("iris.ugrid.load.load_meshes") # The expected return from load_meshes - a dict of files, each with # a list of meshes. self.load_meshes_mock.return_value = {"file": ["mesh"]} diff --git a/lib/iris/tests/unit/experimental/ugrid/load/test_load_meshes.py b/lib/iris/tests/unit/ugrid/load/test_load_meshes.py similarity index 97% rename from lib/iris/tests/unit/experimental/ugrid/load/test_load_meshes.py rename to lib/iris/tests/unit/ugrid/load/test_load_meshes.py index da7cf9b649..3847514a02 100644 --- a/lib/iris/tests/unit/experimental/ugrid/load/test_load_meshes.py +++ b/lib/iris/tests/unit/ugrid/load/test_load_meshes.py @@ -2,7 +2,7 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :func:`iris.experimental.ugrid.load.load_meshes` function.""" +"""Unit tests for the :func:`iris.ugrid.load.load_meshes` function.""" # Import iris.tests first so that some things can be initialised before # importing anything else. @@ -13,8 +13,8 @@ import tempfile from uuid import uuid4 -from iris.experimental.ugrid.load import load_meshes, logger from iris.tests.stock.netcdf import ncgen_from_cdl +from iris.ugrid.load import load_meshes, logger def setUpModule(): diff --git a/lib/iris/tests/unit/experimental/ugrid/load/test_meshload_checks.py b/lib/iris/tests/unit/ugrid/load/test_meshload_checks.py similarity index 100% rename from lib/iris/tests/unit/experimental/ugrid/load/test_meshload_checks.py rename to lib/iris/tests/unit/ugrid/load/test_meshload_checks.py diff --git a/lib/iris/tests/unit/experimental/ugrid/load/__init__.py b/lib/iris/tests/unit/ugrid/mesh/__init__.py similarity index 70% rename from lib/iris/tests/unit/experimental/ugrid/load/__init__.py rename to lib/iris/tests/unit/ugrid/mesh/__init__.py index 3248db6e41..f41d747a68 100644 --- a/lib/iris/tests/unit/experimental/ugrid/load/__init__.py +++ b/lib/iris/tests/unit/ugrid/mesh/__init__.py @@ -2,4 +2,4 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :mod:`iris.experimental.ugrid.load` package.""" +"""Unit tests for the :mod:`iris.ugrid.mesh` package.""" diff --git a/lib/iris/tests/unit/experimental/ugrid/mesh/test_Connectivity.py b/lib/iris/tests/unit/ugrid/mesh/test_Connectivity.py similarity index 98% rename from lib/iris/tests/unit/experimental/ugrid/mesh/test_Connectivity.py rename to lib/iris/tests/unit/ugrid/mesh/test_Connectivity.py index b84b32cf41..507176a943 100644 --- a/lib/iris/tests/unit/experimental/ugrid/mesh/test_Connectivity.py +++ b/lib/iris/tests/unit/ugrid/mesh/test_Connectivity.py @@ -2,7 +2,7 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :class:`iris.experimental.ugrid.mesh.Connectivity` class.""" +"""Unit tests for the :class:`iris.ugrid.mesh.Connectivity` class.""" # Import iris.tests first so that some things can be initialised before # importing anything else. @@ -16,7 +16,7 @@ from packaging import version from iris._lazy_data import as_lazy_data, is_lazy_data -from iris.experimental.ugrid.mesh import Connectivity +from iris.ugrid.mesh import Connectivity class TestStandard(tests.IrisTest): diff --git a/lib/iris/tests/unit/experimental/ugrid/mesh/test_Mesh.py b/lib/iris/tests/unit/ugrid/mesh/test_Mesh.py similarity index 99% rename from lib/iris/tests/unit/experimental/ugrid/mesh/test_Mesh.py rename to lib/iris/tests/unit/ugrid/mesh/test_Mesh.py index a47d093af0..4b26c7b064 100644 --- a/lib/iris/tests/unit/experimental/ugrid/mesh/test_Mesh.py +++ b/lib/iris/tests/unit/ugrid/mesh/test_Mesh.py @@ -12,8 +12,8 @@ from iris.coords import AuxCoord from iris.exceptions import ConnectivityNotFoundError, CoordinateNotFoundError -from iris.experimental.ugrid import mesh, metadata -from iris.experimental.ugrid.mesh import logger +from iris.ugrid import mesh, metadata +from iris.ugrid.mesh import logger class TestMeshCommon(tests.IrisTest): diff --git a/lib/iris/tests/unit/experimental/ugrid/mesh/test_MeshCoord.py b/lib/iris/tests/unit/ugrid/mesh/test_MeshCoord.py similarity index 99% rename from lib/iris/tests/unit/experimental/ugrid/mesh/test_MeshCoord.py rename to lib/iris/tests/unit/ugrid/mesh/test_MeshCoord.py index 3f81085fa9..38d48b8be8 100644 --- a/lib/iris/tests/unit/experimental/ugrid/mesh/test_MeshCoord.py +++ b/lib/iris/tests/unit/ugrid/mesh/test_MeshCoord.py @@ -2,7 +2,7 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :class:`iris.experimental.ugrid.mesh.MeshCoord`.""" +"""Unit tests for the :class:`iris.ugrid.mesh.MeshCoord`.""" # Import iris.tests first so that some things can be initialised before # importing anything else. @@ -21,9 +21,9 @@ from iris.common.metadata import BaseMetadata, CoordMetadata from iris.coords import AuxCoord, Coord from iris.cube import Cube -from iris.experimental.ugrid.mesh import Connectivity, MeshCoord, MeshXY import iris.tests.stock.mesh from iris.tests.stock.mesh import sample_mesh, sample_meshcoord +from iris.ugrid.mesh import Connectivity, MeshCoord, MeshXY from iris.warnings import IrisVagueMetadataWarning diff --git a/lib/iris/tests/unit/experimental/ugrid/mesh/test_Mesh__from_coords.py b/lib/iris/tests/unit/ugrid/mesh/test_Mesh__from_coords.py similarity index 97% rename from lib/iris/tests/unit/experimental/ugrid/mesh/test_Mesh__from_coords.py rename to lib/iris/tests/unit/ugrid/mesh/test_Mesh__from_coords.py index 8ea9c81060..3043ae81b5 100644 --- a/lib/iris/tests/unit/experimental/ugrid/mesh/test_Mesh__from_coords.py +++ b/lib/iris/tests/unit/ugrid/mesh/test_Mesh__from_coords.py @@ -2,7 +2,7 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :meth:`iris.experimental.ugrid.mesh.MeshXY.from_coords`.""" +"""Unit tests for the :meth:`iris.ugrid.mesh.MeshXY.from_coords`.""" # Import iris.tests first so that some things can be initialised before # importing anything else. @@ -11,9 +11,9 @@ import numpy as np from iris.coords import AuxCoord, DimCoord -from iris.experimental.ugrid import logger -from iris.experimental.ugrid.mesh import Connectivity, MeshXY from iris.tests.stock import simple_2d_w_multidim_coords +from iris.ugrid import logger +from iris.ugrid.mesh import Connectivity, MeshXY class Test1Dim(tests.IrisTest): diff --git a/lib/iris/tests/unit/ugrid/metadata/__init__.py b/lib/iris/tests/unit/ugrid/metadata/__init__.py new file mode 100644 index 0000000000..e1ca32ec43 --- /dev/null +++ b/lib/iris/tests/unit/ugrid/metadata/__init__.py @@ -0,0 +1,7 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Unit tests for the :mod:`iris.ugrid.metadata` package.""" + +from __future__ import annotations diff --git a/lib/iris/tests/unit/experimental/ugrid/metadata/test_ConnectivityMetadata.py b/lib/iris/tests/unit/ugrid/metadata/test_ConnectivityMetadata.py similarity index 99% rename from lib/iris/tests/unit/experimental/ugrid/metadata/test_ConnectivityMetadata.py rename to lib/iris/tests/unit/ugrid/metadata/test_ConnectivityMetadata.py index 91637ad20b..e53a3d7002 100644 --- a/lib/iris/tests/unit/experimental/ugrid/metadata/test_ConnectivityMetadata.py +++ b/lib/iris/tests/unit/ugrid/metadata/test_ConnectivityMetadata.py @@ -2,7 +2,7 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :class:`iris.experimental.ugrid.metadata.ConnectivityMetadata`.""" +"""Unit tests for the :class:`iris.ugrid.metadata.ConnectivityMetadata`.""" # Import iris.tests first so that some things can be initialised before # importing anything else. @@ -14,7 +14,7 @@ from iris.common.lenient import _LENIENT, _qualname from iris.common.metadata import BaseMetadata -from iris.experimental.ugrid.metadata import ConnectivityMetadata +from iris.ugrid.metadata import ConnectivityMetadata class Test(tests.IrisTest): diff --git a/lib/iris/tests/unit/experimental/ugrid/metadata/test_MeshCoordMetadata.py b/lib/iris/tests/unit/ugrid/metadata/test_MeshCoordMetadata.py similarity index 99% rename from lib/iris/tests/unit/experimental/ugrid/metadata/test_MeshCoordMetadata.py rename to lib/iris/tests/unit/ugrid/metadata/test_MeshCoordMetadata.py index 0434149674..403425fb56 100644 --- a/lib/iris/tests/unit/experimental/ugrid/metadata/test_MeshCoordMetadata.py +++ b/lib/iris/tests/unit/ugrid/metadata/test_MeshCoordMetadata.py @@ -2,7 +2,7 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :class:`iris.experimental.ugrid.metadata.MeshCoordMetadata`.""" +"""Unit tests for the :class:`iris.ugrid.metadata.MeshCoordMetadata`.""" # Import iris.tests first so that some things can be initialised before # importing anything else. @@ -14,7 +14,7 @@ from iris.common.lenient import _LENIENT, _qualname from iris.common.metadata import BaseMetadata -from iris.experimental.ugrid.metadata import MeshCoordMetadata +from iris.ugrid.metadata import MeshCoordMetadata class Test__identity(tests.IrisTest): diff --git a/lib/iris/tests/unit/experimental/ugrid/metadata/test_MeshMetadata.py b/lib/iris/tests/unit/ugrid/metadata/test_MeshMetadata.py similarity index 99% rename from lib/iris/tests/unit/experimental/ugrid/metadata/test_MeshMetadata.py rename to lib/iris/tests/unit/ugrid/metadata/test_MeshMetadata.py index abbb4c0304..e96a2441c3 100644 --- a/lib/iris/tests/unit/experimental/ugrid/metadata/test_MeshMetadata.py +++ b/lib/iris/tests/unit/ugrid/metadata/test_MeshMetadata.py @@ -2,7 +2,7 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for the :class:`iris.experimental.ugrid.metadata.MeshMetadata`.""" +"""Unit tests for the :class:`iris.ugrid.metadata.MeshMetadata`.""" # Import iris.tests first so that some things can be initialised before # importing anything else. @@ -14,7 +14,7 @@ from iris.common.lenient import _LENIENT, _qualname from iris.common.metadata import BaseMetadata -from iris.experimental.ugrid.metadata import MeshMetadata +from iris.ugrid.metadata import MeshMetadata class Test(tests.IrisTest): diff --git a/lib/iris/tests/unit/ugrid/utils/__init__.py b/lib/iris/tests/unit/ugrid/utils/__init__.py new file mode 100644 index 0000000000..7bc5f68717 --- /dev/null +++ b/lib/iris/tests/unit/ugrid/utils/__init__.py @@ -0,0 +1,7 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the BSD license. +# See LICENSE in the root of the repository for full licensing details. +"""Unit tests for the :mod:`iris.ugrid.utils` package.""" + +from __future__ import annotations diff --git a/lib/iris/tests/unit/experimental/ugrid/utils/test_recombine_submeshes.py b/lib/iris/tests/unit/ugrid/utils/test_recombine_submeshes.py similarity index 99% rename from lib/iris/tests/unit/experimental/ugrid/utils/test_recombine_submeshes.py rename to lib/iris/tests/unit/ugrid/utils/test_recombine_submeshes.py index 1c0fafdfc9..2617000a0e 100644 --- a/lib/iris/tests/unit/experimental/ugrid/utils/test_recombine_submeshes.py +++ b/lib/iris/tests/unit/ugrid/utils/test_recombine_submeshes.py @@ -2,7 +2,7 @@ # # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Unit tests for :func:`iris.experimental.ugrid.utils.recombine_submeshes`.""" +"""Unit tests for :func:`iris.ugrid.utils.recombine_submeshes`.""" # Import iris.tests first so that some things can be initialised before # importing anything else. @@ -13,8 +13,8 @@ from iris.coords import AuxCoord from iris.cube import CubeList -from iris.experimental.ugrid.utils import recombine_submeshes from iris.tests.stock.mesh import sample_mesh, sample_mesh_cube +from iris.ugrid.utils import recombine_submeshes def common_test_setup(self, shape_3d=(0, 2), data_chunks=None): diff --git a/lib/iris/experimental/ugrid/__init__.py b/lib/iris/ugrid/__init__.py similarity index 91% rename from lib/iris/experimental/ugrid/__init__.py rename to lib/iris/ugrid/__init__.py index 56c1a73411..1337724a6f 100644 --- a/lib/iris/experimental/ugrid/__init__.py +++ b/lib/iris/ugrid/__init__.py @@ -16,11 +16,11 @@ .. note:: For the docstring of :const:`PARSE_UGRID_ON_LOAD`: see the original - definition at :const:`iris.experimental.ugrid.load.PARSE_UGRID_ON_LOAD`. + definition at :const:`iris.ugrid.load.PARSE_UGRID_ON_LOAD`. """ -from ...config import get_logger +from ..config import get_logger from .load import PARSE_UGRID_ON_LOAD, load_mesh, load_meshes from .mesh import Connectivity, MeshCoord, MeshXY from .save import save_mesh diff --git a/lib/iris/experimental/ugrid/cf.py b/lib/iris/ugrid/cf.py similarity index 98% rename from lib/iris/experimental/ugrid/cf.py rename to lib/iris/ugrid/cf.py index 281bdba878..27856b5d52 100644 --- a/lib/iris/experimental/ugrid/cf.py +++ b/lib/iris/ugrid/cf.py @@ -11,8 +11,8 @@ import warnings -from ...fileformats import cf -from ...warnings import IrisCfLabelVarWarning, IrisCfMissingVarWarning +from ..fileformats import cf +from ..warnings import IrisCfLabelVarWarning, IrisCfMissingVarWarning from .mesh import Connectivity @@ -32,7 +32,7 @@ class CFUGridConnectivityVariable(cf.CFVariable): that specifies for every volume its shape. Identified by a CF-netCDF variable attribute equal to any one of the values - in :attr:`~iris.experimental.ugrid.mesh.Connectivity.UGRID_CF_ROLES`. + in :attr:`~iris.ugrid.mesh.Connectivity.UGRID_CF_ROLES`. .. seealso:: diff --git a/lib/iris/experimental/ugrid/load.py b/lib/iris/ugrid/load.py similarity index 88% rename from lib/iris/experimental/ugrid/load.py rename to lib/iris/ugrid/load.py index e6b3436185..a3f278ef23 100644 --- a/lib/iris/experimental/ugrid/load.py +++ b/lib/iris/ugrid/load.py @@ -3,10 +3,10 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -r"""Allow the construction of :class:`~iris.experimental.ugrid.mesh.MeshXY`. +r"""Allow the construction of :class:`~iris.ugrid.mesh.MeshXY`. Extensions to Iris' NetCDF loading to allow the construction of -:class:`~iris.experimental.ugrid.mesh.MeshXY` from UGRID data in the file. +:class:`~iris.ugrid.mesh.MeshXY` from UGRID data in the file. Eventual destination: :mod:`iris.fileformats.netcdf`. @@ -23,14 +23,14 @@ import threading import warnings -from ..._deprecation import warn_deprecated -from ...config import get_logger -from ...coords import AuxCoord -from ...fileformats._nc_load_rules.helpers import get_attr_units, get_names -from ...fileformats.netcdf import loader as nc_loader -from ...io import decode_uri, expand_filespecs -from ...util import guess_coord_axis -from ...warnings import IrisCfWarning, IrisDefaultingWarning, IrisIgnoringWarning +from .._deprecation import warn_deprecated +from ..config import get_logger +from ..coords import AuxCoord +from ..fileformats._nc_load_rules.helpers import get_attr_units, get_names +from ..fileformats.netcdf import loader as nc_loader +from ..io import decode_uri, expand_filespecs +from ..util import guess_coord_axis +from ..warnings import IrisCfWarning, IrisDefaultingWarning, IrisIgnoringWarning from .cf import ( CFUGridAuxiliaryCoordinateVariable, CFUGridConnectivityVariable, @@ -63,7 +63,7 @@ def __init__(self): version of Iris NetCDF loading. Object is thread-safe. Use via the run-time switch - :const:`~iris.experimental.ugrid.load.PARSE_UGRID_ON_LOAD`. + :const:`~iris.ugrid.load.PARSE_UGRID_ON_LOAD`. Use :meth:`context` to temporarily activate. Notes @@ -86,7 +86,7 @@ def context(self): attached to the resultant cube(s) accordingly. Use via the run-time switch - :const:`~iris.experimental.ugrid.load.PARSE_UGRID_ON_LOAD`. + :const:`~iris.ugrid.load.PARSE_UGRID_ON_LOAD`. For example:: @@ -126,7 +126,7 @@ def context(self): yield -#: Run-time switch for experimental UGRID-aware NetCDF loading. See :class:`~iris.experimental.ugrid.load.ParseUGridOnLoad`. +#: Run-time switch for experimental UGRID-aware NetCDF loading. See :class:`~iris.ugrid.load.ParseUGridOnLoad`. PARSE_UGRID_ON_LOAD = ParseUGridOnLoad() @@ -148,10 +148,10 @@ def _meshes_from_cf(cf_reader): def load_mesh(uris, var_name=None): - """Load single :class:`~iris.experimental.ugrid.mesh.MeshXY` object from 1/more NetCDF files. + """Load a single :class:`~iris.ugrid.mesh.MeshXY` object from one or more NetCDF files. Raises an error if more/less than one - :class:`~iris.experimental.ugrid.mesh.MeshXY` is found. + :class:`~iris.ugrid.mesh.MeshXY` is found. Parameters ---------- @@ -159,12 +159,12 @@ def load_mesh(uris, var_name=None): One or more filenames/URI's. Filenames can include wildcards. Any URI's must support OpenDAP. var_name : str, optional - Only return a :class:`~iris.experimental.ugrid.mesh.MeshXY` if its + Only return a :class:`~iris.ugrid.mesh.MeshXY` if its var_name matches this value. Returns ------- - :class:`iris.experimental.ugrid.mesh.MeshXY` + :class:`iris.ugrid.mesh.MeshXY` """ meshes_result = load_meshes(uris, var_name) @@ -177,7 +177,7 @@ def load_mesh(uris, var_name=None): def load_meshes(uris, var_name=None): - r"""Load :class:`~iris.experimental.ugrid.mesh.MeshXY` objects from one or more NetCDF files. + r"""Load :class:`~iris.ugrid.mesh.MeshXY` objects from one or more NetCDF files. Parameters ---------- @@ -185,7 +185,7 @@ def load_meshes(uris, var_name=None): One or more filenames/URI's. Filenames can include wildcards. Any URI's must support OpenDAP. var_name : str, optional - Only return :class:`~iris.experimental.ugrid.mesh.MeshXY` that have + Only return :class:`~iris.ugrid.mesh.MeshXY` that have var_names matching this value. Returns @@ -193,15 +193,16 @@ def load_meshes(uris, var_name=None): dict A dictionary mapping each mesh-containing file path/URL in the input ``uris`` to a list of the - :class:`~iris.experimental.ugrid.mesh.MeshXY` returned from each. + :class:`~iris.ugrid.mesh.MeshXY` returned from each. """ - # TODO: rationalise UGRID/mesh handling once experimental.ugrid is folded + # TODO: rationalise UGRID/mesh handling once iris.ugrid is folded # into standard behaviour. + # TODO: complete iris.ugrid replacement # No constraints or callbacks supported - these assume they are operating # on a Cube. - from ...fileformats import FORMAT_AGENT + from ..fileformats import FORMAT_AGENT if isinstance(uris, str): uris = [uris] @@ -258,7 +259,7 @@ def _build_aux_coord(coord_var, file_path): """Construct a :class:`~iris.coords.AuxCoord`. Construct a :class:`~iris.coords.AuxCoord` from a given - :class:`~iris.experimental.ugrid.cf.CFUGridAuxiliaryCoordinateVariable`, + :class:`~iris.ugrid.cf.CFUGridAuxiliaryCoordinateVariable`, and guess its mesh axis. todo: integrate with standard loading API post-pyke. @@ -310,10 +311,10 @@ def _build_aux_coord(coord_var, file_path): def _build_connectivity(connectivity_var, file_path, element_dims): - """Construct a :class:`~iris.experimental.ugrid.mesh.Connectivity`. + """Construct a :class:`~iris.ugrid.mesh.Connectivity`. - Construct a :class:`~iris.experimental.ugrid.mesh.Connectivity` from a - given :class:`~iris.experimental.ugrid.cf.CFUGridConnectivityVariable`, + Construct a :class:`~iris.ugrid.mesh.Connectivity` from a + given :class:`~iris.ugrid.cf.CFUGridConnectivityVariable`, and identify the name of its first dimension. todo: integrate with standard loading API post-pyke. @@ -354,10 +355,10 @@ def _build_connectivity(connectivity_var, file_path, element_dims): def _build_mesh(cf, mesh_var, file_path): - """Construct a :class:`~iris.experimental.ugrid.mesh.MeshXY`. + """Construct a :class:`~iris.ugrid.mesh.MeshXY`. - Construct a :class:`~iris.experimental.ugrid.mesh.MeshXY` from a given - :class:`~iris.experimental.ugrid.cf.CFUGridMeshVariable`. + Construct a :class:`~iris.ugrid.mesh.MeshXY` from a given + :class:`~iris.ugrid.cf.CFUGridMeshVariable`. TODO: integrate with standard loading API post-pyke. @@ -489,10 +490,10 @@ def _build_mesh(cf, mesh_var, file_path): def _build_mesh_coords(mesh, cf_var): - """Construct a tuple of :class:`~iris.experimental.ugrid.mesh.MeshCoord`. + """Construct a tuple of :class:`~iris.ugrid.mesh.MeshCoord`. - Construct a tuple of :class:`~iris.experimental.ugrid.mesh.MeshCoord` using - from a given :class:`~iris.experimental.ugrid.mesh.MeshXY` + Construct a tuple of :class:`~iris.ugrid.mesh.MeshCoord` using + from a given :class:`~iris.ugrid.mesh.MeshXY` and :class:`~iris.fileformats.cf.CFVariable`. TODO: integrate with standard loading API post-pyke. diff --git a/lib/iris/experimental/ugrid/mesh.py b/lib/iris/ugrid/mesh.py similarity index 94% rename from lib/iris/experimental/ugrid/mesh.py rename to lib/iris/ugrid/mesh.py index 398c240337..476aaed7fa 100644 --- a/lib/iris/experimental/ugrid/mesh.py +++ b/lib/iris/ugrid/mesh.py @@ -20,14 +20,14 @@ from dask import array as da import numpy as np -from ... import _lazy_data as _lazy -from ...common import CFVariableMixin, metadata_filter, metadata_manager_factory -from ...common.metadata import BaseMetadata -from ...config import get_logger -from ...coords import AuxCoord, _DimensionalMetadata -from ...exceptions import ConnectivityNotFoundError, CoordinateNotFoundError -from ...util import array_equal, clip_string, guess_coord_axis -from ...warnings import IrisVagueMetadataWarning +from .. import _lazy_data as _lazy +from ..common import CFVariableMixin, metadata_filter, metadata_manager_factory +from ..common.metadata import BaseMetadata +from ..config import get_logger +from ..coords import AuxCoord, _DimensionalMetadata +from ..exceptions import ConnectivityNotFoundError, CoordinateNotFoundError +from ..util import array_equal, clip_string, guess_coord_axis +from ..warnings import IrisVagueMetadataWarning from .metadata import ConnectivityMetadata, MeshCoordMetadata, MeshMetadata # Configure the logger. @@ -71,9 +71,9 @@ # MeshXY connectivity manager namedtuples. # -#: Namedtuple for 1D mesh :class:`~iris.experimental.ugrid.mesh.Connectivity` instances. +#: Namedtuple for 1D mesh :class:`~iris.ugrid.mesh.Connectivity` instances. Mesh1DConnectivities = namedtuple("Mesh1DConnectivities", ["edge_node"]) -#: Namedtuple for 2D mesh :class:`~iris.experimental.ugrid.mesh.Connectivity` instances. +#: Namedtuple for 2D mesh :class:`~iris.ugrid.mesh.Connectivity` instances. Mesh2DConnectivities = namedtuple( "Mesh2DConnectivities", [ @@ -785,7 +785,7 @@ def from_coords(cls, *coords): .. testsetup:: from iris import load_cube, sample_data_path - from iris.experimental.ugrid import ( + from iris.ugrid import ( MeshXY, MeshCoord, ) @@ -1134,7 +1134,7 @@ def _set_dimension_names(self, node, edge, face, reset=False): @property def all_connectivities(self): - """All the :class:`~iris.experimental.ugrid.mesh.Connectivity` instances of the :class:`MeshXY`.""" + """All the :class:`~iris.ugrid.mesh.Connectivity` instances of the :class:`MeshXY`.""" return self._connectivity_manager.all_members @property @@ -1144,10 +1144,10 @@ def all_coords(self): @property def boundary_node_connectivity(self): - """The *optional* UGRID ``boundary_node_connectivity`` :class:`~iris.experimental.ugrid.mesh.Connectivity`. + """The *optional* UGRID ``boundary_node_connectivity`` :class:`~iris.ugrid.mesh.Connectivity`. The *optional* UGRID ``boundary_node_connectivity`` - :class:`~iris.experimental.ugrid.mesh.Connectivity` of the + :class:`~iris.ugrid.mesh.Connectivity` of the :class:`MeshXY`. """ @@ -1173,10 +1173,10 @@ def edge_dimension(self, name): @property def edge_face_connectivity(self): - """The *optional* UGRID ``edge_face_connectivity`` :class:`~iris.experimental.ugrid.mesh.Connectivity`. + """The *optional* UGRID ``edge_face_connectivity`` :class:`~iris.ugrid.mesh.Connectivity`. The *optional* UGRID ``edge_face_connectivity`` - :class:`~iris.experimental.ugrid.mesh.Connectivity` of the + :class:`~iris.ugrid.mesh.Connectivity` of the :class:`MeshXY`. """ @@ -1184,10 +1184,10 @@ def edge_face_connectivity(self): @property def edge_node_connectivity(self): - """The UGRID ``edge_node_connectivity`` :class:`~iris.experimental.ugrid.mesh.Connectivity`. + """The UGRID ``edge_node_connectivity`` :class:`~iris.ugrid.mesh.Connectivity`. The UGRID ``edge_node_connectivity`` - :class:`~iris.experimental.ugrid.mesh.Connectivity` of the + :class:`~iris.ugrid.mesh.Connectivity` of the :class:`MeshXY`, which is **required** for :attr:`MeshXY.topology_dimension` of ``1``, and *optionally required* for :attr:`MeshXY.topology_dimension` ``>=2``. @@ -1224,10 +1224,10 @@ def face_dimension(self, name): @property def face_edge_connectivity(self): - """The *optional* UGRID ``face_edge_connectivity``:class:`~iris.experimental.ugrid.mesh.Connectivity`. + """The *optional* UGRID ``face_edge_connectivity``:class:`~iris.ugrid.mesh.Connectivity`. The *optional* UGRID ``face_edge_connectivity`` - :class:`~iris.experimental.ugrid.mesh.Connectivity` of the + :class:`~iris.ugrid.mesh.Connectivity` of the :class:`MeshXY`. """ @@ -1236,10 +1236,10 @@ def face_edge_connectivity(self): @property def face_face_connectivity(self): - """The *optional* UGRID ``face_face_connectivity`` :class:`~iris.experimental.ugrid.mesh.Connectivity`. + """The *optional* UGRID ``face_face_connectivity`` :class:`~iris.ugrid.mesh.Connectivity`. The *optional* UGRID ``face_face_connectivity`` - :class:`~iris.experimental.ugrid.mesh.Connectivity` of the + :class:`~iris.ugrid.mesh.Connectivity` of the :class:`MeshXY`. """ @@ -1247,10 +1247,10 @@ def face_face_connectivity(self): @property def face_node_connectivity(self): - """Return ``face_node_connectivity``:class:`~iris.experimental.ugrid.mesh.Connectivity`. + """Return ``face_node_connectivity``:class:`~iris.ugrid.mesh.Connectivity`. The UGRID ``face_node_connectivity`` - :class:`~iris.experimental.ugrid.mesh.Connectivity` of the + :class:`~iris.ugrid.mesh.Connectivity` of the :class:`MeshXY`, which is **required** for :attr:`MeshXY.topology_dimension` of ``2``, and *optionally required* for :attr:`MeshXY.topology_dimension` of ``3``. @@ -1277,13 +1277,13 @@ def node_dimension(self, name): self._metadata_manager.node_dimension = node_dimension def add_connectivities(self, *connectivities): - """Add one or more :class:`~iris.experimental.ugrid.mesh.Connectivity` instances to the :class:`MeshXY`. + """Add one or more :class:`~iris.ugrid.mesh.Connectivity` instances to the :class:`MeshXY`. Parameters ---------- *connectivities : iterable of object A collection of one or more - :class:`~iris.experimental.ugrid.mesh.Connectivity` instances to + :class:`~iris.ugrid.mesh.Connectivity` instances to add to the :class:`MeshXY`. """ @@ -1342,9 +1342,9 @@ def connectivities( contains_edge=None, contains_face=None, ): - """Return all :class:`~iris.experimental.ugrid.mesh.Connectivity`. + """Return all :class:`~iris.ugrid.mesh.Connectivity`. - Return all :class:`~iris.experimental.ugrid.mesh.Connectivity` + Return all :class:`~iris.ugrid.mesh.Connectivity` instances from the :class:`MeshXY` that match the provided criteria. Criteria can be either specific properties or other objects with @@ -1366,44 +1366,44 @@ def connectivities( * a connectivity or metadata instance equal to that of the desired objects e.g., - :class:`~iris.experimental.ugrid.mesh.Connectivity` or - :class:`~iris.experimental.ugrid.metadata.ConnectivityMetadata`. + :class:`~iris.ugrid.mesh.Connectivity` or + :class:`~iris.ugrid.metadata.ConnectivityMetadata`. standard_name : str, optional The CF standard name of the desired - :class:`~iris.experimental.ugrid.mesh.Connectivity`. If ``None``, + :class:`~iris.ugrid.mesh.Connectivity`. If ``None``, does not check for ``standard_name``. long_name : str, optional An unconstrained description of the - :class:`~iris.experimental.ugrid.mesh.Connectivity`. If ``None``, + :class:`~iris.ugrid.mesh.Connectivity`. If ``None``, does not check for ``long_name``. var_name : str, optional The NetCDF variable name of the desired - :class:`~iris.experimental.ugrid.mesh.Connectivity`. If ``None``, + :class:`~iris.ugrid.mesh.Connectivity`. If ``None``, does not check for ``var_name``. attributes : dict, optional A dictionary of attributes desired on the - :class:`~iris.experimental.ugrid.mesh.Connectivity`. If ``None``, + :class:`~iris.ugrid.mesh.Connectivity`. If ``None``, does not check for ``attributes``. cf_role : str, optional The UGRID ``cf_role`` of the desired - :class:`~iris.experimental.ugrid.mesh.Connectivity`. + :class:`~iris.ugrid.mesh.Connectivity`. contains_node : bool, optional Contains the ``node`` element as part of the - :attr:`~iris.experimental.ugrid.metadata.ConnectivityMetadata.cf_role` + :attr:`~iris.ugrid.metadata.ConnectivityMetadata.cf_role` in the list of objects to be matched. contains_edge : bool, optional Contains the ``edge`` element as part of the - :attr:`~iris.experimental.ugrid.metadata.ConnectivityMetadata.cf_role` + :attr:`~iris.ugrid.metadata.ConnectivityMetadata.cf_role` in the list of objects to be matched. contains_face : bool, optional Contains the ``face`` element as part of the - :attr:`~iris.experimental.ugrid.metadata.ConnectivityMetadata.cf_role` + :attr:`~iris.ugrid.metadata.ConnectivityMetadata.cf_role` in the list of objects to be matched. Returns ------- - list of :class:`~iris.experimental.ugrid.mesh.Connectivity` - A list of :class:`~iris.experimental.ugrid.mesh.Connectivity` + list of :class:`~iris.ugrid.mesh.Connectivity` + A list of :class:`~iris.ugrid.mesh.Connectivity` instances from the :class:`MeshXY` that matched the given criteria. """ @@ -1432,9 +1432,9 @@ def connectivity( contains_edge=None, contains_face=None, ): - """Return a single :class:`~iris.experimental.ugrid.mesh.Connectivity`. + """Return a single :class:`~iris.ugrid.mesh.Connectivity`. - Return a single :class:`~iris.experimental.ugrid.mesh.Connectivity` + Return a single :class:`~iris.ugrid.mesh.Connectivity` from the :class:`MeshXY` that matches the provided criteria. Criteria can be either specific properties or other objects with @@ -1443,7 +1443,7 @@ def connectivity( .. note:: If the given criteria do not return **precisely one** - :class:`~iris.experimental.ugrid.mesh.Connectivity`, then a + :class:`~iris.ugrid.mesh.Connectivity`, then a :class:`~iris.exceptions.ConnectivityNotFoundError` is raised. .. seealso:: @@ -1462,44 +1462,44 @@ def connectivity( * a connectivity or metadata instance equal to that of the desired object e.g., - :class:`~iris.experimental.ugrid.mesh.Connectivity` or - :class:`~iris.experimental.ugrid.metadata.ConnectivityMetadata`. + :class:`~iris.ugrid.mesh.Connectivity` or + :class:`~iris.ugrid.metadata.ConnectivityMetadata`. standard_name : str, optional The CF standard name of the desired - :class:`~iris.experimental.ugrid.mesh.Connectivity`. If ``None``, + :class:`~iris.ugrid.mesh.Connectivity`. If ``None``, does not check for ``standard_name``. long_name : str, optional An unconstrained description of the - :class:`~iris.experimental.ugrid.mesh.Connectivity`. If ``None``, + :class:`~iris.ugrid.mesh.Connectivity`. If ``None``, does not check for ``long_name``. var_name : str, optional The NetCDF variable name of the desired - :class:`~iris.experimental.ugrid.mesh.Connectivity`. If ``None``, + :class:`~iris.ugrid.mesh.Connectivity`. If ``None``, does not check for ``var_name``. attributes : dict, optional A dictionary of attributes desired on the - :class:`~iris.experimental.ugrid.mesh.Connectivity`. If ``None``, + :class:`~iris.ugrid.mesh.Connectivity`. If ``None``, does not check for ``attributes``. cf_role : str, optional The UGRID ``cf_role`` of the desired - :class:`~iris.experimental.ugrid.mesh.Connectivity`. + :class:`~iris.ugrid.mesh.Connectivity`. contains_node : bool, optional Contains the ``node`` element as part of the - :attr:`~iris.experimental.ugrid.metadata.ConnectivityMetadata.cf_role` + :attr:`~iris.ugrid.metadata.ConnectivityMetadata.cf_role` in the list of objects to be matched. contains_edge : bool, optional Contains the ``edge`` element as part of the - :attr:`~iris.experimental.ugrid.metadata.ConnectivityMetadata.cf_role` + :attr:`~iris.ugrid.metadata.ConnectivityMetadata.cf_role` in the list of objects to be matched. contains_face : bool, optional Contains the ``face`` element as part of the - :attr:`~iris.experimental.ugrid.metadata.ConnectivityMetadata.cf_role` + :attr:`~iris.ugrid.metadata.ConnectivityMetadata.cf_role` in the list of objects to be matched. Returns ------- - :class:`~iris.experimental.ugrid.mesh.Connectivity` - The :class:`~iris.experimental.ugrid.mesh.Connectivity` from the + :class:`~iris.ugrid.mesh.Connectivity` + The :class:`~iris.ugrid.mesh.Connectivity` from the :class:`MeshXY` that matched the given criteria. """ @@ -1677,9 +1677,9 @@ def remove_connectivities( contains_edge=None, contains_face=None, ): - """Remove one or more :class:`~iris.experimental.ugrid.mesh.Connectivity`. + """Remove one or more :class:`~iris.ugrid.mesh.Connectivity`. - Remove one or more :class:`~iris.experimental.ugrid.mesh.Connectivity` + Remove one or more :class:`~iris.ugrid.mesh.Connectivity` from the :class:`MeshXY` that match the provided criteria. Criteria can be either specific properties or other objects with @@ -1697,44 +1697,44 @@ def remove_connectivities( * a connectivity or metadata instance equal to that of the desired objects e.g., - :class:`~iris.experimental.ugrid.mesh.Connectivity` or - :class:`~iris.experimental.ugrid.metadata.ConnectivityMetadata`. + :class:`~iris.ugrid.mesh.Connectivity` or + :class:`~iris.ugrid.metadata.ConnectivityMetadata`. standard_name : str, optional The CF standard name of the desired - :class:`~iris.experimental.ugrid.mesh.Connectivity`. If ``None``, + :class:`~iris.ugrid.mesh.Connectivity`. If ``None``, does not check for ``standard_name``. long_name : str, optional An unconstrained description of the - :class:`~iris.experimental.ugrid.mesh.Connectivity`. If ``None``, + :class:`~iris.ugrid.mesh.Connectivity`. If ``None``, does not check for ``long_name``. var_name : str, optional The NetCDF variable name of the desired - :class:`~iris.experimental.ugrid.mesh.Connectivity`. If ``None``, + :class:`~iris.ugrid.mesh.Connectivity`. If ``None``, does not check for ``var_name``. attributes : dict, optional A dictionary of attributes desired on the - :class:`~iris.experimental.ugrid.mesh.Connectivity`. If ``None``, + :class:`~iris.ugrid.mesh.Connectivity`. If ``None``, does not check for ``attributes``. cf_role : str, optional The UGRID ``cf_role`` of the desired - :class:`~iris.experimental.ugrid.mesh.Connectivity`. + :class:`~iris.ugrid.mesh.Connectivity`. contains_node : bool, optional Contains the ``node`` element as part of the - :attr:`~iris.experimental.ugrid.metadata.ConnectivityMetadata.cf_role` + :attr:`~iris.ugrid.metadata.ConnectivityMetadata.cf_role` in the list of objects to be matched for potential removal. contains_edge : bool, optional Contains the ``edge`` element as part of the - :attr:`~iris.experimental.ugrid.metadata.ConnectivityMetadata.cf_role` + :attr:`~iris.ugrid.metadata.ConnectivityMetadata.cf_role` in the list of objects to be matched for potential removal. contains_face : bool, optional Contains the ``face`` element as part of the - :attr:`~iris.experimental.ugrid.metadata.ConnectivityMetadata.cf_role` + :attr:`~iris.ugrid.metadata.ConnectivityMetadata.cf_role` in the list of objects to be matched for potential removal. Returns ------- - list of :class:`~iris.experimental.ugrid.mesh.Connectivity` - A list of :class:`~iris.experimental.ugrid.mesh.Connectivity` + list of :class:`~iris.ugrid.mesh.Connectivity` + A list of :class:`~iris.ugrid.mesh.Connectivity` instances removed from the :class:`MeshXY` that matched the given criteria. @@ -1852,9 +1852,9 @@ def xml_element(self, doc): # # return the lazy AuxCoord(...), AuxCoord(...) def to_MeshCoord(self, location, axis): - """Generate a :class:`~iris.experimental.ugrid.mesh.MeshCoord`. + """Generate a :class:`~iris.ugrid.mesh.MeshCoord`. - Generate a :class:`~iris.experimental.ugrid.mesh.MeshCoord` that + Generate a :class:`~iris.ugrid.mesh.MeshCoord` that references the current :class:`MeshXY`, and passing through the ``location`` and ``axis`` arguments. @@ -1866,25 +1866,25 @@ def to_MeshCoord(self, location, axis): ---------- location : str The ``location`` argument for - :class:`~iris.experimental.ugrid.mesh.MeshCoord` instantiation. + :class:`~iris.ugrid.mesh.MeshCoord` instantiation. axis : str The ``axis`` argument for - :class:`~iris.experimental.ugrid.mesh.MeshCoord` instantiation. + :class:`~iris.ugrid.mesh.MeshCoord` instantiation. Returns ------- - :class:`~iris.experimental.ugrid.mesh.MeshCoord` - A :class:`~iris.experimental.ugrid.mesh.MeshCoord` referencing the + :class:`~iris.ugrid.mesh.MeshCoord` + A :class:`~iris.ugrid.mesh.MeshCoord` referencing the current :class:`MeshXY`. """ return MeshCoord(mesh=self, location=location, axis=axis) def to_MeshCoords(self, location): - r"""Generate a tuple of :class:`~iris.experimental.ugrid.mesh.MeshCoord`. + r"""Generate a tuple of :class:`~iris.ugrid.mesh.MeshCoord`. Generate a tuple of - :class:`~iris.experimental.ugrid.mesh.MeshCoord`, each referencing + :class:`~iris.ugrid.mesh.MeshCoord`, each referencing the current :class:`MeshXY`, one for each :attr:`AXES` value, passing through the ``location`` argument. @@ -1899,8 +1899,8 @@ def to_MeshCoords(self, location): Returns ------- - tuple of :class:`~iris.experimental.ugrid.mesh.MeshCoord` - Tuple of :class:`~iris.experimental.ugrid.mesh.MeshCoord` + tuple of :class:`~iris.ugrid.mesh.MeshCoord` + Tuple of :class:`~iris.ugrid.mesh.MeshCoord` referencing the current :class:`MeshXY`. One for each value in :attr:`AXES`, using the value for the ``axis`` argument. @@ -2651,8 +2651,8 @@ def face_node(self): class MeshCoord(AuxCoord): """Geographic coordinate values of data on an unstructured mesh. - A MeshCoord references a `~iris.experimental.ugrid.mesh.MeshXY`. - When contained in a `~iris.cube.Cube` it connects the cube to the MeshXY. + A MeshCoord references a `~iris.ugrid.mesh.MeshXY`. + When contained in a `~iris.cube.Cube` it connects the cube to the Mesh. It records (a) which 1-D cube dimension represents the unstructured mesh, and (b) which mesh 'location' the cube data is mapped to -- i.e. is it data on 'face's, 'edge's or 'node's. diff --git a/lib/iris/experimental/ugrid/metadata.py b/lib/iris/ugrid/metadata.py similarity index 97% rename from lib/iris/experimental/ugrid/metadata.py rename to lib/iris/ugrid/metadata.py index 28b9f413d9..0165852d5f 100644 --- a/lib/iris/experimental/ugrid/metadata.py +++ b/lib/iris/ugrid/metadata.py @@ -3,7 +3,7 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""The common metadata API classes for :mod:`iris.experimental.ugrid.mesh`. +"""The common metadata API classes for :mod:`iris.ugrid.mesh`. Eventual destination: :mod:`iris.common.metadata`. @@ -11,9 +11,9 @@ from functools import wraps -from ...common import BaseMetadata -from ...common.lenient import _lenient_service as lenient_service -from ...common.metadata import ( +from ..common import BaseMetadata +from ..common.lenient import _lenient_service as lenient_service +from ..common.metadata import ( SERVICES, SERVICES_COMBINE, SERVICES_DIFFERENCE, @@ -22,7 +22,7 @@ class ConnectivityMetadata(BaseMetadata): - """Metadata container for a :class:`~iris.experimental.ugrid.mesh.Connectivity`.""" + """Metadata container for a :class:`~iris.ugrid.mesh.Connectivity`.""" # The "location_axis" member is stateful only, and does not participate in # lenient/strict equivalence. @@ -139,7 +139,7 @@ def equal(self, other, lenient=None): class MeshMetadata(BaseMetadata): - """Metadata container for a :class:`~iris.experimental.ugrid.mesh.MeshXY`.""" + """Metadata container for a :class:`~iris.ugrid.mesh.MeshXY`.""" # The node_dimension", "edge_dimension" and "face_dimension" members are # stateful only; they not participate in lenient/strict equivalence. diff --git a/lib/iris/experimental/ugrid/save.py b/lib/iris/ugrid/save.py similarity index 87% rename from lib/iris/experimental/ugrid/save.py rename to lib/iris/ugrid/save.py index ddd7e5333c..79933cbd08 100644 --- a/lib/iris/experimental/ugrid/save.py +++ b/lib/iris/ugrid/save.py @@ -3,7 +3,7 @@ # This file is part of Iris and is released under the BSD license. # See LICENSE in the root of the repository for full licensing details. -"""Extension to Iris' NetCDF saving to allow :class:`~iris.experimental.ugrid.mesh.MeshXY` saving in UGRID format. +"""Extension to Iris' NetCDF saving to allow :class:`~iris.ugrid.mesh.MeshXY` saving in UGRID format. Eventual destination: :mod:`iris.fileformats.netcdf`. @@ -11,7 +11,7 @@ from collections.abc import Iterable -from ...fileformats import netcdf +from ..fileformats import netcdf def save_mesh(mesh, filename, netcdf_format="NETCDF4"): @@ -19,7 +19,7 @@ def save_mesh(mesh, filename, netcdf_format="NETCDF4"): Parameters ---------- - mesh : :class:`iris.experimental.ugrid.MeshXY` or iterable + mesh : :class:`iris.ugrid.MeshXY` or iterable Mesh(es) to save. filename : str Name of the netCDF file to create. diff --git a/lib/iris/experimental/ugrid/utils.py b/lib/iris/ugrid/utils.py similarity index 99% rename from lib/iris/experimental/ugrid/utils.py rename to lib/iris/ugrid/utils.py index b78545c42e..def9c1fccf 100644 --- a/lib/iris/experimental/ugrid/utils.py +++ b/lib/iris/ugrid/utils.py @@ -31,7 +31,7 @@ def recombine_submeshes( Describes the mesh and mesh-location onto which the all the ``submesh-cubes``' data are mapped, and acts as a template for the result. - Must have a :class:`~iris.experimental.ugrid.mesh.MeshXY`. + Must have a :class:`~iris.ugrid.mesh.MeshXY`. submesh_cubes : iterable of Cube, or Cube Cubes, each with data on a _subset_ of the ``mesh_cube`` datapoints