1 |
ksteube |
1809 |
|
2 |
|
|
######################################################## |
3 |
gross |
1414 |
# |
4 |
ksteube |
1809 |
# Copyright (c) 2003-2008 by University of Queensland |
5 |
|
|
# Earth Systems Science Computational Center (ESSCC) |
6 |
|
|
# http://www.uq.edu.au/esscc |
7 |
gross |
1414 |
# |
8 |
ksteube |
1809 |
# Primary Business: Queensland, Australia |
9 |
|
|
# Licensed under the Open Software License version 3.0 |
10 |
|
|
# http://www.opensource.org/licenses/osl-3.0.php |
11 |
gross |
1414 |
# |
12 |
ksteube |
1809 |
######################################################## |
13 |
gross |
1414 |
|
14 |
ksteube |
1809 |
__copyright__="""Copyright (c) 2003-2008 by University of Queensland |
15 |
|
|
Earth Systems Science Computational Center (ESSCC) |
16 |
|
|
http://www.uq.edu.au/esscc |
17 |
|
|
Primary Business: Queensland, Australia""" |
18 |
gross |
1414 |
__license__="""Licensed under the Open Software License version 3.0 |
19 |
ksteube |
1809 |
http://www.opensource.org/licenses/osl-3.0.php""" |
20 |
|
|
__url__="http://www.uq.edu.au/esscc/escript-finley" |
21 |
|
|
|
22 |
gross |
1414 |
import unittest |
23 |
|
|
import tempfile |
24 |
|
|
|
25 |
|
|
from esys.escript import * |
26 |
|
|
from esys.finley import Rectangle |
27 |
gross |
2100 |
from esys.escript.models import DarcyFlow |
28 |
gross |
1414 |
import sys |
29 |
|
|
import os |
30 |
|
|
try: |
31 |
|
|
FINLEY_WORKDIR=os.environ['FINLEY_WORKDIR'] |
32 |
|
|
except KeyError: |
33 |
|
|
FINLEY_WORKDIR='.' |
34 |
|
|
|
35 |
|
|
|
36 |
gross |
2156 |
VERBOSE=False # |
37 |
gross |
1414 |
|
38 |
|
|
from esys.escript import * |
39 |
|
|
from esys.escript.models import StokesProblemCartesian |
40 |
|
|
from esys.finley import Rectangle, Brick |
41 |
gross |
2100 |
|
42 |
|
|
#==================================================================================================================== |
43 |
|
|
class Test_StokesProblemCartesian2D(unittest.TestCase): |
44 |
gross |
1414 |
def setUp(self): |
45 |
gross |
2100 |
NE=6 |
46 |
gross |
2208 |
self.TOL=1e-3 |
47 |
gross |
1414 |
self.domain=Rectangle(NE,NE,order=2,useFullElementOrder=True) |
48 |
|
|
def tearDown(self): |
49 |
|
|
del self.domain |
50 |
gross |
2100 |
def test_PCG_P_0(self): |
51 |
gross |
1414 |
ETA=1. |
52 |
|
|
P1=0. |
53 |
|
|
|
54 |
|
|
x=self.domain.getX() |
55 |
|
|
F=-P1*x[1]*[1.,0]+(2*ETA-P1*x[0])*[0.,1.] |
56 |
|
|
mask=whereZero(x[0]) * [1.,1.] \ |
57 |
|
|
+whereZero(x[0]-1) * [1.,1.] \ |
58 |
|
|
+whereZero(x[1]) * [1.,0.] \ |
59 |
|
|
+whereZero(x[1]-1) * [1.,1.] |
60 |
|
|
|
61 |
|
|
sp=StokesProblemCartesian(self.domain) |
62 |
|
|
|
63 |
|
|
sp.initialize(f=F,fixed_u_mask=mask,eta=ETA) |
64 |
|
|
u0=(1-x[0])*x[0]*[0.,1.] |
65 |
|
|
p0=Scalar(P1,ReducedSolution(self.domain)) |
66 |
gross |
2100 |
sp.setTolerance(self.TOL) |
67 |
|
|
u,p=sp.solve(u0,p0,show_details=VERBOSE, verbose=VERBOSE,max_iter=100,useUzawa=True) |
68 |
gross |
1414 |
|
69 |
|
|
error_v0=Lsup(u[0]-u0[0]) |
70 |
|
|
error_v1=Lsup(u[1]-u0[1])/0.25 |
71 |
gross |
2100 |
error_p=Lsup(p+P1*x[0]*x[1]) |
72 |
|
|
self.failUnless(error_p<10*self.TOL, "pressure error too large.") |
73 |
|
|
self.failUnless(error_v0<10*self.TOL, "0-velocity error too large.") |
74 |
|
|
self.failUnless(error_v1<10*self.TOL, "1-velocity error too large.") |
75 |
gross |
1414 |
|
76 |
gross |
2100 |
def test_PCG_P_small(self): |
77 |
gross |
1414 |
ETA=1. |
78 |
|
|
P1=1. |
79 |
|
|
|
80 |
|
|
x=self.domain.getX() |
81 |
|
|
F=-P1*x[1]*[1.,0]+(2*ETA-P1*x[0])*[0.,1.] |
82 |
|
|
mask=whereZero(x[0]) * [1.,1.] \ |
83 |
|
|
+whereZero(x[0]-1) * [1.,1.] \ |
84 |
|
|
+whereZero(x[1]) * [1.,0.] \ |
85 |
|
|
+whereZero(x[1]-1) * [1.,1.] |
86 |
|
|
|
87 |
|
|
sp=StokesProblemCartesian(self.domain) |
88 |
|
|
|
89 |
|
|
sp.initialize(f=F,fixed_u_mask=mask,eta=ETA) |
90 |
|
|
u0=(1-x[0])*x[0]*[0.,1.] |
91 |
|
|
p0=Scalar(P1,ReducedSolution(self.domain)) |
92 |
gross |
2156 |
sp.setTolerance(self.TOL*0.2) |
93 |
|
|
u,p=sp.solve(u0,p0,show_details=VERBOSE, verbose=VERBOSE,max_iter=100,useUzawa=True) |
94 |
gross |
1414 |
error_v0=Lsup(u[0]-u0[0]) |
95 |
|
|
error_v1=Lsup(u[1]-u0[1])/0.25 |
96 |
gross |
2100 |
error_p=Lsup(P1*x[0]*x[1]+p) |
97 |
gross |
2156 |
saveVTK("d.vtu",p=p, e=P1*x[0]*x[1]+p, p_ref=P1*x[0]*x[1]) |
98 |
gross |
2100 |
self.failUnless(error_v0<10*self.TOL, "0-velocity error too large.") |
99 |
|
|
self.failUnless(error_v1<10*self.TOL, "1-velocity error too large.") |
100 |
gross |
2156 |
self.failUnless(error_p<10*self.TOL, "pressure error too large.") |
101 |
gross |
1414 |
|
102 |
gross |
2100 |
def test_PCG_P_large(self): |
103 |
gross |
1414 |
ETA=1. |
104 |
|
|
P1=1000. |
105 |
|
|
|
106 |
|
|
x=self.domain.getX() |
107 |
|
|
F=-P1*x[1]*[1.,0]+(2*ETA-P1*x[0])*[0.,1.] |
108 |
|
|
mask=whereZero(x[0]) * [1.,1.] \ |
109 |
|
|
+whereZero(x[0]-1) * [1.,1.] \ |
110 |
|
|
+whereZero(x[1]) * [1.,0.] \ |
111 |
|
|
+whereZero(x[1]-1) * [1.,1.] |
112 |
|
|
|
113 |
|
|
sp=StokesProblemCartesian(self.domain) |
114 |
|
|
|
115 |
|
|
sp.initialize(f=F,fixed_u_mask=mask,eta=ETA) |
116 |
|
|
u0=(1-x[0])*x[0]*[0.,1.] |
117 |
|
|
p0=Scalar(P1,ReducedSolution(self.domain)) |
118 |
gross |
2100 |
sp.setTolerance(self.TOL) |
119 |
|
|
u,p=sp.solve(u0,p0,show_details=VERBOSE, verbose=VERBOSE,max_iter=100,useUzawa=True) |
120 |
gross |
1414 |
|
121 |
|
|
error_v0=Lsup(u[0]-u0[0]) |
122 |
|
|
error_v1=Lsup(u[1]-u0[1])/0.25 |
123 |
gross |
2100 |
error_p=Lsup(P1*x[0]*x[1]+p)/P1 |
124 |
|
|
self.failUnless(error_p<10*self.TOL, "pressure error too large.") |
125 |
|
|
self.failUnless(error_v0<10*self.TOL, "0-velocity error too large.") |
126 |
|
|
self.failUnless(error_v1<10*self.TOL, "1-velocity error too large.") |
127 |
gross |
1414 |
|
128 |
gross |
2100 |
def test_GMRES_P_0(self): |
129 |
gross |
1471 |
ETA=1. |
130 |
|
|
P1=0. |
131 |
gross |
1414 |
|
132 |
gross |
1471 |
x=self.domain.getX() |
133 |
|
|
F=-P1*x[1]*[1.,0]+(2*ETA-P1*x[0])*[0.,1.] |
134 |
|
|
mask=whereZero(x[0]) * [1.,1.] \ |
135 |
|
|
+whereZero(x[0]-1) * [1.,1.] \ |
136 |
|
|
+whereZero(x[1]) * [1.,0.] \ |
137 |
|
|
+whereZero(x[1]-1) * [1.,1.] |
138 |
|
|
|
139 |
|
|
sp=StokesProblemCartesian(self.domain) |
140 |
|
|
|
141 |
|
|
sp.initialize(f=F,fixed_u_mask=mask,eta=ETA) |
142 |
|
|
u0=(1-x[0])*x[0]*[0.,1.] |
143 |
|
|
p0=Scalar(P1,ReducedSolution(self.domain)) |
144 |
gross |
2100 |
sp.setTolerance(self.TOL) |
145 |
|
|
u,p=sp.solve(u0,p0,show_details=VERBOSE, verbose=VERBOSE,max_iter=50,useUzawa=False,iter_restart=18) |
146 |
gross |
1471 |
|
147 |
|
|
error_v0=Lsup(u[0]-u0[0]) |
148 |
|
|
error_v1=Lsup(u[1]-u0[1])/0.25 |
149 |
gross |
2156 |
error_p=Lsup(P1*x[0]*x[1]+p) |
150 |
gross |
2100 |
self.failUnless(error_p<10*self.TOL, "pressure error too large.") |
151 |
|
|
self.failUnless(error_v0<10*self.TOL, "0-velocity error too large.") |
152 |
|
|
self.failUnless(error_v1<10*self.TOL, "1-velocity error too large.") |
153 |
artak |
1518 |
|
154 |
gross |
2100 |
def test_GMRES_P_small(self): |
155 |
gross |
1471 |
ETA=1. |
156 |
|
|
P1=1. |
157 |
|
|
|
158 |
|
|
x=self.domain.getX() |
159 |
|
|
F=-P1*x[1]*[1.,0]+(2*ETA-P1*x[0])*[0.,1.] |
160 |
|
|
mask=whereZero(x[0]) * [1.,1.] \ |
161 |
|
|
+whereZero(x[0]-1) * [1.,1.] \ |
162 |
|
|
+whereZero(x[1]) * [1.,0.] \ |
163 |
|
|
+whereZero(x[1]-1) * [1.,1.] |
164 |
|
|
|
165 |
|
|
sp=StokesProblemCartesian(self.domain) |
166 |
|
|
|
167 |
|
|
sp.initialize(f=F,fixed_u_mask=mask,eta=ETA) |
168 |
|
|
u0=(1-x[0])*x[0]*[0.,1.] |
169 |
|
|
p0=Scalar(P1,ReducedSolution(self.domain)) |
170 |
gross |
2156 |
sp.setTolerance(self.TOL*0.1) |
171 |
gross |
2100 |
u,p=sp.solve(u0,p0,show_details=VERBOSE, verbose=VERBOSE,max_iter=20,useUzawa=False) |
172 |
gross |
1471 |
|
173 |
|
|
error_v0=Lsup(u[0]-u0[0]) |
174 |
|
|
error_v1=Lsup(u[1]-u0[1])/0.25 |
175 |
gross |
2156 |
error_p=Lsup(P1*x[0]*x[1]+p) |
176 |
gross |
2100 |
self.failUnless(error_p<10*self.TOL, "pressure error too large.") |
177 |
|
|
self.failUnless(error_v0<10*self.TOL, "0-velocity error too large.") |
178 |
|
|
self.failUnless(error_v1<10*self.TOL, "1-velocity error too large.") |
179 |
gross |
1471 |
|
180 |
gross |
2100 |
def test_GMRES_P_large(self): |
181 |
gross |
1471 |
ETA=1. |
182 |
|
|
P1=1000. |
183 |
|
|
|
184 |
|
|
x=self.domain.getX() |
185 |
|
|
F=-P1*x[1]*[1.,0]+(2*ETA-P1*x[0])*[0.,1.] |
186 |
|
|
mask=whereZero(x[0]) * [1.,1.] \ |
187 |
|
|
+whereZero(x[0]-1) * [1.,1.] \ |
188 |
|
|
+whereZero(x[1]) * [1.,0.] \ |
189 |
|
|
+whereZero(x[1]-1) * [1.,1.] |
190 |
|
|
|
191 |
|
|
sp=StokesProblemCartesian(self.domain) |
192 |
|
|
|
193 |
|
|
sp.initialize(f=F,fixed_u_mask=mask,eta=ETA) |
194 |
|
|
u0=(1-x[0])*x[0]*[0.,1.] |
195 |
|
|
p0=Scalar(P1,ReducedSolution(self.domain)) |
196 |
gross |
2100 |
sp.setTolerance(self.TOL) |
197 |
|
|
u,p=sp.solve(u0,p0,show_details=VERBOSE, verbose=VERBOSE,max_iter=100,useUzawa=False) |
198 |
gross |
1471 |
|
199 |
|
|
error_v0=Lsup(u[0]-u0[0]) |
200 |
|
|
error_v1=Lsup(u[1]-u0[1])/0.25 |
201 |
gross |
2156 |
error_p=Lsup(P1*x[0]*x[1]+p)/P1 |
202 |
gross |
2100 |
self.failUnless(error_p<10*self.TOL, "pressure error too large.") |
203 |
|
|
self.failUnless(error_v0<10*self.TOL, "0-velocity error too large.") |
204 |
|
|
self.failUnless(error_v1<10*self.TOL, "1-velocity error too large.") |
205 |
|
|
#==================================================================================================================== |
206 |
|
|
class Test_StokesProblemCartesian3D(unittest.TestCase): |
207 |
gross |
1414 |
def setUp(self): |
208 |
gross |
2100 |
NE=6 |
209 |
gross |
2208 |
self.TOL=1e-4 |
210 |
gross |
1414 |
self.domain=Brick(NE,NE,NE,order=2,useFullElementOrder=True) |
211 |
|
|
def tearDown(self): |
212 |
|
|
del self.domain |
213 |
gross |
2100 |
def test_PCG_P_0(self): |
214 |
gross |
1414 |
ETA=1. |
215 |
|
|
P1=0. |
216 |
|
|
|
217 |
|
|
x=self.domain.getX() |
218 |
|
|
F=-P1*x[1]*x[2]*[1.,0.,0.]-P1*x[0]*x[2]*[0.,1.,0.]+(2*ETA*((1-x[0])*x[0]+(1-x[1])*x[1])-P1*x[0]*x[1])*[0.,0.,1.] |
219 |
|
|
x=self.domain.getX() |
220 |
|
|
mask=whereZero(x[0]) * [1.,1.,1.] \ |
221 |
|
|
+whereZero(x[0]-1) * [1.,1.,1.] \ |
222 |
gross |
2156 |
+whereZero(x[1]) * [1.,0.,1.] \ |
223 |
gross |
1414 |
+whereZero(x[1]-1) * [1.,1.,1.] \ |
224 |
|
|
+whereZero(x[2]) * [1.,1.,0.] \ |
225 |
|
|
+whereZero(x[2]-1) * [1.,1.,1.] |
226 |
|
|
|
227 |
|
|
|
228 |
|
|
sp=StokesProblemCartesian(self.domain) |
229 |
|
|
|
230 |
|
|
sp.initialize(f=F,fixed_u_mask=mask,eta=ETA) |
231 |
|
|
u0=(1-x[0])*x[0]*(1-x[1])*x[1]*[0.,0.,1.] |
232 |
|
|
p0=Scalar(P1,ReducedSolution(self.domain)) |
233 |
gross |
2156 |
sp.setTolerance(self.TOL) |
234 |
|
|
u,p=sp.solve(u0,p0,show_details=VERBOSE, verbose=VERBOSE ,max_iter=100,useUzawa=True) |
235 |
gross |
1414 |
|
236 |
|
|
error_v0=Lsup(u[0]-u0[0]) |
237 |
|
|
error_v1=Lsup(u[1]-u0[1]) |
238 |
|
|
error_v2=Lsup(u[2]-u0[2])/0.25**2 |
239 |
gross |
2156 |
error_p=Lsup(P1*x[0]*x[1]*x[2]+p) |
240 |
gross |
2100 |
self.failUnless(error_p<10*self.TOL, "pressure error too large.") |
241 |
|
|
self.failUnless(error_v0<10*self.TOL, "0-velocity error too large.") |
242 |
|
|
self.failUnless(error_v1<10*self.TOL, "1-velocity error too large.") |
243 |
|
|
self.failUnless(error_v2<10*self.TOL, "2-velocity error too large.") |
244 |
artak |
1518 |
|
245 |
gross |
2100 |
def test_PCG_P_small(self): |
246 |
gross |
1414 |
ETA=1. |
247 |
|
|
P1=1. |
248 |
|
|
|
249 |
|
|
x=self.domain.getX() |
250 |
|
|
F=-P1*x[1]*x[2]*[1.,0.,0.]-P1*x[0]*x[2]*[0.,1.,0.]+(2*ETA*((1-x[0])*x[0]+(1-x[1])*x[1])-P1*x[0]*x[1])*[0.,0.,1.] |
251 |
|
|
mask=whereZero(x[0]) * [1.,1.,1.] \ |
252 |
|
|
+whereZero(x[0]-1) * [1.,1.,1.] \ |
253 |
gross |
2156 |
+whereZero(x[1]) * [1.,0.,1.] \ |
254 |
gross |
1414 |
+whereZero(x[1]-1) * [1.,1.,1.] \ |
255 |
|
|
+whereZero(x[2]) * [1.,1.,0.] \ |
256 |
|
|
+whereZero(x[2]-1) * [1.,1.,1.] |
257 |
|
|
|
258 |
|
|
|
259 |
|
|
sp=StokesProblemCartesian(self.domain) |
260 |
|
|
|
261 |
|
|
sp.initialize(f=F,fixed_u_mask=mask,eta=ETA) |
262 |
|
|
u0=(1-x[0])*x[0]*(1-x[1])*x[1]*[0.,0.,1.] |
263 |
|
|
p0=Scalar(P1,ReducedSolution(self.domain)) |
264 |
gross |
2156 |
sp.setTolerance(self.TOL) |
265 |
|
|
u,p=sp.solve(u0,p0,show_details=VERBOSE, verbose=VERBOSE ,max_iter=100,useUzawa=True) |
266 |
gross |
1414 |
|
267 |
|
|
error_v0=Lsup(u[0]-u0[0]) |
268 |
|
|
error_v1=Lsup(u[1]-u0[1]) |
269 |
|
|
error_v2=Lsup(u[2]-u0[2])/0.25**2 |
270 |
gross |
2156 |
error_p=Lsup(P1*x[0]*x[1]*x[2]+p) |
271 |
gross |
2100 |
self.failUnless(error_p<10*self.TOL, "pressure error too large.") |
272 |
|
|
self.failUnless(error_v0<10*self.TOL, "0-velocity error too large.") |
273 |
|
|
self.failUnless(error_v1<10*self.TOL, "1-velocity error too large.") |
274 |
|
|
self.failUnless(error_v2<10*self.TOL, "2-velocity error too large.") |
275 |
|
|
def test_PCG_P_large(self): |
276 |
gross |
1414 |
ETA=1. |
277 |
|
|
P1=1000. |
278 |
|
|
|
279 |
|
|
x=self.domain.getX() |
280 |
|
|
F=-P1*x[1]*x[2]*[1.,0.,0.]-P1*x[0]*x[2]*[0.,1.,0.]+(2*ETA*((1-x[0])*x[0]+(1-x[1])*x[1])-P1*x[0]*x[1])*[0.,0.,1.] |
281 |
|
|
mask=whereZero(x[0]) * [1.,1.,1.] \ |
282 |
|
|
+whereZero(x[0]-1) * [1.,1.,1.] \ |
283 |
gross |
2156 |
+whereZero(x[1]) * [1.,0.,1.] \ |
284 |
gross |
1414 |
+whereZero(x[1]-1) * [1.,1.,1.] \ |
285 |
|
|
+whereZero(x[2]) * [1.,1.,0.] \ |
286 |
|
|
+whereZero(x[2]-1) * [1.,1.,1.] |
287 |
|
|
|
288 |
|
|
|
289 |
|
|
sp=StokesProblemCartesian(self.domain) |
290 |
|
|
|
291 |
|
|
sp.initialize(f=F,fixed_u_mask=mask,eta=ETA) |
292 |
|
|
u0=(1-x[0])*x[0]*(1-x[1])*x[1]*[0.,0.,1.] |
293 |
|
|
p0=Scalar(P1,ReducedSolution(self.domain)) |
294 |
gross |
2156 |
sp.setTolerance(self.TOL) |
295 |
|
|
u,p=sp.solve(u0,-p0,show_details=VERBOSE, verbose=VERBOSE ,max_iter=100,useUzawa=True) |
296 |
gross |
1414 |
|
297 |
|
|
error_v0=Lsup(u[0]-u0[0]) |
298 |
|
|
error_v1=Lsup(u[1]-u0[1]) |
299 |
|
|
error_v2=Lsup(u[2]-u0[2])/0.25**2 |
300 |
gross |
2156 |
error_p=Lsup(P1*x[0]*x[1]*x[2]+p)/P1 |
301 |
gross |
2100 |
self.failUnless(error_p<10*self.TOL, "pressure error too large.") |
302 |
|
|
self.failUnless(error_v0<10*self.TOL, "0-velocity error too large.") |
303 |
|
|
self.failUnless(error_v1<10*self.TOL, "1-velocity error too large.") |
304 |
|
|
self.failUnless(error_v2<10*self.TOL, "2-velocity error too large.") |
305 |
gross |
1414 |
|
306 |
gross |
2100 |
def test_GMRES_P_0(self): |
307 |
gross |
1471 |
ETA=1. |
308 |
|
|
P1=0. |
309 |
|
|
|
310 |
|
|
x=self.domain.getX() |
311 |
|
|
F=-P1*x[1]*x[2]*[1.,0.,0.]-P1*x[0]*x[2]*[0.,1.,0.]+(2*ETA*((1-x[0])*x[0]+(1-x[1])*x[1])-P1*x[0]*x[1])*[0.,0.,1.] |
312 |
|
|
x=self.domain.getX() |
313 |
|
|
mask=whereZero(x[0]) * [1.,1.,1.] \ |
314 |
|
|
+whereZero(x[0]-1) * [1.,1.,1.] \ |
315 |
|
|
+whereZero(x[1]) * [1.,1.,1.] \ |
316 |
|
|
+whereZero(x[1]-1) * [1.,1.,1.] \ |
317 |
|
|
+whereZero(x[2]) * [1.,1.,0.] \ |
318 |
|
|
+whereZero(x[2]-1) * [1.,1.,1.] |
319 |
|
|
|
320 |
|
|
|
321 |
|
|
sp=StokesProblemCartesian(self.domain) |
322 |
|
|
|
323 |
|
|
sp.initialize(f=F,fixed_u_mask=mask,eta=ETA) |
324 |
|
|
u0=(1-x[0])*x[0]*(1-x[1])*x[1]*[0.,0.,1.] |
325 |
|
|
p0=Scalar(P1,ReducedSolution(self.domain)) |
326 |
gross |
2156 |
sp.setTolerance(self.TOL) |
327 |
gross |
2100 |
u,p=sp.solve(u0,p0,show_details=VERBOSE, verbose=VERBOSE,max_iter=100,useUzawa=False,iter_restart=20) |
328 |
gross |
1471 |
|
329 |
|
|
error_v0=Lsup(u[0]-u0[0]) |
330 |
|
|
error_v1=Lsup(u[1]-u0[1]) |
331 |
|
|
error_v2=Lsup(u[2]-u0[2])/0.25**2 |
332 |
gross |
2156 |
error_p=Lsup(P1*x[0]*x[1]*x[2]+p) |
333 |
gross |
1471 |
# print error_p, error_v0,error_v1,error_v2 |
334 |
gross |
2100 |
self.failUnless(error_p<10*self.TOL, "pressure error too large.") |
335 |
|
|
self.failUnless(error_v0<10*self.TOL, "0-velocity error too large.") |
336 |
|
|
self.failUnless(error_v1<10*self.TOL, "1-velocity error too large.") |
337 |
|
|
self.failUnless(error_v2<10*self.TOL, "2-velocity error too large.") |
338 |
|
|
def test_GMRES_P_small(self): |
339 |
gross |
1471 |
ETA=1. |
340 |
|
|
P1=1. |
341 |
|
|
|
342 |
|
|
x=self.domain.getX() |
343 |
|
|
F=-P1*x[1]*x[2]*[1.,0.,0.]-P1*x[0]*x[2]*[0.,1.,0.]+(2*ETA*((1-x[0])*x[0]+(1-x[1])*x[1])-P1*x[0]*x[1])*[0.,0.,1.] |
344 |
|
|
mask=whereZero(x[0]) * [1.,1.,1.] \ |
345 |
|
|
+whereZero(x[0]-1) * [1.,1.,1.] \ |
346 |
|
|
+whereZero(x[1]) * [1.,1.,1.] \ |
347 |
|
|
+whereZero(x[1]-1) * [1.,1.,1.] \ |
348 |
|
|
+whereZero(x[2]) * [1.,1.,0.] \ |
349 |
|
|
+whereZero(x[2]-1) * [1.,1.,1.] |
350 |
|
|
|
351 |
|
|
|
352 |
|
|
sp=StokesProblemCartesian(self.domain) |
353 |
|
|
|
354 |
|
|
sp.initialize(f=F,fixed_u_mask=mask,eta=ETA) |
355 |
|
|
u0=(1-x[0])*x[0]*(1-x[1])*x[1]*[0.,0.,1.] |
356 |
|
|
p0=Scalar(P1,ReducedSolution(self.domain)) |
357 |
gross |
2156 |
sp.setTolerance(self.TOL) |
358 |
|
|
u,p=sp.solve(u0,p0,show_details=VERBOSE, verbose=VERBOSE ,max_iter=100,useUzawa=False) |
359 |
gross |
1471 |
|
360 |
|
|
error_v0=Lsup(u[0]-u0[0]) |
361 |
|
|
error_v1=Lsup(u[1]-u0[1]) |
362 |
|
|
error_v2=Lsup(u[2]-u0[2])/0.25**2 |
363 |
gross |
2156 |
error_p=Lsup(P1*x[0]*x[1]*x[2]+p)/P1 |
364 |
gross |
2100 |
self.failUnless(error_p<10*self.TOL, "pressure error too large.") |
365 |
|
|
self.failUnless(error_v0<10*self.TOL, "0-velocity error too large.") |
366 |
|
|
self.failUnless(error_v1<10*self.TOL, "1-velocity error too large.") |
367 |
|
|
self.failUnless(error_v2<10*self.TOL, "2-velocity error too large.") |
368 |
|
|
def test_GMRES_P_large(self): |
369 |
gross |
1471 |
ETA=1. |
370 |
|
|
P1=1000. |
371 |
|
|
|
372 |
|
|
x=self.domain.getX() |
373 |
|
|
F=-P1*x[1]*x[2]*[1.,0.,0.]-P1*x[0]*x[2]*[0.,1.,0.]+(2*ETA*((1-x[0])*x[0]+(1-x[1])*x[1])-P1*x[0]*x[1])*[0.,0.,1.] |
374 |
|
|
mask=whereZero(x[0]) * [1.,1.,1.] \ |
375 |
|
|
+whereZero(x[0]-1) * [1.,1.,1.] \ |
376 |
gross |
2156 |
+whereZero(x[1]) * [1.,0.,1.] \ |
377 |
gross |
1471 |
+whereZero(x[1]-1) * [1.,1.,1.] \ |
378 |
|
|
+whereZero(x[2]) * [1.,1.,0.] \ |
379 |
|
|
+whereZero(x[2]-1) * [1.,1.,1.] |
380 |
|
|
|
381 |
|
|
|
382 |
|
|
sp=StokesProblemCartesian(self.domain) |
383 |
|
|
|
384 |
|
|
sp.initialize(f=F,fixed_u_mask=mask,eta=ETA) |
385 |
|
|
u0=(1-x[0])*x[0]*(1-x[1])*x[1]*[0.,0.,1.] |
386 |
|
|
p0=Scalar(P1,ReducedSolution(self.domain)) |
387 |
gross |
2156 |
sp.setTolerance(self.TOL) |
388 |
|
|
u,p=sp.solve(u0,p0,show_details=VERBOSE, verbose=VERBOSE ,max_iter=100,useUzawa=False) |
389 |
gross |
1471 |
|
390 |
|
|
error_v0=Lsup(u[0]-u0[0]) |
391 |
|
|
error_v1=Lsup(u[1]-u0[1]) |
392 |
|
|
error_v2=Lsup(u[2]-u0[2])/0.25**2 |
393 |
gross |
2156 |
error_p=Lsup(P1*x[0]*x[1]*x[2]+p)/P1 |
394 |
gross |
2100 |
self.failUnless(error_p<10*self.TOL, "pressure error too large.") |
395 |
|
|
self.failUnless(error_v0<10*self.TOL, "0-velocity error too large.") |
396 |
|
|
self.failUnless(error_v1<10*self.TOL, "1-velocity error too large.") |
397 |
|
|
self.failUnless(error_v2<10*self.TOL, "2-velocity error too large.") |
398 |
|
|
#==================================================================================================================== |
399 |
|
|
class Test_Darcy(unittest.TestCase): |
400 |
|
|
# this is a simple test for the darcy flux problem |
401 |
|
|
# |
402 |
|
|
# |
403 |
|
|
# p = 1/k * ( 1/2* (fb-f0)/xb* x **2 + f0 * x - ub*x ) + p0 |
404 |
|
|
# |
405 |
|
|
# with f = (fb-f0)/xb* x + f0 |
406 |
|
|
# |
407 |
|
|
# u = f - k * p,x = ub |
408 |
|
|
# |
409 |
|
|
# we prescribe pressure at x=x0=0 to p0 |
410 |
|
|
# |
411 |
|
|
# if we prescribe the pressure on the bottom x=xb we set |
412 |
|
|
# |
413 |
|
|
# pb= 1/k * ( 1/2* (fb-f0)* xb + f0 * xb - ub*xb ) + p0 = 1/k * ((fb+f0)/2 - ub ) * xb + p0 |
414 |
|
|
# |
415 |
|
|
# which leads to ub = (fb+f0)/2-k*(pb-p0)/xb |
416 |
|
|
# |
417 |
|
|
def rescaleDomain(self): |
418 |
|
|
x=self.dom.getX().copy() |
419 |
|
|
for i in xrange(self.dom.getDim()): |
420 |
|
|
x_inf=inf(x[i]) |
421 |
|
|
x_sup=sup(x[i]) |
422 |
|
|
if i == self.dom.getDim()-1: |
423 |
|
|
x[i]=-self.WIDTH*(x[i]-x_sup)/(x_inf-x_sup) |
424 |
|
|
else: |
425 |
|
|
x[i]=self.WIDTH*(x[i]-x_inf)/(x_sup-x_inf) |
426 |
|
|
self.dom.setX(x) |
427 |
|
|
def getScalarMask(self,include_bottom=True): |
428 |
|
|
x=self.dom.getX().copy() |
429 |
|
|
x_inf=inf(x[self.dom.getDim()-1]) |
430 |
|
|
x_sup=sup(x[self.dom.getDim()-1]) |
431 |
|
|
out=whereZero(x[self.dom.getDim()-1]-x_sup) |
432 |
|
|
if include_bottom: out+=whereZero(x[self.dom.getDim()-1]-x_inf) |
433 |
|
|
return wherePositive(out) |
434 |
|
|
def getVectorMask(self,include_bottom=True): |
435 |
|
|
x=self.dom.getX().copy() |
436 |
|
|
out=Vector(0.,Solution(self.dom)) |
437 |
|
|
for i in xrange(self.dom.getDim()): |
438 |
|
|
x_inf=inf(x[i]) |
439 |
|
|
x_sup=sup(x[i]) |
440 |
|
|
if i != self.dom.getDim()-1: out[i]+=whereZero(x[i]-x_sup) |
441 |
|
|
if i != self.dom.getDim()-1 or include_bottom: out[i]+=whereZero(x[i]-x_inf) |
442 |
|
|
return wherePositive(out) |
443 |
gross |
1471 |
|
444 |
gross |
2100 |
def setSolutionFixedBottom(self, p0, pb, f0, fb, k): |
445 |
|
|
d=self.dom.getDim() |
446 |
|
|
x=self.dom.getX()[d-1] |
447 |
|
|
xb=inf(x) |
448 |
|
|
u=Vector(0.,Solution(self.dom))+kronecker(d)[d-1]*((f0+fb)/2.-k*(pb-p0)/xb) |
449 |
|
|
p=1./k*((fb-f0)/(xb*2.)* x**2 - (fb-f0)/2.*x)+(pb-p0)/xb*x + p0 |
450 |
|
|
f= ((fb-f0)/xb* x + f0)*kronecker(Function(self.dom))[d-1] |
451 |
|
|
return u,p,f |
452 |
|
|
|
453 |
|
|
def testConstF_FixedBottom_smallK(self): |
454 |
|
|
k=1.e-10 |
455 |
|
|
mp=self.getScalarMask(include_bottom=True) |
456 |
|
|
mv=self.getVectorMask(include_bottom=False) |
457 |
|
|
u_ref,p_ref,f=self.setSolutionFixedBottom(p0=2500,pb=4000.,f0=10.,fb=10.,k=k) |
458 |
|
|
p=p_ref*mp |
459 |
|
|
u=u_ref*mv |
460 |
|
|
df=DarcyFlow(self.dom) |
461 |
|
|
df.setValue(g=f, |
462 |
|
|
location_of_fixed_pressure=mp, |
463 |
|
|
location_of_fixed_flux=mv, |
464 |
|
|
permeability=Scalar(k,Function(self.dom))) |
465 |
gross |
2208 |
df.setTolerance(rtol=self.TOL,p_ref=p_ref,v_ref=u_ref) |
466 |
|
|
v,p=df.solve(u_ref,p, max_iter=100, verbose=VERBOSE,sub_rtol=self.TOL/200) |
467 |
gross |
2100 |
self.failUnless(Lsup(v-u_ref)<self.TOL*10.*Lsup(u_ref), "flux error too big.") |
468 |
|
|
self.failUnless(Lsup(p-p_ref)<self.TOL*10.*Lsup(p_ref), "pressure error too big.") |
469 |
artak |
1518 |
|
470 |
gross |
2100 |
def testConstF_FixedBottom_mediumK(self): |
471 |
|
|
k=1. |
472 |
|
|
mp=self.getScalarMask(include_bottom=True) |
473 |
|
|
mv=self.getVectorMask(include_bottom=False) |
474 |
|
|
u_ref,p_ref,f=self.setSolutionFixedBottom(p0=2500,pb=4000.,f0=10.,fb=10.,k=k) |
475 |
|
|
p=p_ref*mp |
476 |
|
|
u=u_ref*mv |
477 |
|
|
df=DarcyFlow(self.dom) |
478 |
|
|
df.setValue(g=f, |
479 |
|
|
location_of_fixed_pressure=mp, |
480 |
|
|
location_of_fixed_flux=mv, |
481 |
|
|
permeability=Scalar(k,Function(self.dom))) |
482 |
gross |
2208 |
df.setTolerance(rtol=self.TOL,p_ref=p_ref,v_ref=u_ref) |
483 |
|
|
v,p=df.solve(u,p,max_iter=100, verbose=VERBOSE ,sub_rtol=self.TOL/200) |
484 |
|
|
self.failUnless(Lsup(p-p_ref)<self.TOL*10.*Lsup(p_ref), "pressure error too big.") |
485 |
gross |
2100 |
self.failUnless(Lsup(v-u_ref)<self.TOL*10.*Lsup(u_ref), "flux error too big.") |
486 |
artak |
1518 |
|
487 |
gross |
2100 |
def testConstF_FixedBottom_largeK(self): |
488 |
|
|
k=1.e10 |
489 |
|
|
mp=self.getScalarMask(include_bottom=True) |
490 |
|
|
mv=self.getVectorMask(include_bottom=False) |
491 |
|
|
u_ref,p_ref,f=self.setSolutionFixedBottom(p0=2500,pb=4000.,f0=10.,fb=10.,k=k) |
492 |
|
|
p=p_ref*mp |
493 |
|
|
u=u_ref*mv |
494 |
|
|
df=DarcyFlow(self.dom) |
495 |
|
|
df.setValue(g=f, |
496 |
|
|
location_of_fixed_pressure=mp, |
497 |
|
|
location_of_fixed_flux=mv, |
498 |
|
|
permeability=Scalar(k,Function(self.dom))) |
499 |
gross |
2208 |
df.setTolerance(rtol=self.TOL,p_ref=p_ref,v_ref=u_ref) |
500 |
|
|
v,p=df.solve(u,p, max_iter=100, verbose=VERBOSE,sub_rtol=self.TOL/200) |
501 |
gross |
2100 |
self.failUnless(Lsup(v-u_ref)<self.TOL*10.*Lsup(u_ref), "flux error too big.") |
502 |
|
|
self.failUnless(Lsup(p-p_ref)<self.TOL*10.*Lsup(p_ref), "pressure error too big.") |
503 |
artak |
1518 |
|
504 |
gross |
2100 |
def testVarioF_FixedBottom_smallK(self): |
505 |
|
|
k=1.e-10 |
506 |
|
|
mp=self.getScalarMask(include_bottom=True) |
507 |
|
|
mv=self.getVectorMask(include_bottom=False) |
508 |
|
|
u_ref,p_ref,f=self.setSolutionFixedBottom(p0=2500,pb=4000.,f0=10.,fb=30.,k=k) |
509 |
|
|
p=p_ref*mp |
510 |
|
|
u=u_ref*mv |
511 |
|
|
df=DarcyFlow(self.dom) |
512 |
|
|
df.setValue(g=f, |
513 |
|
|
location_of_fixed_pressure=mp, |
514 |
|
|
location_of_fixed_flux=mv, |
515 |
|
|
permeability=Scalar(k,Function(self.dom))) |
516 |
gross |
2208 |
df.setTolerance(rtol=self.TOL,p_ref=p_ref,v_ref=u_ref) |
517 |
|
|
v,p=df.solve(u,p, max_iter=100, verbose=VERBOSE,sub_rtol=self.TOL/200) |
518 |
gross |
2100 |
self.failUnless(Lsup(v-u_ref)<self.TOL*10.*Lsup(u_ref), "flux error too big.") |
519 |
|
|
self.failUnless(Lsup(p-p_ref)<self.TOL*10.*Lsup(p_ref), "pressure error too big.") |
520 |
artak |
1518 |
|
521 |
gross |
2100 |
def testVarioF_FixedBottom_mediumK(self): |
522 |
|
|
k=1. |
523 |
|
|
mp=self.getScalarMask(include_bottom=True) |
524 |
|
|
mv=self.getVectorMask(include_bottom=False) |
525 |
|
|
u_ref,p_ref,f=self.setSolutionFixedBottom(p0=2500,pb=4000.,f0=10.,fb=30.,k=k) |
526 |
|
|
p=p_ref*mp |
527 |
|
|
u=u_ref*mv |
528 |
|
|
df=DarcyFlow(self.dom) |
529 |
|
|
df.setValue(g=f, |
530 |
|
|
location_of_fixed_pressure=mp, |
531 |
|
|
location_of_fixed_flux=mv, |
532 |
|
|
permeability=Scalar(k,Function(self.dom))) |
533 |
gross |
2208 |
df.setTolerance(rtol=self.TOL,p_ref=p_ref,v_ref=u_ref) |
534 |
|
|
v,p=df.solve(u,p, max_iter=100, verbose=VERBOSE,sub_rtol=self.TOL/200) |
535 |
gross |
2100 |
self.failUnless(Lsup(v-u_ref)<self.TOL*10.*Lsup(u_ref), "flux error too big.") |
536 |
|
|
self.failUnless(Lsup(p-p_ref)<self.TOL*10.*Lsup(p_ref), "pressure error too big.") |
537 |
artak |
1518 |
|
538 |
gross |
2100 |
def testVarioF_FixedBottom_largeK(self): |
539 |
|
|
k=1.e10 |
540 |
|
|
mp=self.getScalarMask(include_bottom=True) |
541 |
|
|
mv=self.getVectorMask(include_bottom=False) |
542 |
|
|
u_ref,p_ref,f=self.setSolutionFixedBottom(p0=2500,pb=4000.,f0=10.,fb=30.,k=k) |
543 |
|
|
p=p_ref*mp |
544 |
|
|
u=u_ref*mv |
545 |
|
|
df=DarcyFlow(self.dom) |
546 |
|
|
df.setValue(g=f, |
547 |
|
|
location_of_fixed_pressure=mp, |
548 |
|
|
location_of_fixed_flux=mv, |
549 |
|
|
permeability=Scalar(k,Function(self.dom))) |
550 |
gross |
2208 |
df.setTolerance(rtol=self.TOL,p_ref=p_ref,v_ref=u_ref) |
551 |
|
|
v,p=df.solve(u,p, max_iter=100, verbose=VERBOSE,sub_rtol=self.TOL/200) |
552 |
gross |
2100 |
self.failUnless(Lsup(v-u_ref)<self.TOL*10.*Lsup(u_ref), "flux error too big.") |
553 |
|
|
self.failUnless(Lsup(p-p_ref)<self.TOL*10.*Lsup(p_ref), "pressure error too big.") |
554 |
artak |
1518 |
|
555 |
gross |
2100 |
def testConstF_FreeBottom_smallK(self): |
556 |
|
|
k=1.e-10 |
557 |
|
|
mp=self.getScalarMask(include_bottom=False) |
558 |
|
|
mv=self.getVectorMask(include_bottom=True) |
559 |
|
|
u_ref,p_ref,f=self.setSolutionFixedBottom(p0=2500,pb=4000.,f0=10.,fb=10.,k=k) |
560 |
|
|
p=p_ref*mp |
561 |
|
|
u=u_ref*mv |
562 |
|
|
df=DarcyFlow(self.dom) |
563 |
|
|
df.setValue(g=f, |
564 |
gross |
2208 |
location_of_fixed_pressure=mp, |
565 |
gross |
2100 |
location_of_fixed_flux=mv, |
566 |
|
|
permeability=Scalar(k,Function(self.dom))) |
567 |
gross |
2208 |
df.setTolerance(rtol=self.TOL,p_ref=p_ref,v_ref=u_ref) |
568 |
|
|
v,p=df.solve(u,p, max_iter=100, verbose=VERBOSE,sub_rtol=self.TOL/200) |
569 |
gross |
2100 |
self.failUnless(Lsup(v-u_ref)<self.TOL*10.*Lsup(u_ref), "flux error too big.") |
570 |
|
|
self.failUnless(Lsup(p-p_ref)<self.TOL*10.*Lsup(p_ref), "pressure error too big.") |
571 |
artak |
1518 |
|
572 |
gross |
2100 |
def testConstF_FreeBottom_mediumK(self): |
573 |
|
|
k=1. |
574 |
|
|
mp=self.getScalarMask(include_bottom=False) |
575 |
|
|
mv=self.getVectorMask(include_bottom=True) |
576 |
|
|
u_ref,p_ref,f=self.setSolutionFixedBottom(p0=2500,pb=4000.,f0=10.,fb=10.,k=k) |
577 |
|
|
p=p_ref*mp |
578 |
|
|
u=u_ref*mv |
579 |
|
|
df=DarcyFlow(self.dom) |
580 |
|
|
df.setValue(g=f, |
581 |
|
|
location_of_fixed_pressure=mp, |
582 |
|
|
location_of_fixed_flux=mv, |
583 |
|
|
permeability=Scalar(k,Function(self.dom))) |
584 |
gross |
2208 |
df.setTolerance(rtol=self.TOL,p_ref=p_ref,v_ref=u_ref) |
585 |
|
|
v,p=df.solve(u,p, max_iter=100, verbose=VERBOSE,sub_rtol=self.TOL/200) |
586 |
gross |
2100 |
self.failUnless(Lsup(v-u_ref)<self.TOL*10.*Lsup(u_ref), "flux error too big.") |
587 |
|
|
self.failUnless(Lsup(p-p_ref)<self.TOL*10.*Lsup(p_ref), "pressure error too big.") |
588 |
artak |
1518 |
|
589 |
gross |
2100 |
def testConstF_FreeBottom_largeK(self): |
590 |
|
|
k=1.e10 |
591 |
|
|
mp=self.getScalarMask(include_bottom=False) |
592 |
|
|
mv=self.getVectorMask(include_bottom=True) |
593 |
|
|
u_ref,p_ref,f=self.setSolutionFixedBottom(p0=2500,pb=4000.,f0=10.,fb=10.,k=k) |
594 |
|
|
p=p_ref*mp |
595 |
|
|
u=u_ref*mv |
596 |
|
|
df=DarcyFlow(self.dom) |
597 |
|
|
df.setValue(g=f, |
598 |
|
|
location_of_fixed_pressure=mp, |
599 |
|
|
location_of_fixed_flux=mv, |
600 |
|
|
permeability=Scalar(k,Function(self.dom))) |
601 |
gross |
2208 |
df.setTolerance(rtol=self.TOL,p_ref=p_ref,v_ref=u_ref) |
602 |
|
|
v,p=df.solve(u,p, max_iter=100, verbose=VERBOSE,sub_rtol=self.TOL/200) |
603 |
gross |
2100 |
self.failUnless(Lsup(v-u_ref)<self.TOL*10.*Lsup(u_ref), "flux error too big.") |
604 |
|
|
self.failUnless(Lsup(p-p_ref)<self.TOL*10.*Lsup(p_ref), "pressure error too big.") |
605 |
artak |
1518 |
|
606 |
gross |
2100 |
def testVarioF_FreeBottom_smallK(self): |
607 |
|
|
k=1.e-10 |
608 |
|
|
mp=self.getScalarMask(include_bottom=False) |
609 |
|
|
mv=self.getVectorMask(include_bottom=True) |
610 |
|
|
u_ref,p_ref,f=self.setSolutionFixedBottom(p0=2500,pb=4000.,f0=10.,fb=30.,k=k) |
611 |
|
|
p=p_ref*mp |
612 |
|
|
u=u_ref*mv |
613 |
|
|
df=DarcyFlow(self.dom) |
614 |
|
|
df.setValue(g=f, |
615 |
|
|
location_of_fixed_pressure=mp, |
616 |
|
|
location_of_fixed_flux=mv, |
617 |
|
|
permeability=Scalar(k,Function(self.dom))) |
618 |
gross |
2208 |
df.setTolerance(rtol=self.TOL,p_ref=p_ref,v_ref=u_ref) |
619 |
|
|
v,p=df.solve(u,p, max_iter=100, verbose=VERBOSE,sub_rtol=self.TOL/200) |
620 |
|
|
self.failUnless(Lsup(v-u_ref)<self.TOL*25.*Lsup(u_ref), "flux error too big.") # 25 because of disc. error. |
621 |
|
|
self.failUnless(Lsup(p-p_ref)<self.TOL*25.*Lsup(p_ref), "pressure error too big.") |
622 |
artak |
1518 |
|
623 |
gross |
2100 |
def testVarioF_FreeBottom_mediumK(self): |
624 |
|
|
k=1. |
625 |
|
|
mp=self.getScalarMask(include_bottom=False) |
626 |
|
|
mv=self.getVectorMask(include_bottom=True) |
627 |
|
|
u_ref,p_ref,f=self.setSolutionFixedBottom(p0=2500,pb=4000.,f0=10.,fb=30.,k=k) |
628 |
|
|
p=p_ref*mp |
629 |
|
|
u=u_ref*mv |
630 |
|
|
df=DarcyFlow(self.dom) |
631 |
|
|
df.setValue(g=f, |
632 |
|
|
location_of_fixed_pressure=mp, |
633 |
|
|
location_of_fixed_flux=mv, |
634 |
|
|
permeability=Scalar(k,Function(self.dom))) |
635 |
gross |
2208 |
df.setTolerance(rtol=self.TOL,p_ref=p_ref,v_ref=u_ref) |
636 |
|
|
v,p=df.solve(u,p, max_iter=100, verbose=VERBOSE,sub_rtol=self.TOL/200) |
637 |
gross |
2100 |
self.failUnless(Lsup(v-u_ref)<self.TOL*10.*Lsup(u_ref), "flux error too big.") |
638 |
|
|
self.failUnless(Lsup(p-p_ref)<self.TOL*10.*Lsup(p_ref), "pressure error too big.") |
639 |
artak |
1518 |
|
640 |
gross |
2100 |
def testVarioF_FreeBottom_largeK(self): |
641 |
|
|
k=1.e10 |
642 |
|
|
mp=self.getScalarMask(include_bottom=False) |
643 |
|
|
mv=self.getVectorMask(include_bottom=True) |
644 |
|
|
u_ref,p_ref,f=self.setSolutionFixedBottom(p0=2500,pb=4000.,f0=10.,fb=30.,k=k) |
645 |
|
|
p=p_ref*mp |
646 |
|
|
u=u_ref*mv |
647 |
|
|
df=DarcyFlow(self.dom) |
648 |
|
|
df.setValue(g=f, |
649 |
|
|
location_of_fixed_pressure=mp, |
650 |
|
|
location_of_fixed_flux=mv, |
651 |
|
|
permeability=Scalar(k,Function(self.dom))) |
652 |
gross |
2208 |
df.setTolerance(rtol=self.TOL,p_ref=p_ref,v_ref=u_ref) |
653 |
|
|
v,p=df.solve(u,p, max_iter=100, verbose=VERBOSE,sub_rtol=self.TOL/200) |
654 |
gross |
2100 |
self.failUnless(Lsup(v-u_ref)<self.TOL*10.*Lsup(u_ref), "flux error too big.") |
655 |
|
|
self.failUnless(Lsup(p-p_ref)<self.TOL*10.*Lsup(p_ref), "pressure error too big.") |
656 |
artak |
1518 |
|
657 |
gross |
2100 |
class Test_Darcy2D(Test_Darcy): |
658 |
gross |
2208 |
TOL=1e-4 |
659 |
gross |
2100 |
WIDTH=1. |
660 |
|
|
def setUp(self): |
661 |
gross |
2208 |
NE=40 # wrning smaller NE may case a failure for VarioF tests due to discretization errors. |
662 |
gross |
2100 |
self.dom = Rectangle(NE,NE) |
663 |
|
|
self.rescaleDomain() |
664 |
|
|
def tearDown(self): |
665 |
|
|
del self.dom |
666 |
|
|
class Test_Darcy3D(Test_Darcy): |
667 |
|
|
TOL=1e-4 |
668 |
|
|
WIDTH=1. |
669 |
|
|
def setUp(self): |
670 |
|
|
NE=25 # wrning smaller NE may case a failure for VarioF tests due to discretization errors. |
671 |
|
|
self.dom = Brick(NE,NE,NE) |
672 |
|
|
self.rescaleDomain() |
673 |
|
|
def tearDown(self): |
674 |
|
|
del self.dom |
675 |
artak |
1518 |
|
676 |
gross |
2100 |
|
677 |
|
|
|
678 |
gross |
1414 |
if __name__ == '__main__': |
679 |
|
|
suite = unittest.TestSuite() |
680 |
gross |
2100 |
suite.addTest(unittest.makeSuite(Test_StokesProblemCartesian2D)) |
681 |
|
|
suite.addTest(unittest.makeSuite(Test_Darcy3D)) |
682 |
|
|
suite.addTest(unittest.makeSuite(Test_Darcy2D)) |
683 |
|
|
suite.addTest(unittest.makeSuite(Test_StokesProblemCartesian3D)) |
684 |
gross |
1414 |
s=unittest.TextTestRunner(verbosity=2).run(suite) |
685 |
|
|
if not s.wasSuccessful(): sys.exit(1) |
686 |
|
|
|