Changeset 7719


Ignore:
Timestamp:
May 11, 2010, 10:42:57 PM (15 years ago)
Author:
James Hudson
Message:

refactored mesh_quadtree to remove unneeded trilist conversion code.

Location:
anuga_core/source/anuga/geometry
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • anuga_core/source/anuga/geometry/mesh_quadtree.py

    r7718 r7719  
    2525
    2626import numpy as num
     27 
    2728
    28 
    29 LAST_TRIANGLE = [[-10, -10,
    30                    (num.array([[max_float, max_float],
     29LAST_TRIANGLE = [[[-1, num.array([[max_float, max_float],
    3130                               [max_float, max_float],
    3231                               [max_float, max_float]]),
    33                     (num.array([1.,1.]),     
    34                      num.array([0.,0.]),     
    35                      num.array([-1.1,-1.1])))]]
     32                      num.array([[max_float, max_float],
     33                               [max_float, max_float],
     34                               [max_float, max_float]])], -10]]
    3635
    3736
     
    6059        V = mesh.get_vertex_coordinates(absolute=True)
    6160       
     61        normals = mesh.get_normals()
     62       
    6263        # Check each triangle
    6364        for i in range(N):
    64             x0, y0 = V[3*i, :]
    65             x1, y1 = V[3*i+1, :]
    66             x2, y2 = V[3*i+2, :]
     65            i3 = 3*i
     66            x0, y0 = V[i3, :]
     67            x1, y1 = V[i3+1, :]
     68            x2, y2 = V[i3+2, :]
     69
     70            node_data = [i, V[i3:i3+3,:], normals[i,:]]
    6771
    6872            # insert a tuple with an AABB, and the triangle index as data
    6973            self._insert((AABB(min([x0, x1, x2]), max([x0, x1, x2]), \
    7074                             min([y0, y1, y2]), max([y0, y1, y2])), \
    71                              i))
     75                             node_data))
    7276
    7377    def search_fast(self, x):
     
    9296        x = ensure_numeric(x, num.float)
    9397                 
    94         if self.last_triangle[0][1] != -10:
    95             # check the last triangle found first
    96             element_found, sigma0, sigma1, sigma2, k = \
    97                        self._search_triangles_of_vertices(self.last_triangle, x)
    98             if element_found:
    99                 return True, sigma0, sigma1, sigma2, k
     98        # check the last triangle found first
     99        element_found, sigma0, sigma1, sigma2, k = \
     100                   self._search_triangles_of_vertices(self.last_triangle, x)
     101        if element_found:
     102            return True, sigma0, sigma1, sigma2, k
    100103
    101104        branch = self.last_triangle[0][1]
    102105
    103106        # test neighbouring tris
    104         tri_data = branch.test_leaves(x)
    105         triangles = self._trilist_from_data(tri_data)           
     107        tri_data = branch.test_leaves(x)         
    106108        element_found, sigma0, sigma1, sigma2, k = \
    107                     self._search_triangles_of_vertices(triangles, x)
     109                    self._search_triangles_of_vertices(tri_data, x)
    108110        if element_found:
    109111            return True, sigma0, sigma1, sigma2, k       
     
    114116        while branch:               
    115117            for sibling in next_search:
    116                 tri_data = sibling.search(x)
    117                 triangles = self._trilist_from_data(tri_data)           
     118                tri_data = sibling.search(x)         
    118119                element_found, sigma0, sigma1, sigma2, k = \
    119                             self._search_triangles_of_vertices(triangles, x)
     120                            self._search_triangles_of_vertices(tri_data, x)
    120121                if element_found:
    121122                    return True, sigma0, sigma1, sigma2, k
     
    124125            branch = branch.parent
    125126            if branch:
    126                 tri_data = branch.test_leaves(x)
    127                 triangles = self._trilist_from_data(tri_data)           
     127                tri_data = branch.test_leaves(x)     
    128128                element_found, sigma0, sigma1, sigma2, k = \
    129                             self._search_triangles_of_vertices(triangles, x)
     129                            self._search_triangles_of_vertices(tri_data, x)
    130130                if element_found:
    131131                    return True, sigma0, sigma1, sigma2, k     
     
    140140        has been found from the quad tree.
    141141       
    142 
    143         This function is responsible for most of the compute time in
    144         fit and interpolate.
     142        x is the triangle index
     143        Input check disabled to speed things up.   
    145144        """ 
    146145
    147         for k, node, tri_verts_norms in triangles:
    148             tri = tri_verts_norms[0]
    149             tri = ensure_numeric(tri)       
    150             # k is the triangle index
    151             # tri is a list of verts (x, y), representing a triangle
    152             # Find triangle that contains x (if any) and interpolate
    153            
    154             # Input check disabled to speed things up.   
    155             if bool(_is_inside_triangle(x, tri, int(True), 1.0e-12, 1.0e-12)):
    156                 n0, n1, n2 = tri_verts_norms[1]       
    157                 xi0, xi1, xi2 = tri
     146        for node_data in triangles:             
     147            if bool(_is_inside_triangle(x, node_data[0][1], int(True), 1.0e-12, 1.0e-12)):
     148                normals = node_data[0][2]     
     149                n0 = normals[0:2]
     150                n1 = normals[2:4]
     151                n2 = normals[4:6]         
     152                xi0, xi1, xi2 = node_data[0][1]
    158153
    159154                sigma0 = num.dot((x-xi1), n0)/num.dot((xi0-xi1), n0)
     
    162157
    163158                # Don't look for any other triangles in the triangle list
    164                 self.last_triangle = [[k, node, tri_verts_norms]]
    165                 return True, sigma0, sigma1, sigma2, k                     
     159                self.last_triangle = [node_data]
     160                return True, sigma0, sigma1, sigma2, node_data[0][0] # tri index                     
    166161        return False, -1, -1, -1, -10
    167162
    168 
    169     def _trilist_from_data(self, indices):
    170         ret_list = []
    171         for i, node in indices:
    172             vertices = self.mesh.get_vertex_coordinates(triangle_id=i, absolute=True)
    173             n0 = self.mesh.get_normal(i, 0)
    174             n1 = self.mesh.get_normal(i, 1)
    175             n2 = self.mesh.get_normal(i, 2)
    176             ret_list.append([i, node, [vertices, (n0, n1, n2)]])
    177         return ret_list
     163       
    178164       
    179165    def set_last_triangle(self):
  • anuga_core/source/anuga/geometry/quad.py

    r7718 r7719  
    165165            aabb, data = leaf
    166166            if aabb.contains(x):
    167                 intersecting_regions.append((data, self))
     167                intersecting_regions.append([data, self])
    168168               
    169169        return intersecting_regions               
Note: See TracChangeset for help on using the changeset viewer.