source: inundation/ga/storm_surge/pyvolution/test_generic_boundary_conditions.py @ 1140

Last change on this file since 1140 was 1018, checked in by steve, 20 years ago

Cleaned up test function

File size: 7.3 KB
Line 
1#!/usr/bin/env python
2
3import unittest
4from math import sqrt, pi
5
6from generic_boundary_conditions import *
7from config import epsilon
8from Numeric import allclose, array
9
10
11class Test_Generic_Boundary_Conditions(unittest.TestCase):
12    def setUp(self):
13        pass
14        #print "  Setting up"
15
16    def tearDown(self):
17        pass
18        #print "  Tearing down"
19
20
21    def test_generic(self):
22        b = Boundary()
23
24        try:
25            b.evaluate()
26        except:
27            pass
28        else:
29            raise 'Should have raised exception'
30
31
32    def test_dirichlet_empty(self):
33
34        try:
35            Bd = Dirichlet_boundary()
36        except:
37            pass
38        else:
39            raise 'Should have raised exception'
40
41    def test_dirichlet(self):
42        x = [3.14,0,0.1]
43        Bd = Dirichlet_boundary(x)
44
45        q = Bd.evaluate()
46        assert allclose(q, x)
47
48
49    def test_transmissive(self):
50        from domain import Domain
51        from quantity import Quantity
52
53        a = [0.0, 0.0]
54        b = [0.0, 2.0]
55        c = [2.0,0.0]
56        d = [0.0, 4.0]
57        e = [2.0, 2.0]
58        f = [4.0,0.0]
59
60        points = [a, b, c, d, e, f]
61
62        #bac, bce, ecf, dbe
63        elements = [ [1,0,2], [1,2,4], [4,2,5], [3,1,4] ]
64
65        domain = Domain(points, elements)
66        domain.check_integrity()
67
68        domain.conserved_quantities = ['stage', 'ymomentum']
69        domain.quantities['stage'] =\
70                                   Quantity(domain, [[1,2,3], [5,5,5],
71                                                     [0,0,9], [-6, 3, 3]])
72
73        domain.quantities['ymomentum'] =\
74                                   Quantity(domain, [[2,3,4], [5,5,5],
75                                                     [0,0,9], [-6, 3, 3]])
76
77
78        domain.check_integrity()
79
80        #Test transmissve bdry
81        try:
82            T = Transmissive_boundary()
83        except:
84            pass
85        else:
86            raise 'Should have raised exception'
87
88        T = Transmissive_boundary(domain)
89
90        from config import default_boundary_tag
91        domain.set_boundary( {default_boundary_tag: T} )
92
93
94        #FIXME: should not necessarily be true always.
95        #E.g. with None as a boundary object.
96        assert len(domain.boundary) == len(domain.boundary_objects)
97
98        q = T.evaluate(0, 2)  #Vol=0, edge=2
99
100        assert allclose(q, [1.5, 2.5])
101
102
103    def test_fileboundary_time_only(self):
104        """Test that boundary values can be read from file and interpolated
105        """
106
107        from domain import Domain
108        from quantity import Quantity
109        import time, os
110        from math import sin, pi
111        from config import time_format
112
113        a = [0.0, 0.0]
114        b = [0.0, 2.0]
115        c = [2.0, 0.0]
116        d = [0.0, 4.0]
117        e = [2.0, 2.0]
118        f = [4.0, 0.0]
119
120        points = [a, b, c, d, e, f]
121
122        #bac, bce, ecf, dbe
123        elements = [ [1,0,2], [1,2,4], [4,2,5], [3,1,4] ]
124
125        domain = Domain(points, elements)
126        domain.conserved_quantities = ['stage', 'ymomentum']
127        domain.quantities['stage'] =\
128                                   Quantity(domain, [[1,2,3], [5,5,5],
129                                                     [0,0,9], [-6, 3, 3]])
130
131        domain.quantities['ymomentum'] =\
132                                   Quantity(domain, [[2,3,4], [5,5,5],
133                                                     [0,0,9], [-6, 3, 3]])
134
135        domain.check_integrity()
136
137
138        #Write file
139        filename = 'boundarytest' + str(time.time())
140        fid = open(filename, 'w')
141        start = time.mktime(time.strptime('2000', '%Y'))
142        dt = 5*60  #Five minute intervals
143        for i in range(10):
144            t = start + i*dt
145            t_string = time.strftime(time_format, time.gmtime(t))
146
147            fid.write('%s,%f %f\n' %(t_string, 1.0*i, sin(i*2*pi/10)))
148        fid.close()
149
150
151        F = File_boundary(filename, domain)
152        os.remove(filename)
153
154
155        #Check that midpoint coordinates at boundary are correctly computed
156        assert allclose( F.midpoint_coordinates,
157                         [[0.0, 3.0], [1.0, 3.0], [0.0, 1.0],
158                         [1.0, 0.0], [3.0, 0.0], [3.0, 1.0]])
159
160        #assert allclose(F.midpoint_coordinates[(3,2)], [0.0, 3.0])
161        #assert allclose(F.midpoint_coordinates[(3,1)], [1.0, 3.0])
162        #assert allclose(F.midpoint_coordinates[(0,2)], [0.0, 1.0])
163        #assert allclose(F.midpoint_coordinates[(0,0)], [1.0, 0.0])
164        #assert allclose(F.midpoint_coordinates[(2,0)], [3.0, 0.0])
165        #assert allclose(F.midpoint_coordinates[(2,1)], [3.0, 1.0])
166
167
168        #Check time interpolation
169        from config import default_boundary_tag
170        domain.set_boundary( {default_boundary_tag: F} )
171
172        domain.time = 5*30/2  #A quarter way through first step
173        q = F.evaluate()
174        assert allclose(q, [1.0/4, sin(2*pi/10)/4])
175
176
177        domain.time = 2.5*5*60  #Half way between steps 2 and 3
178        q = F.evaluate()
179        assert allclose(q, [2.5, (sin(2*2*pi/10) + sin(3*2*pi/10))/2])
180
181
182
183    def test_fileboundary_exception(self):
184        """Test that boundary object complians if number of
185        conserved quantities are wrong
186        """
187
188        from domain import Domain
189        from quantity import Quantity
190        import time, os
191        from math import sin, pi
192        from config import time_format
193
194        a = [0.0, 0.0]
195        b = [0.0, 2.0]
196        c = [2.0,0.0]
197        d = [0.0, 4.0]
198        e = [2.0, 2.0]
199        f = [4.0,0.0]
200
201        points = [a, b, c, d, e, f]
202
203        #bac, bce, ecf, dbe
204        elements = [ [1,0,2], [1,2,4], [4,2,5], [3,1,4] ]
205
206        domain = Domain(points, elements)
207        domain.conserved_quantities = ['stage', 'xmomentum', 'ymomentum']
208        domain.quantities['stage'] =\
209                                   Quantity(domain, [[1,2,3], [5,5,5],
210                                                     [0,0,9], [-6, 3, 3]])
211
212        domain.quantities['xmomentum'] =\
213                                   Quantity(domain, [[2,3,4], [5,5,5],
214                                                     [0,0,9], [-6, 3, 3]])
215        domain.quantities['ymomentum'] =\
216                                   Quantity(domain, [[2,3,4], [5,5,5],
217                                                     [0,0,9], [-6, 3, 3]])
218
219        domain.check_integrity()
220
221        #Write file (with only two values)
222        filename = 'boundarytest' + str(time.time())
223        fid = open(filename, 'w')
224        start = time.mktime(time.strptime('2000', '%Y'))
225        dt = 5*60  #Five minute intervals
226        for i in range(10):
227            t = start + i*dt
228            t_string = time.strftime(time_format, time.gmtime(t))
229
230            fid.write('%s,%f %f\n' %(t_string, 1.0*i, sin(i*2*pi/10)))
231        fid.close()
232
233
234        try:
235            F = File_boundary(filename, domain)
236        except AssertionError:
237            pass
238        else:
239            raise 'Should have raised an exception'
240
241        os.remove(filename)
242
243
244
245#-------------------------------------------------------------
246if __name__ == "__main__":
247    suite = unittest.makeSuite(Test_Generic_Boundary_Conditions,'test')
248    runner = unittest.TextTestRunner()
249    runner.run(suite)
250
251
252
Note: See TracBrowser for help on using the repository browser.