From 00af31a197d7f31d46f317f0464a8b04232930a3 Mon Sep 17 00:00:00 2001
From: Shivam Gupta <sgupta72@illinois.edu>
Date: Sat, 26 Mar 2016 14:11:20 +0530
Subject: [PATCH] Fixed 2D completely I think

---
 meshmode/mesh/refinement.py | 220 +++++++++++++++++++++++++-----------
 1 file changed, 157 insertions(+), 63 deletions(-)

diff --git a/meshmode/mesh/refinement.py b/meshmode/mesh/refinement.py
index 9713b71..9758f7d 100644
--- a/meshmode/mesh/refinement.py
+++ b/meshmode/mesh/refinement.py
@@ -55,8 +55,8 @@ class Refiner(object):
     def __init__(self, mesh):
         #print 'herlkjjlkjasdf'
         from llist import dllist, dllistnode
-        from meshmode.mesh.tesselate  import tesselatetri
-        self.simplex_node_tuples, self.simplex_result = tesselatetri()
+        from meshmode.mesh.tesselate  import tesselatetet
+        self.simplex_node_tuples, self.simplex_result = tesselatetet()
         self.last_mesh = mesh
         
         # {{{ initialization
@@ -195,29 +195,19 @@ class Refiner(object):
         
         return self.last_mesh
     
-    def update_connectivity(self, element_rays, to_replace, replace_to):
-        import six
-        for node in element_rays:
-            if to_replace in node.adjacent_elements:
-                node.adjacent_elements.remove(to_replace)
-            if replace_to not in node.adjacent_elements:
-                node.adjacent_elements.append(replace_to)
-
-        next_element_rays = []
-        for i in six.moves.range(len(element_rays)):
-            for j in six.moves.range(i+1, len(element_rays)):
-                if element_rays[i].midpoint is not None and element_rays[j].midpoint is not None:
-                    min_midpoint = min(element_rays[i].midpoint, element_rays[j].midpoint)
-                    max_midpoint = max(element_rays[i].midpoint, element_rays[j].midpoint)
-                    vertex_pair = (min_midpoint, max_midpoint)
-                    if vertex_pair in self.pair_map:
-                        next_element_rays.append(self.pair_map[vertex_pair])
-                    else:
-                        return
-                else:
-                    return
-        self.update_connectivity(next_element_rays, to_replace, replace_to)
 
+    def get_leaves(self, cur_node):
+        queue = [cur_node]
+        res = []
+        while queue:
+            vertex = queue.pop(0)
+            #if leaf node
+            if vertex.left is None and vertex.right is None:
+                res.append(vertex)
+            else:
+                queue.append(vertex.left)
+                queue.append(vertex.right)
+        return res
 
     #refine_flag tells you which elements to split as a numpy array of bools
     def refine(self, refine_flags):
@@ -257,9 +247,54 @@ class Refiner(object):
 
         vertices = np.empty([len(self.last_mesh.vertices), nvertices])
 
-        new_hanging_vertex_element = []
-        for i in six.moves.range(nvertices):
-            new_hanging_vertex_element.append([])
+        new_hanging_vertex_element = [
+                [] for i in six.moves.range(nvertices)]
+
+        def update_connectivity(element_rays, to_replace, replace_to):
+            import six
+            for node in element_rays:
+                if to_replace in node.adjacent_elements:
+                    node.adjacent_elements.remove(to_replace)
+                if replace_to not in node.adjacent_elements:
+                    node.adjacent_elements.append(replace_to)
+
+            next_element_rays = []
+            for i in six.moves.range(len(element_rays)):
+                for j in six.moves.range(i+1, len(element_rays)):
+                    if element_rays[i].midpoint is not None and element_rays[j].midpoint is not None:
+                        min_midpoint = min(element_rays[i].midpoint, element_rays[j].midpoint)
+                        max_midpoint = max(element_rays[i].midpoint, element_rays[j].midpoint)
+                        vertex_pair = (min_midpoint, max_midpoint)
+                        if vertex_pair in self.pair_map:
+                            next_element_rays.append(self.pair_map[vertex_pair])
+                        else:
+                            return
+                    else:
+                        return
+            update_connectivity(next_element_rays, to_replace, replace_to)
+
+        def add_hanging_vertex_el(v_index, el):
+            assert not (v_index == 37 and el == 48)
+
+            new_hanging_vertex_element[v_index].append(el)
+
+        def remove_ray_el(ray, el):
+            ray.remove(el)
+
+        def check_adjacent_elements(groups, nelements_in_grp):
+            for grp in groups:
+                iel_base = 0
+                for iel_grp in six.moves.range(nelements_in_grp):
+                    vertex_indices = grp[iel_grp]
+                    for i in six.moves.range(len(vertex_indices)):
+                        for j in six.moves.range(i+1, len(vertex_indices)):
+                            min_index = min(vertex_indices[i], vertex_indices[j])
+                            max_index = max(vertex_indices[i], vertex_indices[j])
+                            cur_node = self.pair_map[(min_index, max_index)]
+                            assert ((iel_base+iel_grp) in cur_node.adjacent_elements)
+
+                            
+
 
         for i in six.moves.range(len(self.last_mesh.vertices)):
             for j in six.moves.range(len(self.last_mesh.vertices[i])):
