From 07f8e10d5f2005493863dd26b9b3eef37a84d90a Mon Sep 17 00:00:00 2001
From: Shivam Gupta <sgupta72@illinois.edu>
Date: Sat, 23 Apr 2016 23:23:57 -0500
Subject: [PATCH] Done

---
 examples/plot-connectivity.py | 311 +++++++++++++++++++++++++++++++---
 1 file changed, 291 insertions(+), 20 deletions(-)

diff --git a/examples/plot-connectivity.py b/examples/plot-connectivity.py
index c5a6439b..1de09830 100644
--- a/examples/plot-connectivity.py
+++ b/examples/plot-connectivity.py
@@ -4,7 +4,7 @@ import numpy as np  # noqa
 import pyopencl as cl
 import random
 import os
-order = 4
+order = 1
 
 
 def main():
@@ -13,22 +13,20 @@ def main():
 
     from meshmode.mesh.generation import (  # noqa
             generate_icosphere, generate_icosahedron,
-            generate_torus)
+            generate_torus, generate_box_mesh)
     #mesh = generate_icosphere(1, order=order)
     #mesh = generate_icosahedron(1, order=order)
-    mesh = generate_torus(3, 1, order=order)
+    #mesh = generate_torus(3, 1, order=order)
+    mesh =  generate_box_mesh(3*(np.linspace(0, 1, 5),))
     from meshmode.mesh.refinement import Refiner
     r = Refiner(mesh)
     #mesh = r.refine(0)
-    from meshmode.discretization import Discretization
     from meshmode.discretization.poly_element import \
             PolynomialWarpAndBlendGroupFactory
 
