iris
iris copied to clipboard
`save_mesh` and `Mesh.to_MeshCoord` fails with confusing errors when input coordinates do not have `standard_name`
🐛 Bug Report
Calling save_mesh or Mesh.to_MeshCoord fails with confusing error messages when the coordinates used to create the mesh have standard_name=None
How To Reproduce
Steps to reproduce the behaviour:
MWE
from pathlib import Path
from iris.coords import AuxCoord
from iris.experimental.ugrid import Mesh, Connectivity, save_mesh
# Coordinate metadata that doesn't create the bug
face_lat = AuxCoord([2])
face_lon = AuxCoord([2])
node_lat = AuxCoord([0, 0, 4])
node_lon = AuxCoord([0, 4, 2])
face_node_conn = [[0, 1, 2]]
# Adapt standard_names to force/not force bug
# face_lat.standard_name = 'latitude'
# face_lon.standard_name = 'longitude'
# node_lat.standard_name = 'latitude'
# node_lon.standard_name = 'longitude'
# Create mesh (always succeeds)
connectivity = Connectivity(
indices=face_node_conn,
cf_role='face_node_connectivity',
)
mesh = Mesh(
topology_dimension=2,
node_coords_and_axes=[(node_lat, 'y'), (node_lon, 'x')],
connectivities=[connectivity],
face_coords_and_axes=[(face_lat, 'y'), (face_lon, 'x')],
)
# Save mesh (always fails when either face or node standard_names are None)
mesh_path = Path.home() / 'mesh_new.nc'
save_mesh(mesh, mesh_path)
print("save_mesh ok")
# Save MeshCoord (always fails when either face or node standard_names are None)
mesh_coord = mesh.to_MeshCoord('face', 'y')
print("Mesh.to_MeshCoord ok")
Expected behaviour
Either a clear error message or no error.
Error messages
-
save_meshandnode_coord.standard_name=None:KeyError: 'node'
Traceback (most recent call last):
File "mesh_bug.py", line 35, in <module>
save_mesh(mesh, mesh_path)
File "/work/bd0854/b309141/mambaforge/envs/esm38/lib/python3.8/site-packages/iris/experimental/ugrid/save.py", line 59, in save_mesh
sman._add_mesh(mesh)
File "/work/bd0854/b309141/mambaforge/envs/esm38/lib/python3.8/site-packages/iris/fileformats/netcdf.py", line 1438, in _add_mesh
element_dims=(mesh_dims[location],),
KeyError: 'node'
-
save_meshandface_coord.standard_name=None:AssertionError
Traceback (most recent call last):
File "mesh_bug.py", line 35, in <module>
save_mesh(mesh, mesh_path)
File "/work/bd0854/b309141/mambaforge/envs/esm38/lib/python3.8/site-packages/iris/experimental/ugrid/save.py", line 59, in save_mesh
sman._add_mesh(mesh)
File "/work/bd0854/b309141/mambaforge/envs/esm38/lib/python3.8/site-packages/iris/fileformats/netcdf.py", line 1434, in _add_mesh
coord_name = self._create_generic_cf_array_var(
File "/work/bd0854/b309141/mambaforge/envs/esm38/lib/python3.8/site-packages/iris/fileformats/netcdf.py", line 2315, in _create_generic_cf_array_var
cf_name = self._get_coord_variable_name(cube_or_mesh, element)
File "/work/bd0854/b309141/mambaforge/envs/esm38/lib/python3.8/site-packages/iris/fileformats/netcdf.py", line 2150, in _get_coord_variable_name
assert isinstance(coord, Connectivity)
AssertionError
-
Mesh.to_MeshCoordandnode_coord.standard_name=None:iris.exceptions.CoordinateNotFoundError: 'Expected to find exactly 1 coordinate, but found none.'
Traceback (most recent call last):
File "mesh_bug.py", line 40, in <module>
mesh_coord = mesh.to_MeshCoord('face', 'y')
File "/work/bd0854/b309141/mambaforge/envs/esm38/lib/python3.8/site-packages/iris/experimental/ugrid/mesh.py", line 1947, in to_MeshCoord
return MeshCoord(mesh=self, location=location, axis=axis)
File "/work/bd0854/b309141/mambaforge/envs/esm38/lib/python3.8/site-packages/iris/experimental/ugrid/mesh.py", line 2835, in __init__
points, bounds = self._construct_access_arrays()
File "/work/bd0854/b309141/mambaforge/envs/esm38/lib/python3.8/site-packages/iris/experimental/ugrid/mesh.py", line 3049, in _construct_access_arrays
points_coord = self.mesh.coord(include_faces=True, axis=axis)
File "/work/bd0854/b309141/mambaforge/envs/esm38/lib/python3.8/site-packages/iris/experimental/ugrid/mesh.py", line 1614, in coord
result = self._coord_manager.filter(
File "/work/bd0854/b309141/mambaforge/envs/esm38/lib/python3.8/site-packages/iris/experimental/ugrid/mesh.py", line 2283, in filter
raise CoordinateNotFoundError(emsg)
iris.exceptions.CoordinateNotFoundError: 'Expected to find exactly 1 coordinate, but found none.'
-
Mesh.to_MeshCoordandface_coord.standard_name=None:iris.exceptions.CoordinateNotFoundError: 'Expected to find exactly 1 coordinate, but found none.'
Traceback (most recent call last):
File "mesh_bug.py", line 40, in <module>
mesh_coord = mesh.to_MeshCoord('face', 'y')
File "/work/bd0854/b309141/mambaforge/envs/esm38/lib/python3.8/site-packages/iris/experimental/ugrid/mesh.py", line 1947, in to_MeshCoord
return MeshCoord(mesh=self, location=location, axis=axis)
File "/work/bd0854/b309141/mambaforge/envs/esm38/lib/python3.8/site-packages/iris/experimental/ugrid/mesh.py", line 2835, in __init__
points, bounds = self._construct_access_arrays()
File "/work/bd0854/b309141/mambaforge/envs/esm38/lib/python3.8/site-packages/iris/experimental/ugrid/mesh.py", line 3040, in _construct_access_arrays
node_coord = self.mesh.coord(include_nodes=True, axis=axis)
File "/work/bd0854/b309141/mambaforge/envs/esm38/lib/python3.8/site-packages/iris/experimental/ugrid/mesh.py", line 1614, in coord
result = self._coord_manager.filter(
File "/work/bd0854/b309141/mambaforge/envs/esm38/lib/python3.8/site-packages/iris/experimental/ugrid/mesh.py", line 2283, in filter
raise CoordinateNotFoundError(emsg)
iris.exceptions.CoordinateNotFoundError: 'Expected to find exactly 1 coordinate, but found none.'
Environment
OS: Red Hat Enterprise Linux 8.4 (Ootpa) iris version: 3.2.1.post0
In order to maintain a backlog of relevant issues, we automatically label them as stale after 500 days of inactivity.
If this issue is still important to you, then please comment on this issue and the stale label will be removed.
Otherwise this issue will be automatically closed in 28 days time.