diff --git a/.github/workflows/ci-manifest.yml b/.github/workflows/ci-manifest.yml index dc5aa599d4..50c1cca34b 100644 --- a/.github/workflows/ci-manifest.yml +++ b/.github/workflows/ci-manifest.yml @@ -23,4 +23,4 @@ concurrency: jobs: manifest: name: "check-manifest" - uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.07.1 + uses: scitools/workflows/.github/workflows/ci-manifest.yml@2024.07.4 diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 8b7e732411..8a24cdbe7c 100644 --- a/.github/workflows/refresh-lockfiles.yml +++ b/.github/workflows/refresh-lockfiles.yml @@ -14,5 +14,5 @@ on: jobs: refresh_lockfiles: - uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.07.1 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2024.07.4 secrets: inherit diff --git a/benchmarks/benchmarks/sperf/equality.py b/benchmarks/benchmarks/sperf/equality.py index 3f70c6fd7f..f67935c9ef 100644 --- a/benchmarks/benchmarks/sperf/equality.py +++ b/benchmarks/benchmarks/sperf/equality.py @@ -13,7 +13,7 @@ class CubeEquality(FileMixin): r"""Benchmark time and memory costs. Benchmark time and memory costs of comparing :class:`~iris.cube.Cube`\\ s - with attached :class:`~iris.experimental.ugrid.mesh.Mesh`\\ es. + with attached :class:`~iris.experimental.ugrid.mesh.MeshXY`\\ es. Uses :class:`FileMixin` as the realistic case will be comparing :class:`~iris.cube.Cube`\\ s that have been loaded from file. diff --git a/benchmarks/benchmarks/unit_style/ugrid.py b/benchmarks/benchmarks/unit_style/ugrid.py index f29ae09015..e2f235eb28 100644 --- a/benchmarks/benchmarks/unit_style/ugrid.py +++ b/benchmarks/benchmarks/unit_style/ugrid.py @@ -80,7 +80,7 @@ def setup(self, n_faces): self.object = self.create() -class Mesh(UGridCommon): +class MeshXY(UGridCommon): def setup(self, n_faces, lazy=False): #### # Steal everything from the sample mesh for benchmarking creation of a @@ -93,9 +93,8 @@ def setup(self, n_faces, lazy=False): ) def get_coords_and_axes(location): - search_kwargs = {f"include_{location}s": True} return [ - (source_mesh.coord(axis=axis, **search_kwargs), axis) + (source_mesh.coord(axis=axis, location=location), axis) for axis in ("x", "y") ] @@ -114,7 +113,7 @@ def get_coords_and_axes(location): self.node_x = self.object.node_coords.node_x # Kwargs for reuse in search and remove methods. self.connectivities_kwarg = dict(cf_role="edge_node_connectivity") - self.coords_kwarg = dict(include_faces=True) + self.coords_kwarg = dict(location="face") # TODO: an opportunity for speeding up runtime if needed, since # eq_object is not needed for all benchmarks. Just don't generate it @@ -124,7 +123,7 @@ def get_coords_and_axes(location): self.eq_object = deepcopy(self.object) def create(self): - return ugrid.Mesh(**self.mesh_kwargs) + return ugrid.MeshXY(**self.mesh_kwargs) def time_add_connectivities(self, n_faces): self.object.add_connectivities(self.face_node) @@ -149,8 +148,8 @@ def time_remove_coords(self, n_faces): @disable_repeat_between_setup -class MeshLazy(Mesh): - """Lazy equivalent of :class:`Mesh`.""" +class MeshXYLazy(MeshXY): + """Lazy equivalent of :class:`MeshXY`.""" def setup(self, n_faces, lazy=True): super().setup(n_faces, lazy=lazy) diff --git a/docs/src/further_topics/ugrid/data_model.rst b/docs/src/further_topics/ugrid/data_model.rst index cad461340d..d7282c71d8 100644 --- a/docs/src/further_topics/ugrid/data_model.rst +++ b/docs/src/further_topics/ugrid/data_model.rst @@ -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.Mesh` that describes the + | The :class:`iris.experimental.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,7 +320,7 @@ 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.Mesh`. +associated :class:`~iris.experimental.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. @@ -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, Mesh + from iris.experimental.ugrid import Connectivity, MeshXY node_x = AuxCoord( points=[0.0, 5.0, 0.0, 5.0, 8.0], @@ -368,7 +368,7 @@ the :class:`~iris.cube.Cube`\'s unstructured dimension. ] return [(x, "x"), (y, "y")] - my_mesh = Mesh( + my_mesh = MeshXY( long_name="my_mesh", topology_dimension=2, node_coords_and_axes=[(node_x, "x"), (node_y, "y")], @@ -416,41 +416,41 @@ the :class:`~iris.cube.Cube`\'s unstructured dimension. 0 >>> print(edge_cube.mesh.summary(shorten=True)) - + The Detail ---------- How UGRID information is stored ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -* | :class:`iris.experimental.ugrid.Mesh` +* | :class:`iris.experimental.ugrid.MeshXY` | Contains all information about the mesh. | Includes: - * | :attr:`~iris.experimental.ugrid.Mesh.topology_dimension` + * | :attr:`~iris.experimental.ugrid.MeshXY.topology_dimension` | The maximum dimensionality of shape (1D=edge, 2D=face) supported - by this :class:`~iris.experimental.ugrid.Mesh`. Determines which + by this :class:`~iris.experimental.ugrid.MeshXY`. Determines which :class:`~iris.experimental.ugrid.Connectivity`\s are required/optional (see below). * 1-3 collections of :class:`iris.coords.AuxCoord`\s: - * | **Required**: :attr:`~iris.experimental.ugrid.Mesh.node_coords` + * | **Required**: :attr:`~iris.experimental.ugrid.MeshXY.node_coords` | The nodes that are the basis for the mesh. - * | Optional: :attr:`~iris.experimental.ugrid.Mesh.edge_coords`, - :attr:`~iris.experimental.ugrid.Mesh.face_coords` + * | Optional: :attr:`~iris.experimental.ugrid.MeshXY.edge_coords`, + :attr:`~iris.experimental.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.Mesh` currently (``Jan 2022``) + a :class:`~iris.experimental.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: * | **Required for 1D (edge) elements**: - :attr:`~iris.experimental.ugrid.Mesh.edge_node_connectivity` + :attr:`~iris.experimental.ugrid.MeshXY.edge_node_connectivity` | Define the edges by connecting nodes. * | **Required for 2D (face) elements**: - :attr:`~iris.experimental.ugrid.Mesh.face_node_connectivity` + :attr:`~iris.experimental.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 @@ -459,7 +459,7 @@ How UGRID information is stored .. doctest:: ugrid_summaries >>> print(edge_cube.mesh) - Mesh : 'my_mesh' + MeshXY : 'my_mesh' topology_dimension: 2 node node_dimension: 'Mesh2d_node' @@ -485,7 +485,7 @@ How UGRID information is stored | Stores the following information: * | :attr:`~iris.experimental.ugrid.MeshCoord.mesh` - | The :class:`~iris.experimental.ugrid.Mesh` associated with this + | The :class:`~iris.experimental.ugrid.MeshXY` associated with this :class:`~iris.experimental.ugrid.MeshCoord`. This determines the :attr:`~iris.cube.Cube.mesh` attribute of any :class:`~iris.cube.Cube` this :class:`~iris.experimental.ugrid.MeshCoord` is attached to (see @@ -503,7 +503,7 @@ How UGRID information is stored MeshCoords ~~~~~~~~~~ -Links a :class:`~iris.cube.Cube` to a :class:`~iris.experimental.ugrid.Mesh` by +Links a :class:`~iris.cube.Cube` to a :class:`~iris.experimental.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 @@ -512,22 +512,22 @@ dimensions (e.g. horizontal mesh plus vertical levels and a time series), using the same logic for every dimension. :class:`~iris.experimental.ugrid.MeshCoord`\s are instantiated using a given -:class:`~iris.experimental.ugrid.Mesh`, ``location`` +:class:`~iris.experimental.ugrid.MeshXY`, ``location`` ("node"/"edge"/"face") and ``axis``. The process interprets the -:class:`~iris.experimental.ugrid.Mesh`\'s -:attr:`~iris.experimental.ugrid.Mesh.node_coords` and if appropriate the -:attr:`~iris.experimental.ugrid.Mesh.edge_node_connectivity`/ -:attr:`~iris.experimental.ugrid.Mesh.face_node_connectivity` and -:attr:`~iris.experimental.ugrid.Mesh.edge_coords`/ -:attr:`~iris.experimental.ugrid.Mesh.face_coords` +: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` to produce a :class:`~iris.coords.Coord` :attr:`~iris.coords.Coord.points` and :attr:`~iris.coords.Coord.bounds` -representation of all the :class:`~iris.experimental.ugrid.Mesh`\'s +representation of all the :class:`~iris.experimental.ugrid.MeshXY`\'s nodes/edges/faces for the given axis. -The method :meth:`iris.experimental.ugrid.Mesh.to_MeshCoords` is available to +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.Mesh`, +every axis represented by that :class:`~iris.experimental.ugrid.MeshXY`, given only the ``location`` argument .. doctest:: ugrid_summaries @@ -535,7 +535,7 @@ given only the ``location`` argument >>> for coord in edge_cube.coords(mesh_coords=True): ... print(coord) MeshCoord : latitude / (degrees_north) - mesh: + mesh: location: 'edge' points: [3. , 1.5, 1.5, 1.5, 0. , 0. ] bounds: [ @@ -550,7 +550,7 @@ given only the ``location`` argument standard_name: 'latitude' axis: 'y' MeshCoord : longitude / (degrees_east) - mesh: + mesh: location: 'edge' points: [2.5, 0. , 5. , 6.5, 2.5, 6.5] bounds: [ diff --git a/docs/src/further_topics/ugrid/operations.rst b/docs/src/further_topics/ugrid/operations.rst index 8c01b8eae5..80ff284f66 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, Mesh + >>> from iris.experimental.ugrid import Connectivity, MeshXY # Going to create the following mesh # (node indices are shown to aid understanding): @@ -102,7 +102,7 @@ subsequent example operations on this page. ... indices=face_indices, cf_role="face_node_connectivity" ... ) - >>> my_mesh = Mesh( + >>> my_mesh = MeshXY( ... long_name="my_mesh", ... topology_dimension=2, # Supports 2D (face) elements. ... node_coords_and_axes=[(node_x, "x"), (node_y, "y")], @@ -112,7 +112,7 @@ subsequent example operations on this page. ... ) >>> print(my_mesh) - Mesh : 'my_mesh' + MeshXY : 'my_mesh' topology_dimension: 2 node node_dimension: 'Mesh2d_node' @@ -143,7 +143,7 @@ Making a Cube (with a Mesh) .. rubric:: |tagline: making a cube| Creating a :class:`~iris.cube.Cube` is unchanged; the -:class:`~iris.experimental.ugrid.Mesh` is linked via a +:class:`~iris.experimental.ugrid.MeshXY` is linked via a :class:`~iris.experimental.ugrid.MeshCoord` (see :ref:`ugrid MeshCoords`): .. dropdown:: 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.Mesh` and automatically +has an associated :class:`~iris.experimental.ugrid.MeshXY` and automatically saves the file in a UGRID-conformant format: .. dropdown:: Code @@ -283,7 +283,7 @@ saves the file in a UGRID-conformant format: The :func:`iris.experimental.ugrid.save_mesh` function allows -:class:`~iris.experimental.ugrid.Mesh`\es to be saved to file without +:class:`~iris.experimental.ugrid.MeshXY`\es to be saved to file without associated :class:`~iris.cube.Cube`\s: .. dropdown:: Code @@ -412,7 +412,7 @@ etcetera: .. note:: We recommend caution if constraining on coordinates associated with a - :class:`~iris.experimental.ugrid.Mesh`. An individual coordinate value + :class:`~iris.experimental.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 @@ -420,7 +420,7 @@ etcetera: The :func:`iris.experimental.ugrid.load_mesh` and :func:`~iris.experimental.ugrid.load_meshes` functions allow only -:class:`~iris.experimental.ugrid.Mesh`\es to be loaded from a file without +:class:`~iris.experimental.ugrid.MeshXY`\es to be loaded from a file without creating any associated :class:`~iris.cube.Cube`\s: .. dropdown:: Code @@ -434,7 +434,7 @@ creating any associated :class:`~iris.cube.Cube`\s: ... loaded_mesh = load_mesh(cubelist_path) >>> print(loaded_mesh) - Mesh : 'my_mesh' + MeshXY : 'my_mesh' topology_dimension: 2 node node_dimension: 'Mesh2d_node' @@ -545,7 +545,7 @@ unrelated to spatial position**. This means that subsetted as intended, and subsetting a :class:`~iris.experimental.ugrid.MeshCoord` is therefore set to return an :class:`~iris.coords.AuxCoord` instead - breaking the link between :class:`~iris.cube.Cube` and -:class:`~iris.experimental.ugrid.Mesh`: +:class:`~iris.experimental.ugrid.MeshXY`: .. dropdown:: Code :icon: code @@ -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.Mesh` (or on the same **grid** in the case of +:class:`~iris.experimental.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.Mesh` comparison is supported, and comparing -two ':class:`~iris.experimental.ugrid.Mesh`-:class:`~iris.cube.Cube`\s' will +:class:`~iris.experimental.ugrid.MeshXY` comparison is supported, and comparing +two ':class:`~iris.experimental.ugrid.MeshXY`-:class:`~iris.cube.Cube`\s' will include a comparison of the respective -:class:`~iris.experimental.ugrid.Mesh`\es, with no extra action needed by the +:class:`~iris.experimental.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.Mesh`\es, but note that - :class:`~iris.experimental.ugrid.Mesh`\ equality is enabled for lazy + :class:`~iris.experimental.ugrid.MeshXY`\es, but note that + :class:`~iris.experimental.ugrid.MeshXY`\ equality is enabled for lazy processing (:doc:`/userguide/real_and_lazy_data`), so if the - :class:`~iris.experimental.ugrid.Mesh`\es being compared are lazy the + :class:`~iris.experimental.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.Mesh`\es is not possible - a +:class:`~iris.experimental.ugrid.MeshXY`\es is not possible - a :class:`~iris.cube.Cube` must be associated with just a single -:class:`~iris.experimental.ugrid.Mesh`, and merge/concatenate are not yet -capable of combining multiple :class:`~iris.experimental.ugrid.Mesh`\es into +:class:`~iris.experimental.ugrid.MeshXY`, and merge/concatenate are not yet +capable of combining multiple :class:`~iris.experimental.ugrid.MeshXY`\es into one. :class:`~iris.cube.Cube`\s that include :class:`~iris.experimental.ugrid.MeshCoord`\s can still be merged/concatenated on dimensions other than the :meth:`~iris.cube.Cube.mesh_dim`, since such :class:`~iris.cube.Cube`\s will by definition share the same -:class:`~iris.experimental.ugrid.Mesh`. +:class:`~iris.experimental.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.Mesh` + for a very specific type of :class:`~iris.experimental.ugrid.MeshXY` combination not detailed here. Arithmetic diff --git a/docs/src/further_topics/ugrid/other_meshes.rst b/docs/src/further_topics/ugrid/other_meshes.rst index 2fcbeda0d0..df83c8c4f6 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.Mesh`. +:class:`~iris.experimental.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 Mesh + >>> from iris.experimental.ugrid import MeshXY >>> temperature_cube = iris.load_cube("my_file.nc", "sea_surface_temperature") @@ -62,7 +62,7 @@ as the **nodes** when creating the Iris # Use a Mesh to represent the Cube's horizontal geography, by replacing # the existing face AuxCoords with new MeshCoords. - >>> fesom_mesh = Mesh.from_coords(temperature_cube.coord('longitude'), + >>> fesom_mesh = MeshXY.from_coords(temperature_cube.coord('longitude'), ... temperature_cube.coord('latitude')) >>> for new_coord in fesom_mesh.to_MeshCoords("face"): ... old_coord = temperature_cube.coord(new_coord.name()) @@ -85,7 +85,7 @@ as the **nodes** when creating the Iris ... >>> print(temperature_cube.mesh) - Mesh : 'unknown' + MeshXY : 'unknown' topology_dimension: 2 node node_dimension: 'Mesh2d_node' @@ -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.Mesh`. +:class:`~iris.experimental.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 Mesh + >>> from iris.experimental.ugrid import MeshXY >>> import numpy as np @@ -177,7 +177,7 @@ as the **nodes** when creating the Iris # Use a Mesh to represent the Cube's horizontal geography, by replacing # the existing face AuxCoords with new MeshCoords. - >>> smc_mesh = Mesh.from_coords(faces_x, faces_y) + >>> smc_mesh = MeshXY.from_coords(faces_x, faces_y) >>> for new_coord in smc_mesh.to_MeshCoords("face"): ... old_coord = wave_cube.coord(new_coord.name()) ... unstructured_dim, = old_coord.cube_dims(wave_cube) @@ -209,7 +209,7 @@ as the **nodes** when creating the Iris ... >>> print(wave_cube.mesh) - Mesh : 'unknown' + MeshXY : 'unknown' topology_dimension: 2 node node_dimension: 'Mesh2d_node' @@ -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 Mesh, Connectivity + >>> from iris.experimental.ugrid.mesh import MeshXY, Connectivity >>> filepath = iris.sample_data_path('orca2_votemper.nc') @@ -313,14 +313,14 @@ dimensions into a single mesh dimension. Since Iris cubes don't support a "resh ... ) >>> # Create a mesh object. - >>> mesh = Mesh( + >>> mesh = MeshXY( ... topology_dimension=2, ... node_coords_and_axes=[(node_x_co, 'x'), (node_y_co, 'y')], ... connectivities=face_nodes_conn, ... face_coords_and_axes=[(face_x_co, 'x'), (face_y_co, 'y')] ... ) >>> print(mesh) - Mesh : 'unknown' + MeshXY : 'unknown' topology_dimension: 2 node node_dimension: 'Mesh2d_node' diff --git a/docs/src/further_topics/ugrid/partner_packages.rst b/docs/src/further_topics/ugrid/partner_packages.rst index 1c7a8b8c8c..87a61ae0fe 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.Mesh` in mind. +:class:`~iris.experimental.ugrid.MeshXY` in mind. Applications ------------ diff --git a/docs/src/whatsnew/3.2.rst b/docs/src/whatsnew/3.2.rst index ce544a5ecc..387cb32a26 100644 --- a/docs/src/whatsnew/3.2.rst +++ b/docs/src/whatsnew/3.2.rst @@ -64,34 +64,34 @@ v3.2.1 (11 Mar 2022) :pull:`4053`, :pull:`4439`) and API (:pull:`4063`, :pull:`4064`), and supporting representation (:pull:`4033`, :pull:`4054`) of data on meshes. Most of this new API can be found in :mod:`iris.experimental.ugrid`. The key - objects introduced are :class:`iris.experimental.ugrid.mesh.Mesh`, + objects introduced are :class:`iris.experimental.ugrid.mesh.MeshXY`, :class:`iris.experimental.ugrid.mesh.MeshCoord` and :obj:`iris.experimental.ugrid.load.PARSE_UGRID_ON_LOAD`. - A :class:`~iris.experimental.ugrid.mesh.Mesh` contains a full description of a UGRID + A :class:`~iris.experimental.ugrid.mesh.MeshXY` contains a full description of a UGRID type mesh. :class:`~iris.experimental.ugrid.mesh.MeshCoord`\ s are coordinates that - reference and represent a :class:`~iris.experimental.ugrid.mesh.Mesh` for use + reference and represent a :class:`~iris.experimental.ugrid.mesh.MeshXY` for use on a :class:`~iris.cube.Cube`. :class:`~iris.cube.Cube`\ s are also given the property :attr:`~iris.cube.Cube.mesh` which returns a - :class:`~iris.experimental.ugrid.mesh.Mesh` if one is attached to the + :class:`~iris.experimental.ugrid.mesh.MeshXY` if one is attached to the :class:`~iris.cube.Cube` via a :class:`~iris.experimental.ugrid.mesh.MeshCoord`. #. `@trexfeathers`_ added support for loading unstructured mesh data from netcdf data, for files using the `CF-UGRID`_ conventions. The context manager :obj:`~iris.experimental.ugrid.load.PARSE_UGRID_ON_LOAD` provides a way to load UGRID files so that :class:`~iris.cube.Cube`\ s can be - returned with a :class:`~iris.experimental.ugrid.mesh.Mesh` attached. + returned with a :class:`~iris.experimental.ugrid.mesh.MeshXY` attached. (:pull:`4058`). #. `@pp-mo`_ added support to save cubes with :ref:`meshes ` to netcdf files, using the `CF-UGRID`_ conventions. The existing :meth:`iris.save` function now does this, when saving cubes with meshes. A routine :meth:`iris.experimental.ugrid.save.save_mesh` allows saving - :class:`~iris.experimental.ugrid.mesh.Mesh` objects to netcdf *without* any associated data + :class:`~iris.experimental.ugrid.mesh.MeshXY` objects to netcdf *without* any associated data (i.e. not attached to cubes). (:pull:`4318` and :pull:`4339`). -#. `@trexfeathers`_ added :meth:`iris.experimental.ugrid.mesh.Mesh.from_coords` - for inferring a :class:`~iris.experimental.ugrid.mesh.Mesh` from an +#. `@trexfeathers`_ added :meth:`iris.experimental.ugrid.mesh.MeshXY.from_coords` + for inferring a :class:`~iris.experimental.ugrid.mesh.MeshXY` from an appropriate collection of :class:`iris.coords.Coord`\ s. #. `@larsbarring`_ updated :func:`~iris.util.equalise_attributes` to return a list of dictionaries @@ -130,7 +130,7 @@ v3.2.1 (11 Mar 2022) :class:`~iris.coords.Coord`, :class:`~iris.coords.CellMeasure`, :class:`~iris.coords.AncillaryVariable`, :class:`~iris.experimental.ugrid.mesh.MeshCoord` and - :class:`~iris.experimental.ugrid.mesh.Mesh`. + :class:`~iris.experimental.ugrid.mesh.MeshXY`. These now all provide a more controllable ``summary()`` method, and more convenient and readable ``str()`` and ``repr()`` output in the style of the :class:`iris.cube.Cube`. diff --git a/docs/src/whatsnew/3.7.rst b/docs/src/whatsnew/3.7.rst index f5070b341d..fdadb20412 100644 --- a/docs/src/whatsnew/3.7.rst +++ b/docs/src/whatsnew/3.7.rst @@ -70,7 +70,7 @@ v3.7.1 (04 Mar 2024) (:pull:`5382`) #. `@trexfeathers`_ included mesh location coordinates - (e.g. :attr:`~iris.experimental.ugrid.Mesh.face_coords`) in + (e.g. :attr:`~iris.experimental.ugrid.MeshXY.face_coords`) in the data variable's ``coordinates`` attribute when saving to NetCDF. (:issue:`5206`, :pull:`5389`) diff --git a/docs/src/whatsnew/latest.rst b/docs/src/whatsnew/latest.rst index a6915c4170..2976ae56ca 100644 --- a/docs/src/whatsnew/latest.rst +++ b/docs/src/whatsnew/latest.rst @@ -39,6 +39,12 @@ This document explains the changes made to Iris for this release the :class:`~iris.cube.Cube` :attr:`~iris.cube.Cube.mesh_dim` (see :ref:`cube-statistics-collapsing`). (:issue:`5377`, :pull:`6003`) +#. `@pp-mo`_ made a MeshCoord inherit a coordinate system from its location coord, + as it does its metadata. N.B. mesh location coords can not however load a + coordinate system from netcdf at present, as this needs the 'extended' + grid-mappping syntax -- see : :issue:`3388`. + (:issue:`5562`, :pull:`6016`) + 🐛 Bugs Fixed ============= @@ -53,6 +59,10 @@ This document explains the changes made to Iris for this release #. `@pp-mo`_ corrected the use of mesh dimensions when saving with multiple meshes. (:issue:`5908`, :pull:`6004`) +#. `@trexfeathers`_ fixed the datum :class:`python:FutureWarning` to only be raised if + the ``datum_support`` :class:`~iris.Future` flag is disabled AND a datum is + present on the loaded NetCDF grid mapping. (:issue:`5749`, :pull:`6050`) + 💣 Incompatible Changes ======================= @@ -67,6 +77,17 @@ This document explains the changes made to Iris for this release This is due to changes in :func:`~iris.util.array_equal` which previously ignored masks entirely. (:pull:`4457`) +#. `@trexfeathers`_ renamed the ``Mesh`` class to + :class:`~iris.experimental.ugrid.mesh.MeshXY`, in preparation for a future + more flexible parent class (:class:`~iris.experimental.ugrid.mesh.Mesh`). + (:issue:`6052` :pull:`6056`) + +#. `@stephenworsley`_ replaced the ``include_nodes``, ``include_edges`` and + ``include_faces`` arguments with a single ``location`` argument in the + :class:`~iris.experimental.ugrid.Mesh` methods + :meth:`~iris.experimental.ugrid.Mesh.coord`, :meth:`~iris.experimental.ugrid.Mesh.coords` + and :meth:`~iris.experimental.ugrid.Mesh.remove_coords`. (:pull:`6055`) + 🚀 Performance Enhancements =========================== @@ -99,6 +120,17 @@ This document explains the changes made to Iris for this release now be used, currently being v7.2.6. (:pull:`5901`) +#. `@trexfeathers`_ updated the :mod:`iris.experimental.geovista` + documentation's use of :class:`geovista.geodesic.BBox` + to be compatible with GeoVista v0.5, as well as previous versions. + (:pull:`6064`) + +#. `@pp-mo`_ temporarily pinned matplotlib to ">=3.5, !=3.9.1", to avoid current CI + test failures on plot results, apparently due to a matplotlib bug. + See : https://github.com/matplotlib/matplotlib/issues/28567 + (:pull:`6065`) + + 📚 Documentation ================ diff --git a/lib/iris/cube.py b/lib/iris/cube.py index 5c7f9da0eb..47b66b6ead 100644 --- a/lib/iris/cube.py +++ b/lib/iris/cube.py @@ -2365,16 +2365,16 @@ def _any_meshcoord(self): @property def mesh(self): - r"""Return the unstructured :class:`~iris.experimental.ugrid.Mesh` associated with the cube. + r"""Return the unstructured :class:`~iris.experimental.ugrid.MeshXY` associated with the cube. - Return the unstructured :class:`~iris.experimental.ugrid.Mesh` + Return the unstructured :class:`~iris.experimental.ugrid.MeshXY` associated with the cube, if the cube has any :class:`~iris.experimental.ugrid.MeshCoord`, or ``None`` if it has none. Returns ------- - :class:`iris.experimental.ugrid.mesh.Mesh` or None + :class:`iris.experimental.ugrid.mesh.MeshXY` or None The mesh of the cube :class:`~iris.experimental.ugrid.MeshCoord`'s, or ``None``. diff --git a/lib/iris/experimental/geovista.py b/lib/iris/experimental/geovista.py index 26bfa2e703..206f2a8c97 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 Mesh +from iris.experimental.ugrid import MeshXY def _get_coord(cube, axis): @@ -231,7 +231,7 @@ def extract_unstructured_region(cube, polydata, region, **kwargs): The parameters of :func:`extract_unstructured_region` have been designed with flexibility and reuse in mind. This is demonstrated below. - >>> from geovista import BBox + >>> from geovista.geodesic import BBox >>> from iris.experimental.geovista import cube_to_polydata, extract_unstructured_region >>> print(cube_w_mesh.shape) (72, 96) @@ -322,7 +322,7 @@ def extract_unstructured_region(cube, polydata, region, **kwargs): if recreate_mesh: coords_on_mesh_dim = region_cube.coords(dimensions=mesh_dim) - new_mesh = Mesh.from_coords( + new_mesh = MeshXY.from_coords( *[c for c in coords_on_mesh_dim if c.has_bounds()] ) diff --git a/lib/iris/experimental/ugrid/__init__.py b/lib/iris/experimental/ugrid/__init__.py index f92cf670c4..05f631d1cc 100644 --- a/lib/iris/experimental/ugrid/__init__.py +++ b/lib/iris/experimental/ugrid/__init__.py @@ -16,14 +16,14 @@ from ...config import get_logger from .load import PARSE_UGRID_ON_LOAD, load_mesh, load_meshes -from .mesh import Connectivity, Mesh, MeshCoord +from .mesh import Connectivity, MeshCoord, MeshXY from .save import save_mesh from .utils import recombine_submeshes __all__ = [ "Connectivity", - "Mesh", "MeshCoord", + "MeshXY", "PARSE_UGRID_ON_LOAD", "load_mesh", "load_meshes", diff --git a/lib/iris/experimental/ugrid/load.py b/lib/iris/experimental/ugrid/load.py index 24fb34bbac..d4e6d8afc3 100644 --- a/lib/iris/experimental/ugrid/load.py +++ b/lib/iris/experimental/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.Mesh`. +r"""Allow the construction of :class:`~iris.experimental.ugrid.mesh.MeshXY`. Extensions to Iris' NetCDF loading to allow the construction of -:class:`~iris.experimental.ugrid.mesh.Mesh` from UGRID data in the file. +:class:`~iris.experimental.ugrid.mesh.MeshXY` from UGRID data in the file. Eventual destination: :mod:`iris.fileformats.netcdf`. @@ -31,7 +31,7 @@ CFUGridMeshVariable, CFUGridReader, ) -from .mesh import Connectivity, Mesh +from .mesh import Connectivity, MeshXY # Configure the logger. logger = get_logger(__name__, propagate=True, handler=False) @@ -119,10 +119,10 @@ def _meshes_from_cf(cf_reader): def load_mesh(uris, var_name=None): - """Load a single :class:`~iris.experimental.ugrid.mesh.Mesh` object from one or more NetCDF files. + """Load single :class:`~iris.experimental.ugrid.mesh.MeshXY` object from 1/more NetCDF files. Raises an error if more/less than one - :class:`~iris.experimental.ugrid.mesh.Mesh` is found. + :class:`~iris.experimental.ugrid.mesh.MeshXY` is found. Parameters ---------- @@ -130,12 +130,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.Mesh` if its + Only return a :class:`~iris.experimental.ugrid.mesh.MeshXY` if its var_name matches this value. Returns ------- - :class:`iris.experimental.ugrid.mesh.Mesh` + :class:`iris.experimental.ugrid.mesh.MeshXY` """ meshes_result = load_meshes(uris, var_name) @@ -148,7 +148,7 @@ def load_mesh(uris, var_name=None): def load_meshes(uris, var_name=None): - r"""Load :class:`~iris.experimental.ugrid.mesh.Mesh` objects from one or more NetCDF files. + r"""Load :class:`~iris.experimental.ugrid.mesh.MeshXY` objects from one or more NetCDF files. Parameters ---------- @@ -156,7 +156,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.Mesh` that have + Only return :class:`~iris.experimental.ugrid.mesh.MeshXY` that have var_names matching this value. Returns @@ -164,7 +164,7 @@ 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.Mesh` returned from each. + :class:`~iris.experimental.ugrid.mesh.MeshXY` returned from each. """ # TODO: rationalise UGRID/mesh handling once experimental.ugrid is folded @@ -334,9 +334,9 @@ def _build_connectivity(connectivity_var, file_path, element_dims): def _build_mesh(cf, mesh_var, file_path): - """Construct a :class:`~iris.experimental.ugrid.mesh.Mesh`. + """Construct a :class:`~iris.experimental.ugrid.mesh.MeshXY`. - Construct a :class:`~iris.experimental.ugrid.mesh.Mesh` from a given + Construct a :class:`~iris.experimental.ugrid.mesh.MeshXY` from a given :class:`~iris.experimental.ugrid.cf.CFUGridMeshVariable`. TODO: integrate with standard loading API post-pyke. @@ -374,7 +374,7 @@ def _build_mesh(cf, mesh_var, file_path): if not hasattr(mesh_var, "topology_dimension"): msg = ( - f"Mesh variable {mesh_var.cf_name} has no 'topology_dimension'" + f"MeshXY variable {mesh_var.cf_name} has no 'topology_dimension'" f" : *Assuming* topology_dimension={topology_dimension}" ", consistent with the attached connectivities." ) @@ -444,7 +444,7 @@ def _build_mesh(cf, mesh_var, file_path): standard_name, long_name, var_name = get_names(mesh_var, None, attributes) - mesh = Mesh( + mesh = MeshXY( topology_dimension=topology_dimension, node_coords_and_axes=node_coord_args, connectivities=connectivity_args, @@ -472,7 +472,7 @@ def _build_mesh_coords(mesh, cf_var): """Construct a tuple of :class:`~iris.experimental.ugrid.mesh.MeshCoord`. Construct a tuple of :class:`~iris.experimental.ugrid.mesh.MeshCoord` using - from a given :class:`~iris.experimental.ugrid.mesh.Mesh` + from a given :class:`~iris.experimental.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/experimental/ugrid/mesh.py index 2c07daa481..c90b67e1d6 100644 --- a/lib/iris/experimental/ugrid/mesh.py +++ b/lib/iris/experimental/ugrid/mesh.py @@ -39,7 +39,7 @@ NP_PRINTOPTIONS_EDGEITEMS = 2 # -# Mesh dimension names namedtuples. +# MeshXY dimension names namedtuples. # #: Namedtuple for 1D mesh topology NetCDF variable dimension names. @@ -50,7 +50,7 @@ ) # -# Mesh coordinate manager namedtuples. +# MeshXY coordinate manager namedtuples. # #: Namedtuple for 1D mesh :class:`~iris.coords.AuxCoord` coordinates. @@ -68,7 +68,7 @@ MeshFaceCoords = namedtuple("MeshFaceCoords", ["face_x", "face_y"]) # -# Mesh connectivity manager namedtuples. +# MeshXY connectivity manager namedtuples. # #: Namedtuple for 1D mesh :class:`~iris.experimental.ugrid.mesh.Connectivity` instances. @@ -579,20 +579,60 @@ def xml_element(self, doc): return element -class Mesh(CFVariableMixin): +class Mesh(CFVariableMixin, ABC): """A container representing the UGRID ``cf_role`` ``mesh_topology``. - A container representing the UGRID ``cf_role`` ``mesh_topology``, supporting - 1D network, 2D triangular, and 2D flexible mesh topologies. + Warnings + -------- + This class is not yet implemented. It is a placeholder for a future + implementation of the UGRID mesh with the minimum possible assumptions. For + instance: it is in theory possible for mesh node coordinates to be ANY + combination of ANY coordinate type, e.g. spherical coordinates or an S2 + coordinate; the current :class:`MeshXY` subclass is based on the assumption + of an X and a Y coordinate (e.g. longitude and latitude). + + .. todo:: + If SciTools/iris#5994 is agreed upon: implement this class. + - Move whatever is appropriate from :class:`MeshXY` into this class, + leaving behind only those elements specific to the assumption of + X and Y node coordinates. + - Remove the docstring warning, the NotImplementedError, and the uses + of ABC/abstractmethod. + - Add a cross-reference in the docstring for :class:`MeshXY`. + - Search the Iris codebase for uses of :class:`MeshXY` and work out + if/how they can be refactored to work with the more flexible + :class:`Mesh`. - .. note:: + """ + + @abstractmethod + def __init__(self): + message = ( + f"The {self.__class__.__name__} class is not yet implemented. " + "Use the MeshXY class instead." + ) + raise NotImplementedError(message) + + +class MeshXY(Mesh): + """A container representing the UGRID ``cf_role`` ``mesh_topology``. + + A container representing the UGRID [1]_ ``cf_role`` ``mesh_topology``, supporting + 1D network, 2D triangular, and 2D flexible mesh topologies. - The 3D layered and fully 3D unstructured mesh topologies are not supported - at this time. + Based on the assumption of 2 :attr:`node_coords` - one associated with the + X-axis (e.g. longitude) and 1 with the Y-axis (e.g. latitude). UGRID + describing alternative node coordinates (e.g. spherical) cannot be + represented. - .. seealso:: + Notes + ----- + The 3D layered and fully 3D unstructured mesh topologies are not supported + at this time. - The UGRID Conventions, https://ugrid-conventions.github.io/ugrid-conventions/ + References + ---------- + .. [1] The UGRID Conventions, https://ugrid-conventions.github.io/ugrid-conventions/ """ @@ -620,7 +660,7 @@ def __init__( edge_dimension=None, face_dimension=None, ): - """Mesh initialise. + """MeshXY initialise. .. note:: @@ -697,38 +737,38 @@ def normalise(element, axis): @classmethod def from_coords(cls, *coords): - r"""Construct a :class:`Mesh` by derivation from one or more :class:`~iris.coords.Coord`. + r"""Construct a :class:`MeshXY` by derivation from 1/more :class:`~iris.coords.Coord`. - The :attr:`~Mesh.topology_dimension`, :class:`~iris.coords.Coord` + The :attr:`~MeshXY.topology_dimension`, :class:`~iris.coords.Coord` membership and :class:`Connectivity` membership are all determined based on the shape of the first :attr:`~iris.coords.Coord.bounds`: * ``None`` or ``(n, <2)``: Not supported * ``(n, 2)``: - :attr:`~Mesh.topology_dimension` = ``1``. - :attr:`~Mesh.node_coords` and :attr:`~Mesh.edge_node_connectivity` + :attr:`~MeshXY.topology_dimension` = ``1``. + :attr:`~MeshXY.node_coords` and :attr:`~MeshXY.edge_node_connectivity` constructed from :attr:`~iris.coords.Coord.bounds`. - :attr:`~Mesh.edge_coords` constructed from + :attr:`~MeshXY.edge_coords` constructed from :attr:`~iris.coords.Coord.points`. * ``(n, >=3)``: - :attr:`~Mesh.topology_dimension` = ``2``. - :attr:`~Mesh.node_coords` and :attr:`~Mesh.face_node_connectivity` + :attr:`~MeshXY.topology_dimension` = ``2``. + :attr:`~MeshXY.node_coords` and :attr:`~MeshXY.face_node_connectivity` constructed from :attr:`~iris.coords.Coord.bounds`. - :attr:`~Mesh.face_coords` constructed from + :attr:`~MeshXY.face_coords` constructed from :attr:`~iris.coords.Coord.points`. Parameters ---------- *coords : Iterable of :class:`~iris.coords.Coord` - Coordinates to pass into the :class:`Mesh`. + Coordinates to pass into the :class:`MeshXY`. All :attr:`~iris.coords.Coord.points` must have the same shapes; all :attr:`~iris.coords.Coord.bounds` must have the same shapes, and must not be ``None``. Returns ------- - :class:`Mesh` + :class:`MeshXY` Notes ----- @@ -737,7 +777,7 @@ def from_coords(cls, *coords): computational intensity. .. note:: - :class:`Mesh` currently requires ``X`` and ``Y`` + :class:`MeshXY` currently requires ``X`` and ``Y`` :class:`~iris.coords.Coord` specifically. :meth:`iris.util.guess_coord_axis` is therefore attempted, else the first two :class:`~iris.coords.Coord` are taken. @@ -747,7 +787,7 @@ def from_coords(cls, *coords): from iris import load_cube, sample_data_path from iris.experimental.ugrid import ( PARSE_UGRID_ON_LOAD, - Mesh, + MeshXY, MeshCoord, ) @@ -781,7 +821,7 @@ def from_coords(cls, *coords): latitude: AuxCoord longitude: AuxCoord - >>> new_mesh = Mesh.from_coords(*orig_coords) + >>> new_mesh = MeshXY.from_coords(*orig_coords) >>> new_coords = new_mesh.to_MeshCoords(location=cube_w_mesh.location) # Replace the AuxCoords with MeshCoords. @@ -900,7 +940,7 @@ def axes_assign(coord_list): def __eq__(self, other): result = NotImplemented - if isinstance(other, Mesh): + if isinstance(other, MeshXY): result = self.metadata == other.metadata if result: result = self.all_coords == other.all_coords @@ -928,12 +968,12 @@ def __ne__(self, other): return result def summary(self, shorten=False): - """Return a string representation of the Mesh. + """Return a string representation of the MeshXY. Parameters ---------- shorten : bool, default=False - If True, produce a oneline string form of the form . + If True, produce a oneline string form of the form . If False, produce a multi-line detailed print output. Returns @@ -963,11 +1003,11 @@ def _summary_oneline(self): mesh_name = None if mesh_name: # Use a more human-readable form - mesh_string = f"" + mesh_string = f"" else: # Mimic the generic object.__str__ style. mesh_id = id(self) - mesh_string = f"" + mesh_string = f"" return mesh_string @@ -981,7 +1021,7 @@ def line(text, i_indent=0): indent = indent_str * i_indent lines.append(f"{indent}{text}") - line(f"Mesh : '{self.name()}'") + line(f"MeshXY : '{self.name()}'") line(f"topology_dimension: {self.topology_dimension}", 1) for element in ("node", "edge", "face"): if element == "node": @@ -1002,8 +1042,7 @@ def line(text, i_indent=0): main_conn_string = main_conn.summary(shorten=True, linewidth=0) line(f"{main_conn_name}: {main_conn_string}", 2) # Print coords - include_key = f"include_{element}s" - coords = self.coords(**{include_key: True}) + coords = self.coords(location=element) if coords: line(f"{element} coordinates", 2) for coord in coords: @@ -1097,12 +1136,12 @@ 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:`Mesh`.""" + """All the :class:`~iris.experimental.ugrid.mesh.Connectivity` instances of the :class:`MeshXY`.""" return self._connectivity_manager.all_members @property def all_coords(self): - """All the :class:`~iris.coords.AuxCoord` coordinates of the :class:`Mesh`.""" + """All the :class:`~iris.coords.AuxCoord` coordinates of the :class:`MeshXY`.""" return self._coord_manager.all_members @property @@ -1111,14 +1150,14 @@ def boundary_node_connectivity(self): The *optional* UGRID ``boundary_node_connectivity`` :class:`~iris.experimental.ugrid.mesh.Connectivity` of the - :class:`Mesh`. + :class:`MeshXY`. """ return self._connectivity_manager.boundary_node @property def edge_coords(self): - """The *optional* UGRID ``edge`` :class:`~iris.coords.AuxCoord` coordinates of the :class:`Mesh`.""" + """The *optional* UGRID ``edge`` :class:`~iris.coords.AuxCoord` coordinates of the :class:`MeshXY`.""" return self._coord_manager.edge_coords @property @@ -1140,7 +1179,7 @@ def edge_face_connectivity(self): The *optional* UGRID ``edge_face_connectivity`` :class:`~iris.experimental.ugrid.mesh.Connectivity` of the - :class:`Mesh`. + :class:`MeshXY`. """ return self._connectivity_manager.edge_face @@ -1151,16 +1190,16 @@ def edge_node_connectivity(self): The UGRID ``edge_node_connectivity`` :class:`~iris.experimental.ugrid.mesh.Connectivity` of the - :class:`Mesh`, which is **required** for :attr:`Mesh.topology_dimension` + :class:`MeshXY`, which is **required** for :attr:`MeshXY.topology_dimension` of ``1``, and *optionally required* for - :attr:`Mesh.topology_dimension` ``>=2``. + :attr:`MeshXY.topology_dimension` ``>=2``. """ return self._connectivity_manager.edge_node @property def face_coords(self): - """The *optional* UGRID ``face`` :class:`~iris.coords.AuxCoord` coordinates of the :class:`Mesh`.""" + """The *optional* UGRID ``face`` :class:`~iris.coords.AuxCoord` coordinates of the :class:`MeshXY`.""" return self._coord_manager.face_coords @property @@ -1191,7 +1230,7 @@ def face_edge_connectivity(self): The *optional* UGRID ``face_edge_connectivity`` :class:`~iris.experimental.ugrid.mesh.Connectivity` of the - :class:`Mesh`. + :class:`MeshXY`. """ # optional @@ -1203,7 +1242,7 @@ def face_face_connectivity(self): The *optional* UGRID ``face_face_connectivity`` :class:`~iris.experimental.ugrid.mesh.Connectivity` of the - :class:`Mesh`. + :class:`MeshXY`. """ return self._connectivity_manager.face_face @@ -1214,8 +1253,8 @@ def face_node_connectivity(self): The UGRID ``face_node_connectivity`` :class:`~iris.experimental.ugrid.mesh.Connectivity` of the - :class:`Mesh`, which is **required** for :attr:`Mesh.topology_dimension` - of ``2``, and *optionally required* for :attr:`Mesh.topology_dimension` + :class:`MeshXY`, which is **required** for :attr:`MeshXY.topology_dimension` + of ``2``, and *optionally required* for :attr:`MeshXY.topology_dimension` of ``3``. """ @@ -1223,7 +1262,7 @@ def face_node_connectivity(self): @property def node_coords(self): - """The **required** UGRID ``node`` :class:`~iris.coords.AuxCoord` coordinates of the :class:`Mesh`.""" + """The **required** UGRID ``node`` :class:`~iris.coords.AuxCoord` coordinates of the :class:`MeshXY`.""" return self._coord_manager.node_coords @property @@ -1240,14 +1279,14 @@ 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:`Mesh`. + """Add one or more :class:`~iris.experimental.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 - add to the :class:`Mesh`. + add to the :class:`MeshXY`. """ self._connectivity_manager.add(*connectivities) @@ -1261,7 +1300,7 @@ def add_coords( face_x=None, face_y=None, ): - """Add one or more :class:`~iris.coords.AuxCoord` coordinates to the :class:`Mesh`. + """Add one or more :class:`~iris.coords.AuxCoord` coordinates to the :class:`MeshXY`. Parameters ---------- @@ -1308,14 +1347,14 @@ def connectivities( """Return all :class:`~iris.experimental.ugrid.mesh.Connectivity`. Return all :class:`~iris.experimental.ugrid.mesh.Connectivity` - instances from the :class:`Mesh` that match the provided criteria. + instances from the :class:`MeshXY` that match the provided criteria. Criteria can be either specific properties or other objects with metadata to be matched. .. seealso:: - :meth:`Mesh.connectivity` for matching exactly one connectivity. + :meth:`MeshXY.connectivity` for matching exactly one connectivity. Parameters ---------- @@ -1367,7 +1406,7 @@ def connectivities( ------- list of :class:`~iris.experimental.ugrid.mesh.Connectivity` A list of :class:`~iris.experimental.ugrid.mesh.Connectivity` - instances from the :class:`Mesh` that matched the given criteria. + instances from the :class:`MeshXY` that matched the given criteria. """ result = self._connectivity_manager.filters( @@ -1398,7 +1437,7 @@ def connectivity( """Return a single :class:`~iris.experimental.ugrid.mesh.Connectivity`. Return a single :class:`~iris.experimental.ugrid.mesh.Connectivity` - from the :class:`Mesh` that matches the provided criteria. + from the :class:`MeshXY` that matches the provided criteria. Criteria can be either specific properties or other objects with metadata to be matched. @@ -1411,7 +1450,7 @@ def connectivity( .. seealso:: - :meth:`Mesh.connectivities` for matching zero or more connectivities. + :meth:`MeshXY.connectivities` for matching zero or more connectivities. Parameters ---------- @@ -1463,7 +1502,7 @@ def connectivity( ------- :class:`~iris.experimental.ugrid.mesh.Connectivity` The :class:`~iris.experimental.ugrid.mesh.Connectivity` from the - :class:`Mesh` that matched the given criteria. + :class:`MeshXY` that matched the given criteria. """ result = self._connectivity_manager.filter( @@ -1487,14 +1526,12 @@ def coord( var_name=None, attributes=None, axis=None, - include_nodes=None, - include_edges=None, - include_faces=None, + location=None, ): """Return a single :class:`~iris.coords.AuxCoord` coordinate. Return a single :class:`~iris.coords.AuxCoord` coordinate from the - :class:`Mesh` that matches the provided criteria. + :class:`MeshXY` that matches the provided criteria. Criteria can be either specific properties or other objects with metadata to be matched. @@ -1506,7 +1543,7 @@ def coord( .. seealso:: - :meth:`Mesh.coords` for matching zero or more coordinates. + :meth:`MeshXY.coords` for matching zero or more coordinates. Parameters ---------- @@ -1537,17 +1574,13 @@ def coord( The desired coordinate axis, see :func:`~iris.util.guess_coord_axis`. If ``None``, does not check for ``axis``. Accepts the values ``X``, ``Y``, ``Z`` and ``T`` (case-insensitive). - include_node : bool, optional - Include all ``node`` coordinates in the list of objects to be matched. - include_edge : bool, optional - Include all ``edge`` coordinates in the list of objects to be matched. - include_face : bool, optional - Include all ``face`` coordinates in the list of objects to be matched. + location : str, optional + The desired location. Accepts the values ``node``, ``edge`` or ``face``. Returns ------- :class:`~iris.coords.AuxCoord` - The :class:`~iris.coords.AuxCoord` coordinate from the :class:`Mesh` + The :class:`~iris.coords.AuxCoord` coordinate from the :class:`MeshXY` that matched the given criteria. """ @@ -1558,9 +1591,7 @@ def coord( var_name=var_name, attributes=attributes, axis=axis, - include_nodes=include_nodes, - include_edges=include_edges, - include_faces=include_faces, + location=location, ) return list(result.values())[0] @@ -1572,13 +1603,11 @@ def coords( var_name=None, attributes=None, axis=None, - include_nodes=None, - include_edges=None, - include_faces=None, + location=None, ): - """Return all :class:`~iris.coords.AuxCoord` coordinates from the :class:`Mesh`. + """Return all :class:`~iris.coords.AuxCoord` coordinates from the :class:`MeshXY`. - Return all :class:`~iris.coords.AuxCoord` coordinates from the :class:`Mesh` that + Return all :class:`~iris.coords.AuxCoord` coordinates from the :class:`MeshXY` that match the provided criteria. Criteria can be either specific properties or other objects with @@ -1586,7 +1615,7 @@ def coords( .. seealso:: - :meth:`Mesh.coord` for matching exactly one coordinate. + :meth:`MeshXY.coord` for matching exactly one coordinate. Parameters ---------- @@ -1617,18 +1646,14 @@ def coords( The desired coordinate axis, see :func:`~iris.util.guess_coord_axis`. If ``None``, does not check for ``axis``. Accepts the values ``X``, ``Y``, ``Z`` and ``T`` (case-insensitive). - include_node : bool, optional - Include all ``node`` coordinates in the list of objects to be matched. - include_edge : bool, optional - Include all ``edge`` coordinates in the list of objects to be matched. - include_face : bool, optional - Include all ``face`` coordinates in the list of objects to be matched. + location : str, optional + The desired location. Accepts the values ``node``, ``edge`` or ``face``. Returns ------- list of :class:`~iris.coords.AuxCoord` A list of :class:`~iris.coords.AuxCoord` coordinates from the - :class:`Mesh` that matched the given criteria. + :class:`MeshXY` that matched the given criteria. """ result = self._coord_manager.filters( @@ -1638,9 +1663,7 @@ def coords( var_name=var_name, attributes=attributes, axis=axis, - include_nodes=include_nodes, - include_edges=include_edges, - include_faces=include_faces, + location=location, ) return list(result.values()) @@ -1659,7 +1682,7 @@ def remove_connectivities( """Remove one or more :class:`~iris.experimental.ugrid.mesh.Connectivity`. Remove one or more :class:`~iris.experimental.ugrid.mesh.Connectivity` - from the :class:`Mesh` that match the provided criteria. + from the :class:`MeshXY` that match the provided criteria. Criteria can be either specific properties or other objects with metadata to be matched. @@ -1714,7 +1737,7 @@ def remove_connectivities( ------- list of :class:`~iris.experimental.ugrid.mesh.Connectivity` A list of :class:`~iris.experimental.ugrid.mesh.Connectivity` - instances removed from the :class:`Mesh` that matched the given + instances removed from the :class:`MeshXY` that matched the given criteria. """ @@ -1738,13 +1761,11 @@ def remove_coords( var_name=None, attributes=None, axis=None, - include_nodes=None, - include_edges=None, - include_faces=None, + location=None, ): - """Remove one or more :class:`~iris.coords.AuxCoord` from the :class:`Mesh`. + """Remove one or more :class:`~iris.coords.AuxCoord` from the :class:`MeshXY`. - Remove one or more :class:`~iris.coords.AuxCoord` from the :class:`Mesh` + Remove one or more :class:`~iris.coords.AuxCoord` from the :class:`MeshXY` that match the provided criteria. Criteria can be either specific properties or other objects with @@ -1779,42 +1800,30 @@ def remove_coords( The desired coordinate axis, see :func:`~iris.util.guess_coord_axis`. If ``None``, does not check for ``axis``. Accepts the values ``X``, ``Y``, ``Z`` and ``T`` (case-insensitive). - include_node : bool, optional - Include all ``node`` coordinates in the list of objects to be matched - for potential removal. - include_edge : bool, optional - Include all ``edge`` coordinates in the list of objects to be matched - for potential removal. - include_face : bool, optional - Include all ``face`` coordinates in the list of objects to be matched - for potential removal. + location : str, optional + The desired location. Accepts the values ``node``, ``edge`` or ``face``. Returns ------- list of :class:`~iris.coords.AuxCoord` A list of :class:`~iris.coords.AuxCoord` coordinates removed from - the :class:`Mesh` that matched the given criteria. + the :class:`MeshXY` that matched the given criteria. """ - # Filter out absent arguments - only expecting face coords sometimes, - # same will be true of volumes in future. - kwargs = { - "item": item, - "standard_name": standard_name, - "long_name": long_name, - "var_name": var_name, - "attributes": attributes, - "axis": axis, - "include_nodes": include_nodes, - "include_edges": include_edges, - "include_faces": include_faces, - } - kwargs = {k: v for k, v in kwargs.items() if v} + result = self._coord_manager.remove( + item=item, + standard_name=standard_name, + long_name=long_name, + var_name=var_name, + attributes=attributes, + axis=axis, + location=location, + ) - return self._coord_manager.remove(**kwargs) + return result def xml_element(self, doc): - """Create the :class:`xml.dom.minidom.Element` that describes this :class:`Mesh`. + """Create the :class:`xml.dom.minidom.Element` that describes this :class:`MeshXY`. Parameters ---------- @@ -1825,7 +1834,7 @@ def xml_element(self, doc): ------- :class:`xml.dom.minidom.Element` The :class:`xml.dom.minidom.Element` that will describe this - :class:`Mesh`, and the dictionary of attributes that require + :class:`MeshXY`, and the dictionary of attributes that require to be added to this element. """ @@ -1848,7 +1857,7 @@ def to_MeshCoord(self, location, axis): """Generate a :class:`~iris.experimental.ugrid.mesh.MeshCoord`. Generate a :class:`~iris.experimental.ugrid.mesh.MeshCoord` that - references the current :class:`Mesh`, and passing through the + references the current :class:`MeshXY`, and passing through the ``location`` and ``axis`` arguments. .. seealso:: @@ -1868,7 +1877,7 @@ def to_MeshCoord(self, location, axis): ------- :class:`~iris.experimental.ugrid.mesh.MeshCoord` A :class:`~iris.experimental.ugrid.mesh.MeshCoord` referencing the - current :class:`Mesh`. + current :class:`MeshXY`. """ return MeshCoord(mesh=self, location=location, axis=axis) @@ -1878,7 +1887,7 @@ def to_MeshCoords(self, location): Generate a tuple of :class:`~iris.experimental.ugrid.mesh.MeshCoord`, each referencing - the current :class:`Mesh`, one for each :attr:`AXES` value, passing + the current :class:`MeshXY`, one for each :attr:`AXES` value, passing through the ``location`` argument. .. seealso:: @@ -1894,7 +1903,7 @@ def to_MeshCoords(self, location): ------- tuple of :class:`~iris.experimental.ugrid.mesh.MeshCoord` Tuple of :class:`~iris.experimental.ugrid.mesh.MeshCoord` - referencing the current :class:`Mesh`. One for each value in + referencing the current :class:`MeshXY`. One for each value in :attr:`AXES`, using the value for the ``axis`` argument. """ @@ -1931,7 +1940,7 @@ def dimension_names(self, node=None, edge=None, face=None): The default value of ``None`` will not be assigned to clear the associated ``node``, ``edge`` or ``face``. Instead use - :meth:`Mesh.dimension_names_reset`. + :meth:`MeshXY.dimension_names_reset`. Parameters ---------- @@ -1950,7 +1959,7 @@ def dimension_names(self, node=None, edge=None, face=None): @property def cf_role(self): - """The UGRID ``cf_role`` attribute of the :class:`Mesh`.""" + """The UGRID ``cf_role`` attribute of the :class:`MeshXY`.""" return "mesh_topology" @property @@ -1959,7 +1968,7 @@ def topology_dimension(self): The UGRID ``topology_dimension`` attribute represents the highest dimensionality of all the geometric elements (node, edge, face) represented - within the :class:`Mesh`. + within the :class:`MeshXY`. """ return self._metadata_manager.topology_dimension @@ -2203,21 +2212,21 @@ def filters( var_name=None, attributes=None, axis=None, - include_nodes=None, - include_edges=None, - include_faces=None, + location=None, ): # TBD: support coord_systems? - # Preserve original argument before modifying. - face_requested = include_faces - - # Rationalise the tri-state behaviour. - args = [include_nodes, include_edges, include_faces] - state = not any(set(filter(lambda arg: arg is not None, args))) - include_nodes, include_edges, include_faces = map( - lambda arg: arg if arg is not None else state, args - ) + # Determine locations to include. + if location is not None: + if location not in ["node", "edge", "face"]: + raise ValueError( + f"Expected location to be one of `node`, `edge` or `face`, got `{location}`" + ) + include_nodes = location == "node" + include_edges = location == "edge" + include_faces = location == "face" + else: + include_nodes = include_edges = include_faces = True def populated_coords(coords_tuple): return list(filter(None, list(coords_tuple))) @@ -2230,7 +2239,7 @@ def populated_coords(coords_tuple): if hasattr(self, "face_coords"): if include_faces: members += populated_coords(self.face_coords) - elif face_requested: + elif location == "face": dmsg = "Ignoring request to filter non-existent 'face_coords'" logger.debug(dmsg, extra=dict(cls=self.__class__.__name__)) @@ -2257,8 +2266,7 @@ def remove( var_name=None, attributes=None, axis=None, - include_nodes=None, - include_edges=None, + location=None, ): return self._remove( item=item, @@ -2267,8 +2275,7 @@ def remove( var_name=var_name, attributes=attributes, axis=axis, - include_nodes=include_nodes, - include_edges=include_edges, + location=location, ) @@ -2343,9 +2350,7 @@ def remove( var_name=None, attributes=None, axis=None, - include_nodes=None, - include_edges=None, - include_faces=None, + location=None, ): return self._remove( item=item, @@ -2354,9 +2359,7 @@ def remove( var_name=var_name, attributes=attributes, axis=axis, - include_nodes=include_nodes, - include_edges=include_edges, - include_faces=include_faces, + location=location, ) @@ -2650,15 +2653,15 @@ def face_node(self): class MeshCoord(AuxCoord): """Geographic coordinate values of data on an unstructured mesh. - A MeshCoord references a `~iris.experimental.ugrid.mesh.Mesh`. - When contained in a `~iris.cube.Cube` it connects the cube to the Mesh. + A MeshCoord references a `~iris.experimental.ugrid.mesh.MeshXY`. + When contained in a `~iris.cube.Cube` it connects the cube to the MeshXY. 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. A MeshCoord also specifies its 'axis' : 'x' or 'y'. Its values are then, accordingly, longitudes or latitudes. The values are taken from the - appropriate coordinates and connectivities in the Mesh, determined by its + appropriate coordinates and connectivities in the MeshXY, determined by its 'location' and 'axis'. Any cube with data on a mesh will have a MeshCoord for each axis, @@ -2668,9 +2671,9 @@ class MeshCoord(AuxCoord): which depends on location. For 'node', the ``.points`` contains node locations. For 'edge', the ``.bounds`` contains edge endpoints, and the ``.points`` contain - edge locations (typically centres), if the Mesh contains them (optional). + edge locations (typically centres), if the MeshXY contains them (optional). For 'face', the ``.bounds`` contain the face corners, and the ``.points`` contain the - face locations (typically centres), if the Mesh contains them (optional). + face locations (typically centres), if the MeshXY contains them (optional). .. note:: As described above, it is possible for a MeshCoord to have bounds but @@ -2693,10 +2696,10 @@ def __init__( self._metadata_manager = metadata_manager_factory(MeshCoordMetadata) # Validate and record the class-specific constructor args. - if not isinstance(mesh, Mesh): + if not isinstance(mesh, MeshXY): msg = ( "'mesh' must be an " - f"{Mesh.__module__}.{Mesh.__name__}, " + f"{MeshXY.__module__}.{MeshXY.__name__}, " f"got {mesh}." ) raise TypeError(msg) @@ -2704,20 +2707,20 @@ def __init__( # NOTE: currently *not* included in metadata. In future it might be. self._mesh = mesh - if location not in Mesh.ELEMENTS: + if location not in MeshXY.ELEMENTS: msg = ( - f"'location' of {location} is not a valid Mesh location', " - f"must be one of {Mesh.ELEMENTS}." + f"'location' of {location} is not a valid MeshXY location', " + f"must be one of {MeshXY.ELEMENTS}." ) raise ValueError(msg) # Held in metadata, readable as self.location, but cannot set it. self._metadata_manager.location = location - if axis not in Mesh.AXES: - # The valid axes are defined by the Mesh class. + if axis not in MeshXY.AXES: + # The valid axes are defined by the MeshXY class. msg = ( - f"'axis' of {axis} is not a valid Mesh axis', " - f"must be one of {Mesh.AXES}." + f"'axis' of {axis} is not a valid MeshXY axis', " + f"must be one of {MeshXY.AXES}." ) raise ValueError(msg) # Held in metadata, readable as self.axis, but cannot set it. @@ -2731,20 +2734,19 @@ def __init__( raise ValueError(msg) # Get the 'coord identity' metadata from the relevant node-coordinate. - node_coord = self.mesh.coord(include_nodes=True, axis=self.axis) + node_coord = self.mesh.coord(location="node", axis=self.axis) node_metadict = node_coord.metadata._asdict() # Use node metadata, unless location is face/edge. use_metadict = node_metadict.copy() if location != "node": # Location is either "edge" or "face" - get the relevant coord. - kwargs = {f"include_{location}s": True, "axis": axis} - location_coord = self.mesh.coord(**kwargs) + location_coord = self.mesh.coord(location=location, axis=axis) # Take the MeshCoord metadata from the 'location' coord. use_metadict = location_coord.metadata._asdict() unit_unknown = Unit(None) - # N.B. at present, coords in a Mesh are stored+accessed by 'axis', which + # N.B. at present, coords in a MeshXY are stored+accessed by 'axis', which # means they must have a standard_name. So ... # (a) the 'location' (face/edge) coord *always* has a usable phenomenon # identity. @@ -2784,6 +2786,11 @@ def fix_repr(val): ) raise ValueError(msg) + # Don't use 'coord_system' as a constructor arg, since for + # MeshCoords it is deduced from the mesh. + # (Otherwise a non-None coord_system breaks the 'copy' operation) + use_metadict.pop("coord_system") + # Call parent constructor to handle the common constructor args. super().__init__(points, bounds=bounds, **use_metadict) @@ -2809,8 +2816,24 @@ def axis(self): @property def coord_system(self): - """The coordinate-system of a MeshCoord is always 'None'.""" - return None + """The coordinate-system of a MeshCoord. + + It comes from the `related` location coordinate in the mesh. + """ + # This matches where the coord metadata is drawn from. + # See : https://github.com/SciTools/iris/issues/4860 + try: + # NOTE: at present, a MeshCoord *always* references the relevant location + # coordinate in the mesh, from which its points are taken. + # However this might change in future .. + # see : https://github.com/SciTools/iris/discussions/4438#bounds-no-points + location_coord = self.mesh.coord(location=self.location, axis=self.axis) + coord_system = location_coord.coord_system + except CoordinateNotFoundError: + # No such coord : possible in UGRID, but probably not Iris (at present). + coord_system = None + + return coord_system @coord_system.setter def coord_system(self, value): @@ -2850,7 +2873,7 @@ def collapsed(self, dims_to_collapse=None): The coordinate that is collapsed is a :class:`~iris.coords.AuxCoord` copy of this :class:`MeshCoord`, since a :class:`MeshCoord` does not have its own points/bounds - they are derived from the - associated :class:`Mesh`. See :meth:`iris.coords.AuxCoord.collapsed`. + associated :class:`MeshXY`. See :meth:`iris.coords.AuxCoord.collapsed`. """ @contextmanager @@ -2911,9 +2934,9 @@ def copy(self, points=None, bounds=None): def __deepcopy__(self, memo): """Make this equivalent to "shallow" copy. - Returns a new MeshCoord based on the same Mesh. + Returns a new MeshCoord based on the same MeshXY. - Required to prevent cube copying from copying the Mesh, which would + Required to prevent cube copying from copying the MeshXY, which would prevent "cube.copy() == cube" : see notes for :meth:`copy`. """ @@ -2999,31 +3022,28 @@ def _construct_access_arrays(self): """Build lazy points and bounds arrays. Build lazy points and bounds arrays, providing dynamic access via the - Mesh, according to the location and axis. + MeshXY, according to the location and axis. Returns ------- array or None Tuple of (points, bounds). Lazy arrays which calculate the correct points and bounds from the - Mesh data, based on the location and axis. - The Mesh coordinates accessed are not identified on construction, - but discovered from the Mesh at the time of calculation, so that - the result is always based on current content in the Mesh. + MeshXY data, based on the location and axis. + The MeshXY coordinates accessed are not identified on construction, + but discovered from the MeshXY at the time of calculation, so that + the result is always based on current content in the MeshXY. """ mesh, location, axis = self.mesh, self.location, self.axis - node_coord = self.mesh.coord(include_nodes=True, axis=axis) + node_coord = mesh.coord(location="node", axis=axis) if location == "node": points_coord = node_coord bounds_connectivity = None - elif location == "edge": - points_coord = self.mesh.coord(include_edges=True, axis=axis) - bounds_connectivity = mesh.edge_node_connectivity - elif location == "face": - points_coord = self.mesh.coord(include_faces=True, axis=axis) - bounds_connectivity = mesh.face_node_connectivity + else: + points_coord = mesh.coord(location=location, axis=axis) + bounds_connectivity = getattr(mesh, f"{location}_node_connectivity") # The points output is the points of the relevant element-type coord. points = points_coord.core_points() diff --git a/lib/iris/experimental/ugrid/metadata.py b/lib/iris/experimental/ugrid/metadata.py index bc7cc677f7..28b9f413d9 100644 --- a/lib/iris/experimental/ugrid/metadata.py +++ b/lib/iris/experimental/ugrid/metadata.py @@ -139,7 +139,7 @@ def equal(self, other, lenient=None): class MeshMetadata(BaseMetadata): - """Metadata container for a :class:`~iris.experimental.ugrid.mesh.Mesh`.""" + """Metadata container for a :class:`~iris.experimental.ugrid.mesh.MeshXY`.""" # The node_dimension", "edge_dimension" and "face_dimension" members are # stateful only; they not participate in lenient/strict equivalence. @@ -262,8 +262,8 @@ class MeshCoordMetadata(BaseMetadata): _members = ("location", "axis") # NOTE: in future, we may add 'mesh' as part of this metadata, - # as the Mesh seems part of the 'identity' of a MeshCoord. - # For now we omit it, particularly as we don't yet implement Mesh.__eq__. + # as the MeshXY seems part of the 'identity' of a MeshCoord. + # For now we omit it, particularly as we don't yet implement MeshXY.__eq__. # # Thus, for now, the MeshCoord class will need to handle 'mesh' explicitly # in identity / comparison, but in future that may be simplified. diff --git a/lib/iris/experimental/ugrid/save.py b/lib/iris/experimental/ugrid/save.py index 8cfa6ba97a..ddd7e5333c 100644 --- a/lib/iris/experimental/ugrid/save.py +++ b/lib/iris/experimental/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.Mesh` saving in UGRID format. +"""Extension to Iris' NetCDF saving to allow :class:`~iris.experimental.ugrid.mesh.MeshXY` saving in UGRID format. Eventual destination: :mod:`iris.fileformats.netcdf`. @@ -19,7 +19,7 @@ def save_mesh(mesh, filename, netcdf_format="NETCDF4"): Parameters ---------- - mesh : :class:`iris.experimental.ugrid.Mesh` or iterable + mesh : :class:`iris.experimental.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/experimental/ugrid/utils.py index 0074619bf2..b78545c42e 100644 --- a/lib/iris/experimental/ugrid/utils.py +++ b/lib/iris/experimental/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.Mesh`. + Must have a :class:`~iris.experimental.ugrid.mesh.MeshXY`. submesh_cubes : iterable of Cube, or Cube Cubes, each with data on a _subset_ of the ``mesh_cube`` datapoints diff --git a/lib/iris/fileformats/_nc_load_rules/helpers.py b/lib/iris/fileformats/_nc_load_rules/helpers.py index 7a7424d4f7..5aed21bebf 100644 --- a/lib/iris/fileformats/_nc_load_rules/helpers.py +++ b/lib/iris/fileformats/_nc_load_rules/helpers.py @@ -522,7 +522,7 @@ def _get_ellipsoid(cf_grid_var): if datum == "unknown": datum = None - if not iris.FUTURE.datum_support: + if datum is not None and not iris.FUTURE.datum_support: wmsg = ( "Ignoring a datum in netCDF load for consistency with existing " "behaviour. In a future version of Iris, this datum will be " diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index 5c2a4675d7..179adaf9cd 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.Mesh.ELEMENTS`, +# NOTE : this matches :class:`iris.experimental.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.Mesh` + cube_or_mesh : :class:`iris.cube.Cube` or :class:`iris.experimental.ugrid.MeshXY` The Cube or Mesh being saved to the netCDF file. Returns @@ -942,10 +942,10 @@ def _add_aux_coords(self, cube, cf_var_cube, dimension_names): Names associated with the dimensions of the cube. """ from iris.experimental.ugrid.mesh import ( - Mesh, MeshEdgeCoords, MeshFaceCoords, MeshNodeCoords, + MeshXY, ) # Exclude any mesh coords, which are bundled in with the aux-coords. @@ -954,7 +954,7 @@ def _add_aux_coords(self, cube, cf_var_cube, dimension_names): ] # Include any relevant mesh location coordinates. - mesh: Mesh | None = getattr(cube, "mesh") + mesh: MeshXY | None = getattr(cube, "mesh") mesh_location: str | None = getattr(cube, "location") if mesh and mesh_location: location_coords: MeshNodeCoords | MeshEdgeCoords | MeshFaceCoords = getattr( @@ -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.Mesh` + cube_or_mesh : :class:`iris.cube.Cube` or :class:`iris.experimental.ugrid.MeshXY` The Cube or Mesh being saved to the netCDF file. Returns @@ -1204,7 +1204,7 @@ def record_dimension(names_list, dim_name, length, matching_coords=None): if location == "node": # For nodes, identify the dim with a coordinate variable. # Selecting the X-axis one for definiteness. - dim_coords = mesh.coords(include_nodes=True, axis="x") + dim_coords = mesh.coords(location="node", axis="x") else: # For face/edge, use the relevant "optionally required" # connectivity variable. @@ -1228,7 +1228,7 @@ def record_dimension(names_list, dim_name, length, matching_coords=None): # Name it for the relevant mesh dimension location_dim_attr = f"{location}_dimension" dim_name = getattr(mesh, location_dim_attr) - # NOTE: This cannot currently be empty, as a Mesh + # NOTE: This cannot currently be empty, as a MeshXY # "invents" dimension names which were not given. assert dim_name is not None # Ensure it is a valid variable name. @@ -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.Mesh` + cube_or_mesh : :class:`iris.cube.Cube` or :class:`iris.experimental.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 @@ -1527,7 +1527,7 @@ def _get_coord_variable_name(self, cube_or_mesh, coord): from iris.experimental.ugrid.mesh import Connectivity # At present, a location-coord cannot be nameless, as the - # Mesh code relies on guess_coord_axis. + # MeshXY code relies on guess_coord_axis. assert isinstance(coord, Connectivity) location = coord.cf_role.split("_")[0] location_dim_attr = f"{location}_dimension" @@ -1544,7 +1544,7 @@ def _get_mesh_variable_name(self, mesh): Parameters ---------- - mesh : :class:`iris.experimental.ugrid.mesh.Mesh` + mesh : :class:`iris.experimental.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.Mesh` + mesh : :class:`iris.experimental.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.Mesh` + cube_or_mesh : :class:`iris.cube.Cube` or :class:`iris.experimental.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 new file mode 100644 index 0000000000..d9ec782108 --- /dev/null +++ b/lib/iris/tests/integration/experimental/test_meshcoord_coordsys.py @@ -0,0 +1,129 @@ +# 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. +"""Integration tests for MeshCoord.coord_system() behaviour.""" + +import pytest + +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 + +TEST_CDL = """ +netcdf mesh_test { + dimensions: + node = 3 ; + face = 1 ; + vertex = 3 ; + variables: + int mesh ; + mesh:cf_role = "mesh_topology" ; + mesh:topology_dimension = 2 ; + mesh:node_coordinates = "node_x node_y" ; + mesh:face_node_connectivity = "face_nodes" ; + float node_x(node) ; + node_x:standard_name = "longitude" ; + float node_y(node) ; + node_y:standard_name = "latitude" ; + int face_nodes(face, vertex) ; + face_nodes:cf_role = "face_node_connectivity" ; + face_nodes:start_index = 0 ; + float node_data(node) ; + node_data:coordinates = "node_x node_y" ; + node_data:location = "node" ; + node_data:mesh = "mesh" ; +} +""" + +BASIC_CRS_STR = """ + int crs ; + crs:grid_mapping_name = "latitude_longitude" ; + crs:semi_major_axis = 6371000.0 ; +""" + + +def find_i_line(lines, match): + (i_line,) = [i for i, line in enumerate(lines) if match in line] + return i_line + + +def make_file(nc_path, node_x_crs=False, node_y_crs=False): + lines = TEST_CDL.split("\n") + + includes = ["node_x"] if node_x_crs else [] + includes += ["node_y"] if node_y_crs else [] + includes = " ".join(includes) + if includes: + # insert a grid-mapping + i_line = find_i_line(lines, "variables:") + lines[i_line + 1 : i_line + 1] = BASIC_CRS_STR.split("\n") + + i_line = find_i_line(lines, "float node_data(") + ref_lines = [ + # NOTE: space to match the surrounding indent + f' node_data:grid_mapping = "crs: {includes}" ;', + # NOTE: this is already present + # f'node_data:coordinates = "{includes}" ;' + ] + lines[i_line + 1 : i_line + 1] = ref_lines + + cdl_str = "\n".join(lines) + ncgen_from_cdl(cdl_str=cdl_str, cdl_path=None, nc_path=nc_path) + + +@pytest.mark.parametrize("cs_axes", ["--", "x-", "-y", "xy"]) +def test_default_mesh_cs(tmp_path, cs_axes): + """Test coord-systems of mesh cube and coords, if location coords have a crs.""" + nc_path = tmp_path / "test_temp.nc" + do_x = "x" in cs_axes + do_y = "y" in cs_axes + make_file(nc_path, node_x_crs=do_x, node_y_crs=do_y) + with PARSE_UGRID_ON_LOAD.context(): + cube = iris.load_cube(nc_path, "node_data") + meshco_x, meshco_y = [cube.coord(mesh_coords=True, axis=ax) for ax in ("x", "y")] + # NOTE: at present, none of these load with a coordinate system, + # because we don't support the extended grid-mapping syntax. + # see: https://github.com/SciTools/iris/issues/3388 + assert meshco_x.coord_system is None + assert meshco_y.coord_system is None + + +def test_assigned_mesh_cs(tmp_path): + # Check that when a coord system is manually assigned to a location coord, + # the corresponding meshcoord reports the same cs. + nc_path = tmp_path / "test_temp.nc" + make_file(nc_path) + with PARSE_UGRID_ON_LOAD.context(): + cube = iris.load_cube(nc_path, "node_data") + nodeco_x = cube.mesh.coord(location="node", axis="x") + meshco_x, meshco_y = [cube.coord(axis=ax) for ax in ("x", "y")] + assert nodeco_x.coord_system is None + assert meshco_x.coord_system is None + assert meshco_y.coord_system is None + assigned_cs = GeogCS(1.0) + nodeco_x.coord_system = assigned_cs + assert meshco_x.coord_system is assigned_cs + assert meshco_y.coord_system is None + # This also affects cube.coord_system(), even though it is an auxcoord, + # since there are no dim-coords, or any other coord with a c-s. + # TODO: this may be a mistake -- see https://github.com/SciTools/iris/issues/6051 + assert cube.coord_system() is assigned_cs + + +def test_meshcoord_coordsys_copy(tmp_path): + # Check that copying a meshcoord with a coord system works properly. + nc_path = tmp_path / "test_temp.nc" + make_file(nc_path) + with PARSE_UGRID_ON_LOAD.context(): + cube = iris.load_cube(nc_path, "node_data") + node_coord = cube.mesh.coord(location="node", axis="x") + assigned_cs = GeogCS(1.0) + node_coord.coord_system = assigned_cs + mesh_coord = cube.coord(axis="x") + assert mesh_coord.coord_system is assigned_cs + meshco_copy = mesh_coord.copy() + assert meshco_copy == mesh_coord + # Note: still the same object, because it is derived from the same node_coord + assert meshco_copy.coord_system is assigned_cs diff --git a/lib/iris/tests/integration/experimental/test_ugrid_load.py b/lib/iris/tests/integration/experimental/test_ugrid_load.py index 5735d6b2c1..613e5f4e37 100644 --- a/lib/iris/tests/integration/experimental/test_ugrid_load.py +++ b/lib/iris/tests/integration/experimental/test_ugrid_load.py @@ -19,7 +19,7 @@ from iris import Constraint, load from iris.experimental.ugrid.load import PARSE_UGRID_ON_LOAD, load_mesh, load_meshes -from iris.experimental.ugrid.mesh import Mesh +from iris.experimental.ugrid.mesh import MeshXY from iris.tests.stock.netcdf import ( _file_from_cdl_template as create_file_from_cdl_template, ) @@ -172,7 +172,7 @@ def test_mesh_bad_topology_dimension(self): def test_mesh_no_topology_dimension(self): # Check that the load generates a suitable warning. - warn_regex = r"Mesh variable.* has no 'topology_dimension'" + warn_regex = r"MeshXY variable.* has no 'topology_dimension'" with pytest.warns(IrisCfWarning, match=warn_regex): template = "minimal_bad_topology_dim" dim_line = "" # don't create ANY topology_dimension property @@ -212,7 +212,7 @@ def common_test(self, file_name, mesh_var_name): tests.get_data_path(["NetCDF", "unstructured_grid", file_name]) ) # NOTE: cannot use CML tests as this isn't supported for non-Cubes. - self.assertIsInstance(mesh, Mesh) + self.assertIsInstance(mesh, MeshXY) self.assertEqual(mesh.var_name, mesh_var_name) def test_full_file(self): diff --git a/lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex1_1d_mesh.cdl b/lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex1_1d_mesh.cdl index d022fedc61..faf86c04c5 100644 --- a/lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex1_1d_mesh.cdl +++ b/lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex1_1d_mesh.cdl @@ -6,7 +6,7 @@ nMesh1_edge = 4 ; // nEdges Two = 2; variables: -// Mesh topology +// MeshXY topology integer Mesh1 ; Mesh1:cf_role = "mesh_topology" ; Mesh1:long_name = "Topology data of 1D network" ; @@ -19,7 +19,7 @@ Mesh1_edge_nodes:cf_role = "edge_node_connectivity" ; Mesh1_edge_nodes:long_name = "Maps every edge/link to the two nodes that it connects." ; Mesh1_edge_nodes:start_index = 1 ; -// Mesh node coordinates +// MeshXY node coordinates double Mesh1_node_x(nMesh1_node) ; Mesh1_node_x:standard_name = "longitude" ; Mesh1_node_x:long_name = "Longitude of 1D network nodes." ; diff --git a/lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex2_2d_triangular.cdl b/lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex2_2d_triangular.cdl index 1e4e483826..0dd01a3c62 100644 --- a/lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex2_2d_triangular.cdl +++ b/lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex2_2d_triangular.cdl @@ -8,7 +8,7 @@ Two = 2 ; Three = 3 ; variables: -// Mesh topology +// MeshXY topology integer Mesh2 ; Mesh2:cf_role = "mesh_topology" ; Mesh2:long_name = "Topology data of 2D unstructured mesh" ; @@ -50,7 +50,7 @@ Mesh2_edge_face_links:start_index = 1 ; Mesh2_edge_face_links:_FillValue = -999 ; Mesh2_edge_face_links:comment = "missing neighbor faces are indicated using _FillValue" ; -// Mesh node coordinates +// MeshXY node coordinates double Mesh2_node_x(nMesh2_node) ; Mesh2_node_x:standard_name = "longitude" ; Mesh2_node_x:long_name = "Longitude of 2D mesh nodes." ; diff --git a/lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex3_2d_flexible.cdl b/lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex3_2d_flexible.cdl index 2fa077d152..fbbd3aa544 100644 --- a/lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex3_2d_flexible.cdl +++ b/lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex3_2d_flexible.cdl @@ -8,7 +8,7 @@ nMaxMesh2_face_nodes = 4 ; // MaxNumNodesPerFace Two = 2 ; variables: -// Mesh topology +// MeshXY topology integer Mesh2 ; Mesh2:cf_role = "mesh_topology" ; Mesh2:long_name = "Topology data of 2D unstructured mesh" ; @@ -52,7 +52,7 @@ Mesh2_edge_face_links:start_index = 1 ; Mesh2_edge_face_links:_FillValue = -999 ; Mesh2_edge_face_links:comment = "missing neighbor faces are indicated using _FillValue" ; -// Mesh node coordinates +// MeshXY node coordinates double Mesh2_node_x(nMesh2_node) ; Mesh2_node_x:standard_name = "longitude" ; Mesh2_node_x:long_name = "Longitude of 2D mesh nodes." ; diff --git a/lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex4_3d_layered.cdl b/lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex4_3d_layered.cdl index d154502018..48fab9bdd7 100644 --- a/lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex4_3d_layered.cdl +++ b/lib/iris/tests/integration/experimental/ugrid_conventions_examples/ugrid_ex4_3d_layered.cdl @@ -9,7 +9,7 @@ Mesh2_layers = 10 ; Two = 2 ; variables: -// Mesh topology +// MeshXY topology integer Mesh2 ; Mesh2:cf_role = "mesh_topology" ; Mesh2:long_name = "Topology data of 2D unstructured mesh" ; @@ -53,7 +53,7 @@ Mesh2_edge_face_links:start_index = 1 ; Mesh2_edge_face_links:_FillValue = -999 ; Mesh2_edge_face_links:comment = "missing neighbor faces are indicated using _FillValue" ; -// Mesh node coordinates +// MeshXY node coordinates double Mesh2_node_x(nMesh2_node) ; Mesh2_node_x:standard_name = "longitude" ; Mesh2_node_x:long_name = "Longitude of 2D mesh nodes." ; diff --git a/lib/iris/tests/integration/netcdf/test_coord_systems.py b/lib/iris/tests/integration/netcdf/test_coord_systems.py index 55ecf2e2ef..6c101d9024 100644 --- a/lib/iris/tests/integration/netcdf/test_coord_systems.py +++ b/lib/iris/tests/integration/netcdf/test_coord_systems.py @@ -11,6 +11,9 @@ from os.path import join as path_join import shutil import tempfile +import warnings + +import pytest import iris from iris.coords import DimCoord @@ -135,15 +138,25 @@ def test_load_datum_wkt(self): cube = iris.load_cube(nc_path) test_crs = cube.coord("projection_y_coordinate").coord_system actual = str(test_crs.as_cartopy_crs().datum) - self.assertMultiLineEqual(expected, actual) + assert actual == expected def test_no_load_datum_wkt(self): nc_path = tlc.cdl_to_nc(self.datum_wkt_cdl) - with self.assertWarnsRegex(FutureWarning, "iris.FUTURE.datum_support"): + with pytest.warns(FutureWarning, match="iris.FUTURE.datum_support"): cube = iris.load_cube(nc_path) test_crs = cube.coord("projection_y_coordinate").coord_system actual = str(test_crs.as_cartopy_crs().datum) - self.assertMultiLineEqual(actual, "unknown") + assert actual == "unknown" + + def test_no_datum_no_warn(self): + new_cdl = self.datum_wkt_cdl.splitlines() + new_cdl = [line for line in new_cdl if "DATUM" not in line] + new_cdl = "\n".join(new_cdl) + nc_path = tlc.cdl_to_nc(new_cdl) + with warnings.catch_warnings(): + # pytest's recommended way to assert for no warnings. + warnings.simplefilter("error", FutureWarning) + _ = iris.load_cube(nc_path) def test_load_datum_cf_var(self): expected = "OSGB 1936" @@ -152,15 +165,15 @@ def test_load_datum_cf_var(self): cube = iris.load_cube(nc_path) test_crs = cube.coord("projection_y_coordinate").coord_system actual = str(test_crs.as_cartopy_crs().datum) - self.assertMultiLineEqual(expected, actual) + assert actual == expected def test_no_load_datum_cf_var(self): nc_path = tlc.cdl_to_nc(self.datum_cf_var_cdl) - with self.assertWarnsRegex(FutureWarning, "iris.FUTURE.datum_support"): + with pytest.warns(FutureWarning, match="iris.FUTURE.datum_support"): cube = iris.load_cube(nc_path) test_crs = cube.coord("projection_y_coordinate").coord_system actual = str(test_crs.as_cartopy_crs().datum) - self.assertMultiLineEqual(actual, "unknown") + assert actual == "unknown" def test_save_datum(self): expected = "OSGB 1936" @@ -199,7 +212,7 @@ def test_save_datum(self): test_crs = cube.coord("projection_y_coordinate").coord_system actual = str(test_crs.as_cartopy_crs().datum) - self.assertMultiLineEqual(expected, actual) + assert actual == expected class TestLoadMinimalGeostationary(tests.IrisTest): @@ -270,9 +283,9 @@ def test_geostationary_no_false_offsets(self): cube = iris.load_cube(self.path_test_nc) # Check the coordinate system properties has the correct default properties. cs = cube.coord_system() - self.assertIsInstance(cs, iris.coord_systems.Geostationary) - self.assertEqual(cs.false_easting, 0.0) - self.assertEqual(cs.false_northing, 0.0) + assert isinstance(cs, iris.coord_systems.Geostationary) + assert cs.false_easting == 0.0 + assert cs.false_northing == 0.0 if __name__ == "__main__": diff --git a/lib/iris/tests/integration/netcdf/test_general.py b/lib/iris/tests/integration/netcdf/test_general.py index c505a21af5..88d636a315 100644 --- a/lib/iris/tests/integration/netcdf/test_general.py +++ b/lib/iris/tests/integration/netcdf/test_general.py @@ -488,37 +488,38 @@ def test_path_string_save_same(self): @tests.skip_data class TestWarningRepeats(tests.IrisTest): - def test_datum_once(self): - """Tests for warnings being duplicated. + def test_warning_repeats(self): + """Confirm Iris load does not break Python duplicate warning handling.""" + # units.nc is designed for testing Iris' 'ignoring invalid units' + # warning; it contains two variables with invalid units, producing two + # unique warnings (due to two different messages). + file_path = tests.get_data_path(("NetCDF", "testing", "units.nc")) - Notes - ----- - This test relies on `iris.load` throwing a warning. This warning might - be removed in the future, in which case `assert len(record) == 2 should` - be change to `assert len(record) == 1`. - - toa_brightness_temperature.nc has an AuxCoord with lazy data, and triggers a - specific part of dask which contains a `catch_warnings()` call which - causes warnings to be repeated, and so has been removed from the - `fnames` list until a solution is found for such a file. - - """ - # - fnames = [ - "false_east_north_merc.nc", - "non_unit_scale_factor_merc.nc", - # toa_brightness_temperature.nc, - ] - fpaths = [ - tests.get_data_path(("NetCDF", "mercator", fname)) for fname in fnames - ] + def _raise_warning() -> None: + # Contain in function so warning always has identical line number. + warnings.warn("Dummy warning", category=iris.warnings.IrisUserWarning) with warnings.catch_warnings(record=True) as record: warnings.simplefilter("default") - for fpath in fpaths: - iris.load(fpath) - warnings.warn("Dummy warning", category=iris.warnings.IrisUserWarning) - assert len(record) == 2 + + # Warn before Iris has been invoked. + _raise_warning() + assert len(record) == 1 + + # This Iris call should raise 2 warnings and should NOT affect + # Python's duplicate warning handling. + _ = iris.load(file_path) + assert len(record) == 3 + # Raise a duplicate warning. + _raise_warning() + assert len(record) == 3 + + # Repeated identical calls should only raise duplicate warnings + # and therefore not affect the record. + for i in range(2): + _ = iris.load(file_path) + _raise_warning() + assert len(record) == 3 if __name__ == "__main__": diff --git a/lib/iris/tests/stock/__init__.py b/lib/iris/tests/stock/__init__.py index 822dd6a6c1..e6ef0356a6 100644 --- a/lib/iris/tests/stock/__init__.py +++ b/lib/iris/tests/stock/__init__.py @@ -837,10 +837,10 @@ def flatten_dim_metadata(dim_metadata: icoords._DimensionalMetadata): new_instance = dim_metadata.__class__(flat_values, **kwargs) return new_instance - def remove_duplicate_nodes(mesh: ugrid.Mesh): + def remove_duplicate_nodes(mesh: ugrid.MeshXY): """Remove duplicate nodes from a mesh. - Mesh.from_coords() does not do this due to complications like lazy + MeshXY.from_coords() does not do this due to complications like lazy arrays. Not a problem here. """ # TODO: @@ -885,7 +885,7 @@ def remove_duplicate_nodes(mesh: ugrid.Mesh): return mesh - new_mesh = ugrid.Mesh.from_coords( + new_mesh = ugrid.MeshXY.from_coords( flatten_dim_metadata(default_lon), flatten_dim_metadata(default_lat), ) diff --git a/lib/iris/tests/stock/mesh.py b/lib/iris/tests/stock/mesh.py index cd092fb66c..6333374d6c 100644 --- a/lib/iris/tests/stock/mesh.py +++ b/lib/iris/tests/stock/mesh.py @@ -8,9 +8,9 @@ from iris.coords import AuxCoord, DimCoord from iris.cube import Cube -from iris.experimental.ugrid.mesh import Connectivity, Mesh, MeshCoord +from iris.experimental.ugrid.mesh import Connectivity, MeshCoord, MeshXY -# Default creation controls for creating a test Mesh. +# Default creation controls for creating a test MeshXY. # Note: we're not creating any kind of sensible 'normal' mesh here, the numbers # of nodes/faces/edges are quite arbitrary and the connectivities we generate # are pretty random too. @@ -30,7 +30,7 @@ def sample_mesh( ): """Make a test mesh. - Mesh has nodes, plus faces and/or edges, with face-coords and edge-coords, + MeshXY has nodes, plus faces and/or edges, with face-coords and edge-coords, numbers of which can be controlled. Parameters @@ -118,7 +118,7 @@ def sample_mesh( face_y = AuxCoord(3200 + arr.arange(n_faces), standard_name="latitude") face_coords_and_axes = [(face_x, "x"), (face_y, "y")] - mesh = Mesh( + mesh = MeshXY( topology_dimension=2, node_coords_and_axes=[(node_x, "x"), (node_y, "y")], connectivities=connectivities, @@ -142,7 +142,7 @@ def sample_meshcoord(mesh=None, location="face", axis="x", **extra_kwargs): def sample_mesh_cube(nomesh_faces=None, n_z=2, with_parts=False, **meshcoord_kwargs): - """Create a 2d test cube with 1 'normal' and 1 unstructured dimension (with a Mesh). + """Create a 2d test cube with 1 'normal' and 1 unstructured dimension (with a MeshXY). Result contains : dimcoords for both dims; an auxcoord on the unstructured dim; 2 mesh-coords. diff --git a/lib/iris/tests/unit/coords/test__DimensionalMetadata.py b/lib/iris/tests/unit/coords/test__DimensionalMetadata.py index da0dccd873..6aaa26e5a9 100644 --- a/lib/iris/tests/unit/coords/test__DimensionalMetadata.py +++ b/lib/iris/tests/unit/coords/test__DimensionalMetadata.py @@ -885,7 +885,7 @@ def test_meshcoord(self): "[...]+bounds shape(3,)>" ), "MeshCoord : longitude / (unknown)", - " mesh: ", + " mesh: ", " location: 'face'", " points: [3100, 3101, 3102]", " bounds: [", diff --git a/lib/iris/tests/unit/cube/test_Cube.py b/lib/iris/tests/unit/cube/test_Cube.py index 8ae42448c7..878a793448 100644 --- a/lib/iris/tests/unit/cube/test_Cube.py +++ b/lib/iris/tests/unit/cube/test_Cube.py @@ -2210,7 +2210,7 @@ def test_fail_meshcoords_different_meshes(self): meshco_y = sample_meshcoord(axis="y") # Own (different) mesh meshco_y.mesh.long_name = "new_name" n_faces = meshco_x.shape[0] - with self.assertRaisesRegex(ValueError, "Mesh.* does not match"): + with self.assertRaisesRegex(ValueError, "MeshXY.* does not match"): Cube( np.zeros(n_faces), aux_coords_and_dims=[(meshco_x, 0), (meshco_y, 0)], diff --git a/lib/iris/tests/unit/experimental/ugrid/mesh/test_Mesh.py b/lib/iris/tests/unit/experimental/ugrid/mesh/test_Mesh.py index 48f9910099..a47d093af0 100644 --- a/lib/iris/tests/unit/experimental/ugrid/mesh/test_Mesh.py +++ b/lib/iris/tests/unit/experimental/ugrid/mesh/test_Mesh.py @@ -65,7 +65,7 @@ class TestProperties1D(TestMeshCommon): @classmethod def setUpClass(cls): super().setUpClass() - # Mesh kwargs with topology_dimension=1 and all applicable + # MeshXY kwargs with topology_dimension=1 and all applicable # arguments populated - this tests correct property setting. cls.kwargs = { "topology_dimension": 1, @@ -78,7 +78,7 @@ def setUpClass(cls): "edge_dimension": "EdgeDim", "edge_coords_and_axes": ((cls.EDGE_LON, "x"), (cls.EDGE_LAT, "y")), } - cls.mesh = mesh.Mesh(**cls.kwargs) + cls.mesh = mesh.MeshXY(**cls.kwargs) def test__metadata_manager(self): self.assertEqual( @@ -95,12 +95,12 @@ def test___getstate__(self): self.assertEqual(expected, self.mesh.__getstate__()) def test___repr__(self): - expected = "" + expected = "" self.assertEqual(expected, repr(self.mesh)) def test___str__(self): expected = [ - "Mesh : 'my_topology_mesh'", + "MeshXY : 'my_topology_mesh'", " topology_dimension: 1", " node", " node_dimension: 'NodeDim'", @@ -127,13 +127,13 @@ def test___eq__(self): # The dimension names do not participate in equality. equivalent_kwargs = self.kwargs.copy() equivalent_kwargs["node_dimension"] = "something_else" - equivalent = mesh.Mesh(**equivalent_kwargs) + equivalent = mesh.MeshXY(**equivalent_kwargs) self.assertEqual(equivalent, self.mesh) def test_different(self): different_kwargs = self.kwargs.copy() different_kwargs["long_name"] = "new_name" - different = mesh.Mesh(**different_kwargs) + different = mesh.MeshXY(**different_kwargs) self.assertNotEqual(different, self.mesh) different_kwargs = self.kwargs.copy() @@ -141,14 +141,14 @@ def test_different(self): new_lat = ncaa[1][0].copy(points=ncaa[1][0].points + 1) new_ncaa = (ncaa[0], (new_lat, "y")) different_kwargs["node_coords_and_axes"] = new_ncaa - different = mesh.Mesh(**different_kwargs) + different = mesh.MeshXY(**different_kwargs) self.assertNotEqual(different, self.mesh) different_kwargs = self.kwargs.copy() conns = self.kwargs["connectivities"] new_conn = conns[0].copy(conns[0].indices + 1) different_kwargs["connectivities"] = new_conn - different = mesh.Mesh(**different_kwargs) + different = mesh.MeshXY(**different_kwargs) self.assertNotEqual(different, self.mesh) def test_all_connectivities(self): @@ -223,11 +223,14 @@ def test_connectivities_elements(self): self.assertEqual([], func(contains_face=True)) def test_coord(self): - # See Mesh.coords tests for thorough coverage of cases. + # See MeshXY.coords tests for thorough coverage of cases. func = self.mesh.coord exception = CoordinateNotFoundError - self.assertRaisesRegex(exception, ".*but found 2", func, include_nodes=True) + self.assertRaisesRegex(exception, ".*but found 2", func, location="node") self.assertRaisesRegex(exception, ".*but found none", func, axis="t") + self.assertRaisesRegex( + ValueError, "Expected location.*got `foo`", func, location="foo" + ) def test_coords(self): # General results. Method intended for inheritance. @@ -238,6 +241,7 @@ def test_coords(self): {"long_name": "long_name"}, {"var_name": "node_lon"}, {"attributes": {"test": 1}}, + {"location": "node"}, ) fake_coord = AuxCoord([0]) @@ -248,6 +252,7 @@ def test_coords(self): {"long_name": "foo"}, {"var_name": "foo"}, {"attributes": {"test": 2}}, + {"location": "edge"}, ) func = self.mesh.coords @@ -256,6 +261,10 @@ def test_coords(self): for kwargs in negative_kwargs: self.assertNotIn(self.NODE_LON, func(**kwargs)) + self.assertRaisesRegex( + ValueError, "Expected location.*got.*foo", self.mesh.coords, location="foo" + ) + def test_coords_elements(self): # topology_dimension-specific results. Method intended to be overridden. all_expected = { @@ -268,19 +277,9 @@ def test_coords_elements(self): kwargs_expected = ( ({"axis": "x"}, ["node_x", "edge_x"]), ({"axis": "y"}, ["node_y", "edge_y"]), - ({"include_nodes": True}, ["node_x", "node_y"]), - ({"include_edges": True}, ["edge_x", "edge_y"]), - ({"include_nodes": False}, ["edge_x", "edge_y"]), - ({"include_edges": False}, ["node_x", "node_y"]), - ( - {"include_nodes": True, "include_edges": True}, - ["node_x", "node_y", "edge_x", "edge_y"], - ), - ({"include_nodes": False, "include_edges": False}, []), - ( - {"include_nodes": False, "include_edges": True}, - ["edge_x", "edge_y"], - ), + ({"location": "node"}, ["node_x", "node_y"]), + ({"location": "edge"}, ["edge_x", "edge_y"]), + ({"location": "face"}, ["face_x", "face_y"]), ) func = self.mesh.coords @@ -290,7 +289,7 @@ def test_coords_elements(self): log_regex = r".*filter non-existent.*" with self.assertLogs(logger, level="DEBUG", msg_regex=log_regex): - self.assertEqual([], func(include_faces=True)) + self.assertEqual([], func(location="face")) def test_edge_dimension(self): self.assertEqual(self.kwargs["edge_dimension"], self.mesh.edge_dimension) @@ -361,15 +360,15 @@ def setUpClass(cls): (cls.FACE_LON, "x"), (cls.FACE_LAT, "y"), ) - cls.mesh = mesh.Mesh(**cls.kwargs) + cls.mesh = mesh.MeshXY(**cls.kwargs) def test___repr__(self): - expected = "" + expected = "" self.assertEqual(expected, repr(self.mesh)) def test___str__(self): expected = [ - "Mesh : 'my_topology_mesh'", + "MeshXY : 'my_topology_mesh'", " topology_dimension: 2", " node", " node_dimension: 'NodeDim'", @@ -418,9 +417,9 @@ def test___str__(self): def test___str__noedgecoords(self): mesh_kwargs = self.kwargs.copy() del mesh_kwargs["edge_coords_and_axes"] - alt_mesh = mesh.Mesh(**mesh_kwargs) + alt_mesh = mesh.MeshXY(**mesh_kwargs) expected = [ - "Mesh : 'my_topology_mesh'", + "MeshXY : 'my_topology_mesh'", " topology_dimension: 2", " node", " node_dimension: 'NodeDim'", @@ -488,8 +487,8 @@ def test_boundary_node(self): self.assertEqual(self.BOUNDARY_NODE, self.mesh.boundary_node_connectivity) def test_connectivity(self): - # See Mesh.connectivities tests for thorough coverage of cases. - # Can only test Mesh.connectivity for 2D since we need >1 connectivity. + # See MeshXY.connectivities tests for thorough coverage of cases. + # Can only test MeshXY.connectivity for 2D since we need >1 connectivity. func = self.mesh.connectivity exception = ConnectivityNotFoundError self.assertRaisesRegex(exception, ".*but found 3", func, contains_node=True) @@ -571,32 +570,8 @@ def test_coords_elements(self): kwargs_expected = ( ({"axis": "x"}, ["node_x", "edge_x", "face_x"]), ({"axis": "y"}, ["node_y", "edge_y", "face_y"]), - ({"include_nodes": True}, ["node_x", "node_y"]), - ({"include_edges": True}, ["edge_x", "edge_y"]), - ( - {"include_nodes": False}, - ["edge_x", "edge_y", "face_x", "face_y"], - ), - ( - {"include_edges": False}, - ["node_x", "node_y", "face_x", "face_y"], - ), - ( - {"include_faces": False}, - ["node_x", "node_y", "edge_x", "edge_y"], - ), - ( - {"include_faces": True, "include_edges": True}, - ["edge_x", "edge_y", "face_x", "face_y"], - ), - ( - {"include_faces": False, "include_edges": False}, - ["node_x", "node_y"], - ), - ( - {"include_faces": False, "include_edges": True}, - ["edge_x", "edge_y"], - ), + ({"location": "node"}, ["node_x", "node_y"]), + ({"location": "edge"}, ["edge_x", "edge_y"]), ) func = self.mesh.coords @@ -630,7 +605,7 @@ def setUp(self): # All the tests here want modified meshes, so use standard setUp to # create afresh for each test, allowing them to modify it. super().setUp() - # Mesh kwargs with topology_dimension=1 and all applicable + # MeshXY kwargs with topology_dimension=1 and all applicable # arguments populated - this tests correct property setting. self.kwargs = { "topology_dimension": 1, @@ -649,21 +624,21 @@ def setUp(self): (self.EDGE_LAT, "y"), ), } - self.mesh = mesh.Mesh(**self.kwargs) + self.mesh = mesh.MeshXY(**self.kwargs) def test___repr__basic(self): - expected = "" + expected = "" self.assertEqual(expected, repr(self.mesh)) def test___repr__varname(self): self.mesh.long_name = None - expected = "" + expected = "" self.assertEqual(expected, repr(self.mesh)) def test___repr__noname(self): self.mesh.long_name = None self.mesh.var_name = None - expected = "" + expected = "" self.assertRegex(repr(self.mesh), expected) def test___str__noattributes(self): @@ -692,7 +667,7 @@ def test___str__units_stdname(self): mesh_kwargs = self.kwargs.copy() mesh_kwargs["standard_name"] = "height" # Odd choice ! mesh_kwargs["units"] = "m" - alt_mesh = mesh.Mesh(**mesh_kwargs) + alt_mesh = mesh.MeshXY(**mesh_kwargs) result = str(alt_mesh) # We expect these to appear at the end. expected = "\n".join( @@ -712,10 +687,10 @@ def test___str__units_stdname(self): class TestOperations1D(TestMeshCommon): - # Tests that cannot reuse an existing Mesh instance, instead need a new + # Tests that cannot reuse an existing MeshXY instance, instead need a new # one each time. def setUp(self): - self.mesh = mesh.Mesh( + self.mesh = mesh.MeshXY( topology_dimension=1, node_coords_and_axes=((self.NODE_LON, "x"), (self.NODE_LAT, "y")), connectivities=self.EDGE_NODE, @@ -1049,7 +1024,7 @@ def test_to_MeshCoords_face(self): class TestOperations2D(TestOperations1D): # Additional/specialised tests for topology_dimension=2. def setUp(self): - self.mesh = mesh.Mesh( + self.mesh = mesh.MeshXY( topology_dimension=2, node_coords_and_axes=((self.NODE_LON, "x"), (self.NODE_LAT, "y")), connectivities=(self.FACE_NODE), @@ -1196,7 +1171,7 @@ def test_remove_coords(self): super().test_remove_coords() self.mesh.add_coords(face_x=self.FACE_LON) self.assertEqual(self.FACE_LON, self.mesh.face_coords.face_x) - self.mesh.remove_coords(include_faces=True) + self.mesh.remove_coords(location="face") self.assertEqual(None, self.mesh.face_coords.face_x) def test_to_MeshCoord_face(self): @@ -1233,7 +1208,7 @@ def test_invalid_topology(self): self.assertRaisesRegex( ValueError, "Expected 'topology_dimension'.*", - mesh.Mesh, + mesh.MeshXY, **kwargs, ) @@ -1245,7 +1220,7 @@ def test_invalid_axes(self): self.assertRaisesRegex( ValueError, "Invalid axis specified for node.*", - mesh.Mesh, + mesh.MeshXY, node_coords_and_axes=( (self.NODE_LON, "foo"), (self.NODE_LAT, "y"), @@ -1259,14 +1234,14 @@ def test_invalid_axes(self): self.assertRaisesRegex( ValueError, "Invalid axis specified for edge.*", - mesh.Mesh, + mesh.MeshXY, edge_coords_and_axes=((self.EDGE_LON, "foo"),), **kwargs, ) self.assertRaisesRegex( ValueError, "Invalid axis specified for face.*", - mesh.Mesh, + mesh.MeshXY, face_coords_and_axes=((self.FACE_LON, "foo"),), **kwargs, ) @@ -1286,7 +1261,7 @@ def test_minimum_connectivities(self): self.assertRaisesRegex( ValueError, ".*requires a edge_node_connectivity.*", - mesh.Mesh, + mesh.MeshXY, **kwargs, ) @@ -1300,7 +1275,7 @@ def test_minimum_coords(self): self.assertRaisesRegex( ValueError, ".*is a required coordinate.*", - mesh.Mesh, + mesh.MeshXY, **kwargs, ) diff --git a/lib/iris/tests/unit/experimental/ugrid/mesh/test_MeshCoord.py b/lib/iris/tests/unit/experimental/ugrid/mesh/test_MeshCoord.py index 7bacd46755..3f81085fa9 100644 --- a/lib/iris/tests/unit/experimental/ugrid/mesh/test_MeshCoord.py +++ b/lib/iris/tests/unit/experimental/ugrid/mesh/test_MeshCoord.py @@ -21,7 +21,7 @@ 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, Mesh, MeshCoord +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.warnings import IrisVagueMetadataWarning @@ -50,9 +50,9 @@ def test_basic(self): def test_derived_properties(self): # Check the derived properties of the meshcoord against the correct # underlying mesh coordinate. - for axis in Mesh.AXES: + for axis in MeshXY.AXES: meshcoord = sample_meshcoord(axis=axis) - face_x_coord = meshcoord.mesh.coord(include_faces=True, axis=axis) + face_x_coord = meshcoord.mesh.coord(location="face", axis=axis) for key in face_x_coord.metadata._fields: meshval = getattr(meshcoord, key) # All relevant attributes are derived from the face coord. @@ -63,16 +63,16 @@ def test_fail_bad_mesh(self): sample_meshcoord(mesh=mock.sentinel.odd) def test_valid_locations(self): - for loc in Mesh.ELEMENTS: + for loc in MeshXY.ELEMENTS: meshcoord = sample_meshcoord(location=loc) self.assertEqual(meshcoord.location, loc) def test_fail_bad_location(self): - with self.assertRaisesRegex(ValueError, "not a valid Mesh location"): + with self.assertRaisesRegex(ValueError, "not a valid MeshXY location"): sample_meshcoord(location="bad") def test_fail_bad_axis(self): - with self.assertRaisesRegex(ValueError, "not a valid Mesh axis"): + with self.assertRaisesRegex(ValueError, "not a valid MeshXY axis"): sample_meshcoord(axis="q") @@ -280,7 +280,7 @@ def _expected_elements_regexp( # Construct regexp in 'sections' # NB each consumes up to first non-space in the next line regexp = f"MeshCoord : {coord_name} / [^\n]+\n *" - regexp += r"mesh: \\n *" + regexp += r"mesh: \\n *" regexp += f"location: '{location}'\n *" # Now some optional sections : whichever comes first will match @@ -349,7 +349,7 @@ def test_repr__nameless_mesh(self): result = repr(self.meshcoord) re_expected = ( r".MeshCoord: longitude / \(unknown\) " - r"mesh\(.Mesh object at 0x[^>]+.\) location\(face\) " + r"mesh\(.MeshXY object at 0x[^>]+.\) location\(face\) " ) self.assertRegex(result, re_expected) @@ -390,7 +390,7 @@ def test_alternative_location_and_axis(self): def test_str_no_long_name(self): mesh = self.mesh # Remove the long_name of the node coord in the mesh. - node_coord = mesh.coord(include_nodes=True, axis="x") + node_coord = mesh.coord(location="node", axis="x") node_coord.long_name = None # Make a new meshcoord, based on the modified mesh. meshcoord = sample_meshcoord(mesh=self.mesh) @@ -401,7 +401,7 @@ def test_str_no_long_name(self): def test_str_no_attributes(self): mesh = self.mesh # No attributes on the node coord in the mesh. - node_coord = mesh.coord(include_nodes=True, axis="x") + node_coord = mesh.coord(location="node", axis="x") node_coord.attributes = None # Make a new meshcoord, based on the modified mesh. meshcoord = sample_meshcoord(mesh=self.mesh) @@ -412,7 +412,7 @@ def test_str_no_attributes(self): def test_str_empty_attributes(self): mesh = self.mesh # Empty attributes dict on the node coord in the mesh. - node_coord = mesh.coord(include_nodes=True, axis="x") + node_coord = mesh.coord(location="node", axis="x") node_coord.attributes.clear() # Make a new meshcoord, based on the modified mesh. meshcoord = sample_meshcoord(mesh=self.mesh) @@ -607,7 +607,7 @@ def lazify(arr): co_edgex = AuxCoord( edge_xs, standard_name="longitude", long_name="edge_x", units=1 ) - # N.B. the Mesh requires 'Y's as well. + # N.B. the MeshXY requires 'Y's as well. co_nodey = co_nodex.copy() co_nodey.rename("latitude") co_nodey.long_name = "node_y" @@ -644,7 +644,7 @@ def lazify(arr): location_axis=inds_location_axis, ) - self.mesh = Mesh( + self.mesh = MeshXY( topology_dimension=2, node_coords_and_axes=[(co_nodex, "x"), (co_nodey, "y")], connectivities=[face_node_conn, edge_node_conn], @@ -743,8 +743,8 @@ def test_meshcoord_leaves_originals_lazy(self): # Fetch the relevant source objects from the mesh. def fetch_sources_from_mesh(): return ( - mesh.coord(include_nodes=True, axis="x"), - mesh.coord(include_faces=True, axis="x"), + mesh.coord(location="node", axis="x"), + mesh.coord(location="face", axis="x"), mesh.face_node_connectivity, ) @@ -795,12 +795,8 @@ def setup_mesh(self, location, axis): mesh = sample_mesh() # Modify the metadata of specific coordinates used in this test. - def select_coord(location, axis): - kwargs = {f"include_{location}s": True, "axis": axis} - return mesh.coord(**kwargs) - - node_coord = select_coord("node", axis) - location_coord = select_coord(location, axis) + node_coord = mesh.coord(axis=axis, location="node") + location_coord = mesh.coord(axis=axis, location=location) for i_place, coord in enumerate((node_coord, location_coord)): coord.standard_name = "longitude" if axis == "x" else "latitude" coord.units = "degrees" @@ -879,7 +875,7 @@ def test_faceedge_fail_missing_stdnames(self, location_face_or_edge, axis_x_or_y self.setup_mesh(location_face_or_edge, axis_x_or_y) self.node_coord.standard_name = None # N.B. in the absence of a standard-name, we **must** provide an extra ".axis" - # property, or the coordinate cannot be correctly identified in the Mesh. + # property, or the coordinate cannot be correctly identified in the MeshXY. # This is a bit of a kludge, but works with current code. self.node_coord.axis = axis_x_or_y diff --git a/lib/iris/tests/unit/experimental/ugrid/mesh/test_Mesh__from_coords.py b/lib/iris/tests/unit/experimental/ugrid/mesh/test_Mesh__from_coords.py index aa45e0be70..8ea9c81060 100644 --- a/lib/iris/tests/unit/experimental/ugrid/mesh/test_Mesh__from_coords.py +++ b/lib/iris/tests/unit/experimental/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.Mesh.from_coords`.""" +"""Unit tests for the :meth:`iris.experimental.ugrid.mesh.MeshXY.from_coords`.""" # Import iris.tests first so that some things can be initialised before # importing anything else. @@ -12,7 +12,7 @@ from iris.coords import AuxCoord, DimCoord from iris.experimental.ugrid import logger -from iris.experimental.ugrid.mesh import Connectivity, Mesh +from iris.experimental.ugrid.mesh import Connectivity, MeshXY from iris.tests.stock import simple_2d_w_multidim_coords @@ -39,7 +39,7 @@ def setUp(self): ) def create(self): - return Mesh.from_coords(self.lon, self.lat) + return MeshXY.from_coords(self.lon, self.lat) def test_dimensionality(self): mesh = self.create() @@ -207,7 +207,7 @@ def test_no_bounds(self): lon = AuxCoord(points=[0.5, 1.5, 2.5]) lat = AuxCoord(points=[0, 1, 2]) with self.assertRaisesRegex(ValueError, "bounds missing from"): - _ = Mesh.from_coords(lon, lat) + _ = MeshXY.from_coords(lon, lat) def test_1_bound(self): lon = AuxCoord(points=[0.5, 1.5, 2.5], bounds=[[0], [1], [2]]) @@ -215,7 +215,7 @@ def test_1_bound(self): with self.assertRaisesRegex( ValueError, r"Expected coordinate bounds.shape \(n, >=2\)" ): - _ = Mesh.from_coords(lon, lat) + _ = MeshXY.from_coords(lon, lat) class TestInvalidPoints(tests.IrisTest): @@ -225,4 +225,4 @@ def test_2d_coord(self): cube = simple_2d_w_multidim_coords()[:3, :3] coord_1, coord_2 = cube.coords() with self.assertRaisesRegex(ValueError, "Expected coordinate ndim == 1"): - _ = Mesh.from_coords(coord_1, coord_2) + _ = MeshXY.from_coords(coord_1, coord_2) 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 599650d759..e86ecf9a52 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,7 +22,7 @@ from iris import save from iris.coords import AuxCoord from iris.cube import Cube, CubeList -from iris.experimental.ugrid.mesh import Connectivity, Mesh +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 @@ -115,7 +115,7 @@ def apply_xyargs(coords, xyargs): connectivities[role] = conn applyargs(conn, kwargs) - mesh = Mesh( + mesh = MeshXY( topology_dimension=topology_dimension, node_coords_and_axes=zip(node_coords, XY_LOCS), edge_coords_and_axes=zip(edge_coords, XY_LOCS), @@ -196,7 +196,7 @@ def make_cube(mesh=None, location="face", **kwargs): Parameters ---------- - mesh : :class:`iris.experimental.ugrid.mesh.Mesh` or None, optional + mesh : :class:`iris.experimental.ugrid.mesh.MeshXY` or None, optional If None, use 'default_mesh()' location : str, optional, default="face" Which mesh element to map the cube to. @@ -719,7 +719,7 @@ def test_connectivity_dim_order(self): nodesfirst_faces_conn = face_nodes_conn.transpose() nodesfirst_edges_conn = edge_nodes_conn.transpose() # Make a new mesh with both face and edge connectivities 'transposed'. - mesh2 = Mesh( + mesh2 = MeshXY( topology_dimension=mesh.topology_dimension, node_coords_and_axes=zip(mesh.node_coords, XY_LOCS), face_coords_and_axes=zip(mesh.face_coords, XY_LOCS), @@ -768,7 +768,7 @@ def test_connectivity_start_index(self): start_index=1, ) # Make a new mesh with altered connectivities. - mesh2 = Mesh( + mesh2 = MeshXY( topology_dimension=mesh.topology_dimension, node_coords_and_axes=zip(mesh.node_coords, XY_LOCS), face_coords_and_axes=zip(mesh.face_coords, XY_LOCS), @@ -870,7 +870,7 @@ def test_one_dimensional(self): def test_location_coord_units(self): # Check that units on mesh locations are handled correctly. - # NOTE: at present, the Mesh class cannot handle coordinates that are + # NOTE: at present, the MeshXY class cannot handle coordinates that are # not recognised by 'guess_coord_axis' == suitable standard names mesh = make_mesh( nodecoord_xyargs=( @@ -954,7 +954,7 @@ def test_mesh_names(self): (None, None, "meshvar_x"), (None, None, "meshvar_x"), ), - # standard_name only : does not apply to Mesh + # standard_name only : does not apply to MeshXY ( ("air_temperature", None, None), ("air_temperature", None, "Mesh_2d"), @@ -1017,7 +1017,7 @@ def test_location_coord_names(self): # N.B. this is basically centralised in Saver._get_mesh_variable_name, # but we test in an implementation-neutral way (as it's fairly easy). - # Options here are limited because the Mesh relies on guess_axis so, + # Options here are limited because the MeshXY relies on guess_axis so, # for now anyway, coords *must* have a known X/Y-type standard-name coord_names_tests = [ # standard_name only @@ -1041,7 +1041,7 @@ def test_location_coord_names(self): ("projection_x_coordinate", "long name", "x_var_name"), ), # # no standard name ? - # # not possible at present, as Mesh requires a recognisable + # # not possible at present, as MeshXY requires a recognisable # # standard_name to identify the axis of a location-coord. # # TODO: test this if+when Mesh usage is relaxed # ( diff --git a/lib/iris/tests/unit/tests/stock/test_netcdf.py b/lib/iris/tests/unit/tests/stock/test_netcdf.py index dbdd321663..e88d3f6abb 100644 --- a/lib/iris/tests/unit/tests/stock/test_netcdf.py +++ b/lib/iris/tests/unit/tests/stock/test_netcdf.py @@ -9,7 +9,7 @@ from iris import load_cube from iris.experimental.ugrid.load import PARSE_UGRID_ON_LOAD -from iris.experimental.ugrid.mesh import Mesh, MeshCoord +from iris.experimental.ugrid.mesh import MeshCoord, MeshXY # Import iris.tests first so that some things can be initialised before # importing anything else. @@ -50,7 +50,7 @@ def check_cube(self, cube, shape, location, level): # Also a few checks on the attached mesh-related information. last_dim = cube.ndim - 1 - self.assertIsInstance(cube.mesh, Mesh) + self.assertIsInstance(cube.mesh, MeshXY) self.assertEqual(cube.mesh_dim(), last_dim) self.assertEqual(cube.location, location) for coord_name in ("longitude", "latitude"): diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 96797f3359..44fb57644b 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -1,9 +1,9 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: a45f73f1b97a56ff99d022f070c005c4df54d79339b00f9e2eed332b90811baf +# input_hash: ae0608976ff47569c86692e74307d174a2bf60467441b37c1f0679cff7953c4c @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.6.2-hbcca054_0.conda#847c3c2905cc467cea52c24f9cfa8080 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda#23ab7665c5f63cfb9f1f6195256daac6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb @@ -14,14 +14,12 @@ https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-4_cp310.conda#26 https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 https://conda.anaconda.org/conda-forge/linux-64/utfcpp-4.0.5-ha770c72_0.conda#25965c1d1d5fc00ce2b663b73008e3b7 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_11.conda#8c462ced2af33648195dc9459f331f31 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda#ae061a5ed5f05818acdf9adab72c146d https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_11.conda#0b3b218a596bb4c3854cc9ee799f94e5 -https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.12-h4ab18f5_0.conda#7ed427f0871fd41cb1d9c17727c17589 -https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2#d9c69a24ad678ffce24c6543a0176b00 -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.2-h4bc722e_0.conda#8024af1ee7078e37fa3101c0a0296af2 https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995 https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2#ac7bc6a654f8f41b352b38f4051135f8 https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.22.5-h59595ed_2.conda#985f2f453fb72408d6b6f1be0f324033 @@ -34,32 +32,38 @@ https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172b https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.22.5-h59595ed_2.conda#172bcc51059416e7ce99e7b528cede83 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-h3d2ce59_11.conda#c485da4fdb454539f852a90ae06e9bb7 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_0.conda#6456c2620c990cd8dde2428a27ba0bc5 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2#6e8cc2173440d77708196c5b93771680 +https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-h4ab18f5_0.conda#601bfb4b3c6f0b844443bb81a56651e0 https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2#15345e56d527b330e1cacbdf58676e8f https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_11.conda#eaa8ea74083fb4a78ae19e431e556003 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-hc0a3c3a_0.conda#1cb187a157136398ddbaae90713e2498 https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.19.0-h166bdaf_0.tar.bz2#93840744a8552e9ebf6bb1a5dffc125a https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2#7245a044b4a1980ed83196176b78b73a https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h4ab18f5_6.conda#27329162c0dc732bcf67a4e0cd488125 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 +https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-hd590300_1001.conda#ec7398d21e2651e0dcb0044d03b9a339 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 https://conda.anaconda.org/conda-forge/linux-64/nettle-3.9.1-h7ab15ed_0.conda#2bf1915cc107738811368afcb0993a59 https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hd590300_1.conda#c66f837ac65e4d1cdeb80e2a1d5fcc3d -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4ab18f5_0.conda#a41fa0e391cc9e0d6b78ac69ca047a6c +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4bc722e_2.conda#e1b454497f9f7c1147fdde4b53f1b512 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/x264-1!164.3095-h166bdaf_2.tar.bz2#6c99772d483f566d59e25037fea2c4b1 +https://conda.anaconda.org/conda-forge/linux-64/xorg-damageproto-1.2.1-h7f98852_1002.tar.bz2#58c9bb067637c5a13a045a7124eeb027 +https://conda.anaconda.org/conda-forge/linux-64/xorg-glproto-1.4.17-h7f98852_1002.tar.bz2#e41bf01f80d46be87dcae2333a766e75 https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hd590300_0.conda#b462a33c0be1421532f28bfe8f4a7514 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 +https://conda.anaconda.org/conda-forge/linux-64/xorg-randrproto-1.5.0-h7f98852_1001.tar.bz2#68cce654461713977dac6f9ac1bce89a https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852_1002.tar.bz2#06feff3d2634e3097ce2fe681474b534 +https://conda.anaconda.org/conda-forge/linux-64/xorg-util-macros-1.19.3-h7f98852_0.tar.bz2#b1780cc89cf3949f670d6ca2aa6a7e42 https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xf86vidmodeproto-2.3.1-h7f98852_1002.tar.bz2#3ceea9668625c18f19530de98b15d5b0 https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 @@ -68,23 +72,22 @@ https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda#34672 https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda#c2f83a5ddadadcdb08fe05863295ee97 https://conda.anaconda.org/conda-forge/linux-64/eigen-3.4.0-h00ab1b0_0.conda#b1b879d6d093f55dd40d58b5eb2f0699 https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda#53fb86322bdb89496d7579fe3f02fd61 -https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d +https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.2-hac33072_0.conda#621d814955342209dc8e7f87c41f1ba0 https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda#c94a5994ef49749880a8139cf9afcbe1 https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/jsoncpp-1.9.5-h4bd325d_1.tar.bz2#ae7f50dd1e78c7e78b5d2cf7062e559d https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240116.2-cxx17_h59595ed_0.conda#682bdbe046a68f749769b492f3625c5c +https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240116.2-cxx17_he02047a_1.conda#c48fc56ec03229f294176923c3265c05 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-h661eb56_2.conda#dd197c968bf9760bba0031888d431ede https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d -https://conda.anaconda.org/conda-forge/linux-64/libcap-2.69-h0f662aa_0.conda#25cb5999faa414e5ccb2c1388f62d3d5 -https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.121-h4ab18f5_0.conda#3bcee3436b1effa9a3caee2b74175c08 +https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.122-h4ab18f5_0.conda#bbfc4dbe5e97b385ef088f354d65e563 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.22.5-h59595ed_2.conda#b63d9b6da3653179a278077f0de20014 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_11.conda#4c3e460d6acf8e43e4ce8bf405187eb7 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_0.conda#f4ca84fbd6d06b0a052fb2d5b96dde41 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae @@ -93,54 +96,48 @@ https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 https://conda.anaconda.org/conda-forge/linux-64/libvpx-1.14.1-hac33072_0.conda#cde393f461e0c169d9ffb2fc70f81c33 -https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hd590300_0.conda#151cba22b85a989c2d6ef9633ffee1e4 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 -https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.6-h59595ed_0.conda#9160cdeb523a1b20cf8d2a0bf821f45d -https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.3.0-hf1915f5_4.conda#784a4df6676c581ca624fbe460703a6d https://conda.anaconda.org/conda-forge/linux-64/openh264-2.4.1-h59595ed_0.conda#3dfcf61b8e78af08110f5229f79580af https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.24.1-hc5aa10d_0.tar.bz2#56ee94e34b71742bbdfa832c974e47a8 -https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda#8292dea9e022d9610a11fce5e0896ed8 +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-h0f59acf_0.conda#3914f7ac1761dce57102c72ca7c35d01 https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 https://conda.anaconda.org/conda-forge/linux-64/pugixml-1.14-h59595ed_0.conda#2c97dd90633508b422c11bd3018206ab https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 -https://conda.anaconda.org/conda-forge/linux-64/svt-av1-2.1.0-hac33072_0.conda#2a08edb7cd75e56623f2712292a97325 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda#6b7dcc7349efd123d493d2dbe85a045f +https://conda.anaconda.org/conda-forge/linux-64/svt-av1-2.1.2-hac33072_0.conda#06c5dec4ebb47213b648a6c4dc8400d6 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.0-h5291e77_0.conda#c13ca0abd5d1d31d0eebcf86d51da8a4 https://conda.anaconda.org/conda-forge/linux-64/x265-3.5-h924138e_3.tar.bz2#e7f6ed84d4623d52ee581325c1587a6b https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda#93ee23f12bc2e684548181256edd2cf6 -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h4ab18f5_6.conda#559d338a4234c2ad6e676f460a093e67 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-hc2324a3_1.conda#11d76bee958b1989bd1ac6ee7372ea6d +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-hef167b5_0.conda#54fe76ab3d0189acaef95156874db7f9 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb -https://conda.anaconda.org/conda-forge/linux-64/gl2ps-1.4.2-h0708190_0.tar.bz2#438718bf8921ac70956d919d0e2cc487 -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 +https://conda.anaconda.org/conda-forge/linux-64/gl2ps-1.4.2-hae5d5c5_1.conda#00e642ec191a19bf806a3915800e9524 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-h661eb56_2.conda#02e41ab5834dcdcc8590cf29d9526f50 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.2-hf974151_0.conda#72724f6a78ecb15559396966226d5838 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda#a356024784da6dfd4683dc5ecf45b155 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.3-h8a4344b_1.conda#6ea440297aacee4893f02ad759e6ffbc +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.3-h08a7969_0.conda#6945825cebd2aeb16af4c69d97c32c13 -https://conda.anaconda.org/conda-forge/linux-64/libtheora-1.1.1-h7f98852_1005.tar.bz2#1a7c35f56343b7e9e8db20b296c7566c +https://conda.anaconda.org/conda-forge/linux-64/libtheora-1.1.1-h4ab18f5_1006.conda#553281a034e9cf8693c9df49f6c78ea1 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda#340278ded8b0dc3a73f3660bbb0adbc6 -https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.3.0-hca2cd23_4.conda#1b50eebe2a738a3146c154d2eceaa8b6 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-h4c95cb1_3.conda#0ac9aff6010a7751961c8e4b863a40e7 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.14-hd12c33a_0_cpython.conda#2b4ba962994e8bd4be9ff5b64b75aff2 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.0-h6d4b2fc_0.conda#77ea8dff5cf8550cc8f5629a6af56323 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-hd590300_1.conda#9bfac7ccd94d54fd21a0501296d60424 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h8ee46fc_1.conda#632413adcd8bc16b515cab87a2932913 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.9-hd590300_1.conda#e995b155d938b6779da6ace6c6b13816 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.1-h8ee46fc_1.conda#90108a432fb5c6150ccfee3f03388656 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec +https://conda.anaconda.org/conda-forge/noarch/wayland-protocols-1.36-hd8ed1ab_0.conda#c6f690e7d4abf562161477f14533cfd8 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-hb711507_1.conda#4a6d410296d7e39f00bacdee7df046e9 https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda#f730d54ba9cd543666d7220c9f7ed563 https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py310hc6cd4ac_1.conda#1f95722c94f00b69af69a066c7433714 -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.6.2-pyhd8ed1ab_0.conda#8821ec1c8fcdc9e1d291d7b9f6e9968a +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca @@ -149,31 +146,30 @@ https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz https://conda.anaconda.org/conda-forge/noarch/colorcet-3.1.0-pyhd8ed1ab_0.conda#4d155b600b63bc6ba89d91fab74238f8 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.10-py310hc6cd4ac_0.conda#bd1d71ee240be36f1d85c86177d6964f -https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda#e8cd5d629f65bdf0f3bb312cde14659e -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda#15dda3cdbf330abfe9f555d22f66db46 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.3-pyhd8ed1ab_0.conda#eae681f708bd52d9d172bd5c9af23898 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.4-pyhd8ed1ab_0.conda#0e7e4388e9d5283e22b35a9443bdbcc9 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.1-py310h2372a71_0.conda#f20cd4d9c1f4a8377d0818c819918bbb -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.0-pyhff2d567_0.conda#ad6af3f92e71b1579ac2362b6cf29105 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.1-pyhff2d567_0.conda#996bf792cdb8c0ac38ff54b9fde56841 https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.12-hb9ae30d_0.conda#201db6c2d9a3c5e46573ac4cb2e92f4f https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-h59595ed_2.conda#219ba82e95d7614cf7140d2a4afc0926 -https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.2-hb6ce0ca_0.conda#a965aeaf060289528a3fbe09326edae2 https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe +https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_0.tar.bz2#18ee9c07cf945a33f92caf1ee3d23ad9 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py310hd41b1e2_1.conda#b8d67603d43b23ce7e988a5d81a7ab79 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 +https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.4-hfca40fe_0.conda#32ddb97f897740641d8d46a829ce1704 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda#1a2a0cd3153464fee6646f3dd6dad9b8 -https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_0.conda#f21c27f076a07907e70c49bb57bd0f20 -https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.10.0-default_h5622ce7_1001.conda#fc2d5b79c2d3f8568fbab31db7ae02f3 -https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.7-hb77312f_0.conda#bc0ea7e1f75a9b1c8467597fbbd9f86b -https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_1.conda#b8afb3e3cb3423cc445cf611ab95fdb0 +https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.1-default_hecaa2ac_1000.conda#f54aeebefb5c5ff84eca4fb05ca8aa3a +https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.8-h8b73ec9_1.conda#16d94b3586ef3558e5a583598524deb4 https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.4.0-h2c329e2_0.conda#80030debaa84cfc31755d53742df3ca6 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/loguru-0.7.2-py310hff52083_1.conda#157e6221a079a60c7f6f6fcb87c722aa @@ -185,7 +181,7 @@ https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda# https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda#6f6cf28bf8e021933869bae3f84b8fc9 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf -https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py310h2372a71_0.conda#bd19b3096442ea342c4a5208379660b1 +https://conda.anaconda.org/conda-forge/linux-64/psutil-6.0.0-py310hc51659f_0.conda#b04405826f96f4eb2f502e642d121bb5 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f @@ -196,7 +192,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py310h2372a7 https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py310h2372a71_1.conda#bb010e368de4940771368bc3dc4c63e7 https://conda.anaconda.org/conda-forge/noarch/scooby-0.10.0-pyhd8ed1ab_0.conda#9e57330f431abbb4c88a5f898a4ba223 -https://conda.anaconda.org/conda-forge/noarch/setuptools-70.1.0-pyhd8ed1ab_0.conda#258e66f95f814d51ada2a1fe9274039b +https://conda.anaconda.org/conda-forge/noarch/setuptools-71.0.1-pyhd8ed1ab_0.conda#aede3d5c0882ebed2f07024400a111ed https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2#6d6552722448103793743dabfbda532d @@ -210,8 +206,6 @@ https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py310hc51659f_0.co https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 https://conda.anaconda.org/conda-forge/linux-64/unicodedata2-15.1.0-py310h2372a71_0.conda#72637c58d36d9475fda24700c9796f19 https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h8ee46fc_1.conda#9d7bcddf49cbf727730af10e71022c73 -https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.42-h4ab18f5_0.conda#b193af204da1bfb8c13882d131a14bd2 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_0.conda#ed67c36f215b310412b2af935bf3e530 @@ -222,116 +216,108 @@ https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1 https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2#d1e1eb7e21a9e2c74279d87dafb68156 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 -https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e +https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-hbb29018_2.conda#b6d90276c5aee9b4407dd94eb0cd40a8 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py310h2fee648_0.conda#45846a970e71ac98fd327da5d40a0a2c https://conda.anaconda.org/conda-forge/noarch/click-default-group-1.2.4-pyhd8ed1ab_0.conda#7c2b6931f9b3548ed78478332095c3e9 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.3-py310hc51659f_0.conda#4be0e55c0f724d339be3d4dc9dfc5752 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.0-py310h5b4e0ec_0.conda#a13d72c877b47870042897a0e667cd3a https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.3-py310h2372a71_0.conda#21362970a6fea90ca507c253c20465f2 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.0-py310hc51659f_0.conda#0b6cd00b80d5af0bbfa261606ed56a18 -https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.2-hf974151_0.conda#d427988dc3dbd0a4c136f52db356cc6a +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py310h5b4e0ec_0.conda#2c5257cb35d1946f5e80a0cfd69ed7ec +https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.2.0-pyha770c72_0.conda#e1d9f6dc77209defc283bdf61588e968 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.0.0-pyha770c72_0.conda#3286556cdd99048d198f72c3f6f69103 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 -https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp18.1-18.1.7-default_h9bb3924_0.conda#bff3d36fbd1b1a2f1e6d34aa3eb6b58c -https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.7-default_h087397f_0.conda#536526073c2e7f9056fdce8584da779e -https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#ee48bf17cc83a00f59ca1494d5646869 https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h119a65a_9.conda#cfebc557e54905dadc355c0e9f003004 -https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca -https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.49-h4f305b6_0.conda#dfcfd72c7a430d3616763ecfbefe4ca9 https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.7-hd590300_0.conda#2b7b0d827c6447cc1d85dc06d5b5de46 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 -https://conda.anaconda.org/conda-forge/linux-64/libva-2.21.0-h4ab18f5_2.conda#109300f4eeeb8a61498283565106b474 -https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h662e7e4_0.conda#b32c0da42b1f24a98577bb3d7fc0b995 +https://conda.anaconda.org/conda-forge/linux-64/libva-2.22.0-hb711507_0.conda#d12f659072132c9d16e497073fc1f68b https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py310hf73ecf8_0.conda#1de56cf017dfd02aa84093206a0141a8 +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py310hebfe307_0.conda#89d70dfe2d59edcefc3881be6bff33a6 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.2-pyhd8ed1ab_0.conda#0f3f49c22c7ef3a1195fa61dad3c43be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.12.0-h297d8ca_1.conda#3ff978d8994f591818a506640c6a7071 +https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.12.0-h434a139_3.conda#c667c11d1e488a38220ede8a34441bff https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_0.conda#92cdb6fe54b78739ad70637e4f0deb07 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda#7d36e7a485ea2f5829408813bdbbfb38 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.4-hd590300_1.conda#1ecae8461689e44fe0f0e3d18e58e799 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.3-pyhd8ed1ab_0.conda#284008712816c64c85bf2b7fa9f3b264 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.5-h7f98852_1.tar.bz2#bebd3814ec2355fab6a474b07ed73093 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.2-h7f98852_1.tar.bz2#5b0f7da25a4556c9619c3e4b4a98ab07 https://conda.anaconda.org/conda-forge/linux-64/yarl-1.9.4-py310h2372a71_0.conda#4ad35c8f6a64a6ab708780dad603aef4 https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda#fdcbeb072c80c805a2ededaa5f91cd79 https://conda.anaconda.org/conda-forge/noarch/async-timeout-4.0.3-pyhd8ed1ab_0.conda#3ce482ec3066e6d809dbbb1d1679f215 -https://conda.anaconda.org/conda-forge/linux-64/glew-2.1.0-h9c3ff4c_2.tar.bz2#fb05eb5c47590b247658243d27fc32f1 https://conda.anaconda.org/conda-forge/linux-64/gnutls-3.7.9-hb077bed_0.conda#33eded89024f21659b1975886a4acf70 -https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.4-haf2f30d_0.conda#926c2c7ee7a0b48d6d70783a33f7bc80 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.5.0-hfac3d4d_0.conda#f5126317dd0ce0ba26945e411ecc6960 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.2.0-hd8ed1ab_0.conda#3de0087b2b86443cfae650dea6ecec6f -https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.10.3-hd590300_0.conda#32d16ad533c59bb0a3c5ffaf16110829 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hfac3d4d_0.conda#c7b47c64af53e8ecee01d101eeab2342 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.0.0-hd8ed1ab_0.conda#5f8c8ebbe6413a7838cf6ecf14d5d31b +https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.4-pyhd8ed1ab_0.conda#a284ff318fbdb0dd83928275b4b6087c https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2024.1.0-h2da1b83_7.conda#692bb11510bfceb34723c5115045096e -https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2024.2.0-h2da1b83_1.conda#9511859bf5221238a2d3fb5322af01d5 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py310hb13e2d6_0.conda#6593de64c935768b6bad3e19b3e978be https://conda.anaconda.org/conda-forge/noarch/pbr-6.0.0-pyhd8ed1ab_0.conda#8dbab5ba746ed14aa32cb232dc437f8f https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py310hd5c30f3_5.conda#dc2ee770a2299307f3c127af79160d25 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_0.conda#b39568655c127a9c4a44d178ac99b6d0 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e -https://conda.anaconda.org/conda-forge/linux-64/tbb-devel-2021.12.0-h7c56ddd_1.conda#f896f49efc2e33ab5d4d3690bb4f32ef +https://conda.anaconda.org/conda-forge/linux-64/tbb-devel-2021.12.0-hfcbfbdb_3.conda#dd410ed856f34c994f1549079ff601bf https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310hd41b1e2_4.conda#35e87277fba9944b8a975113538bb5df +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py310h64cae3c_0.conda#b527de1849629f2635dafc77745b015a https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.9.5-py310h2372a71_0.conda#00b6dda5bb36ac4226a051db2d406d22 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py310h261611a_0.conda#5c0e2cd80ceab2ac5201459cc016b88b https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py310hd41b1e2_0.conda#60ee50b1968f802f2a487ba36d4cce0d -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.6.2-pyhd8ed1ab_0.conda#048ca0ec2cd1f3995d2d36dec0efd99a -https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.4-h9ad1361_0.conda#147cce520ec59367549fd0d96d404213 -https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 -https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.1-h8fe9dca_1.conda#c306fd9cc90c0585171167d09135a827 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2024.1.0-hb045406_7.conda#d83d6787a9a002b626e20de84719da64 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2024.1.0-hb045406_7.conda#928f79281dbcc73e8e8fc2096b993b97 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2024.1.0-h5c03a75_7.conda#34db2a8d0504a807a735da48234e2a1d -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2024.1.0-h2da1b83_7.conda#22ef5cad44c9e3caecbee37465c33fca -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2024.1.0-h2da1b83_7.conda#98d53dafdd090d01ae50719eabe374e7 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-npu-plugin-2024.1.0-he02047a_7.conda#e766c8a98f4efef2e9be7146fad9b6f2 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2024.1.0-h5c03a75_7.conda#1eb037f090cb525857b01702b2afb6a0 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2024.1.0-h07e8aee_7.conda#019fb9bcd7ce0178fa85f3c610efb8c3 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2024.1.0-h07e8aee_7.conda#991c28a11b0ace4b340a445b538cece8 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2024.1.0-he02047a_7.conda#2b231b8cdbd2495706526ac1ab3c821c -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2024.1.0-h39126c6_7.conda#d6aac92f4b03be8c86b09f40e1f5263a -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2024.1.0-he02047a_7.conda#f7a46aa4f5c53423bf3e036da8c1b632 -https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_1.conda#3366af27f0b593544a6cd453c7932ac5 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.7.0-pyhd8ed1ab_0.conda#755e47653ae38f5c50f1435af756e844 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 +https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.1-h39113c1_2.conda#25db2ea6b8fefce451369e2cc826f6f4 +https://conda.anaconda.org/conda-forge/linux-64/libmicrohttpd-1.0.1-h97afed2_0.conda#00bd7406d24d6574f2de3839b60e0925 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2024.2.0-hb045406_1.conda#70d82a64e6d07f4d6e07cae6b0bd4bd1 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2024.2.0-hb045406_1.conda#f1e2a8ded23cef03804c4edb2edfb986 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2024.2.0-h5c03a75_1.conda#95d2d3baaa1e456ef65c713a5d99b815 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2024.2.0-h2da1b83_1.conda#9e49f87d8f99dc9724f52b3fac904106 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2024.2.0-h2da1b83_1.conda#a9712fae44d01d906e228c49235e3b89 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-npu-plugin-2024.2.0-he02047a_1.conda#5c2d064181e686cf5cfac6f1a1ee4e91 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2024.2.0-h5c03a75_1.conda#89addf0fc0f489fa0c076f1c8c0d62bf +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2024.2.0-h07e8aee_1.conda#9b0a13989b35302e47da13842683804d +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2024.2.0-h07e8aee_1.conda#7b3680d3fd00e1f91d5faf9c97c7ae78 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2024.2.0-he02047a_1.conda#ac43b516c128411f84f1e19c875998f1 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2024.2.0-h39126c6_1.conda#11acf52cac790edcf087b89e83834f7d +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2024.2.0-he02047a_1.conda#e7f91b35e3aa7abe880fc9192a761fc0 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py310h2372a71_1.conda#dfcf64f67961eb9686676f96fdb4b4d1 https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_h228c76a_104.conda#91bc3ac73308181d55a09d9e4aeb4496 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.2-py310hf9f9076_1.conda#18100768350158f1795ab9ad7d06d5ca -https://conda.anaconda.org/conda-forge/linux-64/pango-1.54.0-h84a9a3c_0.conda#7c51e110b2f059c0843269d3324e4b22 -https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_0.conda#8dab97d8a9616e07d779782995710aed +https://conda.anaconda.org/conda-forge/linux-64/pango-1.54.0-h4c5309f_1.conda#7df02e445367703cd87a574046e3a6f0 https://conda.anaconda.org/conda-forge/linux-64/pykdtree-1.3.12-py310h261611a_1.conda#d524e0873c62fcfcc154708772d014df -https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.4.1-py310h1f7b6fc_1.conda#be6f0382440ccbf9fb01bb19ab1f1fc0 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.1-py310h93e2701_0.conda#9a697144b2f3adc88ada6b6201b379c4 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py310hec8f0c1_1.conda#baf9a1e8de78418d988232388dc309dc +https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.6.0-py310h261611a_0.conda#04a405ee0bccb4de8d1ed0c87704f5f6 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.0-py310h93e2701_1.conda#c6b2a8134aa49940afe552f69bdef957 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.5-py310h019a838_0.conda#2902ec08257b19d75d08a375cdc37c2c https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-apidoc-0.3.0-py_1.tar.bz2#855b087883443abb10f5faf6eef40860 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h261611a_5.conda#643414a9f73226b2a6a43a4800734d3b -https://conda.anaconda.org/conda-forge/noarch/distributed-2024.6.2-pyhd8ed1ab_0.conda#eecb4c188864376d2b45a5afc4bcb2fa +https://conda.anaconda.org/conda-forge/noarch/distributed-2024.7.0-pyhd8ed1ab_0.conda#2ae917b0098f286f63f69ec9365fb0b1 +https://conda.anaconda.org/conda-forge/linux-64/elfutils-0.191-h924a536_0.conda#73d050766060acd2b3a289f27d857090 https://conda.anaconda.org/conda-forge/linux-64/esmf-8.6.1-nompi_h0a5817f_2.conda#e23c62f75f67166cf4ca137fc8bcdce7 -https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-6.1.1-gpl_he44c6f3_112.conda#51a49318bcd4e848e867a5b9ea5b6545 -https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h280cfa0_4.conda#410f86e58e880dcc7b0e910a8e89c05c +https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-7.0.1-gpl_h9be9148_104.conda#107fd9222d9f628608b07b69abba9420 +https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h6470451_5.conda#1483ba046164be27df7f6eddbcec3a12 https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a -https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.1-hadf69e7_0.conda#73fc255d740d23da4f554b58dc4909fd +https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.2-h9564881_1.conda#c6a47e6f551890e82e92e4c1b84be353 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py310hef631a5_2.conda#b3fa3fc2a0fa8b53b913c94297b12e27 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py310h3aa39b3_102.conda#d29d8f13fb26c2851588384a13e3ef4b +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py310hf3005e6_101.conda#409736627835306542425033e2a41dd2 https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda#724bc4489c1174fc8e3233b0624fa51f -https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hb77b528_0.conda#07f45f1be1c25345faddb8db0de8039b https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py310h261611a_2.conda#62de771a916e107222348d9ae612b0c5 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/noarch/wslink-2.1.1-pyhd8ed1ab_0.conda#6b1aef9c878c58baa7bb9f0d44457174 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py310hf9f9076_1.conda#dd5c97834c12bae782b35261e0bea7b4 https://conda.anaconda.org/conda-forge/noarch/cmocean-4.0.3-pyhd8ed1ab_0.conda#53df00540de0348ed1b2a62684dd912b https://conda.anaconda.org/conda-forge/noarch/esmpy-8.6.1-pyhc1e730c_0.conda#25a9661177fd68bfdb4314fd658e5c3b https://conda.anaconda.org/conda-forge/linux-64/graphviz-11.0.0-hc68bbd7_0.conda#52a531ef95358086a56086c45d97ab75 +https://conda.anaconda.org/conda-forge/linux-64/mesalib-24.1.4-h3ac77ca_0.conda#083464147e4169cf088522070964e0cf https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 -https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.7.1-h2471661_2.conda#ae062fb9d42d41102416a4a7e4adf3d2 -https://conda.anaconda.org/conda-forge/linux-64/vtk-base-9.3.0-qt_py310h1234567_200.conda#92032cdac433b25f26e452212d0ccbb4 -https://conda.anaconda.org/conda-forge/linux-64/vtk-io-ffmpeg-9.3.0-qt_py310h1234567_200.conda#0bddc34550595fc9f7a889d8d242144f -https://conda.anaconda.org/conda-forge/linux-64/vtk-9.3.0-qt_py310h1234567_200.conda#e26cf1734f47802c0d754c4e7ed671cd -https://conda.anaconda.org/conda-forge/noarch/pyvista-0.43.10-pyhd8ed1ab_0.conda#384286d18f25d9ae3ae07fd9817c7b0d -https://conda.anaconda.org/conda-forge/noarch/geovista-0.4.1-pyhd8ed1ab_0.conda#8dbe5526321fa7f1cb4dbc4f1644dcb3 -https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.3-pyhd8ed1ab_0.conda#55e445f4fcb07f2471fb0e1102d36488 +https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_0.conda#8dab97d8a9616e07d779782995710aed +https://conda.anaconda.org/conda-forge/linux-64/vtk-base-9.3.1-osmesa_py310ha0fd742_101.conda#b9addfb3506a4e2d831f1c7a66d06fe7 +https://conda.anaconda.org/conda-forge/linux-64/vtk-io-ffmpeg-9.3.1-osmesa_py310hd1cd433_101.conda#bd12505efaf8ce18d23fe74721b3e186 +https://conda.anaconda.org/conda-forge/linux-64/vtk-9.3.1-osmesa_py310h7c0142d_101.conda#4e64cbf6d1c4d0eb1d8d86d12c4b777c +https://conda.anaconda.org/conda-forge/noarch/pyvista-0.44.0-pyhd8ed1ab_0.conda#16270d42141769c8342e067d25acc6ce +https://conda.anaconda.org/conda-forge/noarch/geovista-0.5.1-pyhd8ed1ab_0.conda#22958696ccc609071ba40867090bfd3a +https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.4-pyhd8ed1ab_0.conda#c7c50dd5192caa58a05e6a4248a27acb https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_0.conda#ac832cc43adc79118cf6e23f1f9b8995 https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.6.0-pyhd8ed1ab_0.conda#b04f3c04e4f7939c6207dc0c0355f468 https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.16.0-pyhd8ed1ab_0.conda#add28691ee89e875b190eda07929d5d4 @@ -339,5 +325,5 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda#7e1e7437273682ada2ed5e9e9714b140 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda#26acae54b06f178681bfb551760f5dd1 -https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda#7b1465205e28d75d2c0e1a868ee00a67 +https://conda.anaconda.org/conda-forge/noarch/sphinx-7.4.5-pyhd8ed1ab_0.conda#98a3e9786dd637216c6a028f5061cd71 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 151009adcc..eb273cae49 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -1,9 +1,9 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 921f01115b09c230eeef12b4d97805af9e292b23bd868d0f684d1b83da2830e9 +# input_hash: 68bd288d5cf8db4a84a47fd6676db6b9710bd88e4fdb0b2228991b72ac3d4336 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.6.2-hbcca054_0.conda#847c3c2905cc467cea52c24f9cfa8080 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda#23ab7665c5f63cfb9f1f6195256daac6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb @@ -14,14 +14,12 @@ https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-4_cp311.conda#d7 https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 https://conda.anaconda.org/conda-forge/linux-64/utfcpp-4.0.5-ha770c72_0.conda#25965c1d1d5fc00ce2b663b73008e3b7 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_11.conda#8c462ced2af33648195dc9459f331f31 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda#ae061a5ed5f05818acdf9adab72c146d https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_11.conda#0b3b218a596bb4c3854cc9ee799f94e5 -https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.12-h4ab18f5_0.conda#7ed427f0871fd41cb1d9c17727c17589 -https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2#d9c69a24ad678ffce24c6543a0176b00 -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.2-h4bc722e_0.conda#8024af1ee7078e37fa3101c0a0296af2 https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995 https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2#ac7bc6a654f8f41b352b38f4051135f8 https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.22.5-h59595ed_2.conda#985f2f453fb72408d6b6f1be0f324033 @@ -34,32 +32,38 @@ https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172b https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.22.5-h59595ed_2.conda#172bcc51059416e7ce99e7b528cede83 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-h3d2ce59_11.conda#c485da4fdb454539f852a90ae06e9bb7 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_0.conda#6456c2620c990cd8dde2428a27ba0bc5 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2#6e8cc2173440d77708196c5b93771680 +https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-h4ab18f5_0.conda#601bfb4b3c6f0b844443bb81a56651e0 https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2#15345e56d527b330e1cacbdf58676e8f https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_11.conda#eaa8ea74083fb4a78ae19e431e556003 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-hc0a3c3a_0.conda#1cb187a157136398ddbaae90713e2498 https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.19.0-h166bdaf_0.tar.bz2#93840744a8552e9ebf6bb1a5dffc125a https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2#7245a044b4a1980ed83196176b78b73a https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h4ab18f5_6.conda#27329162c0dc732bcf67a4e0cd488125 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 +https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-hd590300_1001.conda#ec7398d21e2651e0dcb0044d03b9a339 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 https://conda.anaconda.org/conda-forge/linux-64/nettle-3.9.1-h7ab15ed_0.conda#2bf1915cc107738811368afcb0993a59 https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hd590300_1.conda#c66f837ac65e4d1cdeb80e2a1d5fcc3d -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4ab18f5_0.conda#a41fa0e391cc9e0d6b78ac69ca047a6c +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4bc722e_2.conda#e1b454497f9f7c1147fdde4b53f1b512 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/x264-1!164.3095-h166bdaf_2.tar.bz2#6c99772d483f566d59e25037fea2c4b1 +https://conda.anaconda.org/conda-forge/linux-64/xorg-damageproto-1.2.1-h7f98852_1002.tar.bz2#58c9bb067637c5a13a045a7124eeb027 +https://conda.anaconda.org/conda-forge/linux-64/xorg-glproto-1.4.17-h7f98852_1002.tar.bz2#e41bf01f80d46be87dcae2333a766e75 https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hd590300_0.conda#b462a33c0be1421532f28bfe8f4a7514 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 +https://conda.anaconda.org/conda-forge/linux-64/xorg-randrproto-1.5.0-h7f98852_1001.tar.bz2#68cce654461713977dac6f9ac1bce89a https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852_1002.tar.bz2#06feff3d2634e3097ce2fe681474b534 +https://conda.anaconda.org/conda-forge/linux-64/xorg-util-macros-1.19.3-h7f98852_0.tar.bz2#b1780cc89cf3949f670d6ca2aa6a7e42 https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xf86vidmodeproto-2.3.1-h7f98852_1002.tar.bz2#3ceea9668625c18f19530de98b15d5b0 https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 @@ -68,23 +72,22 @@ https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda#34672 https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda#c2f83a5ddadadcdb08fe05863295ee97 https://conda.anaconda.org/conda-forge/linux-64/eigen-3.4.0-h00ab1b0_0.conda#b1b879d6d093f55dd40d58b5eb2f0699 https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda#53fb86322bdb89496d7579fe3f02fd61 -https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d +https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.2-hac33072_0.conda#621d814955342209dc8e7f87c41f1ba0 https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda#c94a5994ef49749880a8139cf9afcbe1 https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/jsoncpp-1.9.5-h4bd325d_1.tar.bz2#ae7f50dd1e78c7e78b5d2cf7062e559d https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240116.2-cxx17_h59595ed_0.conda#682bdbe046a68f749769b492f3625c5c +https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240116.2-cxx17_he02047a_1.conda#c48fc56ec03229f294176923c3265c05 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-h661eb56_2.conda#dd197c968bf9760bba0031888d431ede https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d -https://conda.anaconda.org/conda-forge/linux-64/libcap-2.69-h0f662aa_0.conda#25cb5999faa414e5ccb2c1388f62d3d5 -https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.121-h4ab18f5_0.conda#3bcee3436b1effa9a3caee2b74175c08 +https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.122-h4ab18f5_0.conda#bbfc4dbe5e97b385ef088f354d65e563 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.22.5-h59595ed_2.conda#b63d9b6da3653179a278077f0de20014 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_11.conda#4c3e460d6acf8e43e4ce8bf405187eb7 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_0.conda#f4ca84fbd6d06b0a052fb2d5b96dde41 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae @@ -93,54 +96,48 @@ https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 https://conda.anaconda.org/conda-forge/linux-64/libvpx-1.14.1-hac33072_0.conda#cde393f461e0c169d9ffb2fc70f81c33 -https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hd590300_0.conda#151cba22b85a989c2d6ef9633ffee1e4 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 -https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.6-h59595ed_0.conda#9160cdeb523a1b20cf8d2a0bf821f45d -https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.3.0-hf1915f5_4.conda#784a4df6676c581ca624fbe460703a6d https://conda.anaconda.org/conda-forge/linux-64/openh264-2.4.1-h59595ed_0.conda#3dfcf61b8e78af08110f5229f79580af https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.24.1-hc5aa10d_0.tar.bz2#56ee94e34b71742bbdfa832c974e47a8 -https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda#8292dea9e022d9610a11fce5e0896ed8 +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-h0f59acf_0.conda#3914f7ac1761dce57102c72ca7c35d01 https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 https://conda.anaconda.org/conda-forge/linux-64/pugixml-1.14-h59595ed_0.conda#2c97dd90633508b422c11bd3018206ab https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 -https://conda.anaconda.org/conda-forge/linux-64/svt-av1-2.1.0-hac33072_0.conda#2a08edb7cd75e56623f2712292a97325 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda#6b7dcc7349efd123d493d2dbe85a045f +https://conda.anaconda.org/conda-forge/linux-64/svt-av1-2.1.2-hac33072_0.conda#06c5dec4ebb47213b648a6c4dc8400d6 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.0-h5291e77_0.conda#c13ca0abd5d1d31d0eebcf86d51da8a4 https://conda.anaconda.org/conda-forge/linux-64/x265-3.5-h924138e_3.tar.bz2#e7f6ed84d4623d52ee581325c1587a6b https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda#93ee23f12bc2e684548181256edd2cf6 -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h4ab18f5_6.conda#559d338a4234c2ad6e676f460a093e67 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-hc2324a3_1.conda#11d76bee958b1989bd1ac6ee7372ea6d +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-hef167b5_0.conda#54fe76ab3d0189acaef95156874db7f9 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb -https://conda.anaconda.org/conda-forge/linux-64/gl2ps-1.4.2-h0708190_0.tar.bz2#438718bf8921ac70956d919d0e2cc487 -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 +https://conda.anaconda.org/conda-forge/linux-64/gl2ps-1.4.2-hae5d5c5_1.conda#00e642ec191a19bf806a3915800e9524 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-h661eb56_2.conda#02e41ab5834dcdcc8590cf29d9526f50 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.2-hf974151_0.conda#72724f6a78ecb15559396966226d5838 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda#a356024784da6dfd4683dc5ecf45b155 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.3-h8a4344b_1.conda#6ea440297aacee4893f02ad759e6ffbc +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.3-h08a7969_0.conda#6945825cebd2aeb16af4c69d97c32c13 -https://conda.anaconda.org/conda-forge/linux-64/libtheora-1.1.1-h7f98852_1005.tar.bz2#1a7c35f56343b7e9e8db20b296c7566c +https://conda.anaconda.org/conda-forge/linux-64/libtheora-1.1.1-h4ab18f5_1006.conda#553281a034e9cf8693c9df49f6c78ea1 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda#340278ded8b0dc3a73f3660bbb0adbc6 -https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.3.0-hca2cd23_4.conda#1b50eebe2a738a3146c154d2eceaa8b6 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-h4c95cb1_3.conda#0ac9aff6010a7751961c8e4b863a40e7 https://conda.anaconda.org/conda-forge/linux-64/python-3.11.9-hb806964_0_cpython.conda#ac68acfa8b558ed406c75e98d3428d7b https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.0-h6d4b2fc_0.conda#77ea8dff5cf8550cc8f5629a6af56323 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-hd590300_1.conda#9bfac7ccd94d54fd21a0501296d60424 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h8ee46fc_1.conda#632413adcd8bc16b515cab87a2932913 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.9-hd590300_1.conda#e995b155d938b6779da6ace6c6b13816 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.1-h8ee46fc_1.conda#90108a432fb5c6150ccfee3f03388656 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec +https://conda.anaconda.org/conda-forge/noarch/wayland-protocols-1.36-hd8ed1ab_0.conda#c6f690e7d4abf562161477f14533cfd8 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-hb711507_1.conda#4a6d410296d7e39f00bacdee7df046e9 https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda#f730d54ba9cd543666d7220c9f7ed563 https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hb755f60_1.conda#cce9e7c3f1c307f2a5fb08a2922d6164 -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.6.2-pyhd8ed1ab_0.conda#8821ec1c8fcdc9e1d291d7b9f6e9968a +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca @@ -149,31 +146,30 @@ https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz https://conda.anaconda.org/conda-forge/noarch/colorcet-3.1.0-pyhd8ed1ab_0.conda#4d155b600b63bc6ba89d91fab74238f8 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.10-py311hb755f60_0.conda#f3a8a500a2e743ff92f418f0eaf9bf71 -https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda#e8cd5d629f65bdf0f3bb312cde14659e -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda#15dda3cdbf330abfe9f555d22f66db46 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.3-pyhd8ed1ab_0.conda#eae681f708bd52d9d172bd5c9af23898 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.4-pyhd8ed1ab_0.conda#0e7e4388e9d5283e22b35a9443bdbcc9 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.1-py311h459d7ec_0.conda#b267e553a337e1878512621e374845c5 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.0-pyhff2d567_0.conda#ad6af3f92e71b1579ac2362b6cf29105 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.1-pyhff2d567_0.conda#996bf792cdb8c0ac38ff54b9fde56841 https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.12-hb9ae30d_0.conda#201db6c2d9a3c5e46573ac4cb2e92f4f https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-h59595ed_2.conda#219ba82e95d7614cf7140d2a4afc0926 -https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.2-hb6ce0ca_0.conda#a965aeaf060289528a3fbe09326edae2 https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe +https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_0.tar.bz2#18ee9c07cf945a33f92caf1ee3d23ad9 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_1.conda#2c65bdf442b0d37aad080c8a4e0d452f https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 +https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.4-hfca40fe_0.conda#32ddb97f897740641d8d46a829ce1704 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda#1a2a0cd3153464fee6646f3dd6dad9b8 -https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_0.conda#f21c27f076a07907e70c49bb57bd0f20 -https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.10.0-default_h5622ce7_1001.conda#fc2d5b79c2d3f8568fbab31db7ae02f3 -https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.7-hb77312f_0.conda#bc0ea7e1f75a9b1c8467597fbbd9f86b -https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_1.conda#b8afb3e3cb3423cc445cf611ab95fdb0 +https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.1-default_hecaa2ac_1000.conda#f54aeebefb5c5ff84eca4fb05ca8aa3a +https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.8-h8b73ec9_1.conda#16d94b3586ef3558e5a583598524deb4 https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.4.0-h2c329e2_0.conda#80030debaa84cfc31755d53742df3ca6 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/loguru-0.7.2-py311h38be061_1.conda#94a4521bd7933a66d76b0274dbf8d2dd @@ -185,7 +181,7 @@ https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda# https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda#6f6cf28bf8e021933869bae3f84b8fc9 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf -https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py311h459d7ec_0.conda#9bc62d25dcf64eec484974a3123c9d57 +https://conda.anaconda.org/conda-forge/linux-64/psutil-6.0.0-py311h331c9d8_0.conda#f1cbef9236edde98a811ba5a98975f2e https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f @@ -196,7 +192,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7e https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda#52719a74ad130de8fb5d047dc91f247a https://conda.anaconda.org/conda-forge/noarch/scooby-0.10.0-pyhd8ed1ab_0.conda#9e57330f431abbb4c88a5f898a4ba223 -https://conda.anaconda.org/conda-forge/noarch/setuptools-70.1.0-pyhd8ed1ab_0.conda#258e66f95f814d51ada2a1fe9274039b +https://conda.anaconda.org/conda-forge/noarch/setuptools-71.0.1-pyhd8ed1ab_0.conda#aede3d5c0882ebed2f07024400a111ed https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2#6d6552722448103793743dabfbda532d @@ -209,8 +205,6 @@ https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2f https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py311h331c9d8_0.conda#e29e451c96bf8e81a5760b7565c6ed2c https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h8ee46fc_1.conda#9d7bcddf49cbf727730af10e71022c73 -https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.42-h4ab18f5_0.conda#b193af204da1bfb8c13882d131a14bd2 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_0.conda#ed67c36f215b310412b2af935bf3e530 @@ -221,115 +215,107 @@ https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1 https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2#d1e1eb7e21a9e2c74279d87dafb68156 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 -https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e +https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-hbb29018_2.conda#b6d90276c5aee9b4407dd94eb0cd40a8 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.conda#b3469563ac5e808b0cd92810d0697043 https://conda.anaconda.org/conda-forge/noarch/click-default-group-1.2.4-pyhd8ed1ab_0.conda#7c2b6931f9b3548ed78478332095c3e9 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.3-py311h331c9d8_0.conda#543dd05fd661e4e9c9deb3b37093d6a2 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.0-py311h61187de_0.conda#88eac8e0e69d850b235824f87e5cfd1b https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.3-py311h459d7ec_0.conda#13d385f635d7fbe9acc93600f67a6cb4 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.0-py311h331c9d8_0.conda#2daef6c4ce74840c8d7a431498be83e9 -https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.2-hf974151_0.conda#d427988dc3dbd0a4c136f52db356cc6a +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py311h61187de_0.conda#bcbe6c9db1c25900c3808b8974e1bb90 +https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.2.0-pyha770c72_0.conda#e1d9f6dc77209defc283bdf61588e968 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.0.0-pyha770c72_0.conda#3286556cdd99048d198f72c3f6f69103 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 -https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp18.1-18.1.7-default_h9bb3924_0.conda#bff3d36fbd1b1a2f1e6d34aa3eb6b58c -https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.7-default_h087397f_0.conda#536526073c2e7f9056fdce8584da779e -https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#ee48bf17cc83a00f59ca1494d5646869 https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h119a65a_9.conda#cfebc557e54905dadc355c0e9f003004 -https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca -https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.49-h4f305b6_0.conda#dfcfd72c7a430d3616763ecfbefe4ca9 https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.7-hd590300_0.conda#2b7b0d827c6447cc1d85dc06d5b5de46 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 -https://conda.anaconda.org/conda-forge/linux-64/libva-2.21.0-h4ab18f5_2.conda#109300f4eeeb8a61498283565106b474 -https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h662e7e4_0.conda#b32c0da42b1f24a98577bb3d7fc0b995 +https://conda.anaconda.org/conda-forge/linux-64/libva-2.22.0-hb711507_0.conda#d12f659072132c9d16e497073fc1f68b https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py311h18e6fac_0.conda#6c520a9d36c9d7270988c7a6c360d6d4 +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py311h82a398c_0.conda#b9e0ac1f5564b6572a6d702c04207be8 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.2-pyhd8ed1ab_0.conda#0f3f49c22c7ef3a1195fa61dad3c43be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.12.0-h297d8ca_1.conda#3ff978d8994f591818a506640c6a7071 +https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.12.0-h434a139_3.conda#c667c11d1e488a38220ede8a34441bff https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_0.conda#92cdb6fe54b78739ad70637e4f0deb07 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda#7d36e7a485ea2f5829408813bdbbfb38 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.4-hd590300_1.conda#1ecae8461689e44fe0f0e3d18e58e799 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.3-pyhd8ed1ab_0.conda#284008712816c64c85bf2b7fa9f3b264 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.5-h7f98852_1.tar.bz2#bebd3814ec2355fab6a474b07ed73093 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.2-h7f98852_1.tar.bz2#5b0f7da25a4556c9619c3e4b4a98ab07 https://conda.anaconda.org/conda-forge/linux-64/yarl-1.9.4-py311h459d7ec_0.conda#fff0f2058e9d86c8bf5848ee93917a8d https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.9.5-py311h459d7ec_0.conda#0175d2636cc41dc019b51462c13ce225 https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda#fdcbeb072c80c805a2ededaa5f91cd79 -https://conda.anaconda.org/conda-forge/linux-64/glew-2.1.0-h9c3ff4c_2.tar.bz2#fb05eb5c47590b247658243d27fc32f1 https://conda.anaconda.org/conda-forge/linux-64/gnutls-3.7.9-hb077bed_0.conda#33eded89024f21659b1975886a4acf70 -https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.4-haf2f30d_0.conda#926c2c7ee7a0b48d6d70783a33f7bc80 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.5.0-hfac3d4d_0.conda#f5126317dd0ce0ba26945e411ecc6960 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.2.0-hd8ed1ab_0.conda#3de0087b2b86443cfae650dea6ecec6f -https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.10.3-hd590300_0.conda#32d16ad533c59bb0a3c5ffaf16110829 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hfac3d4d_0.conda#c7b47c64af53e8ecee01d101eeab2342 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.0.0-hd8ed1ab_0.conda#5f8c8ebbe6413a7838cf6ecf14d5d31b +https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.4-pyhd8ed1ab_0.conda#a284ff318fbdb0dd83928275b4b6087c https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2024.1.0-h2da1b83_7.conda#692bb11510bfceb34723c5115045096e -https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2024.2.0-h2da1b83_1.conda#9511859bf5221238a2d3fb5322af01d5 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py311h64a7726_0.conda#a502d7aad449a1206efb366d6a12c52d https://conda.anaconda.org/conda-forge/noarch/pbr-6.0.0-pyhd8ed1ab_0.conda#8dbab5ba746ed14aa32cb232dc437f8f https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311hca0b8b9_5.conda#cac429fcb9126d5e6f02c8ba61c2a811 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_0.conda#b39568655c127a9c4a44d178ac99b6d0 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e -https://conda.anaconda.org/conda-forge/linux-64/tbb-devel-2021.12.0-h7c56ddd_1.conda#f896f49efc2e33ab5d4d3690bb4f32ef +https://conda.anaconda.org/conda-forge/linux-64/tbb-devel-2021.12.0-hfcbfbdb_3.conda#dd410ed856f34c994f1549079ff601bf https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda#586da7df03b68640de14dc3e8bcbf76f +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py311h5cd10c7_0.conda#8efe4fe2396281627b3450af8357b190 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py311h18e1886_0.conda#0eb1e6c7d10285ec12e01f73d1896d93 https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py311h9547e67_0.conda#74ad0ae64f1ef565e27eda87fa749e84 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.6.2-pyhd8ed1ab_0.conda#048ca0ec2cd1f3995d2d36dec0efd99a -https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.4-h9ad1361_0.conda#147cce520ec59367549fd0d96d404213 -https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 -https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.1-h8fe9dca_1.conda#c306fd9cc90c0585171167d09135a827 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2024.1.0-hb045406_7.conda#d83d6787a9a002b626e20de84719da64 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2024.1.0-hb045406_7.conda#928f79281dbcc73e8e8fc2096b993b97 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2024.1.0-h5c03a75_7.conda#34db2a8d0504a807a735da48234e2a1d -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2024.1.0-h2da1b83_7.conda#22ef5cad44c9e3caecbee37465c33fca -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2024.1.0-h2da1b83_7.conda#98d53dafdd090d01ae50719eabe374e7 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-npu-plugin-2024.1.0-he02047a_7.conda#e766c8a98f4efef2e9be7146fad9b6f2 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2024.1.0-h5c03a75_7.conda#1eb037f090cb525857b01702b2afb6a0 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2024.1.0-h07e8aee_7.conda#019fb9bcd7ce0178fa85f3c610efb8c3 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2024.1.0-h07e8aee_7.conda#991c28a11b0ace4b340a445b538cece8 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2024.1.0-he02047a_7.conda#2b231b8cdbd2495706526ac1ab3c821c -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2024.1.0-h39126c6_7.conda#d6aac92f4b03be8c86b09f40e1f5263a -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2024.1.0-he02047a_7.conda#f7a46aa4f5c53423bf3e036da8c1b632 -https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_1.conda#3366af27f0b593544a6cd453c7932ac5 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.7.0-pyhd8ed1ab_0.conda#755e47653ae38f5c50f1435af756e844 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 +https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.1-h39113c1_2.conda#25db2ea6b8fefce451369e2cc826f6f4 +https://conda.anaconda.org/conda-forge/linux-64/libmicrohttpd-1.0.1-h97afed2_0.conda#00bd7406d24d6574f2de3839b60e0925 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2024.2.0-hb045406_1.conda#70d82a64e6d07f4d6e07cae6b0bd4bd1 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2024.2.0-hb045406_1.conda#f1e2a8ded23cef03804c4edb2edfb986 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2024.2.0-h5c03a75_1.conda#95d2d3baaa1e456ef65c713a5d99b815 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2024.2.0-h2da1b83_1.conda#9e49f87d8f99dc9724f52b3fac904106 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2024.2.0-h2da1b83_1.conda#a9712fae44d01d906e228c49235e3b89 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-npu-plugin-2024.2.0-he02047a_1.conda#5c2d064181e686cf5cfac6f1a1ee4e91 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2024.2.0-h5c03a75_1.conda#89addf0fc0f489fa0c076f1c8c0d62bf +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2024.2.0-h07e8aee_1.conda#9b0a13989b35302e47da13842683804d +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2024.2.0-h07e8aee_1.conda#7b3680d3fd00e1f91d5faf9c97c7ae78 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2024.2.0-he02047a_1.conda#ac43b516c128411f84f1e19c875998f1 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2024.2.0-h39126c6_1.conda#11acf52cac790edcf087b89e83834f7d +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2024.2.0-he02047a_1.conda#e7f91b35e3aa7abe880fc9192a761fc0 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py311h459d7ec_1.conda#45b8d355bbcdd27588c2d266bcfdff84 https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_h228c76a_104.conda#91bc3ac73308181d55a09d9e4aeb4496 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.2-py311h14de704_1.conda#84e2dd379d4edec4dd6382861486104d -https://conda.anaconda.org/conda-forge/linux-64/pango-1.54.0-h84a9a3c_0.conda#7c51e110b2f059c0843269d3324e4b22 -https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_0.conda#8dab97d8a9616e07d779782995710aed +https://conda.anaconda.org/conda-forge/linux-64/pango-1.54.0-h4c5309f_1.conda#7df02e445367703cd87a574046e3a6f0 https://conda.anaconda.org/conda-forge/linux-64/pykdtree-1.3.12-py311h18e1886_1.conda#62b842b69b2ccd337be298406591c18c -https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.4.1-py311h1f0f07a_1.conda#86b71ff85f3e4c8a98b5bace6d9c4565 -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.1-py311h517d4fd_0.conda#764b0e055f59dbd7d114d32b8c6e55e6 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py311h0bed3d6_1.conda#6fb2f733ef405b4bfb4a6a362703457e +https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.6.0-py311h18e1886_0.conda#f43c7f60c7b1e7a7cc4234d28520b06a +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.0-py311h517d4fd_1.conda#481fd009b2d863f526f60ca19cb7880b +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.5-py311h5925939_0.conda#105ce0d9e7aa0324031a3abaf9ec71f7 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-apidoc-0.3.0-py_1.tar.bz2#855b087883443abb10f5faf6eef40860 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 https://conda.anaconda.org/conda-forge/noarch/wslink-2.1.1-pyhd8ed1ab_0.conda#6b1aef9c878c58baa7bb9f0d44457174 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h18e1886_5.conda#6cd3facab7a79de14abb1a86a2d830fa -https://conda.anaconda.org/conda-forge/noarch/distributed-2024.6.2-pyhd8ed1ab_0.conda#eecb4c188864376d2b45a5afc4bcb2fa +https://conda.anaconda.org/conda-forge/noarch/distributed-2024.7.0-pyhd8ed1ab_0.conda#2ae917b0098f286f63f69ec9365fb0b1 +https://conda.anaconda.org/conda-forge/linux-64/elfutils-0.191-h924a536_0.conda#73d050766060acd2b3a289f27d857090 https://conda.anaconda.org/conda-forge/linux-64/esmf-8.6.1-nompi_h0a5817f_2.conda#e23c62f75f67166cf4ca137fc8bcdce7 -https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-6.1.1-gpl_he44c6f3_112.conda#51a49318bcd4e848e867a5b9ea5b6545 -https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h280cfa0_4.conda#410f86e58e880dcc7b0e910a8e89c05c +https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-7.0.1-gpl_h9be9148_104.conda#107fd9222d9f628608b07b69abba9420 +https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h6470451_5.conda#1483ba046164be27df7f6eddbcec3a12 https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a -https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.1-hadf69e7_0.conda#73fc255d740d23da4f554b58dc4909fd +https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.2-h9564881_1.conda#c6a47e6f551890e82e92e4c1b84be353 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py311ha4ca890_2.conda#0848e2084cbb57014f232f48568561af -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py311h74118c1_102.conda#5f98c1d56c5853270c7876bb1000a631 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py311h25b3b55_101.conda#936afeddfa3704eb834d0887b0838826 https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda#724bc4489c1174fc8e3233b0624fa51f -https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hb77b528_0.conda#07f45f1be1c25345faddb8db0de8039b https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py311h18e1886_2.conda#b1e90d33ae504ac06a3928a2dc5654ba +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py311h14de704_1.conda#27e5956e552c6e71f56cb1ec042617a8 https://conda.anaconda.org/conda-forge/noarch/cmocean-4.0.3-pyhd8ed1ab_0.conda#53df00540de0348ed1b2a62684dd912b https://conda.anaconda.org/conda-forge/noarch/esmpy-8.6.1-pyhc1e730c_0.conda#25a9661177fd68bfdb4314fd658e5c3b https://conda.anaconda.org/conda-forge/linux-64/graphviz-11.0.0-hc68bbd7_0.conda#52a531ef95358086a56086c45d97ab75 +https://conda.anaconda.org/conda-forge/linux-64/mesalib-24.1.4-h3ac77ca_0.conda#083464147e4169cf088522070964e0cf https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 -https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.7.1-h2471661_2.conda#ae062fb9d42d41102416a4a7e4adf3d2 -https://conda.anaconda.org/conda-forge/linux-64/vtk-base-9.3.0-qt_py311h1234567_200.conda#240bc54c11dc7b302fb04b431c44a4bb -https://conda.anaconda.org/conda-forge/linux-64/vtk-io-ffmpeg-9.3.0-qt_py311h1234567_200.conda#6878b51bbcdd28e50e2575c83f420a19 -https://conda.anaconda.org/conda-forge/linux-64/vtk-9.3.0-qt_py311h1234567_200.conda#39028986fae6fa420405cc54ec016485 -https://conda.anaconda.org/conda-forge/noarch/pyvista-0.43.10-pyhd8ed1ab_0.conda#384286d18f25d9ae3ae07fd9817c7b0d -https://conda.anaconda.org/conda-forge/noarch/geovista-0.4.1-pyhd8ed1ab_0.conda#8dbe5526321fa7f1cb4dbc4f1644dcb3 -https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.3-pyhd8ed1ab_0.conda#55e445f4fcb07f2471fb0e1102d36488 +https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_0.conda#8dab97d8a9616e07d779782995710aed +https://conda.anaconda.org/conda-forge/linux-64/vtk-base-9.3.1-osmesa_py311h530c62d_101.conda#44a9e14d9b8b37da5c3ed16e322fe1b9 +https://conda.anaconda.org/conda-forge/linux-64/vtk-io-ffmpeg-9.3.1-osmesa_py311hd1cd433_101.conda#76155b70563f6b760be46a48c28ecdb1 +https://conda.anaconda.org/conda-forge/linux-64/vtk-9.3.1-osmesa_py311h7c0142d_101.conda#5ee9d2a935edb5bfe706687dcd63ad3c +https://conda.anaconda.org/conda-forge/noarch/pyvista-0.44.0-pyhd8ed1ab_0.conda#16270d42141769c8342e067d25acc6ce +https://conda.anaconda.org/conda-forge/noarch/geovista-0.5.1-pyhd8ed1ab_0.conda#22958696ccc609071ba40867090bfd3a +https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.4-pyhd8ed1ab_0.conda#c7c50dd5192caa58a05e6a4248a27acb https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_0.conda#ac832cc43adc79118cf6e23f1f9b8995 https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.6.0-pyhd8ed1ab_0.conda#b04f3c04e4f7939c6207dc0c0355f468 https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.16.0-pyhd8ed1ab_0.conda#add28691ee89e875b190eda07929d5d4 @@ -337,5 +323,5 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda#7e1e7437273682ada2ed5e9e9714b140 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda#26acae54b06f178681bfb551760f5dd1 -https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda#7b1465205e28d75d2c0e1a868ee00a67 +https://conda.anaconda.org/conda-forge/noarch/sphinx-7.4.5-pyhd8ed1ab_0.conda#98a3e9786dd637216c6a028f5061cd71 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e diff --git a/requirements/locks/py312-linux-64.lock b/requirements/locks/py312-linux-64.lock index 04da2d926d..7fa3ff1a58 100644 --- a/requirements/locks/py312-linux-64.lock +++ b/requirements/locks/py312-linux-64.lock @@ -1,9 +1,9 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: ffd09acb543fe189cd316bb3e8a3b423b7091e6236d2ba943525acbd339930d3 +# input_hash: 7a4a6d9e72f2080d74f07a6f99d51fc689c72fca556a978061ea868b4369610d @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.6.2-hbcca054_0.conda#847c3c2905cc467cea52c24f9cfa8080 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda#23ab7665c5f63cfb9f1f6195256daac6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb @@ -14,14 +14,12 @@ https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-4_cp312.conda#dc https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 https://conda.anaconda.org/conda-forge/linux-64/utfcpp-4.0.5-ha770c72_0.conda#25965c1d1d5fc00ce2b663b73008e3b7 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_11.conda#8c462ced2af33648195dc9459f331f31 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda#ae061a5ed5f05818acdf9adab72c146d https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_11.conda#0b3b218a596bb4c3854cc9ee799f94e5 -https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.12-h4ab18f5_0.conda#7ed427f0871fd41cb1d9c17727c17589 -https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2#d9c69a24ad678ffce24c6543a0176b00 -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.2-h4bc722e_0.conda#8024af1ee7078e37fa3101c0a0296af2 https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995 https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2#ac7bc6a654f8f41b352b38f4051135f8 https://conda.anaconda.org/conda-forge/linux-64/gettext-tools-0.22.5-h59595ed_2.conda#985f2f453fb72408d6b6f1be0f324033 @@ -34,32 +32,38 @@ https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172b https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-0.22.5-h59595ed_2.conda#172bcc51059416e7ce99e7b528cede83 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-h3d2ce59_11.conda#c485da4fdb454539f852a90ae06e9bb7 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_0.conda#6456c2620c990cd8dde2428a27ba0bc5 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 -https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2#6e8cc2173440d77708196c5b93771680 +https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.5-h4ab18f5_0.conda#601bfb4b3c6f0b844443bb81a56651e0 https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2#15345e56d527b330e1cacbdf58676e8f https://conda.anaconda.org/conda-forge/linux-64/libpciaccess-0.18-hd590300_0.conda#48f4330bfcd959c3cfb704d424903c82 -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_11.conda#eaa8ea74083fb4a78ae19e431e556003 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-hc0a3c3a_0.conda#1cb187a157136398ddbaae90713e2498 https://conda.anaconda.org/conda-forge/linux-64/libtasn1-4.19.0-h166bdaf_0.tar.bz2#93840744a8552e9ebf6bb1a5dffc125a https://conda.anaconda.org/conda-forge/linux-64/libunistring-0.9.10-h7f98852_0.tar.bz2#7245a044b4a1980ed83196176b78b73a https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda#5aa797f8787fe7a17d1b0821485b5adc -https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h4ab18f5_6.conda#27329162c0dc732bcf67a4e0cd488125 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 +https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-hd590300_1001.conda#ec7398d21e2651e0dcb0044d03b9a339 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 https://conda.anaconda.org/conda-forge/linux-64/nettle-3.9.1-h7ab15ed_0.conda#2bf1915cc107738811368afcb0993a59 https://conda.anaconda.org/conda-forge/linux-64/ocl-icd-2.3.2-hd590300_1.conda#c66f837ac65e4d1cdeb80e2a1d5fcc3d -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4ab18f5_0.conda#a41fa0e391cc9e0d6b78ac69ca047a6c +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4bc722e_2.conda#e1b454497f9f7c1147fdde4b53f1b512 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/x264-1!164.3095-h166bdaf_2.tar.bz2#6c99772d483f566d59e25037fea2c4b1 +https://conda.anaconda.org/conda-forge/linux-64/xorg-damageproto-1.2.1-h7f98852_1002.tar.bz2#58c9bb067637c5a13a045a7124eeb027 +https://conda.anaconda.org/conda-forge/linux-64/xorg-glproto-1.4.17-h7f98852_1002.tar.bz2#e41bf01f80d46be87dcae2333a766e75 https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a https://conda.anaconda.org/conda-forge/linux-64/xorg-libice-1.1.1-hd590300_0.conda#b462a33c0be1421532f28bfe8f4a7514 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda#2c80dc38fface310c9bd81b17037fee5 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 +https://conda.anaconda.org/conda-forge/linux-64/xorg-randrproto-1.5.0-h7f98852_1001.tar.bz2#68cce654461713977dac6f9ac1bce89a https://conda.anaconda.org/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852_1002.tar.bz2#06feff3d2634e3097ce2fe681474b534 +https://conda.anaconda.org/conda-forge/linux-64/xorg-util-macros-1.19.3-h7f98852_0.tar.bz2#b1780cc89cf3949f670d6ca2aa6a7e42 https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 +https://conda.anaconda.org/conda-forge/linux-64/xorg-xf86vidmodeproto-2.3.1-h7f98852_1002.tar.bz2#3ceea9668625c18f19530de98b15d5b0 https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 @@ -68,23 +72,22 @@ https://conda.anaconda.org/conda-forge/linux-64/aom-3.9.1-hac33072_0.conda#34672 https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda#c2f83a5ddadadcdb08fe05863295ee97 https://conda.anaconda.org/conda-forge/linux-64/eigen-3.4.0-h00ab1b0_0.conda#b1b879d6d093f55dd40d58b5eb2f0699 https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda#53fb86322bdb89496d7579fe3f02fd61 -https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d +https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.2-hac33072_0.conda#621d814955342209dc8e7f87c41f1ba0 https://conda.anaconda.org/conda-forge/linux-64/gmp-6.3.0-hac33072_2.conda#c94a5994ef49749880a8139cf9afcbe1 https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/jsoncpp-1.9.5-h4bd325d_1.tar.bz2#ae7f50dd1e78c7e78b5d2cf7062e559d https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240116.2-cxx17_h59595ed_0.conda#682bdbe046a68f749769b492f3625c5c +https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240116.2-cxx17_he02047a_1.conda#c48fc56ec03229f294176923c3265c05 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa https://conda.anaconda.org/conda-forge/linux-64/libasprintf-0.22.5-h661eb56_2.conda#dd197c968bf9760bba0031888d431ede https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d -https://conda.anaconda.org/conda-forge/linux-64/libcap-2.69-h0f662aa_0.conda#25cb5999faa414e5ccb2c1388f62d3d5 -https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.121-h4ab18f5_0.conda#3bcee3436b1effa9a3caee2b74175c08 +https://conda.anaconda.org/conda-forge/linux-64/libdrm-2.4.122-h4ab18f5_0.conda#bbfc4dbe5e97b385ef088f354d65e563 https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libgettextpo-devel-0.22.5-h59595ed_2.conda#b63d9b6da3653179a278077f0de20014 -https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_11.conda#4c3e460d6acf8e43e4ce8bf405187eb7 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_0.conda#f4ca84fbd6d06b0a052fb2d5b96dde41 https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae @@ -93,54 +96,48 @@ https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda# https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 https://conda.anaconda.org/conda-forge/linux-64/libvpx-1.14.1-hac33072_0.conda#cde393f461e0c169d9ffb2fc70f81c33 -https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hd590300_0.conda#151cba22b85a989c2d6ef9633ffee1e4 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 -https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.6-h59595ed_0.conda#9160cdeb523a1b20cf8d2a0bf821f45d -https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.3.0-hf1915f5_4.conda#784a4df6676c581ca624fbe460703a6d https://conda.anaconda.org/conda-forge/linux-64/openh264-2.4.1-h59595ed_0.conda#3dfcf61b8e78af08110f5229f79580af https://conda.anaconda.org/conda-forge/linux-64/p11-kit-0.24.1-hc5aa10d_0.tar.bz2#56ee94e34b71742bbdfa832c974e47a8 -https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda#8292dea9e022d9610a11fce5e0896ed8 +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-h0f59acf_0.conda#3914f7ac1761dce57102c72ca7c35d01 https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 https://conda.anaconda.org/conda-forge/linux-64/pugixml-1.14-h59595ed_0.conda#2c97dd90633508b422c11bd3018206ab https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 -https://conda.anaconda.org/conda-forge/linux-64/svt-av1-2.1.0-hac33072_0.conda#2a08edb7cd75e56623f2712292a97325 +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda#6b7dcc7349efd123d493d2dbe85a045f +https://conda.anaconda.org/conda-forge/linux-64/svt-av1-2.1.2-hac33072_0.conda#06c5dec4ebb47213b648a6c4dc8400d6 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/wayland-1.23.0-h5291e77_0.conda#c13ca0abd5d1d31d0eebcf86d51da8a4 https://conda.anaconda.org/conda-forge/linux-64/x265-3.5-h924138e_3.tar.bz2#e7f6ed84d4623d52ee581325c1587a6b https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda#93ee23f12bc2e684548181256edd2cf6 -https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h4ab18f5_6.conda#559d338a4234c2ad6e676f460a093e67 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-hc2324a3_1.conda#11d76bee958b1989bd1ac6ee7372ea6d +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-hef167b5_0.conda#54fe76ab3d0189acaef95156874db7f9 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb -https://conda.anaconda.org/conda-forge/linux-64/gl2ps-1.4.2-h0708190_0.tar.bz2#438718bf8921ac70956d919d0e2cc487 -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 +https://conda.anaconda.org/conda-forge/linux-64/gl2ps-1.4.2-hae5d5c5_1.conda#00e642ec191a19bf806a3915800e9524 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 https://conda.anaconda.org/conda-forge/linux-64/libasprintf-devel-0.22.5-h661eb56_2.conda#02e41ab5834dcdcc8590cf29d9526f50 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.2-hf974151_0.conda#72724f6a78ecb15559396966226d5838 -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda#a356024784da6dfd4683dc5ecf45b155 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.3-h8a4344b_1.conda#6ea440297aacee4893f02ad759e6ffbc +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.3-h08a7969_0.conda#6945825cebd2aeb16af4c69d97c32c13 -https://conda.anaconda.org/conda-forge/linux-64/libtheora-1.1.1-h7f98852_1005.tar.bz2#1a7c35f56343b7e9e8db20b296c7566c +https://conda.anaconda.org/conda-forge/linux-64/libtheora-1.1.1-h4ab18f5_1006.conda#553281a034e9cf8693c9df49f6c78ea1 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda#340278ded8b0dc3a73f3660bbb0adbc6 -https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.3.0-hca2cd23_4.conda#1b50eebe2a738a3146c154d2eceaa8b6 -https://conda.anaconda.org/conda-forge/linux-64/python-3.12.3-hab00c5b_0_cpython.conda#2540b74d304f71d3e89c81209db4db84 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-h4c95cb1_3.conda#0ac9aff6010a7751961c8e4b863a40e7 +https://conda.anaconda.org/conda-forge/linux-64/python-3.12.4-h194c7f8_0_cpython.conda#d73490214f536cccb5819e9873048c92 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.0-h6d4b2fc_0.conda#77ea8dff5cf8550cc8f5629a6af56323 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-hd590300_1.conda#9bfac7ccd94d54fd21a0501296d60424 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h8ee46fc_1.conda#632413adcd8bc16b515cab87a2932913 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.9-hd590300_1.conda#e995b155d938b6779da6ace6c6b13816 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.1-h8ee46fc_1.conda#90108a432fb5c6150ccfee3f03388656 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec +https://conda.anaconda.org/conda-forge/noarch/wayland-protocols-1.36-hd8ed1ab_0.conda#c6f690e7d4abf562161477f14533cfd8 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-hb711507_1.conda#4a6d410296d7e39f00bacdee7df046e9 https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda#f730d54ba9cd543666d7220c9f7ed563 https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h30efb56_1.conda#45801a89533d3336a365284d93298e36 -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.6.2-pyhd8ed1ab_0.conda#8821ec1c8fcdc9e1d291d7b9f6e9968a +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca @@ -149,31 +146,30 @@ https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz https://conda.anaconda.org/conda-forge/noarch/colorcet-3.1.0-pyhd8ed1ab_0.conda#4d155b600b63bc6ba89d91fab74238f8 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.10-py312h30efb56_0.conda#b119273bff37284cbcb9281c1e85e67d -https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda#e8cd5d629f65bdf0f3bb312cde14659e -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda#15dda3cdbf330abfe9f555d22f66db46 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.3-pyhd8ed1ab_0.conda#eae681f708bd52d9d172bd5c9af23898 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.4-pyhd8ed1ab_0.conda#0e7e4388e9d5283e22b35a9443bdbcc9 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d https://conda.anaconda.org/conda-forge/linux-64/frozenlist-1.4.1-py312h98912ed_0.conda#2715764dfa5fb00343e03d5a59b64582 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.0-pyhff2d567_0.conda#ad6af3f92e71b1579ac2362b6cf29105 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.1-pyhff2d567_0.conda#996bf792cdb8c0ac38ff54b9fde56841 https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.12-hb9ae30d_0.conda#201db6c2d9a3c5e46573ac4cb2e92f4f https://conda.anaconda.org/conda-forge/linux-64/gettext-0.22.5-h59595ed_2.conda#219ba82e95d7614cf7140d2a4afc0926 -https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.80.2-hb6ce0ca_0.conda#a965aeaf060289528a3fbe09326edae2 https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe +https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 https://conda.anaconda.org/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_0.tar.bz2#18ee9c07cf945a33f92caf1ee3d23ad9 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py312h8572e83_1.conda#c1e71f2bc05d8e8e033aefac2c490d05 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 +https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.4-hfca40fe_0.conda#32ddb97f897740641d8d46a829ce1704 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda#1a2a0cd3153464fee6646f3dd6dad9b8 -https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h4637d8d_4.conda#d4529f4dff3057982a7617c7ac58fde3 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_0.conda#f21c27f076a07907e70c49bb57bd0f20 -https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.10.0-default_h5622ce7_1001.conda#fc2d5b79c2d3f8568fbab31db7ae02f3 -https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.7-hb77312f_0.conda#bc0ea7e1f75a9b1c8467597fbbd9f86b -https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_1.conda#b8afb3e3cb3423cc445cf611ab95fdb0 +https://conda.anaconda.org/conda-forge/linux-64/libhwloc-2.11.1-default_hecaa2ac_1000.conda#f54aeebefb5c5ff84eca4fb05ca8aa3a +https://conda.anaconda.org/conda-forge/linux-64/libllvm18-18.1.8-h8b73ec9_1.conda#16d94b3586ef3558e5a583598524deb4 https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.4.0-h2c329e2_0.conda#80030debaa84cfc31755d53742df3ca6 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/loguru-0.7.2-py312h7900ff3_1.conda#507696b7c888a8b872b50f24ac860089 @@ -185,7 +181,7 @@ https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.2-h488ebb8_0.conda# https://conda.anaconda.org/conda-forge/noarch/packaging-24.1-pyhd8ed1ab_0.conda#cbe1bb1f21567018ce595d9c2be0f0db https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda#6f6cf28bf8e021933869bae3f84b8fc9 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf -https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py312h98912ed_0.conda#3facaca6cc0f7988df3250efccd32da3 +https://conda.anaconda.org/conda-forge/linux-64/psutil-6.0.0-py312h9a8786e_0.conda#1aeffa86c55972ca4e88ac843eccedf2 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088 https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda#b7f5c092b8f9800150d998a71b76d5a1 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f @@ -196,7 +192,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py312h98912e https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py312h98912ed_1.conda#e3fd78d8d490af1d84763b9fe3f2e552 https://conda.anaconda.org/conda-forge/noarch/scooby-0.10.0-pyhd8ed1ab_0.conda#9e57330f431abbb4c88a5f898a4ba223 -https://conda.anaconda.org/conda-forge/noarch/setuptools-70.1.0-pyhd8ed1ab_0.conda#258e66f95f814d51ada2a1fe9274039b +https://conda.anaconda.org/conda-forge/noarch/setuptools-71.0.1-pyhd8ed1ab_0.conda#aede3d5c0882ebed2f07024400a111ed https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2#6d6552722448103793743dabfbda532d @@ -209,8 +205,6 @@ https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2f https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py312h9a8786e_0.conda#fd9c83fde763b494f07acee1404c280e https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.2-pyha770c72_0.conda#ebe6952715e1d5eb567eeebf25250fa7 https://conda.anaconda.org/conda-forge/noarch/wheel-0.43.0-pyhd8ed1ab_1.conda#0b5293a157c2b5cd513dd1b03d8d3aae -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h8ee46fc_1.conda#9d7bcddf49cbf727730af10e71022c73 -https://conda.anaconda.org/conda-forge/linux-64/xkeyboard-config-2.42-h4ab18f5_0.conda#b193af204da1bfb8c13882d131a14bd2 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxfixes-5.0.3-h7f98852_1004.tar.bz2#e9a21aa4d5e3e5f1aed71e8cefd46b6a https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_0.conda#ed67c36f215b310412b2af935bf3e530 @@ -221,115 +215,107 @@ https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1 https://conda.anaconda.org/conda-forge/noarch/aiosignal-1.3.1-pyhd8ed1ab_0.tar.bz2#d1e1eb7e21a9e2c74279d87dafb68156 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 -https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e +https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-hbb29018_2.conda#b6d90276c5aee9b4407dd94eb0cd40a8 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py312hf06ca03_0.conda#56b0ca764ce23cc54f3f7e2a7b970f6d https://conda.anaconda.org/conda-forge/noarch/click-default-group-1.2.4-pyhd8ed1ab_0.conda#7c2b6931f9b3548ed78478332095c3e9 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.3-py312h9a8786e_0.conda#f01930d0afe8ac5f8062c98e6b8d1fd0 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.0-py312h41a817b_0.conda#66c68c204a3eaabc3b4221f1c4bcebbe https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.3-py312h98912ed_0.conda#a4fbffb84a54767266c69e3699078a00 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.0-py312h9a8786e_0.conda#8490346e9d5efd7a6869582aa0c95b25 -https://conda.anaconda.org/conda-forge/linux-64/glib-2.80.2-hf974151_0.conda#d427988dc3dbd0a4c136f52db356cc6a +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py312h41a817b_0.conda#da921c56bcf69a8b97216ecec0cc4015 +https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.2.0-pyha770c72_0.conda#e1d9f6dc77209defc283bdf61588e968 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.0.0-pyha770c72_0.conda#3286556cdd99048d198f72c3f6f69103 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda#7b86ecb7d3557821c649b3c31e3eb9f2 https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 -https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp18.1-18.1.7-default_h9bb3924_0.conda#bff3d36fbd1b1a2f1e6d34aa3eb6b58c -https://conda.anaconda.org/conda-forge/linux-64/libclang13-18.1.7-default_h087397f_0.conda#536526073c2e7f9056fdce8584da779e -https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.3-h59595ed_0.conda#ee48bf17cc83a00f59ca1494d5646869 https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h119a65a_9.conda#cfebc557e54905dadc355c0e9f003004 -https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca -https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.49-h4f305b6_0.conda#dfcfd72c7a430d3616763ecfbefe4ca9 https://conda.anaconda.org/conda-forge/linux-64/libidn2-2.3.7-hd590300_0.conda#2b7b0d827c6447cc1d85dc06d5b5de46 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 -https://conda.anaconda.org/conda-forge/linux-64/libva-2.21.0-h4ab18f5_2.conda#109300f4eeeb8a61498283565106b474 -https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.7.0-h662e7e4_0.conda#b32c0da42b1f24a98577bb3d7fc0b995 +https://conda.anaconda.org/conda-forge/linux-64/libva-2.22.0-hb711507_0.conda#d12f659072132c9d16e497073fc1f68b https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py312hdcec9eb_0.conda#425bb325f970e57a047ac57c4586489d +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py312h287a98d_0.conda#59ea71eed98aee0bebbbdd3b118167c7 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.1-h1d62c97_0.conda#44ec51d0857d9be26158bb85caa74fdb https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.2-pyhd8ed1ab_0.conda#0f3f49c22c7ef3a1195fa61dad3c43be https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c -https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.12.0-h297d8ca_1.conda#3ff978d8994f591818a506640c6a7071 +https://conda.anaconda.org/conda-forge/linux-64/tbb-2021.12.0-h434a139_3.conda#c667c11d1e488a38220ede8a34441bff https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_0.conda#92cdb6fe54b78739ad70637e4f0deb07 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda#7d36e7a485ea2f5829408813bdbbfb38 -https://conda.anaconda.org/conda-forge/linux-64/xcb-util-cursor-0.1.4-hd590300_1.conda#1ecae8461689e44fe0f0e3d18e58e799 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.3-pyhd8ed1ab_0.conda#284008712816c64c85bf2b7fa9f3b264 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdamage-1.1.5-h7f98852_1.tar.bz2#bebd3814ec2355fab6a474b07ed73093 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrandr-1.5.2-h7f98852_1.tar.bz2#5b0f7da25a4556c9619c3e4b4a98ab07 https://conda.anaconda.org/conda-forge/linux-64/yarl-1.9.4-py312h98912ed_0.conda#ec3eb4803df33e90a41bc216a68d02f1 https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.9.5-py312h98912ed_0.conda#edc01db954d139fe398a5f378f96ab4d https://conda.anaconda.org/conda-forge/noarch/asv_runner-0.2.1-pyhd8ed1ab_0.conda#fdcbeb072c80c805a2ededaa5f91cd79 -https://conda.anaconda.org/conda-forge/linux-64/glew-2.1.0-h9c3ff4c_2.tar.bz2#fb05eb5c47590b247658243d27fc32f1 https://conda.anaconda.org/conda-forge/linux-64/gnutls-3.7.9-hb077bed_0.conda#33eded89024f21659b1975886a4acf70 -https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.24.4-haf2f30d_0.conda#926c2c7ee7a0b48d6d70783a33f7bc80 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.5.0-hfac3d4d_0.conda#f5126317dd0ce0ba26945e411ecc6960 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.2.0-hd8ed1ab_0.conda#3de0087b2b86443cfae650dea6ecec6f -https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.10.3-hd590300_0.conda#32d16ad533c59bb0a3c5ffaf16110829 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hfac3d4d_0.conda#c7b47c64af53e8ecee01d101eeab2342 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.0.0-hd8ed1ab_0.conda#5f8c8ebbe6413a7838cf6ecf14d5d31b +https://conda.anaconda.org/conda-forge/noarch/lazy_loader-0.4-pyhd8ed1ab_0.conda#a284ff318fbdb0dd83928275b4b6087c https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2024.1.0-h2da1b83_7.conda#692bb11510bfceb34723c5115045096e -https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda#ef1910918dd895516a769ed36b5b3a4e +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-2024.2.0-h2da1b83_1.conda#9511859bf5221238a2d3fb5322af01d5 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda#d8285bea2a350f63fab23bf460221f3f https://conda.anaconda.org/conda-forge/noarch/pbr-6.0.0-pyhd8ed1ab_0.conda#8dbab5ba746ed14aa32cb232dc437f8f https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312h38f1c37_5.conda#867baf2a7c5c6147e05ecc90f6c52a0c https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_0.conda#b39568655c127a9c4a44d178ac99b6d0 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-8.1.0-pyhd8ed1ab_0.conda#ba9f7f0ec4f2a18de3e7bce67c4a431e -https://conda.anaconda.org/conda-forge/linux-64/tbb-devel-2021.12.0-h7c56ddd_1.conda#f896f49efc2e33ab5d4d3690bb4f32ef +https://conda.anaconda.org/conda-forge/linux-64/tbb-devel-2021.12.0-hfcbfbdb_3.conda#dd410ed856f34c994f1549079ff601bf https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h8572e83_4.conda#52c9e25ee0a32485a102eeecdb7eef52 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h3483029_0.conda#eab52e88c858d87cf5a069f79d10bb50 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312h085067d_0.conda#864d9e92f012bcc49650428d5343c98a https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py312h8572e83_0.conda#12c6a831ef734f0b2dd4caff514cbb7f -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.6.2-pyhd8ed1ab_0.conda#048ca0ec2cd1f3995d2d36dec0efd99a -https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.24.4-h9ad1361_0.conda#147cce520ec59367549fd0d96d404213 -https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 -https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.1-h8fe9dca_1.conda#c306fd9cc90c0585171167d09135a827 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2024.1.0-hb045406_7.conda#d83d6787a9a002b626e20de84719da64 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2024.1.0-hb045406_7.conda#928f79281dbcc73e8e8fc2096b993b97 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2024.1.0-h5c03a75_7.conda#34db2a8d0504a807a735da48234e2a1d -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2024.1.0-h2da1b83_7.conda#22ef5cad44c9e3caecbee37465c33fca -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2024.1.0-h2da1b83_7.conda#98d53dafdd090d01ae50719eabe374e7 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-npu-plugin-2024.1.0-he02047a_7.conda#e766c8a98f4efef2e9be7146fad9b6f2 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2024.1.0-h5c03a75_7.conda#1eb037f090cb525857b01702b2afb6a0 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2024.1.0-h07e8aee_7.conda#019fb9bcd7ce0178fa85f3c610efb8c3 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2024.1.0-h07e8aee_7.conda#991c28a11b0ace4b340a445b538cece8 -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2024.1.0-he02047a_7.conda#2b231b8cdbd2495706526ac1ab3c821c -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2024.1.0-h39126c6_7.conda#d6aac92f4b03be8c86b09f40e1f5263a -https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2024.1.0-he02047a_7.conda#f7a46aa4f5c53423bf3e036da8c1b632 -https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_1.conda#3366af27f0b593544a6cd453c7932ac5 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.7.0-pyhd8ed1ab_0.conda#755e47653ae38f5c50f1435af756e844 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 +https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.1-h39113c1_2.conda#25db2ea6b8fefce451369e2cc826f6f4 +https://conda.anaconda.org/conda-forge/linux-64/libmicrohttpd-1.0.1-h97afed2_0.conda#00bd7406d24d6574f2de3839b60e0925 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-batch-plugin-2024.2.0-hb045406_1.conda#70d82a64e6d07f4d6e07cae6b0bd4bd1 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-auto-plugin-2024.2.0-hb045406_1.conda#f1e2a8ded23cef03804c4edb2edfb986 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-hetero-plugin-2024.2.0-h5c03a75_1.conda#95d2d3baaa1e456ef65c713a5d99b815 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-cpu-plugin-2024.2.0-h2da1b83_1.conda#9e49f87d8f99dc9724f52b3fac904106 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-gpu-plugin-2024.2.0-h2da1b83_1.conda#a9712fae44d01d906e228c49235e3b89 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-intel-npu-plugin-2024.2.0-he02047a_1.conda#5c2d064181e686cf5cfac6f1a1ee4e91 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-ir-frontend-2024.2.0-h5c03a75_1.conda#89addf0fc0f489fa0c076f1c8c0d62bf +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-onnx-frontend-2024.2.0-h07e8aee_1.conda#9b0a13989b35302e47da13842683804d +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-paddle-frontend-2024.2.0-h07e8aee_1.conda#7b3680d3fd00e1f91d5faf9c97c7ae78 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-pytorch-frontend-2024.2.0-he02047a_1.conda#ac43b516c128411f84f1e19c875998f1 +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-frontend-2024.2.0-h39126c6_1.conda#11acf52cac790edcf087b89e83834f7d +https://conda.anaconda.org/conda-forge/linux-64/libopenvino-tensorflow-lite-frontend-2024.2.0-he02047a_1.conda#e7f91b35e3aa7abe880fc9192a761fc0 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.3.0-py312h98912ed_1.conda#d5273d1e67b7b3a871a0a711c6532a2f https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_h228c76a_104.conda#91bc3ac73308181d55a09d9e4aeb4496 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.2.2-py312h1d6d2e6_1.conda#ae00b61f3000d2284d1f2584d4dfafa8 -https://conda.anaconda.org/conda-forge/linux-64/pango-1.54.0-h84a9a3c_0.conda#7c51e110b2f059c0843269d3324e4b22 -https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_0.conda#8dab97d8a9616e07d779782995710aed +https://conda.anaconda.org/conda-forge/linux-64/pango-1.54.0-h4c5309f_1.conda#7df02e445367703cd87a574046e3a6f0 https://conda.anaconda.org/conda-forge/linux-64/pykdtree-1.3.12-py312h085067d_1.conda#7aeadf26294d5e86c0d40d0f960f5366 -https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.4.1-py312hc7c0aa3_1.conda#b91ccda9d16e7016efd831c7d8f97a9e -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.1-py312hc2bc53b_0.conda#864b2399a9c998e17d1a9a4e0c601285 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py312ha5b4d35_1.conda#1248b799f811d8ea215de88f53ae7ffc +https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.6.0-py312h085067d_0.conda#092b4c0b822e36ed686010d2578953f1 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.0-py312hc2bc53b_1.conda#eae80145f63aa04a02dda456d4883b46 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.5-py312h8413631_0.conda#3e67354b24c7ee057ddee367f310ad3e https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-apidoc-0.3.0-py_1.tar.bz2#855b087883443abb10f5faf6eef40860 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 https://conda.anaconda.org/conda-forge/noarch/wslink-2.1.1-pyhd8ed1ab_0.conda#6b1aef9c878c58baa7bb9f0d44457174 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py312h085067d_5.conda#b40cdf87aee69ccf162022579cb99afb -https://conda.anaconda.org/conda-forge/noarch/distributed-2024.6.2-pyhd8ed1ab_0.conda#eecb4c188864376d2b45a5afc4bcb2fa +https://conda.anaconda.org/conda-forge/noarch/distributed-2024.7.0-pyhd8ed1ab_0.conda#2ae917b0098f286f63f69ec9365fb0b1 +https://conda.anaconda.org/conda-forge/linux-64/elfutils-0.191-h924a536_0.conda#73d050766060acd2b3a289f27d857090 https://conda.anaconda.org/conda-forge/linux-64/esmf-8.6.1-nompi_h0a5817f_2.conda#e23c62f75f67166cf4ca137fc8bcdce7 -https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-6.1.1-gpl_he44c6f3_112.conda#51a49318bcd4e848e867a5b9ea5b6545 -https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h280cfa0_4.conda#410f86e58e880dcc7b0e910a8e89c05c +https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-6.1.1-gpl_h9be9148_116.conda#b89791728e73df731d1560f936147a01 +https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h6470451_5.conda#1483ba046164be27df7f6eddbcec3a12 https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a -https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.1-hadf69e7_0.conda#73fc255d740d23da4f554b58dc4909fd +https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.2-h9564881_1.conda#c6a47e6f551890e82e92e4c1b84be353 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py312h20ab3a6_2.conda#fbfe798f83f0d66410903ad8f40d5283 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py312h39d4375_102.conda#2c0df33e745d3bd509f76217b8c79096 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py312h1ef7fb6_101.conda#c67cc8e3a34c5cb8920c79918112e96f https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda#724bc4489c1174fc8e3233b0624fa51f -https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-17.0-hb77b528_0.conda#07f45f1be1c25345faddb8db0de8039b https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py312h085067d_2.conda#1e88f5023d2af511e48e4489b45b9f9b +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py312h1d6d2e6_1.conda#6392d3ce615ab0f32bc39b07f8f4c300 https://conda.anaconda.org/conda-forge/noarch/cmocean-4.0.3-pyhd8ed1ab_0.conda#53df00540de0348ed1b2a62684dd912b https://conda.anaconda.org/conda-forge/noarch/esmpy-8.6.1-pyhc1e730c_0.conda#25a9661177fd68bfdb4314fd658e5c3b https://conda.anaconda.org/conda-forge/linux-64/graphviz-11.0.0-hc68bbd7_0.conda#52a531ef95358086a56086c45d97ab75 +https://conda.anaconda.org/conda-forge/linux-64/mesalib-24.1.4-h3ac77ca_0.conda#083464147e4169cf088522070964e0cf https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 -https://conda.anaconda.org/conda-forge/linux-64/qt6-main-6.7.1-h2471661_2.conda#ae062fb9d42d41102416a4a7e4adf3d2 -https://conda.anaconda.org/conda-forge/linux-64/vtk-base-9.3.0-qt_py312h1234567_200.conda#e607cc4bdc97ffbdc83cbf5f18537f93 -https://conda.anaconda.org/conda-forge/linux-64/vtk-io-ffmpeg-9.3.0-qt_py312h1234567_200.conda#382886acb577233f449a85cd82d7b266 -https://conda.anaconda.org/conda-forge/linux-64/vtk-9.3.0-qt_py312h1234567_200.conda#0006750ce0138b2f412daab8b56f92cf -https://conda.anaconda.org/conda-forge/noarch/pyvista-0.43.10-pyhd8ed1ab_0.conda#384286d18f25d9ae3ae07fd9817c7b0d -https://conda.anaconda.org/conda-forge/noarch/geovista-0.4.1-pyhd8ed1ab_0.conda#8dbe5526321fa7f1cb4dbc4f1644dcb3 -https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.3-pyhd8ed1ab_0.conda#55e445f4fcb07f2471fb0e1102d36488 +https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_0.conda#8dab97d8a9616e07d779782995710aed +https://conda.anaconda.org/conda-forge/linux-64/vtk-base-9.3.1-osmesa_py312hb25cddc_101.conda#503f5be16a4df665d9a068ce9588c2a1 +https://conda.anaconda.org/conda-forge/linux-64/vtk-io-ffmpeg-9.3.1-osmesa_py312hde2fd57_101.conda#eef52b2d6c8c72871bd16858eecc7d1a +https://conda.anaconda.org/conda-forge/linux-64/vtk-9.3.1-osmesa_py312h7c0142d_101.conda#2f6fe962f2b2e2986bbed13a78e6aa3f +https://conda.anaconda.org/conda-forge/noarch/pyvista-0.44.0-pyhd8ed1ab_0.conda#16270d42141769c8342e067d25acc6ce +https://conda.anaconda.org/conda-forge/noarch/geovista-0.5.1-pyhd8ed1ab_0.conda#22958696ccc609071ba40867090bfd3a +https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.4-pyhd8ed1ab_0.conda#c7c50dd5192caa58a05e6a4248a27acb https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_0.conda#ac832cc43adc79118cf6e23f1f9b8995 https://conda.anaconda.org/conda-forge/noarch/sphinx-design-0.6.0-pyhd8ed1ab_0.conda#b04f3c04e4f7939c6207dc0c0355f468 https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.16.0-pyhd8ed1ab_0.conda#add28691ee89e875b190eda07929d5d4 @@ -337,5 +323,5 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda#7e1e7437273682ada2ed5e9e9714b140 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda#26acae54b06f178681bfb551760f5dd1 -https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda#7b1465205e28d75d2c0e1a868ee00a67 +https://conda.anaconda.org/conda-forge/noarch/sphinx-7.4.5-pyhd8ed1ab_0.conda#98a3e9786dd637216c6a028f5061cd71 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e diff --git a/requirements/py310.yml b/requirements/py310.yml index f7184cc769..309f8aa9a2 100644 --- a/requirements/py310.yml +++ b/requirements/py310.yml @@ -16,7 +16,7 @@ dependencies: - cftime >=1.5 - dask-core >=2022.9.0 - libnetcdf !=4.9.1 - - matplotlib-base >=3.5 + - matplotlib-base >=3.5, !=3.9.1 - netcdf4 - numpy >=1.24, !=1.24.3, <2 - python-xxhash diff --git a/requirements/py311.yml b/requirements/py311.yml index 85d9d9271e..58d71ddd52 100644 --- a/requirements/py311.yml +++ b/requirements/py311.yml @@ -16,7 +16,7 @@ dependencies: - cftime >=1.5 - dask-core >=2022.9.0 - libnetcdf !=4.9.1 - - matplotlib-base >=3.5 + - matplotlib-base >=3.5, !=3.9.1 - netcdf4 - numpy >=1.24, !=1.24.3, <2 - python-xxhash diff --git a/requirements/py312.yml b/requirements/py312.yml index 02622c3dc1..e1e62e52d9 100644 --- a/requirements/py312.yml +++ b/requirements/py312.yml @@ -16,7 +16,7 @@ dependencies: - cftime >=1.5 - dask-core >=2022.9.0 - libnetcdf !=4.9.1 - - matplotlib-base >=3.5 + - matplotlib-base >=3.5, !=3.9.1 - netcdf4 - numpy >=1.24, !=1.24.3, <2 - python-xxhash