diff --git a/meshmode/mesh/processing.py b/meshmode/mesh/processing.py index 404f0d849d64cfd4f4cdabc8c467bac64435cf91..6d7e792c6eab7854bf20c0f4a5791ec568814b18 100644 --- a/meshmode/mesh/processing.py +++ b/meshmode/mesh/processing.py @@ -142,11 +142,16 @@ def partition_mesh(mesh, part_per_element, part_nr): boundary_tags = list(range(num_parts)) from meshmode.mesh import Mesh - part_mesh = Mesh(new_vertices, new_mesh_groups, \ + part_mesh = Mesh(new_vertices, new_mesh_groups, facial_adjacency_groups=None, boundary_tags=boundary_tags) from meshmode.mesh import BTAG_ALL + from meshmode.mesh import InterPartitionAdjacency + tags_to_part_adj = dict() + for tag in range(np.max(part_per_element) + 1): + tags_to_part_adj[tag] = InterPartitionAdjacency() + for igrp in range(num_groups): f_group = part_mesh.facial_adjacency_groups[igrp][None] grp_elems = f_group.elements @@ -167,11 +172,15 @@ def partition_mesh(mesh, part_per_element, part_nr): if parent_facial_group.neighbors[idx] >= 0: if face == parent_facial_group.element_faces[idx]: rank_neighbor = parent_facial_group.neighbors[idx] - grp_start_elem = 0 + rank_neighbor_face = parent_facial_group.neighbor_faces[idx] + mgrp_start_elem = 0 + pgrp_start_elem = 0 for grp in range(parent_group): - grp_start_elem += mesh.groups[grp].nelements + mgrp_start_elem += mesh.groups[grp].nelements + for grp in range(num_groups): + pgrp_start_elem += part_mesh.groups[grp].nelements neighbor_part_num = part_per_element[ - rank_neighbor + grp_start_elem] + rank_neighbor + mgrp_start_elem] tag = tag & ~part_mesh.boundary_tag_bit(BTAG_ALL) tag = tag | part_mesh.boundary_tag_bit( neighbor_part_num) @@ -179,6 +188,9 @@ def partition_mesh(mesh, part_per_element, part_nr): #print("Boundary face", face, "of element", elem, # "should be connected to element", rank_neighbor, # "in partition", neighbor_part_num) + tags_to_part_adj[neighbor_part_num].add_connection( + elem + pgrp_start_elem, face, + rank_neighbor + mgrp_start_elem, rank_neighbor_face) return (part_mesh, queried_elems) diff --git a/test/test_meshmode.py b/test/test_meshmode.py index f89a3e28b744278a9e76d1f31ae35dce0ae6fcb5..f492613440bdf9e0e5908c37215b2dee7c2c1a44 100644 --- a/test/test_meshmode.py +++ b/test/test_meshmode.py @@ -50,7 +50,7 @@ logger = logging.getLogger(__name__) # {{{ partition_mesh ''' -#TODO facial_adjacency_groups is not available in torus. +#TODO facial_adjacency_groups is not available in generate_torus. def test_partition_torus_mesh(): from meshmode.mesh.generation import generate_torus my_mesh = generate_torus(2, 1, n_outer=2, n_inner=2) @@ -67,6 +67,7 @@ def test_partition_torus_mesh(): assert part_mesh2.nelements == 2 ''' + def test_partition_boxes_mesh(): n = 5 num_parts = 3