From cd7fa42e2019f0f87a6126637bfa756e16f4ea35 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 21 Oct 2022 01:56:33 +0100 Subject: [PATCH 01/85] Basic functional lazy saving. --- lib/iris/fileformats/netcdf/saver.py | 116 ++++++++++++++++++++++++--- lib/iris/io/__init__.py | 10 ++- 2 files changed, 113 insertions(+), 13 deletions(-) diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index f7f4864f9e..043920ecb1 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -23,6 +23,7 @@ import warnings import cf_units +import dask import dask.array as da import numpy as np import numpy.ma as ma @@ -496,10 +497,51 @@ def __setitem__(self, keys, arr): MESH_ELEMENTS = ("node", "edge", "face") +class DeferredSaveWrapper: + """ + An object which mimics the data access of a netCDF4.Variable, and can be written to. + It encapsulates the netcdf file and variable which are actually to be written to. + This opens the file each time, to enable writing the data chunk, then closes it. + TODO: could be improved with a caching scheme, but this just about works. + """ + + def __init__(self, filepath: str, cf_var: netCDF4.Variable): + # Grab useful properties of the variable, including the identifying 'name'. + self.path = filepath + for key in ("shape", "dtype", "ndim", "name"): + setattr(self, key, getattr(cf_var, key)) + + def __setitem__(self, keys, array_data): + # Write to the variable. + # Re-open the file for writing. + dataset = netCDF4.Dataset(self.path, "r+") + try: + var = dataset.variables[self.name] + var[keys] = array_data + finally: + dataset.close() + + def __repr__(self): + fmt = ( + "<{self.__class__.__name__} shape={self.shape}" + " dtype={self.dtype!r} path={self.path!r}" + " name={self.name!r}>" + ) + return fmt.format(self=self) + + +@dask.delayed +def combined_delayeds(*args): + """A delayed function which simply computes all its arguments.""" + # Dask computes the lazy args before passing them here. + # So job done -- we don't need to do anything with them. + pass + + class Saver: """A manager for saving netcdf files.""" - def __init__(self, filename, netcdf_format): + def __init__(self, filename, netcdf_format, compute=True): """ A manager for saving netcdf files. @@ -512,6 +554,15 @@ def __init__(self, filename, netcdf_format): Underlying netCDF file format, one of 'NETCDF4', 'NETCDF4_CLASSIC', 'NETCDF3_CLASSIC' or 'NETCDF3_64BIT'. Default is 'NETCDF4' format. + * compute (bool): + If True, the Saver performs normal 'synchronous' data writes, where data + is streamed directly into file variables during the save operation. + If False, the file is created as normal, but computation and streaming of + any lazy array content is instead deferred to :class:`dask.delayed` objects, + which are held in a list in the saver 'delayed_writes' property. + The relavant file variables are created empty, and the write can + subsequently be completed by computing the 'save.deferred_writes'. + Returns: None. @@ -548,7 +599,14 @@ def __init__(self, filename, netcdf_format): self._mesh_dims = {} #: A dictionary, mapping formula terms to owner cf variable name self._formula_terms_cache = {} + #: Whether lazy saving. + self.lazy_saves = not compute + #: A list of deferred writes (if lazy saving) + self.deferred_writes = [] + #: Target filepath + self.filepath = filename #: NetCDF dataset + self._dataset = None try: self._dataset = _thread_safe_nc.DatasetWrapper( filename, mode="w", format=netcdf_format @@ -2444,8 +2502,7 @@ def _increment_name(self, varname): return "{}_{}".format(varname, num) - @staticmethod - def _lazy_stream_data(data, fill_value, fill_warn, cf_var): + def _lazy_stream_data(self, data, fill_value, fill_warn, cf_var): if hasattr(data, "shape") and data.shape == (1,) + cf_var.shape: # (Don't do this check for string data). # Reduce dimensionality where the data array has an extra dimension @@ -2455,13 +2512,36 @@ def _lazy_stream_data(data, fill_value, fill_warn, cf_var): data = data.squeeze(axis=0) if is_lazy_data(data): + if self.lazy_saves: + # deferred lazy streaming + def store(data, cf_var, fill_value): + # Create a data-writeable object that we can stream into, which + # encapsulates the file to be opened + variable to be written. + writeable_var_wrapper = DeferredSaveWrapper( + self.filepath, cf_var + ) + # Add a delayed save to our 'deferred_writes' list. + self.deferred_writes.append( + da.store( + [data], [writeable_var_wrapper], compute=False + ) + ) + # NOTE: in this case, no checking of fill-value violations so just + # return dummy values for this. + # TODO: just for now -- can probably make this work later + is_masked, contains_value = False, False + return is_masked, contains_value - def store(data, cf_var, fill_value): - # Store lazy data and check whether it is masked and contains - # the fill value - target = _FillValueMaskCheckAndStoreTarget(cf_var, fill_value) - da.store([data], [target]) - return target.is_masked, target.contains_value + else: + # Immediate streaming store : check mask+fill as we go. + def store(data, cf_var, fill_value): + # Store lazy data and check whether it is masked and contains + # the fill value + target = _FillValueMaskCheckAndStoreTarget( + cf_var, fill_value + ) + da.store([data], [target]) + return target.is_masked, target.contains_value else: @@ -2530,6 +2610,7 @@ def save( least_significant_digit=None, packing=None, fill_value=None, + compute=True, ): """ Save cube(s) to a netCDF file, given the cube and the filename. @@ -2652,6 +2733,14 @@ def save( `:class:`iris.cube.CubeList`, or a single element, and each element of this argument will be applied to each cube separately. + * compute (bool): + When False, create the output file but defer writing any lazy array content to + its variables, such as (lazy) data and aux-coords points and bounds. + Instead return a class:`dask.delayed` which, when computed, will compute all + the lazy content and stream it to complete the file. + Several such data saves can be performed in parallel, by passing a list of them + into a :func:`dask.compute` call. + Returns: None. @@ -2752,7 +2841,7 @@ def is_valid_packspec(p): raise ValueError(msg) # Initialise Manager for saving - with Saver(filename, netcdf_format) as sman: + with Saver(filename, netcdf_format, compute=compute) as sman: # Iterate through the cubelist. for cube, packspec, fill_value in zip(cubes, packspecs, fill_values): sman.write( @@ -2797,3 +2886,10 @@ def is_valid_packspec(p): # Add conventions attribute. sman.update_global_attributes(Conventions=conventions) + + if compute: + result = None + else: + # For lazy save, return a single 'delayed' representing all lazy writes. + result = combined_delayeds(sman.deferred_writes) + return result diff --git a/lib/iris/io/__init__.py b/lib/iris/io/__init__.py index 7dd08c723c..0ae40a77fa 100644 --- a/lib/iris/io/__init__.py +++ b/lib/iris/io/__init__.py @@ -454,7 +454,7 @@ def save(source, target, saver=None, **kwargs): # Single cube? if isinstance(source, Cube): - saver(source, target, **kwargs) + result = saver(source, target, **kwargs) # CubeList or sequence of cubes? elif isinstance(source, CubeList) or ( @@ -473,13 +473,17 @@ def save(source, target, saver=None, **kwargs): # Force append=True for the tail cubes. Don't modify the incoming # kwargs. kwargs = kwargs.copy() + result = [] for i, cube in enumerate(source): if i != 0: kwargs["append"] = True - saver(cube, target, **kwargs) + result.append(saver(cube, target, **kwargs)) + # Netcdf saver. else: - saver(source, target, **kwargs) + result = saver(source, target, **kwargs) else: raise ValueError("Cannot save; non Cube found in source") + + return result From 1f3280019d8db387615966de8eb4af473333d9d4 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 21 Oct 2022 02:16:14 +0100 Subject: [PATCH 02/85] Simplify function signature which upsets Sphinx. --- lib/iris/fileformats/netcdf/saver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index 043920ecb1..639a464337 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -505,7 +505,7 @@ class DeferredSaveWrapper: TODO: could be improved with a caching scheme, but this just about works. """ - def __init__(self, filepath: str, cf_var: netCDF4.Variable): + def __init__(self, filepath, cf_var): # Grab useful properties of the variable, including the identifying 'name'. self.path = filepath for key in ("shape", "dtype", "ndim", "name"): From e0f980fdb5821e327d782569599acd01e7f91d25 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 21 Oct 2022 02:28:17 +0100 Subject: [PATCH 03/85] Non-lazy saves return nothing. --- lib/iris/io/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/iris/io/__init__.py b/lib/iris/io/__init__.py index 0ae40a77fa..3de54e1cca 100644 --- a/lib/iris/io/__init__.py +++ b/lib/iris/io/__init__.py @@ -477,8 +477,9 @@ def save(source, target, saver=None, **kwargs): for i, cube in enumerate(source): if i != 0: kwargs["append"] = True - result.append(saver(cube, target, **kwargs)) + saver(cube, target, **kwargs) + result = None # Netcdf saver. else: result = saver(source, target, **kwargs) From 67b96cfd9571daef3ce4564240cd4cc51ef3e46e Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Sun, 23 Oct 2022 15:44:58 +0100 Subject: [PATCH 04/85] Now fixed to enable use with process/distributed scheduling. --- lib/iris/fileformats/netcdf/saver.py | 100 +++++++++++++++++---------- 1 file changed, 64 insertions(+), 36 deletions(-) diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index 639a464337..fa15548a87 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -25,6 +25,9 @@ import cf_units import dask import dask.array as da +from dask.utils import SerializableLock +import filelock +import netCDF4 import numpy as np import numpy.ma as ma @@ -505,37 +508,31 @@ class DeferredSaveWrapper: TODO: could be improved with a caching scheme, but this just about works. """ - def __init__(self, filepath, cf_var): - # Grab useful properties of the variable, including the identifying 'name'. + def __init__(self, filepath, cf_var, lockfile_path): self.path = filepath - for key in ("shape", "dtype", "ndim", "name"): - setattr(self, key, getattr(cf_var, key)) + self.varname = cf_var.name + self.lockfile_path = lockfile_path def __setitem__(self, keys, array_data): # Write to the variable. - # Re-open the file for writing. - dataset = netCDF4.Dataset(self.path, "r+") + # First acquire a file-specific lock + # Importantly, in working via the file-system, this is common to all workers, + # even when using processes or distributed. + lock = filelock.FileLock(self.lockfile_path) + lock.acquire() + # Now re-open the file for writing + write to the specific file variable. + dataset = None try: - var = dataset.variables[self.name] + dataset = netCDF4.Dataset(self.path, "r+") + var = dataset.variables[self.varname] var[keys] = array_data finally: - dataset.close() + if dataset: + dataset.close() + lock.release() def __repr__(self): - fmt = ( - "<{self.__class__.__name__} shape={self.shape}" - " dtype={self.dtype!r} path={self.path!r}" - " name={self.name!r}>" - ) - return fmt.format(self=self) - - -@dask.delayed -def combined_delayeds(*args): - """A delayed function which simply computes all its arguments.""" - # Dask computes the lazy args before passing them here. - # So job done -- we don't need to do anything with them. - pass + return f"<{self.__class__.__name__} path={self.path!r} var={self.varname!r}>" class Saver: @@ -601,23 +598,25 @@ def __init__(self, filename, netcdf_format, compute=True): self._formula_terms_cache = {} #: Whether lazy saving. self.lazy_saves = not compute - #: A list of deferred writes (if lazy saving) + #: A list of deferred writes for lazy saving : each is a (source, target) pair self.deferred_writes = [] #: Target filepath - self.filepath = filename + self.filepath = os.path.abspath(filename) + #: Target lockfile path + self._lockfile_path = self.filepath + ".lock" #: NetCDF dataset self._dataset = None try: self._dataset = _thread_safe_nc.DatasetWrapper( - filename, mode="w", format=netcdf_format + self.filepath, mode="w", format=netcdf_format ) except RuntimeError: - dir_name = os.path.dirname(filename) + dir_name = os.path.dirname(self.filepath) if not os.path.isdir(dir_name): msg = "No such file or directory: {}".format(dir_name) raise IOError(msg) if not os.access(dir_name, os.R_OK | os.W_OK): - msg = "Permission denied: {}".format(filename) + msg = "Permission denied: {}".format(self.filepath) raise IOError(msg) else: raise @@ -2518,14 +2517,10 @@ def store(data, cf_var, fill_value): # Create a data-writeable object that we can stream into, which # encapsulates the file to be opened + variable to be written. writeable_var_wrapper = DeferredSaveWrapper( - self.filepath, cf_var - ) - # Add a delayed save to our 'deferred_writes' list. - self.deferred_writes.append( - da.store( - [data], [writeable_var_wrapper], compute=False - ) + self.filepath, cf_var, self._lockfile_path ) + # Add to the list of deferred writes, used in _deferred_save(). + self.deferred_writes.append((data, writeable_var_wrapper)) # NOTE: in this case, no checking of fill-value violations so just # return dummy values for this. # TODO: just for now -- can probably make this work later @@ -2593,6 +2588,39 @@ def store(data, cf_var, fill_value): ) warnings.warn(msg.format(cf_var.name, fill_value)) + def _deferred_save(self): + """ + Create a 'delayed' to trigger file completion for lazy saves. + + This contains all the deferred writes, which complete the file by filling out + the data of variables initially created empty. + + """ + # Create a lock to satisfy the da.store call. + # We need a serialisable lock for scheduling with processes or distributed. + # See : https://github.com/dask/distributed/issues/780 + # However, this does *not* imply safe access for file writing in parallel. + # For that, DeferredSaveWrapper uses a filelock as well. + lock = SerializableLock() + + # Create a single delayed da.store operation to complete the file. + sources, targets = zip(*self.deferred_writes) + result = da.store(sources, targets, compute=False, lock=lock) + + # Wrap that in an extra operation that follows it by deleting the lockfile. + @dask.delayed + def postsave_remove_lockfile(store_op, lock_path): + if os.path.exists(lock_path): + try: + os.unlink(lock_path) + except Exception as e: + msg = f'Could not remove lockfile "{lock_path}". Error:\n{e}' + raise Exception(msg) + + result = postsave_remove_lockfile(result, self._lockfile_path) + + return result + def save( cube, @@ -2890,6 +2918,6 @@ def is_valid_packspec(p): if compute: result = None else: - # For lazy save, return a single 'delayed' representing all lazy writes. - result = combined_delayeds(sman.deferred_writes) + result = sman._deferred_save() + return result From 8cdbc9b3b97f10fc144ec62aa61c0acd0a028cf0 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 3 Mar 2023 18:13:48 +0000 Subject: [PATCH 05/85] Remove dask.utils.SerializableLock, which I think was a mistake. --- lib/iris/fileformats/netcdf/saver.py | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index fa15548a87..fa2742dab1 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -25,7 +25,6 @@ import cf_units import dask import dask.array as da -from dask.utils import SerializableLock import filelock import netCDF4 import numpy as np @@ -2596,16 +2595,9 @@ def _deferred_save(self): the data of variables initially created empty. """ - # Create a lock to satisfy the da.store call. - # We need a serialisable lock for scheduling with processes or distributed. - # See : https://github.com/dask/distributed/issues/780 - # However, this does *not* imply safe access for file writing in parallel. - # For that, DeferredSaveWrapper uses a filelock as well. - lock = SerializableLock() - # Create a single delayed da.store operation to complete the file. sources, targets = zip(*self.deferred_writes) - result = da.store(sources, targets, compute=False, lock=lock) + result = da.store(sources, targets, compute=False) # Wrap that in an extra operation that follows it by deleting the lockfile. @dask.delayed From 8723f24056f5e814c6b3d35646d1c66e5e0fc0de Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 8 Mar 2023 16:28:05 +0000 Subject: [PATCH 06/85] Make DefferedSaveWrapper use _thread_safe_nc. --- lib/iris/fileformats/netcdf/saver.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index fa2742dab1..a0b536832d 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -26,7 +26,6 @@ import dask import dask.array as da import filelock -import netCDF4 import numpy as np import numpy.ma as ma @@ -522,7 +521,7 @@ def __setitem__(self, keys, array_data): # Now re-open the file for writing + write to the specific file variable. dataset = None try: - dataset = netCDF4.Dataset(self.path, "r+") + dataset = _thread_safe_nc.DatasetWrapper(self.path, "r+") var = dataset.variables[self.varname] var[keys] = array_data finally: From d19a87f90cfd9e892fb53c562f9f0dcf588c5458 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 9 Mar 2023 00:32:25 +0000 Subject: [PATCH 07/85] Fixes for non-lazy save. --- lib/iris/fileformats/netcdf/saver.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index a0b536832d..f68d472438 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -2533,7 +2533,7 @@ def store(data, cf_var, fill_value): target = _FillValueMaskCheckAndStoreTarget( cf_var, fill_value ) - da.store([data], [target]) + da.store([data], [target], lock=False) return target.is_masked, target.contains_value else: @@ -2596,7 +2596,7 @@ def _deferred_save(self): """ # Create a single delayed da.store operation to complete the file. sources, targets = zip(*self.deferred_writes) - result = da.store(sources, targets, compute=False) + result = da.store(sources, targets, compute=False, lock=False) # Wrap that in an extra operation that follows it by deleting the lockfile. @dask.delayed @@ -2860,7 +2860,9 @@ def is_valid_packspec(p): raise ValueError(msg) # Initialise Manager for saving - with Saver(filename, netcdf_format, compute=compute) as sman: + # N.B. FOR NOW -- we are cheating and making all saves compute=False, as otherwise + # non-lazy saves do *not* work with the distributed scheduler. + with Saver(filename, netcdf_format, compute=False) as sman: # Iterate through the cubelist. for cube, packspec, fill_value in zip(cubes, packspecs, fill_values): sman.write( @@ -2906,9 +2908,11 @@ def is_valid_packspec(p): # Add conventions attribute. sman.update_global_attributes(Conventions=conventions) - if compute: - result = None - else: - result = sman._deferred_save() + # For now, not using Saver(compute=True) as it doesn't work with distributed or + # process workers (only threaded). + result = sman._deferred_save() + if compute: + result.compute() + result = None - return result + return result From 45e0e60d87625867ac0bacf67ac27f5528b780fb Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 10 Mar 2023 13:36:21 +0000 Subject: [PATCH 08/85] Avoid saver error when no deferred writes. --- lib/iris/fileformats/netcdf/saver.py | 37 +++++++++++++++++----------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index f68d472438..1517fc9822 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -2594,21 +2594,30 @@ def _deferred_save(self): the data of variables initially created empty. """ - # Create a single delayed da.store operation to complete the file. - sources, targets = zip(*self.deferred_writes) - result = da.store(sources, targets, compute=False, lock=False) - - # Wrap that in an extra operation that follows it by deleting the lockfile. - @dask.delayed - def postsave_remove_lockfile(store_op, lock_path): - if os.path.exists(lock_path): - try: - os.unlink(lock_path) - except Exception as e: - msg = f'Could not remove lockfile "{lock_path}". Error:\n{e}' - raise Exception(msg) + if self.deferred_writes: + # Create a single delayed da.store operation to complete the file. + sources, targets = zip(*self.deferred_writes) + result = da.store(sources, targets, compute=False, lock=False) + + # Wrap that in an extra operation that follows it by deleting the lockfile. + @dask.delayed + def postsave_remove_lockfile(store_op, lock_path): + if os.path.exists(lock_path): + try: + os.unlink(lock_path) + except Exception as e: + msg = f'Could not remove lockfile "{lock_path}". Error:\n{e}' + raise Exception(msg) + + result = postsave_remove_lockfile(result, self._lockfile_path) + + else: + # Return a delayed anyway. + @dask.delayed + def no_op(): + return None - result = postsave_remove_lockfile(result, self._lockfile_path) + result = no_op() return result From 6a8320092719bbdcf4ce440e7ea6fb676fcc217f Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 10 Mar 2023 14:05:59 +0000 Subject: [PATCH 09/85] Reorganise locking code, ready for shareable locks. --- lib/iris/fileformats/netcdf/_dask_locks.py | 24 ++++++++ lib/iris/fileformats/netcdf/saver.py | 68 +++++++++++++++------- 2 files changed, 70 insertions(+), 22 deletions(-) create mode 100644 lib/iris/fileformats/netcdf/_dask_locks.py diff --git a/lib/iris/fileformats/netcdf/_dask_locks.py b/lib/iris/fileformats/netcdf/_dask_locks.py new file mode 100644 index 0000000000..f234c0b3f0 --- /dev/null +++ b/lib/iris/fileformats/netcdf/_dask_locks.py @@ -0,0 +1,24 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. +""" +Module containing code to create locks enabling dask workers to co-operate. + +This matter is complicated by needing different solutions for different dask scheduler +types, i.e. local 'threads' scheduler, local 'processes' or distributed. + +""" +import threading + + +def get_worker_lock(identity: str): + """ + Return a mutex Lock which can be shared amongst Dask workers. + + The type of Lock generated depends on the dask scheduler type, which must therefore + be set up before this is called. + + """ + return threading.Lock() diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index 1517fc9822..1e95a49701 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -52,6 +52,7 @@ # Get the logger : shared logger for all in 'iris.fileformats.netcdf'. from . import logger +from ._dask_locks import get_worker_lock # Avoid warning about unused import. # We could use an __all__, but we don't want to maintain one here @@ -498,6 +499,13 @@ def __setitem__(self, keys, arr): MESH_ELEMENTS = ("node", "edge", "face") +# Configure use of filelock locks in place of distributed locks. +# This means the code has to work differently, because they are not serializable and so +# need to be created at the point of use in each worker, when it calls __setitem__. +# USE_FILELOCK = True +USE_FILELOCK = False + + class DeferredSaveWrapper: """ An object which mimics the data access of a netCDF4.Variable, and can be written to. @@ -506,18 +514,32 @@ class DeferredSaveWrapper: TODO: could be improved with a caching scheme, but this just about works. """ - def __init__(self, filepath, cf_var, lockfile_path): + def __init__(self, filepath, cf_var): # , lockfile_path): self.path = filepath self.varname = cf_var.name - self.lockfile_path = lockfile_path + if USE_FILELOCK: + self._lockfile_path = self.path + ".lock" + else: + self.lock = get_worker_lock(self.path) + + # def __exit__(self, exc_type, exc_val, exc_tb): + # lock_path = self._lockfile_path + # if os.path.exists(lock_path): + # try: + # os.unlink(lock_path) + # except Exception as e: + # msg = f'Could not remove lockfile "{lock_path}". Error:\n{e}' + # raise Exception(msg) def __setitem__(self, keys, array_data): # Write to the variable. # First acquire a file-specific lock # Importantly, in working via the file-system, this is common to all workers, # even when using processes or distributed. - lock = filelock.FileLock(self.lockfile_path) - lock.acquire() + if USE_FILELOCK: + # This type of lock has to be (re-)created in each worker task. + self.lock = filelock.FileLock(self._lockfile_path) + self.lock.acquire() # Now re-open the file for writing + write to the specific file variable. dataset = None try: @@ -527,7 +549,7 @@ def __setitem__(self, keys, array_data): finally: if dataset: dataset.close() - lock.release() + self.lock.release() def __repr__(self): return f"<{self.__class__.__name__} path={self.path!r} var={self.varname!r}>" @@ -600,8 +622,9 @@ def __init__(self, filename, netcdf_format, compute=True): self.deferred_writes = [] #: Target filepath self.filepath = os.path.abspath(filename) - #: Target lockfile path - self._lockfile_path = self.filepath + ".lock" + if USE_FILELOCK: + #: Target lockfile path + self._lockfile_path = self.filepath + ".lock" #: NetCDF dataset self._dataset = None try: @@ -2515,7 +2538,7 @@ def store(data, cf_var, fill_value): # Create a data-writeable object that we can stream into, which # encapsulates the file to be opened + variable to be written. writeable_var_wrapper = DeferredSaveWrapper( - self.filepath, cf_var, self._lockfile_path + self.filepath, cf_var # , self._lockfile_path ) # Add to the list of deferred writes, used in _deferred_save(). self.deferred_writes.append((data, writeable_var_wrapper)) @@ -2598,27 +2621,28 @@ def _deferred_save(self): # Create a single delayed da.store operation to complete the file. sources, targets = zip(*self.deferred_writes) result = da.store(sources, targets, compute=False, lock=False) - - # Wrap that in an extra operation that follows it by deleting the lockfile. - @dask.delayed - def postsave_remove_lockfile(store_op, lock_path): - if os.path.exists(lock_path): - try: - os.unlink(lock_path) - except Exception as e: - msg = f'Could not remove lockfile "{lock_path}". Error:\n{e}' - raise Exception(msg) - - result = postsave_remove_lockfile(result, self._lockfile_path) - else: - # Return a delayed anyway. + # Return a delayed anyway, just for usage consistency @dask.delayed def no_op(): return None result = no_op() + # # Wrap the result in an extra operation which follows it by deleting any + # # remaining lockfile. + # @dask.delayed + # def postsave_remove_lockfile(store_op, lock_path): + # # Note: the "store_op" argument is unused, but it is included so that + # # dask will _compute_ that, before calling this routine. + # if os.path.exists(lock_path): + # try: + # os.unlink(lock_path) + # except Exception as e: + # msg = f'Could not remove lockfile "{lock_path}". Error:\n{e}' + # raise Exception(msg) + # + # result = postsave_remove_lockfile(result, self._lockfile_path) return result From 78a93467d631a1a9a0915b0480bdb7920713c64f Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 10 Mar 2023 15:29:07 +0000 Subject: [PATCH 10/85] Remove optional usage of 'filelock' for lazy saves. --- lib/iris/fileformats/netcdf/saver.py | 52 +++------------------------- 1 file changed, 5 insertions(+), 47 deletions(-) diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index 1e95a49701..c80a416375 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -25,7 +25,6 @@ import cf_units import dask import dask.array as da -import filelock import numpy as np import numpy.ma as ma @@ -499,13 +498,6 @@ def __setitem__(self, keys, arr): MESH_ELEMENTS = ("node", "edge", "face") -# Configure use of filelock locks in place of distributed locks. -# This means the code has to work differently, because they are not serializable and so -# need to be created at the point of use in each worker, when it calls __setitem__. -# USE_FILELOCK = True -USE_FILELOCK = False - - class DeferredSaveWrapper: """ An object which mimics the data access of a netCDF4.Variable, and can be written to. @@ -517,30 +509,13 @@ class DeferredSaveWrapper: def __init__(self, filepath, cf_var): # , lockfile_path): self.path = filepath self.varname = cf_var.name - if USE_FILELOCK: - self._lockfile_path = self.path + ".lock" - else: - self.lock = get_worker_lock(self.path) - - # def __exit__(self, exc_type, exc_val, exc_tb): - # lock_path = self._lockfile_path - # if os.path.exists(lock_path): - # try: - # os.unlink(lock_path) - # except Exception as e: - # msg = f'Could not remove lockfile "{lock_path}". Error:\n{e}' - # raise Exception(msg) + self.lock = get_worker_lock(self.path) def __setitem__(self, keys, array_data): # Write to the variable. - # First acquire a file-specific lock - # Importantly, in working via the file-system, this is common to all workers, - # even when using processes or distributed. - if USE_FILELOCK: - # This type of lock has to be (re-)created in each worker task. - self.lock = filelock.FileLock(self._lockfile_path) + # First acquire a file-specific lock for all workers writing to this file. self.lock.acquire() - # Now re-open the file for writing + write to the specific file variable. + # Open the file for writing + write to the specific file variable. dataset = None try: dataset = _thread_safe_nc.DatasetWrapper(self.path, "r+") @@ -622,9 +597,6 @@ def __init__(self, filename, netcdf_format, compute=True): self.deferred_writes = [] #: Target filepath self.filepath = os.path.abspath(filename) - if USE_FILELOCK: - #: Target lockfile path - self._lockfile_path = self.filepath + ".lock" #: NetCDF dataset self._dataset = None try: @@ -2560,7 +2532,7 @@ def store(data, cf_var, fill_value): return target.is_masked, target.contains_value else: - + # Real data is always written directly, i.e. not via lazy save. def store(data, cf_var, fill_value): cf_var[:] = data is_masked = np.ma.is_masked(data) @@ -2622,27 +2594,13 @@ def _deferred_save(self): sources, targets = zip(*self.deferred_writes) result = da.store(sources, targets, compute=False, lock=False) else: - # Return a delayed anyway, just for usage consistency + # Return a delayed anyway, just for usage consistency. @dask.delayed def no_op(): return None result = no_op() - # # Wrap the result in an extra operation which follows it by deleting any - # # remaining lockfile. - # @dask.delayed - # def postsave_remove_lockfile(store_op, lock_path): - # # Note: the "store_op" argument is unused, but it is included so that - # # dask will _compute_ that, before calling this routine. - # if os.path.exists(lock_path): - # try: - # os.unlink(lock_path) - # except Exception as e: - # msg = f'Could not remove lockfile "{lock_path}". Error:\n{e}' - # raise Exception(msg) - # - # result = postsave_remove_lockfile(result, self._lockfile_path) return result From 31b12f73f987e5eca052b1f4966869eea4d48db2 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 10 Mar 2023 15:30:56 +0000 Subject: [PATCH 11/85] Document dask-specific locking; implement differently for threads or distributed schedulers. --- lib/iris/fileformats/netcdf/_dask_locks.py | 111 ++++++++++++++++++++- 1 file changed, 109 insertions(+), 2 deletions(-) diff --git a/lib/iris/fileformats/netcdf/_dask_locks.py b/lib/iris/fileformats/netcdf/_dask_locks.py index f234c0b3f0..665f33ccd4 100644 --- a/lib/iris/fileformats/netcdf/_dask_locks.py +++ b/lib/iris/fileformats/netcdf/_dask_locks.py @@ -9,16 +9,123 @@ This matter is complicated by needing different solutions for different dask scheduler types, i.e. local 'threads' scheduler, local 'processes' or distributed. +In any case, a "iris.fileformats.netcdf.saver.Saver" object contains a netCDF4.Dataset +targetting an output file, and creates a Saver.lock object to serialise write-accesses +to the file from dask tasks : All dask-task file writes go via a +"iris.fileformats.netcdf.saver.DeferredSaveWrapper" object, which also contains a link +to the Saver.lock, and uses it to prevent workers from fouling each other. +For each chunk written, the DeferredSaveWrapper acquires the common per-file lock; +opens a Dataset on the file; performs a write to the relevant variable; closes the +Dataset and then releases the lock. + +For a threaded scheduler, the Saver.lock is a simple threading.Lock(). The workers +(threads) execute tasks which contain a DeferredSaveWrapper, as above. All of those +contain the common lock, and this is simply **the same object** for all workers, since +they share an address space. + +For a distributed scheduler, the Saver.lock is a `distributed.Lock()` which is +identified with the output filepath. This is distributed to the workers by +serialising the task function arguments, which will include the DeferredSaveWrapper. +A worker behaves like a process, though it may execute on a remote machine. When a +distributed.Lock is deserialised to reconstruct the worker task, this creates an object +that communicates with the scheduler. These objects behave as a single common lock, +as they all have the same string 'identity', so the scheduler implements inter-process +communication so that the mutally exclude each other. + +It is also *conceivable* that multiple processes could write to the same file in +parallel, if the operating system supports it. However, this also requires that the +libnetcdf C library is built with parallel access option, which is not common. +With the "ordinary" libnetcdf build, a process which attempts to rpen for writing a file +which is _already_ open for writing simply raises an access error. +In any case, Iris netcdf saver will not support this mode of operation, at present. + +We don't currently support a local "processes" type scheduler. If we did, the +behaviour should be very similar to a distributed scheduler. It would need to use some +other serialisable shared-lock solution in place of 'distributed.Lock', which requires +a distributed scheduler to function. + """ import threading +import dask.array +import dask.base +import dask.multiprocessing +import dask.threaded + + +def dask_scheduler_is_distributed(): + """Return whether a distributed.Client is active.""" + # NOTE: this replicates logic in `dask.base.get_scheduler` : if a distributed client + # has been created + is still active, then the default scheduler will always be + # "distributed". + is_distributed = False + # NOTE: must still work when 'distributed' is not available. + try: + import distributed + + client = distributed.get_client() + is_distributed = client is not None + except (ImportError, ValueError): + pass + return is_distributed + + +def get_dask_array_scheduler_type(): + """ + Work out what type of scheduler an array.compute*() will use. + + Returns one of 'distributed', 'threads' or 'processes'. + The return value is a valid argument for dask.config.set(scheduler=). + This cannot distinguish between distributed local and remote clusters -- both of + those simply return 'distributed'. + + NOTE: this takes account of how dask is *currently* configured. It will be wrong + if the config changes before the compute actually occurs. + + """ + if dask_scheduler_is_distributed(): + result = "distributed" + else: + # Call 'get_scheduler', which respects the config settings, but pass an array + # so we default to the default scheduler for that type of object. + trial_dask_array = dask.array.zeros(1) + get_function = dask.base.get_scheduler(collections=[trial_dask_array]) + # Detect the ones which we recognise. + if get_function == dask.threaded.get: + result = "threads" + elif get_function == dask.multiprocessing.get: + result = "processes" + else: + msg = f"Dask default scheduler for arrays is unrecognised : {get_function}" + raise ValueError(msg) + + return result + def get_worker_lock(identity: str): """ - Return a mutex Lock which can be shared amongst Dask workers. + Return a mutex Lock which can be shared by multiple Dask workers. The type of Lock generated depends on the dask scheduler type, which must therefore be set up before this is called. """ - return threading.Lock() + scheduler_type = get_dask_array_scheduler_type() + if scheduler_type == "threads": + # N.B. the "identity" string is never used in this case, as the same actual + # lock object is used by all workers. + lock = threading.Lock() + elif scheduler_type == "distributed": + from dask.distributed import Lock as DistributedLock + + lock = DistributedLock(identity) + else: + msg = ( + "The configured dask array scheduler type is " + f'"{scheduler_type}", ' + "which is not supported by the Iris netcdf saver." + ) + raise ValueError(msg) + + # NOTE: not supporting 'processes' scheduler, for now. + return lock From 99b4f41d89ca8ca39eeb9343893aed1bbd6d93e5 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 10 Mar 2023 16:06:16 +0000 Subject: [PATCH 12/85] Minor fix for unit-tests. --- lib/iris/tests/unit/fileformats/netcdf/test_Saver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/iris/tests/unit/fileformats/netcdf/test_Saver.py b/lib/iris/tests/unit/fileformats/netcdf/test_Saver.py index 93a1537ea4..c190598786 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/test_Saver.py +++ b/lib/iris/tests/unit/fileformats/netcdf/test_Saver.py @@ -662,7 +662,7 @@ def assertAttribute(self, value): def check_attribute_compliance_call(self, value): self.set_attribute(value) - with Saver(mock.Mock(), "NETCDF4") as saver: + with Saver("nonexistent test file", "NETCDF4") as saver: saver.check_attribute_compliance(self.container, self.data_dtype) From 5d0a7074eb4727fe4665e0356af7c1688e9df9d3 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 10 Mar 2023 16:51:08 +0000 Subject: [PATCH 13/85] Pin libnetcdf to avoid problems -- see #5187. --- requirements/ci/nox.lock/py310-linux-64.lock | 40 +++++++++----------- requirements/ci/nox.lock/py38-linux-64.lock | 40 +++++++++----------- requirements/ci/nox.lock/py39-linux-64.lock | 40 +++++++++----------- requirements/ci/py310.yml | 1 + requirements/ci/py38.yml | 1 + requirements/ci/py39.yml | 1 + 6 files changed, 57 insertions(+), 66 deletions(-) diff --git a/requirements/ci/nox.lock/py310-linux-64.lock b/requirements/ci/nox.lock/py310-linux-64.lock index 6a334b811c..44fcdf9ef7 100644 --- a/requirements/ci/nox.lock/py310-linux-64.lock +++ b/requirements/ci/nox.lock/py310-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: f8af5f4aafcb766f463a1a897d3dab9e04f05f1494bced5931d78175ca0c66df +# input_hash: 0b6d997f538d5034e24f437684b5b13033d24ccac42358eb59c1693405b3e11c @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-2022.12.7-ha878542_0.conda#ff9f73d45c4a07d6f424495288a26080 @@ -11,7 +11,6 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-hab24e00_0.ta https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-12.2.0-h337968e_19.tar.bz2#164b4b1acaedc47ee7e658ae6b308ca3 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-12.2.0-h46fd767_19.tar.bz2#1030b1f38c129f2634eae026f704fe60 -https://conda.anaconda.org/conda-forge/linux-64/mpi-1.0-mpich.tar.bz2#c1fcff3417b5a22bbc4cf6e8c23648cf https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-3_cp310.conda#4eb33d14d794b0f4be116443ffed3853 https://conda.anaconda.org/conda-forge/noarch/tzdata-2022g-h191b570_0.conda#51fc4fcfb19f5d95ffc8c339db5068e8 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 @@ -56,7 +55,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.2.4-h166bdaf_0.ta https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h166bdaf_4.tar.bz2#f3f9de449d32ca9b9c66a22863c96f41 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.31.2-hcb278e6_0.conda#08efb1e1813f1a151b7a945b972a049b -https://conda.anaconda.org/conda-forge/linux-64/mpich-4.0.3-h846660c_100.tar.bz2#50d66bb751cfa71ee2a48b2d3eb90ac1 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.3-h27087fc_1.tar.bz2#4acfc691e64342b9dae57cf2adc63238 https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.0.8-h0b41bf4_0.conda#e043403cd18faf815bf7705ab6c1e092 @@ -137,7 +135,7 @@ https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.0-pyhd8ed1ab_0. https://conda.anaconda.org/conda-forge/noarch/execnet-1.9.0-pyhd8ed1ab_0.tar.bz2#0e521f7a5e60d508b121d38b04874fb2 https://conda.anaconda.org/conda-forge/noarch/filelock-3.9.0-pyhd8ed1ab_0.conda#1addc115923d646ca19ed90edc413506 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d -https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.1.0-pyhd8ed1ab_0.conda#44f6828b8f7cc3433d68d1d1c0e9add2 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.3.0-pyhd8ed1ab_1.conda#0db48a2f5a68e28e5af8d3df276f2255 https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h05c8ddd_0.conda#1a109126a43003d65b39c1cad656bc9b https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.74.1-h6239696_1.tar.bz2#5f442e6bc9d89ba236eb25a25c5c2815 https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h64030ff_2.tar.bz2#112eb9b5b93f0c02e59aea4fd1967363 @@ -146,7 +144,7 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b 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.4-py310hbf28c38_1.tar.bz2#ad5647e517ba68e2868ef2e6e6ff7723 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.14-hfd0df8a_1.conda#c2566c2ea5f153ddd6bf4acaf7547d97 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-hfd0df8a_0.conda#aa8840cdf17ef0c6084d1e24abc7a28b https://conda.anaconda.org/conda-forge/linux-64/libclang13-15.0.7-default_h3e3d535_1.conda#a3a0f7a6f0885f5e1e0ec691566afb77 https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h36d4200_3.conda#c9f4416a34bc91e0eb029f912c68f81f https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.88.1-hdc1c0ab_0.conda#81eaeb3b35163c8e90e57532bc93754d @@ -155,7 +153,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-252-h2a991cd_0.tar.b https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.2.4-h1daa5a0_1.conda#77003f63d1763c1e6569a02c1742c9f4 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.2-py310h1fa729e_0.conda#a1f0db6709778b77b5903541eeac4032 -https://conda.anaconda.org/conda-forge/linux-64/mpi4py-3.1.4-py310h37cc914_0.tar.bz2#98d598d9178d7f3091212c61c0be693c https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.24.2-py310h8deb116_0.conda#b7085457309e206174b8e234d90a7605 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea @@ -170,7 +167,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py310h1fa729e_0.conda#8d155ac95b1dfe585bcb6bec6a91c73b https://conda.anaconda.org/conda-forge/noarch/pytz-2022.7.1-pyhd8ed1ab_0.conda#f59d49a7b464901cf714b9e7984d01a2 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py310h5764c6d_5.tar.bz2#9e68d2ff6d98737c855b65f48dd3c597 -https://conda.anaconda.org/conda-forge/noarch/setuptools-67.4.0-pyhd8ed1ab_0.conda#c6f4b87020c72e2700e3e94c1fc93b70 +https://conda.anaconda.org/conda-forge/noarch/setuptools-67.6.0-pyhd8ed1ab_0.conda#e18ed61c37145bb9b48d1d98801960f7 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/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2#146f4541d643d48fc8a75cacf69f03ae @@ -199,9 +196,9 @@ https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py310hde88566_1.tar https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.7-py310hdf3cbec_0.conda#7bf9d8c765b6b04882c719509652c6d6 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.2.1-py310h1fa729e_0.conda#42814f7e7ce2e3e7d048c4efea481759 https://conda.anaconda.org/conda-forge/linux-64/curl-7.88.1-hdc1c0ab_0.conda#1968e4fef727858ac04746560e820928 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.38.0-py310h5764c6d_1.tar.bz2#12ebe92a8a578bc903bd844744f4d040 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.39.0-py310h1fa729e_0.conda#c8a9099d7b381fa9860d4c68bbd7e7a3 https://conda.anaconda.org/conda-forge/linux-64/glib-2.74.1-h6239696_1.tar.bz2#f3220a9e9d3abcbfca43419a219df7e4 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-mpi_mpich_h5d83325_1.conda#811c4d55cf17b42336ffa314239717b0 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h4df4325_101.conda#162a25904af6586b234b2dd52ee99c61 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.0.0-pyha770c72_0.conda#691644becbcdca9f73243450b1c63e62 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 https://conda.anaconda.org/conda-forge/linux-64/libclang-15.0.7-default_had23c3d_1.conda#36c65ed73b7c92589bd9562ef8a6023d @@ -227,10 +224,10 @@ https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py310h5764c6d_100 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.1.1-py310hde88566_2.tar.bz2#7433944046deda7775c5b1f7e0b6fe18 https://conda.anaconda.org/conda-forge/linux-64/cryptography-39.0.2-py310h34c0648_0.conda#99dc5a02a8b16cd88ca9a12354496e78 https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.3.0-pyhd8ed1ab_0.conda#34437340f37faafad7a6287d3b624f60 -https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.22.0-h25f0c4b_0.conda#d764367398de61c0d5531dd912e6cc96 +https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.22.0-h25f0c4b_2.conda#461541cb1b387c2a28ab6217f3d38502 https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-6.0.0-h8e241bc_0.conda#448fe40d2fed88ccf4d9ded37cbb2b38 -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.1-mpi_mpich_hf10a581_1.conda#1d235cbeed74dc63e22e41779838bec1 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.0-py310he60537e_0.conda#83a21bbd1c6fbeb339ba914fb5e5c02d +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.1-nompi_h261ec11_106.tar.bz2#9b25de670ce5753a33c18b1090d1d3bf +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py310he60537e_0.conda#68b2dd34c69d08b05a9db5e3596fe3ee https://conda.anaconda.org/conda-forge/linux-64/pandas-1.5.3-py310h9b08913_0.conda#467244b0dbb7da40927ac6ee0e9491de https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.1.0-pyhd8ed1ab_0.conda#0b8fbdfd52918bc2f1b76feccd95c919 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.4.1-py310h15e2413_1.conda#5be35366687def87437d210fd673100c @@ -240,32 +237,31 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.2.0-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-7.1.0-pyhd8ed1ab_0.conda#6613dbb3b25cc648a107f33ca9f80fc1 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-napoleon-0.7-py_0.tar.bz2#0bc25ff6f2e34af63ded59692df5f749 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310hbf28c38_3.tar.bz2#703ff1ac7d1b27fb5944b8052b5d1edb -https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.22.0-h4243ec0_0.conda#81c20b15d2281a1ea48eac5b4eee8cfa -https://conda.anaconda.org/conda-forge/noarch/identify-2.5.18-pyhd8ed1ab_0.conda#e07a5691c27e65d8d3d9278c578c7771 +https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.22.0-h4243ec0_2.conda#0d0c6604c8ac4ad5e51efa7bb58da05c +https://conda.anaconda.org/conda-forge/noarch/identify-2.5.19-pyhd8ed1ab_0.conda#4d66c7eacd0d9be4fd00ce591854eba4 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/netcdf-fortran-4.6.0-mpi_mpich_ha3603da_3.conda#ea38e2d3c472876ff4bf6551c17a9a1a -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.2-nompi_py310h0feb132_101.conda#acac875fc7bd759386277c6bca56b064 +https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.0-nompi_he1eeb6f_102.conda#d9679b28fcc2154fa63e814c5acdce57 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.2-nompi_py310h55e1e36_100.tar.bz2#4dd7aa28fb7d9a6de061c9579a30e7dd https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-hd33c08f_0.conda#a8b9e35dd7be2c945b0de4fe19a7c3a9 -https://conda.anaconda.org/conda-forge/linux-64/parallelio-2.5.10-mpi_mpich_h773ea27_101.conda#0793f7cf646b9bf66d83d93394474083 https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.0.0-pyhd8ed1ab_0.conda#d41957700e83bbb925928764cb7f8878 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.20.0-pyhd8ed1ab_0.conda#a4c92707c28aafc95208c747db80fd3f -https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.0-mpi_mpich_h7b33e6e_105.conda#14f813a98a4158556c50084bf8e46a78 +https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.0-nompi_hdb2cfa9_4.conda#3e2e1d0cd06d1b64c9c2800c0eb0cde6 https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h90689f9_2.tar.bz2#957a0255ab58aaf394a91725d73ab422 https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.54.4-h7abd40a_0.tar.bz2#921e53675ed5ea352f022b79abab076a https://conda.anaconda.org/conda-forge/linux-64/pre-commit-3.1.1-py310hff52083_0.conda#759bfcb929decd0dfa0489070c9cc992 https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-h5d23da1_6.conda#59c73debd9405771690ddbbad6c57b69 https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.14-pyhd8ed1ab_0.conda#01f33ad2e0aaf6b5ba4add50dad5ad29 -https://conda.anaconda.org/conda-forge/linux-64/esmpy-8.4.0-mpi_mpich_py310h515c5ea_102.conda#bf8276009073388b7159736877eccd79 +https://conda.anaconda.org/conda-forge/linux-64/esmpy-8.4.0-nompi_py310h4c636dd_2.conda#00383e95a1a8d1d5b21af8535cd2ac43 https://conda.anaconda.org/conda-forge/linux-64/graphviz-7.1.0-h2e5815a_0.conda#e7ecda996c443142a0e9c379f3b28e48 https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.7-py310hab646b1_3.conda#d049da3204bf5ecb54a852b622f2d7d2 https://conda.anaconda.org/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_0.conda#11d178fc55199482ee48d6812ea83983 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.7.0-py310hff52083_0.conda#215e2a4504900bef6d68f520c12ef800 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.7.1-py310hff52083_0.conda#c2b60c44d38d32779006a15c2581f0d1 https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyhd8ed1ab_0.conda#eb2e0fc33ad0d04b51f9280360c13c1e https://conda.anaconda.org/conda-forge/noarch/sphinx-4.5.0-pyh6c4a22f_0.tar.bz2#46b38d88c4270ff9ba78a89c83c66345 -https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.13.0-pyhd8ed1ab_0.conda#d9916a8dd3f0ee9c795109ee76c5dee6 +https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.13.1-pyhd8ed1ab_0.conda#258f38b9f3bfb323cf175b94d4a03c09 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.10.1-py310h8deb116_0.conda#4c9604c5ec179c21f8f0a09e3c164480 https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.0-pyhd8ed1ab_0.tar.bz2#4c969cdd5191306c269490f7ff236d9c -https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.11.1-pyhd8ed1ab_0.tar.bz2#729254314a5d178eefca50acbc2687b8 +https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.12.1-pyhd8ed1ab_0.conda#eddaf7a5abfc8569e05e7bee9546f4d9 https://conda.anaconda.org/conda-forge/noarch/sphinx-panels-0.6.0-pyhd8ed1ab_0.tar.bz2#6eec6480601f5d15babf9c3b3987f34a https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py310hcb7e713_0.conda#bd14eaad9bbf54b78e48ecb8b644fcf6 https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a diff --git a/requirements/ci/nox.lock/py38-linux-64.lock b/requirements/ci/nox.lock/py38-linux-64.lock index b52f0f8d44..ee799c6380 100644 --- a/requirements/ci/nox.lock/py38-linux-64.lock +++ b/requirements/ci/nox.lock/py38-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: fb647c05bdf2998763af9a184ece4f66796aff1cff2ae207f504c94e6062acaf +# input_hash: 21e771ba2d61d1c6a98771d9f80bf0154b80caac73a660590d70f7f8eb22edc9 @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-2022.12.7-ha878542_0.conda#ff9f73d45c4a07d6f424495288a26080 @@ -11,7 +11,6 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-hab24e00_0.ta https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-12.2.0-h337968e_19.tar.bz2#164b4b1acaedc47ee7e658ae6b308ca3 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-12.2.0-h46fd767_19.tar.bz2#1030b1f38c129f2634eae026f704fe60 -https://conda.anaconda.org/conda-forge/linux-64/mpi-1.0-mpich.tar.bz2#c1fcff3417b5a22bbc4cf6e8c23648cf https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.8-3_cp38.conda#2f3f7af062b42d664117662612022204 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-12.2.0-h69a702a_19.tar.bz2#cd7a806282c16e1f2d39a7e80d3a3e0d @@ -55,7 +54,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.2.4-h166bdaf_0.ta https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h166bdaf_4.tar.bz2#f3f9de449d32ca9b9c66a22863c96f41 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.31.2-hcb278e6_0.conda#08efb1e1813f1a151b7a945b972a049b -https://conda.anaconda.org/conda-forge/linux-64/mpich-4.0.3-h846660c_100.tar.bz2#50d66bb751cfa71ee2a48b2d3eb90ac1 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.3-h27087fc_1.tar.bz2#4acfc691e64342b9dae57cf2adc63238 https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.0.8-h0b41bf4_0.conda#e043403cd18faf815bf7705ab6c1e092 @@ -136,7 +134,7 @@ https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.0-pyhd8ed1ab_0. https://conda.anaconda.org/conda-forge/noarch/execnet-1.9.0-pyhd8ed1ab_0.tar.bz2#0e521f7a5e60d508b121d38b04874fb2 https://conda.anaconda.org/conda-forge/noarch/filelock-3.9.0-pyhd8ed1ab_0.conda#1addc115923d646ca19ed90edc413506 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d -https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.1.0-pyhd8ed1ab_0.conda#44f6828b8f7cc3433d68d1d1c0e9add2 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.3.0-pyhd8ed1ab_1.conda#0db48a2f5a68e28e5af8d3df276f2255 https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h05c8ddd_0.conda#1a109126a43003d65b39c1cad656bc9b https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.74.1-h6239696_1.tar.bz2#5f442e6bc9d89ba236eb25a25c5c2815 https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h64030ff_2.tar.bz2#112eb9b5b93f0c02e59aea4fd1967363 @@ -145,7 +143,7 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b 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.4-py38h43d8883_1.tar.bz2#41ca56d5cac7bfc7eb4fcdbee878eb84 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.14-hfd0df8a_1.conda#c2566c2ea5f153ddd6bf4acaf7547d97 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-hfd0df8a_0.conda#aa8840cdf17ef0c6084d1e24abc7a28b https://conda.anaconda.org/conda-forge/linux-64/libclang13-15.0.7-default_h3e3d535_1.conda#a3a0f7a6f0885f5e1e0ec691566afb77 https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h36d4200_3.conda#c9f4416a34bc91e0eb029f912c68f81f https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.88.1-hdc1c0ab_0.conda#81eaeb3b35163c8e90e57532bc93754d @@ -154,7 +152,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-252-h2a991cd_0.tar.b https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.2.4-h1daa5a0_1.conda#77003f63d1763c1e6569a02c1742c9f4 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.2-py38h1de0b5d_0.conda#6d97b5d6f06933ab653f1862ddf6e33e -https://conda.anaconda.org/conda-forge/linux-64/mpi4py-3.1.4-py38h97ac3a3_0.tar.bz2#0c469687a517052c0d581fc6e1a4189d https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.24.2-py38h10c12cc_0.conda#05592c85b9f6931dc2df1e80c0d56294 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea @@ -169,7 +166,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py38h1de0b5d_0.conda#7db73572d4f7e10a759bad609a228ad0 https://conda.anaconda.org/conda-forge/noarch/pytz-2022.7.1-pyhd8ed1ab_0.conda#f59d49a7b464901cf714b9e7984d01a2 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py38h0a891b7_5.tar.bz2#0856c59f9ddb710c640dc0428d66b1b7 -https://conda.anaconda.org/conda-forge/noarch/setuptools-67.4.0-pyhd8ed1ab_0.conda#c6f4b87020c72e2700e3e94c1fc93b70 +https://conda.anaconda.org/conda-forge/noarch/setuptools-67.6.0-pyhd8ed1ab_0.conda#e18ed61c37145bb9b48d1d98801960f7 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/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2#146f4541d643d48fc8a75cacf69f03ae @@ -197,9 +194,9 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py38h4a40e3a_3.conda https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py38h26c90d9_1.tar.bz2#dcc025a7bb54374979c500c2e161fac9 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.7-py38hfbd4bf9_0.conda#638537863b298151635c05c762a997ab https://conda.anaconda.org/conda-forge/linux-64/curl-7.88.1-hdc1c0ab_0.conda#1968e4fef727858ac04746560e820928 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.38.0-py38h0a891b7_1.tar.bz2#62c89ddefed9c5835e228a32b357a28d +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.39.0-py38h1de0b5d_0.conda#aac6f6ca6b8c5d321392f5f7aa3d3186 https://conda.anaconda.org/conda-forge/linux-64/glib-2.74.1-h6239696_1.tar.bz2#f3220a9e9d3abcbfca43419a219df7e4 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-mpi_mpich_h5d83325_1.conda#811c4d55cf17b42336ffa314239717b0 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h4df4325_101.conda#162a25904af6586b234b2dd52ee99c61 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.0.0-pyha770c72_0.conda#691644becbcdca9f73243450b1c63e62 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.12.0-pyhd8ed1ab_0.conda#e5fd2260a231ee63b6969f4801082f2b https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 @@ -226,10 +223,10 @@ https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py38h0a891b7_1005 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.1.1-py38h26c90d9_2.tar.bz2#0ea017e84efe45badce6c32f274dbf8e https://conda.anaconda.org/conda-forge/linux-64/cryptography-39.0.2-py38h3d167d9_0.conda#6c60377f8bfa325a2cd80d603627a613 https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.3.0-pyhd8ed1ab_0.conda#34437340f37faafad7a6287d3b624f60 -https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.22.0-h25f0c4b_0.conda#d764367398de61c0d5531dd912e6cc96 +https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.22.0-h25f0c4b_2.conda#461541cb1b387c2a28ab6217f3d38502 https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-6.0.0-h8e241bc_0.conda#448fe40d2fed88ccf4d9ded37cbb2b38 https://conda.anaconda.org/conda-forge/noarch/importlib-resources-5.12.0-pyhd8ed1ab_0.conda#3544c818f0720c89eb16ae6940ab440b -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.1-mpi_mpich_hf10a581_1.conda#1d235cbeed74dc63e22e41779838bec1 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.1-nompi_h261ec11_106.tar.bz2#9b25de670ce5753a33c18b1090d1d3bf https://conda.anaconda.org/conda-forge/linux-64/pandas-1.5.3-py38hdc8b05c_0.conda#5073966d63a54434d2a2fc41d325b072 https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.1.0-pyhd8ed1ab_0.conda#0b8fbdfd52918bc2f1b76feccd95c919 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.4.1-py38h58d5fe2_1.conda#5286eaec7e93586e4ae05e7d658cd3e2 @@ -238,33 +235,32 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.2.0-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-7.1.0-pyhd8ed1ab_0.conda#6613dbb3b25cc648a107f33ca9f80fc1 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-napoleon-0.7-py_0.tar.bz2#0bc25ff6f2e34af63ded59692df5f749 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py38h43d8883_3.tar.bz2#82b3797d08a43a101b645becbb938e65 -https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.22.0-h4243ec0_0.conda#81c20b15d2281a1ea48eac5b4eee8cfa -https://conda.anaconda.org/conda-forge/noarch/identify-2.5.18-pyhd8ed1ab_0.conda#e07a5691c27e65d8d3d9278c578c7771 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.0-py38hd6c3c57_0.conda#dd63f6486ba95c036b6bfe0b5c53d875 -https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.0-mpi_mpich_ha3603da_3.conda#ea38e2d3c472876ff4bf6551c17a9a1a -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.2-nompi_py38h08fe49f_101.conda#d2f666fab1d9a1948928756ca8ac1824 +https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.22.0-h4243ec0_2.conda#0d0c6604c8ac4ad5e51efa7bb58da05c +https://conda.anaconda.org/conda-forge/noarch/identify-2.5.19-pyhd8ed1ab_0.conda#4d66c7eacd0d9be4fd00ce591854eba4 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py38hd6c3c57_0.conda#3b8ba76acae09fbd4b2247c4ee4c0324 +https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.0-nompi_he1eeb6f_102.conda#d9679b28fcc2154fa63e814c5acdce57 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.2-nompi_py38h2250339_100.tar.bz2#dd97e93b1f64f1cc58879d53c23ec93f https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-hd33c08f_0.conda#a8b9e35dd7be2c945b0de4fe19a7c3a9 -https://conda.anaconda.org/conda-forge/linux-64/parallelio-2.5.10-mpi_mpich_h773ea27_101.conda#0793f7cf646b9bf66d83d93394474083 https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.0.0-pyhd8ed1ab_0.conda#d41957700e83bbb925928764cb7f8878 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.20.0-pyhd8ed1ab_0.conda#a4c92707c28aafc95208c747db80fd3f -https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.0-mpi_mpich_h7b33e6e_105.conda#14f813a98a4158556c50084bf8e46a78 +https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.0-nompi_hdb2cfa9_4.conda#3e2e1d0cd06d1b64c9c2800c0eb0cde6 https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h90689f9_2.tar.bz2#957a0255ab58aaf394a91725d73ab422 https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.54.4-h7abd40a_0.tar.bz2#921e53675ed5ea352f022b79abab076a 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/pre-commit-3.1.1-py38h578d9bd_0.conda#df03025924528b963abdf907258b6852 https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-h5d23da1_6.conda#59c73debd9405771690ddbbad6c57b69 https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.14-pyhd8ed1ab_0.conda#01f33ad2e0aaf6b5ba4add50dad5ad29 -https://conda.anaconda.org/conda-forge/linux-64/esmpy-8.4.0-mpi_mpich_py38h4407c66_102.conda#9a5c841acef11d7e4f0bf98cbc6308b3 +https://conda.anaconda.org/conda-forge/linux-64/esmpy-8.4.0-nompi_py38h2b78397_2.conda#03c291af8938218972bfba0b0618d3e9 https://conda.anaconda.org/conda-forge/linux-64/graphviz-7.1.0-h2e5815a_0.conda#e7ecda996c443142a0e9c379f3b28e48 https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.7-py38ha0d8c90_3.conda#e965dc172d67920d058ac2b3a0e27565 https://conda.anaconda.org/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_0.conda#11d178fc55199482ee48d6812ea83983 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.7.0-py38h578d9bd_0.conda#7fb6ab52eb5de5023445561d86dbd602 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.7.1-py38h578d9bd_0.conda#50ff9e0a3dd459a0ca365741072bf9a2 https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyhd8ed1ab_0.conda#eb2e0fc33ad0d04b51f9280360c13c1e https://conda.anaconda.org/conda-forge/noarch/sphinx-4.5.0-pyh6c4a22f_0.tar.bz2#46b38d88c4270ff9ba78a89c83c66345 -https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.13.0-pyhd8ed1ab_0.conda#d9916a8dd3f0ee9c795109ee76c5dee6 +https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.13.1-pyhd8ed1ab_0.conda#258f38b9f3bfb323cf175b94d4a03c09 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.10.1-py38h10c12cc_0.conda#1cbc47bb9a600ce4a49d8da797d375bf https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.0-pyhd8ed1ab_0.tar.bz2#4c969cdd5191306c269490f7ff236d9c -https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.11.1-pyhd8ed1ab_0.tar.bz2#729254314a5d178eefca50acbc2687b8 +https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.12.1-pyhd8ed1ab_0.conda#eddaf7a5abfc8569e05e7bee9546f4d9 https://conda.anaconda.org/conda-forge/noarch/sphinx-panels-0.6.0-pyhd8ed1ab_0.tar.bz2#6eec6480601f5d15babf9c3b3987f34a https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py38h3d2c718_0.conda#55ba6e3a49c4293302262286a49607d8 https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a diff --git a/requirements/ci/nox.lock/py39-linux-64.lock b/requirements/ci/nox.lock/py39-linux-64.lock index 4d7ce0a576..dc240f526d 100644 --- a/requirements/ci/nox.lock/py39-linux-64.lock +++ b/requirements/ci/nox.lock/py39-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 23dff964b0b7254aa6b68bd471a7276f62e9eaa86280f550ef4f34a2022201e0 +# input_hash: 976d206fc14c465db12cef28441162ad1d60d04b3a09aa7a2c48dffe68b4d1d8 @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-2022.12.7-ha878542_0.conda#ff9f73d45c4a07d6f424495288a26080 @@ -11,7 +11,6 @@ https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-hab24e00_0.ta https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-12.2.0-h337968e_19.tar.bz2#164b4b1acaedc47ee7e658ae6b308ca3 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-12.2.0-h46fd767_19.tar.bz2#1030b1f38c129f2634eae026f704fe60 -https://conda.anaconda.org/conda-forge/linux-64/mpi-1.0-mpich.tar.bz2#c1fcff3417b5a22bbc4cf6e8c23648cf https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-3_cp39.conda#0dd193187d54e585cac7eab942a8847e https://conda.anaconda.org/conda-forge/noarch/tzdata-2022g-h191b570_0.conda#51fc4fcfb19f5d95ffc8c339db5068e8 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 @@ -56,7 +55,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.2.4-h166bdaf_0.ta https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h166bdaf_4.tar.bz2#f3f9de449d32ca9b9c66a22863c96f41 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.31.2-hcb278e6_0.conda#08efb1e1813f1a151b7a945b972a049b -https://conda.anaconda.org/conda-forge/linux-64/mpich-4.0.3-h846660c_100.tar.bz2#50d66bb751cfa71ee2a48b2d3eb90ac1 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.3-h27087fc_1.tar.bz2#4acfc691e64342b9dae57cf2adc63238 https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.0.8-h0b41bf4_0.conda#e043403cd18faf815bf7705ab6c1e092 @@ -137,7 +135,7 @@ https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.0-pyhd8ed1ab_0. https://conda.anaconda.org/conda-forge/noarch/execnet-1.9.0-pyhd8ed1ab_0.tar.bz2#0e521f7a5e60d508b121d38b04874fb2 https://conda.anaconda.org/conda-forge/noarch/filelock-3.9.0-pyhd8ed1ab_0.conda#1addc115923d646ca19ed90edc413506 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d -https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.1.0-pyhd8ed1ab_0.conda#44f6828b8f7cc3433d68d1d1c0e9add2 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.3.0-pyhd8ed1ab_1.conda#0db48a2f5a68e28e5af8d3df276f2255 https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h05c8ddd_0.conda#1a109126a43003d65b39c1cad656bc9b https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.74.1-h6239696_1.tar.bz2#5f442e6bc9d89ba236eb25a25c5c2815 https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h64030ff_2.tar.bz2#112eb9b5b93f0c02e59aea4fd1967363 @@ -146,7 +144,7 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b 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.4-py39hf939315_1.tar.bz2#41679a052a8ce841c74df1ebc802e411 -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.14-hfd0df8a_1.conda#c2566c2ea5f153ddd6bf4acaf7547d97 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-hfd0df8a_0.conda#aa8840cdf17ef0c6084d1e24abc7a28b https://conda.anaconda.org/conda-forge/linux-64/libclang13-15.0.7-default_h3e3d535_1.conda#a3a0f7a6f0885f5e1e0ec691566afb77 https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h36d4200_3.conda#c9f4416a34bc91e0eb029f912c68f81f https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.88.1-hdc1c0ab_0.conda#81eaeb3b35163c8e90e57532bc93754d @@ -155,7 +153,6 @@ https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-252-h2a991cd_0.tar.b https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.2.4-h1daa5a0_1.conda#77003f63d1763c1e6569a02c1742c9f4 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.2-py39h72bdee0_0.conda#35514f5320206df9f4661c138c02e1c1 -https://conda.anaconda.org/conda-forge/linux-64/mpi4py-3.1.4-py39h32b9844_0.tar.bz2#b035b507f55bb6a967d86d4b7e059437 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.24.2-py39h7360e5f_0.conda#757070dc7cc33003254888808cd34f1e https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea @@ -170,7 +167,7 @@ https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py39h72bdee0_0.conda#18927f971926b7271600368de71de557 https://conda.anaconda.org/conda-forge/noarch/pytz-2022.7.1-pyhd8ed1ab_0.conda#f59d49a7b464901cf714b9e7984d01a2 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py39hb9d737c_5.tar.bz2#ef9db3c38ae7275f6b14491cfe61a248 -https://conda.anaconda.org/conda-forge/noarch/setuptools-67.4.0-pyhd8ed1ab_0.conda#c6f4b87020c72e2700e3e94c1fc93b70 +https://conda.anaconda.org/conda-forge/noarch/setuptools-67.6.0-pyhd8ed1ab_0.conda#e18ed61c37145bb9b48d1d98801960f7 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/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2#146f4541d643d48fc8a75cacf69f03ae @@ -198,9 +195,9 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py39he91dace_3.conda https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py39h2ae25f5_1.tar.bz2#c943fb9a2818ecc5be1e0ecc8b7738f1 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.7-py39h4b4f3f3_0.conda#c5387f3fb1f5b8b71e1c865fc55f4951 https://conda.anaconda.org/conda-forge/linux-64/curl-7.88.1-hdc1c0ab_0.conda#1968e4fef727858ac04746560e820928 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.38.0-py39hb9d737c_1.tar.bz2#3f2d104f2fefdd5e8a205dd3aacbf1d7 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.39.0-py39h72bdee0_0.conda#7ed17a60087175112fbbf5882bebddc2 https://conda.anaconda.org/conda-forge/linux-64/glib-2.74.1-h6239696_1.tar.bz2#f3220a9e9d3abcbfca43419a219df7e4 -https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-mpi_mpich_h5d83325_1.conda#811c4d55cf17b42336ffa314239717b0 +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h4df4325_101.conda#162a25904af6586b234b2dd52ee99c61 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.0.0-pyha770c72_0.conda#691644becbcdca9f73243450b1c63e62 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.12.0-pyhd8ed1ab_0.conda#e5fd2260a231ee63b6969f4801082f2b https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 @@ -227,10 +224,10 @@ https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py39hb9d737c_1005 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.1.1-py39h2ae25f5_2.tar.bz2#b3b4aab96d1c4ed394d6f4b9146699d4 https://conda.anaconda.org/conda-forge/linux-64/cryptography-39.0.2-py39h079d5ae_0.conda#c492b565817a019f025c7d17b57ef479 https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.3.0-pyhd8ed1ab_0.conda#34437340f37faafad7a6287d3b624f60 -https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.22.0-h25f0c4b_0.conda#d764367398de61c0d5531dd912e6cc96 +https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.22.0-h25f0c4b_2.conda#461541cb1b387c2a28ab6217f3d38502 https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-6.0.0-h8e241bc_0.conda#448fe40d2fed88ccf4d9ded37cbb2b38 https://conda.anaconda.org/conda-forge/noarch/importlib-resources-5.12.0-pyhd8ed1ab_0.conda#3544c818f0720c89eb16ae6940ab440b -https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.1-mpi_mpich_hf10a581_1.conda#1d235cbeed74dc63e22e41779838bec1 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.1-nompi_h261ec11_106.tar.bz2#9b25de670ce5753a33c18b1090d1d3bf https://conda.anaconda.org/conda-forge/linux-64/pandas-1.5.3-py39h2ad29b5_0.conda#3ea96adbbc2a66fa45178102a9cfbecc https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.1.0-pyhd8ed1ab_0.conda#0b8fbdfd52918bc2f1b76feccd95c919 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.4.1-py39hf14cbfd_1.conda#67766c515601b3ee1514072d6fd060bb @@ -239,33 +236,32 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.2.0-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-7.1.0-pyhd8ed1ab_0.conda#6613dbb3b25cc648a107f33ca9f80fc1 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-napoleon-0.7-py_0.tar.bz2#0bc25ff6f2e34af63ded59692df5f749 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py39hf939315_3.tar.bz2#0f11bcdf9669a5ae0f39efd8c830209a -https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.22.0-h4243ec0_0.conda#81c20b15d2281a1ea48eac5b4eee8cfa -https://conda.anaconda.org/conda-forge/noarch/identify-2.5.18-pyhd8ed1ab_0.conda#e07a5691c27e65d8d3d9278c578c7771 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.0-py39he190548_0.conda#62d6ddd9e534f4d325d12470cc4961ab -https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.0-mpi_mpich_ha3603da_3.conda#ea38e2d3c472876ff4bf6551c17a9a1a -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.2-nompi_py39h8b3a7bc_101.conda#16e186c6b8e60ffa3ed58e0c78ea1b9e +https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.22.0-h4243ec0_2.conda#0d0c6604c8ac4ad5e51efa7bb58da05c +https://conda.anaconda.org/conda-forge/noarch/identify-2.5.19-pyhd8ed1ab_0.conda#4d66c7eacd0d9be4fd00ce591854eba4 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py39he190548_0.conda#f2a931db797bb58bd335f4a857b4c898 +https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.0-nompi_he1eeb6f_102.conda#d9679b28fcc2154fa63e814c5acdce57 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.2-nompi_py39hfaa66c4_100.tar.bz2#b5f2db23900499e96f88e39199ffc7b8 https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-hd33c08f_0.conda#a8b9e35dd7be2c945b0de4fe19a7c3a9 -https://conda.anaconda.org/conda-forge/linux-64/parallelio-2.5.10-mpi_mpich_h773ea27_101.conda#0793f7cf646b9bf66d83d93394474083 https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.0.0-pyhd8ed1ab_0.conda#d41957700e83bbb925928764cb7f8878 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.20.0-pyhd8ed1ab_0.conda#a4c92707c28aafc95208c747db80fd3f -https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.0-mpi_mpich_h7b33e6e_105.conda#14f813a98a4158556c50084bf8e46a78 +https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.0-nompi_hdb2cfa9_4.conda#3e2e1d0cd06d1b64c9c2800c0eb0cde6 https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h90689f9_2.tar.bz2#957a0255ab58aaf394a91725d73ab422 https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.54.4-h7abd40a_0.tar.bz2#921e53675ed5ea352f022b79abab076a 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/pre-commit-3.1.1-py39hf3d152e_0.conda#17994a38cb9daeb1beecacec5885745c https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-h5d23da1_6.conda#59c73debd9405771690ddbbad6c57b69 https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.14-pyhd8ed1ab_0.conda#01f33ad2e0aaf6b5ba4add50dad5ad29 -https://conda.anaconda.org/conda-forge/linux-64/esmpy-8.4.0-mpi_mpich_py39h3088dd8_102.conda#a022e48c8b12bc56083bcce841978519 +https://conda.anaconda.org/conda-forge/linux-64/esmpy-8.4.0-nompi_py39h95eafd8_2.conda#f04f8970f741b2f78af7e5b7112d17d6 https://conda.anaconda.org/conda-forge/linux-64/graphviz-7.1.0-h2e5815a_0.conda#e7ecda996c443142a0e9c379f3b28e48 https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.7-py39h5c7b992_3.conda#19e30314fe824605750da905febb8ee6 https://conda.anaconda.org/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_0.conda#11d178fc55199482ee48d6812ea83983 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.7.0-py39hf3d152e_0.conda#0967228e228ebeded6a36a6f4d5509ed +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.7.1-py39hf3d152e_0.conda#682772fa385911fb5efffbce21b269c5 https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyhd8ed1ab_0.conda#eb2e0fc33ad0d04b51f9280360c13c1e https://conda.anaconda.org/conda-forge/noarch/sphinx-4.5.0-pyh6c4a22f_0.tar.bz2#46b38d88c4270ff9ba78a89c83c66345 -https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.13.0-pyhd8ed1ab_0.conda#d9916a8dd3f0ee9c795109ee76c5dee6 +https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.13.1-pyhd8ed1ab_0.conda#258f38b9f3bfb323cf175b94d4a03c09 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.10.1-py39h7360e5f_0.conda#7584d1bc5499d25eccfd24a7f656e3ee https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.0-pyhd8ed1ab_0.tar.bz2#4c969cdd5191306c269490f7ff236d9c -https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.11.1-pyhd8ed1ab_0.tar.bz2#729254314a5d178eefca50acbc2687b8 +https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.12.1-pyhd8ed1ab_0.conda#eddaf7a5abfc8569e05e7bee9546f4d9 https://conda.anaconda.org/conda-forge/noarch/sphinx-panels-0.6.0-pyhd8ed1ab_0.tar.bz2#6eec6480601f5d15babf9c3b3987f34a https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py39h6e7ad6e_0.conda#7cb72bd5b1e7c5a23a062db90889356b https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a diff --git a/requirements/ci/py310.yml b/requirements/ci/py310.yml index e3bada6596..836b673d43 100644 --- a/requirements/ci/py310.yml +++ b/requirements/ci/py310.yml @@ -17,6 +17,7 @@ dependencies: - dask-core >=2.26 - matplotlib >=3.5 - netcdf4 + - libnetcdf<4.9 - numpy >=1.19 - python-xxhash - pyproj diff --git a/requirements/ci/py38.yml b/requirements/ci/py38.yml index 9393060113..35c9b23c20 100644 --- a/requirements/ci/py38.yml +++ b/requirements/ci/py38.yml @@ -17,6 +17,7 @@ dependencies: - dask-core >=2.26 - matplotlib >=3.5 - netcdf4 + - libnetcdf<4.9 - numpy >=1.19 - python-xxhash - pyproj diff --git a/requirements/ci/py39.yml b/requirements/ci/py39.yml index 349784ec46..b64236cbc1 100644 --- a/requirements/ci/py39.yml +++ b/requirements/ci/py39.yml @@ -17,6 +17,7 @@ dependencies: - dask-core >=2.26 - matplotlib >=3.5 - netcdf4 + - libnetcdf<4.9 - numpy >=1.19 - python-xxhash - pyproj From 431036f566a96408c1c550b6c519f726fc88fe88 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 10 Mar 2023 17:19:09 +0000 Subject: [PATCH 14/85] Minor test fix. --- lib/iris/tests/unit/fileformats/netcdf/test_Saver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/iris/tests/unit/fileformats/netcdf/test_Saver.py b/lib/iris/tests/unit/fileformats/netcdf/test_Saver.py index c190598786..543fec7c01 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/test_Saver.py +++ b/lib/iris/tests/unit/fileformats/netcdf/test_Saver.py @@ -771,7 +771,7 @@ def test_valid_range_and_valid_min_valid_max_provided(self): self.container.attributes["valid_range"] = [1, 2] self.container.attributes["valid_min"] = [1] msg = 'Both "valid_range" and "valid_min"' - with Saver(mock.Mock(), "NETCDF4") as saver: + with Saver("nonexistent test file", "NETCDF4") as saver: with self.assertRaisesRegex(ValueError, msg): saver.check_attribute_compliance( self.container, self.data_dtype From dc368d96f00530503ccdc3cbb1dd4f55d4a114a8 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 13 Mar 2023 17:48:03 +0000 Subject: [PATCH 15/85] Move DeferredSaveWrapper into _thread_safe_nc; replicate the NetCDFDataProxy fix; use one lock per Saver; add extra up-scaled test --- .../fileformats/netcdf/_thread_safe_nc.py | 38 ++++++++++++++ lib/iris/fileformats/netcdf/saver.py | 50 ++++--------------- .../integration/netcdf/test_thread_safety.py | 15 ++++++ 3 files changed, 64 insertions(+), 39 deletions(-) diff --git a/lib/iris/fileformats/netcdf/_thread_safe_nc.py b/lib/iris/fileformats/netcdf/_thread_safe_nc.py index decca1535f..0307680afa 100644 --- a/lib/iris/fileformats/netcdf/_thread_safe_nc.py +++ b/lib/iris/fileformats/netcdf/_thread_safe_nc.py @@ -340,3 +340,41 @@ def __getstate__(self): def __setstate__(self, state): for key, value in state.items(): setattr(self, key, value) + + +class DeferredSaveWrapper: + """ + The "opposite" of a NetCDFDataProxy : An object mimicking the data access of a + netCDF4.Variable, but where the data is to be ***written to***. + + It encapsulates the netcdf file and variable which are actually to be written to. + This opens the file each time, to enable writing the data chunk, then closes it. + TODO: could be improved with a caching scheme, but this just about works. + """ + + def __init__(self, filepath, cf_var, file_write_lock): + self.path = filepath + self.varname = cf_var.name + self.lock = file_write_lock + + def __setitem__(self, keys, array_data): + # Write to the variable. + # First acquire a file-specific lock for all workers writing to this file. + self.lock.acquire() + # Open the file for writing + write to the specific file variable. + # Exactly as above, in NetCDFDataProxy : a DatasetWrapper causes problems with + # invalid ID's and the netCDF4 library, for so-far unknown reasons. + # Instead, use _GLOBAL_NETCDF4_LOCK, and netCDF4 _directly_. + with _GLOBAL_NETCDF4_LOCK: + dataset = None + try: + dataset = netCDF4.Dataset(self.path, "r+") + var = dataset.variables[self.varname] + var[keys] = array_data + finally: + if dataset: + dataset.close() + self.lock.release() + + def __repr__(self): + return f"<{self.__class__.__name__} path={self.path!r} var={self.varname!r}>" diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index c80a416375..e9502af21f 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -45,13 +45,12 @@ from iris.coords import AncillaryVariable, AuxCoord, CellMeasure, DimCoord import iris.exceptions import iris.fileformats.cf -from iris.fileformats.netcdf import _thread_safe_nc +from iris.fileformats.netcdf import _dask_locks, _thread_safe_nc import iris.io import iris.util # Get the logger : shared logger for all in 'iris.fileformats.netcdf'. from . import logger -from ._dask_locks import get_worker_lock # Avoid warning about unused import. # We could use an __all__, but we don't want to maintain one here @@ -498,38 +497,6 @@ def __setitem__(self, keys, arr): MESH_ELEMENTS = ("node", "edge", "face") -class DeferredSaveWrapper: - """ - An object which mimics the data access of a netCDF4.Variable, and can be written to. - It encapsulates the netcdf file and variable which are actually to be written to. - This opens the file each time, to enable writing the data chunk, then closes it. - TODO: could be improved with a caching scheme, but this just about works. - """ - - def __init__(self, filepath, cf_var): # , lockfile_path): - self.path = filepath - self.varname = cf_var.name - self.lock = get_worker_lock(self.path) - - def __setitem__(self, keys, array_data): - # Write to the variable. - # First acquire a file-specific lock for all workers writing to this file. - self.lock.acquire() - # Open the file for writing + write to the specific file variable. - dataset = None - try: - dataset = _thread_safe_nc.DatasetWrapper(self.path, "r+") - var = dataset.variables[self.varname] - var[keys] = array_data - finally: - if dataset: - dataset.close() - self.lock.release() - - def __repr__(self): - return f"<{self.__class__.__name__} path={self.path!r} var={self.varname!r}>" - - class Saver: """A manager for saving netcdf files.""" @@ -591,12 +558,15 @@ def __init__(self, filename, netcdf_format, compute=True): self._mesh_dims = {} #: A dictionary, mapping formula terms to owner cf variable name self._formula_terms_cache = {} + #: Target filepath + self.filepath = os.path.abspath(filename) #: Whether lazy saving. self.lazy_saves = not compute #: A list of deferred writes for lazy saving : each is a (source, target) pair self.deferred_writes = [] - #: Target filepath - self.filepath = os.path.abspath(filename) + # N.B. the file-write-lock *type* actually depends on the dask scheduler type. + #: A per-file write lock to prevent dask attempting overlapping writes. + self.file_write_lock = _dask_locks.get_worker_lock(self.filepath) #: NetCDF dataset self._dataset = None try: @@ -2509,8 +2479,10 @@ def _lazy_stream_data(self, data, fill_value, fill_warn, cf_var): def store(data, cf_var, fill_value): # Create a data-writeable object that we can stream into, which # encapsulates the file to be opened + variable to be written. - writeable_var_wrapper = DeferredSaveWrapper( - self.filepath, cf_var # , self._lockfile_path + writeable_var_wrapper = ( + _thread_safe_nc.DeferredSaveWrapper( + self.filepath, cf_var, self.file_write_lock + ) ) # Add to the list of deferred writes, used in _deferred_save(). self.deferred_writes.append((data, writeable_var_wrapper)) @@ -2903,7 +2875,7 @@ def is_valid_packspec(p): # process workers (only threaded). result = sman._deferred_save() if compute: - result.compute() + result = result.compute() result = None return result diff --git a/lib/iris/tests/integration/netcdf/test_thread_safety.py b/lib/iris/tests/integration/netcdf/test_thread_safety.py index 280e0f8418..5ed32d0671 100644 --- a/lib/iris/tests/integration/netcdf/test_thread_safety.py +++ b/lib/iris/tests/integration/netcdf/test_thread_safety.py @@ -98,6 +98,21 @@ def test_stream_multisource(get_cubes_from_netcdf, save_common): save_common(final_cube) # Any problems are expected here. +def test_stream_multisource__manychunks( + tiny_chunks, get_cubes_from_netcdf, save_common +): + """ + As above, but with many more small chunks. + + As this previously showed additional, sporadic problems which only emerge + (statistically) with larger numbers of chunks. + + """ + cubes = get_cubes_from_netcdf + final_cube = sum(cubes) + save_common(final_cube) # Any problems are expected here. + + def test_comparison(get_cubes_from_netcdf): """ Comparing multiple loaded files forces co-realisation. From 6756a46fba26648c52e8f58497b600d4144aff3b Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 16 Mar 2023 18:15:08 +0000 Subject: [PATCH 16/85] Update lib/iris/fileformats/netcdf/saver.py Co-authored-by: Bouwe Andela --- lib/iris/fileformats/netcdf/saver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index e9502af21f..a01660a377 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -517,7 +517,7 @@ def __init__(self, filename, netcdf_format, compute=True): If True, the Saver performs normal 'synchronous' data writes, where data is streamed directly into file variables during the save operation. If False, the file is created as normal, but computation and streaming of - any lazy array content is instead deferred to :class:`dask.delayed` objects, + any lazy array content is instead deferred to :class:`dask.delayed.Delayed` objects, which are held in a list in the saver 'delayed_writes' property. The relavant file variables are created empty, and the write can subsequently be completed by computing the 'save.deferred_writes'. From 80b4b6cd83d48919efc8c453e5c95ca4bccfbca1 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 16 Mar 2023 18:15:24 +0000 Subject: [PATCH 17/85] Update lib/iris/fileformats/netcdf/_dask_locks.py Co-authored-by: Bouwe Andela --- lib/iris/fileformats/netcdf/_dask_locks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/iris/fileformats/netcdf/_dask_locks.py b/lib/iris/fileformats/netcdf/_dask_locks.py index 665f33ccd4..352aba5a72 100644 --- a/lib/iris/fileformats/netcdf/_dask_locks.py +++ b/lib/iris/fileformats/netcdf/_dask_locks.py @@ -35,7 +35,7 @@ It is also *conceivable* that multiple processes could write to the same file in parallel, if the operating system supports it. However, this also requires that the libnetcdf C library is built with parallel access option, which is not common. -With the "ordinary" libnetcdf build, a process which attempts to rpen for writing a file +With the "ordinary" libnetcdf build, a process which attempts to open for writing a file which is _already_ open for writing simply raises an access error. In any case, Iris netcdf saver will not support this mode of operation, at present. From 78a8716fecc1d6a2367ab487216d1f1c4ebfe151 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 16 Mar 2023 18:15:48 +0000 Subject: [PATCH 18/85] Update lib/iris/fileformats/netcdf/saver.py Co-authored-by: Bouwe Andela --- lib/iris/fileformats/netcdf/saver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index a01660a377..c381914ec1 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -2718,7 +2718,7 @@ def save( * compute (bool): When False, create the output file but defer writing any lazy array content to its variables, such as (lazy) data and aux-coords points and bounds. - Instead return a class:`dask.delayed` which, when computed, will compute all + Instead return a class:`dask.delayed.Delayed` which, when computed, will compute all the lazy content and stream it to complete the file. Several such data saves can be performed in parallel, by passing a list of them into a :func:`dask.compute` call. From 47bb08b29bd7f32839e82d0e9cf09a875824922d Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 17 Mar 2023 10:29:30 +0000 Subject: [PATCH 19/85] Small rename + reformat. --- lib/iris/fileformats/netcdf/_dask_locks.py | 8 ++++---- lib/iris/fileformats/netcdf/_thread_safe_nc.py | 2 +- lib/iris/fileformats/netcdf/saver.py | 16 +++++++--------- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/lib/iris/fileformats/netcdf/_dask_locks.py b/lib/iris/fileformats/netcdf/_dask_locks.py index 352aba5a72..a857802010 100644 --- a/lib/iris/fileformats/netcdf/_dask_locks.py +++ b/lib/iris/fileformats/netcdf/_dask_locks.py @@ -12,20 +12,20 @@ In any case, a "iris.fileformats.netcdf.saver.Saver" object contains a netCDF4.Dataset targetting an output file, and creates a Saver.lock object to serialise write-accesses to the file from dask tasks : All dask-task file writes go via a -"iris.fileformats.netcdf.saver.DeferredSaveWrapper" object, which also contains a link +"iris.fileformats.netcdf.saver.NetCDFWriteProxy" object, which also contains a link to the Saver.lock, and uses it to prevent workers from fouling each other. -For each chunk written, the DeferredSaveWrapper acquires the common per-file lock; +For each chunk written, the NetCDFWriteProxy acquires the common per-file lock; opens a Dataset on the file; performs a write to the relevant variable; closes the Dataset and then releases the lock. For a threaded scheduler, the Saver.lock is a simple threading.Lock(). The workers -(threads) execute tasks which contain a DeferredSaveWrapper, as above. All of those +(threads) execute tasks which contain a NetCDFWriteProxy, as above. All of those contain the common lock, and this is simply **the same object** for all workers, since they share an address space. For a distributed scheduler, the Saver.lock is a `distributed.Lock()` which is identified with the output filepath. This is distributed to the workers by -serialising the task function arguments, which will include the DeferredSaveWrapper. +serialising the task function arguments, which will include the NetCDFWriteProxy. A worker behaves like a process, though it may execute on a remote machine. When a distributed.Lock is deserialised to reconstruct the worker task, this creates an object that communicates with the scheduler. These objects behave as a single common lock, diff --git a/lib/iris/fileformats/netcdf/_thread_safe_nc.py b/lib/iris/fileformats/netcdf/_thread_safe_nc.py index 0307680afa..62c6724fdf 100644 --- a/lib/iris/fileformats/netcdf/_thread_safe_nc.py +++ b/lib/iris/fileformats/netcdf/_thread_safe_nc.py @@ -342,7 +342,7 @@ def __setstate__(self, state): setattr(self, key, value) -class DeferredSaveWrapper: +class NetCDFWriteProxy: """ The "opposite" of a NetCDFDataProxy : An object mimicking the data access of a netCDF4.Variable, but where the data is to be ***written to***. diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index c381914ec1..74cb54ac63 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -517,8 +517,8 @@ def __init__(self, filename, netcdf_format, compute=True): If True, the Saver performs normal 'synchronous' data writes, where data is streamed directly into file variables during the save operation. If False, the file is created as normal, but computation and streaming of - any lazy array content is instead deferred to :class:`dask.delayed.Delayed` objects, - which are held in a list in the saver 'delayed_writes' property. + any lazy array content is instead deferred to :class:`dask.delayed.Delayed` + objects, which are held in a list in the saver 'delayed_writes' property. The relavant file variables are created empty, and the write can subsequently be completed by computing the 'save.deferred_writes'. @@ -2479,13 +2479,11 @@ def _lazy_stream_data(self, data, fill_value, fill_warn, cf_var): def store(data, cf_var, fill_value): # Create a data-writeable object that we can stream into, which # encapsulates the file to be opened + variable to be written. - writeable_var_wrapper = ( - _thread_safe_nc.DeferredSaveWrapper( - self.filepath, cf_var, self.file_write_lock - ) + write_wrapper = _thread_safe_nc.NetCDFWriteProxy( + self.filepath, cf_var, self.file_write_lock ) # Add to the list of deferred writes, used in _deferred_save(). - self.deferred_writes.append((data, writeable_var_wrapper)) + self.deferred_writes.append((data, write_wrapper)) # NOTE: in this case, no checking of fill-value violations so just # return dummy values for this. # TODO: just for now -- can probably make this work later @@ -2718,8 +2716,8 @@ def save( * compute (bool): When False, create the output file but defer writing any lazy array content to its variables, such as (lazy) data and aux-coords points and bounds. - Instead return a class:`dask.delayed.Delayed` which, when computed, will compute all - the lazy content and stream it to complete the file. + Instead return a class:`dask.delayed.Delayed` which, when computed, will + compute all the lazy content and stream it to complete the file. Several such data saves can be performed in parallel, by passing a list of them into a :func:`dask.compute` call. From 0ece09a2a54899ba97154520bebc49e07db9d31b Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Sat, 18 Mar 2023 01:25:45 +0000 Subject: [PATCH 20/85] Remove Saver lazy option; all lazy saves are delayed; factor out fillvalue checks and make them delayable. --- lib/iris/fileformats/netcdf/saver.py | 298 ++++++++++++++++++--------- 1 file changed, 195 insertions(+), 103 deletions(-) diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index 74cb54ac63..d643b1f18f 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -26,7 +26,6 @@ import dask import dask.array as da import numpy as np -import numpy.ma as ma from iris._lazy_data import _co_realise_lazy_arrays, is_lazy_data from iris.aux_factory import ( @@ -468,39 +467,113 @@ def _setncattr(variable, name, attribute): return variable.setncattr(name, attribute) -class _FillValueMaskCheckAndStoreTarget: - """ - To be used with da.store. Remembers whether any element was equal to a - given value and whether it was masked, before passing the chunk to the - given target. +# NOTE : this matches :class:`iris.experimental.ugrid.mesh.Mesh.ELEMENTS`, +# but in the preferred order for coord/connectivity variables in the file. +MESH_ELEMENTS = ("node", "edge", "face") + + +_FillvalueCheckInfo = collections.namedtuple( + "_FillvalueCheckInfo", ["user_value", "check_value", "dtype", "varname"] +) + - NOTE: target needs to be a _thread_safe_nc._ThreadSafeWrapper subclass. +def _PRINT_DEBUG(*args): + _DO_DEBUG = True + # _DO_DEBUG = False + if _DO_DEBUG: + print(*args) + +def _data_fillvalue_check(arraylib, data, check_value): """ + Check whether an array is masked, and whether it contains a fill-value. + + Parameters + ---------- + arraylib : module + Either numpy or dask.array : When dask, results are lazy computations. + data : array-like + Array to check (numpy or dask) + check_value : number or None + If not None, fill-value to check for existence in the array. + If None, do not do value-in-array check + + Returns + ------- + is_masked : bool + True if array has any masked points. + contains_value : bool + True if array contains check_value. + Always False if check_value is None. - def __init__(self, target, fill_value=None): - assert hasattr(target, "THREAD_SAFE_FLAG") - self.target = target - self.fill_value = fill_value - self.contains_value = False - self.is_masked = False + """ + is_masked = arraylib.any(arraylib.ma.getmaskarray(data)) + if check_value is None: + contains_value = False + else: + contains_value = arraylib.any(data == check_value) + return is_masked, contains_value - def __setitem__(self, keys, arr): - if self.fill_value is not None: - self.contains_value = self.contains_value or self.fill_value in arr - self.is_masked = self.is_masked or ma.is_masked(arr) - self.target[keys] = arr +def _fillvalue_report(fill_info, is_masked, contains_fill_value, warn=False): + """ + From the given information, work out whether there was a possible or actual + fill-value collision, and if so construct a warning. + + Parameters + ---------- + fill_info : dict + A dictinonary containing the context of the fill-value check + is_masked : bool + whether the data arary was masked + contains_fill_value : bool + whether the data array contained the fill-value + warn : bool + if True, also issue any resulting warning immediately. + + Returns + ------- + None or :class:`Warning` + If not None, indicates a known or possible problem with filling -# NOTE : this matches :class:`iris.experimental.ugrid.mesh.Mesh.ELEMENTS`, -# but in the preferred order for coord/connectivity variables in the file. -MESH_ELEMENTS = ("node", "edge", "face") + """ + varname = fill_info.varname + user_value = fill_info.user_value + check_value = fill_info.check_value + is_byte_data = fill_info.dtype.itemsize == 1 + result = None + if is_byte_data and is_masked and user_value is None: + _PRINT_DEBUG(f'Data check "{varname}" : masked byte warning') + result = UserWarning( + f"CF var '{varname}' contains byte data with masked points, but " + "no fill_value keyword was given. As saved, these " + "points will read back as valid values. To save as " + "masked byte data, `_FillValue` needs to be explicitly " + "set. For Cube data this can be done via the 'fill_value' " + "keyword during saving, otherwise use ncedit/equivalent." + ) + elif contains_fill_value: + _PRINT_DEBUG(f'Data check "{varname}" : contains-fill warning') + result = UserWarning( + f"CF var '{varname}' contains unmasked data points equal to the " + f"fill-value, {check_value}. As saved, these points will read back " + "as missing data. To save these as normal values, " + "`_FillValue` needs to be set to not equal any valid data " + "points. For Cube data this can be done via the 'fill_value' " + "keyword during saving, otherwise use ncedit/equivalent." + ) + else: + _PRINT_DEBUG(f'Data check "{varname}" : all-values-ok') + + if warn and result is not None: + warnings.warn(result) + return result class Saver: """A manager for saving netcdf files.""" - def __init__(self, filename, netcdf_format, compute=True): + def __init__(self, filename, netcdf_format): """ A manager for saving netcdf files. @@ -513,15 +586,6 @@ def __init__(self, filename, netcdf_format, compute=True): Underlying netCDF file format, one of 'NETCDF4', 'NETCDF4_CLASSIC', 'NETCDF3_CLASSIC' or 'NETCDF3_64BIT'. Default is 'NETCDF4' format. - * compute (bool): - If True, the Saver performs normal 'synchronous' data writes, where data - is streamed directly into file variables during the save operation. - If False, the file is created as normal, but computation and streaming of - any lazy array content is instead deferred to :class:`dask.delayed.Delayed` - objects, which are held in a list in the saver 'delayed_writes' property. - The relavant file variables are created empty, and the write can - subsequently be completed by computing the 'save.deferred_writes'. - Returns: None. @@ -560,8 +624,6 @@ def __init__(self, filename, netcdf_format, compute=True): self._formula_terms_cache = {} #: Target filepath self.filepath = os.path.abspath(filename) - #: Whether lazy saving. - self.lazy_saves = not compute #: A list of deferred writes for lazy saving : each is a (source, target) pair self.deferred_writes = [] # N.B. the file-write-lock *type* actually depends on the dask scheduler type. @@ -2473,44 +2535,8 @@ def _lazy_stream_data(self, data, fill_value, fill_warn, cf_var): # contains just 1 row, so the cf_var is 1D. data = data.squeeze(axis=0) - if is_lazy_data(data): - if self.lazy_saves: - # deferred lazy streaming - def store(data, cf_var, fill_value): - # Create a data-writeable object that we can stream into, which - # encapsulates the file to be opened + variable to be written. - write_wrapper = _thread_safe_nc.NetCDFWriteProxy( - self.filepath, cf_var, self.file_write_lock - ) - # Add to the list of deferred writes, used in _deferred_save(). - self.deferred_writes.append((data, write_wrapper)) - # NOTE: in this case, no checking of fill-value violations so just - # return dummy values for this. - # TODO: just for now -- can probably make this work later - is_masked, contains_value = False, False - return is_masked, contains_value - - else: - # Immediate streaming store : check mask+fill as we go. - def store(data, cf_var, fill_value): - # Store lazy data and check whether it is masked and contains - # the fill value - target = _FillValueMaskCheckAndStoreTarget( - cf_var, fill_value - ) - da.store([data], [target], lock=False) - return target.is_masked, target.contains_value - - else: - # Real data is always written directly, i.e. not via lazy save. - def store(data, cf_var, fill_value): - cf_var[:] = data - is_masked = np.ma.is_masked(data) - contains_value = fill_value is not None and fill_value in data - return is_masked, contains_value - + # Decide whether we are checking for fill-value collisions. dtype = cf_var.dtype - # fill_warn allows us to skip warning if packing attributes have been # specified. It would require much more complex operations to work out # what the values and fill_value _would_ be in such a case. @@ -2518,56 +2544,116 @@ def store(data, cf_var, fill_value): if fill_value is not None: fill_value_to_check = fill_value else: + # Retain 'fill_value == None', to show that no specific value was given. + # But set 'fill_value_to_check' to a calculated value fill_value_to_check = _thread_safe_nc.default_fillvals[ dtype.str[1:] ] else: + # A None means we will NOT check for collisions. fill_value_to_check = None + fill_info = _FillvalueCheckInfo( + user_value=fill_value, + check_value=fill_value_to_check, + dtype=dtype, + varname=cf_var.name, + ) + + doing_delayed_save = is_lazy_data(data) + if doing_delayed_save: + # save lazy data with a delayed operation. For now, we just record the + # necessary information -- a single, complete delayed action is constructed + # later by a call to _delayed_save(). + def store(data, cf_var, fill_value): + # Create a data-writeable object that we can stream into, which + # encapsulates the file to be opened + variable to be written. + write_wrapper = _thread_safe_nc.NetCDFWriteProxy( + self.filepath, cf_var, self.file_write_lock + ) + # Add to the list of deferred writes, used in _delayed_save(). + self.deferred_writes.append((data, write_wrapper, fill_info)) + # In this case, fill-value checking is done later. But return 2 dummy + # values, to be consistent with the non-streamed "store" signature. + is_masked, contains_value = False, False + return is_masked, contains_value + + else: + # Real data is always written directly, i.e. not via lazy save. + # We also check it immediately for any fill-value problems. + def store(data, cf_var, fill_value): + cf_var[:] = data + return _data_fillvalue_check(np, data, fill_value) + # Store the data and check if it is masked and contains the fill value. is_masked, contains_fill_value = store( data, cf_var, fill_value_to_check ) - - if dtype.itemsize == 1 and fill_value is None: - if is_masked: - msg = ( - "CF var '{}' contains byte data with masked points, but " - "no fill_value keyword was given. As saved, these " - "points will read back as valid values. To save as " - "masked byte data, `_FillValue` needs to be explicitly " - "set. For Cube data this can be done via the 'fill_value' " - "keyword during saving, otherwise use ncedit/equivalent." - ) - warnings.warn(msg.format(cf_var.name)) - elif contains_fill_value: - msg = ( - "CF var '{}' contains unmasked data points equal to the " - "fill-value, {}. As saved, these points will read back " - "as missing data. To save these as normal values, " - "`_FillValue` needs to be set to not equal any valid data " - "points. For Cube data this can be done via the 'fill_value' " - "keyword during saving, otherwise use ncedit/equivalent." + if doing_delayed_save: + _PRINT_DEBUG( + f'Data check "{fill_info.varname}" : NO CHECK YET (delayed)' + ) + else: + # Issue a fill-value warning immediately, if appropriate. + _fillvalue_report( + fill_info, is_masked, contains_fill_value, warn=True ) - warnings.warn(msg.format(cf_var.name, fill_value)) - def _deferred_save(self): + def _delayed_save(self): """ Create a 'delayed' to trigger file completion for lazy saves. This contains all the deferred writes, which complete the file by filling out - the data of variables initially created empty. + the data of variables initially created empty, and also the checks for + potential fill-value collisions. """ if self.deferred_writes: # Create a single delayed da.store operation to complete the file. - sources, targets = zip(*self.deferred_writes) - result = da.store(sources, targets, compute=False, lock=False) + sources, targets, fill_infos = zip(*self.deferred_writes) + store_op = da.store(sources, targets, compute=False, lock=False) + + # Construct a delayed fill-check operation for each (lazy) source array. + delayed_fillvalue_checks = [ + # NB with arraylib=dask.array, this routine does lazy array computation + _data_fillvalue_check(da, source, fillinfo.check_value) + for source, fillinfo in zip(sources, fill_infos) + ] + + # Return a single delayed object which completes the delayed saves and + # returns a list of any fill-value warnings. + @dask.delayed + def compute_and_return_warnings(store_op, fv_infos, fv_checks): + # Note: we don't actually *do* anything with the store_op, but + # including it here ensures that dask will compute it (thus performing + # all the delayed saves), before calling this function. + results = [] + # Pair each fill_check result (is_masked, contains_value) with its + # fillinfo and construct a suitable Warning if needed. + for fillinfo, (is_masked, contains_value) in zip( + fv_infos, fv_checks + ): + fv_warning = _fillvalue_report( + fill_info=fillinfo, + is_masked=is_masked, + contains_fill_value=contains_value, + ) + if fv_warning is not None: + # Collect the warnings and return them. + results.append(fv_warning) + return results + + result = compute_and_return_warnings( + store_op, + fv_infos=fill_infos, + fv_checks=delayed_fillvalue_checks, + ) + else: - # Return a delayed anyway, just for usage consistency. + # Return a delayed, which returns an empty list, for usage consistency. @dask.delayed def no_op(): - return None + return [] result = no_op() @@ -2720,9 +2806,12 @@ def save( compute all the lazy content and stream it to complete the file. Several such data saves can be performed in parallel, by passing a list of them into a :func:`dask.compute` call. + Note: when computed, the returned class:`dask.delayed.Delayed` object returns + a list of :class:`Warning` : These are any warnings that _would_ have been + issued in the save call, if compute had been True. Returns: - None. + A list of :class:`Warning`. .. note:: @@ -2823,7 +2912,7 @@ def is_valid_packspec(p): # Initialise Manager for saving # N.B. FOR NOW -- we are cheating and making all saves compute=False, as otherwise # non-lazy saves do *not* work with the distributed scheduler. - with Saver(filename, netcdf_format, compute=False) as sman: + with Saver(filename, netcdf_format) as sman: # Iterate through the cubelist. for cube, packspec, fill_value in zip(cubes, packspecs, fill_values): sman.write( @@ -2869,11 +2958,14 @@ def is_valid_packspec(p): # Add conventions attribute. sman.update_global_attributes(Conventions=conventions) - # For now, not using Saver(compute=True) as it doesn't work with distributed or - # process workers (only threaded). - result = sman._deferred_save() + result = sman._delayed_save() if compute: - result = result.compute() + # Complete the saves now, and handle any delayed warnings that occurred + result_warnings = result.compute() + # Issue any delayed warnings from the compute. + for delayed_warning in result_warnings: + warnings.warn(delayed_warning) + result = None return result From 4596081504525871fa2ac7b5079614f6948433f3 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 20 Mar 2023 15:54:10 +0000 Subject: [PATCH 21/85] Repurposed 'test__FillValueMaskCheckAndStoreTarget' to 'test__data_fillvalue_check', since old class is gone. --- ...arget.py => test__data_fillvalue_check.py} | 53 +++++++++++++------ 1 file changed, 37 insertions(+), 16 deletions(-) rename lib/iris/tests/unit/fileformats/netcdf/saver/{test__FillValueMaskCheckAndStoreTarget.py => test__data_fillvalue_check.py} (67%) diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/test__FillValueMaskCheckAndStoreTarget.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test__data_fillvalue_check.py similarity index 67% rename from lib/iris/tests/unit/fileformats/netcdf/saver/test__FillValueMaskCheckAndStoreTarget.py rename to lib/iris/tests/unit/fileformats/netcdf/saver/test__data_fillvalue_check.py index 77209efafc..b691a5d492 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/saver/test__FillValueMaskCheckAndStoreTarget.py +++ b/lib/iris/tests/unit/fileformats/netcdf/saver/test__data_fillvalue_check.py @@ -4,39 +4,52 @@ # See COPYING and COPYING.LESSER in the root of the repository for full # licensing details. """ -Unit tests for the `iris.fileformats.netcdf._FillValueMaskCheckAndStoreTarget` -class. +Unit tests for `iris.fileformats.netcdf.saver._data_fillvalue_check`. + +Repurposed from +`iris.tests.unit.fileformats.netcdf.test__FillValueMaskCheckAndStoreTarget.py`, +to show that the logic is basically the same. + +Now runs all testcases on both real + lazy data. """ # Import iris.tests first so that some things can be initialised before # importing anything else. import iris.tests as tests # isort:skip +import collections -from unittest import mock - +import dask.array as da import numpy as np -from iris.fileformats.netcdf.saver import _FillValueMaskCheckAndStoreTarget +from iris.fileformats.netcdf.saver import _data_fillvalue_check -class Test__FillValueMaskCheckAndStoreTarget(tests.IrisTest): +class Check__fillvalueandmasking: def _call_target(self, fill_value, keys, vals): - inner_target = mock.MagicMock() - target = _FillValueMaskCheckAndStoreTarget( - inner_target, fill_value=fill_value - ) + data = np.zeros(20, dtype=np.float32) + if any(np.ma.isMaskedArray(val) for val in vals): + # N.B. array is masked if "vals" is, but has no masked points initially. + data = np.ma.masked_array(data, mask=np.zeros_like(data)) for key, val in zip(keys, vals): - target[key] = val + data[key] = val - calls = [mock.call(key, val) for key, val in zip(keys, vals)] - inner_target.__setitem__.assert_has_calls(calls) + if hasattr(self.arraylib, "compute"): + data = da.from_array(data, chunks=-1) - return target + results = _data_fillvalue_check( + arraylib=self.arraylib, data=data, check_value=fill_value + ) - def test___setitem__(self): - self._call_target(None, [1], [2]) + if hasattr(results, "compute"): + results = results.compute() + + # Return a named tuple, for named-property access to the 2 result values. + result = collections.namedtuple("_", ["is_masked", "contains_value"])( + *results + ) + return result def test_no_fill_value_not_masked(self): # Test when the fill value is not present and the data is not masked @@ -90,3 +103,11 @@ def test_contains_masked_fill_value(self): target = self._call_target(fill_value, keys, vals) self.assertFalse(target.contains_value) self.assertTrue(target.is_masked) + + +class Test__real(Check__fillvalueandmasking, tests.IrisTest): + arraylib = np + + +class Test__lazy(Check__fillvalueandmasking, tests.IrisTest): + arraylib = da From ad49fbe32aa80e0647edd1a6e18276550a336ebc Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 20 Mar 2023 15:56:05 +0000 Subject: [PATCH 22/85] Disable (temporary) saver debug printouts. --- lib/iris/fileformats/netcdf/saver.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index d643b1f18f..cc24cb18e3 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -478,8 +478,8 @@ def _setncattr(variable, name, attribute): def _PRINT_DEBUG(*args): - _DO_DEBUG = True - # _DO_DEBUG = False + # _DO_DEBUG = True + _DO_DEBUG = False if _DO_DEBUG: print(*args) From b29c927edc9dd9b727c8f1c9592c147c120f444f Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 20 Mar 2023 17:49:56 +0000 Subject: [PATCH 23/85] Fix test problems; Saver automatically completes to preserve existing direct usage (which is public API). --- lib/iris/fileformats/netcdf/saver.py | 84 +++++++++++++++---- .../unit/fileformats/netcdf/test_Saver.py | 7 +- 2 files changed, 72 insertions(+), 19 deletions(-) diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index cc24cb18e3..a24f02c344 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -573,19 +573,27 @@ def _fillvalue_report(fill_info, is_masked, contains_fill_value, warn=False): class Saver: """A manager for saving netcdf files.""" - def __init__(self, filename, netcdf_format): + def __init__(self, filename, netcdf_format, compute=True): """ A manager for saving netcdf files. - Args: - - * filename (string): + Parameters + ---------- + filename : string Name of the netCDF file to save the cube. - * netcdf_format (string): + netcdf_format : string Underlying netCDF file format, one of 'NETCDF4', 'NETCDF4_CLASSIC', 'NETCDF3_CLASSIC' or 'NETCDF3_64BIT'. Default is 'NETCDF4' format. + compute : bool, default=True + If True, delayed variable saves will be completed on exit from the Saver + context (after first closing the target file), equivalent to + saver.complete(). + If False, file is created and closed without filling in the variables for + which source data was lazy. These writes can be completed later, see + :meth:`delayed_completion`. + Returns: None. @@ -626,6 +634,8 @@ def __init__(self, filename, netcdf_format): self.filepath = os.path.abspath(filename) #: A list of deferred writes for lazy saving : each is a (source, target) pair self.deferred_writes = [] + #: Whether to complete deferred saves on exit (and raise associated warnings). + self.compute = compute # N.B. the file-write-lock *type* actually depends on the dask scheduler type. #: A per-file write lock to prevent dask attempting overlapping writes. self.file_write_lock = _dask_locks.get_worker_lock(self.filepath) @@ -654,6 +664,8 @@ def __exit__(self, type, value, traceback): self._dataset.sync() self._dataset.close() + if self.compute: + self.complete() def write( self, @@ -2564,14 +2576,14 @@ def _lazy_stream_data(self, data, fill_value, fill_warn, cf_var): if doing_delayed_save: # save lazy data with a delayed operation. For now, we just record the # necessary information -- a single, complete delayed action is constructed - # later by a call to _delayed_save(). + # later by a call to delayed_completion(). def store(data, cf_var, fill_value): # Create a data-writeable object that we can stream into, which # encapsulates the file to be opened + variable to be written. write_wrapper = _thread_safe_nc.NetCDFWriteProxy( self.filepath, cf_var, self.file_write_lock ) - # Add to the list of deferred writes, used in _delayed_save(). + # Add to the list of deferred writes, used in delayed_completion(). self.deferred_writes.append((data, write_wrapper, fill_info)) # In this case, fill-value checking is done later. But return 2 dummy # values, to be consistent with the non-streamed "store" signature. @@ -2599,7 +2611,7 @@ def store(data, cf_var, fill_value): fill_info, is_masked, contains_fill_value, warn=True ) - def _delayed_save(self): + def delayed_completion(self): """ Create a 'delayed' to trigger file completion for lazy saves. @@ -2607,6 +2619,9 @@ def _delayed_save(self): the data of variables initially created empty, and also the checks for potential fill-value collisions. + NOTE: the dataset *must* be closed (saver has exited its context) before the + result is computed. + """ if self.deferred_writes: # Create a single delayed da.store operation to complete the file. @@ -2659,6 +2674,40 @@ def no_op(): return result + def complete(self, issue_warnings=True): + """ + Complete file by computing any deferred variable saves. + + This requires that the Saver has closed the dataset (exited its context). + + Parameters + ---------- + issue_warnings : bool, default = True + If true, issue all return values via :func:`warnings.warn`. + + Returns + ------- + warnings : list of Warning + Any warnings that were raised by writing deferred data. + + """ + if self._dataset._isopen: + msg = ( + "Cannot call Saver.complete() until its dataset is closed, " + "i.e. the saver's context has exited." + ) + raise ValueError(msg) + + delayed_write = self.delayed_completion() + # Complete the saves now, and handle any delayed warnings that occurred + result_warnings = delayed_write.compute() + if issue_warnings: + # Issue any delayed warnings from the compute. + for delayed_warning in result_warnings: + warnings.warn(delayed_warning) + + return result_warnings + def save( cube, @@ -2910,9 +2959,9 @@ def is_valid_packspec(p): raise ValueError(msg) # Initialise Manager for saving - # N.B. FOR NOW -- we are cheating and making all saves compute=False, as otherwise - # non-lazy saves do *not* work with the distributed scheduler. - with Saver(filename, netcdf_format) as sman: + # N.B. make the Saver compute=False, as we want control over creation of the + # delayed-completion object. + with Saver(filename, netcdf_format, compute=False) as sman: # Iterate through the cubelist. for cube, packspec, fill_value in zip(cubes, packspecs, fill_values): sman.write( @@ -2958,14 +3007,13 @@ def is_valid_packspec(p): # Add conventions attribute. sman.update_global_attributes(Conventions=conventions) - result = sman._delayed_save() if compute: - # Complete the saves now, and handle any delayed warnings that occurred - result_warnings = result.compute() - # Issue any delayed warnings from the compute. - for delayed_warning in result_warnings: - warnings.warn(delayed_warning) - + # Complete the file now + # N.B. this issues any delayed warnings. + sman.complete() result = None + else: + # Returned a delayed completion object. + result = sman.delayed_completion() return result diff --git a/lib/iris/tests/unit/fileformats/netcdf/test_Saver.py b/lib/iris/tests/unit/fileformats/netcdf/test_Saver.py index 543fec7c01..272495796d 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/test_Saver.py +++ b/lib/iris/tests/unit/fileformats/netcdf/test_Saver.py @@ -207,6 +207,8 @@ def test_zlib(self): api.default_fillvals = collections.defaultdict(lambda: -99.0) with Saver("/dummy/path", "NETCDF4") as saver: saver.write(cube, zlib=True) + # must simulate a dataset which is CLOSED, for the check in Saver.__exit__ + saver._dataset._isopen = 0 dataset = api.DatasetWrapper.return_value create_var_call = mock.call( "air_pressure_anomaly", @@ -646,8 +648,11 @@ def setUp(self): self.container = mock.Mock(name="container", attributes={}) self.data_dtype = np.dtype("int32") + # We need to create mock datasets which look like they are closed. + dataset_class = mock.Mock(return_value=mock.Mock(_isopen=0)) patch = mock.patch( - "iris.fileformats.netcdf._thread_safe_nc.DatasetWrapper" + "iris.fileformats.netcdf._thread_safe_nc.DatasetWrapper", + dataset_class, ) _ = patch.start() self.addCleanup(patch.stop) From 8f1028101f9481a59e61e5579b0d9110c8694c27 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 20 Mar 2023 18:13:26 +0000 Subject: [PATCH 24/85] Fix docstring error. --- lib/iris/fileformats/netcdf/saver.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index a24f02c344..891fcef91f 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -594,16 +594,17 @@ def __init__(self, filename, netcdf_format, compute=True): which source data was lazy. These writes can be completed later, see :meth:`delayed_completion`. - Returns: - None. - - For example:: - - # Initialise Manager for saving - with Saver(filename, netcdf_format) as sman: - # Iterate through the cubelist. - for cube in cubes: - sman.write(cube) + Returns + ------- + None + + For example + ----------- + # Initialise Manager for saving + with Saver(filename, netcdf_format) as sman: + # Iterate through the cubelist. + for cube in cubes: + sman.write(cube) """ if netcdf_format not in [ From 6a564d94f626e6f00c7800ae2dce89e0543c2e08 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 20 Mar 2023 18:27:24 +0000 Subject: [PATCH 25/85] Fix spurious error in old saver test. --- lib/iris/tests/unit/fileformats/netcdf/test_Saver.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/iris/tests/unit/fileformats/netcdf/test_Saver.py b/lib/iris/tests/unit/fileformats/netcdf/test_Saver.py index 272495796d..b5f41d8820 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/test_Saver.py +++ b/lib/iris/tests/unit/fileformats/netcdf/test_Saver.py @@ -205,10 +205,10 @@ def test_zlib(self): api = self.patch("iris.fileformats.netcdf.saver._thread_safe_nc") # Define mocked default fill values to prevent deprecation warning (#4374). api.default_fillvals = collections.defaultdict(lambda: -99.0) - with Saver("/dummy/path", "NETCDF4") as saver: + # NOTE: use compute=False as otherwise it gets in a pickle trying to construct + # a fill-value report on a non-compliant variable in a non-file (!) + with Saver("/dummy/path", "NETCDF4", compute=False) as saver: saver.write(cube, zlib=True) - # must simulate a dataset which is CLOSED, for the check in Saver.__exit__ - saver._dataset._isopen = 0 dataset = api.DatasetWrapper.return_value create_var_call = mock.call( "air_pressure_anomaly", From 2fb4d6c63ea91475c56a4e2d6fd0585b5cec9623 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 20 Mar 2023 20:45:52 +0000 Subject: [PATCH 26/85] Fix Saver docstring. --- lib/iris/fileformats/netcdf/saver.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index 891fcef91f..e06e104250 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -598,13 +598,12 @@ def __init__(self, filename, netcdf_format, compute=True): ------- None - For example - ----------- - # Initialise Manager for saving - with Saver(filename, netcdf_format) as sman: - # Iterate through the cubelist. - for cube in cubes: - sman.write(cube) + Example + ------- + >>> with Saver(filename, netcdf_format) as sman: + >>> # Iterate through the cubelist. + >>> for cube in cubes: + >>> sman.write(cube) """ if netcdf_format not in [ From c84bfdcd463c2d01f551e08c5f4b7b1bd59c4ca2 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 20 Mar 2023 20:48:02 +0000 Subject: [PATCH 27/85] More robust exit for NetCDFWriteProxy operation. --- lib/iris/fileformats/netcdf/_thread_safe_nc.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/iris/fileformats/netcdf/_thread_safe_nc.py b/lib/iris/fileformats/netcdf/_thread_safe_nc.py index 62c6724fdf..709696087b 100644 --- a/lib/iris/fileformats/netcdf/_thread_safe_nc.py +++ b/lib/iris/fileformats/netcdf/_thread_safe_nc.py @@ -372,9 +372,12 @@ def __setitem__(self, keys, array_data): var = dataset.variables[self.varname] var[keys] = array_data finally: - if dataset: - dataset.close() - self.lock.release() + try: + if dataset: + dataset.close() + finally: + # *ALWAYS* let go ! + self.lock.release() def __repr__(self): return f"<{self.__class__.__name__} path={self.path!r} var={self.varname!r}>" From 5b78085efe54c811997aa1d47f5f65cf82f61097 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Tue, 21 Mar 2023 11:01:01 +0000 Subject: [PATCH 28/85] Fix doctests by making the Saver example functional. --- lib/iris/fileformats/netcdf/saver.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index e06e104250..72a64cd463 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -600,10 +600,13 @@ def __init__(self, filename, netcdf_format, compute=True): Example ------- - >>> with Saver(filename, netcdf_format) as sman: - >>> # Iterate through the cubelist. - >>> for cube in cubes: - >>> sman.write(cube) + >>> import iris + >>> from iris.fileformats.netcdf.saver import Saver + >>> cubes = iris.load(iris.sample_data_path('atlantic_profiles.nc')) + >>> with Saver("tmp.nc", "NETCDF4") as sman: + ... # Iterate through the cubelist. + ... for cube in cubes: + ... sman.write(cube) """ if netcdf_format not in [ From 478332e5fd2665ad4b0f9d5500029f0e0b1076d2 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 23 Mar 2023 15:23:57 +0000 Subject: [PATCH 29/85] Improve docstrings; unify terminology; simplify non-lazy save call. --- lib/iris/fileformats/netcdf/saver.py | 62 ++++++++++++++++------------ 1 file changed, 35 insertions(+), 27 deletions(-) diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index 72a64cd463..75821f1be4 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -25,6 +25,7 @@ import cf_units import dask import dask.array as da +from dask.delayed import Delayed import numpy as np from iris._lazy_data import _co_realise_lazy_arrays, is_lazy_data @@ -635,9 +636,11 @@ def __init__(self, filename, netcdf_format, compute=True): self._formula_terms_cache = {} #: Target filepath self.filepath = os.path.abspath(filename) - #: A list of deferred writes for lazy saving : each is a (source, target) pair - self.deferred_writes = [] - #: Whether to complete deferred saves on exit (and raise associated warnings). + #: A list of delayed writes for lazy saving + self.delayed_writes = ( + [] + ) # a list of triples (source, target, fill-info) + #: Whether to complete delayed saves on exit (and raise associated warnings). self.compute = compute # N.B. the file-write-lock *type* actually depends on the dask scheduler type. #: A per-file write lock to prevent dask attempting overlapping writes. @@ -2586,8 +2589,8 @@ def store(data, cf_var, fill_value): write_wrapper = _thread_safe_nc.NetCDFWriteProxy( self.filepath, cf_var, self.file_write_lock ) - # Add to the list of deferred writes, used in delayed_completion(). - self.deferred_writes.append((data, write_wrapper, fill_info)) + # Add to the list of delayed writes, used in delayed_completion(). + self.delayed_writes.append((data, write_wrapper, fill_info)) # In this case, fill-value checking is done later. But return 2 dummy # values, to be consistent with the non-streamed "store" signature. is_masked, contains_value = False, False @@ -2614,21 +2617,28 @@ def store(data, cf_var, fill_value): fill_info, is_masked, contains_fill_value, warn=True ) - def delayed_completion(self): + def delayed_completion(self) -> Delayed: """ - Create a 'delayed' to trigger file completion for lazy saves. + Create a :class:'Delayed' to trigger file completion for delayed saves. - This contains all the deferred writes, which complete the file by filling out + This contains all the delayed writes, which complete the file by filling out the data of variables initially created empty, and also the checks for potential fill-value collisions. + When computed, it returns a list of any warnings which were generated in the + save operation. - NOTE: the dataset *must* be closed (saver has exited its context) before the - result is computed. + Returns + ------- + completion : :class:`Delayed` + Notes + ----- + The dataset *must* be closed (saver has exited its context) before the + result can be computed, otherwise computation will hang (never return). """ - if self.deferred_writes: + if self.delayed_writes: # Create a single delayed da.store operation to complete the file. - sources, targets, fill_infos = zip(*self.deferred_writes) + sources, targets, fill_infos = zip(*self.delayed_writes) store_op = da.store(sources, targets, compute=False, lock=False) # Construct a delayed fill-check operation for each (lazy) source array. @@ -2677,21 +2687,21 @@ def no_op(): return result - def complete(self, issue_warnings=True): + def complete(self, issue_warnings=True) -> List[Warning]: """ - Complete file by computing any deferred variable saves. + Complete file by computing any delayed variable saves. This requires that the Saver has closed the dataset (exited its context). Parameters ---------- issue_warnings : bool, default = True - If true, issue all return values via :func:`warnings.warn`. + If true, issue all the resulting warnings with :func:`warnings.warn`. Returns ------- warnings : list of Warning - Any warnings that were raised by writing deferred data. + Any warnings that were raised while writing delayed data. """ if self._dataset._isopen: @@ -2852,14 +2862,14 @@ def save( this argument will be applied to each cube separately. * compute (bool): - When False, create the output file but defer writing any lazy array content to - its variables, such as (lazy) data and aux-coords points and bounds. - Instead return a class:`dask.delayed.Delayed` which, when computed, will - compute all the lazy content and stream it to complete the file. + When False, create the output file but don't write any lazy array content to + its variables, such as lazy cube data or aux-coord points and bounds. + Instead return a class:`Delayed` which, when computed, will stream all the lazy + content with :meth:`dask.store`, to complete the file. Several such data saves can be performed in parallel, by passing a list of them into a :func:`dask.compute` call. - Note: when computed, the returned class:`dask.delayed.Delayed` object returns - a list of :class:`Warning` : These are any warnings that _would_ have been + Note: when computed, the returned class:`Delayed` object returns + a list of :class:`Warning` : These are any warnings which _would_ have been issued in the save call, if compute had been True. Returns: @@ -2964,7 +2974,7 @@ def is_valid_packspec(p): # Initialise Manager for saving # N.B. make the Saver compute=False, as we want control over creation of the # delayed-completion object. - with Saver(filename, netcdf_format, compute=False) as sman: + with Saver(filename, netcdf_format, compute=compute) as sman: # Iterate through the cubelist. for cube, packspec, fill_value in zip(cubes, packspecs, fill_values): sman.write( @@ -3011,12 +3021,10 @@ def is_valid_packspec(p): sman.update_global_attributes(Conventions=conventions) if compute: - # Complete the file now - # N.B. this issues any delayed warnings. - sman.complete() + # No more to do, since we used Saver(compute=True). result = None else: - # Returned a delayed completion object. + # Return a delayed completion object. result = sman.delayed_completion() return result From 34f154c0779ed2bf6440622e76077f8961c7207f Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 27 Mar 2023 18:18:40 +0100 Subject: [PATCH 30/85] Moved netcdf cell-method handling into nc_load_rules.helpers, and various tests into more specific test folders. --- .../fileformats/_nc_load_rules/helpers.py | 210 +++++++++++++++++- lib/iris/fileformats/netcdf/__init__.py | 7 +- lib/iris/fileformats/netcdf/saver.py | 201 ----------------- .../netcdf/{ => saver}/Saver/write/endian.cdl | 0 .../{ => saver}/Saver/write/mercator.cdl | 0 .../Saver/write/mercator_no_ellipsoid.cdl | 0 .../{ => saver}/Saver/write/stereographic.cdl | 0 .../write/stereographic_no_ellipsoid.cdl | 0 .../write/stereographic_scale_factor.cdl | 0 .../Saver/write/transverse_mercator.cdl | 0 .../transverse_mercator_no_ellipsoid.cdl | 0 .../Saver/write/with_climatology.cdl | 0 .../TestSaveUgrid__cube/basic_mesh.cdl | 0 .../helpers}/test_parse_cell_methods.py | 2 +- .../netcdf/{ => saver}/test_Saver.py | 0 .../netcdf/{ => saver}/test_Saver__lazy.py | 2 +- .../netcdf/{ => saver}/test_Saver__ugrid.py | 0 17 files changed, 213 insertions(+), 209 deletions(-) rename lib/iris/tests/results/unit/fileformats/netcdf/{ => saver}/Saver/write/endian.cdl (100%) rename lib/iris/tests/results/unit/fileformats/netcdf/{ => saver}/Saver/write/mercator.cdl (100%) rename lib/iris/tests/results/unit/fileformats/netcdf/{ => saver}/Saver/write/mercator_no_ellipsoid.cdl (100%) rename lib/iris/tests/results/unit/fileformats/netcdf/{ => saver}/Saver/write/stereographic.cdl (100%) rename lib/iris/tests/results/unit/fileformats/netcdf/{ => saver}/Saver/write/stereographic_no_ellipsoid.cdl (100%) rename lib/iris/tests/results/unit/fileformats/netcdf/{ => saver}/Saver/write/stereographic_scale_factor.cdl (100%) rename lib/iris/tests/results/unit/fileformats/netcdf/{ => saver}/Saver/write/transverse_mercator.cdl (100%) rename lib/iris/tests/results/unit/fileformats/netcdf/{ => saver}/Saver/write/transverse_mercator_no_ellipsoid.cdl (100%) rename lib/iris/tests/results/unit/fileformats/netcdf/{ => saver}/Saver/write/with_climatology.cdl (100%) rename lib/iris/tests/results/unit/fileformats/netcdf/{ => saver}/Saver__ugrid/TestSaveUgrid__cube/basic_mesh.cdl (100%) rename lib/iris/tests/unit/fileformats/{netcdf => nc_load_rules/helpers}/test_parse_cell_methods.py (99%) rename lib/iris/tests/unit/fileformats/netcdf/{ => saver}/test_Saver.py (100%) rename lib/iris/tests/unit/fileformats/netcdf/{ => saver}/test_Saver__lazy.py (98%) rename lib/iris/tests/unit/fileformats/netcdf/{ => saver}/test_Saver__ugrid.py (100%) diff --git a/lib/iris/fileformats/_nc_load_rules/helpers.py b/lib/iris/fileformats/_nc_load_rules/helpers.py index 35163c47d5..37724e7e93 100644 --- a/lib/iris/fileformats/_nc_load_rules/helpers.py +++ b/lib/iris/fileformats/_nc_load_rules/helpers.py @@ -13,6 +13,8 @@ build routines, and which it does not use. """ +import re +from typing import List import warnings import cf_units @@ -28,10 +30,6 @@ import iris.exceptions import iris.fileformats.cf as cf import iris.fileformats.netcdf -from iris.fileformats.netcdf import ( - UnknownCellMethodWarning, - parse_cell_methods, -) from iris.fileformats.netcdf.loader import _get_cf_var_data import iris.std_names import iris.util @@ -184,6 +182,210 @@ CF_VALUE_STD_NAME_PROJ_Y = "projection_y_coordinate" +################################################################################ +# Handling of cell-methods. + +_CM_COMMENT = "comment" +_CM_EXTRA = "extra" +_CM_INTERVAL = "interval" +_CM_METHOD = "method" +_CM_NAME = "name" +_CM_PARSE_NAME = re.compile(r"([\w_]+\s*?:\s+)+") +_CM_PARSE = re.compile( + r""" + (?P([\w_]+\s*?:\s+)+) + (?P[\w_\s]+(?![\w_]*\s*?:))\s* + (?: + \(\s* + (?P.+) + \)\s* + )? + """, + re.VERBOSE, +) + +# Cell methods. +_CM_KNOWN_METHODS = [ + "point", + "sum", + "mean", + "maximum", + "minimum", + "mid_range", + "standard_deviation", + "variance", + "mode", + "median", +] + + +def _split_cell_methods(nc_cell_methods: str) -> List[re.Match]: + """ + Split a CF cell_methods attribute string into a list of zero or more cell + methods, each of which is then parsed with a regex to return a list of match + objects. + + Args: + + * nc_cell_methods: The value of the cell methods attribute to be split. + + Returns: + + * nc_cell_methods_matches: A list of the re.Match objects associated with + each parsed cell method + + Splitting is done based on words followed by colons outside of any brackets. + Validation of anything other than being laid out in the expected format is + left to the calling function. + """ + + # Find name candidates + name_start_inds = [] + for m in _CM_PARSE_NAME.finditer(nc_cell_methods): + name_start_inds.append(m.start()) + + # Remove those that fall inside brackets + bracket_depth = 0 + for ind, cha in enumerate(nc_cell_methods): + if cha == "(": + bracket_depth += 1 + elif cha == ")": + bracket_depth -= 1 + if bracket_depth < 0: + msg = ( + "Cell methods may be incorrectly parsed due to mismatched " + "brackets" + ) + warnings.warn(msg, UserWarning, stacklevel=2) + if bracket_depth > 0 and ind in name_start_inds: + name_start_inds.remove(ind) + + # List tuples of indices of starts and ends of the cell methods in the string + method_indices = [] + for ii in range(len(name_start_inds) - 1): + method_indices.append((name_start_inds[ii], name_start_inds[ii + 1])) + method_indices.append((name_start_inds[-1], len(nc_cell_methods))) + + # Index the string and match against each substring + nc_cell_methods_matches = [] + for start_ind, end_ind in method_indices: + nc_cell_method_str = nc_cell_methods[start_ind:end_ind] + nc_cell_method_match = _CM_PARSE.match(nc_cell_method_str.strip()) + if not nc_cell_method_match: + msg = ( + f"Failed to fully parse cell method string: {nc_cell_methods}" + ) + warnings.warn(msg, UserWarning, stacklevel=2) + continue + nc_cell_methods_matches.append(nc_cell_method_match) + + return nc_cell_methods_matches + + +class UnknownCellMethodWarning(Warning): + pass + + +def parse_cell_methods(nc_cell_methods): + """ + Parse a CF cell_methods attribute string into a tuple of zero or + more CellMethod instances. + + Args: + + * nc_cell_methods (str): + The value of the cell methods attribute to be parsed. + + Returns: + + * cell_methods + An iterable of :class:`iris.coords.CellMethod`. + + Multiple coordinates, intervals and comments are supported. + If a method has a non-standard name a warning will be issued, but the + results are not affected. + + """ + + cell_methods = [] + if nc_cell_methods is not None: + for m in _split_cell_methods(nc_cell_methods): + d = m.groupdict() + method = d[_CM_METHOD] + method = method.strip() + # Check validity of method, allowing for multi-part methods + # e.g. mean over years. + method_words = method.split() + if method_words[0].lower() not in _CM_KNOWN_METHODS: + msg = "NetCDF variable contains unknown cell method {!r}" + warnings.warn( + msg.format("{}".format(method_words[0])), + UnknownCellMethodWarning, + ) + d[_CM_METHOD] = method + name = d[_CM_NAME] + name = name.replace(" ", "") + name = name.rstrip(":") + d[_CM_NAME] = tuple([n for n in name.split(":")]) + interval = [] + comment = [] + if d[_CM_EXTRA] is not None: + # + # tokenise the key words and field colon marker + # + d[_CM_EXTRA] = d[_CM_EXTRA].replace( + "comment:", "<><<:>>" + ) + d[_CM_EXTRA] = d[_CM_EXTRA].replace( + "interval:", "<><<:>>" + ) + d[_CM_EXTRA] = d[_CM_EXTRA].split("<<:>>") + if len(d[_CM_EXTRA]) == 1: + comment.extend(d[_CM_EXTRA]) + else: + next_field_type = comment + for field in d[_CM_EXTRA]: + field_type = next_field_type + index = field.rfind("<>") + if index == 0: + next_field_type = interval + continue + elif index > 0: + next_field_type = interval + else: + index = field.rfind("<>") + if index == 0: + next_field_type = comment + continue + elif index > 0: + next_field_type = comment + if index != -1: + field = field[:index] + field_type.append(field.strip()) + # + # cater for a shared interval over multiple axes + # + if len(interval): + if len(d[_CM_NAME]) != len(interval) and len(interval) == 1: + interval = interval * len(d[_CM_NAME]) + # + # cater for a shared comment over multiple axes + # + if len(comment): + if len(d[_CM_NAME]) != len(comment) and len(comment) == 1: + comment = comment * len(d[_CM_NAME]) + d[_CM_INTERVAL] = tuple(interval) + d[_CM_COMMENT] = tuple(comment) + cell_method = iris.coords.CellMethod( + d[_CM_METHOD], + coords=d[_CM_NAME], + intervals=d[_CM_INTERVAL], + comments=d[_CM_COMMENT], + ) + cell_methods.append(cell_method) + return tuple(cell_methods) + + ################################################################################ def build_cube_metadata(engine): """Add the standard meta data to the cube.""" diff --git a/lib/iris/fileformats/netcdf/__init__.py b/lib/iris/fileformats/netcdf/__init__.py index 505e173b0b..b696b200ff 100644 --- a/lib/iris/fileformats/netcdf/__init__.py +++ b/lib/iris/fileformats/netcdf/__init__.py @@ -18,6 +18,11 @@ # Note: *must* be done before importing from submodules, as they also use this ! logger = iris.config.get_logger(__name__) +# Note: these probably shouldn't be public, but for now they are. +from .._nc_load_rules.helpers import ( + UnknownCellMethodWarning, + parse_cell_methods, +) from .loader import DEBUG, NetCDFDataProxy, load_cubes from .saver import ( CF_CONVENTIONS_VERSION, @@ -25,8 +30,6 @@ SPATIO_TEMPORAL_AXES, CFNameCoordMap, Saver, - UnknownCellMethodWarning, - parse_cell_methods, save, ) diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index 75821f1be4..62e058a64e 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -157,207 +157,6 @@ } -# Cell methods. -_CM_KNOWN_METHODS = [ - "point", - "sum", - "mean", - "maximum", - "minimum", - "mid_range", - "standard_deviation", - "variance", - "mode", - "median", -] - -_CM_COMMENT = "comment" -_CM_EXTRA = "extra" -_CM_INTERVAL = "interval" -_CM_METHOD = "method" -_CM_NAME = "name" -_CM_PARSE_NAME = re.compile(r"([\w_]+\s*?:\s+)+") -_CM_PARSE = re.compile( - r""" - (?P([\w_]+\s*?:\s+)+) - (?P[\w_\s]+(?![\w_]*\s*?:))\s* - (?: - \(\s* - (?P.+) - \)\s* - )? - """, - re.VERBOSE, -) - - -class UnknownCellMethodWarning(Warning): - pass - - -def _split_cell_methods(nc_cell_methods: str) -> List[re.Match]: - """ - Split a CF cell_methods attribute string into a list of zero or more cell - methods, each of which is then parsed with a regex to return a list of match - objects. - - Args: - - * nc_cell_methods: The value of the cell methods attribute to be split. - - Returns: - - * nc_cell_methods_matches: A list of the re.Match objects associated with - each parsed cell method - - Splitting is done based on words followed by colons outside of any brackets. - Validation of anything other than being laid out in the expected format is - left to the calling function. - """ - - # Find name candidates - name_start_inds = [] - for m in _CM_PARSE_NAME.finditer(nc_cell_methods): - name_start_inds.append(m.start()) - - # Remove those that fall inside brackets - bracket_depth = 0 - for ind, cha in enumerate(nc_cell_methods): - if cha == "(": - bracket_depth += 1 - elif cha == ")": - bracket_depth -= 1 - if bracket_depth < 0: - msg = ( - "Cell methods may be incorrectly parsed due to mismatched " - "brackets" - ) - warnings.warn(msg, UserWarning, stacklevel=2) - if bracket_depth > 0 and ind in name_start_inds: - name_start_inds.remove(ind) - - # List tuples of indices of starts and ends of the cell methods in the string - method_indices = [] - for ii in range(len(name_start_inds) - 1): - method_indices.append((name_start_inds[ii], name_start_inds[ii + 1])) - method_indices.append((name_start_inds[-1], len(nc_cell_methods))) - - # Index the string and match against each substring - nc_cell_methods_matches = [] - for start_ind, end_ind in method_indices: - nc_cell_method_str = nc_cell_methods[start_ind:end_ind] - nc_cell_method_match = _CM_PARSE.match(nc_cell_method_str.strip()) - if not nc_cell_method_match: - msg = ( - f"Failed to fully parse cell method string: {nc_cell_methods}" - ) - warnings.warn(msg, UserWarning, stacklevel=2) - continue - nc_cell_methods_matches.append(nc_cell_method_match) - - return nc_cell_methods_matches - - -def parse_cell_methods(nc_cell_methods): - """ - Parse a CF cell_methods attribute string into a tuple of zero or - more CellMethod instances. - - Args: - - * nc_cell_methods (str): - The value of the cell methods attribute to be parsed. - - Returns: - - * cell_methods - An iterable of :class:`iris.coords.CellMethod`. - - Multiple coordinates, intervals and comments are supported. - If a method has a non-standard name a warning will be issued, but the - results are not affected. - - """ - - cell_methods = [] - if nc_cell_methods is not None: - for m in _split_cell_methods(nc_cell_methods): - d = m.groupdict() - method = d[_CM_METHOD] - method = method.strip() - # Check validity of method, allowing for multi-part methods - # e.g. mean over years. - method_words = method.split() - if method_words[0].lower() not in _CM_KNOWN_METHODS: - msg = "NetCDF variable contains unknown cell method {!r}" - warnings.warn( - msg.format("{}".format(method_words[0])), - UnknownCellMethodWarning, - ) - d[_CM_METHOD] = method - name = d[_CM_NAME] - name = name.replace(" ", "") - name = name.rstrip(":") - d[_CM_NAME] = tuple([n for n in name.split(":")]) - interval = [] - comment = [] - if d[_CM_EXTRA] is not None: - # - # tokenise the key words and field colon marker - # - d[_CM_EXTRA] = d[_CM_EXTRA].replace( - "comment:", "<><<:>>" - ) - d[_CM_EXTRA] = d[_CM_EXTRA].replace( - "interval:", "<><<:>>" - ) - d[_CM_EXTRA] = d[_CM_EXTRA].split("<<:>>") - if len(d[_CM_EXTRA]) == 1: - comment.extend(d[_CM_EXTRA]) - else: - next_field_type = comment - for field in d[_CM_EXTRA]: - field_type = next_field_type - index = field.rfind("<>") - if index == 0: - next_field_type = interval - continue - elif index > 0: - next_field_type = interval - else: - index = field.rfind("<>") - if index == 0: - next_field_type = comment - continue - elif index > 0: - next_field_type = comment - if index != -1: - field = field[:index] - field_type.append(field.strip()) - # - # cater for a shared interval over multiple axes - # - if len(interval): - if len(d[_CM_NAME]) != len(interval) and len(interval) == 1: - interval = interval * len(d[_CM_NAME]) - # - # cater for a shared comment over multiple axes - # - if len(comment): - if len(d[_CM_NAME]) != len(comment) and len(comment) == 1: - comment = comment * len(d[_CM_NAME]) - d[_CM_INTERVAL] = tuple(interval) - d[_CM_COMMENT] = tuple(comment) - cell_method = iris.coords.CellMethod( - d[_CM_METHOD], - coords=d[_CM_NAME], - intervals=d[_CM_INTERVAL], - comments=d[_CM_COMMENT], - ) - cell_methods.append(cell_method) - return tuple(cell_methods) - - class CFNameCoordMap: """Provide a simple CF name to CF coordinate mapping.""" diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/Saver/write/endian.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/endian.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/Saver/write/endian.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/endian.cdl diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/Saver/write/mercator.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/mercator.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/Saver/write/mercator.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/mercator.cdl diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/Saver/write/mercator_no_ellipsoid.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/mercator_no_ellipsoid.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/Saver/write/mercator_no_ellipsoid.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/mercator_no_ellipsoid.cdl diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/Saver/write/stereographic.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/stereographic.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/Saver/write/stereographic.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/stereographic.cdl diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/Saver/write/stereographic_no_ellipsoid.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/stereographic_no_ellipsoid.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/Saver/write/stereographic_no_ellipsoid.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/stereographic_no_ellipsoid.cdl diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/Saver/write/stereographic_scale_factor.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/stereographic_scale_factor.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/Saver/write/stereographic_scale_factor.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/stereographic_scale_factor.cdl diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/Saver/write/transverse_mercator.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/transverse_mercator.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/Saver/write/transverse_mercator.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/transverse_mercator.cdl diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/Saver/write/transverse_mercator_no_ellipsoid.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/transverse_mercator_no_ellipsoid.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/Saver/write/transverse_mercator_no_ellipsoid.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/transverse_mercator_no_ellipsoid.cdl diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/Saver/write/with_climatology.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/with_climatology.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/Saver/write/with_climatology.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/with_climatology.cdl diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/Saver__ugrid/TestSaveUgrid__cube/basic_mesh.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver__ugrid/TestSaveUgrid__cube/basic_mesh.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/Saver__ugrid/TestSaveUgrid__cube/basic_mesh.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver__ugrid/TestSaveUgrid__cube/basic_mesh.cdl diff --git a/lib/iris/tests/unit/fileformats/netcdf/test_parse_cell_methods.py b/lib/iris/tests/unit/fileformats/nc_load_rules/helpers/test_parse_cell_methods.py similarity index 99% rename from lib/iris/tests/unit/fileformats/netcdf/test_parse_cell_methods.py rename to lib/iris/tests/unit/fileformats/nc_load_rules/helpers/test_parse_cell_methods.py index bbde2d0a2d..729a2d8b14 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/test_parse_cell_methods.py +++ b/lib/iris/tests/unit/fileformats/nc_load_rules/helpers/test_parse_cell_methods.py @@ -15,7 +15,7 @@ from unittest import mock from iris.coords import CellMethod -from iris.fileformats.netcdf import parse_cell_methods +from iris.fileformats._nc_load_rules.helpers import parse_cell_methods class Test(tests.IrisTest): diff --git a/lib/iris/tests/unit/fileformats/netcdf/test_Saver.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver.py similarity index 100% rename from lib/iris/tests/unit/fileformats/netcdf/test_Saver.py rename to lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver.py diff --git a/lib/iris/tests/unit/fileformats/netcdf/test_Saver__lazy.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy.py similarity index 98% rename from lib/iris/tests/unit/fileformats/netcdf/test_Saver__lazy.py rename to lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy.py index 53e1f9a652..e1211dc276 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/test_Saver__lazy.py +++ b/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy.py @@ -14,7 +14,7 @@ from iris.coords import AuxCoord from iris.fileformats.netcdf import Saver from iris.tests import stock -from iris.tests.unit.fileformats.netcdf import test_Saver +from iris.tests.unit.fileformats.netcdf.saver import test_Saver class LazyMixin(tests.IrisTest): diff --git a/lib/iris/tests/unit/fileformats/netcdf/test_Saver__ugrid.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__ugrid.py similarity index 100% rename from lib/iris/tests/unit/fileformats/netcdf/test_Saver__ugrid.py rename to lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__ugrid.py From 9673ea010fc374b007b3f8064000a72bc2e144ab Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Mon, 27 Mar 2023 18:31:19 +0100 Subject: [PATCH 31/85] Fix lockfiles and Makefile process. --- Makefile | 2 +- requirements/locks/py310-linux-64.lock | 45 ++++++++++++++------------ requirements/locks/py38-linux-64.lock | 41 ++++++++++++----------- requirements/locks/py39-linux-64.lock | 43 ++++++++++++------------ 4 files changed, 70 insertions(+), 61 deletions(-) diff --git a/Makefile b/Makefile index 74a87db427..0bb56edbf9 100755 --- a/Makefile +++ b/Makefile @@ -1,2 +1,2 @@ lockfiles: - python tools/update_lockfiles.py -o requirements/ci/nox.lock requirements/ci/py*.yml \ No newline at end of file + python tools/update_lockfiles.py -o requirements/locks requirements/py*.yml \ No newline at end of file diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index be26d11424..8977ee04e5 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -12,7 +12,7 @@ https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-12.2.0-h337968e_19.tar.bz2#164b4b1acaedc47ee7e658ae6b308ca3 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-12.2.0-h46fd767_19.tar.bz2#1030b1f38c129f2634eae026f704fe60 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-3_cp310.conda#4eb33d14d794b0f4be116443ffed3853 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2022g-h191b570_0.conda#51fc4fcfb19f5d95ffc8c339db5068e8 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2023b-h71feb2d_0.conda#6c80c63151d7f493dab457a0ba6c2523 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-12.2.0-h69a702a_19.tar.bz2#cd7a806282c16e1f2d39a7e80d3a3e0d https://conda.anaconda.org/conda-forge/linux-64/libgomp-12.2.0-h65d4601_19.tar.bz2#cedcee7c064c01c403f962c9e8d3c373 @@ -49,12 +49,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.21-pthreads_h78a6416_3.tar.bz2#8c5963a49b6035c40646a763293fbb35 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/libtool-2.4.7-h27087fc_0.conda#f204c8ba400ec475452737094fb81d52 -https://conda.anaconda.org/conda-forge/linux-64/libudev1-253-h0b41bf4_0.conda#6c2addbd9aa4ee47c76d50c9f0df8cd6 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.32.1-h7f98852_1000.tar.bz2#772d69f030955d9646d3d0eaf21d859d https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.2.4-h166bdaf_0.tar.bz2#ac2ccf7323d21f2994e4d1f5da664f37 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h166bdaf_4.tar.bz2#f3f9de449d32ca9b9c66a22863c96f41 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.31.2-hcb278e6_0.conda#08efb1e1813f1a151b7a945b972a049b +https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.31.3-hcb278e6_0.conda#141a126675b6d1a4eabb111a4a353898 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.3-h27087fc_1.tar.bz2#4acfc691e64342b9dae57cf2adc63238 https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.0-h0b41bf4_0.conda#2d833be81a21128e317325a01326d36f @@ -75,7 +74,7 @@ https://conda.anaconda.org/conda-forge/linux-64/jack-1.9.22-h11f4161_0.conda#504 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_openblas.tar.bz2#d9b7a8639171f6c6fa0a983edabcfe2b https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_8.tar.bz2#4ae4d7795d33e02bd20f6b23d91caf82 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_8.tar.bz2#04bac51ba35ea023dc48af73c1c88c25 -https://conda.anaconda.org/conda-forge/linux-64/libcap-2.66-ha37c62d_0.tar.bz2#2d7665abd0997f1a6d4b7596bc27b657 +https://conda.anaconda.org/conda-forge/linux-64/libcap-2.67-he9d0100_0.conda#d05556c80caffff164d17bdea0105a1a 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/libevent-2.1.10-h28343ad_4.tar.bz2#4a049fc560e00e43151dc51368915fdd https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.2-h27087fc_0.tar.bz2#7daf72d8e2a8e848e11d63ed6d1026e0 @@ -86,11 +85,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.40.0-h753d276_0.tar. https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.10.0-hf14f497_3.tar.bz2#d85acad4b47dff4e3def14a769a97906 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/libxcb-1.13-h7f98852_1004.tar.bz2#b3653fdc58d03face9724f602218a904 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.10.3-hca2bb57_3.conda#29474f139e5017090f218ef6b3753efd +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.10.3-hca2bb57_4.conda#bb808b654bdc3c783deaf107a2ffb503 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc929e4a_1.tar.bz2#5b122b50e738c4be5c3f2899f010d7cf -https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.32-ha901b37_0.conda#6a39818710235826181e104aada40c75 +https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.32-ha901b37_1.conda#2c18a7a26ec0d0c23a917f37a65fc9a2 https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.40-hc3806b6_0.tar.bz2#69e2c796349cd9b273890bee0febfe1b -https://conda.anaconda.org/conda-forge/linux-64/readline-8.1.2-h0f457ee_0.tar.bz2#db2ebbe2943aae81ed051a6a9af8e0fa +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.3-hd9c2040_1000.tar.bz2#9e856f78d5c80d5a78f61e72d1d473a3 @@ -107,10 +106,11 @@ https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_openb https://conda.anaconda.org/conda-forge/linux-64/libllvm15-15.0.7-hadd5161_1.conda#17d91085ccf5934ce652cb448d0cb65a https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.0-hb75c966_0.conda#c648d19cd9c8625898d5d370414de7c7 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.0-h6adf6a1_2.conda#2e648a34072eb39d7c4fc2a9981c5f0c +https://conda.anaconda.org/conda-forge/linux-64/libudev1-253-h0b41bf4_1.conda#bb38b19a41bb94e8a19dbfb062d499c7 https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.5.0-h79f4944_1.conda#04a39cdd663f295653fc143851830563 -https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.32-hd7da12d_0.conda#b05d7ea8b76f1172d5fe4f30e03277ea +https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.32-hd7da12d_1.conda#a69fa6f218cfed8e2d61753eeacaf034 https://conda.anaconda.org/conda-forge/linux-64/nss-3.89-he45b914_0.conda#2745719a58eeaab6657256a3f142f099 -https://conda.anaconda.org/conda-forge/linux-64/python-3.10.9-he550d4f_0_cpython.conda#3cb3e91b3fe66baa68a12c85f39b9b40 +https://conda.anaconda.org/conda-forge/linux-64/python-3.10.10-he550d4f_0_cpython.conda#de25afc7041c103c7f510c746bb63435 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.40.0-h4ff8645_0.tar.bz2#bb11803129cbbb53ed56f9506ff74145 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-h166bdaf_0.tar.bz2#384e7fcb3cd162ba3e4aed4b687df566 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h166bdaf_0.tar.bz2#637054603bb7594302e3bf83f0a99879 @@ -134,7 +134,7 @@ https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.6-pyhd8ed1ab_0.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.17.1-py310hff52083_3.tar.bz2#785160da087cf1d70e989afbb761f01c https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.1-pyhd8ed1ab_0.conda#7312299d7a0ea4993159229b7d2dceb2 https://conda.anaconda.org/conda-forge/noarch/execnet-1.9.0-pyhd8ed1ab_0.tar.bz2#0e521f7a5e60d508b121d38b04874fb2 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.10.0-pyhd8ed1ab_0.conda#6f90f1dc834447823b11d155726fcb37 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.10.7-pyhd8ed1ab_0.conda#6a0601f92717ce555d79d83d693b6fa3 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.3.0-pyhd8ed1ab_1.conda#0db48a2f5a68e28e5af8d3df276f2255 https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h05c8ddd_0.conda#1a109126a43003d65b39c1cad656bc9b @@ -150,7 +150,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libclang13-15.0.7-default_h3e3d5 https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h36d4200_3.conda#c9f4416a34bc91e0eb029f912c68f81f https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.88.1-hdc1c0ab_1.conda#3d1189864d1c0ed2a5919cb067b5903d https://conda.anaconda.org/conda-forge/linux-64/libpq-15.2-hb675445_0.conda#4654b17eccaba55b8581d6b9c77f53cc -https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-252-h2a991cd_0.tar.bz2#3c5ae9f61f663b3d5e1bf7f7da0c85f5 +https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-253-h8c4010b_1.conda#9176b1e2cb8beca37a7510b0e801e38f https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.2.4-h1daa5a0_1.conda#77003f63d1763c1e6569a02c1742c9f4 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.2-py310h1fa729e_0.conda#a1f0db6709778b77b5903541eeac4032 @@ -166,7 +166,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py310h1fa729e_0.conda#8d155ac95b1dfe585bcb6bec6a91c73b -https://conda.anaconda.org/conda-forge/noarch/pytz-2022.7.1-pyhd8ed1ab_0.conda#f59d49a7b464901cf714b9e7984d01a2 +https://conda.anaconda.org/conda-forge/noarch/pytz-2023.2-pyhd8ed1ab_0.conda#d74d285d6628e55752df22fc84910279 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py310h5764c6d_5.tar.bz2#9e68d2ff6d98737c855b65f48dd3c597 https://conda.anaconda.org/conda-forge/noarch/setuptools-67.6.0-pyhd8ed1ab_0.conda#e18ed61c37145bb9b48d1d98801960f7 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 @@ -190,7 +190,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.10-h7f98852_1003.tar.bz2#f59c1242cc1dd93e72c2ee2b360979eb https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf https://conda.anaconda.org/conda-forge/noarch/babel-2.12.1-pyhd8ed1ab_1.conda#ac432e732804a81ddcf29c92ead57cde -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.11.2-pyha770c72_0.conda#88b59f6989f0ed5ab3433af0b82555e1 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.0-pyha770c72_0.conda#84f54c3bd1a542c8fe696bc8947b040b https://conda.anaconda.org/conda-forge/linux-64/cairo-1.16.0-ha61ee94_1014.tar.bz2#d1a88f3ed5b52e1024b80d4bcd26a7a0 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py310h255011f_3.conda#800596144bb613cd7ac58b80900ce835 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py310hde88566_1.tar.bz2#94ce7a76b0c912279f6958e0b6b21d2b @@ -211,7 +211,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pillow-9.4.0-py310h023d228_1.con https://conda.anaconda.org/conda-forge/noarch/pip-23.0.1-pyhd8ed1ab_0.conda#8025ca83b8ba5430b640b83917c2a6f7 https://conda.anaconda.org/conda-forge/noarch/pockets-0.9.1-py_0.tar.bz2#1b52f0c42e8077e5a33e00fe72269364 https://conda.anaconda.org/conda-forge/linux-64/proj-9.1.1-h8ffa02c_2.conda#c264aea0e16bba26afa0a0940e954492 -https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-16.1-ha8d29e2_1.conda#dbfc2a8d63a43a11acf4c704e1ef9d0c +https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-16.1-h5195f5e_3.conda#caeb3302ef1dc8b342b20c710a86f8a9 https://conda.anaconda.org/conda-forge/noarch/pygments-2.14.0-pyhd8ed1ab_0.conda#c78cd16b11cd6a295484bd6c8f24bea1 https://conda.anaconda.org/conda-forge/noarch/pytest-7.2.2-pyhd8ed1ab_0.conda#60958b19354e0ec295b43f6ab5cfab86 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 @@ -220,17 +220,18 @@ https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.4.1-py310h0a54255_0 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py310h056c13c_1.conda#32d925cfd330e0cbb72b7618558a44e8 https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.7-py310heca2aa9_0.conda#142c074701cf90c88667b461678aee81 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.5.0-hd8ed1ab_0.conda#b3c594fde1a80a1fc3eb9cc4a5dfe392 -https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.3-pyhd8ed1ab_0.conda#9838acb5f38ac58240741f5cea70a952 +https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda#46a2e6e3dfa718ce3492018d5a110dd6 https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py310h5764c6d_1005.tar.bz2#87669c3468dff637bbd0363bc0f895cf https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.1.1-py310hde88566_2.tar.bz2#7433944046deda7775c5b1f7e0b6fe18 -https://conda.anaconda.org/conda-forge/linux-64/cryptography-39.0.2-py310h34c0648_0.conda#99dc5a02a8b16cd88ca9a12354496e78 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.3.1-pyhd8ed1ab_0.conda#0a3abdbff6e296d056ce01ee3529638d +https://conda.anaconda.org/conda-forge/linux-64/cryptography-40.0.1-py310h34c0648_0.conda#deafd9206c2e307874f3777a33cafb79 https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.22.0-h25f0c4b_2.conda#461541cb1b387c2a28ab6217f3d38502 https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-6.0.0-h8e241bc_0.conda#448fe40d2fed88ccf4d9ded37cbb2b38 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.1.0-hd8ed1ab_0.conda#90bab1d97fdb6bb40c8e00207bf222dc https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.1-nompi_h261ec11_106.tar.bz2#9b25de670ce5753a33c18b1090d1d3bf https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py310he60537e_0.conda#68b2dd34c69d08b05a9db5e3596fe3ee https://conda.anaconda.org/conda-forge/linux-64/pandas-1.5.3-py310h9b08913_0.conda#467244b0dbb7da40927ac6ee0e9491de -https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.1.1-pyhd8ed1ab_0.conda#1d1a27f637808c76dd83e3f469aa6f7e +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.2.0-pyhd8ed1ab_0.conda#f10c2cf447ca96f12a326b83c75b8e33 +https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-daemon-16.1-ha8d29e2_3.conda#34d9d75ca896f5919c372a34e25f23ea https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.4.1-py310h15e2413_1.conda#5be35366687def87437d210fd673100c https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.11.0-py310heca2aa9_3.conda#3b1946b676534472ce65181dda0b9554 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-4.0.0-pyhd8ed1ab_0.tar.bz2#c9e3f8bfdb9bfc34aa1836a6ed4b25d7 @@ -238,13 +239,15 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.2.1-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-7.1.0-pyhd8ed1ab_0.conda#6613dbb3b25cc648a107f33ca9f80fc1 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-napoleon-0.7-py_0.tar.bz2#0bc25ff6f2e34af63ded59692df5f749 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310hbf28c38_3.tar.bz2#703ff1ac7d1b27fb5944b8052b5d1edb +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.3.2-pyhd8ed1ab_0.conda#a3552db3a43810551cc93f9a4272380e https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.22.0-h4243ec0_2.conda#0d0c6604c8ac4ad5e51efa7bb58da05c -https://conda.anaconda.org/conda-forge/noarch/identify-2.5.21-pyhd8ed1ab_0.conda#b5ada314668cded097e08fea86262317 +https://conda.anaconda.org/conda-forge/noarch/identify-2.5.22-pyhd8ed1ab_0.conda#b8d16e273396a0115199a83769a39246 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/netcdf-fortran-4.6.0-nompi_he1eeb6f_102.conda#d9679b28fcc2154fa63e814c5acdce57 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.2-nompi_py310h55e1e36_100.tar.bz2#4dd7aa28fb7d9a6de061c9579a30e7dd https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-hd33c08f_0.conda#a8b9e35dd7be2c945b0de4fe19a7c3a9 -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.0.0-pyhd8ed1ab_0.conda#d41957700e83bbb925928764cb7f8878 +https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-16.1-hcb278e6_3.conda#8b452ab959166d91949af4c2d28f81db +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.1.0-pyhd8ed1ab_0.conda#3a5b9d88c369e7960e3dde3229066908 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.21.0-pyhd8ed1ab_0.conda#cb9a711f7c9f3074fe522e5a34481e60 https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.0-nompi_hdb2cfa9_4.conda#3e2e1d0cd06d1b64c9c2800c0eb0cde6 https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h90689f9_2.tar.bz2#957a0255ab58aaf394a91725d73ab422 @@ -257,7 +260,7 @@ https://conda.anaconda.org/conda-forge/linux-64/graphviz-7.1.0-h2e5815a_0.conda# https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.7-py310hab646b1_3.conda#d049da3204bf5ecb54a852b622f2d7d2 https://conda.anaconda.org/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_0.conda#11d178fc55199482ee48d6812ea83983 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.7.1-py310hff52083_0.conda#c2b60c44d38d32779006a15c2581f0d1 -https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyhd8ed1ab_0.conda#eb2e0fc33ad0d04b51f9280360c13c1e +https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 https://conda.anaconda.org/conda-forge/noarch/sphinx-4.5.0-pyh6c4a22f_0.tar.bz2#46b38d88c4270ff9ba78a89c83c66345 https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.13.1-pyhd8ed1ab_0.conda#258f38b9f3bfb323cf175b94d4a03c09 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.10.1-py310h8deb116_0.conda#4c9604c5ec179c21f8f0a09e3c164480 diff --git a/requirements/locks/py38-linux-64.lock b/requirements/locks/py38-linux-64.lock index 5c4283bcac..9017584c1a 100644 --- a/requirements/locks/py38-linux-64.lock +++ b/requirements/locks/py38-linux-64.lock @@ -48,12 +48,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.21-pthreads_h78a6416_3.tar.bz2#8c5963a49b6035c40646a763293fbb35 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/libtool-2.4.7-h27087fc_0.conda#f204c8ba400ec475452737094fb81d52 -https://conda.anaconda.org/conda-forge/linux-64/libudev1-253-h0b41bf4_0.conda#6c2addbd9aa4ee47c76d50c9f0df8cd6 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.32.1-h7f98852_1000.tar.bz2#772d69f030955d9646d3d0eaf21d859d https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.2.4-h166bdaf_0.tar.bz2#ac2ccf7323d21f2994e4d1f5da664f37 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h166bdaf_4.tar.bz2#f3f9de449d32ca9b9c66a22863c96f41 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.31.2-hcb278e6_0.conda#08efb1e1813f1a151b7a945b972a049b +https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.31.3-hcb278e6_0.conda#141a126675b6d1a4eabb111a4a353898 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.3-h27087fc_1.tar.bz2#4acfc691e64342b9dae57cf2adc63238 https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.0-h0b41bf4_0.conda#2d833be81a21128e317325a01326d36f @@ -74,7 +73,7 @@ https://conda.anaconda.org/conda-forge/linux-64/jack-1.9.22-h11f4161_0.conda#504 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_openblas.tar.bz2#d9b7a8639171f6c6fa0a983edabcfe2b https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_8.tar.bz2#4ae4d7795d33e02bd20f6b23d91caf82 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_8.tar.bz2#04bac51ba35ea023dc48af73c1c88c25 -https://conda.anaconda.org/conda-forge/linux-64/libcap-2.66-ha37c62d_0.tar.bz2#2d7665abd0997f1a6d4b7596bc27b657 +https://conda.anaconda.org/conda-forge/linux-64/libcap-2.67-he9d0100_0.conda#d05556c80caffff164d17bdea0105a1a 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/libevent-2.1.10-h28343ad_4.tar.bz2#4a049fc560e00e43151dc51368915fdd https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.2-h27087fc_0.tar.bz2#7daf72d8e2a8e848e11d63ed6d1026e0 @@ -85,11 +84,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.40.0-h753d276_0.tar. https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.10.0-hf14f497_3.tar.bz2#d85acad4b47dff4e3def14a769a97906 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/libxcb-1.13-h7f98852_1004.tar.bz2#b3653fdc58d03face9724f602218a904 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.10.3-hca2bb57_3.conda#29474f139e5017090f218ef6b3753efd +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.10.3-hca2bb57_4.conda#bb808b654bdc3c783deaf107a2ffb503 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc929e4a_1.tar.bz2#5b122b50e738c4be5c3f2899f010d7cf -https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.32-ha901b37_0.conda#6a39818710235826181e104aada40c75 +https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.32-ha901b37_1.conda#2c18a7a26ec0d0c23a917f37a65fc9a2 https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.40-hc3806b6_0.tar.bz2#69e2c796349cd9b273890bee0febfe1b -https://conda.anaconda.org/conda-forge/linux-64/readline-8.1.2-h0f457ee_0.tar.bz2#db2ebbe2943aae81ed051a6a9af8e0fa +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.3-hd9c2040_1000.tar.bz2#9e856f78d5c80d5a78f61e72d1d473a3 @@ -106,8 +105,9 @@ https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_openb https://conda.anaconda.org/conda-forge/linux-64/libllvm15-15.0.7-hadd5161_1.conda#17d91085ccf5934ce652cb448d0cb65a https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.0-hb75c966_0.conda#c648d19cd9c8625898d5d370414de7c7 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.0-h6adf6a1_2.conda#2e648a34072eb39d7c4fc2a9981c5f0c +https://conda.anaconda.org/conda-forge/linux-64/libudev1-253-h0b41bf4_1.conda#bb38b19a41bb94e8a19dbfb062d499c7 https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.5.0-h79f4944_1.conda#04a39cdd663f295653fc143851830563 -https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.32-hd7da12d_0.conda#b05d7ea8b76f1172d5fe4f30e03277ea +https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.32-hd7da12d_1.conda#a69fa6f218cfed8e2d61753eeacaf034 https://conda.anaconda.org/conda-forge/linux-64/nss-3.89-he45b914_0.conda#2745719a58eeaab6657256a3f142f099 https://conda.anaconda.org/conda-forge/linux-64/python-3.8.16-he550d4f_1_cpython.conda#9de84cccfbc5f8350a3667bb6ef6fc30 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.40.0-h4ff8645_0.tar.bz2#bb11803129cbbb53ed56f9506ff74145 @@ -133,7 +133,7 @@ https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.6-pyhd8ed1ab_0.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.17.1-py38h578d9bd_3.tar.bz2#34e1f12e3ed15aff218644e9d865b722 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.1-pyhd8ed1ab_0.conda#7312299d7a0ea4993159229b7d2dceb2 https://conda.anaconda.org/conda-forge/noarch/execnet-1.9.0-pyhd8ed1ab_0.tar.bz2#0e521f7a5e60d508b121d38b04874fb2 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.10.0-pyhd8ed1ab_0.conda#6f90f1dc834447823b11d155726fcb37 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.10.7-pyhd8ed1ab_0.conda#6a0601f92717ce555d79d83d693b6fa3 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.3.0-pyhd8ed1ab_1.conda#0db48a2f5a68e28e5af8d3df276f2255 https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h05c8ddd_0.conda#1a109126a43003d65b39c1cad656bc9b @@ -149,7 +149,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libclang13-15.0.7-default_h3e3d5 https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h36d4200_3.conda#c9f4416a34bc91e0eb029f912c68f81f https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.88.1-hdc1c0ab_1.conda#3d1189864d1c0ed2a5919cb067b5903d https://conda.anaconda.org/conda-forge/linux-64/libpq-15.2-hb675445_0.conda#4654b17eccaba55b8581d6b9c77f53cc -https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-252-h2a991cd_0.tar.bz2#3c5ae9f61f663b3d5e1bf7f7da0c85f5 +https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-253-h8c4010b_1.conda#9176b1e2cb8beca37a7510b0e801e38f https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.2.4-h1daa5a0_1.conda#77003f63d1763c1e6569a02c1742c9f4 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.2-py38h1de0b5d_0.conda#6d97b5d6f06933ab653f1862ddf6e33e @@ -165,7 +165,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py38h1de0b5d_0.conda#7db73572d4f7e10a759bad609a228ad0 -https://conda.anaconda.org/conda-forge/noarch/pytz-2022.7.1-pyhd8ed1ab_0.conda#f59d49a7b464901cf714b9e7984d01a2 +https://conda.anaconda.org/conda-forge/noarch/pytz-2023.2-pyhd8ed1ab_0.conda#d74d285d6628e55752df22fc84910279 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py38h0a891b7_5.tar.bz2#0856c59f9ddb710c640dc0428d66b1b7 https://conda.anaconda.org/conda-forge/noarch/setuptools-67.6.0-pyhd8ed1ab_0.conda#e18ed61c37145bb9b48d1d98801960f7 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 @@ -189,7 +189,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.10-h7f98852_1003.tar.bz2#f59c1242cc1dd93e72c2ee2b360979eb https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf https://conda.anaconda.org/conda-forge/noarch/babel-2.12.1-pyhd8ed1ab_1.conda#ac432e732804a81ddcf29c92ead57cde -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.11.2-pyha770c72_0.conda#88b59f6989f0ed5ab3433af0b82555e1 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.0-pyha770c72_0.conda#84f54c3bd1a542c8fe696bc8947b040b https://conda.anaconda.org/conda-forge/linux-64/cairo-1.16.0-ha61ee94_1014.tar.bz2#d1a88f3ed5b52e1024b80d4bcd26a7a0 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py38h4a40e3a_3.conda#3ac112151c6b6cfe457e976de41af0c5 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py38h26c90d9_1.tar.bz2#dcc025a7bb54374979c500c2e161fac9 @@ -210,7 +210,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pillow-9.4.0-py38hde6dc18_1.cond https://conda.anaconda.org/conda-forge/noarch/pip-23.0.1-pyhd8ed1ab_0.conda#8025ca83b8ba5430b640b83917c2a6f7 https://conda.anaconda.org/conda-forge/noarch/pockets-0.9.1-py_0.tar.bz2#1b52f0c42e8077e5a33e00fe72269364 https://conda.anaconda.org/conda-forge/linux-64/proj-9.1.1-h8ffa02c_2.conda#c264aea0e16bba26afa0a0940e954492 -https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-16.1-ha8d29e2_1.conda#dbfc2a8d63a43a11acf4c704e1ef9d0c +https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-16.1-h5195f5e_3.conda#caeb3302ef1dc8b342b20c710a86f8a9 https://conda.anaconda.org/conda-forge/noarch/pygments-2.14.0-pyhd8ed1ab_0.conda#c78cd16b11cd6a295484bd6c8f24bea1 https://conda.anaconda.org/conda-forge/noarch/pytest-7.2.2-pyhd8ed1ab_0.conda#60958b19354e0ec295b43f6ab5cfab86 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 @@ -219,30 +219,33 @@ https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.4.1-py38h7e4f40d_0. https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py38haaa171b_1.conda#fdd08c011257c5e4727cca36f04af74f https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.7-py38h8dc9893_0.conda#ea242937718f3dacf253355e1d634535 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.5.0-hd8ed1ab_0.conda#b3c594fde1a80a1fc3eb9cc4a5dfe392 -https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.3-pyhd8ed1ab_0.conda#9838acb5f38ac58240741f5cea70a952 +https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda#46a2e6e3dfa718ce3492018d5a110dd6 https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py38h0a891b7_1005.tar.bz2#e99e08812dfff30fdd17b3f8838e2759 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.1.1-py38h26c90d9_2.tar.bz2#0ea017e84efe45badce6c32f274dbf8e -https://conda.anaconda.org/conda-forge/linux-64/cryptography-39.0.2-py38h3d167d9_0.conda#6c60377f8bfa325a2cd80d603627a613 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.3.1-pyhd8ed1ab_0.conda#0a3abdbff6e296d056ce01ee3529638d +https://conda.anaconda.org/conda-forge/linux-64/cryptography-40.0.1-py38h3d167d9_0.conda#c046be0e2eaf1f4076ff5633c538ee71 https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.22.0-h25f0c4b_2.conda#461541cb1b387c2a28ab6217f3d38502 https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-6.0.0-h8e241bc_0.conda#448fe40d2fed88ccf4d9ded37cbb2b38 https://conda.anaconda.org/conda-forge/noarch/importlib-resources-5.12.0-pyhd8ed1ab_0.conda#3544c818f0720c89eb16ae6940ab440b +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.1.0-hd8ed1ab_0.conda#90bab1d97fdb6bb40c8e00207bf222dc https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.1-nompi_h261ec11_106.tar.bz2#9b25de670ce5753a33c18b1090d1d3bf https://conda.anaconda.org/conda-forge/linux-64/pandas-1.5.3-py38hdc8b05c_0.conda#5073966d63a54434d2a2fc41d325b072 -https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.1.1-pyhd8ed1ab_0.conda#1d1a27f637808c76dd83e3f469aa6f7e +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.2.0-pyhd8ed1ab_0.conda#f10c2cf447ca96f12a326b83c75b8e33 +https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-daemon-16.1-ha8d29e2_3.conda#34d9d75ca896f5919c372a34e25f23ea https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.4.1-py38h58d5fe2_1.conda#5286eaec7e93586e4ae05e7d658cd3e2 https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.11.0-py38h8dc9893_3.conda#7bb0328b4a0f857aeb432426b9a5f908 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.2.1-pyhd8ed1ab_0.conda#6fe4c2689d1b10fec1ee65819f0c4fd5 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-7.1.0-pyhd8ed1ab_0.conda#6613dbb3b25cc648a107f33ca9f80fc1 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-napoleon-0.7-py_0.tar.bz2#0bc25ff6f2e34af63ded59692df5f749 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py38h43d8883_3.tar.bz2#82b3797d08a43a101b645becbb938e65 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.3.2-pyhd8ed1ab_0.conda#a3552db3a43810551cc93f9a4272380e https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.22.0-h4243ec0_2.conda#0d0c6604c8ac4ad5e51efa7bb58da05c -https://conda.anaconda.org/conda-forge/noarch/identify-2.5.21-pyhd8ed1ab_0.conda#b5ada314668cded097e08fea86262317 +https://conda.anaconda.org/conda-forge/noarch/identify-2.5.22-pyhd8ed1ab_0.conda#b8d16e273396a0115199a83769a39246 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py38hd6c3c57_0.conda#3b8ba76acae09fbd4b2247c4ee4c0324 https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.0-nompi_he1eeb6f_102.conda#d9679b28fcc2154fa63e814c5acdce57 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.2-nompi_py38h2250339_100.tar.bz2#dd97e93b1f64f1cc58879d53c23ec93f https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-hd33c08f_0.conda#a8b9e35dd7be2c945b0de4fe19a7c3a9 -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.0.0-pyhd8ed1ab_0.conda#d41957700e83bbb925928764cb7f8878 +https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-16.1-hcb278e6_3.conda#8b452ab959166d91949af4c2d28f81db +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.1.0-pyhd8ed1ab_0.conda#3a5b9d88c369e7960e3dde3229066908 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.21.0-pyhd8ed1ab_0.conda#cb9a711f7c9f3074fe522e5a34481e60 https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.0-nompi_hdb2cfa9_4.conda#3e2e1d0cd06d1b64c9c2800c0eb0cde6 https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h90689f9_2.tar.bz2#957a0255ab58aaf394a91725d73ab422 @@ -256,7 +259,7 @@ https://conda.anaconda.org/conda-forge/linux-64/graphviz-7.1.0-h2e5815a_0.conda# https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.7-py38ha0d8c90_3.conda#e965dc172d67920d058ac2b3a0e27565 https://conda.anaconda.org/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_0.conda#11d178fc55199482ee48d6812ea83983 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.7.1-py38h578d9bd_0.conda#50ff9e0a3dd459a0ca365741072bf9a2 -https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyhd8ed1ab_0.conda#eb2e0fc33ad0d04b51f9280360c13c1e +https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 https://conda.anaconda.org/conda-forge/noarch/sphinx-4.5.0-pyh6c4a22f_0.tar.bz2#46b38d88c4270ff9ba78a89c83c66345 https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.13.1-pyhd8ed1ab_0.conda#258f38b9f3bfb323cf175b94d4a03c09 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.10.1-py38h10c12cc_0.conda#1cbc47bb9a600ce4a49d8da797d375bf diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index d214499104..c75defbb7d 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -12,7 +12,7 @@ https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-12.2.0-h337968e_19.tar.bz2#164b4b1acaedc47ee7e658ae6b308ca3 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-12.2.0-h46fd767_19.tar.bz2#1030b1f38c129f2634eae026f704fe60 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-3_cp39.conda#0dd193187d54e585cac7eab942a8847e -https://conda.anaconda.org/conda-forge/noarch/tzdata-2022g-h191b570_0.conda#51fc4fcfb19f5d95ffc8c339db5068e8 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2023b-h71feb2d_0.conda#6c80c63151d7f493dab457a0ba6c2523 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-12.2.0-h69a702a_19.tar.bz2#cd7a806282c16e1f2d39a7e80d3a3e0d https://conda.anaconda.org/conda-forge/linux-64/libgomp-12.2.0-h65d4601_19.tar.bz2#cedcee7c064c01c403f962c9e8d3c373 @@ -49,12 +49,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.21-pthreads_h78a6416_3.tar.bz2#8c5963a49b6035c40646a763293fbb35 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/libtool-2.4.7-h27087fc_0.conda#f204c8ba400ec475452737094fb81d52 -https://conda.anaconda.org/conda-forge/linux-64/libudev1-253-h0b41bf4_0.conda#6c2addbd9aa4ee47c76d50c9f0df8cd6 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.32.1-h7f98852_1000.tar.bz2#772d69f030955d9646d3d0eaf21d859d https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.2.4-h166bdaf_0.tar.bz2#ac2ccf7323d21f2994e4d1f5da664f37 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h166bdaf_4.tar.bz2#f3f9de449d32ca9b9c66a22863c96f41 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.31.2-hcb278e6_0.conda#08efb1e1813f1a151b7a945b972a049b +https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.31.3-hcb278e6_0.conda#141a126675b6d1a4eabb111a4a353898 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.3-h27087fc_1.tar.bz2#4acfc691e64342b9dae57cf2adc63238 https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.0-h0b41bf4_0.conda#2d833be81a21128e317325a01326d36f @@ -75,7 +74,7 @@ https://conda.anaconda.org/conda-forge/linux-64/jack-1.9.22-h11f4161_0.conda#504 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_openblas.tar.bz2#d9b7a8639171f6c6fa0a983edabcfe2b https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_8.tar.bz2#4ae4d7795d33e02bd20f6b23d91caf82 https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_8.tar.bz2#04bac51ba35ea023dc48af73c1c88c25 -https://conda.anaconda.org/conda-forge/linux-64/libcap-2.66-ha37c62d_0.tar.bz2#2d7665abd0997f1a6d4b7596bc27b657 +https://conda.anaconda.org/conda-forge/linux-64/libcap-2.67-he9d0100_0.conda#d05556c80caffff164d17bdea0105a1a 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/libevent-2.1.10-h28343ad_4.tar.bz2#4a049fc560e00e43151dc51368915fdd https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.2-h27087fc_0.tar.bz2#7daf72d8e2a8e848e11d63ed6d1026e0 @@ -86,11 +85,11 @@ https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.40.0-h753d276_0.tar. https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.10.0-hf14f497_3.tar.bz2#d85acad4b47dff4e3def14a769a97906 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/libxcb-1.13-h7f98852_1004.tar.bz2#b3653fdc58d03face9724f602218a904 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.10.3-hca2bb57_3.conda#29474f139e5017090f218ef6b3753efd +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.10.3-hca2bb57_4.conda#bb808b654bdc3c783deaf107a2ffb503 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc929e4a_1.tar.bz2#5b122b50e738c4be5c3f2899f010d7cf -https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.32-ha901b37_0.conda#6a39818710235826181e104aada40c75 +https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.32-ha901b37_1.conda#2c18a7a26ec0d0c23a917f37a65fc9a2 https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.40-hc3806b6_0.tar.bz2#69e2c796349cd9b273890bee0febfe1b -https://conda.anaconda.org/conda-forge/linux-64/readline-8.1.2-h0f457ee_0.tar.bz2#db2ebbe2943aae81ed051a6a9af8e0fa +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.3-hd9c2040_1000.tar.bz2#9e856f78d5c80d5a78f61e72d1d473a3 @@ -107,8 +106,9 @@ https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_openb https://conda.anaconda.org/conda-forge/linux-64/libllvm15-15.0.7-hadd5161_1.conda#17d91085ccf5934ce652cb448d0cb65a https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.0-hb75c966_0.conda#c648d19cd9c8625898d5d370414de7c7 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.0-h6adf6a1_2.conda#2e648a34072eb39d7c4fc2a9981c5f0c +https://conda.anaconda.org/conda-forge/linux-64/libudev1-253-h0b41bf4_1.conda#bb38b19a41bb94e8a19dbfb062d499c7 https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.5.0-h79f4944_1.conda#04a39cdd663f295653fc143851830563 -https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.32-hd7da12d_0.conda#b05d7ea8b76f1172d5fe4f30e03277ea +https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.32-hd7da12d_1.conda#a69fa6f218cfed8e2d61753eeacaf034 https://conda.anaconda.org/conda-forge/linux-64/nss-3.89-he45b914_0.conda#2745719a58eeaab6657256a3f142f099 https://conda.anaconda.org/conda-forge/linux-64/python-3.9.16-h2782a2a_0_cpython.conda#95c9b7c96a7fd7342e0c9d0a917b8f78 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.40.0-h4ff8645_0.tar.bz2#bb11803129cbbb53ed56f9506ff74145 @@ -134,7 +134,7 @@ https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.6-pyhd8ed1ab_0.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.17.1-py39hf3d152e_3.tar.bz2#3caf51fb6a259d377f05d6913193b11c https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.1-pyhd8ed1ab_0.conda#7312299d7a0ea4993159229b7d2dceb2 https://conda.anaconda.org/conda-forge/noarch/execnet-1.9.0-pyhd8ed1ab_0.tar.bz2#0e521f7a5e60d508b121d38b04874fb2 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.10.0-pyhd8ed1ab_0.conda#6f90f1dc834447823b11d155726fcb37 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.10.7-pyhd8ed1ab_0.conda#6a0601f92717ce555d79d83d693b6fa3 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.3.0-pyhd8ed1ab_1.conda#0db48a2f5a68e28e5af8d3df276f2255 https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h05c8ddd_0.conda#1a109126a43003d65b39c1cad656bc9b @@ -150,7 +150,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libclang13-15.0.7-default_h3e3d5 https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h36d4200_3.conda#c9f4416a34bc91e0eb029f912c68f81f https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.88.1-hdc1c0ab_1.conda#3d1189864d1c0ed2a5919cb067b5903d https://conda.anaconda.org/conda-forge/linux-64/libpq-15.2-hb675445_0.conda#4654b17eccaba55b8581d6b9c77f53cc -https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-252-h2a991cd_0.tar.bz2#3c5ae9f61f663b3d5e1bf7f7da0c85f5 +https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-253-h8c4010b_1.conda#9176b1e2cb8beca37a7510b0e801e38f https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.2.4-h1daa5a0_1.conda#77003f63d1763c1e6569a02c1742c9f4 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.2-py39h72bdee0_0.conda#35514f5320206df9f4661c138c02e1c1 @@ -166,7 +166,7 @@ https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py39h72bdee0_0.conda#18927f971926b7271600368de71de557 -https://conda.anaconda.org/conda-forge/noarch/pytz-2022.7.1-pyhd8ed1ab_0.conda#f59d49a7b464901cf714b9e7984d01a2 +https://conda.anaconda.org/conda-forge/noarch/pytz-2023.2-pyhd8ed1ab_0.conda#d74d285d6628e55752df22fc84910279 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py39hb9d737c_5.tar.bz2#ef9db3c38ae7275f6b14491cfe61a248 https://conda.anaconda.org/conda-forge/noarch/setuptools-67.6.0-pyhd8ed1ab_0.conda#e18ed61c37145bb9b48d1d98801960f7 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 @@ -190,7 +190,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.co https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.10-h7f98852_1003.tar.bz2#f59c1242cc1dd93e72c2ee2b360979eb https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf https://conda.anaconda.org/conda-forge/noarch/babel-2.12.1-pyhd8ed1ab_1.conda#ac432e732804a81ddcf29c92ead57cde -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.11.2-pyha770c72_0.conda#88b59f6989f0ed5ab3433af0b82555e1 +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.0-pyha770c72_0.conda#84f54c3bd1a542c8fe696bc8947b040b https://conda.anaconda.org/conda-forge/linux-64/cairo-1.16.0-ha61ee94_1014.tar.bz2#d1a88f3ed5b52e1024b80d4bcd26a7a0 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py39he91dace_3.conda#20080319ef73fbad74dcd6d62f2a3ffe https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py39h2ae25f5_1.tar.bz2#c943fb9a2818ecc5be1e0ecc8b7738f1 @@ -211,7 +211,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pillow-9.4.0-py39h2320bf1_1.cond https://conda.anaconda.org/conda-forge/noarch/pip-23.0.1-pyhd8ed1ab_0.conda#8025ca83b8ba5430b640b83917c2a6f7 https://conda.anaconda.org/conda-forge/noarch/pockets-0.9.1-py_0.tar.bz2#1b52f0c42e8077e5a33e00fe72269364 https://conda.anaconda.org/conda-forge/linux-64/proj-9.1.1-h8ffa02c_2.conda#c264aea0e16bba26afa0a0940e954492 -https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-16.1-ha8d29e2_1.conda#dbfc2a8d63a43a11acf4c704e1ef9d0c +https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-16.1-h5195f5e_3.conda#caeb3302ef1dc8b342b20c710a86f8a9 https://conda.anaconda.org/conda-forge/noarch/pygments-2.14.0-pyhd8ed1ab_0.conda#c78cd16b11cd6a295484bd6c8f24bea1 https://conda.anaconda.org/conda-forge/noarch/pytest-7.2.2-pyhd8ed1ab_0.conda#60958b19354e0ec295b43f6ab5cfab86 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 @@ -220,30 +220,33 @@ https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.4.1-py39h389d5f1_0. https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py39hf1c3bca_1.conda#ae6bfe65e81d9b59a71cc01a2858650f https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.7-py39h227be39_0.conda#7d9a35091552af3655151f164ddd64a3 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.5.0-hd8ed1ab_0.conda#b3c594fde1a80a1fc3eb9cc4a5dfe392 -https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.3-pyhd8ed1ab_0.conda#9838acb5f38ac58240741f5cea70a952 +https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda#46a2e6e3dfa718ce3492018d5a110dd6 https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py39hb9d737c_1005.tar.bz2#a639fdd9428d8b25f8326a3838d54045 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.1.1-py39h2ae25f5_2.tar.bz2#b3b4aab96d1c4ed394d6f4b9146699d4 -https://conda.anaconda.org/conda-forge/linux-64/cryptography-39.0.2-py39h079d5ae_0.conda#c492b565817a019f025c7d17b57ef479 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.3.1-pyhd8ed1ab_0.conda#0a3abdbff6e296d056ce01ee3529638d +https://conda.anaconda.org/conda-forge/linux-64/cryptography-40.0.1-py39h079d5ae_0.conda#8f55cf00f9d29606d8ea2387b459d188 https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.22.0-h25f0c4b_2.conda#461541cb1b387c2a28ab6217f3d38502 https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-6.0.0-h8e241bc_0.conda#448fe40d2fed88ccf4d9ded37cbb2b38 https://conda.anaconda.org/conda-forge/noarch/importlib-resources-5.12.0-pyhd8ed1ab_0.conda#3544c818f0720c89eb16ae6940ab440b +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.1.0-hd8ed1ab_0.conda#90bab1d97fdb6bb40c8e00207bf222dc https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.1-nompi_h261ec11_106.tar.bz2#9b25de670ce5753a33c18b1090d1d3bf https://conda.anaconda.org/conda-forge/linux-64/pandas-1.5.3-py39h2ad29b5_0.conda#3ea96adbbc2a66fa45178102a9cfbecc -https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.1.1-pyhd8ed1ab_0.conda#1d1a27f637808c76dd83e3f469aa6f7e +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.2.0-pyhd8ed1ab_0.conda#f10c2cf447ca96f12a326b83c75b8e33 +https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-daemon-16.1-ha8d29e2_3.conda#34d9d75ca896f5919c372a34e25f23ea https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.4.1-py39hf14cbfd_1.conda#67766c515601b3ee1514072d6fd060bb https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.11.0-py39h227be39_3.conda#9e381db00691e26bcf670c3586397be1 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.2.1-pyhd8ed1ab_0.conda#6fe4c2689d1b10fec1ee65819f0c4fd5 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-7.1.0-pyhd8ed1ab_0.conda#6613dbb3b25cc648a107f33ca9f80fc1 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-napoleon-0.7-py_0.tar.bz2#0bc25ff6f2e34af63ded59692df5f749 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py39hf939315_3.tar.bz2#0f11bcdf9669a5ae0f39efd8c830209a +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.3.2-pyhd8ed1ab_0.conda#a3552db3a43810551cc93f9a4272380e https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.22.0-h4243ec0_2.conda#0d0c6604c8ac4ad5e51efa7bb58da05c -https://conda.anaconda.org/conda-forge/noarch/identify-2.5.21-pyhd8ed1ab_0.conda#b5ada314668cded097e08fea86262317 +https://conda.anaconda.org/conda-forge/noarch/identify-2.5.22-pyhd8ed1ab_0.conda#b8d16e273396a0115199a83769a39246 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py39he190548_0.conda#f2a931db797bb58bd335f4a857b4c898 https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.0-nompi_he1eeb6f_102.conda#d9679b28fcc2154fa63e814c5acdce57 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.2-nompi_py39hfaa66c4_100.tar.bz2#b5f2db23900499e96f88e39199ffc7b8 https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-hd33c08f_0.conda#a8b9e35dd7be2c945b0de4fe19a7c3a9 -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.0.0-pyhd8ed1ab_0.conda#d41957700e83bbb925928764cb7f8878 +https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-16.1-hcb278e6_3.conda#8b452ab959166d91949af4c2d28f81db +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.1.0-pyhd8ed1ab_0.conda#3a5b9d88c369e7960e3dde3229066908 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.21.0-pyhd8ed1ab_0.conda#cb9a711f7c9f3074fe522e5a34481e60 https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.0-nompi_hdb2cfa9_4.conda#3e2e1d0cd06d1b64c9c2800c0eb0cde6 https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h90689f9_2.tar.bz2#957a0255ab58aaf394a91725d73ab422 @@ -257,7 +260,7 @@ https://conda.anaconda.org/conda-forge/linux-64/graphviz-7.1.0-h2e5815a_0.conda# https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.7-py39h5c7b992_3.conda#19e30314fe824605750da905febb8ee6 https://conda.anaconda.org/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_0.conda#11d178fc55199482ee48d6812ea83983 https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.7.1-py39hf3d152e_0.conda#682772fa385911fb5efffbce21b269c5 -https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyhd8ed1ab_0.conda#eb2e0fc33ad0d04b51f9280360c13c1e +https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 https://conda.anaconda.org/conda-forge/noarch/sphinx-4.5.0-pyh6c4a22f_0.tar.bz2#46b38d88c4270ff9ba78a89c83c66345 https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.13.1-pyhd8ed1ab_0.conda#258f38b9f3bfb323cf175b94d4a03c09 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.10.1-py39h7360e5f_0.conda#7584d1bc5499d25eccfd24a7f656e3ee From bcbcbc8470864e59ffef9b3707263dffeef9e02e Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Tue, 28 Mar 2023 00:44:58 +0100 Subject: [PATCH 32/85] Add unit tests for routine _fillvalue_report(). --- lib/iris/fileformats/netcdf/saver.py | 4 +- .../netcdf/saver/test__fillvalue_report.py | 121 ++++++++++++++++++ 2 files changed, 123 insertions(+), 2 deletions(-) create mode 100644 lib/iris/tests/unit/fileformats/netcdf/saver/test__fillvalue_report.py diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index 62e058a64e..ca280819da 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -322,8 +322,8 @@ def _fillvalue_report(fill_info, is_masked, contains_fill_value, warn=False): Parameters ---------- - fill_info : dict - A dictinonary containing the context of the fill-value check + fill_info : _FillvalueCheckInfo + A named-tuple containing the context of the fill-value check is_masked : bool whether the data arary was masked contains_fill_value : bool diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/test__fillvalue_report.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test__fillvalue_report.py new file mode 100644 index 0000000000..f850f8c29b --- /dev/null +++ b/lib/iris/tests/unit/fileformats/netcdf/saver/test__fillvalue_report.py @@ -0,0 +1,121 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. +""" +Unit tests for `iris.fileformats.netcdf.saver._data_fillvalue_check`. + +Repurposed from +`iris.tests.unit.fileformats.netcdf.test__FillValueMaskCheckAndStoreTarget.py`, +to show that the logic is basically the same. + +Now runs all testcases on both real + lazy data. + +""" + +import warnings + +import numpy as np +import pytest + +from iris.fileformats.netcdf._thread_safe_nc import default_fillvals +from iris.fileformats.netcdf.saver import ( + _fillvalue_report, + _FillvalueCheckInfo, +) + + +class Test__fillvaluereport: + @pytest.mark.parametrize( + "is_bytes", [True, False], ids=["is_bytes", "not_bytes"] + ) + @pytest.mark.parametrize( + "is_masked", [True, False], ids=["is_masked", "not_masked"] + ) + @pytest.mark.parametrize( + "contains_fv", [True, False], ids=["fv_in_data", "no_fv_in_data"] + ) + @pytest.mark.parametrize( + "given_user_fv", [True, False], ids=["user_fv_set", "no_user_fv"] + ) + def test_fillvalue_checking( + self, is_bytes, is_masked, contains_fv, given_user_fv + ): + dtype_code = "u1" if is_bytes else "f4" + dtype = np.dtype(dtype_code) + if given_user_fv: + user_fill = 123 if is_bytes else 1.234 + check_value = user_fill + else: + user_fill = None + check_value = default_fillvals[dtype_code] + + fill_info = _FillvalueCheckInfo( + user_value=user_fill, + check_value=check_value, + dtype=dtype, + varname="", + ) + + # Work out expected action, according to intended logic. + if is_bytes and is_masked and not given_user_fv: + msg_fragment = "'' contains byte data with masked points" + elif contains_fv: + msg_fragment = "'' contains unmasked data points equal to the fill-value" + else: + msg_fragment = None + + # Trial the action + result = _fillvalue_report( + fill_info, + is_masked=is_masked, + contains_fill_value=contains_fv, + warn=False, + ) + + # Check the result + if msg_fragment is None: + assert result is None + else: + assert isinstance(result, Warning) + assert msg_fragment in result.args[0] + + @pytest.mark.parametrize( + "has_collision", [True, False], ids=["with_collision", "no_collision"] + ) + def test_warn(self, has_collision): + fill_info = _FillvalueCheckInfo( + user_value=1.23, + check_value=1.23, + dtype=np.float32, + varname="", + ) + + # Check results + if has_collision: + # Check that we get the expected warning + expected_msg = "'' contains unmasked data points equal to the fill-value" + # Enter a warnings context that checks for the error. + warning_context = pytest.warns(match=expected_msg).__enter__() + else: + # Check that we get NO warning. + warnings.filterwarnings("error") + + # Do call: it should raise AND return a warning, ONLY IF there was a collision. + result = _fillvalue_report( + fill_info, + is_masked=True, + contains_fill_value=has_collision, + warn=True, + ) + + # Check result + if has_collision: + # Fail if no warning was raised .. + warning_context.__exit__(None, None, None) + # .. or result does not have the expected message content + assert expected_msg in result.args[0] + else: + # Fail if any warning result was produced. + assert result is None From 05c04a14874f1ae28611d7f17ecb5f860a563782 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Tue, 28 Mar 2023 00:46:25 +0100 Subject: [PATCH 33/85] Remove debug-only code. --- lib/iris/fileformats/netcdf/saver.py | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index ca280819da..76962f93fb 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -277,13 +277,6 @@ def _setncattr(variable, name, attribute): ) -def _PRINT_DEBUG(*args): - # _DO_DEBUG = True - _DO_DEBUG = False - if _DO_DEBUG: - print(*args) - - def _data_fillvalue_check(arraylib, data, check_value): """ Check whether an array is masked, and whether it contains a fill-value. @@ -343,7 +336,6 @@ def _fillvalue_report(fill_info, is_masked, contains_fill_value, warn=False): is_byte_data = fill_info.dtype.itemsize == 1 result = None if is_byte_data and is_masked and user_value is None: - _PRINT_DEBUG(f'Data check "{varname}" : masked byte warning') result = UserWarning( f"CF var '{varname}' contains byte data with masked points, but " "no fill_value keyword was given. As saved, these " @@ -353,7 +345,6 @@ def _fillvalue_report(fill_info, is_masked, contains_fill_value, warn=False): "keyword during saving, otherwise use ncedit/equivalent." ) elif contains_fill_value: - _PRINT_DEBUG(f'Data check "{varname}" : contains-fill warning') result = UserWarning( f"CF var '{varname}' contains unmasked data points equal to the " f"fill-value, {check_value}. As saved, these points will read back " @@ -362,8 +353,6 @@ def _fillvalue_report(fill_info, is_masked, contains_fill_value, warn=False): "points. For Cube data this can be done via the 'fill_value' " "keyword during saving, otherwise use ncedit/equivalent." ) - else: - _PRINT_DEBUG(f'Data check "{varname}" : all-values-ok') if warn and result is not None: warnings.warn(result) @@ -2406,11 +2395,8 @@ def store(data, cf_var, fill_value): is_masked, contains_fill_value = store( data, cf_var, fill_value_to_check ) - if doing_delayed_save: - _PRINT_DEBUG( - f'Data check "{fill_info.varname}" : NO CHECK YET (delayed)' - ) - else: + + if not doing_delayed_save: # Issue a fill-value warning immediately, if appropriate. _fillvalue_report( fill_info, is_masked, contains_fill_value, warn=True From 679ea47b199451c61329186513028773de4230e9 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Tue, 28 Mar 2023 12:21:07 +0100 Subject: [PATCH 34/85] Added tests for what the save function does with the 'compute' keyword. --- lib/iris/fileformats/netcdf/saver.py | 6 +- .../unit/fileformats/netcdf/test_save.py | 94 ++++++++++++++++++- 2 files changed, 92 insertions(+), 8 deletions(-) diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index 76962f93fb..5478f549d6 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -2437,9 +2437,9 @@ def delayed_completion(self) -> Delayed: # returns a list of any fill-value warnings. @dask.delayed def compute_and_return_warnings(store_op, fv_infos, fv_checks): - # Note: we don't actually *do* anything with the store_op, but - # including it here ensures that dask will compute it (thus performing - # all the delayed saves), before calling this function. + # Note: we don't actually *do* anything with the 'store_op' argument, + # but including it here ensures that dask will compute it (thus + # performing all the delayed saves), before calling this function. results = [] # Pair each fill_check result (is_masked, contains_value) with its # fillinfo and construct a suitable Warning if needed. diff --git a/lib/iris/tests/unit/fileformats/netcdf/test_save.py b/lib/iris/tests/unit/fileformats/netcdf/test_save.py index b274a8be0d..5164d12b78 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/test_save.py +++ b/lib/iris/tests/unit/fileformats/netcdf/test_save.py @@ -4,17 +4,13 @@ # See COPYING and COPYING.LESSER in the root of the repository for full # licensing details. """Unit tests for the `iris.fileformats.netcdf.save` function.""" - -# Import iris.tests first so that some things can be initialised before -# importing anything else. -import iris.tests as tests # isort:skip - from pathlib import Path from shutil import rmtree from tempfile import mkdtemp from unittest import mock import numpy as np +import pytest import iris from iris.coords import AuxCoord, DimCoord @@ -22,12 +18,17 @@ from iris.experimental.ugrid import PARSE_UGRID_ON_LOAD from iris.fileformats.netcdf import ( CF_CONVENTIONS_VERSION, + Saver, _thread_safe_nc, save, ) from iris.tests.stock import lat_lon_cube from iris.tests.stock.mesh import sample_mesh_cube +# Import iris.tests first so that some things can be initialised before +# importing anything else. +import iris.tests as tests # isort:skip + class Test_conventions(tests.IrisTest): def setUp(self): @@ -359,5 +360,88 @@ def test_connectivity_dim_varname_collision(self): self._check_save_and_reload([cube_1, cube_2]) +class Test_compute_usage: + """ + Test the operation of the save function 'compute' keyword. + + In actual use, this keyword controls 'delayed saving'. That is tested elsewhere, + in testing the 'Saver' class itself. + """ + + # A fixture to mock out Saver object creation in a 'save' call. + @staticmethod + @pytest.fixture + def mock_saver_creation(): + mock_saver = mock.MagicMock(spec=Saver, name="") + mock_saver.__enter__ = mock.Mock(return_value=mock_saver) + mock_new_saver_call = mock.Mock(return_value=mock_saver) + with mock.patch.object(Saver, "__new__", mock_new_saver_call): + yield mock_new_saver_call, mock_saver + + # A fixture to provide some mock args for 'Saver' creation. + @staticmethod + @pytest.fixture + def mock_saver_args(): + from collections import namedtuple + + args = namedtuple( + "saver_args", ["cube", "filename", "format", "compute"] + )( + cube=mock.Mock(spec=Cube, attributes={}), + filename=mock.sentinel.filepath, + format=mock.sentinel.netcdf4, + compute=mock.Mock(), + ) + return args + + def test_saver_creation(self, mock_saver_creation, mock_saver_args): + # Check that 'save' creates a Saver, passing the 'compute' keyword. + mock_saver_new, mock_saver = mock_saver_creation + args = mock_saver_args + save( + cube=[args.cube], + filename=args.filename, + netcdf_format=args.format, + compute=args.compute, + ) + # Check the Saver create call it made, in particular that the compute arg is + # passed in. + mock_saver_new.assert_called_once_with( + Saver, args.filename, args.format, compute=args.compute + ) + + def test_compute_true(self, mock_saver_creation, mock_saver_args): + # Check operation when compute=True. + mock_saver_new, mock_saver = mock_saver_creation + args = mock_saver_args + result = save( + cube=[args.cube], + filename=args.filename, + netcdf_format=args.format, + compute=True, + ) + # It should NOT have called 'delayed_completion' + assert mock_saver.delayed_completion.call_count == 0 + # Result should be None + assert result is None + + def test_compute_false_result_delayed( + self, mock_saver_creation, mock_saver_args + ): + # Check operation when compute=False. + mock_saver_new, mock_saver = mock_saver_creation + args = mock_saver_args + result = save( + cube=[args.cube], + filename=args.filename, + netcdf_format=args.format, + compute=False, + ) + # It should have called 'delayed_completion' .. + assert mock_saver.delayed_completion.call_count == 1 + # .. and should return the result of that. + assert result is mock_saver.delayed_completion.return_value + + if __name__ == "__main__": tests.main() From 70ec9dda4931f9e0aa0a0b745724b689c4e7712e Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Tue, 28 Mar 2023 15:36:52 +0100 Subject: [PATCH 35/85] Fix mock-specific problems, small tidy. --- .../unit/fileformats/netcdf/test_save.py | 32 ++++++++++++++----- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/lib/iris/tests/unit/fileformats/netcdf/test_save.py b/lib/iris/tests/unit/fileformats/netcdf/test_save.py index 5164d12b78..4885f096b1 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/test_save.py +++ b/lib/iris/tests/unit/fileformats/netcdf/test_save.py @@ -372,10 +372,24 @@ class Test_compute_usage: @staticmethod @pytest.fixture def mock_saver_creation(): - mock_saver = mock.MagicMock(spec=Saver, name="") + # A mock for a Saver object. + mock_saver = mock.MagicMock(spec=Saver) + # make an __enter__ call return the object itself (as the real Saver does). mock_saver.__enter__ = mock.Mock(return_value=mock_saver) + # A mock for the Saver() constructor call. mock_new_saver_call = mock.Mock(return_value=mock_saver) - with mock.patch.object(Saver, "__new__", mock_new_saver_call): + + # Replace the whole Saver class with a simple function, which thereby emulates + # the constructor call. This avoids complications due to the fact that Mock + # patching does not work in the usual way for __init__ and __new__ methods. + def mock_saver_class_create(*args, **kwargs): + return mock_new_saver_call(*args, **kwargs) + + # Patch the Saver() creation to return our mock Saver object. + with mock.patch( + "iris.fileformats.netcdf.saver.Saver", mock_saver_class_create + ): + # Return mocks for both constructor call, and Saver object. yield mock_new_saver_call, mock_saver # A fixture to provide some mock args for 'Saver' creation. @@ -384,13 +398,15 @@ def mock_saver_creation(): def mock_saver_args(): from collections import namedtuple + # A special object for the cube, since cube.attributes must be indexable + mock_cube = mock.MagicMock() args = namedtuple( "saver_args", ["cube", "filename", "format", "compute"] )( - cube=mock.Mock(spec=Cube, attributes={}), + cube=mock_cube, filename=mock.sentinel.filepath, format=mock.sentinel.netcdf4, - compute=mock.Mock(), + compute=mock.sentinel.compute, ) return args @@ -399,7 +415,7 @@ def test_saver_creation(self, mock_saver_creation, mock_saver_args): mock_saver_new, mock_saver = mock_saver_creation args = mock_saver_args save( - cube=[args.cube], + cube=args.cube, filename=args.filename, netcdf_format=args.format, compute=args.compute, @@ -407,7 +423,7 @@ def test_saver_creation(self, mock_saver_creation, mock_saver_args): # Check the Saver create call it made, in particular that the compute arg is # passed in. mock_saver_new.assert_called_once_with( - Saver, args.filename, args.format, compute=args.compute + args.filename, args.format, compute=args.compute ) def test_compute_true(self, mock_saver_creation, mock_saver_args): @@ -415,7 +431,7 @@ def test_compute_true(self, mock_saver_creation, mock_saver_args): mock_saver_new, mock_saver = mock_saver_creation args = mock_saver_args result = save( - cube=[args.cube], + cube=args.cube, filename=args.filename, netcdf_format=args.format, compute=True, @@ -432,7 +448,7 @@ def test_compute_false_result_delayed( mock_saver_new, mock_saver = mock_saver_creation args = mock_saver_args result = save( - cube=[args.cube], + cube=args.cube, filename=args.filename, netcdf_format=args.format, compute=False, From 28a4674632e04bf5be1cdc902bd7b02fc1dadabb Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 29 Mar 2023 12:48:44 +0100 Subject: [PATCH 36/85] Restructure hierarchy of tests.unit.fileformats.netcdf --- .../netcdf/saver/{ => saver}/Saver/write/endian.cdl | 0 .../netcdf/saver/{ => saver}/Saver/write/mercator.cdl | 0 .../saver/{ => saver}/Saver/write/mercator_no_ellipsoid.cdl | 0 .../netcdf/saver/{ => saver}/Saver/write/stereographic.cdl | 0 .../{ => saver}/Saver/write/stereographic_no_ellipsoid.cdl | 0 .../{ => saver}/Saver/write/stereographic_scale_factor.cdl | 0 .../saver/{ => saver}/Saver/write/transverse_mercator.cdl | 0 .../Saver/write/transverse_mercator_no_ellipsoid.cdl | 0 .../saver/{ => saver}/Saver/write/with_climatology.cdl | 0 .../Saver__ugrid/TestSaveUgrid__cube/basic_mesh.cdl | 0 .../unit/fileformats/netcdf/{ => loader}/test_load_cubes.py | 3 ++- .../tests/unit/fileformats/netcdf/saver/saver/__init__.py | 6 ++++++ .../unit/fileformats/netcdf/saver/{ => saver}/test_Saver.py | 0 .../netcdf/saver/{ => saver}/test_Saver__lazy.py | 2 +- .../netcdf/saver/{ => saver}/test_Saver__ugrid.py | 0 .../tests/unit/fileformats/netcdf/{ => saver}/test_save.py | 0 16 files changed, 9 insertions(+), 2 deletions(-) rename lib/iris/tests/results/unit/fileformats/netcdf/saver/{ => saver}/Saver/write/endian.cdl (100%) rename lib/iris/tests/results/unit/fileformats/netcdf/saver/{ => saver}/Saver/write/mercator.cdl (100%) rename lib/iris/tests/results/unit/fileformats/netcdf/saver/{ => saver}/Saver/write/mercator_no_ellipsoid.cdl (100%) rename lib/iris/tests/results/unit/fileformats/netcdf/saver/{ => saver}/Saver/write/stereographic.cdl (100%) rename lib/iris/tests/results/unit/fileformats/netcdf/saver/{ => saver}/Saver/write/stereographic_no_ellipsoid.cdl (100%) rename lib/iris/tests/results/unit/fileformats/netcdf/saver/{ => saver}/Saver/write/stereographic_scale_factor.cdl (100%) rename lib/iris/tests/results/unit/fileformats/netcdf/saver/{ => saver}/Saver/write/transverse_mercator.cdl (100%) rename lib/iris/tests/results/unit/fileformats/netcdf/saver/{ => saver}/Saver/write/transverse_mercator_no_ellipsoid.cdl (100%) rename lib/iris/tests/results/unit/fileformats/netcdf/saver/{ => saver}/Saver/write/with_climatology.cdl (100%) rename lib/iris/tests/results/unit/fileformats/netcdf/saver/{ => saver}/Saver__ugrid/TestSaveUgrid__cube/basic_mesh.cdl (100%) rename lib/iris/tests/unit/fileformats/netcdf/{ => loader}/test_load_cubes.py (99%) create mode 100644 lib/iris/tests/unit/fileformats/netcdf/saver/saver/__init__.py rename lib/iris/tests/unit/fileformats/netcdf/saver/{ => saver}/test_Saver.py (100%) rename lib/iris/tests/unit/fileformats/netcdf/saver/{ => saver}/test_Saver__lazy.py (98%) rename lib/iris/tests/unit/fileformats/netcdf/saver/{ => saver}/test_Saver__ugrid.py (100%) rename lib/iris/tests/unit/fileformats/netcdf/{ => saver}/test_save.py (100%) diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/endian.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/endian.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/endian.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/endian.cdl diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/mercator.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/mercator.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/mercator.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/mercator.cdl diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/mercator_no_ellipsoid.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/mercator_no_ellipsoid.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/mercator_no_ellipsoid.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/mercator_no_ellipsoid.cdl diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/stereographic.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/stereographic.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/stereographic.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/stereographic.cdl diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/stereographic_no_ellipsoid.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/stereographic_no_ellipsoid.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/stereographic_no_ellipsoid.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/stereographic_no_ellipsoid.cdl diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/stereographic_scale_factor.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/stereographic_scale_factor.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/stereographic_scale_factor.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/stereographic_scale_factor.cdl diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/transverse_mercator.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/transverse_mercator.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/transverse_mercator.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/transverse_mercator.cdl diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/transverse_mercator_no_ellipsoid.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/transverse_mercator_no_ellipsoid.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/transverse_mercator_no_ellipsoid.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/transverse_mercator_no_ellipsoid.cdl diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/with_climatology.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/with_climatology.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/with_climatology.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/with_climatology.cdl diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver__ugrid/TestSaveUgrid__cube/basic_mesh.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver__ugrid/TestSaveUgrid__cube/basic_mesh.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver__ugrid/TestSaveUgrid__cube/basic_mesh.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver__ugrid/TestSaveUgrid__cube/basic_mesh.cdl diff --git a/lib/iris/tests/unit/fileformats/netcdf/test_load_cubes.py b/lib/iris/tests/unit/fileformats/netcdf/loader/test_load_cubes.py similarity index 99% rename from lib/iris/tests/unit/fileformats/netcdf/test_load_cubes.py rename to lib/iris/tests/unit/fileformats/netcdf/loader/test_load_cubes.py index 39992d03a0..1a2ef1d29d 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/test_load_cubes.py +++ b/lib/iris/tests/unit/fileformats/netcdf/loader/test_load_cubes.py @@ -25,7 +25,8 @@ from iris.coords import AncillaryVariable, CellMeasure from iris.experimental.ugrid.load import PARSE_UGRID_ON_LOAD from iris.experimental.ugrid.mesh import MeshCoord -from iris.fileformats.netcdf import load_cubes, logger +from iris.fileformats.netcdf import logger +from iris.fileformats.netcdf.loader import load_cubes from iris.tests.stock.netcdf import ncgen_from_cdl diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/saver/__init__.py b/lib/iris/tests/unit/fileformats/netcdf/saver/saver/__init__.py new file mode 100644 index 0000000000..ab53ddadda --- /dev/null +++ b/lib/iris/tests/unit/fileformats/netcdf/saver/saver/__init__.py @@ -0,0 +1,6 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. +"""Unit tests for the :class:`iris.fileformats.netcdf.saver.Saver` class.""" diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver.py b/lib/iris/tests/unit/fileformats/netcdf/saver/saver/test_Saver.py similarity index 100% rename from lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver.py rename to lib/iris/tests/unit/fileformats/netcdf/saver/saver/test_Saver.py diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy.py b/lib/iris/tests/unit/fileformats/netcdf/saver/saver/test_Saver__lazy.py similarity index 98% rename from lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy.py rename to lib/iris/tests/unit/fileformats/netcdf/saver/saver/test_Saver__lazy.py index e1211dc276..fe70b38fea 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy.py +++ b/lib/iris/tests/unit/fileformats/netcdf/saver/saver/test_Saver__lazy.py @@ -14,7 +14,7 @@ from iris.coords import AuxCoord from iris.fileformats.netcdf import Saver from iris.tests import stock -from iris.tests.unit.fileformats.netcdf.saver import test_Saver +from iris.tests.unit.fileformats.netcdf.saver.saver import test_Saver class LazyMixin(tests.IrisTest): diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__ugrid.py b/lib/iris/tests/unit/fileformats/netcdf/saver/saver/test_Saver__ugrid.py similarity index 100% rename from lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__ugrid.py rename to lib/iris/tests/unit/fileformats/netcdf/saver/saver/test_Saver__ugrid.py diff --git a/lib/iris/tests/unit/fileformats/netcdf/test_save.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test_save.py similarity index 100% rename from lib/iris/tests/unit/fileformats/netcdf/test_save.py rename to lib/iris/tests/unit/fileformats/netcdf/saver/test_save.py From 67f4b2b0d6399362ea7175c7f048e6b728965f60 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 29 Mar 2023 14:02:30 +0100 Subject: [PATCH 37/85] Tidy test docstrings. --- .../tests/unit/fileformats/netcdf/saver/saver/test_Saver.py | 2 +- .../fileformats/netcdf/saver/test__data_fillvalue_check.py | 2 +- .../unit/fileformats/netcdf/saver/test__fillvalue_report.py | 3 +-- lib/iris/tests/unit/fileformats/netcdf/saver/test_save.py | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/saver/test_Saver.py b/lib/iris/tests/unit/fileformats/netcdf/saver/saver/test_Saver.py index b5f41d8820..e2ae188eb0 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/saver/saver/test_Saver.py +++ b/lib/iris/tests/unit/fileformats/netcdf/saver/saver/test_Saver.py @@ -3,7 +3,7 @@ # This file is part of Iris and is released under the LGPL license. # See COPYING and COPYING.LESSER in the root of the repository for full # licensing details. -"""Unit tests for the `iris.fileformats.netcdf.Saver` class.""" +"""Unit tests for the :class:`iris.fileformats.netcdf.Saver` class.""" # Import iris.tests first so that some things can be initialised before # importing anything else. diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/test__data_fillvalue_check.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test__data_fillvalue_check.py index b691a5d492..39af800535 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/saver/test__data_fillvalue_check.py +++ b/lib/iris/tests/unit/fileformats/netcdf/saver/test__data_fillvalue_check.py @@ -4,7 +4,7 @@ # See COPYING and COPYING.LESSER in the root of the repository for full # licensing details. """ -Unit tests for `iris.fileformats.netcdf.saver._data_fillvalue_check`. +Unit tests for :func:`iris.fileformats.netcdf.saver._data_fillvalue_check`. Repurposed from `iris.tests.unit.fileformats.netcdf.test__FillValueMaskCheckAndStoreTarget.py`, diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/test__fillvalue_report.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test__fillvalue_report.py index f850f8c29b..ce0b9c6390 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/saver/test__fillvalue_report.py +++ b/lib/iris/tests/unit/fileformats/netcdf/saver/test__fillvalue_report.py @@ -4,7 +4,7 @@ # See COPYING and COPYING.LESSER in the root of the repository for full # licensing details. """ -Unit tests for `iris.fileformats.netcdf.saver._data_fillvalue_check`. +Unit tests for :func:`iris.fileformats.netcdf.saver._data_fillvalue_check`. Repurposed from `iris.tests.unit.fileformats.netcdf.test__FillValueMaskCheckAndStoreTarget.py`, @@ -13,7 +13,6 @@ Now runs all testcases on both real + lazy data. """ - import warnings import numpy as np diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/test_save.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test_save.py index 4885f096b1..284ec9ad97 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/saver/test_save.py +++ b/lib/iris/tests/unit/fileformats/netcdf/saver/test_save.py @@ -3,7 +3,7 @@ # This file is part of Iris and is released under the LGPL license. # See COPYING and COPYING.LESSER in the root of the repository for full # licensing details. -"""Unit tests for the `iris.fileformats.netcdf.save` function.""" +"""Unit tests for the :func:`iris.fileformats.netcdf.save` function.""" from pathlib import Path from shutil import rmtree from tempfile import mkdtemp From ebec72f49752104df9c72ce36dbb715681b1e722 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 29 Mar 2023 14:06:43 +0100 Subject: [PATCH 38/85] Correct test import. --- lib/iris/tests/integration/netcdf/test_coord_systems.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/iris/tests/integration/netcdf/test_coord_systems.py b/lib/iris/tests/integration/netcdf/test_coord_systems.py index 8576f5ffe8..3175664b4c 100644 --- a/lib/iris/tests/integration/netcdf/test_coord_systems.py +++ b/lib/iris/tests/integration/netcdf/test_coord_systems.py @@ -18,7 +18,7 @@ from iris.cube import Cube from iris.tests import stock as stock from iris.tests.stock.netcdf import ncgen_from_cdl -from iris.tests.unit.fileformats.netcdf import test_load_cubes as tlc +from iris.tests.unit.fileformats.netcdf.loader import test_load_cubes as tlc @tests.skip_data From 1f5b904424a835aca69c0153f2230a1981290401 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 29 Mar 2023 13:24:53 +0100 Subject: [PATCH 39/85] Avoid incorrect checking of byte data, and a numpy deprecation warning. --- lib/iris/fileformats/netcdf/saver.py | 6 ++++++ .../tests/unit/fileformats/netcdf/saver/saver/test_Saver.py | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index 5478f549d6..2af91a05fc 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -2355,6 +2355,12 @@ def _lazy_stream_data(self, data, fill_value, fill_warn, cf_var): fill_value_to_check = _thread_safe_nc.default_fillvals[ dtype.str[1:] ] + # Cast the check-value to the correct dtype. + # NOTE: In the case of 'S1' dtype (at least), the default (Python) value + # does not have a compatible type. This causes a deprecation warning at + # numpy 1.24, *and* was preventing correct fill-value checking of character + # data, since they are actually bytes (dtype 'S1'). + fill_value_to_check = np.array(fill_value_to_check, dtype=dtype) else: # A None means we will NOT check for collisions. fill_value_to_check = None diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/saver/test_Saver.py b/lib/iris/tests/unit/fileformats/netcdf/saver/saver/test_Saver.py index e2ae188eb0..3330c700f0 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/saver/saver/test_Saver.py +++ b/lib/iris/tests/unit/fileformats/netcdf/saver/saver/test_Saver.py @@ -205,6 +205,10 @@ def test_zlib(self): api = self.patch("iris.fileformats.netcdf.saver._thread_safe_nc") # Define mocked default fill values to prevent deprecation warning (#4374). api.default_fillvals = collections.defaultdict(lambda: -99.0) + # Mock the apparent dtype of mocked variables, to avoid an error. + ref = api.DatasetWrapper.return_value + ref = ref.createVariable.return_value + ref.dtype = np.dtype(np.float32) # NOTE: use compute=False as otherwise it gets in a pickle trying to construct # a fill-value report on a non-compliant variable in a non-file (!) with Saver("/dummy/path", "NETCDF4", compute=False) as saver: From 5045c9ff862d2a571b1369602b660d67cfe8fe51 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 29 Mar 2023 17:50:20 +0100 Subject: [PATCH 40/85] Alter parameter names to make test reports clearer. --- .../netcdf/saver/test__fillvalue_report.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/test__fillvalue_report.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test__fillvalue_report.py index ce0b9c6390..035f6ca80f 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/saver/test__fillvalue_report.py +++ b/lib/iris/tests/unit/fileformats/netcdf/saver/test__fillvalue_report.py @@ -27,16 +27,16 @@ class Test__fillvaluereport: @pytest.mark.parametrize( - "is_bytes", [True, False], ids=["is_bytes", "not_bytes"] + "is_bytes", [True, False], ids=["ByteData", "NonbyteData"] ) @pytest.mark.parametrize( - "is_masked", [True, False], ids=["is_masked", "not_masked"] + "is_masked", [True, False], ids=["MaskedData", "NonmaskedData"] ) @pytest.mark.parametrize( - "contains_fv", [True, False], ids=["fv_in_data", "no_fv_in_data"] + "contains_fv", [True, False], ids=["FillInData", "NofillInData"] ) @pytest.mark.parametrize( - "given_user_fv", [True, False], ids=["user_fv_set", "no_user_fv"] + "given_user_fv", [True, False], ids=["WithUserfill", "NoUserfill"] ) def test_fillvalue_checking( self, is_bytes, is_masked, contains_fv, given_user_fv @@ -81,7 +81,9 @@ def test_fillvalue_checking( assert msg_fragment in result.args[0] @pytest.mark.parametrize( - "has_collision", [True, False], ids=["with_collision", "no_collision"] + "has_collision", + [True, False], + ids=["WithFvCollision", "NoFvCollision"], ) def test_warn(self, has_collision): fill_info = _FillvalueCheckInfo( From 393407a4abcd1a86f07c686c1a117e74d0313a6d Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 29 Mar 2023 17:52:47 +0100 Subject: [PATCH 41/85] Test basic behaviour of _lazy_stream_data; make 'Saver._delayed_writes' private. --- lib/iris/fileformats/netcdf/saver.py | 8 +- .../saver/saver/test__lazy_stream_data.py | 132 ++++++++++++++++++ 2 files changed, 136 insertions(+), 4 deletions(-) create mode 100644 lib/iris/tests/unit/fileformats/netcdf/saver/saver/test__lazy_stream_data.py diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index 2af91a05fc..d5431b00ab 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -425,7 +425,7 @@ def __init__(self, filename, netcdf_format, compute=True): #: Target filepath self.filepath = os.path.abspath(filename) #: A list of delayed writes for lazy saving - self.delayed_writes = ( + self._delayed_writes = ( [] ) # a list of triples (source, target, fill-info) #: Whether to complete delayed saves on exit (and raise associated warnings). @@ -2384,7 +2384,7 @@ def store(data, cf_var, fill_value): self.filepath, cf_var, self.file_write_lock ) # Add to the list of delayed writes, used in delayed_completion(). - self.delayed_writes.append((data, write_wrapper, fill_info)) + self._delayed_writes.append((data, write_wrapper, fill_info)) # In this case, fill-value checking is done later. But return 2 dummy # values, to be consistent with the non-streamed "store" signature. is_masked, contains_value = False, False @@ -2427,9 +2427,9 @@ def delayed_completion(self) -> Delayed: The dataset *must* be closed (saver has exited its context) before the result can be computed, otherwise computation will hang (never return). """ - if self.delayed_writes: + if self._delayed_writes: # Create a single delayed da.store operation to complete the file. - sources, targets, fill_infos = zip(*self.delayed_writes) + sources, targets, fill_infos = zip(*self._delayed_writes) store_op = da.store(sources, targets, compute=False, lock=False) # Construct a delayed fill-check operation for each (lazy) source array. diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/saver/test__lazy_stream_data.py b/lib/iris/tests/unit/fileformats/netcdf/saver/saver/test__lazy_stream_data.py new file mode 100644 index 0000000000..ca71755ff1 --- /dev/null +++ b/lib/iris/tests/unit/fileformats/netcdf/saver/saver/test__lazy_stream_data.py @@ -0,0 +1,132 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. +""" +Unit tests for :meth:`iris.fileformats.netcdf.saver.Saver._lazy_stream_data`. + +The behaviour of this method is complex, and this only tests certain aspects. +The testing of the dask delayed operations and file writing are instead covered by +integration tests. + +""" +from unittest import mock +import warnings + +import dask.array as da +import numpy as np +import pytest + +import iris.fileformats.netcdf._thread_safe_nc as nc_threadsafe +from iris.fileformats.netcdf.saver import Saver, _FillvalueCheckInfo + + +class Test__lazy_stream_data: + @staticmethod + @pytest.fixture(autouse=True) + def saver_patch(): + # Install patches, so we can creata a Saver without opening a real output file. + # Mock just enough of Dataset behaviour to allow a 'Saver.complete()' call. + mock_dataset = mock.MagicMock(_isopen=False) + mock_dataset_class = mock.Mock(return_value=mock_dataset) + # Mock the wrapper within the netcdf saver + target1 = ( + "iris.fileformats.netcdf.saver._thread_safe_nc.DatasetWrapper" + ) + # Mock the real netCDF4 dataset within the threadsafe-nc module, as this is + # used by NetCDFDataProxy and NetCDFWriteProxy. + target2 = "iris.fileformats.netcdf._thread_safe_nc.netCDF4.Dataset" + with mock.patch(target1, mock_dataset_class): + with mock.patch(target2, mock_dataset_class): + yield + + # A fixture to parametrise tests over delayed and non-delayed Saver type. + # NOTE: this only affects the saver context-exit, which we do not test here, so + # should make ***no difference to any of these tests***. + @staticmethod + @pytest.fixture(params=[False, True], ids=["nocompute", "compute"]) + def compute(request) -> bool: + yield request.param + + # A fixture to parametrise tests over real and lazy-type data. + @staticmethod + @pytest.fixture(params=[False, True], ids=["realdata", "lazydata"]) + def data_is_lazy(request) -> bool: + yield request.param + + @staticmethod + def saver(compute) -> Saver: + # Create a test Saver object + return Saver( + filename="", netcdf_format="NETCDF4", compute=compute + ) + + @staticmethod + def mock_var(shape, dtype=np.float32): + # Create a test cf_var object + return mock.MagicMock(shape=tuple(shape), dtype=np.dtype(dtype)) + + def test_data_save(self, compute, data_is_lazy): + """Real data is transferred immediately, lazy data creates a delayed write.""" + saver = self.saver(compute=compute) + data = np.arange(5.0) + if data_is_lazy: + data = da.from_array(data) + fill_value = -1.0 # not occurring in data + cf_var = self.mock_var(data.shape) + saver._lazy_stream_data( + data=data, fill_value=fill_value, fill_warn=True, cf_var=cf_var + ) + assert cf_var.__setitem__.call_count == (0 if data_is_lazy else 1) + assert len(saver._delayed_writes) == (1 if data_is_lazy else 0) + if data_is_lazy: + result_data, result__write, fill_info = saver._delayed_writes[0] + assert result_data is data + assert isinstance(result__write, nc_threadsafe.NetCDFWriteProxy) + assert isinstance(fill_info, _FillvalueCheckInfo) + else: + cf_var.__setitem__.assert_called_once_with(slice(None), data) + + def test_warnings(self, compute, data_is_lazy): + """ + For real data, fill-value warnings are issued immediately. For lazy data, + warnings are returned from computing a delayed completion. + + N.B. The 'compute' keyword has **no effect** on this : It only causes delayed + writes to be automatically actioned on exiting a Saver context. + Streaming *always* creates delayed writes for lazy data, since this is required + to make dask distributed operation work. + """ + saver = self.saver(compute=compute) + data = np.arange(5.0) + if data_is_lazy: + data = da.from_array(data) + fill_value = 2.0 # IS occurring in data + cf_var = self.mock_var(data.shape) + + # Do initial save. When compute=True, this issues warnigns + with warnings.catch_warnings(record=True) as logged_warnings: + saver._lazy_stream_data( + data=data, fill_value=fill_value, fill_warn=True, cf_var=cf_var + ) + + issued_warnings = [log.message for log in logged_warnings] + + n_expected_warnings = 0 if data_is_lazy else 1 + assert len(issued_warnings) == n_expected_warnings + + # Complete the write : any delayed warnings should be *returned*. + # NOTE: + # (1) this still works when there are no delayed writes. + # (2) the Saver 'compute' keyword makes no difference to this usage, as it + # *only* affects what happens when the saver context exits. + result2 = saver.delayed_completion().compute() + issued_warnings += list(result2) + + # Either way, a suitable warning should have been produced. + assert len(issued_warnings) == 1 + warning = issued_warnings[0] + msg = "contains unmasked data points equal to the fill-value, 2.0" + assert isinstance(warning, UserWarning) + assert msg in warning.args[0] From 518360bac192dc11310decbfe3cbcfcfc850096f Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 30 Mar 2023 12:17:04 +0100 Subject: [PATCH 42/85] Add integration tests, and distributed dependency. --- .../integration/netcdf/test_delayed_save.py | 258 ++++++++++++++++++ requirements/locks/py310-linux-64.lock | 31 ++- requirements/locks/py38-linux-64.lock | 29 +- requirements/locks/py39-linux-64.lock | 31 ++- requirements/py310.yml | 1 + requirements/py38.yml | 1 + requirements/py39.yml | 1 + 7 files changed, 317 insertions(+), 35 deletions(-) create mode 100644 lib/iris/tests/integration/netcdf/test_delayed_save.py diff --git a/lib/iris/tests/integration/netcdf/test_delayed_save.py b/lib/iris/tests/integration/netcdf/test_delayed_save.py new file mode 100644 index 0000000000..e6352b7e62 --- /dev/null +++ b/lib/iris/tests/integration/netcdf/test_delayed_save.py @@ -0,0 +1,258 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. +""" +Integration tests for delayed saving. +""" +import warnings + +from cf_units import Unit +import dask.array as da +import dask.config +from dask.delayed import Delayed +import distributed +import numpy as np +import pytest + +import iris +from iris.fileformats.netcdf._thread_safe_nc import default_fillvals +import iris.tests +from iris.tests.stock import realistic_4d + + +class Test__lazy_stream_data: + @pytest.fixture(autouse=True, scope="module") + def output_path(self, tmp_path_factory): + tmpdir = tmp_path_factory.mktemp("save_testfiles") + self.temp_output_filepath = tmpdir / "tmp.nc" + yield self.temp_output_filepath + + @staticmethod + @pytest.fixture(params=[False, True], ids=["SaveImmediate", "SaveDelayed"]) + def save_is_delayed(request): + return request.param + + @staticmethod + def make_testcube( + include_lazy_content=True, + ensure_fillvalue_collision=False, + data_is_maskedbytes=False, + ): + cube = realistic_4d() + + def fix_array(array): + """ + Make a new, custom array to replace the provided cube/coord data. + Optionally provide default-fill-value collisions, and/or replace with lazy + content. + """ + if array is not None: + if data_is_maskedbytes: + dmin, dmax = 0, 255 + else: + dmin, dmax = array.min(), array.max() + array = np.random.uniform(dmin, dmax, size=array.shape) + + if data_is_maskedbytes: + array = array.astype("u1") + array = np.ma.masked_array(array) + # To trigger, it must also have at least one *masked point*. + array[tuple([0] * array.ndim)] = np.ma.masked + + if ensure_fillvalue_collision: + # Set point at midpoint index = default-fill-value + fill_value = default_fillvals[array.dtype.str[1:]] + inds = tuple(dim // 2 for dim in array.shape) + array[inds] = fill_value + + if include_lazy_content: + # Make the array lazy. + # Ensure we always have multiple chunks (relatively small ones). + chunks = list(array.shape) + chunks[0] = 1 + array = da.from_array(array, chunks=chunks) + + return array + + # Replace the cube data, and one aux-coord, according to the control settings. + cube.data = fix_array(cube.data) + auxcoord = cube.coord("surface_altitude") + auxcoord.points = fix_array(auxcoord.points) + return cube + + def test_realfile_loadsave_equivalence(self, save_is_delayed, output_path): + input_filepath = iris.tests.get_data_path( + ["NetCDF", "global", "xyz_t", "GEMS_CO2_Apr2006.nc"] + ) + original_cubes = iris.load(input_filepath) + + # Pre-empt some standard changes that an iris save will impose. + for cube in original_cubes: + if cube.units == Unit("-"): + # replace 'unknown unit' with 'no unit'. + cube.units = Unit("?") + # Fix conventions attribute to what iris.save outputs. + cube.attributes["Conventions"] = "CF-1.7" + + original_cubes = sorted(original_cubes, key=lambda cube: cube.name()) + result = iris.save( + original_cubes, output_path, compute=not save_is_delayed + ) + if save_is_delayed: + # In this case, must also "complete" the save. + result.compute() + reloaded_cubes = iris.load(output_path) + reloaded_cubes = sorted(reloaded_cubes, key=lambda cube: cube.name()) + assert reloaded_cubes == original_cubes + # NOTE: it might be nicer to do assertCDL, but I', not sure how to access that + # from pytest-style test code ? + + @staticmethod + def getmask(cube_or_coord): + cube_or_coord = cube_or_coord.copy() # avoid realising the original + if hasattr(cube_or_coord, "points"): + data = cube_or_coord.points + else: + data = cube_or_coord.data + return np.ma.getmaskarray(data) + + def test_time_of_writing(self, save_is_delayed, output_path): + # Check when lazy data is actually written : + # - in 'immediate' mode, on initial file write + # - in 'delayed' mode, only when delayed-write is executed. + original_cube = self.make_testcube() + assert original_cube.has_lazy_data() + + result = iris.save( + original_cube, output_path, compute=not save_is_delayed + ) + assert save_is_delayed == (result is not None) + + # Read back : NOTE must sidestep the separate surface-altitude cube. + readback_cube = iris.load_cube( + output_path, "air_potential_temperature" + ) + assert readback_cube.has_lazy_data() + + # If 'delayed', the lazy content should all be masked, otherwise none of it. + data_mask = self.getmask(readback_cube) + coord_mask = self.getmask(readback_cube.coord("surface_altitude")) + if save_is_delayed: + assert np.all(data_mask) + assert np.all(coord_mask) + else: + assert np.all(~data_mask) + assert np.all(~coord_mask) + + if save_is_delayed: + result.compute() + # Re-fetch the arrays. The data is **no longer masked**. + data_mask = self.getmask(readback_cube) + coord_mask = self.getmask(readback_cube.coord("surface_altitude")) + assert np.all(~data_mask) + assert np.all(~coord_mask) + + @pytest.mark.parametrize( + "warning_type", ["WarnMaskedBytes", "WarnFillvalueCollision"] + ) + def test_fill_warnings(self, warning_type, output_path, save_is_delayed): + # Test collision warnings for data with fill-value collisions, or for masked + # byte data. + if warning_type == "WarnFillvalueCollision": + make_fv_collide = True + make_maskedbytes = False + expected_msg = ( + "contains unmasked data points equal to the fill-value" + ) + else: + # warning_type == 'WarnMaskedBytes' + make_fv_collide = False + make_maskedbytes = True + expected_msg = "contains byte data with masked points" + + cube = self.make_testcube( + include_lazy_content=True, + ensure_fillvalue_collision=make_fv_collide, + data_is_maskedbytes=make_maskedbytes, + ) + with warnings.catch_warnings(record=True) as logged_warnings: + result = iris.save(cube, output_path, compute=not save_is_delayed) + + if not save_is_delayed: + result_warnings = [log.message for log in logged_warnings] + else: + assert len(logged_warnings) == 0 + # Complete the operation now + # NOTE: warnings should not be *issued* here, instead they are returned. + warnings.simplefilter("error") + result_warnings = result.compute() + + # Either way, we should now have 2 similar warnings. + assert len(result_warnings) == 2 + assert all( + expected_msg in warning.args[0] for warning in result_warnings + ) + + def test_no_delayed_writes(self, output_path): + # Just check that a delayed save returns a usable 'delayed' object, even when + # there is no lazy content = no delayed writes to perform. + cube = self.make_testcube(include_lazy_content=False) + warnings.simplefilter("error") + result = iris.save(cube, output_path, compute=False) + assert isinstance(result, Delayed) + assert result.compute() == [] + + _distributed_client = None + + @classmethod + @pytest.fixture(params=["ThreadedScheduler", "DistributedScheduler"]) + def scheduler_type(cls, request): + sched_typename = request.param + if sched_typename == "ThreadedScheduler": + config_name = "threads" + if cls._distributed_client is not None: + cls._distributed_client.close() + cls._distributed_client = None + else: + config_name = "distributed" + if cls._distributed_client is None: + cls._distributed_client = distributed.Client() + + with dask.config.set(scheduler=config_name): + yield sched_typename + + def test_distributed(self, output_path, scheduler_type, save_is_delayed): + # Check operation works, and behaves the same, with a distributed scheduler. + + # Just check that the dask scheduler is setup as 'expected'. + if scheduler_type == "ThreadedScheduler": + expected_dask_scheduler = "threads" + else: + assert scheduler_type == "DistributedScheduler" + expected_dask_scheduler = "distributed" + assert dask.config.get("scheduler") == expected_dask_scheduler + + # Use a testcase that produces delayed warnings. + cube = self.make_testcube( + include_lazy_content=True, ensure_fillvalue_collision=True + ) + with warnings.catch_warnings(record=True) as logged_warnings: + result = iris.save(cube, output_path, compute=not save_is_delayed) + + if not save_is_delayed: + assert result is None + assert len(logged_warnings) == 2 + issued_warnings = [log.message for log in logged_warnings] + else: + assert result is not None + assert len(logged_warnings) == 0 + warnings.simplefilter("error") + issued_warnings = result.compute() + + assert len(issued_warnings) == 2 + expected_msg = "contains unmasked data points equal to the fill-value" + assert all( + expected_msg in warning.args[0] for warning in issued_warnings + ) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 8977ee04e5..5c838be4e5 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 0b6d997f538d5034e24f437684b5b13033d24ccac42358eb59c1693405b3e11c +# input_hash: 38a36037771c7f43f3f405096f5cb1a98eb4493a2f09d043f75e8d5b55cbf0c3 @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-2022.12.7-ha878542_0.conda#ff9f73d45c4a07d6f424495288a26080 @@ -12,7 +12,7 @@ https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-12.2.0-h337968e_19.tar.bz2#164b4b1acaedc47ee7e658ae6b308ca3 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-12.2.0-h46fd767_19.tar.bz2#1030b1f38c129f2634eae026f704fe60 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.10-3_cp310.conda#4eb33d14d794b0f4be116443ffed3853 -https://conda.anaconda.org/conda-forge/noarch/tzdata-2023b-h71feb2d_0.conda#6c80c63151d7f493dab457a0ba6c2523 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e3e74d8be4dac89ce83b20de2492a https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-12.2.0-h69a702a_19.tar.bz2#cd7a806282c16e1f2d39a7e80d3a3e0d https://conda.anaconda.org/conda-forge/linux-64/libgomp-12.2.0-h65d4601_19.tar.bz2#cedcee7c064c01c403f962c9e8d3c373 @@ -49,7 +49,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.21-pthreads_h78a6416_3.tar.bz2#8c5963a49b6035c40646a763293fbb35 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/libtool-2.4.7-h27087fc_0.conda#f204c8ba400ec475452737094fb81d52 -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.32.1-h7f98852_1000.tar.bz2#772d69f030955d9646d3d0eaf21d859d +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.2.4-h166bdaf_0.tar.bz2#ac2ccf7323d21f2994e4d1f5da664f37 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h166bdaf_4.tar.bz2#f3f9de449d32ca9b9c66a22863c96f41 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 @@ -140,6 +140,7 @@ https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.3.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h05c8ddd_0.conda#1a109126a43003d65b39c1cad656bc9b https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.74.1-h6239696_1.tar.bz2#5f442e6bc9d89ba236eb25a25c5c2815 https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h64030ff_2.tar.bz2#112eb9b5b93f0c02e59aea4fd1967363 +https://conda.anaconda.org/conda-forge/noarch/heapdict-1.0.1-py_0.tar.bz2#77242bfb1e74a627fb06319b5a2d3b95 https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed 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 @@ -154,6 +155,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-253-h8c4010b_1.conda https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.2.4-h1daa5a0_1.conda#77003f63d1763c1e6569a02c1742c9f4 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.2-py310h1fa729e_0.conda#a1f0db6709778b77b5903541eeac4032 +https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.5-py310hdf3cbec_0.conda#5311a49aaea44b73935c84a6d9a68e5f https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.24.2-py310h8deb116_0.conda#b7085457309e206174b8e234d90a7605 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea @@ -166,11 +168,12 @@ https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py310h1fa729e_0.conda#8d155ac95b1dfe585bcb6bec6a91c73b -https://conda.anaconda.org/conda-forge/noarch/pytz-2023.2-pyhd8ed1ab_0.conda#d74d285d6628e55752df22fc84910279 +https://conda.anaconda.org/conda-forge/noarch/pytz-2023.3-pyhd8ed1ab_0.conda#d3076b483092a435832603243567bc31 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py310h5764c6d_5.tar.bz2#9e68d2ff6d98737c855b65f48dd3c597 -https://conda.anaconda.org/conda-forge/noarch/setuptools-67.6.0-pyhd8ed1ab_0.conda#e18ed61c37145bb9b48d1d98801960f7 +https://conda.anaconda.org/conda-forge/noarch/setuptools-67.6.1-pyhd8ed1ab_0.conda#6c443cccff3daa3d83b2b807b0a298ce 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 https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2#146f4541d643d48fc8a75cacf69f03ae https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.4-pyhd8ed1ab_0.conda#5a31a7d564f551d0e6dff52fd8cb5b16 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.2-py_0.tar.bz2#68e01cac9d38d0e717cd5c87bc3d2cc9 @@ -178,6 +181,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.1-pyhd8 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-py_0.tar.bz2#67cd9d9c0382d37479b4d306c369a2d4 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.3-py_0.tar.bz2#d01180388e6d1838c3e1ad029590aa7a https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.5-pyhd8ed1ab_2.tar.bz2#9ff55a0901cf952f05c654394de76bf7 +https://conda.anaconda.org/conda-forge/noarch/tblib-1.7.0-pyhd8ed1ab_0.tar.bz2#3d4afc31302aa7be471feb6be048ed76 https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 @@ -197,7 +201,8 @@ https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py310hde88566_1.tar https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.7-py310hdf3cbec_0.conda#7bf9d8c765b6b04882c719509652c6d6 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.2.2-py310h1fa729e_0.conda#8750e87414347c0208b1b2e035aa6af2 https://conda.anaconda.org/conda-forge/linux-64/curl-7.88.1-hdc1c0ab_1.conda#2016c398f234cfa354ea704c6731b5d5 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.39.2-py310h1fa729e_0.conda#3b354798e12b65fa8ebe1d189de6a507 +https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.0-py310h5764c6d_1.tar.bz2#fd18cd597d23b2b5ddde23bd5b7aec32 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.39.3-py310h1fa729e_0.conda#4f39f656d6ff2761d698e69af952be82 https://conda.anaconda.org/conda-forge/linux-64/glib-2.74.1-h6239696_1.tar.bz2#f3220a9e9d3abcbfca43419a219df7e4 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h4df4325_101.conda#162a25904af6586b234b2dd52ee99c61 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.1.0-pyha770c72_0.conda#30b3127c385ca2ed5ef87f3d53d466bc @@ -210,7 +215,7 @@ https://conda.anaconda.org/conda-forge/noarch/partd-1.3.0-pyhd8ed1ab_0.tar.bz2#a https://conda.anaconda.org/conda-forge/linux-64/pillow-9.4.0-py310h023d228_1.conda#bbea829b541aa15df5c65bd40b8c1981 https://conda.anaconda.org/conda-forge/noarch/pip-23.0.1-pyhd8ed1ab_0.conda#8025ca83b8ba5430b640b83917c2a6f7 https://conda.anaconda.org/conda-forge/noarch/pockets-0.9.1-py_0.tar.bz2#1b52f0c42e8077e5a33e00fe72269364 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.1.1-h8ffa02c_2.conda#c264aea0e16bba26afa0a0940e954492 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.0-h8ffa02c_0.conda#8b9dcfabec5c6bcac98e89889fffa64e https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-16.1-h5195f5e_3.conda#caeb3302ef1dc8b342b20c710a86f8a9 https://conda.anaconda.org/conda-forge/noarch/pygments-2.14.0-pyhd8ed1ab_0.conda#c78cd16b11cd6a295484bd6c8f24bea1 https://conda.anaconda.org/conda-forge/noarch/pytest-7.2.2-pyhd8ed1ab_0.conda#60958b19354e0ec295b43f6ab5cfab86 @@ -220,6 +225,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.4.1-py310h0a54255_0 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py310h056c13c_1.conda#32d925cfd330e0cbb72b7618558a44e8 https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.7-py310heca2aa9_0.conda#142c074701cf90c88667b461678aee81 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.5.0-hd8ed1ab_0.conda#b3c594fde1a80a1fc3eb9cc4a5dfe392 +https://conda.anaconda.org/conda-forge/noarch/zict-2.2.0-pyhd8ed1ab_0.tar.bz2#cd563d01df94e51f968645dbf3b310b0 https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda#46a2e6e3dfa718ce3492018d5a110dd6 https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py310h5764c6d_1005.tar.bz2#87669c3468dff637bbd0363bc0f895cf https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.1.1-py310hde88566_2.tar.bz2#7433944046deda7775c5b1f7e0b6fe18 @@ -229,10 +235,10 @@ https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-6.0.0-h8e241bc_0.conda# https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.1.0-hd8ed1ab_0.conda#90bab1d97fdb6bb40c8e00207bf222dc https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.1-nompi_h261ec11_106.tar.bz2#9b25de670ce5753a33c18b1090d1d3bf https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py310he60537e_0.conda#68b2dd34c69d08b05a9db5e3596fe3ee -https://conda.anaconda.org/conda-forge/linux-64/pandas-1.5.3-py310h9b08913_0.conda#467244b0dbb7da40927ac6ee0e9491de +https://conda.anaconda.org/conda-forge/linux-64/pandas-1.5.3-py310h9b08913_1.conda#331c9dd2560aeb308e26f821280f19d0 https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.2.0-pyhd8ed1ab_0.conda#f10c2cf447ca96f12a326b83c75b8e33 https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-daemon-16.1-ha8d29e2_3.conda#34d9d75ca896f5919c372a34e25f23ea -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.4.1-py310h15e2413_1.conda#5be35366687def87437d210fd673100c +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.5.0-py310hb814896_1.conda#d44c6841ee904252e0e8b7a1c7b11383 https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.11.0-py310heca2aa9_3.conda#3b1946b676534472ce65181dda0b9554 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-4.0.0-pyhd8ed1ab_0.tar.bz2#c9e3f8bfdb9bfc34aa1836a6ed4b25d7 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.2.1-pyhd8ed1ab_0.conda#6fe4c2689d1b10fec1ee65819f0c4fd5 @@ -247,14 +253,15 @@ https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.0-nompi_he1ee https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.2-nompi_py310h55e1e36_100.tar.bz2#4dd7aa28fb7d9a6de061c9579a30e7dd https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-hd33c08f_0.conda#a8b9e35dd7be2c945b0de4fe19a7c3a9 https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-16.1-hcb278e6_3.conda#8b452ab959166d91949af4c2d28f81db -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.1.0-pyhd8ed1ab_0.conda#3a5b9d88c369e7960e3dde3229066908 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.1.1-pyhd8ed1ab_0.conda#0b34aa3ab7e7ccb1765a03dd9ed29938 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.21.0-pyhd8ed1ab_0.conda#cb9a711f7c9f3074fe522e5a34481e60 https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.0-nompi_hdb2cfa9_4.conda#3e2e1d0cd06d1b64c9c2800c0eb0cde6 https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h90689f9_2.tar.bz2#957a0255ab58aaf394a91725d73ab422 https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.54.4-h7abd40a_0.tar.bz2#921e53675ed5ea352f022b79abab076a -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.2.0-pyha770c72_0.conda#9a160452d1d88a9f10c373888f93586b +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.2.1-pyha770c72_0.conda#3a5cb173faf0fbe20acfb65353a38b40 https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-h5d23da1_6.conda#59c73debd9405771690ddbbad6c57b69 https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.15-pyhd8ed1ab_0.conda#27db656619a55d727eaf5a6ece3d2fd6 +https://conda.anaconda.org/conda-forge/noarch/distributed-2023.3.2-pyhd8ed1ab_0.conda#972a8221136c71c6954cf900ce020ed5 https://conda.anaconda.org/conda-forge/linux-64/esmpy-8.4.0-nompi_py310h4c636dd_2.conda#00383e95a1a8d1d5b21af8535cd2ac43 https://conda.anaconda.org/conda-forge/linux-64/graphviz-7.1.0-h2e5815a_0.conda#e7ecda996c443142a0e9c379f3b28e48 https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.7-py310hab646b1_3.conda#d049da3204bf5ecb54a852b622f2d7d2 @@ -262,7 +269,7 @@ https://conda.anaconda.org/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.7.1-py310hff52083_0.conda#c2b60c44d38d32779006a15c2581f0d1 https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 https://conda.anaconda.org/conda-forge/noarch/sphinx-4.5.0-pyh6c4a22f_0.tar.bz2#46b38d88c4270ff9ba78a89c83c66345 -https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.13.1-pyhd8ed1ab_0.conda#258f38b9f3bfb323cf175b94d4a03c09 +https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.13.2-pyhd8ed1ab_0.conda#bc604eb5b33d3cf6c4c773490f3f5cda https://conda.anaconda.org/conda-forge/linux-64/scipy-1.10.1-py310h8deb116_0.conda#4c9604c5ec179c21f8f0a09e3c164480 https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.1-pyhd8ed1ab_0.conda#d21ada5f548f3c8957e1fa7ec3cd7f5b https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.12.2-pyhd8ed1ab_0.conda#cb7e912f6f31de2d45984fa40a4fe78c diff --git a/requirements/locks/py38-linux-64.lock b/requirements/locks/py38-linux-64.lock index 9017584c1a..ae1f19db5f 100644 --- a/requirements/locks/py38-linux-64.lock +++ b/requirements/locks/py38-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 21e771ba2d61d1c6a98771d9f80bf0154b80caac73a660590d70f7f8eb22edc9 +# input_hash: 95fc23825c1f7510d377720f3804c17e48a94112ef7a480c13c9b492257862ae @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-2022.12.7-ha878542_0.conda#ff9f73d45c4a07d6f424495288a26080 @@ -48,7 +48,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.21-pthreads_h78a6416_3.tar.bz2#8c5963a49b6035c40646a763293fbb35 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/libtool-2.4.7-h27087fc_0.conda#f204c8ba400ec475452737094fb81d52 -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.32.1-h7f98852_1000.tar.bz2#772d69f030955d9646d3d0eaf21d859d +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.2.4-h166bdaf_0.tar.bz2#ac2ccf7323d21f2994e4d1f5da664f37 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h166bdaf_4.tar.bz2#f3f9de449d32ca9b9c66a22863c96f41 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 @@ -139,6 +139,7 @@ https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.3.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h05c8ddd_0.conda#1a109126a43003d65b39c1cad656bc9b https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.74.1-h6239696_1.tar.bz2#5f442e6bc9d89ba236eb25a25c5c2815 https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h64030ff_2.tar.bz2#112eb9b5b93f0c02e59aea4fd1967363 +https://conda.anaconda.org/conda-forge/noarch/heapdict-1.0.1-py_0.tar.bz2#77242bfb1e74a627fb06319b5a2d3b95 https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed 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 @@ -153,6 +154,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-253-h8c4010b_1.conda https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.2.4-h1daa5a0_1.conda#77003f63d1763c1e6569a02c1742c9f4 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.2-py38h1de0b5d_0.conda#6d97b5d6f06933ab653f1862ddf6e33e +https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.5-py38hfbd4bf9_0.conda#5401b83c1007f408d0c74e23fa9b5eff https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.24.2-py38h10c12cc_0.conda#05592c85b9f6931dc2df1e80c0d56294 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea @@ -165,11 +167,12 @@ https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py38h1de0b5d_0.conda#7db73572d4f7e10a759bad609a228ad0 -https://conda.anaconda.org/conda-forge/noarch/pytz-2023.2-pyhd8ed1ab_0.conda#d74d285d6628e55752df22fc84910279 +https://conda.anaconda.org/conda-forge/noarch/pytz-2023.3-pyhd8ed1ab_0.conda#d3076b483092a435832603243567bc31 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py38h0a891b7_5.tar.bz2#0856c59f9ddb710c640dc0428d66b1b7 -https://conda.anaconda.org/conda-forge/noarch/setuptools-67.6.0-pyhd8ed1ab_0.conda#e18ed61c37145bb9b48d1d98801960f7 +https://conda.anaconda.org/conda-forge/noarch/setuptools-67.6.1-pyhd8ed1ab_0.conda#6c443cccff3daa3d83b2b807b0a298ce 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 https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2#146f4541d643d48fc8a75cacf69f03ae https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.4-pyhd8ed1ab_0.conda#5a31a7d564f551d0e6dff52fd8cb5b16 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.2-py_0.tar.bz2#68e01cac9d38d0e717cd5c87bc3d2cc9 @@ -177,6 +180,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.1-pyhd8 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-py_0.tar.bz2#67cd9d9c0382d37479b4d306c369a2d4 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.3-py_0.tar.bz2#d01180388e6d1838c3e1ad029590aa7a https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.5-pyhd8ed1ab_2.tar.bz2#9ff55a0901cf952f05c654394de76bf7 +https://conda.anaconda.org/conda-forge/noarch/tblib-1.7.0-pyhd8ed1ab_0.tar.bz2#3d4afc31302aa7be471feb6be048ed76 https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 @@ -195,7 +199,8 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py38h4a40e3a_3.conda https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py38h26c90d9_1.tar.bz2#dcc025a7bb54374979c500c2e161fac9 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.7-py38hfbd4bf9_0.conda#638537863b298151635c05c762a997ab https://conda.anaconda.org/conda-forge/linux-64/curl-7.88.1-hdc1c0ab_1.conda#2016c398f234cfa354ea704c6731b5d5 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.39.2-py38h1de0b5d_0.conda#affec6061f9a2d056db74561477a62b5 +https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.0-py38h0a891b7_1.tar.bz2#183f6160ab3498b882e903b06be7d430 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.39.3-py38h1de0b5d_0.conda#34449fe6e3949956fac2236c9a9a3d3b https://conda.anaconda.org/conda-forge/linux-64/glib-2.74.1-h6239696_1.tar.bz2#f3220a9e9d3abcbfca43419a219df7e4 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h4df4325_101.conda#162a25904af6586b234b2dd52ee99c61 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.1.0-pyha770c72_0.conda#30b3127c385ca2ed5ef87f3d53d466bc @@ -209,7 +214,7 @@ https://conda.anaconda.org/conda-forge/noarch/partd-1.3.0-pyhd8ed1ab_0.tar.bz2#a https://conda.anaconda.org/conda-forge/linux-64/pillow-9.4.0-py38hde6dc18_1.conda#3de5619d3f556f966189e5251a266125 https://conda.anaconda.org/conda-forge/noarch/pip-23.0.1-pyhd8ed1ab_0.conda#8025ca83b8ba5430b640b83917c2a6f7 https://conda.anaconda.org/conda-forge/noarch/pockets-0.9.1-py_0.tar.bz2#1b52f0c42e8077e5a33e00fe72269364 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.1.1-h8ffa02c_2.conda#c264aea0e16bba26afa0a0940e954492 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.0-h8ffa02c_0.conda#8b9dcfabec5c6bcac98e89889fffa64e https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-16.1-h5195f5e_3.conda#caeb3302ef1dc8b342b20c710a86f8a9 https://conda.anaconda.org/conda-forge/noarch/pygments-2.14.0-pyhd8ed1ab_0.conda#c78cd16b11cd6a295484bd6c8f24bea1 https://conda.anaconda.org/conda-forge/noarch/pytest-7.2.2-pyhd8ed1ab_0.conda#60958b19354e0ec295b43f6ab5cfab86 @@ -219,6 +224,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.4.1-py38h7e4f40d_0. https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py38haaa171b_1.conda#fdd08c011257c5e4727cca36f04af74f https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.7-py38h8dc9893_0.conda#ea242937718f3dacf253355e1d634535 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.5.0-hd8ed1ab_0.conda#b3c594fde1a80a1fc3eb9cc4a5dfe392 +https://conda.anaconda.org/conda-forge/noarch/zict-2.2.0-pyhd8ed1ab_0.tar.bz2#cd563d01df94e51f968645dbf3b310b0 https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda#46a2e6e3dfa718ce3492018d5a110dd6 https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py38h0a891b7_1005.tar.bz2#e99e08812dfff30fdd17b3f8838e2759 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.1.1-py38h26c90d9_2.tar.bz2#0ea017e84efe45badce6c32f274dbf8e @@ -228,10 +234,10 @@ https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-6.0.0-h8e241bc_0.conda# https://conda.anaconda.org/conda-forge/noarch/importlib-resources-5.12.0-pyhd8ed1ab_0.conda#3544c818f0720c89eb16ae6940ab440b https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.1.0-hd8ed1ab_0.conda#90bab1d97fdb6bb40c8e00207bf222dc https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.1-nompi_h261ec11_106.tar.bz2#9b25de670ce5753a33c18b1090d1d3bf -https://conda.anaconda.org/conda-forge/linux-64/pandas-1.5.3-py38hdc8b05c_0.conda#5073966d63a54434d2a2fc41d325b072 +https://conda.anaconda.org/conda-forge/linux-64/pandas-1.5.3-py38hdc8b05c_1.conda#c944b033a2126e7f714a7ecaecb22011 https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.2.0-pyhd8ed1ab_0.conda#f10c2cf447ca96f12a326b83c75b8e33 https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-daemon-16.1-ha8d29e2_3.conda#34d9d75ca896f5919c372a34e25f23ea -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.4.1-py38h58d5fe2_1.conda#5286eaec7e93586e4ae05e7d658cd3e2 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.5.0-py38h2f62729_1.conda#00785fd9270728fbfb82c80fc0229dc6 https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.11.0-py38h8dc9893_3.conda#7bb0328b4a0f857aeb432426b9a5f908 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.2.1-pyhd8ed1ab_0.conda#6fe4c2689d1b10fec1ee65819f0c4fd5 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-7.1.0-pyhd8ed1ab_0.conda#6613dbb3b25cc648a107f33ca9f80fc1 @@ -245,15 +251,16 @@ https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.0-nompi_he1ee https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.2-nompi_py38h2250339_100.tar.bz2#dd97e93b1f64f1cc58879d53c23ec93f https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-hd33c08f_0.conda#a8b9e35dd7be2c945b0de4fe19a7c3a9 https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-16.1-hcb278e6_3.conda#8b452ab959166d91949af4c2d28f81db -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.1.0-pyhd8ed1ab_0.conda#3a5b9d88c369e7960e3dde3229066908 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.1.1-pyhd8ed1ab_0.conda#0b34aa3ab7e7ccb1765a03dd9ed29938 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.21.0-pyhd8ed1ab_0.conda#cb9a711f7c9f3074fe522e5a34481e60 https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.0-nompi_hdb2cfa9_4.conda#3e2e1d0cd06d1b64c9c2800c0eb0cde6 https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h90689f9_2.tar.bz2#957a0255ab58aaf394a91725d73ab422 https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.54.4-h7abd40a_0.tar.bz2#921e53675ed5ea352f022b79abab076a https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.2.0-pyha770c72_0.conda#9a160452d1d88a9f10c373888f93586b +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.2.1-pyha770c72_0.conda#3a5cb173faf0fbe20acfb65353a38b40 https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-h5d23da1_6.conda#59c73debd9405771690ddbbad6c57b69 https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.15-pyhd8ed1ab_0.conda#27db656619a55d727eaf5a6ece3d2fd6 +https://conda.anaconda.org/conda-forge/noarch/distributed-2023.3.2-pyhd8ed1ab_0.conda#972a8221136c71c6954cf900ce020ed5 https://conda.anaconda.org/conda-forge/linux-64/esmpy-8.4.0-nompi_py38h2b78397_2.conda#03c291af8938218972bfba0b0618d3e9 https://conda.anaconda.org/conda-forge/linux-64/graphviz-7.1.0-h2e5815a_0.conda#e7ecda996c443142a0e9c379f3b28e48 https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.7-py38ha0d8c90_3.conda#e965dc172d67920d058ac2b3a0e27565 @@ -261,7 +268,7 @@ https://conda.anaconda.org/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.7.1-py38h578d9bd_0.conda#50ff9e0a3dd459a0ca365741072bf9a2 https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 https://conda.anaconda.org/conda-forge/noarch/sphinx-4.5.0-pyh6c4a22f_0.tar.bz2#46b38d88c4270ff9ba78a89c83c66345 -https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.13.1-pyhd8ed1ab_0.conda#258f38b9f3bfb323cf175b94d4a03c09 +https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.13.2-pyhd8ed1ab_0.conda#bc604eb5b33d3cf6c4c773490f3f5cda https://conda.anaconda.org/conda-forge/linux-64/scipy-1.10.1-py38h10c12cc_0.conda#1cbc47bb9a600ce4a49d8da797d375bf https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.1-pyhd8ed1ab_0.conda#d21ada5f548f3c8957e1fa7ec3cd7f5b https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.12.2-pyhd8ed1ab_0.conda#cb7e912f6f31de2d45984fa40a4fe78c diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index c75defbb7d..c8f9cef96b 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 976d206fc14c465db12cef28441162ad1d60d04b3a09aa7a2c48dffe68b4d1d8 +# input_hash: 2efc3b6979a34724c2fb2e409043fa9e3fb822c08c65b9226cbe2a210bff850b @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-2022.12.7-ha878542_0.conda#ff9f73d45c4a07d6f424495288a26080 @@ -12,7 +12,7 @@ https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-12.2.0-h337968e_19.tar.bz2#164b4b1acaedc47ee7e658ae6b308ca3 https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-12.2.0-h46fd767_19.tar.bz2#1030b1f38c129f2634eae026f704fe60 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.9-3_cp39.conda#0dd193187d54e585cac7eab942a8847e -https://conda.anaconda.org/conda-forge/noarch/tzdata-2023b-h71feb2d_0.conda#6c80c63151d7f493dab457a0ba6c2523 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e3e74d8be4dac89ce83b20de2492a https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-12.2.0-h69a702a_19.tar.bz2#cd7a806282c16e1f2d39a7e80d3a3e0d https://conda.anaconda.org/conda-forge/linux-64/libgomp-12.2.0-h65d4601_19.tar.bz2#cedcee7c064c01c403f962c9e8d3c373 @@ -49,7 +49,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.21-pthreads_h78a6416_3.tar.bz2#8c5963a49b6035c40646a763293fbb35 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/libtool-2.4.7-h27087fc_0.conda#f204c8ba400ec475452737094fb81d52 -https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.32.1-h7f98852_1000.tar.bz2#772d69f030955d9646d3d0eaf21d859d +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.2.4-h166bdaf_0.tar.bz2#ac2ccf7323d21f2994e4d1f5da664f37 https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h166bdaf_4.tar.bz2#f3f9de449d32ca9b9c66a22863c96f41 https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 @@ -140,6 +140,7 @@ https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.3.0-pyhd8ed1ab_1.conda https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h05c8ddd_0.conda#1a109126a43003d65b39c1cad656bc9b https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.74.1-h6239696_1.tar.bz2#5f442e6bc9d89ba236eb25a25c5c2815 https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h64030ff_2.tar.bz2#112eb9b5b93f0c02e59aea4fd1967363 +https://conda.anaconda.org/conda-forge/noarch/heapdict-1.0.1-py_0.tar.bz2#77242bfb1e74a627fb06319b5a2d3b95 https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed 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 @@ -154,6 +155,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-253-h8c4010b_1.conda https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.2.4-h1daa5a0_1.conda#77003f63d1763c1e6569a02c1742c9f4 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.2-py39h72bdee0_0.conda#35514f5320206df9f4661c138c02e1c1 +https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.5-py39h4b4f3f3_0.conda#413374bab5022a5199c5dd89aef75df5 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.24.2-py39h7360e5f_0.conda#757070dc7cc33003254888808cd34f1e https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea @@ -166,11 +168,12 @@ https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py39h72bdee0_0.conda#18927f971926b7271600368de71de557 -https://conda.anaconda.org/conda-forge/noarch/pytz-2023.2-pyhd8ed1ab_0.conda#d74d285d6628e55752df22fc84910279 +https://conda.anaconda.org/conda-forge/noarch/pytz-2023.3-pyhd8ed1ab_0.conda#d3076b483092a435832603243567bc31 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py39hb9d737c_5.tar.bz2#ef9db3c38ae7275f6b14491cfe61a248 -https://conda.anaconda.org/conda-forge/noarch/setuptools-67.6.0-pyhd8ed1ab_0.conda#e18ed61c37145bb9b48d1d98801960f7 +https://conda.anaconda.org/conda-forge/noarch/setuptools-67.6.1-pyhd8ed1ab_0.conda#6c443cccff3daa3d83b2b807b0a298ce 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 https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2#146f4541d643d48fc8a75cacf69f03ae https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.4-pyhd8ed1ab_0.conda#5a31a7d564f551d0e6dff52fd8cb5b16 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.2-py_0.tar.bz2#68e01cac9d38d0e717cd5c87bc3d2cc9 @@ -178,6 +181,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.1-pyhd8 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-py_0.tar.bz2#67cd9d9c0382d37479b4d306c369a2d4 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.3-py_0.tar.bz2#d01180388e6d1838c3e1ad029590aa7a https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.5-pyhd8ed1ab_2.tar.bz2#9ff55a0901cf952f05c654394de76bf7 +https://conda.anaconda.org/conda-forge/noarch/tblib-1.7.0-pyhd8ed1ab_0.tar.bz2#3d4afc31302aa7be471feb6be048ed76 https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 @@ -196,7 +200,8 @@ https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py39he91dace_3.conda https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py39h2ae25f5_1.tar.bz2#c943fb9a2818ecc5be1e0ecc8b7738f1 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.7-py39h4b4f3f3_0.conda#c5387f3fb1f5b8b71e1c865fc55f4951 https://conda.anaconda.org/conda-forge/linux-64/curl-7.88.1-hdc1c0ab_1.conda#2016c398f234cfa354ea704c6731b5d5 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.39.2-py39h72bdee0_0.conda#f87853cd6f76c4b8014b41fa522e5bda +https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.0-py39hb9d737c_1.tar.bz2#eb31327ace8dac15c2df243d9505a132 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.39.3-py39h72bdee0_0.conda#9232b3b2cc83a304c8210a092e8ba4a5 https://conda.anaconda.org/conda-forge/linux-64/glib-2.74.1-h6239696_1.tar.bz2#f3220a9e9d3abcbfca43419a219df7e4 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h4df4325_101.conda#162a25904af6586b234b2dd52ee99c61 https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.1.0-pyha770c72_0.conda#30b3127c385ca2ed5ef87f3d53d466bc @@ -210,7 +215,7 @@ https://conda.anaconda.org/conda-forge/noarch/partd-1.3.0-pyhd8ed1ab_0.tar.bz2#a https://conda.anaconda.org/conda-forge/linux-64/pillow-9.4.0-py39h2320bf1_1.conda#d2f79132b9c8e416058a4cd84ef27b3d https://conda.anaconda.org/conda-forge/noarch/pip-23.0.1-pyhd8ed1ab_0.conda#8025ca83b8ba5430b640b83917c2a6f7 https://conda.anaconda.org/conda-forge/noarch/pockets-0.9.1-py_0.tar.bz2#1b52f0c42e8077e5a33e00fe72269364 -https://conda.anaconda.org/conda-forge/linux-64/proj-9.1.1-h8ffa02c_2.conda#c264aea0e16bba26afa0a0940e954492 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.0-h8ffa02c_0.conda#8b9dcfabec5c6bcac98e89889fffa64e https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-16.1-h5195f5e_3.conda#caeb3302ef1dc8b342b20c710a86f8a9 https://conda.anaconda.org/conda-forge/noarch/pygments-2.14.0-pyhd8ed1ab_0.conda#c78cd16b11cd6a295484bd6c8f24bea1 https://conda.anaconda.org/conda-forge/noarch/pytest-7.2.2-pyhd8ed1ab_0.conda#60958b19354e0ec295b43f6ab5cfab86 @@ -220,6 +225,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.4.1-py39h389d5f1_0. https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py39hf1c3bca_1.conda#ae6bfe65e81d9b59a71cc01a2858650f https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.7-py39h227be39_0.conda#7d9a35091552af3655151f164ddd64a3 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.5.0-hd8ed1ab_0.conda#b3c594fde1a80a1fc3eb9cc4a5dfe392 +https://conda.anaconda.org/conda-forge/noarch/zict-2.2.0-pyhd8ed1ab_0.tar.bz2#cd563d01df94e51f968645dbf3b310b0 https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda#46a2e6e3dfa718ce3492018d5a110dd6 https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py39hb9d737c_1005.tar.bz2#a639fdd9428d8b25f8326a3838d54045 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.1.1-py39h2ae25f5_2.tar.bz2#b3b4aab96d1c4ed394d6f4b9146699d4 @@ -229,10 +235,10 @@ https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-6.0.0-h8e241bc_0.conda# https://conda.anaconda.org/conda-forge/noarch/importlib-resources-5.12.0-pyhd8ed1ab_0.conda#3544c818f0720c89eb16ae6940ab440b https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.1.0-hd8ed1ab_0.conda#90bab1d97fdb6bb40c8e00207bf222dc https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.1-nompi_h261ec11_106.tar.bz2#9b25de670ce5753a33c18b1090d1d3bf -https://conda.anaconda.org/conda-forge/linux-64/pandas-1.5.3-py39h2ad29b5_0.conda#3ea96adbbc2a66fa45178102a9cfbecc +https://conda.anaconda.org/conda-forge/linux-64/pandas-1.5.3-py39h2ad29b5_1.conda#0d89bced73199385857310d3a648757d https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.2.0-pyhd8ed1ab_0.conda#f10c2cf447ca96f12a326b83c75b8e33 https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-daemon-16.1-ha8d29e2_3.conda#34d9d75ca896f5919c372a34e25f23ea -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.4.1-py39hf14cbfd_1.conda#67766c515601b3ee1514072d6fd060bb +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.5.0-py39h718ffca_1.conda#a19bf4be7ebce54623541fa4ad22abb4 https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.11.0-py39h227be39_3.conda#9e381db00691e26bcf670c3586397be1 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.2.1-pyhd8ed1ab_0.conda#6fe4c2689d1b10fec1ee65819f0c4fd5 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-7.1.0-pyhd8ed1ab_0.conda#6613dbb3b25cc648a107f33ca9f80fc1 @@ -246,15 +252,16 @@ https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.0-nompi_he1ee https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.2-nompi_py39hfaa66c4_100.tar.bz2#b5f2db23900499e96f88e39199ffc7b8 https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-hd33c08f_0.conda#a8b9e35dd7be2c945b0de4fe19a7c3a9 https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-16.1-hcb278e6_3.conda#8b452ab959166d91949af4c2d28f81db -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.1.0-pyhd8ed1ab_0.conda#3a5b9d88c369e7960e3dde3229066908 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.1.1-pyhd8ed1ab_0.conda#0b34aa3ab7e7ccb1765a03dd9ed29938 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.21.0-pyhd8ed1ab_0.conda#cb9a711f7c9f3074fe522e5a34481e60 https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.0-nompi_hdb2cfa9_4.conda#3e2e1d0cd06d1b64c9c2800c0eb0cde6 https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h90689f9_2.tar.bz2#957a0255ab58aaf394a91725d73ab422 https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.54.4-h7abd40a_0.tar.bz2#921e53675ed5ea352f022b79abab076a https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.2.0-pyha770c72_0.conda#9a160452d1d88a9f10c373888f93586b +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.2.1-pyha770c72_0.conda#3a5cb173faf0fbe20acfb65353a38b40 https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-h5d23da1_6.conda#59c73debd9405771690ddbbad6c57b69 https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.15-pyhd8ed1ab_0.conda#27db656619a55d727eaf5a6ece3d2fd6 +https://conda.anaconda.org/conda-forge/noarch/distributed-2023.3.2-pyhd8ed1ab_0.conda#972a8221136c71c6954cf900ce020ed5 https://conda.anaconda.org/conda-forge/linux-64/esmpy-8.4.0-nompi_py39h95eafd8_2.conda#f04f8970f741b2f78af7e5b7112d17d6 https://conda.anaconda.org/conda-forge/linux-64/graphviz-7.1.0-h2e5815a_0.conda#e7ecda996c443142a0e9c379f3b28e48 https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.7-py39h5c7b992_3.conda#19e30314fe824605750da905febb8ee6 @@ -262,7 +269,7 @@ https://conda.anaconda.org/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.7.1-py39hf3d152e_0.conda#682772fa385911fb5efffbce21b269c5 https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 https://conda.anaconda.org/conda-forge/noarch/sphinx-4.5.0-pyh6c4a22f_0.tar.bz2#46b38d88c4270ff9ba78a89c83c66345 -https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.13.1-pyhd8ed1ab_0.conda#258f38b9f3bfb323cf175b94d4a03c09 +https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.13.2-pyhd8ed1ab_0.conda#bc604eb5b33d3cf6c4c773490f3f5cda https://conda.anaconda.org/conda-forge/linux-64/scipy-1.10.1-py39h7360e5f_0.conda#7584d1bc5499d25eccfd24a7f656e3ee https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.1-pyhd8ed1ab_0.conda#d21ada5f548f3c8957e1fa7ec3cd7f5b https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.12.2-pyhd8ed1ab_0.conda#cb7e912f6f31de2d45984fa40a4fe78c diff --git a/requirements/py310.yml b/requirements/py310.yml index 836b673d43..029280059d 100644 --- a/requirements/py310.yml +++ b/requirements/py310.yml @@ -35,6 +35,7 @@ dependencies: - python-stratify # Test dependencies. + - distributed - filelock - imagehash >=4.0 - pre-commit diff --git a/requirements/py38.yml b/requirements/py38.yml index 35c9b23c20..12eb08285f 100644 --- a/requirements/py38.yml +++ b/requirements/py38.yml @@ -35,6 +35,7 @@ dependencies: - python-stratify # Test dependencies. + - distributed - filelock - imagehash >=4.0 - pre-commit diff --git a/requirements/py39.yml b/requirements/py39.yml index b64236cbc1..7c1e221bd8 100644 --- a/requirements/py39.yml +++ b/requirements/py39.yml @@ -35,6 +35,7 @@ dependencies: - python-stratify # Test dependencies. + - distributed - filelock - imagehash >=4.0 - pre-commit From 5c9931ff6022e3d7777f880a0d09fff257a17b1e Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 31 Mar 2023 14:40:57 +0100 Subject: [PATCH 43/85] Docstring fixes. --- lib/iris/fileformats/netcdf/_dask_locks.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/iris/fileformats/netcdf/_dask_locks.py b/lib/iris/fileformats/netcdf/_dask_locks.py index a857802010..b6bb7d5f4d 100644 --- a/lib/iris/fileformats/netcdf/_dask_locks.py +++ b/lib/iris/fileformats/netcdf/_dask_locks.py @@ -10,13 +10,15 @@ types, i.e. local 'threads' scheduler, local 'processes' or distributed. In any case, a "iris.fileformats.netcdf.saver.Saver" object contains a netCDF4.Dataset -targetting an output file, and creates a Saver.lock object to serialise write-accesses -to the file from dask tasks : All dask-task file writes go via a +targetting an output file, and creates a Saver.file_write_lock object to serialise +write-accesses to the file from dask tasks : All dask-task file writes go via a "iris.fileformats.netcdf.saver.NetCDFWriteProxy" object, which also contains a link -to the Saver.lock, and uses it to prevent workers from fouling each other. +to the Saver.file_write_lock, and uses it to prevent workers from fouling each other. + For each chunk written, the NetCDFWriteProxy acquires the common per-file lock; opens a Dataset on the file; performs a write to the relevant variable; closes the -Dataset and then releases the lock. +Dataset and then releases the lock. This process is obviously very similar to what the +NetCDFDataProxy does for reading lazy chunks. For a threaded scheduler, the Saver.lock is a simple threading.Lock(). The workers (threads) execute tasks which contain a NetCDFWriteProxy, as above. All of those @@ -30,7 +32,7 @@ distributed.Lock is deserialised to reconstruct the worker task, this creates an object that communicates with the scheduler. These objects behave as a single common lock, as they all have the same string 'identity', so the scheduler implements inter-process -communication so that the mutally exclude each other. +communication so that they can mutally exclude each other. It is also *conceivable* that multiple processes could write to the same file in parallel, if the operating system supports it. However, this also requires that the From 7daee68a464f0b1689f79d1d26187a7de59065f7 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Tue, 4 Apr 2023 12:20:31 +0100 Subject: [PATCH 44/85] Documentation section and whatsnew entry. --- docs/src/userguide/real_and_lazy_data.rst | 38 +++++++++++++++++++++-- docs/src/whatsnew/latest.rst | 4 +++ 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/docs/src/userguide/real_and_lazy_data.rst b/docs/src/userguide/real_and_lazy_data.rst index 9d66a2f086..a671dfd080 100644 --- a/docs/src/userguide/real_and_lazy_data.rst +++ b/docs/src/userguide/real_and_lazy_data.rst @@ -5,7 +5,9 @@ .. testsetup:: * import dask.array as da + from dask.array import Delayed import iris + from iris.cube import Cubelist import numpy as np @@ -228,10 +230,42 @@ coordinates' lazy points and bounds: Dask Processing Options ----------------------- -Iris uses dask to provide lazy data arrays for both Iris cubes and coordinates, -and for computing deferred operations on lazy arrays. +Iris uses `Dask `_ for more information on setting dask processing options. + + +.. _delayed_netcdf_save: + +Delayed netCDF Saving +--------------------- +When saving data to netCDF files, it is possible to _delay_ writing lazy content to the +output file, to be performed by `Dask `. + (:pull:`5191`) + 🐛 Bugs Fixed ============= From 64c725132092a05e26559a1cf041e256f6c04ea0 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Tue, 4 Apr 2023 14:38:54 +0100 Subject: [PATCH 45/85] Various fixes to whatsnew, docstrings and docs. --- docs/src/userguide/real_and_lazy_data.rst | 35 +++++++++++++---------- docs/src/whatsnew/latest.rst | 2 +- lib/iris/fileformats/netcdf/saver.py | 28 +++++++++++------- 3 files changed, 38 insertions(+), 27 deletions(-) diff --git a/docs/src/userguide/real_and_lazy_data.rst b/docs/src/userguide/real_and_lazy_data.rst index a671dfd080..8e6eb8154b 100644 --- a/docs/src/userguide/real_and_lazy_data.rst +++ b/docs/src/userguide/real_and_lazy_data.rst @@ -230,7 +230,7 @@ coordinates' lazy points and bounds: Dask Processing Options ----------------------- -Iris uses `Dask `_ to provide lazy data arrays for both Iris cubes and coordinates, and for computing deferred operations on lazy arrays. Dask provides processing options to control how deferred operations on lazy arrays @@ -243,29 +243,34 @@ for more information on setting dask processing options. Delayed netCDF Saving --------------------- -When saving data to netCDF files, it is possible to _delay_ writing lazy content to the -output file, to be performed by `Dask `_ later, +thus enabling parallel save operations. This works in the following way : - 1. the :meth:`iris.save` call has a added keyword ``compute=False``. - This is currently _only_ available when saving to netCDF, so is documented in + 1. an :func:`iris.save` call is made, with a netcdf file output and the additional + keyword ``compute=False``. + This is currently *only* available when saving to netCDF, so it is documented in the netCDF file format API. See : :func:`iris.fileformats.netcdf.save`. - 1. the call creates the output file, but does not fill in variables' data, where + + 2. the call creates the output file, but does not fill in variables' data, where the data is a lazy array in the Iris object. Instead, these variables are initially created "empty". - 1. the :meth:`~iris.save` call returns a ``result`` which is a dask - :class:`Delayed` object. - 1. the save can be completed later by calling ``result.compute()``, or by passing it + + 3. the :meth:`~iris.save` call returns a ``result`` which is a + :class:`~dask.delayed.Delayed` object. + + 4. the save can be completed later by calling ``result.compute()``, or by passing it to the :func:`dask.compute` call. The benefit of this, is that costly data transfer operations can be performed in -parallel with writes to other data files. Also, where array results may be calculated -from some of the same lazy input data, these can be computed in parallel efficiently by -Dask (i.e. without re-calculating), similar to what :meth:`Cubelist.realise_data` can -do. +parallel with writes to other data files. Also, where array contents are calculated +from shared lazy input data, these can be computed in parallel efficiently by Dask +(i.e. without re-fetching), similar to what :meth:`iris.cube.Cubelist.realise_data` +can do. .. note:: - This feature does **not** enable parallel writes to the _same_ netCDF output file. + This feature does **not** enable parallel writes to the *same* netCDF output file. That can only be done on certain operating systems, with a specially configured build of the netCDF C library, and is not supported by Iris at present. diff --git a/docs/src/whatsnew/latest.rst b/docs/src/whatsnew/latest.rst index 67ec327f22..15c2e02c06 100644 --- a/docs/src/whatsnew/latest.rst +++ b/docs/src/whatsnew/latest.rst @@ -46,7 +46,7 @@ This document explains the changes made to Iris for this release :meth:`iris.cube.Cube.rolling_window`). This automatically adapts cube units if necessary. (:pull:`5084`) -#. `@lbdreyer`_ and `@trexfeathers`_ (reviewer) added :func:`iris.plot.hist` +#. `@lbdreyer`_ and `@trexfeathers`_ (reviewer) added :func:`iris.plot.hist` and :func:`iris.quickplot.hist`. (:pull:`5189`) #. `@tinyendian`_ edited :func:`~iris.analysis.cartography.rotate_winds` to diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index d5431b00ab..67a63ffc2a 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -378,10 +378,10 @@ def __init__(self, filename, netcdf_format, compute=True): compute : bool, default=True If True, delayed variable saves will be completed on exit from the Saver context (after first closing the target file), equivalent to - saver.complete(). - If False, file is created and closed without filling in the variables for - which source data was lazy. These writes can be completed later, see - :meth:`delayed_completion`. + :meth:`complete()`. + If False, the file is created and closed without writing the data of + variables for which the source data was lazy. These writes can be + completed later, see :meth:`delayed_completion`. Returns ------- @@ -2410,7 +2410,8 @@ def store(data, cf_var, fill_value): def delayed_completion(self) -> Delayed: """ - Create a :class:'Delayed' to trigger file completion for delayed saves. + Create and return a :class:`dask.delayed.Delayed` to perform file completion + for delayed saves. This contains all the delayed writes, which complete the file by filling out the data of variables initially created empty, and also the checks for @@ -2420,7 +2421,7 @@ def delayed_completion(self) -> Delayed: Returns ------- - completion : :class:`Delayed` + completion : :class:`dask.delayed.Delayed` Notes ----- @@ -2655,13 +2656,18 @@ def save( * compute (bool): When False, create the output file but don't write any lazy array content to its variables, such as lazy cube data or aux-coord points and bounds. - Instead return a class:`Delayed` which, when computed, will stream all the lazy - content with :meth:`dask.store`, to complete the file. + + Instead return a :class:`dask.delayed.Delayed` which, when computed, will + stream all the lazy content via :meth:`dask.store`, to complete the file. Several such data saves can be performed in parallel, by passing a list of them into a :func:`dask.compute` call. - Note: when computed, the returned class:`Delayed` object returns - a list of :class:`Warning` : These are any warnings which _would_ have been - issued in the save call, if compute had been True. + + Default is ``True``, meaning complete the file immediately, and return ``None``. + + .. Note:: + when computed, the returned :class:`dask.delayed.Delayed` object returns + a list of :class:`Warning` : These are any warnings which *would* have + been issued in the save call, if compute had been True. Returns: A list of :class:`Warning`. From 75043f99829b1f33f365c0c3c521374f991958f3 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Tue, 11 Apr 2023 17:15:56 +0100 Subject: [PATCH 46/85] Minor review changes, fix doctest. --- docs/src/userguide/real_and_lazy_data.rst | 5 ++--- lib/iris/fileformats/netcdf/_dask_locks.py | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/src/userguide/real_and_lazy_data.rst b/docs/src/userguide/real_and_lazy_data.rst index 8e6eb8154b..aeeaf3de86 100644 --- a/docs/src/userguide/real_and_lazy_data.rst +++ b/docs/src/userguide/real_and_lazy_data.rst @@ -5,9 +5,8 @@ .. testsetup:: * import dask.array as da - from dask.array import Delayed import iris - from iris.cube import Cubelist + from iris.cube import CubeList import numpy as np @@ -267,7 +266,7 @@ This works in the following way : The benefit of this, is that costly data transfer operations can be performed in parallel with writes to other data files. Also, where array contents are calculated from shared lazy input data, these can be computed in parallel efficiently by Dask -(i.e. without re-fetching), similar to what :meth:`iris.cube.Cubelist.realise_data` +(i.e. without re-fetching), similar to what :meth:`iris.cube.CubeList.realise_data` can do. .. note:: diff --git a/lib/iris/fileformats/netcdf/_dask_locks.py b/lib/iris/fileformats/netcdf/_dask_locks.py index b6bb7d5f4d..4ee854ee28 100644 --- a/lib/iris/fileformats/netcdf/_dask_locks.py +++ b/lib/iris/fileformats/netcdf/_dask_locks.py @@ -9,7 +9,7 @@ This matter is complicated by needing different solutions for different dask scheduler types, i.e. local 'threads' scheduler, local 'processes' or distributed. -In any case, a "iris.fileformats.netcdf.saver.Saver" object contains a netCDF4.Dataset +In any case, an "iris.fileformats.netcdf.saver.Saver" object contains a netCDF4.Dataset targetting an output file, and creates a Saver.file_write_lock object to serialise write-accesses to the file from dask tasks : All dask-task file writes go via a "iris.fileformats.netcdf.saver.NetCDFWriteProxy" object, which also contains a link From 445fbe21b63b034648791269d6ab431e1c25069a Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Tue, 11 Apr 2023 17:22:24 +0100 Subject: [PATCH 47/85] Arrange tests + results to organise by package-name alone. --- .../netcdf/saver/{saver => }/Saver/write/endian.cdl | 0 .../netcdf/saver/{saver => }/Saver/write/mercator.cdl | 0 .../saver/{saver => }/Saver/write/mercator_no_ellipsoid.cdl | 0 .../netcdf/saver/{saver => }/Saver/write/stereographic.cdl | 0 .../{saver => }/Saver/write/stereographic_no_ellipsoid.cdl | 0 .../{saver => }/Saver/write/stereographic_scale_factor.cdl | 0 .../saver/{saver => }/Saver/write/transverse_mercator.cdl | 0 .../Saver/write/transverse_mercator_no_ellipsoid.cdl | 0 .../saver/{saver => }/Saver/write/with_climatology.cdl | 0 .../Saver__ugrid/TestSaveUgrid__cube/basic_mesh.cdl | 0 .../tests/unit/fileformats/netcdf/saver/saver/__init__.py | 6 ------ .../unit/fileformats/netcdf/saver/{saver => }/test_Saver.py | 0 .../netcdf/saver/{saver => }/test_Saver__lazy.py | 2 +- ..._lazy_stream_data.py => test_Saver__lazy_stream_data.py} | 0 .../netcdf/saver/{saver => }/test_Saver__ugrid.py | 0 15 files changed, 1 insertion(+), 7 deletions(-) rename lib/iris/tests/results/unit/fileformats/netcdf/saver/{saver => }/Saver/write/endian.cdl (100%) rename lib/iris/tests/results/unit/fileformats/netcdf/saver/{saver => }/Saver/write/mercator.cdl (100%) rename lib/iris/tests/results/unit/fileformats/netcdf/saver/{saver => }/Saver/write/mercator_no_ellipsoid.cdl (100%) rename lib/iris/tests/results/unit/fileformats/netcdf/saver/{saver => }/Saver/write/stereographic.cdl (100%) rename lib/iris/tests/results/unit/fileformats/netcdf/saver/{saver => }/Saver/write/stereographic_no_ellipsoid.cdl (100%) rename lib/iris/tests/results/unit/fileformats/netcdf/saver/{saver => }/Saver/write/stereographic_scale_factor.cdl (100%) rename lib/iris/tests/results/unit/fileformats/netcdf/saver/{saver => }/Saver/write/transverse_mercator.cdl (100%) rename lib/iris/tests/results/unit/fileformats/netcdf/saver/{saver => }/Saver/write/transverse_mercator_no_ellipsoid.cdl (100%) rename lib/iris/tests/results/unit/fileformats/netcdf/saver/{saver => }/Saver/write/with_climatology.cdl (100%) rename lib/iris/tests/results/unit/fileformats/netcdf/saver/{saver => }/Saver__ugrid/TestSaveUgrid__cube/basic_mesh.cdl (100%) delete mode 100644 lib/iris/tests/unit/fileformats/netcdf/saver/saver/__init__.py rename lib/iris/tests/unit/fileformats/netcdf/saver/{saver => }/test_Saver.py (100%) rename lib/iris/tests/unit/fileformats/netcdf/saver/{saver => }/test_Saver__lazy.py (98%) rename lib/iris/tests/unit/fileformats/netcdf/saver/{saver/test__lazy_stream_data.py => test_Saver__lazy_stream_data.py} (100%) rename lib/iris/tests/unit/fileformats/netcdf/saver/{saver => }/test_Saver__ugrid.py (100%) diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/endian.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/endian.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/endian.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/endian.cdl diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/mercator.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/mercator.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/mercator.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/mercator.cdl diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/mercator_no_ellipsoid.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/mercator_no_ellipsoid.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/mercator_no_ellipsoid.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/mercator_no_ellipsoid.cdl diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/stereographic.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/stereographic.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/stereographic.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/stereographic.cdl diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/stereographic_no_ellipsoid.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/stereographic_no_ellipsoid.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/stereographic_no_ellipsoid.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/stereographic_no_ellipsoid.cdl diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/stereographic_scale_factor.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/stereographic_scale_factor.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/stereographic_scale_factor.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/stereographic_scale_factor.cdl diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/transverse_mercator.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/transverse_mercator.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/transverse_mercator.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/transverse_mercator.cdl diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/transverse_mercator_no_ellipsoid.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/transverse_mercator_no_ellipsoid.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/transverse_mercator_no_ellipsoid.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/transverse_mercator_no_ellipsoid.cdl diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/with_climatology.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/with_climatology.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver/write/with_climatology.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver/write/with_climatology.cdl diff --git a/lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver__ugrid/TestSaveUgrid__cube/basic_mesh.cdl b/lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver__ugrid/TestSaveUgrid__cube/basic_mesh.cdl similarity index 100% rename from lib/iris/tests/results/unit/fileformats/netcdf/saver/saver/Saver__ugrid/TestSaveUgrid__cube/basic_mesh.cdl rename to lib/iris/tests/results/unit/fileformats/netcdf/saver/Saver__ugrid/TestSaveUgrid__cube/basic_mesh.cdl diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/saver/__init__.py b/lib/iris/tests/unit/fileformats/netcdf/saver/saver/__init__.py deleted file mode 100644 index ab53ddadda..0000000000 --- a/lib/iris/tests/unit/fileformats/netcdf/saver/saver/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright Iris contributors -# -# This file is part of Iris and is released under the LGPL license. -# See COPYING and COPYING.LESSER in the root of the repository for full -# licensing details. -"""Unit tests for the :class:`iris.fileformats.netcdf.saver.Saver` class.""" diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/saver/test_Saver.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver.py similarity index 100% rename from lib/iris/tests/unit/fileformats/netcdf/saver/saver/test_Saver.py rename to lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver.py diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/saver/test_Saver__lazy.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy.py similarity index 98% rename from lib/iris/tests/unit/fileformats/netcdf/saver/saver/test_Saver__lazy.py rename to lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy.py index fe70b38fea..e1211dc276 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/saver/saver/test_Saver__lazy.py +++ b/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy.py @@ -14,7 +14,7 @@ from iris.coords import AuxCoord from iris.fileformats.netcdf import Saver from iris.tests import stock -from iris.tests.unit.fileformats.netcdf.saver.saver import test_Saver +from iris.tests.unit.fileformats.netcdf.saver import test_Saver class LazyMixin(tests.IrisTest): diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/saver/test__lazy_stream_data.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy_stream_data.py similarity index 100% rename from lib/iris/tests/unit/fileformats/netcdf/saver/saver/test__lazy_stream_data.py rename to lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy_stream_data.py diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/saver/test_Saver__ugrid.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__ugrid.py similarity index 100% rename from lib/iris/tests/unit/fileformats/netcdf/saver/saver/test_Saver__ugrid.py rename to lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__ugrid.py From 09cb22e8bf40375c60cab2c62d89157d6f3cac79 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Tue, 11 Apr 2023 18:48:48 +0100 Subject: [PATCH 48/85] Review changes. --- docs/src/userguide/real_and_lazy_data.rst | 14 ++--- docs/src/whatsnew/latest.rst | 5 +- lib/iris/fileformats/netcdf/saver.py | 8 ++- lib/iris/io/__init__.py | 1 - .../integration/netcdf/test_delayed_save.py | 51 +++++++++++++++++-- .../saver/test_Saver__lazy_stream_data.py | 10 ++-- .../fileformats/netcdf/saver/test_save.py | 8 +-- 7 files changed, 71 insertions(+), 26 deletions(-) diff --git a/docs/src/userguide/real_and_lazy_data.rst b/docs/src/userguide/real_and_lazy_data.rst index aeeaf3de86..f1be17e3fc 100644 --- a/docs/src/userguide/real_and_lazy_data.rst +++ b/docs/src/userguide/real_and_lazy_data.rst @@ -240,18 +240,18 @@ for more information on setting dask processing options. .. _delayed_netcdf_save: -Delayed netCDF Saving +Delayed NetCDF Saving --------------------- -When saving data to netCDF files, it is possible to *delay* writing lazy content to the +When saving data to NetCDF files, it is possible to *delay* writing lazy content to the output file, to be performed by `Dask `_ later, thus enabling parallel save operations. This works in the following way : - 1. an :func:`iris.save` call is made, with a netcdf file output and the additional + 1. an :func:`iris.save` call is made, with a NetCDF file output and the additional keyword ``compute=False``. - This is currently *only* available when saving to netCDF, so it is documented in - the netCDF file format API. See : :func:`iris.fileformats.netcdf.save`. + This is currently *only* available when saving to NetCDF, so it is documented in + the Iris NetCDF file format API. See: :func:`iris.fileformats.netcdf.save`. 2. the call creates the output file, but does not fill in variables' data, where the data is a lazy array in the Iris object. Instead, these variables are @@ -270,6 +270,6 @@ from shared lazy input data, these can be computed in parallel efficiently by Da can do. .. note:: - This feature does **not** enable parallel writes to the *same* netCDF output file. + This feature does **not** enable parallel writes to the *same* NetCDF output file. That can only be done on certain operating systems, with a specially configured - build of the netCDF C library, and is not supported by Iris at present. + build of the NetCDF C library, and is not supported by Iris at present. diff --git a/docs/src/whatsnew/latest.rst b/docs/src/whatsnew/latest.rst index 15c2e02c06..8b2f224bce 100644 --- a/docs/src/whatsnew/latest.rst +++ b/docs/src/whatsnew/latest.rst @@ -53,8 +53,9 @@ This document explains the changes made to Iris for this release enable lazy computation of rotated wind vector components (:issue:`4934`, :pull:`4972`) -#. `@pp-mo`_ supported delayed saving of lazy data, when writing to the netCDF file - format. See : :ref:`delayed netCDF saves `. +#. `@pp-mo`_ and `@lbdreyer`_ supported delayed saving of lazy data, when writing to + the netCDF file format. See : :ref:`delayed netCDF saves `. + Also with significant input from `@fnattino`_. (:pull:`5191`) diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index 67a63ffc2a..7a89cccb30 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -308,6 +308,10 @@ def _data_fillvalue_check(arraylib, data, check_value): return is_masked, contains_value +class SaverFillValueWarning(UserWarning): + pass + + def _fillvalue_report(fill_info, is_masked, contains_fill_value, warn=False): """ From the given information, work out whether there was a possible or actual @@ -336,7 +340,7 @@ def _fillvalue_report(fill_info, is_masked, contains_fill_value, warn=False): is_byte_data = fill_info.dtype.itemsize == 1 result = None if is_byte_data and is_masked and user_value is None: - result = UserWarning( + result = SaverFillValueWarning( f"CF var '{varname}' contains byte data with masked points, but " "no fill_value keyword was given. As saved, these " "points will read back as valid values. To save as " @@ -345,7 +349,7 @@ def _fillvalue_report(fill_info, is_masked, contains_fill_value, warn=False): "keyword during saving, otherwise use ncedit/equivalent." ) elif contains_fill_value: - result = UserWarning( + result = SaverFillValueWarning( f"CF var '{varname}' contains unmasked data points equal to the " f"fill-value, {check_value}. As saved, these points will read back " "as missing data. To save these as normal values, " diff --git a/lib/iris/io/__init__.py b/lib/iris/io/__init__.py index 3de54e1cca..c93642f81c 100644 --- a/lib/iris/io/__init__.py +++ b/lib/iris/io/__init__.py @@ -473,7 +473,6 @@ def save(source, target, saver=None, **kwargs): # Force append=True for the tail cubes. Don't modify the incoming # kwargs. kwargs = kwargs.copy() - result = [] for i, cube in enumerate(source): if i != 0: kwargs["append"] = True diff --git a/lib/iris/tests/integration/netcdf/test_delayed_save.py b/lib/iris/tests/integration/netcdf/test_delayed_save.py index e6352b7e62..1a7ef2459e 100644 --- a/lib/iris/tests/integration/netcdf/test_delayed_save.py +++ b/lib/iris/tests/integration/netcdf/test_delayed_save.py @@ -18,6 +18,7 @@ import iris from iris.fileformats.netcdf._thread_safe_nc import default_fillvals +from iris.fileformats.netcdf.saver import SaverFillValueWarning import iris.tests from iris.tests.stock import realistic_4d @@ -39,6 +40,7 @@ def make_testcube( include_lazy_content=True, ensure_fillvalue_collision=False, data_is_maskedbytes=False, + include_extra_coordlikes=False, ): cube = realistic_4d() @@ -80,6 +82,24 @@ def fix_array(array): cube.data = fix_array(cube.data) auxcoord = cube.coord("surface_altitude") auxcoord.points = fix_array(auxcoord.points) + + if include_extra_coordlikes: + # Also concoct + attach an ancillary variable and a cell-measure, so we can + # check that they behave the same as coordinates. + ancil_dims = [0, 2] + cm_dims = [0, 3] + ancil_shape = [cube.shape[idim] for idim in ancil_dims] + cm_shape = [cube.shape[idim] for idim in cm_dims] + from iris.coords import AncillaryVariable, CellMeasure + + ancil = AncillaryVariable( + fix_array(np.zeros(ancil_shape)), long_name="sample_ancil" + ) + cube.add_ancillary_variable(ancil, ancil_dims) + cm = CellMeasure( + fix_array(np.zeros(cm_shape)), long_name="sample_cm" + ) + cube.add_cell_measure(cm, cm_dims) return cube def test_realfile_loadsave_equivalence(self, save_is_delayed, output_path): @@ -106,8 +126,8 @@ def test_realfile_loadsave_equivalence(self, save_is_delayed, output_path): reloaded_cubes = iris.load(output_path) reloaded_cubes = sorted(reloaded_cubes, key=lambda cube: cube.name()) assert reloaded_cubes == original_cubes - # NOTE: it might be nicer to do assertCDL, but I', not sure how to access that - # from pytest-style test code ? + # NOTE: it might be nicer to use assertCDL, but unfortunately importing + # unitest.TestCase seems to lose us the ability to use fixtures. @staticmethod def getmask(cube_or_coord): @@ -122,8 +142,11 @@ def test_time_of_writing(self, save_is_delayed, output_path): # Check when lazy data is actually written : # - in 'immediate' mode, on initial file write # - in 'delayed' mode, only when delayed-write is executed. - original_cube = self.make_testcube() + original_cube = self.make_testcube(include_extra_coordlikes=True) assert original_cube.has_lazy_data() + assert original_cube.coord("surface_altitude").has_lazy_points() + assert original_cube.cell_measure("sample_cm").has_lazy_data() + assert original_cube.ancillary_variable("sample_ancil").has_lazy_data() result = iris.save( original_cube, output_path, compute=not save_is_delayed @@ -139,20 +162,34 @@ def test_time_of_writing(self, save_is_delayed, output_path): # If 'delayed', the lazy content should all be masked, otherwise none of it. data_mask = self.getmask(readback_cube) coord_mask = self.getmask(readback_cube.coord("surface_altitude")) + ancil_mask = self.getmask( + readback_cube.ancillary_variable("sample_ancil") + ) + cm_mask = self.getmask(readback_cube.cell_measure("sample_cm")) if save_is_delayed: assert np.all(data_mask) assert np.all(coord_mask) + assert np.all(ancil_mask) + assert np.all(cm_mask) else: assert np.all(~data_mask) assert np.all(~coord_mask) + assert np.all(~ancil_mask) + assert np.all(~cm_mask) if save_is_delayed: result.compute() # Re-fetch the arrays. The data is **no longer masked**. data_mask = self.getmask(readback_cube) coord_mask = self.getmask(readback_cube.coord("surface_altitude")) + ancil_mask = self.getmask( + readback_cube.ancillary_variable("sample_ancil") + ) + cm_mask = self.getmask(readback_cube.cell_measure("sample_cm")) assert np.all(~data_mask) assert np.all(~coord_mask) + assert np.all(~ancil_mask) + assert np.all(~cm_mask) @pytest.mark.parametrize( "warning_type", ["WarnMaskedBytes", "WarnFillvalueCollision"] @@ -181,12 +218,16 @@ def test_fill_warnings(self, warning_type, output_path, save_is_delayed): result = iris.save(cube, output_path, compute=not save_is_delayed) if not save_is_delayed: - result_warnings = [log.message for log in logged_warnings] + result_warnings = [ + log.message + for log in logged_warnings + if isinstance(log.message, SaverFillValueWarning) + ] else: assert len(logged_warnings) == 0 # Complete the operation now # NOTE: warnings should not be *issued* here, instead they are returned. - warnings.simplefilter("error") + warnings.simplefilter("error", category=SaverFillValueWarning) result_warnings = result.compute() # Either way, we should now have 2 similar warnings. diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy_stream_data.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy_stream_data.py index ca71755ff1..7537ec2c3c 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy_stream_data.py +++ b/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy_stream_data.py @@ -26,7 +26,7 @@ class Test__lazy_stream_data: @staticmethod @pytest.fixture(autouse=True) def saver_patch(): - # Install patches, so we can creata a Saver without opening a real output file. + # Install patches, so we can create a Saver without opening a real output file. # Mock just enough of Dataset behaviour to allow a 'Saver.complete()' call. mock_dataset = mock.MagicMock(_isopen=False) mock_dataset_class = mock.Mock(return_value=mock_dataset) @@ -63,9 +63,9 @@ def saver(compute) -> Saver: ) @staticmethod - def mock_var(shape, dtype=np.float32): + def mock_var(shape): # Create a test cf_var object - return mock.MagicMock(shape=tuple(shape), dtype=np.dtype(dtype)) + return mock.MagicMock(shape=tuple(shape), dtype=np.dtype(np.float32)) def test_data_save(self, compute, data_is_lazy): """Real data is transferred immediately, lazy data creates a delayed write.""" @@ -81,9 +81,9 @@ def test_data_save(self, compute, data_is_lazy): assert cf_var.__setitem__.call_count == (0 if data_is_lazy else 1) assert len(saver._delayed_writes) == (1 if data_is_lazy else 0) if data_is_lazy: - result_data, result__write, fill_info = saver._delayed_writes[0] + result_data, result_writer, fill_info = saver._delayed_writes[0] assert result_data is data - assert isinstance(result__write, nc_threadsafe.NetCDFWriteProxy) + assert isinstance(result_writer, nc_threadsafe.NetCDFWriteProxy) assert isinstance(fill_info, _FillvalueCheckInfo) else: cf_var.__setitem__.assert_called_once_with(slice(None), data) diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/test_save.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test_save.py index 284ec9ad97..68049b57fc 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/saver/test_save.py +++ b/lib/iris/tests/unit/fileformats/netcdf/saver/test_save.py @@ -4,6 +4,10 @@ # See COPYING and COPYING.LESSER in the root of the repository for full # licensing details. """Unit tests for the :func:`iris.fileformats.netcdf.save` function.""" +# Import iris.tests first so that some things can be initialised before +# importing anything else. +import iris.tests as tests # isort:skip + from pathlib import Path from shutil import rmtree from tempfile import mkdtemp @@ -25,10 +29,6 @@ from iris.tests.stock import lat_lon_cube from iris.tests.stock.mesh import sample_mesh_cube -# Import iris.tests first so that some things can be initialised before -# importing anything else. -import iris.tests as tests # isort:skip - class Test_conventions(tests.IrisTest): def setUp(self): From 3445f5874d14de00944ae63bb892dcd16a130830 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 12 Apr 2023 12:05:24 +0100 Subject: [PATCH 49/85] Review changes. --- lib/iris/fileformats/netcdf/_dask_locks.py | 2 +- lib/iris/fileformats/netcdf/saver.py | 22 +++++++++---------- .../integration/netcdf/test_delayed_save.py | 13 +++++------ .../saver/test__data_fillvalue_check.py | 6 +---- .../netcdf/saver/test__fillvalue_report.py | 19 +++++++--------- 5 files changed, 26 insertions(+), 36 deletions(-) diff --git a/lib/iris/fileformats/netcdf/_dask_locks.py b/lib/iris/fileformats/netcdf/_dask_locks.py index 4ee854ee28..4a9a21c320 100644 --- a/lib/iris/fileformats/netcdf/_dask_locks.py +++ b/lib/iris/fileformats/netcdf/_dask_locks.py @@ -32,7 +32,7 @@ distributed.Lock is deserialised to reconstruct the worker task, this creates an object that communicates with the scheduler. These objects behave as a single common lock, as they all have the same string 'identity', so the scheduler implements inter-process -communication so that they can mutally exclude each other. +communication so that they can mutually exclude each other. It is also *conceivable* that multiple processes could write to the same file in parallel, if the operating system supports it. However, this also requires that the diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index 7a89cccb30..5cf76f4715 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -293,11 +293,11 @@ def _data_fillvalue_check(arraylib, data, check_value): Returns ------- - is_masked : bool - True if array has any masked points. - contains_value : bool - True if array contains check_value. - Always False if check_value is None. + is_masked : bool + True if array has any masked points. + contains_value : bool + True if array contains check_value. + Always False if check_value is None. """ is_masked = arraylib.any(arraylib.ma.getmaskarray(data)) @@ -322,7 +322,7 @@ def _fillvalue_report(fill_info, is_masked, contains_fill_value, warn=False): fill_info : _FillvalueCheckInfo A named-tuple containing the context of the fill-value check is_masked : bool - whether the data arary was masked + whether the data array was masked contains_fill_value : bool whether the data array contained the fill-value warn : bool @@ -2381,7 +2381,7 @@ def _lazy_stream_data(self, data, fill_value, fill_warn, cf_var): # save lazy data with a delayed operation. For now, we just record the # necessary information -- a single, complete delayed action is constructed # later by a call to delayed_completion(). - def store(data, cf_var, fill_value): + def store(data, cf_var, fill_info): # Create a data-writeable object that we can stream into, which # encapsulates the file to be opened + variable to be written. write_wrapper = _thread_safe_nc.NetCDFWriteProxy( @@ -2397,14 +2397,12 @@ def store(data, cf_var, fill_value): else: # Real data is always written directly, i.e. not via lazy save. # We also check it immediately for any fill-value problems. - def store(data, cf_var, fill_value): + def store(data, cf_var, fill_info): cf_var[:] = data - return _data_fillvalue_check(np, data, fill_value) + return _data_fillvalue_check(np, data, fill_info.check_value) # Store the data and check if it is masked and contains the fill value. - is_masked, contains_fill_value = store( - data, cf_var, fill_value_to_check - ) + is_masked, contains_fill_value = store(data, cf_var, fill_info) if not doing_delayed_save: # Issue a fill-value warning immediately, if appropriate. diff --git a/lib/iris/tests/integration/netcdf/test_delayed_save.py b/lib/iris/tests/integration/netcdf/test_delayed_save.py index 1a7ef2459e..81e1ba1062 100644 --- a/lib/iris/tests/integration/netcdf/test_delayed_save.py +++ b/lib/iris/tests/integration/netcdf/test_delayed_save.py @@ -245,25 +245,24 @@ def test_no_delayed_writes(self, output_path): assert isinstance(result, Delayed) assert result.compute() == [] - _distributed_client = None - @classmethod @pytest.fixture(params=["ThreadedScheduler", "DistributedScheduler"]) def scheduler_type(cls, request): sched_typename = request.param if sched_typename == "ThreadedScheduler": config_name = "threads" - if cls._distributed_client is not None: - cls._distributed_client.close() - cls._distributed_client = None else: config_name = "distributed" - if cls._distributed_client is None: - cls._distributed_client = distributed.Client() + + if config_name == "distributed": + _distributed_client = distributed.Client() with dask.config.set(scheduler=config_name): yield sched_typename + if config_name == "distributed": + _distributed_client.close() + def test_distributed(self, output_path, scheduler_type, save_is_delayed): # Check operation works, and behaves the same, with a distributed scheduler. diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/test__data_fillvalue_check.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test__data_fillvalue_check.py index 39af800535..95a518e4e5 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/saver/test__data_fillvalue_check.py +++ b/lib/iris/tests/unit/fileformats/netcdf/saver/test__data_fillvalue_check.py @@ -6,11 +6,7 @@ """ Unit tests for :func:`iris.fileformats.netcdf.saver._data_fillvalue_check`. -Repurposed from -`iris.tests.unit.fileformats.netcdf.test__FillValueMaskCheckAndStoreTarget.py`, -to show that the logic is basically the same. - -Now runs all testcases on both real + lazy data. +Note: now runs all testcases on both real + lazy data. """ diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/test__fillvalue_report.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test__fillvalue_report.py index 035f6ca80f..b2e4b63e3a 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/saver/test__fillvalue_report.py +++ b/lib/iris/tests/unit/fileformats/netcdf/saver/test__fillvalue_report.py @@ -4,14 +4,7 @@ # See COPYING and COPYING.LESSER in the root of the repository for full # licensing details. """ -Unit tests for :func:`iris.fileformats.netcdf.saver._data_fillvalue_check`. - -Repurposed from -`iris.tests.unit.fileformats.netcdf.test__FillValueMaskCheckAndStoreTarget.py`, -to show that the logic is basically the same. - -Now runs all testcases on both real + lazy data. - +Unit tests for :func:`iris.fileformats.netcdf.saver._fillvalue_report`. """ import warnings @@ -20,6 +13,7 @@ from iris.fileformats.netcdf._thread_safe_nc import default_fillvals from iris.fileformats.netcdf.saver import ( + SaverFillValueWarning, _fillvalue_report, _FillvalueCheckInfo, ) @@ -98,10 +92,13 @@ def test_warn(self, has_collision): # Check that we get the expected warning expected_msg = "'' contains unmasked data points equal to the fill-value" # Enter a warnings context that checks for the error. - warning_context = pytest.warns(match=expected_msg).__enter__() + warning_context = pytest.warns( + SaverFillValueWarning, match=expected_msg + ) + warning_context.__enter__() else: - # Check that we get NO warning. - warnings.filterwarnings("error") + # Check that we get NO warning of the expected type. + warnings.filterwarnings("error", category=SaverFillValueWarning) # Do call: it should raise AND return a warning, ONLY IF there was a collision. result = _fillvalue_report( From cb1e1f7add2e8c1211c672d5ea4fa8a4b7bbe155 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Wed, 12 Apr 2023 16:13:07 +0100 Subject: [PATCH 50/85] Enhance tests + debug. --- lib/iris/fileformats/netcdf/saver.py | 4 +++ .../integration/netcdf/test_delayed_save.py | 35 +++++++++++++++---- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index 5cf76f4715..f8d785f69e 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -2533,6 +2533,7 @@ def save( packing=None, fill_value=None, compute=True, + return_saver_list=None, ): """ Save cube(s) to a netCDF file, given the cube and the filename. @@ -2826,4 +2827,7 @@ def is_valid_packspec(p): # Return a delayed completion object. result = sman.delayed_completion() + if return_saver_list is not None: + return_saver_list.append(sman) + return result diff --git a/lib/iris/tests/integration/netcdf/test_delayed_save.py b/lib/iris/tests/integration/netcdf/test_delayed_save.py index 81e1ba1062..a99effce33 100644 --- a/lib/iris/tests/integration/netcdf/test_delayed_save.py +++ b/lib/iris/tests/integration/netcdf/test_delayed_save.py @@ -138,7 +138,9 @@ def getmask(cube_or_coord): data = cube_or_coord.data return np.ma.getmaskarray(data) - def test_time_of_writing(self, save_is_delayed, output_path): + def test_time_of_writing( + self, save_is_delayed, output_path # , scheduler_type + ): # Check when lazy data is actually written : # - in 'immediate' mode, on initial file write # - in 'delayed' mode, only when delayed-write is executed. @@ -148,8 +150,12 @@ def test_time_of_writing(self, save_is_delayed, output_path): assert original_cube.cell_measure("sample_cm").has_lazy_data() assert original_cube.ancillary_variable("sample_ancil").has_lazy_data() + return_saver_list = [] result = iris.save( - original_cube, output_path, compute=not save_is_delayed + original_cube, + output_path, + compute=not save_is_delayed, + return_saver_list=return_saver_list, ) assert save_is_delayed == (result is not None) @@ -178,6 +184,9 @@ def test_time_of_writing(self, save_is_delayed, output_path): assert np.all(~cm_mask) if save_is_delayed: + saver = return_saver_list[0] + assert len(saver._delayed_writes) != 0 + assert len(saver._delayed_writes) == 4 result.compute() # Re-fetch the arrays. The data is **no longer masked**. data_mask = self.getmask(readback_cube) @@ -186,10 +195,24 @@ def test_time_of_writing(self, save_is_delayed, output_path): readback_cube.ancillary_variable("sample_ancil") ) cm_mask = self.getmask(readback_cube.cell_measure("sample_cm")) - assert np.all(~data_mask) - assert np.all(~coord_mask) - assert np.all(~ancil_mask) - assert np.all(~cm_mask) + results = [ + np.all(~x) + for x in (data_mask, coord_mask, ancil_mask, cm_mask) + ] + shapes = [ + x.shape for x in (data_mask, coord_mask, ancil_mask, cm_mask) + ] + assert shapes == [ + (6, 70, 100, 100), + (100, 100), + (6, 100), + (6, 100), + ] + assert results == [True, True, True, True] + # assert np.all(~data_mask) + # assert np.all(~coord_mask) + # assert np.all(~ancil_mask) + # assert np.all(~cm_mask) @pytest.mark.parametrize( "warning_type", ["WarnMaskedBytes", "WarnFillvalueCollision"] From 1c81cee87b0e2ebdbb943a155b39fc8c9793fdac Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 13 Apr 2023 10:28:38 +0100 Subject: [PATCH 51/85] Support scheduler type 'single-threaded'; allow retries on delayed-save test. --- lib/iris/fileformats/netcdf/_dask_locks.py | 4 +- .../integration/netcdf/test_delayed_save.py | 83 +++++++++++++------ 2 files changed, 61 insertions(+), 26 deletions(-) diff --git a/lib/iris/fileformats/netcdf/_dask_locks.py b/lib/iris/fileformats/netcdf/_dask_locks.py index 4a9a21c320..0099cece85 100644 --- a/lib/iris/fileformats/netcdf/_dask_locks.py +++ b/lib/iris/fileformats/netcdf/_dask_locks.py @@ -95,6 +95,8 @@ def get_dask_array_scheduler_type(): # Detect the ones which we recognise. if get_function == dask.threaded.get: result = "threads" + elif get_function == dask.local.get_sync: + result = "single-threaded" elif get_function == dask.multiprocessing.get: result = "processes" else: @@ -113,7 +115,7 @@ def get_worker_lock(identity: str): """ scheduler_type = get_dask_array_scheduler_type() - if scheduler_type == "threads": + if scheduler_type in ("threads", "single-threaded"): # N.B. the "identity" string is never used in this case, as the same actual # lock object is used by all workers. lock = threading.Lock() diff --git a/lib/iris/tests/integration/netcdf/test_delayed_save.py b/lib/iris/tests/integration/netcdf/test_delayed_save.py index a99effce33..e807b7691f 100644 --- a/lib/iris/tests/integration/netcdf/test_delayed_save.py +++ b/lib/iris/tests/integration/netcdf/test_delayed_save.py @@ -6,6 +6,7 @@ """ Integration tests for delayed saving. """ +import time import warnings from cf_units import Unit @@ -139,7 +140,7 @@ def getmask(cube_or_coord): return np.ma.getmaskarray(data) def test_time_of_writing( - self, save_is_delayed, output_path # , scheduler_type + self, save_is_delayed, output_path, scheduler_type ): # Check when lazy data is actually written : # - in 'immediate' mode, on initial file write @@ -188,27 +189,44 @@ def test_time_of_writing( assert len(saver._delayed_writes) != 0 assert len(saver._delayed_writes) == 4 result.compute() - # Re-fetch the arrays. The data is **no longer masked**. - data_mask = self.getmask(readback_cube) - coord_mask = self.getmask(readback_cube.coord("surface_altitude")) - ancil_mask = self.getmask( - readback_cube.ancillary_variable("sample_ancil") - ) - cm_mask = self.getmask(readback_cube.cell_measure("sample_cm")) - results = [ - np.all(~x) - for x in (data_mask, coord_mask, ancil_mask, cm_mask) - ] - shapes = [ - x.shape for x in (data_mask, coord_mask, ancil_mask, cm_mask) - ] - assert shapes == [ - (6, 70, 100, 100), - (100, 100), - (6, 100), - (6, 100), - ] - assert results == [True, True, True, True] + + # shapes = [ + # x.shape for x in (data_mask, coord_mask, ancil_mask, cm_mask) + # ] + # assert shapes == [ + # (6, 70, 100, 100), + # (100, 100), + # (6, 100), + # (6, 100), + # ] + + n_tries = 0 + all_done = False + n_max_retries = 4 + retry_delay = 3.0 + while not all_done and n_tries < n_max_retries: + n_tries += 1 + + # Re-fetch the arrays. The data is **no longer masked**. + data_mask = self.getmask(readback_cube) + coord_mask = self.getmask( + readback_cube.coord("surface_altitude") + ) + ancil_mask = self.getmask( + readback_cube.ancillary_variable("sample_ancil") + ) + cm_mask = self.getmask(readback_cube.cell_measure("sample_cm")) + results = [ + np.all(~x) + for x in (data_mask, coord_mask, ancil_mask, cm_mask) + ] + all_done = all(results) + + if not all_done: + time.sleep(retry_delay) + + assert all_done and n_tries == 1 + # assert np.all(~data_mask) # assert np.all(~coord_mask) # assert np.all(~ancil_mask) @@ -269,12 +287,21 @@ def test_no_delayed_writes(self, output_path): assert result.compute() == [] @classmethod - @pytest.fixture(params=["ThreadedScheduler", "DistributedScheduler"]) + @pytest.fixture( + params=[ + "ThreadedScheduler", + "DistributedScheduler", + "SingleThreadScheduler", + ] + ) def scheduler_type(cls, request): sched_typename = request.param if sched_typename == "ThreadedScheduler": config_name = "threads" + elif sched_typename == "SingleThreadScheduler": + config_name = "single-threaded" else: + assert sched_typename == "DistributedScheduler" config_name = "distributed" if config_name == "distributed": @@ -286,15 +313,21 @@ def scheduler_type(cls, request): if config_name == "distributed": _distributed_client.close() - def test_distributed(self, output_path, scheduler_type, save_is_delayed): - # Check operation works, and behaves the same, with a distributed scheduler. + def test_scheduler_types( + self, output_path, scheduler_type, save_is_delayed + ): + # Check operation works and behaves the same with different schedulers, + # especially including distributed. # Just check that the dask scheduler is setup as 'expected'. if scheduler_type == "ThreadedScheduler": expected_dask_scheduler = "threads" + elif scheduler_type == "SingleThreadScheduler": + expected_dask_scheduler = "single-threaded" else: assert scheduler_type == "DistributedScheduler" expected_dask_scheduler = "distributed" + assert dask.config.get("scheduler") == expected_dask_scheduler # Use a testcase that produces delayed warnings. From 370837bf97fd023c7a5241e9462615440af5effa Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 13 Apr 2023 10:49:26 +0100 Subject: [PATCH 52/85] Improve test. --- .github/workflows/ci-tests.yml | 13 +--------- .../integration/netcdf/test_delayed_save.py | 24 ++++++++++++++++--- noxfile.py | 21 +++++++++++++--- 3 files changed, 40 insertions(+), 18 deletions(-) diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml index 6dd79e1c1c..d54b77cadc 100644 --- a/.github/workflows/ci-tests.yml +++ b/.github/workflows/ci-tests.yml @@ -36,18 +36,7 @@ jobs: matrix: os: ["ubuntu-latest"] python-version: ["3.10"] - session: ["doctest", "gallery", "linkcheck"] - include: - - os: "ubuntu-latest" - python-version: "3.10" - session: "tests" - coverage: "--coverage" - - os: "ubuntu-latest" - python-version: "3.9" - session: "tests" - - os: "ubuntu-latest" - python-version: "3.8" - session: "tests" + session: ["tests", "tests_no_xdist"] env: IRIS_TEST_DATA_VERSION: "2.19" diff --git a/lib/iris/tests/integration/netcdf/test_delayed_save.py b/lib/iris/tests/integration/netcdf/test_delayed_save.py index e807b7691f..ef55311232 100644 --- a/lib/iris/tests/integration/netcdf/test_delayed_save.py +++ b/lib/iris/tests/integration/netcdf/test_delayed_save.py @@ -6,6 +6,7 @@ """ Integration tests for delayed saving. """ +from datetime import datetime import time import warnings @@ -202,9 +203,10 @@ def test_time_of_writing( n_tries = 0 all_done = False - n_max_retries = 4 + n_max_tries = 4 retry_delay = 3.0 - while not all_done and n_tries < n_max_retries: + start_time = datetime.now() + while not all_done and n_tries < n_max_tries: n_tries += 1 # Re-fetch the arrays. The data is **no longer masked**. @@ -225,7 +227,23 @@ def test_time_of_writing( if not all_done: time.sleep(retry_delay) - assert all_done and n_tries == 1 + # Perform a sequence of checks which should show what happened ... + + end_time = datetime.now() + elapsed = (end_time - start_time).total_seconds() + print("time_of_writing, delayed-save test results:") + print( + f" : all_done={all_done}, tries={n_tries}, elapsed-time={elapsed}" + ) + + # Check it either succeeded or timed out + assert all_done or n_tries >= n_max_tries + + # Did it succeed? (if not must have retried) + assert all_done + + # Did it work first time? + assert n_tries == 1 # assert np.all(~data_mask) # assert np.all(~coord_mask) diff --git a/noxfile.py b/noxfile.py index d34155ecaf..626ae99e38 100755 --- a/noxfile.py +++ b/noxfile.py @@ -169,6 +169,15 @@ def prepare_venv(session: nox.sessions.Session) -> None: @nox.session(python=PY_VER, venv_backend="conda") def tests(session: nox.sessions.Session): + tests_generic(session, use_xdist=True) + + +@nox.session(python=PY_VER, venv_backend="conda") +def tests_no_xdist(session: nox.sessions.Session): + tests_generic(session, use_xdist=False) + + +def tests_generic(session: nox.sessions.Session, use_xdist: bool = True): """ Perform iris system, integration and unit tests. @@ -185,10 +194,16 @@ def tests(session: nox.sessions.Session): session.env.update(ENV) run_args = [ "pytest", - "-n", - "auto", - "lib/iris/tests", + "-v", + "-rA", + "lib/iris/tests/integration/netcdf/test_delayed_save.py", ] + if use_xdist: + run_args[1:1] = [ + "-n", + "auto", + ] + if "-c" in session.posargs or "--coverage" in session.posargs: run_args[-1:-1] = ["--cov=lib/iris", "--cov-report=xml"] session.run(*run_args) From 2f5f3c2fa3007f73af8a6372b1d1488ccc6a0340 Mon Sep 17 00:00:00 2001 From: Henry Wright <84939917+HGWright@users.noreply.github.com> Date: Tue, 4 Apr 2023 12:39:40 +0100 Subject: [PATCH 53/85] Adding a whatsnew entry for 5224 (#5234) * Adding a whatsnew entry explaining 5224 * Fixing link and format error --- docs/src/whatsnew/latest.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/src/whatsnew/latest.rst b/docs/src/whatsnew/latest.rst index 8b2f224bce..b0ca5f1b16 100644 --- a/docs/src/whatsnew/latest.rst +++ b/docs/src/whatsnew/latest.rst @@ -73,6 +73,10 @@ This document explains the changes made to Iris for this release dimension, when the scalar coord provided is already a dim coord. (:issue:`4415`, :pull:`5194`) +#. `@HGWright`_ and `@trexfeathers`_ (reviewer) changed the way + :class:`~iris.coords.CellMethod` are printed to be more CF compliant. + (:pull:`5224`) + 💣 Incompatible Changes ======================= From a55c6f2d756a3355dff1f058eb3c38c5f653e0ec Mon Sep 17 00:00:00 2001 From: Henry Wright Date: Tue, 4 Apr 2023 14:34:18 +0100 Subject: [PATCH 54/85] Replacing numpy legacy printing with array2string and remaking results for dependent tests --- .../COLPEX/small_colpex_theta_p_alt.cml | 2022 +++++++++-------- .../tests/results/FF/air_temperature_1.cml | 30 +- .../tests/results/FF/air_temperature_2.cml | 30 +- .../tests/results/FF/soil_temperature_1.cml | 30 +- .../tests/results/FF/surface_altitude_1.cml | 30 +- lib/iris/tests/results/abf/load.cml | 32 +- lib/iris/tests/results/analysis/abs.cml | 47 +- lib/iris/tests/results/analysis/addition.cml | 47 +- .../results/analysis/addition_coord_x.cml | 47 +- .../results/analysis/addition_coord_y.cml | 47 +- .../analysis/addition_different_std_name.cml | 47 +- .../results/analysis/addition_in_place.cml | 47 +- .../analysis/addition_in_place_coord.cml | 47 +- .../results/analysis/addition_scalar.cml | 47 +- .../results/analysis/aggregated_by/easy.cml | 4 +- .../results/analysis/aggregated_by/multi.cml | 25 +- .../analysis/aggregated_by/multi_missing.cml | 25 +- .../analysis/aggregated_by/multi_shared.cml | 61 +- .../results/analysis/aggregated_by/single.cml | 20 +- .../analysis/aggregated_by/single_missing.cml | 20 +- .../analysis/aggregated_by/single_rms.cml | 20 +- .../analysis/aggregated_by/single_shared.cml | 36 +- .../aggregated_by/single_shared_circular.cml | 37 +- .../analysis/aggregated_by/weighted_easy.cml | 4 +- .../analysis/aggregated_by/weighted_multi.cml | 25 +- .../aggregated_by/weighted_multi_missing.cml | 25 +- .../aggregated_by/weighted_multi_shared.cml | 61 +- .../aggregated_by/weighted_single.cml | 20 +- .../aggregated_by/weighted_single_missing.cml | 20 +- .../aggregated_by/weighted_single_shared.cml | 36 +- .../weighted_single_shared_circular.cml | 37 +- .../tests/results/analysis/apply_ifunc.cml | 47 +- .../analysis/apply_ifunc_frompyfunc.cml | 47 +- .../results/analysis/apply_ifunc_original.cml | 47 +- .../tests/results/analysis/apply_ufunc.cml | 47 +- .../analysis/apply_ufunc_frompyfunc.cml | 47 +- .../results/analysis/apply_ufunc_original.cml | 47 +- .../results/analysis/areaweights_original.cml | 13 +- .../results/analysis/calculus/cos_simple.xml | 2 +- .../analysis/calculus/cos_simple_radians.xml | 2 +- .../calculus/curl_contrived_cartesian2.cml | 99 +- .../calculus/delta_handmade_simple_wrt_x.cml | 2 +- .../calculus/delta_handmade_wrt_lat.cml | 6 +- .../calculus/delta_handmade_wrt_lon.cml | 6 +- .../calculus/delta_handmade_wrt_x.cml | 6 +- .../calculus/delta_handmade_wrt_y.cml | 6 +- .../analysis/calculus/grad_contrived1.cml | 28 +- .../analysis/calculus/grad_contrived2.cml | 44 +- .../grad_contrived_non_spherical1.cml | 32 +- .../analysis/calculus/handmade2_wrt_lat.cml | 32 +- .../analysis/calculus/handmade2_wrt_lon.cml | 32 +- .../calculus/handmade_simple_wrt_x.cml | 2 +- .../analysis/calculus/handmade_wrt_lat.cml | 6 +- .../analysis/calculus/handmade_wrt_lon.cml | 6 +- .../analysis/calculus/handmade_wrt_x.cml | 6 +- .../analysis/calculus/handmade_wrt_y.cml | 6 +- .../tests/results/analysis/count_bar_2d.cml | 10 +- .../tests/results/analysis/count_foo_1d.cml | 2 +- .../tests/results/analysis/count_foo_2d.cml | 8 +- .../results/analysis/count_foo_bar_2d.cml | 4 +- .../delta_one_element_explicit.xml | 2 +- .../midpoint_one_element_explicit.xml | 2 +- .../analysis/delta_and_midpoint/simple1.cml | 2 +- .../delta_and_midpoint/simple1_delta.cml | 2 +- .../delta_and_midpoint/simple1_midpoint.cml | 2 +- .../analysis/delta_and_midpoint/simple2.cml | 2 +- .../delta_and_midpoint/simple2_delta.cml | 2 +- .../delta_and_midpoint/simple2_midpoint.cml | 2 +- .../analysis/delta_and_midpoint/simple3.cml | 8 +- .../delta_and_midpoint/simple3_delta.cml | 8 +- .../delta_and_midpoint/simple3_midpoint.cml | 8 +- .../analysis/delta_and_midpoint/simple4.cml | 8 +- .../delta_and_midpoint/simple4_delta.cml | 6 +- .../delta_and_midpoint/simple4_midpoint.cml | 6 +- .../analysis/delta_and_midpoint/simple5.cml | 2 +- .../delta_and_midpoint/simple5_delta.cml | 2 +- .../delta_and_midpoint/simple5_midpoint.cml | 2 +- .../analysis/delta_and_midpoint/simple6.cml | 2 +- lib/iris/tests/results/analysis/division.cml | 47 +- .../results/analysis/division_by_array.cml | 47 +- .../results/analysis/division_by_latitude.cml | 47 +- .../analysis/division_by_longitude.cml | 47 +- .../analysis/division_by_singular_coord.cml | 47 +- .../results/analysis/division_scalar.cml | 47 +- lib/iris/tests/results/analysis/exp.cml | 22 +- .../tests/results/analysis/exponentiate.cml | 47 +- .../analysis/first_quartile_foo_1d.cml | 2 +- .../first_quartile_foo_1d_fast_percentile.cml | 2 +- .../analysis/first_quartile_foo_2d.cml | 8 +- .../first_quartile_foo_2d_fast_percentile.cml | 8 +- .../analysis/first_quartile_foo_bar_2d.cml | 4 +- ...st_quartile_foo_bar_2d_fast_percentile.cml | 4 +- .../tests/results/analysis/gmean_latitude.cml | 15 +- .../analysis/gmean_latitude_longitude.cml | 11 +- .../gmean_latitude_longitude_1call.cml | 11 +- .../tests/results/analysis/hmean_latitude.cml | 15 +- .../analysis/hmean_latitude_longitude.cml | 11 +- .../hmean_latitude_longitude_1call.cml | 11 +- .../analysis/last_quartile_foo_3d_masked.cml | 6 +- .../last_quartile_foo_3d_notmasked.cml | 6 +- ...rtile_foo_3d_notmasked_fast_percentile.cml | 6 +- lib/iris/tests/results/analysis/log.cml | 47 +- lib/iris/tests/results/analysis/log10.cml | 47 +- lib/iris/tests/results/analysis/log2.cml | 47 +- .../tests/results/analysis/maths_original.cml | 47 +- .../tests/results/analysis/max_latitude.cml | 15 +- .../analysis/max_latitude_longitude.cml | 11 +- .../analysis/max_latitude_longitude_1call.cml | 11 +- .../tests/results/analysis/max_run_bar_2d.cml | 10 +- .../analysis/max_run_bar_2d_masked.cml | 10 +- .../tests/results/analysis/max_run_foo_1d.cml | 2 +- .../tests/results/analysis/max_run_foo_2d.cml | 8 +- .../tests/results/analysis/mean_latitude.cml | 15 +- .../analysis/mean_latitude_longitude.cml | 11 +- .../mean_latitude_longitude_1call.cml | 11 +- .../results/analysis/median_latitude.cml | 15 +- .../analysis/median_latitude_longitude.cml | 11 +- .../median_latitude_longitude_1call.cml | 11 +- .../tests/results/analysis/min_latitude.cml | 15 +- .../analysis/min_latitude_longitude.cml | 11 +- .../analysis/min_latitude_longitude_1call.cml | 11 +- lib/iris/tests/results/analysis/multiply.cml | 47 +- .../analysis/multiply_different_std_name.cml | 47 +- lib/iris/tests/results/analysis/original.cml | 16 +- .../results/analysis/original_common.cml | 16 +- .../tests/results/analysis/original_hmean.cml | 16 +- .../results/analysis/proportion_bar_2d.cml | 10 +- .../results/analysis/proportion_foo_1d.cml | 2 +- .../results/analysis/proportion_foo_2d.cml | 8 +- .../analysis/proportion_foo_2d_masked.cml | 10 +- .../analysis/proportion_foo_bar_2d.cml | 4 +- .../analysis/regrid/linear_both_circular.cml | 36 +- .../analysis/regrid/linear_circular_grid.cml | 32 +- .../analysis/regrid/linear_circular_src.cml | 36 +- .../regrid/linear_circular_srcmissingmask.cml | 36 +- .../regrid/linear_masked_altitude.cml | 134 +- .../analysis/regrid/linear_non_circular.cml | 32 +- .../regrid/linear_partial_overlap.cml | 106 +- .../results/analysis/regrid/linear_subset.cml | 134 +- .../analysis/regrid/linear_subset_anon.cml | 129 +- .../regrid/linear_subset_masked_1.cml | 134 +- .../regrid/linear_subset_masked_2.cml | 134 +- .../analysis/regrid/nearest_both_circular.cml | 36 +- .../analysis/regrid/nearest_circular_grid.cml | 32 +- .../analysis/regrid/nearest_circular_src.cml | 36 +- .../nearest_circular_srcmissingmask.cml | 36 +- .../regrid/nearest_masked_altitude.cml | 134 +- .../analysis/regrid/nearest_non_circular.cml | 32 +- .../regrid/nearest_partial_overlap.cml | 106 +- .../analysis/regrid/nearest_subset.cml | 134 +- .../analysis/regrid/nearest_subset_anon.cml | 129 +- .../regrid/nearest_subset_masked_1.cml | 134 +- .../regrid/nearest_subset_masked_2.cml | 134 +- .../results/analysis/regrid/no_overlap.cml | 103 +- .../tests/results/analysis/rms_latitude.cml | 15 +- .../analysis/rms_latitude_longitude.cml | 11 +- .../analysis/rms_latitude_longitude_1call.cml | 11 +- .../results/analysis/rms_weighted_2d.cml | 8 +- .../rolling_window/simple_latitude.cml | 6 +- .../rolling_window/simple_longitude.cml | 8 +- .../rolling_window/size_4_longitude.cml | 4 +- lib/iris/tests/results/analysis/sqrt.cml | 47 +- .../results/analysis/std_dev_latitude.cml | 15 +- .../analysis/std_dev_latitude_longitude.cml | 11 +- .../std_dev_latitude_longitude_1call.cml | 11 +- lib/iris/tests/results/analysis/subtract.cml | 47 +- .../tests/results/analysis/subtract_array.cml | 47 +- .../results/analysis/subtract_coord_x.cml | 47 +- .../results/analysis/subtract_coord_y.cml | 47 +- .../results/analysis/subtract_scalar.cml | 47 +- .../tests/results/analysis/sum_latitude.cml | 15 +- .../analysis/sum_latitude_longitude.cml | 11 +- .../analysis/sum_latitude_longitude_1call.cml | 11 +- .../results/analysis/sum_weighted_1d.cml | 2 +- .../results/analysis/sum_weighted_2d.cml | 10 +- .../analysis/third_quartile_foo_1d.cml | 2 +- .../third_quartile_foo_1d_fast_percentile.cml | 2 +- .../results/analysis/variance_latitude.cml | 15 +- .../analysis/variance_latitude_longitude.cml | 11 +- .../variance_latitude_longitude_1call.cml | 11 +- .../results/analysis/weighted_mean_lat.cml | 6 +- .../results/analysis/weighted_mean_latlon.cml | 6 +- .../results/analysis/weighted_mean_lon.cml | 6 +- .../analysis/weighted_mean_original.cml | 60 +- .../results/analysis/weighted_mean_source.cml | 6 +- .../results/categorisation/customcheck.cml | 19 +- .../results/categorisation/quickcheck.cml | 75 +- .../tests/results/cdm/extract/lat_eq_10.cml | 204 +- .../tests/results/cdm/extract/lat_gt_10.cml | 222 +- .../cdm/extract/lat_gt_10_and_lon_ge_10.cml | 223 +- lib/iris/tests/results/cdm/masked_cube.cml | 22 +- .../cdm/test_simple_cube_intersection.cml | 8 +- .../tests/results/concatenate/concat_2x2d.cml | 16 +- .../results/concatenate/concat_2x2d_aux_x.cml | 18 +- .../concatenate/concat_2x2d_aux_x_bounds.cml | 28 +- .../concatenate/concat_2x2d_aux_x_xy.cml | 22 +- .../concatenate/concat_2x2d_aux_x_y.cml | 20 +- .../concatenate/concat_2x2d_aux_x_y_xy.cml | 24 +- .../concatenate/concat_2x2d_aux_xy.cml | 20 +- .../concatenate/concat_2x2d_aux_xy_bounds.cml | 30 +- .../results/concatenate/concat_2x2d_aux_y.cml | 18 +- .../concatenate/concat_2x2d_aux_y_xy.cml | 22 +- .../tests/results/concatenate/concat_2y2d.cml | 16 +- .../results/concatenate/concat_2y2d_aux_x.cml | 18 +- .../concatenate/concat_2y2d_aux_x_xy.cml | 30 +- .../concatenate/concat_2y2d_aux_x_y.cml | 20 +- .../concatenate/concat_2y2d_aux_x_y_xy.cml | 32 +- .../concatenate/concat_2y2d_aux_xy.cml | 28 +- .../results/concatenate/concat_2y2d_aux_y.cml | 18 +- .../concatenate/concat_2y2d_aux_y_xy.cml | 30 +- .../results/concatenate/concat_3d_simple.cml | 86 +- .../concatenate/concat_4mix2d_aux_xy.cml | 24 +- .../concatenate/concat_4x2d_aux_xy.cml | 24 +- .../concatenate/concat_4y2d_aux_xy.cml | 24 +- .../concatenate/concat_9mix2d_aux_xy.cml | 36 +- .../concatenate/concat_9x2d_aux_xy.cml | 36 +- .../concatenate/concat_9y2d_aux_xy.cml | 36 +- .../results/concatenate/concat_anonymous.cml | 16 +- .../concatenate/concat_masked_2x2d.cml | 12 +- .../concatenate/concat_masked_2y2d.cml | 12 +- .../concat_merged_scalar_4mix2d_aux_xy.cml | 26 +- .../concat_merged_scalar_4x2d_aux_xy.cml | 26 +- .../concat_merged_scalar_4y2d_aux_xy.cml | 26 +- ...concat_pre_merged_scalar_4mix2d_aux_xy.cml | 48 +- .../concat_pre_merged_scalar_4x2_aux_xy.cml | 48 +- .../concat_pre_merged_scalar_4y2d_aux_xy.cml | 48 +- .../concat_scalar_4mix2d_aux_xy.cml | 52 +- .../concatenate/concat_scalar_4x2d_aux_xy.cml | 52 +- .../concatenate/concat_scalar_4y2d_aux_xy.cml | 52 +- .../constrained_load/all_10_load_match.cml | 66 +- .../all_ml_10_22_load_match.cml | 82 +- .../constrained_load/attribute_constraint.cml | 205 +- ..._and_theta_level_gt_30_le_3_load_match.cml | 82 +- ...and_theta_level_gt_30_le_3_load_strict.cml | 82 +- .../constrained_load/theta_10_load_match.cml | 16 +- .../constrained_load/theta_10_load_strict.cml | 16 +- .../theta_and_all_10_load_match.cml | 271 +-- .../theta_and_theta_10_load_strict.cml | 221 +- .../theta_and_theta_load_match.cml | 410 ++-- .../theta_and_theta_load_strict.cml | 410 ++-- .../theta_gt_30_le_3_load_match.cml | 66 +- .../theta_gt_30_le_3_load_strict.cml | 66 +- .../theta_lat_30_load_match.cml | 204 +- .../theta_lat_30_load_strict.cml | 204 +- .../theta_lat_gt_30_load_match.cml | 214 +- .../theta_lat_gt_30_load_strict.cml | 214 +- .../constrained_load/theta_load_match.cml | 205 +- .../constrained_load/theta_load_strict.cml | 205 +- lib/iris/tests/results/coord_api/complex.xml | 8 +- .../coord_api/coord_maths/add_float_expl.xml | 47 +- .../coord_api/coord_maths/add_simple_expl.xml | 46 +- .../coord_maths/divide_simple_expl.xml | 46 +- .../coord_api/coord_maths/mult_float_expl.xml | 47 +- .../coord_maths/multiply_simple_expl.xml | 46 +- .../coord_api/coord_maths/negate_expl.xml | 46 +- .../coord_maths/r_subtract_simple_exl.xml | 48 +- .../coord_maths/right_divide_simple_expl.xml | 48 +- .../coord_maths/subtract_simple_expl.xml | 48 +- .../tests/results/coord_api/intersection.xml | 16 +- .../coord_api/intersection_missing.xml | 14 +- .../coord_api/intersection_reversed.xml | 14 +- .../tests/results/coord_api/nd_bounds.cml | 4 +- .../latitude_longitude_dual_stage.cml | 117 +- .../latitude_longitude_single_stage.cml | 117 +- ...latitude_model_level_number_dual_stage.cml | 29 +- ...titude_model_level_number_single_stage.cml | 29 +- .../latitude_time_dual_stage.cml | 128 +- .../latitude_time_single_stage.cml | 128 +- .../longitude_latitude_dual_stage.cml | 117 +- .../longitude_latitude_single_stage.cml | 117 +- ...ongitude_model_level_number_dual_stage.cml | 29 +- ...gitude_model_level_number_single_stage.cml | 29 +- .../longitude_time_dual_stage.cml | 128 +- .../longitude_time_single_stage.cml | 128 +- ...model_level_number_latitude_dual_stage.cml | 29 +- ...del_level_number_latitude_single_stage.cml | 29 +- ...odel_level_number_longitude_dual_stage.cml | 29 +- ...el_level_number_longitude_single_stage.cml | 29 +- .../model_level_number_time_dual_stage.cml | 40 +- .../model_level_number_time_single_stage.cml | 40 +- .../tests/results/cube_collapsed/original.cml | 145 +- .../time_latitude_dual_stage.cml | 128 +- .../time_latitude_single_stage.cml | 128 +- .../time_longitude_dual_stage.cml | 128 +- .../time_longitude_single_stage.cml | 128 +- .../time_model_level_number_dual_stage.cml | 40 +- .../time_model_level_number_single_stage.cml | 40 +- .../triple_collapse_lat_ml_pt.cml | 26 +- .../triple_collapse_ml_pt_lon.cml | 26 +- .../results/cube_io/pickling/cubelist.cml | 990 ++++---- .../results/cube_io/pickling/single_cube.cml | 948 ++++---- .../tests/results/cube_io/pickling/theta.cml | 205 +- .../tests/results/cube_io/pp/load/global.cml | 60 +- .../cube_merge/multidim_coord_merge.cml | 56 +- .../multidim_coord_merge_transpose.cml | 56 +- .../cube_merge/test_orig_point_cube.cml | 4 +- .../cube_merge/test_simple_attributes1.cml | 8 +- .../cube_merge/test_simple_attributes2.cml | 8 +- .../cube_merge/test_simple_attributes3.cml | 4 +- .../cube_merge/test_simple_bound_merge.cml | 14 +- .../results/cube_merge/test_simple_merge.cml | 4 +- .../cube_slice/2d_intersect_and_reverse.cml | 98 +- lib/iris/tests/results/cube_slice/2d_orig.cml | 102 +- .../cube_slice/2d_to_0d_cube_slice.cml | 4 +- .../cube_slice/2d_to_1d_cube_multi_slice.cml | 8 +- .../cube_slice/2d_to_1d_cube_multi_slice2.cml | 22 +- .../cube_slice/2d_to_1d_cube_multi_slice3.cml | 66 +- .../cube_slice/2d_to_1d_cube_slice.cml | 44 +- .../results/cube_slice/2d_to_2d_revesed.cml | 98 +- .../results/cube_slice/2d_transposed.cml | 102 +- .../real_data_dual_tuple_indexing1.cml | 6 +- .../real_data_dual_tuple_indexing2.cml | 8 +- .../real_data_dual_tuple_indexing3.cml | 8 +- .../cube_slice/real_empty_data_indexing.cml | 13 +- .../results/cube_to_pp/no_forecast_period.cml | 8 +- .../results/cube_to_pp/no_forecast_time.cml | 4 +- lib/iris/tests/results/derived/column.cml | 169 +- lib/iris/tests/results/derived/no_orog.cml | 220 +- .../results/derived/removed_derived_coord.cml | 170 +- .../tests/results/derived/removed_orog.cml | 195 +- .../tests/results/derived/removed_sigma.cml | 921 ++++---- lib/iris/tests/results/derived/transposed.cml | 943 ++++---- .../basic_orthogonal_cube.cml | 14 +- .../orthogonal_cube_1d_squashed.cml | 14 +- .../orthogonal_cube_1d_squashed_2.cml | 14 +- .../orthogonal_cube_with_factory.cml | 10 +- .../const_lat_cross_section.cml | 169 +- .../const_lon_cross_section.cml | 164 +- .../higher.cml | 63 +- .../hybridheight.cml | 787 +++---- .../latlonreduced.cml | 8 +- .../lonhalved.cml | 10 +- .../lower.cml | 10 +- .../simple.cml | 14 +- .../ugrid/2D_1t_face_half_levels.cml | 34 +- .../ugrid/2D_72t_face_half_levels.cml | 70 +- .../ugrid/3D_1t_face_full_levels.cml | 43 +- .../ugrid/3D_1t_face_half_levels.cml | 44 +- .../ugrid/3D_snow_pseudo_levels.cml | 34 +- .../ugrid/3D_soil_pseudo_levels.cml | 34 +- .../ugrid/3D_tile_pseudo_levels.cml | 34 +- .../ugrid/3D_veg_pseudo_levels.cml | 34 +- .../experimental/ugrid/surface_mean.cml | 684 +++--- .../tests/results/file_load/theta_levels.cml | 608 ++--- .../tests/results/file_load/u_wind_levels.cml | 646 +++--- .../tests/results/file_load/v_wind_levels.cml | 646 +++--- .../tests/results/file_load/wind_levels.cml | 1292 ++++++----- .../hybrid_height_cubes.cml | 92 +- .../TestStructuredLoadFF/simple.cml | 50 +- .../TestStructuredLoadFF/simple_callback.cml | 50 +- .../tests/results/iterate/izip_nd_ortho.cml | 200 +- lib/iris/tests/results/merge/a_aux_b_aux.cml | 4 +- lib/iris/tests/results/merge/a_aux_b_dim.cml | 4 +- lib/iris/tests/results/merge/a_dim_b_aux.cml | 4 +- lib/iris/tests/results/merge/a_dim_b_dim.cml | 4 +- lib/iris/tests/results/merge/dec.cml | 822 +++---- .../results/merge/separable_combination.cml | 68 +- lib/iris/tests/results/merge/single_split.cml | 4 +- lib/iris/tests/results/merge/string_a_b.cml | 4 +- .../tests/results/merge/string_a_with_aux.cml | 4 +- .../tests/results/merge/string_a_with_dim.cml | 4 +- .../tests/results/merge/string_b_with_aux.cml | 4 +- .../tests/results/merge/string_b_with_dim.cml | 4 +- lib/iris/tests/results/merge/theta.cml | 205 +- .../tests/results/merge/theta_two_times.cml | 942 ++++---- .../results/merge/time_triple_merging2.cml | 2 +- .../results/merge/time_triple_merging4.cml | 4 +- .../time_triple_successive_forecasts.cml | 4 +- .../merge/time_triple_time_non_dim_coord.cml | 6 +- .../merge/time_triple_time_vs_forecast.cml | 8 +- .../merge/time_triple_time_vs_ref_time.cml | 6 +- lib/iris/tests/results/name/NAMEIII_field.cml | 160 +- .../tests/results/name/NAMEIII_timeseries.cml | 235 +- .../tests/results/name/NAMEIII_trajectory.cml | 408 ++-- .../results/name/NAMEIII_trajectory0.cml | 24 +- .../tests/results/name/NAMEIII_version2.cml | 316 ++- lib/iris/tests/results/name/NAMEII_field.cml | 185 +- .../name/NAMEII_field__no_time_averaging.cml | 10 +- .../NAMEII_field__no_time_averaging_0.cml | 10 +- .../tests/results/name/NAMEII_timeseries.cml | 32 +- .../netcdf/netcdf_deferred_index_0.cml | 6 +- .../netcdf/netcdf_deferred_index_1.cml | 5 +- .../netcdf/netcdf_deferred_index_2.cml | 4 +- .../results/netcdf/netcdf_deferred_mix_0.cml | 6 +- .../results/netcdf/netcdf_deferred_mix_1.cml | 2 +- .../netcdf/netcdf_deferred_slice_0.cml | 12 +- .../netcdf/netcdf_deferred_slice_1.cml | 8 +- .../netcdf/netcdf_deferred_slice_2.cml | 6 +- .../netcdf/netcdf_deferred_tuple_0.cml | 6 +- .../netcdf/netcdf_deferred_tuple_1.cml | 6 +- .../netcdf/netcdf_deferred_tuple_2.cml | 6 +- .../netcdf/netcdf_global_xyt_hires.cml | 107 +- .../netcdf/netcdf_global_xyt_total.cml | 16 +- .../netcdf/netcdf_global_xyzt_gems.cml | 28 +- .../netcdf/netcdf_global_xyzt_gems_iter_0.cml | 14 +- .../netcdf/netcdf_global_xyzt_gems_iter_1.cml | 14 +- lib/iris/tests/results/netcdf/netcdf_laea.cml | 90 +- lib/iris/tests/results/netcdf/netcdf_lcc.cml | 121 +- lib/iris/tests/results/netcdf/netcdf_merc.cml | 61 +- .../results/netcdf/netcdf_merc_false.cml | 12 +- .../netcdf/netcdf_merc_scale_factor.cml | 4 +- .../tests/results/netcdf/netcdf_monotonic.cml | 4 +- .../tests/results/netcdf/netcdf_polar.cml | 10 +- .../results/netcdf/netcdf_rotated_xy_land.cml | 98 +- .../netcdf_rotated_xyt_precipitation.cml | 64 +- .../netcdf/netcdf_save_load_hybrid_height.cml | 966 ++++---- .../netcdf_save_load_ndim_auxiliary.cml | 64 +- .../tests/results/netcdf/netcdf_stereo.cml | 62 +- .../netcdf/netcdf_tmerc_and_climatology.cml | 71 +- .../tests/results/netcdf/save_load_traj.cml | 18 +- .../results/nimrod/levels_below_ground.cml | 2 +- lib/iris/tests/results/nimrod/load_2flds.cml | 10 +- .../results/nimrod/probability_fields.cml | 268 +-- .../nimrod/u1096_ng_bmr04_precip_2km.cml | 8 +- .../u1096_ng_bsr05_precip_accum60_2km.cml | 4 +- .../nimrod/u1096_ng_ek00_cloud3d0060_2km.cml | 48 +- .../nimrod/u1096_ng_ek00_cloud_2km.cml | 42 +- .../nimrod/u1096_ng_ek00_convection_2km.cml | 42 +- .../nimrod/u1096_ng_ek00_convwind_2km.cml | 36 +- .../nimrod/u1096_ng_ek00_frzlev_2km.cml | 32 +- .../nimrod/u1096_ng_ek00_height_2km.cml | 4 +- .../nimrod/u1096_ng_ek00_precip_2km.cml | 12 +- .../nimrod/u1096_ng_ek00_precipaccum_2km.cml | 8 +- .../nimrod/u1096_ng_ek00_preciptype_2km.cml | 36 +- .../nimrod/u1096_ng_ek00_pressure_2km.cml | 8 +- .../nimrod/u1096_ng_ek00_radiation_2km.cml | 28 +- .../nimrod/u1096_ng_ek00_radiationuv_2km.cml | 12 +- .../results/nimrod/u1096_ng_ek00_refl_2km.cml | 10 +- .../u1096_ng_ek00_relhumidity3d0060_2km.cml | 34 +- .../nimrod/u1096_ng_ek00_relhumidity_2km.cml | 4 +- .../results/nimrod/u1096_ng_ek00_snow_2km.cml | 12 +- .../nimrod/u1096_ng_ek00_soil3d0060_2km.cml | 24 +- .../results/nimrod/u1096_ng_ek00_soil_2km.cml | 24 +- .../nimrod/u1096_ng_ek00_temperature_2km.cml | 16 +- .../nimrod/u1096_ng_ek00_visibility_2km.cml | 20 +- .../results/nimrod/u1096_ng_ek00_wind_2km.cml | 36 +- .../nimrod/u1096_ng_ek00_winduv3d0015_2km.cml | 12 +- .../nimrod/u1096_ng_ek00_winduv_2km.cml | 12 +- .../results/nimrod/u1096_ng_ek01_cape_2km.cml | 24 +- ...u1096_ng_ek07_precip0540_accum180_18km.cml | 4 +- .../results/nimrod/u1096_ng_umqv_fog_2km.cml | 8 +- .../as_cube/data_frame_datetime_standard.cml | 2 +- .../pandas/as_cube/data_frame_multidim.cml | 2 +- .../as_cube/data_frame_netcdftime_360.cml | 2 +- .../as_cube/series_datetime_standard.cml | 5 +- .../pandas/as_cube/series_netcdfimte_360.cml | 5 +- .../tests/results/pp_load_rules/global.cml | 60 +- .../pp_load_rules/lbproc_mean_max_min.cml | 70 +- .../tests/results/pp_load_rules/lbtim_2.cml | 46 +- .../results/pp_load_rules/ocean_depth.cml | 47 +- .../pp_load_rules/ocean_depth_bounded.cml | 55 +- .../results/pp_load_rules/rotated_uk.cml | 17 +- lib/iris/tests/results/stock/realistic_4d.cml | 943 ++++---- .../system/supported_filetype_.grib2.cml | 48 - .../results/system/supported_filetype_.nc.cml | 28 +- .../results/system/supported_filetype_.pp.cml | 36 +- .../results/trajectory/constant_latitude.cml | 128 +- .../results/trajectory/hybrid_height.cml | 52 +- .../tests/results/trajectory/single_point.cml | 120 +- .../trajectory/tri_polar_latitude_slice.cml | 177 +- lib/iris/tests/results/trajectory/zigzag.cml | 40 +- .../cartography/project/TestAll/cube.cml | 92 +- .../collapse_all_dims.cml | 943 ++++---- .../collapse_last_dims.cml | 943 ++++---- .../collapse_middle_dim.cml | 943 ++++---- .../collapse_zeroth_dim.cml | 943 ++++---- .../TestBroadcastingDerived/slice.cml | 943 ++++---- .../TestBroadcastingDerived/transposed.cml | 943 ++++---- .../collapse_all_dims.cml | 145 +- .../collapse_last_dims.cml | 145 +- .../collapse_middle_dim.cml | 145 +- .../collapse_zeroth_dim.cml | 145 +- .../TestBroadcastingWithMesh/slice.cml | 145 +- .../TestBroadcastingWithMesh/transposed.cml | 145 +- .../collapse_all_dims.cml | 145 +- .../collapse_last_dims.cml | 145 +- .../collapse_middle_dim.cml | 145 +- .../collapse_zeroth_dim.cml | 145 +- .../slice.cml | 145 +- .../transposed.cml | 145 +- .../TestBroadcasting/collapse_all_dims.cml | 170 +- .../TestBroadcasting/collapse_last_dims.cml | 170 +- .../TestBroadcasting/collapse_middle_dim.cml | 170 +- .../TestBroadcasting/collapse_zeroth_dim.cml | 170 +- .../maths/add/TestBroadcasting/slice.cml | 170 +- .../maths/add/TestBroadcasting/transposed.cml | 170 +- .../TestBroadcasting/collapse_all_dims.cml | 170 +- .../TestBroadcasting/collapse_last_dims.cml | 170 +- .../TestBroadcasting/collapse_middle_dim.cml | 170 +- .../TestBroadcasting/collapse_zeroth_dim.cml | 170 +- .../maths/divide/TestBroadcasting/slice.cml | 170 +- .../divide/TestBroadcasting/transposed.cml | 170 +- .../TestBroadcasting/collapse_all_dims.cml | 170 +- .../TestBroadcasting/collapse_last_dims.cml | 170 +- .../TestBroadcasting/collapse_middle_dim.cml | 170 +- .../TestBroadcasting/collapse_zeroth_dim.cml | 170 +- .../maths/multiply/TestBroadcasting/slice.cml | 170 +- .../multiply/TestBroadcasting/transposed.cml | 170 +- .../TestBroadcasting/collapse_all_dims.cml | 170 +- .../TestBroadcasting/collapse_last_dims.cml | 170 +- .../TestBroadcasting/collapse_middle_dim.cml | 170 +- .../TestBroadcasting/collapse_zeroth_dim.cml | 170 +- .../maths/subtract/TestBroadcasting/slice.cml | 170 +- .../subtract/TestBroadcasting/transposed.cml | 170 +- .../Cube/intersection__Metadata/metadata.cml | 76 +- .../metadata_wrapped.cml | 80 +- .../results/unit/cube/Cube/xml/ancils.cml | 62 +- .../unit/cube/Cube/xml/cell_measures.cml | 76 +- .../combination_with_extra_realization.cml | 8 +- .../combination_with_extra_triple.cml | 8 +- .../relevel/Test/multi_dim_target_levels.cml | 4 +- .../mask_cube_2d_create_new_dim.cml | 14 +- .../mask_cube/original_cube_full2d_global.cml | 240 +- .../mask_cube/original_cube_simple_1d.cml | 22 +- .../mask_cube/original_cube_simple_2d.cml | 14 +- .../tests/results/uri_callback/pp_global.cml | 47 +- ...000.03.236.000128.1990.12.01.00.00.b_0.cml | 30 +- ...000.03.236.004224.1990.12.01.00.00.b_0.cml | 30 +- ...000.03.236.008320.1990.12.01.00.00.b_0.cml | 30 +- ...000.16.202.000128.1860.09.01.00.00.b_0.cml | 47 +- ...0.00.000.000000.1860.01.01.00.00.f.b_0.cml | 14 +- ...000.44.101.131200.1920.09.01.00.00.b_0.cml | 38 +- ...000.44.101.000128.1890.09.01.00.00.b_0.cml | 19 +- .../from_netcdf/12187.b_0.cml | 205 +- .../HadCM2_ts_SAT_ann_18602100.b_0.cml | 18 +- .../from_netcdf/aaxzc_level_lat_orig.b_0.cml | 37 +- .../aaxzc_lon_lat_press_orig.b_0.cml | 40 +- .../from_netcdf/aaxzc_lon_lat_several.b_0.cml | 92 +- .../from_netcdf/aaxzc_n10r13xy.b_0.cml | 26 +- .../from_netcdf/aaxzc_time_press.b_0.cml | 8 +- .../from_netcdf/aaxzc_tseries.b_0.cml | 4 +- .../abcza_pa19591997_daily_29.b_0.cml | 58 +- .../abcza_pa19591997_daily_29.b_1.cml | 58 +- .../abcza_pa19591997_daily_29.b_2.cml | 58 +- .../from_netcdf/abxpa_press_lat.b_0.cml | 33 +- .../from_netcdf/integer.b_0.cml | 45 +- .../from_netcdf/model.b_0.cml | 149 +- .../from_netcdf/ocean_xsect.b_0.cml | 59 +- .../from_netcdf/st0fc699.b_0.cml | 13 +- .../from_netcdf/st0fc942.b_0.cml | 34 +- .../from_netcdf/st30211.b_0.cml | 23 +- ...00000.03.236.000128.1990.12.01.00.00.b.cml | 30 +- ...00000.03.236.004224.1990.12.01.00.00.b.cml | 30 +- ...00000.03.236.008320.1990.12.01.00.00.b.cml | 30 +- ...00000.16.202.000128.1860.09.01.00.00.b.cml | 47 +- ...000.00.000.000000.1860.01.01.00.00.f.b.cml | 14 +- ...00000.44.101.131200.1920.09.01.00.00.b.cml | 38 +- ...00000.44.101.000128.1890.09.01.00.00.b.cml | 19 +- .../pp_to_cf_conversion/from_pp/12187.b.cml | 205 +- .../from_pp/HadCM2_ts_SAT_ann_18602100.b.cml | 18 +- .../from_pp/aaxzc_level_lat_orig.b.cml | 37 +- .../from_pp/aaxzc_lon_lat_press_orig.b.cml | 40 +- .../from_pp/aaxzc_lon_lat_several.b.cml | 92 +- .../from_pp/aaxzc_n10r13xy.b.cml | 26 +- .../from_pp/aaxzc_time_press.b.cml | 8 +- .../from_pp/aaxzc_tseries.b.cml | 4 +- .../from_pp/abcza_pa19591997_daily_29.b.cml | 174 +- .../from_pp/abxpa_press_lat.b.cml | 33 +- .../pp_to_cf_conversion/from_pp/integer.b.cml | 45 +- .../pp_to_cf_conversion/from_pp/model.b.cml | 149 +- .../from_pp/ocean_xsect.b.cml | 59 +- .../from_pp/st0fc699.b.cml | 13 +- .../from_pp/st0fc942.b.cml | 34 +- .../pp_to_cf_conversion/from_pp/st30211.b.cml | 23 +- lib/iris/util.py | 28 +- 565 files changed, 25911 insertions(+), 23172 deletions(-) delete mode 100644 lib/iris/tests/results/system/supported_filetype_.grib2.cml diff --git a/lib/iris/tests/results/COLPEX/small_colpex_theta_p_alt.cml b/lib/iris/tests/results/COLPEX/small_colpex_theta_p_alt.cml index da315c36af..07bdb02725 100644 --- a/lib/iris/tests/results/COLPEX/small_colpex_theta_p_alt.cml +++ b/lib/iris/tests/results/COLPEX/small_colpex_theta_p_alt.cml @@ -8,506 +8,531 @@ - + - + - + - + - + - + - + - + - + @@ -516,8 +541,9 @@ - + @@ -531,506 +557,531 @@ - + - + - + - + - + - + - + - + - + @@ -1039,8 +1090,9 @@ - + @@ -1054,56 +1106,70 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/FF/air_temperature_1.cml b/lib/iris/tests/results/FF/air_temperature_1.cml index 043b9acc16..99c30075a0 100644 --- a/lib/iris/tests/results/FF/air_temperature_1.cml +++ b/lib/iris/tests/results/FF/air_temperature_1.cml @@ -8,10 +8,10 @@ - + - + @@ -21,26 +21,28 @@ - + - + - + diff --git a/lib/iris/tests/results/FF/air_temperature_2.cml b/lib/iris/tests/results/FF/air_temperature_2.cml index 200a80b54a..c94604b516 100644 --- a/lib/iris/tests/results/FF/air_temperature_2.cml +++ b/lib/iris/tests/results/FF/air_temperature_2.cml @@ -8,10 +8,10 @@ - + - + @@ -21,26 +21,28 @@ - + - + - + diff --git a/lib/iris/tests/results/FF/soil_temperature_1.cml b/lib/iris/tests/results/FF/soil_temperature_1.cml index 57303636c1..e014ac6b6f 100644 --- a/lib/iris/tests/results/FF/soil_temperature_1.cml +++ b/lib/iris/tests/results/FF/soil_temperature_1.cml @@ -8,27 +8,29 @@ - + - + - + - + @@ -40,7 +42,7 @@ - + diff --git a/lib/iris/tests/results/FF/surface_altitude_1.cml b/lib/iris/tests/results/FF/surface_altitude_1.cml index 2669624d37..e64c146e1a 100644 --- a/lib/iris/tests/results/FF/surface_altitude_1.cml +++ b/lib/iris/tests/results/FF/surface_altitude_1.cml @@ -8,32 +8,34 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/abf/load.cml b/lib/iris/tests/results/abf/load.cml index e7954ab229..bf15e4499c 100644 --- a/lib/iris/tests/results/abf/load.cml +++ b/lib/iris/tests/results/abf/load.cml @@ -6,26 +6,26 @@ - + - + diff --git a/lib/iris/tests/results/analysis/abs.cml b/lib/iris/tests/results/analysis/abs.cml index b0a37b6074..524e05a09a 100644 --- a/lib/iris/tests/results/analysis/abs.cml +++ b/lib/iris/tests/results/analysis/abs.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/addition.cml b/lib/iris/tests/results/analysis/addition.cml index 4f9600694d..a0f4db9e58 100644 --- a/lib/iris/tests/results/analysis/addition.cml +++ b/lib/iris/tests/results/analysis/addition.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/addition_coord_x.cml b/lib/iris/tests/results/analysis/addition_coord_x.cml index a086b8ad8b..4259c2d621 100644 --- a/lib/iris/tests/results/analysis/addition_coord_x.cml +++ b/lib/iris/tests/results/analysis/addition_coord_x.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/addition_coord_y.cml b/lib/iris/tests/results/analysis/addition_coord_y.cml index 266e81c912..7b11e214fe 100644 --- a/lib/iris/tests/results/analysis/addition_coord_y.cml +++ b/lib/iris/tests/results/analysis/addition_coord_y.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/addition_different_std_name.cml b/lib/iris/tests/results/analysis/addition_different_std_name.cml index 14b0b42dd8..b137858af8 100644 --- a/lib/iris/tests/results/analysis/addition_different_std_name.cml +++ b/lib/iris/tests/results/analysis/addition_different_std_name.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/addition_in_place.cml b/lib/iris/tests/results/analysis/addition_in_place.cml index 4f9600694d..a0f4db9e58 100644 --- a/lib/iris/tests/results/analysis/addition_in_place.cml +++ b/lib/iris/tests/results/analysis/addition_in_place.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/addition_in_place_coord.cml b/lib/iris/tests/results/analysis/addition_in_place_coord.cml index 00dee609eb..8559128b63 100644 --- a/lib/iris/tests/results/analysis/addition_in_place_coord.cml +++ b/lib/iris/tests/results/analysis/addition_in_place_coord.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/addition_scalar.cml b/lib/iris/tests/results/analysis/addition_scalar.cml index daf0050069..69853fa215 100644 --- a/lib/iris/tests/results/analysis/addition_scalar.cml +++ b/lib/iris/tests/results/analysis/addition_scalar.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/aggregated_by/easy.cml b/lib/iris/tests/results/analysis/aggregated_by/easy.cml index d02c3f12d1..87b10a52cd 100644 --- a/lib/iris/tests/results/analysis/aggregated_by/easy.cml +++ b/lib/iris/tests/results/analysis/aggregated_by/easy.cml @@ -3,12 +3,12 @@ - + - + diff --git a/lib/iris/tests/results/analysis/aggregated_by/multi.cml b/lib/iris/tests/results/analysis/aggregated_by/multi.cml index 75cb67c054..6542b915a1 100644 --- a/lib/iris/tests/results/analysis/aggregated_by/multi.cml +++ b/lib/iris/tests/results/analysis/aggregated_by/multi.cml @@ -6,28 +6,29 @@ - + - + - + - + diff --git a/lib/iris/tests/results/analysis/aggregated_by/multi_missing.cml b/lib/iris/tests/results/analysis/aggregated_by/multi_missing.cml index dc9bdd0df8..1558d17a9a 100644 --- a/lib/iris/tests/results/analysis/aggregated_by/multi_missing.cml +++ b/lib/iris/tests/results/analysis/aggregated_by/multi_missing.cml @@ -6,28 +6,29 @@ - + - + - + - + diff --git a/lib/iris/tests/results/analysis/aggregated_by/multi_shared.cml b/lib/iris/tests/results/analysis/aggregated_by/multi_shared.cml index 81d775e741..aa6fefc293 100644 --- a/lib/iris/tests/results/analysis/aggregated_by/multi_shared.cml +++ b/lib/iris/tests/results/analysis/aggregated_by/multi_shared.cml @@ -4,52 +4,55 @@ + [16, 15], + [14, 0], + [13, 11], + [10, 10], + [ 9, 8], + [ 7, 5], + [ 4, 4], + [ 3, 2]]" id="35dc92ed" long_name="gamma" points="[18. , 15.5, 7. , 12. , 10. , 8.5, 6. , 4. , + 2.5]" shape="(9,)" units="Unit('1')" value_type="float64"/> - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/aggregated_by/single.cml b/lib/iris/tests/results/analysis/aggregated_by/single.cml index 3f2ea6fce2..bc6cbd0301 100644 --- a/lib/iris/tests/results/analysis/aggregated_by/single.cml +++ b/lib/iris/tests/results/analysis/aggregated_by/single.cml @@ -6,24 +6,24 @@ - + - + - + diff --git a/lib/iris/tests/results/analysis/aggregated_by/single_missing.cml b/lib/iris/tests/results/analysis/aggregated_by/single_missing.cml index 51e1ae4ff1..df1a9861d4 100644 --- a/lib/iris/tests/results/analysis/aggregated_by/single_missing.cml +++ b/lib/iris/tests/results/analysis/aggregated_by/single_missing.cml @@ -6,24 +6,24 @@ - + - + - + diff --git a/lib/iris/tests/results/analysis/aggregated_by/single_rms.cml b/lib/iris/tests/results/analysis/aggregated_by/single_rms.cml index 2961a6b48d..34bd38240e 100644 --- a/lib/iris/tests/results/analysis/aggregated_by/single_rms.cml +++ b/lib/iris/tests/results/analysis/aggregated_by/single_rms.cml @@ -6,24 +6,24 @@ - + - + - + diff --git a/lib/iris/tests/results/analysis/aggregated_by/single_shared.cml b/lib/iris/tests/results/analysis/aggregated_by/single_shared.cml index adbf893864..a554a1083d 100644 --- a/lib/iris/tests/results/analysis/aggregated_by/single_shared.cml +++ b/lib/iris/tests/results/analysis/aggregated_by/single_shared.cml @@ -6,34 +6,34 @@ - + - + - + - + diff --git a/lib/iris/tests/results/analysis/aggregated_by/single_shared_circular.cml b/lib/iris/tests/results/analysis/aggregated_by/single_shared_circular.cml index eba017837d..ec1d9b5780 100644 --- a/lib/iris/tests/results/analysis/aggregated_by/single_shared_circular.cml +++ b/lib/iris/tests/results/analysis/aggregated_by/single_shared_circular.cml @@ -3,38 +3,37 @@ - + - + - + - + diff --git a/lib/iris/tests/results/analysis/aggregated_by/weighted_easy.cml b/lib/iris/tests/results/analysis/aggregated_by/weighted_easy.cml index 8c434479c9..f6ffc02b55 100644 --- a/lib/iris/tests/results/analysis/aggregated_by/weighted_easy.cml +++ b/lib/iris/tests/results/analysis/aggregated_by/weighted_easy.cml @@ -3,12 +3,12 @@ - + - + diff --git a/lib/iris/tests/results/analysis/aggregated_by/weighted_multi.cml b/lib/iris/tests/results/analysis/aggregated_by/weighted_multi.cml index cca744ff87..78703b47eb 100644 --- a/lib/iris/tests/results/analysis/aggregated_by/weighted_multi.cml +++ b/lib/iris/tests/results/analysis/aggregated_by/weighted_multi.cml @@ -6,28 +6,29 @@ - + - + - + - + diff --git a/lib/iris/tests/results/analysis/aggregated_by/weighted_multi_missing.cml b/lib/iris/tests/results/analysis/aggregated_by/weighted_multi_missing.cml index 8c11bdb505..120084b030 100644 --- a/lib/iris/tests/results/analysis/aggregated_by/weighted_multi_missing.cml +++ b/lib/iris/tests/results/analysis/aggregated_by/weighted_multi_missing.cml @@ -6,28 +6,29 @@ - + - + - + - + diff --git a/lib/iris/tests/results/analysis/aggregated_by/weighted_multi_shared.cml b/lib/iris/tests/results/analysis/aggregated_by/weighted_multi_shared.cml index ab7a7195fd..1758cf3791 100644 --- a/lib/iris/tests/results/analysis/aggregated_by/weighted_multi_shared.cml +++ b/lib/iris/tests/results/analysis/aggregated_by/weighted_multi_shared.cml @@ -4,52 +4,55 @@ + [16, 15], + [14, 0], + [13, 11], + [10, 10], + [ 9, 8], + [ 7, 5], + [ 4, 4], + [ 3, 2]]" id="35dc92ed" long_name="gamma" points="[18. , 15.5, 7. , 12. , 10. , 8.5, 6. , 4. , + 2.5]" shape="(9,)" units="Unit('1')" value_type="float64"/> - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/aggregated_by/weighted_single.cml b/lib/iris/tests/results/analysis/aggregated_by/weighted_single.cml index d5bb9775fe..96a7e4ec85 100644 --- a/lib/iris/tests/results/analysis/aggregated_by/weighted_single.cml +++ b/lib/iris/tests/results/analysis/aggregated_by/weighted_single.cml @@ -6,24 +6,24 @@ - + - + - + diff --git a/lib/iris/tests/results/analysis/aggregated_by/weighted_single_missing.cml b/lib/iris/tests/results/analysis/aggregated_by/weighted_single_missing.cml index f7d57a9828..8d11643346 100644 --- a/lib/iris/tests/results/analysis/aggregated_by/weighted_single_missing.cml +++ b/lib/iris/tests/results/analysis/aggregated_by/weighted_single_missing.cml @@ -6,24 +6,24 @@ - + - + - + diff --git a/lib/iris/tests/results/analysis/aggregated_by/weighted_single_shared.cml b/lib/iris/tests/results/analysis/aggregated_by/weighted_single_shared.cml index 50a2c44a98..dad52ae602 100644 --- a/lib/iris/tests/results/analysis/aggregated_by/weighted_single_shared.cml +++ b/lib/iris/tests/results/analysis/aggregated_by/weighted_single_shared.cml @@ -6,34 +6,34 @@ - + - + - + - + diff --git a/lib/iris/tests/results/analysis/aggregated_by/weighted_single_shared_circular.cml b/lib/iris/tests/results/analysis/aggregated_by/weighted_single_shared_circular.cml index 657fb43414..e371728745 100644 --- a/lib/iris/tests/results/analysis/aggregated_by/weighted_single_shared_circular.cml +++ b/lib/iris/tests/results/analysis/aggregated_by/weighted_single_shared_circular.cml @@ -3,38 +3,37 @@ - + - + - + - + diff --git a/lib/iris/tests/results/analysis/apply_ifunc.cml b/lib/iris/tests/results/analysis/apply_ifunc.cml index fe0e394ee6..e2f5658832 100644 --- a/lib/iris/tests/results/analysis/apply_ifunc.cml +++ b/lib/iris/tests/results/analysis/apply_ifunc.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/apply_ifunc_frompyfunc.cml b/lib/iris/tests/results/analysis/apply_ifunc_frompyfunc.cml index 29cb6f611e..d3405f401f 100644 --- a/lib/iris/tests/results/analysis/apply_ifunc_frompyfunc.cml +++ b/lib/iris/tests/results/analysis/apply_ifunc_frompyfunc.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/apply_ifunc_original.cml b/lib/iris/tests/results/analysis/apply_ifunc_original.cml index 62a569f7cc..b01e2134af 100644 --- a/lib/iris/tests/results/analysis/apply_ifunc_original.cml +++ b/lib/iris/tests/results/analysis/apply_ifunc_original.cml @@ -7,36 +7,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/apply_ufunc.cml b/lib/iris/tests/results/analysis/apply_ufunc.cml index fe0e394ee6..e2f5658832 100644 --- a/lib/iris/tests/results/analysis/apply_ufunc.cml +++ b/lib/iris/tests/results/analysis/apply_ufunc.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/apply_ufunc_frompyfunc.cml b/lib/iris/tests/results/analysis/apply_ufunc_frompyfunc.cml index 7b1511f028..670f74a9ba 100644 --- a/lib/iris/tests/results/analysis/apply_ufunc_frompyfunc.cml +++ b/lib/iris/tests/results/analysis/apply_ufunc_frompyfunc.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/apply_ufunc_original.cml b/lib/iris/tests/results/analysis/apply_ufunc_original.cml index 62a569f7cc..b01e2134af 100644 --- a/lib/iris/tests/results/analysis/apply_ufunc_original.cml +++ b/lib/iris/tests/results/analysis/apply_ufunc_original.cml @@ -7,36 +7,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/areaweights_original.cml b/lib/iris/tests/results/analysis/areaweights_original.cml index 651bb648dd..dab90dcfd5 100644 --- a/lib/iris/tests/results/analysis/areaweights_original.cml +++ b/lib/iris/tests/results/analysis/areaweights_original.cml @@ -7,26 +7,27 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/calculus/cos_simple.xml b/lib/iris/tests/results/analysis/calculus/cos_simple.xml index 478902833f..2b624df1c4 100644 --- a/lib/iris/tests/results/analysis/calculus/cos_simple.xml +++ b/lib/iris/tests/results/analysis/calculus/cos_simple.xml @@ -1,2 +1,2 @@ - + diff --git a/lib/iris/tests/results/analysis/calculus/cos_simple_radians.xml b/lib/iris/tests/results/analysis/calculus/cos_simple_radians.xml index 478902833f..2b624df1c4 100644 --- a/lib/iris/tests/results/analysis/calculus/cos_simple_radians.xml +++ b/lib/iris/tests/results/analysis/calculus/cos_simple_radians.xml @@ -1,2 +1,2 @@ - + diff --git a/lib/iris/tests/results/analysis/calculus/curl_contrived_cartesian2.cml b/lib/iris/tests/results/analysis/calculus/curl_contrived_cartesian2.cml index a744dfc782..96ea1ecc60 100644 --- a/lib/iris/tests/results/analysis/calculus/curl_contrived_cartesian2.cml +++ b/lib/iris/tests/results/analysis/calculus/curl_contrived_cartesian2.cml @@ -3,25 +3,28 @@ - + - + - + @@ -34,25 +37,28 @@ - + - + - + @@ -65,25 +71,28 @@ - + - + - + diff --git a/lib/iris/tests/results/analysis/calculus/delta_handmade_simple_wrt_x.cml b/lib/iris/tests/results/analysis/calculus/delta_handmade_simple_wrt_x.cml index ee1301b11d..b4f065084b 100644 --- a/lib/iris/tests/results/analysis/calculus/delta_handmade_simple_wrt_x.cml +++ b/lib/iris/tests/results/analysis/calculus/delta_handmade_simple_wrt_x.cml @@ -6,7 +6,7 @@ - + diff --git a/lib/iris/tests/results/analysis/calculus/delta_handmade_wrt_lat.cml b/lib/iris/tests/results/analysis/calculus/delta_handmade_wrt_lat.cml index 0693498989..86f407a6f2 100644 --- a/lib/iris/tests/results/analysis/calculus/delta_handmade_wrt_lat.cml +++ b/lib/iris/tests/results/analysis/calculus/delta_handmade_wrt_lat.cml @@ -3,17 +3,17 @@ - + - + - + diff --git a/lib/iris/tests/results/analysis/calculus/delta_handmade_wrt_lon.cml b/lib/iris/tests/results/analysis/calculus/delta_handmade_wrt_lon.cml index 376c624265..5b624bf398 100644 --- a/lib/iris/tests/results/analysis/calculus/delta_handmade_wrt_lon.cml +++ b/lib/iris/tests/results/analysis/calculus/delta_handmade_wrt_lon.cml @@ -3,12 +3,12 @@ - + - + @@ -16,7 +16,7 @@ - + diff --git a/lib/iris/tests/results/analysis/calculus/delta_handmade_wrt_x.cml b/lib/iris/tests/results/analysis/calculus/delta_handmade_wrt_x.cml index d54dae3424..30441d8a56 100644 --- a/lib/iris/tests/results/analysis/calculus/delta_handmade_wrt_x.cml +++ b/lib/iris/tests/results/analysis/calculus/delta_handmade_wrt_x.cml @@ -3,12 +3,12 @@ - + - + @@ -16,7 +16,7 @@ - + diff --git a/lib/iris/tests/results/analysis/calculus/delta_handmade_wrt_y.cml b/lib/iris/tests/results/analysis/calculus/delta_handmade_wrt_y.cml index 7561c7b02f..2ce91bd232 100644 --- a/lib/iris/tests/results/analysis/calculus/delta_handmade_wrt_y.cml +++ b/lib/iris/tests/results/analysis/calculus/delta_handmade_wrt_y.cml @@ -3,17 +3,17 @@ - + - + - + diff --git a/lib/iris/tests/results/analysis/calculus/grad_contrived1.cml b/lib/iris/tests/results/analysis/calculus/grad_contrived1.cml index 0696e1be75..d4fffd150a 100644 --- a/lib/iris/tests/results/analysis/calculus/grad_contrived1.cml +++ b/lib/iris/tests/results/analysis/calculus/grad_contrived1.cml @@ -3,28 +3,28 @@ - + - + - + diff --git a/lib/iris/tests/results/analysis/calculus/grad_contrived2.cml b/lib/iris/tests/results/analysis/calculus/grad_contrived2.cml index ffa976d4a4..7433be8bc2 100644 --- a/lib/iris/tests/results/analysis/calculus/grad_contrived2.cml +++ b/lib/iris/tests/results/analysis/calculus/grad_contrived2.cml @@ -3,32 +3,40 @@ - + - + - + diff --git a/lib/iris/tests/results/analysis/calculus/grad_contrived_non_spherical1.cml b/lib/iris/tests/results/analysis/calculus/grad_contrived_non_spherical1.cml index 077e3df4ab..c01b94e6db 100644 --- a/lib/iris/tests/results/analysis/calculus/grad_contrived_non_spherical1.cml +++ b/lib/iris/tests/results/analysis/calculus/grad_contrived_non_spherical1.cml @@ -3,24 +3,28 @@ - + - + - + diff --git a/lib/iris/tests/results/analysis/calculus/handmade2_wrt_lat.cml b/lib/iris/tests/results/analysis/calculus/handmade2_wrt_lat.cml index 7cc09660ab..eda0fd2036 100644 --- a/lib/iris/tests/results/analysis/calculus/handmade2_wrt_lat.cml +++ b/lib/iris/tests/results/analysis/calculus/handmade2_wrt_lat.cml @@ -4,25 +4,27 @@ + -60.75, -56.25, -51.75, -47.25, -42.75, -38.25, + -33.75, -29.25, -24.75, -20.25, -15.75, -11.25, + -6.75, -2.25, 2.25, 6.75, 11.25, 15.75, + 20.25, 24.75, 29.25, 33.75, 38.25, 42.75, + 47.25, 51.75, 56.25, 60.75, 65.25, 69.75, + 74.25, 78.75, 83.25, 87.75, 92.25, 96.75, + 101.25, 105.75, 110.25, 114.75, 119.25, 123.75, + 128.25]" shape="(49,)" standard_name="latitude" units="Unit('degrees')" value_type="float32"> - + diff --git a/lib/iris/tests/results/analysis/calculus/handmade2_wrt_lon.cml b/lib/iris/tests/results/analysis/calculus/handmade2_wrt_lon.cml index ced788b5c6..6e929a2e79 100644 --- a/lib/iris/tests/results/analysis/calculus/handmade2_wrt_lon.cml +++ b/lib/iris/tests/results/analysis/calculus/handmade2_wrt_lon.cml @@ -3,26 +3,28 @@ - + + -155.25, -150.75, -146.25, -141.75, -137.25, + -132.75, -128.25, -123.75, -119.25, -114.75, + -110.25, -105.75, -101.25, -96.75, -92.25, + -87.75, -83.25, -78.75, -74.25, -69.75, + -65.25, -60.75, -56.25, -51.75, -47.25, + -42.75, -38.25, -33.75, -29.25, -24.75, + -20.25, -15.75, -11.25, -6.75, -2.25, + 2.25, 6.75, 11.25, 15.75, 20.25, + 24.75, 29.25, 33.75, 38.25]" shape="(49,)" standard_name="longitude" units="Unit('degrees')" value_type="float32"> diff --git a/lib/iris/tests/results/analysis/calculus/handmade_simple_wrt_x.cml b/lib/iris/tests/results/analysis/calculus/handmade_simple_wrt_x.cml index c055a46e59..adbd8c4dac 100644 --- a/lib/iris/tests/results/analysis/calculus/handmade_simple_wrt_x.cml +++ b/lib/iris/tests/results/analysis/calculus/handmade_simple_wrt_x.cml @@ -6,7 +6,7 @@ - + diff --git a/lib/iris/tests/results/analysis/calculus/handmade_wrt_lat.cml b/lib/iris/tests/results/analysis/calculus/handmade_wrt_lat.cml index 98612df27b..39db8cb583 100644 --- a/lib/iris/tests/results/analysis/calculus/handmade_wrt_lat.cml +++ b/lib/iris/tests/results/analysis/calculus/handmade_wrt_lat.cml @@ -3,17 +3,17 @@ - + - + - + diff --git a/lib/iris/tests/results/analysis/calculus/handmade_wrt_lon.cml b/lib/iris/tests/results/analysis/calculus/handmade_wrt_lon.cml index ceeb537ac6..fb80441bd7 100644 --- a/lib/iris/tests/results/analysis/calculus/handmade_wrt_lon.cml +++ b/lib/iris/tests/results/analysis/calculus/handmade_wrt_lon.cml @@ -3,12 +3,12 @@ - + - + @@ -16,7 +16,7 @@ - + diff --git a/lib/iris/tests/results/analysis/calculus/handmade_wrt_x.cml b/lib/iris/tests/results/analysis/calculus/handmade_wrt_x.cml index cbe823b2e0..b43273a21f 100644 --- a/lib/iris/tests/results/analysis/calculus/handmade_wrt_x.cml +++ b/lib/iris/tests/results/analysis/calculus/handmade_wrt_x.cml @@ -3,12 +3,12 @@ - + - + @@ -16,7 +16,7 @@ - + diff --git a/lib/iris/tests/results/analysis/calculus/handmade_wrt_y.cml b/lib/iris/tests/results/analysis/calculus/handmade_wrt_y.cml index b0eaa31da8..9698f9ec8d 100644 --- a/lib/iris/tests/results/analysis/calculus/handmade_wrt_y.cml +++ b/lib/iris/tests/results/analysis/calculus/handmade_wrt_y.cml @@ -3,17 +3,17 @@ - + - + - + diff --git a/lib/iris/tests/results/analysis/count_bar_2d.cml b/lib/iris/tests/results/analysis/count_bar_2d.cml index 3457187d4e..49d25934a2 100644 --- a/lib/iris/tests/results/analysis/count_bar_2d.cml +++ b/lib/iris/tests/results/analysis/count_bar_2d.cml @@ -3,13 +3,13 @@ - + - + diff --git a/lib/iris/tests/results/analysis/count_foo_1d.cml b/lib/iris/tests/results/analysis/count_foo_1d.cml index 6a76951959..f611029fa2 100644 --- a/lib/iris/tests/results/analysis/count_foo_1d.cml +++ b/lib/iris/tests/results/analysis/count_foo_1d.cml @@ -3,7 +3,7 @@ - + diff --git a/lib/iris/tests/results/analysis/count_foo_2d.cml b/lib/iris/tests/results/analysis/count_foo_2d.cml index af4ee81c3f..9fcac4a5bd 100644 --- a/lib/iris/tests/results/analysis/count_foo_2d.cml +++ b/lib/iris/tests/results/analysis/count_foo_2d.cml @@ -3,12 +3,12 @@ - + - + diff --git a/lib/iris/tests/results/analysis/count_foo_bar_2d.cml b/lib/iris/tests/results/analysis/count_foo_bar_2d.cml index 47a25bbd84..73ca30312b 100644 --- a/lib/iris/tests/results/analysis/count_foo_bar_2d.cml +++ b/lib/iris/tests/results/analysis/count_foo_bar_2d.cml @@ -3,10 +3,10 @@ - + - + diff --git a/lib/iris/tests/results/analysis/delta_and_midpoint/delta_one_element_explicit.xml b/lib/iris/tests/results/analysis/delta_and_midpoint/delta_one_element_explicit.xml index 494d198e64..41e7d6453a 100644 --- a/lib/iris/tests/results/analysis/delta_and_midpoint/delta_one_element_explicit.xml +++ b/lib/iris/tests/results/analysis/delta_and_midpoint/delta_one_element_explicit.xml @@ -1,2 +1,2 @@ - + diff --git a/lib/iris/tests/results/analysis/delta_and_midpoint/midpoint_one_element_explicit.xml b/lib/iris/tests/results/analysis/delta_and_midpoint/midpoint_one_element_explicit.xml index 8b68a16b47..a09710eaf3 100644 --- a/lib/iris/tests/results/analysis/delta_and_midpoint/midpoint_one_element_explicit.xml +++ b/lib/iris/tests/results/analysis/delta_and_midpoint/midpoint_one_element_explicit.xml @@ -1,2 +1,2 @@ - + diff --git a/lib/iris/tests/results/analysis/delta_and_midpoint/simple1.cml b/lib/iris/tests/results/analysis/delta_and_midpoint/simple1.cml index b4c123e294..5927c572e4 100644 --- a/lib/iris/tests/results/analysis/delta_and_midpoint/simple1.cml +++ b/lib/iris/tests/results/analysis/delta_and_midpoint/simple1.cml @@ -1,2 +1,2 @@ - + diff --git a/lib/iris/tests/results/analysis/delta_and_midpoint/simple1_delta.cml b/lib/iris/tests/results/analysis/delta_and_midpoint/simple1_delta.cml index c81ccfc9e8..a87393f917 100644 --- a/lib/iris/tests/results/analysis/delta_and_midpoint/simple1_delta.cml +++ b/lib/iris/tests/results/analysis/delta_and_midpoint/simple1_delta.cml @@ -1,2 +1,2 @@ - + diff --git a/lib/iris/tests/results/analysis/delta_and_midpoint/simple1_midpoint.cml b/lib/iris/tests/results/analysis/delta_and_midpoint/simple1_midpoint.cml index f97d74bff8..020cff992d 100644 --- a/lib/iris/tests/results/analysis/delta_and_midpoint/simple1_midpoint.cml +++ b/lib/iris/tests/results/analysis/delta_and_midpoint/simple1_midpoint.cml @@ -1,2 +1,2 @@ - + diff --git a/lib/iris/tests/results/analysis/delta_and_midpoint/simple2.cml b/lib/iris/tests/results/analysis/delta_and_midpoint/simple2.cml index 50bc4d77c1..c56488a758 100644 --- a/lib/iris/tests/results/analysis/delta_and_midpoint/simple2.cml +++ b/lib/iris/tests/results/analysis/delta_and_midpoint/simple2.cml @@ -1,2 +1,2 @@ - + diff --git a/lib/iris/tests/results/analysis/delta_and_midpoint/simple2_delta.cml b/lib/iris/tests/results/analysis/delta_and_midpoint/simple2_delta.cml index a4621734d3..7e965ff4d5 100644 --- a/lib/iris/tests/results/analysis/delta_and_midpoint/simple2_delta.cml +++ b/lib/iris/tests/results/analysis/delta_and_midpoint/simple2_delta.cml @@ -1,2 +1,2 @@ - + diff --git a/lib/iris/tests/results/analysis/delta_and_midpoint/simple2_midpoint.cml b/lib/iris/tests/results/analysis/delta_and_midpoint/simple2_midpoint.cml index a981e2b79c..c04f72ce52 100644 --- a/lib/iris/tests/results/analysis/delta_and_midpoint/simple2_midpoint.cml +++ b/lib/iris/tests/results/analysis/delta_and_midpoint/simple2_midpoint.cml @@ -1,2 +1,2 @@ - + diff --git a/lib/iris/tests/results/analysis/delta_and_midpoint/simple3.cml b/lib/iris/tests/results/analysis/delta_and_midpoint/simple3.cml index f088c97634..467e78de62 100644 --- a/lib/iris/tests/results/analysis/delta_and_midpoint/simple3.cml +++ b/lib/iris/tests/results/analysis/delta_and_midpoint/simple3.cml @@ -1,5 +1,5 @@ - + diff --git a/lib/iris/tests/results/analysis/delta_and_midpoint/simple3_delta.cml b/lib/iris/tests/results/analysis/delta_and_midpoint/simple3_delta.cml index 74d7546592..3d7e1bc12d 100644 --- a/lib/iris/tests/results/analysis/delta_and_midpoint/simple3_delta.cml +++ b/lib/iris/tests/results/analysis/delta_and_midpoint/simple3_delta.cml @@ -1,5 +1,5 @@ - + diff --git a/lib/iris/tests/results/analysis/delta_and_midpoint/simple3_midpoint.cml b/lib/iris/tests/results/analysis/delta_and_midpoint/simple3_midpoint.cml index 961a953ea5..b193b0015c 100644 --- a/lib/iris/tests/results/analysis/delta_and_midpoint/simple3_midpoint.cml +++ b/lib/iris/tests/results/analysis/delta_and_midpoint/simple3_midpoint.cml @@ -1,5 +1,5 @@ - + diff --git a/lib/iris/tests/results/analysis/delta_and_midpoint/simple4.cml b/lib/iris/tests/results/analysis/delta_and_midpoint/simple4.cml index fd4e8ed6bf..c07dcbc18a 100644 --- a/lib/iris/tests/results/analysis/delta_and_midpoint/simple4.cml +++ b/lib/iris/tests/results/analysis/delta_and_midpoint/simple4.cml @@ -1,5 +1,5 @@ - + diff --git a/lib/iris/tests/results/analysis/delta_and_midpoint/simple4_delta.cml b/lib/iris/tests/results/analysis/delta_and_midpoint/simple4_delta.cml index dc6b09a87a..d59b173304 100644 --- a/lib/iris/tests/results/analysis/delta_and_midpoint/simple4_delta.cml +++ b/lib/iris/tests/results/analysis/delta_and_midpoint/simple4_delta.cml @@ -1,4 +1,4 @@ - + diff --git a/lib/iris/tests/results/analysis/delta_and_midpoint/simple4_midpoint.cml b/lib/iris/tests/results/analysis/delta_and_midpoint/simple4_midpoint.cml index e413c214e9..d954504f42 100644 --- a/lib/iris/tests/results/analysis/delta_and_midpoint/simple4_midpoint.cml +++ b/lib/iris/tests/results/analysis/delta_and_midpoint/simple4_midpoint.cml @@ -1,4 +1,4 @@ - + diff --git a/lib/iris/tests/results/analysis/delta_and_midpoint/simple5.cml b/lib/iris/tests/results/analysis/delta_and_midpoint/simple5.cml index 0aad76ca07..05770d2c52 100644 --- a/lib/iris/tests/results/analysis/delta_and_midpoint/simple5.cml +++ b/lib/iris/tests/results/analysis/delta_and_midpoint/simple5.cml @@ -1,2 +1,2 @@ - + diff --git a/lib/iris/tests/results/analysis/delta_and_midpoint/simple5_delta.cml b/lib/iris/tests/results/analysis/delta_and_midpoint/simple5_delta.cml index 73ee9c9070..aec0ded3f3 100644 --- a/lib/iris/tests/results/analysis/delta_and_midpoint/simple5_delta.cml +++ b/lib/iris/tests/results/analysis/delta_and_midpoint/simple5_delta.cml @@ -1,2 +1,2 @@ - + diff --git a/lib/iris/tests/results/analysis/delta_and_midpoint/simple5_midpoint.cml b/lib/iris/tests/results/analysis/delta_and_midpoint/simple5_midpoint.cml index 3e93c682ba..591ba00330 100644 --- a/lib/iris/tests/results/analysis/delta_and_midpoint/simple5_midpoint.cml +++ b/lib/iris/tests/results/analysis/delta_and_midpoint/simple5_midpoint.cml @@ -1,2 +1,2 @@ - + diff --git a/lib/iris/tests/results/analysis/delta_and_midpoint/simple6.cml b/lib/iris/tests/results/analysis/delta_and_midpoint/simple6.cml index 6413204d03..fe47685acd 100644 --- a/lib/iris/tests/results/analysis/delta_and_midpoint/simple6.cml +++ b/lib/iris/tests/results/analysis/delta_and_midpoint/simple6.cml @@ -1,2 +1,2 @@ - + diff --git a/lib/iris/tests/results/analysis/division.cml b/lib/iris/tests/results/analysis/division.cml index 762f51ec0a..90fe592390 100644 --- a/lib/iris/tests/results/analysis/division.cml +++ b/lib/iris/tests/results/analysis/division.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/division_by_array.cml b/lib/iris/tests/results/analysis/division_by_array.cml index 14b0b42dd8..b137858af8 100644 --- a/lib/iris/tests/results/analysis/division_by_array.cml +++ b/lib/iris/tests/results/analysis/division_by_array.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/division_by_latitude.cml b/lib/iris/tests/results/analysis/division_by_latitude.cml index 42437d1e36..c05e82f7f3 100644 --- a/lib/iris/tests/results/analysis/division_by_latitude.cml +++ b/lib/iris/tests/results/analysis/division_by_latitude.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/division_by_longitude.cml b/lib/iris/tests/results/analysis/division_by_longitude.cml index 264ce9b793..243b4158af 100644 --- a/lib/iris/tests/results/analysis/division_by_longitude.cml +++ b/lib/iris/tests/results/analysis/division_by_longitude.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/division_by_singular_coord.cml b/lib/iris/tests/results/analysis/division_by_singular_coord.cml index 4c9c58d760..6e91963596 100644 --- a/lib/iris/tests/results/analysis/division_by_singular_coord.cml +++ b/lib/iris/tests/results/analysis/division_by_singular_coord.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/division_scalar.cml b/lib/iris/tests/results/analysis/division_scalar.cml index 14b0b42dd8..b137858af8 100644 --- a/lib/iris/tests/results/analysis/division_scalar.cml +++ b/lib/iris/tests/results/analysis/division_scalar.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/exp.cml b/lib/iris/tests/results/analysis/exp.cml index 357a84363e..120a71e587 100644 --- a/lib/iris/tests/results/analysis/exp.cml +++ b/lib/iris/tests/results/analysis/exp.cml @@ -3,17 +3,17 @@ - + diff --git a/lib/iris/tests/results/analysis/exponentiate.cml b/lib/iris/tests/results/analysis/exponentiate.cml index bb825f6714..066e7c3749 100644 --- a/lib/iris/tests/results/analysis/exponentiate.cml +++ b/lib/iris/tests/results/analysis/exponentiate.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/first_quartile_foo_1d.cml b/lib/iris/tests/results/analysis/first_quartile_foo_1d.cml index f027f2d9f8..eb2a08de76 100644 --- a/lib/iris/tests/results/analysis/first_quartile_foo_1d.cml +++ b/lib/iris/tests/results/analysis/first_quartile_foo_1d.cml @@ -3,7 +3,7 @@ - + diff --git a/lib/iris/tests/results/analysis/first_quartile_foo_1d_fast_percentile.cml b/lib/iris/tests/results/analysis/first_quartile_foo_1d_fast_percentile.cml index f027f2d9f8..eb2a08de76 100644 --- a/lib/iris/tests/results/analysis/first_quartile_foo_1d_fast_percentile.cml +++ b/lib/iris/tests/results/analysis/first_quartile_foo_1d_fast_percentile.cml @@ -3,7 +3,7 @@ - + diff --git a/lib/iris/tests/results/analysis/first_quartile_foo_2d.cml b/lib/iris/tests/results/analysis/first_quartile_foo_2d.cml index 1bc809ce63..ca83009959 100644 --- a/lib/iris/tests/results/analysis/first_quartile_foo_2d.cml +++ b/lib/iris/tests/results/analysis/first_quartile_foo_2d.cml @@ -3,12 +3,12 @@ - + - + diff --git a/lib/iris/tests/results/analysis/first_quartile_foo_2d_fast_percentile.cml b/lib/iris/tests/results/analysis/first_quartile_foo_2d_fast_percentile.cml index 1bc809ce63..ca83009959 100644 --- a/lib/iris/tests/results/analysis/first_quartile_foo_2d_fast_percentile.cml +++ b/lib/iris/tests/results/analysis/first_quartile_foo_2d_fast_percentile.cml @@ -3,12 +3,12 @@ - + - + diff --git a/lib/iris/tests/results/analysis/first_quartile_foo_bar_2d.cml b/lib/iris/tests/results/analysis/first_quartile_foo_bar_2d.cml index cadd1e8b65..16f8ec2d69 100644 --- a/lib/iris/tests/results/analysis/first_quartile_foo_bar_2d.cml +++ b/lib/iris/tests/results/analysis/first_quartile_foo_bar_2d.cml @@ -3,10 +3,10 @@ - + - + diff --git a/lib/iris/tests/results/analysis/first_quartile_foo_bar_2d_fast_percentile.cml b/lib/iris/tests/results/analysis/first_quartile_foo_bar_2d_fast_percentile.cml index cadd1e8b65..16f8ec2d69 100644 --- a/lib/iris/tests/results/analysis/first_quartile_foo_bar_2d_fast_percentile.cml +++ b/lib/iris/tests/results/analysis/first_quartile_foo_bar_2d_fast_percentile.cml @@ -3,10 +3,10 @@ - + - + diff --git a/lib/iris/tests/results/analysis/gmean_latitude.cml b/lib/iris/tests/results/analysis/gmean_latitude.cml index 26b7fdc8af..ca4a5a39f2 100644 --- a/lib/iris/tests/results/analysis/gmean_latitude.cml +++ b/lib/iris/tests/results/analysis/gmean_latitude.cml @@ -8,26 +8,25 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/gmean_latitude_longitude.cml b/lib/iris/tests/results/analysis/gmean_latitude_longitude.cml index 94ed36ac88..a31a89ab34 100644 --- a/lib/iris/tests/results/analysis/gmean_latitude_longitude.cml +++ b/lib/iris/tests/results/analysis/gmean_latitude_longitude.cml @@ -8,13 +8,13 @@ - + - + - + @@ -24,9 +24,8 @@ - + diff --git a/lib/iris/tests/results/analysis/gmean_latitude_longitude_1call.cml b/lib/iris/tests/results/analysis/gmean_latitude_longitude_1call.cml index 1db977312b..dd97d15f27 100644 --- a/lib/iris/tests/results/analysis/gmean_latitude_longitude_1call.cml +++ b/lib/iris/tests/results/analysis/gmean_latitude_longitude_1call.cml @@ -8,13 +8,13 @@ - + - + - + @@ -24,9 +24,8 @@ - + diff --git a/lib/iris/tests/results/analysis/hmean_latitude.cml b/lib/iris/tests/results/analysis/hmean_latitude.cml index 70e3fcb540..86af8f99bc 100644 --- a/lib/iris/tests/results/analysis/hmean_latitude.cml +++ b/lib/iris/tests/results/analysis/hmean_latitude.cml @@ -8,26 +8,25 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/hmean_latitude_longitude.cml b/lib/iris/tests/results/analysis/hmean_latitude_longitude.cml index f762fd643b..3b469be379 100644 --- a/lib/iris/tests/results/analysis/hmean_latitude_longitude.cml +++ b/lib/iris/tests/results/analysis/hmean_latitude_longitude.cml @@ -8,13 +8,13 @@ - + - + - + @@ -24,9 +24,8 @@ - + diff --git a/lib/iris/tests/results/analysis/hmean_latitude_longitude_1call.cml b/lib/iris/tests/results/analysis/hmean_latitude_longitude_1call.cml index 369dca3203..759e94104a 100644 --- a/lib/iris/tests/results/analysis/hmean_latitude_longitude_1call.cml +++ b/lib/iris/tests/results/analysis/hmean_latitude_longitude_1call.cml @@ -8,13 +8,13 @@ - + - + - + @@ -24,9 +24,8 @@ - + diff --git a/lib/iris/tests/results/analysis/last_quartile_foo_3d_masked.cml b/lib/iris/tests/results/analysis/last_quartile_foo_3d_masked.cml index 059541e208..cd3d7ac69a 100644 --- a/lib/iris/tests/results/analysis/last_quartile_foo_3d_masked.cml +++ b/lib/iris/tests/results/analysis/last_quartile_foo_3d_masked.cml @@ -3,16 +3,16 @@ - + - + - + diff --git a/lib/iris/tests/results/analysis/last_quartile_foo_3d_notmasked.cml b/lib/iris/tests/results/analysis/last_quartile_foo_3d_notmasked.cml index 059541e208..cd3d7ac69a 100644 --- a/lib/iris/tests/results/analysis/last_quartile_foo_3d_notmasked.cml +++ b/lib/iris/tests/results/analysis/last_quartile_foo_3d_notmasked.cml @@ -3,16 +3,16 @@ - + - + - + diff --git a/lib/iris/tests/results/analysis/last_quartile_foo_3d_notmasked_fast_percentile.cml b/lib/iris/tests/results/analysis/last_quartile_foo_3d_notmasked_fast_percentile.cml index 059541e208..cd3d7ac69a 100644 --- a/lib/iris/tests/results/analysis/last_quartile_foo_3d_notmasked_fast_percentile.cml +++ b/lib/iris/tests/results/analysis/last_quartile_foo_3d_notmasked_fast_percentile.cml @@ -3,16 +3,16 @@ - + - + - + diff --git a/lib/iris/tests/results/analysis/log.cml b/lib/iris/tests/results/analysis/log.cml index c24e071dc5..9a90864c58 100644 --- a/lib/iris/tests/results/analysis/log.cml +++ b/lib/iris/tests/results/analysis/log.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/log10.cml b/lib/iris/tests/results/analysis/log10.cml index abd4065526..226322cb61 100644 --- a/lib/iris/tests/results/analysis/log10.cml +++ b/lib/iris/tests/results/analysis/log10.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/log2.cml b/lib/iris/tests/results/analysis/log2.cml index d121ad9a9d..0c26538dd4 100644 --- a/lib/iris/tests/results/analysis/log2.cml +++ b/lib/iris/tests/results/analysis/log2.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/maths_original.cml b/lib/iris/tests/results/analysis/maths_original.cml index 15fbb5210f..f3f838f1b8 100644 --- a/lib/iris/tests/results/analysis/maths_original.cml +++ b/lib/iris/tests/results/analysis/maths_original.cml @@ -7,36 +7,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/max_latitude.cml b/lib/iris/tests/results/analysis/max_latitude.cml index 89542d27d3..fa00aacec5 100644 --- a/lib/iris/tests/results/analysis/max_latitude.cml +++ b/lib/iris/tests/results/analysis/max_latitude.cml @@ -8,26 +8,25 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/max_latitude_longitude.cml b/lib/iris/tests/results/analysis/max_latitude_longitude.cml index 7d24ca7f14..801d4302fa 100644 --- a/lib/iris/tests/results/analysis/max_latitude_longitude.cml +++ b/lib/iris/tests/results/analysis/max_latitude_longitude.cml @@ -8,13 +8,13 @@ - + - + - + @@ -24,9 +24,8 @@ - + diff --git a/lib/iris/tests/results/analysis/max_latitude_longitude_1call.cml b/lib/iris/tests/results/analysis/max_latitude_longitude_1call.cml index b4d1e0349c..2dc352e208 100644 --- a/lib/iris/tests/results/analysis/max_latitude_longitude_1call.cml +++ b/lib/iris/tests/results/analysis/max_latitude_longitude_1call.cml @@ -8,13 +8,13 @@ - + - + - + @@ -24,9 +24,8 @@ - + diff --git a/lib/iris/tests/results/analysis/max_run_bar_2d.cml b/lib/iris/tests/results/analysis/max_run_bar_2d.cml index 32a8a377be..6d56c2220b 100644 --- a/lib/iris/tests/results/analysis/max_run_bar_2d.cml +++ b/lib/iris/tests/results/analysis/max_run_bar_2d.cml @@ -3,13 +3,13 @@ - + - + diff --git a/lib/iris/tests/results/analysis/max_run_bar_2d_masked.cml b/lib/iris/tests/results/analysis/max_run_bar_2d_masked.cml index 32a8a377be..6d56c2220b 100644 --- a/lib/iris/tests/results/analysis/max_run_bar_2d_masked.cml +++ b/lib/iris/tests/results/analysis/max_run_bar_2d_masked.cml @@ -3,13 +3,13 @@ - + - + diff --git a/lib/iris/tests/results/analysis/max_run_foo_1d.cml b/lib/iris/tests/results/analysis/max_run_foo_1d.cml index b2a3bcef56..a5f53306db 100644 --- a/lib/iris/tests/results/analysis/max_run_foo_1d.cml +++ b/lib/iris/tests/results/analysis/max_run_foo_1d.cml @@ -3,7 +3,7 @@ - + diff --git a/lib/iris/tests/results/analysis/max_run_foo_2d.cml b/lib/iris/tests/results/analysis/max_run_foo_2d.cml index fb8448136f..45e9836823 100644 --- a/lib/iris/tests/results/analysis/max_run_foo_2d.cml +++ b/lib/iris/tests/results/analysis/max_run_foo_2d.cml @@ -3,12 +3,12 @@ - + - + diff --git a/lib/iris/tests/results/analysis/mean_latitude.cml b/lib/iris/tests/results/analysis/mean_latitude.cml index 80921e762d..44b26db3fb 100644 --- a/lib/iris/tests/results/analysis/mean_latitude.cml +++ b/lib/iris/tests/results/analysis/mean_latitude.cml @@ -8,26 +8,25 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/mean_latitude_longitude.cml b/lib/iris/tests/results/analysis/mean_latitude_longitude.cml index 6ac9400a3a..0991425a9a 100644 --- a/lib/iris/tests/results/analysis/mean_latitude_longitude.cml +++ b/lib/iris/tests/results/analysis/mean_latitude_longitude.cml @@ -8,13 +8,13 @@ - + - + - + @@ -24,9 +24,8 @@ - + diff --git a/lib/iris/tests/results/analysis/mean_latitude_longitude_1call.cml b/lib/iris/tests/results/analysis/mean_latitude_longitude_1call.cml index affcf07c07..1b5ca1e3dc 100644 --- a/lib/iris/tests/results/analysis/mean_latitude_longitude_1call.cml +++ b/lib/iris/tests/results/analysis/mean_latitude_longitude_1call.cml @@ -8,13 +8,13 @@ - + - + - + @@ -24,9 +24,8 @@ - + diff --git a/lib/iris/tests/results/analysis/median_latitude.cml b/lib/iris/tests/results/analysis/median_latitude.cml index bbf3875688..b5439ed225 100644 --- a/lib/iris/tests/results/analysis/median_latitude.cml +++ b/lib/iris/tests/results/analysis/median_latitude.cml @@ -8,26 +8,25 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/median_latitude_longitude.cml b/lib/iris/tests/results/analysis/median_latitude_longitude.cml index 5663f6d65f..f8116848a6 100644 --- a/lib/iris/tests/results/analysis/median_latitude_longitude.cml +++ b/lib/iris/tests/results/analysis/median_latitude_longitude.cml @@ -8,13 +8,13 @@ - + - + - + @@ -24,9 +24,8 @@ - + diff --git a/lib/iris/tests/results/analysis/median_latitude_longitude_1call.cml b/lib/iris/tests/results/analysis/median_latitude_longitude_1call.cml index c0c0d7c46b..53fd4ef29d 100644 --- a/lib/iris/tests/results/analysis/median_latitude_longitude_1call.cml +++ b/lib/iris/tests/results/analysis/median_latitude_longitude_1call.cml @@ -8,13 +8,13 @@ - + - + - + @@ -24,9 +24,8 @@ - + diff --git a/lib/iris/tests/results/analysis/min_latitude.cml b/lib/iris/tests/results/analysis/min_latitude.cml index bf20be30a9..13e52696f8 100644 --- a/lib/iris/tests/results/analysis/min_latitude.cml +++ b/lib/iris/tests/results/analysis/min_latitude.cml @@ -8,26 +8,25 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/min_latitude_longitude.cml b/lib/iris/tests/results/analysis/min_latitude_longitude.cml index 3792645582..78cd58ca93 100644 --- a/lib/iris/tests/results/analysis/min_latitude_longitude.cml +++ b/lib/iris/tests/results/analysis/min_latitude_longitude.cml @@ -8,13 +8,13 @@ - + - + - + @@ -24,9 +24,8 @@ - + diff --git a/lib/iris/tests/results/analysis/min_latitude_longitude_1call.cml b/lib/iris/tests/results/analysis/min_latitude_longitude_1call.cml index b43231b7e6..672cef058a 100644 --- a/lib/iris/tests/results/analysis/min_latitude_longitude_1call.cml +++ b/lib/iris/tests/results/analysis/min_latitude_longitude_1call.cml @@ -8,13 +8,13 @@ - + - + - + @@ -24,9 +24,8 @@ - + diff --git a/lib/iris/tests/results/analysis/multiply.cml b/lib/iris/tests/results/analysis/multiply.cml index 8fb8658f5d..0a3c2cfb03 100644 --- a/lib/iris/tests/results/analysis/multiply.cml +++ b/lib/iris/tests/results/analysis/multiply.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/multiply_different_std_name.cml b/lib/iris/tests/results/analysis/multiply_different_std_name.cml index 2d89e5882f..829bbcc582 100644 --- a/lib/iris/tests/results/analysis/multiply_different_std_name.cml +++ b/lib/iris/tests/results/analysis/multiply_different_std_name.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/original.cml b/lib/iris/tests/results/analysis/original.cml index 414de1b6b5..b958136bd1 100644 --- a/lib/iris/tests/results/analysis/original.cml +++ b/lib/iris/tests/results/analysis/original.cml @@ -8,26 +8,26 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/original_common.cml b/lib/iris/tests/results/analysis/original_common.cml index bbfa48d7d8..258ca67c46 100644 --- a/lib/iris/tests/results/analysis/original_common.cml +++ b/lib/iris/tests/results/analysis/original_common.cml @@ -8,26 +8,26 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/original_hmean.cml b/lib/iris/tests/results/analysis/original_hmean.cml index bdc145022c..28cea63268 100644 --- a/lib/iris/tests/results/analysis/original_hmean.cml +++ b/lib/iris/tests/results/analysis/original_hmean.cml @@ -8,26 +8,26 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/proportion_bar_2d.cml b/lib/iris/tests/results/analysis/proportion_bar_2d.cml index 263fcaba9e..f28f4b1546 100644 --- a/lib/iris/tests/results/analysis/proportion_bar_2d.cml +++ b/lib/iris/tests/results/analysis/proportion_bar_2d.cml @@ -3,13 +3,13 @@ - + - + diff --git a/lib/iris/tests/results/analysis/proportion_foo_1d.cml b/lib/iris/tests/results/analysis/proportion_foo_1d.cml index a0bd3c982f..6ebd3e0f39 100644 --- a/lib/iris/tests/results/analysis/proportion_foo_1d.cml +++ b/lib/iris/tests/results/analysis/proportion_foo_1d.cml @@ -3,7 +3,7 @@ - + diff --git a/lib/iris/tests/results/analysis/proportion_foo_2d.cml b/lib/iris/tests/results/analysis/proportion_foo_2d.cml index d715499e58..f2c803bb71 100644 --- a/lib/iris/tests/results/analysis/proportion_foo_2d.cml +++ b/lib/iris/tests/results/analysis/proportion_foo_2d.cml @@ -3,12 +3,12 @@ - + - + diff --git a/lib/iris/tests/results/analysis/proportion_foo_2d_masked.cml b/lib/iris/tests/results/analysis/proportion_foo_2d_masked.cml index 263fcaba9e..f28f4b1546 100644 --- a/lib/iris/tests/results/analysis/proportion_foo_2d_masked.cml +++ b/lib/iris/tests/results/analysis/proportion_foo_2d_masked.cml @@ -3,13 +3,13 @@ - + - + diff --git a/lib/iris/tests/results/analysis/proportion_foo_bar_2d.cml b/lib/iris/tests/results/analysis/proportion_foo_bar_2d.cml index 77123dd86e..9baab831e1 100644 --- a/lib/iris/tests/results/analysis/proportion_foo_bar_2d.cml +++ b/lib/iris/tests/results/analysis/proportion_foo_bar_2d.cml @@ -3,10 +3,10 @@ - + - + diff --git a/lib/iris/tests/results/analysis/regrid/linear_both_circular.cml b/lib/iris/tests/results/analysis/regrid/linear_both_circular.cml index 576ab4ace6..2ee0fc00d9 100644 --- a/lib/iris/tests/results/analysis/regrid/linear_both_circular.cml +++ b/lib/iris/tests/results/analysis/regrid/linear_both_circular.cml @@ -7,27 +7,27 @@ - + - + - + - + @@ -39,24 +39,24 @@ - + - + - + - + diff --git a/lib/iris/tests/results/analysis/regrid/linear_circular_grid.cml b/lib/iris/tests/results/analysis/regrid/linear_circular_grid.cml index d8fd78a749..3544db9698 100644 --- a/lib/iris/tests/results/analysis/regrid/linear_circular_grid.cml +++ b/lib/iris/tests/results/analysis/regrid/linear_circular_grid.cml @@ -7,23 +7,27 @@ - + - + - + - + @@ -35,24 +39,24 @@ - + - + - + - + diff --git a/lib/iris/tests/results/analysis/regrid/linear_circular_src.cml b/lib/iris/tests/results/analysis/regrid/linear_circular_src.cml index 1032b4fc6e..296de665da 100644 --- a/lib/iris/tests/results/analysis/regrid/linear_circular_src.cml +++ b/lib/iris/tests/results/analysis/regrid/linear_circular_src.cml @@ -7,27 +7,27 @@ - + - + - + - + @@ -39,24 +39,24 @@ - + - + - + - + diff --git a/lib/iris/tests/results/analysis/regrid/linear_circular_srcmissingmask.cml b/lib/iris/tests/results/analysis/regrid/linear_circular_srcmissingmask.cml index 1032b4fc6e..296de665da 100644 --- a/lib/iris/tests/results/analysis/regrid/linear_circular_srcmissingmask.cml +++ b/lib/iris/tests/results/analysis/regrid/linear_circular_srcmissingmask.cml @@ -7,27 +7,27 @@ - + - + - + - + @@ -39,24 +39,24 @@ - + - + - + - + diff --git a/lib/iris/tests/results/analysis/regrid/linear_masked_altitude.cml b/lib/iris/tests/results/analysis/regrid/linear_masked_altitude.cml index 1ac69490b4..b719738a62 100644 --- a/lib/iris/tests/results/analysis/regrid/linear_masked_altitude.cml +++ b/lib/iris/tests/results/analysis/regrid/linear_masked_altitude.cml @@ -6,85 +6,94 @@ - + [[424.42307, 398.04324, nan, nan, + nan], + [368.6881 , 343.87836, nan, nan, + nan], + [375.09146, 347.86066, nan, nan, + nan], + [446.16125, 414.22037, nan, nan, + nan]]]" shape="(2, 4, 5)" standard_name="altitude" units="Unit('m')" value_type="float32"> - + - + - + - + @@ -96,18 +105,23 @@ - + - + - + diff --git a/lib/iris/tests/results/analysis/regrid/linear_non_circular.cml b/lib/iris/tests/results/analysis/regrid/linear_non_circular.cml index 064409dde5..bb678502c1 100644 --- a/lib/iris/tests/results/analysis/regrid/linear_non_circular.cml +++ b/lib/iris/tests/results/analysis/regrid/linear_non_circular.cml @@ -7,23 +7,27 @@ - + - + - + - + @@ -35,24 +39,24 @@ - + - + - + - + diff --git a/lib/iris/tests/results/analysis/regrid/linear_partial_overlap.cml b/lib/iris/tests/results/analysis/regrid/linear_partial_overlap.cml index eb9adb4aef..fc39fee0f5 100644 --- a/lib/iris/tests/results/analysis/regrid/linear_partial_overlap.cml +++ b/lib/iris/tests/results/analysis/regrid/linear_partial_overlap.cml @@ -6,77 +6,78 @@ - + [[ nan, nan, 367.72552, 355.62955], + [ nan, nan, 340.44327, 407.57434], + [ nan, nan, 336.60175, 419.0933 ], + [ nan, nan, 376.38995, 341.02115]]]" shape="(2, 4, 4)" standard_name="altitude" units="Unit('m')" value_type="float32"> - + - + - + - + @@ -88,18 +89,19 @@ - + - + - + diff --git a/lib/iris/tests/results/analysis/regrid/linear_subset.cml b/lib/iris/tests/results/analysis/regrid/linear_subset.cml index 9bd62287fe..0121d84ebf 100644 --- a/lib/iris/tests/results/analysis/regrid/linear_subset.cml +++ b/lib/iris/tests/results/analysis/regrid/linear_subset.cml @@ -6,85 +6,94 @@ - + [[424.42307, 398.04324, 305.16385, 254.07837, + 340.82806], + [368.6881 , 343.87836, 348.51068, 368.9184 , + 407.57434], + [375.09146, 347.86066, 370.53574, 395.5417 , + 397.02896], + [446.16125, 414.22037, 365.36652, 322.28683, + 296.69153]]]" shape="(2, 4, 5)" standard_name="altitude" units="Unit('m')" value_type="float32"> - + - + - + - + @@ -96,18 +105,23 @@ - + - + - + diff --git a/lib/iris/tests/results/analysis/regrid/linear_subset_anon.cml b/lib/iris/tests/results/analysis/regrid/linear_subset_anon.cml index 1945b03a1a..ea3a804166 100644 --- a/lib/iris/tests/results/analysis/regrid/linear_subset_anon.cml +++ b/lib/iris/tests/results/analysis/regrid/linear_subset_anon.cml @@ -6,85 +6,94 @@ - + [[424.42307, 398.04324, 305.16385, 254.07837, + 340.82806], + [368.6881 , 343.87836, 348.51068, 368.9184 , + 407.57434], + [375.09146, 347.86066, 370.53574, 395.5417 , + 397.02896], + [446.16125, 414.22037, 365.36652, 322.28683, + 296.69153]]]" shape="(2, 4, 5)" standard_name="altitude" units="Unit('m')" value_type="float32"> - + - + - + - + @@ -96,14 +105,18 @@ - + - + diff --git a/lib/iris/tests/results/analysis/regrid/linear_subset_masked_1.cml b/lib/iris/tests/results/analysis/regrid/linear_subset_masked_1.cml index 9bd62287fe..0121d84ebf 100644 --- a/lib/iris/tests/results/analysis/regrid/linear_subset_masked_1.cml +++ b/lib/iris/tests/results/analysis/regrid/linear_subset_masked_1.cml @@ -6,85 +6,94 @@ - + [[424.42307, 398.04324, 305.16385, 254.07837, + 340.82806], + [368.6881 , 343.87836, 348.51068, 368.9184 , + 407.57434], + [375.09146, 347.86066, 370.53574, 395.5417 , + 397.02896], + [446.16125, 414.22037, 365.36652, 322.28683, + 296.69153]]]" shape="(2, 4, 5)" standard_name="altitude" units="Unit('m')" value_type="float32"> - + - + - + - + @@ -96,18 +105,23 @@ - + - + - + diff --git a/lib/iris/tests/results/analysis/regrid/linear_subset_masked_2.cml b/lib/iris/tests/results/analysis/regrid/linear_subset_masked_2.cml index 9bd62287fe..0121d84ebf 100644 --- a/lib/iris/tests/results/analysis/regrid/linear_subset_masked_2.cml +++ b/lib/iris/tests/results/analysis/regrid/linear_subset_masked_2.cml @@ -6,85 +6,94 @@ - + [[424.42307, 398.04324, 305.16385, 254.07837, + 340.82806], + [368.6881 , 343.87836, 348.51068, 368.9184 , + 407.57434], + [375.09146, 347.86066, 370.53574, 395.5417 , + 397.02896], + [446.16125, 414.22037, 365.36652, 322.28683, + 296.69153]]]" shape="(2, 4, 5)" standard_name="altitude" units="Unit('m')" value_type="float32"> - + - + - + - + @@ -96,18 +105,23 @@ - + - + - + diff --git a/lib/iris/tests/results/analysis/regrid/nearest_both_circular.cml b/lib/iris/tests/results/analysis/regrid/nearest_both_circular.cml index d8f1a9d0f6..9352ae6076 100644 --- a/lib/iris/tests/results/analysis/regrid/nearest_both_circular.cml +++ b/lib/iris/tests/results/analysis/regrid/nearest_both_circular.cml @@ -7,27 +7,27 @@ - + - + - + - + @@ -39,24 +39,24 @@ - + - + - + - + diff --git a/lib/iris/tests/results/analysis/regrid/nearest_circular_grid.cml b/lib/iris/tests/results/analysis/regrid/nearest_circular_grid.cml index 16863839a1..c13e7872a2 100644 --- a/lib/iris/tests/results/analysis/regrid/nearest_circular_grid.cml +++ b/lib/iris/tests/results/analysis/regrid/nearest_circular_grid.cml @@ -7,23 +7,27 @@ - + - + - + - + @@ -35,24 +39,24 @@ - + - + - + - + diff --git a/lib/iris/tests/results/analysis/regrid/nearest_circular_src.cml b/lib/iris/tests/results/analysis/regrid/nearest_circular_src.cml index 5eb032cf2c..400efcd7fa 100644 --- a/lib/iris/tests/results/analysis/regrid/nearest_circular_src.cml +++ b/lib/iris/tests/results/analysis/regrid/nearest_circular_src.cml @@ -7,27 +7,27 @@ - + - + - + - + @@ -39,24 +39,24 @@ - + - + - + - + diff --git a/lib/iris/tests/results/analysis/regrid/nearest_circular_srcmissingmask.cml b/lib/iris/tests/results/analysis/regrid/nearest_circular_srcmissingmask.cml index 5eb032cf2c..400efcd7fa 100644 --- a/lib/iris/tests/results/analysis/regrid/nearest_circular_srcmissingmask.cml +++ b/lib/iris/tests/results/analysis/regrid/nearest_circular_srcmissingmask.cml @@ -7,27 +7,27 @@ - + - + - + - + @@ -39,24 +39,24 @@ - + - + - + - + diff --git a/lib/iris/tests/results/analysis/regrid/nearest_masked_altitude.cml b/lib/iris/tests/results/analysis/regrid/nearest_masked_altitude.cml index a1cff2363e..905109b6b7 100644 --- a/lib/iris/tests/results/analysis/regrid/nearest_masked_altitude.cml +++ b/lib/iris/tests/results/analysis/regrid/nearest_masked_altitude.cml @@ -6,85 +6,94 @@ - + [[434.5705 , 395.5391 , 219.27228, 219.27228, + 349.64597], + [345.97134, 310.52786, nan, nan, + 444.776 ], + [345.97134, 310.52786, nan, nan, + 444.776 ], + [461.227 , 414.88275, 323.68027, 323.68027, + 280.81027]]]" shape="(2, 4, 5)" standard_name="altitude" units="Unit('m')" value_type="float32"> - + - + - + - + @@ -96,18 +105,23 @@ - + - + - + diff --git a/lib/iris/tests/results/analysis/regrid/nearest_non_circular.cml b/lib/iris/tests/results/analysis/regrid/nearest_non_circular.cml index da162648be..6978ec7200 100644 --- a/lib/iris/tests/results/analysis/regrid/nearest_non_circular.cml +++ b/lib/iris/tests/results/analysis/regrid/nearest_non_circular.cml @@ -7,23 +7,27 @@ - + - + - + - + @@ -35,24 +39,24 @@ - + - + - + - + diff --git a/lib/iris/tests/results/analysis/regrid/nearest_partial_overlap.cml b/lib/iris/tests/results/analysis/regrid/nearest_partial_overlap.cml index 98a0b6b805..a769ed4a38 100644 --- a/lib/iris/tests/results/analysis/regrid/nearest_partial_overlap.cml +++ b/lib/iris/tests/results/analysis/regrid/nearest_partial_overlap.cml @@ -6,77 +6,78 @@ - + [[ nan, nan, 395.5391 , 349.64597], + [ nan, nan, 310.52786, 444.776 ], + [ nan, nan, 310.52786, 444.776 ], + [ nan, nan, 414.88275, 280.81027]]]" shape="(2, 4, 4)" standard_name="altitude" units="Unit('m')" value_type="float32"> - + - + - + - + @@ -88,18 +89,19 @@ - + - + - + diff --git a/lib/iris/tests/results/analysis/regrid/nearest_subset.cml b/lib/iris/tests/results/analysis/regrid/nearest_subset.cml index a704cbecbb..6d7ef1b453 100644 --- a/lib/iris/tests/results/analysis/regrid/nearest_subset.cml +++ b/lib/iris/tests/results/analysis/regrid/nearest_subset.cml @@ -6,85 +6,94 @@ - + [[434.5705 , 395.5391 , 219.27228, 219.27228, + 349.64597], + [345.97134, 310.52786, 425.15723, 425.15723, + 444.776 ], + [345.97134, 310.52786, 425.15723, 425.15723, + 444.776 ], + [461.227 , 414.88275, 323.68027, 323.68027, + 280.81027]]]" shape="(2, 4, 5)" standard_name="altitude" units="Unit('m')" value_type="float32"> - + - + - + - + @@ -96,18 +105,23 @@ - + - + - + diff --git a/lib/iris/tests/results/analysis/regrid/nearest_subset_anon.cml b/lib/iris/tests/results/analysis/regrid/nearest_subset_anon.cml index 40390f387c..c40a3475a3 100644 --- a/lib/iris/tests/results/analysis/regrid/nearest_subset_anon.cml +++ b/lib/iris/tests/results/analysis/regrid/nearest_subset_anon.cml @@ -6,85 +6,94 @@ - + [[434.5705 , 395.5391 , 219.27228, 219.27228, + 349.64597], + [345.97134, 310.52786, 425.15723, 425.15723, + 444.776 ], + [345.97134, 310.52786, 425.15723, 425.15723, + 444.776 ], + [461.227 , 414.88275, 323.68027, 323.68027, + 280.81027]]]" shape="(2, 4, 5)" standard_name="altitude" units="Unit('m')" value_type="float32"> - + - + - + - + @@ -96,14 +105,18 @@ - + - + diff --git a/lib/iris/tests/results/analysis/regrid/nearest_subset_masked_1.cml b/lib/iris/tests/results/analysis/regrid/nearest_subset_masked_1.cml index a704cbecbb..6d7ef1b453 100644 --- a/lib/iris/tests/results/analysis/regrid/nearest_subset_masked_1.cml +++ b/lib/iris/tests/results/analysis/regrid/nearest_subset_masked_1.cml @@ -6,85 +6,94 @@ - + [[434.5705 , 395.5391 , 219.27228, 219.27228, + 349.64597], + [345.97134, 310.52786, 425.15723, 425.15723, + 444.776 ], + [345.97134, 310.52786, 425.15723, 425.15723, + 444.776 ], + [461.227 , 414.88275, 323.68027, 323.68027, + 280.81027]]]" shape="(2, 4, 5)" standard_name="altitude" units="Unit('m')" value_type="float32"> - + - + - + - + @@ -96,18 +105,23 @@ - + - + - + diff --git a/lib/iris/tests/results/analysis/regrid/nearest_subset_masked_2.cml b/lib/iris/tests/results/analysis/regrid/nearest_subset_masked_2.cml index a704cbecbb..6d7ef1b453 100644 --- a/lib/iris/tests/results/analysis/regrid/nearest_subset_masked_2.cml +++ b/lib/iris/tests/results/analysis/regrid/nearest_subset_masked_2.cml @@ -6,85 +6,94 @@ - + [[434.5705 , 395.5391 , 219.27228, 219.27228, + 349.64597], + [345.97134, 310.52786, 425.15723, 425.15723, + 444.776 ], + [345.97134, 310.52786, 425.15723, 425.15723, + 444.776 ], + [461.227 , 414.88275, 323.68027, 323.68027, + 280.81027]]]" shape="(2, 4, 5)" standard_name="altitude" units="Unit('m')" value_type="float32"> - + - + - + - + @@ -96,18 +105,23 @@ - + - + - + diff --git a/lib/iris/tests/results/analysis/regrid/no_overlap.cml b/lib/iris/tests/results/analysis/regrid/no_overlap.cml index da2f03f1ee..19033c255d 100644 --- a/lib/iris/tests/results/analysis/regrid/no_overlap.cml +++ b/lib/iris/tests/results/analysis/regrid/no_overlap.cml @@ -7,76 +7,78 @@ + [[nan, nan, nan, nan], + [nan, nan, nan, nan], + [nan, nan, nan, nan], + [nan, nan, nan, nan]]]" shape="(2, 4, 4)" standard_name="altitude" units="Unit('m')" value_type="float32"> - + - + - + - + @@ -88,18 +90,19 @@ - + + [nan, nan, nan, nan], + [nan, nan, nan, nan], + [nan, nan, nan, nan]]" shape="(4, 4)" standard_name="surface_altitude" units="Unit('m')" value_type="float32"/> - + diff --git a/lib/iris/tests/results/analysis/rms_latitude.cml b/lib/iris/tests/results/analysis/rms_latitude.cml index d4b1428fb2..e3b82802ca 100644 --- a/lib/iris/tests/results/analysis/rms_latitude.cml +++ b/lib/iris/tests/results/analysis/rms_latitude.cml @@ -8,26 +8,25 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/rms_latitude_longitude.cml b/lib/iris/tests/results/analysis/rms_latitude_longitude.cml index 4293087847..d0c7c95535 100644 --- a/lib/iris/tests/results/analysis/rms_latitude_longitude.cml +++ b/lib/iris/tests/results/analysis/rms_latitude_longitude.cml @@ -8,13 +8,13 @@ - + - + - + @@ -24,9 +24,8 @@ - + diff --git a/lib/iris/tests/results/analysis/rms_latitude_longitude_1call.cml b/lib/iris/tests/results/analysis/rms_latitude_longitude_1call.cml index 9ca1d23b42..887b8b6ebb 100644 --- a/lib/iris/tests/results/analysis/rms_latitude_longitude_1call.cml +++ b/lib/iris/tests/results/analysis/rms_latitude_longitude_1call.cml @@ -8,13 +8,13 @@ - + - + - + @@ -24,9 +24,8 @@ - + diff --git a/lib/iris/tests/results/analysis/rms_weighted_2d.cml b/lib/iris/tests/results/analysis/rms_weighted_2d.cml index 433e27d359..b315bd0983 100644 --- a/lib/iris/tests/results/analysis/rms_weighted_2d.cml +++ b/lib/iris/tests/results/analysis/rms_weighted_2d.cml @@ -3,12 +3,12 @@ - + - + diff --git a/lib/iris/tests/results/analysis/rolling_window/simple_latitude.cml b/lib/iris/tests/results/analysis/rolling_window/simple_latitude.cml index ff64076f83..2eb8d59561 100644 --- a/lib/iris/tests/results/analysis/rolling_window/simple_latitude.cml +++ b/lib/iris/tests/results/analysis/rolling_window/simple_latitude.cml @@ -3,11 +3,11 @@ - + - + diff --git a/lib/iris/tests/results/analysis/rolling_window/simple_longitude.cml b/lib/iris/tests/results/analysis/rolling_window/simple_longitude.cml index b2c422057e..7979ae25b6 100644 --- a/lib/iris/tests/results/analysis/rolling_window/simple_longitude.cml +++ b/lib/iris/tests/results/analysis/rolling_window/simple_longitude.cml @@ -3,12 +3,12 @@ - + - + diff --git a/lib/iris/tests/results/analysis/rolling_window/size_4_longitude.cml b/lib/iris/tests/results/analysis/rolling_window/size_4_longitude.cml index 0e4330ce82..6c19e04f6f 100644 --- a/lib/iris/tests/results/analysis/rolling_window/size_4_longitude.cml +++ b/lib/iris/tests/results/analysis/rolling_window/size_4_longitude.cml @@ -3,10 +3,10 @@ - + - + diff --git a/lib/iris/tests/results/analysis/sqrt.cml b/lib/iris/tests/results/analysis/sqrt.cml index f8a1c48fc3..6bdeaee3e9 100644 --- a/lib/iris/tests/results/analysis/sqrt.cml +++ b/lib/iris/tests/results/analysis/sqrt.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/std_dev_latitude.cml b/lib/iris/tests/results/analysis/std_dev_latitude.cml index a45aefeff4..fec9f9d09c 100644 --- a/lib/iris/tests/results/analysis/std_dev_latitude.cml +++ b/lib/iris/tests/results/analysis/std_dev_latitude.cml @@ -8,26 +8,25 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/std_dev_latitude_longitude.cml b/lib/iris/tests/results/analysis/std_dev_latitude_longitude.cml index 95e8e3694d..86d60a29ad 100644 --- a/lib/iris/tests/results/analysis/std_dev_latitude_longitude.cml +++ b/lib/iris/tests/results/analysis/std_dev_latitude_longitude.cml @@ -8,13 +8,13 @@ - + - + - + @@ -24,9 +24,8 @@ - + diff --git a/lib/iris/tests/results/analysis/std_dev_latitude_longitude_1call.cml b/lib/iris/tests/results/analysis/std_dev_latitude_longitude_1call.cml index f91f6005b7..26baf44a65 100644 --- a/lib/iris/tests/results/analysis/std_dev_latitude_longitude_1call.cml +++ b/lib/iris/tests/results/analysis/std_dev_latitude_longitude_1call.cml @@ -8,13 +8,13 @@ - + - + - + @@ -24,9 +24,8 @@ - + diff --git a/lib/iris/tests/results/analysis/subtract.cml b/lib/iris/tests/results/analysis/subtract.cml index 3466578756..d8a56d895b 100644 --- a/lib/iris/tests/results/analysis/subtract.cml +++ b/lib/iris/tests/results/analysis/subtract.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/subtract_array.cml b/lib/iris/tests/results/analysis/subtract_array.cml index 14b0b42dd8..b137858af8 100644 --- a/lib/iris/tests/results/analysis/subtract_array.cml +++ b/lib/iris/tests/results/analysis/subtract_array.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/subtract_coord_x.cml b/lib/iris/tests/results/analysis/subtract_coord_x.cml index 060814c6ba..ae951e328f 100644 --- a/lib/iris/tests/results/analysis/subtract_coord_x.cml +++ b/lib/iris/tests/results/analysis/subtract_coord_x.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/subtract_coord_y.cml b/lib/iris/tests/results/analysis/subtract_coord_y.cml index 4a9351cf6f..0aaf05808c 100644 --- a/lib/iris/tests/results/analysis/subtract_coord_y.cml +++ b/lib/iris/tests/results/analysis/subtract_coord_y.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/subtract_scalar.cml b/lib/iris/tests/results/analysis/subtract_scalar.cml index f458364143..889cde24bd 100644 --- a/lib/iris/tests/results/analysis/subtract_scalar.cml +++ b/lib/iris/tests/results/analysis/subtract_scalar.cml @@ -6,36 +6,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/sum_latitude.cml b/lib/iris/tests/results/analysis/sum_latitude.cml index fbb8460fd8..bef5f48f72 100644 --- a/lib/iris/tests/results/analysis/sum_latitude.cml +++ b/lib/iris/tests/results/analysis/sum_latitude.cml @@ -8,26 +8,25 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/sum_latitude_longitude.cml b/lib/iris/tests/results/analysis/sum_latitude_longitude.cml index cb992f3b9d..f5ce9b622c 100644 --- a/lib/iris/tests/results/analysis/sum_latitude_longitude.cml +++ b/lib/iris/tests/results/analysis/sum_latitude_longitude.cml @@ -8,13 +8,13 @@ - + - + - + @@ -24,9 +24,8 @@ - + diff --git a/lib/iris/tests/results/analysis/sum_latitude_longitude_1call.cml b/lib/iris/tests/results/analysis/sum_latitude_longitude_1call.cml index 6171dc516b..3dca019667 100644 --- a/lib/iris/tests/results/analysis/sum_latitude_longitude_1call.cml +++ b/lib/iris/tests/results/analysis/sum_latitude_longitude_1call.cml @@ -8,13 +8,13 @@ - + - + - + @@ -24,9 +24,8 @@ - + diff --git a/lib/iris/tests/results/analysis/sum_weighted_1d.cml b/lib/iris/tests/results/analysis/sum_weighted_1d.cml index 09958e4eb0..3579d60d1a 100644 --- a/lib/iris/tests/results/analysis/sum_weighted_1d.cml +++ b/lib/iris/tests/results/analysis/sum_weighted_1d.cml @@ -3,7 +3,7 @@ - + diff --git a/lib/iris/tests/results/analysis/sum_weighted_2d.cml b/lib/iris/tests/results/analysis/sum_weighted_2d.cml index 57cf7d3d1f..4b8b04b1aa 100644 --- a/lib/iris/tests/results/analysis/sum_weighted_2d.cml +++ b/lib/iris/tests/results/analysis/sum_weighted_2d.cml @@ -3,13 +3,13 @@ - + - + diff --git a/lib/iris/tests/results/analysis/third_quartile_foo_1d.cml b/lib/iris/tests/results/analysis/third_quartile_foo_1d.cml index 038e7c8668..78d56bc4ec 100644 --- a/lib/iris/tests/results/analysis/third_quartile_foo_1d.cml +++ b/lib/iris/tests/results/analysis/third_quartile_foo_1d.cml @@ -3,7 +3,7 @@ - + diff --git a/lib/iris/tests/results/analysis/third_quartile_foo_1d_fast_percentile.cml b/lib/iris/tests/results/analysis/third_quartile_foo_1d_fast_percentile.cml index 038e7c8668..78d56bc4ec 100644 --- a/lib/iris/tests/results/analysis/third_quartile_foo_1d_fast_percentile.cml +++ b/lib/iris/tests/results/analysis/third_quartile_foo_1d_fast_percentile.cml @@ -3,7 +3,7 @@ - + diff --git a/lib/iris/tests/results/analysis/variance_latitude.cml b/lib/iris/tests/results/analysis/variance_latitude.cml index 5b55731396..1efa3dc26c 100644 --- a/lib/iris/tests/results/analysis/variance_latitude.cml +++ b/lib/iris/tests/results/analysis/variance_latitude.cml @@ -8,26 +8,25 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/variance_latitude_longitude.cml b/lib/iris/tests/results/analysis/variance_latitude_longitude.cml index 359e40ef8a..9fbd2bac53 100644 --- a/lib/iris/tests/results/analysis/variance_latitude_longitude.cml +++ b/lib/iris/tests/results/analysis/variance_latitude_longitude.cml @@ -8,13 +8,13 @@ - + - + - + @@ -24,9 +24,8 @@ - + diff --git a/lib/iris/tests/results/analysis/variance_latitude_longitude_1call.cml b/lib/iris/tests/results/analysis/variance_latitude_longitude_1call.cml index 0345eac77b..53484137ca 100644 --- a/lib/iris/tests/results/analysis/variance_latitude_longitude_1call.cml +++ b/lib/iris/tests/results/analysis/variance_latitude_longitude_1call.cml @@ -8,13 +8,13 @@ - + - + - + @@ -24,9 +24,8 @@ - + diff --git a/lib/iris/tests/results/analysis/weighted_mean_lat.cml b/lib/iris/tests/results/analysis/weighted_mean_lat.cml index d2bb6f0df4..7786112b9c 100644 --- a/lib/iris/tests/results/analysis/weighted_mean_lat.cml +++ b/lib/iris/tests/results/analysis/weighted_mean_lat.cml @@ -3,15 +3,15 @@ - + - + - + diff --git a/lib/iris/tests/results/analysis/weighted_mean_latlon.cml b/lib/iris/tests/results/analysis/weighted_mean_latlon.cml index e25e74c021..c7addc162a 100644 --- a/lib/iris/tests/results/analysis/weighted_mean_latlon.cml +++ b/lib/iris/tests/results/analysis/weighted_mean_latlon.cml @@ -3,15 +3,15 @@ - + - + - + diff --git a/lib/iris/tests/results/analysis/weighted_mean_lon.cml b/lib/iris/tests/results/analysis/weighted_mean_lon.cml index 6ce89976b6..2fc50bf6d4 100644 --- a/lib/iris/tests/results/analysis/weighted_mean_lon.cml +++ b/lib/iris/tests/results/analysis/weighted_mean_lon.cml @@ -3,15 +3,15 @@ - + - + - + diff --git a/lib/iris/tests/results/analysis/weighted_mean_original.cml b/lib/iris/tests/results/analysis/weighted_mean_original.cml index a69e633e26..a013add0cb 100644 --- a/lib/iris/tests/results/analysis/weighted_mean_original.cml +++ b/lib/iris/tests/results/analysis/weighted_mean_original.cml @@ -7,37 +7,63 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/analysis/weighted_mean_source.cml b/lib/iris/tests/results/analysis/weighted_mean_source.cml index eb72035a4f..9ea20dfe46 100644 --- a/lib/iris/tests/results/analysis/weighted_mean_source.cml +++ b/lib/iris/tests/results/analysis/weighted_mean_source.cml @@ -3,15 +3,15 @@ - + - + - + diff --git a/lib/iris/tests/results/categorisation/customcheck.cml b/lib/iris/tests/results/categorisation/customcheck.cml index 476a1c56ef..7fd65b6965 100644 --- a/lib/iris/tests/results/categorisation/customcheck.cml +++ b/lib/iris/tests/results/categorisation/customcheck.cml @@ -4,22 +4,23 @@ + 0, 1, 1, 1, 1, 1, 2]" shape="(23,)" units="Unit('1')" value_type="int64"/> + 1970, 1970, 1970, 1970, 1970, 1971, 1971, 1971, + 1971, 1971, 1971, 1971, 1971, 1971, 1971]" shape="(23,)" units="Unit('1')" value_type="int64"/> - + - + diff --git a/lib/iris/tests/results/categorisation/quickcheck.cml b/lib/iris/tests/results/categorisation/quickcheck.cml index b8f3904ad1..58a8fafa5c 100644 --- a/lib/iris/tests/results/categorisation/quickcheck.cml +++ b/lib/iris/tests/results/categorisation/quickcheck.cml @@ -3,72 +3,77 @@ - + - + - + - + + 2, 0, 1, 1, 2, 0, 1]" shape="(23,)" units="Unit('1')" value_type="int64"/> - + - + + 1, 1, 1, 1, 2, 2, 2]" shape="(23,)" units="Unit('1')" value_type="int64"/> + 1970, 1970, 1970, 1970, 1970, 1971, 1971, 1971, + 1971, 1971, 1971, 1971, 1971, 1971, 1971]" shape="(23,)" units="Unit('1')" value_type="int64"/> - + - + + 1, 0, 6, 5, 4, 3, 2]" shape="(23,)" units="Unit('1')" value_type="int64"/> + 1970, 1970, 1970, 1970, 1970, 1970, 1971, 1971, + 1971, 1971, 1971, 1971, 1971, 1971, 1971]" shape="(23,)" units="Unit('1')" value_type="int64"/> - + diff --git a/lib/iris/tests/results/cdm/extract/lat_eq_10.cml b/lib/iris/tests/results/cdm/extract/lat_eq_10.cml index e7213fc7bd..f6052ccb93 100644 --- a/lib/iris/tests/results/cdm/extract/lat_eq_10.cml +++ b/lib/iris/tests/results/cdm/extract/lat_eq_10.cml @@ -8,129 +8,139 @@ - + - + - + - + - + - + - + - + diff --git a/lib/iris/tests/results/cdm/extract/lat_gt_10.cml b/lib/iris/tests/results/cdm/extract/lat_gt_10.cml index 3ffbbf89e5..c06345ab33 100644 --- a/lib/iris/tests/results/cdm/extract/lat_gt_10.cml +++ b/lib/iris/tests/results/cdm/extract/lat_gt_10.cml @@ -8,138 +8,148 @@ - + - + - + - + - + - + - + - + diff --git a/lib/iris/tests/results/cdm/extract/lat_gt_10_and_lon_ge_10.cml b/lib/iris/tests/results/cdm/extract/lat_gt_10_and_lon_ge_10.cml index 7091aee748..b9f2a4b496 100644 --- a/lib/iris/tests/results/cdm/extract/lat_gt_10_and_lon_ge_10.cml +++ b/lib/iris/tests/results/cdm/extract/lat_gt_10_and_lon_ge_10.cml @@ -8,139 +8,148 @@ - + - + - + - + - + - + - + - + diff --git a/lib/iris/tests/results/cdm/masked_cube.cml b/lib/iris/tests/results/cdm/masked_cube.cml index dcfa8c062f..64663a55fe 100644 --- a/lib/iris/tests/results/cdm/masked_cube.cml +++ b/lib/iris/tests/results/cdm/masked_cube.cml @@ -7,32 +7,30 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/cdm/test_simple_cube_intersection.cml b/lib/iris/tests/results/cdm/test_simple_cube_intersection.cml index 8d1b986397..c4d2c6dd81 100644 --- a/lib/iris/tests/results/cdm/test_simple_cube_intersection.cml +++ b/lib/iris/tests/results/cdm/test_simple_cube_intersection.cml @@ -3,12 +3,12 @@ - + - + @@ -22,12 +22,12 @@ - + - + diff --git a/lib/iris/tests/results/concatenate/concat_2x2d.cml b/lib/iris/tests/results/concatenate/concat_2x2d.cml index feeb553642..cd4fd537ff 100644 --- a/lib/iris/tests/results/concatenate/concat_2x2d.cml +++ b/lib/iris/tests/results/concatenate/concat_2x2d.cml @@ -3,16 +3,16 @@ - + - + diff --git a/lib/iris/tests/results/concatenate/concat_2x2d_aux_x.cml b/lib/iris/tests/results/concatenate/concat_2x2d_aux_x.cml index 9076ae2538..894f4df52c 100644 --- a/lib/iris/tests/results/concatenate/concat_2x2d_aux_x.cml +++ b/lib/iris/tests/results/concatenate/concat_2x2d_aux_x.cml @@ -3,19 +3,19 @@ - + - + - + diff --git a/lib/iris/tests/results/concatenate/concat_2x2d_aux_x_bounds.cml b/lib/iris/tests/results/concatenate/concat_2x2d_aux_x_bounds.cml index 5597a876b2..07e66e82b6 100644 --- a/lib/iris/tests/results/concatenate/concat_2x2d_aux_x_bounds.cml +++ b/lib/iris/tests/results/concatenate/concat_2x2d_aux_x_bounds.cml @@ -3,24 +3,24 @@ - + - + - + diff --git a/lib/iris/tests/results/concatenate/concat_2x2d_aux_x_xy.cml b/lib/iris/tests/results/concatenate/concat_2x2d_aux_x_xy.cml index 4c5c993b9e..37330ba58b 100644 --- a/lib/iris/tests/results/concatenate/concat_2x2d_aux_x_xy.cml +++ b/lib/iris/tests/results/concatenate/concat_2x2d_aux_x_xy.cml @@ -3,23 +3,23 @@ - + - + - + - + diff --git a/lib/iris/tests/results/concatenate/concat_2x2d_aux_x_y.cml b/lib/iris/tests/results/concatenate/concat_2x2d_aux_x_y.cml index 2ace2a8024..51326ca74b 100644 --- a/lib/iris/tests/results/concatenate/concat_2x2d_aux_x_y.cml +++ b/lib/iris/tests/results/concatenate/concat_2x2d_aux_x_y.cml @@ -3,22 +3,22 @@ - + - + - + - + diff --git a/lib/iris/tests/results/concatenate/concat_2x2d_aux_x_y_xy.cml b/lib/iris/tests/results/concatenate/concat_2x2d_aux_x_y_xy.cml index e0f1fd2775..fa5b41299a 100644 --- a/lib/iris/tests/results/concatenate/concat_2x2d_aux_x_y_xy.cml +++ b/lib/iris/tests/results/concatenate/concat_2x2d_aux_x_y_xy.cml @@ -3,26 +3,26 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/concatenate/concat_2x2d_aux_xy.cml b/lib/iris/tests/results/concatenate/concat_2x2d_aux_xy.cml index 5bc3c707f7..fac46bb54d 100644 --- a/lib/iris/tests/results/concatenate/concat_2x2d_aux_xy.cml +++ b/lib/iris/tests/results/concatenate/concat_2x2d_aux_xy.cml @@ -3,20 +3,20 @@ - + - + - + diff --git a/lib/iris/tests/results/concatenate/concat_2x2d_aux_xy_bounds.cml b/lib/iris/tests/results/concatenate/concat_2x2d_aux_xy_bounds.cml index 4f279cef01..d947bb394d 100644 --- a/lib/iris/tests/results/concatenate/concat_2x2d_aux_xy_bounds.cml +++ b/lib/iris/tests/results/concatenate/concat_2x2d_aux_xy_bounds.cml @@ -3,26 +3,26 @@ - + - + [[201, 202, 203, 204], + [301, 302, 303, 304], + [202, 203, 204, 205], + [302, 303, 304, 305]]]" id="af0ab254" long_name="xy-aux" points="[[ 1., 101., 2., 102.], + [201., 301., 202., 302.]]" shape="(2, 4)" units="Unit('1')" value_type="float32"/> - + diff --git a/lib/iris/tests/results/concatenate/concat_2x2d_aux_y.cml b/lib/iris/tests/results/concatenate/concat_2x2d_aux_y.cml index 95575d1b65..4d66e2e2d5 100644 --- a/lib/iris/tests/results/concatenate/concat_2x2d_aux_y.cml +++ b/lib/iris/tests/results/concatenate/concat_2x2d_aux_y.cml @@ -3,19 +3,19 @@ - + - + - + diff --git a/lib/iris/tests/results/concatenate/concat_2x2d_aux_y_xy.cml b/lib/iris/tests/results/concatenate/concat_2x2d_aux_y_xy.cml index dbe28f6a65..e55016f80a 100644 --- a/lib/iris/tests/results/concatenate/concat_2x2d_aux_y_xy.cml +++ b/lib/iris/tests/results/concatenate/concat_2x2d_aux_y_xy.cml @@ -3,23 +3,23 @@ - + - + - + - + diff --git a/lib/iris/tests/results/concatenate/concat_2y2d.cml b/lib/iris/tests/results/concatenate/concat_2y2d.cml index 55a896c12a..bdf2c04c91 100644 --- a/lib/iris/tests/results/concatenate/concat_2y2d.cml +++ b/lib/iris/tests/results/concatenate/concat_2y2d.cml @@ -3,16 +3,16 @@ - + - + diff --git a/lib/iris/tests/results/concatenate/concat_2y2d_aux_x.cml b/lib/iris/tests/results/concatenate/concat_2y2d_aux_x.cml index 6e8e367501..55d9978911 100644 --- a/lib/iris/tests/results/concatenate/concat_2y2d_aux_x.cml +++ b/lib/iris/tests/results/concatenate/concat_2y2d_aux_x.cml @@ -3,19 +3,19 @@ - + - + - + diff --git a/lib/iris/tests/results/concatenate/concat_2y2d_aux_x_xy.cml b/lib/iris/tests/results/concatenate/concat_2y2d_aux_x_xy.cml index 20ce15e486..cdfed95f4e 100644 --- a/lib/iris/tests/results/concatenate/concat_2y2d_aux_x_xy.cml +++ b/lib/iris/tests/results/concatenate/concat_2y2d_aux_x_xy.cml @@ -3,27 +3,27 @@ - + - + - + - + diff --git a/lib/iris/tests/results/concatenate/concat_2y2d_aux_x_y.cml b/lib/iris/tests/results/concatenate/concat_2y2d_aux_x_y.cml index f486652592..91bbdc381e 100644 --- a/lib/iris/tests/results/concatenate/concat_2y2d_aux_x_y.cml +++ b/lib/iris/tests/results/concatenate/concat_2y2d_aux_x_y.cml @@ -3,22 +3,22 @@ - + - + - + - + diff --git a/lib/iris/tests/results/concatenate/concat_2y2d_aux_x_y_xy.cml b/lib/iris/tests/results/concatenate/concat_2y2d_aux_x_y_xy.cml index cc1377cfd0..6e747200da 100644 --- a/lib/iris/tests/results/concatenate/concat_2y2d_aux_x_y_xy.cml +++ b/lib/iris/tests/results/concatenate/concat_2y2d_aux_x_y_xy.cml @@ -3,30 +3,30 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/concatenate/concat_2y2d_aux_xy.cml b/lib/iris/tests/results/concatenate/concat_2y2d_aux_xy.cml index 4e4a8d8729..ab85674486 100644 --- a/lib/iris/tests/results/concatenate/concat_2y2d_aux_xy.cml +++ b/lib/iris/tests/results/concatenate/concat_2y2d_aux_xy.cml @@ -3,24 +3,24 @@ - + - + - + diff --git a/lib/iris/tests/results/concatenate/concat_2y2d_aux_y.cml b/lib/iris/tests/results/concatenate/concat_2y2d_aux_y.cml index 73a11c74a8..40b1d6bbe9 100644 --- a/lib/iris/tests/results/concatenate/concat_2y2d_aux_y.cml +++ b/lib/iris/tests/results/concatenate/concat_2y2d_aux_y.cml @@ -3,19 +3,19 @@ - + - + - + diff --git a/lib/iris/tests/results/concatenate/concat_2y2d_aux_y_xy.cml b/lib/iris/tests/results/concatenate/concat_2y2d_aux_y_xy.cml index 8add7084dc..17af2b0653 100644 --- a/lib/iris/tests/results/concatenate/concat_2y2d_aux_y_xy.cml +++ b/lib/iris/tests/results/concatenate/concat_2y2d_aux_y_xy.cml @@ -3,27 +3,27 @@ - + - + - + - + diff --git a/lib/iris/tests/results/concatenate/concat_3d_simple.cml b/lib/iris/tests/results/concatenate/concat_3d_simple.cml index 67c7cc4376..9afb0fd9dd 100644 --- a/lib/iris/tests/results/concatenate/concat_3d_simple.cml +++ b/lib/iris/tests/results/concatenate/concat_3d_simple.cml @@ -3,70 +3,70 @@ - + - + - + - + [[4000., 5000., 4000., 5000.], + [6000., 7000., 6000., 7000.], + [4000., 5000., 4000., 5000.], + [6000., 7000., 6000., 7000.]]]" shape="(4, 4, 4)" units="Unit('1')" value_type="float32"/> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/concatenate/concat_4mix2d_aux_xy.cml b/lib/iris/tests/results/concatenate/concat_4mix2d_aux_xy.cml index b706f7b3cb..e53113e840 100644 --- a/lib/iris/tests/results/concatenate/concat_4mix2d_aux_xy.cml +++ b/lib/iris/tests/results/concatenate/concat_4mix2d_aux_xy.cml @@ -3,22 +3,22 @@ - + - + - + diff --git a/lib/iris/tests/results/concatenate/concat_4x2d_aux_xy.cml b/lib/iris/tests/results/concatenate/concat_4x2d_aux_xy.cml index 229281f88c..67bba81710 100644 --- a/lib/iris/tests/results/concatenate/concat_4x2d_aux_xy.cml +++ b/lib/iris/tests/results/concatenate/concat_4x2d_aux_xy.cml @@ -3,22 +3,22 @@ - + - + - + diff --git a/lib/iris/tests/results/concatenate/concat_4y2d_aux_xy.cml b/lib/iris/tests/results/concatenate/concat_4y2d_aux_xy.cml index bf9ee0a610..9efc2ab088 100644 --- a/lib/iris/tests/results/concatenate/concat_4y2d_aux_xy.cml +++ b/lib/iris/tests/results/concatenate/concat_4y2d_aux_xy.cml @@ -3,22 +3,22 @@ - + - + - + diff --git a/lib/iris/tests/results/concatenate/concat_9mix2d_aux_xy.cml b/lib/iris/tests/results/concatenate/concat_9mix2d_aux_xy.cml index 636d7ad06d..c29783bca6 100644 --- a/lib/iris/tests/results/concatenate/concat_9mix2d_aux_xy.cml +++ b/lib/iris/tests/results/concatenate/concat_9mix2d_aux_xy.cml @@ -3,28 +3,28 @@ - + - + - + diff --git a/lib/iris/tests/results/concatenate/concat_9x2d_aux_xy.cml b/lib/iris/tests/results/concatenate/concat_9x2d_aux_xy.cml index dea24c5518..1fd9d843c5 100644 --- a/lib/iris/tests/results/concatenate/concat_9x2d_aux_xy.cml +++ b/lib/iris/tests/results/concatenate/concat_9x2d_aux_xy.cml @@ -3,28 +3,28 @@ - + - + - + diff --git a/lib/iris/tests/results/concatenate/concat_9y2d_aux_xy.cml b/lib/iris/tests/results/concatenate/concat_9y2d_aux_xy.cml index ed4b23ce08..1d62fae473 100644 --- a/lib/iris/tests/results/concatenate/concat_9y2d_aux_xy.cml +++ b/lib/iris/tests/results/concatenate/concat_9y2d_aux_xy.cml @@ -3,28 +3,28 @@ - + - + - + diff --git a/lib/iris/tests/results/concatenate/concat_anonymous.cml b/lib/iris/tests/results/concatenate/concat_anonymous.cml index 7eeccb2241..c5f986cdcd 100644 --- a/lib/iris/tests/results/concatenate/concat_anonymous.cml +++ b/lib/iris/tests/results/concatenate/concat_anonymous.cml @@ -3,14 +3,14 @@ - + - + @@ -19,8 +19,8 @@ - + diff --git a/lib/iris/tests/results/concatenate/concat_masked_2x2d.cml b/lib/iris/tests/results/concatenate/concat_masked_2x2d.cml index f8b47f9627..6b25ac8259 100644 --- a/lib/iris/tests/results/concatenate/concat_masked_2x2d.cml +++ b/lib/iris/tests/results/concatenate/concat_masked_2x2d.cml @@ -3,14 +3,14 @@ - + - + diff --git a/lib/iris/tests/results/concatenate/concat_masked_2y2d.cml b/lib/iris/tests/results/concatenate/concat_masked_2y2d.cml index d4f31c7e44..86460bc8a9 100644 --- a/lib/iris/tests/results/concatenate/concat_masked_2y2d.cml +++ b/lib/iris/tests/results/concatenate/concat_masked_2y2d.cml @@ -3,14 +3,14 @@ - + - + diff --git a/lib/iris/tests/results/concatenate/concat_merged_scalar_4mix2d_aux_xy.cml b/lib/iris/tests/results/concatenate/concat_merged_scalar_4mix2d_aux_xy.cml index 645d0aa95f..77143dc05a 100644 --- a/lib/iris/tests/results/concatenate/concat_merged_scalar_4mix2d_aux_xy.cml +++ b/lib/iris/tests/results/concatenate/concat_merged_scalar_4mix2d_aux_xy.cml @@ -3,25 +3,25 @@ - + - + - + - + diff --git a/lib/iris/tests/results/concatenate/concat_merged_scalar_4x2d_aux_xy.cml b/lib/iris/tests/results/concatenate/concat_merged_scalar_4x2d_aux_xy.cml index 645d0aa95f..77143dc05a 100644 --- a/lib/iris/tests/results/concatenate/concat_merged_scalar_4x2d_aux_xy.cml +++ b/lib/iris/tests/results/concatenate/concat_merged_scalar_4x2d_aux_xy.cml @@ -3,25 +3,25 @@ - + - + - + - + diff --git a/lib/iris/tests/results/concatenate/concat_merged_scalar_4y2d_aux_xy.cml b/lib/iris/tests/results/concatenate/concat_merged_scalar_4y2d_aux_xy.cml index 94bcb31795..8f72b0339e 100644 --- a/lib/iris/tests/results/concatenate/concat_merged_scalar_4y2d_aux_xy.cml +++ b/lib/iris/tests/results/concatenate/concat_merged_scalar_4y2d_aux_xy.cml @@ -3,25 +3,25 @@ - + - + - + - + diff --git a/lib/iris/tests/results/concatenate/concat_pre_merged_scalar_4mix2d_aux_xy.cml b/lib/iris/tests/results/concatenate/concat_pre_merged_scalar_4mix2d_aux_xy.cml index 1b60930a09..3c078ffbcc 100644 --- a/lib/iris/tests/results/concatenate/concat_pre_merged_scalar_4mix2d_aux_xy.cml +++ b/lib/iris/tests/results/concatenate/concat_pre_merged_scalar_4mix2d_aux_xy.cml @@ -3,19 +3,19 @@ - + - + - + - + @@ -24,19 +24,19 @@ - + + [2.5, 3.5]]" id="78a0dfe8" long_name="x" points="[2., 3.]" shape="(2,)" units="Unit('1')" value_type="float32"/> - + + [2.5, 3.5]]" id="6fdbcbab" long_name="y" points="[2., 3.]" shape="(2,)" units="Unit('1')" value_type="float32"/> @@ -45,19 +45,19 @@ - + + [2.5, 3.5]]" id="78a0dfe8" long_name="x" points="[2., 3.]" shape="(2,)" units="Unit('1')" value_type="float32"/> - + - + @@ -66,19 +66,19 @@ - + - + - + + [2.5, 3.5]]" id="6fdbcbab" long_name="y" points="[2., 3.]" shape="(2,)" units="Unit('1')" value_type="float32"/> diff --git a/lib/iris/tests/results/concatenate/concat_pre_merged_scalar_4x2_aux_xy.cml b/lib/iris/tests/results/concatenate/concat_pre_merged_scalar_4x2_aux_xy.cml index 1f87f5b3cf..db474a8d40 100644 --- a/lib/iris/tests/results/concatenate/concat_pre_merged_scalar_4x2_aux_xy.cml +++ b/lib/iris/tests/results/concatenate/concat_pre_merged_scalar_4x2_aux_xy.cml @@ -3,19 +3,19 @@ - + - + - + - + @@ -24,19 +24,19 @@ - + + [2.5, 3.5]]" id="78a0dfe8" long_name="x" points="[2., 3.]" shape="(2,)" units="Unit('1')" value_type="float32"/> - + - + @@ -45,19 +45,19 @@ - + - + - + + [2.5, 3.5]]" id="6fdbcbab" long_name="y" points="[2., 3.]" shape="(2,)" units="Unit('1')" value_type="float32"/> @@ -66,19 +66,19 @@ - + + [2.5, 3.5]]" id="78a0dfe8" long_name="x" points="[2., 3.]" shape="(2,)" units="Unit('1')" value_type="float32"/> - + + [2.5, 3.5]]" id="6fdbcbab" long_name="y" points="[2., 3.]" shape="(2,)" units="Unit('1')" value_type="float32"/> diff --git a/lib/iris/tests/results/concatenate/concat_pre_merged_scalar_4y2d_aux_xy.cml b/lib/iris/tests/results/concatenate/concat_pre_merged_scalar_4y2d_aux_xy.cml index cca6094d9c..7cef64ff1e 100644 --- a/lib/iris/tests/results/concatenate/concat_pre_merged_scalar_4y2d_aux_xy.cml +++ b/lib/iris/tests/results/concatenate/concat_pre_merged_scalar_4y2d_aux_xy.cml @@ -3,19 +3,19 @@ - + - + - + - + @@ -24,19 +24,19 @@ - + - + - + + [2.5, 3.5]]" id="6fdbcbab" long_name="y" points="[2., 3.]" shape="(2,)" units="Unit('1')" value_type="float32"/> @@ -45,19 +45,19 @@ - + + [2.5, 3.5]]" id="78a0dfe8" long_name="x" points="[2., 3.]" shape="(2,)" units="Unit('1')" value_type="float32"/> - + - + @@ -66,19 +66,19 @@ - + + [2.5, 3.5]]" id="78a0dfe8" long_name="x" points="[2., 3.]" shape="(2,)" units="Unit('1')" value_type="float32"/> - + + [2.5, 3.5]]" id="6fdbcbab" long_name="y" points="[2., 3.]" shape="(2,)" units="Unit('1')" value_type="float32"/> diff --git a/lib/iris/tests/results/concatenate/concat_scalar_4mix2d_aux_xy.cml b/lib/iris/tests/results/concatenate/concat_scalar_4mix2d_aux_xy.cml index 8709ebd03d..6f2924b86a 100644 --- a/lib/iris/tests/results/concatenate/concat_scalar_4mix2d_aux_xy.cml +++ b/lib/iris/tests/results/concatenate/concat_scalar_4mix2d_aux_xy.cml @@ -3,25 +3,25 @@ - + - + - + - + @@ -30,25 +30,25 @@ - + - + - + - + diff --git a/lib/iris/tests/results/concatenate/concat_scalar_4x2d_aux_xy.cml b/lib/iris/tests/results/concatenate/concat_scalar_4x2d_aux_xy.cml index 8709ebd03d..6f2924b86a 100644 --- a/lib/iris/tests/results/concatenate/concat_scalar_4x2d_aux_xy.cml +++ b/lib/iris/tests/results/concatenate/concat_scalar_4x2d_aux_xy.cml @@ -3,25 +3,25 @@ - + - + - + - + @@ -30,25 +30,25 @@ - + - + - + - + diff --git a/lib/iris/tests/results/concatenate/concat_scalar_4y2d_aux_xy.cml b/lib/iris/tests/results/concatenate/concat_scalar_4y2d_aux_xy.cml index 864e476e97..d5b2573933 100644 --- a/lib/iris/tests/results/concatenate/concat_scalar_4y2d_aux_xy.cml +++ b/lib/iris/tests/results/concatenate/concat_scalar_4y2d_aux_xy.cml @@ -3,25 +3,25 @@ - + - + - + - + @@ -30,25 +30,25 @@ - + - + - + - + diff --git a/lib/iris/tests/results/constrained_load/all_10_load_match.cml b/lib/iris/tests/results/constrained_load/all_10_load_match.cml index 0712af20fa..7be771967b 100644 --- a/lib/iris/tests/results/constrained_load/all_10_load_match.cml +++ b/lib/iris/tests/results/constrained_load/all_10_load_match.cml @@ -8,25 +8,27 @@ - + - + - + - + - + @@ -38,10 +40,10 @@ - + - + @@ -59,25 +61,27 @@ - + - + - + - + - + @@ -89,10 +93,10 @@ - + - + @@ -110,26 +114,27 @@ - + - + - + - + - + @@ -141,10 +146,10 @@ - + - + @@ -162,26 +167,27 @@ - + - + - + - + - + @@ -193,10 +199,10 @@ - + - + diff --git a/lib/iris/tests/results/constrained_load/all_ml_10_22_load_match.cml b/lib/iris/tests/results/constrained_load/all_ml_10_22_load_match.cml index 20971021ac..44f796f630 100644 --- a/lib/iris/tests/results/constrained_load/all_ml_10_22_load_match.cml +++ b/lib/iris/tests/results/constrained_load/all_ml_10_22_load_match.cml @@ -8,26 +8,28 @@ - + - + - + - + - + @@ -39,11 +41,11 @@ - + - + @@ -61,26 +63,28 @@ - + - + - + - + - + @@ -92,11 +96,11 @@ - + - + @@ -114,27 +118,28 @@ - + - + - + - + - + @@ -146,11 +151,11 @@ - + - + @@ -168,27 +173,28 @@ - + - + - + - + - + @@ -200,11 +206,11 @@ - + - + diff --git a/lib/iris/tests/results/constrained_load/attribute_constraint.cml b/lib/iris/tests/results/constrained_load/attribute_constraint.cml index 664dc943bc..53529dc684 100644 --- a/lib/iris/tests/results/constrained_load/attribute_constraint.cml +++ b/lib/iris/tests/results/constrained_load/attribute_constraint.cml @@ -9,129 +9,140 @@ - + - + - + - + - + - + - + - + diff --git a/lib/iris/tests/results/constrained_load/theta_10_and_theta_level_gt_30_le_3_load_match.cml b/lib/iris/tests/results/constrained_load/theta_10_and_theta_level_gt_30_le_3_load_match.cml index 44e7d077df..2440c89883 100644 --- a/lib/iris/tests/results/constrained_load/theta_10_and_theta_level_gt_30_le_3_load_match.cml +++ b/lib/iris/tests/results/constrained_load/theta_10_and_theta_level_gt_30_le_3_load_match.cml @@ -8,25 +8,27 @@ - + - + - + - + - + @@ -38,10 +40,10 @@ - + - + @@ -59,63 +61,67 @@ - + - + - + - + - + - + - + - + diff --git a/lib/iris/tests/results/constrained_load/theta_10_and_theta_level_gt_30_le_3_load_strict.cml b/lib/iris/tests/results/constrained_load/theta_10_and_theta_level_gt_30_le_3_load_strict.cml index 44e7d077df..2440c89883 100644 --- a/lib/iris/tests/results/constrained_load/theta_10_and_theta_level_gt_30_le_3_load_strict.cml +++ b/lib/iris/tests/results/constrained_load/theta_10_and_theta_level_gt_30_le_3_load_strict.cml @@ -8,25 +8,27 @@ - + - + - + - + - + @@ -38,10 +40,10 @@ - + - + @@ -59,63 +61,67 @@ - + - + - + - + - + - + - + - + diff --git a/lib/iris/tests/results/constrained_load/theta_10_load_match.cml b/lib/iris/tests/results/constrained_load/theta_10_load_match.cml index e2852d0151..4aee6bb065 100644 --- a/lib/iris/tests/results/constrained_load/theta_10_load_match.cml +++ b/lib/iris/tests/results/constrained_load/theta_10_load_match.cml @@ -8,25 +8,27 @@ - + - + - + - + - + @@ -38,10 +40,10 @@ - + - + diff --git a/lib/iris/tests/results/constrained_load/theta_10_load_strict.cml b/lib/iris/tests/results/constrained_load/theta_10_load_strict.cml index e2852d0151..4aee6bb065 100644 --- a/lib/iris/tests/results/constrained_load/theta_10_load_strict.cml +++ b/lib/iris/tests/results/constrained_load/theta_10_load_strict.cml @@ -8,25 +8,27 @@ - + - + - + - + - + @@ -38,10 +40,10 @@ - + - + diff --git a/lib/iris/tests/results/constrained_load/theta_and_all_10_load_match.cml b/lib/iris/tests/results/constrained_load/theta_and_all_10_load_match.cml index 772929b0da..02bee172aa 100644 --- a/lib/iris/tests/results/constrained_load/theta_and_all_10_load_match.cml +++ b/lib/iris/tests/results/constrained_load/theta_and_all_10_load_match.cml @@ -8,129 +8,140 @@ - + - + - + - + - + - + - + - + @@ -148,25 +159,27 @@ - + - + - + - + - + @@ -178,10 +191,10 @@ - + - + @@ -199,25 +212,27 @@ - + - + - + - + - + @@ -229,10 +244,10 @@ - + - + @@ -250,26 +265,27 @@ - + - + - + - + - + @@ -281,10 +297,10 @@ - + - + @@ -302,26 +318,27 @@ - + - + - + - + - + @@ -333,10 +350,10 @@ - + - + diff --git a/lib/iris/tests/results/constrained_load/theta_and_theta_10_load_strict.cml b/lib/iris/tests/results/constrained_load/theta_and_theta_10_load_strict.cml index 0e23de090c..5b677ef97c 100644 --- a/lib/iris/tests/results/constrained_load/theta_and_theta_10_load_strict.cml +++ b/lib/iris/tests/results/constrained_load/theta_and_theta_10_load_strict.cml @@ -8,129 +8,140 @@ - + - + - + - + - + - + - + - + @@ -148,25 +159,27 @@ - + - + - + - + - + @@ -178,10 +191,10 @@ - + - + diff --git a/lib/iris/tests/results/constrained_load/theta_and_theta_load_match.cml b/lib/iris/tests/results/constrained_load/theta_and_theta_load_match.cml index a175652c30..7f315fe394 100644 --- a/lib/iris/tests/results/constrained_load/theta_and_theta_load_match.cml +++ b/lib/iris/tests/results/constrained_load/theta_and_theta_load_match.cml @@ -8,129 +8,140 @@ - + - + - + - + - + - + - + - + @@ -148,129 +159,140 @@ - + - + - + - + - + - + - + - + diff --git a/lib/iris/tests/results/constrained_load/theta_and_theta_load_strict.cml b/lib/iris/tests/results/constrained_load/theta_and_theta_load_strict.cml index a175652c30..7f315fe394 100644 --- a/lib/iris/tests/results/constrained_load/theta_and_theta_load_strict.cml +++ b/lib/iris/tests/results/constrained_load/theta_and_theta_load_strict.cml @@ -8,129 +8,140 @@ - + - + - + - + - + - + - + - + @@ -148,129 +159,140 @@ - + - + - + - + - + - + - + - + diff --git a/lib/iris/tests/results/constrained_load/theta_gt_30_le_3_load_match.cml b/lib/iris/tests/results/constrained_load/theta_gt_30_le_3_load_match.cml index 0048a742a6..ba900827e6 100644 --- a/lib/iris/tests/results/constrained_load/theta_gt_30_le_3_load_match.cml +++ b/lib/iris/tests/results/constrained_load/theta_gt_30_le_3_load_match.cml @@ -8,63 +8,67 @@ - + - + - + - + - + - + - + - + diff --git a/lib/iris/tests/results/constrained_load/theta_gt_30_le_3_load_strict.cml b/lib/iris/tests/results/constrained_load/theta_gt_30_le_3_load_strict.cml index 0048a742a6..ba900827e6 100644 --- a/lib/iris/tests/results/constrained_load/theta_gt_30_le_3_load_strict.cml +++ b/lib/iris/tests/results/constrained_load/theta_gt_30_le_3_load_strict.cml @@ -8,63 +8,67 @@ - + - + - + - + - + - + - + - + diff --git a/lib/iris/tests/results/constrained_load/theta_lat_30_load_match.cml b/lib/iris/tests/results/constrained_load/theta_lat_30_load_match.cml index e24937854d..10df942a27 100644 --- a/lib/iris/tests/results/constrained_load/theta_lat_30_load_match.cml +++ b/lib/iris/tests/results/constrained_load/theta_lat_30_load_match.cml @@ -8,129 +8,139 @@ - + - + - + - + - + - + - + - + diff --git a/lib/iris/tests/results/constrained_load/theta_lat_30_load_strict.cml b/lib/iris/tests/results/constrained_load/theta_lat_30_load_strict.cml index e24937854d..10df942a27 100644 --- a/lib/iris/tests/results/constrained_load/theta_lat_30_load_strict.cml +++ b/lib/iris/tests/results/constrained_load/theta_lat_30_load_strict.cml @@ -8,129 +8,139 @@ - + - + - + - + - + - + - + - + diff --git a/lib/iris/tests/results/constrained_load/theta_lat_gt_30_load_match.cml b/lib/iris/tests/results/constrained_load/theta_lat_gt_30_load_match.cml index 218bdd6b1c..1a4287f572 100644 --- a/lib/iris/tests/results/constrained_load/theta_lat_gt_30_load_match.cml +++ b/lib/iris/tests/results/constrained_load/theta_lat_gt_30_load_match.cml @@ -8,134 +8,144 @@ - + - + - + - + - + - + - + - + diff --git a/lib/iris/tests/results/constrained_load/theta_lat_gt_30_load_strict.cml b/lib/iris/tests/results/constrained_load/theta_lat_gt_30_load_strict.cml index 218bdd6b1c..1a4287f572 100644 --- a/lib/iris/tests/results/constrained_load/theta_lat_gt_30_load_strict.cml +++ b/lib/iris/tests/results/constrained_load/theta_lat_gt_30_load_strict.cml @@ -8,134 +8,144 @@ - + - + - + - + - + - + - + - + diff --git a/lib/iris/tests/results/constrained_load/theta_load_match.cml b/lib/iris/tests/results/constrained_load/theta_load_match.cml index 0e5b02be51..b9bf8ce411 100644 --- a/lib/iris/tests/results/constrained_load/theta_load_match.cml +++ b/lib/iris/tests/results/constrained_load/theta_load_match.cml @@ -8,129 +8,140 @@ - + - + - + - + - + - + - + - + diff --git a/lib/iris/tests/results/constrained_load/theta_load_strict.cml b/lib/iris/tests/results/constrained_load/theta_load_strict.cml index 0e5b02be51..b9bf8ce411 100644 --- a/lib/iris/tests/results/constrained_load/theta_load_strict.cml +++ b/lib/iris/tests/results/constrained_load/theta_load_strict.cml @@ -8,129 +8,140 @@ - + - + - + - + - + - + - + - + diff --git a/lib/iris/tests/results/coord_api/complex.xml b/lib/iris/tests/results/coord_api/complex.xml index 41adb2cb8d..b36307d19d 100644 --- a/lib/iris/tests/results/coord_api/complex.xml +++ b/lib/iris/tests/results/coord_api/complex.xml @@ -1,8 +1,8 @@ - + diff --git a/lib/iris/tests/results/coord_api/coord_maths/add_float_expl.xml b/lib/iris/tests/results/coord_api/coord_maths/add_float_expl.xml index 7eaf699f2d..e8d325ba71 100644 --- a/lib/iris/tests/results/coord_api/coord_maths/add_float_expl.xml +++ b/lib/iris/tests/results/coord_api/coord_maths/add_float_expl.xml @@ -1,24 +1,25 @@ - + diff --git a/lib/iris/tests/results/coord_api/coord_maths/add_simple_expl.xml b/lib/iris/tests/results/coord_api/coord_maths/add_simple_expl.xml index 9bedff935b..ab1f6cfd0c 100644 --- a/lib/iris/tests/results/coord_api/coord_maths/add_simple_expl.xml +++ b/lib/iris/tests/results/coord_api/coord_maths/add_simple_expl.xml @@ -1,23 +1,25 @@ - + diff --git a/lib/iris/tests/results/coord_api/coord_maths/divide_simple_expl.xml b/lib/iris/tests/results/coord_api/coord_maths/divide_simple_expl.xml index 28c01a0f00..e09f1102cb 100644 --- a/lib/iris/tests/results/coord_api/coord_maths/divide_simple_expl.xml +++ b/lib/iris/tests/results/coord_api/coord_maths/divide_simple_expl.xml @@ -1,23 +1,25 @@ - + diff --git a/lib/iris/tests/results/coord_api/coord_maths/mult_float_expl.xml b/lib/iris/tests/results/coord_api/coord_maths/mult_float_expl.xml index 77107b9906..6d72a98323 100644 --- a/lib/iris/tests/results/coord_api/coord_maths/mult_float_expl.xml +++ b/lib/iris/tests/results/coord_api/coord_maths/mult_float_expl.xml @@ -1,24 +1,25 @@ - + diff --git a/lib/iris/tests/results/coord_api/coord_maths/multiply_simple_expl.xml b/lib/iris/tests/results/coord_api/coord_maths/multiply_simple_expl.xml index 27f98a31ff..a3f930834e 100644 --- a/lib/iris/tests/results/coord_api/coord_maths/multiply_simple_expl.xml +++ b/lib/iris/tests/results/coord_api/coord_maths/multiply_simple_expl.xml @@ -1,23 +1,25 @@ - + diff --git a/lib/iris/tests/results/coord_api/coord_maths/negate_expl.xml b/lib/iris/tests/results/coord_api/coord_maths/negate_expl.xml index 33a63e1f03..d6a0e606e1 100644 --- a/lib/iris/tests/results/coord_api/coord_maths/negate_expl.xml +++ b/lib/iris/tests/results/coord_api/coord_maths/negate_expl.xml @@ -1,23 +1,25 @@ - + diff --git a/lib/iris/tests/results/coord_api/coord_maths/r_subtract_simple_exl.xml b/lib/iris/tests/results/coord_api/coord_maths/r_subtract_simple_exl.xml index 95b9efef7a..30cae91542 100644 --- a/lib/iris/tests/results/coord_api/coord_maths/r_subtract_simple_exl.xml +++ b/lib/iris/tests/results/coord_api/coord_maths/r_subtract_simple_exl.xml @@ -1,23 +1,27 @@ - + diff --git a/lib/iris/tests/results/coord_api/coord_maths/right_divide_simple_expl.xml b/lib/iris/tests/results/coord_api/coord_maths/right_divide_simple_expl.xml index 00e932cf21..903f3327ea 100644 --- a/lib/iris/tests/results/coord_api/coord_maths/right_divide_simple_expl.xml +++ b/lib/iris/tests/results/coord_api/coord_maths/right_divide_simple_expl.xml @@ -1,25 +1,25 @@ - + diff --git a/lib/iris/tests/results/coord_api/coord_maths/subtract_simple_expl.xml b/lib/iris/tests/results/coord_api/coord_maths/subtract_simple_expl.xml index 7f9ba5e097..b3416928cc 100644 --- a/lib/iris/tests/results/coord_api/coord_maths/subtract_simple_expl.xml +++ b/lib/iris/tests/results/coord_api/coord_maths/subtract_simple_expl.xml @@ -1,23 +1,27 @@ - + diff --git a/lib/iris/tests/results/coord_api/intersection.xml b/lib/iris/tests/results/coord_api/intersection.xml index 5c48c52872..e013f7c450 100644 --- a/lib/iris/tests/results/coord_api/intersection.xml +++ b/lib/iris/tests/results/coord_api/intersection.xml @@ -1,9 +1,9 @@ - + diff --git a/lib/iris/tests/results/coord_api/intersection_missing.xml b/lib/iris/tests/results/coord_api/intersection_missing.xml index 6336180833..ec0c3ea1a1 100644 --- a/lib/iris/tests/results/coord_api/intersection_missing.xml +++ b/lib/iris/tests/results/coord_api/intersection_missing.xml @@ -1,8 +1,8 @@ - + diff --git a/lib/iris/tests/results/coord_api/intersection_reversed.xml b/lib/iris/tests/results/coord_api/intersection_reversed.xml index b489f95451..41476a8e12 100644 --- a/lib/iris/tests/results/coord_api/intersection_reversed.xml +++ b/lib/iris/tests/results/coord_api/intersection_reversed.xml @@ -1,9 +1,9 @@ + [27.75, 24.75], + [24.75, 21.75], + [21.75, 18.75], + [18.75, 15.75], + [15.75, 12.75], + [12.75, 9.75], + [ 9.75, 6.75]]" id="43cd7f4a" long_name="foo" points="[30., 27., 24., 21., 18., 15., 12., 9.]" shape="(8,)" units="Unit('meter')" value_type="float32"/> diff --git a/lib/iris/tests/results/coord_api/nd_bounds.cml b/lib/iris/tests/results/coord_api/nd_bounds.cml index 5c416af25b..76a5d7b766 100644 --- a/lib/iris/tests/results/coord_api/nd_bounds.cml +++ b/lib/iris/tests/results/coord_api/nd_bounds.cml @@ -3,10 +3,10 @@ - + - + diff --git a/lib/iris/tests/results/cube_collapsed/latitude_longitude_dual_stage.cml b/lib/iris/tests/results/cube_collapsed/latitude_longitude_dual_stage.cml index 463339e5bc..6a08df021c 100644 --- a/lib/iris/tests/results/cube_collapsed/latitude_longitude_dual_stage.cml +++ b/lib/iris/tests/results/cube_collapsed/latitude_longitude_dual_stage.cml @@ -6,7 +6,7 @@ - + @@ -14,75 +14,88 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_collapsed/latitude_longitude_single_stage.cml b/lib/iris/tests/results/cube_collapsed/latitude_longitude_single_stage.cml index a91ea4ce5c..b1c0e8cfbe 100644 --- a/lib/iris/tests/results/cube_collapsed/latitude_longitude_single_stage.cml +++ b/lib/iris/tests/results/cube_collapsed/latitude_longitude_single_stage.cml @@ -6,7 +6,7 @@ - + @@ -14,75 +14,88 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_collapsed/latitude_model_level_number_dual_stage.cml b/lib/iris/tests/results/cube_collapsed/latitude_model_level_number_dual_stage.cml index f963658910..0e602c0539 100644 --- a/lib/iris/tests/results/cube_collapsed/latitude_model_level_number_dual_stage.cml +++ b/lib/iris/tests/results/cube_collapsed/latitude_model_level_number_dual_stage.cml @@ -6,7 +6,7 @@ - + @@ -14,37 +14,38 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_collapsed/latitude_model_level_number_single_stage.cml b/lib/iris/tests/results/cube_collapsed/latitude_model_level_number_single_stage.cml index 195757a417..c0a0bc52f0 100644 --- a/lib/iris/tests/results/cube_collapsed/latitude_model_level_number_single_stage.cml +++ b/lib/iris/tests/results/cube_collapsed/latitude_model_level_number_single_stage.cml @@ -6,7 +6,7 @@ - + @@ -14,37 +14,38 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_collapsed/latitude_time_dual_stage.cml b/lib/iris/tests/results/cube_collapsed/latitude_time_dual_stage.cml index c63c260d25..393215ba2d 100644 --- a/lib/iris/tests/results/cube_collapsed/latitude_time_dual_stage.cml +++ b/lib/iris/tests/results/cube_collapsed/latitude_time_dual_stage.cml @@ -6,7 +6,7 @@ - + @@ -14,81 +14,93 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_collapsed/latitude_time_single_stage.cml b/lib/iris/tests/results/cube_collapsed/latitude_time_single_stage.cml index d6cc708aa1..5910dc45d5 100644 --- a/lib/iris/tests/results/cube_collapsed/latitude_time_single_stage.cml +++ b/lib/iris/tests/results/cube_collapsed/latitude_time_single_stage.cml @@ -6,7 +6,7 @@ - + @@ -14,81 +14,93 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_collapsed/longitude_latitude_dual_stage.cml b/lib/iris/tests/results/cube_collapsed/longitude_latitude_dual_stage.cml index 23739a1ac5..55da14e115 100644 --- a/lib/iris/tests/results/cube_collapsed/longitude_latitude_dual_stage.cml +++ b/lib/iris/tests/results/cube_collapsed/longitude_latitude_dual_stage.cml @@ -6,7 +6,7 @@ - + @@ -14,75 +14,88 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_collapsed/longitude_latitude_single_stage.cml b/lib/iris/tests/results/cube_collapsed/longitude_latitude_single_stage.cml index 817b855512..a264c602db 100644 --- a/lib/iris/tests/results/cube_collapsed/longitude_latitude_single_stage.cml +++ b/lib/iris/tests/results/cube_collapsed/longitude_latitude_single_stage.cml @@ -6,7 +6,7 @@ - + @@ -14,75 +14,88 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_collapsed/longitude_model_level_number_dual_stage.cml b/lib/iris/tests/results/cube_collapsed/longitude_model_level_number_dual_stage.cml index 29d59ce111..bb4e1fb049 100644 --- a/lib/iris/tests/results/cube_collapsed/longitude_model_level_number_dual_stage.cml +++ b/lib/iris/tests/results/cube_collapsed/longitude_model_level_number_dual_stage.cml @@ -6,45 +6,46 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_collapsed/longitude_model_level_number_single_stage.cml b/lib/iris/tests/results/cube_collapsed/longitude_model_level_number_single_stage.cml index e99d57b816..9569277431 100644 --- a/lib/iris/tests/results/cube_collapsed/longitude_model_level_number_single_stage.cml +++ b/lib/iris/tests/results/cube_collapsed/longitude_model_level_number_single_stage.cml @@ -6,45 +6,46 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_collapsed/longitude_time_dual_stage.cml b/lib/iris/tests/results/cube_collapsed/longitude_time_dual_stage.cml index 8e57ec7258..d80344dfde 100644 --- a/lib/iris/tests/results/cube_collapsed/longitude_time_dual_stage.cml +++ b/lib/iris/tests/results/cube_collapsed/longitude_time_dual_stage.cml @@ -6,89 +6,101 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_collapsed/longitude_time_single_stage.cml b/lib/iris/tests/results/cube_collapsed/longitude_time_single_stage.cml index 67b706e0ae..69e0634b40 100644 --- a/lib/iris/tests/results/cube_collapsed/longitude_time_single_stage.cml +++ b/lib/iris/tests/results/cube_collapsed/longitude_time_single_stage.cml @@ -6,89 +6,101 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_collapsed/model_level_number_latitude_dual_stage.cml b/lib/iris/tests/results/cube_collapsed/model_level_number_latitude_dual_stage.cml index d9c1b2a35c..e8d6a5f86f 100644 --- a/lib/iris/tests/results/cube_collapsed/model_level_number_latitude_dual_stage.cml +++ b/lib/iris/tests/results/cube_collapsed/model_level_number_latitude_dual_stage.cml @@ -6,7 +6,7 @@ - + @@ -14,37 +14,38 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_collapsed/model_level_number_latitude_single_stage.cml b/lib/iris/tests/results/cube_collapsed/model_level_number_latitude_single_stage.cml index ceafb3fc67..7c7559fa8a 100644 --- a/lib/iris/tests/results/cube_collapsed/model_level_number_latitude_single_stage.cml +++ b/lib/iris/tests/results/cube_collapsed/model_level_number_latitude_single_stage.cml @@ -6,7 +6,7 @@ - + @@ -14,37 +14,38 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_collapsed/model_level_number_longitude_dual_stage.cml b/lib/iris/tests/results/cube_collapsed/model_level_number_longitude_dual_stage.cml index e5090a3572..f6e7356385 100644 --- a/lib/iris/tests/results/cube_collapsed/model_level_number_longitude_dual_stage.cml +++ b/lib/iris/tests/results/cube_collapsed/model_level_number_longitude_dual_stage.cml @@ -6,45 +6,46 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_collapsed/model_level_number_longitude_single_stage.cml b/lib/iris/tests/results/cube_collapsed/model_level_number_longitude_single_stage.cml index 9e8bdebd4a..e6aff79093 100644 --- a/lib/iris/tests/results/cube_collapsed/model_level_number_longitude_single_stage.cml +++ b/lib/iris/tests/results/cube_collapsed/model_level_number_longitude_single_stage.cml @@ -6,45 +6,46 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_collapsed/model_level_number_time_dual_stage.cml b/lib/iris/tests/results/cube_collapsed/model_level_number_time_dual_stage.cml index a4e0cc1445..66a68b9323 100644 --- a/lib/iris/tests/results/cube_collapsed/model_level_number_time_dual_stage.cml +++ b/lib/iris/tests/results/cube_collapsed/model_level_number_time_dual_stage.cml @@ -6,51 +6,51 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_collapsed/model_level_number_time_single_stage.cml b/lib/iris/tests/results/cube_collapsed/model_level_number_time_single_stage.cml index d442637062..c0c3457e8c 100644 --- a/lib/iris/tests/results/cube_collapsed/model_level_number_time_single_stage.cml +++ b/lib/iris/tests/results/cube_collapsed/model_level_number_time_single_stage.cml @@ -6,51 +6,51 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_collapsed/original.cml b/lib/iris/tests/results/cube_collapsed/original.cml index 4bc6553dba..9f4cf63b69 100644 --- a/lib/iris/tests/results/cube_collapsed/original.cml +++ b/lib/iris/tests/results/cube_collapsed/original.cml @@ -6,97 +6,110 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_collapsed/time_latitude_dual_stage.cml b/lib/iris/tests/results/cube_collapsed/time_latitude_dual_stage.cml index 788d0d8029..ae104c7b75 100644 --- a/lib/iris/tests/results/cube_collapsed/time_latitude_dual_stage.cml +++ b/lib/iris/tests/results/cube_collapsed/time_latitude_dual_stage.cml @@ -6,7 +6,7 @@ - + @@ -14,81 +14,93 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_collapsed/time_latitude_single_stage.cml b/lib/iris/tests/results/cube_collapsed/time_latitude_single_stage.cml index b9b74c6b6d..34764da436 100644 --- a/lib/iris/tests/results/cube_collapsed/time_latitude_single_stage.cml +++ b/lib/iris/tests/results/cube_collapsed/time_latitude_single_stage.cml @@ -6,7 +6,7 @@ - + @@ -14,81 +14,93 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_collapsed/time_longitude_dual_stage.cml b/lib/iris/tests/results/cube_collapsed/time_longitude_dual_stage.cml index 84b4fea150..5badd06034 100644 --- a/lib/iris/tests/results/cube_collapsed/time_longitude_dual_stage.cml +++ b/lib/iris/tests/results/cube_collapsed/time_longitude_dual_stage.cml @@ -6,89 +6,101 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_collapsed/time_longitude_single_stage.cml b/lib/iris/tests/results/cube_collapsed/time_longitude_single_stage.cml index 128d29a281..4e2ee75b9f 100644 --- a/lib/iris/tests/results/cube_collapsed/time_longitude_single_stage.cml +++ b/lib/iris/tests/results/cube_collapsed/time_longitude_single_stage.cml @@ -6,89 +6,101 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_collapsed/time_model_level_number_dual_stage.cml b/lib/iris/tests/results/cube_collapsed/time_model_level_number_dual_stage.cml index 8c206fe840..100a2c6c5f 100644 --- a/lib/iris/tests/results/cube_collapsed/time_model_level_number_dual_stage.cml +++ b/lib/iris/tests/results/cube_collapsed/time_model_level_number_dual_stage.cml @@ -6,51 +6,51 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_collapsed/time_model_level_number_single_stage.cml b/lib/iris/tests/results/cube_collapsed/time_model_level_number_single_stage.cml index 08dc52fca2..99a8f94200 100644 --- a/lib/iris/tests/results/cube_collapsed/time_model_level_number_single_stage.cml +++ b/lib/iris/tests/results/cube_collapsed/time_model_level_number_single_stage.cml @@ -6,51 +6,51 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_collapsed/triple_collapse_lat_ml_pt.cml b/lib/iris/tests/results/cube_collapsed/triple_collapse_lat_ml_pt.cml index 5fae922867..4e132ccdcf 100644 --- a/lib/iris/tests/results/cube_collapsed/triple_collapse_lat_ml_pt.cml +++ b/lib/iris/tests/results/cube_collapsed/triple_collapse_lat_ml_pt.cml @@ -6,7 +6,7 @@ - + @@ -14,36 +14,36 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_collapsed/triple_collapse_ml_pt_lon.cml b/lib/iris/tests/results/cube_collapsed/triple_collapse_ml_pt_lon.cml index 454bd29a18..9157d71330 100644 --- a/lib/iris/tests/results/cube_collapsed/triple_collapse_ml_pt_lon.cml +++ b/lib/iris/tests/results/cube_collapsed/triple_collapse_ml_pt_lon.cml @@ -6,44 +6,44 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_io/pickling/cubelist.cml b/lib/iris/tests/results/cube_io/pickling/cubelist.cml index eb839e36e4..c52486b1d0 100644 --- a/lib/iris/tests/results/cube_io/pickling/cubelist.cml +++ b/lib/iris/tests/results/cube_io/pickling/cubelist.cml @@ -8,499 +8,522 @@ - + - + - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + @@ -509,8 +532,9 @@ - + @@ -524,39 +548,41 @@ - + - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + diff --git a/lib/iris/tests/results/cube_io/pickling/single_cube.cml b/lib/iris/tests/results/cube_io/pickling/single_cube.cml index a025713766..eb3e9d0112 100644 --- a/lib/iris/tests/results/cube_io/pickling/single_cube.cml +++ b/lib/iris/tests/results/cube_io/pickling/single_cube.cml @@ -8,499 +8,522 @@ - + - + - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + @@ -509,8 +532,9 @@ - + diff --git a/lib/iris/tests/results/cube_io/pickling/theta.cml b/lib/iris/tests/results/cube_io/pickling/theta.cml index 6c69f6ed54..2af2124729 100644 --- a/lib/iris/tests/results/cube_io/pickling/theta.cml +++ b/lib/iris/tests/results/cube_io/pickling/theta.cml @@ -8,129 +8,140 @@ - + - + - + - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_io/pp/load/global.cml b/lib/iris/tests/results/cube_io/pp/load/global.cml index a69e633e26..a013add0cb 100644 --- a/lib/iris/tests/results/cube_io/pp/load/global.cml +++ b/lib/iris/tests/results/cube_io/pp/load/global.cml @@ -7,37 +7,63 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_merge/multidim_coord_merge.cml b/lib/iris/tests/results/cube_merge/multidim_coord_merge.cml index 0767f41844..7558d3ccda 100644 --- a/lib/iris/tests/results/cube_merge/multidim_coord_merge.cml +++ b/lib/iris/tests/results/cube_merge/multidim_coord_merge.cml @@ -3,40 +3,40 @@ - + [[10, 20], + [20, 25], + [25, 40], + [40, 60]]]" id="434cbbd8" long_name="bar" points="[[ 2.5, 7.5, 12.5, 17.5], + [10. , 17.5, 27.5, 42.5], + [15. , 22.5, 32.5, 50. ]]" shape="(3, 4)" units="Unit('1')" value_type="float64"/> - + [[ -5, 10], + [ 10, 18], + [ 18, 55], + [ 18, 70]]]" id="b0d35dcf" long_name="foo" points="[[ -7.5, 7.5, 22.5, 37.5], + [-12.5, 4. , 26.5, 47.5], + [ 2.5, 14. , 36.5, 44. ]]" shape="(3, 4)" units="Unit('1')" value_type="float64"/> diff --git a/lib/iris/tests/results/cube_merge/multidim_coord_merge_transpose.cml b/lib/iris/tests/results/cube_merge/multidim_coord_merge_transpose.cml index c649dc8569..909e48d08f 100644 --- a/lib/iris/tests/results/cube_merge/multidim_coord_merge_transpose.cml +++ b/lib/iris/tests/results/cube_merge/multidim_coord_merge_transpose.cml @@ -3,40 +3,40 @@ - + [[10, 20], + [20, 25], + [25, 40], + [40, 60]]]" id="434cbbd8" long_name="bar" points="[[ 2.5, 7.5, 12.5, 17.5], + [10. , 17.5, 27.5, 42.5], + [15. , 22.5, 32.5, 50. ]]" shape="(3, 4)" units="Unit('1')" value_type="float64"/> - + [[ -5, 10], + [ 10, 18], + [ 18, 55], + [ 18, 70]]]" id="b0d35dcf" long_name="foo" points="[[ -7.5, 7.5, 22.5, 37.5], + [-12.5, 4. , 26.5, 47.5], + [ 2.5, 14. , 36.5, 44. ]]" shape="(3, 4)" units="Unit('1')" value_type="float64"/> diff --git a/lib/iris/tests/results/cube_merge/test_orig_point_cube.cml b/lib/iris/tests/results/cube_merge/test_orig_point_cube.cml index b49da17f26..6c04a1c0fa 100644 --- a/lib/iris/tests/results/cube_merge/test_orig_point_cube.cml +++ b/lib/iris/tests/results/cube_merge/test_orig_point_cube.cml @@ -3,10 +3,10 @@ - + - + diff --git a/lib/iris/tests/results/cube_merge/test_simple_attributes1.cml b/lib/iris/tests/results/cube_merge/test_simple_attributes1.cml index 50bf6bea91..1df0771f16 100644 --- a/lib/iris/tests/results/cube_merge/test_simple_attributes1.cml +++ b/lib/iris/tests/results/cube_merge/test_simple_attributes1.cml @@ -6,10 +6,10 @@ - + - + @@ -21,10 +21,10 @@ - + - + diff --git a/lib/iris/tests/results/cube_merge/test_simple_attributes2.cml b/lib/iris/tests/results/cube_merge/test_simple_attributes2.cml index 27d3f573e1..9d5d5a2fbb 100644 --- a/lib/iris/tests/results/cube_merge/test_simple_attributes2.cml +++ b/lib/iris/tests/results/cube_merge/test_simple_attributes2.cml @@ -6,10 +6,10 @@ - + - + @@ -24,10 +24,10 @@ - + - + diff --git a/lib/iris/tests/results/cube_merge/test_simple_attributes3.cml b/lib/iris/tests/results/cube_merge/test_simple_attributes3.cml index 096ceeee50..1d90376068 100644 --- a/lib/iris/tests/results/cube_merge/test_simple_attributes3.cml +++ b/lib/iris/tests/results/cube_merge/test_simple_attributes3.cml @@ -6,10 +6,10 @@ - + - + diff --git a/lib/iris/tests/results/cube_merge/test_simple_bound_merge.cml b/lib/iris/tests/results/cube_merge/test_simple_bound_merge.cml index d39cf419ae..51c76d9ba0 100644 --- a/lib/iris/tests/results/cube_merge/test_simple_bound_merge.cml +++ b/lib/iris/tests/results/cube_merge/test_simple_bound_merge.cml @@ -3,15 +3,15 @@ - + - + diff --git a/lib/iris/tests/results/cube_merge/test_simple_merge.cml b/lib/iris/tests/results/cube_merge/test_simple_merge.cml index 4a89d8044c..84d5a262df 100644 --- a/lib/iris/tests/results/cube_merge/test_simple_merge.cml +++ b/lib/iris/tests/results/cube_merge/test_simple_merge.cml @@ -3,10 +3,10 @@ - + - + diff --git a/lib/iris/tests/results/cube_slice/2d_intersect_and_reverse.cml b/lib/iris/tests/results/cube_slice/2d_intersect_and_reverse.cml index f272cebeb1..cbc7bdebd9 100644 --- a/lib/iris/tests/results/cube_slice/2d_intersect_and_reverse.cml +++ b/lib/iris/tests/results/cube_slice/2d_intersect_and_reverse.cml @@ -3,66 +3,66 @@ - + - + + [17, 16], + [15, 14], + [11, 10], + [ 9, 8], + [ 7, 6], + [ 5, 4], + [ 3, 2], + [ 1, 0]]" id="e4dc1958" long_name="dim2" points="[9, 8, 7, 5, 4, 3, 2, 1, 0]" shape="(9,)" units="Unit('meters')" value_type="int32"/> - + [[196, 197, 198, 199], + [192, 193, 194, 195], + [188, 189, 190, 191], + ..., + [168, 169, 170, 171], + [164, 165, 166, 167], + [160, 161, 162, 163]]]" id="b5af630a" long_name="my_multi_dim_coord" points="[[ 9, 8, 7, 5, 4, 3, 2, 1, 0], + [19, 18, 17, 15, 14, 13, 12, 11, 10], + [29, 28, 27, 25, 24, 23, 22, 21, 20], + [39, 38, 37, 35, 34, 33, 32, 31, 30], + [49, 48, 47, 45, 44, 43, 42, 41, 40]]" shape="(5, 9)" units="Unit('1')" value_type="int32"/> diff --git a/lib/iris/tests/results/cube_slice/2d_orig.cml b/lib/iris/tests/results/cube_slice/2d_orig.cml index 1956d9f324..3758fab7b4 100644 --- a/lib/iris/tests/results/cube_slice/2d_orig.cml +++ b/lib/iris/tests/results/cube_slice/2d_orig.cml @@ -3,67 +3,67 @@ - + - + - + - + [[160, 161, 162, 163], + [164, 165, 166, 167], + [168, 169, 170, 171], + ..., + [188, 189, 190, 191], + [192, 193, 194, 195], + [196, 197, 198, 199]]]" id="b5af630a" long_name="my_multi_dim_coord" points="[[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], + [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], + [30, 31, 32, 33, 34, 35, 36, 37, 38, 39], + [40, 41, 42, 43, 44, 45, 46, 47, 48, 49]]" shape="(5, 10)" units="Unit('1')" value_type="int32"/> diff --git a/lib/iris/tests/results/cube_slice/2d_to_0d_cube_slice.cml b/lib/iris/tests/results/cube_slice/2d_to_0d_cube_slice.cml index 2f1a4b80c1..be35d87cfd 100644 --- a/lib/iris/tests/results/cube_slice/2d_to_0d_cube_slice.cml +++ b/lib/iris/tests/results/cube_slice/2d_to_0d_cube_slice.cml @@ -3,10 +3,10 @@ - + - + diff --git a/lib/iris/tests/results/cube_slice/2d_to_1d_cube_multi_slice.cml b/lib/iris/tests/results/cube_slice/2d_to_1d_cube_multi_slice.cml index 5c08226ea8..8018fb4a85 100644 --- a/lib/iris/tests/results/cube_slice/2d_to_1d_cube_multi_slice.cml +++ b/lib/iris/tests/results/cube_slice/2d_to_1d_cube_multi_slice.cml @@ -3,18 +3,18 @@ - + - + + [2, 3]]" id="e4dc1958" long_name="dim2" points="[0, 1]" shape="(2,)" units="Unit('meters')" value_type="int32"/> + [4, 5, 6, 7]]" id="b5af630a" long_name="my_multi_dim_coord" points="[0, 1]" shape="(2,)" units="Unit('1')" value_type="int32"/> diff --git a/lib/iris/tests/results/cube_slice/2d_to_1d_cube_multi_slice2.cml b/lib/iris/tests/results/cube_slice/2d_to_1d_cube_multi_slice2.cml index b6e6bf10e8..34e5984727 100644 --- a/lib/iris/tests/results/cube_slice/2d_to_1d_cube_multi_slice2.cml +++ b/lib/iris/tests/results/cube_slice/2d_to_1d_cube_multi_slice2.cml @@ -3,25 +3,25 @@ - + - + + [2, 3], + [6, 7]]" id="e4dc1958" long_name="dim2" points="[0, 1, 3]" shape="(3,)" units="Unit('meters')" value_type="int32"/> - + [[80, 81, 82, 83], + [84, 85, 86, 87], + [92, 93, 94, 95]]]" id="b5af630a" long_name="my_multi_dim_coord" points="[[ 0, 1, 3], + [20, 21, 23]]" shape="(2, 3)" units="Unit('1')" value_type="int32"/> diff --git a/lib/iris/tests/results/cube_slice/2d_to_1d_cube_multi_slice3.cml b/lib/iris/tests/results/cube_slice/2d_to_1d_cube_multi_slice3.cml index ee69b13b5c..65fc3f97ae 100644 --- a/lib/iris/tests/results/cube_slice/2d_to_1d_cube_multi_slice3.cml +++ b/lib/iris/tests/results/cube_slice/2d_to_1d_cube_multi_slice3.cml @@ -3,46 +3,46 @@ - + - + - + - + [[ 80, 81, 82, 83], + [ 84, 85, 86, 87], + [ 88, 89, 90, 91], + [ 92, 93, 94, 95], + [ 96, 97, 98, 99], + [100, 101, 102, 103], + [104, 105, 106, 107], + [108, 109, 110, 111], + [112, 113, 114, 115], + [116, 117, 118, 119]]]" id="b5af630a" long_name="my_multi_dim_coord" points="[[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + [20, 21, 22, 23, 24, 25, 26, 27, 28, 29]]" shape="(2, 10)" units="Unit('1')" value_type="int32"/> diff --git a/lib/iris/tests/results/cube_slice/2d_to_1d_cube_slice.cml b/lib/iris/tests/results/cube_slice/2d_to_1d_cube_slice.cml index f3fcc747d7..7cecb9db56 100644 --- a/lib/iris/tests/results/cube_slice/2d_to_1d_cube_slice.cml +++ b/lib/iris/tests/results/cube_slice/2d_to_1d_cube_slice.cml @@ -3,34 +3,34 @@ - + - + - + - + diff --git a/lib/iris/tests/results/cube_slice/2d_to_2d_revesed.cml b/lib/iris/tests/results/cube_slice/2d_to_2d_revesed.cml index 570f09dee3..fad5a7baf2 100644 --- a/lib/iris/tests/results/cube_slice/2d_to_2d_revesed.cml +++ b/lib/iris/tests/results/cube_slice/2d_to_2d_revesed.cml @@ -3,67 +3,67 @@ - + - + + [17, 16], + [15, 14], + [13, 12], + [11, 10], + [ 9, 8], + [ 7, 6], + [ 5, 4], + [ 3, 2], + [ 1, 0]]" id="e4dc1958" long_name="dim2" points="[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]" shape="(10,)" units="Unit('meters')" value_type="int32"/> + [[ 36, 37, 38, 39], + [ 32, 33, 34, 35], + [ 28, 29, 30, 31], + ..., + [ 8, 9, 10, 11], + [ 4, 5, 6, 7], + [ 0, 1, 2, 3]]]" id="b5af630a" long_name="my_multi_dim_coord" points="[[49, 48, 47, 46, 45, 44, 43, 42, 41, 40], + [39, 38, 37, 36, 35, 34, 33, 32, 31, 30], + [29, 28, 27, 26, 25, 24, 23, 22, 21, 20], + [19, 18, 17, 16, 15, 14, 13, 12, 11, 10], + [ 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]]" shape="(5, 10)" units="Unit('1')" value_type="int32"/> diff --git a/lib/iris/tests/results/cube_slice/2d_transposed.cml b/lib/iris/tests/results/cube_slice/2d_transposed.cml index 542f2c0801..1f00c1ccda 100644 --- a/lib/iris/tests/results/cube_slice/2d_transposed.cml +++ b/lib/iris/tests/results/cube_slice/2d_transposed.cml @@ -3,67 +3,67 @@ - + - + - + - + [[160, 161, 162, 163], + [164, 165, 166, 167], + [168, 169, 170, 171], + ..., + [188, 189, 190, 191], + [192, 193, 194, 195], + [196, 197, 198, 199]]]" id="b5af630a" long_name="my_multi_dim_coord" points="[[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], + [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], + [30, 31, 32, 33, 34, 35, 36, 37, 38, 39], + [40, 41, 42, 43, 44, 45, 46, 47, 48, 49]]" shape="(5, 10)" units="Unit('1')" value_type="int32"/> diff --git a/lib/iris/tests/results/cube_slice/real_data_dual_tuple_indexing1.cml b/lib/iris/tests/results/cube_slice/real_data_dual_tuple_indexing1.cml index f674c30121..bb2e16525e 100644 --- a/lib/iris/tests/results/cube_slice/real_data_dual_tuple_indexing1.cml +++ b/lib/iris/tests/results/cube_slice/real_data_dual_tuple_indexing1.cml @@ -8,10 +8,10 @@ - + - + @@ -24,7 +24,7 @@ - + diff --git a/lib/iris/tests/results/cube_slice/real_data_dual_tuple_indexing2.cml b/lib/iris/tests/results/cube_slice/real_data_dual_tuple_indexing2.cml index b1bf424a93..da14899cfd 100644 --- a/lib/iris/tests/results/cube_slice/real_data_dual_tuple_indexing2.cml +++ b/lib/iris/tests/results/cube_slice/real_data_dual_tuple_indexing2.cml @@ -8,10 +8,10 @@ - + - + @@ -19,12 +19,12 @@ - + - + diff --git a/lib/iris/tests/results/cube_slice/real_data_dual_tuple_indexing3.cml b/lib/iris/tests/results/cube_slice/real_data_dual_tuple_indexing3.cml index 50fd683cb3..f01685ebb9 100644 --- a/lib/iris/tests/results/cube_slice/real_data_dual_tuple_indexing3.cml +++ b/lib/iris/tests/results/cube_slice/real_data_dual_tuple_indexing3.cml @@ -8,10 +8,10 @@ - + - + @@ -19,12 +19,12 @@ - + - + diff --git a/lib/iris/tests/results/cube_slice/real_empty_data_indexing.cml b/lib/iris/tests/results/cube_slice/real_empty_data_indexing.cml index 1563dce74d..a95e3d7acb 100644 --- a/lib/iris/tests/results/cube_slice/real_empty_data_indexing.cml +++ b/lib/iris/tests/results/cube_slice/real_empty_data_indexing.cml @@ -8,24 +8,25 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/cube_to_pp/no_forecast_period.cml b/lib/iris/tests/results/cube_to_pp/no_forecast_period.cml index 5b7d800716..d6f3e7902e 100644 --- a/lib/iris/tests/results/cube_to_pp/no_forecast_period.cml +++ b/lib/iris/tests/results/cube_to_pp/no_forecast_period.cml @@ -3,20 +3,20 @@ - + - + - + - + diff --git a/lib/iris/tests/results/cube_to_pp/no_forecast_time.cml b/lib/iris/tests/results/cube_to_pp/no_forecast_time.cml index edf4392d30..462ff0a5dd 100644 --- a/lib/iris/tests/results/cube_to_pp/no_forecast_time.cml +++ b/lib/iris/tests/results/cube_to_pp/no_forecast_time.cml @@ -3,12 +3,12 @@ - + - + diff --git a/lib/iris/tests/results/derived/column.cml b/lib/iris/tests/results/derived/column.cml index 827214dafa..db2ffbfb1f 100644 --- a/lib/iris/tests/results/derived/column.cml +++ b/lib/iris/tests/results/derived/column.cml @@ -6,33 +6,43 @@ - + - + @@ -40,78 +50,91 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/derived/no_orog.cml b/lib/iris/tests/results/derived/no_orog.cml index 844373675e..7588124c06 100644 --- a/lib/iris/tests/results/derived/no_orog.cml +++ b/lib/iris/tests/results/derived/no_orog.cml @@ -6,137 +6,161 @@ - + - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/derived/removed_derived_coord.cml b/lib/iris/tests/results/derived/removed_derived_coord.cml index 5175d88875..b2883fab51 100644 --- a/lib/iris/tests/results/derived/removed_derived_coord.cml +++ b/lib/iris/tests/results/derived/removed_derived_coord.cml @@ -6,111 +6,125 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/derived/removed_orog.cml b/lib/iris/tests/results/derived/removed_orog.cml index 982e38fd1e..07e9060747 100644 --- a/lib/iris/tests/results/derived/removed_orog.cml +++ b/lib/iris/tests/results/derived/removed_orog.cml @@ -6,123 +6,146 @@ - + - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + diff --git a/lib/iris/tests/results/derived/removed_sigma.cml b/lib/iris/tests/results/derived/removed_sigma.cml index 3908c22188..4cb3d3afcf 100644 --- a/lib/iris/tests/results/derived/removed_sigma.cml +++ b/lib/iris/tests/results/derived/removed_sigma.cml @@ -6,463 +6,532 @@ - + - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + diff --git a/lib/iris/tests/results/derived/transposed.cml b/lib/iris/tests/results/derived/transposed.cml index c44857bd61..d938494204 100644 --- a/lib/iris/tests/results/derived/transposed.cml +++ b/lib/iris/tests/results/derived/transposed.cml @@ -6,499 +6,522 @@ - + - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/experimental/analysis/interpolate/LinearInterpolator/basic_orthogonal_cube.cml b/lib/iris/tests/results/experimental/analysis/interpolate/LinearInterpolator/basic_orthogonal_cube.cml index f06d8d7970..47d9b0388f 100644 --- a/lib/iris/tests/results/experimental/analysis/interpolate/LinearInterpolator/basic_orthogonal_cube.cml +++ b/lib/iris/tests/results/experimental/analysis/interpolate/LinearInterpolator/basic_orthogonal_cube.cml @@ -3,14 +3,14 @@ - + - + @@ -22,7 +22,7 @@ - + diff --git a/lib/iris/tests/results/experimental/analysis/interpolate/LinearInterpolator/orthogonal_cube_1d_squashed.cml b/lib/iris/tests/results/experimental/analysis/interpolate/LinearInterpolator/orthogonal_cube_1d_squashed.cml index b2b33c4276..a725dbd6f2 100644 --- a/lib/iris/tests/results/experimental/analysis/interpolate/LinearInterpolator/orthogonal_cube_1d_squashed.cml +++ b/lib/iris/tests/results/experimental/analysis/interpolate/LinearInterpolator/orthogonal_cube_1d_squashed.cml @@ -3,14 +3,14 @@ - + - + @@ -22,7 +22,7 @@ - + diff --git a/lib/iris/tests/results/experimental/analysis/interpolate/LinearInterpolator/orthogonal_cube_1d_squashed_2.cml b/lib/iris/tests/results/experimental/analysis/interpolate/LinearInterpolator/orthogonal_cube_1d_squashed_2.cml index 422826f7fd..faadbb0a8c 100644 --- a/lib/iris/tests/results/experimental/analysis/interpolate/LinearInterpolator/orthogonal_cube_1d_squashed_2.cml +++ b/lib/iris/tests/results/experimental/analysis/interpolate/LinearInterpolator/orthogonal_cube_1d_squashed_2.cml @@ -3,14 +3,14 @@ - + - + @@ -22,7 +22,7 @@ - + diff --git a/lib/iris/tests/results/experimental/analysis/interpolate/LinearInterpolator/orthogonal_cube_with_factory.cml b/lib/iris/tests/results/experimental/analysis/interpolate/LinearInterpolator/orthogonal_cube_with_factory.cml index c7200d6106..d9750d1593 100644 --- a/lib/iris/tests/results/experimental/analysis/interpolate/LinearInterpolator/orthogonal_cube_with_factory.cml +++ b/lib/iris/tests/results/experimental/analysis/interpolate/LinearInterpolator/orthogonal_cube_with_factory.cml @@ -3,10 +3,10 @@ - + @@ -28,7 +28,7 @@ - + diff --git a/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/const_lat_cross_section.cml b/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/const_lat_cross_section.cml index cc9deb4260..a0ed65bd29 100644 --- a/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/const_lat_cross_section.cml +++ b/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/const_lat_cross_section.cml @@ -6,61 +6,61 @@ - + [[457.2669 , 495.58197], + [462.27734, 500.56924], + [459.3417 , 497.6472 ], + ..., + [408.93216, 447.471 ], + [390.02432, 428.65073], + [363.4833 , 402.23257]]]" id="9041e969" points="[[372.66827, 377.73013, 374.7644 , ..., + 323.83752, 304.73566, 277.92227], + [388.6288 , 393.68097, 390.72092, ..., + 339.89185, 320.8267 , 294.0648 ], + [410.97473, 416.0133 , 413.0612 , ..., + 362.3689 , 343.35504, 316.66516], + [439.70715, 444.72824, 441.78638, ..., + 391.26965, 372.32166, 345.7242 ], + [474.8275 , 479.82733, 476.89795, ..., + 426.5954 , 407.72775, 381.24307]]" shape="(5, 18)" standard_name="altitude" units="Unit('m')" value_type="float32"> - + @@ -68,38 +68,39 @@ - + - + @@ -113,20 +114,22 @@ - + - + - + diff --git a/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/const_lon_cross_section.cml b/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/const_lon_cross_section.cml index fb3d2cdbcf..efe8c37e2c 100644 --- a/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/const_lon_cross_section.cml +++ b/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/const_lon_cross_section.cml @@ -6,99 +6,98 @@ - + [[474.23618, 512.47266], + [465.1682 , 503.44672], + [422.9535 , 461.42743], + ..., + [488.32468, 526.496 ], + [500.70358, 538.81757], + [473.8021 , 512.04065]]]" id="9041e969" points="[[389.81168, 380.65067, 338.00275, 295.52823, + 278.92233, 280.88892, 327.14597, 342.9571 , + 368.656 , 404.04477, 416.55072, 389.37317], + [405.73932, 396.5959 , 354.02988, 311.63693, + 295.06293, 297.02573, 343.19394, 358.9747 , + 384.62427, 419.94507, 432.427 , 405.30164], + [428.03918, 418.92038, 376.46887, 334.19003, + 317.6606 , 319.61813, 365.6621 , 381.40042, + 406.98096, 442.20673, 454.65506, 427.60266], + [456.71246, 447.62524, 405.3208 , 363.1884 , + 346.71622, 348.66696, 394.55145, 410.23526, + 435.72717, 470.83093, 483.23618, 456.27747], + [491.76077, 482.71207, 440.58698, 398.63318, + 382.23087, 384.17334, 429.8633 , 445.4806 , + 470.86444, 505.81937, 518.172 , 491.3276 ]]" shape="(5, 12)" standard_name="altitude" units="Unit('m')" value_type="float32"> - + - + - + - + @@ -112,19 +111,20 @@ - + - + - + diff --git a/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/higher.cml b/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/higher.cml index 6c7779ff9f..7cfcf8b91f 100644 --- a/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/higher.cml +++ b/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/higher.cml @@ -3,41 +3,42 @@ - + - + diff --git a/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/hybridheight.cml b/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/hybridheight.cml index 70df0e198d..efe348ffcb 100644 --- a/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/hybridheight.cml +++ b/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/hybridheight.cml @@ -6,394 +6,398 @@ - + - + - + - + - + @@ -407,29 +411,30 @@ - + - + - + diff --git a/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/latlonreduced.cml b/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/latlonreduced.cml index 803a54ce67..80c60cc244 100644 --- a/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/latlonreduced.cml +++ b/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/latlonreduced.cml @@ -3,14 +3,14 @@ - + - + diff --git a/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/lonhalved.cml b/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/lonhalved.cml index fb937c1729..a5dbd5ead9 100644 --- a/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/lonhalved.cml +++ b/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/lonhalved.cml @@ -3,15 +3,15 @@ - + - + diff --git a/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/lower.cml b/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/lower.cml index c324683476..c32ee6bf0f 100644 --- a/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/lower.cml +++ b/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/lower.cml @@ -3,15 +3,15 @@ - + - + diff --git a/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/simple.cml b/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/simple.cml index fe54eb19cf..25850a36d9 100644 --- a/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/simple.cml +++ b/lib/iris/tests/results/experimental/regrid/regrid_area_weighted_rectilinear_src_and_grid/simple.cml @@ -3,17 +3,17 @@ - + - + diff --git a/lib/iris/tests/results/experimental/ugrid/2D_1t_face_half_levels.cml b/lib/iris/tests/results/experimental/ugrid/2D_1t_face_half_levels.cml index 7422bfe044..8acc98033b 100644 --- a/lib/iris/tests/results/experimental/ugrid/2D_1t_face_half_levels.cml +++ b/lib/iris/tests/results/experimental/ugrid/2D_1t_face_half_levels.cml @@ -14,27 +14,27 @@ - + - + - + diff --git a/lib/iris/tests/results/experimental/ugrid/2D_72t_face_half_levels.cml b/lib/iris/tests/results/experimental/ugrid/2D_72t_face_half_levels.cml index f9e0511ccb..68d933dd4d 100644 --- a/lib/iris/tests/results/experimental/ugrid/2D_72t_face_half_levels.cml +++ b/lib/iris/tests/results/experimental/ugrid/2D_72t_face_half_levels.cml @@ -14,46 +14,44 @@ - + - + - + diff --git a/lib/iris/tests/results/experimental/ugrid/3D_1t_face_full_levels.cml b/lib/iris/tests/results/experimental/ugrid/3D_1t_face_full_levels.cml index 2fb8b6e1f0..9c34b32abf 100644 --- a/lib/iris/tests/results/experimental/ugrid/3D_1t_face_full_levels.cml +++ b/lib/iris/tests/results/experimental/ugrid/3D_1t_face_full_levels.cml @@ -14,38 +14,37 @@ - + - + - + - + diff --git a/lib/iris/tests/results/experimental/ugrid/3D_1t_face_half_levels.cml b/lib/iris/tests/results/experimental/ugrid/3D_1t_face_half_levels.cml index 9a819eee9e..4ba4104fb4 100644 --- a/lib/iris/tests/results/experimental/ugrid/3D_1t_face_half_levels.cml +++ b/lib/iris/tests/results/experimental/ugrid/3D_1t_face_half_levels.cml @@ -14,38 +14,38 @@ - + - + - + - + diff --git a/lib/iris/tests/results/experimental/ugrid/3D_snow_pseudo_levels.cml b/lib/iris/tests/results/experimental/ugrid/3D_snow_pseudo_levels.cml index 9133d98e73..a89407d6a2 100644 --- a/lib/iris/tests/results/experimental/ugrid/3D_snow_pseudo_levels.cml +++ b/lib/iris/tests/results/experimental/ugrid/3D_snow_pseudo_levels.cml @@ -14,27 +14,27 @@ - + - + - + diff --git a/lib/iris/tests/results/experimental/ugrid/3D_soil_pseudo_levels.cml b/lib/iris/tests/results/experimental/ugrid/3D_soil_pseudo_levels.cml index 05aeab9ccb..d2efe47816 100644 --- a/lib/iris/tests/results/experimental/ugrid/3D_soil_pseudo_levels.cml +++ b/lib/iris/tests/results/experimental/ugrid/3D_soil_pseudo_levels.cml @@ -14,27 +14,27 @@ - + - + - + diff --git a/lib/iris/tests/results/experimental/ugrid/3D_tile_pseudo_levels.cml b/lib/iris/tests/results/experimental/ugrid/3D_tile_pseudo_levels.cml index 9dc3e08ee6..69e3233576 100644 --- a/lib/iris/tests/results/experimental/ugrid/3D_tile_pseudo_levels.cml +++ b/lib/iris/tests/results/experimental/ugrid/3D_tile_pseudo_levels.cml @@ -14,27 +14,27 @@ - + - + - + diff --git a/lib/iris/tests/results/experimental/ugrid/3D_veg_pseudo_levels.cml b/lib/iris/tests/results/experimental/ugrid/3D_veg_pseudo_levels.cml index 7bb47c5296..defd705298 100644 --- a/lib/iris/tests/results/experimental/ugrid/3D_veg_pseudo_levels.cml +++ b/lib/iris/tests/results/experimental/ugrid/3D_veg_pseudo_levels.cml @@ -14,27 +14,27 @@ - + - + - + diff --git a/lib/iris/tests/results/experimental/ugrid/surface_mean.cml b/lib/iris/tests/results/experimental/ugrid/surface_mean.cml index 8ccd602c11..3d6068393e 100644 --- a/lib/iris/tests/results/experimental/ugrid/surface_mean.cml +++ b/lib/iris/tests/results/experimental/ugrid/surface_mean.cml @@ -14,27 +14,27 @@ - - - - + + + + - + @@ -65,27 +65,27 @@ - - - - + + + + - + @@ -116,27 +116,27 @@ - - - - + + + + - + @@ -167,27 +167,27 @@ - - - - + + + + - + @@ -218,27 +218,27 @@ - - - - + + + + - + @@ -269,27 +269,27 @@ - - - - + + + + - + @@ -320,27 +320,27 @@ - - - - + + + + - + @@ -371,27 +371,27 @@ - - - - + + + + - + @@ -422,27 +422,27 @@ - - - - + + + + - + @@ -473,27 +473,27 @@ - - - - + + + + - + @@ -524,27 +524,27 @@ - - - - + + + + - + @@ -575,27 +575,27 @@ - - - - + + + + - + @@ -626,27 +626,27 @@ - - - - + + + + - + @@ -677,27 +677,27 @@ - - - - + + + + - + @@ -728,27 +728,27 @@ - - - - + + + + - + @@ -779,27 +779,27 @@ - - - - + + + + - + @@ -830,27 +830,27 @@ - - - - + + + + - + @@ -881,27 +881,27 @@ - - - - + + + + - + diff --git a/lib/iris/tests/results/file_load/theta_levels.cml b/lib/iris/tests/results/file_load/theta_levels.cml index fc708b7949..ce89181db6 100644 --- a/lib/iris/tests/results/file_load/theta_levels.cml +++ b/lib/iris/tests/results/file_load/theta_levels.cml @@ -8,25 +8,27 @@ - + - + - + - + - + @@ -38,10 +40,10 @@ - + - + @@ -59,25 +61,27 @@ - + - + - + - + - + @@ -89,10 +93,10 @@ - + - + @@ -110,25 +114,27 @@ - + - + - + - + - + @@ -140,10 +146,10 @@ - + - + @@ -161,25 +167,27 @@ - + - + - + - + - + @@ -191,10 +199,10 @@ - + - + @@ -212,25 +220,27 @@ - + - + - + - + - + @@ -242,10 +252,10 @@ - + - + @@ -263,25 +273,27 @@ - + - + - + - + - + @@ -293,10 +305,10 @@ - + - + @@ -314,25 +326,27 @@ - + - + - + - + - + @@ -344,10 +358,10 @@ - + - + @@ -365,25 +379,27 @@ - + - + - + - + - + @@ -395,10 +411,10 @@ - + - + @@ -416,25 +432,27 @@ - + - + - + - + - + @@ -446,10 +464,10 @@ - + - + @@ -467,25 +485,27 @@ - + - + - + - + - + @@ -497,10 +517,10 @@ - + - + @@ -518,25 +538,27 @@ - + - + - + - + - + @@ -548,10 +570,10 @@ - + - + @@ -569,25 +591,27 @@ - + - + - + - + - + @@ -599,10 +623,10 @@ - + - + @@ -620,25 +644,27 @@ - + - + - + - + - + @@ -650,10 +676,10 @@ - + - + @@ -671,25 +697,27 @@ - + - + - + - + - + @@ -701,10 +729,10 @@ - + - + @@ -722,25 +750,27 @@ - + - + - + - + - + @@ -752,10 +782,10 @@ - + - + @@ -773,25 +803,27 @@ - + - + - + - + - + @@ -803,10 +835,10 @@ - + - + @@ -824,25 +856,27 @@ - + - + - + - + - + @@ -854,10 +888,10 @@ - + - + @@ -875,25 +909,27 @@ - + - + - + - + - + @@ -905,10 +941,10 @@ - + - + @@ -926,25 +962,27 @@ - + - + - + - + - + @@ -956,10 +994,10 @@ - + - + @@ -977,25 +1015,27 @@ - + - + - + - + - + @@ -1007,10 +1047,10 @@ - + - + @@ -1028,25 +1068,27 @@ - + - + - + - + - + @@ -1058,10 +1100,10 @@ - + - + @@ -1079,25 +1121,27 @@ - + - + - + - + - + @@ -1109,10 +1153,10 @@ - + - + @@ -1130,25 +1174,27 @@ - + - + - + - + - + @@ -1160,10 +1206,10 @@ - + - + @@ -1181,25 +1227,27 @@ - + - + - + - + - + @@ -1211,10 +1259,10 @@ - + - + @@ -1232,25 +1280,27 @@ - + - + - + - + - + @@ -1262,10 +1312,10 @@ - + - + @@ -1283,25 +1333,27 @@ - + - + - + - + - + @@ -1313,10 +1365,10 @@ - + - + @@ -1334,25 +1386,27 @@ - + - + - + - + - + @@ -1364,10 +1418,10 @@ - + - + @@ -1385,25 +1439,27 @@ - + - + - + - + - + @@ -1415,10 +1471,10 @@ - + - + @@ -1436,25 +1492,27 @@ - + - + - + - + - + @@ -1466,10 +1524,10 @@ - + - + @@ -1487,25 +1545,27 @@ - + - + - + - + - + @@ -1517,10 +1577,10 @@ - + - + @@ -1538,25 +1598,27 @@ - + - + - + - + - + @@ -1568,10 +1630,10 @@ - + - + @@ -1589,25 +1651,27 @@ - + - + - + - + - + @@ -1619,10 +1683,10 @@ - + - + @@ -1640,25 +1704,27 @@ - + - + - + - + - + @@ -1670,10 +1736,10 @@ - + - + @@ -1691,25 +1757,27 @@ - + - + - + - + - + @@ -1721,10 +1789,10 @@ - + - + @@ -1742,25 +1810,27 @@ - + - + - + - + - + @@ -1772,10 +1842,10 @@ - + - + @@ -1793,25 +1863,27 @@ - + - + - + - + - + @@ -1823,10 +1895,10 @@ - + - + @@ -1844,25 +1916,27 @@ - + - + - + - + - + @@ -1874,10 +1948,10 @@ - + - + @@ -1895,25 +1969,27 @@ - + - + - + - + - + @@ -1925,10 +2001,10 @@ - + - + diff --git a/lib/iris/tests/results/file_load/u_wind_levels.cml b/lib/iris/tests/results/file_load/u_wind_levels.cml index 5d1af58f6c..c06f3f37ad 100644 --- a/lib/iris/tests/results/file_load/u_wind_levels.cml +++ b/lib/iris/tests/results/file_load/u_wind_levels.cml @@ -8,26 +8,27 @@ - + - + - + - + - + @@ -39,10 +40,10 @@ - + - + @@ -60,26 +61,27 @@ - + - + - + - + - + @@ -91,10 +93,10 @@ - + - + @@ -112,26 +114,27 @@ - + - + - + - + - + @@ -143,10 +146,10 @@ - + - + @@ -164,26 +167,27 @@ - + - + - + - + - + @@ -195,10 +199,10 @@ - + - + @@ -216,26 +220,27 @@ - + - + - + - + - + @@ -247,10 +252,10 @@ - + - + @@ -268,26 +273,27 @@ - + - + - + - + - + @@ -299,10 +305,10 @@ - + - + @@ -320,26 +326,27 @@ - + - + - + - + - + @@ -351,10 +358,10 @@ - + - + @@ -372,26 +379,27 @@ - + - + - + - + - + @@ -403,10 +411,10 @@ - + - + @@ -424,26 +432,27 @@ - + - + - + - + - + @@ -455,10 +464,10 @@ - + - + @@ -476,26 +485,27 @@ - + - + - + - + - + @@ -507,10 +517,10 @@ - + - + @@ -528,26 +538,27 @@ - + - + - + - + - + @@ -559,10 +570,10 @@ - + - + @@ -580,26 +591,27 @@ - + - + - + - + - + @@ -611,10 +623,10 @@ - + - + @@ -632,26 +644,27 @@ - + - + - + - + - + @@ -663,10 +676,10 @@ - + - + @@ -684,26 +697,27 @@ - + - + - + - + - + @@ -715,10 +729,10 @@ - + - + @@ -736,26 +750,27 @@ - + - + - + - + - + @@ -767,10 +782,10 @@ - + - + @@ -788,26 +803,27 @@ - + - + - + - + - + @@ -819,10 +835,10 @@ - + - + @@ -840,26 +856,27 @@ - + - + - + - + - + @@ -871,10 +888,10 @@ - + - + @@ -892,26 +909,27 @@ - + - + - + - + - + @@ -923,10 +941,10 @@ - + - + @@ -944,26 +962,27 @@ - + - + - + - + - + @@ -975,10 +994,10 @@ - + - + @@ -996,26 +1015,27 @@ - + - + - + - + - + @@ -1027,10 +1047,10 @@ - + - + @@ -1048,26 +1068,27 @@ - + - + - + - + - + @@ -1079,10 +1100,10 @@ - + - + @@ -1100,26 +1121,27 @@ - + - + - + - + - + @@ -1131,10 +1153,10 @@ - + - + @@ -1152,26 +1174,27 @@ - + - + - + - + - + @@ -1183,10 +1206,10 @@ - + - + @@ -1204,26 +1227,27 @@ - + - + - + - + - + @@ -1235,10 +1259,10 @@ - + - + @@ -1256,26 +1280,27 @@ - + - + - + - + - + @@ -1287,10 +1312,10 @@ - + - + @@ -1308,26 +1333,27 @@ - + - + - + - + - + @@ -1339,10 +1365,10 @@ - + - + @@ -1360,26 +1386,27 @@ - + - + - + - + - + @@ -1391,10 +1418,10 @@ - + - + @@ -1412,26 +1439,27 @@ - + - + - + - + - + @@ -1443,10 +1471,10 @@ - + - + @@ -1464,26 +1492,27 @@ - + - + - + - + - + @@ -1495,10 +1524,10 @@ - + - + @@ -1516,26 +1545,27 @@ - + - + - + - + - + @@ -1547,10 +1577,10 @@ - + - + @@ -1568,26 +1598,27 @@ - + - + - + - + - + @@ -1599,10 +1630,10 @@ - + - + @@ -1620,26 +1651,27 @@ - + - + - + - + - + @@ -1651,10 +1683,10 @@ - + - + @@ -1672,26 +1704,27 @@ - + - + - + - + - + @@ -1703,10 +1736,10 @@ - + - + @@ -1724,26 +1757,27 @@ - + - + - + - + - + @@ -1755,10 +1789,10 @@ - + - + @@ -1776,26 +1810,27 @@ - + - + - + - + - + @@ -1807,10 +1842,10 @@ - + - + @@ -1828,26 +1863,27 @@ - + - + - + - + - + @@ -1859,10 +1895,10 @@ - + - + @@ -1880,26 +1916,27 @@ - + - + - + - + - + @@ -1911,10 +1948,10 @@ - + - + @@ -1932,26 +1969,27 @@ - + - + - + - + - + @@ -1963,10 +2001,10 @@ - + - + diff --git a/lib/iris/tests/results/file_load/v_wind_levels.cml b/lib/iris/tests/results/file_load/v_wind_levels.cml index c7145a7e9e..59a8663235 100644 --- a/lib/iris/tests/results/file_load/v_wind_levels.cml +++ b/lib/iris/tests/results/file_load/v_wind_levels.cml @@ -8,26 +8,27 @@ - + - + - + - + - + @@ -39,10 +40,10 @@ - + - + @@ -60,26 +61,27 @@ - + - + - + - + - + @@ -91,10 +93,10 @@ - + - + @@ -112,26 +114,27 @@ - + - + - + - + - + @@ -143,10 +146,10 @@ - + - + @@ -164,26 +167,27 @@ - + - + - + - + - + @@ -195,10 +199,10 @@ - + - + @@ -216,26 +220,27 @@ - + - + - + - + - + @@ -247,10 +252,10 @@ - + - + @@ -268,26 +273,27 @@ - + - + - + - + - + @@ -299,10 +305,10 @@ - + - + @@ -320,26 +326,27 @@ - + - + - + - + - + @@ -351,10 +358,10 @@ - + - + @@ -372,26 +379,27 @@ - + - + - + - + - + @@ -403,10 +411,10 @@ - + - + @@ -424,26 +432,27 @@ - + - + - + - + - + @@ -455,10 +464,10 @@ - + - + @@ -476,26 +485,27 @@ - + - + - + - + - + @@ -507,10 +517,10 @@ - + - + @@ -528,26 +538,27 @@ - + - + - + - + - + @@ -559,10 +570,10 @@ - + - + @@ -580,26 +591,27 @@ - + - + - + - + - + @@ -611,10 +623,10 @@ - + - + @@ -632,26 +644,27 @@ - + - + - + - + - + @@ -663,10 +676,10 @@ - + - + @@ -684,26 +697,27 @@ - + - + - + - + - + @@ -715,10 +729,10 @@ - + - + @@ -736,26 +750,27 @@ - + - + - + - + - + @@ -767,10 +782,10 @@ - + - + @@ -788,26 +803,27 @@ - + - + - + - + - + @@ -819,10 +835,10 @@ - + - + @@ -840,26 +856,27 @@ - + - + - + - + - + @@ -871,10 +888,10 @@ - + - + @@ -892,26 +909,27 @@ - + - + - + - + - + @@ -923,10 +941,10 @@ - + - + @@ -944,26 +962,27 @@ - + - + - + - + - + @@ -975,10 +994,10 @@ - + - + @@ -996,26 +1015,27 @@ - + - + - + - + - + @@ -1027,10 +1047,10 @@ - + - + @@ -1048,26 +1068,27 @@ - + - + - + - + - + @@ -1079,10 +1100,10 @@ - + - + @@ -1100,26 +1121,27 @@ - + - + - + - + - + @@ -1131,10 +1153,10 @@ - + - + @@ -1152,26 +1174,27 @@ - + - + - + - + - + @@ -1183,10 +1206,10 @@ - + - + @@ -1204,26 +1227,27 @@ - + - + - + - + - + @@ -1235,10 +1259,10 @@ - + - + @@ -1256,26 +1280,27 @@ - + - + - + - + - + @@ -1287,10 +1312,10 @@ - + - + @@ -1308,26 +1333,27 @@ - + - + - + - + - + @@ -1339,10 +1365,10 @@ - + - + @@ -1360,26 +1386,27 @@ - + - + - + - + - + @@ -1391,10 +1418,10 @@ - + - + @@ -1412,26 +1439,27 @@ - + - + - + - + - + @@ -1443,10 +1471,10 @@ - + - + @@ -1464,26 +1492,27 @@ - + - + - + - + - + @@ -1495,10 +1524,10 @@ - + - + @@ -1516,26 +1545,27 @@ - + - + - + - + - + @@ -1547,10 +1577,10 @@ - + - + @@ -1568,26 +1598,27 @@ - + - + - + - + - + @@ -1599,10 +1630,10 @@ - + - + @@ -1620,26 +1651,27 @@ - + - + - + - + - + @@ -1651,10 +1683,10 @@ - + - + @@ -1672,26 +1704,27 @@ - + - + - + - + - + @@ -1703,10 +1736,10 @@ - + - + @@ -1724,26 +1757,27 @@ - + - + - + - + - + @@ -1755,10 +1789,10 @@ - + - + @@ -1776,26 +1810,27 @@ - + - + - + - + - + @@ -1807,10 +1842,10 @@ - + - + @@ -1828,26 +1863,27 @@ - + - + - + - + - + @@ -1859,10 +1895,10 @@ - + - + @@ -1880,26 +1916,27 @@ - + - + - + - + - + @@ -1911,10 +1948,10 @@ - + - + @@ -1932,26 +1969,27 @@ - + - + - + - + - + @@ -1963,10 +2001,10 @@ - + - + diff --git a/lib/iris/tests/results/file_load/wind_levels.cml b/lib/iris/tests/results/file_load/wind_levels.cml index 33584deec6..1458e62649 100644 --- a/lib/iris/tests/results/file_load/wind_levels.cml +++ b/lib/iris/tests/results/file_load/wind_levels.cml @@ -8,26 +8,27 @@ - + - + - + - + - + @@ -39,10 +40,10 @@ - + - + @@ -60,26 +61,27 @@ - + - + - + - + - + @@ -91,10 +93,10 @@ - + - + @@ -112,26 +114,27 @@ - + - + - + - + - + @@ -143,10 +146,10 @@ - + - + @@ -164,26 +167,27 @@ - + - + - + - + - + @@ -195,10 +199,10 @@ - + - + @@ -216,26 +220,27 @@ - + - + - + - + - + @@ -247,10 +252,10 @@ - + - + @@ -268,26 +273,27 @@ - + - + - + - + - + @@ -299,10 +305,10 @@ - + - + @@ -320,26 +326,27 @@ - + - + - + - + - + @@ -351,10 +358,10 @@ - + - + @@ -372,26 +379,27 @@ - + - + - + - + - + @@ -403,10 +411,10 @@ - + - + @@ -424,26 +432,27 @@ - + - + - + - + - + @@ -455,10 +464,10 @@ - + - + @@ -476,26 +485,27 @@ - + - + - + - + - + @@ -507,10 +517,10 @@ - + - + @@ -528,26 +538,27 @@ - + - + - + - + - + @@ -559,10 +570,10 @@ - + - + @@ -580,26 +591,27 @@ - + - + - + - + - + @@ -611,10 +623,10 @@ - + - + @@ -632,26 +644,27 @@ - + - + - + - + - + @@ -663,10 +676,10 @@ - + - + @@ -684,26 +697,27 @@ - + - + - + - + - + @@ -715,10 +729,10 @@ - + - + @@ -736,26 +750,27 @@ - + - + - + - + - + @@ -767,10 +782,10 @@ - + - + @@ -788,26 +803,27 @@ - + - + - + - + - + @@ -819,10 +835,10 @@ - + - + @@ -840,26 +856,27 @@ - + - + - + - + - + @@ -871,10 +888,10 @@ - + - + @@ -892,26 +909,27 @@ - + - + - + - + - + @@ -923,10 +941,10 @@ - + - + @@ -944,26 +962,27 @@ - + - + - + - + - + @@ -975,10 +994,10 @@ - + - + @@ -996,26 +1015,27 @@ - + - + - + - + - + @@ -1027,10 +1047,10 @@ - + - + @@ -1048,26 +1068,27 @@ - + - + - + - + - + @@ -1079,10 +1100,10 @@ - + - + @@ -1100,26 +1121,27 @@ - + - + - + - + - + @@ -1131,10 +1153,10 @@ - + - + @@ -1152,26 +1174,27 @@ - + - + - + - + - + @@ -1183,10 +1206,10 @@ - + - + @@ -1204,26 +1227,27 @@ - + - + - + - + - + @@ -1235,10 +1259,10 @@ - + - + @@ -1256,26 +1280,27 @@ - + - + - + - + - + @@ -1287,10 +1312,10 @@ - + - + @@ -1308,26 +1333,27 @@ - + - + - + - + - + @@ -1339,10 +1365,10 @@ - + - + @@ -1360,26 +1386,27 @@ - + - + - + - + - + @@ -1391,10 +1418,10 @@ - + - + @@ -1412,26 +1439,27 @@ - + - + - + - + - + @@ -1443,10 +1471,10 @@ - + - + @@ -1464,26 +1492,27 @@ - + - + - + - + - + @@ -1495,10 +1524,10 @@ - + - + @@ -1516,26 +1545,27 @@ - + - + - + - + - + @@ -1547,10 +1577,10 @@ - + - + @@ -1568,26 +1598,27 @@ - + - + - + - + - + @@ -1599,10 +1630,10 @@ - + - + @@ -1620,26 +1651,27 @@ - + - + - + - + - + @@ -1651,10 +1683,10 @@ - + - + @@ -1672,26 +1704,27 @@ - + - + - + - + - + @@ -1703,10 +1736,10 @@ - + - + @@ -1724,26 +1757,27 @@ - + - + - + - + - + @@ -1755,10 +1789,10 @@ - + - + @@ -1776,26 +1810,27 @@ - + - + - + - + - + @@ -1807,10 +1842,10 @@ - + - + @@ -1828,26 +1863,27 @@ - + - + - + - + - + @@ -1859,10 +1895,10 @@ - + - + @@ -1880,26 +1916,27 @@ - + - + - + - + - + @@ -1911,10 +1948,10 @@ - + - + @@ -1932,26 +1969,27 @@ - + - + - + - + - + @@ -1963,10 +2001,10 @@ - + - + @@ -1984,26 +2022,27 @@ - + - + - + - + - + @@ -2015,10 +2054,10 @@ - + - + @@ -2036,26 +2075,27 @@ - + - + - + - + - + @@ -2067,10 +2107,10 @@ - + - + @@ -2088,26 +2128,27 @@ - + - + - + - + - + @@ -2119,10 +2160,10 @@ - + - + @@ -2140,26 +2181,27 @@ - + - + - + - + - + @@ -2171,10 +2213,10 @@ - + - + @@ -2192,26 +2234,27 @@ - + - + - + - + - + @@ -2223,10 +2266,10 @@ - + - + @@ -2244,26 +2287,27 @@ - + - + - + - + - + @@ -2275,10 +2319,10 @@ - + - + @@ -2296,26 +2340,27 @@ - + - + - + - + - + @@ -2327,10 +2372,10 @@ - + - + @@ -2348,26 +2393,27 @@ - + - + - + - + - + @@ -2379,10 +2425,10 @@ - + - + @@ -2400,26 +2446,27 @@ - + - + - + - + - + @@ -2431,10 +2478,10 @@ - + - + @@ -2452,26 +2499,27 @@ - + - + - + - + - + @@ -2483,10 +2531,10 @@ - + - + @@ -2504,26 +2552,27 @@ - + - + - + - + - + @@ -2535,10 +2584,10 @@ - + - + @@ -2556,26 +2605,27 @@ - + - + - + - + - + @@ -2587,10 +2637,10 @@ - + - + @@ -2608,26 +2658,27 @@ - + - + - + - + - + @@ -2639,10 +2690,10 @@ - + - + @@ -2660,26 +2711,27 @@ - + - + - + - + - + @@ -2691,10 +2743,10 @@ - + - + @@ -2712,26 +2764,27 @@ - + - + - + - + - + @@ -2743,10 +2796,10 @@ - + - + @@ -2764,26 +2817,27 @@ - + - + - + - + - + @@ -2795,10 +2849,10 @@ - + - + @@ -2816,26 +2870,27 @@ - + - + - + - + - + @@ -2847,10 +2902,10 @@ - + - + @@ -2868,26 +2923,27 @@ - + - + - + - + - + @@ -2899,10 +2955,10 @@ - + - + @@ -2920,26 +2976,27 @@ - + - + - + - + - + @@ -2951,10 +3008,10 @@ - + - + @@ -2972,26 +3029,27 @@ - + - + - + - + - + @@ -3003,10 +3061,10 @@ - + - + @@ -3024,26 +3082,27 @@ - + - + - + - + - + @@ -3055,10 +3114,10 @@ - + - + @@ -3076,26 +3135,27 @@ - + - + - + - + - + @@ -3107,10 +3167,10 @@ - + - + @@ -3128,26 +3188,27 @@ - + - + - + - + - + @@ -3159,10 +3220,10 @@ - + - + @@ -3180,26 +3241,27 @@ - + - + - + - + - + @@ -3211,10 +3273,10 @@ - + - + @@ -3232,26 +3294,27 @@ - + - + - + - + - + @@ -3263,10 +3326,10 @@ - + - + @@ -3284,26 +3347,27 @@ - + - + - + - + - + @@ -3315,10 +3379,10 @@ - + - + @@ -3336,26 +3400,27 @@ - + - + - + - + - + @@ -3367,10 +3432,10 @@ - + - + @@ -3388,26 +3453,27 @@ - + - + - + - + - + @@ -3419,10 +3485,10 @@ - + - + @@ -3440,26 +3506,27 @@ - + - + - + - + - + @@ -3471,10 +3538,10 @@ - + - + @@ -3492,26 +3559,27 @@ - + - + - + - + - + @@ -3523,10 +3591,10 @@ - + - + @@ -3544,26 +3612,27 @@ - + - + - + - + - + @@ -3575,10 +3644,10 @@ - + - + @@ -3596,26 +3665,27 @@ - + - + - + - + - + @@ -3627,10 +3697,10 @@ - + - + @@ -3648,26 +3718,27 @@ - + - + - + - + - + @@ -3679,10 +3750,10 @@ - + - + @@ -3700,26 +3771,27 @@ - + - + - + - + - + @@ -3731,10 +3803,10 @@ - + - + @@ -3752,26 +3824,27 @@ - + - + - + - + - + @@ -3783,10 +3856,10 @@ - + - + @@ -3804,26 +3877,27 @@ - + - + - + - + - + @@ -3835,10 +3909,10 @@ - + - + @@ -3856,26 +3930,27 @@ - + - + - + - + - + @@ -3887,10 +3962,10 @@ - + - + @@ -3908,26 +3983,27 @@ - + - + - + - + - + @@ -3939,10 +4015,10 @@ - + - + diff --git a/lib/iris/tests/results/integration/netcdf/aux_factories/TestSaveMultipleAuxFactories/hybrid_height_cubes.cml b/lib/iris/tests/results/integration/netcdf/aux_factories/TestSaveMultipleAuxFactories/hybrid_height_cubes.cml index 09d54a1b19..975488f656 100644 --- a/lib/iris/tests/results/integration/netcdf/aux_factories/TestSaveMultipleAuxFactories/hybrid_height_cubes.cml +++ b/lib/iris/tests/results/integration/netcdf/aux_factories/TestSaveMultipleAuxFactories/hybrid_height_cubes.cml @@ -8,28 +8,28 @@ + [[5343, 5396, 5449, 5502, 5555, 5608], + [5661, 5714, 5767, 5820, 5873, 5926], + [5979, 6032, 6085, 6138, 6191, 6244], + [6297, 6350, 6403, 6456, 6509, 6562], + [6615, 6668, 6721, 6774, 6827, 6880]]]" shape="(4, 5, 6)" standard_name="altitude" units="Unit('m')" value_type="int64"> @@ -52,10 +52,10 @@ + [106, 107, 108, 109, 110, 111], + [112, 113, 114, 115, 116, 117], + [118, 119, 120, 121, 122, 123], + [124, 125, 126, 127, 128, 129]]" shape="(5, 6)" standard_name="surface_altitude" units="Unit('m')" value_type="int64" var_name="surface_altitude"/> @@ -72,28 +72,28 @@ + [[53043, 53573, 54103, 54633, 55163, 55693], + [56223, 56753, 57283, 57813, 58343, 58873], + [59403, 59933, 60463, 60993, 61523, 62053], + [62583, 63113, 63643, 64173, 64703, 65233], + [65763, 66293, 66823, 67353, 67883, 68413]]]" shape="(4, 5, 6)" standard_name="altitude" units="Unit('m')" value_type="int64"> @@ -116,10 +116,10 @@ + [1060, 1070, 1080, 1090, 1100, 1110], + [1120, 1130, 1140, 1150, 1160, 1170], + [1180, 1190, 1200, 1210, 1220, 1230], + [1240, 1250, 1260, 1270, 1280, 1290]]" shape="(5, 6)" units="Unit('m')" value_type="int64" var_name="surface_altitude_0"/> diff --git a/lib/iris/tests/results/integration/um/fieldsfile/TestStructuredLoadFF/simple.cml b/lib/iris/tests/results/integration/um/fieldsfile/TestStructuredLoadFF/simple.cml index bac3f9b503..d6d0610e1f 100644 --- a/lib/iris/tests/results/integration/um/fieldsfile/TestStructuredLoadFF/simple.cml +++ b/lib/iris/tests/results/integration/um/fieldsfile/TestStructuredLoadFF/simple.cml @@ -8,41 +8,41 @@ - + - + - + - + - + @@ -54,12 +54,12 @@ - + - + diff --git a/lib/iris/tests/results/integration/um/fieldsfile/TestStructuredLoadFF/simple_callback.cml b/lib/iris/tests/results/integration/um/fieldsfile/TestStructuredLoadFF/simple_callback.cml index 971f76d618..3bd43f0468 100644 --- a/lib/iris/tests/results/integration/um/fieldsfile/TestStructuredLoadFF/simple_callback.cml +++ b/lib/iris/tests/results/integration/um/fieldsfile/TestStructuredLoadFF/simple_callback.cml @@ -9,41 +9,41 @@ - + - + - + - + - + @@ -55,12 +55,12 @@ - + - + diff --git a/lib/iris/tests/results/iterate/izip_nd_ortho.cml b/lib/iris/tests/results/iterate/izip_nd_ortho.cml index 1b8fded247..c489067dd0 100644 --- a/lib/iris/tests/results/iterate/izip_nd_ortho.cml +++ b/lib/iris/tests/results/iterate/izip_nd_ortho.cml @@ -3,18 +3,18 @@ - + - + @@ -26,18 +26,18 @@ - + - + @@ -49,18 +49,18 @@ - + - + @@ -72,18 +72,18 @@ - + - + @@ -95,18 +95,18 @@ - + - + @@ -118,18 +118,18 @@ - + - + @@ -141,18 +141,18 @@ - + - + @@ -164,18 +164,18 @@ - + - + @@ -187,18 +187,18 @@ - + - + @@ -210,18 +210,18 @@ - + - + diff --git a/lib/iris/tests/results/merge/a_aux_b_aux.cml b/lib/iris/tests/results/merge/a_aux_b_aux.cml index 88af58cbe7..7701d3f461 100644 --- a/lib/iris/tests/results/merge/a_aux_b_aux.cml +++ b/lib/iris/tests/results/merge/a_aux_b_aux.cml @@ -3,10 +3,10 @@ - + - + diff --git a/lib/iris/tests/results/merge/a_aux_b_dim.cml b/lib/iris/tests/results/merge/a_aux_b_dim.cml index 88af58cbe7..7701d3f461 100644 --- a/lib/iris/tests/results/merge/a_aux_b_dim.cml +++ b/lib/iris/tests/results/merge/a_aux_b_dim.cml @@ -3,10 +3,10 @@ - + - + diff --git a/lib/iris/tests/results/merge/a_dim_b_aux.cml b/lib/iris/tests/results/merge/a_dim_b_aux.cml index 88af58cbe7..7701d3f461 100644 --- a/lib/iris/tests/results/merge/a_dim_b_aux.cml +++ b/lib/iris/tests/results/merge/a_dim_b_aux.cml @@ -3,10 +3,10 @@ - + - + diff --git a/lib/iris/tests/results/merge/a_dim_b_dim.cml b/lib/iris/tests/results/merge/a_dim_b_dim.cml index 88af58cbe7..7701d3f461 100644 --- a/lib/iris/tests/results/merge/a_dim_b_dim.cml +++ b/lib/iris/tests/results/merge/a_dim_b_dim.cml @@ -3,10 +3,10 @@ - + - + diff --git a/lib/iris/tests/results/merge/dec.cml b/lib/iris/tests/results/merge/dec.cml index 4efd40910f..6d72d19917 100644 --- a/lib/iris/tests/results/merge/dec.cml +++ b/lib/iris/tests/results/merge/dec.cml @@ -8,129 +8,140 @@ - + - + - + - + - + - + - + - + @@ -148,129 +159,140 @@ - + - + - + - + - + - + - + - + @@ -288,130 +310,140 @@ - + - + - + - + - + - + - + - + @@ -429,130 +461,140 @@ - + - + - + - + - + - + - + - + diff --git a/lib/iris/tests/results/merge/separable_combination.cml b/lib/iris/tests/results/merge/separable_combination.cml index 25802c8228..db14b667e3 100644 --- a/lib/iris/tests/results/merge/separable_combination.cml +++ b/lib/iris/tests/results/merge/separable_combination.cml @@ -3,45 +3,47 @@ - + - + - + - + diff --git a/lib/iris/tests/results/merge/single_split.cml b/lib/iris/tests/results/merge/single_split.cml index fffe59fe02..afa0fd0b6e 100644 --- a/lib/iris/tests/results/merge/single_split.cml +++ b/lib/iris/tests/results/merge/single_split.cml @@ -10,8 +10,8 @@ + [2, 3], + [4, 5]]" shape="(3, 2)" units="Unit('1')" value_type="int32"/> diff --git a/lib/iris/tests/results/merge/string_a_b.cml b/lib/iris/tests/results/merge/string_a_b.cml index 48b46979c1..5d0304efd8 100644 --- a/lib/iris/tests/results/merge/string_a_b.cml +++ b/lib/iris/tests/results/merge/string_a_b.cml @@ -3,10 +3,10 @@ - + - + diff --git a/lib/iris/tests/results/merge/string_a_with_aux.cml b/lib/iris/tests/results/merge/string_a_with_aux.cml index 1f41f23aad..479cb28347 100644 --- a/lib/iris/tests/results/merge/string_a_with_aux.cml +++ b/lib/iris/tests/results/merge/string_a_with_aux.cml @@ -3,10 +3,10 @@ - + - + diff --git a/lib/iris/tests/results/merge/string_a_with_dim.cml b/lib/iris/tests/results/merge/string_a_with_dim.cml index 1f41f23aad..479cb28347 100644 --- a/lib/iris/tests/results/merge/string_a_with_dim.cml +++ b/lib/iris/tests/results/merge/string_a_with_dim.cml @@ -3,10 +3,10 @@ - + - + diff --git a/lib/iris/tests/results/merge/string_b_with_aux.cml b/lib/iris/tests/results/merge/string_b_with_aux.cml index 8710767c41..980e33b439 100644 --- a/lib/iris/tests/results/merge/string_b_with_aux.cml +++ b/lib/iris/tests/results/merge/string_b_with_aux.cml @@ -3,10 +3,10 @@ - + - + diff --git a/lib/iris/tests/results/merge/string_b_with_dim.cml b/lib/iris/tests/results/merge/string_b_with_dim.cml index 8710767c41..980e33b439 100644 --- a/lib/iris/tests/results/merge/string_b_with_dim.cml +++ b/lib/iris/tests/results/merge/string_b_with_dim.cml @@ -3,10 +3,10 @@ - + - + diff --git a/lib/iris/tests/results/merge/theta.cml b/lib/iris/tests/results/merge/theta.cml index 0e5b02be51..b9bf8ce411 100644 --- a/lib/iris/tests/results/merge/theta.cml +++ b/lib/iris/tests/results/merge/theta.cml @@ -8,129 +8,140 @@ - + - + - + - + - + - + - + - + diff --git a/lib/iris/tests/results/merge/theta_two_times.cml b/lib/iris/tests/results/merge/theta_two_times.cml index d1c9f59ace..991ac41da9 100644 --- a/lib/iris/tests/results/merge/theta_two_times.cml +++ b/lib/iris/tests/results/merge/theta_two_times.cml @@ -8,498 +8,520 @@ - + - + - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + @@ -508,7 +530,7 @@ - + diff --git a/lib/iris/tests/results/merge/time_triple_merging2.cml b/lib/iris/tests/results/merge/time_triple_merging2.cml index b838ad569a..6be51a0396 100644 --- a/lib/iris/tests/results/merge/time_triple_merging2.cml +++ b/lib/iris/tests/results/merge/time_triple_merging2.cml @@ -10,7 +10,7 @@ + [3, 4, 5]]" shape="(2, 3)" standard_name="time" units="Unit('1')" value_type="int32"/> diff --git a/lib/iris/tests/results/merge/time_triple_merging4.cml b/lib/iris/tests/results/merge/time_triple_merging4.cml index 147bf1adf8..f508578e7f 100644 --- a/lib/iris/tests/results/merge/time_triple_merging4.cml +++ b/lib/iris/tests/results/merge/time_triple_merging4.cml @@ -10,8 +10,8 @@ + [1, 4], + [2, 5]]" shape="(3, 2)" standard_name="time" units="Unit('1')" value_type="int32"/> diff --git a/lib/iris/tests/results/merge/time_triple_successive_forecasts.cml b/lib/iris/tests/results/merge/time_triple_successive_forecasts.cml index ff0d9cdad2..c8d5a993c3 100644 --- a/lib/iris/tests/results/merge/time_triple_successive_forecasts.cml +++ b/lib/iris/tests/results/merge/time_triple_successive_forecasts.cml @@ -10,8 +10,8 @@ + [11, 12, 13, 14], + [12, 13, 14, 15]]" shape="(3, 4)" standard_name="time" units="Unit('1')" value_type="int32"/> diff --git a/lib/iris/tests/results/merge/time_triple_time_non_dim_coord.cml b/lib/iris/tests/results/merge/time_triple_time_non_dim_coord.cml index b3c2c26d96..76e45b4a3f 100644 --- a/lib/iris/tests/results/merge/time_triple_time_non_dim_coord.cml +++ b/lib/iris/tests/results/merge/time_triple_time_non_dim_coord.cml @@ -3,14 +3,14 @@ - + - + diff --git a/lib/iris/tests/results/merge/time_triple_time_vs_forecast.cml b/lib/iris/tests/results/merge/time_triple_time_vs_forecast.cml index f0d625671f..6bc573e6d5 100644 --- a/lib/iris/tests/results/merge/time_triple_time_vs_forecast.cml +++ b/lib/iris/tests/results/merge/time_triple_time_vs_forecast.cml @@ -6,10 +6,10 @@ - + diff --git a/lib/iris/tests/results/merge/time_triple_time_vs_ref_time.cml b/lib/iris/tests/results/merge/time_triple_time_vs_ref_time.cml index cef8a71d1f..0a85d5394c 100644 --- a/lib/iris/tests/results/merge/time_triple_time_vs_ref_time.cml +++ b/lib/iris/tests/results/merge/time_triple_time_vs_ref_time.cml @@ -4,9 +4,9 @@ + [3, 2, 1], + [4, 3, 2], + [5, 4, 3]]" shape="(4, 3)" standard_name="forecast_period" units="Unit('1')" value_type="int32"/> diff --git a/lib/iris/tests/results/name/NAMEIII_field.cml b/lib/iris/tests/results/name/NAMEIII_field.cml index c419a2760d..0c88fcc7d5 100644 --- a/lib/iris/tests/results/name/NAMEIII_field.cml +++ b/lib/iris/tests/results/name/NAMEIII_field.cml @@ -25,33 +25,33 @@ + [50.612, 50.613], + [50.613, 50.614], + ..., + [50.808, 50.809], + [50.809, 50.81 ], + [50.81 , 50.811]]" id="77a50eb5" points="[50.6115, 50.6125, 50.6135, ..., 50.8085, 50.8095, + 50.8105]" shape="(200,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> + [-3.6773, -3.6755], + [-3.6755, -3.6737], + ..., + [-3.3245, -3.3227], + [-3.3227, -3.3209], + [-3.3209, -3.3191]]" id="f913a8b3" points="[-3.6782, -3.6764, -3.6746, ..., -3.3236, -3.3218, + -3.32 ]" shape="(200,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"> - + - + @@ -90,33 +90,33 @@ + [50.612, 50.613], + [50.613, 50.614], + ..., + [50.808, 50.809], + [50.809, 50.81 ], + [50.81 , 50.811]]" id="77a50eb5" points="[50.6115, 50.6125, 50.6135, ..., 50.8085, 50.8095, + 50.8105]" shape="(200,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> + [-3.6773, -3.6755], + [-3.6755, -3.6737], + ..., + [-3.3245, -3.3227], + [-3.3227, -3.3209], + [-3.3209, -3.3191]]" id="f913a8b3" points="[-3.6782, -3.6764, -3.6746, ..., -3.3236, -3.3218, + -3.32 ]" shape="(200,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"> - + - + @@ -154,33 +154,33 @@ + [50.612, 50.613], + [50.613, 50.614], + ..., + [50.808, 50.809], + [50.809, 50.81 ], + [50.81 , 50.811]]" id="77a50eb5" points="[50.6115, 50.6125, 50.6135, ..., 50.8085, 50.8095, + 50.8105]" shape="(200,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> + [-3.6773, -3.6755], + [-3.6755, -3.6737], + ..., + [-3.3245, -3.3227], + [-3.3227, -3.3209], + [-3.3209, -3.3191]]" id="f913a8b3" points="[-3.6782, -3.6764, -3.6746, ..., -3.3236, -3.3218, + -3.32 ]" shape="(200,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"> - + - + @@ -218,33 +218,33 @@ + [50.612, 50.613], + [50.613, 50.614], + ..., + [50.808, 50.809], + [50.809, 50.81 ], + [50.81 , 50.811]]" id="77a50eb5" points="[50.6115, 50.6125, 50.6135, ..., 50.8085, 50.8095, + 50.8105]" shape="(200,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> + [-3.6773, -3.6755], + [-3.6755, -3.6737], + ..., + [-3.3245, -3.3227], + [-3.3227, -3.3209], + [-3.3209, -3.3191]]" id="f913a8b3" points="[-3.6782, -3.6764, -3.6746, ..., -3.3236, -3.3218, + -3.32 ]" shape="(200,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"> - + - + @@ -282,33 +282,33 @@ + [50.612, 50.613], + [50.613, 50.614], + ..., + [50.808, 50.809], + [50.809, 50.81 ], + [50.81 , 50.811]]" id="77a50eb5" points="[50.6115, 50.6125, 50.6135, ..., 50.8085, 50.8095, + 50.8105]" shape="(200,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> + [-3.6773, -3.6755], + [-3.6755, -3.6737], + ..., + [-3.3245, -3.3227], + [-3.3227, -3.3209], + [-3.3209, -3.3191]]" id="f913a8b3" points="[-3.6782, -3.6764, -3.6746, ..., -3.3236, -3.3218, + -3.32 ]" shape="(200,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"> - + - + diff --git a/lib/iris/tests/results/name/NAMEIII_timeseries.cml b/lib/iris/tests/results/name/NAMEIII_timeseries.cml index 3776bfc27f..1a40388a1f 100644 --- a/lib/iris/tests/results/name/NAMEIII_timeseries.cml +++ b/lib/iris/tests/results/name/NAMEIII_timeseries.cml @@ -35,33 +35,30 @@ - + - + @@ -106,33 +103,30 @@ - + - + @@ -176,33 +170,30 @@ - + - + @@ -246,33 +237,30 @@ - + - + @@ -316,33 +304,30 @@ - + - + diff --git a/lib/iris/tests/results/name/NAMEIII_trajectory.cml b/lib/iris/tests/results/name/NAMEIII_trajectory.cml index 20a0ec3b82..121b174169 100644 --- a/lib/iris/tests/results/name/NAMEIII_trajectory.cml +++ b/lib/iris/tests/results/name/NAMEIII_trajectory.cml @@ -10,36 +10,36 @@ - + - + - + - + - + - + + 57.13152, 57.03173]" shape="(836,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"/> + 34.37071, 34.42273]" shape="(836,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"/> - + @@ -55,36 +55,36 @@ - + - + - + - + - + - + + 57.13152, 57.03173]" shape="(836,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"/> + 34.37071, 34.42273]" shape="(836,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"/> - + @@ -100,36 +100,36 @@ - + - + - + - + - + - + + 57.13152, 57.03173]" shape="(836,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"/> + 34.37071, 34.42273]" shape="(836,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"/> - + @@ -145,36 +145,36 @@ - + - + - + - + - + - + + 57.13152, 57.03173]" shape="(836,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"/> + 34.37071, 34.42273]" shape="(836,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"/> - + @@ -190,36 +190,36 @@ - + - + - + - + - + - + + 57.13152, 57.03173]" shape="(836,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"/> + 34.37071, 34.42273]" shape="(836,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"/> - + @@ -235,36 +235,36 @@ - + - + - + - + - + - + + 57.13152, 57.03173]" shape="(836,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"/> + 34.37071, 34.42273]" shape="(836,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"/> - + @@ -280,36 +280,36 @@ - + - + - + - + - + - + + 57.13152, 57.03173]" shape="(836,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"/> + 34.37071, 34.42273]" shape="(836,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"/> - + @@ -325,36 +325,36 @@ - + - + - + - + - + - + + 57.13152, 57.03173]" shape="(836,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"/> + 34.37071, 34.42273]" shape="(836,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"/> - + @@ -370,36 +370,36 @@ - + - + - + - + - + - + + 57.13152, 57.03173]" shape="(836,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"/> + 34.37071, 34.42273]" shape="(836,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"/> - + @@ -415,36 +415,36 @@ - + - + - + - + - + - + + 57.13152, 57.03173]" shape="(836,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"/> + 34.37071, 34.42273]" shape="(836,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"/> - + @@ -460,36 +460,36 @@ - + - + - + - + - + - + + 57.13152, 57.03173]" shape="(836,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"/> + 34.37071, 34.42273]" shape="(836,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"/> - + @@ -505,36 +505,36 @@ - + - + - + - + - + - + + 57.13152, 57.03173]" shape="(836,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"/> + 34.37071, 34.42273]" shape="(836,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"/> - + @@ -550,36 +550,36 @@ - + - + - + - + - + - + + 57.13152, 57.03173]" shape="(836,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"/> + 34.37071, 34.42273]" shape="(836,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"/> - + @@ -595,36 +595,36 @@ - + - + - + - + - + - + + 57.13152, 57.03173]" shape="(836,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"/> + 34.37071, 34.42273]" shape="(836,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"/> - + @@ -640,36 +640,36 @@ - + - + - + - + - + - + + 57.13152, 57.03173]" shape="(836,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"/> + 34.37071, 34.42273]" shape="(836,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"/> - + @@ -685,36 +685,36 @@ - + - + - + - + - + - + + 57.13152, 57.03173]" shape="(836,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"/> + 34.37071, 34.42273]" shape="(836,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"/> - + @@ -730,36 +730,36 @@ - + - + - + - + - + - + + 57.13152, 57.03173]" shape="(836,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"/> + 34.37071, 34.42273]" shape="(836,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"/> - + diff --git a/lib/iris/tests/results/name/NAMEIII_trajectory0.cml b/lib/iris/tests/results/name/NAMEIII_trajectory0.cml index d337ca9454..63d092c385 100644 --- a/lib/iris/tests/results/name/NAMEIII_trajectory0.cml +++ b/lib/iris/tests/results/name/NAMEIII_trajectory0.cml @@ -10,36 +10,36 @@ - + - + - + - + - + - + + 57.13152, 57.03173]" shape="(836,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"/> + 34.37071, 34.42273]" shape="(836,)" standard_name="longitude" units="Unit('degrees')" value_type="float64"/> - + diff --git a/lib/iris/tests/results/name/NAMEIII_version2.cml b/lib/iris/tests/results/name/NAMEIII_version2.cml index 0ad0c883a2..7f08b1be02 100644 --- a/lib/iris/tests/results/name/NAMEIII_version2.cml +++ b/lib/iris/tests/results/name/NAMEIII_version2.cml @@ -25,17 +25,17 @@ - + @@ -48,35 +48,34 @@ - + @@ -107,17 +106,17 @@ - + @@ -130,35 +129,34 @@ - + @@ -189,17 +187,17 @@ - + @@ -212,35 +210,34 @@ - + @@ -271,17 +268,17 @@ - + @@ -294,35 +291,34 @@ - + diff --git a/lib/iris/tests/results/name/NAMEII_field.cml b/lib/iris/tests/results/name/NAMEII_field.cml index 7d88c06eff..bd9e5af492 100644 --- a/lib/iris/tests/results/name/NAMEII_field.cml +++ b/lib/iris/tests/results/name/NAMEII_field.cml @@ -19,39 +19,38 @@ - + - + - + - + @@ -80,39 +79,38 @@ - + - + - + - + @@ -141,35 +139,34 @@ - + - + - + - + @@ -202,35 +199,34 @@ - + - + - + - + @@ -263,35 +259,34 @@ - + - + - + - + diff --git a/lib/iris/tests/results/name/NAMEII_field__no_time_averaging.cml b/lib/iris/tests/results/name/NAMEII_field__no_time_averaging.cml index 9bc2c0d1ac..94d830d2df 100644 --- a/lib/iris/tests/results/name/NAMEII_field__no_time_averaging.cml +++ b/lib/iris/tests/results/name/NAMEII_field__no_time_averaging.cml @@ -20,21 +20,21 @@ + [30.0625, 30.1875]]" id="77a50eb5" points="[30. , 30.125]" shape="(2,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> - + - + - + diff --git a/lib/iris/tests/results/name/NAMEII_field__no_time_averaging_0.cml b/lib/iris/tests/results/name/NAMEII_field__no_time_averaging_0.cml index 8d1ad620d0..88e611b8ae 100644 --- a/lib/iris/tests/results/name/NAMEII_field__no_time_averaging_0.cml +++ b/lib/iris/tests/results/name/NAMEII_field__no_time_averaging_0.cml @@ -20,21 +20,21 @@ + [30.0625, 30.1875]]" id="77a50eb5" points="[30. , 30.125]" shape="(2,)" standard_name="latitude" units="Unit('degrees')" value_type="float64"> - + - + - + diff --git a/lib/iris/tests/results/name/NAMEII_timeseries.cml b/lib/iris/tests/results/name/NAMEII_timeseries.cml index 39af8a6288..c3d5cb3e01 100644 --- a/lib/iris/tests/results/name/NAMEII_timeseries.cml +++ b/lib/iris/tests/results/name/NAMEII_timeseries.cml @@ -30,16 +30,16 @@ + [370345.5, 370346.5], + [370346.5, 370347.5], + ..., + [370473.5, 370474.5], + [370474.5, 370475.5], + [370475.5, 370476.5]]" id="cb784457" points="[370345., 370346., 370347., ..., 370474., 370475., + 370476.]" shape="(132,)" standard_name="time" units="Unit('hours since 1970-01-01 00:00:00', calendar='standard')" value_type="float64"/> - + @@ -79,16 +79,16 @@ + [370345.5, 370346.5], + [370346.5, 370347.5], + ..., + [370473.5, 370474.5], + [370474.5, 370475.5], + [370475.5, 370476.5]]" id="cb784457" points="[370345., 370346., 370347., ..., 370474., 370475., + 370476.]" shape="(132,)" standard_name="time" units="Unit('hours since 1970-01-01 00:00:00', calendar='standard')" value_type="float64"/> - + diff --git a/lib/iris/tests/results/netcdf/netcdf_deferred_index_0.cml b/lib/iris/tests/results/netcdf/netcdf_deferred_index_0.cml index 3847d5a417..55a9d96fb5 100644 --- a/lib/iris/tests/results/netcdf/netcdf_deferred_index_0.cml +++ b/lib/iris/tests/results/netcdf/netcdf_deferred_index_0.cml @@ -8,10 +8,12 @@ - + - + diff --git a/lib/iris/tests/results/netcdf/netcdf_deferred_index_1.cml b/lib/iris/tests/results/netcdf/netcdf_deferred_index_1.cml index 89ee5ac195..49fa36bdd0 100644 --- a/lib/iris/tests/results/netcdf/netcdf_deferred_index_1.cml +++ b/lib/iris/tests/results/netcdf/netcdf_deferred_index_1.cml @@ -8,10 +8,11 @@ - + - + diff --git a/lib/iris/tests/results/netcdf/netcdf_deferred_index_2.cml b/lib/iris/tests/results/netcdf/netcdf_deferred_index_2.cml index b3c7709dae..59e6e6dd2a 100644 --- a/lib/iris/tests/results/netcdf/netcdf_deferred_index_2.cml +++ b/lib/iris/tests/results/netcdf/netcdf_deferred_index_2.cml @@ -8,10 +8,10 @@ - + - + diff --git a/lib/iris/tests/results/netcdf/netcdf_deferred_mix_0.cml b/lib/iris/tests/results/netcdf/netcdf_deferred_mix_0.cml index ea5e42150e..8be80d076d 100644 --- a/lib/iris/tests/results/netcdf/netcdf_deferred_mix_0.cml +++ b/lib/iris/tests/results/netcdf/netcdf_deferred_mix_0.cml @@ -8,10 +8,12 @@ - + - + diff --git a/lib/iris/tests/results/netcdf/netcdf_deferred_mix_1.cml b/lib/iris/tests/results/netcdf/netcdf_deferred_mix_1.cml index b028ee6cf8..9801774f95 100644 --- a/lib/iris/tests/results/netcdf/netcdf_deferred_mix_1.cml +++ b/lib/iris/tests/results/netcdf/netcdf_deferred_mix_1.cml @@ -8,7 +8,7 @@ - + diff --git a/lib/iris/tests/results/netcdf/netcdf_deferred_slice_0.cml b/lib/iris/tests/results/netcdf/netcdf_deferred_slice_0.cml index 76f66e1bc4..6c1509d970 100644 --- a/lib/iris/tests/results/netcdf/netcdf_deferred_slice_0.cml +++ b/lib/iris/tests/results/netcdf/netcdf_deferred_slice_0.cml @@ -8,16 +8,18 @@ - + - + + 929226, 929232, 929238, 929244, 929250, 929256, + 929262, 929268, 929274, 929280, 929286, 929292, + 929298, 929304]" shape="(20,)" standard_name="time" units="Unit('hours since 1900-01-01 00:00:0.0', calendar='standard')" value_type="int32" var_name="time"/> diff --git a/lib/iris/tests/results/netcdf/netcdf_deferred_slice_1.cml b/lib/iris/tests/results/netcdf/netcdf_deferred_slice_1.cml index 133cc4f659..d2df8b571c 100644 --- a/lib/iris/tests/results/netcdf/netcdf_deferred_slice_1.cml +++ b/lib/iris/tests/results/netcdf/netcdf_deferred_slice_1.cml @@ -8,14 +8,16 @@ - + - + + 929226, 929232, 929238, 929244]" shape="(10,)" standard_name="time" units="Unit('hours since 1900-01-01 00:00:0.0', calendar='standard')" value_type="int32" var_name="time"/> diff --git a/lib/iris/tests/results/netcdf/netcdf_deferred_slice_2.cml b/lib/iris/tests/results/netcdf/netcdf_deferred_slice_2.cml index 1d7025751e..24765c4020 100644 --- a/lib/iris/tests/results/netcdf/netcdf_deferred_slice_2.cml +++ b/lib/iris/tests/results/netcdf/netcdf_deferred_slice_2.cml @@ -8,10 +8,12 @@ - + - + diff --git a/lib/iris/tests/results/netcdf/netcdf_deferred_tuple_0.cml b/lib/iris/tests/results/netcdf/netcdf_deferred_tuple_0.cml index 1f5a990bd4..6dceb8b067 100644 --- a/lib/iris/tests/results/netcdf/netcdf_deferred_tuple_0.cml +++ b/lib/iris/tests/results/netcdf/netcdf_deferred_tuple_0.cml @@ -8,10 +8,12 @@ - + - + diff --git a/lib/iris/tests/results/netcdf/netcdf_deferred_tuple_1.cml b/lib/iris/tests/results/netcdf/netcdf_deferred_tuple_1.cml index 9c32197e56..e7780ff856 100644 --- a/lib/iris/tests/results/netcdf/netcdf_deferred_tuple_1.cml +++ b/lib/iris/tests/results/netcdf/netcdf_deferred_tuple_1.cml @@ -8,10 +8,12 @@ - + - + diff --git a/lib/iris/tests/results/netcdf/netcdf_deferred_tuple_2.cml b/lib/iris/tests/results/netcdf/netcdf_deferred_tuple_2.cml index 100ab1257c..4118b82422 100644 --- a/lib/iris/tests/results/netcdf/netcdf_deferred_tuple_2.cml +++ b/lib/iris/tests/results/netcdf/netcdf_deferred_tuple_2.cml @@ -8,10 +8,12 @@ - + - + diff --git a/lib/iris/tests/results/netcdf/netcdf_global_xyt_hires.cml b/lib/iris/tests/results/netcdf/netcdf_global_xyt_hires.cml index 22a4ff1989..1dfd4ec937 100644 --- a/lib/iris/tests/results/netcdf/netcdf_global_xyt_hires.cml +++ b/lib/iris/tests/results/netcdf/netcdf_global_xyt_hires.cml @@ -20,69 +20,70 @@ - + - + - + - + diff --git a/lib/iris/tests/results/netcdf/netcdf_global_xyt_total.cml b/lib/iris/tests/results/netcdf/netcdf_global_xyt_total.cml index fc6772e5f0..176bff2046 100644 --- a/lib/iris/tests/results/netcdf/netcdf_global_xyt_total.cml +++ b/lib/iris/tests/results/netcdf/netcdf_global_xyt_total.cml @@ -8,18 +8,20 @@ - + - + + 929226, 929232, 929238, 929244, 929250, 929256, + 929262, 929268, 929274, 929280, 929286, 929292, + 929298, 929304, 929310, 929316, 929322, 929328, + 929334, 929340, 929346, 929352, 929358, 929364, + 929370]" shape="(31,)" standard_name="time" units="Unit('hours since 1900-01-01 00:00:0.0', calendar='standard')" value_type="int32" var_name="time"/> diff --git a/lib/iris/tests/results/netcdf/netcdf_global_xyzt_gems.cml b/lib/iris/tests/results/netcdf/netcdf_global_xyzt_gems.cml index 9d6b3c1e43..855c767206 100644 --- a/lib/iris/tests/results/netcdf/netcdf_global_xyzt_gems.cml +++ b/lib/iris/tests/results/netcdf/netcdf_global_xyzt_gems.cml @@ -7,17 +7,17 @@ - + - + - + @@ -33,17 +33,17 @@ - + - + - + diff --git a/lib/iris/tests/results/netcdf/netcdf_global_xyzt_gems_iter_0.cml b/lib/iris/tests/results/netcdf/netcdf_global_xyzt_gems_iter_0.cml index 15ab300757..7e52524dba 100644 --- a/lib/iris/tests/results/netcdf/netcdf_global_xyzt_gems_iter_0.cml +++ b/lib/iris/tests/results/netcdf/netcdf_global_xyzt_gems_iter_0.cml @@ -7,17 +7,17 @@ - + - + - + diff --git a/lib/iris/tests/results/netcdf/netcdf_global_xyzt_gems_iter_1.cml b/lib/iris/tests/results/netcdf/netcdf_global_xyzt_gems_iter_1.cml index 29ff3b9bd9..baeeec4a53 100644 --- a/lib/iris/tests/results/netcdf/netcdf_global_xyzt_gems_iter_1.cml +++ b/lib/iris/tests/results/netcdf/netcdf_global_xyzt_gems_iter_1.cml @@ -7,17 +7,17 @@ - + - + - + diff --git a/lib/iris/tests/results/netcdf/netcdf_laea.cml b/lib/iris/tests/results/netcdf/netcdf_laea.cml index 799f40522b..cf3f223b23 100644 --- a/lib/iris/tests/results/netcdf/netcdf_laea.cml +++ b/lib/iris/tests/results/netcdf/netcdf_laea.cml @@ -8,62 +8,68 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/netcdf/netcdf_lcc.cml b/lib/iris/tests/results/netcdf/netcdf_lcc.cml index 592c33d534..8239b1802b 100644 --- a/lib/iris/tests/results/netcdf/netcdf_lcc.cml +++ b/lib/iris/tests/results/netcdf/netcdf_lcc.cml @@ -11,84 +11,77 @@ - + - + + 229500, 230500, 231500, 232500, 233500, 234500, + 235500, 236500, 237500, 238500, 239500, 240500, + 241500, 242500, 243500, 244500, 245500, 246500, + 247500, 248500, 249500, 250500, 251500, 252500, + 253500, 254500, 255500, 256500, 257500, 258500, + 259500, 260500, 261500, 262500, 263500, 264500, + 265500, 266500, 267500, 268500, 269500, 270500, + 271500, 272500, 273500, 274500, 275500, 276500, + 277500, 278500, 279500, 280500, 281500, 282500]" shape="(60,)" standard_name="projection_x_coordinate" units="Unit('meters')" value_type="int32" var_name="x"> + 352500, 353500, 354500, 355500, 356500, 357500, + 358500, 359500, 360500, 361500, 362500, 363500, + 364500, 365500, 366500, 367500, 368500, 369500, + 370500, 371500, 372500, 373500, 374500, 375500, + 376500, 377500, 378500, 379500, 380500, 381500, + 382500, 383500, 384500, 385500, 386500, 387500, + 388500, 389500, 390500, 391500, 392500, 393500, + 394500, 395500, 396500, 397500, 398500, 399500, + 400500, 401500, 402500, 403500, 404500, 405500]" shape="(60,)" standard_name="projection_y_coordinate" units="Unit('meters')" value_type="int32" var_name="y"> - + diff --git a/lib/iris/tests/results/netcdf/netcdf_merc.cml b/lib/iris/tests/results/netcdf/netcdf_merc.cml index c06a2efe88..5143b400fe 100644 --- a/lib/iris/tests/results/netcdf/netcdf_merc.cml +++ b/lib/iris/tests/results/netcdf/netcdf_merc.cml @@ -24,48 +24,49 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/netcdf/netcdf_merc_false.cml b/lib/iris/tests/results/netcdf/netcdf_merc_false.cml index 1e50aa6e65..a313169fa1 100644 --- a/lib/iris/tests/results/netcdf/netcdf_merc_false.cml +++ b/lib/iris/tests/results/netcdf/netcdf_merc_false.cml @@ -6,16 +6,16 @@ - + - + diff --git a/lib/iris/tests/results/netcdf/netcdf_merc_scale_factor.cml b/lib/iris/tests/results/netcdf/netcdf_merc_scale_factor.cml index c9ad4ca33f..341961ce35 100644 --- a/lib/iris/tests/results/netcdf/netcdf_merc_scale_factor.cml +++ b/lib/iris/tests/results/netcdf/netcdf_merc_scale_factor.cml @@ -6,12 +6,12 @@ - + - + diff --git a/lib/iris/tests/results/netcdf/netcdf_monotonic.cml b/lib/iris/tests/results/netcdf/netcdf_monotonic.cml index 3385ecd6fe..3692fc9c47 100644 --- a/lib/iris/tests/results/netcdf/netcdf_monotonic.cml +++ b/lib/iris/tests/results/netcdf/netcdf_monotonic.cml @@ -30,7 +30,7 @@ - + @@ -48,7 +48,7 @@ - + diff --git a/lib/iris/tests/results/netcdf/netcdf_polar.cml b/lib/iris/tests/results/netcdf/netcdf_polar.cml index 15c1a90da9..17f0ce1b60 100644 --- a/lib/iris/tests/results/netcdf/netcdf_polar.cml +++ b/lib/iris/tests/results/netcdf/netcdf_polar.cml @@ -24,19 +24,19 @@ - + - + - + diff --git a/lib/iris/tests/results/netcdf/netcdf_rotated_xy_land.cml b/lib/iris/tests/results/netcdf/netcdf_rotated_xy_land.cml index d975768a15..86f9358b60 100644 --- a/lib/iris/tests/results/netcdf/netcdf_rotated_xy_land.cml +++ b/lib/iris/tests/results/netcdf/netcdf_rotated_xy_land.cml @@ -13,57 +13,73 @@ - + - + - + - + diff --git a/lib/iris/tests/results/netcdf/netcdf_rotated_xyt_precipitation.cml b/lib/iris/tests/results/netcdf/netcdf_rotated_xyt_precipitation.cml index 05e5fe475d..aa06d353e1 100644 --- a/lib/iris/tests/results/netcdf/netcdf_rotated_xyt_precipitation.cml +++ b/lib/iris/tests/results/netcdf/netcdf_rotated_xyt_precipitation.cml @@ -11,50 +11,52 @@ - + - + - + - + + [2923.5, 2924.5], + [2924.5, 2925.5], + [2925.5, 2926.5]]" id="2306ff47" long_name="Julian Day" points="[2922.5, 2923.5, 2924.5, 2925.5]" shape="(4,)" standard_name="time" units="Unit('days since 1950-01-01 00:00:00.0', calendar='standard')" value_type="float32" var_name="time"/> diff --git a/lib/iris/tests/results/netcdf/netcdf_save_load_hybrid_height.cml b/lib/iris/tests/results/netcdf/netcdf_save_load_hybrid_height.cml index fbecdf97d3..b7a4699003 100644 --- a/lib/iris/tests/results/netcdf/netcdf_save_load_hybrid_height.cml +++ b/lib/iris/tests/results/netcdf/netcdf_save_load_hybrid_height.cml @@ -9,506 +9,531 @@ - + - + - + - + - + - + - + - + - + @@ -517,8 +542,9 @@ - + diff --git a/lib/iris/tests/results/netcdf/netcdf_save_load_ndim_auxiliary.cml b/lib/iris/tests/results/netcdf/netcdf_save_load_ndim_auxiliary.cml index 54bcc8a686..eb8cb9073f 100644 --- a/lib/iris/tests/results/netcdf/netcdf_save_load_ndim_auxiliary.cml +++ b/lib/iris/tests/results/netcdf/netcdf_save_load_ndim_auxiliary.cml @@ -11,50 +11,52 @@ - + - + - + - + + [2923.5, 2924.5], + [2924.5, 2925.5], + [2925.5, 2926.5]]" id="2306ff47" long_name="Julian Day" points="[2922.5, 2923.5, 2924.5, 2925.5]" shape="(4,)" standard_name="time" units="Unit('days since 1950-01-01 00:00:00.0', calendar='standard')" value_type="float32" var_name="time"/> diff --git a/lib/iris/tests/results/netcdf/netcdf_stereo.cml b/lib/iris/tests/results/netcdf/netcdf_stereo.cml index fae7ff027b..2a2918fa0c 100644 --- a/lib/iris/tests/results/netcdf/netcdf_stereo.cml +++ b/lib/iris/tests/results/netcdf/netcdf_stereo.cml @@ -24,49 +24,49 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/netcdf/netcdf_tmerc_and_climatology.cml b/lib/iris/tests/results/netcdf/netcdf_tmerc_and_climatology.cml index 0575c684a9..747f0c4846 100644 --- a/lib/iris/tests/results/netcdf/netcdf_tmerc_and_climatology.cml +++ b/lib/iris/tests/results/netcdf/netcdf_tmerc_and_climatology.cml @@ -11,58 +11,49 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/netcdf/save_load_traj.cml b/lib/iris/tests/results/netcdf/save_load_traj.cml index 9b225d127f..3bb2951f7a 100644 --- a/lib/iris/tests/results/netcdf/save_load_traj.cml +++ b/lib/iris/tests/results/netcdf/save_load_traj.cml @@ -8,24 +8,26 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/nimrod/levels_below_ground.cml b/lib/iris/tests/results/nimrod/levels_below_ground.cml index c7a5bb1713..7294f8486e 100644 --- a/lib/iris/tests/results/nimrod/levels_below_ground.cml +++ b/lib/iris/tests/results/nimrod/levels_below_ground.cml @@ -3,7 +3,7 @@ - + diff --git a/lib/iris/tests/results/nimrod/load_2flds.cml b/lib/iris/tests/results/nimrod/load_2flds.cml index 41e92dd48b..62ce20b7a9 100644 --- a/lib/iris/tests/results/nimrod/load_2flds.cml +++ b/lib/iris/tests/results/nimrod/load_2flds.cml @@ -11,20 +11,20 @@ - + - + - + diff --git a/lib/iris/tests/results/nimrod/probability_fields.cml b/lib/iris/tests/results/nimrod/probability_fields.cml index 184d205132..a5b84970d4 100644 --- a/lib/iris/tests/results/nimrod/probability_fields.cml +++ b/lib/iris/tests/results/nimrod/probability_fields.cml @@ -20,20 +20,20 @@ - + - + - + @@ -65,10 +65,10 @@ - + @@ -78,12 +78,12 @@ - + - + @@ -114,19 +114,19 @@ - + - + - + @@ -161,25 +161,25 @@ - + - + - + - + @@ -213,24 +213,24 @@ - + - + - + - + @@ -281,12 +281,12 @@ - + - + @@ -321,12 +321,12 @@ - + - + @@ -361,19 +361,19 @@ - + - + - + @@ -405,19 +405,19 @@ - + - + - + @@ -451,12 +451,12 @@ - + - + @@ -487,12 +487,12 @@ - + - + @@ -527,12 +527,12 @@ - + - + @@ -563,12 +563,12 @@ - + - + @@ -603,17 +603,17 @@ - + - + - + @@ -647,17 +647,17 @@ - + - + - + @@ -685,18 +685,18 @@ - + - + - + @@ -723,7 +723,7 @@ - + @@ -732,12 +732,12 @@ - + - + @@ -763,18 +763,18 @@ - + - + - + @@ -804,24 +804,24 @@ - + - + - + + [3.75, 6.25]]" id="573b41e6" points="[0.2, 5. ]" shape="(2,)" units="Unit('mm')" value_type="float32" var_name="threshold"> @@ -850,23 +850,23 @@ - + - + - + - + @@ -898,24 +898,24 @@ - + - + - + + [3. , 5. ]]" id="cecff436" points="[0.2, 4. ]" shape="(2,)" units="Unit('mm hr^-1')" value_type="float32" var_name="threshold"> @@ -946,18 +946,18 @@ - + - + - + @@ -989,18 +989,18 @@ - + - + - + @@ -1026,18 +1026,18 @@ - + - + - + @@ -1064,7 +1064,7 @@ - + @@ -1073,12 +1073,12 @@ - + - + @@ -1113,17 +1113,17 @@ - + - + - + @@ -1156,12 +1156,12 @@ - + - + @@ -1203,12 +1203,12 @@ - + - + @@ -1246,12 +1246,12 @@ - + - + @@ -1293,12 +1293,12 @@ - + - + @@ -1329,19 +1329,19 @@ - + - + - + @@ -1366,25 +1366,25 @@ - + - + - + - + @@ -1414,30 +1414,30 @@ - + - + - + - + - + @@ -1465,30 +1465,30 @@ - + - + - + - + - + @@ -1521,19 +1521,19 @@ - + - + - + @@ -1565,7 +1565,7 @@ - + @@ -1575,12 +1575,12 @@ - + - + @@ -1611,19 +1611,19 @@ - + - + - + @@ -1659,24 +1659,24 @@ - + - + - + - + @@ -1710,24 +1710,24 @@ - + - + - + - + @@ -1760,19 +1760,19 @@ - + - + - + @@ -1803,19 +1803,19 @@ - + - + - + @@ -1841,13 +1841,13 @@ - + - + @@ -1857,12 +1857,12 @@ - + - + diff --git a/lib/iris/tests/results/nimrod/u1096_ng_bmr04_precip_2km.cml b/lib/iris/tests/results/nimrod/u1096_ng_bmr04_precip_2km.cml index a6ed9068ca..354f60857c 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_bmr04_precip_2km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_bmr04_precip_2km.cml @@ -16,18 +16,18 @@ + [6300, 7200]]" id="b40ecfd3" points="[7200, 7200]" shape="(2,)" standard_name="forecast_period" units="Unit('second')" value_type="int32"/> - + - + @@ -36,7 +36,7 @@ + [1580193900, 1580194800]]" id="90a3bd1c" points="[1580194800, 1580194800]" shape="(2,)" standard_name="time" units="Unit('seconds since 1970-01-01 00:00:00', calendar='standard')" value_type="int64"/> diff --git a/lib/iris/tests/results/nimrod/u1096_ng_bsr05_precip_accum60_2km.cml b/lib/iris/tests/results/nimrod/u1096_ng_bsr05_precip_accum60_2km.cml index cf3232d548..03d4482d76 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_bsr05_precip_accum60_2km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_bsr05_precip_accum60_2km.cml @@ -21,12 +21,12 @@ - + - + diff --git a/lib/iris/tests/results/nimrod/u1096_ng_ek00_cloud3d0060_2km.cml b/lib/iris/tests/results/nimrod/u1096_ng_ek00_cloud3d0060_2km.cml index 2aa1576fad..80af248623 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_ek00_cloud3d0060_2km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_ek00_cloud3d0060_2km.cml @@ -20,29 +20,37 @@ - + - + - + @@ -76,23 +84,23 @@ - + - + - + diff --git a/lib/iris/tests/results/nimrod/u1096_ng_ek00_cloud_2km.cml b/lib/iris/tests/results/nimrod/u1096_ng_ek00_cloud_2km.cml index 3dc62cc8e9..2a60aa92a7 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_ek00_cloud_2km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_ek00_cloud_2km.cml @@ -20,12 +20,12 @@ - + - + @@ -59,12 +59,12 @@ - + - + @@ -99,12 +99,12 @@ - + - + @@ -139,12 +139,12 @@ - + - + @@ -178,24 +178,24 @@ - + - + - + @@ -229,12 +229,12 @@ - + - + @@ -259,7 +259,7 @@ - + @@ -271,12 +271,12 @@ - + - + diff --git a/lib/iris/tests/results/nimrod/u1096_ng_ek00_convection_2km.cml b/lib/iris/tests/results/nimrod/u1096_ng_ek00_convection_2km.cml index 9be61d489c..4e3a95118e 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_ek00_convection_2km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_ek00_convection_2km.cml @@ -11,7 +11,7 @@ - + @@ -27,12 +27,12 @@ - + - + @@ -66,12 +66,12 @@ - + - + @@ -105,12 +105,12 @@ - + - + @@ -144,12 +144,12 @@ - + - + @@ -188,12 +188,12 @@ - + - + @@ -234,12 +234,12 @@ - + - + @@ -273,12 +273,12 @@ - + - + @@ -312,17 +312,17 @@ - + - + - + @@ -354,17 +354,17 @@ - + - + - + diff --git a/lib/iris/tests/results/nimrod/u1096_ng_ek00_convwind_2km.cml b/lib/iris/tests/results/nimrod/u1096_ng_ek00_convwind_2km.cml index 734beb7f47..1811f3a613 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_ek00_convwind_2km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_ek00_convwind_2km.cml @@ -11,7 +11,7 @@ - + @@ -27,12 +27,12 @@ - + - + @@ -57,7 +57,7 @@ - + @@ -73,12 +73,12 @@ - + - + @@ -103,7 +103,7 @@ - + @@ -119,12 +119,12 @@ - + - + @@ -149,7 +149,7 @@ - + @@ -165,12 +165,12 @@ - + - + @@ -195,7 +195,7 @@ - + @@ -211,12 +211,12 @@ - + - + @@ -250,19 +250,19 @@ - + - + - + diff --git a/lib/iris/tests/results/nimrod/u1096_ng_ek00_frzlev_2km.cml b/lib/iris/tests/results/nimrod/u1096_ng_ek00_frzlev_2km.cml index 56bfecc1b4..f25eca3dc1 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_ek00_frzlev_2km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_ek00_frzlev_2km.cml @@ -20,12 +20,12 @@ - + - + @@ -59,12 +59,12 @@ - + - + @@ -98,12 +98,12 @@ - + - + @@ -138,12 +138,12 @@ - + - + @@ -178,12 +178,12 @@ - + - + @@ -217,12 +217,12 @@ - + - + @@ -257,12 +257,12 @@ - + - + @@ -297,12 +297,12 @@ - + - + diff --git a/lib/iris/tests/results/nimrod/u1096_ng_ek00_height_2km.cml b/lib/iris/tests/results/nimrod/u1096_ng_ek00_height_2km.cml index 2eb83d787b..6f86ca4825 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_ek00_height_2km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_ek00_height_2km.cml @@ -20,12 +20,12 @@ - + - + diff --git a/lib/iris/tests/results/nimrod/u1096_ng_ek00_precip_2km.cml b/lib/iris/tests/results/nimrod/u1096_ng_ek00_precip_2km.cml index 4f4c986a39..9de3064f95 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_ek00_precip_2km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_ek00_precip_2km.cml @@ -20,12 +20,12 @@ - + - + @@ -60,12 +60,12 @@ - + - + @@ -100,12 +100,12 @@ - + - + diff --git a/lib/iris/tests/results/nimrod/u1096_ng_ek00_precipaccum_2km.cml b/lib/iris/tests/results/nimrod/u1096_ng_ek00_precipaccum_2km.cml index dd6102ea7f..4b02455688 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_ek00_precipaccum_2km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_ek00_precipaccum_2km.cml @@ -16,18 +16,18 @@ + [6300, 7200]]" id="b40ecfd3" points="[7200, 7200]" shape="(2,)" standard_name="forecast_period" units="Unit('second')" value_type="int32"/> - + - + @@ -36,7 +36,7 @@ + [1580186700, 1580187600]]" id="90a3bd1c" points="[1580187600, 1580187600]" shape="(2,)" standard_name="time" units="Unit('seconds since 1970-01-01 00:00:00', calendar='standard')" value_type="int64"/> diff --git a/lib/iris/tests/results/nimrod/u1096_ng_ek00_preciptype_2km.cml b/lib/iris/tests/results/nimrod/u1096_ng_ek00_preciptype_2km.cml index be1e89a53d..9797f7e1c1 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_ek00_preciptype_2km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_ek00_preciptype_2km.cml @@ -20,12 +20,12 @@ - + - + @@ -60,12 +60,12 @@ - + - + @@ -100,12 +100,12 @@ - + - + @@ -139,12 +139,12 @@ - + - + @@ -179,12 +179,12 @@ - + - + @@ -219,12 +219,12 @@ - + - + @@ -258,12 +258,12 @@ - + - + @@ -298,12 +298,12 @@ - + - + @@ -338,12 +338,12 @@ - + - + diff --git a/lib/iris/tests/results/nimrod/u1096_ng_ek00_pressure_2km.cml b/lib/iris/tests/results/nimrod/u1096_ng_ek00_pressure_2km.cml index 9a3ff88df8..8dbf6ea00b 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_ek00_pressure_2km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_ek00_pressure_2km.cml @@ -20,12 +20,12 @@ - + - + @@ -59,12 +59,12 @@ - + - + diff --git a/lib/iris/tests/results/nimrod/u1096_ng_ek00_radiation_2km.cml b/lib/iris/tests/results/nimrod/u1096_ng_ek00_radiation_2km.cml index 00bc65f236..53af61c246 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_ek00_radiation_2km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_ek00_radiation_2km.cml @@ -20,12 +20,12 @@ - + - + @@ -59,12 +59,12 @@ - + - + @@ -98,12 +98,12 @@ - + - + @@ -137,12 +137,12 @@ - + - + @@ -176,12 +176,12 @@ - + - + @@ -215,12 +215,12 @@ - + - + @@ -254,12 +254,12 @@ - + - + diff --git a/lib/iris/tests/results/nimrod/u1096_ng_ek00_radiationuv_2km.cml b/lib/iris/tests/results/nimrod/u1096_ng_ek00_radiationuv_2km.cml index b2cf624214..eea66a698a 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_ek00_radiationuv_2km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_ek00_radiationuv_2km.cml @@ -20,12 +20,12 @@ - + - + @@ -59,12 +59,12 @@ - + - + @@ -98,12 +98,12 @@ - + - + diff --git a/lib/iris/tests/results/nimrod/u1096_ng_ek00_refl_2km.cml b/lib/iris/tests/results/nimrod/u1096_ng_ek00_refl_2km.cml index aaed20394f..7ff6f98296 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_ek00_refl_2km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_ek00_refl_2km.cml @@ -11,9 +11,9 @@ - + @@ -29,12 +29,12 @@ - + - + diff --git a/lib/iris/tests/results/nimrod/u1096_ng_ek00_relhumidity3d0060_2km.cml b/lib/iris/tests/results/nimrod/u1096_ng_ek00_relhumidity3d0060_2km.cml index 3a25dc86fc..4cfec2d195 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_ek00_relhumidity3d0060_2km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_ek00_relhumidity3d0060_2km.cml @@ -20,29 +20,37 @@ - + - + - + diff --git a/lib/iris/tests/results/nimrod/u1096_ng_ek00_relhumidity_2km.cml b/lib/iris/tests/results/nimrod/u1096_ng_ek00_relhumidity_2km.cml index fa4ab30a58..6c58db4f24 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_ek00_relhumidity_2km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_ek00_relhumidity_2km.cml @@ -27,12 +27,12 @@ - + - + diff --git a/lib/iris/tests/results/nimrod/u1096_ng_ek00_snow_2km.cml b/lib/iris/tests/results/nimrod/u1096_ng_ek00_snow_2km.cml index 918a0c7ae5..4110459787 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_ek00_snow_2km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_ek00_snow_2km.cml @@ -20,12 +20,12 @@ - + - + @@ -60,12 +60,12 @@ - + - + @@ -99,12 +99,12 @@ - + - + diff --git a/lib/iris/tests/results/nimrod/u1096_ng_ek00_soil3d0060_2km.cml b/lib/iris/tests/results/nimrod/u1096_ng_ek00_soil3d0060_2km.cml index 3a6c3bf53c..a58304ccca 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_ek00_soil3d0060_2km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_ek00_soil3d0060_2km.cml @@ -11,7 +11,7 @@ - + @@ -27,12 +27,12 @@ - + - + @@ -57,7 +57,7 @@ - + @@ -73,12 +73,12 @@ - + - + @@ -103,7 +103,7 @@ - + @@ -119,12 +119,12 @@ - + - + @@ -149,7 +149,7 @@ - + @@ -165,12 +165,12 @@ - + - + diff --git a/lib/iris/tests/results/nimrod/u1096_ng_ek00_soil_2km.cml b/lib/iris/tests/results/nimrod/u1096_ng_ek00_soil_2km.cml index eab889a8af..bd4c3c1a10 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_ek00_soil_2km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_ek00_soil_2km.cml @@ -20,12 +20,12 @@ - + - + @@ -59,12 +59,12 @@ - + - + @@ -72,9 +72,9 @@ - + @@ -103,12 +103,12 @@ - + - + @@ -116,9 +116,9 @@ - + diff --git a/lib/iris/tests/results/nimrod/u1096_ng_ek00_temperature_2km.cml b/lib/iris/tests/results/nimrod/u1096_ng_ek00_temperature_2km.cml index 6ff6359046..20cbda9ebe 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_ek00_temperature_2km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_ek00_temperature_2km.cml @@ -28,12 +28,12 @@ - + - + @@ -75,12 +75,12 @@ - + - + @@ -121,12 +121,12 @@ - + - + @@ -167,12 +167,12 @@ - + - + diff --git a/lib/iris/tests/results/nimrod/u1096_ng_ek00_visibility_2km.cml b/lib/iris/tests/results/nimrod/u1096_ng_ek00_visibility_2km.cml index 037cb5c2b6..73f4b6bf00 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_ek00_visibility_2km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_ek00_visibility_2km.cml @@ -27,12 +27,12 @@ - + - + @@ -73,12 +73,12 @@ - + - + @@ -119,12 +119,12 @@ - + - + @@ -165,12 +165,12 @@ - + - + @@ -211,12 +211,12 @@ - + - + diff --git a/lib/iris/tests/results/nimrod/u1096_ng_ek00_wind_2km.cml b/lib/iris/tests/results/nimrod/u1096_ng_ek00_wind_2km.cml index 5ca9920172..c2525727c3 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_ek00_wind_2km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_ek00_wind_2km.cml @@ -21,19 +21,19 @@ - + - + - + @@ -67,19 +67,19 @@ - + - + - + @@ -113,19 +113,19 @@ - + - + - + @@ -159,19 +159,19 @@ - + - + - + @@ -205,19 +205,19 @@ - + - + - + @@ -252,19 +252,19 @@ - + - + - + diff --git a/lib/iris/tests/results/nimrod/u1096_ng_ek00_winduv3d0015_2km.cml b/lib/iris/tests/results/nimrod/u1096_ng_ek00_winduv3d0015_2km.cml index 91c40ea6d0..4fb8590608 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_ek00_winduv3d0015_2km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_ek00_winduv3d0015_2km.cml @@ -20,19 +20,19 @@ - + - + - + @@ -66,19 +66,19 @@ - + - + - + diff --git a/lib/iris/tests/results/nimrod/u1096_ng_ek00_winduv_2km.cml b/lib/iris/tests/results/nimrod/u1096_ng_ek00_winduv_2km.cml index 3252dbf047..eb45fd6f84 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_ek00_winduv_2km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_ek00_winduv_2km.cml @@ -20,19 +20,19 @@ - + - + - + @@ -66,19 +66,19 @@ - + - + - + diff --git a/lib/iris/tests/results/nimrod/u1096_ng_ek01_cape_2km.cml b/lib/iris/tests/results/nimrod/u1096_ng_ek01_cape_2km.cml index d39fa0e367..8a3c428f7f 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_ek01_cape_2km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_ek01_cape_2km.cml @@ -20,12 +20,12 @@ - + - + @@ -59,12 +59,12 @@ - + - + @@ -101,12 +101,12 @@ - + - + @@ -140,12 +140,12 @@ - + - + @@ -179,12 +179,12 @@ - + - + @@ -218,12 +218,12 @@ - + - + diff --git a/lib/iris/tests/results/nimrod/u1096_ng_ek07_precip0540_accum180_18km.cml b/lib/iris/tests/results/nimrod/u1096_ng_ek07_precip0540_accum180_18km.cml index 4a5783ecb3..d4e53c93f7 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_ek07_precip0540_accum180_18km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_ek07_precip0540_accum180_18km.cml @@ -21,12 +21,12 @@ - + - + diff --git a/lib/iris/tests/results/nimrod/u1096_ng_umqv_fog_2km.cml b/lib/iris/tests/results/nimrod/u1096_ng_umqv_fog_2km.cml index d2c7e72848..706083f09d 100644 --- a/lib/iris/tests/results/nimrod/u1096_ng_umqv_fog_2km.cml +++ b/lib/iris/tests/results/nimrod/u1096_ng_umqv_fog_2km.cml @@ -27,12 +27,12 @@ - + - + @@ -40,8 +40,8 @@ - + diff --git a/lib/iris/tests/results/pandas/as_cube/data_frame_datetime_standard.cml b/lib/iris/tests/results/pandas/as_cube/data_frame_datetime_standard.cml index 84280753c7..762b535ee4 100644 --- a/lib/iris/tests/results/pandas/as_cube/data_frame_datetime_standard.cml +++ b/lib/iris/tests/results/pandas/as_cube/data_frame_datetime_standard.cml @@ -6,7 +6,7 @@ - + diff --git a/lib/iris/tests/results/pandas/as_cube/data_frame_multidim.cml b/lib/iris/tests/results/pandas/as_cube/data_frame_multidim.cml index d377fa72d8..56b78b9a78 100644 --- a/lib/iris/tests/results/pandas/as_cube/data_frame_multidim.cml +++ b/lib/iris/tests/results/pandas/as_cube/data_frame_multidim.cml @@ -3,7 +3,7 @@ - + diff --git a/lib/iris/tests/results/pandas/as_cube/data_frame_netcdftime_360.cml b/lib/iris/tests/results/pandas/as_cube/data_frame_netcdftime_360.cml index 39bc96f8e3..8d0981264b 100644 --- a/lib/iris/tests/results/pandas/as_cube/data_frame_netcdftime_360.cml +++ b/lib/iris/tests/results/pandas/as_cube/data_frame_netcdftime_360.cml @@ -6,7 +6,7 @@ - + diff --git a/lib/iris/tests/results/pandas/as_cube/series_datetime_standard.cml b/lib/iris/tests/results/pandas/as_cube/series_datetime_standard.cml index 5cb621d5f3..f8ecf3bccf 100644 --- a/lib/iris/tests/results/pandas/as_cube/series_datetime_standard.cml +++ b/lib/iris/tests/results/pandas/as_cube/series_datetime_standard.cml @@ -3,8 +3,9 @@ - + diff --git a/lib/iris/tests/results/pandas/as_cube/series_netcdfimte_360.cml b/lib/iris/tests/results/pandas/as_cube/series_netcdfimte_360.cml index 0d9c4e149e..cef7b642d8 100644 --- a/lib/iris/tests/results/pandas/as_cube/series_netcdfimte_360.cml +++ b/lib/iris/tests/results/pandas/as_cube/series_netcdfimte_360.cml @@ -3,8 +3,9 @@ - + diff --git a/lib/iris/tests/results/pp_load_rules/global.cml b/lib/iris/tests/results/pp_load_rules/global.cml index a69e633e26..a013add0cb 100644 --- a/lib/iris/tests/results/pp_load_rules/global.cml +++ b/lib/iris/tests/results/pp_load_rules/global.cml @@ -7,37 +7,63 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/pp_load_rules/lbproc_mean_max_min.cml b/lib/iris/tests/results/pp_load_rules/lbproc_mean_max_min.cml index ecf51190c7..49fafdf8ca 100644 --- a/lib/iris/tests/results/pp_load_rules/lbproc_mean_max_min.cml +++ b/lib/iris/tests/results/pp_load_rules/lbproc_mean_max_min.cml @@ -8,10 +8,10 @@ - + - + @@ -21,17 +21,19 @@ - + - + - + @@ -45,10 +47,10 @@ - + - + @@ -58,17 +60,19 @@ - + - + - + @@ -86,10 +90,10 @@ - + - + @@ -99,17 +103,19 @@ - + - + - + @@ -127,10 +133,10 @@ - + - + @@ -140,17 +146,19 @@ - + - + - + @@ -168,29 +176,33 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/pp_load_rules/lbtim_2.cml b/lib/iris/tests/results/pp_load_rules/lbtim_2.cml index 8ce7dd472c..5d43911642 100644 --- a/lib/iris/tests/results/pp_load_rules/lbtim_2.cml +++ b/lib/iris/tests/results/pp_load_rules/lbtim_2.cml @@ -7,32 +7,46 @@ - + - + - + - + diff --git a/lib/iris/tests/results/pp_load_rules/ocean_depth.cml b/lib/iris/tests/results/pp_load_rules/ocean_depth.cml index 9c33acdac4..ccd4557dce 100644 --- a/lib/iris/tests/results/pp_load_rules/ocean_depth.cml +++ b/lib/iris/tests/results/pp_load_rules/ocean_depth.cml @@ -7,35 +7,50 @@ - + - + - + - + - + @@ -47,7 +62,7 @@ - + diff --git a/lib/iris/tests/results/pp_load_rules/ocean_depth_bounded.cml b/lib/iris/tests/results/pp_load_rules/ocean_depth_bounded.cml index 5a959ad027..cb785002fd 100644 --- a/lib/iris/tests/results/pp_load_rules/ocean_depth_bounded.cml +++ b/lib/iris/tests/results/pp_load_rules/ocean_depth_bounded.cml @@ -7,39 +7,54 @@ - + - + - + - + - + @@ -51,7 +66,7 @@ - + diff --git a/lib/iris/tests/results/pp_load_rules/rotated_uk.cml b/lib/iris/tests/results/pp_load_rules/rotated_uk.cml index ece399df4e..ae0f6c3a03 100644 --- a/lib/iris/tests/results/pp_load_rules/rotated_uk.cml +++ b/lib/iris/tests/results/pp_load_rules/rotated_uk.cml @@ -8,34 +8,35 @@ - + - + - + - + - + - + - + diff --git a/lib/iris/tests/results/stock/realistic_4d.cml b/lib/iris/tests/results/stock/realistic_4d.cml index 6640c54360..ea7b7c6f5a 100644 --- a/lib/iris/tests/results/stock/realistic_4d.cml +++ b/lib/iris/tests/results/stock/realistic_4d.cml @@ -6,499 +6,522 @@ - + - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/system/supported_filetype_.grib2.cml b/lib/iris/tests/results/system/supported_filetype_.grib2.cml deleted file mode 100644 index 5376af2fe1..0000000000 --- a/lib/iris/tests/results/system/supported_filetype_.grib2.cml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/lib/iris/tests/results/system/supported_filetype_.nc.cml b/lib/iris/tests/results/system/supported_filetype_.nc.cml index 6ad0a3b176..4fe3faea62 100644 --- a/lib/iris/tests/results/system/supported_filetype_.nc.cml +++ b/lib/iris/tests/results/system/supported_filetype_.nc.cml @@ -9,26 +9,22 @@ - + - + diff --git a/lib/iris/tests/results/system/supported_filetype_.pp.cml b/lib/iris/tests/results/system/supported_filetype_.pp.cml index e457b2921e..bfb54e9d7b 100644 --- a/lib/iris/tests/results/system/supported_filetype_.pp.cml +++ b/lib/iris/tests/results/system/supported_filetype_.pp.cml @@ -3,40 +3,36 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/trajectory/constant_latitude.cml b/lib/iris/tests/results/trajectory/constant_latitude.cml index 38c208b825..28ab781a9c 100644 --- a/lib/iris/tests/results/trajectory/constant_latitude.cml +++ b/lib/iris/tests/results/trajectory/constant_latitude.cml @@ -8,89 +8,103 @@ - + - + - + - + - + - + - + - + diff --git a/lib/iris/tests/results/trajectory/hybrid_height.cml b/lib/iris/tests/results/trajectory/hybrid_height.cml index 28e821b900..4a443704aa 100644 --- a/lib/iris/tests/results/trajectory/hybrid_height.cml +++ b/lib/iris/tests/results/trajectory/hybrid_height.cml @@ -4,28 +4,28 @@ + [[5343, 5396, 5449, 5502, 5555, 5608], + [5661, 5714, 5767, 5820, 5873, 5926], + [5979, 6032, 6085, 6138, 6191, 6244], + [6297, 6350, 6403, 6456, 6509, 6562], + [6615, 6668, 6721, 6774, 6827, 6880]]]" shape="(4, 5, 6)" standard_name="altitude" units="Unit('m')" value_type="int64"> @@ -48,10 +48,10 @@ + [106, 107, 108, 109, 110, 111], + [112, 113, 114, 115, 116, 117], + [118, 119, 120, 121, 122, 123], + [124, 125, 126, 127, 128, 129]]" shape="(5, 6)" units="Unit('m')" value_type="int64"/> @@ -64,9 +64,9 @@ + [5192, 5855, 6212, 6569], + [5294, 5970, 6334, 6698], + [5396, 6085, 6456, 6827]]" shape="(4, 4)" standard_name="altitude" units="Unit('m')" value_type="int64"> diff --git a/lib/iris/tests/results/trajectory/single_point.cml b/lib/iris/tests/results/trajectory/single_point.cml index 64c71e0394..37d9e98ba7 100644 --- a/lib/iris/tests/results/trajectory/single_point.cml +++ b/lib/iris/tests/results/trajectory/single_point.cml @@ -8,11 +8,12 @@ - + - + @@ -25,70 +26,83 @@ - + - + - + - + diff --git a/lib/iris/tests/results/trajectory/tri_polar_latitude_slice.cml b/lib/iris/tests/results/trajectory/tri_polar_latitude_slice.cml index 7b5bbfc086..fef87e7945 100644 --- a/lib/iris/tests/results/trajectory/tri_polar_latitude_slice.cml +++ b/lib/iris/tests/results/trajectory/tri_polar_latitude_slice.cml @@ -30,43 +30,47 @@ - + @@ -76,25 +80,35 @@ - + @@ -103,26 +117,35 @@ - + @@ -131,7 +154,7 @@ - + diff --git a/lib/iris/tests/results/trajectory/zigzag.cml b/lib/iris/tests/results/trajectory/zigzag.cml index 8a578c4ab4..71fd9ff0e5 100644 --- a/lib/iris/tests/results/trajectory/zigzag.cml +++ b/lib/iris/tests/results/trajectory/zigzag.cml @@ -8,37 +8,35 @@ - + - + - + - + - + @@ -52,10 +50,10 @@ - + - + diff --git a/lib/iris/tests/results/unit/analysis/cartography/project/TestAll/cube.cml b/lib/iris/tests/results/unit/analysis/cartography/project/TestAll/cube.cml index 2592307cda..b89de9d558 100644 --- a/lib/iris/tests/results/unit/analysis/cartography/project/TestAll/cube.cml +++ b/lib/iris/tests/results/unit/analysis/cartography/project/TestAll/cube.cml @@ -6,51 +6,54 @@ - + - + - + - + @@ -62,24 +65,25 @@ - + + -2587546.39953, -862515.46651, 862515.46651, + 2587546.39953, 4312577.33255, 6037608.26557, + 7762639.19859]" shape="(10,)" standard_name="projection_y_coordinate" units="Unit('m')" value_type="float64"/> - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/_arith__derived_coords/TestBroadcastingDerived/collapse_all_dims.cml b/lib/iris/tests/results/unit/analysis/maths/_arith__derived_coords/TestBroadcastingDerived/collapse_all_dims.cml index 1e74c9bc9c..9c4d58edc1 100644 --- a/lib/iris/tests/results/unit/analysis/maths/_arith__derived_coords/TestBroadcastingDerived/collapse_all_dims.cml +++ b/lib/iris/tests/results/unit/analysis/maths/_arith__derived_coords/TestBroadcastingDerived/collapse_all_dims.cml @@ -6,499 +6,522 @@ - + - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/_arith__derived_coords/TestBroadcastingDerived/collapse_last_dims.cml b/lib/iris/tests/results/unit/analysis/maths/_arith__derived_coords/TestBroadcastingDerived/collapse_last_dims.cml index 1e74c9bc9c..9c4d58edc1 100644 --- a/lib/iris/tests/results/unit/analysis/maths/_arith__derived_coords/TestBroadcastingDerived/collapse_last_dims.cml +++ b/lib/iris/tests/results/unit/analysis/maths/_arith__derived_coords/TestBroadcastingDerived/collapse_last_dims.cml @@ -6,499 +6,522 @@ - + - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/_arith__derived_coords/TestBroadcastingDerived/collapse_middle_dim.cml b/lib/iris/tests/results/unit/analysis/maths/_arith__derived_coords/TestBroadcastingDerived/collapse_middle_dim.cml index 1e74c9bc9c..9c4d58edc1 100644 --- a/lib/iris/tests/results/unit/analysis/maths/_arith__derived_coords/TestBroadcastingDerived/collapse_middle_dim.cml +++ b/lib/iris/tests/results/unit/analysis/maths/_arith__derived_coords/TestBroadcastingDerived/collapse_middle_dim.cml @@ -6,499 +6,522 @@ - + - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/_arith__derived_coords/TestBroadcastingDerived/collapse_zeroth_dim.cml b/lib/iris/tests/results/unit/analysis/maths/_arith__derived_coords/TestBroadcastingDerived/collapse_zeroth_dim.cml index 1e74c9bc9c..9c4d58edc1 100644 --- a/lib/iris/tests/results/unit/analysis/maths/_arith__derived_coords/TestBroadcastingDerived/collapse_zeroth_dim.cml +++ b/lib/iris/tests/results/unit/analysis/maths/_arith__derived_coords/TestBroadcastingDerived/collapse_zeroth_dim.cml @@ -6,499 +6,522 @@ - + - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/_arith__derived_coords/TestBroadcastingDerived/slice.cml b/lib/iris/tests/results/unit/analysis/maths/_arith__derived_coords/TestBroadcastingDerived/slice.cml index 1e74c9bc9c..9c4d58edc1 100644 --- a/lib/iris/tests/results/unit/analysis/maths/_arith__derived_coords/TestBroadcastingDerived/slice.cml +++ b/lib/iris/tests/results/unit/analysis/maths/_arith__derived_coords/TestBroadcastingDerived/slice.cml @@ -6,499 +6,522 @@ - + - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/_arith__derived_coords/TestBroadcastingDerived/transposed.cml b/lib/iris/tests/results/unit/analysis/maths/_arith__derived_coords/TestBroadcastingDerived/transposed.cml index 1e74c9bc9c..9c4d58edc1 100644 --- a/lib/iris/tests/results/unit/analysis/maths/_arith__derived_coords/TestBroadcastingDerived/transposed.cml +++ b/lib/iris/tests/results/unit/analysis/maths/_arith__derived_coords/TestBroadcastingDerived/transposed.cml @@ -6,499 +6,522 @@ - + - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMesh/collapse_all_dims.cml b/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMesh/collapse_all_dims.cml index e318abad67..e45b9bfff7 100644 --- a/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMesh/collapse_all_dims.cml +++ b/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMesh/collapse_all_dims.cml @@ -6,44 +6,54 @@ - + - + + [1204, 1205, 1206, 1207], + [1208, 1209, 1210, 1211], + ..., + [1288, 1289, 1290, 1291], + [1292, 1293, 1294, 1295], + [1296, 1297, 1298, 1299]]" id="c83ed0ee" points="[3200, 3201, 3202, ..., 3297, 3298, 3299]" shape="(100,)" standard_name="latitude" units="Unit('unknown')" value_type="int64"/> - + @@ -54,56 +64,59 @@ + [1104, 1105, 1106, 1107], + [1108, 1109, 1110, 1111], + ..., + [1188, 1189, 1190, 1191], + [1192, 1193, 1194, 1195], + [1196, 1197, 1198, 1199]]" id="e0db29d6" points="[3100, 3101, 3102, ..., 3197, 3198, 3199]" shape="(100,)" standard_name="longitude" units="Unit('unknown')" value_type="int64"/> - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMesh/collapse_last_dims.cml b/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMesh/collapse_last_dims.cml index e318abad67..e45b9bfff7 100644 --- a/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMesh/collapse_last_dims.cml +++ b/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMesh/collapse_last_dims.cml @@ -6,44 +6,54 @@ - + - + + [1204, 1205, 1206, 1207], + [1208, 1209, 1210, 1211], + ..., + [1288, 1289, 1290, 1291], + [1292, 1293, 1294, 1295], + [1296, 1297, 1298, 1299]]" id="c83ed0ee" points="[3200, 3201, 3202, ..., 3297, 3298, 3299]" shape="(100,)" standard_name="latitude" units="Unit('unknown')" value_type="int64"/> - + @@ -54,56 +64,59 @@ + [1104, 1105, 1106, 1107], + [1108, 1109, 1110, 1111], + ..., + [1188, 1189, 1190, 1191], + [1192, 1193, 1194, 1195], + [1196, 1197, 1198, 1199]]" id="e0db29d6" points="[3100, 3101, 3102, ..., 3197, 3198, 3199]" shape="(100,)" standard_name="longitude" units="Unit('unknown')" value_type="int64"/> - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMesh/collapse_middle_dim.cml b/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMesh/collapse_middle_dim.cml index 82c79a7577..3d2e341c11 100644 --- a/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMesh/collapse_middle_dim.cml +++ b/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMesh/collapse_middle_dim.cml @@ -6,41 +6,51 @@ - + - + + [1204, 1205, 1206, 1207], + [1208, 1209, 1210, 1211], + ..., + [1288, 1289, 1290, 1291], + [1292, 1293, 1294, 1295], + [1296, 1297, 1298, 1299]]" id="c83ed0ee" points="[3200, 3201, 3202, ..., 3297, 3298, 3299]" shape="(100,)" standard_name="latitude" units="Unit('unknown')" value_type="int64"/> - + @@ -48,56 +58,59 @@ + [1104, 1105, 1106, 1107], + [1108, 1109, 1110, 1111], + ..., + [1188, 1189, 1190, 1191], + [1192, 1193, 1194, 1195], + [1196, 1197, 1198, 1199]]" id="e0db29d6" points="[3100, 3101, 3102, ..., 3197, 3198, 3199]" shape="(100,)" standard_name="longitude" units="Unit('unknown')" value_type="int64"/> - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMesh/collapse_zeroth_dim.cml b/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMesh/collapse_zeroth_dim.cml index 82c79a7577..3d2e341c11 100644 --- a/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMesh/collapse_zeroth_dim.cml +++ b/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMesh/collapse_zeroth_dim.cml @@ -6,41 +6,51 @@ - + - + + [1204, 1205, 1206, 1207], + [1208, 1209, 1210, 1211], + ..., + [1288, 1289, 1290, 1291], + [1292, 1293, 1294, 1295], + [1296, 1297, 1298, 1299]]" id="c83ed0ee" points="[3200, 3201, 3202, ..., 3297, 3298, 3299]" shape="(100,)" standard_name="latitude" units="Unit('unknown')" value_type="int64"/> - + @@ -48,56 +58,59 @@ + [1104, 1105, 1106, 1107], + [1108, 1109, 1110, 1111], + ..., + [1188, 1189, 1190, 1191], + [1192, 1193, 1194, 1195], + [1196, 1197, 1198, 1199]]" id="e0db29d6" points="[3100, 3101, 3102, ..., 3197, 3198, 3199]" shape="(100,)" standard_name="longitude" units="Unit('unknown')" value_type="int64"/> - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMesh/slice.cml b/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMesh/slice.cml index 82c79a7577..3d2e341c11 100644 --- a/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMesh/slice.cml +++ b/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMesh/slice.cml @@ -6,41 +6,51 @@ - + - + + [1204, 1205, 1206, 1207], + [1208, 1209, 1210, 1211], + ..., + [1288, 1289, 1290, 1291], + [1292, 1293, 1294, 1295], + [1296, 1297, 1298, 1299]]" id="c83ed0ee" points="[3200, 3201, 3202, ..., 3297, 3298, 3299]" shape="(100,)" standard_name="latitude" units="Unit('unknown')" value_type="int64"/> - + @@ -48,56 +58,59 @@ + [1104, 1105, 1106, 1107], + [1108, 1109, 1110, 1111], + ..., + [1188, 1189, 1190, 1191], + [1192, 1193, 1194, 1195], + [1196, 1197, 1198, 1199]]" id="e0db29d6" points="[3100, 3101, 3102, ..., 3197, 3198, 3199]" shape="(100,)" standard_name="longitude" units="Unit('unknown')" value_type="int64"/> - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMesh/transposed.cml b/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMesh/transposed.cml index 82c79a7577..3d2e341c11 100644 --- a/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMesh/transposed.cml +++ b/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMesh/transposed.cml @@ -6,41 +6,51 @@ - + - + + [1204, 1205, 1206, 1207], + [1208, 1209, 1210, 1211], + ..., + [1288, 1289, 1290, 1291], + [1292, 1293, 1294, 1295], + [1296, 1297, 1298, 1299]]" id="c83ed0ee" points="[3200, 3201, 3202, ..., 3297, 3298, 3299]" shape="(100,)" standard_name="latitude" units="Unit('unknown')" value_type="int64"/> - + @@ -48,56 +58,59 @@ + [1104, 1105, 1106, 1107], + [1108, 1109, 1110, 1111], + ..., + [1188, 1189, 1190, 1191], + [1192, 1193, 1194, 1195], + [1196, 1197, 1198, 1199]]" id="e0db29d6" points="[3100, 3101, 3102, ..., 3197, 3198, 3199]" shape="(100,)" standard_name="longitude" units="Unit('unknown')" value_type="int64"/> - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMeshAndDerived/collapse_all_dims.cml b/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMeshAndDerived/collapse_all_dims.cml index e318abad67..e45b9bfff7 100644 --- a/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMeshAndDerived/collapse_all_dims.cml +++ b/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMeshAndDerived/collapse_all_dims.cml @@ -6,44 +6,54 @@ - + - + + [1204, 1205, 1206, 1207], + [1208, 1209, 1210, 1211], + ..., + [1288, 1289, 1290, 1291], + [1292, 1293, 1294, 1295], + [1296, 1297, 1298, 1299]]" id="c83ed0ee" points="[3200, 3201, 3202, ..., 3297, 3298, 3299]" shape="(100,)" standard_name="latitude" units="Unit('unknown')" value_type="int64"/> - + @@ -54,56 +64,59 @@ + [1104, 1105, 1106, 1107], + [1108, 1109, 1110, 1111], + ..., + [1188, 1189, 1190, 1191], + [1192, 1193, 1194, 1195], + [1196, 1197, 1198, 1199]]" id="e0db29d6" points="[3100, 3101, 3102, ..., 3197, 3198, 3199]" shape="(100,)" standard_name="longitude" units="Unit('unknown')" value_type="int64"/> - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMeshAndDerived/collapse_last_dims.cml b/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMeshAndDerived/collapse_last_dims.cml index e318abad67..e45b9bfff7 100644 --- a/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMeshAndDerived/collapse_last_dims.cml +++ b/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMeshAndDerived/collapse_last_dims.cml @@ -6,44 +6,54 @@ - + - + + [1204, 1205, 1206, 1207], + [1208, 1209, 1210, 1211], + ..., + [1288, 1289, 1290, 1291], + [1292, 1293, 1294, 1295], + [1296, 1297, 1298, 1299]]" id="c83ed0ee" points="[3200, 3201, 3202, ..., 3297, 3298, 3299]" shape="(100,)" standard_name="latitude" units="Unit('unknown')" value_type="int64"/> - + @@ -54,56 +64,59 @@ + [1104, 1105, 1106, 1107], + [1108, 1109, 1110, 1111], + ..., + [1188, 1189, 1190, 1191], + [1192, 1193, 1194, 1195], + [1196, 1197, 1198, 1199]]" id="e0db29d6" points="[3100, 3101, 3102, ..., 3197, 3198, 3199]" shape="(100,)" standard_name="longitude" units="Unit('unknown')" value_type="int64"/> - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMeshAndDerived/collapse_middle_dim.cml b/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMeshAndDerived/collapse_middle_dim.cml index 82c79a7577..3d2e341c11 100644 --- a/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMeshAndDerived/collapse_middle_dim.cml +++ b/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMeshAndDerived/collapse_middle_dim.cml @@ -6,41 +6,51 @@ - + - + + [1204, 1205, 1206, 1207], + [1208, 1209, 1210, 1211], + ..., + [1288, 1289, 1290, 1291], + [1292, 1293, 1294, 1295], + [1296, 1297, 1298, 1299]]" id="c83ed0ee" points="[3200, 3201, 3202, ..., 3297, 3298, 3299]" shape="(100,)" standard_name="latitude" units="Unit('unknown')" value_type="int64"/> - + @@ -48,56 +58,59 @@ + [1104, 1105, 1106, 1107], + [1108, 1109, 1110, 1111], + ..., + [1188, 1189, 1190, 1191], + [1192, 1193, 1194, 1195], + [1196, 1197, 1198, 1199]]" id="e0db29d6" points="[3100, 3101, 3102, ..., 3197, 3198, 3199]" shape="(100,)" standard_name="longitude" units="Unit('unknown')" value_type="int64"/> - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMeshAndDerived/collapse_zeroth_dim.cml b/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMeshAndDerived/collapse_zeroth_dim.cml index 82c79a7577..3d2e341c11 100644 --- a/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMeshAndDerived/collapse_zeroth_dim.cml +++ b/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMeshAndDerived/collapse_zeroth_dim.cml @@ -6,41 +6,51 @@ - + - + + [1204, 1205, 1206, 1207], + [1208, 1209, 1210, 1211], + ..., + [1288, 1289, 1290, 1291], + [1292, 1293, 1294, 1295], + [1296, 1297, 1298, 1299]]" id="c83ed0ee" points="[3200, 3201, 3202, ..., 3297, 3298, 3299]" shape="(100,)" standard_name="latitude" units="Unit('unknown')" value_type="int64"/> - + @@ -48,56 +58,59 @@ + [1104, 1105, 1106, 1107], + [1108, 1109, 1110, 1111], + ..., + [1188, 1189, 1190, 1191], + [1192, 1193, 1194, 1195], + [1196, 1197, 1198, 1199]]" id="e0db29d6" points="[3100, 3101, 3102, ..., 3197, 3198, 3199]" shape="(100,)" standard_name="longitude" units="Unit('unknown')" value_type="int64"/> - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMeshAndDerived/slice.cml b/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMeshAndDerived/slice.cml index 82c79a7577..3d2e341c11 100644 --- a/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMeshAndDerived/slice.cml +++ b/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMeshAndDerived/slice.cml @@ -6,41 +6,51 @@ - + - + + [1204, 1205, 1206, 1207], + [1208, 1209, 1210, 1211], + ..., + [1288, 1289, 1290, 1291], + [1292, 1293, 1294, 1295], + [1296, 1297, 1298, 1299]]" id="c83ed0ee" points="[3200, 3201, 3202, ..., 3297, 3298, 3299]" shape="(100,)" standard_name="latitude" units="Unit('unknown')" value_type="int64"/> - + @@ -48,56 +58,59 @@ + [1104, 1105, 1106, 1107], + [1108, 1109, 1110, 1111], + ..., + [1188, 1189, 1190, 1191], + [1192, 1193, 1194, 1195], + [1196, 1197, 1198, 1199]]" id="e0db29d6" points="[3100, 3101, 3102, ..., 3197, 3198, 3199]" shape="(100,)" standard_name="longitude" units="Unit('unknown')" value_type="int64"/> - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMeshAndDerived/transposed.cml b/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMeshAndDerived/transposed.cml index 82c79a7577..3d2e341c11 100644 --- a/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMeshAndDerived/transposed.cml +++ b/lib/iris/tests/results/unit/analysis/maths/_arith__meshcoords/TestBroadcastingWithMeshAndDerived/transposed.cml @@ -6,41 +6,51 @@ - + - + + [1204, 1205, 1206, 1207], + [1208, 1209, 1210, 1211], + ..., + [1288, 1289, 1290, 1291], + [1292, 1293, 1294, 1295], + [1296, 1297, 1298, 1299]]" id="c83ed0ee" points="[3200, 3201, 3202, ..., 3297, 3298, 3299]" shape="(100,)" standard_name="latitude" units="Unit('unknown')" value_type="int64"/> - + @@ -48,56 +58,59 @@ + [1104, 1105, 1106, 1107], + [1108, 1109, 1110, 1111], + ..., + [1188, 1189, 1190, 1191], + [1192, 1193, 1194, 1195], + [1196, 1197, 1198, 1199]]" id="e0db29d6" points="[3100, 3101, 3102, ..., 3197, 3198, 3199]" shape="(100,)" standard_name="longitude" units="Unit('unknown')" value_type="int64"/> - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/add/TestBroadcasting/collapse_all_dims.cml b/lib/iris/tests/results/unit/analysis/maths/add/TestBroadcasting/collapse_all_dims.cml index 8467544d44..5c169b2319 100644 --- a/lib/iris/tests/results/unit/analysis/maths/add/TestBroadcasting/collapse_all_dims.cml +++ b/lib/iris/tests/results/unit/analysis/maths/add/TestBroadcasting/collapse_all_dims.cml @@ -6,111 +6,125 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/add/TestBroadcasting/collapse_last_dims.cml b/lib/iris/tests/results/unit/analysis/maths/add/TestBroadcasting/collapse_last_dims.cml index 8467544d44..5c169b2319 100644 --- a/lib/iris/tests/results/unit/analysis/maths/add/TestBroadcasting/collapse_last_dims.cml +++ b/lib/iris/tests/results/unit/analysis/maths/add/TestBroadcasting/collapse_last_dims.cml @@ -6,111 +6,125 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/add/TestBroadcasting/collapse_middle_dim.cml b/lib/iris/tests/results/unit/analysis/maths/add/TestBroadcasting/collapse_middle_dim.cml index 8467544d44..5c169b2319 100644 --- a/lib/iris/tests/results/unit/analysis/maths/add/TestBroadcasting/collapse_middle_dim.cml +++ b/lib/iris/tests/results/unit/analysis/maths/add/TestBroadcasting/collapse_middle_dim.cml @@ -6,111 +6,125 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/add/TestBroadcasting/collapse_zeroth_dim.cml b/lib/iris/tests/results/unit/analysis/maths/add/TestBroadcasting/collapse_zeroth_dim.cml index 8467544d44..5c169b2319 100644 --- a/lib/iris/tests/results/unit/analysis/maths/add/TestBroadcasting/collapse_zeroth_dim.cml +++ b/lib/iris/tests/results/unit/analysis/maths/add/TestBroadcasting/collapse_zeroth_dim.cml @@ -6,111 +6,125 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/add/TestBroadcasting/slice.cml b/lib/iris/tests/results/unit/analysis/maths/add/TestBroadcasting/slice.cml index 8467544d44..5c169b2319 100644 --- a/lib/iris/tests/results/unit/analysis/maths/add/TestBroadcasting/slice.cml +++ b/lib/iris/tests/results/unit/analysis/maths/add/TestBroadcasting/slice.cml @@ -6,111 +6,125 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/add/TestBroadcasting/transposed.cml b/lib/iris/tests/results/unit/analysis/maths/add/TestBroadcasting/transposed.cml index 8467544d44..5c169b2319 100644 --- a/lib/iris/tests/results/unit/analysis/maths/add/TestBroadcasting/transposed.cml +++ b/lib/iris/tests/results/unit/analysis/maths/add/TestBroadcasting/transposed.cml @@ -6,111 +6,125 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/divide/TestBroadcasting/collapse_all_dims.cml b/lib/iris/tests/results/unit/analysis/maths/divide/TestBroadcasting/collapse_all_dims.cml index 86d7855b1b..206244f3c7 100644 --- a/lib/iris/tests/results/unit/analysis/maths/divide/TestBroadcasting/collapse_all_dims.cml +++ b/lib/iris/tests/results/unit/analysis/maths/divide/TestBroadcasting/collapse_all_dims.cml @@ -6,111 +6,125 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/divide/TestBroadcasting/collapse_last_dims.cml b/lib/iris/tests/results/unit/analysis/maths/divide/TestBroadcasting/collapse_last_dims.cml index 86d7855b1b..206244f3c7 100644 --- a/lib/iris/tests/results/unit/analysis/maths/divide/TestBroadcasting/collapse_last_dims.cml +++ b/lib/iris/tests/results/unit/analysis/maths/divide/TestBroadcasting/collapse_last_dims.cml @@ -6,111 +6,125 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/divide/TestBroadcasting/collapse_middle_dim.cml b/lib/iris/tests/results/unit/analysis/maths/divide/TestBroadcasting/collapse_middle_dim.cml index 86d7855b1b..206244f3c7 100644 --- a/lib/iris/tests/results/unit/analysis/maths/divide/TestBroadcasting/collapse_middle_dim.cml +++ b/lib/iris/tests/results/unit/analysis/maths/divide/TestBroadcasting/collapse_middle_dim.cml @@ -6,111 +6,125 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/divide/TestBroadcasting/collapse_zeroth_dim.cml b/lib/iris/tests/results/unit/analysis/maths/divide/TestBroadcasting/collapse_zeroth_dim.cml index 86d7855b1b..206244f3c7 100644 --- a/lib/iris/tests/results/unit/analysis/maths/divide/TestBroadcasting/collapse_zeroth_dim.cml +++ b/lib/iris/tests/results/unit/analysis/maths/divide/TestBroadcasting/collapse_zeroth_dim.cml @@ -6,111 +6,125 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/divide/TestBroadcasting/slice.cml b/lib/iris/tests/results/unit/analysis/maths/divide/TestBroadcasting/slice.cml index 86d7855b1b..206244f3c7 100644 --- a/lib/iris/tests/results/unit/analysis/maths/divide/TestBroadcasting/slice.cml +++ b/lib/iris/tests/results/unit/analysis/maths/divide/TestBroadcasting/slice.cml @@ -6,111 +6,125 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/divide/TestBroadcasting/transposed.cml b/lib/iris/tests/results/unit/analysis/maths/divide/TestBroadcasting/transposed.cml index 86d7855b1b..206244f3c7 100644 --- a/lib/iris/tests/results/unit/analysis/maths/divide/TestBroadcasting/transposed.cml +++ b/lib/iris/tests/results/unit/analysis/maths/divide/TestBroadcasting/transposed.cml @@ -6,111 +6,125 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/multiply/TestBroadcasting/collapse_all_dims.cml b/lib/iris/tests/results/unit/analysis/maths/multiply/TestBroadcasting/collapse_all_dims.cml index 73d6073a4b..86f0bf7b52 100644 --- a/lib/iris/tests/results/unit/analysis/maths/multiply/TestBroadcasting/collapse_all_dims.cml +++ b/lib/iris/tests/results/unit/analysis/maths/multiply/TestBroadcasting/collapse_all_dims.cml @@ -6,111 +6,125 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/multiply/TestBroadcasting/collapse_last_dims.cml b/lib/iris/tests/results/unit/analysis/maths/multiply/TestBroadcasting/collapse_last_dims.cml index 73d6073a4b..86f0bf7b52 100644 --- a/lib/iris/tests/results/unit/analysis/maths/multiply/TestBroadcasting/collapse_last_dims.cml +++ b/lib/iris/tests/results/unit/analysis/maths/multiply/TestBroadcasting/collapse_last_dims.cml @@ -6,111 +6,125 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/multiply/TestBroadcasting/collapse_middle_dim.cml b/lib/iris/tests/results/unit/analysis/maths/multiply/TestBroadcasting/collapse_middle_dim.cml index 73d6073a4b..86f0bf7b52 100644 --- a/lib/iris/tests/results/unit/analysis/maths/multiply/TestBroadcasting/collapse_middle_dim.cml +++ b/lib/iris/tests/results/unit/analysis/maths/multiply/TestBroadcasting/collapse_middle_dim.cml @@ -6,111 +6,125 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/multiply/TestBroadcasting/collapse_zeroth_dim.cml b/lib/iris/tests/results/unit/analysis/maths/multiply/TestBroadcasting/collapse_zeroth_dim.cml index 73d6073a4b..86f0bf7b52 100644 --- a/lib/iris/tests/results/unit/analysis/maths/multiply/TestBroadcasting/collapse_zeroth_dim.cml +++ b/lib/iris/tests/results/unit/analysis/maths/multiply/TestBroadcasting/collapse_zeroth_dim.cml @@ -6,111 +6,125 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/multiply/TestBroadcasting/slice.cml b/lib/iris/tests/results/unit/analysis/maths/multiply/TestBroadcasting/slice.cml index 73d6073a4b..86f0bf7b52 100644 --- a/lib/iris/tests/results/unit/analysis/maths/multiply/TestBroadcasting/slice.cml +++ b/lib/iris/tests/results/unit/analysis/maths/multiply/TestBroadcasting/slice.cml @@ -6,111 +6,125 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/multiply/TestBroadcasting/transposed.cml b/lib/iris/tests/results/unit/analysis/maths/multiply/TestBroadcasting/transposed.cml index 73d6073a4b..86f0bf7b52 100644 --- a/lib/iris/tests/results/unit/analysis/maths/multiply/TestBroadcasting/transposed.cml +++ b/lib/iris/tests/results/unit/analysis/maths/multiply/TestBroadcasting/transposed.cml @@ -6,111 +6,125 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/subtract/TestBroadcasting/collapse_all_dims.cml b/lib/iris/tests/results/unit/analysis/maths/subtract/TestBroadcasting/collapse_all_dims.cml index 8467544d44..5c169b2319 100644 --- a/lib/iris/tests/results/unit/analysis/maths/subtract/TestBroadcasting/collapse_all_dims.cml +++ b/lib/iris/tests/results/unit/analysis/maths/subtract/TestBroadcasting/collapse_all_dims.cml @@ -6,111 +6,125 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/subtract/TestBroadcasting/collapse_last_dims.cml b/lib/iris/tests/results/unit/analysis/maths/subtract/TestBroadcasting/collapse_last_dims.cml index 8467544d44..5c169b2319 100644 --- a/lib/iris/tests/results/unit/analysis/maths/subtract/TestBroadcasting/collapse_last_dims.cml +++ b/lib/iris/tests/results/unit/analysis/maths/subtract/TestBroadcasting/collapse_last_dims.cml @@ -6,111 +6,125 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/subtract/TestBroadcasting/collapse_middle_dim.cml b/lib/iris/tests/results/unit/analysis/maths/subtract/TestBroadcasting/collapse_middle_dim.cml index 8467544d44..5c169b2319 100644 --- a/lib/iris/tests/results/unit/analysis/maths/subtract/TestBroadcasting/collapse_middle_dim.cml +++ b/lib/iris/tests/results/unit/analysis/maths/subtract/TestBroadcasting/collapse_middle_dim.cml @@ -6,111 +6,125 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/subtract/TestBroadcasting/collapse_zeroth_dim.cml b/lib/iris/tests/results/unit/analysis/maths/subtract/TestBroadcasting/collapse_zeroth_dim.cml index 8467544d44..5c169b2319 100644 --- a/lib/iris/tests/results/unit/analysis/maths/subtract/TestBroadcasting/collapse_zeroth_dim.cml +++ b/lib/iris/tests/results/unit/analysis/maths/subtract/TestBroadcasting/collapse_zeroth_dim.cml @@ -6,111 +6,125 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/subtract/TestBroadcasting/slice.cml b/lib/iris/tests/results/unit/analysis/maths/subtract/TestBroadcasting/slice.cml index 8467544d44..5c169b2319 100644 --- a/lib/iris/tests/results/unit/analysis/maths/subtract/TestBroadcasting/slice.cml +++ b/lib/iris/tests/results/unit/analysis/maths/subtract/TestBroadcasting/slice.cml @@ -6,111 +6,125 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/analysis/maths/subtract/TestBroadcasting/transposed.cml b/lib/iris/tests/results/unit/analysis/maths/subtract/TestBroadcasting/transposed.cml index 8467544d44..5c169b2319 100644 --- a/lib/iris/tests/results/unit/analysis/maths/subtract/TestBroadcasting/transposed.cml +++ b/lib/iris/tests/results/unit/analysis/maths/subtract/TestBroadcasting/transposed.cml @@ -6,111 +6,125 @@ - + + [-0.12735, -0.12645], + [-0.12645, -0.12555], + ..., + [-0.04095, -0.04005], + [-0.04005, -0.03915], + [-0.03915, -0.03825]]" id="f1ab3066" points="[-0.1278, -0.1269, -0.126 , ..., -0.0405, -0.0396, + -0.0387]" shape="(100,)" standard_name="grid_latitude" units="Unit('degrees')" value_type="float32"> - + - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/cube/Cube/intersection__Metadata/metadata.cml b/lib/iris/tests/results/unit/cube/Cube/intersection__Metadata/metadata.cml index 4ae37abf0b..f1f37e23b9 100644 --- a/lib/iris/tests/results/unit/cube/Cube/intersection__Metadata/metadata.cml +++ b/lib/iris/tests/results/unit/cube/Cube/intersection__Metadata/metadata.cml @@ -3,62 +3,62 @@ - + [[1100., 1106., 1112., ..., 1208., 1214., + 1220.], + [3260., 3266., 3272., ..., 3368., 3374., + 3380.], + [5420., 5426., 5432., ..., 5528., 5534., + 5540.]]]" shape="(4, 3, 21)" standard_name="altitude" units="Unit('m')" value_type="float64"> - + - + - + - + + 1780, 1790, 1800, 1810, 1820, 1830, 1840, 1850, + 1860, 1870, 1880, 1890, 1900], + [5300, 5310, 5320, 5330, 5340, 5350, 5360, 5370, + 5380, 5390, 5400, 5410, 5420, 5430, 5440, 5450, + 5460, 5470, 5480, 5490, 5500], + [8900, 8910, 8920, 8930, 8940, 8950, 8960, 8970, + 8980, 8990, 9000, 9010, 9020, 9030, 9040, 9050, + 9060, 9070, 9080, 9090, 9100]]" shape="(3, 21)" standard_name="surface_altitude" units="Unit('m')" value_type="int64"/> diff --git a/lib/iris/tests/results/unit/cube/Cube/intersection__Metadata/metadata_wrapped.cml b/lib/iris/tests/results/unit/cube/Cube/intersection__Metadata/metadata_wrapped.cml index 17eebb6ea4..48f0fa1aaa 100644 --- a/lib/iris/tests/results/unit/cube/Cube/intersection__Metadata/metadata_wrapped.cml +++ b/lib/iris/tests/results/unit/cube/Cube/intersection__Metadata/metadata_wrapped.cml @@ -3,61 +3,65 @@ - + [[ 2180., 2186., 2192., ..., 128., 134., + 140.], + [ 4340., 4346., 4352., ..., 2288., 2294., + 2300.], + [ 6500., 6506., 6512., ..., 4448., 4454., + 4460.]]]" shape="(4, 3, 21)" standard_name="altitude" units="Unit('m')" value_type="float64"> - + - + - + - + - + diff --git a/lib/iris/tests/results/unit/cube/Cube/xml/ancils.cml b/lib/iris/tests/results/unit/cube/Cube/xml/ancils.cml index d2b55524f8..0db98eae1a 100644 --- a/lib/iris/tests/results/unit/cube/Cube/xml/ancils.cml +++ b/lib/iris/tests/results/unit/cube/Cube/xml/ancils.cml @@ -3,48 +3,48 @@ - + [[10, 20], + [20, 25], + [25, 40], + [40, 60]]]" id="434cbbd8" long_name="bar" points="[[ 2.5, 7.5, 12.5, 17.5], + [10. , 17.5, 27.5, 42.5], + [15. , 22.5, 32.5, 50. ]]" shape="(3, 4)" units="Unit('1')" value_type="float64"/> - + [[ -5, 10], + [ 10, 18], + [ 18, 55], + [ 18, 70]]]" id="b0d35dcf" long_name="foo" points="[[ -7.5, 7.5, 22.5, 37.5], + [-12.5, 4. , 26.5, 47.5], + [ 2.5, 14. , 36.5, 44. ]]" shape="(3, 4)" units="Unit('1')" value_type="float64"/> - + diff --git a/lib/iris/tests/results/unit/cube/Cube/xml/cell_measures.cml b/lib/iris/tests/results/unit/cube/Cube/xml/cell_measures.cml index 9003ecbbe0..02cf060918 100644 --- a/lib/iris/tests/results/unit/cube/Cube/xml/cell_measures.cml +++ b/lib/iris/tests/results/unit/cube/Cube/xml/cell_measures.cml @@ -3,60 +3,60 @@ - + [[10, 20], + [20, 25], + [25, 40], + [40, 60]]]" id="434cbbd8" long_name="bar" points="[[ 2.5, 7.5, 12.5, 17.5], + [10. , 17.5, 27.5, 42.5], + [15. , 22.5, 32.5, 50. ]]" shape="(3, 4)" units="Unit('1')" value_type="float64"/> - + [[ -5, 10], + [ 10, 18], + [ 18, 55], + [ 18, 70]]]" id="b0d35dcf" long_name="foo" points="[[ -7.5, 7.5, 22.5, 37.5], + [-12.5, 4. , 26.5, 47.5], + [ 2.5, 14. , 36.5, 44. ]]" shape="(3, 4)" units="Unit('1')" value_type="float64"/> - + - + [[0., 0., 0., 0.], + [0., 0., 0., 0.], + [0., 0., 0., 0.]]]" id="9ff02736" long_name="madeup" measure="volume" shape="(2, 3, 4)" units="Unit('m3')" value_type="float64"/> - + diff --git a/lib/iris/tests/results/unit/cube/CubeList/merge__time_triple/combination_with_extra_realization.cml b/lib/iris/tests/results/unit/cube/CubeList/merge__time_triple/combination_with_extra_realization.cml index 0a8b19cc2b..e010a668c5 100644 --- a/lib/iris/tests/results/unit/cube/CubeList/merge__time_triple/combination_with_extra_realization.cml +++ b/lib/iris/tests/results/unit/cube/CubeList/merge__time_triple/combination_with_extra_realization.cml @@ -4,19 +4,19 @@ + 0]" shape="(17,)" standard_name="forecast_period" units="Unit('1')" value_type="int64"/> + 10, 10, 11, 11, 10]" shape="(17,)" standard_name="forecast_reference_time" units="Unit('1')" value_type="int64"/> + 3]" shape="(17,)" standard_name="realization" units="Unit('1')" value_type="int64"/> + 2]" shape="(17,)" standard_name="time" units="Unit('1')" value_type="int64"/> diff --git a/lib/iris/tests/results/unit/cube/CubeList/merge__time_triple/combination_with_extra_triple.cml b/lib/iris/tests/results/unit/cube/CubeList/merge__time_triple/combination_with_extra_triple.cml index edd4e8c9f7..4c44da7d4c 100644 --- a/lib/iris/tests/results/unit/cube/CubeList/merge__time_triple/combination_with_extra_triple.cml +++ b/lib/iris/tests/results/unit/cube/CubeList/merge__time_triple/combination_with_extra_triple.cml @@ -4,19 +4,19 @@ + 1]" shape="(17,)" standard_name="forecast_period" units="Unit('1')" value_type="int64"/> + 10, 10, 11, 11, 11]" shape="(17,)" standard_name="forecast_reference_time" units="Unit('1')" value_type="int64"/> + 2]" shape="(17,)" standard_name="realization" units="Unit('1')" value_type="int64"/> + 3]" shape="(17,)" standard_name="time" units="Unit('1')" value_type="int64"/> diff --git a/lib/iris/tests/results/unit/experimental/stratify/relevel/Test/multi_dim_target_levels.cml b/lib/iris/tests/results/unit/experimental/stratify/relevel/Test/multi_dim_target_levels.cml index 132ac9887e..b95f1cfd5e 100644 --- a/lib/iris/tests/results/unit/experimental/stratify/relevel/Test/multi_dim_target_levels.cml +++ b/lib/iris/tests/results/unit/experimental/stratify/relevel/Test/multi_dim_target_levels.cml @@ -9,9 +9,9 @@ - + [[12]]]" shape="(2, 1, 1)" units="Unit('1')" value_type="int32"/> diff --git a/lib/iris/tests/results/unit/util/mask_cube/TestCubeMask/mask_cube_2d_create_new_dim.cml b/lib/iris/tests/results/unit/util/mask_cube/TestCubeMask/mask_cube_2d_create_new_dim.cml index 52aae1eb5e..47814067a4 100644 --- a/lib/iris/tests/results/unit/util/mask_cube/TestCubeMask/mask_cube_2d_create_new_dim.cml +++ b/lib/iris/tests/results/unit/util/mask_cube/TestCubeMask/mask_cube_2d_create_new_dim.cml @@ -3,18 +3,18 @@ - + - + diff --git a/lib/iris/tests/results/unit/util/mask_cube/original_cube_full2d_global.cml b/lib/iris/tests/results/unit/util/mask_cube/original_cube_full2d_global.cml index abaebd51d6..f0b86b2488 100644 --- a/lib/iris/tests/results/unit/util/mask_cube/original_cube_full2d_global.cml +++ b/lib/iris/tests/results/unit/util/mask_cube/original_cube_full2d_global.cml @@ -3,118 +3,154 @@ - + [[ 61.25 , 50.49913401, 75. , + 75. ], + [ 50.49913401, 37.10216606, 75. , + 75. ], + [ 37.10216606, 31.25642246, 75. , + 75. ], + [ 31.25642246, 36.40577724, 75. , + 75. ], + [ 36.40577724, 49.53429605, 75. , + 75. ], + [ 49.53429605, 61.25 , 75. , + 75. ]]]" id="4a0cb9d8" points="[[-70.79611457, -74.52039586, -79.04767474, + -79.25954365, -74.83895678, -70.95990428], + [-34.98996349, -46.35178848, -59.72147857, + -60.34014532, -47.30539587, -35.49921565], + [ 1.97619064, -10.62625029, -22.85932423, + -23.34910237, -11.59548272, 1.36966775], + [ 38.91370839, 25.53103737, 14.31169927, + 13.91632407, 24.58541465, 38.21533886], + [ 74.19713964, 60.25847406, 51.32460204, + 51.01627348, 59.44583014, 73.26834378]]" shape="(5, 6)" standard_name="latitude" units="Unit('degrees')" value_type="float64"/> - + [[ -60. , 21.98365957, 120. , + 120. ], + [ 21.98365957, 72.58386797, 120. , + 120. ], + [ 72.58386797, 118.48335809, 120. , + 120. ], + [ 118.48335809, 164.29858322, 120. , + 120. ], + [ 164.29858322, -145.72980597, 120. , + 120. ], + [-145.72980597, -60. , 120. , + 120. ]]]" id="62e940e0" points="[[ -50.71754472, -40.98262669, -46.74020973, + -71.93761444, -79.29296667, -70.14565996], + [ -29.86690506, 17.60638978, 77.93623025, + 157.14479498, -141.03702223, -93.17170324], + [ -23.13943014, 31.00689379, 87.69861699, + 148.32166238, -154.63858771, -100.50500328], + [ -16.0543062 , 41.21800297, 92.76054229, + 130.95135597, -164.73841441, -108.10521629], + [ 10.85977909, 61.77988295, 100.23612308, + 137.28481933, 175.51112189, -135.44594391]]" shape="(5, 6)" standard_name="longitude" units="Unit('degrees')" value_type="float64"/> diff --git a/lib/iris/tests/results/unit/util/mask_cube/original_cube_simple_1d.cml b/lib/iris/tests/results/unit/util/mask_cube/original_cube_simple_1d.cml index bf8902bcb2..028979b7a4 100644 --- a/lib/iris/tests/results/unit/util/mask_cube/original_cube_simple_1d.cml +++ b/lib/iris/tests/results/unit/util/mask_cube/original_cube_simple_1d.cml @@ -3,17 +3,17 @@ - + diff --git a/lib/iris/tests/results/unit/util/mask_cube/original_cube_simple_2d.cml b/lib/iris/tests/results/unit/util/mask_cube/original_cube_simple_2d.cml index e1760775f9..51fd3991d3 100644 --- a/lib/iris/tests/results/unit/util/mask_cube/original_cube_simple_2d.cml +++ b/lib/iris/tests/results/unit/util/mask_cube/original_cube_simple_2d.cml @@ -3,15 +3,15 @@ - + - + diff --git a/lib/iris/tests/results/uri_callback/pp_global.cml b/lib/iris/tests/results/uri_callback/pp_global.cml index 4e493f486d..6bfdf4d610 100644 --- a/lib/iris/tests/results/uri_callback/pp_global.cml +++ b/lib/iris/tests/results/uri_callback/pp_global.cml @@ -9,36 +9,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.03.236.000128.1990.12.01.00.00.b_0.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.03.236.000128.1990.12.01.00.00.b_0.cml index e7c799f397..162fa47f88 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.03.236.000128.1990.12.01.00.00.b_0.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.03.236.000128.1990.12.01.00.00.b_0.cml @@ -8,10 +8,10 @@ - + - + @@ -21,26 +21,28 @@ - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.03.236.004224.1990.12.01.00.00.b_0.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.03.236.004224.1990.12.01.00.00.b_0.cml index 66cbc7206b..4624ab6701 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.03.236.004224.1990.12.01.00.00.b_0.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.03.236.004224.1990.12.01.00.00.b_0.cml @@ -8,10 +8,10 @@ - + - + @@ -21,26 +21,28 @@ - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.03.236.008320.1990.12.01.00.00.b_0.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.03.236.008320.1990.12.01.00.00.b_0.cml index af298945f0..8e345390fa 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.03.236.008320.1990.12.01.00.00.b_0.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.03.236.008320.1990.12.01.00.00.b_0.cml @@ -9,10 +9,10 @@ - + - + @@ -22,26 +22,28 @@ - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.16.202.000128.1860.09.01.00.00.b_0.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.16.202.000128.1860.09.01.00.00.b_0.cml index 3a55c44f2f..8648f88f1e 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.16.202.000128.1860.09.01.00.00.b_0.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/000003000000.16.202.000128.1860.09.01.00.00.b_0.cml @@ -8,36 +8,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/001000000000.00.000.000000.1860.01.01.00.00.f.b_0.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/001000000000.00.000.000000.1860.01.01.00.00.f.b_0.cml index 1ab309af4e..c935249403 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/001000000000.00.000.000000.1860.01.01.00.00.f.b_0.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/001000000000.00.000.000000.1860.01.01.00.00.f.b_0.cml @@ -6,25 +6,25 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/002000000000.44.101.131200.1920.09.01.00.00.b_0.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/002000000000.44.101.131200.1920.09.01.00.00.b_0.cml index 0bf359e9c4..0b8d1b386a 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/002000000000.44.101.131200.1920.09.01.00.00.b_0.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/002000000000.44.101.131200.1920.09.01.00.00.b_0.cml @@ -9,37 +9,41 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/008000000000.44.101.000128.1890.09.01.00.00.b_0.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/008000000000.44.101.000128.1890.09.01.00.00.b_0.cml index e5cec55565..eaacfdb569 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/008000000000.44.101.000128.1890.09.01.00.00.b_0.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/008000000000.44.101.000128.1890.09.01.00.00.b_0.cml @@ -8,20 +8,23 @@ - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/12187.b_0.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/12187.b_0.cml index 5a7a6441a4..6fb7501788 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/12187.b_0.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/12187.b_0.cml @@ -9,129 +9,140 @@ - + - + - + - + - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/HadCM2_ts_SAT_ann_18602100.b_0.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/HadCM2_ts_SAT_ann_18602100.b_0.cml index cf7b207be9..6977467e33 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/HadCM2_ts_SAT_ann_18602100.b_0.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/HadCM2_ts_SAT_ann_18602100.b_0.cml @@ -11,21 +11,21 @@ - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_level_lat_orig.b_0.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_level_lat_orig.b_0.cml index 51ab62f9aa..6294dcef2a 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_level_lat_orig.b_0.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_level_lat_orig.b_0.cml @@ -8,34 +8,35 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_lon_lat_press_orig.b_0.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_lon_lat_press_orig.b_0.cml index 55a60a7cd6..235e2a2177 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_lon_lat_press_orig.b_0.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_lon_lat_press_orig.b_0.cml @@ -8,39 +8,41 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_lon_lat_several.b_0.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_lon_lat_several.b_0.cml index 2736fe9aa6..cbbce59ec3 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_lon_lat_several.b_0.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_lon_lat_several.b_0.cml @@ -8,26 +8,25 @@ - + - + @@ -37,42 +36,43 @@ - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_n10r13xy.b_0.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_n10r13xy.b_0.cml index 8c4ee7df19..21d8da958b 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_n10r13xy.b_0.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_n10r13xy.b_0.cml @@ -7,34 +7,34 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_time_press.b_0.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_time_press.b_0.cml index 83f7502ba5..dcb211e11b 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_time_press.b_0.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_time_press.b_0.cml @@ -8,12 +8,12 @@ - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_tseries.b_0.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_tseries.b_0.cml index fb6fa8a599..c3a675186b 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_tseries.b_0.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/aaxzc_tseries.b_0.cml @@ -15,10 +15,10 @@ - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/abcza_pa19591997_daily_29.b_0.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/abcza_pa19591997_daily_29.b_0.cml index f2c30b37ef..148fa0b3d6 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/abcza_pa19591997_daily_29.b_0.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/abcza_pa19591997_daily_29.b_0.cml @@ -8,17 +8,17 @@ - + - + @@ -28,33 +28,35 @@ - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/abcza_pa19591997_daily_29.b_1.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/abcza_pa19591997_daily_29.b_1.cml index cc5f574799..fb0c81a1d6 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/abcza_pa19591997_daily_29.b_1.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/abcza_pa19591997_daily_29.b_1.cml @@ -8,17 +8,17 @@ - + - + @@ -28,33 +28,35 @@ - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/abcza_pa19591997_daily_29.b_2.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/abcza_pa19591997_daily_29.b_2.cml index 9fe3e1cb1c..a259deb0ba 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/abcza_pa19591997_daily_29.b_2.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/abcza_pa19591997_daily_29.b_2.cml @@ -8,46 +8,48 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/abxpa_press_lat.b_0.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/abxpa_press_lat.b_0.cml index 71c005b916..4e97c06748 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/abxpa_press_lat.b_0.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/abxpa_press_lat.b_0.cml @@ -8,32 +8,33 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/integer.b_0.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/integer.b_0.cml index 642dadc721..1dd5510481 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/integer.b_0.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/integer.b_0.cml @@ -7,33 +7,48 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/model.b_0.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/model.b_0.cml index f0bb9dc293..ffb7b84b78 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/model.b_0.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/model.b_0.cml @@ -8,87 +8,102 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/ocean_xsect.b_0.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/ocean_xsect.b_0.cml index 5549d7cebe..9a8021dc15 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/ocean_xsect.b_0.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/ocean_xsect.b_0.cml @@ -8,48 +8,51 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/st0fc699.b_0.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/st0fc699.b_0.cml index b484ebb305..a9a512398f 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/st0fc699.b_0.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/st0fc699.b_0.cml @@ -8,24 +8,25 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/st0fc942.b_0.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/st0fc942.b_0.cml index c594c748cd..899d997f26 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/st0fc942.b_0.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/st0fc942.b_0.cml @@ -8,37 +8,41 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/st30211.b_0.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/st30211.b_0.cml index ffcf430c02..1a60704482 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/st30211.b_0.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_netcdf/st30211.b_0.cml @@ -8,16 +8,17 @@ - + - + - + @@ -27,13 +28,13 @@ - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/000003000000.03.236.000128.1990.12.01.00.00.b.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/000003000000.03.236.000128.1990.12.01.00.00.b.cml index 44999e85b7..e247d6a821 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/000003000000.03.236.000128.1990.12.01.00.00.b.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/000003000000.03.236.000128.1990.12.01.00.00.b.cml @@ -7,10 +7,10 @@ - + - + @@ -20,26 +20,28 @@ - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/000003000000.03.236.004224.1990.12.01.00.00.b.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/000003000000.03.236.004224.1990.12.01.00.00.b.cml index 990fa0d7fe..1f9d905a3d 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/000003000000.03.236.004224.1990.12.01.00.00.b.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/000003000000.03.236.004224.1990.12.01.00.00.b.cml @@ -7,10 +7,10 @@ - + - + @@ -20,26 +20,28 @@ - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/000003000000.03.236.008320.1990.12.01.00.00.b.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/000003000000.03.236.008320.1990.12.01.00.00.b.cml index 43789498c1..6e7907acd9 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/000003000000.03.236.008320.1990.12.01.00.00.b.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/000003000000.03.236.008320.1990.12.01.00.00.b.cml @@ -8,10 +8,10 @@ - + - + @@ -21,26 +21,28 @@ - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/000003000000.16.202.000128.1860.09.01.00.00.b.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/000003000000.16.202.000128.1860.09.01.00.00.b.cml index 54e3824d6d..aed9a4e679 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/000003000000.16.202.000128.1860.09.01.00.00.b.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/000003000000.16.202.000128.1860.09.01.00.00.b.cml @@ -7,36 +7,51 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/001000000000.00.000.000000.1860.01.01.00.00.f.b.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/001000000000.00.000.000000.1860.01.01.00.00.f.b.cml index 7fef4515a2..84bcd515cf 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/001000000000.00.000.000000.1860.01.01.00.00.f.b.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/001000000000.00.000.000000.1860.01.01.00.00.f.b.cml @@ -3,25 +3,25 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/002000000000.44.101.131200.1920.09.01.00.00.b.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/002000000000.44.101.131200.1920.09.01.00.00.b.cml index f41f4a284a..31a571d6f1 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/002000000000.44.101.131200.1920.09.01.00.00.b.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/002000000000.44.101.131200.1920.09.01.00.00.b.cml @@ -8,37 +8,41 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/008000000000.44.101.000128.1890.09.01.00.00.b.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/008000000000.44.101.000128.1890.09.01.00.00.b.cml index e8d2cb7735..ffc9dac60f 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/008000000000.44.101.000128.1890.09.01.00.00.b.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/008000000000.44.101.000128.1890.09.01.00.00.b.cml @@ -7,20 +7,23 @@ - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/12187.b.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/12187.b.cml index 7e35faceda..2d61cf4fee 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/12187.b.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/12187.b.cml @@ -8,129 +8,140 @@ - + - + - + - + - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/HadCM2_ts_SAT_ann_18602100.b.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/HadCM2_ts_SAT_ann_18602100.b.cml index 69f597d697..8b68a7edb7 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/HadCM2_ts_SAT_ann_18602100.b.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/HadCM2_ts_SAT_ann_18602100.b.cml @@ -10,25 +10,25 @@ - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/aaxzc_level_lat_orig.b.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/aaxzc_level_lat_orig.b.cml index d24575ca39..720e956c16 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/aaxzc_level_lat_orig.b.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/aaxzc_level_lat_orig.b.cml @@ -7,34 +7,35 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/aaxzc_lon_lat_press_orig.b.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/aaxzc_lon_lat_press_orig.b.cml index 358208d7b3..9c94da141e 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/aaxzc_lon_lat_press_orig.b.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/aaxzc_lon_lat_press_orig.b.cml @@ -7,39 +7,41 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/aaxzc_lon_lat_several.b.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/aaxzc_lon_lat_several.b.cml index 93f156d33d..f95bfa4279 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/aaxzc_lon_lat_several.b.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/aaxzc_lon_lat_several.b.cml @@ -7,26 +7,25 @@ - + - + @@ -36,42 +35,43 @@ - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/aaxzc_n10r13xy.b.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/aaxzc_n10r13xy.b.cml index 33ec73acee..9d4be31b02 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/aaxzc_n10r13xy.b.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/aaxzc_n10r13xy.b.cml @@ -6,34 +6,34 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/aaxzc_time_press.b.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/aaxzc_time_press.b.cml index ad54273ae2..be319dd37e 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/aaxzc_time_press.b.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/aaxzc_time_press.b.cml @@ -7,12 +7,12 @@ - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/aaxzc_tseries.b.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/aaxzc_tseries.b.cml index 6f3a5af440..e861691897 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/aaxzc_tseries.b.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/aaxzc_tseries.b.cml @@ -14,10 +14,10 @@ - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/abcza_pa19591997_daily_29.b.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/abcza_pa19591997_daily_29.b.cml index f3a4d8dd0d..61f1875148 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/abcza_pa19591997_daily_29.b.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/abcza_pa19591997_daily_29.b.cml @@ -7,17 +7,17 @@ - + - + @@ -27,33 +27,35 @@ - + - + - + @@ -70,17 +72,17 @@ - + - + @@ -90,33 +92,35 @@ - + - + - + @@ -133,46 +137,48 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/abxpa_press_lat.b.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/abxpa_press_lat.b.cml index 0fbbd81c74..ca81b9cba0 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/abxpa_press_lat.b.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/abxpa_press_lat.b.cml @@ -7,32 +7,33 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/integer.b.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/integer.b.cml index 9cad8ea176..6a9fc5a005 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/integer.b.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/integer.b.cml @@ -6,33 +6,48 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/model.b.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/model.b.cml index 2f8db655cc..08329b3f56 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/model.b.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/model.b.cml @@ -7,87 +7,102 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/ocean_xsect.b.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/ocean_xsect.b.cml index cd4e742da9..8196f78d26 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/ocean_xsect.b.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/ocean_xsect.b.cml @@ -7,48 +7,51 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/st0fc699.b.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/st0fc699.b.cml index 0a9e0a7bcb..f93e7b7205 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/st0fc699.b.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/st0fc699.b.cml @@ -7,24 +7,25 @@ - + - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/st0fc942.b.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/st0fc942.b.cml index fd775483e9..f0899f570e 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/st0fc942.b.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/st0fc942.b.cml @@ -7,37 +7,41 @@ - + - + - + - + - + - + diff --git a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/st30211.b.cml b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/st30211.b.cml index 2a49cf6c71..1474b7c502 100644 --- a/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/st30211.b.cml +++ b/lib/iris/tests/results/usecases/pp_to_cf_conversion/from_pp/st30211.b.cml @@ -7,16 +7,17 @@ - + - + - + @@ -26,13 +27,13 @@ - + - + diff --git a/lib/iris/util.py b/lib/iris/util.py index d2af4c1085..d27aa0c722 100644 --- a/lib/iris/util.py +++ b/lib/iris/util.py @@ -1067,30 +1067,14 @@ def format_array(arr): """ - summary_threshold = 85 - summary_insert = "..." if arr.size > summary_threshold else "" - edge_items = 3 - ffunc = str max_line_len = 50 - # Format the array with version 1.13 legacy behaviour - with np.printoptions(legacy="1.13"): - # Use this (private) routine for more control. - formatArray = np.core.arrayprint._formatArray - # N.B. the 'legacy' arg had different forms in different numpy versions - # -- fetch the required form from the internal options dict - format_options_legacy = np.core.arrayprint._format_options["legacy"] - - result = formatArray( - arr, - ffunc, - max_line_len, - next_line_prefix="\t\t", - separator=", ", - edge_items=edge_items, - summary_insert=summary_insert, - legacy=format_options_legacy, - ) + result = np.array2string( + arr, + max_line_len, + separator=", ", + threshold=85, + ) return result From 4914e99ed2840a9110ccb7b44556423f555c1b6f Mon Sep 17 00:00:00 2001 From: Henry Wright Date: Tue, 4 Apr 2023 14:45:39 +0100 Subject: [PATCH 55/85] adding a whatsnew entry --- docs/src/whatsnew/latest.rst | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/src/whatsnew/latest.rst b/docs/src/whatsnew/latest.rst index b0ca5f1b16..8af4fb310c 100644 --- a/docs/src/whatsnew/latest.rst +++ b/docs/src/whatsnew/latest.rst @@ -164,6 +164,10 @@ This document explains the changes made to Iris for this release pin for first use of `dask.array.ma.empty_like`_ and replaced `@tinyendian`_ workaround. (:pull:`5225`) +#. `@HGWright`_, `@bjlittle`_ and `@trexfeathers`_ removed the legacy pin for + numpy array printing and replaced the test results files to match the not + printing output (:pull:`5235`) + .. comment Whatsnew author names (@github name) in alphabetical order. Note that, From bd642cd0b5d0bfd6430420f63b02048fed3694bc Mon Sep 17 00:00:00 2001 From: Henry Wright Date: Tue, 4 Apr 2023 15:25:12 +0100 Subject: [PATCH 56/85] configure codecov --- codecov.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 codecov.yml diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 0000000000..bc1800b720 --- /dev/null +++ b/codecov.yml @@ -0,0 +1,9 @@ +coverage: + # see https://docs.codecov.com/docs/commit-status + status: + project: + default: + target: auto + # coverage can drop by up to % while still posting success + threshold: 3% + patch: off \ No newline at end of file From bc5bdd1d8dabf128db690bbfe0bc80addd080e3a Mon Sep 17 00:00:00 2001 From: Henry Wright Date: Tue, 4 Apr 2023 15:32:10 +0100 Subject: [PATCH 57/85] remove results creation commit from blame --- .git-blame-ignore-revs | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .git-blame-ignore-revs diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 0000000000..716560fab9 --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1,2 @@ +# Format: numpy array format (#5235) +c18dcd8dafef0cc7bbbf80dfce66f76a46ce59c5 From 301e59e310b604d17a47c70a0e11d5658de06f56 Mon Sep 17 00:00:00 2001 From: Henry Wright Date: Tue, 4 Apr 2023 15:38:16 +0100 Subject: [PATCH 58/85] fixing whatsnew entry --- docs/src/whatsnew/latest.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/src/whatsnew/latest.rst b/docs/src/whatsnew/latest.rst index 8af4fb310c..7c6b5be63d 100644 --- a/docs/src/whatsnew/latest.rst +++ b/docs/src/whatsnew/latest.rst @@ -165,8 +165,8 @@ This document explains the changes made to Iris for this release workaround. (:pull:`5225`) #. `@HGWright`_, `@bjlittle`_ and `@trexfeathers`_ removed the legacy pin for - numpy array printing and replaced the test results files to match the not - printing output (:pull:`5235`) + ``numpy`` array printing and replaced the test results files to match default + ``numpy`` output. (:pull:`5235`) .. comment From 7b3044d2aad677dce08772d9b91c9a30c34f873b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Apr 2023 13:18:24 +0100 Subject: [PATCH 59/85] Bump scitools/workflows from 2023.04.1 to 2023.04.2 (#5236) Bumps [scitools/workflows](https://github.com/scitools/workflows) from 2023.04.1 to 2023.04.2. - [Release notes](https://github.com/scitools/workflows/releases) - [Commits](https://github.com/scitools/workflows/compare/2023.04.1...2023.04.2) --- updated-dependencies: - dependency-name: scitools/workflows dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/refresh-lockfiles.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/refresh-lockfiles.yml b/.github/workflows/refresh-lockfiles.yml index 725524baaf..00968fc5cf 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@2023.04.1 + uses: scitools/workflows/.github/workflows/refresh-lockfiles.yml@2023.04.2 secrets: inherit From 02f2b66926e1c36364641ee5f6a68a17041e080a Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 6 Apr 2023 14:38:03 +0100 Subject: [PATCH 60/85] Use real array for data of of small netCDF variables. (#5229) * Small netCDF variable data is real. * Various test fixes. * More test fixing. * Fix printout in Mesh documentation. * Whatsnew + doctests fix. * Tweak whatsnew. --- docs/src/further_topics/ugrid/operations.rst | 16 ++--- docs/src/userguide/real_and_lazy_data.rst | 15 ++--- docs/src/whatsnew/latest.rst | 5 +- lib/iris/fileformats/netcdf/loader.py | 65 +++++++++++++------ .../tests/integration/netcdf/test_general.py | 7 +- lib/iris/tests/integration/test_cube.py | 10 ++- .../netcdf/int64_auxiliary_coord_netcdf3.cml | 2 +- .../netcdf/int64_dimension_coord_netcdf3.cml | 2 +- .../tests/results/netcdf/save_load_traj.cml | 2 +- .../netcdf/uint32_auxiliary_coord_netcdf3.cml | 2 +- .../netcdf/uint32_dimension_coord_netcdf3.cml | 2 +- .../unit/aux_factory/test_AuxCoordFactory.py | 8 ++- .../helpers/test_build_ancil_var.py | 1 + .../test_build_auxiliary_coordinate.py | 25 +++++-- .../helpers/test_build_cell_measure.py | 1 + .../netcdf/loader/test__get_cf_var_data.py | 32 +++++++-- .../netcdf/loader/test__load_cube.py | 2 + 17 files changed, 142 insertions(+), 55 deletions(-) diff --git a/docs/src/further_topics/ugrid/operations.rst b/docs/src/further_topics/ugrid/operations.rst index 73dadda181..8592cce769 100644 --- a/docs/src/further_topics/ugrid/operations.rst +++ b/docs/src/further_topics/ugrid/operations.rst @@ -430,20 +430,20 @@ creating any associated :class:`~iris.cube.Cube`\s: node node_dimension: 'Mesh2d_node' node coordinates - shape(5,)> - shape(5,)> + + edge edge_dimension: 'Mesh2d_edge' - edge_node_connectivity: shape(6, 2)> + edge_node_connectivity: edge coordinates - shape(6,)> - shape(6,)> + + face face_dimension: 'Mesh2d_face' - face_node_connectivity: shape(2, 4)> + face_node_connectivity: face coordinates - shape(2,)> - shape(2,)> + + long_name: 'my_mesh' var_name: 'my_mesh' diff --git a/docs/src/userguide/real_and_lazy_data.rst b/docs/src/userguide/real_and_lazy_data.rst index f1be17e3fc..ef4de0c429 100644 --- a/docs/src/userguide/real_and_lazy_data.rst +++ b/docs/src/userguide/real_and_lazy_data.rst @@ -189,17 +189,17 @@ coordinates' lazy points and bounds: .. doctest:: - >>> cube = iris.load_cube(iris.sample_data_path('hybrid_height.nc'), 'air_potential_temperature') + >>> cube = iris.load_cube(iris.sample_data_path('orca2_votemper.nc'),'votemper') - >>> dim_coord = cube.coord('model_level_number') + >>> dim_coord = cube.coord('depth') >>> print(dim_coord.has_lazy_points()) False >>> print(dim_coord.has_bounds()) - False + True >>> print(dim_coord.has_lazy_bounds()) False - >>> aux_coord = cube.coord('sigma') + >>> aux_coord = cube.coord('longitude') >>> print(aux_coord.has_lazy_points()) True >>> print(aux_coord.has_bounds()) @@ -214,7 +214,9 @@ coordinates' lazy points and bounds: >>> print(aux_coord.has_lazy_bounds()) True - >>> derived_coord = cube.coord('altitude') + # Fetch a derived coordinate, from a different file: These can also have lazy data. + >>> cube2 = iris.load_cube(iris.sample_data_path('hybrid_height.nc'), 'air_potential_temperature') + >>> derived_coord = cube2.coord('altitude') >>> print(derived_coord.has_lazy_points()) True >>> print(derived_coord.has_bounds()) @@ -222,9 +224,6 @@ coordinates' lazy points and bounds: >>> print(derived_coord.has_lazy_bounds()) True -.. note:: - Printing a lazy :class:`~iris.coords.AuxCoord` will realise its points and bounds arrays! - Dask Processing Options ----------------------- diff --git a/docs/src/whatsnew/latest.rst b/docs/src/whatsnew/latest.rst index 7c6b5be63d..b87a0ec03d 100644 --- a/docs/src/whatsnew/latest.rst +++ b/docs/src/whatsnew/latest.rst @@ -87,7 +87,10 @@ This document explains the changes made to Iris for this release 🚀 Performance Enhancements =========================== -#. N/A +#. `@pp-mo`_ changed the netCDF loader to fetch data immediately from small netCDF + variables, instead of creating a dask array: This saves both time and memory. + Note that some cubes, coordinates etc loaded from netCDF will now have real data + where previously it was lazy. (:pull:`5229`) 🔥 Deprecations diff --git a/lib/iris/fileformats/netcdf/loader.py b/lib/iris/fileformats/netcdf/loader.py index 8fcab61d17..113f40b3c9 100644 --- a/lib/iris/fileformats/netcdf/loader.py +++ b/lib/iris/fileformats/netcdf/loader.py @@ -173,26 +173,53 @@ def _get_actual_dtype(cf_var): return dummy_data.dtype +# An arbitrary variable array size, below which we will fetch real data from a variable +# rather than making a lazy array for deferred access. +# Set by experiment at roughly the point where it begins to save us memory, but actually +# mostly done for speed improvement. See https://github.com/SciTools/iris/pull/5069 +_LAZYVAR_MIN_BYTES = 5000 + + def _get_cf_var_data(cf_var, filename): - # Get lazy chunked data out of a cf variable. - dtype = _get_actual_dtype(cf_var) - - # Create cube with deferred data, but no metadata - fill_value = getattr( - cf_var.cf_data, - "_FillValue", - _thread_safe_nc.default_fillvals[cf_var.dtype.str[1:]], - ) - proxy = NetCDFDataProxy( - cf_var.shape, dtype, filename, cf_var.cf_name, fill_value - ) - # Get the chunking specified for the variable : this is either a shape, or - # maybe the string "contiguous". - chunks = cf_var.cf_data.chunking() - # In the "contiguous" case, pass chunks=None to 'as_lazy_data'. - if chunks == "contiguous": - chunks = None - return as_lazy_data(proxy, chunks=chunks) + """ + Get an array representing the data of a CF variable. + + This is typically a lazy array based around a NetCDFDataProxy, but if the variable + is "sufficiently small", we instead fetch the data as a real (numpy) array. + The latter is especially valuable for scalar coordinates, which are otherwise + unnecessarily slow + wasteful of memory. + + """ + total_bytes = cf_var.size * cf_var.dtype.itemsize + if total_bytes < _LAZYVAR_MIN_BYTES: + # Don't make a lazy array, as it will cost more memory AND more time to access. + # Instead fetch the data immediately, as a real array, and return that. + result = cf_var[:] + + else: + # Get lazy chunked data out of a cf variable. + dtype = _get_actual_dtype(cf_var) + + # Make a data-proxy that mimics array access and can fetch from the file. + fill_value = getattr( + cf_var.cf_data, + "_FillValue", + _thread_safe_nc.default_fillvals[cf_var.dtype.str[1:]], + ) + proxy = NetCDFDataProxy( + cf_var.shape, dtype, filename, cf_var.cf_name, fill_value + ) + # Get the chunking specified for the variable : this is either a shape, or + # maybe the string "contiguous". + chunks = cf_var.cf_data.chunking() + # In the "contiguous" case, pass chunks=None to 'as_lazy_data'. + if chunks == "contiguous": + chunks = None + + # Return a dask array providing deferred access. + result = as_lazy_data(proxy, chunks=chunks) + + return result class _OrderedAddableList(list): diff --git a/lib/iris/tests/integration/netcdf/test_general.py b/lib/iris/tests/integration/netcdf/test_general.py index 63b977674d..339a38fd1f 100644 --- a/lib/iris/tests/integration/netcdf/test_general.py +++ b/lib/iris/tests/integration/netcdf/test_general.py @@ -13,6 +13,7 @@ import os.path import shutil import tempfile +from unittest import mock import warnings import numpy as np @@ -34,7 +35,11 @@ def test_lazy_preserved_save(self): fpath = tests.get_data_path( ("NetCDF", "label_and_climate", "small_FC_167_mon_19601101.nc") ) - acube = iris.load_cube(fpath, "air_temperature") + # While loading, "turn off" loading small variables as real data. + with mock.patch( + "iris.fileformats.netcdf.loader._LAZYVAR_MIN_BYTES", 0 + ): + acube = iris.load_cube(fpath, "air_temperature") self.assertTrue(acube.has_lazy_data()) # Also check a coord with lazy points + bounds. self.assertTrue(acube.coord("forecast_period").has_lazy_points()) diff --git a/lib/iris/tests/integration/test_cube.py b/lib/iris/tests/integration/test_cube.py index 996362f594..ad6666d28e 100644 --- a/lib/iris/tests/integration/test_cube.py +++ b/lib/iris/tests/integration/test_cube.py @@ -9,6 +9,8 @@ # importing anything else. import iris.tests as tests # isort:skip +from unittest import mock + import numpy as np import iris @@ -23,7 +25,13 @@ def test_agg_by_aux_coord(self): problem_test_file = tests.get_data_path( ("NetCDF", "testing", "small_theta_colpex.nc") ) - cube = iris.load_cube(problem_test_file, "air_potential_temperature") + # While loading, "turn off" loading small variables as real data. + with mock.patch( + "iris.fileformats.netcdf.loader._LAZYVAR_MIN_BYTES", 0 + ): + cube = iris.load_cube( + problem_test_file, "air_potential_temperature" + ) # Test aggregating by aux coord, notably the `forecast_period` aux # coord on `cube`, whose `_points` attribute is a lazy array. diff --git a/lib/iris/tests/results/netcdf/int64_auxiliary_coord_netcdf3.cml b/lib/iris/tests/results/netcdf/int64_auxiliary_coord_netcdf3.cml index e48cf41d2a..616b338a25 100644 --- a/lib/iris/tests/results/netcdf/int64_auxiliary_coord_netcdf3.cml +++ b/lib/iris/tests/results/netcdf/int64_auxiliary_coord_netcdf3.cml @@ -10,6 +10,6 @@ - + diff --git a/lib/iris/tests/results/netcdf/int64_dimension_coord_netcdf3.cml b/lib/iris/tests/results/netcdf/int64_dimension_coord_netcdf3.cml index 78fec459e9..2a604d90fc 100644 --- a/lib/iris/tests/results/netcdf/int64_dimension_coord_netcdf3.cml +++ b/lib/iris/tests/results/netcdf/int64_dimension_coord_netcdf3.cml @@ -10,6 +10,6 @@ - + diff --git a/lib/iris/tests/results/netcdf/save_load_traj.cml b/lib/iris/tests/results/netcdf/save_load_traj.cml index 3bb2951f7a..65ed143990 100644 --- a/lib/iris/tests/results/netcdf/save_load_traj.cml +++ b/lib/iris/tests/results/netcdf/save_load_traj.cml @@ -38,6 +38,6 @@ - + diff --git a/lib/iris/tests/results/netcdf/uint32_auxiliary_coord_netcdf3.cml b/lib/iris/tests/results/netcdf/uint32_auxiliary_coord_netcdf3.cml index e48cf41d2a..616b338a25 100644 --- a/lib/iris/tests/results/netcdf/uint32_auxiliary_coord_netcdf3.cml +++ b/lib/iris/tests/results/netcdf/uint32_auxiliary_coord_netcdf3.cml @@ -10,6 +10,6 @@ - + diff --git a/lib/iris/tests/results/netcdf/uint32_dimension_coord_netcdf3.cml b/lib/iris/tests/results/netcdf/uint32_dimension_coord_netcdf3.cml index 78fec459e9..2a604d90fc 100644 --- a/lib/iris/tests/results/netcdf/uint32_dimension_coord_netcdf3.cml +++ b/lib/iris/tests/results/netcdf/uint32_dimension_coord_netcdf3.cml @@ -10,6 +10,6 @@ - + diff --git a/lib/iris/tests/unit/aux_factory/test_AuxCoordFactory.py b/lib/iris/tests/unit/aux_factory/test_AuxCoordFactory.py index 3375f63bf2..f8bd54093f 100644 --- a/lib/iris/tests/unit/aux_factory/test_AuxCoordFactory.py +++ b/lib/iris/tests/unit/aux_factory/test_AuxCoordFactory.py @@ -12,6 +12,8 @@ # importing anything else. import iris.tests as tests # isort:skip +from unittest import mock + import numpy as np import iris @@ -143,7 +145,11 @@ def setUp(self): path = tests.get_data_path( ["NetCDF", "testing", "small_theta_colpex.nc"] ) - self.cube = iris.load_cube(path, "air_potential_temperature") + # While loading, "turn off" loading small variables as real data. + with mock.patch( + "iris.fileformats.netcdf.loader._LAZYVAR_MIN_BYTES", 0 + ): + self.cube = iris.load_cube(path, "air_potential_temperature") def _check_lazy(self): coords = self.cube.aux_coords + self.cube.derived_coords diff --git a/lib/iris/tests/unit/fileformats/nc_load_rules/helpers/test_build_ancil_var.py b/lib/iris/tests/unit/fileformats/nc_load_rules/helpers/test_build_ancil_var.py index b057a41a3e..36ef025bfa 100644 --- a/lib/iris/tests/unit/fileformats/nc_load_rules/helpers/test_build_ancil_var.py +++ b/lib/iris/tests/unit/fileformats/nc_load_rules/helpers/test_build_ancil_var.py @@ -40,6 +40,7 @@ def mock_cf_av_var(monkeypatch): long_name="wibble", units="m2", shape=data.shape, + size=np.prod(data.shape), dtype=data.dtype, __getitem__=lambda self, key: data[key], ) diff --git a/lib/iris/tests/unit/fileformats/nc_load_rules/helpers/test_build_auxiliary_coordinate.py b/lib/iris/tests/unit/fileformats/nc_load_rules/helpers/test_build_auxiliary_coordinate.py index 13622b72e2..a0e105b795 100644 --- a/lib/iris/tests/unit/fileformats/nc_load_rules/helpers/test_build_auxiliary_coordinate.py +++ b/lib/iris/tests/unit/fileformats/nc_load_rules/helpers/test_build_auxiliary_coordinate.py @@ -8,11 +8,11 @@ build_auxilliary_coordinate`. """ - # import iris tests first so that some things can be initialised before # importing anything else import iris.tests as tests # isort:skip +import contextlib from unittest import mock import numpy as np @@ -48,6 +48,7 @@ def setUp(self): long_name="wibble", units="m", shape=points.shape, + size=np.prod(points.shape), dtype=points.dtype, __getitem__=lambda self, key: points[key], ) @@ -111,6 +112,7 @@ def _make_cf_bounds_var(self, dimension_names): cf_name="wibble_bnds", cf_data=cf_data, shape=bounds.shape, + size=np.prod(bounds.shape), dtype=bounds.dtype, __getitem__=lambda self, key: bounds[key], ) @@ -165,6 +167,7 @@ def setUp(self): long_name="wibble", units="m", shape=points.shape, + size=np.prod(points.shape), dtype=points.dtype, __getitem__=lambda self, key: points[key], ) @@ -176,21 +179,29 @@ def setUp(self): cube_parts=dict(coordinates=[]), ) + @contextlib.contextmanager + def deferred_load_patch(self): def patched__getitem__(proxy_self, keys): if proxy_self.variable_name == self.cf_coord_var.cf_name: return self.cf_coord_var[keys] raise RuntimeError() - self.deferred_load_patch = mock.patch( + # Fix for deferred load, *AND* avoid loading small variable data in real arrays. + with mock.patch( "iris.fileformats.netcdf.NetCDFDataProxy.__getitem__", new=patched__getitem__, - ) + ): + # While loading, "turn off" loading small variables as real data. + with mock.patch( + "iris.fileformats.netcdf.loader._LAZYVAR_MIN_BYTES", 0 + ): + yield def test_scale_factor_add_offset_int(self): self.cf_coord_var.scale_factor = 3 self.cf_coord_var.add_offset = 5 - with self.deferred_load_patch: + with self.deferred_load_patch(): build_auxiliary_coordinate(self.engine, self.cf_coord_var) coord, _ = self.engine.cube_parts["coordinates"][0] @@ -199,7 +210,7 @@ def test_scale_factor_add_offset_int(self): def test_scale_factor_float(self): self.cf_coord_var.scale_factor = 3.0 - with self.deferred_load_patch: + with self.deferred_load_patch(): build_auxiliary_coordinate(self.engine, self.cf_coord_var) coord, _ = self.engine.cube_parts["coordinates"][0] @@ -208,7 +219,7 @@ def test_scale_factor_float(self): def test_add_offset_float(self): self.cf_coord_var.add_offset = 5.0 - with self.deferred_load_patch: + with self.deferred_load_patch(): build_auxiliary_coordinate(self.engine, self.cf_coord_var) coord, _ = self.engine.cube_parts["coordinates"][0] @@ -239,6 +250,7 @@ def setUp(self): units="days since 1970-01-01", calendar=None, shape=points.shape, + size=np.prod(points.shape), dtype=points.dtype, __getitem__=lambda self, key: points[key], ) @@ -251,6 +263,7 @@ def setUp(self): cf_name="wibble_bnds", cf_data=mock.MagicMock(chunking=mock.Mock(return_value=None)), shape=bounds.shape, + size=np.prod(bounds.shape), dtype=bounds.dtype, __getitem__=lambda self, key: bounds[key], ) diff --git a/lib/iris/tests/unit/fileformats/nc_load_rules/helpers/test_build_cell_measure.py b/lib/iris/tests/unit/fileformats/nc_load_rules/helpers/test_build_cell_measure.py index efbb0649c9..3fe64056bb 100644 --- a/lib/iris/tests/unit/fileformats/nc_load_rules/helpers/test_build_cell_measure.py +++ b/lib/iris/tests/unit/fileformats/nc_load_rules/helpers/test_build_cell_measure.py @@ -40,6 +40,7 @@ def mock_cf_cm_var(monkeypatch): long_name="wibble", units="m2", shape=data.shape, + size=np.prod(data.shape), dtype=data.dtype, __getitem__=lambda self, key: data[key], cf_measure="area", diff --git a/lib/iris/tests/unit/fileformats/netcdf/loader/test__get_cf_var_data.py b/lib/iris/tests/unit/fileformats/netcdf/loader/test__get_cf_var_data.py index 054c8e2db1..7912648786 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/loader/test__get_cf_var_data.py +++ b/lib/iris/tests/unit/fileformats/netcdf/loader/test__get_cf_var_data.py @@ -4,7 +4,6 @@ # See COPYING and COPYING.LESSER in the root of the repository for full # licensing details. """Unit tests for the `iris.fileformats.netcdf._get_cf_var_data` function.""" - # Import iris.tests first so that some things can be initialised before # importing anything else. import iris.tests as tests # isort:skip @@ -25,16 +24,24 @@ def setUp(self): self.shape = (300000, 240, 200) self.expected_chunks = _optimum_chunksize(self.shape, self.shape) - def _make(self, chunksizes): - cf_data = mock.Mock(_FillValue=None) + def _make(self, chunksizes=None, shape=None, dtype="i4"): + cf_data = mock.MagicMock( + _FillValue=None, + __getitem__="", + ) cf_data.chunking = mock.MagicMock(return_value=chunksizes) + if shape is None: + shape = self.shape + dtype = np.dtype(dtype) cf_var = mock.MagicMock( spec=iris.fileformats.cf.CFVariable, - dtype=np.dtype("i4"), + dtype=dtype, cf_data=cf_data, cf_name="DUMMY_VAR", - shape=self.shape, + shape=shape, + size=np.prod(shape), ) + cf_var.__getitem__.return_value = mock.sentinel.real_data_accessed return cf_var def test_cf_data_type(self): @@ -68,6 +75,21 @@ def test_cf_data_contiguous(self): lazy_data_chunks = [c[0] for c in lazy_data.chunks] self.assertArrayEqual(lazy_data_chunks, self.expected_chunks) + def test_type__1kf8_is_lazy(self): + cf_var = self._make(shape=(1000,), dtype="f8") + var_data = _get_cf_var_data(cf_var, self.filename) + self.assertIsInstance(var_data, dask_array) + + def test_arraytype__1ki2_is_real(self): + cf_var = self._make(shape=(1000,), dtype="i2") + var_data = _get_cf_var_data(cf_var, self.filename) + self.assertIs(var_data, mock.sentinel.real_data_accessed) + + def test_arraytype__100f8_is_real(self): + cf_var = self._make(shape=(100,), dtype="f8") + var_data = _get_cf_var_data(cf_var, self.filename) + self.assertIs(var_data, mock.sentinel.real_data_accessed) + if __name__ == "__main__": tests.main() diff --git a/lib/iris/tests/unit/fileformats/netcdf/loader/test__load_cube.py b/lib/iris/tests/unit/fileformats/netcdf/loader/test__load_cube.py index 6e28a2f8e4..b67c546aa0 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/loader/test__load_cube.py +++ b/lib/iris/tests/unit/fileformats/netcdf/loader/test__load_cube.py @@ -60,6 +60,7 @@ def _make(self, names, attrs): cf_name="DUMMY_VAR", cf_group=coords, shape=shape, + size=np.prod(shape), ) return cf, cf_var @@ -139,6 +140,7 @@ def _make(self, attrs): cf_group=mock.Mock(), cf_attrs_unused=cf_attrs_unused, shape=shape, + size=np.prod(shape), ) return cf_var From a7e06894d5591703a9ceb5e9599bd59b5a921a99 Mon Sep 17 00:00:00 2001 From: Manuel Schlund <32543114+schlunma@users.noreply.github.com> Date: Wed, 12 Apr 2023 10:28:53 +0200 Subject: [PATCH 61/85] Handle derived coordinates correctly in `concatenate` (#5096) * First working prototype of concatenate that handels derived coordinates correctly * Added checks for derived coord metadata during concatenation * Added tests * Fixed defaults * Added what's new entry * Optimized test coverage --- docs/src/whatsnew/latest.rst | 3 + lib/iris/_concatenate.py | 186 ++++++++++++++++++ lib/iris/cube.py | 56 ++++-- .../concatenate/test_concatenate.py | 153 +++++++++++++- lib/iris/tests/test_concatenate.py | 66 ++++++- .../unit/concatenate/test_concatenate.py | 27 +++ 6 files changed, 473 insertions(+), 18 deletions(-) diff --git a/docs/src/whatsnew/latest.rst b/docs/src/whatsnew/latest.rst index b87a0ec03d..402f436c97 100644 --- a/docs/src/whatsnew/latest.rst +++ b/docs/src/whatsnew/latest.rst @@ -62,6 +62,9 @@ This document explains the changes made to Iris for this release 🐛 Bugs Fixed ============= +#. `@schlunma`_ fixed :meth:`iris.cube.CubeList.concatenate` so that it + preserves derived coordinates. (:issue:`2478`, :pull:`5096`) + #. `@trexfeathers`_ and `@pp-mo`_ made Iris' use of the `netCDF4`_ library thread-safe. (:pull:`5095`) diff --git a/lib/iris/_concatenate.py b/lib/iris/_concatenate.py index 5debc452ee..a383e4e01a 100644 --- a/lib/iris/_concatenate.py +++ b/lib/iris/_concatenate.py @@ -160,6 +160,39 @@ def name(self): return self.defn.name() +class _DerivedCoordAndDims( + namedtuple("DerivedCoordAndDims", ["coord", "dims", "aux_factory"]) +): + """ + Container for a derived coordinate, the associated AuxCoordFactory, and the + associated data dimension(s) spanned over a :class:`iris.cube.Cube`. + + Args: + + * coord: + A :class:`iris.coords.DimCoord` or :class:`iris.coords.AuxCoord` + coordinate instance. + + * dims: + A tuple of the data dimension(s) spanned by the coordinate. + + * aux_factory: + A :class:`iris.aux_factory.AuxCoordFactory` instance. + + """ + + __slots__ = () + + def __eq__(self, other): + """Do not take aux factories into account for equality.""" + result = NotImplemented + if isinstance(other, _DerivedCoordAndDims): + equal_coords = self.coord == other.coord + equal_dims = self.dims == other.dims + result = equal_coords and equal_dims + return result + + class _OtherMetaData(namedtuple("OtherMetaData", ["defn", "dims"])): """ Container for the metadata that defines a cell measure or ancillary @@ -280,6 +313,7 @@ def concatenate( check_aux_coords=True, check_cell_measures=True, check_ancils=True, + check_derived_coords=True, ): """ Concatenate the provided cubes over common existing dimensions. @@ -296,6 +330,30 @@ def concatenate( If True, raise an informative :class:`~iris.exceptions.ContatenateError` if registration fails. + * check_aux_coords + Checks if the points and bounds of auxiliary coordinates of the cubes + match. This check is not applied to auxiliary coordinates that span the + dimension the concatenation is occurring along. Defaults to True. + + * check_cell_measures + Checks if the data of cell measures of the cubes match. This check is + not applied to cell measures that span the dimension the concatenation + is occurring along. Defaults to True. + + * check_ancils + Checks if the data of ancillary variables of the cubes match. This + check is not applied to ancillary variables that span the dimension the + concatenation is occurring along. Defaults to True. + + * check_derived_coords + Checks if the points and bounds of derived coordinates of the cubes + match. This check is not applied to derived coordinates that span the + dimension the concatenation is occurring along. Note that differences + in scalar coordinates and dimensional coordinates used to derive the + coordinate are still checked. Checks for auxiliary coordinates used to + derive the coordinates can be ignored with `check_aux_coords`. Defaults + to True. + Returns: A :class:`iris.cube.CubeList` of concatenated :class:`iris.cube.Cube` instances. @@ -321,6 +379,7 @@ def concatenate( check_aux_coords, check_cell_measures, check_ancils, + check_derived_coords, ) if registered: axis = proto_cube.axis @@ -378,6 +437,8 @@ def __init__(self, cube): self.cm_metadata = [] self.ancillary_variables_and_dims = [] self.av_metadata = [] + self.derived_coords_and_dims = [] + self.derived_metadata = [] self.dim_mapping = [] # Determine whether there are any anonymous cube dimensions. @@ -437,6 +498,17 @@ def meta_key_func(dm): av_and_dims = _CoordAndDims(av, tuple(dims)) self.ancillary_variables_and_dims.append(av_and_dims) + def name_key_func(factory): + return factory.name() + + for factory in sorted(cube.aux_factories, key=name_key_func): + coord = factory.make_coord(cube.coord_dims) + dims = cube.coord_dims(coord) + metadata = _CoordMetaData(coord, dims) + self.derived_metadata.append(metadata) + coord_and_dims = _DerivedCoordAndDims(coord, tuple(dims), factory) + self.derived_coords_and_dims.append(coord_and_dims) + def _coordinate_differences(self, other, attr, reason="metadata"): """ Determine the names of the coordinates that differ between `self` and @@ -544,6 +616,14 @@ def match(self, other, error_on_mismatch): msgs.append( msg_template.format("Ancillary variables", *differences) ) + # Check derived coordinates. + if self.derived_metadata != other.derived_metadata: + differences = self._coordinate_differences( + other, "derived_metadata" + ) + msgs.append( + msg_template.format("Derived coordinates", *differences) + ) # Check scalar coordinates. if self.scalar_coords != other.scalar_coords: differences = self._coordinate_differences( @@ -597,6 +677,7 @@ def __init__(self, cube_signature): self.ancillary_variables_and_dims = ( cube_signature.ancillary_variables_and_dims ) + self.derived_coords_and_dims = cube_signature.derived_coords_and_dims self.dim_coords = cube_signature.dim_coords self.dim_mapping = cube_signature.dim_mapping self.dim_extents = [] @@ -779,6 +860,11 @@ def concatenate(self): # Concatenate the new ancillary variables ancillary_variables_and_dims = self._build_ancillary_variables() + # Concatenate the new aux factories + aux_factories = self._build_aux_factories( + dim_coords_and_dims, aux_coords_and_dims + ) + # Concatenate the new data payload. data = self._build_data() @@ -790,6 +876,7 @@ def concatenate(self): aux_coords_and_dims=aux_coords_and_dims, cell_measures_and_dims=cell_measures_and_dims, ancillary_variables_and_dims=ancillary_variables_and_dims, + aux_factories=aux_factories, **kwargs, ) else: @@ -807,6 +894,7 @@ def register( check_aux_coords=False, check_cell_measures=False, check_ancils=False, + check_derived_coords=False, ): """ Determine whether the given source-cube is suitable for concatenation @@ -827,6 +915,31 @@ def register( * error_on_mismatch: If True, raise an informative error if registration fails. + * check_aux_coords + Checks if the points and bounds of auxiliary coordinates of the + cubes match. This check is not applied to auxiliary coordinates + that span the dimension the concatenation is occurring along. + Defaults to False. + + * check_cell_measures + Checks if the data of cell measures of the cubes match. This check + is not applied to cell measures that span the dimension the + concatenation is occurring along. Defaults to False. + + * check_ancils + Checks if the data of ancillary variables of the cubes match. This + check is not applied to ancillary variables that span the dimension + the concatenation is occurring along. Defaults to False. + + * check_derived_coords + Checks if the points and bounds of derived coordinates of the cubes + match. This check is not applied to derived coordinates that span + the dimension the concatenation is occurring along. Note that + differences in scalar coordinates and dimensional coordinates used + to derive the coordinate are still checked. Checks for auxiliary + coordinates used to derive the coordinates can be ignored with + `check_aux_coords`. Defaults to False. + Returns: Boolean. @@ -905,6 +1018,21 @@ def register( if not coord_a == coord_b: match = False + # Check for compatible derived coordinates. + if match: + if check_derived_coords: + for coord_a, coord_b in zip( + self._cube_signature.derived_coords_and_dims, + cube_signature.derived_coords_and_dims, + ): + # Derived coords that span the candidate axis can differ + if ( + candidate_axis not in coord_a.dims + or candidate_axis not in coord_b.dims + ): + if not coord_a == coord_b: + match = False + if match: # Register the cube as a source-cube for this proto-cube. self._add_skeleton(coord_signature, cube.lazy_data()) @@ -1088,6 +1216,64 @@ def _build_ancillary_variables(self): return ancillary_variables_and_dims + def _build_aux_factories(self, dim_coords_and_dims, aux_coords_and_dims): + """ + Generate the aux factories for the new concatenated cube. + + Args: + + * dim_coords_and_dims: + A list of dimension coordinate and dimension tuple pairs from the + concatenated cube. + + * aux_coords_and_dims: + A list of auxiliary coordinates and dimension(s) tuple pairs from + the concatenated cube. + + Returns: + A list of :class:`iris.aux_factory.AuxCoordFactory`. + + """ + # Setup convenience hooks. + cube_signature = self._cube_signature + old_dim_coords = cube_signature.dim_coords + old_aux_coords = [a[0] for a in cube_signature.aux_coords_and_dims] + new_dim_coords = [d[0] for d in dim_coords_and_dims] + new_aux_coords = [a[0] for a in aux_coords_and_dims] + scalar_coords = cube_signature.scalar_coords + + aux_factories = [] + + # Generate all the factories for the new concatenated cube. + for i, (coord, dims, factory) in enumerate( + cube_signature.derived_coords_and_dims + ): + # Check whether the derived coordinate of the factory spans the + # nominated dimension of concatenation. + if self.axis in dims: + # Update the dependencies of the factory with coordinates of + # the concatenated cube. We need to check all coordinate types + # here (dim coords, aux coords, and scalar coords). + new_dependencies = {} + for old_dependency in factory.dependencies.values(): + if old_dependency in old_dim_coords: + dep_idx = old_dim_coords.index(old_dependency) + new_dependency = new_dim_coords[dep_idx] + elif old_dependency in old_aux_coords: + dep_idx = old_aux_coords.index(old_dependency) + new_dependency = new_aux_coords[dep_idx] + else: + dep_idx = scalar_coords.index(old_dependency) + new_dependency = scalar_coords[dep_idx] + new_dependencies[id(old_dependency)] = new_dependency + + # Create new factory with the updated dependencies. + factory = factory.updated(new_dependencies) + + aux_factories.append(factory) + + return aux_factories + def _build_data(self): """ Generate the data payload for the new concatenated cube. diff --git a/lib/iris/cube.py b/lib/iris/cube.py index b09f61aefb..7c6fd55c10 100644 --- a/lib/iris/cube.py +++ b/lib/iris/cube.py @@ -542,6 +542,7 @@ def concatenate_cube( check_aux_coords=True, check_cell_measures=True, check_ancils=True, + check_derived_coords=True, ): """ Return the concatenated contents of the :class:`CubeList` as a single @@ -554,20 +555,30 @@ def concatenate_cube( Kwargs: * check_aux_coords - Checks the auxiliary coordinates of the cubes match. This check - is not applied to auxiliary coordinates that span the dimension - the concatenation is occurring along. Defaults to True. + Checks if the points and bounds of auxiliary coordinates of the + cubes match. This check is not applied to auxiliary coordinates + that span the dimension the concatenation is occurring along. + Defaults to True. * check_cell_measures - Checks the cell measures of the cubes match. This check - is not applied to cell measures that span the dimension - the concatenation is occurring along. Defaults to True. + Checks if the data of cell measures of the cubes match. This check + is not applied to cell measures that span the dimension the + concatenation is occurring along. Defaults to True. * check_ancils - Checks the ancillary variables of the cubes match. This check - is not applied to ancillary variables that span the dimension + Checks if the data of ancillary variables of the cubes match. This + check is not applied to ancillary variables that span the dimension the concatenation is occurring along. Defaults to True. + * check_derived_coords + Checks if the points and bounds of derived coordinates of the cubes + match. This check is not applied to derived coordinates that span + the dimension the concatenation is occurring along. Note that + differences in scalar coordinates and dimensional coordinates used + to derive the coordinate are still checked. Checks for auxiliary + coordinates used to derive the coordinates can be ignored with + `check_aux_coords`. Defaults to True. + .. note:: Concatenation cannot occur along an anonymous dimension. @@ -587,6 +598,7 @@ def concatenate_cube( check_aux_coords=check_aux_coords, check_cell_measures=check_cell_measures, check_ancils=check_ancils, + check_derived_coords=check_derived_coords, ) n_res_cubes = len(res) if n_res_cubes == 1: @@ -613,6 +625,7 @@ def concatenate( check_aux_coords=True, check_cell_measures=True, check_ancils=True, + check_derived_coords=True, ): """ Concatenate the cubes over their common dimensions. @@ -620,20 +633,30 @@ def concatenate( Kwargs: * check_aux_coords - Checks the auxiliary coordinates of the cubes match. This check - is not applied to auxiliary coordinates that span the dimension - the concatenation is occurring along. Defaults to True. + Checks if the points and bounds of auxiliary coordinates of the + cubes match. This check is not applied to auxiliary coordinates + that span the dimension the concatenation is occurring along. + Defaults to True. * check_cell_measures - Checks the cell measures of the cubes match. This check - is not applied to cell measures that span the dimension - the concatenation is occurring along. Defaults to True. + Checks if the data of cell measures of the cubes match. This check + is not applied to cell measures that span the dimension the + concatenation is occurring along. Defaults to True. * check_ancils - Checks the ancillary variables of the cubes match. This check - is not applied to ancillary variables that span the dimension + Checks if the data of ancillary variables of the cubes match. This + check is not applied to ancillary variables that span the dimension the concatenation is occurring along. Defaults to True. + * check_derived_coords + Checks if the points and bounds of derived coordinates of the cubes + match. This check is not applied to derived coordinates that span + the dimension the concatenation is occurring along. Note that + differences in scalar coordinates and dimensional coordinates used + to derive the coordinate are still checked. Checks for auxiliary + coordinates used to derive the coordinates can be ignored with + `check_aux_coords`. Defaults to True. + Returns: A new :class:`iris.cube.CubeList` of concatenated :class:`iris.cube.Cube` instances. @@ -718,6 +741,7 @@ def concatenate( check_aux_coords=check_aux_coords, check_cell_measures=check_cell_measures, check_ancils=check_ancils, + check_derived_coords=check_derived_coords, ) def realise_data(self): diff --git a/lib/iris/tests/integration/concatenate/test_concatenate.py b/lib/iris/tests/integration/concatenate/test_concatenate.py index 091ecd4378..1f39b2589d 100644 --- a/lib/iris/tests/integration/concatenate/test_concatenate.py +++ b/lib/iris/tests/integration/concatenate/test_concatenate.py @@ -16,13 +16,43 @@ import cf_units import numpy as np -from iris._concatenate import concatenate +from iris._concatenate import _DerivedCoordAndDims, concatenate +import iris.aux_factory import iris.coords import iris.cube import iris.tests.stock as stock from iris.util import unify_time_units +class Test_DerivedCoordAndDims: + def test_equal(self): + assert _DerivedCoordAndDims( + "coord", "dims", "aux_factory" + ) == _DerivedCoordAndDims("coord", "dims", "aux_factory") + + def test_non_equal_coord(self): + assert _DerivedCoordAndDims( + "coord_0", "dims", "aux_factory" + ) != _DerivedCoordAndDims("coord_1", "dims", "aux_factory") + + def test_non_equal_dims(self): + assert _DerivedCoordAndDims( + "coord", "dims_0", "aux_factory" + ) != _DerivedCoordAndDims("coord", "dims_1", "aux_factory") + + def test_non_equal_aux_factory(self): + # Note: aux factories are not taken into account for equality! + assert _DerivedCoordAndDims( + "coord", "dims", "aux_factory_0" + ) == _DerivedCoordAndDims("coord", "dims", "aux_factory_1") + + def test_non_equal_types(self): + assert ( + _DerivedCoordAndDims("coord", "dims", "aux_factory") + != "I am not a _DerivedCoordAndDims" + ) + + class Test_concatenate__epoch(tests.IrisTest): def simple_1d_time_cubes(self, reftimes, coords_points): cubes = [] @@ -187,6 +217,127 @@ def test_ignore_diff_ancillary_variables(self): self.assertEqual(result[0].shape, (4, 2)) +class Test_cubes_with_derived_coord(tests.IrisTest): + def create_cube(self): + data = np.arange(4).reshape(2, 2) + aux_factories = [] + + # DimCoords + sigma = iris.coords.DimCoord([0.0, 10.0], var_name="sigma", units="1") + t_unit = cf_units.Unit( + "hours since 1970-01-01 00:00:00", calendar="standard" + ) + time = iris.coords.DimCoord([0, 6], standard_name="time", units=t_unit) + + # AtmosphereSigmaFactory (does not span concatenated dim) + ptop = iris.coords.AuxCoord(100.0, var_name="ptop", units="Pa") + surface_p = iris.coords.AuxCoord([1.0, 2.0], var_name="ps", units="Pa") + aux_factories.append( + iris.aux_factory.AtmosphereSigmaFactory(ptop, sigma, surface_p) + ) + + # HybridHeightFactory (span concatenated dim) + delta = iris.coords.AuxCoord(10.0, var_name="delta", units="m") + orog = iris.coords.AuxCoord(data, var_name="orog", units="m") + aux_factories.append( + iris.aux_factory.HybridHeightFactory(delta, sigma, orog) + ) + + dim_coords_and_dims = [(time, 0), (sigma, 1)] + aux_coords_and_dims = [ + (ptop, ()), + (delta, ()), + (surface_p, 1), + (orog, (0, 1)), + ] + + cube = iris.cube.Cube( + data, + standard_name="air_temperature", + units="K", + dim_coords_and_dims=dim_coords_and_dims, + aux_coords_and_dims=aux_coords_and_dims, + aux_factories=aux_factories, + ) + return cube + + def test_equal_derived_coords(self): + cube_a = self.create_cube() + cube_b = cube_a.copy() + cube_b.coord("time").points = [12, 18] + + result = concatenate([cube_a, cube_b]) + self.assertEqual(len(result), 1) + self.assertEqual(result[0].shape, (4, 2)) + + np.testing.assert_allclose( + result[0].coord("air_pressure").points, [100.0, -880.0] + ) + np.testing.assert_allclose( + result[0].coord("altitude").points, + [[10.0, 20.0], [10.0, 40.0], [10.0, 20.0], [10.0, 40.0]], + ) + + def test_equal_derived_coords_with_bounds(self): + cube_a = self.create_cube() + cube_a.coord("sigma").bounds = [[0.0, 5.0], [5.0, 20.0]] + cube_b = cube_a.copy() + cube_b.coord("time").points = [12, 18] + + result = concatenate([cube_a, cube_b]) + self.assertEqual(len(result), 1) + self.assertEqual(result[0].shape, (4, 2)) + + np.testing.assert_allclose( + result[0].coord("air_pressure").bounds, + [[100.0, -395.0], [-390.0, -1860.0]], + ) + + def test_diff_altitude(self): + """Gives one cube since altitude spans concatenation dim.""" + cube_a = self.create_cube() + cube_b = cube_a.copy() + cube_b.coord("time").points = [12, 18] + cube_b.coord("orog").points = [[0, 0], [0, 0]] + + result = concatenate([cube_a, cube_b]) + self.assertEqual(len(result), 1) + self.assertEqual(result[0].shape, (4, 2)) + + np.testing.assert_allclose( + result[0].coord("altitude").points, + [[10.0, 20.0], [10.0, 40.0], [10.0, 10.0], [10.0, 10.0]], + ) + + def test_diff_air_pressure(self): + """Gives two cubes since altitude does not span concatenation dim.""" + cube_a = self.create_cube() + cube_b = cube_a.copy() + cube_b.coord("time").points = [12, 18] + cube_b.coord("ps").points = [10.0, 20.0] + + result = concatenate([cube_a, cube_b], check_aux_coords=False) + self.assertEqual(len(result), 2) + + def test_ignore_diff_air_pressure(self): + cube_a = self.create_cube() + cube_b = cube_a.copy() + cube_b.coord("time").points = [12, 18] + cube_b.coord("ps").points = [10.0, 20.0] + + result = concatenate( + [cube_a, cube_b], + check_aux_coords=False, + check_derived_coords=False, + ) + self.assertEqual(len(result), 1) + self.assertEqual(result[0].shape, (4, 2)) + + np.testing.assert_allclose( + result[0].coord("air_pressure").points, [100.0, -880.0] + ) + + class Test_anonymous_dims(tests.IrisTest): def setUp(self): data = np.arange(12).reshape(2, 3, 2) diff --git a/lib/iris/tests/test_concatenate.py b/lib/iris/tests/test_concatenate.py index 968b71d292..e4c22f49b0 100644 --- a/lib/iris/tests/test_concatenate.py +++ b/lib/iris/tests/test_concatenate.py @@ -15,13 +15,22 @@ import numpy as np import numpy.ma as ma +from iris.aux_factory import HybridHeightFactory from iris.coords import AncillaryVariable, AuxCoord, CellMeasure, DimCoord import iris.cube import iris.tests.stock as stock def _make_cube( - x, y, data, aux=None, cell_measure=None, ancil=None, offset=0, scalar=None + x, + y, + data, + aux=None, + cell_measure=None, + ancil=None, + derived=None, + offset=0, + scalar=None, ): """ A convenience test function that creates a custom 2D cube. @@ -47,6 +56,18 @@ def _make_cube( A CSV string specifying which points only auxiliary coordinates to create. Accepts either of 'x', 'y', 'xy'. + * cell_measure: + A CSV string specifying which points only cell measures + coordinates to create. Accepts either of 'x', 'y', 'xy'. + + * ancil: + A CSV string specifying which points only ancillary variables + coordinates to create. Accepts either of 'x', 'y', 'xy'. + + * derived: + A CSV string specifying which points only derived coordinates + coordinates to create. Accepts either of 'x', 'y', 'xy'. + * offset: Offset value to be added to the 'xy' auxiliary coordinate points. @@ -120,6 +141,30 @@ def _make_cube( ) cube.add_ancillary_variable(av, (0, 1)) + if derived is not None: + derived = derived.split(",") + delta = AuxCoord(0.0, var_name="delta", units="m") + sigma = AuxCoord(1.0, var_name="sigma", units="1") + cube.add_aux_coord(delta, ()) + cube.add_aux_coord(sigma, ()) + if "y" in derived: + orog = AuxCoord(y_range * 10, long_name="orog", units="m") + cube.add_aux_coord(orog, 0) + elif "x" in derived: + orog = AuxCoord(x_range * 10, long_name="orog", units="m") + cube.add_aux_coord(orog, 1) + elif "xy" in derived: + payload = np.arange(y_size * x_size, dtype=np.float32).reshape( + y_size, x_size + ) + orog = AuxCoord( + payload * 100 + offset, long_name="orog", units="m" + ) + cube.add_aux_coord(orog, (0, 1)) + else: + raise NotImplementedError() + cube.add_aux_factory(HybridHeightFactory(delta, sigma, orog)) + if scalar is not None: data = np.array([scalar], dtype=np.float32) coord = AuxCoord(data, long_name="height", units="m") @@ -362,6 +407,14 @@ def test_ancil_missing(self): result = concatenate(cubes) self.assertEqual(len(result), 2) + def test_derived_coord_missing(self): + cubes = [] + y = (0, 2) + cubes.append(_make_cube((0, 2), y, 1, derived="x")) + cubes.append(_make_cube((2, 4), y, 2)) + result = concatenate(cubes) + self.assertEqual(len(result), 2) + class Test2D(tests.IrisTest): def test_masked_and_unmasked(self): @@ -736,6 +789,17 @@ def test_concat_2y2d_ancil_x_y_xy(self): self.assertEqual(result[0].shape, (6, 2)) self.assertEqual(result[0], com) + def test_concat_2y2d_derived_x_y_xy(self): + cubes = [] + x = (0, 2) + cubes.append(_make_cube(x, (0, 4), 1, derived="x,y,xy")) + cubes.append(_make_cube(x, (4, 6), 1, derived="x,y,xy")) + result = concatenate(cubes) + com = _make_cube(x, (0, 6), 1, derived="x,y,xy") + self.assertEqual(len(result), 1) + self.assertEqual(result[0].shape, (6, 2)) + self.assertEqual(result[0], com) + class TestMulti2D(tests.IrisTest): def test_concat_4x2d_aux_xy(self): diff --git a/lib/iris/tests/unit/concatenate/test_concatenate.py b/lib/iris/tests/unit/concatenate/test_concatenate.py index 96d13d7d15..a4243dfbbc 100644 --- a/lib/iris/tests/unit/concatenate/test_concatenate.py +++ b/lib/iris/tests/unit/concatenate/test_concatenate.py @@ -15,6 +15,7 @@ from iris._concatenate import concatenate from iris._lazy_data import as_lazy_data +from iris.aux_factory import HybridHeightFactory import iris.coords import iris.cube from iris.exceptions import ConcatenateError @@ -90,16 +91,26 @@ def setUp(self): iris.coords.AuxCoord([0, 1, 2], long_name="foo", units="1"), data_dims=(1,), ) + # Cell Measures cube.add_cell_measure( iris.coords.CellMeasure([0, 1, 2], long_name="bar", units="1"), data_dims=(1,), ) + # Ancillary Variables cube.add_ancillary_variable( iris.coords.AncillaryVariable( [0, 1, 2], long_name="baz", units="1" ), data_dims=(1,), ) + # Derived Coords + delta = iris.coords.AuxCoord(0.0, var_name="delta", units="m") + sigma = iris.coords.AuxCoord(1.0, var_name="sigma", units="1") + orog = iris.coords.AuxCoord(2.0, var_name="orog", units="m") + cube.add_aux_coord(delta, ()) + cube.add_aux_coord(sigma, ()) + cube.add_aux_coord(orog, ()) + cube.add_aux_factory(HybridHeightFactory(delta, sigma, orog)) self.cube = cube def test_definition_difference_message(self): @@ -190,6 +201,22 @@ def test_ancillary_variable_metadata_difference_message(self): with self.assertRaisesRegex(ConcatenateError, exc_regexp): _ = concatenate([cube_1, cube_2], True) + def test_derived_coord_difference_message(self): + cube_1 = self.cube + cube_2 = cube_1.copy() + cube_2.remove_aux_factory(cube_2.aux_factories[0]) + exc_regexp = "Derived coordinates differ: .* != .*" + with self.assertRaisesRegex(ConcatenateError, exc_regexp): + _ = concatenate([cube_1, cube_2], True) + + def test_derived_coord_metadata_difference_message(self): + cube_1 = self.cube + cube_2 = cube_1.copy() + cube_2.aux_factories[0].units = "km" + exc_regexp = "Derived coordinates metadata differ: .* != .*" + with self.assertRaisesRegex(ConcatenateError, exc_regexp): + _ = concatenate([cube_1, cube_2], True) + def test_ndim_difference_message(self): cube_1 = self.cube cube_2 = iris.cube.Cube( From c4e8bbba7d4f4d37dc146935dadc7f903e15bde4 Mon Sep 17 00:00:00 2001 From: Bill Little Date: Wed, 12 Apr 2023 09:46:42 +0100 Subject: [PATCH 62/85] clarity on whatsnew entry contributors (#5240) --- .../contributing_pull_request_checklist.rst | 6 ++-- .../documenting/whats_new_contributions.rst | 28 ++++++++++++------- 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/docs/src/developers_guide/contributing_pull_request_checklist.rst b/docs/src/developers_guide/contributing_pull_request_checklist.rst index 62177def6e..11d68ace46 100644 --- a/docs/src/developers_guide/contributing_pull_request_checklist.rst +++ b/docs/src/developers_guide/contributing_pull_request_checklist.rst @@ -6,12 +6,12 @@ Pull Request Checklist ====================== All pull request will be reviewed by a core developer who will manage the -process of merging. It is the responsibility of a developer submitting a +process of merging. It is the responsibility of the contributor submitting a pull request to do their best to deliver a pull request which meets the requirements of the project it is submitted to. -The check list summarises criteria which will be checked before a pull request -is merged. Before submitting a pull request please consider this list. +This check list summarises criteria which will be checked before a pull request +is merged. Before submitting a pull request please consider the following: #. **Provide a helpful description** of the Pull Request. This should include: diff --git a/docs/src/developers_guide/documenting/whats_new_contributions.rst b/docs/src/developers_guide/documenting/whats_new_contributions.rst index aa19722a69..82569e57a0 100644 --- a/docs/src/developers_guide/documenting/whats_new_contributions.rst +++ b/docs/src/developers_guide/documenting/whats_new_contributions.rst @@ -53,8 +53,8 @@ merge from trunk. Writing a Contribution ====================== -As introduced above, a contribution is the description of a change to Iris -which improved Iris in some way. As such, a single Iris Pull Request may +A contribution is the short description of a change introduced to Iris +which improved it in some way. As such, a single Iris Pull Request may contain multiple changes that are worth highlighting as contributions to the what's new document. @@ -67,23 +67,31 @@ exceed **column 80** and ensure that any subsequent lines of the same entry are aligned with the first. The content should target an Iris user as the audience. The required content, in order, is as follows: -* Names of those who contributed the change. These should be their GitHub - user name. Link the name to their GitHub profile. E.g. - ```@tkknight `_ changed...`` +* Use your discretion to decide on the names of all those that you want to + acknowledge as part of your contribution. Also consider the efforts of the + reviewer. Please use GitHub user names that link to their GitHub profile + e.g., - * Bigger changes take a lot of effort to review, too! Make sure you credit - the reviewer(s) where appropriate. + ```@tkknight`_ Lorem ipsum dolor sit amet ...`` -* The new/changed behaviour + Also add a full reference in the following section at the end of the ``latest.rst``:: + + .. comment + Whatsnew author names (@github name) in alphabetical order. Note that, + core dev names are automatically included by the common_links.inc: + + .. _@tkknight: https://github.com/tkknight + +* A succinct summary of the new/changed behaviour. * Context to the change. Possible examples include: what this fixes, why something was added, issue references (e.g. ``:issue:`9999```), more specific detail on the change itself. -* Pull request references, bracketed, following the final period. E.g. +* Pull request references, bracketed, following the final period e.g., ``(:pull:`1111`, :pull:`9999`)`` -* A trailing blank line (standard reStructuredText list format) +* A trailing blank line (standard reStructuredText list format). For example:: From e6661b824dc74bf303f78e94a616b2b144c352c3 Mon Sep 17 00:00:00 2001 From: Bouwe Andela Date: Wed, 12 Apr 2023 12:49:57 +0200 Subject: [PATCH 63/85] Modernize and simplify iris.analysis._Groupby (#5015) * Modernize and simplify _Groupby * Rename variable to improve readability Co-authored-by: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> * Add a whatsnew entry * Add a type hint to _add_shared_coord * Add a test for iris.analysis._Groupby.__repr__ --------- Co-authored-by: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> --- docs/src/whatsnew/latest.rst | 3 + lib/iris/analysis/__init__.py | 290 ++++++++++++-------------------- lib/iris/coords.py | 29 +--- lib/iris/tests/test_analysis.py | 11 ++ 4 files changed, 127 insertions(+), 206 deletions(-) diff --git a/docs/src/whatsnew/latest.rst b/docs/src/whatsnew/latest.rst index 402f436c97..baa362fea9 100644 --- a/docs/src/whatsnew/latest.rst +++ b/docs/src/whatsnew/latest.rst @@ -144,6 +144,9 @@ This document explains the changes made to Iris for this release 💼 Internal =========== +#. `@bouweandela`_ and `@trexfeathers`_ (reviewer) modernized and simplified + the code of ``iris.analysis._Groupby``. (:pull:`5015`) + #. `@fnattino`_ changed the order of ``ncgen`` arguments in the command to create NetCDF files for testing (caused errors on OS X). (:pull:`5105`) diff --git a/lib/iris/analysis/__init__.py b/lib/iris/analysis/__init__.py index 173487cfb0..47feb2a847 100644 --- a/lib/iris/analysis/__init__.py +++ b/lib/iris/analysis/__init__.py @@ -35,11 +35,15 @@ """ -from collections import OrderedDict +from __future__ import annotations + from collections.abc import Iterable import functools from functools import wraps from inspect import getfullargspec +import itertools +from numbers import Number +from typing import Optional, Union import warnings from cf_units import Unit @@ -2383,8 +2387,11 @@ class _Groupby: """ def __init__( - self, groupby_coords, shared_coords=None, climatological=False - ): + self, + groupby_coords: list[iris.coords.Coord], + shared_coords: Optional[list[tuple[iris.coords.Coord, int]]] = None, + climatological: bool = False, + ) -> None: """ Determine the group slices over the group-by coordinates. @@ -2408,15 +2415,15 @@ def __init__( """ #: Group-by and shared coordinates that have been grouped. - self.coords = [] - self._groupby_coords = [] - self._shared_coords = [] - self._slices_by_key = OrderedDict() + self.coords: list[iris.coords.Coord] = [] + self._groupby_coords: list[iris.coords.Coord] = [] + self._shared_coords: list[tuple[iris.coords.Coord, int]] = [] + self._groupby_indices: list[tuple[int, ...]] = [] self._stop = None # Ensure group-by coordinates are iterable. if not isinstance(groupby_coords, Iterable): raise TypeError( - "groupby_coords must be a " "`collections.Iterable` type." + "groupby_coords must be a `collections.Iterable` type." ) # Add valid group-by coordinates. @@ -2428,7 +2435,7 @@ def __init__( # Ensure shared coordinates are iterable. if not isinstance(shared_coords, Iterable): raise TypeError( - "shared_coords must be a " "`collections.Iterable` type." + "shared_coords must be a `collections.Iterable` type." ) # Add valid shared coordinates. for coord, dim in shared_coords: @@ -2439,9 +2446,11 @@ def __init__( # Stores mapping from original cube coords to new ones, as metadata may # not match - self.coord_replacement_mapping = [] + self.coord_replacement_mapping: list[ + tuple[iris.coords.Coord, iris.coords.Coord] + ] = [] - def _add_groupby_coord(self, coord): + def _add_groupby_coord(self, coord: iris.coords.Coord) -> None: if coord.ndim != 1: raise iris.exceptions.CoordinateMultiDimError(coord) if self._stop is None: @@ -2450,12 +2459,12 @@ def _add_groupby_coord(self, coord): raise ValueError("Group-by coordinates have different lengths.") self._groupby_coords.append(coord) - def _add_shared_coord(self, coord, dim): + def _add_shared_coord(self, coord: iris.coords.Coord, dim: int) -> None: if coord.shape[dim] != self._stop and self._stop is not None: raise ValueError("Shared coordinates have different lengths.") self._shared_coords.append((coord, dim)) - def group(self): + def group(self) -> list[tuple[int, ...]]: """ Calculate the groups and associated slices over one or more group-by coordinates. @@ -2464,147 +2473,84 @@ def group(self): group slices. Returns: - A generator of the coordinate group slices. - - """ - if self._groupby_coords: - if not self._slices_by_key: - items = [] - groups = [] - - for coord in self._groupby_coords: - groups.append(iris.coords._GroupIterator(coord.points)) - items.append(next(groups[-1])) - - # Construct the group slice for each group over the group-by - # coordinates. Keep constructing until all group-by coordinate - # groups are exhausted. - while any([item is not None for item in items]): - # Determine the extent (start, stop) of the group given - # each current group-by coordinate group. - start = max( - [ - item.groupby_slice.start - for item in items - if item is not None - ] - ) - stop = min( - [ - item.groupby_slice.stop - for item in items - if item is not None - ] - ) - # Construct composite group key for the group using the - # start value from each group-by coordinate. - key = tuple( - [coord.points[start] for coord in self._groupby_coords] - ) - # Associate group slice with group key within the ordered - # dictionary. - self._slices_by_key.setdefault(key, []).append( - slice(start, stop) - ) - # Prepare for the next group slice construction over the - # group-by coordinates. - for item_index, item in enumerate(items): - if item is None: - continue - # Get coordinate current group slice. - groupby_slice = item.groupby_slice - # Determine whether coordinate has spanned all its - # groups i.e. its full length - # or whether we need to get the coordinates next group. - if groupby_slice.stop == self._stop: - # This coordinate has exhausted all its groups, - # so remove it. - items[item_index] = None - elif groupby_slice.stop == stop: - # The current group of this coordinate is - # exhausted, so get the next one. - items[item_index] = next(groups[item_index]) - - # Merge multiple slices together into one tuple. - self._slice_merge() - # Calculate the new group-by coordinates. - self._compute_groupby_coords() - # Calculate the new shared coordinates. - self._compute_shared_coords() - # Generate the group-by slices/groups. - for groupby_slice in self._slices_by_key.values(): - yield groupby_slice - - return - - def _slice_merge(self): - """ - Merge multiple slices into one tuple and collapse items from - containing list. - - """ - # Iterate over the ordered dictionary in order to reduce - # multiple slices into a single tuple and collapse - # all items from containing list. - for key, groupby_slices in self._slices_by_key.items(): - if len(groupby_slices) > 1: - # Compress multiple slices into tuple representation. - groupby_indicies = [] - - for groupby_slice in groupby_slices: - groupby_indicies.extend( - range(groupby_slice.start, groupby_slice.stop) - ) - - self._slices_by_key[key] = tuple(groupby_indicies) - else: - # Remove single inner slice from list. - self._slices_by_key[key] = groupby_slices[0] - - def _compute_groupby_coords(self): + A list of the coordinate group slices. + + """ + if not self._groupby_indices: + # Construct the group indices for each group over the group-by + # coordinates. Keep constructing until all group-by coordinate + # groups are exhausted. + + def group_iterator(points): + start = 0 + for _, group in itertools.groupby(points): + stop = sum((1 for _ in group), start) + yield slice(start, stop) + start = stop + + groups = [group_iterator(c.points) for c in self._groupby_coords] + groupby_slices = [next(group) for group in groups] + indices_by_key: dict[ + tuple[Union[Number, str], ...], list[int] + ] = {} + while any(s is not None for s in groupby_slices): + # Determine the extent (start, stop) of the group given + # each current group-by coordinate group. + start = max(s.start for s in groupby_slices if s is not None) + stop = min(s.stop for s in groupby_slices if s is not None) + # Construct composite group key for the group using the + # start value from each group-by coordinate. + key = tuple( + coord.points[start] for coord in self._groupby_coords + ) + # Associate group slice with group key within the ordered + # dictionary. + indices_by_key.setdefault(key, []).extend(range(start, stop)) + # Prepare for the next group slice construction over the + # group-by coordinates. + for index, groupby_slice in enumerate(groupby_slices): + if groupby_slice is None: + continue + # Determine whether coordinate has spanned all its + # groups i.e. its full length + # or whether we need to get the coordinates next group. + if groupby_slice.stop == self._stop: + # This coordinate has exhausted all its groups, + # so remove it. + groupby_slices[index] = None + elif groupby_slice.stop == stop: + # The current group of this coordinate is + # exhausted, so get the next one. + groupby_slices[index] = next(groups[index]) + + # Cache the indices + self._groupby_indices = [tuple(i) for i in indices_by_key.values()] + # Calculate the new group-by coordinates. + self._compute_groupby_coords() + # Calculate the new shared coordinates. + self._compute_shared_coords() + + # Return the group-by indices/groups. + return self._groupby_indices + + def _compute_groupby_coords(self) -> None: """Create new group-by coordinates given the group slices.""" - - groupby_slice = [] - - # Iterate over the ordered dictionary in order to construct - # a group-by slice that samples the first element from each group. - for key_slice in self._slices_by_key.values(): - if isinstance(key_slice, tuple): - groupby_slice.append(key_slice[0]) - else: - groupby_slice.append(key_slice.start) - - groupby_slice = np.array(groupby_slice) + # Construct a group-by slice that samples the first element from each + # group. + groupby_slice = np.array([i[0] for i in self._groupby_indices]) # Create new group-by coordinates from the group-by slice. self.coords = [coord[groupby_slice] for coord in self._groupby_coords] - def _compute_shared_coords(self): + def _compute_shared_coords(self) -> None: """Create the new shared coordinates given the group slices.""" - - groupby_indices = [] - groupby_bounds = [] - - # Iterate over the ordered dictionary in order to construct a list of - # tuple group indices, and a list of the respective bounds of those - # indices. - for key_slice in self._slices_by_key.values(): - if isinstance(key_slice, tuple): - indices = key_slice - else: - indices = tuple(range(*key_slice.indices(self._stop))) - - groupby_indices.append(indices) - groupby_bounds.append((indices[0], indices[-1])) - - # Create new shared bounded coordinates. for coord, dim in self._shared_coords: climatological_coord = ( self.climatological and coord.units.is_time_reference() ) if coord.points.dtype.kind in "SU": if coord.bounds is None: - new_points = [] + new_points_list = [] new_bounds = None # np.apply_along_axis does not work with str.join, so we # need to loop through the array directly. First move axis @@ -2612,32 +2558,32 @@ def _compute_shared_coords(self): work_arr = np.moveaxis(coord.points, dim, -1) shape = work_arr.shape work_shape = (-1, shape[-1]) - new_shape = (len(self),) + new_shape: tuple[int, ...] = (len(self),) if coord.ndim > 1: new_shape += shape[:-1] work_arr = work_arr.reshape(work_shape) - for indices in groupby_indices: + for indices in self._groupby_indices: for arr in work_arr: - new_points.append("|".join(arr.take(indices))) + new_points_list.append("|".join(arr.take(indices))) # Reinstate flattened dimensions. Aggregated dim now leads. - new_points = np.array(new_points).reshape(new_shape) + new_points = np.array(new_points_list).reshape(new_shape) # Move aggregated dimension back to position it started in. new_points = np.moveaxis(new_points, 0, dim) else: msg = ( - "collapsing the bounded string coordinate {0!r}" - " is not supported".format(coord.name()) + "collapsing the bounded string coordinate" + f" {coord.name()!r} is not supported" ) raise ValueError(msg) else: - new_bounds = [] + new_bounds_list = [] if coord.has_bounds(): # Derive new coord's bounds from bounds. item = coord.bounds - maxmin_axis = (dim, -1) + maxmin_axis: Union[int, tuple[int, int]] = (dim, -1) first_choices = coord.bounds.take(0, -1) last_choices = coord.bounds.take(1, -1) @@ -2654,12 +2600,13 @@ def _compute_shared_coords(self): # Construct list of coordinate group boundary pairs. if monotonic: # Use first and last bound or point for new bounds. - for start, stop in groupby_bounds: + for indices in self._groupby_indices: + start, stop = indices[0], indices[-1] if ( getattr(coord, "circular", False) and (stop + 1) == self._stop ): - new_bounds.append( + new_bounds_list.append( [ first_choices.take(start, dim), first_choices.take(0, dim) @@ -2667,7 +2614,7 @@ def _compute_shared_coords(self): ] ) else: - new_bounds.append( + new_bounds_list.append( [ first_choices.take(start, dim), last_choices.take(stop, dim), @@ -2675,9 +2622,9 @@ def _compute_shared_coords(self): ) else: # Use min and max bound or point for new bounds. - for indices in groupby_indices: + for indices in self._groupby_indices: item_slice = item.take(indices, dim) - new_bounds.append( + new_bounds_list.append( [ item_slice.min(axis=maxmin_axis), item_slice.max(axis=maxmin_axis), @@ -2688,7 +2635,7 @@ def _compute_shared_coords(self): # dimension last, and the aggregated dimension back in its # original position. new_bounds = np.moveaxis( - np.array(new_bounds), (0, 1), (dim, -1) + np.array(new_bounds_list), (0, 1), (dim, -1) ) # Now create the new bounded group shared coordinate. @@ -2700,8 +2647,8 @@ def _compute_shared_coords(self): new_points = new_bounds.mean(-1) except TypeError: msg = ( - "The {0!r} coordinate on the collapsing dimension" - " cannot be collapsed.".format(coord.name()) + f"The {coord.name()!r} coordinate on the collapsing" + " dimension cannot be collapsed." ) raise ValueError(msg) @@ -2719,29 +2666,16 @@ def _compute_shared_coords(self): self.coords.append(new_coord) - def __len__(self): + def __len__(self) -> int: """Calculate the number of groups given the group-by coordinates.""" + return len(self.group()) - if self._slices_by_key: - value = len(self._slices_by_key) - else: - value = len([s for s in self.group()]) - - return value - - def __repr__(self): + def __repr__(self) -> str: groupby_coords = [coord.name() for coord in self._groupby_coords] - - if self._shared_coords_by_name: - shared_coords = [coord.name() for coord in self._shared_coords] - shared_string = ", shared_coords=%r)" % shared_coords - else: - shared_string = ")" - - return "%s(%r%s" % ( - self.__class__.__name__, - groupby_coords, - shared_string, + shared_coords = [coord.name() for coord, _ in self._shared_coords] + return ( + f"{self.__class__.__name__}({groupby_coords!r}" + f", shared_coords={shared_coords!r})" ) diff --git a/lib/iris/coords.py b/lib/iris/coords.py index 4245fe55ef..dcb108f712 100644 --- a/lib/iris/coords.py +++ b/lib/iris/coords.py @@ -10,7 +10,7 @@ from abc import ABCMeta, abstractmethod from collections import namedtuple -from collections.abc import Container, Iterator +from collections.abc import Container import copy from functools import lru_cache from itertools import zip_longest @@ -1218,10 +1218,6 @@ def __new__( BOUND_POSITION_END = 1 -# Private named tuple class for coordinate groups. -_GroupbyItem = namedtuple("GroupbyItem", "groupby_point, groupby_slice") - - def _get_2d_coord_bound_grid(bounds): """ Creates a grid using the bounds of a 2D coordinate with 4 sided cells. @@ -3131,26 +3127,3 @@ def xml_element(self, doc): cellMethod_xml_element.appendChild(coord_xml_element) return cellMethod_xml_element - - -# See ExplicitCoord._group() for the description/context. -class _GroupIterator(Iterator): - def __init__(self, points): - self._points = points - self._start = 0 - - def __next__(self): - num_points = len(self._points) - if self._start >= num_points: - raise StopIteration - - stop = self._start + 1 - m = self._points[self._start] - while stop < num_points and self._points[stop] == m: - stop += 1 - - group = _GroupbyItem(m, slice(self._start, stop)) - self._start = stop - return group - - next = __next__ diff --git a/lib/iris/tests/test_analysis.py b/lib/iris/tests/test_analysis.py index 0717368d98..4b36a915aa 100644 --- a/lib/iris/tests/test_analysis.py +++ b/lib/iris/tests/test_analysis.py @@ -1915,6 +1915,17 @@ def test_update_kwargs_weights(self): assert kwargs["weights"].units == "1" +def test__Groupby_repr(): + groupby_coord = iris.coords.AuxCoord([2000, 2000], var_name="year") + shared_coord = iris.coords.DimCoord( + [0, 1], + var_name="time", + units=cf_units.Unit("days since 2000-01-01"), + ) + grouper = iris.analysis._Groupby([groupby_coord], [(shared_coord, 0)]) + assert repr(grouper) == "_Groupby(['year'], shared_coords=['time'])" + + CUBE = iris.cube.Cube(0) From afbdbbd673ad5ee505f8d1ffaf22a9b6244f1761 Mon Sep 17 00:00:00 2001 From: Elias <110238618+ESadek-MO@users.noreply.github.com> Date: Wed, 12 Apr 2023 14:13:40 +0100 Subject: [PATCH 64/85] Finalises Lazy Data documentation (#5137) * cube and io lazy data notes added * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Added comments within analysis, as well as palette and iterate, and what's new * fixed docstrings as requested in @trexfeathers review * reverted cube.py for time being * fixed flake8 issue * Lazy data second batch * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * updated lastest what'snew * I almost hope this wasn't the fix, I'm such a moron * adressed review changes --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Bill Little --- docs/src/whatsnew/latest.rst | 2 + lib/iris/analysis/__init__.py | 1 + lib/iris/pandas.py | 12 +++ lib/iris/plot.py | 96 ++++++++++++++++++++++- lib/iris/quickplot.py | 47 +++++++++++ lib/iris/util.py | 143 +++++++++++++++++++++++++++++++++- 6 files changed, 295 insertions(+), 6 deletions(-) diff --git a/docs/src/whatsnew/latest.rst b/docs/src/whatsnew/latest.rst index baa362fea9..e1e2503446 100644 --- a/docs/src/whatsnew/latest.rst +++ b/docs/src/whatsnew/latest.rst @@ -140,6 +140,8 @@ This document explains the changes made to Iris for this release #. `@HGWright`_ fixed some typo's from Gitwash. (:pull:`5145`) +#. `@Esadek-MO`_ added notes to function docstrings to + to clarify if the function preserves laziness or not. (:pull:`5137`) 💼 Internal =========== diff --git a/lib/iris/analysis/__init__.py b/lib/iris/analysis/__init__.py index 47feb2a847..4cd9ccbe05 100644 --- a/lib/iris/analysis/__init__.py +++ b/lib/iris/analysis/__init__.py @@ -2036,6 +2036,7 @@ def interp_order(length): result = cube.collapsed('longitude', iris.analysis.MEDIAN) + This aggregator handles masked data, but NOT lazy data. For lazy aggregation, please try :obj:`~.PERCENTILE`. diff --git a/lib/iris/pandas.py b/lib/iris/pandas.py index 417b6b11de..522c216432 100644 --- a/lib/iris/pandas.py +++ b/lib/iris/pandas.py @@ -159,6 +159,8 @@ def as_cube( as_cube(series, calendars={0: cf_units.CALENDAR_360_DAY}) as_cube(data_frame, calendars={1: cf_units.CALENDAR_STANDARD}) + Since this function converts to/from a Pandas object, laziness will not be preserved. + """ message = ( "iris.pandas.as_cube has been deprecated, and will be removed in a " @@ -240,6 +242,8 @@ def as_cubes( :class:`dask.dataframe.DataFrame`\\ s are not supported. + Since this function converts to/from a Pandas object, laziness will not be preserved. + Examples -------- >>> from iris.pandas import as_cubes @@ -599,6 +603,10 @@ def as_series(cube, copy=True): If you have a large array that cannot be copied, make sure it is not masked and use copy=False. + Notes + ------ + Since this function converts to/from a Pandas object, laziness will not be preserved. + """ message = ( "iris.pandas.as_series has been deprecated, and will be removed in a " @@ -809,6 +817,10 @@ def as_data_frame( 419903 298.995148 Name: surface_temperature, Length: 419904, dtype: float32 + Notes + ------ + Since this function converts to/from a Pandas object, laziness will not be preserved. + """ def merge_metadata(meta_var_list): diff --git a/lib/iris/plot.py b/lib/iris/plot.py index f87d74b020..47e345b83c 100644 --- a/lib/iris/plot.py +++ b/lib/iris/plot.py @@ -1112,6 +1112,11 @@ def contour(cube, *args, **kwargs): See :func:`matplotlib.pyplot.contour` for details of other valid keyword arguments. + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ result = _draw_2d_from_points("contour", None, cube, *args, **kwargs) return result @@ -1136,6 +1141,11 @@ def contourf(cube, *args, **kwargs): See :func:`matplotlib.pyplot.contourf` for details of other valid keyword arguments. + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ coords = kwargs.get("coords") kwargs.setdefault("antialiased", True) @@ -1200,6 +1210,11 @@ def default_projection(cube): import matplotlib.pyplot as plt ax = plt.ax(projection=default_projection(cube)) + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ # XXX logic seems flawed, but it is what map_setup did... cs = cube.coord_system("CoordSystem") @@ -1218,6 +1233,11 @@ def default_projection_extent(cube, mode=iris.coords.POINT_MODE): points, or the limits of the cell's bounds. The default is iris.coords.POINT_MODE. + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ extents = cartography._xy_range(cube, mode) xlim = extents[0] @@ -1255,7 +1275,13 @@ def _fill_orography(cube, coords, mode, vert_plot, horiz_plot, style_args): def orography_at_bounds(cube, facecolor="#888888", coords=None, axes=None): - """Plots orography defined at cell boundaries from the given Cube.""" + """Plots orography defined at cell boundaries from the given Cube. + + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ # XXX Needs contiguous orography corners to work. raise NotImplementedError( @@ -1288,7 +1314,13 @@ def horiz_plot(v_coord, orography, style_args): def orography_at_points(cube, facecolor="#888888", coords=None, axes=None): - """Plots orography defined at sample points from the given Cube.""" + """Plots orography defined at sample points from the given Cube. + + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ style_args = {"facecolor": facecolor} @@ -1334,6 +1366,11 @@ def outline(cube, coords=None, color="k", linewidth=None, axes=None): The axes to use for drawing. Defaults to the current axes if none provided. + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ result = _draw_2d_from_bounds( "pcolormesh", @@ -1376,6 +1413,11 @@ def pcolor(cube, *args, **kwargs): See :func:`matplotlib.pyplot.pcolor` for details of other valid keyword arguments. + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ kwargs.setdefault("antialiased", True) kwargs.setdefault("snap", False) @@ -1410,6 +1452,11 @@ def pcolormesh(cube, *args, **kwargs): See :func:`matplotlib.pyplot.pcolormesh` for details of other valid keyword arguments. + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ result = _draw_2d_from_bounds("pcolormesh", cube, *args, **kwargs) return result @@ -1435,6 +1482,11 @@ def points(cube, *args, **kwargs): See :func:`matplotlib.pyplot.scatter` for details of other valid keyword arguments. + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ def _scatter_args(u, v, data, *args, **kwargs): @@ -1526,6 +1578,11 @@ def barbs(u_cube, v_cube, *args, **kwargs): See :func:`matplotlib.pyplot.barbs` for details of other valid keyword arguments. + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ # # TODO: check u + v cubes for compatibility. @@ -1576,6 +1633,11 @@ def quiver(u_cube, v_cube, *args, **kwargs): See :func:`matplotlib.pyplot.quiver` for details of other valid keyword arguments. + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ # # TODO: check u + v cubes for compatibility. @@ -1622,6 +1684,11 @@ def plot(*args, **kwargs): See :func:`matplotlib.pyplot.plot` for details of additional valid keyword arguments. + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ if "coords" in kwargs: raise TypeError( @@ -1654,6 +1721,11 @@ def scatter(x, y, *args, **kwargs): See :func:`matplotlib.pyplot.scatter` for details of additional valid keyword arguments. + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ # here we are more specific about argument types than generic 1d plotting if not isinstance(x, (iris.cube.Cube, iris.coords.Coord)): @@ -1689,6 +1761,11 @@ def fill_between(x, y1, y2, *args, **kwargs): See :func:`matplotlib.pyplot.fill_between` for details of additional valid keyword arguments. + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ # here we are more specific about argument types than generic 1d plotting if not isinstance(x, (iris.cube.Cube, iris.coords.Coord)): @@ -1721,6 +1798,11 @@ def hist(x, *args, **kwargs): See :func:`matplotlib.pyplot.hist` for details of additional valid keyword arguments. + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ if isinstance(x, iris.cube.Cube): data = x.data @@ -1767,6 +1849,11 @@ def symbols(x, y, symbols, size, axes=None, units="inches"): * units: ['inches', 'points'] The unit for the symbol size. + Notes + ------ + This function does maintain laziness when called; it doesn't realise data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ if axes is None: axes = plt.gca() @@ -1892,6 +1979,11 @@ def animate(cube_iterator, plot_func, fig=None, **kwargs): >>> ani = iplt.animate(cube_iter, qplt.contourf) >>> iplt.show() + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ kwargs.setdefault("interval", 100) coords = kwargs.pop("coords", None) diff --git a/lib/iris/quickplot.py b/lib/iris/quickplot.py index c992cfdbf0..9209d4b3b7 100644 --- a/lib/iris/quickplot.py +++ b/lib/iris/quickplot.py @@ -174,6 +174,11 @@ def contour(cube, *args, **kwargs): See :func:`iris.plot.contour` for details of valid keyword arguments. + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ coords = kwargs.get("coords") axes = kwargs.get("axes") @@ -201,6 +206,10 @@ def contourf(cube, *args, **kwargs): See :func:`iris.plot.contourf` for details of valid keyword arguments. + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. """ coords = kwargs.get("coords") axes = kwargs.get("axes") @@ -229,6 +238,11 @@ def outline(cube, coords=None, color="k", linewidth=None, axes=None): The width of the lines showing the cell outlines. If None, the default width in patch.linewidth in matplotlibrc is used. + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ result = iplt.outline( cube, color=color, linewidth=linewidth, coords=coords, axes=axes @@ -244,6 +258,10 @@ def pcolor(cube, *args, **kwargs): See :func:`iris.plot.pcolor` for details of valid keyword arguments. + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. """ coords = kwargs.get("coords") axes = kwargs.get("axes") @@ -258,6 +276,11 @@ def pcolormesh(cube, *args, **kwargs): See :func:`iris.plot.pcolormesh` for details of valid keyword arguments. + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ coords = kwargs.get("coords") axes = kwargs.get("axes") @@ -272,6 +295,11 @@ def points(cube, *args, **kwargs): See :func:`iris.plot.points` for details of valid keyword arguments. + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ coords = kwargs.get("coords") axes = kwargs.get("axes") @@ -288,6 +316,11 @@ def plot(*args, **kwargs): See :func:`iris.plot.plot` for details of valid arguments and keyword arguments. + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ axes = kwargs.get("axes") result = iplt.plot(*args, **kwargs) @@ -303,6 +336,11 @@ def scatter(x, y, *args, **kwargs): See :func:`iris.plot.scatter` for details of valid arguments and keyword arguments. + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ axes = kwargs.get("axes") result = iplt.scatter(x, y, *args, **kwargs) @@ -317,6 +355,10 @@ def fill_between(x, y1, y2, *args, **kwargs): See :func:`iris.plot.fill_between` for details of valid arguments and keyword arguments. + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. """ axes = kwargs.get("axes") result = iplt.fill_between(x, y1, y2, *args, **kwargs) @@ -330,6 +372,11 @@ def hist(x, *args, **kwargs): See :func:`iris.plot.hist` for details of valid arguments and keyword arguments. + + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. """ axes = kwargs.get("axes") result = iplt.hist(x, *args, **kwargs) diff --git a/lib/iris/util.py b/lib/iris/util.py index d27aa0c722..a2f041a097 100644 --- a/lib/iris/util.py +++ b/lib/iris/util.py @@ -70,6 +70,11 @@ def broadcast_to_shape(array, shape, dim_map): # a is an array of shape (48, 96) result = broadcast_to_shape(a, (96, 48, 12), (1, 0)) + Notes + ------ + This function maintains laziness when called; it does not realise data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ if len(dim_map) != array.ndim: # We must check for this condition here because we cannot rely on @@ -142,6 +147,11 @@ def delta(ndarray, dimension, circular=False): >>> iris.util.delta(original, 0, circular=360) array([90, 90, 90, 90]) + Notes + ------ + This function maintains laziness when called; it does not realise data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ if circular is not False: _delta = np.roll(ndarray, -1, axis=dimension) @@ -192,6 +202,11 @@ def describe_diff(cube_a, cube_b, output_file=None): two cubes will merge requires additional logic that is beyond the scope of this function. + Notes + ------ + This function maintains laziness when called; it does not realise data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ if output_file is None: @@ -244,6 +259,11 @@ def guess_coord_axis(coord): Returns: 'T', 'Z', 'Y', 'X', or None. + Notes + ------ + This function maintains laziness when called; it does not realise data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ axis = None @@ -305,6 +325,11 @@ def rolling_window(a, window=1, step=1, axis=-1): array([[ 1., 2., 3.], [ 6., 7., 8.]]) + Notes + ------ + This function maintains laziness when called; it does not realise data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ # NOTE: The implementation of this function originates from # https://github.com/numpy/numpy/pull/31#issuecomment-1304851 04/08/2011 @@ -359,6 +384,10 @@ def array_equal(array1, array2, withnans=False): This provides much the same functionality as :func:`numpy.array_equal`, but with additional support for arrays of strings and NaN-tolerant operation. + Notes + ------ + This function maintains laziness when called; it does not realise data. + See more at :doc:`/userguide/real_and_lazy_data`. """ def normalise_array(array): @@ -407,6 +436,11 @@ def approx_equal(a, b, max_absolute_error=1e-10, max_relative_error=1e-10): if the actual error equals the maximum, whereas :func:`util.approx_equal` will return False. + Notes + ------ + This function does maintain laziness when called; it doesn't realise data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ wmsg = ( "iris.util.approx_equal has been deprecated and will be removed, " @@ -456,6 +490,11 @@ def between(lh, rh, lh_inclusive=True, rh_inclusive=True): for i in range(10): print(i, between_3_and_6(i)) + Notes + ------ + This function does maintain laziness when called; it doesn't realise data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ if lh_inclusive and rh_inclusive: return lambda c: lh <= c <= rh @@ -510,6 +549,11 @@ def reverse(cube_or_array, coords_or_dims): [19 18 17 16] [15 14 13 12]]] + Notes + ------ + This function maintains laziness when called; it does not realise data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ from iris.cube import Cube @@ -588,6 +632,11 @@ def monotonic(array, strict=False, return_direction=False): ``(monotonic_status, direction)`` + Notes + ------ + This function maintains laziness when called; it does not realise data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ if array.ndim != 1 or len(array) <= 1: raise ValueError( @@ -640,6 +689,11 @@ def column_slices_generator(full_slice, ndims): This method was developed as numpy does not support the direct approach of [(3, 5), : , (1, 6, 8)] for column based indexing. + Notes + ------ + This function maintains laziness when called; it does not realise data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ list_of_slices = [] @@ -1035,6 +1089,10 @@ def clip_string(the_str, clip_length=70, rider="..."): If the clip length was greater than the original string, the original string is returned unaltered. + Notes + ------ + This function does maintain laziness when called; it doesn't realise data. + See more at :doc:`/userguide/real_and_lazy_data`. """ if clip_length >= len(the_str) or clip_length <= 0: @@ -1065,6 +1123,11 @@ def format_array(arr): For customisations, use the :mod:`numpy.core.arrayprint` directly. + Notes + ------ + This function does maintain laziness when called; it doesn't realise data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ max_line_len = 50 @@ -1079,7 +1142,7 @@ def format_array(arr): return result -def new_axis(src_cube, scalar_coord=None, expand_extras=()): +def new_axis(src_cube, scalar_coord=None, expand_extras=()): # maybe not lazy """ Create a new axis as the leading dimension of the cube, promoting a scalar coordinate if specified. @@ -1112,6 +1175,11 @@ def new_axis(src_cube, scalar_coord=None, expand_extras=()): >>> ncube = iris.util.new_axis(cube, 'time') >>> ncube.shape (1, 360, 360) + + Notes + ------ + This function does maintain laziness when called; it doesn't realise data. + See more at :doc:`/userguide/real_and_lazy_data`. """ def _reshape_data_array(data_manager): @@ -1229,6 +1297,11 @@ def squeeze(cube): >>> ncube.shape (360, 360) + Notes + ------ + This function maintains laziness when called; it does not realise data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ slices = [ @@ -1298,7 +1371,14 @@ def file_is_newer_than(result_path, source_paths): def is_regular(coord): - """Determine if the given coord is regular.""" + """ + Determine if the given coord is regular. + + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ try: regular_step(coord) except iris.exceptions.CoordinateNotRegularError: @@ -1309,7 +1389,15 @@ def is_regular(coord): def regular_step(coord): - """Return the regular step from a coord or fail.""" + """ + Return the regular step from a coord or fail. + + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. + + """ if coord.ndim != 1: raise iris.exceptions.CoordinateMultiDimError("Expected 1D coord") if coord.shape[0] < 2: @@ -1340,6 +1428,10 @@ def regular_points(zeroth, step, count): count : number The number of point values. + Notes + ------ + This function does maintain laziness when called; it doesn't realise data. + See more at :doc:`/userguide/real_and_lazy_data`. """ points = (zeroth + step) + step * np.arange(count, dtype=np.float32) _, regular = iris.util.points_step(points) @@ -1360,6 +1452,12 @@ def points_step(points): ------- numeric, bool A tuple containing the average difference between values, and whether the difference is regular. + + + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. """ # Calculations only make sense with multiple points points = np.asanyarray(points) @@ -1389,6 +1487,11 @@ def unify_time_units(cubes): * cubes: An iterable containing :class:`iris.cube.Cube` instances. + Notes + ------ + This function maintains laziness when called; it does not realise data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ epochs = {} @@ -1529,6 +1632,12 @@ def promote_aux_coord_to_dim_coord(cube, name_or_coord): forecast_period x - - time x - - + Notes + ------ + This function maintains laziness when called; it does not realise data. + See more at :doc:`/userguide/real_and_lazy_data`. + + """ from iris.coords import Coord, DimCoord @@ -1655,6 +1764,12 @@ def demote_dim_coord_to_aux_coord(cube, name_or_coord): time x - - year x - - + Notes + ------ + This function maintains laziness when called; it does not realise data. + See more at :doc:`/userguide/real_and_lazy_data`. + + """ from iris.coords import Coord @@ -1746,6 +1861,12 @@ def find_discontiguities(cube, rel_tol=1e-5, abs_tol=1e-8): # Plot the masked cube slice: iplt.pcolormesh(masked_cube_slice) + Notes + ------ + This function does not maintain laziness when called; it realises data. + See more at :doc:`/userguide/real_and_lazy_data`. + + """ lats_and_lons = [ "latitude", @@ -1887,6 +2008,10 @@ def mask_cube(cube, points_to_mask, in_place=False, dim=None): If either ``cube`` or ``points_to_mask`` is lazy, the result will be lazy. + This function maintains laziness when called; it does not realise data. + See more at :doc:`/userguide/real_and_lazy_data`. + + """ if in_place and not cube.has_lazy_data(): # Ensure cube data is masked type so we can work on it in-place. @@ -1933,6 +2058,11 @@ def equalise_attributes(cubes): * removed (list): A list of dicts holding the removed attributes. + Notes + ------ + This function maintains laziness when called; it does not realise data. + See more at :doc:`/userguide/real_and_lazy_data`. + """ removed = [] # Work out which attributes are identical across all the cubes. @@ -1976,6 +2106,12 @@ def is_masked(array): bool Whether or not the array has any masks. + Notes + ------ + This function maintains laziness when called; it does not realise data. + See more at :doc:`/userguide/real_and_lazy_data`. + + """ if is_lazy_data(array): result = da.ma.getmaskarray(array).any().compute() @@ -1992,7 +2128,6 @@ def _strip_metadata_from_dims(cube, dims): To be used by operations that modify or remove dimensions. Note: does nothing to (aux)-coordinates. Those would be handled explicitly by the calling operation. - """ reduced_cube = cube.copy() From b8bb753db58c014a2c2a6a34c99958c3c000b807 Mon Sep 17 00:00:00 2001 From: stephenworsley <49274989+stephenworsley@users.noreply.github.com> Date: Wed, 12 Apr 2023 16:06:36 +0100 Subject: [PATCH 65/85] Fixes to _discontiguity_in_bounds (attempt 2) (#4975) --- docs/src/whatsnew/latest.rst | 8 +++ lib/iris/coords.py | 65 +++++++++++++------ lib/iris/tests/stock/_stock_2d_latlons.py | 35 +++++++--- lib/iris/tests/unit/coords/test_Coord.py | 2 +- .../unit/util/test_find_discontiguities.py | 51 +++++++++++---- lib/iris/util.py | 7 +- 6 files changed, 125 insertions(+), 43 deletions(-) diff --git a/docs/src/whatsnew/latest.rst b/docs/src/whatsnew/latest.rst index e1e2503446..739daf30e3 100644 --- a/docs/src/whatsnew/latest.rst +++ b/docs/src/whatsnew/latest.rst @@ -80,6 +80,14 @@ This document explains the changes made to Iris for this release :class:`~iris.coords.CellMethod` are printed to be more CF compliant. (:pull:`5224`) +#. `@stephenworsley`_ fixed the way discontiguities were discovered for 2D coords. + Previously, the only bounds being compared were the bottom right bound in one + cell with the bottom left bound in the cell to its right, and the top left bound + in a cell with the bottom left bound in the cell above it. Now all bounds are + compared with all adjacent bounds from neighbouring cells. This affects + :meth:`~iris.coords.Coord.is_contiguous` and :func:`iris.util.find_discontiguities` + where additional discontiguities may be detected which previously were not. + 💣 Incompatible Changes ======================= diff --git a/lib/iris/coords.py b/lib/iris/coords.py index dcb108f712..63bc524637 100644 --- a/lib/iris/coords.py +++ b/lib/iris/coords.py @@ -1932,11 +1932,12 @@ def _discontiguity_in_bounds(self, rtol=1e-5, atol=1e-8): * contiguous: (boolean) True if there are no discontiguities. * diffs: (array or tuple of arrays) - The diffs along the bounds of the coordinate. If self is a 2D - coord of shape (Y, X), a tuple of arrays is returned, where the - first is an array of differences along the x-axis, of the shape - (Y, X-1) and the second is an array of differences along the - y-axis, of the shape (Y-1, X). + A boolean array or tuple of boolean arrays which are true where + there are discontiguities between neighbouring bounds. If self is + a 2D coord of shape (Y, X), a pair of arrays is returned, where + the first is an array of differences along the x-axis, of the + shape (Y, X-1) and the second is an array of differences along + the y-axis, of the shape (Y-1, X). """ self._sanity_check_bounds() @@ -1945,7 +1946,9 @@ def _discontiguity_in_bounds(self, rtol=1e-5, atol=1e-8): contiguous = np.allclose( self.bounds[1:, 0], self.bounds[:-1, 1], rtol=rtol, atol=atol ) - diffs = np.abs(self.bounds[:-1, 1] - self.bounds[1:, 0]) + diffs = ~np.isclose( + self.bounds[1:, 0], self.bounds[:-1, 1], rtol=rtol, atol=atol + ) elif self.ndim == 2: @@ -1953,31 +1956,55 @@ def mod360_adjust(compare_axis): bounds = self.bounds.copy() if compare_axis == "x": - upper_bounds = bounds[:, :-1, 1] - lower_bounds = bounds[:, 1:, 0] + # Extract the pairs of upper bounds and lower bounds which + # connect along the "x" axis. These connect along indices + # as shown by the following diagram: + # + # 3---2 + 3---2 + # | | | | + # 0---1 + 0---1 + upper_bounds = np.stack( + (bounds[:, :-1, 1], bounds[:, :-1, 2]) + ) + lower_bounds = np.stack( + (bounds[:, 1:, 0], bounds[:, 1:, 3]) + ) elif compare_axis == "y": - upper_bounds = bounds[:-1, :, 3] - lower_bounds = bounds[1:, :, 0] + # Extract the pairs of upper bounds and lower bounds which + # connect along the "y" axis. These connect along indices + # as shown by the following diagram: + # + # 3---2 + # | | + # 0---1 + # + + + # 3---2 + # | | + # 0---1 + upper_bounds = np.stack( + (bounds[:-1, :, 3], bounds[:-1, :, 2]) + ) + lower_bounds = np.stack( + (bounds[1:, :, 0], bounds[1:, :, 1]) + ) if self.name() in ["longitude", "grid_longitude"]: # If longitude, adjust for longitude wrapping diffs = upper_bounds - lower_bounds - index = diffs > 180 + index = np.abs(diffs) > 180 if index.any(): sign = np.sign(diffs) modification = (index.astype(int) * 360) * sign upper_bounds -= modification - diffs_between_cells = np.abs(upper_bounds - lower_bounds) - cell_size = lower_bounds - upper_bounds - diffs_along_axis = diffs_between_cells > ( - atol + rtol * cell_size + diffs_along_bounds = ~np.isclose( + upper_bounds, lower_bounds, rtol=rtol, atol=atol ) - - points_close_enough = diffs_along_axis <= ( - atol + rtol * cell_size + diffs_along_axis = np.logical_or( + diffs_along_bounds[0], diffs_along_bounds[1] ) - contiguous_along_axis = np.all(points_close_enough) + + contiguous_along_axis = ~np.any(diffs_along_axis) return diffs_along_axis, contiguous_along_axis diffs_along_x, match_cell_x1 = mod360_adjust(compare_axis="x") diff --git a/lib/iris/tests/stock/_stock_2d_latlons.py b/lib/iris/tests/stock/_stock_2d_latlons.py index ff96ecc35e..b7fda5fa40 100644 --- a/lib/iris/tests/stock/_stock_2d_latlons.py +++ b/lib/iris/tests/stock/_stock_2d_latlons.py @@ -296,7 +296,9 @@ def sample_cube(xargs, yargs): return cube -def make_bounds_discontiguous_at_point(cube, at_iy, at_ix, in_y=False): +def make_bounds_discontiguous_at_point( + cube, at_iy, at_ix, in_y=False, upper=True +): """ Meddle with the XY grid bounds of a 2D cube to make the grid discontiguous. @@ -325,16 +327,22 @@ def adjust_coord(coord): if not in_y: # Make a discontinuity "at" (iy, ix), by moving the right-hand edge # of the cell to the midpoint of the existing left+right bounds. - new_bds_br = 0.5 * (bds_bl + bds_br) - new_bds_tr = 0.5 * (bds_tl + bds_tr) - bds_br, bds_tr = new_bds_br, new_bds_tr + new_bds_b = 0.5 * (bds_bl + bds_br) + new_bds_t = 0.5 * (bds_tl + bds_tr) + if upper: + bds_br, bds_tr = new_bds_b, new_bds_t + else: + bds_bl, bds_tl = new_bds_b, new_bds_t else: # Same but in the 'grid y direction' : # Make a discontinuity "at" (iy, ix), by moving the **top** edge of # the cell to the midpoint of the existing **top+bottom** bounds. - new_bds_tl = 0.5 * (bds_bl + bds_tl) - new_bds_tr = 0.5 * (bds_br + bds_tr) - bds_tl, bds_tr = new_bds_tl, new_bds_tr + new_bds_l = 0.5 * (bds_bl + bds_tl) + new_bds_r = 0.5 * (bds_br + bds_tr) + if upper: + bds_tl, bds_tr = new_bds_l, new_bds_r + else: + bds_bl, bds_br = new_bds_l, new_bds_r # Write in the new bounds (all 4 corners). bds[at_iy, at_ix] = [bds_bl, bds_br, bds_tr, bds_tl] @@ -355,7 +363,16 @@ def adjust_coord(coord): msg = "The coordinate {!r} doesn't span a data dimension." raise ValueError(msg.format(coord.name())) - masked_data = ma.masked_array(cube.data) - masked_data[at_iy, at_ix] = ma.masked + masked_data = ma.masked_array(cube.data) + + # Mask all points which would be found discontiguous. + # Note that find_discontiguities finds all instances where a cell is + # discontiguous with a neighbouring cell to its *right* or *above* + # that cell. + masked_data[at_iy, at_ix] = ma.masked + if in_y or not upper: + masked_data[at_iy, at_ix - 1] = ma.masked + if not in_y or not upper: + masked_data[at_iy - 1, at_ix] = ma.masked cube.data = masked_data diff --git a/lib/iris/tests/unit/coords/test_Coord.py b/lib/iris/tests/unit/coords/test_Coord.py index 72a48437ec..69b6b70c96 100644 --- a/lib/iris/tests/unit/coords/test_Coord.py +++ b/lib/iris/tests/unit/coords/test_Coord.py @@ -708,7 +708,7 @@ def test_1d_discontiguous(self): coord = DimCoord([10, 20, 40], bounds=[[5, 15], [15, 25], [35, 45]]) contiguous, diffs = coord._discontiguity_in_bounds() self.assertFalse(contiguous) - self.assertArrayEqual(diffs, np.array([0, 10])) + self.assertArrayEqual(diffs, np.array([False, True])) def test_1d_one_cell(self): # Test a 1D coord with a single cell. diff --git a/lib/iris/tests/unit/util/test_find_discontiguities.py b/lib/iris/tests/unit/util/test_find_discontiguities.py index e939416e7d..9e043c71bd 100644 --- a/lib/iris/tests/unit/util/test_find_discontiguities.py +++ b/lib/iris/tests/unit/util/test_find_discontiguities.py @@ -29,26 +29,55 @@ def setUp(self): # Set up a 2d lat-lon cube with 2d coordinates that have been # transformed so they are not in a regular lat-lon grid. # Then generate a discontiguity at a single lat-lon point. - self.testcube_discontig = full2d_global() - make_bounds_discontiguous_at_point(self.testcube_discontig, 3, 3) - # Repeat that for a discontiguity in the grid 'Y' direction. - self.testcube_discontig_along_y = full2d_global() + # Discontiguities will be caused at the rightmost bounds. + self.testcube_discontig_right = full2d_global() + make_bounds_discontiguous_at_point(self.testcube_discontig_right, 3, 3) + + # Repeat for a discontiguity on the leftmost bounds. + self.testcube_discontig_left = full2d_global() + make_bounds_discontiguous_at_point( + self.testcube_discontig_left, 2, 4, upper=False + ) + # Repeat for a discontiguity on the topmost bounds. + self.testcube_discontig_top = full2d_global() make_bounds_discontiguous_at_point( - self.testcube_discontig_along_y, 2, 4, in_y=True + self.testcube_discontig_top, 2, 4, in_y=True ) - def test_find_discontiguities(self): + # Repeat for a discontiguity on the botommost bounds. + self.testcube_discontig_along_bottom = full2d_global() + make_bounds_discontiguous_at_point( + self.testcube_discontig_along_bottom, 2, 4, in_y=True, upper=False + ) + + def test_find_discontiguities_right(self): + # Check that the mask we generate when making the discontiguity + # matches that generated by find_discontiguities + cube = self.testcube_discontig_right + expected = cube.data.mask + returned = find_discontiguities(cube) + self.assertTrue(np.all(expected == returned)) + + def test_find_discontiguities_left(self): + # Check that the mask we generate when making the discontiguity + # matches that generated by find_discontiguities + cube = self.testcube_discontig_left + expected = cube.data.mask + returned = find_discontiguities(cube) + self.assertTrue(np.all(expected == returned)) + + def test_find_discontiguities_top(self): # Check that the mask we generate when making the discontiguity # matches that generated by find_discontiguities - cube = self.testcube_discontig + cube = self.testcube_discontig_top expected = cube.data.mask returned = find_discontiguities(cube) self.assertTrue(np.all(expected == returned)) - def test_find_discontiguities_in_y(self): + def test_find_discontiguities_bottom(self): # Check that the mask we generate when making the discontiguity # matches that generated by find_discontiguities - cube = self.testcube_discontig_along_y + cube = self.testcube_discontig_along_bottom expected = cube.data.mask returned = find_discontiguities(cube) self.assertTrue(np.all(expected == returned)) @@ -61,7 +90,7 @@ def test_find_discontiguities_1d_coord(self): find_discontiguities(cube) def test_find_discontiguities_with_atol(self): - cube = self.testcube_discontig + cube = self.testcube_discontig_right # Choose a very large absolute tolerance which will result in fine # discontiguities being disregarded atol = 100 @@ -72,7 +101,7 @@ def test_find_discontiguities_with_atol(self): self.assertTrue(np.all(expected == returned)) def test_find_discontiguities_with_rtol(self): - cube = self.testcube_discontig + cube = self.testcube_discontig_right # Choose a very large relative tolerance which will result in fine # discontiguities being disregarded rtol = 1000 diff --git a/lib/iris/util.py b/lib/iris/util.py index a2f041a097..93e54916d6 100644 --- a/lib/iris/util.py +++ b/lib/iris/util.py @@ -1820,14 +1820,15 @@ def _meshgrid(*xi, **kwargs): def find_discontiguities(cube, rel_tol=1e-5, abs_tol=1e-8): """ - Searches coord for discontiguities in the bounds array, returned as a - boolean array (True where discontiguities are present). + Searches the 'x' and 'y' coord on the cube for discontiguities in the + bounds array, returned as a boolean array (True for all cells which are + discontiguous with the cell immediately above them or to their right). Args: * cube (`iris.cube.Cube`): The cube to be checked for discontinuities in its 'x' and 'y' - coordinates. + coordinates. These coordinates must be 2D. Kwargs: From 97cc149ae13877a9d6ba0e831bbc77c3b5436283 Mon Sep 17 00:00:00 2001 From: Bill Little Date: Thu, 13 Apr 2023 10:19:38 +0100 Subject: [PATCH 66/85] update ci locks location (#5228) --- .github/workflows/ci-tests.yml | 4 ++-- .github/workflows/ci-wheels.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml index d54b77cadc..ee1a8aa8a3 100644 --- a/.github/workflows/ci-tests.yml +++ b/.github/workflows/ci-tests.yml @@ -52,7 +52,7 @@ jobs: CACHE_WEEKS: 2 run: | echo "CACHE_PERIOD=$(date +%Y).$(expr $(date +%U) / ${CACHE_WEEKS})" >> ${GITHUB_ENV} - echo "LOCK_FILE=requirements/ci/nox.lock/py$(echo ${{ matrix.python-version }} | tr -d '.')-linux-64.lock" >> ${GITHUB_ENV} + echo "LOCK_FILE=requirements/locks/py$(echo ${{ matrix.python-version }} | tr -d '.')-linux-64.lock" >> ${GITHUB_ENV} - name: "data cache" uses: ./.github/workflows/composite/iris-data-cache @@ -100,7 +100,7 @@ jobs: - name: "nox cache" uses: ./.github/workflows/composite/nox-cache with: - cache_build: 1 + cache_build: 2 env_name: ${{ env.ENV_NAME }} lock_file: ${{ env.LOCK_FILE }} diff --git a/.github/workflows/ci-wheels.yml b/.github/workflows/ci-wheels.yml index 835930e065..843486b84c 100644 --- a/.github/workflows/ci-wheels.yml +++ b/.github/workflows/ci-wheels.yml @@ -74,7 +74,7 @@ jobs: CACHE_WEEKS: 2 run: | echo "CACHE_PERIOD=$(date +%Y).$(expr $(date +%U) / ${CACHE_WEEKS})" >> ${GITHUB_ENV} - echo "LOCK_FILE=requirements/ci/nox.lock/py$(echo ${{ matrix.python-version }} | tr -d '.')-linux-64.lock" >> ${GITHUB_ENV} + echo "LOCK_FILE=requirements/locks/py$(echo ${{ matrix.python-version }} | tr -d '.')-linux-64.lock" >> ${GITHUB_ENV} - name: "conda package cache" uses: ./.github/workflows/composite/conda-pkg-cache @@ -103,7 +103,7 @@ jobs: - name: "nox cache" uses: ./.github/workflows/composite/nox-cache with: - cache_build: 0 + cache_build: 1 env_name: ${{ env.ENV_NAME }} lock_file: ${{ env.LOCK_FILE }} From f14a32183b6185c4a0014102225017b6499d085d Mon Sep 17 00:00:00 2001 From: "scitools-ci[bot]" <107775138+scitools-ci[bot]@users.noreply.github.com> Date: Thu, 13 Apr 2023 12:06:14 +0100 Subject: [PATCH 67/85] Updated environment lockfiles (#5211) Co-authored-by: Lockfile bot --- requirements/locks/py310-linux-64.lock | 55 +++++++++++++------------- requirements/locks/py38-linux-64.lock | 51 ++++++++++++------------ requirements/locks/py39-linux-64.lock | 51 ++++++++++++------------ 3 files changed, 80 insertions(+), 77 deletions(-) diff --git a/requirements/locks/py310-linux-64.lock b/requirements/locks/py310-linux-64.lock index 5c838be4e5..d62829c50f 100644 --- a/requirements/locks/py310-linux-64.lock +++ b/requirements/locks/py310-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 38a36037771c7f43f3f405096f5cb1a98eb4493a2f09d043f75e8d5b55cbf0c3 +# input_hash: 5c07ab175254c9b9f51c199ca5dd7035dbe34bc365af1d128d98be342e1921cb @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-2022.12.7-ha878542_0.conda#ff9f73d45c4a07d6f424495288a26080 @@ -23,8 +23,7 @@ https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.8-h166bdaf_0.tar.bz 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-h7f98852_4.tar.bz2#a1fd65c7ccbf10880423d82bca54eb54 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.18.1-h7f98852_0.tar.bz2#f26ef8098fab1f719c91eb760d63381a -https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-h27087fc_0.tar.bz2#c4fbad8d4bddeb3c085f18cbf97fbfad -https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hf0379b8_106.conda#d7407e695358f068a2a7f8295cde0567 +https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hc118613_107.conda#28b2b46b350ddb6a01d061392f75af54 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/geos-3.11.2-hcb278e6_0.conda#3b8e364995e3575e57960d29c1e5ab14 https://conda.anaconda.org/conda-forge/linux-64/gettext-0.21.1-h27087fc_0.tar.bz2#14947d8770185e5153fdd04d4673ed37 @@ -41,6 +40,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_8 https://conda.anaconda.org/conda-forge/linux-64/libdb-6.2.32-h9c3ff4c_0.tar.bz2#3f3258d8f841fbac63b36b75bdac1afd https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.17-h0b41bf4_0.conda#5cc781fd91968b11a8a7fdbee0982676 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd 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/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d @@ -70,6 +70,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.1-h0b41bf4_0.conda#e9c3bcf0e0c719431abec8ca447eee27 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9b5aca60558d02ddaa09d599e55920 https://conda.anaconda.org/conda-forge/linux-64/jack-1.9.22-h11f4161_0.conda#504fa9e712b99494a9cf4630e3ca7d78 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_openblas.tar.bz2#d9b7a8639171f6c6fa0a983edabcfe2b https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_8.tar.bz2#4ae4d7795d33e02bd20f6b23d91caf82 @@ -91,7 +92,6 @@ https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.32-ha901b37_1.c https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.40-hc3806b6_0.tar.bz2#69e2c796349cd9b273890bee0febfe1b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 -https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.3-hd9c2040_1000.tar.bz2#9e856f78d5c80d5a78f61e72d1d473a3 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h166bdaf_4.tar.bz2#4b11e365c0275b808be78b30f904e295 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-h3eb15da_6.conda#6b63daed8feeca47be78f323e793d555 @@ -112,6 +112,7 @@ https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.32-hd7da12d_1.con https://conda.anaconda.org/conda-forge/linux-64/nss-3.89-he45b914_0.conda#2745719a58eeaab6657256a3f142f099 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.10-he550d4f_0_cpython.conda#de25afc7041c103c7f510c746bb63435 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.40.0-h4ff8645_0.tar.bz2#bb11803129cbbb53ed56f9506ff74145 +https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-h166bdaf_0.tar.bz2#384e7fcb3cd162ba3e4aed4b687df566 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h166bdaf_0.tar.bz2#637054603bb7594302e3bf83f0a99879 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.9-h166bdaf_0.tar.bz2#732e22f1741bccea861f5668cf7342a7 @@ -120,11 +121,10 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.4-h0b41bf4_0.con https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.13-pyhd8ed1ab_0.conda#06006184e203b61d3525f90de394471e https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py310hff52083_1003.tar.bz2#8324f8fff866055d4b32eb25e091fe31 https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2#6c72ec3e660a51736913ef6ea68c454b -https://conda.anaconda.org/conda-forge/noarch/attrs-22.2.0-pyh71513ae_0.conda#8b76db7818a4e401ed4486c4c1635cd9 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_8.tar.bz2#2ff08978892a3e8b954397c461f18418 https://conda.anaconda.org/conda-forge/noarch/certifi-2022.12.7-pyhd8ed1ab_0.conda#fb9addc3db06e56abe03e0e9f21a63e6 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-2.1.1-pyhd8ed1ab_0.tar.bz2#c1d5b294fbf9a795dec349a6f4d8be8e +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 https://conda.anaconda.org/conda-forge/noarch/click-8.1.3-unix_pyhd8ed1ab_2.tar.bz2#20e4087407c7cb04a40817114b333dbf https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 @@ -134,9 +134,9 @@ https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.6-pyhd8ed1ab_0.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.17.1-py310hff52083_3.tar.bz2#785160da087cf1d70e989afbb761f01c https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.1-pyhd8ed1ab_0.conda#7312299d7a0ea4993159229b7d2dceb2 https://conda.anaconda.org/conda-forge/noarch/execnet-1.9.0-pyhd8ed1ab_0.tar.bz2#0e521f7a5e60d508b121d38b04874fb2 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.10.7-pyhd8ed1ab_0.conda#6a0601f92717ce555d79d83d693b6fa3 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.11.0-pyhd8ed1ab_0.conda#ec5503e4e3142adde6061c54db438b51 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d -https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.3.0-pyhd8ed1ab_1.conda#0db48a2f5a68e28e5af8d3df276f2255 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.4.0-pyh1a96a4e_0.conda#a993e42df87a292d8fd7396a2e2a8d75 https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h05c8ddd_0.conda#1a109126a43003d65b39c1cad656bc9b https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.74.1-h6239696_1.tar.bz2#5f442e6bc9d89ba236eb25a25c5c2815 https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h64030ff_2.tar.bz2#112eb9b5b93f0c02e59aea4fd1967363 @@ -149,7 +149,7 @@ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.4-py310hbf28c38_1 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-hfd0df8a_0.conda#aa8840cdf17ef0c6084d1e24abc7a28b https://conda.anaconda.org/conda-forge/linux-64/libclang13-15.0.7-default_h3e3d535_1.conda#a3a0f7a6f0885f5e1e0ec691566afb77 https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h36d4200_3.conda#c9f4416a34bc91e0eb029f912c68f81f -https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.88.1-hdc1c0ab_1.conda#3d1189864d1c0ed2a5919cb067b5903d +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.0.1-h588be90_0.conda#b635278a73eb67edcfba7d01a6b48a03 https://conda.anaconda.org/conda-forge/linux-64/libpq-15.2-hb675445_0.conda#4654b17eccaba55b8581d6b9c77f53cc https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-253-h8c4010b_1.conda#9176b1e2cb8beca37a7510b0e801e38f https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.2.4-h1daa5a0_1.conda#77003f63d1763c1e6569a02c1742c9f4 @@ -159,14 +159,16 @@ https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.5-py310hdf3cb https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.24.2-py310h8deb116_0.conda#b7085457309e206174b8e234d90a7605 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea -https://conda.anaconda.org/conda-forge/noarch/packaging-23.0-pyhd8ed1ab_0.conda#1ff2e3ca41f0ce16afec7190db28288b +https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.0.0-pyhd8ed1ab_5.tar.bz2#7d301a0d25f424d96175f810935f0da9 https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2#7205635cd71531943440fbfe3b6b5727 https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.4-py310h5764c6d_0.tar.bz2#c3c55664e9becc48e6a652e2b641961f https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff +https://conda.anaconda.org/conda-forge/noarch/pygments-2.15.0-pyhd8ed1ab_0.conda#bd9547b9d70225f536627ac755ce8f56 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2#e8fbc1b54b25f4b08281467bc13b70cc https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 +https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2023.3-pyhd8ed1ab_0.conda#2590495f608a63625e165915fb4e2e34 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py310h1fa729e_0.conda#8d155ac95b1dfe585bcb6bec6a91c73b https://conda.anaconda.org/conda-forge/noarch/pytz-2023.3-pyhd8ed1ab_0.conda#d3076b483092a435832603243567bc31 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py310h5764c6d_5.tar.bz2#9e68d2ff6d98737c855b65f48dd3c597 @@ -193,55 +195,52 @@ https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h166bdaf_0. 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-libxrender-0.9.10-h7f98852_1003.tar.bz2#f59c1242cc1dd93e72c2ee2b360979eb https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf +https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda#46a2e6e3dfa718ce3492018d5a110dd6 https://conda.anaconda.org/conda-forge/noarch/babel-2.12.1-pyhd8ed1ab_1.conda#ac432e732804a81ddcf29c92ead57cde -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.0-pyha770c72_0.conda#84f54c3bd1a542c8fe696bc8947b040b +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.2-pyha770c72_0.conda#a362ff7d976217f8fa78c0f1c4f59717 https://conda.anaconda.org/conda-forge/linux-64/cairo-1.16.0-ha61ee94_1014.tar.bz2#d1a88f3ed5b52e1024b80d4bcd26a7a0 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py310h255011f_3.conda#800596144bb613cd7ac58b80900ce835 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py310hde88566_1.tar.bz2#94ce7a76b0c912279f6958e0b6b21d2b https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.7-py310hdf3cbec_0.conda#7bf9d8c765b6b04882c719509652c6d6 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.2.2-py310h1fa729e_0.conda#8750e87414347c0208b1b2e035aa6af2 -https://conda.anaconda.org/conda-forge/linux-64/curl-7.88.1-hdc1c0ab_1.conda#2016c398f234cfa354ea704c6731b5d5 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.2.3-py310h1fa729e_0.conda#3eb11d1ed20480b4515094af8ae24c64 +https://conda.anaconda.org/conda-forge/linux-64/curl-8.0.1-h588be90_0.conda#69691e828381dd12df671c26b680f1b0 https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.0-py310h5764c6d_1.tar.bz2#fd18cd597d23b2b5ddde23bd5b7aec32 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.39.3-py310h1fa729e_0.conda#4f39f656d6ff2761d698e69af952be82 https://conda.anaconda.org/conda-forge/linux-64/glib-2.74.1-h6239696_1.tar.bz2#f3220a9e9d3abcbfca43419a219df7e4 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h4df4325_101.conda#162a25904af6586b234b2dd52ee99c61 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.1.0-pyha770c72_0.conda#30b3127c385ca2ed5ef87f3d53d466bc +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.3.0-pyha770c72_0.conda#c63decd397ca639c4b17f6ea5d26bd4d https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 https://conda.anaconda.org/conda-forge/linux-64/libclang-15.0.7-default_had23c3d_1.conda#36c65ed73b7c92589bd9562ef8a6023d https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h5aea950_4.conda#82ef57611ace65b59db35a9687264572 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py310hde88566_1008.tar.bz2#f9dd8a7a2fcc23eb2cd95cd817c949e7 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.7.0-pyhd8ed1ab_0.tar.bz2#fbe1182f650c04513046d6894046cd6c -https://conda.anaconda.org/conda-forge/noarch/partd-1.3.0-pyhd8ed1ab_0.tar.bz2#af8c82d121e63082926062d61d9abb54 +https://conda.anaconda.org/conda-forge/noarch/partd-1.4.0-pyhd8ed1ab_0.conda#721dab5803ea92ce02ddc4ee50aa0c48 https://conda.anaconda.org/conda-forge/linux-64/pillow-9.4.0-py310h023d228_1.conda#bbea829b541aa15df5c65bd40b8c1981 https://conda.anaconda.org/conda-forge/noarch/pip-23.0.1-pyhd8ed1ab_0.conda#8025ca83b8ba5430b640b83917c2a6f7 https://conda.anaconda.org/conda-forge/noarch/pockets-0.9.1-py_0.tar.bz2#1b52f0c42e8077e5a33e00fe72269364 https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.0-h8ffa02c_0.conda#8b9dcfabec5c6bcac98e89889fffa64e https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-16.1-h5195f5e_3.conda#caeb3302ef1dc8b342b20c710a86f8a9 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.14.0-pyhd8ed1ab_0.conda#c78cd16b11cd6a295484bd6c8f24bea1 -https://conda.anaconda.org/conda-forge/noarch/pytest-7.2.2-pyhd8ed1ab_0.conda#60958b19354e0ec295b43f6ab5cfab86 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.2.post0-py310hde88566_3.tar.bz2#0b686f306a76fba9a61e7019f854321f https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.4.1-py310h0a54255_0.conda#b9e952fe3f7528ab603d2776175ba8d2 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py310h056c13c_1.conda#32d925cfd330e0cbb72b7618558a44e8 -https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.7-py310heca2aa9_0.conda#142c074701cf90c88667b461678aee81 +https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.8-py310heca2aa9_0.conda#9c38a65d95567354d8b6d3f002f010dc https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.5.0-hd8ed1ab_0.conda#b3c594fde1a80a1fc3eb9cc4a5dfe392 https://conda.anaconda.org/conda-forge/noarch/zict-2.2.0-pyhd8ed1ab_0.tar.bz2#cd563d01df94e51f968645dbf3b310b0 -https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda#46a2e6e3dfa718ce3492018d5a110dd6 https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py310h5764c6d_1005.tar.bz2#87669c3468dff637bbd0363bc0f895cf https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.1.1-py310hde88566_2.tar.bz2#7433944046deda7775c5b1f7e0b6fe18 https://conda.anaconda.org/conda-forge/linux-64/cryptography-40.0.1-py310h34c0648_0.conda#deafd9206c2e307874f3777a33cafb79 https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.22.0-h25f0c4b_2.conda#461541cb1b387c2a28ab6217f3d38502 https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-6.0.0-h8e241bc_0.conda#448fe40d2fed88ccf4d9ded37cbb2b38 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.1.0-hd8ed1ab_0.conda#90bab1d97fdb6bb40c8e00207bf222dc +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.3.0-hd8ed1ab_0.conda#1dee0ac2ed01030b56bdd33eabebc42f https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.1-nompi_h261ec11_106.tar.bz2#9b25de670ce5753a33c18b1090d1d3bf https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py310he60537e_0.conda#68b2dd34c69d08b05a9db5e3596fe3ee -https://conda.anaconda.org/conda-forge/linux-64/pandas-1.5.3-py310h9b08913_1.conda#331c9dd2560aeb308e26f821280f19d0 +https://conda.anaconda.org/conda-forge/linux-64/pandas-2.0.0-py310h9b08913_0.conda#38dd747dcb3403c0958c4f510ed4316e https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.2.0-pyhd8ed1ab_0.conda#f10c2cf447ca96f12a326b83c75b8e33 https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-daemon-16.1-ha8d29e2_3.conda#34d9d75ca896f5919c372a34e25f23ea https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.5.0-py310hb814896_1.conda#d44c6841ee904252e0e8b7a1c7b11383 https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.11.0-py310heca2aa9_3.conda#3b1946b676534472ce65181dda0b9554 -https://conda.anaconda.org/conda-forge/noarch/pytest-cov-4.0.0-pyhd8ed1ab_0.tar.bz2#c9e3f8bfdb9bfc34aa1836a6ed4b25d7 -https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.2.1-pyhd8ed1ab_0.conda#6fe4c2689d1b10fec1ee65819f0c4fd5 +https://conda.anaconda.org/conda-forge/noarch/pytest-7.3.0-pyhd8ed1ab_0.conda#425ee1712dbbb194edf0997d46202405 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-7.1.0-pyhd8ed1ab_0.conda#6613dbb3b25cc648a107f33ca9f80fc1 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-napoleon-0.7-py_0.tar.bz2#0bc25ff6f2e34af63ded59692df5f749 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py310hbf28c38_3.tar.bz2#703ff1ac7d1b27fb5944b8052b5d1edb @@ -254,22 +253,24 @@ https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.2-nompi_py310h55e1e3 https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-hd33c08f_0.conda#a8b9e35dd7be2c945b0de4fe19a7c3a9 https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-16.1-hcb278e6_3.conda#8b452ab959166d91949af4c2d28f81db https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.1.1-pyhd8ed1ab_0.conda#0b34aa3ab7e7ccb1765a03dd9ed29938 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-4.0.0-pyhd8ed1ab_0.tar.bz2#c9e3f8bfdb9bfc34aa1836a6ed4b25d7 +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.2.1-pyhd8ed1ab_0.conda#6fe4c2689d1b10fec1ee65819f0c4fd5 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.21.0-pyhd8ed1ab_0.conda#cb9a711f7c9f3074fe522e5a34481e60 https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.0-nompi_hdb2cfa9_4.conda#3e2e1d0cd06d1b64c9c2800c0eb0cde6 https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h90689f9_2.tar.bz2#957a0255ab58aaf394a91725d73ab422 https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.54.4-h7abd40a_0.tar.bz2#921e53675ed5ea352f022b79abab076a -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.2.1-pyha770c72_0.conda#3a5cb173faf0fbe20acfb65353a38b40 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.2.2-pyha770c72_0.conda#c4aab94cab4ddeb340e36d4c670a5f24 https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-h5d23da1_6.conda#59c73debd9405771690ddbbad6c57b69 https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.15-pyhd8ed1ab_0.conda#27db656619a55d727eaf5a6ece3d2fd6 -https://conda.anaconda.org/conda-forge/noarch/distributed-2023.3.2-pyhd8ed1ab_0.conda#972a8221136c71c6954cf900ce020ed5 +https://conda.anaconda.org/conda-forge/noarch/distributed-2023.3.2.1-pyhd8ed1ab_0.conda#197cfa857ee316a3cf3c1a2bb86422c9 https://conda.anaconda.org/conda-forge/linux-64/esmpy-8.4.0-nompi_py310h4c636dd_2.conda#00383e95a1a8d1d5b21af8535cd2ac43 https://conda.anaconda.org/conda-forge/linux-64/graphviz-7.1.0-h2e5815a_0.conda#e7ecda996c443142a0e9c379f3b28e48 https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.7-py310hab646b1_3.conda#d049da3204bf5ecb54a852b622f2d7d2 -https://conda.anaconda.org/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_0.conda#11d178fc55199482ee48d6812ea83983 +https://conda.anaconda.org/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_1.conda#3bfbd6ead1d7299ed46dab3a7bf0bc8c https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.7.1-py310hff52083_0.conda#c2b60c44d38d32779006a15c2581f0d1 https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 https://conda.anaconda.org/conda-forge/noarch/sphinx-4.5.0-pyh6c4a22f_0.tar.bz2#46b38d88c4270ff9ba78a89c83c66345 -https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.13.2-pyhd8ed1ab_0.conda#bc604eb5b33d3cf6c4c773490f3f5cda +https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.13.3-pyhd8ed1ab_0.conda#07aca5f2dea315dcc16680d6891e9056 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.10.1-py310h8deb116_0.conda#4c9604c5ec179c21f8f0a09e3c164480 https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.1-pyhd8ed1ab_0.conda#d21ada5f548f3c8957e1fa7ec3cd7f5b https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.12.2-pyhd8ed1ab_0.conda#cb7e912f6f31de2d45984fa40a4fe78c diff --git a/requirements/locks/py38-linux-64.lock b/requirements/locks/py38-linux-64.lock index ae1f19db5f..48fa90882d 100644 --- a/requirements/locks/py38-linux-64.lock +++ b/requirements/locks/py38-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 95fc23825c1f7510d377720f3804c17e48a94112ef7a480c13c9b492257862ae +# input_hash: 0a54f9c8e8bbfb540a24c081bd8090d5c8353ef3f06e344d079ce12d398bdc91 @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-2022.12.7-ha878542_0.conda#ff9f73d45c4a07d6f424495288a26080 @@ -22,8 +22,7 @@ https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.8-h166bdaf_0.tar.bz 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-h7f98852_4.tar.bz2#a1fd65c7ccbf10880423d82bca54eb54 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.18.1-h7f98852_0.tar.bz2#f26ef8098fab1f719c91eb760d63381a -https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-h27087fc_0.tar.bz2#c4fbad8d4bddeb3c085f18cbf97fbfad -https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hf0379b8_106.conda#d7407e695358f068a2a7f8295cde0567 +https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hc118613_107.conda#28b2b46b350ddb6a01d061392f75af54 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/geos-3.11.2-hcb278e6_0.conda#3b8e364995e3575e57960d29c1e5ab14 https://conda.anaconda.org/conda-forge/linux-64/gettext-0.21.1-h27087fc_0.tar.bz2#14947d8770185e5153fdd04d4673ed37 @@ -40,6 +39,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_8 https://conda.anaconda.org/conda-forge/linux-64/libdb-6.2.32-h9c3ff4c_0.tar.bz2#3f3258d8f841fbac63b36b75bdac1afd https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.17-h0b41bf4_0.conda#5cc781fd91968b11a8a7fdbee0982676 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd 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/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d @@ -69,6 +69,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.1-h0b41bf4_0.conda#e9c3bcf0e0c719431abec8ca447eee27 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9b5aca60558d02ddaa09d599e55920 https://conda.anaconda.org/conda-forge/linux-64/jack-1.9.22-h11f4161_0.conda#504fa9e712b99494a9cf4630e3ca7d78 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_openblas.tar.bz2#d9b7a8639171f6c6fa0a983edabcfe2b https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_8.tar.bz2#4ae4d7795d33e02bd20f6b23d91caf82 @@ -90,7 +91,6 @@ https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.32-ha901b37_1.c https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.40-hc3806b6_0.tar.bz2#69e2c796349cd9b273890bee0febfe1b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 -https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.3-hd9c2040_1000.tar.bz2#9e856f78d5c80d5a78f61e72d1d473a3 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h166bdaf_4.tar.bz2#4b11e365c0275b808be78b30f904e295 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-h3eb15da_6.conda#6b63daed8feeca47be78f323e793d555 @@ -111,6 +111,7 @@ https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.32-hd7da12d_1.con https://conda.anaconda.org/conda-forge/linux-64/nss-3.89-he45b914_0.conda#2745719a58eeaab6657256a3f142f099 https://conda.anaconda.org/conda-forge/linux-64/python-3.8.16-he550d4f_1_cpython.conda#9de84cccfbc5f8350a3667bb6ef6fc30 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.40.0-h4ff8645_0.tar.bz2#bb11803129cbbb53ed56f9506ff74145 +https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-h166bdaf_0.tar.bz2#384e7fcb3cd162ba3e4aed4b687df566 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h166bdaf_0.tar.bz2#637054603bb7594302e3bf83f0a99879 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.9-h166bdaf_0.tar.bz2#732e22f1741bccea861f5668cf7342a7 @@ -119,11 +120,10 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.4-h0b41bf4_0.con https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.13-pyhd8ed1ab_0.conda#06006184e203b61d3525f90de394471e https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py38h578d9bd_1003.tar.bz2#db8b471d9a764f561a129f94ea215c0a https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2#6c72ec3e660a51736913ef6ea68c454b -https://conda.anaconda.org/conda-forge/noarch/attrs-22.2.0-pyh71513ae_0.conda#8b76db7818a4e401ed4486c4c1635cd9 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_8.tar.bz2#2ff08978892a3e8b954397c461f18418 https://conda.anaconda.org/conda-forge/noarch/certifi-2022.12.7-pyhd8ed1ab_0.conda#fb9addc3db06e56abe03e0e9f21a63e6 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-2.1.1-pyhd8ed1ab_0.tar.bz2#c1d5b294fbf9a795dec349a6f4d8be8e +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 https://conda.anaconda.org/conda-forge/noarch/click-8.1.3-unix_pyhd8ed1ab_2.tar.bz2#20e4087407c7cb04a40817114b333dbf https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 @@ -133,9 +133,9 @@ https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.6-pyhd8ed1ab_0.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.17.1-py38h578d9bd_3.tar.bz2#34e1f12e3ed15aff218644e9d865b722 https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.1-pyhd8ed1ab_0.conda#7312299d7a0ea4993159229b7d2dceb2 https://conda.anaconda.org/conda-forge/noarch/execnet-1.9.0-pyhd8ed1ab_0.tar.bz2#0e521f7a5e60d508b121d38b04874fb2 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.10.7-pyhd8ed1ab_0.conda#6a0601f92717ce555d79d83d693b6fa3 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.11.0-pyhd8ed1ab_0.conda#ec5503e4e3142adde6061c54db438b51 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d -https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.3.0-pyhd8ed1ab_1.conda#0db48a2f5a68e28e5af8d3df276f2255 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.4.0-pyh1a96a4e_0.conda#a993e42df87a292d8fd7396a2e2a8d75 https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h05c8ddd_0.conda#1a109126a43003d65b39c1cad656bc9b https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.74.1-h6239696_1.tar.bz2#5f442e6bc9d89ba236eb25a25c5c2815 https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h64030ff_2.tar.bz2#112eb9b5b93f0c02e59aea4fd1967363 @@ -148,7 +148,7 @@ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.4-py38h43d8883_1. https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-hfd0df8a_0.conda#aa8840cdf17ef0c6084d1e24abc7a28b https://conda.anaconda.org/conda-forge/linux-64/libclang13-15.0.7-default_h3e3d535_1.conda#a3a0f7a6f0885f5e1e0ec691566afb77 https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h36d4200_3.conda#c9f4416a34bc91e0eb029f912c68f81f -https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.88.1-hdc1c0ab_1.conda#3d1189864d1c0ed2a5919cb067b5903d +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.0.1-h588be90_0.conda#b635278a73eb67edcfba7d01a6b48a03 https://conda.anaconda.org/conda-forge/linux-64/libpq-15.2-hb675445_0.conda#4654b17eccaba55b8581d6b9c77f53cc https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-253-h8c4010b_1.conda#9176b1e2cb8beca37a7510b0e801e38f https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.2.4-h1daa5a0_1.conda#77003f63d1763c1e6569a02c1742c9f4 @@ -158,14 +158,16 @@ https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.5-py38hfbd4bf https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.24.2-py38h10c12cc_0.conda#05592c85b9f6931dc2df1e80c0d56294 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea -https://conda.anaconda.org/conda-forge/noarch/packaging-23.0-pyhd8ed1ab_0.conda#1ff2e3ca41f0ce16afec7190db28288b +https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.0.0-pyhd8ed1ab_5.tar.bz2#7d301a0d25f424d96175f810935f0da9 https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2#7205635cd71531943440fbfe3b6b5727 https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.4-py38h0a891b7_0.tar.bz2#fe2ef279417faa1af0adf178de2032f7 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff +https://conda.anaconda.org/conda-forge/noarch/pygments-2.15.0-pyhd8ed1ab_0.conda#bd9547b9d70225f536627ac755ce8f56 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2#e8fbc1b54b25f4b08281467bc13b70cc https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 +https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2023.3-pyhd8ed1ab_0.conda#2590495f608a63625e165915fb4e2e34 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py38h1de0b5d_0.conda#7db73572d4f7e10a759bad609a228ad0 https://conda.anaconda.org/conda-forge/noarch/pytz-2023.3-pyhd8ed1ab_0.conda#d3076b483092a435832603243567bc31 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py38h0a891b7_5.tar.bz2#0856c59f9ddb710c640dc0428d66b1b7 @@ -192,54 +194,52 @@ https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h166bdaf_0. 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-libxrender-0.9.10-h7f98852_1003.tar.bz2#f59c1242cc1dd93e72c2ee2b360979eb https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf +https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda#46a2e6e3dfa718ce3492018d5a110dd6 https://conda.anaconda.org/conda-forge/noarch/babel-2.12.1-pyhd8ed1ab_1.conda#ac432e732804a81ddcf29c92ead57cde -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.0-pyha770c72_0.conda#84f54c3bd1a542c8fe696bc8947b040b +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.2-pyha770c72_0.conda#a362ff7d976217f8fa78c0f1c4f59717 https://conda.anaconda.org/conda-forge/linux-64/cairo-1.16.0-ha61ee94_1014.tar.bz2#d1a88f3ed5b52e1024b80d4bcd26a7a0 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py38h4a40e3a_3.conda#3ac112151c6b6cfe457e976de41af0c5 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py38h26c90d9_1.tar.bz2#dcc025a7bb54374979c500c2e161fac9 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.7-py38hfbd4bf9_0.conda#638537863b298151635c05c762a997ab -https://conda.anaconda.org/conda-forge/linux-64/curl-7.88.1-hdc1c0ab_1.conda#2016c398f234cfa354ea704c6731b5d5 +https://conda.anaconda.org/conda-forge/linux-64/curl-8.0.1-h588be90_0.conda#69691e828381dd12df671c26b680f1b0 https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.0-py38h0a891b7_1.tar.bz2#183f6160ab3498b882e903b06be7d430 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.39.3-py38h1de0b5d_0.conda#34449fe6e3949956fac2236c9a9a3d3b https://conda.anaconda.org/conda-forge/linux-64/glib-2.74.1-h6239696_1.tar.bz2#f3220a9e9d3abcbfca43419a219df7e4 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h4df4325_101.conda#162a25904af6586b234b2dd52ee99c61 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.1.0-pyha770c72_0.conda#30b3127c385ca2ed5ef87f3d53d466bc +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.3.0-pyha770c72_0.conda#c63decd397ca639c4b17f6ea5d26bd4d https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.12.0-pyhd8ed1ab_0.conda#e5fd2260a231ee63b6969f4801082f2b https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 https://conda.anaconda.org/conda-forge/linux-64/libclang-15.0.7-default_had23c3d_1.conda#36c65ed73b7c92589bd9562ef8a6023d https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h5aea950_4.conda#82ef57611ace65b59db35a9687264572 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py38h26c90d9_1008.tar.bz2#6bc8cd29312f4fc77156b78124e165cd https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.7.0-pyhd8ed1ab_0.tar.bz2#fbe1182f650c04513046d6894046cd6c -https://conda.anaconda.org/conda-forge/noarch/partd-1.3.0-pyhd8ed1ab_0.tar.bz2#af8c82d121e63082926062d61d9abb54 +https://conda.anaconda.org/conda-forge/noarch/partd-1.4.0-pyhd8ed1ab_0.conda#721dab5803ea92ce02ddc4ee50aa0c48 https://conda.anaconda.org/conda-forge/linux-64/pillow-9.4.0-py38hde6dc18_1.conda#3de5619d3f556f966189e5251a266125 https://conda.anaconda.org/conda-forge/noarch/pip-23.0.1-pyhd8ed1ab_0.conda#8025ca83b8ba5430b640b83917c2a6f7 https://conda.anaconda.org/conda-forge/noarch/pockets-0.9.1-py_0.tar.bz2#1b52f0c42e8077e5a33e00fe72269364 https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.0-h8ffa02c_0.conda#8b9dcfabec5c6bcac98e89889fffa64e https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-16.1-h5195f5e_3.conda#caeb3302ef1dc8b342b20c710a86f8a9 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.14.0-pyhd8ed1ab_0.conda#c78cd16b11cd6a295484bd6c8f24bea1 -https://conda.anaconda.org/conda-forge/noarch/pytest-7.2.2-pyhd8ed1ab_0.conda#60958b19354e0ec295b43f6ab5cfab86 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.2.post0-py38h26c90d9_3.tar.bz2#6e7902b0e96f42fa1b73daa5f65dd669 https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.4.1-py38h7e4f40d_0.conda#17f682c947f9cabd348e7276f00c6d85 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py38haaa171b_1.conda#fdd08c011257c5e4727cca36f04af74f -https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.7-py38h8dc9893_0.conda#ea242937718f3dacf253355e1d634535 +https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.8-py38h8dc9893_0.conda#108eba4fe4c4f1b9a9c3998c644d46dc https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.5.0-hd8ed1ab_0.conda#b3c594fde1a80a1fc3eb9cc4a5dfe392 https://conda.anaconda.org/conda-forge/noarch/zict-2.2.0-pyhd8ed1ab_0.tar.bz2#cd563d01df94e51f968645dbf3b310b0 -https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda#46a2e6e3dfa718ce3492018d5a110dd6 https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py38h0a891b7_1005.tar.bz2#e99e08812dfff30fdd17b3f8838e2759 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.1.1-py38h26c90d9_2.tar.bz2#0ea017e84efe45badce6c32f274dbf8e https://conda.anaconda.org/conda-forge/linux-64/cryptography-40.0.1-py38h3d167d9_0.conda#c046be0e2eaf1f4076ff5633c538ee71 https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.22.0-h25f0c4b_2.conda#461541cb1b387c2a28ab6217f3d38502 https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-6.0.0-h8e241bc_0.conda#448fe40d2fed88ccf4d9ded37cbb2b38 https://conda.anaconda.org/conda-forge/noarch/importlib-resources-5.12.0-pyhd8ed1ab_0.conda#3544c818f0720c89eb16ae6940ab440b -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.1.0-hd8ed1ab_0.conda#90bab1d97fdb6bb40c8e00207bf222dc +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.3.0-hd8ed1ab_0.conda#1dee0ac2ed01030b56bdd33eabebc42f https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.1-nompi_h261ec11_106.tar.bz2#9b25de670ce5753a33c18b1090d1d3bf -https://conda.anaconda.org/conda-forge/linux-64/pandas-1.5.3-py38hdc8b05c_1.conda#c944b033a2126e7f714a7ecaecb22011 +https://conda.anaconda.org/conda-forge/linux-64/pandas-2.0.0-py38hdc8b05c_0.conda#7739405daa5b187f61b603601be796a5 https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.2.0-pyhd8ed1ab_0.conda#f10c2cf447ca96f12a326b83c75b8e33 https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-daemon-16.1-ha8d29e2_3.conda#34d9d75ca896f5919c372a34e25f23ea https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.5.0-py38h2f62729_1.conda#00785fd9270728fbfb82c80fc0229dc6 https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.11.0-py38h8dc9893_3.conda#7bb0328b4a0f857aeb432426b9a5f908 -https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.2.1-pyhd8ed1ab_0.conda#6fe4c2689d1b10fec1ee65819f0c4fd5 +https://conda.anaconda.org/conda-forge/noarch/pytest-7.3.0-pyhd8ed1ab_0.conda#425ee1712dbbb194edf0997d46202405 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-7.1.0-pyhd8ed1ab_0.conda#6613dbb3b25cc648a107f33ca9f80fc1 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-napoleon-0.7-py_0.tar.bz2#0bc25ff6f2e34af63ded59692df5f749 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py38h43d8883_3.tar.bz2#82b3797d08a43a101b645becbb938e65 @@ -252,23 +252,24 @@ https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.2-nompi_py38h2250339 https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-hd33c08f_0.conda#a8b9e35dd7be2c945b0de4fe19a7c3a9 https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-16.1-hcb278e6_3.conda#8b452ab959166d91949af4c2d28f81db https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.1.1-pyhd8ed1ab_0.conda#0b34aa3ab7e7ccb1765a03dd9ed29938 +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.2.1-pyhd8ed1ab_0.conda#6fe4c2689d1b10fec1ee65819f0c4fd5 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.21.0-pyhd8ed1ab_0.conda#cb9a711f7c9f3074fe522e5a34481e60 https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.0-nompi_hdb2cfa9_4.conda#3e2e1d0cd06d1b64c9c2800c0eb0cde6 https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h90689f9_2.tar.bz2#957a0255ab58aaf394a91725d73ab422 https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.54.4-h7abd40a_0.tar.bz2#921e53675ed5ea352f022b79abab076a https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.2.1-pyha770c72_0.conda#3a5cb173faf0fbe20acfb65353a38b40 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.2.2-pyha770c72_0.conda#c4aab94cab4ddeb340e36d4c670a5f24 https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-h5d23da1_6.conda#59c73debd9405771690ddbbad6c57b69 https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.15-pyhd8ed1ab_0.conda#27db656619a55d727eaf5a6ece3d2fd6 -https://conda.anaconda.org/conda-forge/noarch/distributed-2023.3.2-pyhd8ed1ab_0.conda#972a8221136c71c6954cf900ce020ed5 +https://conda.anaconda.org/conda-forge/noarch/distributed-2023.3.2.1-pyhd8ed1ab_0.conda#197cfa857ee316a3cf3c1a2bb86422c9 https://conda.anaconda.org/conda-forge/linux-64/esmpy-8.4.0-nompi_py38h2b78397_2.conda#03c291af8938218972bfba0b0618d3e9 https://conda.anaconda.org/conda-forge/linux-64/graphviz-7.1.0-h2e5815a_0.conda#e7ecda996c443142a0e9c379f3b28e48 https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.7-py38ha0d8c90_3.conda#e965dc172d67920d058ac2b3a0e27565 -https://conda.anaconda.org/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_0.conda#11d178fc55199482ee48d6812ea83983 +https://conda.anaconda.org/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_1.conda#3bfbd6ead1d7299ed46dab3a7bf0bc8c https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.7.1-py38h578d9bd_0.conda#50ff9e0a3dd459a0ca365741072bf9a2 https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 https://conda.anaconda.org/conda-forge/noarch/sphinx-4.5.0-pyh6c4a22f_0.tar.bz2#46b38d88c4270ff9ba78a89c83c66345 -https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.13.2-pyhd8ed1ab_0.conda#bc604eb5b33d3cf6c4c773490f3f5cda +https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.13.3-pyhd8ed1ab_0.conda#07aca5f2dea315dcc16680d6891e9056 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.10.1-py38h10c12cc_0.conda#1cbc47bb9a600ce4a49d8da797d375bf https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.1-pyhd8ed1ab_0.conda#d21ada5f548f3c8957e1fa7ec3cd7f5b https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.12.2-pyhd8ed1ab_0.conda#cb7e912f6f31de2d45984fa40a4fe78c diff --git a/requirements/locks/py39-linux-64.lock b/requirements/locks/py39-linux-64.lock index c8f9cef96b..f88a19866b 100644 --- a/requirements/locks/py39-linux-64.lock +++ b/requirements/locks/py39-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 2efc3b6979a34724c2fb2e409043fa9e3fb822c08c65b9226cbe2a210bff850b +# input_hash: 05ca2bba5277591c243a93b926300db20e6a69c1cfa93ddd4aa4c55c4d0dcecd @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-2022.12.7-ha878542_0.conda#ff9f73d45c4a07d6f424495288a26080 @@ -23,8 +23,7 @@ https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.8-h166bdaf_0.tar.bz 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-h7f98852_4.tar.bz2#a1fd65c7ccbf10880423d82bca54eb54 https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.18.1-h7f98852_0.tar.bz2#f26ef8098fab1f719c91eb760d63381a -https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-h27087fc_0.tar.bz2#c4fbad8d4bddeb3c085f18cbf97fbfad -https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hf0379b8_106.conda#d7407e695358f068a2a7f8295cde0567 +https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hc118613_107.conda#28b2b46b350ddb6a01d061392f75af54 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/geos-3.11.2-hcb278e6_0.conda#3b8e364995e3575e57960d29c1e5ab14 https://conda.anaconda.org/conda-forge/linux-64/gettext-0.21.1-h27087fc_0.tar.bz2#14947d8770185e5153fdd04d4673ed37 @@ -41,6 +40,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_8 https://conda.anaconda.org/conda-forge/linux-64/libdb-6.2.32-h9c3ff4c_0.tar.bz2#3f3258d8f841fbac63b36b75bdac1afd https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.17-h0b41bf4_0.conda#5cc781fd91968b11a8a7fdbee0982676 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd 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/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d https://conda.anaconda.org/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d @@ -70,6 +70,7 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.1-h0b41bf4_0.conda#e9c3bcf0e0c719431abec8ca447eee27 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9b5aca60558d02ddaa09d599e55920 https://conda.anaconda.org/conda-forge/linux-64/jack-1.9.22-h11f4161_0.conda#504fa9e712b99494a9cf4630e3ca7d78 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_openblas.tar.bz2#d9b7a8639171f6c6fa0a983edabcfe2b https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_8.tar.bz2#4ae4d7795d33e02bd20f6b23d91caf82 @@ -91,7 +92,6 @@ https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.32-ha901b37_1.c https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.40-hc3806b6_0.tar.bz2#69e2c796349cd9b273890bee0febfe1b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 -https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.3-hd9c2040_1000.tar.bz2#9e856f78d5c80d5a78f61e72d1d473a3 https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h166bdaf_4.tar.bz2#4b11e365c0275b808be78b30f904e295 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-h3eb15da_6.conda#6b63daed8feeca47be78f323e793d555 @@ -112,6 +112,7 @@ https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.32-hd7da12d_1.con https://conda.anaconda.org/conda-forge/linux-64/nss-3.89-he45b914_0.conda#2745719a58eeaab6657256a3f142f099 https://conda.anaconda.org/conda-forge/linux-64/python-3.9.16-h2782a2a_0_cpython.conda#95c9b7c96a7fd7342e0c9d0a917b8f78 https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.40.0-h4ff8645_0.tar.bz2#bb11803129cbbb53ed56f9506ff74145 +https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-h166bdaf_0.tar.bz2#384e7fcb3cd162ba3e4aed4b687df566 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h166bdaf_0.tar.bz2#637054603bb7594302e3bf83f0a99879 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.9-h166bdaf_0.tar.bz2#732e22f1741bccea861f5668cf7342a7 @@ -120,11 +121,10 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.4-h0b41bf4_0.con https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.13-pyhd8ed1ab_0.conda#06006184e203b61d3525f90de394471e https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py39hf3d152e_1003.tar.bz2#5e8330e806e50bd6137ebd125f4bc1bb https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2#6c72ec3e660a51736913ef6ea68c454b -https://conda.anaconda.org/conda-forge/noarch/attrs-22.2.0-pyh71513ae_0.conda#8b76db7818a4e401ed4486c4c1635cd9 https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_8.tar.bz2#2ff08978892a3e8b954397c461f18418 https://conda.anaconda.org/conda-forge/noarch/certifi-2022.12.7-pyhd8ed1ab_0.conda#fb9addc3db06e56abe03e0e9f21a63e6 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-2.1.1-pyhd8ed1ab_0.tar.bz2#c1d5b294fbf9a795dec349a6f4d8be8e +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 https://conda.anaconda.org/conda-forge/noarch/click-8.1.3-unix_pyhd8ed1ab_2.tar.bz2#20e4087407c7cb04a40817114b333dbf https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 @@ -134,9 +134,9 @@ https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.6-pyhd8ed1ab_0.tar.bz2 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.17.1-py39hf3d152e_3.tar.bz2#3caf51fb6a259d377f05d6913193b11c https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.1-pyhd8ed1ab_0.conda#7312299d7a0ea4993159229b7d2dceb2 https://conda.anaconda.org/conda-forge/noarch/execnet-1.9.0-pyhd8ed1ab_0.tar.bz2#0e521f7a5e60d508b121d38b04874fb2 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.10.7-pyhd8ed1ab_0.conda#6a0601f92717ce555d79d83d693b6fa3 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.11.0-pyhd8ed1ab_0.conda#ec5503e4e3142adde6061c54db438b51 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d -https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.3.0-pyhd8ed1ab_1.conda#0db48a2f5a68e28e5af8d3df276f2255 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.4.0-pyh1a96a4e_0.conda#a993e42df87a292d8fd7396a2e2a8d75 https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h05c8ddd_0.conda#1a109126a43003d65b39c1cad656bc9b https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.74.1-h6239696_1.tar.bz2#5f442e6bc9d89ba236eb25a25c5c2815 https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h64030ff_2.tar.bz2#112eb9b5b93f0c02e59aea4fd1967363 @@ -149,7 +149,7 @@ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.4-py39hf939315_1. https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-hfd0df8a_0.conda#aa8840cdf17ef0c6084d1e24abc7a28b https://conda.anaconda.org/conda-forge/linux-64/libclang13-15.0.7-default_h3e3d535_1.conda#a3a0f7a6f0885f5e1e0ec691566afb77 https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h36d4200_3.conda#c9f4416a34bc91e0eb029f912c68f81f -https://conda.anaconda.org/conda-forge/linux-64/libcurl-7.88.1-hdc1c0ab_1.conda#3d1189864d1c0ed2a5919cb067b5903d +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.0.1-h588be90_0.conda#b635278a73eb67edcfba7d01a6b48a03 https://conda.anaconda.org/conda-forge/linux-64/libpq-15.2-hb675445_0.conda#4654b17eccaba55b8581d6b9c77f53cc https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-253-h8c4010b_1.conda#9176b1e2cb8beca37a7510b0e801e38f https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.2.4-h1daa5a0_1.conda#77003f63d1763c1e6569a02c1742c9f4 @@ -159,14 +159,16 @@ https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.5-py39h4b4f3f https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.24.2-py39h7360e5f_0.conda#757070dc7cc33003254888808cd34f1e https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea -https://conda.anaconda.org/conda-forge/noarch/packaging-23.0-pyhd8ed1ab_0.conda#1ff2e3ca41f0ce16afec7190db28288b +https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.0.0-pyhd8ed1ab_5.tar.bz2#7d301a0d25f424d96175f810935f0da9 https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2#7205635cd71531943440fbfe3b6b5727 https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.4-py39hb9d737c_0.tar.bz2#12184951da572828fb986b06ffb63eed https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff +https://conda.anaconda.org/conda-forge/noarch/pygments-2.15.0-pyhd8ed1ab_0.conda#bd9547b9d70225f536627ac755ce8f56 https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2#e8fbc1b54b25f4b08281467bc13b70cc https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 +https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2023.3-pyhd8ed1ab_0.conda#2590495f608a63625e165915fb4e2e34 https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py39h72bdee0_0.conda#18927f971926b7271600368de71de557 https://conda.anaconda.org/conda-forge/noarch/pytz-2023.3-pyhd8ed1ab_0.conda#d3076b483092a435832603243567bc31 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py39hb9d737c_5.tar.bz2#ef9db3c38ae7275f6b14491cfe61a248 @@ -193,54 +195,52 @@ https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h166bdaf_0. 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-libxrender-0.9.10-h7f98852_1003.tar.bz2#f59c1242cc1dd93e72c2ee2b360979eb https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf +https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda#46a2e6e3dfa718ce3492018d5a110dd6 https://conda.anaconda.org/conda-forge/noarch/babel-2.12.1-pyhd8ed1ab_1.conda#ac432e732804a81ddcf29c92ead57cde -https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.0-pyha770c72_0.conda#84f54c3bd1a542c8fe696bc8947b040b +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.2-pyha770c72_0.conda#a362ff7d976217f8fa78c0f1c4f59717 https://conda.anaconda.org/conda-forge/linux-64/cairo-1.16.0-ha61ee94_1014.tar.bz2#d1a88f3ed5b52e1024b80d4bcd26a7a0 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py39he91dace_3.conda#20080319ef73fbad74dcd6d62f2a3ffe https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py39h2ae25f5_1.tar.bz2#c943fb9a2818ecc5be1e0ecc8b7738f1 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.7-py39h4b4f3f3_0.conda#c5387f3fb1f5b8b71e1c865fc55f4951 -https://conda.anaconda.org/conda-forge/linux-64/curl-7.88.1-hdc1c0ab_1.conda#2016c398f234cfa354ea704c6731b5d5 +https://conda.anaconda.org/conda-forge/linux-64/curl-8.0.1-h588be90_0.conda#69691e828381dd12df671c26b680f1b0 https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.0-py39hb9d737c_1.tar.bz2#eb31327ace8dac15c2df243d9505a132 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.39.3-py39h72bdee0_0.conda#9232b3b2cc83a304c8210a092e8ba4a5 https://conda.anaconda.org/conda-forge/linux-64/glib-2.74.1-h6239696_1.tar.bz2#f3220a9e9d3abcbfca43419a219df7e4 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h4df4325_101.conda#162a25904af6586b234b2dd52ee99c61 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.1.0-pyha770c72_0.conda#30b3127c385ca2ed5ef87f3d53d466bc +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.3.0-pyha770c72_0.conda#c63decd397ca639c4b17f6ea5d26bd4d https://conda.anaconda.org/conda-forge/noarch/importlib_resources-5.12.0-pyhd8ed1ab_0.conda#e5fd2260a231ee63b6969f4801082f2b https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 https://conda.anaconda.org/conda-forge/linux-64/libclang-15.0.7-default_had23c3d_1.conda#36c65ed73b7c92589bd9562ef8a6023d https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h5aea950_4.conda#82ef57611ace65b59db35a9687264572 https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py39h2ae25f5_1008.tar.bz2#d90acb3804f16c63eb6726652e4e25b3 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.7.0-pyhd8ed1ab_0.tar.bz2#fbe1182f650c04513046d6894046cd6c -https://conda.anaconda.org/conda-forge/noarch/partd-1.3.0-pyhd8ed1ab_0.tar.bz2#af8c82d121e63082926062d61d9abb54 +https://conda.anaconda.org/conda-forge/noarch/partd-1.4.0-pyhd8ed1ab_0.conda#721dab5803ea92ce02ddc4ee50aa0c48 https://conda.anaconda.org/conda-forge/linux-64/pillow-9.4.0-py39h2320bf1_1.conda#d2f79132b9c8e416058a4cd84ef27b3d https://conda.anaconda.org/conda-forge/noarch/pip-23.0.1-pyhd8ed1ab_0.conda#8025ca83b8ba5430b640b83917c2a6f7 https://conda.anaconda.org/conda-forge/noarch/pockets-0.9.1-py_0.tar.bz2#1b52f0c42e8077e5a33e00fe72269364 https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.0-h8ffa02c_0.conda#8b9dcfabec5c6bcac98e89889fffa64e https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-16.1-h5195f5e_3.conda#caeb3302ef1dc8b342b20c710a86f8a9 -https://conda.anaconda.org/conda-forge/noarch/pygments-2.14.0-pyhd8ed1ab_0.conda#c78cd16b11cd6a295484bd6c8f24bea1 -https://conda.anaconda.org/conda-forge/noarch/pytest-7.2.2-pyhd8ed1ab_0.conda#60958b19354e0ec295b43f6ab5cfab86 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.2.post0-py39h2ae25f5_3.tar.bz2#bcc7de3bb458a198b598ac1f75bf37e3 https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.4.1-py39h389d5f1_0.conda#9eeb2b2549f836ca196c6cbd22344122 https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py39hf1c3bca_1.conda#ae6bfe65e81d9b59a71cc01a2858650f -https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.7-py39h227be39_0.conda#7d9a35091552af3655151f164ddd64a3 +https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.8-py39h227be39_0.conda#db14a8de2de2fabf97c4634352470334 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.5.0-hd8ed1ab_0.conda#b3c594fde1a80a1fc3eb9cc4a5dfe392 https://conda.anaconda.org/conda-forge/noarch/zict-2.2.0-pyhd8ed1ab_0.tar.bz2#cd563d01df94e51f968645dbf3b310b0 -https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda#46a2e6e3dfa718ce3492018d5a110dd6 https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py39hb9d737c_1005.tar.bz2#a639fdd9428d8b25f8326a3838d54045 https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.1.1-py39h2ae25f5_2.tar.bz2#b3b4aab96d1c4ed394d6f4b9146699d4 https://conda.anaconda.org/conda-forge/linux-64/cryptography-40.0.1-py39h079d5ae_0.conda#8f55cf00f9d29606d8ea2387b459d188 https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.22.0-h25f0c4b_2.conda#461541cb1b387c2a28ab6217f3d38502 https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-6.0.0-h8e241bc_0.conda#448fe40d2fed88ccf4d9ded37cbb2b38 https://conda.anaconda.org/conda-forge/noarch/importlib-resources-5.12.0-pyhd8ed1ab_0.conda#3544c818f0720c89eb16ae6940ab440b -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.1.0-hd8ed1ab_0.conda#90bab1d97fdb6bb40c8e00207bf222dc +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.3.0-hd8ed1ab_0.conda#1dee0ac2ed01030b56bdd33eabebc42f https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.1-nompi_h261ec11_106.tar.bz2#9b25de670ce5753a33c18b1090d1d3bf -https://conda.anaconda.org/conda-forge/linux-64/pandas-1.5.3-py39h2ad29b5_1.conda#0d89bced73199385857310d3a648757d +https://conda.anaconda.org/conda-forge/linux-64/pandas-2.0.0-py39h2ad29b5_0.conda#82b63668519f28450d4a4b0f3b520461 https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.2.0-pyhd8ed1ab_0.conda#f10c2cf447ca96f12a326b83c75b8e33 https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-daemon-16.1-ha8d29e2_3.conda#34d9d75ca896f5919c372a34e25f23ea https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.5.0-py39h718ffca_1.conda#a19bf4be7ebce54623541fa4ad22abb4 https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.11.0-py39h227be39_3.conda#9e381db00691e26bcf670c3586397be1 -https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.2.1-pyhd8ed1ab_0.conda#6fe4c2689d1b10fec1ee65819f0c4fd5 +https://conda.anaconda.org/conda-forge/noarch/pytest-7.3.0-pyhd8ed1ab_0.conda#425ee1712dbbb194edf0997d46202405 https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-7.1.0-pyhd8ed1ab_0.conda#6613dbb3b25cc648a107f33ca9f80fc1 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-napoleon-0.7-py_0.tar.bz2#0bc25ff6f2e34af63ded59692df5f749 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py39hf939315_3.tar.bz2#0f11bcdf9669a5ae0f39efd8c830209a @@ -253,23 +253,24 @@ https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.2-nompi_py39hfaa66c4 https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-hd33c08f_0.conda#a8b9e35dd7be2c945b0de4fe19a7c3a9 https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-16.1-hcb278e6_3.conda#8b452ab959166d91949af4c2d28f81db https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.1.1-pyhd8ed1ab_0.conda#0b34aa3ab7e7ccb1765a03dd9ed29938 +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.2.1-pyhd8ed1ab_0.conda#6fe4c2689d1b10fec1ee65819f0c4fd5 https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.21.0-pyhd8ed1ab_0.conda#cb9a711f7c9f3074fe522e5a34481e60 https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.0-nompi_hdb2cfa9_4.conda#3e2e1d0cd06d1b64c9c2800c0eb0cde6 https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h90689f9_2.tar.bz2#957a0255ab58aaf394a91725d73ab422 https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.54.4-h7abd40a_0.tar.bz2#921e53675ed5ea352f022b79abab076a https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.2.1-pyha770c72_0.conda#3a5cb173faf0fbe20acfb65353a38b40 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.2.2-pyha770c72_0.conda#c4aab94cab4ddeb340e36d4c670a5f24 https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-h5d23da1_6.conda#59c73debd9405771690ddbbad6c57b69 https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.15-pyhd8ed1ab_0.conda#27db656619a55d727eaf5a6ece3d2fd6 -https://conda.anaconda.org/conda-forge/noarch/distributed-2023.3.2-pyhd8ed1ab_0.conda#972a8221136c71c6954cf900ce020ed5 +https://conda.anaconda.org/conda-forge/noarch/distributed-2023.3.2.1-pyhd8ed1ab_0.conda#197cfa857ee316a3cf3c1a2bb86422c9 https://conda.anaconda.org/conda-forge/linux-64/esmpy-8.4.0-nompi_py39h95eafd8_2.conda#f04f8970f741b2f78af7e5b7112d17d6 https://conda.anaconda.org/conda-forge/linux-64/graphviz-7.1.0-h2e5815a_0.conda#e7ecda996c443142a0e9c379f3b28e48 https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.7-py39h5c7b992_3.conda#19e30314fe824605750da905febb8ee6 -https://conda.anaconda.org/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_0.conda#11d178fc55199482ee48d6812ea83983 +https://conda.anaconda.org/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_1.conda#3bfbd6ead1d7299ed46dab3a7bf0bc8c https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.7.1-py39hf3d152e_0.conda#682772fa385911fb5efffbce21b269c5 https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 https://conda.anaconda.org/conda-forge/noarch/sphinx-4.5.0-pyh6c4a22f_0.tar.bz2#46b38d88c4270ff9ba78a89c83c66345 -https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.13.2-pyhd8ed1ab_0.conda#bc604eb5b33d3cf6c4c773490f3f5cda +https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.13.3-pyhd8ed1ab_0.conda#07aca5f2dea315dcc16680d6891e9056 https://conda.anaconda.org/conda-forge/linux-64/scipy-1.10.1-py39h7360e5f_0.conda#7584d1bc5499d25eccfd24a7f656e3ee https://conda.anaconda.org/conda-forge/noarch/sphinx-copybutton-0.5.1-pyhd8ed1ab_0.conda#d21ada5f548f3c8957e1fa7ec3cd7f5b https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.12.2-pyhd8ed1ab_0.conda#cb7e912f6f31de2d45984fa40a4fe78c From f7a0b874d2147e26a7043ffe05330afa787d5130 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 13 Apr 2023 13:59:14 +0100 Subject: [PATCH 68/85] Increase retries. --- lib/iris/tests/integration/netcdf/test_delayed_save.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/iris/tests/integration/netcdf/test_delayed_save.py b/lib/iris/tests/integration/netcdf/test_delayed_save.py index ef55311232..07b5021a4b 100644 --- a/lib/iris/tests/integration/netcdf/test_delayed_save.py +++ b/lib/iris/tests/integration/netcdf/test_delayed_save.py @@ -203,8 +203,8 @@ def test_time_of_writing( n_tries = 0 all_done = False - n_max_tries = 4 - retry_delay = 3.0 + n_max_tries = 12 + retry_delay = 5.0 start_time = datetime.now() while not all_done and n_tries < n_max_tries: n_tries += 1 From 69ddd9d6c32da748da7d3fc6c4cf78839fdaa52f Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 13 Apr 2023 15:38:53 +0100 Subject: [PATCH 69/85] Change debug to show which elements failed. --- lib/iris/tests/integration/netcdf/test_delayed_save.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/iris/tests/integration/netcdf/test_delayed_save.py b/lib/iris/tests/integration/netcdf/test_delayed_save.py index 07b5021a4b..3a104cc78c 100644 --- a/lib/iris/tests/integration/netcdf/test_delayed_save.py +++ b/lib/iris/tests/integration/netcdf/test_delayed_save.py @@ -233,7 +233,7 @@ def test_time_of_writing( elapsed = (end_time - start_time).total_seconds() print("time_of_writing, delayed-save test results:") print( - f" : all_done={all_done}, tries={n_tries}, elapsed-time={elapsed}" + f" : results={results}, tries={n_tries}, elapsed-time={elapsed}" ) # Check it either succeeded or timed out From 8235d60acde22d68b66c585a471b8200a17820d2 Mon Sep 17 00:00:00 2001 From: Elias <110238618+ESadek-MO@users.noreply.github.com> Date: Thu, 13 Apr 2023 14:17:06 +0100 Subject: [PATCH 70/85] update cf standard units (#5244) * update cf standard units * added whatsnew entry * Correct pull number Co-authored-by: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> --------- Co-authored-by: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> --- docs/src/whatsnew/latest.rst | 3 + etc/cf-standard-name-table.xml | 2628 ++++++++++++++++++-------------- 2 files changed, 1506 insertions(+), 1125 deletions(-) diff --git a/docs/src/whatsnew/latest.rst b/docs/src/whatsnew/latest.rst index 739daf30e3..514e6f24d2 100644 --- a/docs/src/whatsnew/latest.rst +++ b/docs/src/whatsnew/latest.rst @@ -53,6 +53,9 @@ This document explains the changes made to Iris for this release enable lazy computation of rotated wind vector components (:issue:`4934`, :pull:`4972`) +#. `@ESadek-MO`_ updated to the latest CF Standard Names Table v80 + (07 February 2023). (:pull:`5244`) + #. `@pp-mo`_ and `@lbdreyer`_ supported delayed saving of lazy data, when writing to the netCDF file format. See : :ref:`delayed netCDF saves `. Also with significant input from `@fnattino`_. diff --git a/etc/cf-standard-name-table.xml b/etc/cf-standard-name-table.xml index 9c5fcd9cf0..5d8927b480 100644 --- a/etc/cf-standard-name-table.xml +++ b/etc/cf-standard-name-table.xml @@ -1,7 +1,7 @@ - 79 - 2022-03-19T15:25:54Z + 80 + 2023-02-07T15:39:41Z Centre for Environmental Data Analysis support@ceda.ac.uk @@ -3632,6 +3632,13 @@ Downwelling radiation is radiation from above. It does not mean "net downward". The sign convention is that "upwelling" is positive upwards and "downwelling" is positive downwards. Spherical irradiance is the radiation incident on unit area of a hemispherical (or "2-pi") collector. It is sometimes called "scalar irradiance". The direction (up/downwelling) is specified. Radiation incident on a 4-pi collector has standard names of "omnidirectional spherical irradiance". A coordinate variable for radiation wavelength should be given the standard name radiation_wavelength. + + kg m-2 + + + The quantity with standard name drainage_amount_through_base_of_soil_model is the amount of water that drains through the bottom of a soil column extending from the surface to a specified depth. “Drainage” is the process of removal of excess water from soil by gravitational flow. "Amount" means mass per unit area. A vertical coordinate variable or scalar coordinate with standard name "depth" should be used to specify the depth to which the soil column extends. + + 1 @@ -3968,6 +3975,13 @@ The diameter of an aerosol particle as selected by its electrical mobility. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient_aerosol" means that the aerosol is measured or modelled at the ambient state of pressure, temperature and relative humidity that exists in its immediate environment. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity and temperature at which the quantity described by the standard name applies, provide scalar coordinate variables with standard names of "relative_humidity" and "air_temperature". + + 1 + + + Isotopic enrichment of 13C, often called delta 13C, is a measure of the ratio of stable isotopes 13C:12C. It is a parameterisation of the 13C/12C isotopic ratio in the sample with respect to the isotopic ratio in a reference standard (in this case Vienna Pee Dee Belemnite). It is computed using the formula (((13C/12C)sample / (13C/12C)standard) - 1) * 1000. Particulate means suspended solids of all sizes. + + 1e-3 @@ -3975,6 +3989,13 @@ Isotopic enrichment of 14C, often called d14C or delta14C (lower case delta), is used to calculate the fossil fuel contribution to atmospheric carbon dioxide using isotopic ratios of carbon. It is a parameterisation of the 14C/12C isotopic ratio in the sample with respect to the isotopic ratio in a reference standard. It is computed using the formula (((14C/12C)sample / (14C/12C)standard) - 1) * 1000. The quantity called D14C, or Delta14C (upper case delta) is d14C corrected for isotopic fractionation using the 13C/12C ratio as follows: D14C = d14C - 2(dC13 + 25)(1+d14C/1000). If the sample is enriched in 14C relative to the standard, then the data value is positive. Reference: Stuiver, M. and H.A. Polach, 1977, Discussion reporting of 14C data, Radiocarbon, Volume 19, No. 3, 355-363, doi: 10.1017/S0033822200003672. The reference standard used in the calculation of delta14C should be specified by attaching a long_name attribute to the data variable. "C" means the element carbon and "14C" is the radioactive isotope "carbon-14", having six protons and eight neutrons and used in radiocarbon dating. + + 1 + + + Isotopic enrichment of 15N, often called delta 15N, is a measure of the ratio of stable isotopes 15N:14N. It is a parameterisation of the 15N/14N isotopic ratio in the sample with respect to the isotopic ratio in a reference standard (in this case atmospheric nitrogen). It is computed using the formula (((15N/14N)sample / (15N/14N)standard) - 1) * 1000. Particulate means suspended solids of all sizes. + + J m-2 @@ -8028,6 +8049,34 @@ "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". The chemical formula of 19'-hexanoyloxyfucoxanthin is C48H68O8. The equivalent term in the NERC P01 Parameter Usage Vocabulary may be found at http://vocab.nerc.ac.uk/collection/P01/current/HEXAXXXX/2/. + + kg m-3 + + + "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. Aerosol particles take up ambient water (a process known as hygroscopic growth) depending on the relative humidity and the composition of the particles. "Dry aerosol particles" means aerosol particles without any water uptake. The absorption equivalent black carbon mass concentration is obtained by conversion from the particle light absorption coefficient with a suitable mass absorption cross-section. Reference: Petzold, A., Ogren, J. A., Fiebig, M., Laj, P., Li, S.-M., Baltensperger, U., Holzer-Popp, T., Kinne, S., Pappalardo, G., Sugimoto, N., Wehrli, C., Wiedensohler, A., and Zhang, X.-Y.: Recommendations for reporting "black carbon" measurements, Atmos. Chem. Phys., 13, 8365–8379, https://doi.org/10.5194/acp-13-8365-2013, 2013. + + + + kg m-3 + + + "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. Aerosol particles take up ambient water (a process known as hygroscopic growth) depending on the relative humidity and the composition of the particles. "Dry aerosol particles" means aerosol particles without any water uptake. "Pm10 aerosol" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. The absorption equivalent black carbon mass concentration is obtained by conversion from the particle light absorption coefficient with a suitable mass absorption cross-section. Reference: Petzold, A., Ogren, J. A., Fiebig, M., Laj, P., Li, S.-M., Baltensperger, U., Holzer-Popp, T., Kinne, S., Pappalardo, G., Sugimoto, N., Wehrli, C., Wiedensohler, A., and Zhang, X.-Y.: Recommendations for reporting "black carbon" measurements, Atmos. Chem. Phys., 13, 8365–8379, https://doi.org/10.5194/acp-13-8365-2013, 2013. + + + + kg m-3 + + + "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. Aerosol particles take up ambient water (a process known as hygroscopic growth) depending on the relative humidity and the composition of the particles. "Dry aerosol particles" means aerosol particles without any water uptake. "Pm1 aerosol" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 1 micrometer. The absorption equivalent black carbon mass concentration is obtained by conversion from the particle light absorption coefficient with a suitable mass absorption cross-section. Reference: Petzold, A., Ogren, J. A., Fiebig, M., Laj, P., Li, S.-M., Baltensperger, U., Holzer-Popp, T., Kinne, S., Pappalardo, G., Sugimoto, N., Wehrli, C., Wiedensohler, A., and Zhang, X.-Y.: Recommendations for reporting "black carbon" measurements, Atmos. Chem. Phys., 13, 8365–8379, https://doi.org/10.5194/acp-13-8365-2013, 2013. + + + + kg m-3 + + + "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. Aerosol particles take up ambient water (a process known as hygroscopic growth) depending on the relative humidity and the composition of the particles. "Dry aerosol particles" means aerosol particles without any water uptake. "Pm2p5 aerosol" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 2.5 micrometers. The absorption equivalent black carbon mass concentration is obtained by conversion from the particle light absorption coefficient with a suitable mass absorption cross-section. Reference: Petzold, A., Ogren, J. A., Fiebig, M., Laj, P., Li, S.-M., Baltensperger, U., Holzer-Popp, T., Kinne, S., Pappalardo, G., Sugimoto, N., Wehrli, C., Wiedensohler, A., and Zhang, X.-Y.: Recommendations for reporting "black carbon" measurements, Atmos. Chem. Phys., 13, 8365–8379, https://doi.org/10.5194/acp-13-8365-2013, 2013. + + kg m-3 @@ -8238,6 +8287,34 @@ Mass concentration means mass per unit volume and is used in the construction mass_concentration_of_X_in_Y, where X is a material constituent of Y. A chemical species denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. The chemical formula for carbon dioxide is CO2. + + kg m-3 + + + "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. Aerosol particles take up ambient water (a process known as hygroscopic growth) depending on the relative humidity and the composition of the particles. "Dry aerosol particles" means aerosol particles without any water uptake. Chemically, "carbon" is the total sum of elemental, organic, and inorganic carbon. In measurements of carbonaceous aerosols, inorganic carbon is neglected and its mass is assumed to be distributed between the elemental and organic carbon components of the aerosol particles. Reference: Petzold, A., Ogren, J. A., Fiebig, M., Laj, P., Li, S.-M., Baltensperger, U., Holzer-Popp, T., Kinne, S., Pappalardo, G., Sugimoto, N., Wehrli, C., Wiedensohler, A., and Zhang, X.-Y.: Recommendations for reporting "black carbon" measurements, Atmos. Chem. Phys., 13, 8365–8379, https://doi.org/10.5194/acp-13-8365-2013, 2013. + + + + kg m-3 + + + "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. Aerosol particles take up ambient water (a process known as hygroscopic growth) depending on the relative humidity and the composition of the particles. "Dry aerosol particles" means aerosol particles without any water uptake. "Pm10 aerosol" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. Chemically, "carbon" is the total sum of elemental, organic, and inorganic carbon. In measurements of carbonaceous aerosols, inorganic carbon is neglected and its mass is assumed to be distributed between the elemental and organic carbon components of the aerosol particles. Reference: Petzold, A., Ogren, J. A., Fiebig, M., Laj, P., Li, S.-M., Baltensperger, U., Holzer-Popp, T., Kinne, S., Pappalardo, G., Sugimoto, N., Wehrli, C., Wiedensohler, A., and Zhang, X.-Y.: Recommendations for reporting "black carbon" measurements, Atmos. Chem. Phys., 13, 8365–8379, https://doi.org/10.5194/acp-13-8365-2013, 2013. + + + + kg m-3 + + + "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. Aerosol particles take up ambient water (a process known as hygroscopic growth) depending on the relative humidity and the composition of the particles. "Dry aerosol particles" means aerosol particles without any water uptake. "Pm1 aerosol" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 1 micrometer. Chemically, "carbon" is the total sum of elemental, organic, and inorganic carbon. In measurements of carbonaceous aerosols, inorganic carbon is neglected and its mass is assumed to be distributed between the elemental and organic carbon components of the aerosol particles. Reference: Petzold, A., Ogren, J. A., Fiebig, M., Laj, P., Li, S.-M., Baltensperger, U., Holzer-Popp, T., Kinne, S., Pappalardo, G., Sugimoto, N., Wehrli, C., Wiedensohler, A., and Zhang, X.-Y.: Recommendations for reporting "black carbon" measurements, Atmos. Chem. Phys., 13, 8365–8379, https://doi.org/10.5194/acp-13-8365-2013, 2013. + + + + kg m-3 + + + "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. Aerosol particles take up ambient water (a process known as hygroscopic growth) depending on the relative humidity and the composition of the particles. "Dry aerosol particles" means aerosol particles without any water uptake. "Pm2p5 aerosol" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 2.5 micrometers. Chemically, "carbon" is the total sum of elemental, organic, and inorganic carbon. In measurements of carbonaceous aerosols, inorganic carbon is neglected and its mass is assumed to be distributed between the elemental and organic carbon components of the aerosol particles. Reference: Petzold, A., Ogren, J. A., Fiebig, M., Laj, P., Li, S.-M., Baltensperger, U., Holzer-Popp, T., Kinne, S., Pappalardo, G., Sugimoto, N., Wehrli, C., Wiedensohler, A., and Zhang, X.-Y.: Recommendations for reporting "black carbon" measurements, Atmos. Chem. Phys., 13, 8365–8379, https://doi.org/10.5194/acp-13-8365-2013, 2013. + + kg m-3 @@ -8350,6 +8427,13 @@ "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". Chlorophylls are the green pigments found in most plants, algae and cyanobacteria; their presence is essential for photosynthesis to take place. There are several different forms of chlorophyll that occur naturally. All contain a chlorin ring (chemical formula C20H16N4) which gives the green pigment and a side chain whose structure varies. The naturally occurring forms of chlorophyll contain between 35 and 55 carbon atoms. The chemical formula of chlorophyll c3 is C36H44MgN4O7. The equivalent term in the NERC P01 Parameter Usage Vocabulary may be found at http://vocab.nerc.ac.uk/collection/P01/current/CHLC03PX/2/. + + kg m-3 + + + "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". Chlorophylls are the green pigments found in most plants, algae and cyanobacteria; their presence is essential for photosynthesis to take place. There are several different forms of chlorophyll that occur naturally. All contain a chlorin ring (chemical formula C20H16N4) which gives the green pigment and a side chain whose structure varies. The naturally occurring forms of chlorophyll contain between 35 and 55 carbon atoms. + + kg m-3 @@ -8490,6 +8574,34 @@ Mass concentration means mass per unit volume and is used in the construction mass_concentration_of_X_in_Y, where X is a material constituent of Y. A chemical species denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. Aerosol takes up ambient water (a process known as hygroscopic growth) depending on the relative humidity and the composition of the aerosol. "Dry aerosol particles" means aerosol particles without any water uptake. Chemically, "elemental carbon" is the carbonaceous fraction of particulate matter that is thermally stable in an inert atmosphere to high temperatures near 4000K and can only be gasified by oxidation starting at temperatures above 340 C. It is assumed to be inert and non-volatile under atmospheric conditions and insoluble in any solvent (Ogren and Charlson, 1983). + + kg m-3 + + + "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. Aerosol particles take up ambient water (a process known as hygroscopic growth) depending on the relative humidity and the composition of the particles. "Dry aerosol particles" means aerosol particles without any water uptake. Chemically, "elemental carbon" is the carbonaceous fraction of particulate matter that is thermally stable in an inert atmosphere to high temperatures near 4000K and can only be gasified by oxidation starting at temperatures above 340 C. It is assumed to be inert and non-volatile under atmospheric conditions and insoluble in any solvent (Ogren and Charlson, 1983). In measurements of carbonaceous aerosols, elemental carbon samples may also include some inorganic carbon compounds, whose mass is neglected and assumed to be distributed between the elemental and organic carbon components of the aerosol particles. Reference: Petzold, A., Ogren, J. A., Fiebig, M., Laj, P., Li, S.-M., Baltensperger, U., Holzer-Popp, T., Kinne, S., Pappalardo, G., Sugimoto, N., Wehrli, C., Wiedensohler, A., and Zhang, X.-Y.: Recommendations for reporting "black carbon" measurements, Atmos. Chem. Phys., 13, 8365–8379, https://doi.org/10.5194/acp-13-8365-2013, 2013. + + + + kg m-3 + + + "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. Aerosol particles take up ambient water (a process known as hygroscopic growth) depending on the relative humidity and the composition of the particles. "Dry aerosol particles" means aerosol particles without any water uptake. "Pm10 aerosol" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. Chemically, "elemental carbon" is the carbonaceous fraction of particulate matter that is thermally stable in an inert atmosphere to high temperatures near 4000K and can only be gasified by oxidation starting at temperatures above 340 C. It is assumed to be inert and non-volatile under atmospheric conditions and insoluble in any solvent (Ogren and Charlson, 1983). In measurements of carbonaceous aerosols, elemental carbon samples may also include some inorganic carbon compounds, whose mass is neglected and assumed to be distributed between the elemental and organic carbon components of the aerosol particles. Reference: Petzold, A., Ogren, J. A., Fiebig, M., Laj, P., Li, S.-M., Baltensperger, U., Holzer-Popp, T., Kinne, S., Pappalardo, G., Sugimoto, N., Wehrli, C., Wiedensohler, A., and Zhang, X.-Y.: Recommendations for reporting "black carbon" measurements, Atmos. Chem. Phys., 13, 8365–8379, https://doi.org/10.5194/acp-13-8365-2013, 2013. + + + + kg m-3 + + + "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. Aerosol particles take up ambient water (a process known as hygroscopic growth) depending on the relative humidity and the composition of the particles. "Dry aerosol particles" means aerosol particles without any water uptake. "Pm1 aerosol" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 1 micrometer. Chemically, "elemental carbon" is the carbonaceous fraction of particulate matter that is thermally stable in an inert atmosphere to high temperatures near 4000K and can only be gasified by oxidation starting at temperatures above 340 C. It is assumed to be inert and non-volatile under atmospheric conditions and insoluble in any solvent (Ogren and Charlson, 1983). In measurements of carbonaceous aerosols, elemental carbon samples may also include some inorganic carbon compounds, whose mass is neglected and assumed to be distributed between the elemental and organic carbon components of the aerosol particles. Reference: Petzold, A., Ogren, J. A., Fiebig, M., Laj, P., Li, S.-M., Baltensperger, U., Holzer-Popp, T., Kinne, S., Pappalardo, G., Sugimoto, N., Wehrli, C., Wiedensohler, A., and Zhang, X.-Y.: Recommendations for reporting "black carbon" measurements, Atmos. Chem. Phys., 13, 8365–8379, https://doi.org/10.5194/acp-13-8365-2013, 2013. + + + + kg m-3 + + + "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. Aerosol particles take up ambient water (a process known as hygroscopic growth) depending on the relative humidity and the composition of the particles. "Dry aerosol particles" means aerosol particles without any water uptake. "Pm2p5 aerosol" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 2.5 micrometers. Chemically, "elemental carbon" is the carbonaceous fraction of particulate matter that is thermally stable in an inert atmosphere to high temperatures near 4000K and can only be gasified by oxidation starting at temperatures above 340 C. It is assumed to be inert and non-volatile under atmospheric conditions and insoluble in any solvent (Ogren and Charlson, 1983). In measurements of carbonaceous aerosols, elemental carbon samples may also include some inorganic carbon compounds, whose mass is neglected and assumed to be distributed between the elemental and organic carbon components of the aerosol particles. Reference: Petzold, A., Ogren, J. A., Fiebig, M., Laj, P., Li, S.-M., Baltensperger, U., Holzer-Popp, T., Kinne, S., Pappalardo, G., Sugimoto, N., Wehrli, C., Wiedensohler, A., and Zhang, X.-Y.: Recommendations for reporting "black carbon" measurements, Atmos. Chem. Phys., 13, 8365–8379, https://doi.org/10.5194/acp-13-8365-2013, 2013. + + kg m-3 @@ -8903,6 +9015,34 @@ Mass concentration means mass per unit volume and is used in the construction mass_concentration_of_X_in_Y, where X is a material constituent of Y. A chemical species denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. "Noy" describes a family of chemical species. The family usually includes atomic nitrogen (N), nitrogen monoxide (NO), nitrogen dioxide (NO2), dinitrogen pentoxide (N2O5), nitric acid (HNO3), peroxynitric acid (HNO4), bromine nitrate (BrONO2) , chlorine nitrate (ClONO2) and organic nitrates (most notably peroxyacetyl nitrate, sometimes referred to as PAN, (CH3COO2NO2)). The list of individual species that are included in a quantity having a group chemical standard name can vary between models. Where possible, the data variable should be accompanied by a complete description of the species represented, for example, by using a comment attribute. The phrase 'expressed_as' is used in the construction A_expressed_as_B, where B is a chemical constituent of A. It means that the quantity indicated by the standard name is calculated solely with respect to the B contained in A, neglecting all other chemical constituents of A. + + kg m-3 + + + "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. Aerosol particles take up ambient water (a process known as hygroscopic growth) depending on the relative humidity and the composition of the particles. "Dry aerosol particles" means aerosol particles without any water uptake. Chemically, "organic carbon aerosol" refers to the carbonaceous fraction of particulate matter contained in any of the vast number of compounds where carbon is chemically combined with hydrogen and other elements like O, S, N, P, Cl, etc. In measurements of carbonaceous aerosols, organic carbon samples may also include some inorganic carbon compounds, whose mass is neglected and assumed to be distributed between the elemental and organic carbon components of the aerosol particles. Reference: Petzold, A., Ogren, J. A., Fiebig, M., Laj, P., Li, S.-M., Baltensperger, U., Holzer-Popp, T., Kinne, S., Pappalardo, G., Sugimoto, N., Wehrli, C., Wiedensohler, A., and Zhang, X.-Y.: Recommendations for reporting "black carbon" measurements, Atmos. Chem. Phys., 13, 8365–8379, https://doi.org/10.5194/acp-13-8365-2013, 2013. + + + + kg m-3 + + + "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. Aerosol particles take up ambient water (a process known as hygroscopic growth) depending on the relative humidity and the composition of the particles. "Dry aerosol particles" means aerosol particles without any water uptake. "Pm10 aerosol" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 10 micrometers. Chemically, "organic carbon aerosol" refers to the carbonaceous fraction of particulate matter contained in any of the vast number of compounds where carbon is chemically combined with hydrogen and other elements like O, S, N, P, Cl, etc. In measurements of carbonaceous aerosols, organic carbon samples may also include some inorganic carbon compounds, whose mass is neglected and assumed to be distributed between the elemental and organic carbon components of the aerosol particles. Reference: Petzold, A., Ogren, J. A., Fiebig, M., Laj, P., Li, S.-M., Baltensperger, U., Holzer-Popp, T., Kinne, S., Pappalardo, G., Sugimoto, N., Wehrli, C., Wiedensohler, A., and Zhang, X.-Y.: Recommendations for reporting "black carbon" measurements, Atmos. Chem. Phys., 13, 8365–8379, https://doi.org/10.5194/acp-13-8365-2013, 2013. + + + + kg m-3 + + + "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". Aerosol particles take up ambient water (a process known as hygroscopic growth) depending on the relative humidity and the composition of the particles. "Dry aerosol particles" means aerosol particles without any water uptake. "Pm1 aerosol" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 1 micrometer. Chemically, "organic carbon aerosol" refers to the carbonaceous fraction of particulate matter contained in any of the vast number of compounds where carbon is chemically combined with hydrogen and other elements like O, S, N, P, Cl, etc. In measurements of carbonaceous aerosols, organic carbon samples may also include some inorganic carbon compounds, whose mass is neglected and assumed to be distributed between the elemental and organic carbon components of the aerosol particles. Reference: Petzold, A., Ogren, J. A., Fiebig, M., Laj, P., Li, S.-M., Baltensperger, U., Holzer-Popp, T., Kinne, S., Pappalardo, G., Sugimoto, N., Wehrli, C., Wiedensohler, A., and Zhang, X.-Y.: Recommendations for reporting "black carbon" measurements, Atmos. Chem. Phys., 13, 8365–8379, https://doi.org/10.5194/acp-13-8365-2013, 2013. + + + + kg m-3 + + + "Mass concentration" means mass per unit volume and is used in the construction "mass_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. Aerosol particles take up ambient water (a process known as hygroscopic growth) depending on the relative humidity and the composition of the particles. "Dry aerosol particles" means aerosol particles without any water uptake. "Pm2p5 aerosol" means atmospheric particulate compounds with an aerodynamic diameter of less than or equal to 2.5 micrometers. Chemically, "organic carbon aerosol" refers to the carbonaceous fraction of particulate matter contained in any of the vast number of compounds where carbon is chemically combined with hydrogen and other elements like O, S, N, P, Cl, etc. In measurements of carbonaceous aerosols, organic carbon samples may also include some inorganic carbon compounds, whose mass is neglected and assumed to be distributed between the elemental and organic carbon components of the aerosol particles. Reference: Petzold, A., Ogren, J. A., Fiebig, M., Laj, P., Li, S.-M., Baltensperger, U., Holzer-Popp, T., Kinne, S., Pappalardo, G., Sugimoto, N., Wehrli, C., Wiedensohler, A., and Zhang, X.-Y.: Recommendations for reporting "black carbon" measurements, Atmos. Chem. Phys., 13, 8365–8379, https://doi.org/10.5194/acp-13-8365-2013, 2013. + + kg m-3 @@ -11430,6 +11570,13 @@ Mole concentration means number of moles per unit volume, also called "molarity", and is used in the construction mole_concentration_of_X_in_Y, where X is a material constituent of Y. A chemical species denoted by X may be described by a single term such as 'nitrogen' or a phrase such as 'nox_expressed_as_nitrogen'. The chemical symbol for mercury is Hg. + + mol m-3 + + + "Mole concentration" means number of moles per unit volume, also called "molarity", and is used in the construction "mole_concentration_of_X_in_Y", where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". The chemical formula of guanosine triphosphate is C10H16N5O14P3. + + mol m-3 @@ -12165,6 +12312,20 @@ Mole fraction is used in the construction mole_fraction_of_X_in_Y, where X is a material constituent of Y. The chemical formula of bromine nitrate is BrONO2. + + mol mol-1 + + + "Mole fraction" is used in the construction "mole_fraction_of_X_in_Y", where X is a material constituent of Y. A chemical or biological species denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". The chemical formula for bromochloromethane is CH2BrCl. The IUPAC name is bromochloromethane. + + + + mol mol-1 + + + "Mole fraction" is used in the construction "mole_fraction_of_X_in_Y", where X is a material constituent of Y. A chemical or biological species denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". The chemical formula for bromodichloromethane is CHBrCl2. The IUPAC name is bromodichloromethane. + + 1 @@ -12298,6 +12459,20 @@ "Mole fraction" is used in the construction "mole_fraction_of_X_in_Y", where X is a material constituent of Y. A chemical or biological species denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". The phrase "expressed_as" is used in the construction A_expressed_as_B, where B is a chemical constituent of A. It means that the quantity indicated by the standard name is calculated solely with respect to the B contained in A, neglecting all other chemical constituents of A. "Clox" describes a family of chemical species consisting of inorganic chlorine compounds with the exception of hydrogen chloride (HCl) and chlorine nitrate (ClONO2). "Clox" is the term used in standard names for all species belonging to the family that are represented within a given model. The list of individual species that are included in a quantity with a group chemical standard name can vary between models. Where possible, the data variable should be accompanied by a complete description of the species represented, for example, by using a comment attribute. "Inorganic chlorine", sometimes referred to as Cly, describes a family of chemical species which result from the degradation of source gases containing chlorine (CFCs, HCFCs, VSLS) and natural inorganic chlorine sources such as sea salt and other aerosols. Standard names that use the term "inorganic_chlorine" are used for quantities that contain all inorganic chlorine species including HCl and ClONO2. + + mol mol-1 + + + "Mole fraction" is used in the construction "mole_fraction_of_X_in_Y", where X is a material constituent of Y. A chemical or biological species denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". The chemical formula for dibromochloromethane is CHBr2Cl. The IUPAC name is dibromochloromethane. + + + + mol mol-1 + + + "Mole fraction" is used in the construction "mole_fraction_of_X_in_Y", where X is a material constituent of Y. A chemical or biological species denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". The chemical formula for dibromomethane is CH2Br2. The IUPAC name is dibromomethane. + + 1 @@ -12886,6 +13061,13 @@ "Mole fraction" is used in the construction "mole_fraction_of_X_in_Y", where X is a material constituent of Y. A chemical or biological species denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". The chemical formula for toluene is C6H5CH3. Toluene has the same structure as benzene, except that one of the hydrogen atoms is replaced by a methyl group. The IUPAC name for toluene is methylbenzene. + + mol mol-1 + + + "Mole fraction" is used in the construction "mole_fraction_of_X_in_Y", where X is a material constituent of Y. A chemical or biological species denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". The chemical formula for tribromomethane is CHBr3. The IUPAC name is tribromomethane. + + 1 @@ -12921,6 +13103,13 @@ The construction "moles_of_X_per_unit_mass_in_Y" is also called "molality" of X in Y, where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". "Dissolved inorganic carbon" describes a family of chemical species in solution, including carbon dioxide, carbonic acid and the carbonate and bicarbonate anions. "Dissolved inorganic carbon" is the term used in standard names for all species belonging to the family that are represented within a given model. The list of individual species that are included in a quantity having a group chemical standard name can vary between models. Where possible, the data variable should be accompanied by a complete description of the species represented, for example, by using a comment attribute. + + mol kg-1 + + + The construction "moles_of_X_per_unit_mass_in_Y" is also called "molality" of X in Y, where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". The chemical formula for hydrogen peroxide is H2O2. + + mol kg-1 @@ -12942,6 +13131,13 @@ moles_of_X_per_unit_mass_inY is also called "molality" of X in Y, where X is a material constituent of Y. + + mol kg-1 + + + The construction "moles_of_X_per_unit_mass_in_Y" is also called "molality" of X in Y, where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". The chemical formula for nitrous oxide is N2O. The chemical formula for nitrous oxide is N2O. The equivalent term in the NERC P01 Parameter Usage Vocabulary may be found at http://vocab.nerc.ac.uk/collection/P01/current/DN2OZZ01/. + + mol kg-1 @@ -12949,6 +13145,20 @@ moles_of_X_per_unit_mass_inY is also called "molality" of X in Y, where X is a material constituent of Y. + + mol kg-1 + + + The construction "moles_of_X_per_unit_mass_in_Y" is also called "molality" of X in Y, where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". Particulate means suspended solids of all sizes. Biogenic silica is a hydrated form of silica (silicon dioxide) with the chemical formula SiO2.nH2O sometimes referred to as opaline silica or opal. It is created by biological processes and in sea water it is predominantly the skeletal material of diatoms. + + + + mol kg-1 + + + The construction "moles_of_X_per_unit_mass_in_Y" is also called "molality" of X in Y, where X is a material constituent of Y. A chemical species or biological group denoted by X may be described by a single term such as "nitrogen" or a phrase such as "nox_expressed_as_nitrogen". Particulate means suspended solids of all sizes. Particulate inorganic carbon is carbon bound in molecules ionically that may be liberated from the particles as carbon dioxide by acidification. + + mol kg-1 @@ -13614,6 +13824,13 @@ "Number concentration" means the number of particles or other specified objects per unit volume. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "stp" means standard temperature (0 degC) and pressure (101325 Pa). The surface called "surface" means the lower boundary of the atmosphere. + + m-3 + + + "Number concentration" means the number of particles or other specified objects per unit volume. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. + + m-3 @@ -13628,6 +13845,13 @@ "Number concentration" means the number of particles or other specified objects per unit volume. "Biological taxon" is a name or other label identifying an organism or a group of organisms as belonging to a unit of classification in a hierarchical taxonomy. There must be an auxiliary coordinate variable with standard name biological_taxon_name to identify the taxon in human readable format and optionally an auxiliary coordinate variable with standard name biological_taxon_lsid to provide a machine-readable identifier. See Section 6.1.2 of the CF convention (version 1.8 or later) for information about biological taxon auxiliary coordinate variables. + + m-3 + + + "Number concentration" means the number of particles or other specified objects per unit volume. "Pollen grain" refers to the male gametophyte of seed plants (either angiosperms or gymnosperms). The number concentration of pollen grains refers to the number of individual pollen grains per unit volume. "Biological taxon" is a name or other label identifying an organism or a group of organisms as belonging to a unit of classification in a hierarchical taxonomy. There must be an auxiliary coordinate variable with standard name biological_taxon_name to identify the taxon in human readable format and optionally an auxiliary coordinate variable with standard name biological_taxon_identifier to provide a machine-readable identifier. See Section 6.1.2 of the CF convention (version 1.8 or later) for information about biological taxon auxiliary coordinate variables. + + m-3 @@ -13635,6 +13859,13 @@ The cloud condensation nuclei number concentration is the total number of aerosol particles per unit volume independent of and integrated over particle size that act as condensation nuclei for liquid-phase clouds. A coordinate variable with the standard name of relative_humidity should be specified to indicate that the property refers to a specific supersaturation with respect to liquid water. The ability of a particle to act as a condensation nucleus is determined by its size, chemical composition, and morphology. "stp" means standard temperature (0 degC) and pressure (101325 Pa). + + m-3 + + + "Number concentration" means the number of particles or other specified objects per unit volume. The cloud condensation nuclei number concentration is the total number of aerosol particles per unit volume independent of and integrated over particle size that act as condensation nuclei for liquid-phase clouds. A coordinate variable with the standard name of relative_humidity should be specified to indicate that the property refers to a specific supersaturation with respect to liquid water. The ability of a particle to act as a condensation nucleus is determined by its size, chemical composition, and morphology. + + m-3 @@ -17583,6 +17814,13 @@ "Radioactivity" means the number of radioactive decays of a material per second. "Radioactivity concentration" means radioactivity per unit volume of the medium. "Tc" means the element "technetium" and "99Tc" is the isotope "technetium-99" with a half-life of 7.79e+07 days. + + s + + + The quantity with standard name radio_signal_roundtrip_travel_time_in_air is the time taken for an electromagnetic signal to propagate from an emitting instrument such as a radar or lidar to a reflecting volume and back again. The signal returned to the instrument is the sum of all scattering from a given volume of air regardless of mechanism (examples are scattering by aerosols, hydrometeors and refractive index irregularities, or whatever else the instrument detects). + + m @@ -17681,6 +17919,13 @@ Realization is used to label a dimension that can be thought of as a statistical sample, e.g., labelling members of a model ensemble. + + W + + + The quantity with standard name received_power_of_radio_wave_in_air_scattered_by_air refers to the received power of the signal at an instrument such as a radar or lidar. The signal returned to the instrument is the sum of all scattering from a given volume of air regardless of mechanism (examples are scattering by aerosols, hydrometeors and refractive index irregularities, or whatever else the instrument detects). + + Pa @@ -18262,6 +18507,13 @@ The specification of a physical process by the phrase due_to_process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. "Air pressure at low frequency" means variations in air pressure with periods longer than 20 days. These give rise to corresponding variations in sea surface topography. The quantity sea_surface_height_correction_due_to_air_pressure_at_low_frequency is commonly called the "inverted barometer effect" and the correction should be applied by adding it to the quantity with standard name altimeter_range. Additional altimeter range corrections are given by the quantities with standard names altimeter_range_correction_due_to_wet_troposphere, altimeter_range_correction_due_to_dry_troposphere, altimeter_range_correction_due_to_ionosphere and sea_surface_height_correction_due_to_air_pressure_and_wind_at_high_frequency. + + m + + + Significant wave height is a statistic computed from wave measurements and corresponds to the average height of the highest one third of the waves, where the height is defined as the vertical distance from a wave trough to the following wave crest. Infragravity waves are waves occurring in the frequency range 0.04 to 0.004 s^-1 (wave periods of 25 to 250 seconds). + + 1 @@ -18563,6 +18815,13 @@ The wave directional spectrum can be written as a five dimensional function S(t,x,y,f,theta) where t is time, x and y are horizontal coordinates (such as longitude and latitude), f is frequency and theta is direction. S has the standard name sea_surface_wave_directional_variance_spectral_density. S can be integrated over direction to give S1= integral(S dtheta) and this quantity has the standard name sea_surface_wave_variance_spectral_density. The quantity with standard name sea_surface_wave_energy_at_variance_spectral_density_maximum, sometimes called peak wave energy, is the maximum value of the variance spectral density (max(S1)). + + s-1 + + + Frequency is the number of oscillations of a wave per unit time. The sea_surface_wave_frequency_at_variance_spectral_density_maximum is the frequency of the most energetic waves in the total wave spectrum at a specific location. The wave directional spectrum can be written as a five dimensional function S(t,x,y,f,theta) where t is time, x and y are horizontal coordinates (such as longitude and latitude), f is frequency and theta is direction. S has the standard name sea_surface_wave_directional_variance_spectral_density. S can be integrated over direction to give S1= integral(S dtheta) and this quantity has the standard name sea_surface_wave_variance_spectral_density. + + degree @@ -18682,6 +18941,13 @@ Wave slope describes an aspect of sea surface wave geometry related to sea surface roughness. Mean square slope describes a derivation over multiple waves within a sea-state, for example calculated from moments of the wave directional spectrum. The phrase "y_slope" indicates that slope values are derived from vector components along the grid y-axis. + + m + + + The wave directional spectrum can be written as a five dimensional function S(t,x,y,k,theta) where t is time, x and y are horizontal coordinates (such as longitude and latitude), k is wavenumber and theta is direction. S has the standard name sea_surface_wave_directional_variance_spectral_density. S can be integrated over direction to give S1= integral(S dtheta) and this quantity has the standard name sea_surface_wave_variance_spectral_density. Wavenumber is the number of oscillations of a wave per unit distance. Wavenumber moments, M(n) of S1 can then be calculated as follows: M(n) = integral(S1 k^n dk), where k^n is k to the power of n. The inverse wave wavenumber, k(m-1), is calculated as the ratio M(-1)/M(0). The wavelength is the horizontal distance between repeated features on the waveform such as crests, troughs or upward passes through the mean level. + + m-1 @@ -18693,7 +18959,7 @@ s - A period is an interval of time, or the time-period of an oscillation. The sea_surface_wave_period_at_variance_spectral_density_maximum, sometimes called peak wave period, is the period of the most energetic waves in the total wave spectrum at a specific location. + A period is an interval of time, or the time-period of an oscillation. Wave period is the interval of time between repeated features on the waveform such as crests, troughs or upward passes through the mean level. The sea_surface_wave_period_at_variance_spectral_density_maximum, sometimes called peak wave period, is the period of the most energetic waves in the total wave spectrum at a specific location. The wave directional spectrum can be written as a five dimensional function S(t,x,y,f,theta) where t is time, x and y are horizontal coordinates (such as longitude and latitude), f is frequency and theta is direction. S has the standard name sea_surface_wave_directional_variance_spectral_density. S can be integrated over direction to give S1= integral(S dtheta) and this quantity has the standard name sea_surface_wave_variance_spectral_density. @@ -19375,6 +19641,48 @@ "Single scattering albedo" is the fraction of radiation in an incident light beam scattered by the particles of an aerosol reference volume for a given wavelength. It is the ratio of the scattering and the extinction coefficients of the aerosol particles in the reference volume. A coordinate variable with a standard name of radiation_wavelength or radiation_frequency should be included to specify either the wavelength or frequency. "Aerosol" means the system of suspended liquid or solid particles in air (except cloud droplets) and their carrier gas, the air itself. "Ambient_aerosol" means that the aerosol is measured or modelled at the ambient state of pressure, temperature and relative humidity that exists in its immediate environment. "Ambient aerosol particles" are aerosol particles that have taken up ambient water through hygroscopic growth. The extent of hygroscopic growth depends on the relative humidity and the composition of the particles. To specify the relative humidity and temperature at which the quantity described by the standard name applies, provide scalar coordinate variables with standard names of "relative_humidity" and "air_temperature". The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. + + kg m-2 s-1 + + + In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. "Sinking" is the gravitational settling of particulate matter suspended in a liquid. A sinking flux is positive downwards and is calculated relative to the movement of the surrounding fluid. Particulate means suspended solids of all sizes. Biogenic silica is a hydrated form of silica (silicon dioxide) with the chemical formula SiO2.nH2O sometimes referred to as opaline silica or opal. It is created by biological processes and in sea water it is predominantly the skeletal material of diatoms. + + + + kg m-2 s-1 + + + In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. 'Sinking' is the gravitational settling of particulate matter suspended in a liquid. A sinking flux is positive downwards and is calculated relative to the movement of the surrounding fluid. Particulate means suspended solids of all sizes. + + + + kg m-2 s-1 + + + In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. "Sinking" is the gravitational settling of particulate matter suspended in a liquid. A sinking flux is positive downwards and is calculated relative to the movement of the surrounding fluid. Particulate means suspended solids of all sizes. Particulate inorganic carbon is carbon bound in molecules ionically that may be liberated from the particles as carbon dioxide by acidification. + + + + kg m-2 s-1 + + + In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. "Sinking" is the gravitational settling of particulate matter suspended in a liquid. A sinking flux is positive downwards and is calculated relative to the movement of the surrounding fluid. + + + + kg m-2 s-1 + + + In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. "Sinking" is the gravitational settling of particulate matter suspended in a liquid. A sinking flux is positive downwards and is calculated relative to the movement of the surrounding fluid. Particulate means suspended solids of all sizes. + + + + kg m-2 s-1 + + + In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. 'Sinking' is the gravitational settling of particulate matter suspended in a liquid. A sinking flux is positive downwards and is calculated relative to the movement of the surrounding fluid. Particulate means suspended solids of all sizes. + + mol m-2 s-1 @@ -19809,6 +20117,13 @@ "Specific" means per unit mass. "Turbulent kinetic energy" is the kinetic energy of chaotic fluctuations of the fluid flow. + + Hz + + + The quantity with standard name spectral_width_of_radio_wave_in_air_scattered_by_air is the frequency width of the signal received by an instrument such as a radar or lidar. The signal returned to the instrument is the sum of all scattering from a given volume of air regardless of mechanism (examples are scattering by aerosols, hydrometeors and refractive index irregularities, or whatever else the instrument detects). + + m s-1 @@ -19949,6 +20264,13 @@ "Upward" indicates a vector component which is positive when directed upward (negative downward). Ocean transport means transport by all processes, both sea water and sea ice. "square_of_X" means X*X. + + K + + + In thermodynamics and fluid mechanics, stagnation temperature is the temperature at a stagnation point in a fluid flow. At a stagnation point the speed of the fluid is zero and all of the kinetic energy has been converted to internal energy and is added to the local static enthalpy. In both compressible and incompressible fluid flow, the stagnation temperature is equal to the total temperature at all points on the streamline leading to the stagnation point. In aviation, stagnation temperature is known as total air temperature and is measured by a temperature probe mounted on the surface of the aircraft. The probe is designed to bring the air to rest relative to the aircraft. As the air is brought to rest, kinetic energy is converted to internal energy. The air is compressed and experiences an adiabatic increase in temperature. Therefore, total air temperature is higher than the static (or ambient) air temperature. Total air temperature is an essential input to an air data computer in order to enable computation of static air temperature and hence true airspeed. + + 1 @@ -23596,6 +23918,34 @@ The surface called "surface" means the lower boundary of the atmosphere. Runoff is the liquid water which drains from land. If not specified, "runoff" refers to the sum of surface runoff and subsurface drainage. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. + + m s-1 + + + A velocity is a vector quantity. "x" indicates a vector component along the grid x-axis, positive with increasing x. Ocean currents are related to phenomena of different nature and processes, such as density currents, currents raised by the wind, tide, wave propagation, mass flow in estuaries, etc. This standard name refers to the sum of currents of all origins. + + + + m s-1 + + + A velocity is a vector quantity. "x" indicates a vector component along the grid x-axis, positive with increasing x. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. Tides are the rise and fall of sea levels caused by the combined effects of the gravitational forces exerted by the Moon and the Sun, and the rotation of the Earth. This rise in water level is accompanied by a horizontal movement of water called the tidal current. + + + + m s-1 + + + A velocity is a vector quantity. "y" indicates a vector component along the grid y-axis, positive with increasing y. Ocean currents are related to phenomena of different nature and processes, such as density currents, currents raised by the wind, tide, wave propagation, mass flow in estuaries, etc. This Standard Name refers to the sum of currents of all origins. + + + + m s-1 + + + A velocity is a vector quantity. "y" indicates a vector component along the grid y-axis, positive with increasing y. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. Tides are the rise and fall of sea levels caused by the combined effects of the gravitational forces exerted by the Moon and the Sun, and the rotation of the Earth. This rise in water level is accompanied by a horizontal movement of water called the tidal current. + + kg m-2 65 @@ -23743,6 +24093,13 @@ The surface called "surface" means the lower boundary of the atmosphere. "Upward" indicates a vector component which is positive when directed upward (negative downward). The surface latent heat flux is the exchange of heat between the surface and the air on account of evaporation (including sublimation). In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. + + W m-2 + + + The quantity with standard name surface_upward_latent_heat_flux_due_to_evaporation does not include transpiration from vegetation. The surface called "surface" means the lower boundary of the atmosphere. "Upward" indicates a vector component which is positive when directed upward (negative downward). In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. Evaporation is the conversion of liquid or solid into vapor. (The conversion of solid alone into vapor is called "sublimation"). The surface latent heat flux is the exchange of heat between the surface and the air on account of evaporation (including sublimation). + + W m-2 @@ -30509,14 +30866,14 @@ kg m-2 - "Amount" means mass per unit area. + "Amount" means mass per unit area. Transpiration is the process by which liquid water in plant stomata is transferred as water vapor into the atmosphere. kg m-2 s-1 - In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. + In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. Transpiration is the process by which liquid water in plant stomata is transferred as water vapor into the atmosphere. @@ -30820,6 +31177,13 @@ "Upward" indicates a vector component which is positive when directed upward (negative downward). The latent heat flux is the exchange of heat across a surface on account of evaporation and condensation (including sublimation and deposition). In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. + + W m-2 + + + "Upward" indicates a vector component which is positive when directed upward (negative downward). In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. The specification of a physical process by the phrase "due_to_" process means that the quantity named is a single term in a sum of terms which together compose the general quantity named by omitting the phrase. Transpiration is the process by which liquid water in plant stomata is transferred as water vapor into the atmosphere. The latent heat flux due to transpiration is the release of latent heat from plant surfaces to the air due to the release of water vapor. + + kg m-2 s-1 @@ -31317,11 +31681,18 @@ "Water" means water in all phases. Evaporation is the conversion of liquid or solid into vapor. (The conversion of solid alone into vapor is called "sublimation".) In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. + + kg m-2 + + + "Evapotranspiration" means all water vapor fluxes into the atmosphere from the surface: liquid evaporation, sublimation, and transpiration. "Amount" means mass per unit area. Evaporation is the conversion of liquid or solid into vapor. (The conversion of solid alone into vapor is called "sublimation".) Transpiration is the process by which liquid water in plant stomata is transferred as water vapor into the atmosphere. Unless indicated in the cell_methods attribute, a quantity is assumed to apply to the whole area of each horizontal grid box. + + kg m-2 s-1 evspsbl - Water means water in all phases. "Evapotranspiration" means all water vapor fluxes into the atmosphere from the surface: liquid evaporation, sublimation and transpiration. Evaporation is the conversion of liquid or solid into vapor. Transpiration is the process by which water is carried from the roots of plants and evaporates from the stomata. (The conversion of solid alone into vapor is called "sublimation".) In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. Unless indicated in the cell_methods attribute, a quantity is assumed to apply to the whole area of each horizontal grid box. + Water means water in all phases. "Evapotranspiration" means all water vapor fluxes into the atmosphere from the surface: liquid evaporation, sublimation and transpiration. Evaporation is the conversion of liquid or solid into vapor. Transpiration is the process by which liquid water in plant stomata is transferred as water vapor into the atmosphere. (The conversion of solid alone into vapor is called "sublimation".) In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. Unless indicated in the cell_methods attribute, a quantity is assumed to apply to the whole area of each horizontal grid box. @@ -31429,6 +31800,13 @@ "Water" means water in all phases. Evaporation is the conversion of liquid or solid into vapor. (The conversion of solid alone into vapor is called "sublimation".) Potential evaporation is the rate at which evaporation would take place under unaltered ambient conditions (temperature, relative humidity, wind, etc.) if the supply of water were unlimited, as if from an open water surface. In accordance with common usage in geophysical disciplines, "flux" implies per unit area, called "flux density" in physics. + + kg m-2 + + + Potential evapotranspiration is the rate at which evapotranspiration would occur under ambient conditions from a uniformly vegetated area when the water supply is not limiting. "Evapotranspiration" means all water vapor fluxes into the atmosphere from the surface: liquid evaporation, sublimation and transpiration. Transpiration is the process by which liquid water in plant stomata is transferred as water vapor into the atmosphere. Evaporation is the conversion of liquid or solid into vapor. (The conversion of solid alone into vapor is called "sublimation"). Amount means mass per unit area. + + kg m-2 s-1 @@ -31654,1220 +32032,1228 @@ - - temperature_in_ground + + isotropic_longwave_radiance_in_air - - biological_taxon_lsid + + isotropic_shortwave_radiance_in_air - - soot_content_of_surface_snow + + mole_fraction_of_ozone_in_air - - liquid_water_content_of_surface_snow + + product_of_northward_wind_and_specific_humidity - - surface_snow_thickness + + radiation_wavelength - - thermal_energy_content_of_surface_snow + + specific_gravitational_potential_energy - - temperature_in_surface_snow + + surface_drag_coefficient_for_heat_in_air - - integral_wrt_time_of_surface_downward_eastward_stress + + surface_drag_coefficient_for_momentum_in_air - - integral_wrt_time_of_surface_downward_northward_stress + + surface_drag_coefficient_in_air - - tendency_of_atmosphere_mass_content_of_water_vapor_due_to_sublimation_of_surface_snow_and_ice + + mass_concentration_of_suspended_matter_in_sea_water - - surface_snow_density + + sea_surface_swell_wave_period - - atmosphere_upward_relative_vorticity + + sea_surface_wind_wave_period - - atmosphere_upward_absolute_vorticity + + water_evapotranspiration_flux - - area_type + + mass_fraction_of_convective_cloud_condensed_water_in_air - - area_type + + mass_fraction_of_ozone_in_air - - mass_fraction_of_liquid_precipitation_in_air + + wave_frequency - - mass_fraction_of_liquid_precipitation_in_air + + northward_eliassen_palm_flux_in_air - - tendency_of_mole_concentration_of_particulate_organic_matter_expressed_as_carbon_in_sea_water_due_to_net_primary_production_by_diazotrophic_phytoplankton + + northward_heat_flux_in_air_due_to_eddy_advection - - nitrogen_growth_limitation_of_diazotrophic_phytoplankton + + upward_eliassen_palm_flux_in_air - - net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_diazotrophic_phytoplankton + + upward_eastward_momentum_flux_in_air_due_to_nonorographic_eastward_gravity_waves - - net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_diazotrophic_phytoplankton + + upward_eastward_momentum_flux_in_air_due_to_nonorographic_westward_gravity_waves - - mole_concentration_of_diazotrophic_phytoplankton_expressed_as_carbon_in_sea_water + + upward_eastward_momentum_flux_in_air_due_to_orographic_gravity_waves - - mass_concentration_of_diazotrophic_phytoplankton_expressed_as_chlorophyll_in_sea_water + + water_flux_into_sea_water - - iron_growth_limitation_of_diazotrophic_phytoplankton + + wind_mixing_energy_flux_into_sea_water - - growth_limitation_of_diazotrophic_phytoplankton_due_to_solar_irradiance + + mole_fraction_of_chlorine_dioxide_in_air - - air_pseudo_equivalent_potential_temperature + + mole_fraction_of_chlorine_monoxide_in_air - - tendency_of_mass_fraction_of_stratiform_cloud_ice_in_air_due_to_melting_to_cloud_liquid_water + + mole_fraction_of_hypochlorous_acid_in_air - - tendency_of_mass_fraction_of_stratiform_cloud_ice_in_air_due_to_heterogeneous_nucleation_from_cloud_liquid_water + + surface_net_downward_radiative_flux - - tendency_of_mass_fraction_of_stratiform_cloud_ice_in_air_due_to_riming_from_cloud_liquid_water + + surface_temperature - - sea_water_velocity_from_direction + + surface_temperature - - sea_water_velocity_to_direction + + surface_temperature - - sea_water_velocity_to_direction + + surface_upward_sensible_heat_flux - - integral_wrt_depth_of_product_of_salinity_and_sea_water_density + + eastward_water_vapor_flux_in_air - - integral_wrt_depth_of_product_of_conservative_temperature_and_sea_water_density + + kinetic_energy_dissipation_in_atmosphere_boundary_layer - - integral_wrt_depth_of_product_of_potential_temperature_and_sea_water_density + + lwe_stratiform_snowfall_rate - - volume_fraction_of_condensed_water_in_soil_at_wilting_point + + lwe_thickness_of_stratiform_snowfall_amount - - volume_fraction_of_condensed_water_in_soil_at_field_capacity + + northward_water_vapor_flux_in_air - - volume_fraction_of_condensed_water_in_soil_at_critical_point + + stratiform_rainfall_amount - - volume_fraction_of_condensed_water_in_soil + + stratiform_rainfall_flux - - product_of_lagrangian_tendency_of_air_pressure_and_specific_humidity + + stratiform_rainfall_rate - - product_of_lagrangian_tendency_of_air_pressure_and_specific_humidity + + stratiform_snowfall_amount - - product_of_lagrangian_tendency_of_air_pressure_and_geopotential_height + + stratiform_snowfall_flux - - product_of_lagrangian_tendency_of_air_pressure_and_air_temperature + + thickness_of_stratiform_rainfall_amount - - product_of_lagrangian_tendency_of_air_pressure_and_air_temperature + + thickness_of_stratiform_snowfall_amount - - tendency_of_sea_water_salinity_expressed_as_salt_content_due_to_parameterized_dianeutral_mixing + + atmosphere_mass_content_of_cloud_condensed_water - - tendency_of_sea_water_potential_temperature_expressed_as_heat_content_due_to_parameterized_dianeutral_mixing + + atmosphere_mass_content_of_cloud_ice - - tendency_of_sea_water_conservative_temperature_expressed_as_heat_content_due_to_parameterized_dianeutral_mixing + + atmosphere_mass_content_of_convective_cloud_condensed_water - - effective_radius_of_stratiform_cloud_snow_particles + + atmosphere_mass_content_of_water_vapor - - tendency_of_atmosphere_moles_of_cfc11 + + surface_downward_mole_flux_of_carbon_dioxide - - moles_of_cfc11_per_unit_mass_in_sea_water + + surface_upward_mole_flux_of_carbon_dioxide - - atmosphere_moles_of_cfc11 + + atmosphere_mass_content_of_sulfate - - tendency_of_atmosphere_moles_of_cfc113 + + atmosphere_mass_content_of_sulfate - - atmosphere_moles_of_cfc113 + + change_over_time_in_atmosphere_mass_content_of_water_due_to_advection - - tendency_of_atmosphere_moles_of_cfc114 + + change_over_time_in_atmosphere_mass_content_of_water_due_to_advection - - atmosphere_moles_of_cfc114 + + lwe_thickness_of_atmosphere_mass_content_of_water_vapor - - tendency_of_atmosphere_moles_of_cfc115 + + mass_content_of_cloud_condensed_water_in_atmosphere_layer - - atmosphere_moles_of_cfc115 + + mass_content_of_cloud_ice_in_atmosphere_layer - - tendency_of_atmosphere_moles_of_cfc12 + + mass_content_of_water_in_atmosphere_layer - - atmosphere_moles_of_cfc12 + + mass_content_of_water_vapor_in_atmosphere_layer - - tendency_of_atmosphere_moles_of_halon1202 + + tendency_of_atmosphere_mass_content_of_water_due_to_advection - - atmosphere_moles_of_halon1202 + + tendency_of_atmosphere_mass_content_of_water_vapor - - tendency_of_atmosphere_moles_of_halon1211 + + tendency_of_atmosphere_mass_content_of_water_vapor_due_to_convection - - atmosphere_moles_of_halon1211 + + tendency_of_atmosphere_mass_content_of_water_vapor_due_to_deep_convection - - tendency_of_atmosphere_moles_of_halon1301 + + tendency_of_atmosphere_mass_content_of_water_vapor_due_to_shallow_convection - - atmosphere_moles_of_halon1301 + + tendency_of_atmosphere_mass_content_of_water_vapor_due_to_turbulence - - tendency_of_atmosphere_moles_of_halon2402 + + tendency_of_mass_content_of_water_vapor_in_atmosphere_layer - - atmosphere_moles_of_halon2402 + + tendency_of_mass_content_of_water_vapor_in_atmosphere_layer_due_to_convection - - tendency_of_atmosphere_moles_of_hcc140a + + tendency_of_middle_atmosphere_moles_of_carbon_monoxide - - atmosphere_moles_of_hcc140a + + tendency_of_middle_atmosphere_moles_of_methane - - tendency_of_troposphere_moles_of_hcc140a + + tendency_of_middle_atmosphere_moles_of_methyl_bromide - - tendency_of_middle_atmosphere_moles_of_hcc140a + + tendency_of_middle_atmosphere_moles_of_methyl_chloride - - tendency_of_troposphere_moles_of_hcfc22 + + tendency_of_middle_atmosphere_moles_of_molecular_hydrogen - - tendency_of_atmosphere_moles_of_hcfc22 + + tendency_of_troposphere_moles_of_carbon_monoxide - - atmosphere_moles_of_hcfc22 + + tendency_of_troposphere_moles_of_methane - - tendency_of_atmosphere_number_content_of_aerosol_particles_due_to_turbulent_deposition + + tendency_of_troposphere_moles_of_methyl_bromide - - lagrangian_tendency_of_atmosphere_sigma_coordinate + + tendency_of_troposphere_moles_of_methyl_chloride - - lagrangian_tendency_of_atmosphere_sigma_coordinate + + tendency_of_troposphere_moles_of_molecular_hydrogen - - electrical_mobility_diameter_of_ambient_aerosol_particles + + atmosphere_net_upward_convective_mass_flux - - diameter_of_ambient_aerosol_particles + + tendency_of_mass_content_of_water_vapor_in_atmosphere_layer_due_to_deep_convection - - mass_concentration_of_biomass_burning_dry_aerosol_particles_in_air + + tendency_of_mass_content_of_water_vapor_in_atmosphere_layer_due_to_shallow_convection - - effective_radius_of_stratiform_cloud_rain_particles + + tendency_of_mass_content_of_water_vapor_in_atmosphere_layer_due_to_turbulence - - effective_radius_of_stratiform_cloud_ice_particles + + tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_due_to_emission - - effective_radius_of_stratiform_cloud_graupel_particles + + tendency_of_atmosphere_mass_content_of_dust_dry_aerosol_particles_due_to_emission - - effective_radius_of_convective_cloud_snow_particles + + tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_residential_and_commercial_combustion - - effective_radius_of_convective_cloud_rain_particles + + tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_waste_treatment_and_disposal - - effective_radius_of_convective_cloud_ice_particles + + tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_savanna_and_grassland_fires - - histogram_of_backscattering_ratio_in_air_over_height_above_reference_ellipsoid + + tendency_of_atmosphere_mass_content_of_primary_particulate_organic_matter_dry_aerosol_particles_due_to_emission - - backscattering_ratio_in_air + + tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_land_transport - - product_of_northward_wind_and_lagrangian_tendency_of_air_pressure + + tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_agricultural_waste_burning - - product_of_eastward_wind_and_lagrangian_tendency_of_air_pressure + + tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_energy_production_and_distribution - - carbon_mass_flux_into_litter_and_soil_due_to_anthropogenic_land_use_or_land_cover_change + + tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_maritime_transport - - floating_ice_shelf_area_fraction + + tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_due_to_net_chemical_production_and_emission - - atmosphere_moles_of_carbon_tetrachloride + + tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_due_to_net_chemical_production_and_emission - - mole_fraction_of_methylglyoxal_in_air + + tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_forest_fires - - mole_fraction_of_dichlorine_peroxide_in_air + + tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_industrial_processes_and_combustion - - atmosphere_mass_content_of_convective_cloud_liquid_water + + equivalent_thickness_at_stp_of_atmosphere_ozone_content - - effective_radius_of_cloud_liquid_water_particles_at_liquid_water_cloud_top + + atmosphere_moles_of_methane - - air_equivalent_temperature + + atmosphere_moles_of_methyl_bromide - - air_pseudo_equivalent_temperature + + atmosphere_moles_of_methyl_chloride - - mass_content_of_cloud_liquid_water_in_atmosphere_layer + + atmosphere_moles_of_molecular_hydrogen - - air_equivalent_potential_temperature + + atmosphere_moles_of_nitrous_oxide - - number_concentration_of_stratiform_cloud_liquid_water_particles_at_stratiform_liquid_water_cloud_top + + mole_concentration_of_mesozooplankton_expressed_as_nitrogen_in_sea_water - - number_concentration_of_convective_cloud_liquid_water_particles_at_convective_liquid_water_cloud_top + + mole_concentration_of_microzooplankton_expressed_as_nitrogen_in_sea_water - - effective_radius_of_stratiform_cloud_liquid_water_particles_at_stratiform_liquid_water_cloud_top + + mole_concentration_of_organic_detritus_expressed_as_nitrogen_in_sea_water - - effective_radius_of_stratiform_cloud_liquid_water_particles + + mole_concentration_of_organic_detritus_expressed_as_silicon_in_sea_water - - effective_radius_of_convective_cloud_liquid_water_particles_at_convective_liquid_water_cloud_top + + sea_water_x_velocity - - effective_radius_of_convective_cloud_liquid_water_particles + + sea_water_y_velocity - - effective_radius_of_cloud_liquid_water_particles + + x_wind - - atmosphere_mass_content_of_cloud_liquid_water + + y_wind - - mole_fraction_of_noy_expressed_as_nitrogen_in_air + + tendency_of_atmosphere_moles_of_methyl_bromide - - tendency_of_atmosphere_moles_of_methane + + tendency_of_atmosphere_moles_of_methyl_chloride - - rate_of_hydroxyl_radical_destruction_due_to_reaction_with_nmvoc + + tendency_of_atmosphere_moles_of_molecular_hydrogen - - net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_miscellaneous_phytoplankton + + tendency_of_atmosphere_moles_of_nitrous_oxide - - mole_fraction_of_inorganic_bromine_in_air + + tendency_of_atmosphere_mass_content_of_water_vapor_due_to_advection - - water_vapor_saturation_deficit_in_air + + land_ice_surface_specific_mass_balance_rate - - tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_agricultural_waste_burning + + land_ice_lwe_surface_specific_mass_balance_rate - - tendency_of_atmosphere_moles_of_carbon_tetrachloride + + isotropic_radiance_per_unit_wavelength_in_air - - tendency_of_atmosphere_moles_of_carbon_monoxide + + isotropic_radiance_per_unit_wavelength_in_air - - platform_yaw + + omnidirectional_spherical_irradiance_per_unit_wavelength_in_sea_water - - platform_pitch + + mass_concentration_of_chlorophyll_in_sea_water - - platform_roll + + mass_concentration_of_chlorophyll_in_sea_water - - tendency_of_specific_humidity_due_to_stratiform_precipitation + + tendency_of_atmosphere_moles_of_sulfate_dry_aerosol_particles - - tendency_of_air_temperature_due_to_stratiform_precipitation + + sea_surface_swell_wave_significant_height - - stratiform_precipitation_flux + + sea_surface_wind_wave_significant_height - - stratiform_precipitation_amount + + sea_surface_wave_significant_height - - lwe_thickness_of_stratiform_precipitation_amount + + mass_content_of_water_in_soil_layer - - lwe_stratiform_precipitation_rate - + + mass_content_of_water_in_soil + - - water_evaporation_amount_from_canopy + + sea_surface_swell_wave_to_direction - - water_evaporation_flux_from_canopy + + atmosphere_moles_of_carbon_monoxide - - precipitation_flux_onto_canopy + + sea_surface_wind_wave_to_direction - - outgoing_water_volume_transport_along_river_channel + + sea_surface_wave_mean_period - - tendency_of_sea_ice_amount_due_to_conversion_of_snow_to_sea_ice + + sea_surface_wind_wave_mean_period - - tendency_of_atmosphere_mass_content_of_mercury_dry_aerosol_particles_due_to_emission + + sea_surface_swell_wave_mean_period - - mass_fraction_of_mercury_dry_aerosol_particles_in_air + + tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_emission - - tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_wet_deposition + + tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_emission - - tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_wet_deposition + + sea_surface_height_above_geoid - - stratiform_cloud_area_fraction + + sea_surface_height_above_geoid - - magnitude_of_sea_ice_displacement + + sea_floor_depth_below_geoid - - surface_downwelling_spherical_irradiance_per_unit_wavelength_in_sea_water + + air_pressure_at_mean_sea_level - - surface_downwelling_shortwave_flux_in_air_assuming_clear_sky_and_no_aerosol + + lagrangian_tendency_of_air_pressure - - surface_downwelling_shortwave_flux_in_air_assuming_clear_sky + + lagrangian_tendency_of_air_pressure - - surface_downwelling_shortwave_flux_in_air + + mass_concentration_of_elemental_carbon_dry_aerosol_particles_in_air - - surface_downwelling_radiative_flux_per_unit_wavelength_in_sea_water + + atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles - - surface_downwelling_radiative_flux_per_unit_wavelength_in_air + + mass_fraction_of_elemental_carbon_dry_aerosol_particles_in_air - - surface_downwelling_radiance_per_unit_wavelength_in_sea_water + + tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_dry_deposition - - surface_downwelling_photon_spherical_irradiance_per_unit_wavelength_in_sea_water + + tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission - - surface_downwelling_photon_radiance_per_unit_wavelength_in_sea_water + + tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_energy_production_and_distribution - - surface_downwelling_photon_flux_per_unit_wavelength_in_sea_water + + tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_forest_fires - - surface_downwelling_longwave_flux_in_air + + tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_industrial_processes_and_combustion - - integral_wrt_time_of_surface_downwelling_shortwave_flux_in_air + + tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_land_transport - - integral_wrt_time_of_surface_downwelling_longwave_flux_in_air + + tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_maritime_transport - - downwelling_spherical_irradiance_per_unit_wavelength_in_sea_water + + tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_residential_and_commercial_combustion - - downwelling_shortwave_flux_in_air_assuming_clear_sky_and_no_aerosol + + tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_savanna_and_grassland_fires - - downwelling_radiative_flux_per_unit_wavelength_in_sea_water + + tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_waste_treatment_and_disposal - - downwelling_radiative_flux_per_unit_wavelength_in_air + + tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_gravitational_settling - - downwelling_radiance_per_unit_wavelength_in_sea_water + + tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_turbulent_deposition - - downwelling_radiance_per_unit_wavelength_in_air + + tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_wet_deposition - - downwelling_photon_spherical_irradiance_per_unit_wavelength_in_sea_water + + tendency_of_mass_concentration_of_elemental_carbon_dry_aerosol_particles_in_air_due_to_emission_from_aviation - - downwelling_photon_radiance_per_unit_wavelength_in_sea_water + + integral_wrt_time_of_air_temperature_deficit - - downwelling_photon_flux_per_unit_wavelength_in_sea_water + + integral_wrt_time_of_air_temperature_excess - - surface_upwelling_shortwave_flux_in_air_assuming_clear_sky + + integral_wrt_time_of_surface_downward_latent_heat_flux - - surface_upwelling_longwave_flux_in_air_assuming_clear_sky + + integral_wrt_time_of_surface_downward_sensible_heat_flux - - upwelling_shortwave_flux_in_air_assuming_clear_sky_and_no_aerosol + + atmosphere_convective_available_potential_energy - - upwelling_radiative_flux_per_unit_wavelength_in_sea_water + + atmosphere_convective_available_potential_energy - - upwelling_radiative_flux_per_unit_wavelength_in_air + + gross_primary_productivity_of_biomass_expressed_as_carbon - - upwelling_radiance_per_unit_wavelength_in_air + + net_primary_productivity_of_biomass_expressed_as_carbon - - surface_upwelling_shortwave_flux_in_air_assuming_clear_sky_and_no_aerosol + + net_primary_productivity_of_biomass_expressed_as_carbon_accumulated_in_leaves - - surface_upwelling_shortwave_flux_in_air + + net_primary_productivity_of_biomass_expressed_as_carbon_accumulated_in_roots - - surface_upwelling_radiative_flux_per_unit_wavelength_in_sea_water + + net_primary_productivity_of_biomass_expressed_as_carbon_accumulated_in_wood - - surface_upwelling_radiative_flux_per_unit_wavelength_in_air + + tendency_of_atmosphere_mass_content_of_pm2p5_sea_salt_dry_aerosol_particles_due_to_dry_deposition - - surface_upwelling_radiance_per_unit_wavelength_in_sea_water + + tendency_of_atmosphere_mass_content_of_pm2p5_sea_salt_dry_aerosol_particles_due_to_emission - - volume_scattering_coefficient_of_radiative_flux_in_air_due_to_ambient_aerosol_particles + + atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles - - volume_scattering_coefficient_of_radiative_flux_in_air_due_to_dried_aerosol_particles + + atmosphere_mass_content_of_primary_particulate_organic_matter_dry_aerosol_particles - - soil_mass_content_of_carbon + + mass_fraction_of_particulate_organic_matter_dry_aerosol_particles_in_air - - slow_soil_pool_mass_content_of_carbon + + mass_fraction_of_primary_particulate_organic_matter_dry_aerosol_particles_in_air - - root_mass_content_of_carbon + + tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_due_to_dry_deposition - - miscellaneous_living_matter_mass_content_of_carbon + + tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_due_to_gravitational_settling - - fast_soil_pool_mass_content_of_carbon + + tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_due_to_turbulent_deposition - - medium_soil_pool_mass_content_of_carbon + + tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_due_to_wet_deposition - - leaf_mass_content_of_carbon + + tendency_of_atmosphere_mass_content_of_primary_particulate_organic_matter_dry_aerosol_particles_due_to_dry_deposition - - carbon_mass_content_of_forestry_and_agricultural_products + + tendency_of_atmosphere_mass_content_of_primary_particulate_organic_matter_dry_aerosol_particles_due_to_wet_deposition - - carbon_mass_content_of_forestry_and_agricultural_products + + atmosphere_absorption_optical_thickness_due_to_ambient_aerosol_particles - - surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_plant_respiration_for_biomass_maintenance + + angstrom_exponent_of_ambient_aerosol_in_air - - surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_plant_respiration_for_biomass_growth + + atmosphere_absorption_optical_thickness_due_to_dust_ambient_aerosol_particles - - surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_plant_respiration + + atmosphere_absorption_optical_thickness_due_to_particulate_organic_matter_ambient_aerosol_particles - - surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_respiration_in_soil + + atmosphere_absorption_optical_thickness_due_to_sulfate_ambient_aerosol_particles - - surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_heterotrophic_respiration + + atmosphere_mass_content_of_ammonium_dry_aerosol_particles - - northward_transformed_eulerian_mean_air_velocity + + atmosphere_mass_content_of_dust_dry_aerosol_particles - - eastward_transformed_eulerian_mean_air_velocity + + atmosphere_mass_content_of_mercury_dry_aerosol_particles - - surface_litter_mass_content_of_carbon + + atmosphere_mass_content_of_nitrate_dry_aerosol_particles - - litter_mass_content_of_carbon + + atmosphere_mass_content_of_nitric_acid_trihydrate_ambient_aerosol_particles - - tendency_of_atmosphere_mass_content_of_nitrogen_compounds_expressed_as_nitrogen_due_to_wet_deposition + + atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_particles - - mole_concentration_of_phytoplankton_expressed_as_nitrogen_in_sea_water + + atmosphere_mass_content_of_sulfate_ambient_aerosol_particles - - net_primary_mole_productivity_of_biomass_expressed_as_carbon_due_to_nitrate_utilization + + atmosphere_mass_content_of_sulfate_ambient_aerosol_particles - - net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_picophytoplankton + + atmosphere_mass_content_of_sulfate_dry_aerosol_particles - - net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_phytoplankton + + atmosphere_mass_content_of_water_in_ambient_aerosol_particles - - net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_diatoms + + atmosphere_moles_of_nitric_acid_trihydrate_ambient_aerosol_particles - - net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_calcareous_phytoplankton + + atmosphere_optical_thickness_due_to_ambient_aerosol_particles - - mole_concentration_of_diatoms_expressed_as_nitrogen_in_sea_water + + atmosphere_optical_thickness_due_to_ambient_aerosol_particles - - tendency_of_mole_concentration_of_dissolved_inorganic_silicon_in_sea_water_due_to_biological_processes + + atmosphere_optical_thickness_due_to_dust_ambient_aerosol_particles - - tendency_of_mole_concentration_of_dissolved_inorganic_phosphorus_in_sea_water_due_to_biological_processes + + atmosphere_optical_thickness_due_to_dust_dry_aerosol_particles - - tendency_of_atmosphere_mole_concentration_of_carbon_monoxide_due_to_chemical_destruction + + atmosphere_optical_thickness_due_to_particulate_organic_matter_ambient_aerosol_particles - - volume_extinction_coefficient_in_air_due_to_ambient_aerosol_particles + + mass_concentration_of_dust_dry_aerosol_particles_in_air - - water_vapor_partial_pressure_in_air + + mass_concentration_of_coarse_mode_ambient_aerosol_particles_in_air - - platform_name + + mass_concentration_of_ammonium_dry_aerosol_particles_in_air - - platform_id + + atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur - - mass_flux_of_carbon_into_litter_from_vegetation + + atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur - - subsurface_litter_mass_content_of_carbon + + mass_concentration_of_primary_particulate_organic_matter_dry_aerosol_particles_in_air - - stem_mass_content_of_carbon + + mass_concentration_of_particulate_organic_matter_dry_aerosol_particles_in_air - - mole_concentration_of_dissolved_inorganic_14C_in_sea_water + + atmosphere_optical_thickness_due_to_water_in_ambient_aerosol_particles - - surface_downward_mass_flux_of_14C_dioxide_abiotic_analogue_expressed_as_carbon + + mass_concentration_of_mercury_dry_aerosol_particles_in_air - - surface_downward_mass_flux_of_13C_dioxide_abiotic_analogue_expressed_as_13C + + mass_concentration_of_nitrate_dry_aerosol_particles_in_air - - mole_concentration_of_dissolved_inorganic_13C_in_sea_water + + mass_concentration_of_nitric_acid_trihydrate_ambient_aerosol_particles_in_air - - surface_upwelling_radiance_per_unit_wavelength_in_air_reflected_by_sea_water + + mass_concentration_of_secondary_particulate_organic_matter_dry_aerosol_particles_in_air - - surface_upwelling_radiance_per_unit_wavelength_in_air_emerging_from_sea_water + + mass_concentration_of_sulfate_ambient_aerosol_particles_in_air - - surface_upwelling_radiance_per_unit_wavelength_in_air + + mass_concentration_of_sulfate_ambient_aerosol_particles_in_air - - surface_upwelling_longwave_flux_in_air + + mass_concentration_of_sulfate_dry_aerosol_particles_in_air - - incoming_water_volume_transport_along_river_channel + + mass_concentration_of_water_in_ambient_aerosol_particles_in_air - - sea_water_potential_temperature_expressed_as_heat_content + + mass_fraction_of_ammonium_dry_aerosol_particles_in_air - - sea_water_potential_temperature_expressed_as_heat_content + + mass_fraction_of_dust_dry_aerosol_particles_in_air - - sea_ice_temperature_expressed_as_heat_content + + mass_fraction_of_nitrate_dry_aerosol_particles_in_air - - sea_ice_temperature_expressed_as_heat_content + + mass_fraction_of_nitric_acid_trihydrate_ambient_aerosol_particles_in_air - - water_evapotranspiration_flux + + mass_fraction_of_secondary_particulate_organic_matter_dry_aerosol_particles_in_air - - surface_water_evaporation_flux + + mass_fraction_of_sulfate_dry_aerosol_particles_in_air - - water_volume_transport_into_sea_water_from_rivers + + mass_fraction_of_water_in_ambient_aerosol_particles_in_air - - stratiform_graupel_flux + + mole_concentration_of_nitric_acid_trihydrate_ambient_aerosol_particles_in_air - - wood_debris_mass_content_of_carbon + + mole_fraction_of_nitric_acid_trihydrate_ambient_aerosol_particles_in_air - - toa_outgoing_shortwave_flux_assuming_clear_sky_and_no_aerosol + + number_concentration_of_ambient_aerosol_particles_in_air - - water_flux_into_sea_water_from_rivers + + number_concentration_of_coarse_mode_ambient_aerosol_particles_in_air - - integral_wrt_height_of_product_of_northward_wind_and_specific_humidity + + number_concentration_of_nucleation_mode_ambient_aerosol_particles_in_air - - integral_wrt_height_of_product_of_eastward_wind_and_specific_humidity + + optical_thickness_of_atmosphere_layer_due_to_ambient_aerosol_particles - - integral_wrt_depth_of_sea_water_temperature + + optical_thickness_of_atmosphere_layer_due_to_ambient_aerosol_particles - - integral_wrt_depth_of_sea_water_temperature + + tendency_of_atmosphere_mass_content_of_ammonium_dry_aerosol_particles_due_to_dry_deposition - - integral_wrt_depth_of_sea_water_temperature + + tendency_of_atmosphere_mass_content_of_ammonium_dry_aerosol_particles_due_to_wet_deposition - - integral_wrt_depth_of_sea_water_temperature + + tendency_of_atmosphere_mass_content_of_dust_dry_aerosol_particles_due_to_dry_deposition - - integral_wrt_depth_of_sea_water_practical_salinity + + tendency_of_atmosphere_mass_content_of_dust_dry_aerosol_particles_due_to_gravitational_settling - - northward_ocean_heat_transport_due_to_parameterized_eddy_advection + + tendency_of_atmosphere_mass_content_of_dust_dry_aerosol_particles_due_to_turbulent_deposition - - tendency_of_ocean_eddy_kinetic_energy_content_due_to_parameterized_eddy_advection + + tendency_of_atmosphere_mass_content_of_dust_dry_aerosol_particles_due_to_wet_deposition - - ocean_tracer_laplacian_diffusivity_due_to_parameterized_mesoscale_eddy_advection + + tendency_of_atmosphere_mass_content_of_mercury_dry_aerosol_particles_due_to_dry_deposition - - ocean_tracer_biharmonic_diffusivity_due_to_parameterized_mesoscale_eddy_advection + + tendency_of_atmosphere_mass_content_of_mercury_dry_aerosol_particles_due_to_wet_deposition - - upward_sea_water_velocity_due_to_parameterized_mesoscale_eddies + + tendency_of_atmosphere_mass_content_of_nitrate_dry_aerosol_particles_due_to_dry_deposition - - sea_water_y_velocity_due_to_parameterized_mesoscale_eddies + + tendency_of_atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_particles_due_to_dry_deposition - - sea_water_x_velocity_due_to_parameterized_mesoscale_eddies + + tendency_of_atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_particles_due_to_net_chemical_production - - eastward_sea_water_velocity_due_to_parameterized_mesoscale_eddies + + tendency_of_atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_particles_due_to_net_chemical_production - - northward_sea_water_velocity_due_to_parameterized_mesoscale_eddies + + tendency_of_atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_particles_due_to_wet_deposition - - tendency_of_sea_water_temperature_due_to_parameterized_eddy_advection + + tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_due_to_dry_deposition - - tendency_of_sea_water_salinity_due_to_parameterized_eddy_advection + + tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_dry_deposition - - ocean_y_overturning_mass_streamfunction_due_to_parameterized_eddy_advection + + tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_dry_deposition - - ocean_meridional_overturning_mass_streamfunction_due_to_parameterized_eddy_advection + + tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_gravitational_settling - - ocean_mass_y_transport_due_to_advection_and_parameterized_eddy_advection + + tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_gravitational_settling - - ocean_mass_x_transport_due_to_advection_and_parameterized_eddy_advection + + tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_turbulent_deposition - - ocean_heat_y_transport_due_to_parameterized_eddy_advection + + tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_turbulent_deposition - - ocean_heat_x_transport_due_to_parameterized_eddy_advection + + tendency_of_atmosphere_moles_of_nitric_acid_trihydrate_ambient_aerosol_particles - - northward_ocean_salt_transport_due_to_parameterized_eddy_advection + + integral_wrt_time_of_surface_net_downward_longwave_flux - - northward_ocean_freshwater_transport_due_to_parameterized_eddy_advection + + integral_wrt_time_of_surface_net_downward_shortwave_flux + + + + integral_wrt_time_of_toa_net_downward_shortwave_flux integral_wrt_time_of_toa_outgoing_longwave_flux - - integral_wrt_time_of_toa_net_downward_shortwave_flux + + northward_ocean_freshwater_transport_due_to_parameterized_eddy_advection - - integral_wrt_time_of_surface_net_downward_shortwave_flux + + northward_ocean_salt_transport_due_to_parameterized_eddy_advection - - integral_wrt_time_of_surface_net_downward_longwave_flux + + ocean_heat_x_transport_due_to_parameterized_eddy_advection - - integral_wrt_time_of_surface_downward_sensible_heat_flux + + ocean_heat_y_transport_due_to_parameterized_eddy_advection - - integral_wrt_time_of_surface_downward_latent_heat_flux + + ocean_mass_x_transport_due_to_advection_and_parameterized_eddy_advection - - integral_wrt_time_of_air_temperature_excess + + ocean_mass_y_transport_due_to_advection_and_parameterized_eddy_advection - - integral_wrt_time_of_air_temperature_deficit + + ocean_meridional_overturning_mass_streamfunction_due_to_parameterized_eddy_advection - - tendency_of_mass_concentration_of_elemental_carbon_dry_aerosol_particles_in_air_due_to_emission_from_aviation + + ocean_y_overturning_mass_streamfunction_due_to_parameterized_eddy_advection - - tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_wet_deposition + + tendency_of_sea_water_salinity_due_to_parameterized_eddy_advection - - tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_turbulent_deposition + + tendency_of_sea_water_temperature_due_to_parameterized_eddy_advection - - tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_gravitational_settling + + northward_sea_water_velocity_due_to_parameterized_mesoscale_eddies - - tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_waste_treatment_and_disposal + + eastward_sea_water_velocity_due_to_parameterized_mesoscale_eddies - - tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_savanna_and_grassland_fires + + sea_water_x_velocity_due_to_parameterized_mesoscale_eddies - - tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_residential_and_commercial_combustion + + sea_water_y_velocity_due_to_parameterized_mesoscale_eddies - - tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_maritime_transport + + upward_sea_water_velocity_due_to_parameterized_mesoscale_eddies - - tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_land_transport + + ocean_tracer_biharmonic_diffusivity_due_to_parameterized_mesoscale_eddy_advection - - tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_industrial_processes_and_combustion + + ocean_tracer_laplacian_diffusivity_due_to_parameterized_mesoscale_eddy_advection - - tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_forest_fires + + tendency_of_ocean_eddy_kinetic_energy_content_due_to_parameterized_eddy_advection - - tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_energy_production_and_distribution + + ocean_mixed_layer_thickness_defined_by_vertical_tracer_diffusivity_deficit - - tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission + + atmosphere_mass_content_of_sea_salt_dry_aerosol_particles - - tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_dry_deposition + + atmosphere_mass_content_of_sea_salt_dry_aerosol_particles - - mass_fraction_of_elemental_carbon_dry_aerosol_particles_in_air + + atmosphere_optical_thickness_due_to_sea_salt_ambient_aerosol_particles - - atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles + + atmosphere_optical_thickness_due_to_sea_salt_ambient_aerosol_particles - - mass_concentration_of_elemental_carbon_dry_aerosol_particles_in_air + + mass_concentration_of_sea_salt_dry_aerosol_particles_in_air - - lagrangian_tendency_of_air_pressure + + mass_concentration_of_sea_salt_dry_aerosol_particles_in_air - - lagrangian_tendency_of_air_pressure + + mass_fraction_of_sea_salt_dry_aerosol_particles_in_air - - air_pressure_at_mean_sea_level + + mass_fraction_of_sea_salt_dry_aerosol_particles_in_air - - sea_floor_depth_below_geoid + + tendency_of_atmosphere_mass_content_of_pm10_sea_salt_dry_aerosol_particles_due_to_dry_deposition - - sea_surface_height_above_geoid + + tendency_of_atmosphere_mass_content_of_pm10_sea_salt_dry_aerosol_particles_due_to_emission - - sea_surface_height_above_geoid + + tendency_of_atmosphere_mass_content_of_pm10_sea_salt_dry_aerosol_particles_due_to_wet_deposition - - tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_emission + + tendency_of_atmosphere_mass_content_of_pm2p5_sea_salt_dry_aerosol_particles_due_to_wet_deposition - - tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_emission + + tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_dry_deposition - - atmosphere_absorption_optical_thickness_due_to_sea_salt_ambient_aerosol_particles + + tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_dry_deposition - - atmosphere_absorption_optical_thickness_due_to_sea_salt_ambient_aerosol_particles + + tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_gravitational_settling - - tendency_of_atmosphere_mass_content_of_nitrogen_compounds_expressed_as_nitrogen_due_to_deposition + + tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_gravitational_settling - - tendency_of_atmosphere_mass_content_of_nitrogen_compounds_expressed_as_nitrogen_due_to_dry_deposition + + tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_turbulent_deposition - - surface_geostrophic_eastward_sea_water_velocity + + tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_turbulent_deposition - - surface_geostrophic_northward_sea_water_velocity + + tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_wet_deposition - - tendency_of_sea_surface_height_above_mean_sea_level + + tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_wet_deposition - - surface_geostrophic_sea_water_y_velocity_assuming_mean_sea_level_for_geoid + + atmosphere_optical_thickness_due_to_pm1_ambient_aerosol_particles - - surface_geostrophic_sea_water_x_velocity_assuming_mean_sea_level_for_geoid + + mass_concentration_of_pm1_ambient_aerosol_particles_in_air - - surface_geostrophic_northward_sea_water_velocity_assuming_mean_sea_level_for_geoid + + mass_fraction_of_pm1_ambient_aerosol_particles_in_air - - surface_geostrophic_northward_sea_water_velocity_assuming_mean_sea_level_for_geoid + + mass_fraction_of_pm1_ambient_aerosol_particles_in_air - - surface_geostrophic_eastward_sea_water_velocity_assuming_mean_sea_level_for_geoid + + atmosphere_optical_thickness_due_to_pm2p5_ambient_aerosol_particles - - surface_geostrophic_eastward_sea_water_velocity_assuming_mean_sea_level_for_geoid + + mass_concentration_of_pm2p5_ambient_aerosol_particles_in_air - - sea_surface_height_above_mean_sea_level + + mass_fraction_of_pm2p5_ambient_aerosol_particles_in_air + + + + mass_fraction_of_pm2p5_ambient_aerosol_particles_in_air - - sea_surface_height_above_mean_sea_level + + atmosphere_optical_thickness_due_to_pm10_ambient_aerosol_particles - - sea_floor_depth_below_mean_sea_level + + mass_concentration_of_pm10_ambient_aerosol_particles_in_air @@ -32878,1020 +33264,1012 @@ mass_fraction_of_pm10_ambient_aerosol_particles_in_air - - mass_concentration_of_pm10_ambient_aerosol_particles_in_air - - - - atmosphere_optical_thickness_due_to_pm10_ambient_aerosol_particles - - - - mass_fraction_of_pm2p5_ambient_aerosol_particles_in_air + + sea_floor_depth_below_mean_sea_level - - mass_fraction_of_pm2p5_ambient_aerosol_particles_in_air + + sea_surface_height_above_mean_sea_level - - mass_concentration_of_pm2p5_ambient_aerosol_particles_in_air + + sea_surface_height_above_mean_sea_level - - atmosphere_optical_thickness_due_to_pm2p5_ambient_aerosol_particles + + surface_geostrophic_eastward_sea_water_velocity_assuming_mean_sea_level_for_geoid - - mass_fraction_of_pm1_ambient_aerosol_particles_in_air + + surface_geostrophic_eastward_sea_water_velocity_assuming_mean_sea_level_for_geoid - - mass_fraction_of_pm1_ambient_aerosol_particles_in_air + + surface_geostrophic_northward_sea_water_velocity_assuming_mean_sea_level_for_geoid - - mass_concentration_of_pm1_ambient_aerosol_particles_in_air + + surface_geostrophic_northward_sea_water_velocity_assuming_mean_sea_level_for_geoid - - atmosphere_optical_thickness_due_to_pm1_ambient_aerosol_particles + + surface_geostrophic_sea_water_x_velocity_assuming_mean_sea_level_for_geoid - - tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_wet_deposition + + surface_geostrophic_sea_water_y_velocity_assuming_mean_sea_level_for_geoid - - tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_wet_deposition + + tendency_of_sea_surface_height_above_mean_sea_level - - tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_turbulent_deposition + + surface_geostrophic_northward_sea_water_velocity - - tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_turbulent_deposition + + surface_geostrophic_eastward_sea_water_velocity - - tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_gravitational_settling + + tendency_of_atmosphere_mass_content_of_nitrogen_compounds_expressed_as_nitrogen_due_to_dry_deposition - - tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_gravitational_settling + + tendency_of_atmosphere_mass_content_of_nitrogen_compounds_expressed_as_nitrogen_due_to_deposition - - tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_dry_deposition + + atmosphere_absorption_optical_thickness_due_to_sea_salt_ambient_aerosol_particles - - tendency_of_atmosphere_mass_content_of_sea_salt_dry_aerosol_particles_due_to_dry_deposition + + atmosphere_absorption_optical_thickness_due_to_sea_salt_ambient_aerosol_particles - - tendency_of_atmosphere_mass_content_of_pm2p5_sea_salt_dry_aerosol_particles_due_to_wet_deposition + + northward_ocean_heat_transport_due_to_parameterized_eddy_advection - - tendency_of_atmosphere_mass_content_of_pm10_sea_salt_dry_aerosol_particles_due_to_wet_deposition + + mole_concentration_of_dissolved_inorganic_13C_in_sea_water - - tendency_of_atmosphere_mass_content_of_pm10_sea_salt_dry_aerosol_particles_due_to_emission + + surface_downward_mass_flux_of_13C_dioxide_abiotic_analogue_expressed_as_13C - - tendency_of_atmosphere_mass_content_of_pm10_sea_salt_dry_aerosol_particles_due_to_dry_deposition + + surface_downward_mass_flux_of_14C_dioxide_abiotic_analogue_expressed_as_carbon - - mass_fraction_of_sea_salt_dry_aerosol_particles_in_air + + mole_concentration_of_dissolved_inorganic_14C_in_sea_water - - mass_fraction_of_sea_salt_dry_aerosol_particles_in_air + + stem_mass_content_of_carbon - - mass_concentration_of_sea_salt_dry_aerosol_particles_in_air + + subsurface_litter_mass_content_of_carbon - - mass_concentration_of_sea_salt_dry_aerosol_particles_in_air + + mass_flux_of_carbon_into_litter_from_vegetation - - atmosphere_optical_thickness_due_to_sea_salt_ambient_aerosol_particles + + platform_id - - atmosphere_optical_thickness_due_to_sea_salt_ambient_aerosol_particles + + platform_name - - atmosphere_mass_content_of_sea_salt_dry_aerosol_particles + + surface_upwelling_radiance_per_unit_wavelength_in_sea_water - - atmosphere_mass_content_of_sea_salt_dry_aerosol_particles + + surface_upwelling_radiative_flux_per_unit_wavelength_in_air - - ocean_mixed_layer_thickness_defined_by_vertical_tracer_diffusivity_deficit + + surface_upwelling_radiative_flux_per_unit_wavelength_in_sea_water - - sea_surface_swell_wave_mean_period + + surface_upwelling_shortwave_flux_in_air - - sea_surface_wind_wave_mean_period + + surface_upwelling_shortwave_flux_in_air_assuming_clear_sky_and_no_aerosol - - sea_surface_wave_mean_period + + upwelling_radiance_per_unit_wavelength_in_air - - sea_surface_wind_wave_to_direction + + upwelling_radiative_flux_per_unit_wavelength_in_air - - sea_surface_swell_wave_to_direction + + upwelling_radiative_flux_per_unit_wavelength_in_sea_water - - mass_content_of_water_in_soil + + upwelling_shortwave_flux_in_air_assuming_clear_sky_and_no_aerosol - - mass_content_of_water_in_soil_layer + + surface_upwelling_longwave_flux_in_air_assuming_clear_sky - - sea_surface_wave_significant_height + + surface_upwelling_shortwave_flux_in_air_assuming_clear_sky - - sea_surface_wind_wave_significant_height + + downwelling_photon_flux_per_unit_wavelength_in_sea_water - - sea_surface_swell_wave_significant_height + + downwelling_photon_radiance_per_unit_wavelength_in_sea_water - - tendency_of_atmosphere_moles_of_sulfate_dry_aerosol_particles + + downwelling_photon_spherical_irradiance_per_unit_wavelength_in_sea_water - - tendency_of_atmosphere_moles_of_nitric_acid_trihydrate_ambient_aerosol_particles + + downwelling_radiance_per_unit_wavelength_in_air - - tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_turbulent_deposition + + downwelling_radiance_per_unit_wavelength_in_sea_water - - tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_turbulent_deposition + + downwelling_radiative_flux_per_unit_wavelength_in_air - - tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_gravitational_settling + + downwelling_radiative_flux_per_unit_wavelength_in_sea_water - - tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_gravitational_settling + + downwelling_shortwave_flux_in_air_assuming_clear_sky_and_no_aerosol - - tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_dry_deposition + + downwelling_spherical_irradiance_per_unit_wavelength_in_sea_water - - tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_dry_deposition + + integral_wrt_time_of_surface_downwelling_longwave_flux_in_air - - tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_due_to_dry_deposition + + integral_wrt_time_of_surface_downwelling_shortwave_flux_in_air - - tendency_of_atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_particles_due_to_wet_deposition + + surface_downwelling_longwave_flux_in_air - - tendency_of_atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_particles_due_to_net_chemical_production + + surface_downwelling_photon_flux_per_unit_wavelength_in_sea_water - - tendency_of_atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_particles_due_to_net_chemical_production + + surface_downwelling_photon_radiance_per_unit_wavelength_in_sea_water - - tendency_of_atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_particles_due_to_dry_deposition + + surface_downwelling_photon_spherical_irradiance_per_unit_wavelength_in_sea_water - - tendency_of_atmosphere_mass_content_of_nitrate_dry_aerosol_particles_due_to_dry_deposition + + surface_downwelling_radiance_per_unit_wavelength_in_sea_water - - tendency_of_atmosphere_mass_content_of_mercury_dry_aerosol_particles_due_to_wet_deposition + + surface_downwelling_radiative_flux_per_unit_wavelength_in_air - - tendency_of_atmosphere_mass_content_of_mercury_dry_aerosol_particles_due_to_dry_deposition + + surface_downwelling_radiative_flux_per_unit_wavelength_in_sea_water - - tendency_of_atmosphere_mass_content_of_dust_dry_aerosol_particles_due_to_wet_deposition + + surface_downwelling_shortwave_flux_in_air - - tendency_of_atmosphere_mass_content_of_dust_dry_aerosol_particles_due_to_turbulent_deposition + + surface_downwelling_shortwave_flux_in_air_assuming_clear_sky - - tendency_of_atmosphere_mass_content_of_dust_dry_aerosol_particles_due_to_gravitational_settling + + surface_downwelling_shortwave_flux_in_air_assuming_clear_sky_and_no_aerosol - - tendency_of_atmosphere_mass_content_of_dust_dry_aerosol_particles_due_to_dry_deposition + + surface_downwelling_spherical_irradiance_per_unit_wavelength_in_sea_water - - tendency_of_atmosphere_mass_content_of_ammonium_dry_aerosol_particles_due_to_wet_deposition + + magnitude_of_sea_ice_displacement - - tendency_of_atmosphere_mass_content_of_ammonium_dry_aerosol_particles_due_to_dry_deposition + + integral_wrt_depth_of_sea_water_practical_salinity - - optical_thickness_of_atmosphere_layer_due_to_ambient_aerosol_particles + + integral_wrt_depth_of_sea_water_temperature - - optical_thickness_of_atmosphere_layer_due_to_ambient_aerosol_particles + + integral_wrt_depth_of_sea_water_temperature - - number_concentration_of_nucleation_mode_ambient_aerosol_particles_in_air + + integral_wrt_depth_of_sea_water_temperature - - number_concentration_of_coarse_mode_ambient_aerosol_particles_in_air + + integral_wrt_depth_of_sea_water_temperature - - number_concentration_of_ambient_aerosol_particles_in_air + + integral_wrt_height_of_product_of_eastward_wind_and_specific_humidity - - mole_fraction_of_nitric_acid_trihydrate_ambient_aerosol_particles_in_air + + integral_wrt_height_of_product_of_northward_wind_and_specific_humidity - - mole_concentration_of_nitric_acid_trihydrate_ambient_aerosol_particles_in_air + + water_flux_into_sea_water_from_rivers - - mass_fraction_of_water_in_ambient_aerosol_particles_in_air + + toa_outgoing_shortwave_flux_assuming_clear_sky_and_no_aerosol - - mass_fraction_of_sulfate_dry_aerosol_particles_in_air + + wood_debris_mass_content_of_carbon - - mass_fraction_of_secondary_particulate_organic_matter_dry_aerosol_particles_in_air + + stratiform_graupel_flux - - mass_fraction_of_nitric_acid_trihydrate_ambient_aerosol_particles_in_air + + water_volume_transport_into_sea_water_from_rivers - - mass_fraction_of_nitrate_dry_aerosol_particles_in_air + + surface_water_evaporation_flux - - mass_fraction_of_dust_dry_aerosol_particles_in_air + + sea_ice_temperature_expressed_as_heat_content - - mass_fraction_of_ammonium_dry_aerosol_particles_in_air + + sea_ice_temperature_expressed_as_heat_content - - mass_concentration_of_water_in_ambient_aerosol_particles_in_air + + sea_water_potential_temperature_expressed_as_heat_content - - mass_concentration_of_sulfate_dry_aerosol_particles_in_air + + sea_water_potential_temperature_expressed_as_heat_content - - mass_concentration_of_sulfate_ambient_aerosol_particles_in_air + + incoming_water_volume_transport_along_river_channel - - mass_concentration_of_sulfate_ambient_aerosol_particles_in_air + + surface_upwelling_longwave_flux_in_air - - mass_concentration_of_secondary_particulate_organic_matter_dry_aerosol_particles_in_air + + surface_upwelling_radiance_per_unit_wavelength_in_air - - mass_concentration_of_nitric_acid_trihydrate_ambient_aerosol_particles_in_air + + surface_upwelling_radiance_per_unit_wavelength_in_air_emerging_from_sea_water - - mass_concentration_of_nitrate_dry_aerosol_particles_in_air + + surface_upwelling_radiance_per_unit_wavelength_in_air_reflected_by_sea_water - - mass_concentration_of_mercury_dry_aerosol_particles_in_air + + stratiform_cloud_area_fraction - - atmosphere_optical_thickness_due_to_water_in_ambient_aerosol_particles + + tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_wet_deposition - - mass_concentration_of_particulate_organic_matter_dry_aerosol_particles_in_air + + tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur_due_to_wet_deposition - - mass_concentration_of_primary_particulate_organic_matter_dry_aerosol_particles_in_air + + mass_fraction_of_mercury_dry_aerosol_particles_in_air - - atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur + + tendency_of_atmosphere_mass_content_of_mercury_dry_aerosol_particles_due_to_emission - - atmosphere_mass_content_of_sulfate_dry_aerosol_particles_expressed_as_sulfur + + tendency_of_sea_ice_amount_due_to_conversion_of_snow_to_sea_ice - - mass_concentration_of_ammonium_dry_aerosol_particles_in_air + + outgoing_water_volume_transport_along_river_channel - - mass_concentration_of_coarse_mode_ambient_aerosol_particles_in_air + + precipitation_flux_onto_canopy - - mass_concentration_of_dust_dry_aerosol_particles_in_air + + water_evaporation_flux_from_canopy - - atmosphere_optical_thickness_due_to_particulate_organic_matter_ambient_aerosol_particles + + water_evaporation_amount_from_canopy - - atmosphere_optical_thickness_due_to_dust_dry_aerosol_particles + + lwe_stratiform_precipitation_rate - - atmosphere_optical_thickness_due_to_dust_ambient_aerosol_particles + + lwe_thickness_of_stratiform_precipitation_amount - - atmosphere_optical_thickness_due_to_ambient_aerosol_particles + + stratiform_precipitation_amount - - atmosphere_optical_thickness_due_to_ambient_aerosol_particles + + stratiform_precipitation_flux - - atmosphere_moles_of_nitric_acid_trihydrate_ambient_aerosol_particles + + tendency_of_air_temperature_due_to_stratiform_precipitation - - atmosphere_mass_content_of_water_in_ambient_aerosol_particles + + tendency_of_specific_humidity_due_to_stratiform_precipitation - - atmosphere_mass_content_of_sulfate_dry_aerosol_particles + + tendency_of_atmosphere_moles_of_methane - - atmosphere_mass_content_of_sulfate_ambient_aerosol_particles + + mole_fraction_of_noy_expressed_as_nitrogen_in_air - - atmosphere_mass_content_of_sulfate_ambient_aerosol_particles + + atmosphere_mass_content_of_cloud_liquid_water - - atmosphere_mass_content_of_secondary_particulate_organic_matter_dry_aerosol_particles + + effective_radius_of_cloud_liquid_water_particles - - atmosphere_mass_content_of_nitric_acid_trihydrate_ambient_aerosol_particles + + effective_radius_of_convective_cloud_liquid_water_particles - - atmosphere_mass_content_of_nitrate_dry_aerosol_particles + + effective_radius_of_convective_cloud_liquid_water_particles_at_convective_liquid_water_cloud_top - - atmosphere_mass_content_of_mercury_dry_aerosol_particles + + effective_radius_of_stratiform_cloud_liquid_water_particles - - atmosphere_mass_content_of_dust_dry_aerosol_particles + + effective_radius_of_stratiform_cloud_liquid_water_particles_at_stratiform_liquid_water_cloud_top - - atmosphere_mass_content_of_ammonium_dry_aerosol_particles + + number_concentration_of_convective_cloud_liquid_water_particles_at_convective_liquid_water_cloud_top - - atmosphere_absorption_optical_thickness_due_to_sulfate_ambient_aerosol_particles + + number_concentration_of_stratiform_cloud_liquid_water_particles_at_stratiform_liquid_water_cloud_top - - atmosphere_absorption_optical_thickness_due_to_particulate_organic_matter_ambient_aerosol_particles + + air_equivalent_potential_temperature - - atmosphere_absorption_optical_thickness_due_to_dust_ambient_aerosol_particles + + mass_content_of_cloud_liquid_water_in_atmosphere_layer - - angstrom_exponent_of_ambient_aerosol_in_air + + air_pseudo_equivalent_temperature - - atmosphere_absorption_optical_thickness_due_to_ambient_aerosol_particles + + air_equivalent_temperature - - tendency_of_atmosphere_mass_content_of_primary_particulate_organic_matter_dry_aerosol_particles_due_to_wet_deposition + + effective_radius_of_cloud_liquid_water_particles_at_liquid_water_cloud_top - - tendency_of_atmosphere_mass_content_of_primary_particulate_organic_matter_dry_aerosol_particles_due_to_dry_deposition + + atmosphere_mass_content_of_convective_cloud_liquid_water - - tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_due_to_wet_deposition + + mole_concentration_of_phytoplankton_expressed_as_nitrogen_in_sea_water - - tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_due_to_turbulent_deposition + + tendency_of_atmosphere_mass_content_of_nitrogen_compounds_expressed_as_nitrogen_due_to_wet_deposition - - tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_due_to_gravitational_settling + + litter_mass_content_of_carbon - - tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_due_to_dry_deposition + + surface_litter_mass_content_of_carbon - - mass_fraction_of_primary_particulate_organic_matter_dry_aerosol_particles_in_air + + eastward_transformed_eulerian_mean_air_velocity - - mass_fraction_of_particulate_organic_matter_dry_aerosol_particles_in_air + + northward_transformed_eulerian_mean_air_velocity - - atmosphere_mass_content_of_primary_particulate_organic_matter_dry_aerosol_particles + + surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_heterotrophic_respiration - - atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles + + surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_respiration_in_soil - - tendency_of_atmosphere_mass_content_of_pm2p5_sea_salt_dry_aerosol_particles_due_to_emission + + surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_plant_respiration - - tendency_of_atmosphere_mass_content_of_pm2p5_sea_salt_dry_aerosol_particles_due_to_dry_deposition + + surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_plant_respiration_for_biomass_growth - - net_primary_productivity_of_biomass_expressed_as_carbon_accumulated_in_wood + + surface_upward_mass_flux_of_carbon_dioxide_expressed_as_carbon_due_to_plant_respiration_for_biomass_maintenance - - net_primary_productivity_of_biomass_expressed_as_carbon_accumulated_in_roots + + carbon_mass_content_of_forestry_and_agricultural_products - - net_primary_productivity_of_biomass_expressed_as_carbon_accumulated_in_leaves + + carbon_mass_content_of_forestry_and_agricultural_products - - net_primary_productivity_of_biomass_expressed_as_carbon + + leaf_mass_content_of_carbon - - gross_primary_productivity_of_biomass_expressed_as_carbon + + medium_soil_pool_mass_content_of_carbon - - atmosphere_convective_available_potential_energy + + fast_soil_pool_mass_content_of_carbon - - atmosphere_convective_available_potential_energy + + miscellaneous_living_matter_mass_content_of_carbon - - mass_concentration_of_chlorophyll_in_sea_water + + root_mass_content_of_carbon - - mass_concentration_of_chlorophyll_in_sea_water + + slow_soil_pool_mass_content_of_carbon - - omnidirectional_spherical_irradiance_per_unit_wavelength_in_sea_water + + soil_mass_content_of_carbon - - isotropic_radiance_per_unit_wavelength_in_air + + volume_scattering_coefficient_of_radiative_flux_in_air_due_to_dried_aerosol_particles - - isotropic_radiance_per_unit_wavelength_in_air + + volume_scattering_coefficient_of_radiative_flux_in_air_due_to_ambient_aerosol_particles - - land_ice_lwe_surface_specific_mass_balance_rate + + mole_fraction_of_dichlorine_peroxide_in_air - - land_ice_surface_specific_mass_balance_rate + + mole_fraction_of_methylglyoxal_in_air - - tendency_of_atmosphere_mass_content_of_water_vapor_due_to_advection + + atmosphere_moles_of_carbon_tetrachloride - - equivalent_thickness_at_stp_of_atmosphere_ozone_content + + floating_ice_shelf_area_fraction - - tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_industrial_processes_and_combustion + + carbon_mass_flux_into_litter_and_soil_due_to_anthropogenic_land_use_or_land_cover_change - - tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_forest_fires + + product_of_eastward_wind_and_lagrangian_tendency_of_air_pressure - - tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_due_to_net_chemical_production_and_emission + + product_of_northward_wind_and_lagrangian_tendency_of_air_pressure - - tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_due_to_net_chemical_production_and_emission + + atmosphere_moles_of_hcfc22 - - tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_maritime_transport + + tendency_of_atmosphere_moles_of_hcfc22 - - tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_energy_production_and_distribution + + tendency_of_troposphere_moles_of_hcfc22 - - tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_agricultural_waste_burning + + tendency_of_middle_atmosphere_moles_of_hcc140a - - tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_land_transport + + tendency_of_troposphere_moles_of_hcc140a - - tendency_of_atmosphere_mass_content_of_primary_particulate_organic_matter_dry_aerosol_particles_due_to_emission + + atmosphere_moles_of_hcc140a - - tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_savanna_and_grassland_fires + + tendency_of_atmosphere_moles_of_hcc140a - - tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_waste_treatment_and_disposal + + atmosphere_moles_of_halon2402 - - tendency_of_atmosphere_mass_content_of_particulate_organic_matter_dry_aerosol_particles_expressed_as_carbon_due_to_emission_from_residential_and_commercial_combustion + + tendency_of_atmosphere_moles_of_halon2402 - - tendency_of_atmosphere_mass_content_of_dust_dry_aerosol_particles_due_to_emission + + atmosphere_moles_of_halon1301 - - tendency_of_atmosphere_mass_content_of_sulfate_dry_aerosol_particles_due_to_emission + + tendency_of_atmosphere_moles_of_halon1301 - - tendency_of_mass_content_of_water_vapor_in_atmosphere_layer_due_to_turbulence + + atmosphere_moles_of_halon1211 - - tendency_of_mass_content_of_water_vapor_in_atmosphere_layer_due_to_shallow_convection + + tendency_of_atmosphere_moles_of_halon1211 - - tendency_of_mass_content_of_water_vapor_in_atmosphere_layer_due_to_deep_convection + + atmosphere_moles_of_halon1202 - - atmosphere_net_upward_convective_mass_flux + + tendency_of_atmosphere_moles_of_halon1202 - - tendency_of_troposphere_moles_of_molecular_hydrogen + + atmosphere_moles_of_cfc12 - - tendency_of_troposphere_moles_of_methyl_chloride + + tendency_of_atmosphere_moles_of_cfc12 - - tendency_of_troposphere_moles_of_methyl_bromide + + atmosphere_moles_of_cfc115 - - tendency_of_troposphere_moles_of_methane + + tendency_of_atmosphere_moles_of_cfc115 - - tendency_of_troposphere_moles_of_carbon_monoxide + + atmosphere_moles_of_cfc114 - - tendency_of_middle_atmosphere_moles_of_molecular_hydrogen + + tendency_of_atmosphere_moles_of_cfc114 - - tendency_of_middle_atmosphere_moles_of_methyl_chloride + + atmosphere_moles_of_cfc113 - - tendency_of_middle_atmosphere_moles_of_methyl_bromide + + tendency_of_atmosphere_moles_of_cfc113 - - tendency_of_middle_atmosphere_moles_of_methane + + atmosphere_moles_of_cfc11 - - tendency_of_middle_atmosphere_moles_of_carbon_monoxide + + moles_of_cfc11_per_unit_mass_in_sea_water - - tendency_of_atmosphere_moles_of_nitrous_oxide + + tendency_of_atmosphere_moles_of_cfc11 - - tendency_of_atmosphere_moles_of_molecular_hydrogen + + effective_radius_of_stratiform_cloud_snow_particles - - tendency_of_atmosphere_moles_of_methyl_chloride + + water_vapor_partial_pressure_in_air - - tendency_of_atmosphere_moles_of_methyl_bromide + + volume_extinction_coefficient_in_air_due_to_ambient_aerosol_particles - - y_wind + + tendency_of_atmosphere_mole_concentration_of_carbon_monoxide_due_to_chemical_destruction - - x_wind + + tendency_of_mole_concentration_of_dissolved_inorganic_phosphorus_in_sea_water_due_to_biological_processes - - sea_water_y_velocity + + tendency_of_mole_concentration_of_dissolved_inorganic_silicon_in_sea_water_due_to_biological_processes - - sea_water_x_velocity + + mole_concentration_of_diatoms_expressed_as_nitrogen_in_sea_water - - mole_concentration_of_organic_detritus_expressed_as_silicon_in_sea_water + + net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_calcareous_phytoplankton - - mole_concentration_of_organic_detritus_expressed_as_nitrogen_in_sea_water + + net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_diatoms - - mole_concentration_of_microzooplankton_expressed_as_nitrogen_in_sea_water + + net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_phytoplankton - - mole_concentration_of_mesozooplankton_expressed_as_nitrogen_in_sea_water + + net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_picophytoplankton - - atmosphere_moles_of_nitrous_oxide + + net_primary_mole_productivity_of_biomass_expressed_as_carbon_due_to_nitrate_utilization - - atmosphere_moles_of_molecular_hydrogen + + platform_roll - - atmosphere_moles_of_methyl_chloride + + platform_pitch - - atmosphere_moles_of_methyl_bromide + + platform_yaw - - atmosphere_moles_of_methane + + tendency_of_atmosphere_moles_of_carbon_monoxide - - atmosphere_moles_of_carbon_monoxide + + tendency_of_atmosphere_moles_of_carbon_tetrachloride - - tendency_of_mass_content_of_water_vapor_in_atmosphere_layer_due_to_convection + + tendency_of_atmosphere_mass_content_of_elemental_carbon_dry_aerosol_particles_due_to_emission_from_agricultural_waste_burning - - tendency_of_mass_content_of_water_vapor_in_atmosphere_layer + + water_vapor_saturation_deficit_in_air - - tendency_of_atmosphere_mass_content_of_water_vapor_due_to_turbulence + + mole_fraction_of_inorganic_bromine_in_air - - tendency_of_atmosphere_mass_content_of_water_vapor_due_to_shallow_convection + + net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_miscellaneous_phytoplankton - - tendency_of_atmosphere_mass_content_of_water_vapor_due_to_deep_convection + + rate_of_hydroxyl_radical_destruction_due_to_reaction_with_nmvoc - - tendency_of_atmosphere_mass_content_of_water_vapor_due_to_convection + + tendency_of_sea_water_conservative_temperature_expressed_as_heat_content_due_to_parameterized_dianeutral_mixing - - tendency_of_atmosphere_mass_content_of_water_vapor + + tendency_of_sea_water_potential_temperature_expressed_as_heat_content_due_to_parameterized_dianeutral_mixing - - tendency_of_atmosphere_mass_content_of_water_due_to_advection + + tendency_of_sea_water_salinity_expressed_as_salt_content_due_to_parameterized_dianeutral_mixing - - mass_content_of_water_vapor_in_atmosphere_layer + + product_of_lagrangian_tendency_of_air_pressure_and_air_temperature - - mass_content_of_water_in_atmosphere_layer + + product_of_lagrangian_tendency_of_air_pressure_and_air_temperature - - mass_content_of_cloud_ice_in_atmosphere_layer + + product_of_lagrangian_tendency_of_air_pressure_and_geopotential_height - - mass_content_of_cloud_condensed_water_in_atmosphere_layer + + product_of_lagrangian_tendency_of_air_pressure_and_specific_humidity - - lwe_thickness_of_atmosphere_mass_content_of_water_vapor + + product_of_lagrangian_tendency_of_air_pressure_and_specific_humidity - - change_over_time_in_atmosphere_mass_content_of_water_due_to_advection + + volume_fraction_of_condensed_water_in_soil - - change_over_time_in_atmosphere_mass_content_of_water_due_to_advection + + volume_fraction_of_condensed_water_in_soil_at_critical_point - - atmosphere_mass_content_of_sulfate + + volume_fraction_of_condensed_water_in_soil_at_field_capacity - - atmosphere_mass_content_of_sulfate + + volume_fraction_of_condensed_water_in_soil_at_wilting_point - - surface_upward_mole_flux_of_carbon_dioxide + + integral_wrt_depth_of_product_of_potential_temperature_and_sea_water_density - - surface_downward_mole_flux_of_carbon_dioxide + + integral_wrt_depth_of_product_of_conservative_temperature_and_sea_water_density - - atmosphere_mass_content_of_water_vapor + + integral_wrt_depth_of_product_of_salinity_and_sea_water_density - - atmosphere_mass_content_of_convective_cloud_condensed_water + + sea_water_velocity_to_direction - - atmosphere_mass_content_of_cloud_ice + + sea_water_velocity_to_direction - - atmosphere_mass_content_of_cloud_condensed_water + + sea_water_velocity_from_direction - - thickness_of_stratiform_snowfall_amount + + tendency_of_mass_fraction_of_stratiform_cloud_ice_in_air_due_to_riming_from_cloud_liquid_water - - thickness_of_stratiform_rainfall_amount + + tendency_of_mass_fraction_of_stratiform_cloud_ice_in_air_due_to_heterogeneous_nucleation_from_cloud_liquid_water - - stratiform_snowfall_flux + + tendency_of_mass_fraction_of_stratiform_cloud_ice_in_air_due_to_melting_to_cloud_liquid_water - - stratiform_snowfall_amount + + air_pseudo_equivalent_potential_temperature - - stratiform_rainfall_rate + + growth_limitation_of_diazotrophic_phytoplankton_due_to_solar_irradiance - - stratiform_rainfall_flux + + iron_growth_limitation_of_diazotrophic_phytoplankton - - stratiform_rainfall_amount + + mass_concentration_of_diazotrophic_phytoplankton_expressed_as_chlorophyll_in_sea_water - - northward_water_vapor_flux_in_air + + mole_concentration_of_diazotrophic_phytoplankton_expressed_as_carbon_in_sea_water - - lwe_thickness_of_stratiform_snowfall_amount + + net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_diazotrophic_phytoplankton - - lwe_stratiform_snowfall_rate + + net_primary_mole_productivity_of_biomass_expressed_as_carbon_by_diazotrophic_phytoplankton - - kinetic_energy_dissipation_in_atmosphere_boundary_layer + + nitrogen_growth_limitation_of_diazotrophic_phytoplankton - - eastward_water_vapor_flux_in_air + + tendency_of_mole_concentration_of_particulate_organic_matter_expressed_as_carbon_in_sea_water_due_to_net_primary_production_by_diazotrophic_phytoplankton - - surface_upward_sensible_heat_flux + + mass_fraction_of_liquid_precipitation_in_air - - surface_temperature + + mass_fraction_of_liquid_precipitation_in_air - - surface_temperature + + area_type - - surface_temperature + + area_type - - surface_net_downward_radiative_flux + + atmosphere_upward_absolute_vorticity - - mole_fraction_of_hypochlorous_acid_in_air + + atmosphere_upward_relative_vorticity - - mole_fraction_of_chlorine_monoxide_in_air + + surface_snow_density - - mole_fraction_of_chlorine_dioxide_in_air + + tendency_of_atmosphere_mass_content_of_water_vapor_due_to_sublimation_of_surface_snow_and_ice - - wind_mixing_energy_flux_into_sea_water + + integral_wrt_time_of_surface_downward_northward_stress - - water_flux_into_sea_water + + integral_wrt_time_of_surface_downward_eastward_stress - - upward_eastward_momentum_flux_in_air_due_to_orographic_gravity_waves + + temperature_in_surface_snow - - upward_eastward_momentum_flux_in_air_due_to_nonorographic_westward_gravity_waves + + thermal_energy_content_of_surface_snow - - upward_eastward_momentum_flux_in_air_due_to_nonorographic_eastward_gravity_waves + + surface_snow_thickness - - upward_eliassen_palm_flux_in_air + + liquid_water_content_of_surface_snow - - northward_heat_flux_in_air_due_to_eddy_advection + + soot_content_of_surface_snow - - northward_eliassen_palm_flux_in_air + + backscattering_ratio_in_air - - wave_frequency + + histogram_of_backscattering_ratio_in_air_over_height_above_reference_ellipsoid - - sea_surface_wind_wave_period + + effective_radius_of_convective_cloud_ice_particles - - sea_surface_swell_wave_period + + effective_radius_of_convective_cloud_rain_particles - - mass_concentration_of_suspended_matter_in_sea_water + + effective_radius_of_convective_cloud_snow_particles - - surface_drag_coefficient_in_air + + effective_radius_of_stratiform_cloud_graupel_particles - - surface_drag_coefficient_for_momentum_in_air + + effective_radius_of_stratiform_cloud_ice_particles - - surface_drag_coefficient_for_heat_in_air + + effective_radius_of_stratiform_cloud_rain_particles - - specific_gravitational_potential_energy + + mass_concentration_of_biomass_burning_dry_aerosol_particles_in_air - - radiation_wavelength + + diameter_of_ambient_aerosol_particles - - product_of_northward_wind_and_specific_humidity + + electrical_mobility_diameter_of_ambient_aerosol_particles - - mole_fraction_of_ozone_in_air + + lagrangian_tendency_of_atmosphere_sigma_coordinate - - isotropic_shortwave_radiance_in_air + + lagrangian_tendency_of_atmosphere_sigma_coordinate - - isotropic_longwave_radiance_in_air + + tendency_of_atmosphere_number_content_of_aerosol_particles_due_to_turbulent_deposition - - mass_fraction_of_ozone_in_air + + biological_taxon_lsid - - mass_fraction_of_convective_cloud_condensed_water_in_air + + temperature_in_ground From 724c6d29b1f0b20b77464a3a85c3d3c29bb6e7b3 Mon Sep 17 00:00:00 2001 From: Martin Yeo <40734014+trexfeathers@users.noreply.github.com> Date: Thu, 13 Apr 2023 15:07:16 +0100 Subject: [PATCH 71/85] libnetcdf <4.9 pin (#5242) * Pin libnetcdf<4.9 and update lock files. * What's New entry. * libnetcdf not available on PyPI. * Fix for Pandas v2.0. * Fix for Pandas v2.0. --- docs/src/whatsnew/latest.rst | 2 +- lib/iris/pandas.py | 11 ++++++----- requirements/py310.yml | 1 + requirements/py38.yml | 1 + requirements/py39.yml | 1 + 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/docs/src/whatsnew/latest.rst b/docs/src/whatsnew/latest.rst index 514e6f24d2..d2e28a90d0 100644 --- a/docs/src/whatsnew/latest.rst +++ b/docs/src/whatsnew/latest.rst @@ -116,7 +116,7 @@ This document explains the changes made to Iris for this release 🔗 Dependencies =============== -#. N/A +#. `@trexfeathers`_ introduced the ``libnetcdf <4.9`` pin. (:pull:`5242`) 📚 Documentation diff --git a/lib/iris/pandas.py b/lib/iris/pandas.py index 522c216432..fb0740a53c 100644 --- a/lib/iris/pandas.py +++ b/lib/iris/pandas.py @@ -345,12 +345,13 @@ def as_cubes( ... var_name="longitude", ... value_name="air_temperature" ... ) + >>> my_df["longitude"] = my_df["longitude"].infer_objects() >>> print(my_df) - latitude longitude air_temperature - 0 35 0 300 - 1 25 0 301 - 2 35 10 302 - 3 25 10 303 + latitude longitude air_temperature + 0 35 0 300 + 1 25 0 301 + 2 35 10 302 + 3 25 10 303 >>> my_df = my_df.set_index(["latitude", "longitude"]) >>> my_df = my_df.sort_index() >>> converted_cube = as_cubes(my_df)[0] diff --git a/requirements/py310.yml b/requirements/py310.yml index 05efc18d54..2e62a43e2a 100644 --- a/requirements/py310.yml +++ b/requirements/py310.yml @@ -15,6 +15,7 @@ dependencies: - cf-units >=3.1 - cftime >=1.5 - dask-core >=2022.9.0 + - libnetcdf <4.9 - matplotlib >=3.5 - netcdf4 - libnetcdf<4.9 diff --git a/requirements/py38.yml b/requirements/py38.yml index 9884a6f6f6..1926b78669 100644 --- a/requirements/py38.yml +++ b/requirements/py38.yml @@ -15,6 +15,7 @@ dependencies: - cf-units >=3.1 - cftime >=1.5 - dask-core >=2022.9.0 + - libnetcdf <4.9 - matplotlib >=3.5 - netcdf4 - libnetcdf<4.9 diff --git a/requirements/py39.yml b/requirements/py39.yml index f8a21af71d..4a9a72861e 100644 --- a/requirements/py39.yml +++ b/requirements/py39.yml @@ -15,6 +15,7 @@ dependencies: - cf-units >=3.1 - cftime >=1.5 - dask-core >=2022.9.0 + - libnetcdf <4.9 - matplotlib >=3.5 - netcdf4 - libnetcdf<4.9 From 4f50dc74221e2566d5555e1a950023e34d1ee795 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 13 Apr 2023 16:29:50 +0100 Subject: [PATCH 72/85] Avoid possible same-file crossover between tests. --- lib/iris/tests/integration/netcdf/test_delayed_save.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/iris/tests/integration/netcdf/test_delayed_save.py b/lib/iris/tests/integration/netcdf/test_delayed_save.py index 3a104cc78c..a59f53043a 100644 --- a/lib/iris/tests/integration/netcdf/test_delayed_save.py +++ b/lib/iris/tests/integration/netcdf/test_delayed_save.py @@ -26,7 +26,7 @@ class Test__lazy_stream_data: - @pytest.fixture(autouse=True, scope="module") + @pytest.fixture(autouse=True, scope="function") def output_path(self, tmp_path_factory): tmpdir = tmp_path_factory.mktemp("save_testfiles") self.temp_output_filepath = tmpdir / "tmp.nc" From 0da68cfe635605bf1cae808e30d61720a34d008c Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 13 Apr 2023 17:35:25 +0100 Subject: [PATCH 73/85] Ensure all-different testfiles; load all vars lazy. --- .../integration/netcdf/test_delayed_save.py | 104 ++++++------------ 1 file changed, 35 insertions(+), 69 deletions(-) diff --git a/lib/iris/tests/integration/netcdf/test_delayed_save.py b/lib/iris/tests/integration/netcdf/test_delayed_save.py index a59f53043a..8ed9f79542 100644 --- a/lib/iris/tests/integration/netcdf/test_delayed_save.py +++ b/lib/iris/tests/integration/netcdf/test_delayed_save.py @@ -6,7 +6,6 @@ """ Integration tests for delayed saving. """ -from datetime import datetime import time import warnings @@ -29,9 +28,18 @@ class Test__lazy_stream_data: @pytest.fixture(autouse=True, scope="function") def output_path(self, tmp_path_factory): tmpdir = tmp_path_factory.mktemp("save_testfiles") - self.temp_output_filepath = tmpdir / "tmp.nc" + self.temp_output_filepath = tmpdir / f"tmp_{time.time()}.nc" yield self.temp_output_filepath + @pytest.fixture(autouse=True, scope="module") + def all_vars_lazy(self): + # For the operation of these tests, we want to force all netcdf variables + # to load as lazy data, i.e. **don't** use real data for 'small' ones. + old_value = iris.fileformats.netcdf.loader._LAZYVAR_MIN_BYTES + iris.fileformats.netcdf.loader._LAZYVAR_MIN_BYTES = 0 + yield + iris.fileformats.netcdf.loader._LAZYVAR_MIN_BYTES = old_value + @staticmethod @pytest.fixture(params=[False, True], ids=["SaveImmediate", "SaveDelayed"]) def save_is_delayed(request): @@ -143,9 +151,9 @@ def getmask(cube_or_coord): def test_time_of_writing( self, save_is_delayed, output_path, scheduler_type ): - # Check when lazy data is actually written : + # Check when lazy data is *actually* written : # - in 'immediate' mode, on initial file write - # - in 'delayed' mode, only when delayed-write is executed. + # - in 'delayed' mode, only when the delayed-write is computed. original_cube = self.make_testcube(include_extra_coordlikes=True) assert original_cube.has_lazy_data() assert original_cube.coord("surface_altitude").has_lazy_points() @@ -166,14 +174,20 @@ def test_time_of_writing( output_path, "air_potential_temperature" ) assert readback_cube.has_lazy_data() + assert readback_cube.coord("surface_altitude").has_lazy_points() + assert readback_cube.cell_measure("sample_cm").has_lazy_data() + assert readback_cube.ancillary_variable("sample_ancil").has_lazy_data() # If 'delayed', the lazy content should all be masked, otherwise none of it. - data_mask = self.getmask(readback_cube) - coord_mask = self.getmask(readback_cube.coord("surface_altitude")) - ancil_mask = self.getmask( - readback_cube.ancillary_variable("sample_ancil") - ) - cm_mask = self.getmask(readback_cube.cell_measure("sample_cm")) + tests_components = [ + readback_cube, + readback_cube.coord("surface_altitude"), + readback_cube.ancillary_variable("sample_ancil"), + readback_cube.cell_measure("sample_cm"), + ] + data_mask, coord_mask, ancil_mask, cm_mask = [ + self.getmask(data) for data in tests_components + ] if save_is_delayed: assert np.all(data_mask) assert np.all(coord_mask) @@ -191,64 +205,16 @@ def test_time_of_writing( assert len(saver._delayed_writes) == 4 result.compute() - # shapes = [ - # x.shape for x in (data_mask, coord_mask, ancil_mask, cm_mask) - # ] - # assert shapes == [ - # (6, 70, 100, 100), - # (100, 100), - # (6, 100), - # (6, 100), - # ] - - n_tries = 0 - all_done = False - n_max_tries = 12 - retry_delay = 5.0 - start_time = datetime.now() - while not all_done and n_tries < n_max_tries: - n_tries += 1 - - # Re-fetch the arrays. The data is **no longer masked**. - data_mask = self.getmask(readback_cube) - coord_mask = self.getmask( - readback_cube.coord("surface_altitude") - ) - ancil_mask = self.getmask( - readback_cube.ancillary_variable("sample_ancil") - ) - cm_mask = self.getmask(readback_cube.cell_measure("sample_cm")) - results = [ - np.all(~x) - for x in (data_mask, coord_mask, ancil_mask, cm_mask) - ] - all_done = all(results) - - if not all_done: - time.sleep(retry_delay) - - # Perform a sequence of checks which should show what happened ... - - end_time = datetime.now() - elapsed = (end_time - start_time).total_seconds() - print("time_of_writing, delayed-save test results:") - print( - f" : results={results}, tries={n_tries}, elapsed-time={elapsed}" - ) - - # Check it either succeeded or timed out - assert all_done or n_tries >= n_max_tries - - # Did it succeed? (if not must have retried) - assert all_done - - # Did it work first time? - assert n_tries == 1 + # Re-fetch the arrays. The data is **no longer masked**. + data_mask, coord_mask, ancil_mask, cm_mask = [ + self.getmask(data) for data in tests_components + ] - # assert np.all(~data_mask) - # assert np.all(~coord_mask) - # assert np.all(~ancil_mask) - # assert np.all(~cm_mask) + # All written now ? + assert np.all(~data_mask) + assert np.all(~coord_mask) + assert np.all(~ancil_mask) + assert np.all(~cm_mask) @pytest.mark.parametrize( "warning_type", ["WarnMaskedBytes", "WarnFillvalueCollision"] @@ -307,8 +273,8 @@ def test_no_delayed_writes(self, output_path): @classmethod @pytest.fixture( params=[ - "ThreadedScheduler", - "DistributedScheduler", + # "ThreadedScheduler", + # "DistributedScheduler", "SingleThreadScheduler", ] ) From e8b7bfddddd091748f083aae3c002e74155a844e Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 13 Apr 2023 17:53:09 +0100 Subject: [PATCH 74/85] Revert changes to testing framework. --- .github/workflows/ci-tests.yml | 13 ++++++++++++- noxfile.py | 21 +++------------------ 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/.github/workflows/ci-tests.yml b/.github/workflows/ci-tests.yml index ee1a8aa8a3..8831329ee3 100644 --- a/.github/workflows/ci-tests.yml +++ b/.github/workflows/ci-tests.yml @@ -36,7 +36,18 @@ jobs: matrix: os: ["ubuntu-latest"] python-version: ["3.10"] - session: ["tests", "tests_no_xdist"] + session: ["doctest", "gallery", "linkcheck"] + include: + - os: "ubuntu-latest" + python-version: "3.10" + session: "tests" + coverage: "--coverage" + - os: "ubuntu-latest" + python-version: "3.9" + session: "tests" + - os: "ubuntu-latest" + python-version: "3.8" + session: "tests" env: IRIS_TEST_DATA_VERSION: "2.19" diff --git a/noxfile.py b/noxfile.py index 626ae99e38..d34155ecaf 100755 --- a/noxfile.py +++ b/noxfile.py @@ -169,15 +169,6 @@ def prepare_venv(session: nox.sessions.Session) -> None: @nox.session(python=PY_VER, venv_backend="conda") def tests(session: nox.sessions.Session): - tests_generic(session, use_xdist=True) - - -@nox.session(python=PY_VER, venv_backend="conda") -def tests_no_xdist(session: nox.sessions.Session): - tests_generic(session, use_xdist=False) - - -def tests_generic(session: nox.sessions.Session, use_xdist: bool = True): """ Perform iris system, integration and unit tests. @@ -194,16 +185,10 @@ def tests_generic(session: nox.sessions.Session, use_xdist: bool = True): session.env.update(ENV) run_args = [ "pytest", - "-v", - "-rA", - "lib/iris/tests/integration/netcdf/test_delayed_save.py", + "-n", + "auto", + "lib/iris/tests", ] - if use_xdist: - run_args[1:1] = [ - "-n", - "auto", - ] - if "-c" in session.posargs or "--coverage" in session.posargs: run_args[-1:-1] = ["--cov=lib/iris", "--cov-report=xml"] session.run(*run_args) From ad48cafa13a7a967f1102876011a8da2ff64b34e Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 13 Apr 2023 18:10:35 +0100 Subject: [PATCH 75/85] Remove repeated line from requirements/py*.yml (?merge error), and re-fix lockfiles. --- requirements/py310.yml | 1 - requirements/py38.yml | 1 - requirements/py39.yml | 1 - 3 files changed, 3 deletions(-) diff --git a/requirements/py310.yml b/requirements/py310.yml index 2e62a43e2a..7edc143375 100644 --- a/requirements/py310.yml +++ b/requirements/py310.yml @@ -18,7 +18,6 @@ dependencies: - libnetcdf <4.9 - matplotlib >=3.5 - netcdf4 - - libnetcdf<4.9 - numpy >=1.19 - python-xxhash - pyproj diff --git a/requirements/py38.yml b/requirements/py38.yml index 1926b78669..dbeb9505b6 100644 --- a/requirements/py38.yml +++ b/requirements/py38.yml @@ -18,7 +18,6 @@ dependencies: - libnetcdf <4.9 - matplotlib >=3.5 - netcdf4 - - libnetcdf<4.9 - numpy >=1.19 - python-xxhash - pyproj diff --git a/requirements/py39.yml b/requirements/py39.yml index 4a9a72861e..14786305f5 100644 --- a/requirements/py39.yml +++ b/requirements/py39.yml @@ -18,7 +18,6 @@ dependencies: - libnetcdf <4.9 - matplotlib >=3.5 - netcdf4 - - libnetcdf<4.9 - numpy >=1.19 - python-xxhash - pyproj From 291b587e5282169610f5b0737ddcd8940720413c Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Thu, 13 Apr 2023 18:19:49 +0100 Subject: [PATCH 76/85] Revert some more debug changes. --- lib/iris/fileformats/netcdf/saver.py | 4 ---- lib/iris/tests/integration/netcdf/test_delayed_save.py | 9 +++------ 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index f8d785f69e..5cf76f4715 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -2533,7 +2533,6 @@ def save( packing=None, fill_value=None, compute=True, - return_saver_list=None, ): """ Save cube(s) to a netCDF file, given the cube and the filename. @@ -2827,7 +2826,4 @@ def is_valid_packspec(p): # Return a delayed completion object. result = sman.delayed_completion() - if return_saver_list is not None: - return_saver_list.append(sman) - return result diff --git a/lib/iris/tests/integration/netcdf/test_delayed_save.py b/lib/iris/tests/integration/netcdf/test_delayed_save.py index 8ed9f79542..c75c0d9e97 100644 --- a/lib/iris/tests/integration/netcdf/test_delayed_save.py +++ b/lib/iris/tests/integration/netcdf/test_delayed_save.py @@ -160,12 +160,10 @@ def test_time_of_writing( assert original_cube.cell_measure("sample_cm").has_lazy_data() assert original_cube.ancillary_variable("sample_ancil").has_lazy_data() - return_saver_list = [] result = iris.save( original_cube, output_path, compute=not save_is_delayed, - return_saver_list=return_saver_list, ) assert save_is_delayed == (result is not None) @@ -173,6 +171,7 @@ def test_time_of_writing( readback_cube = iris.load_cube( output_path, "air_potential_temperature" ) + # Check the components to be tested *are* lazy. See: self.all_vars_lazy(). assert readback_cube.has_lazy_data() assert readback_cube.coord("surface_altitude").has_lazy_points() assert readback_cube.cell_measure("sample_cm").has_lazy_data() @@ -200,12 +199,10 @@ def test_time_of_writing( assert np.all(~cm_mask) if save_is_delayed: - saver = return_saver_list[0] - assert len(saver._delayed_writes) != 0 - assert len(saver._delayed_writes) == 4 + # Complete the write. result.compute() - # Re-fetch the arrays. The data is **no longer masked**. + # Re-fetch the lazy arrays. The data should now **not be masked**. data_mask, coord_mask, ancil_mask, cm_mask = [ self.getmask(data) for data in tests_components ] From 33a7d8618005ffd1767c1062d498c8ffba21b468 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 14 Apr 2023 10:13:03 +0100 Subject: [PATCH 77/85] Reorganise test for better code clarity. --- .../integration/netcdf/test_delayed_save.py | 197 +++++++++--------- .../saver/test_Saver__lazy_stream_data.py | 2 +- 2 files changed, 102 insertions(+), 97 deletions(-) diff --git a/lib/iris/tests/integration/netcdf/test_delayed_save.py b/lib/iris/tests/integration/netcdf/test_delayed_save.py index c75c0d9e97..9c7a25ae78 100644 --- a/lib/iris/tests/integration/netcdf/test_delayed_save.py +++ b/lib/iris/tests/integration/netcdf/test_delayed_save.py @@ -137,16 +137,74 @@ def test_realfile_loadsave_equivalence(self, save_is_delayed, output_path): reloaded_cubes = sorted(reloaded_cubes, key=lambda cube: cube.name()) assert reloaded_cubes == original_cubes # NOTE: it might be nicer to use assertCDL, but unfortunately importing - # unitest.TestCase seems to lose us the ability to use fixtures. + # unittest.TestCase seems to lose us the ability to use fixtures. - @staticmethod - def getmask(cube_or_coord): - cube_or_coord = cube_or_coord.copy() # avoid realising the original - if hasattr(cube_or_coord, "points"): - data = cube_or_coord.points + @classmethod + @pytest.fixture( + params=[ + "ThreadedScheduler", + "DistributedScheduler", + "SingleThreadScheduler", + ] + ) + def scheduler_type(cls, request): + sched_typename = request.param + if sched_typename == "ThreadedScheduler": + config_name = "threads" + elif sched_typename == "SingleThreadScheduler": + config_name = "single-threaded" else: - data = cube_or_coord.data - return np.ma.getmaskarray(data) + assert sched_typename == "DistributedScheduler" + config_name = "distributed" + + if config_name == "distributed": + _distributed_client = distributed.Client() + + with dask.config.set(scheduler=config_name): + yield sched_typename + + if config_name == "distributed": + _distributed_client.close() + + def test_scheduler_types( + self, output_path, scheduler_type, save_is_delayed + ): + # Check operation works and behaves the same with different schedulers, + # especially including distributed. + + # Just check that the dask scheduler is setup as 'expected'. + if scheduler_type == "ThreadedScheduler": + expected_dask_scheduler = "threads" + elif scheduler_type == "SingleThreadScheduler": + expected_dask_scheduler = "single-threaded" + else: + assert scheduler_type == "DistributedScheduler" + expected_dask_scheduler = "distributed" + + assert dask.config.get("scheduler") == expected_dask_scheduler + + # Use a testcase that produces delayed warnings (and check those too). + cube = self.make_testcube( + include_lazy_content=True, ensure_fillvalue_collision=True + ) + with warnings.catch_warnings(record=True) as logged_warnings: + result = iris.save(cube, output_path, compute=not save_is_delayed) + + if not save_is_delayed: + assert result is None + assert len(logged_warnings) == 2 + issued_warnings = [log.message for log in logged_warnings] + else: + assert result is not None + assert len(logged_warnings) == 0 + warnings.simplefilter("error") + issued_warnings = result.compute() + + assert len(issued_warnings) == 2 + expected_msg = "contains unmasked data points equal to the fill-value" + assert all( + expected_msg in warning.args[0] for warning in issued_warnings + ) def test_time_of_writing( self, save_is_delayed, output_path, scheduler_type @@ -167,7 +225,7 @@ def test_time_of_writing( ) assert save_is_delayed == (result is not None) - # Read back : NOTE must sidestep the separate surface-altitude cube. + # Read back : NOTE avoid loading the separate surface-altitude cube. readback_cube = iris.load_cube( output_path, "air_potential_temperature" ) @@ -178,15 +236,30 @@ def test_time_of_writing( assert readback_cube.ancillary_variable("sample_ancil").has_lazy_data() # If 'delayed', the lazy content should all be masked, otherwise none of it. - tests_components = [ + def getmask(cube_or_coord): + cube_or_coord = ( + cube_or_coord.copy() + ) # avoid realising the original + if hasattr(cube_or_coord, "points"): + data = cube_or_coord.points + else: + data = cube_or_coord.data + return np.ma.getmaskarray(data) + + test_components = [ readback_cube, readback_cube.coord("surface_altitude"), readback_cube.ancillary_variable("sample_ancil"), readback_cube.cell_measure("sample_cm"), ] - data_mask, coord_mask, ancil_mask, cm_mask = [ - self.getmask(data) for data in tests_components - ] + + def fetch_masks(): + data_mask, coord_mask, ancil_mask, cm_mask = [ + getmask(data) for data in test_components + ] + return data_mask, coord_mask, ancil_mask, cm_mask + + data_mask, coord_mask, ancil_mask, cm_mask = fetch_masks() if save_is_delayed: assert np.all(data_mask) assert np.all(coord_mask) @@ -203,10 +276,7 @@ def test_time_of_writing( result.compute() # Re-fetch the lazy arrays. The data should now **not be masked**. - data_mask, coord_mask, ancil_mask, cm_mask = [ - self.getmask(data) for data in tests_components - ] - + data_mask, coord_mask, ancil_mask, cm_mask = fetch_masks() # All written now ? assert np.all(~data_mask) assert np.all(~coord_mask) @@ -226,7 +296,7 @@ def test_fill_warnings(self, warning_type, output_path, save_is_delayed): "contains unmasked data points equal to the fill-value" ) else: - # warning_type == 'WarnMaskedBytes' + assert warning_type == "WarnMaskedBytes" make_fv_collide = False make_maskedbytes = True expected_msg = "contains byte data with masked points" @@ -239,18 +309,20 @@ def test_fill_warnings(self, warning_type, output_path, save_is_delayed): with warnings.catch_warnings(record=True) as logged_warnings: result = iris.save(cube, output_path, compute=not save_is_delayed) - if not save_is_delayed: - result_warnings = [ - log.message - for log in logged_warnings - if isinstance(log.message, SaverFillValueWarning) - ] - else: - assert len(logged_warnings) == 0 + result_warnings = [ + log.message + for log in logged_warnings + if isinstance(log.message, SaverFillValueWarning) + ] + + if save_is_delayed: + # Should have had *no* fill-warnings in the initial save. + assert len(result_warnings) == 0 # Complete the operation now - # NOTE: warnings should not be *issued* here, instead they are returned. - warnings.simplefilter("error", category=SaverFillValueWarning) - result_warnings = result.compute() + with warnings.catch_warnings(): + # NOTE: warnings should *not* be issued here, instead they are returned. + warnings.simplefilter("error", category=SaverFillValueWarning) + result_warnings = result.compute() # Either way, we should now have 2 similar warnings. assert len(result_warnings) == 2 @@ -266,70 +338,3 @@ def test_no_delayed_writes(self, output_path): result = iris.save(cube, output_path, compute=False) assert isinstance(result, Delayed) assert result.compute() == [] - - @classmethod - @pytest.fixture( - params=[ - # "ThreadedScheduler", - # "DistributedScheduler", - "SingleThreadScheduler", - ] - ) - def scheduler_type(cls, request): - sched_typename = request.param - if sched_typename == "ThreadedScheduler": - config_name = "threads" - elif sched_typename == "SingleThreadScheduler": - config_name = "single-threaded" - else: - assert sched_typename == "DistributedScheduler" - config_name = "distributed" - - if config_name == "distributed": - _distributed_client = distributed.Client() - - with dask.config.set(scheduler=config_name): - yield sched_typename - - if config_name == "distributed": - _distributed_client.close() - - def test_scheduler_types( - self, output_path, scheduler_type, save_is_delayed - ): - # Check operation works and behaves the same with different schedulers, - # especially including distributed. - - # Just check that the dask scheduler is setup as 'expected'. - if scheduler_type == "ThreadedScheduler": - expected_dask_scheduler = "threads" - elif scheduler_type == "SingleThreadScheduler": - expected_dask_scheduler = "single-threaded" - else: - assert scheduler_type == "DistributedScheduler" - expected_dask_scheduler = "distributed" - - assert dask.config.get("scheduler") == expected_dask_scheduler - - # Use a testcase that produces delayed warnings. - cube = self.make_testcube( - include_lazy_content=True, ensure_fillvalue_collision=True - ) - with warnings.catch_warnings(record=True) as logged_warnings: - result = iris.save(cube, output_path, compute=not save_is_delayed) - - if not save_is_delayed: - assert result is None - assert len(logged_warnings) == 2 - issued_warnings = [log.message for log in logged_warnings] - else: - assert result is not None - assert len(logged_warnings) == 0 - warnings.simplefilter("error") - issued_warnings = result.compute() - - assert len(issued_warnings) == 2 - expected_msg = "contains unmasked data points equal to the fill-value" - assert all( - expected_msg in warning.args[0] for warning in issued_warnings - ) diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy_stream_data.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy_stream_data.py index 7537ec2c3c..809844c917 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy_stream_data.py +++ b/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy_stream_data.py @@ -34,7 +34,7 @@ def saver_patch(): target1 = ( "iris.fileformats.netcdf.saver._thread_safe_nc.DatasetWrapper" ) - # Mock the real netCDF4 dataset within the threadsafe-nc module, as this is + # Mock the real netCDF4.Dataset within the threadsafe-nc module, as this is # used by NetCDFDataProxy and NetCDFWriteProxy. target2 = "iris.fileformats.netcdf._thread_safe_nc.netCDF4.Dataset" with mock.patch(target1, mock_dataset_class): From db6932de473551d81df50a3cb27e045ec451fb5c Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 14 Apr 2023 10:24:36 +0100 Subject: [PATCH 78/85] Use public 'Dataset.isopen()' instead of '._isopen'. --- lib/iris/fileformats/netcdf/saver.py | 2 +- lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver.py | 7 ++++++- .../netcdf/saver/test_Saver__lazy_stream_data.py | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/iris/fileformats/netcdf/saver.py b/lib/iris/fileformats/netcdf/saver.py index 5cf76f4715..916fea94f0 100644 --- a/lib/iris/fileformats/netcdf/saver.py +++ b/lib/iris/fileformats/netcdf/saver.py @@ -2498,7 +2498,7 @@ def complete(self, issue_warnings=True) -> List[Warning]: Any warnings that were raised while writing delayed data. """ - if self._dataset._isopen: + if self._dataset.isopen(): msg = ( "Cannot call Saver.complete() until its dataset is closed, " "i.e. the saver's context has exited." diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver.py index 3330c700f0..12af318c01 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver.py +++ b/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver.py @@ -653,7 +653,12 @@ def setUp(self): self.data_dtype = np.dtype("int32") # We need to create mock datasets which look like they are closed. - dataset_class = mock.Mock(return_value=mock.Mock(_isopen=0)) + dataset_class = mock.Mock( + return_value=mock.Mock( + # Mock dataset : the isopen() call should return 0. + isopen=mock.Mock(return_value=0) + ) + ) patch = mock.patch( "iris.fileformats.netcdf._thread_safe_nc.DatasetWrapper", dataset_class, diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy_stream_data.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy_stream_data.py index 809844c917..6e914ab557 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy_stream_data.py +++ b/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy_stream_data.py @@ -28,7 +28,7 @@ class Test__lazy_stream_data: def saver_patch(): # Install patches, so we can create a Saver without opening a real output file. # Mock just enough of Dataset behaviour to allow a 'Saver.complete()' call. - mock_dataset = mock.MagicMock(_isopen=False) + mock_dataset = mock.MagicMock() mock_dataset_class = mock.Mock(return_value=mock_dataset) # Mock the wrapper within the netcdf saver target1 = ( From 631e001ce646b1faa6b24301238a421407076567 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 14 Apr 2023 10:38:55 +0100 Subject: [PATCH 79/85] Create output files in unique temporary directories. --- lib/iris/tests/integration/netcdf/test_delayed_save.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/iris/tests/integration/netcdf/test_delayed_save.py b/lib/iris/tests/integration/netcdf/test_delayed_save.py index 9c7a25ae78..61e28b4c5b 100644 --- a/lib/iris/tests/integration/netcdf/test_delayed_save.py +++ b/lib/iris/tests/integration/netcdf/test_delayed_save.py @@ -6,7 +6,6 @@ """ Integration tests for delayed saving. """ -import time import warnings from cf_units import Unit @@ -25,10 +24,10 @@ class Test__lazy_stream_data: - @pytest.fixture(autouse=True, scope="function") - def output_path(self, tmp_path_factory): - tmpdir = tmp_path_factory.mktemp("save_testfiles") - self.temp_output_filepath = tmpdir / f"tmp_{time.time()}.nc" + @pytest.fixture(autouse=True) + def output_path(self, tmp_path): + # A temporary output netcdf-file path, **unique to each test call**. + self.temp_output_filepath = tmp_path / "tmp.nc" yield self.temp_output_filepath @pytest.fixture(autouse=True, scope="module") From 2869f97d3d34c1356b8dc8eca3842c1c498d1984 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 14 Apr 2023 12:59:42 +0100 Subject: [PATCH 80/85] Tests for fileformats.netcdf._dask_locks. --- lib/iris/fileformats/netcdf/_dask_locks.py | 9 +- .../integration/netcdf/test__dask_locks.py | 115 ++++++++++++++++++ 2 files changed, 122 insertions(+), 2 deletions(-) create mode 100644 lib/iris/tests/integration/netcdf/test__dask_locks.py diff --git a/lib/iris/fileformats/netcdf/_dask_locks.py b/lib/iris/fileformats/netcdf/_dask_locks.py index 0099cece85..bd15816a6c 100644 --- a/lib/iris/fileformats/netcdf/_dask_locks.py +++ b/lib/iris/fileformats/netcdf/_dask_locks.py @@ -55,6 +55,11 @@ import dask.threaded +# A dedicated error class, allowing filtering and testing of errors raised here. +class DaskSchedulerTypeError(ValueError): + pass + + def dask_scheduler_is_distributed(): """Return whether a distributed.Client is active.""" # NOTE: this replicates logic in `dask.base.get_scheduler` : if a distributed client @@ -101,7 +106,7 @@ def get_dask_array_scheduler_type(): result = "processes" else: msg = f"Dask default scheduler for arrays is unrecognised : {get_function}" - raise ValueError(msg) + raise DaskSchedulerTypeError(msg) return result @@ -129,7 +134,7 @@ def get_worker_lock(identity: str): f'"{scheduler_type}", ' "which is not supported by the Iris netcdf saver." ) - raise ValueError(msg) + raise DaskSchedulerTypeError(msg) # NOTE: not supporting 'processes' scheduler, for now. return lock diff --git a/lib/iris/tests/integration/netcdf/test__dask_locks.py b/lib/iris/tests/integration/netcdf/test__dask_locks.py new file mode 100644 index 0000000000..af7ce7147f --- /dev/null +++ b/lib/iris/tests/integration/netcdf/test__dask_locks.py @@ -0,0 +1,115 @@ +# Copyright Iris contributors +# +# This file is part of Iris and is released under the LGPL license. +# See COPYING and COPYING.LESSER in the root of the repository for full +# licensing details. +""" +Unit tests for the :mod:`iris.fileformats.netcdf._dask_locks` package. + +Note: these integration tests replace any unit testing of this module, due to its total +dependence on Dask, and even on Dask's implemenetation details rather than supported +and documented API and behaviour. +So (a) it is essential to check the module's behaviour against actual Dask operation, +and (b) mock-ist testing of the implementation code in isolation would not add anything +of much value. +""" +import dask +import dask.config +import distributed +import pytest + +from iris.fileformats.netcdf._dask_locks import ( + DaskSchedulerTypeError, + dask_scheduler_is_distributed, + get_dask_array_scheduler_type, + get_worker_lock, +) + + +@pytest.fixture( + params=[ + "UnspecifiedScheduler", + "ThreadedScheduler", + "SingleThreadScheduler", + "ProcessScheduler", + "DistributedScheduler", + ] +) +def dask_scheduler(request): + # Control Dask to enable a specific scheduler type. + sched_typename = request.param + if sched_typename == "UnspecifiedScheduler": + config_name = None + elif sched_typename == "SingleThreadScheduler": + config_name = "single-threaded" + elif sched_typename == "ThreadedScheduler": + config_name = "threads" + elif sched_typename == "ProcessScheduler": + config_name = "processes" + else: + assert sched_typename == "DistributedScheduler" + config_name = "distributed" + + if config_name == "distributed": + _distributed_client = distributed.Client() + + if config_name is None: + context = None + else: + context = dask.config.set(scheduler=config_name) + context.__enter__() + + yield sched_typename + + if context: + context.__exit__(None, None, None) + + if config_name == "distributed": + _distributed_client.close() + + +def test_dask_scheduler_is_distributed(dask_scheduler): + result = dask_scheduler_is_distributed() + # Should return 'True' only with a distributed scheduler. + expected = dask_scheduler == "DistributedScheduler" + assert result == expected + + +def test_get_dask_array_scheduler_type(dask_scheduler): + result = get_dask_array_scheduler_type() + expected = { + "UnspecifiedScheduler": "threads", + "ThreadedScheduler": "threads", + "ProcessScheduler": "processes", + "SingleThreadScheduler": "single-threaded", + "DistributedScheduler": "distributed", + }[dask_scheduler] + assert result == expected + + +def test_get_worker_lock(dask_scheduler): + test_identity = "" + error = None + try: + result = get_worker_lock(test_identity) + except DaskSchedulerTypeError as err: + error = err + result = None + + if dask_scheduler == "ProcessScheduler": + assert result is None + assert isinstance(error, DaskSchedulerTypeError) + msg = 'scheduler type is "processes", which is not supported' + assert msg in error.args[0] + else: + assert error is None + assert result is not None + if dask_scheduler == "DistributedScheduler": + assert isinstance(result, distributed.Lock) + assert result.name == test_identity + else: + # low-level object doesn't have a readily available class for isinstance + assert all( + hasattr(result, att) + for att in ("acquire", "release", "locked") + ) From 2f4458bdbad24fb30b536161312979332e3f665d Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 21 Apr 2023 10:56:31 +0100 Subject: [PATCH 81/85] Fix attribution names. --- docs/src/whatsnew/latest.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/src/whatsnew/latest.rst b/docs/src/whatsnew/latest.rst index b6a1c05709..24a8210fc6 100644 --- a/docs/src/whatsnew/latest.rst +++ b/docs/src/whatsnew/latest.rst @@ -115,7 +115,8 @@ This document explains the changes made to Iris for this release Whatsnew author names (@github name) in alphabetical order. Note that, core dev names are automatically included by the common_links.inc: - +.. _@fnattino: https://github.com/fnattino +.. _@tinyendian: https://github.com/tinyendian .. comment From 98a20e71c2579adc0000510a0cc27c6aeb89d7dc Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 21 Apr 2023 13:42:08 +0100 Subject: [PATCH 82/85] Fixed new py311 lockfile. --- requirements/locks/py311-linux-64.lock | 531 +++++++++++++------------ 1 file changed, 266 insertions(+), 265 deletions(-) diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index de1002aa65..0ccb00fd74 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -2,268 +2,269 @@ # platform: linux-64 # input_hash: ccc18d7a90c531923e2b547b37cd25694cfbf4e9ec916ee9e8800513d1be3672 @EXPLICIT -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/ca-certificates-2022.12.7-ha878542_0.conda#ff9f73d45c4a07d6f424495288a26080 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/font-ttf-ubuntu-0.83-hab24e00_0.tar.bz2#19410c3df09dfb12d1206132a1d357c5 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libgfortran5-12.2.0-h337968e_19.tar.bz2#164b4b1acaedc47ee7e658ae6b308ca3 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libstdcxx-ng-12.2.0-h46fd767_19.tar.bz2#1030b1f38c129f2634eae026f704fe60 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/python_abi-3.11-3_cp311.conda#c2e2630ddb68cf52eec74dc7dfab20b5 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e3e74d8be4dac89ce83b20de2492a -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libgfortran-ng-12.2.0-h69a702a_19.tar.bz2#cd7a806282c16e1f2d39a7e80d3a3e0d -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libgomp-12.2.0-h65d4601_19.tar.bz2#cedcee7c064c01c403f962c9e8d3c373 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libgcc-ng-12.2.0-h65d4601_19.tar.bz2#e4c94f80aef025c17ab0828cd85ef535 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/alsa-lib-1.2.8-h166bdaf_0.tar.bz2#be733e69048951df1e4b4b7bb8c7666f -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2#d9c69a24ad678ffce24c6543a0176b00 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/bzip2-1.0.8-h7f98852_4.tar.bz2#a1fd65c7ccbf10880423d82bca54eb54 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/c-ares-1.18.1-h7f98852_0.tar.bz2#f26ef8098fab1f719c91eb760d63381a -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/fftw-3.3.10-nompi_hc118613_107.conda#28b2b46b350ddb6a01d061392f75af54 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2#ac7bc6a654f8f41b352b38f4051135f8 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/geos-3.11.2-hcb278e6_0.conda#3b8e364995e3575e57960d29c1e5ab14 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/gettext-0.21.1-h27087fc_0.tar.bz2#14947d8770185e5153fdd04d4673ed37 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/giflib-5.2.1-h0b41bf4_3.conda#96f3b11872ef6fad973eac856cd2624f -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/graphite2-1.3.13-h58526e2_1001.tar.bz2#8c54672728e8ec6aa6db90cf2806d220 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/gstreamer-orc-0.4.33-h166bdaf_0.tar.bz2#879c93426c9d0b84a9de4513fbce5f4f -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/icu-70.1-h27087fc_0.tar.bz2#87473a15119779e021c314249d4b4aed -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/jpeg-9e-h0b41bf4_3.conda#c7a069243e1fbe9a556ed2ec030e6407 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2#a8832b479f93521a9e7b5b743803be51 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libaec-1.0.6-hcb278e6_1.conda#0f683578378cddb223e7fd24f785ab2a -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_8.tar.bz2#9194c9bf9428035a05352d031462eae4 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libdb-6.2.32-h9c3ff4c_0.tar.bz2#3f3258d8f841fbac63b36b75bdac1afd -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libdeflate-1.17-h0b41bf4_0.conda#5cc781fd91968b11a8a7fdbee0982676 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libmo_unpack-3.1.2-hf484d3e_1001.tar.bz2#95f32a6a5a666d33886ca5627239f03d -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libnsl-2.0.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2#6e8cc2173440d77708196c5b93771680 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libopenblas-0.3.21-pthreads_h78a6416_3.tar.bz2#8c5963a49b6035c40646a763293fbb35 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2#15345e56d527b330e1cacbdf58676e8f -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libtool-2.4.7-h27087fc_0.conda#f204c8ba400ec475452737094fb81d52 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libwebp-base-1.2.4-h166bdaf_0.tar.bz2#ac2ccf7323d21f2994e4d1f5da664f37 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libzlib-1.2.13-h166bdaf_4.tar.bz2#f3f9de449d32ca9b9c66a22863c96f41 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/mpg123-1.31.3-hcb278e6_0.conda#141a126675b6d1a4eabb111a4a353898 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/ncurses-6.3-h27087fc_1.tar.bz2#4acfc691e64342b9dae57cf2adc63238 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/openssl-3.1.0-h0b41bf4_0.conda#2d833be81a21128e317325a01326d36f -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/pixman-0.40.0-h36c2ea0_0.tar.bz2#660e72c82f2e75a6b3fe6a6e75c79f19 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/xkeyboard-config-2.38-h0b41bf4_0.conda#9ac34337e5101a87e5d91da05d84aa48 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2#4b230e8381279d76131116660f5a241a -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/xorg-libice-1.0.10-h7f98852_0.tar.bz2#d6b0b50b49eccfe0be0373be628be0f3 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/xorg-libxau-1.0.9-h7f98852_0.tar.bz2#bf6f803a544f26ebbdc3bfff272eb179 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2#be93aabceefa2fac576e971aef407908 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/xorg-renderproto-0.11.1-h7f98852_1002.tar.bz2#06feff3d2634e3097ce2fe681474b534 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda#bce9f945da8ad2ae9b1d7165a64d0f87 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/xxhash-0.8.1-h0b41bf4_0.conda#e9c3bcf0e0c719431abec8ca447eee27 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9b5aca60558d02ddaa09d599e55920 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/jack-1.9.22-h11f4161_0.conda#504fa9e712b99494a9cf4630e3ca7d78 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libblas-3.9.0-16_linux64_openblas.tar.bz2#d9b7a8639171f6c6fa0a983edabcfe2b -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_8.tar.bz2#4ae4d7795d33e02bd20f6b23d91caf82 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_8.tar.bz2#04bac51ba35ea023dc48af73c1c88c25 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libcap-2.67-he9d0100_0.conda#d05556c80caffff164d17bdea0105a1a -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libevent-2.1.10-h28343ad_4.tar.bz2#4a049fc560e00e43151dc51368915fdd -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libflac-1.4.2-h27087fc_0.tar.bz2#7daf72d8e2a8e848e11d63ed6d1026e0 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libgpg-error-1.46-h620e276_0.conda#27e745f6f2e4b757e95dd7225fbe6bdb -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libnghttp2-1.52.0-h61bc06f_0.conda#613955a50485812985c059e7b269f42e -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libsqlite-3.40.0-h753d276_0.tar.bz2#2e5f9a37d487e1019fd4d8113adb2f9f -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libssh2-1.10.0-hf14f497_3.tar.bz2#d85acad4b47dff4e3def14a769a97906 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2#309dec04b70a3cc0f1e84a4013683bc0 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libxcb-1.13-h7f98852_1004.tar.bz2#b3653fdc58d03face9724f602218a904 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libxml2-2.10.3-hca2bb57_4.conda#bb808b654bdc3c783deaf107a2ffb503 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libzip-1.9.2-hc929e4a_1.tar.bz2#5b122b50e738c4be5c3f2899f010d7cf -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/mysql-common-8.0.32-ha901b37_1.conda#2c18a7a26ec0d0c23a917f37a65fc9a2 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/pcre2-10.40-hc3806b6_0.tar.bz2#69e2c796349cd9b273890bee0febfe1b -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/xorg-libsm-1.2.3-hd9c2040_1000.tar.bz2#9e856f78d5c80d5a78f61e72d1d473a3 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/zlib-1.2.13-h166bdaf_4.tar.bz2#4b11e365c0275b808be78b30f904e295 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/zstd-1.5.2-h3eb15da_6.conda#6b63daed8feeca47be78f323e793d555 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_8.tar.bz2#e5613f2bc717e9945840ff474419b8e4 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/hdf4-4.2.15-h9772cbc_5.tar.bz2#ee08782aff2ff9b3291c967fa6bc7336 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/krb5-1.20.1-h81ceb04_0.conda#89a41adce7106749573d883b2f657d78 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libcblas-3.9.0-16_linux64_openblas.tar.bz2#20bae26d0a1db73f758fc3754cab4719 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libgcrypt-1.10.1-h166bdaf_0.tar.bz2#f967fc95089cd247ceed56eda31de3a9 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libglib-2.76.1-ha491796_0.conda#984fc0159591041a411d96718e7073d0 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/liblapack-3.9.0-16_linux64_openblas.tar.bz2#955d993f41f9354bf753d29864ea20ad -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libllvm15-15.0.7-hadd5161_1.conda#17d91085ccf5934ce652cb448d0cb65a -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libsndfile-1.2.0-hb75c966_0.conda#c648d19cd9c8625898d5d370414de7c7 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libtiff-4.5.0-h6adf6a1_2.conda#2e648a34072eb39d7c4fc2a9981c5f0c -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libudev1-253-h0b41bf4_1.conda#bb38b19a41bb94e8a19dbfb062d499c7 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libxkbcommon-1.5.0-h79f4944_1.conda#04a39cdd663f295653fc143851830563 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/mysql-libs-8.0.32-hd7da12d_1.conda#a69fa6f218cfed8e2d61753eeacaf034 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/nss-3.89-he45b914_0.conda#2745719a58eeaab6657256a3f142f099 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/python-3.11.3-h2755cc3_0_cpython.conda#37005ea5f68df6a8a381b70cf4d4a160 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/sqlite-3.40.0-h4ff8645_0.tar.bz2#bb11803129cbbb53ed56f9506ff74145 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/xcb-util-0.4.0-h166bdaf_0.tar.bz2#384e7fcb3cd162ba3e4aed4b687df566 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h166bdaf_0.tar.bz2#637054603bb7594302e3bf83f0a99879 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/xcb-util-renderutil-0.3.9-h166bdaf_0.tar.bz2#732e22f1741bccea861f5668cf7342a7 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/xcb-util-wm-0.4.1-h166bdaf_0.tar.bz2#0a8e20a8aef954390b9481a527421a8c -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/xorg-libx11-1.8.4-h0b41bf4_0.conda#ea8fbfeb976ac49cbeb594e985393514 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/alabaster-0.7.13-pyhd8ed1ab_0.conda#06006184e203b61d3525f90de394471e -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/antlr-python-runtime-4.7.2-py311h38be061_1003.tar.bz2#0ab8f8f0cae99343907fe68cda11baea -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2#6c72ec3e660a51736913ef6ea68c454b -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/brotli-1.0.9-h166bdaf_8.tar.bz2#2ff08978892a3e8b954397c461f18418 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/certifi-2022.12.7-pyhd8ed1ab_0.conda#fb9addc3db06e56abe03e0e9f21a63e6 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/charset-normalizer-3.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/click-8.1.3-unix_pyhd8ed1ab_2.tar.bz2#20e4087407c7cb04a40817114b333dbf -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/distlib-0.3.6-pyhd8ed1ab_0.tar.bz2#b65b4d50dbd2d50fa0aeac367ec9eed7 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/docutils-0.19-py311h38be061_1.tar.bz2#599159b0740e9b82e7eef0e8471be3c2 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/exceptiongroup-1.1.1-pyhd8ed1ab_0.conda#7312299d7a0ea4993159229b7d2dceb2 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/execnet-1.9.0-pyhd8ed1ab_0.tar.bz2#0e521f7a5e60d508b121d38b04874fb2 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/filelock-3.12.0-pyhd8ed1ab_0.conda#650f18a56f366dbf419c15b543592c2d -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/fsspec-2023.4.0-pyh1a96a4e_0.conda#a993e42df87a292d8fd7396a2e2a8d75 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/gdk-pixbuf-2.42.10-h05c8ddd_0.conda#1a109126a43003d65b39c1cad656bc9b -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/glib-tools-2.76.1-h3eb15da_0.conda#d8a63539d6c1545427048996575df763 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/gts-0.7.6-h64030ff_2.tar.bz2#112eb9b5b93f0c02e59aea4fd1967363 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/iris-sample-data-2.4.0-pyhd8ed1ab_0.tar.bz2#18ee9c07cf945a33f92caf1ee3d23ad9 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/kiwisolver-1.4.4-py311h4dd048b_1.tar.bz2#46d451f575392c01dc193069bd89766d -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/lcms2-2.15-hfd0df8a_0.conda#aa8840cdf17ef0c6084d1e24abc7a28b -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libclang13-15.0.7-default_h3e3d535_1.conda#a3a0f7a6f0885f5e1e0ec691566afb77 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libcups-2.3.3-h36d4200_3.conda#c9f4416a34bc91e0eb029f912c68f81f -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libcurl-8.0.1-h588be90_0.conda#b635278a73eb67edcfba7d01a6b48a03 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libpq-15.2-hb675445_0.conda#4654b17eccaba55b8581d6b9c77f53cc -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libsystemd0-253-h8c4010b_1.conda#9176b1e2cb8beca37a7510b0e801e38f -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libwebp-1.2.4-h1daa5a0_1.conda#77003f63d1763c1e6569a02c1742c9f4 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/markupsafe-2.1.2-py311h2582759_0.conda#adb20bd57069614552adac60a020c36d -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/numpy-1.24.2-py311h8e6699e_0.conda#90db8cc0dfa20853329bfc6642f887aa -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/pluggy-1.0.0-pyhd8ed1ab_5.tar.bz2#7d301a0d25f424d96175f810935f0da9 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/ply-3.11-py_1.tar.bz2#7205635cd71531943440fbfe3b6b5727 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/psutil-5.9.5-py311h2582759_0.conda#a90f8e278c1cd7064b2713e6b7db87e6 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/pygments-2.15.1-pyhd8ed1ab_0.conda#d316679235612869eba305aa7d41d9bf -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2#e8fbc1b54b25f4b08281467bc13b70cc -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/python-tzdata-2023.3-pyhd8ed1ab_0.conda#2590495f608a63625e165915fb4e2e34 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/python-xxhash-3.2.0-py311h2582759_0.conda#dfcc3e6e30d6ec2b2bb416fcd8ff4dc1 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/pytz-2023.3-pyhd8ed1ab_0.conda#d3076b483092a435832603243567bc31 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/pyyaml-6.0-py311hd4cff14_5.tar.bz2#da8769492e423103c59f469f4f17f8d9 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/setuptools-67.7.1-pyhd8ed1ab_0.conda#82bd3ef4e96ced7384f34ab01ece65b6 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2#146f4541d643d48fc8a75cacf69f03ae -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/sphinxcontrib-applehelp-1.0.4-pyhd8ed1ab_0.conda#5a31a7d564f551d0e6dff52fd8cb5b16 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/sphinxcontrib-devhelp-1.0.2-py_0.tar.bz2#68e01cac9d38d0e717cd5c87bc3d2cc9 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.1-pyhd8ed1ab_0.conda#6c8c4d6eb2325e59290ac6dbbeacd5f0 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-py_0.tar.bz2#67cd9d9c0382d37479b4d306c369a2d4 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/sphinxcontrib-qthelp-1.0.3-py_0.tar.bz2#d01180388e6d1838c3e1ad029590aa7a -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.5-pyhd8ed1ab_2.tar.bz2#9ff55a0901cf952f05c654394de76bf7 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/tornado-6.3-py311h2582759_0.conda#632f11a4c1c3f23ef34aa60e6f496375 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/typing_extensions-4.5.0-pyha770c72_0.conda#43e7d9e50261fb11deb76e17d8431aac -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49bb0d9e60ce1db25e151780331bb5f3 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/xcb-util-image-0.4.0-h166bdaf_0.tar.bz2#c9b568bd804cb2903c6be6f5f68182e4 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/xorg-libxrender-0.9.10-h7f98852_1003.tar.bz2#f59c1242cc1dd93e72c2ee2b360979eb -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda#46a2e6e3dfa718ce3492018d5a110dd6 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/babel-2.12.1-pyhd8ed1ab_1.conda#ac432e732804a81ddcf29c92ead57cde -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/beautifulsoup4-4.12.2-pyha770c72_0.conda#a362ff7d976217f8fa78c0f1c4f59717 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/cairo-1.16.0-ha61ee94_1014.tar.bz2#d1a88f3ed5b52e1024b80d4bcd26a7a0 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/cffi-1.15.1-py311h409f033_3.conda#9025d0786dbbe4bc91fd8e85502decce -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/cftime-1.6.2-py311h4c7f6c3_1.tar.bz2#c7e54004ffd03f8db0a58ab949f2a00b -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/contourpy-1.0.7-py311ha3edf6b_0.conda#e7548e7f58965a2fe97a95950a5fedc6 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/coverage-7.2.3-py311h2582759_0.conda#d34c18fc691a04471ff3460b2d15d19e -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/curl-8.0.1-h588be90_0.conda#69691e828381dd12df671c26b680f1b0 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/fonttools-4.39.3-py311h2582759_0.conda#55741f37ab19d949b8e7316cfe286824 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/glib-2.76.1-h3eb15da_0.conda#a7db5e3525875444b5a5868f553ab39a -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/hdf5-1.12.2-nompi_h4df4325_101.conda#162a25904af6586b234b2dd52ee99c61 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/importlib-metadata-6.5.0-pyha770c72_0.conda#ab2f9216e346f43599af3f7839931da1 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libclang-15.0.7-default_had23c3d_1.conda#36c65ed73b7c92589bd9562ef8a6023d -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libgd-2.3.3-h5aea950_4.conda#82ef57611ace65b59db35a9687264572 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/mo_pack-0.2.0-py311h4c7f6c3_1008.tar.bz2#5998dff78c3b82a07ad77f2ae1ec1c44 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/nodeenv-1.7.0-pyhd8ed1ab_0.tar.bz2#fbe1182f650c04513046d6894046cd6c -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/partd-1.4.0-pyhd8ed1ab_0.conda#721dab5803ea92ce02ddc4ee50aa0c48 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/pillow-9.4.0-py311h50def17_1.conda#8b5d1da23907114bd7aa3d562150ff36 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/pip-23.1-pyhd8ed1ab_0.conda#9ccbacfd1cbfa0be00cc345fe5ad8816 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/proj-9.2.0-h8ffa02c_0.conda#8b9dcfabec5c6bcac98e89889fffa64e -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/pulseaudio-client-16.1-h5195f5e_3.conda#caeb3302ef1dc8b342b20c710a86f8a9 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/python-stratify-0.2.post0-py311h4c7f6c3_3.tar.bz2#c80bb7d84571b843a628f27fe47addf9 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/pywavelets-1.4.1-py311hcb2cf0a_0.conda#272ca0c28df344037ba2c4982d4e4791 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/shapely-2.0.1-py311h54d622a_1.conda#a894c65b48676c4973e9ee8b59bceb9e -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/sip-6.7.9-py311hb755f60_0.conda#2b5430f2f1651f460c852e1fdd549184 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/typing-extensions-4.5.0-hd8ed1ab_0.conda#b3c594fde1a80a1fc3eb9cc4a5dfe392 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/brotlipy-0.7.0-py311hd4cff14_1005.tar.bz2#9bdac7084ecfc08338bae1b976535724 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/cf-units-3.2.0-py311hcb2cf0a_0.conda#063a136fefba5ea0df36f9de0a9d0e30 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/cryptography-40.0.2-py311h9b4c7bb_0.conda#4df4df92db0b9168c11b72460baec870 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/gstreamer-1.22.0-h25f0c4b_2.conda#461541cb1b387c2a28ab6217f3d38502 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/harfbuzz-6.0.0-h8e241bc_0.conda#448fe40d2fed88ccf4d9ded37cbb2b38 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/importlib_metadata-6.5.0-hd8ed1ab_0.conda#24bfc0314deeea53d54c71de2b436ed6 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/libnetcdf-4.8.1-nompi_h261ec11_106.tar.bz2#9b25de670ce5753a33c18b1090d1d3bf -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/matplotlib-base-3.7.1-py311h8597a09_0.conda#70c3b734ffe82c16b6d121aaa11929a8 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/pandas-2.0.0-py311h2872171_0.conda#f987f61faa256eace0d74ca491ab88c7 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/platformdirs-3.2.0-pyhd8ed1ab_0.conda#f10c2cf447ca96f12a326b83c75b8e33 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/pulseaudio-daemon-16.1-ha8d29e2_3.conda#34d9d75ca896f5919c372a34e25f23ea -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/pyproj-3.5.0-py311h1850bce_1.conda#572159a946b809df471b11db4995c708 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/pyqt5-sip-12.11.0-py311hcafe171_3.conda#0d79df2a96f6572fed2883374400b235 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/pytest-7.3.1-pyhd8ed1ab_0.conda#547c7de697ec99b494a28ddde185b5a4 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/setuptools-scm-7.1.0-pyhd8ed1ab_0.conda#6613dbb3b25cc648a107f33ca9f80fc1 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/ukkonen-1.0.1-py311h4dd048b_3.tar.bz2#dbfea4376856bf7bd2121e719cf816e5 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/dask-core-2023.4.0-pyhd8ed1ab_0.conda#afe2978fcd8f15149452cdad37aebbfa -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/gst-plugins-base-1.22.0-h4243ec0_2.conda#0d0c6604c8ac4ad5e51efa7bb58da05c -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/identify-2.5.22-pyhd8ed1ab_0.conda#b8d16e273396a0115199a83769a39246 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/netcdf-fortran-4.6.0-nompi_he1eeb6f_102.conda#d9679b28fcc2154fa63e814c5acdce57 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/netcdf4-1.6.2-nompi_py311hc6fcf29_100.tar.bz2#1ef39f477192bf05df04fb5ad594e82d -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/pango-1.50.14-hd33c08f_0.conda#a8b9e35dd7be2c945b0de4fe19a7c3a9 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/pulseaudio-16.1-hcb278e6_3.conda#8b452ab959166d91949af4c2d28f81db -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/pyopenssl-23.1.1-pyhd8ed1ab_0.conda#0b34aa3ab7e7ccb1765a03dd9ed29938 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/pytest-cov-4.0.0-pyhd8ed1ab_0.tar.bz2#c9e3f8bfdb9bfc34aa1836a6ed4b25d7 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/pytest-xdist-3.2.1-pyhd8ed1ab_0.conda#6fe4c2689d1b10fec1ee65819f0c4fd5 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/virtualenv-20.22.0-pyhd8ed1ab_0.conda#054007ab693cb77a029ea4f1f12f34a7 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/esmf-8.4.0-nompi_hdb2cfa9_4.conda#3e2e1d0cd06d1b64c9c2800c0eb0cde6 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/gtk2-2.24.33-h90689f9_2.tar.bz2#957a0255ab58aaf394a91725d73ab422 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/librsvg-2.54.4-h7abd40a_0.tar.bz2#921e53675ed5ea352f022b79abab076a -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/pre-commit-3.2.2-pyha770c72_0.conda#c4aab94cab4ddeb340e36d4c670a5f24 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/qt-main-5.15.8-h5d23da1_6.conda#59c73debd9405771690ddbbad6c57b69 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/urllib3-1.26.15-pyhd8ed1ab_0.conda#27db656619a55d727eaf5a6ece3d2fd6 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/esmpy-8.4.0-nompi_py311h8e2db7d_2.conda#18fa0582166979a77413859eed97d667 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/graphviz-7.1.0-h2e5815a_0.conda#e7ecda996c443142a0e9c379f3b28e48 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/pyqt-5.15.7-py311ha74522f_3.conda#ad6dd0bed0cdf5f2d4eb2b989d6253b3 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_1.conda#3bfbd6ead1d7299ed46dab3a7bf0bc8c -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/matplotlib-3.7.1-py311h38be061_0.conda#8fd462c8bcbba5a3affcb2d04e387476 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/sphinx-5.3.0-pyhd8ed1ab_0.tar.bz2#f9e1fcfe235d655900bfeb6aee426472 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/pydata-sphinx-theme-0.13.3-pyhd8ed1ab_0.conda#07aca5f2dea315dcc16680d6891e9056 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/scipy-1.10.1-py311h8e6699e_0.conda#a9dba1242a54275e4914a2540f4eb233 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/sphinx-copybutton-0.5.2-pyhd8ed1ab_0.conda#ac832cc43adc79118cf6e23f1f9b8995 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/sphinx-design-0.4.1-pyhd8ed1ab_0.conda#14a64286fe896fe7e1a485fc91ccd022 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/sphinx-gallery-0.13.0-pyhd8ed1ab_0.conda#26c51b97ce59bbcce6a35ff45bc5c900 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/linux-64/cartopy-0.21.1-py311hd88b842_1.conda#f19feb9440890ccb806a367ea9ae0654 -https://metoffice.jfrog.io/metoffice/api/conda/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a +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-2022.12.7-ha878542_0.conda#ff9f73d45c4a07d6f424495288a26080 +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 +https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-hab24e00_0.tar.bz2#19410c3df09dfb12d1206132a1d357c5 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda#7aca3059a1729aa76c597603f10b0dd3 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-12.2.0-h337968e_19.tar.bz2#164b4b1acaedc47ee7e658ae6b308ca3 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-12.2.0-h46fd767_19.tar.bz2#1030b1f38c129f2634eae026f704fe60 +https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.11-3_cp311.conda#c2e2630ddb68cf52eec74dc7dfab20b5 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2023c-h71feb2d_0.conda#939e3e74d8be4dac89ce83b20de2492a +https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-12.2.0-h69a702a_19.tar.bz2#cd7a806282c16e1f2d39a7e80d3a3e0d +https://conda.anaconda.org/conda-forge/linux-64/libgomp-12.2.0-h65d4601_19.tar.bz2#cedcee7c064c01c403f962c9e8d3c373 +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-12.2.0-h65d4601_19.tar.bz2#e4c94f80aef025c17ab0828cd85ef535 +https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.8-h166bdaf_0.tar.bz2#be733e69048951df1e4b4b7bb8c7666f +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-h7f98852_4.tar.bz2#a1fd65c7ccbf10880423d82bca54eb54 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.18.1-h7f98852_0.tar.bz2#f26ef8098fab1f719c91eb760d63381a +https://conda.anaconda.org/conda-forge/linux-64/fftw-3.3.10-nompi_hc118613_107.conda#28b2b46b350ddb6a01d061392f75af54 +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/geos-3.11.2-hcb278e6_0.conda#3b8e364995e3575e57960d29c1e5ab14 +https://conda.anaconda.org/conda-forge/linux-64/gettext-0.21.1-h27087fc_0.tar.bz2#14947d8770185e5153fdd04d4673ed37 +https://conda.anaconda.org/conda-forge/linux-64/giflib-5.2.1-h0b41bf4_3.conda#96f3b11872ef6fad973eac856cd2624f +https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h58526e2_1001.tar.bz2#8c54672728e8ec6aa6db90cf2806d220 +https://conda.anaconda.org/conda-forge/linux-64/gstreamer-orc-0.4.33-h166bdaf_0.tar.bz2#879c93426c9d0b84a9de4513fbce5f4f +https://conda.anaconda.org/conda-forge/linux-64/icu-70.1-h27087fc_0.tar.bz2#87473a15119779e021c314249d4b4aed +https://conda.anaconda.org/conda-forge/linux-64/jpeg-9e-h0b41bf4_3.conda#c7a069243e1fbe9a556ed2ec030e6407 +https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 +https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2#a8832b479f93521a9e7b5b743803be51 +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/libaec-1.0.6-hcb278e6_1.conda#0f683578378cddb223e7fd24f785ab2a +https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.0.9-h166bdaf_8.tar.bz2#9194c9bf9428035a05352d031462eae4 +https://conda.anaconda.org/conda-forge/linux-64/libdb-6.2.32-h9c3ff4c_0.tar.bz2#3f3258d8f841fbac63b36b75bdac1afd +https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.17-h0b41bf4_0.conda#5cc781fd91968b11a8a7fdbee0982676 +https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-h516909a_1.tar.bz2#6f8720dff19e17ce5d48cfe7f3d2f0a3 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda#6305a3dd2752c76335295da4e581f2fd +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/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d +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/libnsl-2.0.0-h7f98852_0.tar.bz2#39b1328babf85c7c3a61636d9cd50206 +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/libopenblas-0.3.21-pthreads_h78a6416_3.tar.bz2#8c5963a49b6035c40646a763293fbb35 +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/libtool-2.4.7-h27087fc_0.conda#f204c8ba400ec475452737094fb81d52 +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.2.4-h166bdaf_0.tar.bz2#ac2ccf7323d21f2994e4d1f5da664f37 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-h166bdaf_4.tar.bz2#f3f9de449d32ca9b9c66a22863c96f41 +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.31.3-hcb278e6_0.conda#141a126675b6d1a4eabb111a4a353898 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.3-h27087fc_1.tar.bz2#4acfc691e64342b9dae57cf2adc63238 +https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.0-h0b41bf4_0.conda#2d833be81a21128e317325a01326d36f +https://conda.anaconda.org/conda-forge/linux-64/pixman-0.40.0-h36c2ea0_0.tar.bz2#660e72c82f2e75a6b3fe6a6e75c79f19 +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/xkeyboard-config-2.38-h0b41bf4_0.conda#9ac34337e5101a87e5d91da05d84aa48 +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.0.10-h7f98852_0.tar.bz2#d6b0b50b49eccfe0be0373be628be0f3 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.9-h7f98852_0.tar.bz2#bf6f803a544f26ebbdc3bfff272eb179 +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-renderproto-0.11.1-h7f98852_1002.tar.bz2#06feff3d2634e3097ce2fe681474b534 +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-xproto-7.0.31-h7f98852_1007.tar.bz2#b4a4381d54784606820704f7b5f05a15 +https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.1-h0b41bf4_0.conda#e9c3bcf0e0c719431abec8ca447eee27 +https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae +https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9b5aca60558d02ddaa09d599e55920 +https://conda.anaconda.org/conda-forge/linux-64/jack-1.9.22-h11f4161_0.conda#504fa9e712b99494a9cf4630e3ca7d78 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-16_linux64_openblas.tar.bz2#d9b7a8639171f6c6fa0a983edabcfe2b +https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.0.9-h166bdaf_8.tar.bz2#4ae4d7795d33e02bd20f6b23d91caf82 +https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.0.9-h166bdaf_8.tar.bz2#04bac51ba35ea023dc48af73c1c88c25 +https://conda.anaconda.org/conda-forge/linux-64/libcap-2.67-he9d0100_0.conda#d05556c80caffff164d17bdea0105a1a +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/libevent-2.1.10-h28343ad_4.tar.bz2#4a049fc560e00e43151dc51368915fdd +https://conda.anaconda.org/conda-forge/linux-64/libflac-1.4.2-h27087fc_0.tar.bz2#7daf72d8e2a8e848e11d63ed6d1026e0 +https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.46-h620e276_0.conda#27e745f6f2e4b757e95dd7225fbe6bdb +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.52.0-h61bc06f_0.conda#613955a50485812985c059e7b269f42e +https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.40.0-h753d276_0.tar.bz2#2e5f9a37d487e1019fd4d8113adb2f9f +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.10.0-hf14f497_3.tar.bz2#d85acad4b47dff4e3def14a769a97906 +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/libxcb-1.13-h7f98852_1004.tar.bz2#b3653fdc58d03face9724f602218a904 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.10.3-hca2bb57_4.conda#bb808b654bdc3c783deaf107a2ffb503 +https://conda.anaconda.org/conda-forge/linux-64/libzip-1.9.2-hc929e4a_1.tar.bz2#5b122b50e738c4be5c3f2899f010d7cf +https://conda.anaconda.org/conda-forge/linux-64/mysql-common-8.0.32-ha901b37_1.conda#2c18a7a26ec0d0c23a917f37a65fc9a2 +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.40-hc3806b6_0.tar.bz2#69e2c796349cd9b273890bee0febfe1b +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.12-h27826a3_0.tar.bz2#5b8c42eb62e9fc961af70bdd6a26e168 +https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.3-hd9c2040_1000.tar.bz2#9e856f78d5c80d5a78f61e72d1d473a3 +https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-h166bdaf_4.tar.bz2#4b11e365c0275b808be78b30f904e295 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.2-h3eb15da_6.conda#6b63daed8feeca47be78f323e793d555 +https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.0.9-h166bdaf_8.tar.bz2#e5613f2bc717e9945840ff474419b8e4 +https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-hca18f0e_1.conda#e1232042de76d24539a436d37597eb06 +https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h9772cbc_5.tar.bz2#ee08782aff2ff9b3291c967fa6bc7336 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.20.1-h81ceb04_0.conda#89a41adce7106749573d883b2f657d78 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-16_linux64_openblas.tar.bz2#20bae26d0a1db73f758fc3754cab4719 +https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.10.1-h166bdaf_0.tar.bz2#f967fc95089cd247ceed56eda31de3a9 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.76.1-ha491796_0.conda#984fc0159591041a411d96718e7073d0 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-16_linux64_openblas.tar.bz2#955d993f41f9354bf753d29864ea20ad +https://conda.anaconda.org/conda-forge/linux-64/libllvm15-15.0.7-hadd5161_1.conda#17d91085ccf5934ce652cb448d0cb65a +https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.0-hb75c966_0.conda#c648d19cd9c8625898d5d370414de7c7 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.5.0-h6adf6a1_2.conda#2e648a34072eb39d7c4fc2a9981c5f0c +https://conda.anaconda.org/conda-forge/linux-64/libudev1-253-h0b41bf4_1.conda#bb38b19a41bb94e8a19dbfb062d499c7 +https://conda.anaconda.org/conda-forge/linux-64/libxkbcommon-1.5.0-h79f4944_1.conda#04a39cdd663f295653fc143851830563 +https://conda.anaconda.org/conda-forge/linux-64/mysql-libs-8.0.32-hd7da12d_1.conda#a69fa6f218cfed8e2d61753eeacaf034 +https://conda.anaconda.org/conda-forge/linux-64/nss-3.89-he45b914_0.conda#2745719a58eeaab6657256a3f142f099 +https://conda.anaconda.org/conda-forge/linux-64/python-3.11.3-h2755cc3_0_cpython.conda#37005ea5f68df6a8a381b70cf4d4a160 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.40.0-h4ff8645_0.tar.bz2#bb11803129cbbb53ed56f9506ff74145 +https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-hc3e0081_0.tar.bz2#d4c341e0379c31e9e781d4f204726867 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-0.4.0-h166bdaf_0.tar.bz2#384e7fcb3cd162ba3e4aed4b687df566 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-keysyms-0.4.0-h166bdaf_0.tar.bz2#637054603bb7594302e3bf83f0a99879 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-renderutil-0.3.9-h166bdaf_0.tar.bz2#732e22f1741bccea861f5668cf7342a7 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-wm-0.4.1-h166bdaf_0.tar.bz2#0a8e20a8aef954390b9481a527421a8c +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.4-h0b41bf4_0.conda#ea8fbfeb976ac49cbeb594e985393514 +https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.13-pyhd8ed1ab_0.conda#06006184e203b61d3525f90de394471e +https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py311h38be061_1003.tar.bz2#0ab8f8f0cae99343907fe68cda11baea +https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2#6c72ec3e660a51736913ef6ea68c454b +https://conda.anaconda.org/conda-forge/linux-64/brotli-1.0.9-h166bdaf_8.tar.bz2#2ff08978892a3e8b954397c461f18418 +https://conda.anaconda.org/conda-forge/noarch/certifi-2022.12.7-pyhd8ed1ab_0.conda#fb9addc3db06e56abe03e0e9f21a63e6 +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.1.0-pyhd8ed1ab_0.conda#7fcff9f6f123696e940bda77bd4d6551 +https://conda.anaconda.org/conda-forge/noarch/click-8.1.3-unix_pyhd8ed1ab_2.tar.bz2#20e4087407c7cb04a40817114b333dbf +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 +https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 +https://conda.anaconda.org/conda-forge/noarch/cycler-0.11.0-pyhd8ed1ab_0.tar.bz2#a50559fad0affdbb33729a68669ca1cb +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.6-pyhd8ed1ab_0.tar.bz2#b65b4d50dbd2d50fa0aeac367ec9eed7 +https://conda.anaconda.org/conda-forge/linux-64/docutils-0.19-py311h38be061_1.tar.bz2#599159b0740e9b82e7eef0e8471be3c2 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.1-pyhd8ed1ab_0.conda#7312299d7a0ea4993159229b7d2dceb2 +https://conda.anaconda.org/conda-forge/noarch/execnet-1.9.0-pyhd8ed1ab_0.tar.bz2#0e521f7a5e60d508b121d38b04874fb2 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.0-pyhd8ed1ab_0.conda#650f18a56f366dbf419c15b543592c2d +https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d +https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.4.0-pyh1a96a4e_0.conda#a993e42df87a292d8fd7396a2e2a8d75 +https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h05c8ddd_0.conda#1a109126a43003d65b39c1cad656bc9b +https://conda.anaconda.org/conda-forge/linux-64/glib-tools-2.76.1-h3eb15da_0.conda#d8a63539d6c1545427048996575df763 +https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h64030ff_2.tar.bz2#112eb9b5b93f0c02e59aea4fd1967363 +https://conda.anaconda.org/conda-forge/noarch/idna-3.4-pyhd8ed1ab_0.tar.bz2#34272b248891bddccc64479f9a7fffed +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.4-py311h4dd048b_1.tar.bz2#46d451f575392c01dc193069bd89766d +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-hfd0df8a_0.conda#aa8840cdf17ef0c6084d1e24abc7a28b +https://conda.anaconda.org/conda-forge/linux-64/libclang13-15.0.7-default_h3e3d535_1.conda#a3a0f7a6f0885f5e1e0ec691566afb77 +https://conda.anaconda.org/conda-forge/linux-64/libcups-2.3.3-h36d4200_3.conda#c9f4416a34bc91e0eb029f912c68f81f +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.0.1-h588be90_0.conda#b635278a73eb67edcfba7d01a6b48a03 +https://conda.anaconda.org/conda-forge/linux-64/libpq-15.2-hb675445_0.conda#4654b17eccaba55b8581d6b9c77f53cc +https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-253-h8c4010b_1.conda#9176b1e2cb8beca37a7510b0e801e38f +https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.2.4-h1daa5a0_1.conda#77003f63d1763c1e6569a02c1742c9f4 +https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 +https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.2-py311h2582759_0.conda#adb20bd57069614552adac60a020c36d +https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 +https://conda.anaconda.org/conda-forge/linux-64/numpy-1.24.2-py311h8e6699e_0.conda#90db8cc0dfa20853329bfc6642f887aa +https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea +https://conda.anaconda.org/conda-forge/noarch/packaging-23.1-pyhd8ed1ab_0.conda#91cda59e66e1e4afe9476f8ef98f5c30 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.0.0-pyhd8ed1ab_5.tar.bz2#7d301a0d25f424d96175f810935f0da9 +https://conda.anaconda.org/conda-forge/noarch/ply-3.11-py_1.tar.bz2#7205635cd71531943440fbfe3b6b5727 +https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.5-py311h2582759_0.conda#a90f8e278c1cd7064b2713e6b7db87e6 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff +https://conda.anaconda.org/conda-forge/noarch/pygments-2.15.1-pyhd8ed1ab_0.conda#d316679235612869eba305aa7d41d9bf +https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.0.9-pyhd8ed1ab_0.tar.bz2#e8fbc1b54b25f4b08281467bc13b70cc +https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 +https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2023.3-pyhd8ed1ab_0.conda#2590495f608a63625e165915fb4e2e34 +https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.2.0-py311h2582759_0.conda#dfcc3e6e30d6ec2b2bb416fcd8ff4dc1 +https://conda.anaconda.org/conda-forge/noarch/pytz-2023.3-pyhd8ed1ab_0.conda#d3076b483092a435832603243567bc31 +https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py311hd4cff14_5.tar.bz2#da8769492e423103c59f469f4f17f8d9 +https://conda.anaconda.org/conda-forge/noarch/setuptools-67.7.1-pyhd8ed1ab_0.conda#82bd3ef4e96ced7384f34ab01ece65b6 +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/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2#146f4541d643d48fc8a75cacf69f03ae +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.4-pyhd8ed1ab_0.conda#5a31a7d564f551d0e6dff52fd8cb5b16 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.2-py_0.tar.bz2#68e01cac9d38d0e717cd5c87bc3d2cc9 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.1-pyhd8ed1ab_0.conda#6c8c4d6eb2325e59290ac6dbbeacd5f0 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-py_0.tar.bz2#67cd9d9c0382d37479b4d306c369a2d4 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.3-py_0.tar.bz2#d01180388e6d1838c3e1ad029590aa7a +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.5-pyhd8ed1ab_2.tar.bz2#9ff55a0901cf952f05c654394de76bf7 +https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 +https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 +https://conda.anaconda.org/conda-forge/linux-64/tornado-6.3-py311h2582759_0.conda#632f11a4c1c3f23ef34aa60e6f496375 +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.5.0-pyha770c72_0.conda#43e7d9e50261fb11deb76e17d8431aac +https://conda.anaconda.org/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49bb0d9e60ce1db25e151780331bb5f3 +https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h166bdaf_0.tar.bz2#c9b568bd804cb2903c6be6f5f68182e4 +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-libxrender-0.9.10-h7f98852_1003.tar.bz2#f59c1242cc1dd93e72c2ee2b360979eb +https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf +https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda#46a2e6e3dfa718ce3492018d5a110dd6 +https://conda.anaconda.org/conda-forge/noarch/babel-2.12.1-pyhd8ed1ab_1.conda#ac432e732804a81ddcf29c92ead57cde +https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.2-pyha770c72_0.conda#a362ff7d976217f8fa78c0f1c4f59717 +https://conda.anaconda.org/conda-forge/linux-64/cairo-1.16.0-ha61ee94_1014.tar.bz2#d1a88f3ed5b52e1024b80d4bcd26a7a0 +https://conda.anaconda.org/conda-forge/linux-64/cffi-1.15.1-py311h409f033_3.conda#9025d0786dbbe4bc91fd8e85502decce +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py311h4c7f6c3_1.tar.bz2#c7e54004ffd03f8db0a58ab949f2a00b +https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.7-py311ha3edf6b_0.conda#e7548e7f58965a2fe97a95950a5fedc6 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.2.3-py311h2582759_0.conda#d34c18fc691a04471ff3460b2d15d19e +https://conda.anaconda.org/conda-forge/linux-64/curl-8.0.1-h588be90_0.conda#69691e828381dd12df671c26b680f1b0 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.39.3-py311h2582759_0.conda#55741f37ab19d949b8e7316cfe286824 +https://conda.anaconda.org/conda-forge/linux-64/glib-2.76.1-h3eb15da_0.conda#a7db5e3525875444b5a5868f553ab39a +https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h4df4325_101.conda#162a25904af6586b234b2dd52ee99c61 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.5.0-pyha770c72_0.conda#ab2f9216e346f43599af3f7839931da1 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 +https://conda.anaconda.org/conda-forge/linux-64/libclang-15.0.7-default_had23c3d_1.conda#36c65ed73b7c92589bd9562ef8a6023d +https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h5aea950_4.conda#82ef57611ace65b59db35a9687264572 +https://conda.anaconda.org/conda-forge/linux-64/mo_pack-0.2.0-py311h4c7f6c3_1008.tar.bz2#5998dff78c3b82a07ad77f2ae1ec1c44 +https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.7.0-pyhd8ed1ab_0.tar.bz2#fbe1182f650c04513046d6894046cd6c +https://conda.anaconda.org/conda-forge/noarch/partd-1.4.0-pyhd8ed1ab_0.conda#721dab5803ea92ce02ddc4ee50aa0c48 +https://conda.anaconda.org/conda-forge/linux-64/pillow-9.4.0-py311h50def17_1.conda#8b5d1da23907114bd7aa3d562150ff36 +https://conda.anaconda.org/conda-forge/noarch/pip-23.1-pyhd8ed1ab_0.conda#9ccbacfd1cbfa0be00cc345fe5ad8816 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.2.0-h8ffa02c_0.conda#8b9dcfabec5c6bcac98e89889fffa64e +https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-16.1-h5195f5e_3.conda#caeb3302ef1dc8b342b20c710a86f8a9 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 +https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.2.post0-py311h4c7f6c3_3.tar.bz2#c80bb7d84571b843a628f27fe47addf9 +https://conda.anaconda.org/conda-forge/linux-64/pywavelets-1.4.1-py311hcb2cf0a_0.conda#272ca0c28df344037ba2c4982d4e4791 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py311h54d622a_1.conda#a894c65b48676c4973e9ee8b59bceb9e +https://conda.anaconda.org/conda-forge/linux-64/sip-6.7.9-py311hb755f60_0.conda#2b5430f2f1651f460c852e1fdd549184 +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.5.0-hd8ed1ab_0.conda#b3c594fde1a80a1fc3eb9cc4a5dfe392 +https://conda.anaconda.org/conda-forge/linux-64/brotlipy-0.7.0-py311hd4cff14_1005.tar.bz2#9bdac7084ecfc08338bae1b976535724 +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311hcb2cf0a_0.conda#063a136fefba5ea0df36f9de0a9d0e30 +https://conda.anaconda.org/conda-forge/linux-64/cryptography-40.0.2-py311h9b4c7bb_0.conda#4df4df92db0b9168c11b72460baec870 +https://conda.anaconda.org/conda-forge/linux-64/gstreamer-1.22.0-h25f0c4b_2.conda#461541cb1b387c2a28ab6217f3d38502 +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-6.0.0-h8e241bc_0.conda#448fe40d2fed88ccf4d9ded37cbb2b38 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.5.0-hd8ed1ab_0.conda#24bfc0314deeea53d54c71de2b436ed6 +https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.8.1-nompi_h261ec11_106.tar.bz2#9b25de670ce5753a33c18b1090d1d3bf +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.7.1-py311h8597a09_0.conda#70c3b734ffe82c16b6d121aaa11929a8 +https://conda.anaconda.org/conda-forge/linux-64/pandas-2.0.0-py311h2872171_0.conda#f987f61faa256eace0d74ca491ab88c7 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.2.0-pyhd8ed1ab_0.conda#f10c2cf447ca96f12a326b83c75b8e33 +https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-daemon-16.1-ha8d29e2_3.conda#34d9d75ca896f5919c372a34e25f23ea +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.5.0-py311h1850bce_1.conda#572159a946b809df471b11db4995c708 +https://conda.anaconda.org/conda-forge/linux-64/pyqt5-sip-12.11.0-py311hcafe171_3.conda#0d79df2a96f6572fed2883374400b235 +https://conda.anaconda.org/conda-forge/noarch/pytest-7.3.1-pyhd8ed1ab_0.conda#547c7de697ec99b494a28ddde185b5a4 +https://conda.anaconda.org/conda-forge/noarch/setuptools-scm-7.1.0-pyhd8ed1ab_0.conda#6613dbb3b25cc648a107f33ca9f80fc1 +https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h4dd048b_3.tar.bz2#dbfea4376856bf7bd2121e719cf816e5 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.4.0-pyhd8ed1ab_0.conda#afe2978fcd8f15149452cdad37aebbfa +https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.22.0-h4243ec0_2.conda#0d0c6604c8ac4ad5e51efa7bb58da05c +https://conda.anaconda.org/conda-forge/noarch/identify-2.5.22-pyhd8ed1ab_0.conda#b8d16e273396a0115199a83769a39246 +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/netcdf-fortran-4.6.0-nompi_he1eeb6f_102.conda#d9679b28fcc2154fa63e814c5acdce57 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.2-nompi_py311hc6fcf29_100.tar.bz2#1ef39f477192bf05df04fb5ad594e82d +https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-hd33c08f_0.conda#a8b9e35dd7be2c945b0de4fe19a7c3a9 +https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-16.1-hcb278e6_3.conda#8b452ab959166d91949af4c2d28f81db +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.1.1-pyhd8ed1ab_0.conda#0b34aa3ab7e7ccb1765a03dd9ed29938 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-4.0.0-pyhd8ed1ab_0.tar.bz2#c9e3f8bfdb9bfc34aa1836a6ed4b25d7 +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.2.1-pyhd8ed1ab_0.conda#6fe4c2689d1b10fec1ee65819f0c4fd5 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.22.0-pyhd8ed1ab_0.conda#054007ab693cb77a029ea4f1f12f34a7 +https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.0-nompi_hdb2cfa9_4.conda#3e2e1d0cd06d1b64c9c2800c0eb0cde6 +https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h90689f9_2.tar.bz2#957a0255ab58aaf394a91725d73ab422 +https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.54.4-h7abd40a_0.tar.bz2#921e53675ed5ea352f022b79abab076a +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.2.2-pyha770c72_0.conda#c4aab94cab4ddeb340e36d4c670a5f24 +https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-h5d23da1_6.conda#59c73debd9405771690ddbbad6c57b69 +https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.15-pyhd8ed1ab_0.conda#27db656619a55d727eaf5a6ece3d2fd6 +https://conda.anaconda.org/conda-forge/linux-64/esmpy-8.4.0-nompi_py311h8e2db7d_2.conda#18fa0582166979a77413859eed97d667 +https://conda.anaconda.org/conda-forge/linux-64/graphviz-7.1.0-h2e5815a_0.conda#e7ecda996c443142a0e9c379f3b28e48 +https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.7-py311ha74522f_3.conda#ad6dd0bed0cdf5f2d4eb2b989d6253b3 +https://conda.anaconda.org/conda-forge/noarch/requests-2.28.2-pyhd8ed1ab_1.conda#3bfbd6ead1d7299ed46dab3a7bf0bc8c +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-3.7.1-py311h38be061_0.conda#8fd462c8bcbba5a3affcb2d04e387476 +https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyha770c72_3.conda#5936894aade8240c867d292aa0d980c6 +https://conda.anaconda.org/conda-forge/noarch/sphinx-5.3.0-pyhd8ed1ab_0.tar.bz2#f9e1fcfe235d655900bfeb6aee426472 +https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.13.3-pyhd8ed1ab_0.conda#07aca5f2dea315dcc16680d6891e9056 +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.10.1-py311h8e6699e_0.conda#a9dba1242a54275e4914a2540f4eb233 +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.4.1-pyhd8ed1ab_0.conda#14a64286fe896fe7e1a485fc91ccd022 +https://conda.anaconda.org/conda-forge/noarch/sphinx-gallery-0.13.0-pyhd8ed1ab_0.conda#26c51b97ce59bbcce6a35ff45bc5c900 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.21.1-py311hd88b842_1.conda#f19feb9440890ccb806a367ea9ae0654 +https://conda.anaconda.org/conda-forge/noarch/imagehash-4.3.1-pyhd8ed1ab_0.tar.bz2#132ad832787a2156be1f1b309835001a + From bbc116726bc6b1a8416a623fa8c055c5bf378d01 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 21 Apr 2023 13:51:53 +0100 Subject: [PATCH 83/85] Fix typos spotted by codespell. --- lib/iris/fileformats/netcdf/_dask_locks.py | 2 +- lib/iris/tests/integration/netcdf/test__dask_locks.py | 2 +- lib/iris/tests/integration/netcdf/test_delayed_save.py | 2 +- .../fileformats/netcdf/saver/test_Saver__lazy_stream_data.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/iris/fileformats/netcdf/_dask_locks.py b/lib/iris/fileformats/netcdf/_dask_locks.py index bd15816a6c..15ac117a8b 100644 --- a/lib/iris/fileformats/netcdf/_dask_locks.py +++ b/lib/iris/fileformats/netcdf/_dask_locks.py @@ -10,7 +10,7 @@ types, i.e. local 'threads' scheduler, local 'processes' or distributed. In any case, an "iris.fileformats.netcdf.saver.Saver" object contains a netCDF4.Dataset -targetting an output file, and creates a Saver.file_write_lock object to serialise +targeting an output file, and creates a Saver.file_write_lock object to serialise write-accesses to the file from dask tasks : All dask-task file writes go via a "iris.fileformats.netcdf.saver.NetCDFWriteProxy" object, which also contains a link to the Saver.file_write_lock, and uses it to prevent workers from fouling each other. diff --git a/lib/iris/tests/integration/netcdf/test__dask_locks.py b/lib/iris/tests/integration/netcdf/test__dask_locks.py index af7ce7147f..c41af1b356 100644 --- a/lib/iris/tests/integration/netcdf/test__dask_locks.py +++ b/lib/iris/tests/integration/netcdf/test__dask_locks.py @@ -7,7 +7,7 @@ Unit tests for the :mod:`iris.fileformats.netcdf._dask_locks` package. Note: these integration tests replace any unit testing of this module, due to its total -dependence on Dask, and even on Dask's implemenetation details rather than supported +dependence on Dask, and even on Dask's implementation details rather than supported and documented API and behaviour. So (a) it is essential to check the module's behaviour against actual Dask operation, and (b) mock-ist testing of the implementation code in isolation would not add anything diff --git a/lib/iris/tests/integration/netcdf/test_delayed_save.py b/lib/iris/tests/integration/netcdf/test_delayed_save.py index 61e28b4c5b..616feb3b0e 100644 --- a/lib/iris/tests/integration/netcdf/test_delayed_save.py +++ b/lib/iris/tests/integration/netcdf/test_delayed_save.py @@ -117,7 +117,7 @@ def test_realfile_loadsave_equivalence(self, save_is_delayed, output_path): ) original_cubes = iris.load(input_filepath) - # Pre-empt some standard changes that an iris save will impose. + # Preempt some standard changes that an iris save will impose. for cube in original_cubes: if cube.units == Unit("-"): # replace 'unknown unit' with 'no unit'. diff --git a/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy_stream_data.py b/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy_stream_data.py index 6e914ab557..6fa40a14fe 100644 --- a/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy_stream_data.py +++ b/lib/iris/tests/unit/fileformats/netcdf/saver/test_Saver__lazy_stream_data.py @@ -105,7 +105,7 @@ def test_warnings(self, compute, data_is_lazy): fill_value = 2.0 # IS occurring in data cf_var = self.mock_var(data.shape) - # Do initial save. When compute=True, this issues warnigns + # Do initial save. When compute=True, this issues warnings with warnings.catch_warnings(record=True) as logged_warnings: saver._lazy_stream_data( data=data, fill_value=fill_value, fill_warn=True, cf_var=cf_var From ed38e43b21695d7ec706fa5cb12f5394a25311e9 Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 21 Apr 2023 14:01:11 +0100 Subject: [PATCH 84/85] Add distributed test dep for python 3.11 --- requirements/py311.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements/py311.yml b/requirements/py311.yml index 71130c87cb..5a57349593 100644 --- a/requirements/py311.yml +++ b/requirements/py311.yml @@ -35,6 +35,7 @@ dependencies: - python-stratify # Test dependencies. + - distributed - filelock - imagehash >=4.0 - pre-commit From 54ec0f8156a782a51923290ce6fd4e7416e3270a Mon Sep 17 00:00:00 2001 From: Patrick Peglar Date: Fri, 21 Apr 2023 14:40:03 +0100 Subject: [PATCH 85/85] Fix lockfile for python 3.11 --- requirements/locks/py311-linux-64.lock | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/requirements/locks/py311-linux-64.lock b/requirements/locks/py311-linux-64.lock index 0ccb00fd74..31bf1c0295 100644 --- a/requirements/locks/py311-linux-64.lock +++ b/requirements/locks/py311-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: ccc18d7a90c531923e2b547b37cd25694cfbf4e9ec916ee9e8800513d1be3672 +# input_hash: 8641fc2c6ee10124d2b6eb1e655660170ee9faee3c595b844e213bc027dab9cf @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-2022.12.7-ha878542_0.conda#ff9f73d45c4a07d6f424495288a26080 @@ -154,6 +154,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-253-h8c4010b_1.conda https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.2.4-h1daa5a0_1.conda#77003f63d1763c1e6569a02c1742c9f4 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.2-py311h2582759_0.conda#adb20bd57069614552adac60a020c36d +https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.5-py311ha3edf6b_0.conda#7415f24f8c44e44152623d93c5015000 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.24.2-py311h8e6699e_0.conda#90db8cc0dfa20853329bfc6642f887aa https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-hfec8fc6_2.conda#5ce6a42505c6e9e6151c54c3ec8d68ea @@ -173,6 +174,7 @@ https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0-py311hd4cff14_5.tar.b https://conda.anaconda.org/conda-forge/noarch/setuptools-67.7.1-pyhd8ed1ab_0.conda#82bd3ef4e96ced7384f34ab01ece65b6 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 https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.3.2.post1-pyhd8ed1ab_0.tar.bz2#146f4541d643d48fc8a75cacf69f03ae https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.4-pyhd8ed1ab_0.conda#5a31a7d564f551d0e6dff52fd8cb5b16 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.2-py_0.tar.bz2#68e01cac9d38d0e717cd5c87bc3d2cc9 @@ -180,6 +182,7 @@ https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.1-pyhd8 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-jsmath-1.0.1-py_0.tar.bz2#67cd9d9c0382d37479b4d306c369a2d4 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.3-py_0.tar.bz2#d01180388e6d1838c3e1ad029590aa7a https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.5-pyhd8ed1ab_2.tar.bz2#9ff55a0901cf952f05c654394de76bf7 +https://conda.anaconda.org/conda-forge/noarch/tblib-1.7.0-pyhd8ed1ab_0.tar.bz2#3d4afc31302aa7be471feb6be048ed76 https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 @@ -189,6 +192,7 @@ https://conda.anaconda.org/conda-forge/noarch/wheel-0.40.0-pyhd8ed1ab_0.conda#49 https://conda.anaconda.org/conda-forge/linux-64/xcb-util-image-0.4.0-h166bdaf_0.tar.bz2#c9b568bd804cb2903c6be6f5f68182e4 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-libxrender-0.9.10-h7f98852_1003.tar.bz2#f59c1242cc1dd93e72c2ee2b360979eb +https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_0.conda#cf30c2c15b82aacb07f9c09e28ff2275 https://conda.anaconda.org/conda-forge/noarch/zipp-3.15.0-pyhd8ed1ab_0.conda#13018819ca8f5b7cc675a8faf1f5fedf https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda#46a2e6e3dfa718ce3492018d5a110dd6 https://conda.anaconda.org/conda-forge/noarch/babel-2.12.1-pyhd8ed1ab_1.conda#ac432e732804a81ddcf29c92ead57cde @@ -199,6 +203,7 @@ https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py311h4c7f6c3_1.tar https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.0.7-py311ha3edf6b_0.conda#e7548e7f58965a2fe97a95950a5fedc6 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.2.3-py311h2582759_0.conda#d34c18fc691a04471ff3460b2d15d19e https://conda.anaconda.org/conda-forge/linux-64/curl-8.0.1-h588be90_0.conda#69691e828381dd12df671c26b680f1b0 +https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.0-py311hd4cff14_1.tar.bz2#21523141b35484b1edafba962c6ea883 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.39.3-py311h2582759_0.conda#55741f37ab19d949b8e7316cfe286824 https://conda.anaconda.org/conda-forge/linux-64/glib-2.76.1-h3eb15da_0.conda#a7db5e3525875444b5a5868f553ab39a https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.12.2-nompi_h4df4325_101.conda#162a25904af6586b234b2dd52ee99c61 @@ -253,6 +258,7 @@ https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.54.4-h7abd40a_0.tar.bz https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.2.2-pyha770c72_0.conda#c4aab94cab4ddeb340e36d4c670a5f24 https://conda.anaconda.org/conda-forge/linux-64/qt-main-5.15.8-h5d23da1_6.conda#59c73debd9405771690ddbbad6c57b69 https://conda.anaconda.org/conda-forge/noarch/urllib3-1.26.15-pyhd8ed1ab_0.conda#27db656619a55d727eaf5a6ece3d2fd6 +https://conda.anaconda.org/conda-forge/noarch/distributed-2023.4.0-pyhd8ed1ab_0.conda#78e6f14161ba76ae48ac3e82e1f4bf13 https://conda.anaconda.org/conda-forge/linux-64/esmpy-8.4.0-nompi_py311h8e2db7d_2.conda#18fa0582166979a77413859eed97d667 https://conda.anaconda.org/conda-forge/linux-64/graphviz-7.1.0-h2e5815a_0.conda#e7ecda996c443142a0e9c379f3b28e48 https://conda.anaconda.org/conda-forge/linux-64/pyqt-5.15.7-py311ha74522f_3.conda#ad6dd0bed0cdf5f2d4eb2b989d6253b3