Skip to content

Commit c35bd24

Browse files
MPAS Reader Updates (#1310)
* update mpas reader * update docstrings and organize code * update test name --------- Co-authored-by: Orhan Eroglu <[email protected]>
1 parent 743f067 commit c35bd24

File tree

2 files changed

+82
-114
lines changed

2 files changed

+82
-114
lines changed

test/test_mpas.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,20 @@
1818
# Fill value
1919
fv = INT_FILL_VALUE
2020

21-
def test_read_mpas():
22-
"""Tests execution of _read_mpas()"""
21+
22+
23+
def test_read_primal():
2324
mpas_primal_ugrid, _ = _read_mpas(mpas_xr_ds, use_dual=False)
25+
26+
assert "face_edge_connectivity" in mpas_primal_ugrid
27+
assert "face_node_connectivity" in mpas_primal_ugrid
28+
assert "node_edge_connectivity" in mpas_primal_ugrid
29+
assert "edge_face_connectivity" in mpas_primal_ugrid
30+
assert "node_face_connectivity" in mpas_primal_ugrid
31+
assert "edge_node_connectivity" in mpas_primal_ugrid
32+
assert "face_face_connectivity" in mpas_primal_ugrid
33+
34+
def test_read_dual():
2435
mpas_dual_ugrid, _ = _read_mpas(mpas_xr_ds, use_dual=True)
2536

2637
def test_mpas_to_grid():

uxarray/io/_mpas.py

Lines changed: 69 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ def _primal_to_ugrid(in_ds, out_ds):
5151
_parse_face_nodes(in_ds, out_ds, mesh_type="primal")
5252
_parse_node_faces(in_ds, out_ds, mesh_type="primal")
5353

54+
if "edgesOnVertex" in in_ds:
55+
_parse_node_edges(in_ds, out_ds, mesh_type="primal")
56+
5457
if "verticesOnEdge" in in_ds:
5558
_parse_edge_nodes(in_ds, out_ds, "primal")
5659
source_dims_dict[in_ds["verticesOnEdge"].dims[0]] = "n_edge"
@@ -68,7 +71,7 @@ def _primal_to_ugrid(in_ds, out_ds):
6871
_parse_edge_face_distances(in_ds, out_ds)
6972

7073
if "cellsOnCell" in in_ds:
71-
_parse_face_faces(in_ds, out_ds)
74+
_parse_face_faces(in_ds, out_ds, mesh_type="primal")
7275

7376
if "areaCell" in in_ds:
7477
_parse_face_areas(in_ds, out_ds, mesh_type="primal")
@@ -112,6 +115,9 @@ def _dual_to_ugrid(in_ds, out_ds):
112115
_parse_face_nodes(in_ds, out_ds, mesh_type="dual")
113116
_parse_node_faces(in_ds, out_ds, mesh_type="dual")
114117

118+
if "edgesOnCell" in in_ds:
119+
_parse_node_edges(in_ds, out_ds, mesh_type="dual")
120+
115121
if "cellsOnEdge" in in_ds:
116122
_parse_edge_nodes(in_ds, out_ds, mesh_type="dual")
117123
source_dims_dict[in_ds["cellsOnEdge"].dims[0]] = "n_edge"
@@ -266,141 +272,112 @@ def _parse_edge_xyz_coords(in_ds, out_ds, mesh_type):
266272

267273

268274
def _parse_face_nodes(in_ds, out_ds, mesh_type):
269-
"""Parses face node connectivity for either the Primal or Dual Mesh."""
270-
if mesh_type == "primal":
271-
verticesOnCell = in_ds["verticesOnCell"].astype(INT_DTYPE)
272-
nEdgesOnCell = in_ds["nEdgesOnCell"].astype(INT_DTYPE)
273-
274-
# Replace padded values with fill values
275-
verticesOnCell = _replace_padding(verticesOnCell, nEdgesOnCell)
276-
277-
# Replace missing/zero values with fill values
278-
verticesOnCell = _replace_zeros(verticesOnCell)
279-
280-
# Convert to zero-indexed
281-
face_nodes = _to_zero_index(verticesOnCell)
275+
"""Parses face node connectivity for either the primal or dual mesh."""
276+
key = "verticesOnCell" if mesh_type == "primal" else "cellsOnVertex"
277+
arr = in_ds[key].astype(INT_DTYPE)
282278

283-
else:
284-
cellsOnVertex = in_ds["cellsOnVertex"].astype(INT_DTYPE)
285-
286-
# Replace missing/zero values with fill values
287-
cellsOnVertex = _replace_zeros(cellsOnVertex)
279+
if mesh_type == "primal":
280+
count = in_ds["nEdgesOnCell"].astype(INT_DTYPE)
281+
arr = _replace_padding(arr, count)
288282

289-
# Convert to zero-indexed
290-
face_nodes = _to_zero_index(cellsOnVertex)
283+
arr = _replace_zeros(arr)
284+
face_nodes = _to_zero_index(arr)
291285

292286
out_ds["face_node_connectivity"] = face_nodes.assign_attrs(
293287
ugrid.FACE_NODE_CONNECTIVITY_ATTRS
294288
).rename(dict(zip(face_nodes.dims, ugrid.FACE_NODE_CONNECTIVITY_DIMS)))
295289

296290

297291
def _parse_edge_nodes(in_ds, out_ds, mesh_type):
298-
"""Parses edge node connectivity for either the Primal or Dual Mesh."""
299-
if mesh_type == "primal":
300-
verticesOnEdge = in_ds["verticesOnEdge"].astype(INT_DTYPE)
301-
302-
# Replace missing/zero values with fill values
303-
verticesOnEdge = _replace_zeros(verticesOnEdge)
304-
305-
# Convert to zero-indexed
306-
edge_nodes = _to_zero_index(verticesOnEdge)
307-
308-
else:
309-
cellsOnEdge = in_ds["cellsOnEdge"].astype(INT_DTYPE)
292+
"""Parses edge node connectivity for either the primal or dual mesh."""
293+
key = "verticesOnEdge" if mesh_type == "primal" else "cellsOnEdge"
294+
arr = in_ds[key].astype(INT_DTYPE)
310295

311-
# Replace missing/zero values with fill values
312-
cellsOnEdge = _replace_zeros(cellsOnEdge)
313-
314-
# Convert to zero-indexed
315-
edge_nodes = _to_zero_index(cellsOnEdge)
296+
arr = _replace_zeros(arr)
297+
edge_nodes = _to_zero_index(arr)
316298

317299
out_ds["edge_node_connectivity"] = edge_nodes.assign_attrs(
318300
ugrid.EDGE_NODE_CONNECTIVITY_ATTRS
319301
).rename(dict(zip(edge_nodes.dims, ugrid.EDGE_NODE_CONNECTIVITY_DIMS)))
320302

321303

322304
def _parse_node_faces(in_ds, out_ds, mesh_type):
323-
"""Parses node face connectivity for either the Primal or Dual Mesh."""
324-
if mesh_type == "primal":
325-
cellsOnVertex = in_ds["cellsOnVertex"].astype(INT_DTYPE)
326-
327-
# Replace missing/zero values with fill values
328-
cellsOnVertex = _replace_zeros(cellsOnVertex)
329-
330-
# Convert to zero-indexed
331-
node_faces = _to_zero_index(cellsOnVertex)
332-
else:
333-
verticesOnCell = in_ds["verticesOnCell"].astype(INT_DTYPE)
334-
nEdgesOnCell = in_ds["nEdgesOnCell"].astype(INT_DTYPE)
335-
336-
# Replace padded values with fill values
337-
verticesOnCell = _replace_padding(verticesOnCell, nEdgesOnCell)
305+
"""Parses node face connectivity for either the primal or dual mesh."""
306+
key = "cellsOnVertex" if mesh_type == "primal" else "verticesOnCell"
307+
arr = in_ds[key].astype(INT_DTYPE)
338308

339-
# Replace missing/zero values with fill values
340-
verticesOnCell = _replace_zeros(verticesOnCell)
309+
if mesh_type != "primal":
310+
count = in_ds["nEdgesOnCell"].astype(INT_DTYPE)
311+
arr = _replace_padding(arr, count)
341312

342-
# Convert to zero-indexed
343-
node_faces = _to_zero_index(verticesOnCell)
313+
arr = _replace_zeros(arr)
314+
node_faces = _to_zero_index(arr)
344315

345316
out_ds["node_face_connectivity"] = node_faces.assign_attrs(
346317
ugrid.NODE_FACE_CONNECTIVITY_ATTRS
347318
).rename(dict(zip(node_faces.dims, ugrid.NODE_FACE_CONNECTIVITY_DIMS)))
348319

349320

350-
def _parse_face_edges(in_ds, out_ds, mesh_type):
351-
"""Parses face edge connectivity for either the Primal or Dual Mesh."""
352-
if mesh_type == "primal":
353-
edgesOnCell = in_ds["edgesOnCell"].astype(INT_DTYPE)
354-
nEdgesOnCell = in_ds["nEdgesOnCell"].astype(INT_DTYPE)
321+
def _parse_node_edges(in_ds, out_ds, mesh_type):
322+
"""Parses node edge connectivity for either the Primal or Dual Mesh."""
323+
key = "edgesOnVertex" if mesh_type == "primal" else "edgesOnCell"
324+
arr = in_ds[key].astype(INT_DTYPE)
325+
arr = _replace_zeros(arr)
326+
node_edges = _to_zero_index(arr)
355327

356-
# Replace padded values with fill values
357-
edgesOnCell = _replace_padding(edgesOnCell, nEdgesOnCell)
328+
out_ds["node_edge_connectivity"] = node_edges.assign_attrs(
329+
ugrid.NODE_EDGE_CONNECTIVITY_ATTRS
330+
).rename(dict(zip(node_edges.dims, ugrid.NODE_EDGE_CONNECTIVITY_DIMS)))
358331

359-
# Replace missing/zero values with fill values
360-
edgesOnCell = _replace_zeros(edgesOnCell)
361332

362-
# Convert to zero-indexed
363-
face_edges = _to_zero_index(edgesOnCell)
364-
365-
else:
366-
edgesOnVertex = in_ds["edgesOnVertex"].astype(INT_DTYPE)
333+
def _parse_face_edges(in_ds, out_ds, mesh_type):
334+
"""Parses face edge connectivity for either the primal or dual mesh."""
335+
# choose the right source array
336+
key = "edgesOnCell" if mesh_type == "primal" else "edgesOnVertex"
337+
arr = in_ds[key].astype(INT_DTYPE)
367338

368-
# Replace missing/zero values with fill values
369-
edgesOnVertex = _replace_zeros(edgesOnVertex)
339+
if mesh_type == "primal":
340+
count = in_ds["nEdgesOnCell"].astype(INT_DTYPE)
341+
arr = _replace_padding(arr, count)
370342

371-
# Convert to zero-indexed
372-
face_edges = _to_zero_index(edgesOnVertex)
343+
arr = _replace_zeros(arr)
344+
face_edges = _to_zero_index(arr)
373345

374346
out_ds["face_edge_connectivity"] = face_edges.assign_attrs(
375347
ugrid.FACE_EDGE_CONNECTIVITY_ATTRS
376348
).rename(dict(zip(face_edges.dims, ugrid.FACE_EDGE_CONNECTIVITY_DIMS)))
377349

378350

379351
def _parse_edge_faces(in_ds, out_ds, mesh_type):
380-
"""Parses edge face connectivity for either the Primal or Dual Mesh."""
381-
if mesh_type == "primal":
382-
cellsOnEdge = in_ds["cellsOnEdge"].astype(INT_DTYPE)
383-
384-
# Replace missing/zero values with fill values
385-
cellsOnEdge = _replace_zeros(cellsOnEdge)
386-
387-
# Convert to zero-indexed
388-
edge_faces = _to_zero_index(cellsOnEdge)
352+
"""Parses edge face connectivity for either the primal or dual mesh."""
389353

390-
else:
391-
verticesOnEdge = in_ds["verticesOnEdge"].astype(INT_DTYPE)
392-
393-
# Replace missing/zero values with fill values
394-
verticesOnEdge = _replace_zeros(verticesOnEdge)
354+
key = "cellsOnEdge" if mesh_type == "primal" else "verticesOnEdge"
355+
arr = in_ds[key].astype(INT_DTYPE)
395356

396-
# Convert to zero-indexed
397-
edge_faces = _to_zero_index(verticesOnEdge)
357+
arr = _replace_zeros(arr)
358+
edge_faces = _to_zero_index(arr)
398359

399360
out_ds["edge_face_connectivity"] = edge_faces.assign_attrs(
400361
ugrid.EDGE_FACE_CONNECTIVITY_ATTRS
401362
).rename(dict(zip(edge_faces.dims, ugrid.EDGE_FACE_CONNECTIVITY_DIMS)))
402363

403364

365+
def _parse_face_faces(in_ds, out_ds, mesh_type):
366+
"""Parses face face connectivity for the primal mesh."""
367+
cellsOnCell = in_ds["cellsOnCell"].astype(INT_DTYPE)
368+
nEdgesOnCell = in_ds["nEdgesOnCell"].astype(INT_DTYPE)
369+
370+
cellsOnCell = _replace_padding(cellsOnCell, nEdgesOnCell)
371+
372+
cellsOnCell = _replace_zeros(cellsOnCell)
373+
374+
face_face_connectivity = _to_zero_index(cellsOnCell)
375+
376+
out_ds["face_face_connectivity"] = face_face_connectivity.assign_attrs(
377+
ugrid.FACE_FACE_CONNECTIVITY_ATTRS
378+
).rename(dict(zip(face_face_connectivity.dims, ugrid.FACE_FACE_CONNECTIVITY_DIMS)))
379+
380+
404381
def _parse_edge_node_distances(in_ds, out_ds):
405382
"""Parses ``edge_node_distances``"""
406383
edge_node_distances = in_ds["dvEdge"] / in_ds.attrs["sphere_radius"]
@@ -424,25 +401,6 @@ def _parse_global_attrs(in_ds, out_ds):
424401
out_ds.attrs = in_ds.attrs
425402

426403

427-
def _parse_face_faces(in_ds, out_ds):
428-
"""Parses face-face connectivity for Primal Mesh."""
429-
cellsOnCell = in_ds["cellsOnCell"].astype(INT_DTYPE)
430-
nEdgesOnCell = in_ds["nEdgesOnCell"].astype(INT_DTYPE)
431-
432-
# Replace padded values with fill values
433-
cellsOnCell = _replace_padding(cellsOnCell, nEdgesOnCell)
434-
435-
# Replace missing/zero values with fill values
436-
cellsOnCell = _replace_zeros(cellsOnCell)
437-
438-
# Convert to zero-indexed
439-
face_face_connectivity = _to_zero_index(cellsOnCell)
440-
441-
out_ds["face_face_connectivity"] = face_face_connectivity.assign_attrs(
442-
ugrid.FACE_FACE_CONNECTIVITY_ATTRS
443-
).rename(dict(zip(face_face_connectivity.dims, ugrid.FACE_FACE_CONNECTIVITY_DIMS)))
444-
445-
446404
def _parse_face_areas(in_ds, out_ds, mesh_type):
447405
"""Parses the face area for either a primal or dual grid."""
448406
if mesh_type == "primal":
@@ -457,17 +415,16 @@ def _parse_face_areas(in_ds, out_ds, mesh_type):
457415

458416
def _parse_boundary_node_indices(in_ds, out_ds, mesh_type):
459417
"""Parses the boundary node indices."""
418+
460419
boundary_node_mask = in_ds["boundaryVertex"]
461420
boundary_node_indices = boundary_node_mask.where(boundary_node_mask).dropna(
462421
dim=boundary_node_mask.dims[0]
463422
)
464423

465-
# Convert to integer indices
466424
boundary_node_indices = boundary_node_indices.coords[
467425
boundary_node_indices.dims[0]
468426
].astype(INT_DTYPE)
469427

470-
# Ensure zero-indexed
471428
boundary_node_indices = boundary_node_indices - 1
472429

473430
out_ds["boundary_node_indices"] = boundary_node_indices.rename(

0 commit comments

Comments
 (0)