27 |
|
|
28 |
import numpy as np |
import numpy as np |
29 |
from esys.escript.linearPDEs import LinearPDE, IllegalCoefficientValue |
from esys.escript.linearPDEs import LinearPDE, IllegalCoefficientValue |
30 |
from esys.escript import Data, grad, inner, integrate, kronecker, boundingBoxEdgeLengths, interpolate |
from esys.escript import Data, grad, inner, integrate, kronecker, boundingBoxEdgeLengths, interpolate, vol |
31 |
from esys.escript.pdetools import ArithmeticTuple |
from esys.escript.pdetools import ArithmeticTuple |
32 |
|
|
33 |
class Regularization(CostFunction): |
class Regularization(CostFunction): |
105 |
# we count s0, then s1, then sc (k<l). |
# we count s0, then s1, then sc (k<l). |
106 |
# THE S0 weighting factor |
# THE S0 weighting factor |
107 |
n=0 |
n=0 |
108 |
|
VV=vol(domain) |
109 |
if not s0 is None: |
if not s0 is None: |
110 |
s0 = interpolate(s0,self.__pde.getFunctionSpaceForCoefficient('D')) |
s0 = interpolate(s0,self.__pde.getFunctionSpaceForCoefficient('D')) |
111 |
s=s0.getShape() |
s=s0.getShape() |
114 |
V=integrate(s0) |
V=integrate(s0) |
115 |
if V > 0: |
if V > 0: |
116 |
self.__weight_index.append(n) |
self.__weight_index.append(n) |
117 |
s0*=1./V |
s0*=VV/V |
118 |
else: |
else: |
119 |
s0=None |
s0=None |
120 |
else: |
else: |
123 |
if s == (numLevelSets,): |
if s == (numLevelSets,): |
124 |
for k in xrange(numLevelSets): |
for k in xrange(numLevelSets): |
125 |
V=integrate(s0[k]) |
V=integrate(s0[k]) |
126 |
if Lsup(V) > 0: |
if V > 0: |
127 |
self.__weight_index.append(n+k) |
self.__weight_index.append(n+k) |
128 |
s0[k]*=1/V |
s0[k]*=VV/V |
129 |
else: |
else: |
130 |
raise ValueError("Unexpected shape %s for weight s0."%s) |
raise ValueError("Unexpected shape %s for weight s0."%s) |
131 |
self.__s0=s0 |
self.__s0=s0 |
138 |
|
|
139 |
if numLevelSets == 1 : |
if numLevelSets == 1 : |
140 |
if s == (DIM,) : |
if s == (DIM,) : |
141 |
V=integrate(inner(s1, self.__L2)) |
V=integrate(inner(s1, 1/self.__L2)) |
142 |
if V > 0: |
if V > 0: |
143 |
self.__weight_index.append(n) |
self.__weight_index.append(n) |
144 |
s1*=1/V |
s1*=VV/V |
145 |
|
print "REG SCALE = ",s1 |
146 |
else: |
else: |
147 |
raise ValueError("Unexpected shape %s for weight s1."%s) |
raise ValueError("Unexpected shape %s for weight s1."%s) |
148 |
else: |
else: |
150 |
for k in xrange(numLevelSets): |
for k in xrange(numLevelSets): |
151 |
for i in xrange(DIM): |
for i in xrange(DIM): |
152 |
ww=s1[k,:] |
ww=s1[k,:] |
153 |
V=integrate(inner(ww,self.__L2)) |
V=integrate(inner(ww,1/self.__L2)) |
154 |
if V > 0: |
if V > 0: |
155 |
self.__weight_index.append(n+i) |
self.__weight_index.append(n+i) |
156 |
s1[k,:]=ww*(1./V) |
s1[k,:]=ww*(VV/V) |
157 |
else: |
else: |
158 |
raise ValueError("Unexpected shape %s for weight s1."%s) |
raise ValueError("Unexpected shape %s for weight s1."%s) |
159 |
|
|
175 |
V=integrate(ww) |
V=integrate(ww) |
176 |
if V > 0: |
if V > 0: |
177 |
self.__weight_index.append(n+k*numLevelSets+l) |
self.__weight_index.append(n+k*numLevelSets+l) |
178 |
sc[l,k]=ww/V*self.__L4 |
sc[l,k]=ww*VV/V*self.__L4 |
179 |
sc[k,l]=0 |
sc[k,l]=0 |
180 |
else: |
else: |
181 |
raise ValueError("Unexpected shape %s for weight s0."%s) |
raise ValueError("Unexpected shape %s for weight s0."%s) |
307 |
if self.__s0 is not None: |
if self.__s0 is not None: |
308 |
if numLS == 1: |
if numLS == 1: |
309 |
D=self.__s0 * mu[n] |
D=self.__s0 * mu[n] |
|
print "D =",D |
|
310 |
else: |
else: |
311 |
D=self.getPDE().createCoefficient("D") |
D=self.getPDE().createCoefficient("D") |
312 |
for k in xrange(numLS): D[k,k]=self.__s0[k] * mu[n+k] |
for k in xrange(numLS): D[k,k]=self.__s0[k] * mu[n+k] |
317 |
if self.__s1 is not None: |
if self.__s1 is not None: |
318 |
if numLS == 1: |
if numLS == 1: |
319 |
for i in xrange(DIM): A[i,i]=self.__s1[i] * mu[n] |
for i in xrange(DIM): A[i,i]=self.__s1[i] * mu[n] |
|
print "A =",A |
|
320 |
else: |
else: |
321 |
for k in xrange(numLS): |
for k in xrange(numLS): |
322 |
for i in xrange(DIM): A[k,i,k,i]=self.__s1[k,i] * mu[n+k] |
for i in xrange(DIM): A[k,i,k,i]=self.__s1[k,i] * mu[n+k] |
323 |
n+=numLS |
n+=numLS |
324 |
if self.__sc is not None: |
if self.__sc is not None: |
325 |
raise NotImplementedError |
raise NotImplementedError |
326 |
|
print A |
327 |
self.getPDE().setValue(A=A) |
self.getPDE().setValue(A=A) |
328 |
self.getPDE().resetRightHandSideCoefficients() |
self.getPDE().resetRightHandSideCoefficients() |
329 |
print A |
self.getPDE().setValue(X=r[1]) |
330 |
print r[1] |
print "X only: ",self.getPDE().getSolution() |
331 |
print r[0] |
self.getPDE().resetRightHandSideCoefficients() |
332 |
|
self.getPDE().setValue(Y=r[0]) |
333 |
|
print "Y only: ",self.getPDE().getSolution() |
334 |
|
|
335 |
|
self.getPDE().resetRightHandSideCoefficients() |
336 |
self.getPDE().setValue(X=r[1], Y=r[0]) |
self.getPDE().setValue(X=r[1], Y=r[0]) |
337 |
return self.getPDE().getSolution() |
return self.getPDE().getSolution() |
338 |
|
|