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

Last change on this file since 643 was 625, checked in by ole, 20 years ago
File size: 6.8 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 TestCase(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 = ['level', 'ymomentum']       
69        domain.quantities['level'] =\
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        assert len(domain.boundary) == len(domain.boundary_segments)
94        assert len(domain.boundary_objects) == len(domain.boundary_segments)
95
96        q = T.evaluate(0, 2)  #Vol=0, edge=2
97
98        assert allclose(q, [1.5, 2.5])
99
100
101    def test_fileboundary(self):
102        """Test that boundary values can be read from file and interpolated
103        """
104
105        from domain import Domain
106        from quantity import Quantity
107        import time, os
108        from math import sin, pi
109        from config import time_format
110       
111        a = [0.0, 0.0]
112        b = [0.0, 2.0]
113        c = [2.0,0.0]
114        d = [0.0, 4.0]
115        e = [2.0, 2.0]
116        f = [4.0,0.0]
117
118        points = [a, b, c, d, e, f]
119
120        #bac, bce, ecf, dbe
121        elements = [ [1,0,2], [1,2,4], [4,2,5], [3,1,4] ]
122       
123        domain = Domain(points, elements)
124        domain.conserved_quantities = ['level', 'ymomentum']
125        domain.quantities['level'] =\
126                                   Quantity(domain, [[1,2,3], [5,5,5],
127                                                     [0,0,9], [-6, 3, 3]])
128
129        domain.quantities['ymomentum'] =\
130                                   Quantity(domain, [[2,3,4], [5,5,5],
131                                                     [0,0,9], [-6, 3, 3]])
132
133        domain.check_integrity()
134       
135        domain.check_integrity()
136
137        #Write file
138        filename = 'boundarytest' + str(time.time())
139        fid = open(filename, 'w')
140        start = time.mktime(time.strptime('2000', '%Y'))
141        dt = 5*60  #Five minute intervals
142        for i in range(10):
143            t = start + i*dt
144            t_string = time.strftime(time_format, time.gmtime(t))
145
146            fid.write('%s,%f %f\n' %(t_string, 1.0*i, sin(i*2*pi/10))) 
147        fid.close()
148                     
149       
150        F = File_boundary(filename, domain)
151        os.remove(filename)       
152
153        from config import default_boundary_tag
154        domain.set_boundary( {default_boundary_tag: F} )
155
156        domain.time = 5*30/2  #A quarter way through first step
157        q = F.evaluate()
158        assert allclose(q, [1.0/4, sin(2*pi/10)/4])
159
160
161        domain.time = 2.5*5*60  #Half way between stepe 2 and 3
162        q = F.evaluate()
163        assert allclose(q, [2.5, (sin(2*2*pi/10) + sin(3*2*pi/10))/2])       
164
165
166
167
168
169    def test_fileboundary_exception(self):
170        """Test that boundary object complians if number of
171        conserved quantities are wrong
172        """
173
174        from domain import Domain
175        from quantity import Quantity
176        import time, os
177        from math import sin, pi
178        from config import time_format
179       
180        a = [0.0, 0.0]
181        b = [0.0, 2.0]
182        c = [2.0,0.0]
183        d = [0.0, 4.0]
184        e = [2.0, 2.0]
185        f = [4.0,0.0]
186
187        points = [a, b, c, d, e, f]
188
189        #bac, bce, ecf, dbe
190        elements = [ [1,0,2], [1,2,4], [4,2,5], [3,1,4] ]
191       
192        domain = Domain(points, elements)
193        domain.conserved_quantities = ['level', 'xmomentum', 'ymomentum']
194        domain.quantities['level'] =\
195                                   Quantity(domain, [[1,2,3], [5,5,5],
196                                                     [0,0,9], [-6, 3, 3]])
197
198        domain.quantities['xmomentum'] =\
199                                   Quantity(domain, [[2,3,4], [5,5,5],
200                                                     [0,0,9], [-6, 3, 3]])
201        domain.quantities['ymomentum'] =\
202                                   Quantity(domain, [[2,3,4], [5,5,5],
203                                                     [0,0,9], [-6, 3, 3]])
204
205        domain.check_integrity()
206
207        #Write file (with only two values)
208        filename = 'boundarytest' + str(time.time())
209        fid = open(filename, 'w')
210        start = time.mktime(time.strptime('2000', '%Y'))
211        dt = 5*60  #Five minute intervals
212        for i in range(10):
213            t = start + i*dt
214            t_string = time.strftime(time_format, time.gmtime(t))
215
216            fid.write('%s,%f %f\n' %(t_string, 1.0*i, sin(i*2*pi/10))) 
217        fid.close()
218                     
219
220        try:
221            F = File_boundary(filename, domain)
222        except AssertionError:
223            pass
224        else:
225            raise 'Should have raised an exception'
226
227        os.remove(filename)
228
229
230       
231#-------------------------------------------------------------
232if __name__ == "__main__":
233    suite = unittest.makeSuite(TestCase,'test')
234    runner = unittest.TextTestRunner()
235    runner.run(suite)
236
237
238       
Note: See TracBrowser for help on using the repository browser.