@@ -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
268274def _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
297291def _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
322304def _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
379351def _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+
404381def _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-
446404def _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
458416def _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