mirror of
https://github.com/wassname/simpeg.git
synced 2026-06-27 21:08:35 +08:00
307 lines
11 KiB
Python
307 lines
11 KiB
Python
# import unittest
|
|
# from SimPEG import *
|
|
# from simpegPF import BaseMag
|
|
# import matplotlib.pyplot as plt
|
|
# import simpegPF as PF
|
|
# from scipy.constants import mu_0
|
|
|
|
|
|
# class MagSensProblemTests(unittest.TestCase):
|
|
|
|
# def setUp(self):
|
|
# cs = 25.
|
|
# hxind = [(cs, 5, -1.3), (cs, 21), (cs, 5, 1.3)]
|
|
# hyind = [(cs, 5, -1.3), (cs, 21), (cs, 5, 1.3)]
|
|
# hzind = [(cs, 5, -1.3), (cs, 20), (cs, 5, 1.3)]
|
|
# M = Mesh.TensorMesh([hxind, hyind, hzind], 'CCC')
|
|
# chibkg = 0.001
|
|
# chiblk = 0.01
|
|
# chi = np.ones(M.nC)*chibkg
|
|
|
|
# Inc = 90.
|
|
# Dec = 0.
|
|
# Btot = 51000
|
|
|
|
# b0 = PF.MagAnalytics.IDTtoxyz(Inc, Dec, Btot)
|
|
# sph_ind = PF.MagAnalytics.spheremodel(M, 0., 0., 0., 100)
|
|
# chi[sph_ind] = chiblk
|
|
# model = PF.BaseMag.BaseMagMap(M)
|
|
|
|
# survey = BaseMag.BaseMagSurvey()
|
|
|
|
# survey.setBackgroundField(Inc, Dec, Btot)
|
|
# xr = np.linspace(-300, 300, 41)
|
|
# yr = np.linspace(-300, 300, 41)
|
|
# X, Y = np.meshgrid(xr, yr)
|
|
# Z = np.ones((xr.size, yr.size))*150
|
|
# rxLoc = np.c_[Utils.mkvc(X), Utils.mkvc(Y), Utils.mkvc(Z)]
|
|
# survey.rxLoc = rxLoc
|
|
|
|
# prob = PF.Magnetics.Problem3D_DiffSecondary(M, mapping=model)
|
|
# prob.pair(survey)
|
|
# dpre = survey.dpred(chi)
|
|
|
|
# fields = prob.fields(chi)
|
|
# self.u = fields['u']
|
|
# self.B = fields['B']
|
|
|
|
# self.survey = survey
|
|
# self.model = model
|
|
# self.prob = prob
|
|
# self.M = M
|
|
# self.chi = chi
|
|
|
|
# def test_mass(self):
|
|
# print '\n >>Derivative for MfMuI works.'
|
|
# mu = self.model*self.chi
|
|
|
|
# def MfmuI(mu):
|
|
|
|
# chi = mu/mu_0-1
|
|
# self.prob.makeMassMatrices(chi)
|
|
# vol = self.prob.mesh.vol
|
|
# aveF2CC = self.prob.mesh.aveF2CC
|
|
# MfMuI = self.prob.MfMuI.diagonal()
|
|
|
|
# return MfMuI
|
|
|
|
# def dMfmuI(mu, v):
|
|
|
|
# chi = mu/mu_0-1
|
|
# self.prob.makeMassMatrices(chi)
|
|
# vol = self.prob.mesh.vol
|
|
# aveF2CC = self.prob.mesh.aveF2CC
|
|
# MfMuI = self.prob.MfMuI.diagonal()
|
|
# dMfMuI = Utils.sdiag(MfMuI**2)*aveF2CC.T*Utils.sdiag(vol*1./mu**2)
|
|
|
|
# return dMfMuI*v
|
|
|
|
# d_mu = mu*0.8
|
|
# derChk = lambda m: [MfmuI(m), lambda mx: dMfmuI(self.chi, mx)]
|
|
# passed = Tests.checkDerivative(derChk, mu, num=4, dx = d_mu, plotIt=False)
|
|
|
|
# self.assertTrue(passed)
|
|
|
|
|
|
# def test_dCdm_Av(self):
|
|
# print '\n >>Derivative for Cm_A.'
|
|
# Div = self.prob._Div
|
|
# vol = self.prob.mesh.vol
|
|
# aveF2CC = self.prob.mesh.aveF2CC
|
|
|
|
# def Cm_A(chi):
|
|
# dmudm = self.model.deriv(chi)
|
|
# u = self.u
|
|
# # chi = mu/mu_0-1
|
|
# self.prob.makeMassMatrices(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)
|
|
|
|
# Cm_A = A*u
|
|
|
|
# return Cm_A
|
|
|
|
# def dCdm_A(chi, v):
|
|
|
|
# dmudm = self.model.deriv(chi)
|
|
# u = self.u
|
|
# self.prob.makeMassMatrices(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)
|
|
|
|
# Cm_A = A*u
|
|
# dCdm_A = Div * (Utils.sdiag( Div.T * u ) * dMfMuI * dmudm)
|
|
|
|
# return dCdm_A*v
|
|
|
|
# d_chi = self.chi*0.8
|
|
# derChk = lambda m: [Cm_A(m), lambda mx: dCdm_A(self.chi, mx)]
|
|
# passed = Tests.checkDerivative(derChk, self.chi, num=4, dx = d_chi, plotIt=False)
|
|
# self.assertTrue(passed)
|
|
|
|
|
|
# def test_dCdmu_RHS(self):
|
|
# print '\n >>Derivative for Cm_RHS.'
|
|
# 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 Cm_RHS(chi):
|
|
|
|
# self.prob.makeMassMatrices(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()
|
|
# dMfMuI = Utils.sdiag(MfMuIvec**2)*aveF2CC.T*Utils.sdiag(vol*1./mu**2)
|
|
# RHS1 = Div*self.prob.MfMuI*self.prob.MfMu0*B0
|
|
# RHS2 = Mc*Dface*self.prob._Pout.T*Bbc
|
|
# RHS = RHS1 + RHS2 + Div*B0
|
|
|
|
# return RHS
|
|
|
|
|
|
# def dCdm_RHS(chi, v):
|
|
|
|
|
|
# self.prob.makeMassMatrices(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()
|
|
# dMfMuI = Utils.sdiag(MfMuIvec**2)*aveF2CC.T*Utils.sdiag(vol*1./mu**2)
|
|
# 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
|
|
|
|
# return dCdm_RHSv
|
|
|
|
# d_chi = self.chi*0.8
|
|
# derChk = lambda m: [Cm_RHS(m), lambda mx: dCdm_RHS(self.chi, mx)]
|
|
# passed = Tests.checkDerivative(derChk, self.chi, num=4, dx = d_chi, plotIt=False)
|
|
# self.assertTrue(passed)
|
|
|
|
|
|
# # 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 dudm(chi, v):
|
|
|
|
# # 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
|
|
|
|
# # 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
|
|
|
|
# # 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*(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 dBdm(chi, v):
|
|
|
|
# # 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)) )
|
|
|
|
# # 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
|
|
|
|
# # 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)
|
|
|
|
|
|
|
|
# def test_Jvec(self):
|
|
# print ">> Derivative test for Jvec"
|
|
|
|
# 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: (self.survey.dpred(m), lambda v: self.prob.Jvec(m, v))
|
|
# # 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_Jtvec(self):
|
|
# print ">> Derivative test for Jtvec"
|
|
# dobs = self.survey.dpred(self.chi)
|
|
|
|
# def misfit(m):
|
|
# dpre = self.survey.dpred(m)
|
|
# misfit = 0.5*np.linalg.norm(dpre-dobs)**2
|
|
# residual = dpre-dobs
|
|
# dmisfit = self.prob.Jtvec(self.chi, residual)
|
|
|
|
# return misfit, dmisfit
|
|
|
|
# # TODO: I am not sure why the order get worse as step decreases .. --;
|
|
# passed = Tests.checkDerivative(misfit, self.chi, num=4, plotIt=False)
|
|
# self.assertTrue(passed)
|
|
|
|
# if __name__ == '__main__':
|
|
# unittest.main()
|