diff --git a/meshmode/discretization/connection/__init__.py b/meshmode/discretization/connection/__init__.py index bdb0f5250256ad6e8a67a10d9b735c3ff085da4b..e2a451133e21a871acab331e859a5fb10033e23b 100644 --- a/meshmode/discretization/connection/__init__.py +++ b/meshmode/discretization/connection/__init__.py @@ -35,7 +35,7 @@ from meshmode.discretization.connection.face import ( FRESTR_INTERIOR_FACES, FRESTR_ALL_FACES, make_face_restriction, make_face_to_all_faces_embedding) from meshmode.discretization.connection.opposite_face import \ - make_opposite_face_connection + make_opposite_face_connection, make_opposite_partition_connection from meshmode.discretization.connection.refinement import \ make_refinement_connection diff --git a/meshmode/discretization/connection/opposite_face.py b/meshmode/discretization/connection/opposite_face.py index 6ce70b2a11b148ce6a1e2cca6f7588ac2549aada..629782ffe0440cd2d89935261b4766c26c6b19ec 100644 --- a/meshmode/discretization/connection/opposite_face.py +++ b/meshmode/discretization/connection/opposite_face.py @@ -392,4 +392,40 @@ def make_opposite_face_connection(volume_to_bdry_conn): # }}} + +def make_opposite_partition_connection(vol_to_bdry_conns): + """ + Given a list of boundary restriction connections *volume_to_bdry_conn*, + return a :class:`DirectDiscretizationConnection` that performs data + exchange across adjacent faces of different partitions. + + :arg :vol_to_bdry_conns A list of *volume_to_bdry_conn* corresponding to + a partition of a parent mesh. + """ + + disc_conns = [] + return disc_conns + nparts = len(vol_to_bdry_conns) + from meshmode.discretization.connection import ( + DirectDiscretizationConnection, DiscretizationConnectionElementGroup) + for part_idx in range(nparts): + vol_discr = vol_to_bdry_conns[part_idx].from_discr + vol_mesh = vol_discr.mesh + bdry_discr = vol_to_bdry_conns[part_idx].to_discr + + with cl.CommandQueue(vol_discr.cl_context) as queue: + # Create a list of batches. Each batch contains interpolation + # data from one partition to another. + nop + + disc_conns.append(DirectDiscretizationConnection( + from_discr=bdry_discr, + to_discr=bdry_discr, + groups=[ + DiscretizationConnectionElementGroup(batches=batches) + for batches in groups], + is_surjective=True)) + + return disc_conns + # vim: foldmethod=marker diff --git a/test/test_meshmode.py b/test/test_meshmode.py index e2251a36a1b1fb47ef071c7b4d5001ced25deba0..f3f9802bbe7d096b916e352266a2137bf38d15e6 100644 --- a/test/test_meshmode.py +++ b/test/test_meshmode.py @@ -78,11 +78,18 @@ def test_partition_interpolation(ctx_getter): vol_discrs = [Discretization(cl_ctx, part_meshes[i], group_factory) for i in range(num_parts)] - from meshmode.discretization.connection import (make_face_restriction, - check_connection) + from meshmode.discretization.connection import make_face_restriction bdry_connections = [make_face_restriction(vol_discrs[i], group_factory, FRESTR_INTERIOR_FACES) for i in range(num_parts)] + from meshmode.discretization.connection import \ + make_opposite_partition_connection + opp_faces = make_opposite_partition_connection(bdry_connections) + + from meshmode.discretization.connection import check_connection + for opp_face in opp_faces: + check_connection(opp_face) + # {{{ partition_mesh