source: inundation/ga/storm_surge/pyvolution/test_domain.py @ 469

Last change on this file since 469 was 469, checked in by duncan, 20 years ago

removing debug info

File size: 10.8 KB
Line 
1#!/usr/bin/env python
2
3import unittest
4from math import sqrt
5
6from domain import *
7from config import epsilon
8from Numeric import allclose, array
9
10
11def add_to_verts(tag, elements, domain):
12    if tag == "mound":
13        domain.test = "Mound"
14       
15
16
17class TestCase(unittest.TestCase):
18    def setUp(self):
19        pass
20
21       
22    def tearDown(self):
23        pass
24
25           
26    def test_simple(self):
27        a = [0.0, 0.0]
28        b = [0.0, 2.0]
29        c = [2.0,0.0]
30        d = [0.0, 4.0]
31        e = [2.0, 2.0]
32        f = [4.0,0.0]
33
34        points = [a, b, c, d, e, f]
35        #bac, bce, ecf, dbe, daf, dae
36        vertices = [ [1,0,2], [1,2,4], [4,2,5], [3,1,4], [3,0,5], [3,0,4]]
37
38        conserved_quantities = ['level', 'xmomentum', 'ymomentum']
39        other_quantities = ['elevation', 'friction']
40       
41        domain = Domain(points, vertices, None,
42                        conserved_quantities, other_quantities)       
43        domain.check_integrity()
44
45        for name in conserved_quantities + other_quantities:
46            assert domain.quantities.has_key(name)
47
48
49        assert domain.get_conserved_quantities(0, edge=1) == 0.   
50
51
52    def test_conserved_quantities(self):
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        points = [a, b, c, d, e, f]
62        #bac, bce, ecf, dbe, daf, dae
63        vertices = [ [1,0,2], [1,2,4], [4,2,5], [3,1,4], [3,0,5], [3,0,4]]
64
65        domain = Domain(points, vertices, boundary=None,
66                        conserved_quantities =\
67                        ['level', 'xmomentum', 'ymomentum'])
68
69
70        domain.set_quantity('level', [[1,2,3], [5,5,5],
71                                      [0,0,9], [-6, 3, 3],
72                                      [0,0,0], [0,0,0]])       
73
74        domain.set_quantity('xmomentum', [[1,2,3], [5,5,5],
75                                          [0,0,9], [-6, 3, 3],
76                                          [0,0,0], [0,0,0]])       
77
78        domain.check_integrity()
79
80        #Centroids
81        q = domain.get_conserved_quantities(0)
82        assert allclose(q, [2., 2., 0.])
83
84        q = domain.get_conserved_quantities(1)
85        assert allclose(q, [5., 5., 0.])         
86
87        q = domain.get_conserved_quantities(2)
88        assert allclose(q, [3., 3., 0.])
89
90        q = domain.get_conserved_quantities(3)
91        assert allclose(q, [0., 0., 0.])                         
92       
93
94        #Edges
95        q = domain.get_conserved_quantities(0, edge=0)
96        assert allclose(q, [2.5, 2.5, 0.])
97        q = domain.get_conserved_quantities(0, edge=1)
98        assert allclose(q, [2., 2., 0.])
99        q = domain.get_conserved_quantities(0, edge=2)
100        assert allclose(q, [1.5, 1.5, 0.])
101
102        for i in range(3):
103            q = domain.get_conserved_quantities(1, edge=i)
104            assert allclose(q, [5, 5, 0.])
105
106
107        q = domain.get_conserved_quantities(2, edge=0)
108        assert allclose(q, [4.5, 4.5, 0.])
109        q = domain.get_conserved_quantities(2, edge=1)
110        assert allclose(q, [4.5, 4.5, 0.])
111        q = domain.get_conserved_quantities(2, edge=2)
112        assert allclose(q, [0., 0., 0.])
113
114
115        q = domain.get_conserved_quantities(3, edge=0)
116        assert allclose(q, [3., 3., 0.])
117        q = domain.get_conserved_quantities(3, edge=1)
118        assert allclose(q, [-1.5, -1.5, 0.])
119        q = domain.get_conserved_quantities(3, edge=2)
120        assert allclose(q, [-1.5, -1.5, 0.])                   
121
122
123
124    def test_boundary_conditions(self):
125       
126        a = [0.0, 0.0]
127        b = [0.0, 2.0]
128        c = [2.0,0.0]
129        d = [0.0, 4.0]
130        e = [2.0, 2.0]
131        f = [4.0,0.0]
132
133        points = [a, b, c, d, e, f]
134        #bac, bce, ecf, dbe
135        vertices = [ [1,0,2], [1,2,4], [4,2,5], [3,1,4] ]
136        boundary = { (0, 0): 'First',
137                     (0, 2): 'First',
138                     (2, 0): 'Second',
139                     (2, 1): 'Second',
140                     (3, 1): 'Second',
141                     (3, 2): 'Second'}                                         
142                     
143
144        domain = Domain(points, vertices, boundary,
145                        conserved_quantities =\
146                        ['level', 'xmomentum', 'ymomentum'])       
147        domain.check_integrity()
148
149
150
151        domain.set_quantity('level', [[1,2,3], [5,5,5],
152                                      [0,0,9], [-6, 3, 3]])
153
154
155        domain.set_boundary( {'First': Dirichlet_boundary([5,2,1]),
156                              'Second': Transmissive_boundary(domain)} )
157
158        domain.update_boundary()
159
160        assert domain.quantities['level'].boundary_values[0] == 5. #Dirichlet
161        assert domain.quantities['level'].boundary_values[1] == 5. #Dirichlet
162        assert domain.quantities['level'].boundary_values[2] ==\
163               domain.get_conserved_quantities(2, edge=0)[0] #Transmissive (4.5)
164        assert domain.quantities['level'].boundary_values[3] ==\
165               domain.get_conserved_quantities(2, edge=1)[0] #Transmissive (4.5)
166        assert domain.quantities['level'].boundary_values[4] ==\
167               domain.get_conserved_quantities(3, edge=1)[0] #Transmissive (-1.5)
168        assert domain.quantities['level'].boundary_values[5] ==\
169               domain.get_conserved_quantities(3, edge=2)[0] #Transmissive (-1.5)         
170
171
172
173    def test_distribute_first_order(self):
174        """Domain implements a default first order gradient limiter
175        """
176       
177        a = [0.0, 0.0]
178        b = [0.0, 2.0]
179        c = [2.0,0.0]
180        d = [0.0, 4.0]
181        e = [2.0, 2.0]
182        f = [4.0,0.0]
183
184        points = [a, b, c, d, e, f]
185        #bac, bce, ecf, dbe
186        vertices = [ [1,0,2], [1,2,4], [4,2,5], [3,1,4] ]
187        boundary = { (0, 0): 'Third',
188                     (0, 2): 'First',
189                     (2, 0): 'Second',
190                     (2, 1): 'Second',
191                     (3, 1): 'Second',
192                     (3, 2): 'Third'}                                         
193                     
194
195        domain = Domain(points, vertices, boundary,
196                        conserved_quantities =\
197                        ['level', 'xmomentum', 'ymomentum'])               
198        domain.check_integrity()
199
200
201        domain.set_quantity('level', [[1,2,3], [5,5,5],
202                                      [0,0,9], [-6, 3, 3]])
203
204        assert allclose( domain.quantities['level'].centroid_values,
205                         [2,5,3,0] )
206                         
207        domain.set_quantity('xmomentum', [[1,1,1], [2,2,2],
208                                          [3,3,3], [4, 4, 4]])
209
210        domain.set_quantity('ymomentum', [[10,10,10], [20,20,20],
211                                          [30,30,30], [40, 40, 40]])       
212
213
214        domain.distribute_to_vertices_and_edges()
215
216        #First order extrapolation
217        assert allclose( domain.quantities['level'].vertex_values,
218                         [[ 2.,  2.,  2.],
219                          [ 5.,  5.,  5.],
220                          [ 3.,  3.,  3.],
221                          [ 0.,  0.,  0.]])
222
223
224
225
226    def test_update_conserved_quantities(self):
227        a = [0.0, 0.0]
228        b = [0.0, 2.0]
229        c = [2.0,0.0]
230        d = [0.0, 4.0]
231        e = [2.0, 2.0]
232        f = [4.0,0.0]
233
234        points = [a, b, c, d, e, f]
235        #bac, bce, ecf, dbe
236        vertices = [ [1,0,2], [1,2,4], [4,2,5], [3,1,4] ]
237        boundary = { (0, 0): 'Third',
238                     (0, 2): 'First',
239                     (2, 0): 'Second',
240                     (2, 1): 'Second',
241                     (3, 1): 'Second',
242                     (3, 2): 'Third'}                                         
243                     
244
245        domain = Domain(points, vertices, boundary,
246                        conserved_quantities =\
247                        ['level', 'xmomentum', 'ymomentum'])               
248        domain.check_integrity()
249
250
251        domain.set_quantity('level', [1,2,3,4], 'centroids')
252        domain.set_quantity('xmomentum', [1,2,3,4], 'centroids')
253        domain.set_quantity('ymomentum', [1,2,3,4], 'centroids')
254                                         
255
256        #Assign some values to update vectors
257        #Set explicit_update
258
259        for name in domain.conserved_quantities:
260            domain.quantities[name].explicit_update = array([4.,3.,2.,1.])
261            domain.quantities[name].semi_implicit_update = array([1.,1.,1.,1.])
262           
263
264        #Update with given timestep (assuming no other forcing terms)
265        domain.timestep = 0.1
266        domain.update_conserved_quantities()
267
268
269        #FIXME: Update this test once I understand the semi_implicit scheme   
270        #x = array([1, 2, 3, 4]) + array( [.4,.3,.2,.1] )
271        #x /= array( [.9,.9,.9,.9] )
272        #
273        #for name in domain.conserved_quantities:
274        #    assert allclose(domain.quantities[name].centroid_values, x)   
275
276
277    def testz_set_region(self):
278        """Domain implements a default first order gradient limiter
279        """
280       
281        a = [0.0, 0.0]
282        b = [0.0, 2.0]
283        c = [2.0,0.0]
284        d = [0.0, 4.0]
285        e = [2.0, 2.0]
286        f = [4.0,0.0]
287
288        points = [a, b, c, d, e, f]
289        #bac, bce, ecf, dbe
290        vertices = [ [1,0,2], [1,2,4], [4,2,5], [3,1,4] ]
291        boundary = { (0, 0): 'Third',
292                     (0, 2): 'First',
293                     (2, 0): 'Second',
294                     (2, 1): 'Second',
295                     (3, 1): 'Second',
296                     (3, 2): 'Third'}             
297
298        domain = Domain(points, vertices, boundary,
299                        conserved_quantities =\
300                        ['level', 'xmomentum', 'ymomentum'])               
301        domain.check_integrity()
302
303        domain.set_quantity('level', [[1,2,3], [5,5,5],
304                                      [0,0,9], [-6, 3, 3]])
305
306        assert allclose( domain.quantities['level'].centroid_values,
307                         [2,5,3,0] )
308                         
309        domain.set_quantity('xmomentum', [[1,1,1], [2,2,2],
310                                          [3,3,3], [4, 4, 4]])
311
312        domain.set_quantity('ymomentum', [[10,10,10], [20,20,20],
313                                          [30,30,30], [40, 40, 40]])       
314
315
316        domain.distribute_to_vertices_and_edges()
317
318        #First order extrapolation
319        assert allclose( domain.quantities['level'].vertex_values,
320                         [[ 2.,  2.,  2.],
321                          [ 5.,  5.,  5.],
322                          [ 3.,  3.,  3.],
323                          [ 0.,  0.,  0.]])
324
325        domain.build_tagged_elements_dictionary({'mound':[0,1]})
326        domain.set_region([add_to_verts])
327       
328        self.failUnless( domain.test == "Mound",
329                        'set region failed')
330       
331#-------------------------------------------------------------
332if __name__ == "__main__":
333    suite = unittest.makeSuite(TestCase,'testz')
334    runner = unittest.TextTestRunner()
335    runner.run(suite)
Note: See TracBrowser for help on using the repository browser.