@@ -306,7 +341,8 @@ class Refiner(object):
                                 for el in cur_node.adjacent_elements:
                                     if el != (iel_base+iel_grp):
                                         vertex_elements[len(vertex_elements)-1].append(el)
-                                        new_hanging_vertex_element[vertices_index].append(el)
+                                        #new_hanging_vertex_element[vertices_index].append(el)
+                                        add_hanging_vertex_el(vertices_index, el)
                                 #compute midpoint coordinates
                                 for k in six.moves.range(len(self.last_mesh.vertices)):
                                     vertices[k, vertices_index] = \
@@ -330,6 +366,8 @@ class Refiner(object):
                                     if el != (iel_base + iel_grp) and el not in (
                                         vertex_elements[len(vertex_elements)-1]):
                                         vertex_elements[len(vertex_elements)-1].append(el)
+                                if (iel_base+iel_grp) in new_hanging_vertex_element[cur_midpoint]:
+                                    new_hanging_vertex_element[cur_midpoint].remove(iel_base+iel_grp)
                                 midpoint_vertices.append(cur_midpoint)
 
                     #fix connectivity for elements
@@ -362,48 +400,58 @@ class Refiner(object):
                             max_element_index = element_indices_1
                         vertex_pair = (min_index, max_index)
                         cur_node = self.pair_map[vertex_pair]
+                        '''
                         if cur_node.direction:
                             first_element_index = min_element_index
                             second_element_index = max_element_index
                         else:
                             first_element_index = max_element_index
                             second_element_index = min_element_index
+                        '''
+                        first_element_index = min_element_index
+                        second_element_index = max_element_index
                         queue = [cur_node.left]
                         while queue:
                             vertex = queue.pop(0)
                             #if leaf node
                             if vertex.left is None and vertex.right is None:
                                 node_elements = vertex.adjacent_elements
-                                node_elements.remove(iel_base+iel_grp)
+
+                                remove_ray_el(node_elements, iel_base+iel_grp)
+                                #node_elements.remove(iel_base+iel_grp)
                                 for k in first_element_index:
                                     if k == 0:
                                         node_elements.append(iel_base+iel_grp)
                                     else:
                                         node_elements.append(iel_base+nelements_in_grp+k-1)
                                 if new_hanging_vertex_element[vertex.left_vertex] and \
-                                    new_hanging_vertex_element[vertex.left_vertex].count(
-                                    iel_base+iel_grp):
+                                        new_hanging_vertex_element[vertex.left_vertex].count(
+                                        iel_base+iel_grp):
                                     new_hanging_vertex_element[vertex.left_vertex].remove(
                                         iel_base+iel_grp)
                                     for k in first_element_index:
                                         if k == 0:
-                                            new_hanging_vertex_element[vertex.left_vertex].append(
-                                                iel_base+iel_grp)
+                                            el_to_add = iel_base+iel_grp
                                         else:
-                                            new_hanging_vertex_element[vertex.left_vertex].append(
-                                                iel_base+nelements_in_grp+k-1)
+                                            el_to_add = iel_base+nelements_in_grp+k-1
+
+                                        add_hanging_vertex_el(vertex.left_vertex,
+                                                el_to_add)
+                                        del el_to_add
+
                                 if new_hanging_vertex_element[vertex.right_vertex] and \
