1 |
jgs |
149 |
# $Id$ |
2 |
|
|
|
3 |
|
|
""" |
4 |
|
|
Test suite for linearPDEs class |
5 |
|
|
|
6 |
|
|
The tests must be linked with a Domain class object in the setUp method: |
7 |
|
|
|
8 |
|
|
from esys.finley import Rectangle |
9 |
|
|
class Test_LinearPDEOnFinley(Test_LinearPDE): |
10 |
|
|
def setUp(self): |
11 |
|
|
self.domain = Rectangle(10,10,2) |
12 |
|
|
suite = unittest.TestSuite() |
13 |
|
|
suite.addTest(unittest.makeSuite(Test_LinearPDEOnFinley)) |
14 |
|
|
unittest.TextTestRunner(verbosity=2).run(suite) |
15 |
|
|
|
16 |
|
|
""" |
17 |
|
|
|
18 |
|
|
__author__="Lutz Gross, l.gross@uq.edu.au" |
19 |
|
|
__licence__="contact: esys@access.uq.edu.au" |
20 |
|
|
__url__="http://www.iservo.edu.au/esys/escript" |
21 |
|
|
__version__="$Revision$" |
22 |
|
|
__date__="$Date$" |
23 |
|
|
|
24 |
|
|
|
25 |
|
|
|
26 |
gross |
304 |
from esys.escript.util import Lsup,kronecker,interpolate,whereZero |
27 |
jgs |
149 |
from esys.escript import Function,FunctionOnBoundary,FunctionOnContactZero,Solution,ReducedSolution,Vector,ContinuousFunction,Scalar |
28 |
|
|
from esys.escript.linearPDEs import LinearPDE,IllegalCoefficientValue,Poisson |
29 |
|
|
import numarray |
30 |
|
|
import unittest |
31 |
|
|
|
32 |
|
|
class Test_linearPDEs(unittest.TestCase): |
33 |
|
|
TOL=1.e-6 |
34 |
jgs |
153 |
SOLVER_TOL=1.e-10 |
35 |
jgs |
149 |
DEBUG=False |
36 |
|
|
VERBOSE=False |
37 |
|
|
def check(self,arg,ref_arg,tol=None): |
38 |
|
|
""" |
39 |
|
|
checks if arg and ref_arg are nearly identical using the L{Lsup<esys.escript.util.Lsup>} |
40 |
|
|
""" |
41 |
|
|
if tol==None: tol=self.TOL |
42 |
|
|
return Lsup(arg-ref_arg)<=tol*Lsup(ref_arg) |
43 |
|
|
|
44 |
|
|
class Test_Poisson(Test_linearPDEs): |
45 |
|
|
|
46 |
|
|
def test_config(self): |
47 |
|
|
mypde=Poisson(self.domain,debug=self.DEBUG) |
48 |
|
|
self.failUnlessEqual((mypde.getNumEquations(),mypde.getNumSolutions(),mypde.isSymmetric()),(1,1,True),"set up incorrect") |
49 |
|
|
def test_setCoefficient_q(self): |
50 |
|
|
mypde=Poisson(self.domain,debug=self.DEBUG) |
51 |
|
|
x=self.domain.getX() |
52 |
gross |
304 |
q_ref=interpolate(whereZero(x[0]),Solution(self.domain)) |
53 |
jgs |
149 |
A_ref=kronecker(self.domain) |
54 |
gross |
304 |
mypde.setValue(q=whereZero(x[0])) |
55 |
jgs |
149 |
self.failUnless(self.check(mypde.getCoefficientOfGeneralPDE("A"),A_ref),"A is not kronecker") |
56 |
|
|
self.failUnless(mypde.getCoefficientOfGeneralPDE("B").isEmpty(),"B is not empty") |
57 |
|
|
self.failUnless(mypde.getCoefficientOfGeneralPDE("C").isEmpty(),"C is not empty") |
58 |
|
|
self.failUnless(mypde.getCoefficientOfGeneralPDE("D").isEmpty(),"D is not empty") |
59 |
|
|
self.failUnless(mypde.getCoefficientOfGeneralPDE("X").isEmpty(),"X is not empty") |
60 |
|
|
self.failUnless(mypde.getCoefficientOfGeneralPDE("Y").isEmpty(),"Y is not empty") |
61 |
|
|
self.failUnless(mypde.getCoefficientOfGeneralPDE("y").isEmpty(),"y is not empty") |
62 |
|
|
self.failUnless(mypde.getCoefficientOfGeneralPDE("d").isEmpty(),"d is not empty") |
63 |
|
|
self.failUnless(mypde.getCoefficientOfGeneralPDE("d_contact").isEmpty(),"d_contact is not empty") |
64 |
|
|
self.failUnless(mypde.getCoefficientOfGeneralPDE("y_contact").isEmpty(),"y_contact is not empty") |
65 |
|
|
self.failUnless(self.check(mypde.getCoefficientOfGeneralPDE("q"),q_ref),"q is not empty") |
66 |
|
|
self.failUnless(mypde.getCoefficientOfGeneralPDE("r").isEmpty(),"r is not empty") |
67 |
|
|
def test_setCoefficient_f(self): |
68 |
|
|
mypde=Poisson(self.domain,debug=self.DEBUG) |
69 |
|
|
x=self.domain.getX() |
70 |
|
|
Y_ref=interpolate(x[0],Function(self.domain)) |
71 |
|
|
A_ref=kronecker(self.domain) |
72 |
|
|
mypde.setValue(f=x[0]) |
73 |
|
|
self.failUnless(self.check(mypde.getCoefficientOfGeneralPDE("A"),A_ref),"A is not kronecker") |
74 |
|
|
self.failUnless(mypde.getCoefficientOfGeneralPDE("B").isEmpty(),"B is not empty") |
75 |
|
|
self.failUnless(mypde.getCoefficientOfGeneralPDE("C").isEmpty(),"C is not empty") |
76 |
|
|
self.failUnless(mypde.getCoefficientOfGeneralPDE("D").isEmpty(),"D is not empty") |
77 |
|
|
self.failUnless(mypde.getCoefficientOfGeneralPDE("X").isEmpty(),"X is not empty") |
78 |
|
|
self.failUnless(self.check(mypde.getCoefficientOfGeneralPDE("Y"),Y_ref),"Y is not x[0]") |
79 |
|
|
self.failUnless(mypde.getCoefficientOfGeneralPDE("y").isEmpty(),"y is not empty") |
80 |
|
|
self.failUnless(mypde.getCoefficientOfGeneralPDE("d").isEmpty(),"d is not empty") |
81 |
|
|
self.failUnless(mypde.getCoefficientOfGeneralPDE("d_contact").isEmpty(),"d_contact is not empty") |
82 |
|
|
self.failUnless(mypde.getCoefficientOfGeneralPDE("y_contact").isEmpty(),"y_contact is not empty") |
83 |
|
|
self.failUnless(mypde.getCoefficientOfGeneralPDE("q").isEmpty(),"q is not empty") |
84 |
|
|
self.failUnless(mypde.getCoefficientOfGeneralPDE("r").isEmpty(),"r is not empty") |
85 |
|
|
def test_solve(self): |
86 |
|
|
d=self.domain.getDim() |
87 |
|
|
cf=ContinuousFunction(self.domain) |
88 |
|
|
x=cf.getX() |
89 |
|
|
#construct exact solution: |
90 |
|
|
u_ex=Scalar(1.,cf) |
91 |
|
|
for i in range(d): |
92 |
|
|
u_ex*=x[i]*(2.-x[i]) |
93 |
|
|
#construct mask: |
94 |
|
|
msk=Scalar(0.,cf) |
95 |
|
|
for i in range(d): |
96 |
gross |
304 |
msk+=whereZero(x[i]) |
97 |
jgs |
149 |
#construct right hand side |
98 |
|
|
f=Scalar(0,cf) |
99 |
|
|
for i in range(d): |
100 |
|
|
f_p=Scalar(1,cf) |
101 |
|
|
for j in range(d): |
102 |
|
|
if i==j: |
103 |
|
|
f_p*=2. |
104 |
|
|
else: |
105 |
|
|
f_p*=x[j]*(2-x[j]) |
106 |
|
|
f+=f_p |
107 |
|
|
mypde=Poisson(self.domain) |
108 |
|
|
mypde.setValue(f=f,q=msk) |
109 |
|
|
u=mypde.getSolution() |
110 |
|
|
self.failUnless(self.check(u,u_ex,10*self.TOL),"incorrect solution") |
111 |
|
|
|
112 |
|
|
class Test_LinearPDE(Test_linearPDEs): |
113 |
|
|
N=4 |
114 |
|
|
def test_setCoefficient_WithIllegalFunctionSpace(self): |
115 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
116 |
|
|
try: |
117 |
|
|
success=True |
118 |
|
|
mypde.setValue(C=Vector(0.,FunctionOnBoundary(self.domain))) |
119 |
|
|
except IllegalCoefficientValue: |
120 |
|
|
success=False |
121 |
|
|
self.failUnless(not success,'inapropraite function space accepted') |
122 |
|
|
|
123 |
|
|
def test_resetCoefficient_WithWrongShape(self): |
124 |
|
|
mypde=LinearPDE(self.domain,numEquations=2,debug=self.DEBUG) |
125 |
|
|
try: |
126 |
|
|
success=True |
127 |
|
|
mypde.setValue(C=0.) |
128 |
|
|
except IllegalCoefficientValue: |
129 |
|
|
success=False |
130 |
|
|
self.failUnless(not success,'illegal shape accepted') |
131 |
|
|
def test_reducedOn(self): |
132 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
133 |
|
|
x=self.domain.getX() |
134 |
|
|
mypde.setReducedOrderOn() |
135 |
|
|
mypde.setValue(A=kronecker(self.domain),D=x[0],Y=x[0]) |
136 |
|
|
u=mypde.getSolution() |
137 |
|
|
self.failUnless(self.check(u,1.),'solution is wrong.') |
138 |
|
|
|
139 |
|
|
def test_attemptToChangeOrderAfterDefinedCoefficient(self): |
140 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
141 |
|
|
mypde.setValue(D=1.) |
142 |
|
|
try: |
143 |
|
|
success=True |
144 |
|
|
mypde.setReducedOrderOn() |
145 |
|
|
except RuntimeError: |
146 |
|
|
success=False |
147 |
|
|
self.failUnless(not success,'alterion of order after coefficient is changed not detected.') |
148 |
|
|
|
149 |
|
|
def test_reducedOnConfig(self): |
150 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
151 |
|
|
mypde.setReducedOrderOn() |
152 |
|
|
self.failUnlessEqual((mypde.getFunctionSpaceForSolution(),mypde.getFunctionSpaceForEquation()),(ReducedSolution(self.domain),ReducedSolution(self.domain)),"reduced function spaces expected.") |
153 |
|
|
# |
154 |
|
|
# set coefficients for scalars: |
155 |
|
|
# |
156 |
|
|
def test_setCoefficient_A_Scalar(self): |
157 |
|
|
d=self.domain.getDim() |
158 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
159 |
|
|
mypde.setValue(A=numarray.ones((d,d))) |
160 |
|
|
coeff=mypde.getCoefficientOfGeneralPDE("A") |
161 |
|
|
self.failUnlessEqual((coeff.getShape(),coeff.getFunctionSpace(),mypde.getNumSolutions(),mypde.getNumEquations()),((d,d),Function(self.domain),1,1)) |
162 |
|
|
def test_setCoefficient_B_Scalar(self): |
163 |
|
|
d=self.domain.getDim() |
164 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
165 |
|
|
mypde.setValue(B=numarray.ones((d,))) |
166 |
|
|
coeff=mypde.getCoefficientOfGeneralPDE("B") |
167 |
|
|
self.failUnlessEqual((coeff.getShape(),coeff.getFunctionSpace(),mypde.getNumSolutions(),mypde.getNumEquations()),((d,),Function(self.domain),1,1)) |
168 |
|
|
def test_setCoefficient_C_Scalar(self): |
169 |
|
|
d=self.domain.getDim() |
170 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
171 |
|
|
mypde.setValue(C=numarray.ones((d,))) |
172 |
|
|
coeff=mypde.getCoefficientOfGeneralPDE("C") |
173 |
|
|
self.failUnlessEqual((coeff.getShape(),coeff.getFunctionSpace(),mypde.getNumSolutions(),mypde.getNumEquations()),((d,),Function(self.domain),1,1)) |
174 |
|
|
def test_setCoefficient_D_Scalar(self): |
175 |
|
|
d=self.domain.getDim() |
176 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
177 |
|
|
mypde.setValue(D=1.) |
178 |
|
|
coeff=mypde.getCoefficientOfGeneralPDE("D") |
179 |
|
|
self.failUnlessEqual((coeff.getShape(),coeff.getFunctionSpace(),mypde.getNumSolutions(),mypde.getNumEquations()),((),Function(self.domain),1,1)) |
180 |
|
|
def test_setCoefficient_X_Scalar(self): |
181 |
|
|
d=self.domain.getDim() |
182 |
|
|
mypde=LinearPDE(self.domain,numSolutions=3,debug=self.DEBUG) |
183 |
|
|
mypde.setValue(X=numarray.ones((d,))) |
184 |
|
|
coeff=mypde.getCoefficientOfGeneralPDE("X") |
185 |
|
|
self.failUnlessEqual((coeff.getShape(),coeff.getFunctionSpace(),mypde.getNumEquations()),((d,),Function(self.domain),1)) |
186 |
|
|
def test_setCoefficient_Y_Scalar(self): |
187 |
|
|
d=self.domain.getDim() |
188 |
|
|
mypde=LinearPDE(self.domain,numSolutions=3,debug=self.DEBUG) |
189 |
|
|
mypde.setValue(Y=1.) |
190 |
|
|
coeff=mypde.getCoefficientOfGeneralPDE("Y") |
191 |
|
|
self.failUnlessEqual((coeff.getShape(),coeff.getFunctionSpace(),mypde.getNumEquations()),((),Function(self.domain),1)) |
192 |
|
|
def test_setCoefficient_y_Scalar(self): |
193 |
|
|
d=self.domain.getDim() |
194 |
|
|
mypde=LinearPDE(self.domain,numSolutions=3,debug=self.DEBUG) |
195 |
|
|
mypde.setValue(y=1.) |
196 |
|
|
coeff=mypde.getCoefficientOfGeneralPDE("y") |
197 |
|
|
self.failUnlessEqual((coeff.getShape(),coeff.getFunctionSpace(),mypde.getNumEquations()),((),FunctionOnBoundary(self.domain),1)) |
198 |
|
|
def test_setCoefficient_d_Scalar(self): |
199 |
|
|
d=self.domain.getDim() |
200 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
201 |
|
|
mypde.setValue(d=1.) |
202 |
|
|
coeff=mypde.getCoefficientOfGeneralPDE("d") |
203 |
|
|
self.failUnlessEqual((coeff.getShape(),coeff.getFunctionSpace(),mypde.getNumSolutions(),mypde.getNumEquations()),((),FunctionOnBoundary(self.domain),1,1)) |
204 |
|
|
def test_setCoefficient_d_contact_Scalar(self): |
205 |
|
|
d=self.domain.getDim() |
206 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
207 |
|
|
mypde.setValue(d_contact=1.) |
208 |
|
|
coeff=mypde.getCoefficientOfGeneralPDE("d_contact") |
209 |
|
|
self.failUnlessEqual((coeff.getShape(),coeff.getFunctionSpace(),mypde.getNumSolutions(),mypde.getNumEquations()),((),FunctionOnContactZero(self.domain),1,1)) |
210 |
|
|
def test_setCoefficient_y_contact_Scalar(self): |
211 |
|
|
d=self.domain.getDim() |
212 |
|
|
mypde=LinearPDE(self.domain,numSolutions=3,debug=self.DEBUG) |
213 |
|
|
mypde.setValue(y_contact=1.) |
214 |
|
|
coeff=mypde.getCoefficientOfGeneralPDE("y_contact") |
215 |
|
|
self.failUnlessEqual((coeff.getShape(),coeff.getFunctionSpace(),mypde.getNumEquations()),((),FunctionOnContactZero(self.domain),1)) |
216 |
|
|
def test_setCoefficient_r_Scalar(self): |
217 |
|
|
d=self.domain.getDim() |
218 |
|
|
mypde=LinearPDE(self.domain,numEquations=3,debug=self.DEBUG) |
219 |
|
|
mypde.setValue(r=1.) |
220 |
|
|
coeff=mypde.getCoefficientOfGeneralPDE("r") |
221 |
|
|
self.failUnlessEqual((coeff.getShape(),coeff.getFunctionSpace(),mypde.getNumSolutions()),((),Solution(self.domain),1)) |
222 |
|
|
def test_setCoefficient_q_Scalar(self): |
223 |
|
|
d=self.domain.getDim() |
224 |
|
|
mypde=LinearPDE(self.domain,numEquations=3,debug=self.DEBUG) |
225 |
|
|
mypde.setValue(q=1.) |
226 |
|
|
coeff=mypde.getCoefficientOfGeneralPDE("q") |
227 |
|
|
self.failUnlessEqual((coeff.getShape(),coeff.getFunctionSpace(),mypde.getNumSolutions()),((),Solution(self.domain),1)) |
228 |
|
|
def test_setCoefficient_r_Scalar_reducedOn(self): |
229 |
|
|
d=self.domain.getDim() |
230 |
|
|
mypde=LinearPDE(self.domain,numEquations=3,debug=self.DEBUG) |
231 |
|
|
mypde.setReducedOrderOn() |
232 |
|
|
mypde.setValue(r=1.) |
233 |
|
|
coeff=mypde.getCoefficientOfGeneralPDE("r") |
234 |
|
|
self.failUnlessEqual((coeff.getShape(),coeff.getFunctionSpace(),mypde.getNumSolutions()),((),ReducedSolution(self.domain),1)) |
235 |
|
|
def test_setCoefficient_q_Scalar_reducedOn(self): |
236 |
|
|
d=self.domain.getDim() |
237 |
|
|
mypde=LinearPDE(self.domain,numEquations=3,debug=self.DEBUG) |
238 |
|
|
mypde.setReducedOrderOn() |
239 |
|
|
mypde.setValue(q=1.) |
240 |
|
|
coeff=mypde.getCoefficientOfGeneralPDE("q") |
241 |
|
|
self.failUnlessEqual((coeff.getShape(),coeff.getFunctionSpace(),mypde.getNumSolutions()),((),ReducedSolution(self.domain),1)) |
242 |
|
|
|
243 |
|
|
# |
244 |
|
|
# set coefficients for systems: |
245 |
|
|
# |
246 |
|
|
def test_setCoefficient_A_System(self): |
247 |
|
|
d=self.domain.getDim() |
248 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
249 |
|
|
mypde.setValue(A=numarray.ones((self.N,d,self.N,d))) |
250 |
|
|
coeff=mypde.getCoefficientOfGeneralPDE("A") |
251 |
|
|
self.failUnlessEqual((coeff.getShape(),coeff.getFunctionSpace(),mypde.getNumSolutions(),mypde.getNumEquations()),((self.N,d,self.N,d),Function(self.domain),self.N,self.N)) |
252 |
|
|
def test_setCoefficient_B_System(self): |
253 |
|
|
d=self.domain.getDim() |
254 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
255 |
|
|
mypde.setValue(B=numarray.ones((self.N,d,self.N))) |
256 |
|
|
coeff=mypde.getCoefficientOfGeneralPDE("B") |
257 |
|
|
self.failUnlessEqual((coeff.getShape(),coeff.getFunctionSpace(),mypde.getNumSolutions(),mypde.getNumEquations()),((self.N,d,self.N),Function(self.domain),self.N,self.N)) |
258 |
|
|
def test_setCoefficient_C_System(self): |
259 |
|
|
d=self.domain.getDim() |
260 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
261 |
|
|
mypde.setValue(C=numarray.ones((self.N,self.N,d))) |
262 |
|
|
coeff=mypde.getCoefficientOfGeneralPDE("C") |
263 |
|
|
self.failUnlessEqual((coeff.getShape(),coeff.getFunctionSpace(),mypde.getNumSolutions(),mypde.getNumEquations()),((self.N,self.N,d),Function(self.domain),self.N,self.N)) |
264 |
|
|
def test_setCoefficient_D_System(self): |
265 |
|
|
d=self.domain.getDim() |
266 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
267 |
|
|
mypde.setValue(D=numarray.ones((self.N,self.N))) |
268 |
|
|
coeff=mypde.getCoefficientOfGeneralPDE("D") |
269 |
|
|
self.failUnlessEqual((coeff.getShape(),coeff.getFunctionSpace(),mypde.getNumSolutions(),mypde.getNumEquations()),((self.N,self.N),Function(self.domain),self.N,self.N)) |
270 |
|
|
def test_setCoefficient_X_System(self): |
271 |
|
|
d=self.domain.getDim() |
272 |
|
|
mypde=LinearPDE(self.domain,numSolutions=3,debug=self.DEBUG) |
273 |
|
|
mypde.setValue(X=numarray.ones((self.N,d))) |
274 |
|
|
coeff=mypde.getCoefficientOfGeneralPDE("X") |
275 |
|
|
self.failUnlessEqual((coeff.getShape(),coeff.getFunctionSpace(),mypde.getNumEquations()),((self.N,d),Function(self.domain),self.N)) |
276 |
|
|
def test_setCoefficient_Y_System(self): |
277 |
|
|
d=self.domain.getDim() |
278 |
|
|
mypde=LinearPDE(self.domain,numSolutions=3,debug=self.DEBUG) |
279 |
|
|
mypde.setValue(Y=numarray.ones((self.N,))) |
280 |
|
|
coeff=mypde.getCoefficientOfGeneralPDE("Y") |
281 |
|
|
self.failUnlessEqual((coeff.getShape(),coeff.getFunctionSpace(),mypde.getNumEquations()),((self.N,),Function(self.domain),self.N)) |
282 |
|
|
def test_setCoefficient_y_System(self): |
283 |
|
|
d=self.domain.getDim() |
284 |
|
|
mypde=LinearPDE(self.domain,numSolutions=3,debug=self.DEBUG) |
285 |
|
|
mypde.setValue(y=numarray.ones((self.N,))) |
286 |
|
|
coeff=mypde.getCoefficientOfGeneralPDE("y") |
287 |
|
|
self.failUnlessEqual((coeff.getShape(),coeff.getFunctionSpace(),mypde.getNumEquations()),((self.N,),FunctionOnBoundary(self.domain),self.N)) |
288 |
|
|
def test_setCoefficient_d_System(self): |
289 |
|
|
d=self.domain.getDim() |
290 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
291 |
|
|
mypde.setValue(d=numarray.ones((self.N,self.N))) |
292 |
|
|
coeff=mypde.getCoefficientOfGeneralPDE("d") |
293 |
|
|
self.failUnlessEqual((coeff.getShape(),coeff.getFunctionSpace(),mypde.getNumSolutions(),mypde.getNumEquations()),((self.N,self.N),FunctionOnBoundary(self.domain),self.N,self.N)) |
294 |
|
|
def test_setCoefficient_d_contact_System(self): |
295 |
|
|
d=self.domain.getDim() |
296 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
297 |
|
|
mypde.setValue(d_contact=numarray.ones((self.N,self.N))) |
298 |
|
|
coeff=mypde.getCoefficientOfGeneralPDE("d_contact") |
299 |
|
|
self.failUnlessEqual((coeff.getShape(),coeff.getFunctionSpace(),mypde.getNumSolutions(),mypde.getNumEquations()),((self.N,self.N),FunctionOnContactZero(self.domain),self.N,self.N)) |
300 |
|
|
def test_setCoefficient_y_contact_System(self): |
301 |
|
|
d=self.domain.getDim() |
302 |
|
|
mypde=LinearPDE(self.domain,numSolutions=3,debug=self.DEBUG) |
303 |
|
|
mypde.setValue(y_contact=numarray.ones((self.N,))) |
304 |
|
|
coeff=mypde.getCoefficientOfGeneralPDE("y_contact") |
305 |
|
|
self.failUnlessEqual((coeff.getShape(),coeff.getFunctionSpace(),mypde.getNumEquations()),((self.N,),FunctionOnContactZero(self.domain),self.N)) |
306 |
|
|
def test_setCoefficient_r_System(self): |
307 |
|
|
d=self.domain.getDim() |
308 |
|
|
mypde=LinearPDE(self.domain,numEquations=3,debug=self.DEBUG) |
309 |
|
|
mypde.setValue(r=numarray.ones((self.N,))) |
310 |
|
|
coeff=mypde.getCoefficientOfGeneralPDE("r") |
311 |
|
|
self.failUnlessEqual((coeff.getShape(),coeff.getFunctionSpace(),mypde.getNumSolutions()),((self.N,),Solution(self.domain),self.N)) |
312 |
|
|
def test_setCoefficient_q_System(self): |
313 |
|
|
d=self.domain.getDim() |
314 |
|
|
mypde=LinearPDE(self.domain,numEquations=3,debug=self.DEBUG) |
315 |
|
|
mypde.setValue(q=numarray.ones((self.N,))) |
316 |
|
|
coeff=mypde.getCoefficientOfGeneralPDE("q") |
317 |
|
|
self.failUnlessEqual((coeff.getShape(),coeff.getFunctionSpace(),mypde.getNumSolutions()),((self.N,),Solution(self.domain),self.N)) |
318 |
|
|
def test_setCoefficient_r_System_reducedOn(self): |
319 |
|
|
d=self.domain.getDim() |
320 |
|
|
mypde=LinearPDE(self.domain,numEquations=3,debug=self.DEBUG) |
321 |
|
|
mypde.setReducedOrderOn() |
322 |
|
|
mypde.setValue(r=numarray.ones((self.N,))) |
323 |
|
|
coeff=mypde.getCoefficientOfGeneralPDE("r") |
324 |
|
|
self.failUnlessEqual((coeff.getShape(),coeff.getFunctionSpace(),mypde.getNumSolutions()),((self.N,),ReducedSolution(self.domain),self.N)) |
325 |
|
|
def test_setCoefficient_q_System_reducedOn(self): |
326 |
|
|
d=self.domain.getDim() |
327 |
|
|
mypde=LinearPDE(self.domain,numEquations=3,debug=self.DEBUG) |
328 |
|
|
mypde.setReducedOrderOn() |
329 |
|
|
mypde.setValue(q=numarray.ones((self.N,))) |
330 |
|
|
coeff=mypde.getCoefficientOfGeneralPDE("q") |
331 |
|
|
self.failUnlessEqual((coeff.getShape(),coeff.getFunctionSpace(),mypde.getNumSolutions()),((self.N,),ReducedSolution(self.domain),self.N)) |
332 |
|
|
|
333 |
|
|
def test_resetCoefficient_HomogeneousConstraint(self): |
334 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
335 |
|
|
x=self.domain.getX() |
336 |
gross |
304 |
mypde.setValue(A=kronecker(self.domain),Y=1.,q=whereZero(x[0])) |
337 |
jgs |
149 |
u1=mypde.getSolution() |
338 |
|
|
mypde.setValue(Y=2.) |
339 |
|
|
u2=mypde.getSolution() |
340 |
|
|
self.failUnless(self.check(u2,2*u1),'solution is wrong.') |
341 |
|
|
|
342 |
|
|
def test_resetCoefficient_InHomogeneousConstraint(self): |
343 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
344 |
jgs |
154 |
mypde.setSymmetryOn() |
345 |
jgs |
149 |
x=self.domain.getX() |
346 |
gross |
304 |
mypde.setValue(A=kronecker(self.domain),D=1.,Y=1.,r=1,q=whereZero(x[0])) |
347 |
jgs |
154 |
u1=mypde.getSolution(verbose=self.VERBOSE) |
348 |
jgs |
149 |
mypde.setValue(Y=2.,D=2) |
349 |
jgs |
154 |
u2=mypde.getSolution(verbose=self.VERBOSE) |
350 |
|
|
self.failUnless(self.check(u2,u1),'first solution is wrong.') |
351 |
|
|
u2=mypde.getSolution(verbose=self.VERBOSE) |
352 |
|
|
self.failUnless(self.check(u2,u1),'first solution is wrong.') |
353 |
jgs |
149 |
mypde.setValue(r=2,Y=4.) |
354 |
jgs |
154 |
u2=mypde.getSolution(verbose=self.VERBOSE) |
355 |
|
|
self.failUnless(self.check(u2,2*u1),'second solution is wrong.') |
356 |
jgs |
149 |
|
357 |
|
|
def test_symmetryCheckTrue_System(self): |
358 |
|
|
d=self.domain.getDim() |
359 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
360 |
|
|
A=numarray.ones((self.N,d,self.N,d)) |
361 |
|
|
C=2*numarray.ones((self.N,self.N,d)) |
362 |
|
|
B=2*numarray.ones((self.N,d,self.N)) |
363 |
|
|
D=3*numarray.ones((self.N,self.N)) |
364 |
|
|
d=4*numarray.ones((self.N,self.N)) |
365 |
|
|
d_contact=5*numarray.ones((self.N,self.N)) |
366 |
|
|
mypde.setValue(A=A,B=B,C=C,D=D,d=d,d_contact=d_contact) |
367 |
|
|
self.failUnless(mypde.checkSymmetry(verbose=False),"symmetry detected") |
368 |
|
|
|
369 |
|
|
def test_symmetryCheckFalse_A_System(self): |
370 |
|
|
d=self.domain.getDim() |
371 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
372 |
|
|
A=numarray.ones((self.N,d,self.N,d)) |
373 |
|
|
A[1,1,1,0]=0. |
374 |
|
|
mypde.setValue(A=A) |
375 |
|
|
self.failUnless(not mypde.checkSymmetry(verbose=False),"symmetry detected") |
376 |
|
|
def test_symmetryCheckFalse_BC_System(self): |
377 |
|
|
d=self.domain.getDim() |
378 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
379 |
|
|
C=2*numarray.ones((self.N,self.N,d)) |
380 |
|
|
B=2*numarray.ones((self.N,d,self.N)) |
381 |
|
|
B[0,0,1]=1. |
382 |
|
|
mypde.setValue(B=B,C=C) |
383 |
|
|
self.failUnless(not mypde.checkSymmetry(verbose=False),"symmetry detected") |
384 |
|
|
|
385 |
|
|
def test_symmetryCheckFalse_D_System(self): |
386 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
387 |
|
|
D=3*numarray.ones((self.N,self.N)) |
388 |
|
|
D[0,1]=0. |
389 |
|
|
mypde.setValue(D=D) |
390 |
|
|
self.failUnless(not mypde.checkSymmetry(verbose=False),"symmetry detected") |
391 |
|
|
|
392 |
|
|
def test_symmetryCheckFalse_d_System(self): |
393 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
394 |
|
|
d=4*numarray.ones((self.N,self.N)) |
395 |
|
|
d[0,1]=0. |
396 |
|
|
mypde.setValue(d=d) |
397 |
|
|
self.failUnless(not mypde.checkSymmetry(verbose=False),"symmetry detected") |
398 |
|
|
|
399 |
|
|
def test_symmetryCheckFalse_d_contact_System(self): |
400 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
401 |
|
|
d_contact=5*numarray.ones((self.N,self.N)) |
402 |
|
|
d_contact[0,1]=0. |
403 |
|
|
mypde.setValue(d_contact=d_contact) |
404 |
|
|
self.failUnless(not mypde.checkSymmetry(verbose=False),"symmetry detected") |
405 |
|
|
|
406 |
|
|
def test_symmetryCheckTrue_Scalar(self): |
407 |
|
|
d=self.domain.getDim() |
408 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
409 |
|
|
A=numarray.ones((d,d)) |
410 |
|
|
C=2*numarray.ones((d,)) |
411 |
|
|
B=2*numarray.ones((d,)) |
412 |
|
|
D=3 |
413 |
|
|
d=4 |
414 |
|
|
d_contact=5 |
415 |
|
|
mypde.setValue(A=A,B=B,C=C,D=D,d=d,d_contact=d_contact) |
416 |
|
|
self.failUnless(mypde.checkSymmetry(verbose=False),"symmetry detected") |
417 |
|
|
|
418 |
|
|
def test_symmetryCheckFalse_A_Scalar(self): |
419 |
|
|
d=self.domain.getDim() |
420 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
421 |
|
|
A=numarray.ones((d,d)) |
422 |
|
|
A[1,0]=0. |
423 |
|
|
mypde.setValue(A=A) |
424 |
|
|
self.failUnless(not mypde.checkSymmetry(verbose=False),"symmetry detected") |
425 |
|
|
def test_symmetryCheckFalse_BC_Scalar(self): |
426 |
|
|
d=self.domain.getDim() |
427 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
428 |
|
|
C=2*numarray.ones((d,)) |
429 |
|
|
B=2*numarray.ones((d,)) |
430 |
|
|
B[0]=1. |
431 |
|
|
mypde.setValue(B=B,C=C) |
432 |
|
|
self.failUnless(not mypde.checkSymmetry(verbose=False),"symmetry detected") |
433 |
|
|
# |
434 |
|
|
# solver checks: |
435 |
|
|
# |
436 |
|
|
def test_symmetryOnIterative(self): |
437 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
438 |
|
|
mypde.setValue(A=kronecker(self.domain),D=1.,Y=1.) |
439 |
|
|
u=mypde.getSolution(verbose=self.VERBOSE) |
440 |
|
|
self.failUnless(self.check(u,1.),'solution is wrong.') |
441 |
|
|
def test_symmetryOnDirect(self): |
442 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
443 |
|
|
mypde.setValue(A=kronecker(self.domain),D=1.,Y=1.) |
444 |
|
|
mypde.setSolverMethod(mypde.DIRECT) |
445 |
|
|
u=mypde.getSolution(verbose=self.VERBOSE) |
446 |
|
|
self.failUnless(self.check(u,1.),'solution is wrong.') |
447 |
|
|
def test_PCG_JACOBI(self): |
448 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
449 |
|
|
mypde.setValue(A=kronecker(self.domain),D=1.,Y=1.) |
450 |
gross |
387 |
mypde.setSolverMethod(mypde.PCG,mypde.JACOBI) |
451 |
|
|
u=mypde.getSolution(verbose=self.VERBOSE) |
452 |
jgs |
149 |
self.failUnless(self.check(u,1.),'solution is wrong.') |
453 |
|
|
def test_PCG_ILU0(self): |
454 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
455 |
|
|
mypde.setValue(A=kronecker(self.domain),D=1.,Y=1.) |
456 |
gross |
387 |
mypde.setSolverMethod(mypde.PCG,mypde.ILU0) |
457 |
|
|
u=mypde.getSolution(verbose=self.VERBOSE) |
458 |
jgs |
149 |
self.failUnless(self.check(u,1.),'solution is wrong.') |
459 |
|
|
def test_DIRECT(self): |
460 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
461 |
|
|
mypde.setValue(A=kronecker(self.domain),D=1.,Y=1.) |
462 |
|
|
mypde.setSolverMethod(mypde.DIRECT) |
463 |
jgs |
154 |
u=mypde.getSolution(verbose=self.VERBOSE) |
464 |
jgs |
149 |
self.failUnless(self.check(u,1.),'solution is wrong.') |
465 |
|
|
def test_BICGSTAB_JACOBI(self): |
466 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
467 |
gross |
387 |
mypde.setSolverMethod(mypde.BICGSTAB,mypde.JACOBI) |
468 |
jgs |
149 |
mypde.setValue(A=kronecker(self.domain),D=1.,Y=1.) |
469 |
gross |
387 |
u=mypde.getSolution(verbose=self.VERBOSE) |
470 |
jgs |
149 |
self.failUnless(self.check(u,1.),'solution is wrong.') |
471 |
|
|
def test_BICGSTAB_ILU0(self): |
472 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
473 |
|
|
mypde.setValue(A=kronecker(self.domain),D=1.,Y=1.) |
474 |
gross |
387 |
mypde.setSolverMethod(mypde.BICGSTAB,mypde.ILU0) |
475 |
|
|
u=mypde.getSolution(verbose=self.VERBOSE) |
476 |
jgs |
149 |
self.failUnless(self.check(u,1.),'solution is wrong.') |
477 |
|
|
def test_PRES20_JACOBI(self): |
478 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
479 |
|
|
mypde.setValue(A=kronecker(self.domain),D=1.,Y=1.) |
480 |
gross |
387 |
mypde.setSolverMethod(mypde.PRES20,mypde.JACOBI) |
481 |
|
|
u=mypde.getSolution(verbose=self.VERBOSE) |
482 |
jgs |
149 |
self.failUnless(self.check(u,1.),'solution is wrong.') |
483 |
|
|
def test_PRES20_ILU0(self): |
484 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
485 |
|
|
mypde.setValue(A=kronecker(self.domain),D=1.,Y=1.) |
486 |
gross |
387 |
mypde.setSolverMethod(mypde.PRES20,mypde.ILU0) |
487 |
|
|
u=mypde.getSolution(verbose=self.VERBOSE) |
488 |
jgs |
149 |
self.failUnless(self.check(u,1.),'solution is wrong.') |
489 |
|
|
def test_GMRESnoRestart_JACOBI(self): |
490 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
491 |
|
|
mypde.setValue(A=kronecker(self.domain),D=1.,Y=1.) |
492 |
gross |
387 |
mypde.setSolverMethod(mypde.GMRES,mypde.JACOBI) |
493 |
|
|
# u=mypde.getSolution(verbose=self.VERBOSE,truncation=5) |
494 |
|
|
u=mypde.getSolution(verbose=self.VERBOSE) |
495 |
jgs |
149 |
self.failUnless(self.check(u,1.),'solution is wrong.') |
496 |
|
|
def test_GMRESnoRestart_ILU0(self): |
497 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
498 |
|
|
mypde.setValue(A=kronecker(self.domain),D=1.,Y=1.) |
499 |
gross |
387 |
mypde.setSolverMethod(mypde.GMRES,mypde.ILU0) |
500 |
|
|
# u=mypde.getSolution(verbose=self.VERBOSE,truncation=5) |
501 |
|
|
u=mypde.getSolution(verbose=self.VERBOSE) |
502 |
jgs |
149 |
self.failUnless(self.check(u,1.),'solution is wrong.') |
503 |
|
|
def test_GMRES_JACOBI(self): |
504 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
505 |
|
|
mypde.setValue(A=kronecker(self.domain),D=1.,Y=1.) |
506 |
gross |
387 |
mypde.setSolverMethod(mypde.GMRES,mypde.JACOBI) |
507 |
|
|
u=mypde.getSolution(verbose=self.VERBOSE) |
508 |
jgs |
149 |
self.failUnless(self.check(u,1.),'solution is wrong.') |
509 |
|
|
def test_GMRES_ILU0(self): |
510 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
511 |
|
|
mypde.setValue(A=kronecker(self.domain),D=1.,Y=1.) |
512 |
gross |
387 |
mypde.setSolverMethod(mypde.GMRES,mypde.ILU0) |
513 |
|
|
u=mypde.getSolution(verbose=self.VERBOSE) |
514 |
jgs |
149 |
self.failUnless(self.check(u,1.),'solution is wrong.') |
515 |
|
|
def test_GMRES_truncation_restart_JACOBI(self): |
516 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
517 |
|
|
mypde.setValue(A=kronecker(self.domain),D=1.,Y=1.) |
518 |
gross |
387 |
mypde.setSolverMethod(mypde.GMRES,mypde.JACOBI) |
519 |
|
|
u=mypde.getSolution(verbose=self.VERBOSE,truncation=10,restart=20) |
520 |
jgs |
149 |
self.failUnless(self.check(u,1.),'solution is wrong.') |
521 |
|
|
def test_GMRES_truncation_restart_ILU0(self): |
522 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
523 |
|
|
mypde.setValue(A=kronecker(self.domain),D=1.,Y=1.) |
524 |
gross |
387 |
mypde.setSolverMethod(mypde.GMRES,mypde.ILU0) |
525 |
|
|
u=mypde.getSolution(verbose=self.VERBOSE,truncation=10,restart=20) |
526 |
jgs |
149 |
self.failUnless(self.check(u,1.),'solution is wrong.') |
527 |
|
|
def test_Lumping_attemptToSetA(self): |
528 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
529 |
|
|
try: |
530 |
|
|
success=True |
531 |
|
|
mypde.setSolverMethod(mypde.LUMPING) |
532 |
|
|
mypde.setValue(A=kronecker(self.domain)) |
533 |
|
|
u=mypde.getSolution(verbose=self.VERBOSE) |
534 |
|
|
except Warning: |
535 |
|
|
success=False |
536 |
|
|
self.failUnless(not success,'warning should be issued') |
537 |
|
|
def test_Lumping_attemptToSetB(self): |
538 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
539 |
|
|
try: |
540 |
|
|
success=True |
541 |
|
|
mypde.setSolverMethod(mypde.LUMPING) |
542 |
|
|
mypde.setValue(B=kronecker(self.domain)[0]) |
543 |
|
|
u=mypde.getSolution(verbose=self.VERBOSE) |
544 |
|
|
except Warning: |
545 |
|
|
success=False |
546 |
|
|
self.failUnless(not success,'warning should be issued') |
547 |
|
|
def test_Lumping_attemptToSetC(self): |
548 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
549 |
|
|
try: |
550 |
|
|
success=True |
551 |
|
|
mypde.setSolverMethod(mypde.LUMPING) |
552 |
|
|
mypde.setValue(C=kronecker(self.domain)[0]) |
553 |
|
|
u=mypde.getSolution(verbose=self.VERBOSE) |
554 |
|
|
except Warning: |
555 |
|
|
success=False |
556 |
|
|
self.failUnless(not success,'warning should be issued') |
557 |
|
|
|
558 |
|
|
def test_Lumping(self): |
559 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
560 |
|
|
mypde.setSolverMethod(mypde.LUMPING) |
561 |
|
|
mypde.setValue(D=1.,Y=1.) |
562 |
gross |
387 |
u=mypde.getSolution(verbose=self.VERBOSE) |
563 |
jgs |
149 |
self.failUnless(self.check(u,1.),'solution is wrong.') |
564 |
|
|
def test_Constrained_Lumping(self): |
565 |
|
|
x=self.domain.getX() |
566 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
567 |
|
|
mypde.setSolverMethod(mypde.LUMPING) |
568 |
gross |
304 |
mypde.setValue(D=1.,Y=1.,q=whereZero(x[0]),r=1.) |
569 |
gross |
387 |
u=mypde.getSolution(verbose=self.VERBOSE) |
570 |
jgs |
149 |
self.failUnless(self.check(u,1.),'solution is wrong.') |
571 |
|
|
def test_Lumping_updateRHS(self): |
572 |
|
|
x=self.domain.getX() |
573 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
574 |
|
|
mypde.setSolverMethod(mypde.LUMPING) |
575 |
|
|
mypde.setValue(D=1.,Y=1.) |
576 |
gross |
387 |
u=mypde.getSolution(verbose=self.VERBOSE) |
577 |
jgs |
149 |
self.failUnless(self.check(u,1.),'first solution is wrong.') |
578 |
gross |
304 |
mypde.setValue(Y=2.,q=whereZero(x[0]),r=2.) |
579 |
gross |
387 |
u=mypde.getSolution(verbose=self.VERBOSE) |
580 |
jgs |
149 |
self.failUnless(self.check(u,2.),'second solution is wrong.') |
581 |
|
|
def test_Lumping_updateOperator(self): |
582 |
|
|
x=self.domain.getX() |
583 |
|
|
mypde=LinearPDE(self.domain,debug=self.DEBUG) |
584 |
|
|
mypde.setSolverMethod(mypde.LUMPING) |
585 |
|
|
mypde.setValue(D=1.,Y=1.) |
586 |
gross |
387 |
u=mypde.getSolution(verbose=self.VERBOSE) |
587 |
jgs |
149 |
mypde.setValue(D=2.) |
588 |
gross |
387 |
u=mypde.getSolution(verbose=self.VERBOSE) |
589 |
jgs |
149 |
self.failUnless(self.check(u,0.5),'second solution is wrong.') |
590 |
|
|
|