-    discr = Discretization(
-            cl_ctx, mesh, PolynomialWarpAndBlendGroupFactory(order))
-
-    from meshmode.discretization.visualization import make_visualizer
-    vis = make_visualizer(queue, discr, order=1)
+    discr = Discretization(cl_ctx, mesh, PolynomialWarpAndBlendGroupFactory(order)) 
+    from meshmode.discretization.visualization import make_visualizer 
+    vis = make_visualizer(queue, discr, order)
     os.remove("geometry.vtu")
     os.remove("connectivity.vtu")
     vis.write_vtk_file("geometry.vtu", [
@@ -41,28 +39,223 @@ def main():
     write_mesh_connectivity_vtk_file("connectivity.vtu",
             mesh)
 
+#construct vertex vertex_index
+def get_vertex(mesh, vertex_index):
+    vertex = np.empty([len(mesh.vertices)])
+    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):
+                    if bounding_igrp == igrp and bounding_iel == iel_grp:
+                        continue
+                    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([len(mesh.vertices), 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 "GEOMETRY: "
+    print connected_to_element_geometry 
+    print "CONNECTIVITY: "
+    print connected_to_element_connectivity
+    cmpmatrix = (connected_to_element_geometry == connected_to_element_connectivity)
+    print cmpmatrix
+    print np.where(cmpmatrix == False)
+    if not (connected_to_element_geometry == connected_to_element_connectivity).all():
+        cmpmatrix = connected_to_element_connectivity == connected_to_element_geometry
+        for ii, i in enumerate(cmpmatrix):
+            for ij, j in enumerate(i):
+                if j == False:
+                    print ii, ij, "GEOMETRY: ", connected_to_element_geometry[ii][ij], "CONNECTIVITY: ", connected_to_element_connectivity[ii][ij]
+    #assert (connected_to_element_geometry == connected_to_element_connectivity).all()
+
+def test_refiner_connectivity_efficient(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) 
+    connected_to_element_geometry = []
+    connected_to_element_connectivity = []
+    import six
+    for i in six.moves.range(mesh.nelements):
+        connected_to_element_geometry.append([])
+        connected_to_element_connectivity.append([])
+
+    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]]:
+                if iel_g not in connected_to_element_connectivity[nb_iel_g]:
+                    connected_to_element_connectivity[nb_iel_g].append(iel_g)
+                if nb_iel_g not in connected_to_element_connectivity[iel_g]:
+                    connected_to_element_connectivity[iel_g].append(nb_iel_g)
+                #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):
+                    if bounding_igrp == igrp and bounding_iel == iel_grp:
+                        continue
+                    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([len(mesh.vertices), 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:
+                        el1 = group_and_iel_to_global_iel(bounding_igrp, bounding_iel)
+                        el2 = group_and_iel_to_global_iel(igrp, iel_grp)
+                        if el2 not in connected_to_element_geometry[el1]:
+                            connected_to_element_geometry[el1].append(el2)
+                        if el1 not in connected_to_element_geometry[el2]:
+                            connected_to_element_geometry[el2].append(el1)
+    from collections import Counter
+    for i in six.moves.range(mesh.nelements):
+        assert(Counter(connected_to_element_connectivity[i]) == Counter(connected_to_element_geometry[i]))
+
 
 def main2():
     cl_ctx = cl.create_some_context()
     queue = cl.CommandQueue(cl_ctx)
-
     from meshmode.mesh.generation import (  # noqa
             generate_icosphere, generate_icosahedron,
-            generate_torus, generate_regular_rect_mesh)
-    #mesh = generate_icosphere(1, order=order)
+            generate_torus, generate_regular_rect_mesh,
+            generate_box_mesh)
+#    mesh = generate_icosphere(1, order=order)
     #mesh = generate_icosahedron(1, order=order)
-#    mesh = generate_torus(3, 1, order=order)
-    mesh = generate_regular_rect_mesh()
+    #mesh = generate_torus(3, 1, order=order)
+    #mesh = generate_regular_rect_mesh()
+    mesh =  generate_box_mesh(3*(np.linspace(0, 1, 3),))
+    print "NELEMENTS: ", mesh.nelements
+    #print mesh
+    test_refiner_connectivity(mesh);
     from meshmode.mesh.refinement import Refiner
     r = Refiner(mesh)
-    times = random.randint(1, 1)
+    #random.seed(0)
+    times = random.randint(4, 4)
+    count = 0
+    poss_flags = np.ones(len(mesh.groups[0].vertex_indices))
     for time in xrange(times):
+        print "NELS:", mesh.nelements
+        count = 0
         flags = np.zeros(len(mesh.groups[0].vertex_indices))
-#        for i in xrange(0, len(flags)):
-#            flags[i] = random.randint(0, 1)
+        for i in xrange(0, len(flags)):
+                flags[i] = random.randint(0, 1)
+                if flags[i] == 1:
+                    #print "REFINING:", i
+                    count += 1
         mesh = r.refine(flags)
+        #from meshmode.mesh.visualization import draw_2d_mesh
+        #draw_2d_mesh(mesh, True, True, True, fill=None)
+        import matplotlib.pyplot as pt
+        pt.show()
+
+        poss_flags = np.zeros(len(mesh.groups[0].vertex_indices))
+        for i in xrange(0, len(flags)):
+            poss_flags[i] = flags[i]
+        for i in xrange(len(flags), len(poss_flags)):
+            poss_flags[i] = 1
+    '''
+    flags = np.zeros(len(mesh.groups[0].vertex_indices))
+    flags[0] = 1
+    flags[1] = 1
+    mesh = r.refine(flags)
+    flags = np.zeros(len(mesh.groups[0].vertex_indices))
+    flags[0] = 1
+    flags[1] = 1
+    flags[2] = 1
+    mesh = r.refine(flags)
+    '''
+    test_refiner_connectivity(mesh)
+    #r.print_rays(70)
+    #r.print_rays(117)
+    #r.print_hanging_elements(10)
+    #r.print_hanging_elements(117)
+    #r.print_hanging_elements(757)
+    '''
     from meshmode.mesh.visualization import draw_2d_mesh
-    draw_2d_mesh(mesh, True, True, True);
+    draw_2d_mesh(mesh, True, True, True, fill=None)
     import matplotlib.pyplot as pt
     pt.show()
     '''
@@ -76,6 +269,7 @@ def main2():
     from meshmode.discretization.visualization import make_visualizer
     vis = make_visualizer(queue, discr, order)
     os.remove("connectivity2.vtu")
+    os.remove("geometry2.vtu")
     vis.write_vtk_file("geometry2.vtu", [
         ("f", discr.nodes()[0]),
         ])
@@ -85,7 +279,84 @@ def main2():
 
     write_mesh_connectivity_vtk_file("connectivity2.vtu",
             mesh)
-    '''
+
+def all_refine(num_mesh, depth, fname):
+    import six
+    from meshmode.mesh.generation import (  # noqa
+            generate_icosphere, generate_icosahedron,
+            generate_torus, generate_regular_rect_mesh,
+            generate_box_mesh)
+    import timeit
+    nelements = []
+    runtimes = []
+    for el_fact in six.moves.range(2, num_mesh+2):
+        mesh = generate_box_mesh(3*(np.linspace(0, 1, el_fact),))
+        from meshmode.mesh.refinement import Refiner
+        r = Refiner(mesh)
+        for time in xrange(depth):
+            flags = np.ones(len(mesh.groups[0].vertex_indices))
+            if time < depth-1:
+                mesh = r.refine(flags)
+            else:
+                start = timeit.default_timer()
+                mesh = r.refine(flags)
+                stop = timeit.default_timer()
+                nelements.append(mesh.nelements)
+                runtimes.append(stop-start)
+        #test_refiner_connectivity_efficient(mesh)
+    import matplotlib.pyplot as pt
+    pt.plot(nelements, runtimes, "o")
+    pt.savefig(fname)
+    pt.clf()
+    #pt.show()
+
+def uniform_refine(num_mesh, fract, depth, fname):
+    import six
+    from meshmode.mesh.generation import (  # noqa
+            generate_icosphere, generate_icosahedron,
+            generate_torus, generate_regular_rect_mesh,
+            generate_box_mesh)
+    import timeit
+    nelements = []
+    runtimes = []
+    for el_fact in six.moves.range(2, num_mesh+2):
+        mesh = generate_box_mesh(3*(np.linspace(0, 1, el_fact),))
+        from meshmode.mesh.refinement import Refiner
+        r = Refiner(mesh)
+        all_els = range(mesh.nelements)
+        for time in xrange(depth):
+            flags = np.zeros(mesh.nelements)
+            from random import shuffle
+            shuffle(all_els)
+            nels_this_round = 0
+            for i in six.moves.range(len(all_els)):
+                if i / len(flags) > fract:
+                    break
+                flags[all_els[i]] = 1
+                nels_this_round += 1
+
+            if time < depth-1:
+                mesh = r.refine(flags)
+            else:
+                start = timeit.default_timer()
+                mesh = r.refine(flags)
+                stop = timeit.default_timer()
+                nelements.append(mesh.nelements)
+                runtimes.append(stop-start)
+            all_els = []
+            for i in six.moves.range(len(flags)):
+                if flags[i]:
+                    all_els.append(i)
+            for i in six.moves.range(len(flags), mesh.nelements):
+                all_els.append(i)
+        test_refiner_connectivity(mesh)
+    import matplotlib.pyplot as pt
+    pt.plot(nelements, runtimes, "o")
+    pt.savefig(fname)
+    pt.clf()
 if __name__ == "__main__":
-#    main()
+    print "HEREERERE"
+    #all_refine(3, 2, 'all_a.pdf')
+    #all_refine(3, 3, 'all_b.pdf')
+    #uniform_refine(3, 0.2, 3, 'uniform_a.pdf') 
     main2()
-- 
GitLab