diff --git a/meshmode/mesh/refinement.py b/meshmode/mesh/refinement.py index 2a563cf83591b37b77404df9b995d94e7fd2ee9a..cd2ce945c7277274d0138ecff8bfedc8d12736a2 100644 --- a/meshmode/mesh/refinement.py +++ b/meshmode/mesh/refinement.py @@ -51,12 +51,14 @@ class Adj: :attr:`vertex`. """ - def __init__(self, vertex=None, elements=[None, None], velements=[None, None]): + def __init__(self, vertex=None, elements=[None, None], velements + =[None, None]): self.vertex = vertex self.elements = elements self.velements = velements def __str__(self): - return 'vertex: ' + str(self.vertex) + ' ' + 'elements: ' + str(self.elements) + ' velements: ' + str(self.velements) + return 'vertex: ' + str(self.vertex) + ' ' + 'elements: ' +\ + str(self.elements) + ' velements: ' + str(self.velements) #map pair of vertices to ray and midpoint class PairMap: """Describes a segment of a ray between two vertices. @@ -80,15 +82,21 @@ class PairMap: def __init__(self, ray=None, d = True, midpoint=None): self.ray = ray - #direction in ray, True means that second node (bigger index) is after first in ray + #direction in ray, True means that second node (bigger index + #) is after first in ray self.d = d self.midpoint = midpoint def __str__(self): - return 'ray: ' + str(self.ray) + ' d: ' + str(self.d) + ' midpoint: ' + str(self.midpoint) + return 'ray: ' + str(self.ray) + ' d: ' + str(self.d) + \ + ' midpoint: ' + str(self.midpoint) class Refiner(object): def __init__(self, mesh): from llist import dllist, dllistnode + from meshmode.mesh.tesselate import tesselatetri + self.tri_node_tuples, self.tri_result = tesselatetri() + print self.tri_node_tuples + print self.tri_result self.last_mesh = mesh # Indices in last_mesh that were split in the last round of # refinement. Only these elements may be split this time @@ -117,30 +125,38 @@ class Refiner(object): # (part of *rays*) self.vertex_to_ray = [] - for i in xrange(nvertices): + import six + for i in six.moves.range(nvertices): self.vertex_to_ray.append({}) for grp in mesh.groups: iel_base = grp.element_nr_base - for iel_grp in xrange(grp.nelements): + for iel_grp in six.moves.range(grp.nelements): #use six.moves.range - for i in range(len(grp.vertex_indices[iel_grp])): - for j in range(i+1, len(grp.vertex_indices[iel_grp])): - vertex_pair = (min(grp.vertex_indices[iel_grp][i], grp.vertex_indices[iel_grp][j]), \ - max(grp.vertex_indices[iel_grp][i], grp.vertex_indices[iel_grp][j])) + + vert_indices = grp.vertex_indices[iel_grp] + + for i in six.moves.range(len(vert_indices)): + for j in six.moves.range(i+1, len(vert_indices)): + + #minimum and maximum of the two indices for storing + #data in vertex_pair + mn_idx = min(vert_indices[i], vert_indices[j]) + mx_idx = max(vert_indices[i], vert_indices[j]) + + vertex_pair = (mn_idx, mx_idx) if vertex_pair not in self.pair_map: els = [] els.append(iel_base+iel_grp) - fr = Adj(min(grp.vertex_indices[iel_grp][i], grp.vertex_indices[iel_grp][j]), els) - to = Adj(max(grp.vertex_indices[iel_grp][i], grp.vertex_indices[iel_grp][j]), [None, None]) + fr = Adj(mn_idx, els) + to = Adj(mx_idx, [None, None]) self.rays.append(dllist([fr, to])) self.pair_map[vertex_pair] = PairMap(len(self.rays) - 1) - self.vertex_to_ray[min(grp.vertex_indices[iel_grp][i], grp.vertex_indices[iel_grp][j])][len(self.rays)-1]\ + self.vertex_to_ray[mn_idx][len(self.rays)-1]\ = self.rays[len(self.rays)-1].nodeat(0) - self.vertex_to_ray[max(grp.vertex_indices[iel_grp][i], grp.vertex_indices[iel_grp][j])][len(self.rays)-1]\ + self.vertex_to_ray[mx_idx][len(self.rays)-1]\ = self.rays[len(self.rays)-1].nodeat(1) else: self.rays[self.pair_map[vertex_pair].ray].nodeat(0).value.elements.append(iel_base+iel_grp) - # }}} #print mesh.groups[0].vertex_indices @@ -186,8 +202,6 @@ class Refiner(object): ind += 1 ''' - - def get_refine_base_index(self): if self.last_split_elements is None: return 0 @@ -199,6 +213,31 @@ class Refiner(object): self.last_mesh.nelements - self.get_refine_base_index(), np.bool) + def get_current_mesh(self): + + from meshmode.mesh import Mesh + #return Mesh(vertices, [grp], element_connectivity=self.generate_connectivity(len(self.last_mesh.groups[group].vertex_indices) \ + # + count*3)) + groups = [] + grpn = 0 + for grp in self.last_mesh.groups: + groups.append(np.empty([len(grp.vertex_indices), + len(self.last_mesh.groups[grpn].vertex_indices[0])], dtype=np.int32)) + for iel_grp in xrange(grp.nelements): + for i in range(0, len(grp.vertex_indices[iel_grp])): + groups[grpn][iel_grp][i] = grp.vertex_indices[iel_grp][i] + grpn += 1 + grp = [] + + from meshmode.mesh.generation import make_group_from_vertices + for grpn in range(0, len(groups)): + grp.append(make_group_from_vertices(self.last_mesh.vertices, groups[grpn], 4)) + self.last_mesh = Mesh(self.last_mesh.vertices, grp,\ + element_connectivity=self.generate_connectivity(len(self.last_mesh.groups[0].vertex_indices),\ + len(self.last_mesh.vertices[0]))) + + return self.last_mesh + #refine_flag tells you which elements to split as a numpy array of bools def refine(self, refine_flags): """ @@ -304,6 +343,7 @@ class Refiner(object): indices_i += 1 ''' import numpy as np + import six # if (isinstance(self.last_mesh.groups[0], SimplexElementGroup) and # self.last_mesh.groups[0].dim == 2): print 'refining' @@ -321,18 +361,22 @@ class Refiner(object): iel_base = grp.element_nr_base nelements = 0 #print grp.nelements - for iel_grp in xrange(grp.nelements): + for iel_grp in six.moves.range(grp.nelements): nelements += 1 + vert_indices = grp.vertex_indices[iel_grp] if refine_flags[iel_base+iel_grp]: nelements += 3 - for i in range(0, len(grp.vertex_indices[iel_grp])): - for j in range(i+1, len(grp.vertex_indices[iel_grp])): - vertex_pair = (min(grp.vertex_indices[iel_grp][i], grp.vertex_indices[iel_grp][j]), \ - max(grp.vertex_indices[iel_grp][i], grp.vertex_indices[iel_grp][j])) - if vertex_pair not in midpoint_already and self.pair_map[vertex_pair].midpoint is None: + for i in six.moves.range(0, len(vert_indices)): + for j in six.moves.range(i+1, len(vert_indices)): + mn_idx = min(vert_indices[i], vert_indices[j]) + mx_idx = max(vert_indices[i], vert_indices[j]) + vertex_pair = (mn_idx, mx_idx) + if vertex_pair not in midpoint_already and \ + self.pair_map[vertex_pair].midpoint is None: nvertices += 1 midpoint_already[vertex_pair] = True - groups.append(np.empty([nelements, len(self.last_mesh.groups[grpn].vertex_indices[grpn])], dtype=np.int32)) + groups.append(np.empty([nelements, + len(grp.vertex_indices[0])], dtype=np.int32)) grpn += 1 totalnelements += nelements @@ -342,14 +386,14 @@ class Refiner(object): # {{{ bring over vertex_indices and vertices info from previous generation - for i in range(0, len(self.last_mesh.vertices)): - for j in range(0, len(self.last_mesh.vertices[i])): + for i in six.moves.range(0, len(self.last_mesh.vertices)): + for j in six.moves.range(0, len(self.last_mesh.vertices[i])): # always use v[i,j] - vertices[i][j] = self.last_mesh.vertices[i][j] + vertices[i,j] = self.last_mesh.vertices[i,j] grpn = 0 for grp in self.last_mesh.groups: - for iel_grp in xrange(grp.nelements): - for i in range(0, len(grp.vertex_indices[iel_grp])): + for iel_grp in six.moves.range(grp.nelements): + for i in six.moves.range(0, len(grp.vertex_indices[iel_grp])): groups[grpn][iel_grp][i] = grp.vertex_indices[iel_grp][i] grpn += 1 grpn = 0 @@ -359,10 +403,10 @@ class Refiner(object): vertices_idx = len(self.last_mesh.vertices[0]) for grp in self.last_mesh.groups: iel_base = grp.element_nr_base - indices_idx = len(grp.vertex_indices) + nelements_in_grp = len(grp.vertex_indices) # np.where - for iel_grp in xrange(grp.nelements): + for iel_grp in six.moves.range(grp.nelements): if refine_flags[iel_base+iel_grp]: # {{{ split element @@ -373,42 +417,52 @@ class Refiner(object): # (in order of vertex pairs in elements) verts = [] - for i in range(0, len(grp.vertex_indices[iel_grp])): - for j in range(i+1, len(grp.vertex_indices[iel_grp])): - vertex_pair = (min(grp.vertex_indices[iel_grp][i], grp.vertex_indices[iel_grp][j]), \ - max(grp.vertex_indices[iel_grp][i], grp.vertex_indices[iel_grp][j])) + vert_indices = grp.vertex_indices[iel_grp] + for i in six.moves.range(0, len(vert_indices)): + for j in six.moves.range(i+1, len(vert_indices)): + mn_idx = min(vert_indices[i], vert_indices[j]) + mx_idx = max(vert_indices[i], vert_indices[j]) + vertex_pair = (mn_idx, mx_idx) # {{{ create midpoint if it doesn't exist already - if self.pair_map[vertex_pair].midpoint is None: + cur_pmap = self.pair_map[vertex_pair] + if cur_pmap.midpoint is None: self.pair_map[vertex_pair].midpoint = vertices_idx - vertex_pair1 = (min(grp.vertex_indices[iel_grp][i], grp.vertex_indices[iel_grp][j]), vertices_idx) - vertex_pair2 = (max(grp.vertex_indices[iel_grp][i], grp.vertex_indices[iel_grp][j]), vertices_idx) - self.pair_map[vertex_pair1] = PairMap(self.pair_map[vertex_pair].ray, self.pair_map[vertex_pair].d, \ - None) - self.pair_map[vertex_pair2] = PairMap(self.pair_map[vertex_pair].ray, not self.pair_map[vertex_pair].d, \ - None) + vertex_pair1 = (mn_idx, vertices_idx) + vertex_pair2 = (mx_idx, vertices_idx) + self.pair_map[vertex_pair1] =\ + PairMap(cur_pmap.ray, cur_pmap.d, None) + self.pair_map[vertex_pair2] =\ + PairMap(cur_pmap.ray, not cur_pmap.d, None) self.vertex_to_ray.append({}) + # FIXME: Check where the new Adj.elements + # gets populated. + # try and collapse the two branches by setting up variables # ahead of time + import copy if self.pair_map[vertex_pair].d: - velements = self.vertex_to_ray[min(grp.vertex_indices[iel_grp][i], grp.vertex_indices[iel_grp][j])][self.pair_map[vertex_pair].ray].value.elements - self.rays[self.pair_map[vertex_pair].ray].insert(Adj(vertices_idx, [None, None], velements), \ - self.vertex_to_ray[max(grp.vertex_indices[iel_grp][i], grp.vertex_indices[iel_grp][j])][self.pair_map[vertex_pair].ray]) - self.vertex_to_ray[vertices_idx][self.pair_map[vertex_pair].ray] = \ - self.vertex_to_ray[max(grp.vertex_indices[iel_grp][i], grp.vertex_indices[iel_grp][j])][self.pair_map[vertex_pair].ray].prev + velements = self.vertex_to_ray[mn_idx][cur_pmap.ray].value.elements + self.rays[cur_pmap.ray].insert(Adj(vertices_idx, copy.deepcopy(velements), + copy.deepcopy(velements)), \ + self.vertex_to_ray[mx_idx][cur_pmap.ray]) + self.vertex_to_ray[vertices_idx][cur_pmap.ray] = \ + self.vertex_to_ray[mx_idx][cur_pmap.ray].prev else: - velements = self.vertex_to_ray[max(grp.vertex_indices[iel_grp][i], grp.vertex_indices[iel_grp][j])][self.pair_map[vertex_pair].ray].value.elements - self.rays[self.pair_map[vertex_pair].ray].insert(Adj(vertices_idx, [None, None], velements), \ - self.vertex_to_ray[min(grp.vertex_indices[iel_grp][i], grp.vertex_indices[iel_grp][j])][self.pair_map[vertex_pair].ray]) - self.vertex_to_ray[vertices_idx][self.pair_map[vertex_pair].ray] = \ - self.vertex_to_ray[min(grp.vertex_indices[iel_grp][i], grp.vertex_indices[iel_grp][j])][self.pair_map[vertex_pair].ray].prev + velements = self.vertex_to_ray[mx_idx][cur_pmap.ray].value.elements + self.rays[cur_pmap.ray].insert(Adj(vertices_idx, copy.deepcopy(velements), + copy.deepcopy(velements)), \ + self.vertex_to_ray[mn_idx][cur_pmap.ray]) + self.vertex_to_ray[vertices_idx][cur_pmap.ray] = \ + self.vertex_to_ray[mn_idx][cur_pmap.ray].prev # compute location of midpoint - for k in range(0, 3): - vertices[k][vertices_idx] = (self.last_mesh.vertices[k][grp.vertex_indices[iel_grp][i]] - + self.last_mesh.vertices[k][grp.vertex_indices[iel_grp][j]]) / 2.0 + for k in six.moves.range(len(self.last_mesh.vertices)): + vertices[k,vertices_idx] =\ + (self.last_mesh.vertices[k,vert_indices[i]]\ + +self.last_mesh.vertices[k,vert_indices[j]]) / 2.0 verts.append(vertices_idx) vertices_idx += 1 @@ -425,59 +479,111 @@ class Refiner(object): # (While those don't exist yet, we generate connectivity for them # anyhow.) - ind = 0 - - # vertex_pairs = [(i,j) for i in range(3) for j in range(i+1, 3)] - for i in range(0, len(grp.vertex_indices[iel_grp])): - for j in range(i+1, len(grp.vertex_indices[iel_grp])): - vertex_pair = (min(grp.vertex_indices[iel_grp][i], grp.vertex_indices[iel_grp][j]), - max(grp.vertex_indices[iel_grp][i], grp.vertex_indices[iel_grp][j])) - if self.pair_map[vertex_pair].d: - start_node = self.vertex_to_ray[min(grp.vertex_indices[iel_grp][i], grp.vertex_indices[iel_grp][j])][self.pair_map[vertex_pair].ray] - else: - start_node = self.vertex_to_ray[max(grp.vertex_indices[iel_grp][i], grp.vertex_indices[iel_grp][j])][self.pair_map[vertex_pair].ray] - end_node = self.vertex_to_ray[self.pair_map[vertex_pair].midpoint][self.pair_map[vertex_pair].ray] - - # hop along ray from start node to end node - while start_node != end_node: - # start_node.value.elements.index(iel_base+iel_grp) - if start_node.value.elements[0] == iel_base+iel_grp: - start_node.value.elements[0] = iel_base+indices_idx+ind - elif start_node.value.elements[1] == iel_base+iel_grp: - start_node.value.elements[1] = iel_base+indices_idx+ind - else: - assert False - start_node = start_node.next - ind += 1 - ind = 0 + nnew_elements = 0 + + unique_vertex_pairs = [ + (i,j) for i in range(3) for j in range(i+1, 3)] + for i, j in unique_vertex_pairs: + mn_idx = min(grp.vertex_indices[iel_grp][i], grp.vertex_indices[iel_grp][j]) + mx_idx = max(grp.vertex_indices[iel_grp][i], grp.vertex_indices[iel_grp][j]) + if mn_idx == grp.vertex_indices[iel_grp][i]: + min_element_index = i + max_element_index = j + else: + min_element_index = j + max_element_index = i + vertex_pair = (mn_idx, mx_idx) + cur_pmap = self.pair_map[vertex_pair] + if cur_pmap.d: + start_node =\ + self.vertex_to_ray[mn_idx][cur_pmap.ray] + end_node = self.vertex_to_ray[mx_idx][cur_pmap.ray] + first_element_index = min_element_index + second_element_index = max_element_index + else: + start_node =\ + self.vertex_to_ray[mx_idx][cur_pmap.ray] + end_node = self.vertex_to_ray[mn_idx][cur_pmap.ray] + first_element_index = max_element_index + second_element_index = min_element_index + midpoint_node=\ + self.vertex_to_ray[cur_pmap.midpoint][cur_pmap.ray] + # hop along ray from start node to midpoint node + while start_node != midpoint_node: + # replace old (big) element with new + # (refined) element + node_els = start_node.value.elements + #print node_els + iold_el = node_els.index(iel_base+iel_grp) + node_els[iold_el] = iel_base+nelements_in_grp+first_element_index + start_node = start_node.next + # hop along ray from midpoint node to end node + while start_node != end_node: + #replace old (big) element with new + # (refined element + node_els = start_node.value.elements + iold_el = node_els.index(iel_base+iel_grp) + node_els[iold_el] = iel_base+nelements_in_grp+second_element_index + start_node = start_node.next # }}} #generate new rays from llist import dllist, dllistnode + ind = 0 - for i in range(0, len(verts)): - for j in range(i+1, len(verts)): - vertex_pair = (min(verts[i], verts[j]), max(verts[i], verts[j])) + for i in six.moves.range(0, len(verts)): + for j in six.moves.range(i+1, len(verts)): + mn_vert = min(verts[i], verts[j]) + mx_vert = max(verts[i], verts[j]) + vertex_pair = (mn_vert, mx_vert) els = [] els.append(iel_base+iel_grp) - els.append(iel_base+indices_idx+ind) + els.append(iel_base+nelements_in_grp+ind) - fr = Adj(min(verts[i], verts[j]), els) + fr = Adj(mn_vert, els) # We're creating a new ray, and this is the end node # of it. - to = Adj(max(verts[i], verts[j]), [None, None]) + to = Adj(mx_vert, [None, None]) self.rays.append(dllist([fr, to])) self.pair_map[vertex_pair] = PairMap(len(self.rays) - 1) - self.vertex_to_ray[min(verts[i], verts[j])][len(self.rays)-1]\ + self.vertex_to_ray[mn_vert][len(self.rays)-1]\ = self.rays[len(self.rays)-1].nodeat(0) - self.vertex_to_ray[max(verts[i], verts[j])][len(self.rays)-1]\ + self.vertex_to_ray[mx_vert][len(self.rays)-1]\ = self.rays[len(self.rays)-1].nodeat(1) + ind += 1 + ind = 0 + #map vertex indices to coordinates + node_tuple_to_coord = {} + node_tuple_to_coord[(0, 0)] = grp.vertex_indices[iel_grp][0] + node_tuple_to_coord[(2, 0)] = grp.vertex_indices[iel_grp][1] + node_tuple_to_coord[(0, 2)] = grp.vertex_indices[iel_grp][2] + vertex_pair = (min(grp.vertex_indices[iel_grp][0], grp.vertex_indices[iel_grp][1]), \ + max(grp.vertex_indices[iel_grp][0], grp.vertex_indices[iel_grp][1])) + node_tuple_to_coord[(1, 0)] = self.pair_map[vertex_pair].midpoint + vertex_pair = (min(grp.vertex_indices[iel_grp][0], grp.vertex_indices[iel_grp][2]), \ + max(grp.vertex_indices[iel_grp][0], grp.vertex_indices[iel_grp][2])) + node_tuple_to_coord[(0, 1)] = self.pair_map[vertex_pair].midpoint + vertex_pair = (min(grp.vertex_indices[iel_grp][1], grp.vertex_indices[iel_grp][2]), \ + max(grp.vertex_indices[iel_grp][1], grp.vertex_indices[iel_grp][2])) + node_tuple_to_coord[(1, 1)] = self.pair_map[vertex_pair].midpoint #generate actual elements #middle element + for i in six.moves.range(0, len(self.tri_result[1])): + groups[grpn][iel_grp][i] = \ + node_tuple_to_coord[self.tri_node_tuples[self.tri_result[1][i]]] + for i in six.moves.range(0, 4): + if i == 1: + continue + for j in six.moves.range(0, len(self.tri_result[i])): + groups[grpn][nelements_in_grp][j] = \ + node_tuple_to_coord[self.tri_node_tuples[self.tri_result[i][j]]] + nelements_in_grp += 1 + ''' + #middle element vertex_pair = (min(grp.vertex_indices[iel_grp][0], grp.vertex_indices[iel_grp][1]), \ max(grp.vertex_indices[iel_grp][0], grp.vertex_indices[iel_grp][1])) groups[grpn][iel_grp][0] = self.pair_map[vertex_pair].midpoint @@ -488,33 +594,33 @@ class Refiner(object): max(grp.vertex_indices[iel_grp][0], grp.vertex_indices[iel_grp][2])) groups[grpn][iel_grp][2] = self.pair_map[vertex_pair].midpoint #element 0 - groups[grpn][indices_idx][0] = grp.vertex_indices[iel_grp][0] + groups[grpn][nelements_in_grp][0] = grp.vertex_indices[iel_grp][0] vertex_pair = (min(grp.vertex_indices[iel_grp][0], grp.vertex_indices[iel_grp][1]), \ max(grp.vertex_indices[iel_grp][0], grp.vertex_indices[iel_grp][1])) - groups[grpn][indices_idx][1] = self.pair_map[vertex_pair].midpoint + groups[grpn][nelements_in_grp][1] = self.pair_map[vertex_pair].midpoint vertex_pair = (min(grp.vertex_indices[iel_grp][0], grp.vertex_indices[iel_grp][2]), \ max(grp.vertex_indices[iel_grp][0], grp.vertex_indices[iel_grp][2])) - groups[grpn][indices_idx][2] = self.pair_map[vertex_pair].midpoint - indices_idx += 1 + groups[grpn][nelements_in_grp][2] = self.pair_map[vertex_pair].midpoint + nelements_in_grp += 1 #element 1 - groups[grpn][indices_idx][0] = grp.vertex_indices[iel_grp][1] + groups[grpn][nelements_in_grp][0] = grp.vertex_indices[iel_grp][1] vertex_pair = (min(grp.vertex_indices[iel_grp][1], grp.vertex_indices[iel_grp][0]), \ max(grp.vertex_indices[iel_grp][1], grp.vertex_indices[iel_grp][0])) - groups[grpn][indices_idx][1] = self.pair_map[vertex_pair].midpoint + groups[grpn][nelements_in_grp][1] = self.pair_map[vertex_pair].midpoint vertex_pair = (min(grp.vertex_indices[iel_grp][1], grp.vertex_indices[iel_grp][2]), \ max(grp.vertex_indices[iel_grp][1], grp.vertex_indices[iel_grp][2])) - groups[grpn][indices_idx][2] = self.pair_map[vertex_pair].midpoint - indices_idx += 1 + groups[grpn][nelements_in_grp][2] = self.pair_map[vertex_pair].midpoint + nelements_in_grp += 1 #element 2 - groups[grpn][indices_idx][0] = grp.vertex_indices[iel_grp][2] + groups[grpn][nelements_in_grp][0] = grp.vertex_indices[iel_grp][2] vertex_pair = (min(grp.vertex_indices[iel_grp][2], grp.vertex_indices[iel_grp][0]), \ max(grp.vertex_indices[iel_grp][2], grp.vertex_indices[iel_grp][0])) - groups[grpn][indices_idx][1] = self.pair_map[vertex_pair].midpoint + groups[grpn][nelements_in_grp][1] = self.pair_map[vertex_pair].midpoint vertex_pair = (min(grp.vertex_indices[iel_grp][2], grp.vertex_indices[iel_grp][1]), \ max(grp.vertex_indices[iel_grp][2], grp.vertex_indices[iel_grp][1])) - groups[grpn][indices_idx][2] = self.pair_map[vertex_pair].midpoint - indices_idx += 1 - + groups[grpn][nelements_in_grp][2] = self.pair_map[vertex_pair].midpoint + nelements_in_grp += 1 + ''' # }}} grpn += 1 @@ -533,7 +639,7 @@ class Refiner(object): #return Mesh(vertices, [grp], element_connectivity=self.generate_connectivity(len(self.last_mesh.groups[group].vertex_indices) \ # + count*3)) - self.last_mesh = Mesh(vertices, grp, element_connectivity=self.generate_connectivity(totalnelements, nvertices)) + self.last_mesh = Mesh(vertices, grp, element_connectivity=self.generate_connectivity(totalnelements, nvertices, groups)) return self.last_mesh split_faces = {} @@ -545,39 +651,43 @@ class Refiner(object): - def generate_connectivity(self, nelements, nvertices): + def generate_connectivity(self, nelements, nvertices, groups): # medium-term FIXME: make this an incremental update # rather than build-from-scratch - vertex_to_element = [[] for i in xrange(nvertices)] - for grp in self.last_mesh.groups: - iel_base = grp.element_nr_base - for iel_grp in xrange(grp.nelements): - for ivertex in grp.vertex_indices[iel_grp]: - vertex_to_element[ivertex].append(iel_base + iel_grp) - + element_index = 0 + for grp in groups: + for iel_grp in xrange(len(grp)): + for ivertex in grp[iel_grp]: + vertex_to_element[ivertex].append(element_index) + element_index += 1 element_to_element = [set() for i in xrange(nelements)] - for grp in self.last_mesh.groups: - iel_base = grp.element_nr_base - for iel_grp in xrange(grp.nelements): - for ivertex in grp.vertex_indices[iel_grp]: - element_to_element[iel_base + iel_grp].update( + element_index = 0 + for grp in groups: + for iel_grp in xrange(len(grp)): + for ivertex in grp[iel_grp]: + element_to_element[element_index].update( vertex_to_element[ivertex]) - + element_index += 1 #print self.ray_elements for ray in self.rays: curnode = ray.first while curnode is not None: - if curnode.value.elements[0] is not None: - element_to_element[curnode.value.elements[0]].update(curnode.value.elements) - if curnode.value.elements[1] is not None: - element_to_element[curnode.value.elements[1]].update(curnode.value.elements) - if curnode.value.velements[0] is not None: - element_to_element[curnode.value.velements[0]].update(curnode.value.velements) - if curnode.value.velements[1] is not None: - element_to_element[curnode.value.velements[1]].update(curnode.value.velements) + ''' + if len(curnode.value.elements) >= 2: + if curnode.value.elements[0] is not None: + element_to_element[curnode.value.elements[0]].update(curnode.value.elements) + if curnode.value.elements[1] is not None: + element_to_element[curnode.value.elements[1]].update(curnode.value.elements) + ''' + if len(curnode.value.velements) >= 2: + if curnode.value.velements[0] is not None: + element_to_element[curnode.value.velements[0]].update(curnode.value.velements) + if curnode.value.velements[1] is not None: + element_to_element[curnode.value.velements[1]].update(curnode.value.velements) curnode = curnode.next + ''' for i in self.ray_elements: for j in i: @@ -607,3 +717,5 @@ class Refiner(object): # vim: foldmethod=marker +# vim: shiftwidth=4 +# vim: softtabstop=4