source: anuga_core/source_numpy_conversion/anuga/abstract_2d_finite_volumes/test_general_mesh.py @ 5899

Last change on this file since 5899 was 5899, checked in by rwilson, 15 years ago

Initial NumPy? changes (again!).

File size: 10.7 KB
Line 
1## Automatically adapted for numpy.oldnumeric Oct 28, 2008 by alter_code1.py
2
3#!/usr/bin/env python
4
5
6import unittest
7from math import sqrt, pi
8
9
10from anuga.config import epsilon
11##from numpy.oldnumeric import allclose, array, ones, Float, alltrue
12from numpy import allclose, array, ones, float, alltrue
13from general_mesh import General_mesh
14from anuga.coordinate_transforms.geo_reference import Geo_reference
15
16
17
18class Test_General_Mesh(unittest.TestCase):
19    def setUp(self):
20        pass
21
22    def tearDown(self):
23        pass
24
25
26    def test_get_vertex_coordinates(self):
27        from mesh_factory import rectangular
28##        from numpy.oldnumeric import zeros, Float
29        from numpy import zeros, float
30
31        #Create basic mesh
32        nodes, triangles, _ = rectangular(1, 3)
33        domain = General_mesh(nodes, triangles)
34
35
36        assert allclose(domain.get_nodes(), nodes)
37
38
39        M = domain.number_of_triangles       
40
41        V = domain.get_vertex_coordinates()
42        assert V.shape[0] == 3*M
43
44        for i in range(M):
45            for j in range(3):
46                k = triangles[i,j]  #Index of vertex j in triangle i
47                assert allclose(V[3*i+j,:], nodes[k])
48
49    def test_get_vertex_coordinates_with_geo_ref(self):
50        x0 = 314036.58727982
51        y0 = 6224951.2960092
52        geo = Geo_reference(56, x0, y0)
53       
54        a = [0.0, 0.0]
55        b = [0.0, 2.0]
56        c = [2.0, 0.0]
57        d = [0.0, 4.0]
58        e = [2.0, 2.0]
59        f = [4.0, 0.0]
60
61        nodes = array([a, b, c, d, e, f])
62
63        nodes_absolute = geo.get_absolute(nodes)
64       
65        #bac, bce, ecf, dbe, daf, dae
66        triangles = array([[1,0,2], [1,2,4], [4,2,5], [3,1,4]])
67
68        domain = General_mesh(nodes, triangles,
69                       geo_reference = geo)
70        verts = domain.get_vertex_coordinates(triangle_id=0)       
71        self.assert_(allclose(array([b,a,c]), verts)) 
72        verts = domain.get_vertex_coordinates(triangle_id=0)       
73        self.assert_(allclose(array([b,a,c]), verts))
74        verts = domain.get_vertex_coordinates(triangle_id=0,
75                                              absolute=True)       
76        self.assert_(allclose(array([nodes_absolute[1],
77                                     nodes_absolute[0],
78                                     nodes_absolute[2]]), verts))
79        verts = domain.get_vertex_coordinates(triangle_id=0,
80                                              absolute=True)       
81        self.assert_(allclose(array([nodes_absolute[1],
82                                     nodes_absolute[0],
83                                     nodes_absolute[2]]), verts))
84       
85       
86
87    def test_get_vertex_coordinates_triangle_id(self):
88        """test_get_vertex_coordinates_triangle_id
89        Test that vertices for one triangle can be returned.
90        """
91        from mesh_factory import rectangular
92##        from numpy.oldnumeric import zeros, Float
93        from numpy import zeros, float
94
95        #Create basic mesh
96        nodes, triangles, _ = rectangular(1, 3)
97        domain = General_mesh(nodes, triangles)
98
99
100        assert allclose(domain.get_nodes(), nodes)
101
102
103        M = domain.number_of_triangles       
104
105        for i in range(M):
106            V = domain.get_vertex_coordinates(triangle_id=i)
107            assert V.shape[0] == 3
108
109            for j in range(3):
110                k = triangles[i,j]  #Index of vertex j in triangle i
111                assert allclose(V[j,:], nodes[k])
112
113
114       
115       
116
117    def test_get_vertex_values(self):
118        """Get connectivity based on triangle lists.
119        """
120        from mesh_factory import rectangular
121##        from numpy.oldnumeric import zeros, Float
122        from numpy import zeros, float
123
124        #Create basic mesh
125        nodes, triangles, _ = rectangular(1, 3)
126        domain = General_mesh(nodes, triangles)
127
128        value = [7]
129        assert allclose(domain.get_triangles(), triangles)
130        assert allclose(domain.get_triangles([0,4]),
131                        [triangles[0], triangles[4]])
132       
133
134    def test_vertex_value_indices(self):
135        """Check that structures are correct.
136        """
137        from mesh_factory import rectangular
138##        from numpy.oldnumeric import zeros, Float, array
139        from numpy import zeros, float, array
140
141        a = [0.0, 0.0]
142        b = [0.0, 2.0]
143        c = [2.0, 0.0]
144        d = [0.0, 4.0]
145        e = [2.0, 2.0]
146        f = [4.0, 0.0]
147
148        nodes = array([a, b, c, d, e, f])
149        #bac, bce, ecf, dbe, daf, dae
150        triangles = array([[1,0,2], [1,2,4], [4,2,5], [3,1,4]])
151
152        domain1 = General_mesh(nodes, triangles)
153       
154        #Create larger mesh
155        nodes, triangles, _ = rectangular(3, 6)
156        domain2 = General_mesh(nodes, triangles)
157
158        # Test both meshes
159        for domain in [domain1, domain2]:
160            assert sum(domain.number_of_triangles_per_node) ==\
161                   len(domain.vertex_value_indices)
162
163            # Check number of triangles per node
164            count = [0]*domain.number_of_nodes
165            for triangle in domain.triangles:
166                for i in triangle:
167                    count[i] += 1
168
169            #print count
170            #
171            assert allclose(count, domain.number_of_triangles_per_node)
172           
173            # Check indices
174            current_node = 0
175            k = 0 # Track triangles touching on node
176            for index in domain.vertex_value_indices:
177                k += 1
178               
179                triangle = index / 3
180                vertex = index % 3
181
182                assert domain.triangles[triangle, vertex] == current_node
183
184                if domain.number_of_triangles_per_node[current_node] == k:
185                    # Move on to next node
186                    k = 0
187                    current_node += 1
188               
189
190    def test_get_triangles_and_vertices_per_node(self):
191        """test_get_triangles_and_vertices_per_node -
192
193        Test that tuples of triangle, vertex can be extracted
194        from inverted triangles structure
195
196        """
197
198        a = [0.0, 0.0]
199        b = [0.0, 2.0]
200        c = [2.0, 0.0]
201        d = [0.0, 4.0]
202        e = [2.0, 2.0]
203        f = [4.0, 0.0]
204
205        nodes = array([a, b, c, d, e, f])
206        #bac, bce, ecf, dbe, daf, dae
207        triangles = array([[1,0,2], [1,2,4], [4,2,5], [3,1,4]])
208
209        domain = General_mesh(nodes, triangles)
210
211        # One node
212        L = domain.get_triangles_and_vertices_per_node(node=2)
213        print 'L=%s' % str(L)
214        assert allclose(L[0], [0, 2])
215        assert allclose(L[1], [1, 1])
216        assert allclose(L[2], [2, 1])
217
218        # All nodes
219        ALL = domain.get_triangles_and_vertices_per_node()
220        assert len(ALL) == 6
221        for i, Lref in enumerate(ALL):
222            L = domain.get_triangles_and_vertices_per_node(node=i)
223            assert allclose(L, Lref)
224           
225
226       
227
228       
229
230
231    def test_areas(self):
232        from mesh_factory import rectangular
233        from shallow_water import Domain
234##        from numpy.oldnumeric import zeros, Float
235        from numpy import zeros, float
236
237        #Create basic mesh
238        points, vertices, boundary = rectangular(1, 3)
239        domain = General_mesh(points, vertices)       
240
241        assert domain.get_area() == 1.0
242
243
244    def test_get_unique_vertex_values(self):
245        """
246        get unique_vertex based on triangle lists.
247        """
248        from mesh_factory import rectangular
249        from shallow_water import Domain
250##        from numpy.oldnumeric import zeros, Float
251        from numpy import zeros, float
252
253        #Create basic mesh
254        points, vertices, boundary = rectangular(1, 3)
255        domain = General_mesh(points, vertices)               
256
257        assert  domain.get_unique_vertices() == [0,1,2,3,4,5,6,7]
258        unique_vertices = domain.get_unique_vertices([0,1,4])
259        unique_vertices.sort()
260        assert unique_vertices == [0,1,2,4,5,6,7]
261
262        unique_vertices = domain.get_unique_vertices([0,4])
263        unique_vertices.sort()
264        assert unique_vertices == [0,2,4,5,6,7]
265
266    def test_get_node(self):
267        """test_get_triangles_and_vertices_per_node -
268
269        Test that tuples of triangle, vertex can be extracted
270        from inverted triangles structure
271
272        """
273       
274        x0 = 314036.58727982
275        y0 = 6224951.2960092
276        geo = Geo_reference(56, x0, y0)
277       
278        a = [0.0, 0.0]
279        b = [0.0, 2.0]
280        c = [2.0, 0.0]
281        d = [0.0, 4.0]
282        e = [2.0, 2.0]
283        f = [4.0, 0.0]
284
285        nodes = array([a, b, c, d, e, f])
286
287        nodes_absolute = geo.get_absolute(nodes)
288       
289        #bac, bce, ecf, dbe, daf, dae
290        triangles = array([[1,0,2], [1,2,4], [4,2,5], [3,1,4]])
291
292        domain = General_mesh(nodes, triangles,
293                       geo_reference = geo)
294        node = domain.get_node(2)       
295        self.assertTrue(alltrue(c == node))
296       
297        node = domain.get_node(2, absolute=True)     
298        self.assertTrue(alltrue(nodes_absolute[2] == node))
299       
300        node = domain.get_node(2, absolute=True)     
301        self.assertTrue(alltrue(nodes_absolute[2] == node))
302       
303
304    def test_assert_index_in_nodes(self):
305        """test_assert_index_in_nodes -
306
307        Test that node indices in triangles are within nodes array.
308
309        """
310       
311        x0 = 314036.58727982
312        y0 = 6224951.2960092
313        geo = Geo_reference(56, x0, y0)
314       
315        a = [0.0, 0.0]
316        b = [0.0, 2.0]
317        c = [2.0, 0.0]
318        d = [0.0, 4.0]
319        e = [2.0, 2.0]
320        f = [4.0, 0.0]
321
322        nodes = array([a, b, c, d, e, f])
323
324        nodes_absolute = geo.get_absolute(nodes)
325       
326        # max index is 5, use 5, expect success
327        triangles = array([[1,5,2], [1,2,4], [4,2,5], [3,1,4]])
328        General_mesh(nodes, triangles, geo_reference=geo)
329       
330        # max index is 5, use 6, expect assert failure
331        triangles = array([[1,6,2], [1,2,4], [4,2,5], [3,1,4]])
332        self.failUnlessRaises(AssertionError, General_mesh,
333                              nodes, triangles, geo_reference=geo)
334       
335        # max index is 5, use 10, expect assert failure
336        triangles = array([[1,10,2], [1,2,4], [4,2,5], [3,1,4]])
337        self.failUnlessRaises(AssertionError, General_mesh,
338                              nodes, triangles, geo_reference=geo)
339       
340
341
342#-------------------------------------------------------------
343if __name__ == "__main__":
344    suite = unittest.makeSuite(Test_General_Mesh,'test') 
345    runner = unittest.TextTestRunner()
346    runner.run(suite)
347
Note: See TracBrowser for help on using the repository browser.