-                                    new_hanging_vertex_element[vertex.right_vertex].count(
-                                    iel_base+iel_grp):
+                                        new_hanging_vertex_element[vertex.right_vertex].count(
+                                        iel_base+iel_grp):
                                     new_hanging_vertex_element[vertex.right_vertex].remove(
                                         iel_base+iel_grp)
                                     for k in first_element_index:
                                         if k == 0:
-                                            new_hanging_vertex_element[vertex.right_vertex].append(
-                                                iel_base+iel_grp)
+                                            el_to_add = iel_base+iel_grp
                                         else:
-                                            new_hanging_vertex_element[vertex.right_vertex].append(
-                                                iel_base+nelements_in_grp+k-1)
+                                            el_to_add = iel_base+nelements_in_grp+k-1
+
+                                        add_hanging_vertex_el(vertex.right_vertex, el_to_add)
+                                        del el_to_add
                             else:
                                 queue.append(vertex.left)
                                 queue.append(vertex.right)
@@ -414,7 +462,8 @@ class Refiner(object):
                             #if leaf node
                             if vertex.left is None and vertex.right is None:
                                 node_elements = vertex.adjacent_elements
-                                node_elements.remove(iel_base+iel_grp)
+                                #node_elements.remove(iel_base+iel_grp)
+                                remove_ray_el(node_elements, iel_base+iel_grp)
                                 for k in second_element_index:
                                     if k == 0:
                                         node_elements.append(iel_base+iel_grp)
@@ -427,11 +476,14 @@ class Refiner(object):
                                         iel_base+iel_grp)
                                     for k in second_element_index:
                                         if k == 0:
-                                            new_hanging_vertex_element[vertex.left_vertex].append(
-                                                iel_base+iel_grp)
+                                            el_to_add = iel_base+iel_grp
                                         else:
-                                            new_hanging_vertex_element[vertex.left_vertex].append(
-                                                iel_base+nelements_in_grp+k-1)
+                                            el_to_add = iel_base+nelements_in_grp+k-1
+
+                                        add_hanging_vertex_el(vertex.left_vertex, el_to_add)
+
+                                        del el_to_add
+
                                 if new_hanging_vertex_element[vertex.right_vertex] and \
                                     new_hanging_vertex_element[vertex.right_vertex].count(
                                     iel_base+iel_grp):
@@ -439,15 +491,31 @@ class Refiner(object):
                                         iel_base+iel_grp)
                                     for k in second_element_index:
                                         if k == 0:
-                                            new_hanging_vertex_element[vertex.right_vertex].append(
-                                                iel_base+iel_grp)
+                                            el_to_add = iel_base+iel_grp
                                         else:
-                                            new_hanging_vertex_element[vertex.right_vertex].append(
-                                                iel_base+nelements_in_grp+k-1)
+                                            el_to_add = iel_base+nelements_in_grp+k-1
+
+                                        add_hanging_vertex_el(vertex.right_vertex, el_to_add)
+                                        del el_to_add
                             else:
                                 queue.append(vertex.left)
                                 queue.append(vertex.right)
-
+                    if (7, 37) in self.pair_map and (7, 38) in self.pair_map and (37, 38) in self.pair_map:
+                        print iel_base+iel_grp
+                        #self.print_rays(9)
+                        leaves = self.get_leaves(self.pair_map[(7, 37)])
+                        for i in leaves:
+                            print (7, 37), i.adjacent_elements
+                        leaves = self.get_leaves(self.pair_map[(7, 38)])
+                        for i in leaves:
+                            print (7, 38), i.adjacent_elements
+                        leaves = self.get_leaves(self.pair_map[(37, 38)])
+                        for i in leaves:
+                            print (37, 38), i.adjacent_elements
+
+                        print self.pair_map[(7, 37)].adjacent_elements, self.pair_map[(7, 37)].left, self.pair_map[(7, 37)].right
+                        print self.pair_map[(7, 38)].adjacent_elements, self.pair_map[(7, 38)].left, self.pair_map[(7, 38)].right
+                        print self.pair_map[(37, 38)].adjacent_elements, self.pair_map[(37, 38)].left, self.pair_map[(37, 38)].right
                     #update connectivity of edges in the center
                     unique_vertex_pairs = [
                         (i,j) for i in range(len(midpoint_vertices)) for j in range(i+1,
@@ -488,11 +556,12 @@ class Refiner(object):
                                         iel_base+iel_grp)
                                     for k in element_indices:
                                         if k == 0:
-                                            new_hanging_vertex_element[vertex.left_vertex].append(
-                                                iel_base+iel_grp)
+                                            el_to_add = iel_base+iel_grp
                                         else:
-                                            new_hanging_vertex_element[vertex.left_vertex].append(
-                                                iel_base+nelements_in_grp+k-1)
+                                            el_to_add = iel_base+nelements_in_grp+k-1
+                                        add_hanging_vertex_el(vertex.left_vertex, el_to_add)
+                                        del el_to_add
+                                        
                                 if new_hanging_vertex_element[vertex.right_vertex] and \
                                     new_hanging_vertex_element[vertex.right_vertex].count(
                                     iel_base+iel_grp):
@@ -500,11 +569,12 @@ class Refiner(object):
                                         iel_base+iel_grp)
                                     for k in second_element_index:
                                         if k == 0:
