From dcf4ff9693fb7b40d5f902c4a61a3faceec1dcfe Mon Sep 17 00:00:00 2001 From: Shivam Gupta <sgupta72@illinois.edu> Date: Mon, 20 Apr 2015 05:21:10 -0500 Subject: [PATCH] added test for connectivity, refiner passes for single generation refinement, but fails multigeneration refinement --- test/test_meshmode.py | 68 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/test/test_meshmode.py b/test/test_meshmode.py index 9455098e..6280707a 100644 --- a/test/test_meshmode.py +++ b/test/test_meshmode.py @@ -399,6 +399,74 @@ def test_lookup_tree(do_plot=False): with open("tree.dat", "w") as outf: tree.visualize(outf) +#construct vertex vertex_index +def get_vertex(mesh, vertex_index): + vertex = np.empty([mesh.dim]) + for i_cur_dim, cur_dim_coords in enumerate(mesh.vertices): + vertex[i_cur_dim] = cur_dim_coords[vertex_index] + return vertex + +def test_refiner_connectivity(mesh): + def group_and_iel_to_global_iel(igrp, iel): + return mesh.groups[igrp].element_nr_base + iel + + from meshmode.mesh.tools import make_element_lookup_tree + tree = make_element_lookup_tree(mesh) + + from meshmode.mesh.processing import find_bounding_box + bbox_min, bbox_max = find_bounding_box(mesh) + + extent = bbox_max-bbox_min + cnx = mesh.element_connectivity + nvertices_per_element = len(mesh.groups[0].vertex_indices[0]) + #stores connectivity obtained from geometry using barycentric coordinates + connected_to_element_geometry = np.zeros([mesh.nelements, mesh.nelements], dtype=bool) + #store connectivity obtained from mesh's connectivity + connected_to_element_connectivity = np.zeros([mesh.nelements, mesh.nelements], dtype=bool) + + import six + for igrp, grp in enumerate(mesh.groups): + iel_base = grp.element_nr_base + for iel_grp in six.moves.range(grp.nelements): + + iel_g = group_and_iel_to_global_iel(igrp, iel_grp) + nb_starts = cnx.neighbors_starts + for nb_iel_g in cnx.neighbors[nb_starts[iel_g]:nb_starts[iel_g+1]]: + connected_to_element_connectivity[nb_iel_g, iel_g] = True + connected_to_element_connectivity[iel_g, nb_iel_g] = True + + for vertex_index in grp.vertex_indices[iel_grp]: + vertex = get_vertex(mesh, vertex_index) + #check which elements touch this vertex + for bounding_igrp, bounding_iel in tree.generate_matches(vertex): + bounding_grp = mesh.groups[bounding_igrp] + + last_bounding_vertex = get_vertex(mesh, \ + bounding_grp.vertex_indices[bounding_iel][nvertices_per_element-1]) + transformation = np.empty([mesh.dim, nvertices_per_element-1]) + vertex_transformed = vertex - last_bounding_vertex + for ibounding_vertex_index, bounding_vertex_index in \ + enumerate(bounding_grp.vertex_indices[bounding_iel][:nvertices_per_element-1]): + bounding_vertex = get_vertex(mesh, bounding_vertex_index) + transformation[:,ibounding_vertex_index] = bounding_vertex - last_bounding_vertex + barycentric_coordinates = np.linalg.solve(transformation, vertex_transformed) + is_connected = True + sum_of_coords = 0.0 + for coord in barycentric_coordinates: + if coord < 0: + is_connected = False + sum_of_coords += coord + if sum_of_coords > 1: + is_connected = False + if is_connected: + connected_to_element_geometry[group_and_iel_to_global_iel(bounding_igrp, bounding_iel),\ + group_and_iel_to_global_iel(igrp, iel_grp)] = True + connected_to_element_geometry[group_and_iel_to_global_iel(igrp, iel_grp),\ + group_and_iel_to_global_iel(bounding_igrp, bounding_iel)] = True + #print connected_to_element_geometry + #print connected_to_element_connectivity + assert (connected_to_element_geometry == connected_to_element_connectivity).all() + if __name__ == "__main__": import sys -- GitLab