Changeset 4653
- Timestamp:
- Aug 6, 2007, 9:56:50 AM (17 years ago)
- Location:
- anuga_core/source/anuga
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
anuga_core/source/anuga/fit_interpolate/search_functions.py
r4651 r4653 37 37 k = -10.0 38 38 39 #Find vertices near x 40 candidate_vertices = root.search(x[0], x[1]) 39 #Get triangles in the cell that the point is in. 40 # Triangle is a list, first element triangle_id, 41 # second element the triangle 42 triangles = root.search(x[0], x[1]) 41 43 is_more_elements = True 42 44 43 45 element_found, sigma0, sigma1, sigma2, k = \ 44 46 _search_triangles_of_vertices(mesh, 45 candidate_vertices, x)47 triangles, x) 46 48 while not element_found and is_more_elements: 47 candidate_vertices, branch = root.expand_search()49 triangles, branch = root.expand_search() 48 50 if branch == []: 49 51 # Searching all the verts from the root cell that haven't 50 52 # been searched. This is the last try 51 53 element_found, sigma0, sigma1, sigma2, k = \ 52 _search_triangles_of_vertices(mesh, 53 candidate_vertices, x) 54 _search_triangles_of_vertices(mesh,triangles, x) 54 55 is_more_elements = False 55 56 else: 56 57 element_found, sigma0, sigma1, sigma2, k = \ 57 _search_triangles_of_vertices(mesh, 58 candidate_vertices, x) 58 _search_triangles_of_vertices(mesh,triangles, x) 59 59 60 60 return element_found, sigma0, sigma1, sigma2, k 61 61 62 62 63 def _search_triangles_of_vertices(mesh, candidate_vertices, x):63 def _search_triangles_of_vertices(mesh, triangles, x): 64 64 """Search for triangle containing x amongs candidate_vertices in mesh 65 65 … … 82 82 83 83 #For all vertices in same cell as point x 84 for v in candidate_vertices: 85 86 #FIXME (DSG-DSG): this catches verts with no triangle. 87 #Currently pmesh is producing these. 88 #this should be stopped, 89 90 if mesh.number_of_triangles_per_node[v] == 0: 91 continue 92 93 # Get all triangles which has v as a vertex 94 # The list has elements (triangle, vertex), but only the 95 # first component will be used here 96 triangle_list = mesh.get_triangles_and_vertices_per_node(node=v) 97 84 for k, tri_verts_norms in triangles: 85 tri = tri_verts_norms[0] 86 n0, n1, n2 = tri_verts_norms[1] 87 # k is the triangle index 88 # tri is a list of verts (x, y), representing a tringle 98 89 # Find triangle that contains x (if any) and interpolate 99 100 for k, _ in triangle_list: 101 element_found, sigma0, sigma1, sigma2, k =\ 102 find_triangle_compute_interpolation(mesh, 103 k, 104 x) 105 106 if element_found is True: 107 # Don't look for any other triangles in the triangle list 108 break 109 90 element_found, sigma0, sigma1, sigma2 =\ 91 find_triangle_compute_interpolation(tri, n0, n1, n2, x) 110 92 if element_found is True: 111 # Don't look for any other triangle_lists from the 112 # candidate_vertices 93 # Don't look for any other triangles in the triangle list 113 94 break 114 115 95 return element_found, sigma0, sigma1, sigma2, k 116 96 117 97 118 98 119 def find_triangle_compute_interpolation( mesh, k, x):99 def find_triangle_compute_interpolation(triangle, n0, n1, n2, x): 120 100 """Compute linear interpolation of point x and triangle k in mesh. 121 101 It is assumed that x belongs to triangle k. … … 123 103 124 104 # Get the three vertex_points of candidate triangle k 125 xi0, xi1, xi2 = mesh.get_vertex_coordinates(triangle_id=k)105 xi0, xi1, xi2 = triangle 126 106 127 107 # this is where we can call some fast c code. … … 138 118 139 119 if x[0] > xmax + epsilon: 140 return False,0,0,0 ,0120 return False,0,0,0 141 121 if x[0] < xmin - epsilon: 142 return False,0,0,0 ,0122 return False,0,0,0 143 123 if x[1] > ymax + epsilon: 144 return False,0,0,0 ,0124 return False,0,0,0 145 125 if x[1] < ymin - epsilon: 146 return False,0,0,0 ,0126 return False,0,0,0 147 127 148 128 # Get the three normals 149 n0 = mesh.get_normal(k, 0) 150 n1 = mesh.get_normal(k, 1) 151 n2 = mesh.get_normal(k, 2) 152 129 #n0 = norms[0] 130 #n1 = norms[1] 131 #n2 = norms[2] 153 132 154 133 # Compute interpolation … … 171 150 else: 172 151 element_found = False 173 return element_found, sigma0, sigma1, sigma2 , k152 return element_found, sigma0, sigma1, sigma2 -
anuga_core/source/anuga/fit_interpolate/ticket178_benchmark.py
r4652 r4653 14 14 ofile = 'lbm_resultsII.csv' 15 15 delimiter = ',' 16 run_profile = True #False #True16 run_profile = False #True 17 17 is_fit_list = [True, False] 18 18 num_of_points_list = [3, 200, 600, 2000, 6000, 10000, 20000] -
anuga_core/source/anuga/utilities/quad.py
r3945 r4653 72 72 73 73 74 def search(self, x, y): 75 #def search_new(self, x, y): 74 def search(self, x, y, get_vertices=False): 76 75 """Find all point indices sharing the same cell as point (x, y) 77 76 """ … … 84 83 brothers.remove(child) 85 84 branch.append(brothers) 86 points, branch = child.search_branch(x,y, branch) 85 points, branch = child.search_branch(x,y, branch, 86 get_vertices=get_vertices) 87 87 else: 88 88 # Leaf node: Get actual waypoints 89 points = self.retrieve() 90 89 points = self.retrieve(get_vertices=get_vertices) 91 90 self.branch = branch 92 91 return points 93 92 94 93 95 def search_branch(self, x, y, branch ):94 def search_branch(self, x, y, branch, get_vertices=False): 96 95 """Find all point indices sharing the same cell as point (x, y) 97 96 """ … … 103 102 brothers.remove(child) 104 103 branch.append(brothers) 105 points, branch = child.search_branch(x,y, branch) 104 points, branch = child.search_branch(x,y, branch, 105 get_vertices=get_vertices) 106 106 107 107 else: 108 108 # Leaf node: Get actual waypoints 109 points = self.retrieve( )109 points = self.retrieve(get_vertices=get_vertices) 110 110 return points, branch 111 111 112 112 113 def expand_search(self ):113 def expand_search(self, get_vertices=False): 114 114 """Find all point indices 'up' one cell from the last search 115 115 """ … … 121 121 for cell in three_cells: 122 122 #print "cell ", cell.show() 123 points += cell.retrieve( )123 points += cell.retrieve(get_vertices=get_vertices) 124 124 return points, self.branch 125 125 … … 200 200 201 201 202 def retrieve(self): 202 def retrieve_triangles(self): 203 """return a list of lists. For the inner lists, 204 The first element is the triangle index, 205 the second element is a list.for this list 206 the first element is a list of three (x, y) vertices, 207 the following elements are the three triangle normals. 208 209 This info is used in searching for a triangle that a point is in. 210 """ 211 # FIXME Tidy up the structure that is returned. 212 # if the triangles att has been made 213 # return it. 214 if not hasattr(self,'triangles'): 215 # use a dictionary to remove duplicates 216 triangles = {} 217 verts = self.retrieve_vertices() 218 # print "verts", verts 219 for vert in verts: 220 triangle_list = self.__class__.mesh.get_triangles_and_vertices_per_node(vert) 221 for k, _ in triangle_list: 222 if not triangles.has_key(k): 223 # print 'k',k 224 tri = self.__class__.mesh.get_vertex_coordinates(k) 225 n0 = self.__class__.mesh.get_normal(k, 0) 226 n1 = self.__class__.mesh.get_normal(k, 1) 227 n2 = self.__class__.mesh.get_normal(k, 2) 228 triangles[k]=(tri, (n0, n1, n2)) 229 self.triangles = triangles.items() 230 return self.triangles 231 232 def retrieve_vertices(self): 203 233 objects = [] 204 234 if self.children is None: … … 209 239 return objects 210 240 241 242 def retrieve(self, get_vertices=True): 243 if get_vertices is True: 244 return self.retrieve_vertices() 245 else: 246 return self.retrieve_triangles() 247 211 248 212 249 def count(self, keywords=None): -
anuga_core/source/anuga/utilities/test_quad.py
r3945 r4653 1 1 import unittest 2 from Numeric import array, allclose 3 2 4 from quad import Cell, build_quadtree 3 4 #from domain import *5 5 from anuga.abstract_2d_finite_volumes.general_mesh import General_mesh as Mesh 6 6 … … 24 24 25 25 points = [a, b, c, d, e, f, g, h] 26 26 27 #bac, bce, ecf, dbe, daf, dae 27 28 vertices = [[1,0,2], [1,3,4], [1,2,3], [5,4,7], [4,6,7]] … … 56 57 self.cell.split(4) 57 58 58 result = self.cell.search(x = 1, y = 101 )59 result = self.cell.search(x = 1, y = 101, get_vertices=True) 59 60 assert type(result) in [types.ListType,types.TupleType],\ 60 61 'should be a list' … … 126 127 127 128 128 result = Q.search(3, 105 )129 result = Q.search(3, 105, get_vertices=True) 129 130 assert type(result) in [types.ListType,types.TupleType],\ 130 131 'should be a list' … … 151 152 Q = build_quadtree(mesh) 152 153 154 def test_retrieve_triangles(self): 155 156 cell = Cell(0, 6, 0, 6, 'cell', max_points_per_cell=4) 157 158 p0 = [2,1] 159 p1 = [4,1] 160 p2 = [4.,4] 161 p3 = [2,4] 162 p4 = [5,4] 163 164 points = [p0,p1,p2, p3, p4] 165 # 166 vertices = [[0,1,2],[0,2,3],[1,4,2]] 167 168 mesh = Mesh(points, vertices) 169 170 Q = build_quadtree(mesh) 171 results = Q.search(5,1) 172 assert len(results),2 173 #print "results", results 174 #print "results[0][0]", results[0][0] 175 assert results[0],0 176 assert results[1],2 177 assert results[0][1],[[ 2., 1.], 178 [ 4., 1.], 179 [ 4., 4.]] 180 assert results[1][1],[[ 4., 1.], 181 [ 5., 4.], 182 [ 4., 4.]] 183 # this is the normals 184 assert results[0][1][1],[[1., 0.], 185 [-0.83205029, 0.5547002], 186 [ 0., -1.]] 187 188 # assert allclose(array(results),[[[ 2., 1.], 189 #[ 4., 1.], [ 4., 4.]], [[ 4., 1.],[ 5., 4.],[ 4., 4.]]] ) 190 results = Q.search(5,4.) 191 ### print "results",results 192 # results_dic={} 193 # results_dic.update(results) 194 assert len(results),3 195 #print "results_dic[0]", results_dic[0] 196 assert results[0][1],[[ 2., 1.], 197 [ 4., 1.], 198 [ 4., 4.]] 199 assert results[1][1],[[ 2., 1.], 200 [ 4., 4.], 201 [ 2., 4.]] 202 assert results[2][1],[[ 4., 1.], 203 [ 5., 4.], 204 [ 4., 4.]] 205 #assert allclose(array(results),[[[ 2., 1.],[ 4., 1.], [ 4., 4.]] 206 # ,[[ 2., 1.],[ 4., 4.], [ 2., 4.]], 207 #[[ 4., 1.], [ 5., 4.], [ 4., 4.]], 208 # [[ 4., 1.], [ 5., 4.], [ 4., 4.]]]) 209 153 210 #------------------------------------------------------------- 154 211 if __name__ == "__main__": 155 212 156 213 mysuite = unittest.makeSuite(Test_Quad,'test') 214 # mysuite = unittest.makeSuite(Test_Quad,'test_retrieve_triangles') 157 215 runner = unittest.TextTestRunner() 158 216 runner.run(mysuite)
Note: See TracChangeset
for help on using the changeset viewer.