Changeset 8501


Ignore:
Timestamp:
Aug 9, 2012, 11:20:54 AM (13 years ago)
Author:
steve
Message:

Moving more mesh code to numpy

Location:
trunk/anuga_core/source/anuga
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/anuga_core/source/anuga/abstract_2d_finite_volumes/general_mesh.py

    r8500 r8501  
    512512        vertex_coordinates = num.zeros((3*M, 2), num.float)
    513513
    514 #        k0 = self.triangles[:,0]
    515 #        k1 = self.triangles[:,1]
    516 #        k2 = self.triangles[:,2]
    517 #
    518 #        vertex_coordinates[3*k0,:]   = self.nodes[k0,:]
    519 #        vertex_coordinates[3*k1+1,:] = self.nodes[k1,:]
    520 #        vertex_coordinates[3*k2+2,:] = self.nodes[k2,:]
    521 
    522         for i in range(M):
    523             for j in range(3):
    524                 k = self.triangles[i,j] # Index of vertex j in triangle i
    525                 vertex_coordinates[3*i+j,:] = self.nodes[k]
     514        k0 = self.triangles[:,0]
     515        k1 = self.triangles[:,1]
     516        k2 = self.triangles[:,2]
     517
     518#        I = num.arange(M,dtype=num.int)
     519#
     520#        V0 = V[0:3*M:3, :]
     521#        V1 = V[1:3*M:3, :]
     522#        V2 = V[2:3*M:3, :]
     523
     524        vertex_coordinates[0:3*M:3,:] = self.nodes[k0,:]
     525        vertex_coordinates[1:3*M:3,:] = self.nodes[k1,:]
     526        vertex_coordinates[2:3*M:3,:] = self.nodes[k2,:]
     527
     528#        for i in range(M):
     529#            for j in range(3):
     530#                k = self.triangles[i,j] # Index of vertex j in triangle i
     531#                vertex_coordinates[3*i+j,:] = self.nodes[k]
    526532
    527533        return vertex_coordinates
     
    758764
    759765        # Count number of triangles per node
    760         number_of_triangles_per_node = num.zeros(self.number_of_nodes,
    761                                                  num.int)       #array default#
    762         for volume_id, triangle in enumerate(self.get_triangles()):
    763             for vertex_id in triangle:
    764                 number_of_triangles_per_node[vertex_id] += 1
     766#        number_of_triangles_per_node = num.zeros(self.number_of_nodes,
     767#                                                 num.int)       #array default#
     768#        for volume_id, triangle in enumerate(self.get_triangles()):
     769#            for vertex_id in triangle:
     770#                number_of_triangles_per_node[vertex_id] += 1
     771
     772        # Need to pad number_of_triangles_per_node in case lone nodes at end of list
     773        #number_of_triangles_per_node = num.zeros(self.number_of_nodes, num.int)
     774
     775        number_of_triangles_per_node = num.bincount(self.triangles.flatten())
     776
     777        number_of_lone_nodes = self.number_of_nodes - len(number_of_triangles_per_node)
     778
     779        #print number_of_lone_nodes
     780        if number_of_lone_nodes > 0:
     781            number_of_triangles_per_node =  \
     782               num.append(number_of_triangles_per_node,num.zeros(number_of_lone_nodes,num.int))
     783
     784        #assert num.allclose(number_of_triangles_per_node_new, number_of_triangles_per_node)
    765785
    766786        # Allocate space for inverted structure
    767787        number_of_entries = num.sum(number_of_triangles_per_node)
    768         vertex_value_indices = num.zeros(number_of_entries, num.int) #array default#
    769 
    770         # Register (triangle, vertex) indices for each node
    771         vertexlist = [None] * self.number_of_nodes
    772         for volume_id in range(self.number_of_triangles):
    773             a = self.triangles[volume_id, 0]
    774             b = self.triangles[volume_id, 1]
    775             c = self.triangles[volume_id, 2]
    776 
    777             for vertex_id, node_id in enumerate([a, b, c]):
    778                 if vertexlist[node_id] is None:
    779                     vertexlist[node_id] = []
    780                 vertexlist[node_id].append((volume_id, vertex_id))
    781 
    782         # Build inverted triangle index array
     788
     789        assert number_of_entries == 3*self.number_of_triangles
     790       
     791        #vertex_value_indices = num.zeros(number_of_entries, num.int) #array default#
     792
     793        # Array of vertex_indices (3*vol_id+vertex_id) sorted into contiguous
     794        # order around each node. Use with number_of_triangles_per_node to
     795        # find vertices associated with a node.
     796        # ie There are  number_of_triangles_per_node[i] vertices
     797        vertex_value_indices = num.argsort(self.triangles.flatten())
     798
     799        node_index = num.zeros((self.number_of_nodes)+1, dtype = num.int)
     800
    783801        k = 0
    784         for vertices in vertexlist:
    785             if vertices is not None:
    786                 for volume_id, vertex_id in vertices:
    787                     vertex_value_indices[k] = 3*volume_id + vertex_id
    788                     k += 1
    789 
    790         # Save structure
     802        node_index[0] = 0
     803        for i in range(self.number_of_nodes):
     804            node_index[i+1] = node_index[i] + number_of_triangles_per_node[i]
     805
     806
     807        # Save structures
     808        self.node_index = node_index
    791809        self.number_of_triangles_per_node = number_of_triangles_per_node
    792810        self.vertex_value_indices = vertex_value_indices
  • trunk/anuga_core/source/anuga/abstract_2d_finite_volumes/neighbour_mesh.py

    r8500 r8501  
    793793                       len(self.vertex_value_indices)
    794794
     795       
    795796        # Check number of triangles per node
    796797        count = [0]*self.number_of_nodes
  • trunk/anuga_core/source/anuga/abstract_2d_finite_volumes/test_neighbour_mesh.py

    r8154 r8501  
    11401140        c = [1.0, 3.0]
    11411141        d = [2.0, 4.0]
    1142 
    1143         points = [a, b, c, d]
    1144         vertices = [[0,1,2]]
     1142        e = [4.0, 3.0]
     1143
     1144        points = [a, b, d, c, e]
     1145        vertices = [[0,1,3]]
    11451146
    11461147        mesh = Mesh(points, vertices)
    11471148        mesh.check_integrity()
    11481149        loners = mesh.get_lone_vertices()
    1149         self.failUnless(loners==[3],
     1150
     1151        #print loners
     1152        self.failUnless(loners==[2,4],
    11501153                        'FAILED!')
    11511154
  • trunk/anuga_core/source/anuga/operators/erosion_operators.py

    r8500 r8501  
    375375
    376376
    377         node_index = num.zeros((self.domain.number_of_nodes)+1, dtype = num.int)
    378 
    379         k = 0
    380         node_index[0] = 0
    381         for i in range(self.domain.number_of_nodes):
    382             node_index[i+1] = node_index[i] + self.domain.number_of_triangles_per_node[i]
    383 
    384         self.node_index = node_index
     377        self.node_index = self.domain.node_index
    385378
    386379        vertex_ids =[]
Note: See TracChangeset for help on using the changeset viewer.