source: branches/numpy/anuga/abstract_2d_finite_volumes/test_general_mesh.py @ 6517

Last change on this file since 6517 was 6517, checked in by rwilson, 14 years ago

Hand-merged recent changes in main trunk. Still work to be done in shallow_water.

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