Skip to content

Collapsing over a lazy auxiliary coordinate results in a netCDF4 error when the cube is saved as *.nc file. #4599

@schlunma

Description

@schlunma

🐛 Bug Report

Collapsing a cube over a lazy auxiliary coordinate results in the following error when the cube is save as nc file:

ValueError: slicing expression exceeds the number of dimensions of the variable

I tested this on two independent machines. Some additional hints:

  • The error only appears in iris=3.2.0.post0, not for iris=3.1.0.
  • Adding a print(cube) between the collapsing the the save somehow fixes this issue.
  • Using a non-lazy auxiliary coordinate also fixes this issue.
  • Using a lazy dimensional coordinate also does not trigger the error (if used without a lazy auxiliary coordinate).

How To Reproduce

import dask.array as da
import numpy as np
import os

import iris
from iris.coords import AuxCoord, DimCoord
from iris.cube import Cube


print("iris version:", iris.__version__)


# Create cube with lazy aux coord and aggregate over this dimension
dim_coord = DimCoord(np.arange(10), var_name='time')
aux_coord = AuxCoord(da.arange(10), var_name='year')  # the "da" is important here!
cube = Cube(np.arange(10),
            var_name='x',
            dim_coords_and_dims=[(dim_coord, 0)],
            aux_coords_and_dims=[(aux_coord, 0)],
           )

cube = cube.collapsed('time', iris.analysis.MEAN)


# Adding a print() somehow fixes this issue
# print(cube)


# Saving this cube gives the error
filename = os.path.expanduser('~/test_iris_32.nc')
iris.save(cube, filename)

Expected behaviour

No error, similar to iris=3.1.0.

Environment

  • OS & Version: openSUSE Tumbleweed 20220221; Red Hat Enterprise Linux Server release 6.10
  • Iris Version: 3.2.0.post0

Additional context

Full traceback
Traceback (most recent call last):
  File "/home/manuel/Tresorit/DLR/scripts/iris/iris32bug.py", line 31, in <module>
    iris.save(cube, filename)
  File "/home/manuel/mambaforge/envs/xxx/lib/python3.10/site-packages/iris/io/__init__.py", line 436, in save
    saver(source, target, **kwargs)
  File "/home/manuel/mambaforge/envs/xxx/lib/python3.10/site-packages/iris/fileformats/netcdf.py", line 3167, in save
    sman.write(
  File "/home/manuel/mambaforge/envs/xxx/lib/python3.10/site-packages/iris/fileformats/netcdf.py", line 1242, in write
    self._add_aux_coords(cube, cf_var_cube, cube_dimensions)
  File "/home/manuel/mambaforge/envs/xxx/lib/python3.10/site-packages/iris/fileformats/netcdf.py", line 1569, in _add_aux_coords
    return self._add_inner_related_vars(
  File "/home/manuel/mambaforge/envs/xxx/lib/python3.10/site-packages/iris/fileformats/netcdf.py", line 1534, in _add_inner_related_vars
    cf_name = self._create_generic_cf_array_var(
  File "/home/manuel/mambaforge/envs/xxx/lib/python3.10/site-packages/iris/fileformats/netcdf.py", line 2407, in _create_generic_cf_array_var
    self._create_cf_bounds(element, cf_var, cf_name)
  File "/home/manuel/mambaforge/envs/xxx/lib/python3.10/site-packages/iris/fileformats/netcdf.py", line 2069, in _create_cf_bounds
    self._lazy_stream_data(
  File "/home/manuel/mambaforge/envs/xxx/lib/python3.10/site-packages/iris/fileformats/netcdf.py", line 2899, in _lazy_stream_data
    is_masked, contains_fill_value = store(
  File "/home/manuel/mambaforge/envs/xxx/lib/python3.10/site-packages/iris/fileformats/netcdf.py", line 2874, in store
    da.store([data], [target])
  File "/home/manuel/mambaforge/envs/xxx/lib/python3.10/site-packages/dask/array/core.py", line 1163, in store
    compute_as_if_collection(Array, store_dsk, map_keys, **kwargs)
  File "/home/manuel/mambaforge/envs/xxx/lib/python3.10/site-packages/dask/base.py", line 317, in compute_as_if_collection
    return schedule(dsk2, keys, **kwargs)
  File "/home/manuel/mambaforge/envs/xxx/lib/python3.10/site-packages/dask/threaded.py", line 81, in get
    results = get_async(
  File "/home/manuel/mambaforge/envs/xxx/lib/python3.10/site-packages/dask/local.py", line 506, in get_async
    raise_exception(exc, tb)
  File "/home/manuel/mambaforge/envs/xxx/lib/python3.10/site-packages/dask/local.py", line 314, in reraise
    raise exc
  File "/home/manuel/mambaforge/envs/xxx/lib/python3.10/site-packages/dask/local.py", line 219, in execute_task
    result = _execute_task(task, data)
  File "/home/manuel/mambaforge/envs/xxx/lib/python3.10/site-packages/dask/core.py", line 119, in _execute_task
    return func(*(_execute_task(a, cache) for a in args))
  File "/home/manuel/mambaforge/envs/xxx/lib/python3.10/site-packages/dask/array/core.py", line 4164, in store_chunk
    return load_store_chunk(x, out, index, lock, return_stored, False)
  File "/home/manuel/mambaforge/envs/xxx/lib/python3.10/site-packages/dask/array/core.py", line 4151, in load_store_chunk
    out[index] = x
  File "/home/manuel/mambaforge/envs/xxx/lib/python3.10/site-packages/iris/fileformats/netcdf.py", line 972, in __setitem__
    self.target[keys] = arr
  File "src/netCDF4/_netCDF4.pyx", line 4903, in netCDF4._netCDF4.Variable.__setitem__
  File "/home/manuel/mambaforge/envs/xxx/lib/python3.10/site-packages/netCDF4/utils.py", line 335, in _StartCountStride
    raise ValueError("slicing expression exceeds the number of dimensions of the variable")
ValueError: slicing expression exceeds the number of dimensions of the variable

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions