source: anuga_core/source/anuga/abstract_2d_finite_volumes/test_general_mesh.py @ 4593

Last change on this file since 4593 was 4593, checked in by ole, 17 years ago

Work on search_functions testing

File size: 6.2 KB
Line 
1#!/usr/bin/env python
2
3
4import unittest
5from math import sqrt, pi
6
7
8from anuga.config import epsilon
9from Numeric import allclose, array, ones, Float
10from general_mesh import General_mesh
11
12
13
14class Test_General_Mesh(unittest.TestCase):
15    def setUp(self):
16        pass
17
18    def tearDown(self):
19        pass
20
21
22    def test_get_vertex_coordinates(self):
23        from mesh_factory import rectangular
24        from Numeric import zeros, Float
25
26        #Create basic mesh
27        nodes, triangles, _ = rectangular(1, 3)
28        domain = General_mesh(nodes, triangles)
29
30
31        assert allclose(domain.get_nodes(), nodes)
32
33
34        M = domain.number_of_triangles       
35
36        V = domain.get_vertex_coordinates()
37        assert V.shape[0] == 3*M
38
39        for i in range(M):
40            for j in range(3):
41                k = triangles[i,j]  #Index of vertex j in triangle i
42                assert allclose(V[3*i+j,:], nodes[k])
43
44
45    def test_get_vertex_coordinates_triangle_id(self):
46        """test_get_vertex_coordinates_triangle_id
47        Test that vertices for one triangle can be returned.
48        """
49        from mesh_factory import rectangular
50        from Numeric import zeros, Float
51
52        #Create basic mesh
53        nodes, triangles, _ = rectangular(1, 3)
54        domain = General_mesh(nodes, triangles)
55
56
57        assert allclose(domain.get_nodes(), nodes)
58
59
60        M = domain.number_of_triangles       
61
62        for i in range(M):
63            V = domain.get_vertex_coordinates(triangle_id=i)
64            assert V.shape[0] == 3
65
66            for j in range(3):
67                k = triangles[i,j]  #Index of vertex j in triangle i
68                assert allclose(V[j,:], nodes[k])
69
70
71       
72       
73
74    def test_get_vertex_values(self):
75        """Get connectivity based on triangle lists.
76        """
77        from mesh_factory import rectangular
78        from Numeric import zeros, Float
79
80        #Create basic mesh
81        nodes, triangles, _ = rectangular(1, 3)
82        domain = General_mesh(nodes, triangles)
83
84        value = [7]
85        assert allclose(domain.get_triangles(), triangles)
86        assert allclose(domain.get_triangles([0,4]),
87                        [triangles[0], triangles[4]])
88       
89
90    def test_vertex_value_indices(self):
91        """Check that structures are correct.
92        """
93        from mesh_factory import rectangular
94        from Numeric import zeros, Float, array
95
96        a = [0.0, 0.0]
97        b = [0.0, 2.0]
98        c = [2.0, 0.0]
99        d = [0.0, 4.0]
100        e = [2.0, 2.0]
101        f = [4.0, 0.0]
102
103        nodes = array([a, b, c, d, e, f])
104        #bac, bce, ecf, dbe, daf, dae
105        triangles = array([[1,0,2], [1,2,4], [4,2,5], [3,1,4]])
106
107        domain1 = General_mesh(nodes, triangles)
108       
109        #Create larger mesh
110        nodes, triangles, _ = rectangular(3, 6)
111        domain2 = General_mesh(nodes, triangles)
112
113        # Test both meshes
114        for domain in [domain1, domain2]:
115            assert sum(domain.number_of_triangles_per_node) ==\
116                   len(domain.vertex_value_indices)
117
118            # Check number of triangles per node
119            count = [0]*domain.number_of_nodes
120            for triangle in domain.triangles:
121                for i in triangle:
122                    count[i] += 1
123
124            #print count
125            #
126            assert allclose(count, domain.number_of_triangles_per_node)
127           
128            # Check indices
129            current_node = 0
130            k = 0 # Track triangles touching on node
131            for index in domain.vertex_value_indices:
132                k += 1
133               
134                triangle = index / 3
135                vertex = index % 3
136
137                assert domain.triangles[triangle, vertex] == current_node
138
139                if domain.number_of_triangles_per_node[current_node] == k:
140                    # Move on to next node
141                    k = 0
142                    current_node += 1
143               
144
145    def test_get_triangles_and_vertices_per_node(self):
146        """test_get_triangles_and_vertices_per_node -
147
148        Test that tuples of triangle, vertex can be extracted
149        from inverted triangles structure
150
151        """
152
153        a = [0.0, 0.0]
154        b = [0.0, 2.0]
155        c = [2.0, 0.0]
156        d = [0.0, 4.0]
157        e = [2.0, 2.0]
158        f = [4.0, 0.0]
159
160        nodes = array([a, b, c, d, e, f])
161        #bac, bce, ecf, dbe, daf, dae
162        triangles = array([[1,0,2], [1,2,4], [4,2,5], [3,1,4]])
163
164        domain = General_mesh(nodes, triangles)
165
166        # One node
167        L = domain.get_triangles_and_vertices_per_node(node=2)
168
169        assert allclose(L[0], [0, 2])
170        assert allclose(L[1], [1, 1])
171        assert allclose(L[2], [2, 1])
172
173        # All nodes
174        ALL = domain.get_triangles_and_vertices_per_node()
175
176        assert len(ALL) == 6
177        for i, Lref in enumerate(ALL):
178            L = domain.get_triangles_and_vertices_per_node(node=i)
179            assert allclose(L, Lref)
180           
181
182       
183
184       
185
186
187    def test_areas(self):
188        from mesh_factory import rectangular
189        from shallow_water import Domain
190        from Numeric import zeros, Float
191
192        #Create basic mesh
193        points, vertices, boundary = rectangular(1, 3)
194        domain = General_mesh(points, vertices)       
195
196        assert domain.get_area() == 1.0
197
198
199    def test_get_unique_vertex_values(self):
200        """
201        get unique_vertex based on triangle lists.
202        """
203        from mesh_factory import rectangular
204        from shallow_water import Domain
205        from Numeric import zeros, Float
206
207        #Create basic mesh
208        points, vertices, boundary = rectangular(1, 3)
209        domain = General_mesh(points, vertices)               
210
211        assert  domain.get_unique_vertices() == [0,1,2,3,4,5,6,7]
212        unique_vertices = domain.get_unique_vertices([0,1,4])
213        unique_vertices.sort()
214        assert unique_vertices == [0,1,2,4,5,6,7]
215
216        unique_vertices = domain.get_unique_vertices([0,4])
217        unique_vertices.sort()
218        assert unique_vertices == [0,2,4,5,6,7]
219
220
221       
222
223#-------------------------------------------------------------
224if __name__ == "__main__":
225    suite = unittest.makeSuite(Test_General_Mesh,'test')   
226    #suite = unittest.makeSuite(Test_General_Mesh,'test_vertex_value_indices')
227    runner = unittest.TextTestRunner()
228    runner.run(suite)
229
Note: See TracBrowser for help on using the repository browser.