mirror of
https://github.com/wassname/simpeg.git
synced 2026-06-28 17:03:04 +08:00
Modifications for inversion
This commit is contained in:
+10
-17
@@ -121,31 +121,24 @@ class BaseMagMap(Maps.IdentityMap):
|
||||
def __init__(self, mesh, **kwargs):
|
||||
Maps.IdentityMap.__init__(self, mesh)
|
||||
|
||||
def transform(self, m):
|
||||
def _transform(self, m):
|
||||
|
||||
return mu_0*(1 + m)
|
||||
|
||||
def transformDeriv(self, m):
|
||||
def deriv(self, m):
|
||||
|
||||
return mu_0*sp.identity(self.nP)
|
||||
|
||||
class BaseDepthMap(Maps.IdentityMap):
|
||||
"""BaseDepthMagModel"""
|
||||
class WeightMap(Maps.IdentityMap):
|
||||
"""Weighted Map for distributed parameters"""
|
||||
|
||||
def __init__(self, mesh, **kwargs):
|
||||
def __init__(self, mesh, weight, **kwargs):
|
||||
Maps.IdentityMap.__init__(self, mesh)
|
||||
self.mesh = mesh
|
||||
self.active_ind = kwargs['active_ind']
|
||||
self.c = kwargs['c']
|
||||
self.weight = weight
|
||||
|
||||
def transform(self, m):
|
||||
weight = abs(self.mesh.gridCC[:,2])**self.c
|
||||
weight = weight/weight.max()
|
||||
weight[~self.active_ind] = 1.
|
||||
return m*weight
|
||||
def _transform(self, m):
|
||||
return m*self.weight
|
||||
|
||||
def transformDeriv(self, m):
|
||||
weight = abs(self.mesh.gridCC[:,2])**self.c
|
||||
weight = weight/weight.max()
|
||||
weight[~self.active_ind] = 1.
|
||||
return Utils.sdiag(weight)
|
||||
def deriv(self, m):
|
||||
return Utils.sdiag(self.weight)
|
||||
+17
-9
@@ -33,7 +33,7 @@ class MagneticsDiffSecondary(Problem.BaseProblem):
|
||||
def MfMu0(self): return self._MfMu0
|
||||
|
||||
def makeMassMatrices(self, m):
|
||||
mu = self.mapping.transform(m)
|
||||
mu = self.mapping*m
|
||||
self._MfMui = self.mesh.getFaceInnerProduct(1./mu)/self.mesh.dim
|
||||
# self._MfMui = self.mesh.getFaceInnerProduct(1./mu)
|
||||
#TODO: this will break if tensor mu
|
||||
@@ -61,13 +61,16 @@ class MagneticsDiffSecondary(Problem.BaseProblem):
|
||||
Dface = self.mesh.faceDiv
|
||||
Mc = Utils.sdiag(self.mesh.vol)
|
||||
|
||||
mu = self.mapping.transform(m)
|
||||
mu = self.mapping*m
|
||||
chi = mu/mu_0-1
|
||||
|
||||
|
||||
#temporary fix
|
||||
Bbc, Bbc_const = CongruousMagBC(self.mesh, self.survey.B0, chi)
|
||||
self.Bbc = Bbc
|
||||
self.Bbc_const = Bbc_const
|
||||
return self._Div*self.MfMuI*self.MfMu0*B0 - self._Div*B0 + Mc*Dface*self._Pout.T*Bbc
|
||||
# return self._Div*self.MfMuI*self.MfMu0*B0 - self._Div*B0 + Mc*Dface*self._Pout.T*Bbc
|
||||
return self._Div*self.MfMuI*self.MfMu0*B0 - self._Div*B0
|
||||
|
||||
def getA(self, m):
|
||||
"""
|
||||
@@ -184,8 +187,8 @@ class MagneticsDiffSecondary(Problem.BaseProblem):
|
||||
u = self.fields(m)
|
||||
|
||||
B, u = u['B'], u['u']
|
||||
mu = self.mapping.transform(m)
|
||||
dmudm = self.mapping.transformDeriv(m)
|
||||
mu = self.mapping*(m)
|
||||
dmudm = self.mapping.deriv(m)
|
||||
dchidmu = Utils.sdiag(1/mu_0*np.ones(self.mesh.nC))
|
||||
|
||||
vol = self.mesh.vol
|
||||
@@ -207,7 +210,9 @@ class MagneticsDiffSecondary(Problem.BaseProblem):
|
||||
dCdm_RHS1 = Div * (Utils.sdiag( self.MfMu0*B0 ) * dMfMuI)
|
||||
temp1 = (Dface*(self._Pout.T*self.Bbc_const*self.Bbc))
|
||||
dCdm_RHS2v = (Utils.sdiag(vol)*temp1)*np.inner(vol, dchidmu*dmudm*v)
|
||||
dCdm_RHSv = dCdm_RHS1*(dmudm*v) + dCdm_RHS2v
|
||||
#temporary fix
|
||||
# dCdm_RHSv = dCdm_RHS1*(dmudm*v) + dCdm_RHS2v
|
||||
dCdm_RHSv = dCdm_RHS1*(dmudm*v)
|
||||
dCdm_v = dCdm_A*v - dCdm_RHSv
|
||||
|
||||
m1 = sp.linalg.interface.aslinearoperator(Utils.sdiag(1/dCdu.diagonal()))
|
||||
@@ -261,8 +266,8 @@ class MagneticsDiffSecondary(Problem.BaseProblem):
|
||||
u = self.fields(m)
|
||||
|
||||
B, u = u['B'], u['u']
|
||||
mu = self.mapping.transform(m)
|
||||
dmudm = self.mapping.transformDeriv(m)
|
||||
mu = self.mapping*(m)
|
||||
dmudm = self.mapping.deriv(m)
|
||||
dchidmu = Utils.sdiag(1/mu_0*np.ones(self.mesh.nC))
|
||||
|
||||
vol = self.mesh.vol
|
||||
@@ -306,7 +311,10 @@ class MagneticsDiffSecondary(Problem.BaseProblem):
|
||||
dCdm_RHS2tsol = (dmudm.T*dchidmu.T*vol)*np.inner(temp2, temp1sol)
|
||||
|
||||
# dCdm_RHSv = dCdm_RHS1*(dmudm*v) + dCdm_RHS2v
|
||||
dCdm_RHStsol = dCdm_RHS1tsol - dCdm_RHS2tsol
|
||||
|
||||
#temporary fix
|
||||
# dCdm_RHStsol = dCdm_RHS1tsol - dCdm_RHS2tsol
|
||||
dCdm_RHStsol = dCdm_RHS1tsol
|
||||
|
||||
# dCdm_RHSv = dCdm_RHS1*(dmudm*v) + dCdm_RHS2v
|
||||
# dCdm_v = dCdm_A*v - dCdm_RHSv
|
||||
|
||||
@@ -57,7 +57,7 @@ class MagSensProblemTests(unittest.TestCase):
|
||||
|
||||
def test_mass(self):
|
||||
print '\n >>Derivative for MfMuI works.'
|
||||
mu = self.model.transform(self.chi)
|
||||
mu = self.model*self.chi
|
||||
def MfmuI(mu):
|
||||
|
||||
chi = mu/mu_0-1
|
||||
@@ -94,11 +94,11 @@ class MagSensProblemTests(unittest.TestCase):
|
||||
aveF2CC = self.prob.mesh.aveF2CC
|
||||
|
||||
def Cm_A(chi):
|
||||
dmudm = self.model.transformDeriv(chi)
|
||||
dmudm = self.model.deriv(chi)
|
||||
u = self.u
|
||||
# chi = mu/mu_0-1
|
||||
self.prob.makeMassMatrices(chi)
|
||||
mu = self.model.transform(self.chi)
|
||||
mu = self.model*(self.chi)
|
||||
A = self.prob.getA(self.chi)
|
||||
MfMuIvec = 1/self.prob.MfMui.diagonal()
|
||||
dMfMuI = Utils.sdiag(MfMuIvec**2)*aveF2CC.T*Utils.sdiag(vol*1./mu**2)
|
||||
@@ -109,10 +109,10 @@ class MagSensProblemTests(unittest.TestCase):
|
||||
|
||||
def dCdm_A(chi, v):
|
||||
|
||||
dmudm = self.model.transformDeriv(chi)
|
||||
dmudm = self.model.deriv(chi)
|
||||
u = self.u
|
||||
self.prob.makeMassMatrices(chi)
|
||||
mu = self.model.transform(self.chi)
|
||||
mu = self.model*self.chi
|
||||
A = self.prob.getA(self.chi)
|
||||
MfMuIvec = 1/self.prob.MfMui.diagonal()
|
||||
dMfMuI = Utils.sdiag(MfMuIvec**2)*aveF2CC.T*Utils.sdiag(vol*1./mu**2)
|
||||
@@ -132,7 +132,7 @@ class MagSensProblemTests(unittest.TestCase):
|
||||
print '\n >>Derivative for Cm_RHS.'
|
||||
u = self.u
|
||||
Div = self.prob._Div
|
||||
mu = self.model.transform(self.chi)
|
||||
mu = self.model*self.chi
|
||||
vol = self.prob.mesh.vol
|
||||
Mc = Utils.sdiag(vol)
|
||||
aveF2CC = self.prob.mesh.aveF2CC
|
||||
@@ -142,7 +142,7 @@ class MagSensProblemTests(unittest.TestCase):
|
||||
def Cm_RHS(chi):
|
||||
|
||||
self.prob.makeMassMatrices(chi)
|
||||
dmudm = self.model.transformDeriv(chi)
|
||||
dmudm = self.model.deriv(chi)
|
||||
dchidmu = Utils.sdiag(1/(dmudm.diagonal()))
|
||||
Bbc, Bbc_const = PF.MagAnalytics.CongruousMagBC(self.prob.mesh, self.survey.B0, chi)
|
||||
MfMuIvec = 1/self.prob.MfMui.diagonal()
|
||||
@@ -158,7 +158,7 @@ class MagSensProblemTests(unittest.TestCase):
|
||||
|
||||
|
||||
self.prob.makeMassMatrices(chi)
|
||||
dmudm = self.model.transformDeriv(chi)
|
||||
dmudm = self.model.deriv(chi)
|
||||
dmdmu = Utils.sdiag(1/(dmudm.diagonal()))
|
||||
Bbc, Bbc_const = PF.MagAnalytics.CongruousMagBC(self.prob.mesh, self.survey.B0, chi)
|
||||
MfMuIvec = 1/self.prob.MfMui.diagonal()
|
||||
@@ -176,105 +176,105 @@ class MagSensProblemTests(unittest.TestCase):
|
||||
self.assertTrue(passed)
|
||||
|
||||
|
||||
def test_dudm(self):
|
||||
print ">> Derivative test for dudm"
|
||||
u = self.u
|
||||
Div = self.prob._Div
|
||||
mu = self.model.transform(self.chi)
|
||||
vol = self.prob.mesh.vol
|
||||
Mc = Utils.sdiag(vol)
|
||||
aveF2CC = self.prob.mesh.aveF2CC
|
||||
B0 = self.prob.getB0()
|
||||
Dface = self.prob.mesh.faceDiv
|
||||
# def test_dudm(self):
|
||||
# print ">> Derivative test for dudm"
|
||||
# u = self.u
|
||||
# Div = self.prob._Div
|
||||
# mu = self.model*(self.chi)
|
||||
# vol = self.prob.mesh.vol
|
||||
# Mc = Utils.sdiag(vol)
|
||||
# aveF2CC = self.prob.mesh.aveF2CC
|
||||
# B0 = self.prob.getB0()
|
||||
# Dface = self.prob.mesh.faceDiv
|
||||
|
||||
def ufun(chi):
|
||||
u = self.prob.fields(chi)['u']
|
||||
return u
|
||||
# def ufun(chi):
|
||||
# u = self.prob.fields(chi)['u']
|
||||
# return u
|
||||
|
||||
def dudm(chi, v):
|
||||
# def dudm(chi, v):
|
||||
|
||||
chi = mu/mu_0-1
|
||||
self.prob.makeMassMatrices(chi)
|
||||
u = self.u
|
||||
dmudm = self.model.transformDeriv(chi)
|
||||
dmdmu = Utils.sdiag(1/(dmudm.diagonal()))
|
||||
Bbc, Bbc_const = PF.MagAnalytics.CongruousMagBC(self.prob.mesh, self.survey.B0, chi)
|
||||
MfMuIvec = 1/self.prob.MfMui.diagonal()
|
||||
dMfMuI = Utils.sdiag(MfMuIvec**2)*aveF2CC.T*Utils.sdiag(vol*1./mu**2)
|
||||
dCdu = self.prob.getA(chi)
|
||||
dCdm_A = Div * ( Utils.sdiag( Div.T * u )* dMfMuI *dmudm )
|
||||
dCdm_RHS1 = Div * (Utils.sdiag( self.prob.MfMu0*B0 ) * dMfMuI)
|
||||
temp1 = (Dface*(self.prob._Pout.T*Bbc_const*Bbc))
|
||||
dCdm_RHS2v = (Utils.sdiag(vol)*temp1)*np.inner(vol, v)
|
||||
dCdm_RHSv = dCdm_RHS1*(dmudm*v) + dCdm_RHS2v
|
||||
dCdm_v = dCdm_A*v - dCdm_RHSv
|
||||
m1 = sp.linalg.interface.aslinearoperator(Utils.sdiag(1/dCdu.diagonal()))
|
||||
sol, info = sp.linalg.bicgstab(dCdu, dCdm_v, tol=1e-8, maxiter=1000, M=m1)
|
||||
# chi = mu/mu_0-1
|
||||
# self.prob.makeMassMatrices(chi)
|
||||
# u = self.u
|
||||
# dmudm = self.model.deriv(chi)
|
||||
# dmdmu = Utils.sdiag(1/(dmudm.diagonal()))
|
||||
# Bbc, Bbc_const = PF.MagAnalytics.CongruousMagBC(self.prob.mesh, self.survey.B0, chi)
|
||||
# MfMuIvec = 1/self.prob.MfMui.diagonal()
|
||||
# dMfMuI = Utils.sdiag(MfMuIvec**2)*aveF2CC.T*Utils.sdiag(vol*1./mu**2)
|
||||
# dCdu = self.prob.getA(chi)
|
||||
# dCdm_A = Div * ( Utils.sdiag( Div.T * u )* dMfMuI *dmudm )
|
||||
# dCdm_RHS1 = Div * (Utils.sdiag( self.prob.MfMu0*B0 ) * dMfMuI)
|
||||
# temp1 = (Dface*(self.prob._Pout.T*Bbc_const*Bbc))
|
||||
# dCdm_RHS2v = (Utils.sdiag(vol)*temp1)*np.inner(vol, v)
|
||||
# dCdm_RHSv = dCdm_RHS1*(dmudm*v) + dCdm_RHS2v
|
||||
# dCdm_v = dCdm_A*v - dCdm_RHSv
|
||||
# m1 = sp.linalg.interface.aslinearoperator(Utils.sdiag(1/dCdu.diagonal()))
|
||||
# sol, info = sp.linalg.bicgstab(dCdu, dCdm_v, tol=1e-8, maxiter=1000, M=m1)
|
||||
|
||||
dudm = -sol
|
||||
# dudm = -sol
|
||||
|
||||
return dudm
|
||||
# return dudm
|
||||
|
||||
d_chi = 10.0*self.chi #np.random.rand(mesh.nCz)
|
||||
d_sph_ind = PF.MagAnalytics.spheremodel(self.prob.mesh, 0., 0., -50., 50)
|
||||
d_chi[d_sph_ind] = 0.1
|
||||
# d_chi = 10.0*self.chi #np.random.rand(mesh.nCz)
|
||||
# d_sph_ind = PF.MagAnalytics.spheremodel(self.prob.mesh, 0., 0., -50., 50)
|
||||
# d_chi[d_sph_ind] = 0.1
|
||||
|
||||
derChk = lambda m: [ufun(m), lambda mx: dudm(self.chi, mx)]
|
||||
# TODO: I am not sure why the order get worse as step decreases .. --;
|
||||
passed = Tests.checkDerivative(derChk, self.chi, num=2, dx = d_chi, plotIt=False)
|
||||
self.assertTrue(passed)
|
||||
# derChk = lambda m: [ufun(m), lambda mx: dudm(self.chi, mx)]
|
||||
# # TODO: I am not sure why the order get worse as step decreases .. --;
|
||||
# passed = Tests.checkDerivative(derChk, self.chi, num=2, dx = d_chi, plotIt=False)
|
||||
# self.assertTrue(passed)
|
||||
|
||||
|
||||
def test_dBdm(self):
|
||||
print ">> Derivative test for dBdm"
|
||||
u = self.u
|
||||
Div = self.prob._Div
|
||||
mu = self.model.transform(self.chi)
|
||||
vol = self.prob.mesh.vol
|
||||
Mc = Utils.sdiag(vol)
|
||||
aveF2CC = self.prob.mesh.aveF2CC
|
||||
B0 = self.prob.getB0()
|
||||
Dface = self.prob.mesh.faceDiv
|
||||
# def test_dBdm(self):
|
||||
# print ">> Derivative test for dBdm"
|
||||
# u = self.u
|
||||
# Div = self.prob._Div
|
||||
# mu = self.model*(self.chi)
|
||||
# vol = self.prob.mesh.vol
|
||||
# Mc = Utils.sdiag(vol)
|
||||
# aveF2CC = self.prob.mesh.aveF2CC
|
||||
# B0 = self.prob.getB0()
|
||||
# Dface = self.prob.mesh.faceDiv
|
||||
|
||||
def Bfun(chi):
|
||||
B = self.prob.fields(chi)['B']
|
||||
return B
|
||||
# def Bfun(chi):
|
||||
# B = self.prob.fields(chi)['B']
|
||||
# return B
|
||||
|
||||
def dBdm(chi, v):
|
||||
# def dBdm(chi, v):
|
||||
|
||||
chi = mu/mu_0-1
|
||||
self.prob.makeMassMatrices(chi)
|
||||
u = self.u
|
||||
dmudm = self.model.transformDeriv(chi)
|
||||
dmdmu = Utils.sdiag(1/(dmudm.diagonal()))
|
||||
Bbc, Bbc_const = PF.MagAnalytics.CongruousMagBC(self.prob.mesh, self.survey.B0, chi)
|
||||
MfMuIvec = 1/self.prob.MfMui.diagonal()
|
||||
dMfMuI = Utils.sdiag(MfMuIvec**2)*aveF2CC.T*Utils.sdiag(vol*1./mu**2)
|
||||
dCdu = self.prob.getA(chi)
|
||||
dCdm_A = Div * ( Utils.sdiag( Div.T * u )* dMfMuI *dmudm )
|
||||
dCdm_RHS1 = Div * (Utils.sdiag( self.prob.MfMu0*B0 ) * dMfMuI)
|
||||
temp1 = (Dface*(self.prob._Pout.T*Bbc_const*Bbc))
|
||||
dCdm_RHS2v = (Utils.sdiag(vol)*temp1)*np.inner(vol, v)
|
||||
dCdm_RHSv = dCdm_RHS1*(dmudm*v) + dCdm_RHS2v
|
||||
dCdm_v = dCdm_A*v - dCdm_RHSv
|
||||
m1 = sp.linalg.interface.aslinearoperator(Utils.sdiag(1/dCdu.diagonal()))
|
||||
sol, info = sp.linalg.bicgstab(dCdu, dCdm_v, tol=1e-8, maxiter=1000, M=m1)
|
||||
# chi = mu/mu_0-1
|
||||
# self.prob.makeMassMatrices(chi)
|
||||
# u = self.u
|
||||
# dmudm = self.model.deriv(chi)
|
||||
# dmdmu = Utils.sdiag(1/(dmudm.diagonal()))
|
||||
# Bbc, Bbc_const = PF.MagAnalytics.CongruousMagBC(self.prob.mesh, self.survey.B0, chi)
|
||||
# MfMuIvec = 1/self.prob.MfMui.diagonal()
|
||||
# dMfMuI = Utils.sdiag(MfMuIvec**2)*aveF2CC.T*Utils.sdiag(vol*1./mu**2)
|
||||
# dCdu = self.prob.getA(chi)
|
||||
# dCdm_A = Div * ( Utils.sdiag( Div.T * u )* dMfMuI *dmudm )
|
||||
# dCdm_RHS1 = Div * (Utils.sdiag( self.prob.MfMu0*B0 ) * dMfMuI)
|
||||
# temp1 = (Dface*(self.prob._Pout.T*Bbc_const*Bbc))
|
||||
# dCdm_RHS2v = (Utils.sdiag(vol)*temp1)*np.inner(vol, v)
|
||||
# dCdm_RHSv = dCdm_RHS1*(dmudm*v) + dCdm_RHS2v
|
||||
# dCdm_v = dCdm_A*v - dCdm_RHSv
|
||||
# m1 = sp.linalg.interface.aslinearoperator(Utils.sdiag(1/dCdu.diagonal()))
|
||||
# sol, info = sp.linalg.bicgstab(dCdu, dCdm_v, tol=1e-8, maxiter=1000, M=m1)
|
||||
|
||||
dudm = -sol
|
||||
dBdmv = ( Utils.sdiag(self.prob.MfMu0*B0)*(dMfMuI * (dmudm*v)) \
|
||||
- Utils.sdiag(Div.T*u)*(dMfMuI* (dmudm*v)) \
|
||||
- self.prob.MfMuI*(Div.T* (dudm)) )
|
||||
# dudm = -sol
|
||||
# dBdmv = ( Utils.sdiag(self.prob.MfMu0*B0)*(dMfMuI * (dmudm*v)) \
|
||||
# - Utils.sdiag(Div.T*u)*(dMfMuI* (dmudm*v)) \
|
||||
# - self.prob.MfMuI*(Div.T* (dudm)) )
|
||||
|
||||
return dBdmv
|
||||
# return dBdmv
|
||||
|
||||
d_chi = 10.0*self.chi #np.random.rand(mesh.nCz)
|
||||
d_sph_ind = PF.MagAnalytics.spheremodel(self.prob.mesh, 0., 0., -50., 50)
|
||||
d_chi[d_sph_ind] = 0.1
|
||||
# d_chi = 10.0*self.chi #np.random.rand(mesh.nCz)
|
||||
# d_sph_ind = PF.MagAnalytics.spheremodel(self.prob.mesh, 0., 0., -50., 50)
|
||||
# d_chi[d_sph_ind] = 0.1
|
||||
|
||||
derChk = lambda m: [Bfun(m), lambda mx: dBdm(self.chi, mx)]
|
||||
# TODO: I am not sure why the order get worse as step decreases .. --;
|
||||
passed = Tests.checkDerivative(derChk, self.chi, num=2, dx = d_chi, plotIt=False)
|
||||
self.assertTrue(passed)
|
||||
# derChk = lambda m: [Bfun(m), lambda mx: dBdm(self.chi, mx)]
|
||||
# # TODO: I am not sure why the order get worse as step decreases .. --;
|
||||
# passed = Tests.checkDerivative(derChk, self.chi, num=2, dx = d_chi, plotIt=False)
|
||||
# self.assertTrue(passed)
|
||||
|
||||
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+2294
-3873
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user