Skip to content

Commit acdf188

Browse files
committed
Mesh clearer distinction between coords and connectivities filters.
1 parent 447833d commit acdf188

2 files changed

Lines changed: 166 additions & 123 deletions

File tree

lib/iris/experimental/ugrid.py

Lines changed: 74 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1245,9 +1245,9 @@ def connectivities(
12451245
var_name=None,
12461246
attributes=None,
12471247
cf_role=None,
1248-
node=None,
1249-
edge=None,
1250-
face=None,
1248+
contains_node=None,
1249+
contains_edge=None,
1250+
contains_face=None,
12511251
):
12521252
return self._connectivity_manager.filters(
12531253
item=item,
@@ -1256,9 +1256,9 @@ def connectivities(
12561256
var_name=var_name,
12571257
attributes=attributes,
12581258
cf_role=cf_role,
1259-
node=node,
1260-
edge=edge,
1261-
face=face,
1259+
contains_node=contains_node,
1260+
contains_edge=contains_edge,
1261+
contains_face=contains_face,
12621262
)
12631263

12641264
def connectivity(
@@ -1269,9 +1269,9 @@ def connectivity(
12691269
var_name=None,
12701270
attributes=None,
12711271
cf_role=None,
1272-
node=None,
1273-
edge=None,
1274-
face=None,
1272+
contains_node=None,
1273+
contains_edge=None,
1274+
contains_face=None,
12751275
):
12761276
return self._connectivity_manager.filter(
12771277
item=item,
@@ -1280,9 +1280,9 @@ def connectivity(
12801280
var_name=var_name,
12811281
attributes=attributes,
12821282
cf_role=cf_role,
1283-
node=node,
1284-
edge=edge,
1285-
face=face,
1283+
contains_node=contains_node,
1284+
contains_edge=contains_edge,
1285+
contains_face=contains_face,
12861286
)
12871287

12881288
def coord(
@@ -1293,9 +1293,9 @@ def coord(
12931293
var_name=None,
12941294
attributes=None,
12951295
axis=None,
1296-
node=None,
1297-
edge=None,
1298-
face=None,
1296+
include_nodes=None,
1297+
include_edges=None,
1298+
include_faces=None,
12991299
):
13001300
return self._coord_manager.filter(
13011301
item=item,
@@ -1304,9 +1304,9 @@ def coord(
13041304
var_name=var_name,
13051305
attributes=attributes,
13061306
axis=axis,
1307-
node=node,
1308-
edge=edge,
1309-
face=face,
1307+
include_nodes=include_nodes,
1308+
include_edges=include_edges,
1309+
include_faces=include_faces,
13101310
)
13111311

13121312
def coords(
@@ -1317,9 +1317,9 @@ def coords(
13171317
var_name=None,
13181318
attributes=None,
13191319
axis=None,
1320-
node=None,
1321-
edge=None,
1322-
face=None,
1320+
include_nodes=None,
1321+
include_edges=None,
1322+
include_faces=None,
13231323
):
13241324
return self._coord_manager.filters(
13251325
item=item,
@@ -1328,9 +1328,9 @@ def coords(
13281328
var_name=var_name,
13291329
attributes=attributes,
13301330
axis=axis,
1331-
node=node,
1332-
edge=edge,
1333-
face=face,
1331+
include_nodes=include_nodes,
1332+
include_edges=include_edges,
1333+
include_faces=include_faces,
13341334
)
13351335

13361336
def remove_connectivities(
@@ -1341,9 +1341,9 @@ def remove_connectivities(
13411341
var_name=None,
13421342
attributes=None,
13431343
cf_role=None,
1344-
node=None,
1345-
edge=None,
1346-
face=None,
1344+
contains_node=None,
1345+
contains_edge=None,
1346+
contains_face=None,
13471347
):
13481348
return self._connectivity_manager.remove(
13491349
item=item,
@@ -1352,9 +1352,9 @@ def remove_connectivities(
13521352
var_name=var_name,
13531353
attributes=attributes,
13541354
cf_role=cf_role,
1355-
node=node,
1356-
edge=edge,
1357-
face=face,
1355+
contains_node=contains_node,
1356+
contains_edge=contains_edge,
1357+
contains_face=contains_face,
13581358
)
13591359

13601360
def remove_coords(
@@ -1365,9 +1365,9 @@ def remove_coords(
13651365
var_name=None,
13661366
attributes=None,
13671367
axis=None,
1368-
node=None,
1369-
edge=None,
1370-
face=None,
1368+
include_nodes=None,
1369+
include_edges=None,
1370+
include_faces=None,
13711371
):
13721372
# Filter out absent arguments - only expecting face coords sometimes,
13731373
# same will be true of volumes in future.
@@ -1378,9 +1378,9 @@ def remove_coords(
13781378
"var_name": var_name,
13791379
"attributes": attributes,
13801380
"axis": axis,
1381-
"node": node,
1382-
"edge": edge,
1383-
"face": face,
1381+
"include_nodes": include_nodes,
1382+
"include_edges": include_edges,
1383+
"include_faces": include_faces,
13841384
}
13851385
kwargs = {k: v for k, v in kwargs.items() if v}
13861386

@@ -1682,33 +1682,32 @@ def filters(
16821682
var_name=None,
16831683
attributes=None,
16841684
axis=None,
1685-
node=None,
1686-
edge=None,
1687-
face=None,
1685+
include_nodes=None,
1686+
include_edges=None,
1687+
include_faces=None,
16881688
):
16891689
# TBD: support coord_systems?
16901690

1691-
face_requested = face is True
1692-
args = [node, edge, face]
1693-
true_count = len([arg for arg in args if arg])
1694-
if true_count > 1:
1695-
# Standard filter behaviour is 'AND', and coord locations are
1696-
# mutually exclusive, so multiple True cannot return any results.
1697-
node = edge = face = False
1698-
elif true_count == 0:
1699-
# Treat None as True in this case.
1700-
node, edge, face = [True if arg is None else arg for arg in args]
1691+
# Preserve original argument before modifying.
1692+
face_requested = include_faces
1693+
1694+
# Rationalise the tri-state behaviour.
1695+
args = [include_nodes, include_edges, include_faces]
1696+
state = not any(set(filter(lambda arg: arg is not None, args)))
1697+
include_nodes, include_edges, include_faces = map(
1698+
lambda arg: arg if arg is not None else state, args
1699+
)
17011700

17021701
def populated_coords(coords_tuple):
17031702
return list(filter(None, list(coords_tuple)))
17041703

17051704
members = []
1706-
if node:
1705+
if include_nodes:
17071706
members += populated_coords(self.node_coords)
1708-
if edge:
1707+
if include_edges:
17091708
members += populated_coords(self.edge_coords)
17101709
if hasattr(self, "face_coords"):
1711-
if face:
1710+
if include_faces:
17121711
members += populated_coords(self.face_coords)
17131712
elif face_requested:
17141713
dmsg = "Ignoring request to filter non-existent 'face_coords'"
@@ -1739,8 +1738,8 @@ def remove(
17391738
var_name=None,
17401739
attributes=None,
17411740
axis=None,
1742-
node=None,
1743-
edge=None,
1741+
include_nodes=None,
1742+
include_edges=None,
17441743
):
17451744
return self._remove(
17461745
item=item,
@@ -1749,8 +1748,8 @@ def remove(
17491748
var_name=var_name,
17501749
attributes=attributes,
17511750
axis=axis,
1752-
node=node,
1753-
edge=edge,
1751+
include_nodes=include_nodes,
1752+
include_edges=include_edges,
17541753
)
17551754

17561755

@@ -1829,9 +1828,9 @@ def remove(
18291828
var_name=None,
18301829
attributes=None,
18311830
axis=None,
1832-
node=None,
1833-
edge=None,
1834-
face=None,
1831+
include_nodes=None,
1832+
include_edges=None,
1833+
include_faces=None,
18351834
):
18361835
return self._remove(
18371836
item=item,
@@ -1840,9 +1839,9 @@ def remove(
18401839
var_name=var_name,
18411840
attributes=attributes,
18421841
axis=axis,
1843-
node=node,
1844-
edge=edge,
1845-
face=face,
1842+
include_nodes=include_nodes,
1843+
include_edges=include_edges,
1844+
include_faces=include_faces,
18461845
)
18471846

18481847

@@ -1987,9 +1986,9 @@ def filters(
19871986
var_name=None,
19881987
attributes=None,
19891988
cf_role=None,
1990-
node=None,
1991-
edge=None,
1992-
face=None,
1989+
contains_node=None,
1990+
contains_edge=None,
1991+
contains_face=None,
19931992
):
19941993
members = [c for c in self._members.values() if c is not None]
19951994

@@ -2020,16 +2019,16 @@ def location_filter(instances, loc_arg, loc_name):
20202019
return filtered
20212020

20222021
for arg, loc in (
2023-
(node, "node"),
2024-
(edge, "edge"),
2025-
(face, "face"),
2022+
(contains_node, "node"),
2023+
(contains_edge, "edge"),
2024+
(contains_face, "face"),
20262025
):
20272026
members = location_filter(members, arg, loc)
20282027

20292028
# No need to actually modify filtering behaviour - already won't return
20302029
# any face cf-roles if none are present.
20312030
supports_faces = any(["face" in role for role in self.ALL])
2032-
if face and not supports_faces:
2031+
if contains_face and not supports_faces:
20332032
message = (
20342033
"Ignoring request to filter for non-existent 'face' cf-roles."
20352034
)
@@ -2059,9 +2058,9 @@ def remove(
20592058
var_name=None,
20602059
attributes=None,
20612060
cf_role=None,
2062-
node=None,
2063-
edge=None,
2064-
face=None,
2061+
contains_node=None,
2062+
contains_edge=None,
2063+
contains_face=None,
20652064
):
20662065
removal_dict = self.filters(
20672066
item=item,
@@ -2070,9 +2069,9 @@ def remove(
20702069
var_name=var_name,
20712070
attributes=attributes,
20722071
cf_role=cf_role,
2073-
node=node,
2074-
edge=edge,
2075-
face=face,
2072+
contains_node=contains_node,
2073+
contains_edge=contains_edge,
2074+
contains_face=contains_face,
20762075
)
20772076
for cf_role in self.REQUIRED:
20782077
excluded = removal_dict.pop(cf_role, None)

0 commit comments

Comments
 (0)