-                                            new_hanging_vertex_element[vertex.right_vertex].append(
-                                                iel_base+iel_grp)
+                                            el_to_add = iel_base+iel_grp
                                         else:
-                                            new_hanging_vertex_element[vertex.right_vertex].append(
-                                                iel_base+nelements_in_grp+k-1)
+                                            el_to_add = iel_base+nelements_in_grp+k-1
+
+                                        add_hanging_vertex_el(vertex.right_vertex, el_to_add)
+                                        del el_to_add
                             else:
                                 queue.append(vertex.left)
                                 queue.append(vertex.right)
@@ -566,15 +636,20 @@ class Refiner(object):
                                 element_rays.append(self.pair_map[(
                                     min(vertex_j, vertex_k), max(vertex_j, vertex_k))])
                                 if tup_index != 0:
-                                    self.update_connectivity(element_rays, iel_base+iel_grp,
+                                    update_connectivity(element_rays, iel_base+iel_grp,
                                             nelements_in_grp+tup_index-1)
                                 else:
-                                    self.update_connectivity(element_rays, iel_base+iel_grp,
+                                    update_connectivity(element_rays, iel_base+iel_grp,
                                             -1)
                                     z_element_rays.append(element_rays)
                         for el in z_element_rays:
-                            self.update_connectivity(el, -1, iel_base+iel_grp)
+                            update_connectivity(el, -1, iel_base+iel_grp)
                     nelements_in_grp += len(self.simplex_result)-1
+                    #assert ray connectivity
+                    check_adjacent_elements(groups, nelements_in_grp)
+
+
+
         self.hanging_vertex_element = new_hanging_vertex_element
         from meshmode.mesh.generation import make_group_from_vertices
         grp = []
@@ -598,8 +673,27 @@ class Refiner(object):
                 vertex_pair = (mn, mx)
                 print 'LEFT VERTEX:', self.pair_map[vertex_pair].left_vertex
                 print 'RIGHT VERTEX:', self.pair_map[vertex_pair].right_vertex
-                print 'ADJACENT:', self.pair_map[vertex_pair].adjacent_elements
+                print 'ADJACENT:'
+                rays = self.get_leaves(self.pair_map[vertex_pair])
+                for k in rays:
+                    print k.adjacent_elements
+    '''
+    def print_rays(self, groups, ind):
+        import six
+        for i in six.moves.range(len(groups[0][ind])):
+            for j in six.moves.range(i+1, len(groups[0][ind])):
+                mn = min(groups[0][ind][i], groups[0][ind][j])
+                mx = max(groups[0][ind][i], groups[0][ind][j])
+                vertex_pair = (mn, mx)
+                print 'LEFT VERTEX:', self.pair_map[vertex_pair].left_vertex
+                print 'RIGHT VERTEX:', self.pair_map[vertex_pair].right_vertex
+                print 'ADJACENT:'
+                rays = self.get_leaves(self.pair_map[vertex_pair])
+                for k in rays:
+                    print k.adjacent_elements
+    '''
 
+ 
     def print_hanging_elements(self, ind):
         import six
         for i in self.last_mesh.groups[0].vertex_indices[ind]:
-- 
GitLab