source: anuga_core/source/anuga_parallel/test_distribute_mesh.py @ 7397

Last change on this file since 7397 was 7397, checked in by steve, 15 years ago
File size: 30.5 KB
Line 
1#!/usr/bin/env python
2
3import unittest
4import sys
5from math import sqrt
6
7
8from anuga.interface import Domain
9from anuga.interface import rectangular_cross
10
11from parallel_shallow_water import Parallel_Domain
12
13from anuga_parallel.pmesh_divide import pmesh_divide_metis
14from anuga_parallel.build_submesh import build_submesh
15from anuga_parallel.build_submesh import submesh_full, submesh_ghost, submesh_quantities
16from anuga_parallel.build_commun import extract_hostmesh, rec_submesh, send_submesh
17
18#import numpy as num
19import Numeric as num
20
21def topography(x,y): 
22    return -x/2
23
24
25def xcoord(x,y):
26    return x
27
28def ycoord(x,y):
29    return y
30
31
32
33class Test_Distribute_Mesh(unittest.TestCase):
34    def setUp(self):
35        pass
36
37
38    def tearDown(self):
39        pass
40
41
42
43    def test_pmesh_1(self):
44
45        points, vertices, boundary = rectangular_cross(2,2)
46
47
48        true_points = [[0.0, 0.0], [0.0, 0.5], [0.0, 1.0], [0.5, 0.0], [0.5, 0.5], [0.5, 1.0], [1.0, 0.0], [1.0, 0.5], [1.0, 1.0], [0.25, 0.25], [0.25, 0.75], [0.75, 0.25], [0.75, 0.75]]
49
50        true_vertices = [[0, 9, 1], [3, 9, 0], [4, 9, 3], [1, 9, 4], [1, 10, 2], [4, 10, 1], [5, 10, 4], [2, 10, 5], [3, 11, 4], [6, 11, 3], [7, 11, 6], [4, 11, 7], [4, 12, 5], [7, 12, 4], [8, 12, 7], [5, 12, 8]]
51
52
53        assert num.allclose(points,true_points)
54        assert num.allclose(vertices,true_vertices)
55
56        domain = Domain(points, vertices, boundary)
57
58
59        domain.set_quantity('elevation', topography) # Use function for elevation
60        domain.set_quantity('friction', 0.0)         # Constant friction
61        domain.set_quantity('stage', expression='elevation') # Dry initial stage
62        domain.set_quantity('xmomentum', expression='friction + 2.0') #
63        domain.set_quantity('ymomentum', ycoord) #
64
65
66        #print domain.quantities['ymomentum'].centroid_values
67 
68        nodes, triangles, boundary, triangles_per_proc, quantities = pmesh_divide_metis(domain,1)
69
70
71        true_nodes = [[0.0, 0.0], [0.0, 0.5], [0.0, 1.0], [0.5, 0.0], [0.5, 0.5], [0.5, 1.0], [1.0, 0.0], [1.0, 0.5], [1.0, 1.0], [0.25, 0.25], [0.25, 0.75], [0.75, 0.25], [0.75, 0.75]]
72
73        true_triangles = [[0, 9, 1], [3, 9, 0], [4, 9, 3], [1, 9, 4], [1, 10, 2], [4, 10, 1], [5, 10, 4], [2, 10, 5], [3, 11, 4], [6, 11, 3], [7, 11, 6], [4, 11, 7], [4, 12, 5], [7, 12, 4], [8, 12, 7], [5, 12, 8]]
74
75
76        assert num.allclose(nodes,true_nodes)
77        assert num.allclose(triangles,true_triangles)
78
79
80        assert num.allclose(triangles_per_proc,[16])
81       
82       
83
84    def test_pmesh_2(self):
85
86        points, vertices, boundary = rectangular_cross(2,2)
87
88
89        true_points = [[0.0, 0.0], [0.0, 0.5], [0.0, 1.0], [0.5, 0.0], [0.5, 0.5], [0.5, 1.0], [1.0, 0.0], [1.0, 0.5], [1.0, 1.0], [0.25, 0.25], [0.25, 0.75], [0.75, 0.25], [0.75, 0.75]]
90
91        true_vertices = [[0, 9, 1], [3, 9, 0], [4, 9, 3], [1, 9, 4], [1, 10, 2], [4, 10, 1], [5, 10, 4], [2, 10, 5], [3, 11, 4], [6, 11, 3], [7, 11, 6], [4, 11, 7], [4, 12, 5], [7, 12, 4], [8, 12, 7], [5, 12, 8]]
92
93
94        assert num.allclose(points,true_points)
95        assert num.allclose(vertices,true_vertices)
96
97        domain = Domain(points, vertices, boundary)
98
99
100        domain.set_quantity('elevation', topography) # Use function for elevation
101        domain.set_quantity('friction', 0.0)         # Constant friction
102        domain.set_quantity('stage', expression='elevation') # Dry initial stage
103        domain.set_quantity('xmomentum', expression='friction + 2.0') #
104        domain.set_quantity('ymomentum', ycoord) #
105
106
107        #print domain.quantities['ymomentum'].centroid_values
108 
109        nodes, triangles, boundary, triangles_per_proc, quantities = pmesh_divide_metis(domain,2)
110
111
112        true_nodes = [[0.0, 0.0], [0.0, 0.5], [0.0, 1.0], [0.5, 0.0], [0.5, 0.5], [0.5, 1.0], [1.0, 0.0], [1.0, 0.5], [1.0, 1.0], [0.25, 0.25], [0.25, 0.75], [0.75, 0.25], [0.75, 0.75]]
113
114
115        true_triangles = [[0, 9, 1], [3, 9, 0], [4, 9, 3], [1, 9, 4], [4, 10, 1], [3, 11, 4], [4, 11, 7], [4, 12, 5], [1, 10, 2], [5, 10, 4], [2, 10, 5], [6, 11, 3], [7, 11, 6], [7, 12, 4], [8, 12, 7], [5, 12, 8]]
116
117
118        assert num.allclose(nodes,true_nodes)
119        assert num.allclose(triangles,true_triangles)
120
121
122        assert num.allclose(triangles_per_proc,[8,8])
123
124
125    def test_distibute_3(self):
126
127        import pypar
128
129
130
131        myid = pypar.rank()
132        numprocs = pypar.size()
133
134        assert numprocs == 3, 'Should be run on 3 processors'
135
136        if myid == 0:
137
138            points, vertices, boundary = rectangular_cross(2,2)
139
140            domain = Domain(points, vertices, boundary)
141
142
143            domain.set_quantity('elevation', topography) # Use function for elevation
144            domain.set_quantity('friction', 0.0)         # Constant friction
145            domain.set_quantity('stage', expression='elevation') # Dry initial stage
146            domain.set_quantity('xmomentum', expression='friction + 2.0') #
147            domain.set_quantity('ymomentum', ycoord) #
148
149
150
151
152            #----------------------------------------------------------------------------------
153            # Test pmesh_divide_metis
154            #----------------------------------------------------------------------------------
155            nodes, triangles, boundary, triangles_per_proc, quantities = pmesh_divide_metis(domain,numprocs)
156
157
158            assert num.allclose(nodes,points)
159
160
161            true_vertices = [[0, 9, 1], [3, 9, 0], [4, 9, 3], [1, 9, 4], [1, 10, 2], [4, 10, 1], [5, 10, 4], [2, 10, 5], [3, 11, 4], [6, 11, 3], [7, 11, 6], [4, 11, 7], [4, 12, 5], [7, 12, 4], [8, 12, 7], [5, 12, 8]]
162
163            true_triangles = [[4, 9, 3], [4, 12, 5], [7, 12, 4], [8, 12, 7], [5, 12, 8], [0, 9, 1], [1, 9, 4], [1, 10, 2], [4, 10, 1], [5, 10, 4], [2, 10, 5], [3, 9, 0], [3, 11, 4], [6, 11, 3], [7, 11, 6], [4, 11, 7]]
164
165            assert num.allclose(vertices,true_vertices)
166            assert num.allclose(triangles,true_triangles)
167
168            assert num.allclose(triangles_per_proc,[5,6,5])
169
170
171            #----------------------------------------------------------------------------------
172            # Test build_submesh
173            #----------------------------------------------------------------------------------
174            submesh = build_submesh(nodes, triangles, boundary, quantities, triangles_per_proc)
175
176
177            assert num.allclose(submesh['full_nodes'][0],[[3.0, 0.5, 0.0], [4.0, 0.5, 0.5], [5.0, 0.5, 1.0], [7.0, 1.0, 0.5], [8.0, 1.0, 1.0], [9.0, 0.25, 0.25], [12.0, 0.75, 0.75]])
178            assert num.allclose(submesh['full_nodes'][1],[[0.0, 0.0, 0.0], [1.0, 0.0, 0.5], [2.0, 0.0, 1.0], [4.0, 0.5, 0.5], [5.0, 0.5, 1.0], [9.0, 0.25, 0.25], [10.0, 0.25, 0.75]])
179            assert num.allclose(submesh['full_nodes'][2],[[0.0, 0.0, 0.0], [3.0, 0.5, 0.0], [4.0, 0.5, 0.5], [6.0, 1.0, 0.0], [7.0, 1.0, 0.5], [9.0, 0.25, 0.25], [11.0, 0.75, 0.25]])
180
181
182            assert num.allclose(submesh['ghost_nodes'][0],[[0.0, 0.0, 0.0], [1.0, 0.0, 0.5], [2.0, 0.0, 1.0], [6.0, 1.0, 0.0], [10.0, 0.25, 0.75], [11.0, 0.75, 0.25]])
183            assert num.allclose(submesh['ghost_nodes'][1],[[3.0, 0.5, 0.0], [7.0, 1.0, 0.5], [8.0, 1.0, 1.0], [11.0, 0.75, 0.25], [12.0, 0.75, 0.75]])
184            assert num.allclose(submesh['ghost_nodes'][2],[[1.0, 0.0, 0.5], [5.0, 0.5, 1.0], [8.0, 1.0, 1.0], [12.0, 0.75, 0.75]])
185
186
187
188            true_full_triangles = [num.array([[ 4,  9,  3],
189                                              [ 4, 12,  5],
190                                              [ 7, 12,  4],
191                                              [ 8, 12,  7],
192                                              [ 5, 12,  8]]),
193                                   num.array([[ 0,  9,  1],
194                                              [ 1,  9,  4],
195                                              [ 1, 10,  2],
196                                              [ 4, 10,  1],
197                                              [ 5, 10,  4],
198                                              [ 2, 10,  5]]),
199                                   num.array([[ 3,  9,  0],
200                                              [ 3, 11,  4],
201                                              [ 6, 11,  3],
202                                              [ 7, 11,  6],
203                                              [ 4, 11,  7]])]
204
205
206            assert num.allclose(submesh['full_triangles'][0],true_full_triangles[0])
207            assert num.allclose(submesh['full_triangles'][1],true_full_triangles[1])
208            assert num.allclose(submesh['full_triangles'][2],true_full_triangles[2])
209
210            true_ghost_triangles = [num.array([[ 5,  0,  9,  1],
211                                               [ 6,  1,  9,  4],
212                                               [ 8,  4, 10,  1],
213                                               [ 9,  5, 10,  4],
214                                               [10,  2, 10,  5],
215                                               [11,  3,  9,  0],
216                                               [12,  3, 11,  4],
217                                               [13,  6, 11,  3],
218                                               [14,  7, 11,  6],
219                                               [15,  4, 11,  7]]),
220                                    num.array([[ 0,  4,  9,  3],
221                                               [ 1,  4, 12,  5],
222                                               [ 2,  7, 12,  4],
223                                               [ 4,  5, 12,  8],
224                                               [11,  3,  9,  0],
225                                               [12,  3, 11,  4]]),
226                                    num.array([[ 0,  4,  9,  3],
227                                               [ 1,  4, 12,  5],
228                                               [ 2,  7, 12,  4],
229                                               [ 3,  8, 12,  7],
230                                               [ 5,  0,  9,  1],
231                                               [ 6,  1,  9,  4]])]
232
233
234
235            assert num.allclose(submesh['ghost_triangles'][0],true_ghost_triangles[0])
236            assert num.allclose(submesh['ghost_triangles'][1],true_ghost_triangles[1])
237            assert num.allclose(submesh['ghost_triangles'][2],true_ghost_triangles[2])
238
239            true_full_commun = [{0: [1, 2], 1: [1, 2], 2: [1, 2], 3: [2], 4: [1]}, {5: [0, 2], 6: [0, 2], 7: [], 8: [0], 9: [0], 10: [0]}, {11: [0, 1], 12: [0, 1], 13: [0], 14: [0], 15: [0]}]
240
241            assert true_full_commun == submesh['full_commun']
242
243
244            true_ghost_commun = [num.array([[ 5,  1],
245                                            [ 6,  1],
246                                            [ 8,  1],
247                                            [ 9,  1],
248                                            [10,  1],
249                                            [11,  2],
250                                            [12,  2],
251                                            [13,  2],
252                                            [14,  2],
253                                            [15,  2]]),
254                                 num.array([[ 0,  0],
255                                            [ 1,  0],
256                                            [ 2,  0],
257                                            [ 4,  0],
258                                            [11,  2],
259                                            [12,  2]]),
260                                 num.array([[0, 0],
261                                            [1, 0],
262                                            [2, 0],
263                                            [3, 0],
264                                            [5, 1],
265                                            [6, 1]])]
266
267            assert num.allclose(submesh['ghost_commun'][0],true_ghost_commun[0])
268            assert num.allclose(submesh['ghost_commun'][1],true_ghost_commun[1])
269            assert num.allclose(submesh['ghost_commun'][2],true_ghost_commun[2])
270
271
272            #----------------------------------------------------------------------------------
273            # Test send_submesh
274            #----------------------------------------------------------------------------------
275            for p in range(1, numprocs):
276                send_submesh(submesh, triangles_per_proc, p)
277
278            #----------------------------------------------------------------------------------
279            # Test extract_hostmesh
280            #----------------------------------------------------------------------------------
281            points, vertices, boundary, quantities, ghost_recv_dict, full_send_dict  =\
282            extract_hostmesh(submesh, triangles_per_proc)
283
284
285            true_points =  [[0.5, 0.0], [0.5, 0.5], [0.5, 1.0], [1.0, 0.5], [1.0, 1.0], [0.25, 0.25], [0.75, 0.75], [0.0, 0.0], [0.0, 0.5], [0.0, 1.0], [1.0, 0.0], [0.25, 0.75], [0.75, 0.25]]
286
287            true_vertices = [[1, 5, 0], [1, 6, 2], [3, 6, 1], [4, 6, 3], [2, 6, 4], [7, 5, 8], [8, 5, 1], [1, 11, 8], [2, 11, 1], [9, 11, 2], [0, 5, 7], [0, 12, 1], [10, 12, 0], [3, 12, 10], [1, 12, 3]]
288
289
290            true_ghost_recv = {1: [num.array([5, 6, 7, 8, 9]), num.array([ 5,  6,  8,  9, 10])], 2: [num.array([10, 11, 12, 13, 14]), num.array([11, 12, 13, 14, 15])]}
291
292
293            true_full_send = {1: [num.array([0, 1, 2, 4]), num.array([0, 1, 2, 4])], 2: [num.array([0, 1, 2, 3]), num.array([0, 1, 2, 3])]}
294
295            assert num.allclose(points,   true_points)
296            assert num.allclose(vertices, true_vertices)
297            assert num.allclose(ghost_recv_dict[1],true_ghost_recv[1])
298            assert num.allclose(ghost_recv_dict[2],true_ghost_recv[2])
299            assert num.allclose(full_send_dict[1],true_full_send[1])
300            assert num.allclose(full_send_dict[2],true_full_send[2])
301
302            #print triangles_per_proc
303
304        else:
305            #----------------------------------------------------------------------------------
306            # Test rec_submesh
307            #----------------------------------------------------------------------------------
308            points, vertices, boundary, quantities, ghost_recv_dict, full_send_dict, no_full_nodes, no_full_trigs = rec_submesh(0)   
309
310            if myid == 1:
311
312
313                true_points =  [[0.0, 0.0], [0.0, 0.5], [0.0, 1.0], [0.5, 0.5], [0.5, 1.0], [0.25, 0.25], [0.25, 0.75], [0.5, 0.0], [1.0, 0.5], [1.0, 1.0], [0.75, 0.25], [0.75, 0.75]] 
314
315                true_vertices =  [[0, 5, 1], [1, 5, 3], [1, 6, 2], [3, 6, 1], [4, 6, 3], [2, 6, 4], [3, 5, 7], [3, 11, 4], [8, 11, 3], [4, 11, 9], [7, 5, 0], [7, 10, 3]]
316
317                true_ghost_recv =  {0: [num.array([6, 7, 8, 9]), num.array([0, 1, 2, 4])], 2: [num.array([10, 11]), num.array([11, 12])]}
318
319                true_full_send =  {0: [num.array([0, 1, 3, 4, 5]), num.array([ 5,  6,  8,  9, 10])], 2: [num.array([0, 1]), num.array([5, 6])]}
320
321                assert num.allclose(points,   true_points)
322                assert num.allclose(vertices, true_vertices)
323                assert num.allclose(ghost_recv_dict[0],true_ghost_recv[0])
324                assert num.allclose(ghost_recv_dict[2],true_ghost_recv[2])
325                assert num.allclose(full_send_dict[0],true_full_send[0])
326                assert num.allclose(full_send_dict[2],true_full_send[2]) 
327
328
329            if myid == 2:
330
331                true_points =   [[0.0, 0.0], [0.5, 0.0], [0.5, 0.5], [1.0, 0.0], [1.0, 0.5], [0.25, 0.25], [0.75, 0.25], [0.0, 0.5], [0.5, 1.0], [1.0, 1.0], [0.75, 0.75]]
332
333                true_vertices =  [[1, 5, 0], [1, 6, 2], [3, 6, 1], [4, 6, 3], [2, 6, 4], [2, 5, 1], [2, 10, 8], [4, 10, 2], [9, 10, 4], [0, 5, 7], [7, 5, 2]]
334
335
336                true_ghost_recv =   {0: [num.array([5, 6, 7, 8]), num.array([0, 1, 2, 3])], 1: [num.array([ 9, 10]), num.array([5, 6])]}
337
338                true_full_send =   {0: [num.array([0, 1, 2, 3, 4]), num.array([11, 12, 13, 14, 15])], 1: [num.array([0, 1]), num.array([11, 12])]}
339
340
341                assert num.allclose(points,   true_points)
342                assert num.allclose(vertices, true_vertices)
343                assert num.allclose(ghost_recv_dict[0],true_ghost_recv[0])
344                assert num.allclose(ghost_recv_dict[1],true_ghost_recv[1])
345                assert num.allclose(full_send_dict[0],true_full_send[0])
346                assert num.allclose(full_send_dict[1],true_full_send[1]) 
347
348                """
349        par_domain = Parallel_Domain(points, vertices, boundary,
350                                     full_send_dict  = full_send_dict,
351                                     ghost_recv_dict = ghost_recv_dict)
352                                     """
353
354
355
356
357
358
359           
360    def test_build_submesh_3(self):
361
362
363        nodes = [[0.0, 0.0], [0.0, 0.5], [0.0, 1.0], [0.5, 0.0], [0.5, 0.5], [0.5, 1.0], [1.0, 0.0], [1.0, 0.5], [1.0, 1.0], [0.25, 0.25], [0.25, 0.75], [0.75, 0.25], [0.75, 0.75]]
364
365
366        triangles = [[4, 9, 3], [4, 12, 5], [7, 12, 4], [8, 12, 7], [5, 12, 8], [0, 9, 1], [1, 9, 4], [1, 10, 2], [4, 10, 1], [5, 10, 4], [2, 10, 5], [3, 9, 0], [3, 11, 4], [6, 11, 3], [7, 11, 6], [4, 11, 7]]
367
368
369        edges = {(13, 1): 'bottom', (7, 1): 'left', (3, 1): 'right', (14, 1): 'right', (11, 1): 'bottom', (10, 1): 'top', (5, 1): 'left', (4, 1): 'top'}
370
371        triangles_per_proc = [5, 6, 5]
372
373
374        quantities = {'stage': num.array([[-0.25 , -0.125, -0.25 ],
375       [-0.25 , -0.375, -0.25 ],
376       [-0.5  , -0.375, -0.25 ],
377       [-0.5  , -0.375, -0.5  ],
378       [-0.25 , -0.375, -0.5  ],
379       [-0.   , -0.125, -0.   ],
380       [-0.   , -0.125, -0.25 ],
381       [-0.   , -0.125, -0.   ],
382       [-0.25 , -0.125, -0.   ],
383       [-0.25 , -0.125, -0.25 ],
384       [-0.   , -0.125, -0.25 ],
385       [-0.25 , -0.125, -0.   ],
386       [-0.25 , -0.375, -0.25 ],
387       [-0.5  , -0.375, -0.25 ],
388       [-0.5  , -0.375, -0.5  ],
389       [-0.25 , -0.375, -0.5  ]]),  'elevation': num.array([[-0.25 , -0.125, -0.25 ],
390       [-0.25 , -0.375, -0.25 ],
391       [-0.5  , -0.375, -0.25 ],
392       [-0.5  , -0.375, -0.5  ],
393       [-0.25 , -0.375, -0.5  ],
394       [-0.   , -0.125, -0.   ],
395       [-0.   , -0.125, -0.25 ],
396       [-0.   , -0.125, -0.   ],
397       [-0.25 , -0.125, -0.   ],
398       [-0.25 , -0.125, -0.25 ],
399       [-0.   , -0.125, -0.25 ],
400       [-0.25 , -0.125, -0.   ],
401       [-0.25 , -0.375, -0.25 ],
402       [-0.5  , -0.375, -0.25 ],
403       [-0.5  , -0.375, -0.5  ],
404       [-0.25 , -0.375, -0.5  ]]),  'ymomentum': num.array([[ 0.5 ,  0.25,  0.  ],
405       [ 0.5 ,  0.75,  1.  ],
406       [ 0.5 ,  0.75,  0.5 ],
407       [ 1.  ,  0.75,  0.5 ],
408       [ 1.  ,  0.75,  1.  ],
409       [ 0.  ,  0.25,  0.5 ],
410       [ 0.5 ,  0.25,  0.5 ],
411       [ 0.5 ,  0.75,  1.  ],
412       [ 0.5 ,  0.75,  0.5 ],
413       [ 1.  ,  0.75,  0.5 ],
414       [ 1.  ,  0.75,  1.  ],
415       [ 0.  ,  0.25,  0.  ],
416       [ 0.  ,  0.25,  0.5 ],
417       [ 0.  ,  0.25,  0.  ],
418       [ 0.5 ,  0.25,  0.  ],
419       [ 0.5 ,  0.25,  0.5 ]]),  'friction': num.array([[ 0.,  0.,  0.],
420       [ 0.,  0.,  0.],
421       [ 0.,  0.,  0.],
422       [ 0.,  0.,  0.],
423       [ 0.,  0.,  0.],
424       [ 0.,  0.,  0.],
425       [ 0.,  0.,  0.],
426       [ 0.,  0.,  0.],
427       [ 0.,  0.,  0.],
428       [ 0.,  0.,  0.],
429       [ 0.,  0.,  0.],
430       [ 0.,  0.,  0.],
431       [ 0.,  0.,  0.],
432       [ 0.,  0.,  0.],
433       [ 0.,  0.,  0.],
434       [ 0.,  0.,  0.]]),  'xmomentum': num.array([[ 2.,  2.,  2.],
435       [ 2.,  2.,  2.],
436       [ 2.,  2.,  2.],
437       [ 2.,  2.,  2.],
438       [ 2.,  2.,  2.],
439       [ 2.,  2.,  2.],
440       [ 2.,  2.,  2.],
441       [ 2.,  2.,  2.],
442       [ 2.,  2.,  2.],
443       [ 2.,  2.,  2.],
444       [ 2.,  2.,  2.],
445       [ 2.,  2.,  2.],
446       [ 2.,  2.,  2.],
447       [ 2.,  2.,  2.],
448       [ 2.,  2.,  2.],
449       [ 2.,  2.,  2.]])}
450
451
452       
453        #----------------------------------------------------------------------------------
454        # Test build_submesh
455        #----------------------------------------------------------------------------------
456        #submesh = build_submesh(nodes, triangles, edges, quantities, triangles_per_proc)
457
458        # Temporarily build the mesh to find the neighbouring
459        # triangles and true boundary polygon
460
461        true_submesh = {'full_boundary': [{(3, 1): 'right', (4, 1): 'top'}, {(5, 1): 'left', (10, 1): 'top', (7, 1): 'left'}, {(13, 1): 'bottom', (14, 1): 'right', (11, 1): 'bottom'}],
462                        'ghost_nodes': [num.array([[  0.  ,   0.  ,   0.  ],
463       [  1.  ,   0.  ,   0.5 ],
464       [  2.  ,   0.  ,   1.  ],
465       [  6.  ,   1.  ,   0.  ],
466       [ 10.  ,   0.25,   0.75],
467       [ 11.  ,   0.75,   0.25]]), num.array([[  3.  ,   0.5 ,   0.  ],
468       [  7.  ,   1.  ,   0.5 ],
469       [  8.  ,   1.  ,   1.  ],
470       [ 11.  ,   0.75,   0.25],
471       [ 12.  ,   0.75,   0.75]]), num.array([[  1.  ,   0.  ,   0.5 ],
472       [  5.  ,   0.5 ,   1.  ],
473       [  8.  ,   1.  ,   1.  ],
474       [ 12.  ,   0.75,   0.75]])],
475                        'full_nodes': [num.array([[  3.  ,   0.5 ,   0.  ],
476       [  4.  ,   0.5 ,   0.5 ],
477       [  5.  ,   0.5 ,   1.  ],
478       [  7.  ,   1.  ,   0.5 ],
479       [  8.  ,   1.  ,   1.  ],
480       [  9.  ,   0.25,   0.25],
481       [ 12.  ,   0.75,   0.75]]), num.array([[  0.  ,   0.  ,   0.  ],
482       [  1.  ,   0.  ,   0.5 ],
483       [  2.  ,   0.  ,   1.  ],
484       [  4.  ,   0.5 ,   0.5 ],
485       [  5.  ,   0.5 ,   1.  ],
486       [  9.  ,   0.25,   0.25],
487       [ 10.  ,   0.25,   0.75]]), num.array([[  0.  ,   0.  ,   0.  ],
488       [  3.  ,   0.5 ,   0.  ],
489       [  4.  ,   0.5 ,   0.5 ],
490       [  6.  ,   1.  ,   0.  ],
491       [  7.  ,   1.  ,   0.5 ],
492       [  9.  ,   0.25,   0.25],
493       [ 11.  ,   0.75,   0.25]])],
494                        'ghost_triangles': [num.array([[ 5,  0,  9,  1],
495       [ 6,  1,  9,  4],
496       [ 8,  4, 10,  1],
497       [ 9,  5, 10,  4],
498       [10,  2, 10,  5],
499       [11,  3,  9,  0],
500       [12,  3, 11,  4],
501       [13,  6, 11,  3],
502       [14,  7, 11,  6],
503       [15,  4, 11,  7]]), num.array([[ 0,  4,  9,  3],
504       [ 1,  4, 12,  5],
505       [ 2,  7, 12,  4],
506       [ 4,  5, 12,  8],
507       [11,  3,  9,  0],
508       [12,  3, 11,  4]]), num.array([[ 0,  4,  9,  3],
509       [ 1,  4, 12,  5],
510       [ 2,  7, 12,  4],
511       [ 3,  8, 12,  7],
512       [ 5,  0,  9,  1],
513       [ 6,  1,  9,  4]])],
514                        'ghost_boundary': [{(13, 1): 'ghost', (8, 0): 'ghost', (14, 1): 'ghost', (11, 1): 'ghost', (10, 1): 'ghost', (5, 1): 'ghost', (10, 2): 'ghost'}, {(12, 2): 'ghost', (12, 0): 'ghost', (2, 1): 'ghost', (11, 1): 'ghost', (2, 2): 'ghost', (4, 1): 'ghost', (4, 0): 'ghost'}, {(3, 2): 'ghost', (6, 1): 'ghost', (3, 1): 'ghost', (5, 1): 'ghost', (1, 0): 'ghost', (1, 1): 'ghost'}],
515                        'full_triangles': [[[4, 9, 3], [4, 12, 5], [7, 12, 4], [8, 12, 7], [5, 12, 8]], [[0, 9, 1], [1, 9, 4], [1, 10, 2], [4, 10, 1], [5, 10, 4], [2, 10, 5]], [[3, 9, 0], [3, 11, 4], [6, 11, 3], [7, 11, 6], [4, 11, 7]]],
516                        'full_commun': [{0: [1, 2], 1: [1, 2], 2: [1, 2], 3: [2], 4: [1]}, {5: [0, 2], 6: [0, 2], 7: [], 8: [0], 9: [0], 10: [0]}, {11: [0, 1], 12: [0, 1], 13: [0], 14: [0], 15: [0]}],
517                        'ghost_commun': [num.array([[ 5,  1],
518       [ 6,  1],
519       [ 8,  1],
520       [ 9,  1],
521       [10,  1],
522       [11,  2],
523       [12,  2],
524       [13,  2],
525       [14,  2],
526       [15,  2]]), num.array([[ 0,  0],
527       [ 1,  0],
528       [ 2,  0],
529       [ 4,  0],
530       [11,  2],
531       [12,  2]]), num.array([[0, 0],
532       [1, 0],
533       [2, 0],
534       [3, 0],
535       [5, 1],
536       [6, 1]])],  'ghost_quan': {'stage': [num.array([[-0.   , -0.125, -0.   ],
537       [-0.   , -0.125, -0.25 ],
538       [-0.25 , -0.125, -0.   ],
539       [-0.25 , -0.125, -0.25 ],
540       [-0.   , -0.125, -0.25 ],
541       [-0.25 , -0.125, -0.   ],
542       [-0.25 , -0.375, -0.25 ],
543       [-0.5  , -0.375, -0.25 ],
544       [-0.5  , -0.375, -0.5  ],
545       [-0.25 , -0.375, -0.5  ]]), num.array([[-0.25 , -0.125, -0.25 ],
546       [-0.25 , -0.375, -0.25 ],
547       [-0.5  , -0.375, -0.25 ],
548       [-0.25 , -0.375, -0.5  ],
549       [-0.25 , -0.125, -0.   ],
550       [-0.25 , -0.375, -0.25 ]]), num.array([[-0.25 , -0.125, -0.25 ],
551       [-0.25 , -0.375, -0.25 ],
552       [-0.5  , -0.375, -0.25 ],
553       [-0.5  , -0.375, -0.5  ],
554       [-0.   , -0.125, -0.   ],
555       [-0.   , -0.125, -0.25 ]])],  'elevation': [num.array([[-0.   , -0.125, -0.   ],
556       [-0.   , -0.125, -0.25 ],
557       [-0.25 , -0.125, -0.   ],
558       [-0.25 , -0.125, -0.25 ],
559       [-0.   , -0.125, -0.25 ],
560       [-0.25 , -0.125, -0.   ],
561       [-0.25 , -0.375, -0.25 ],
562       [-0.5  , -0.375, -0.25 ],
563       [-0.5  , -0.375, -0.5  ],
564       [-0.25 , -0.375, -0.5  ]]), num.array([[-0.25 , -0.125, -0.25 ],
565       [-0.25 , -0.375, -0.25 ],
566       [-0.5  , -0.375, -0.25 ],
567       [-0.25 , -0.375, -0.5  ],
568       [-0.25 , -0.125, -0.   ],
569       [-0.25 , -0.375, -0.25 ]]), num.array([[-0.25 , -0.125, -0.25 ],
570       [-0.25 , -0.375, -0.25 ],
571       [-0.5  , -0.375, -0.25 ],
572       [-0.5  , -0.375, -0.5  ],
573       [-0.   , -0.125, -0.   ],
574       [-0.   , -0.125, -0.25 ]])],  'ymomentum': [num.array([[ 0.  ,  0.25,  0.5 ],
575       [ 0.5 ,  0.25,  0.5 ],
576       [ 0.5 ,  0.75,  0.5 ],
577       [ 1.  ,  0.75,  0.5 ],
578       [ 1.  ,  0.75,  1.  ],
579       [ 0.  ,  0.25,  0.  ],
580       [ 0.  ,  0.25,  0.5 ],
581       [ 0.  ,  0.25,  0.  ],
582       [ 0.5 ,  0.25,  0.  ],
583       [ 0.5 ,  0.25,  0.5 ]]), num.array([[ 0.5 ,  0.25,  0.  ],
584       [ 0.5 ,  0.75,  1.  ],
585       [ 0.5 ,  0.75,  0.5 ],
586       [ 1.  ,  0.75,  1.  ],
587       [ 0.  ,  0.25,  0.  ],
588       [ 0.  ,  0.25,  0.5 ]]), num.array([[ 0.5 ,  0.25,  0.  ],
589       [ 0.5 ,  0.75,  1.  ],
590       [ 0.5 ,  0.75,  0.5 ],
591       [ 1.  ,  0.75,  0.5 ],
592       [ 0.  ,  0.25,  0.5 ],
593       [ 0.5 ,  0.25,  0.5 ]])],  'friction': [num.array([[ 0.,  0.,  0.],
594       [ 0.,  0.,  0.],
595       [ 0.,  0.,  0.],
596       [ 0.,  0.,  0.],
597       [ 0.,  0.,  0.],
598       [ 0.,  0.,  0.],
599       [ 0.,  0.,  0.],
600       [ 0.,  0.,  0.],
601       [ 0.,  0.,  0.],
602       [ 0.,  0.,  0.]]), num.array([[ 0.,  0.,  0.],
603       [ 0.,  0.,  0.],
604       [ 0.,  0.,  0.],
605       [ 0.,  0.,  0.],
606       [ 0.,  0.,  0.],
607       [ 0.,  0.,  0.]]), num.array([[ 0.,  0.,  0.],
608       [ 0.,  0.,  0.],
609       [ 0.,  0.,  0.],
610       [ 0.,  0.,  0.],
611       [ 0.,  0.,  0.],
612       [ 0.,  0.,  0.]])], 'xmomentum': [num.array([[ 2.,  2.,  2.],
613       [ 2.,  2.,  2.],
614       [ 2.,  2.,  2.],
615       [ 2.,  2.,  2.],
616       [ 2.,  2.,  2.],
617       [ 2.,  2.,  2.],
618       [ 2.,  2.,  2.],
619       [ 2.,  2.,  2.],
620       [ 2.,  2.,  2.],
621       [ 2.,  2.,  2.]]), num.array([[ 2.,  2.,  2.],
622       [ 2.,  2.,  2.],
623       [ 2.,  2.,  2.],
624       [ 2.,  2.,  2.],
625       [ 2.,  2.,  2.],
626       [ 2.,  2.,  2.]]), num.array([[ 2.,  2.,  2.],
627       [ 2.,  2.,  2.],
628       [ 2.,  2.,  2.],
629       [ 2.,  2.,  2.],
630       [ 2.,  2.,  2.],
631       [ 2.,  2.,  2.]])]},  'full_quan': {'stage': [num.array([[-0.25 , -0.125, -0.25 ],
632       [-0.25 , -0.375, -0.25 ],
633       [-0.5  , -0.375, -0.25 ],
634       [-0.5  , -0.375, -0.5  ],
635       [-0.25 , -0.375, -0.5  ]]), num.array([[-0.   , -0.125, -0.   ],
636       [-0.   , -0.125, -0.25 ],
637       [-0.   , -0.125, -0.   ],
638       [-0.25 , -0.125, -0.   ],
639       [-0.25 , -0.125, -0.25 ],
640       [-0.   , -0.125, -0.25 ]]), num.array([[-0.25 , -0.125, -0.   ],
641       [-0.25 , -0.375, -0.25 ],
642       [-0.5  , -0.375, -0.25 ],
643       [-0.5  , -0.375, -0.5  ],
644       [-0.25 , -0.375, -0.5  ]])],  'elevation': [num.array([[-0.25 , -0.125, -0.25 ],
645       [-0.25 , -0.375, -0.25 ],
646       [-0.5  , -0.375, -0.25 ],
647       [-0.5  , -0.375, -0.5  ],
648       [-0.25 , -0.375, -0.5  ]]), num.array([[-0.   , -0.125, -0.   ],
649       [-0.   , -0.125, -0.25 ],
650       [-0.   , -0.125, -0.   ],
651       [-0.25 , -0.125, -0.   ],
652       [-0.25 , -0.125, -0.25 ],
653       [-0.   , -0.125, -0.25 ]]), num.array([[-0.25 , -0.125, -0.   ],
654       [-0.25 , -0.375, -0.25 ],
655       [-0.5  , -0.375, -0.25 ],
656       [-0.5  , -0.375, -0.5  ],
657       [-0.25 , -0.375, -0.5  ]])],  'ymomentum': [num.array([[ 0.5 ,  0.25,  0.  ],
658       [ 0.5 ,  0.75,  1.  ],
659       [ 0.5 ,  0.75,  0.5 ],
660       [ 1.  ,  0.75,  0.5 ],
661       [ 1.  ,  0.75,  1.  ]]), num.array([[ 0.  ,  0.25,  0.5 ],
662       [ 0.5 ,  0.25,  0.5 ],
663       [ 0.5 ,  0.75,  1.  ],
664       [ 0.5 ,  0.75,  0.5 ],
665       [ 1.  ,  0.75,  0.5 ],
666       [ 1.  ,  0.75,  1.  ]]), num.array([[ 0.  ,  0.25,  0.  ],
667       [ 0.  ,  0.25,  0.5 ],
668       [ 0.  ,  0.25,  0.  ],
669       [ 0.5 ,  0.25,  0.  ],
670       [ 0.5 ,  0.25,  0.5 ]])],  'friction': [num.array([[ 0.,  0.,  0.],
671       [ 0.,  0.,  0.],
672       [ 0.,  0.,  0.],
673       [ 0.,  0.,  0.],
674       [ 0.,  0.,  0.]]), num.array([[ 0.,  0.,  0.],
675       [ 0.,  0.,  0.],
676       [ 0.,  0.,  0.],
677       [ 0.,  0.,  0.],
678       [ 0.,  0.,  0.],
679       [ 0.,  0.,  0.]]), num.array([[ 0.,  0.,  0.],
680       [ 0.,  0.,  0.],
681       [ 0.,  0.,  0.],
682       [ 0.,  0.,  0.],
683       [ 0.,  0.,  0.]])],  'xmomentum': [num.array([[ 2.,  2.,  2.],
684       [ 2.,  2.,  2.],
685       [ 2.,  2.,  2.],
686       [ 2.,  2.,  2.],
687       [ 2.,  2.,  2.]]), num.array([[ 2.,  2.,  2.],
688       [ 2.,  2.,  2.],
689       [ 2.,  2.,  2.],
690       [ 2.,  2.,  2.],
691       [ 2.,  2.,  2.],
692       [ 2.,  2.,  2.]]), num.array([[ 2.,  2.,  2.],
693       [ 2.,  2.,  2.],
694       [ 2.,  2.,  2.],
695       [ 2.,  2.,  2.],
696       [ 2.,  2.,  2.]])]}}
697                                 
698
699        from anuga.abstract_2d_finite_volumes.neighbour_mesh import Mesh
700       
701        mesh = Mesh(nodes, triangles)
702        boundary_polygon = mesh.get_boundary_polygon()
703
704
705        # Subdivide into non-overlapping partitions
706
707        submesh = submesh_full(nodes, triangles, edges, \
708                            triangles_per_proc)
709
710        #print submesh
711
712
713        for i in range(3):
714            assert num.allclose(true_submesh['full_triangles'][i],submesh['full_triangles'][i])
715            assert num.allclose(true_submesh['full_nodes'][i],submesh['full_nodes'][i])
716        assert true_submesh['full_boundary'] == submesh['full_boundary']
717
718        # Add any extra ghost boundary layer information
719
720        submesh = submesh_ghost(submesh, mesh, triangles_per_proc)
721
722        for i in range(3):
723            assert num.allclose(true_submesh['ghost_triangles'][i],submesh['ghost_triangles'][i])
724            assert num.allclose(true_submesh['ghost_nodes'][i],submesh['ghost_nodes'][i])
725            assert num.allclose(true_submesh['ghost_commun'][i],submesh['ghost_commun'][i])
726
727        assert true_submesh['full_commun'] == submesh['full_commun']
728
729
730        # Order the quantities information to be the same as the triangle
731        # information
732
733
734        submesh = submesh_quantities(submesh, quantities, \
735                                 triangles_per_proc)
736
737
738
739        for key, value in true_submesh['ghost_quan'].iteritems():
740            for i in range(3):
741                assert num.allclose(true_submesh['ghost_quan'][key][i],submesh['ghost_quan'][key][i])
742                assert num.allclose(true_submesh['full_quan'][key][i],submesh['full_quan'][key][i])
743       
744
745        submesh["boundary_polygon"] = boundary_polygon
746
747
748        #print submesh
749
750#-------------------------------------------------------------
751
752if __name__ == "__main__":
753    suite = unittest.makeSuite(Test_Distribute_Mesh,'test')
754    runner = unittest.TextTestRunner()
755    runner.run(suite)
Note: See TracBrowser for help on using the repository browser.