mirror of
https://github.com/wassname/simpeg.git
synced 2026-07-09 04:48:12 +08:00
82 lines
3.0 KiB
Python
82 lines
3.0 KiB
Python
from SimPEG import *
|
|
import matplotlib.pyplot as plt
|
|
from simpegPF.MagAnalytics import spheremodel, MagSphereAnaFun, CongruousMagBC
|
|
import time
|
|
|
|
# Step1: Generate 3D tensor mesh
|
|
hxind = ((5,25,1.3),(41, 12.5),(5,25,1.3))
|
|
hyind = ((5,25,1.3),(41, 12.5),(5,25,1.3))
|
|
hzind = ((5,25,1.3),(40, 12.5),(5,25,1.3))
|
|
hx, hy, hz = Utils.meshTensors(hxind, hyind, hzind)
|
|
M3 = Mesh.TensorMesh([hx, hy, hz], [-sum(hx)/2,-sum(hy)/2,-sum(hz)/2])
|
|
|
|
# Step2: Generate susceptibility model
|
|
mu0 = 4*np.pi*1e-7
|
|
chibkg = 0.
|
|
chiblk = 1.
|
|
chi = np.ones(M3.nC)*chibkg
|
|
|
|
sph_ind = spheremodel(M3, 0., 0., 0., 50)
|
|
chi[sph_ind] = chiblk
|
|
mu = (1.+chi)*mu0
|
|
# Step3: Generate Boundary
|
|
BC = [['neumann', 'neumann'], ['neumann', 'neumann'], ['neumann', 'neumann']]
|
|
Box = 1 # Primary field in x-direction (background)
|
|
Boy = 0 # Primary field in y-direction (background)
|
|
Boz = 0 # Primary field in z-direction (background)
|
|
B0 = np.r_[Box*np.ones(np.prod(M3.nFx)), Boy*np.ones(np.prod(M3.nFy)), Boz*np.ones(np.prod(M3.nFz))]
|
|
|
|
Bbc, Bbcderiv = CongruousMagBC(M3, np.array([Box, Boy, Boz]), chi)
|
|
|
|
# Step4: Compute system matrix and right hand side
|
|
Dface = M3.faceDiv
|
|
Pbc, Pin, Pout = M3.getBCProjWF(BC, discretization='CC')
|
|
Mc = Utils.sdiag(M3.vol)
|
|
Div = Mc*Dface*Pin.T*Pin
|
|
MfmuI = Utils.sdiag(1/M3.getFaceInnerProduct(1/mu).diagonal())
|
|
Mfmu0 = 1/mu0*M3.getFaceInnerProduct()
|
|
A = -Div*MfmuI*Div.T
|
|
rhs = -Div*MfmuI*Mfmu0*B0 + Div*B0 - Mc*Dface*Pout.T*Bbc
|
|
|
|
# Step5: Solve !!
|
|
start = time.clock()
|
|
m1 = sp.linalg.interface.aslinearoperator(Utils.sdiag(-1/A.diagonal()))
|
|
phi, info = sp.linalg.bicgstab(A, rhs, tol=1e-6, maxiter = 1000, M =m1)
|
|
elapsed = (time.clock() - start)
|
|
|
|
print np.linalg.norm(A*phi-rhs)/np.linalg.norm(rhs)
|
|
print ('Cpu time = %10.3e ms') % (elapsed*1000)
|
|
# Step6: Update for B and project to receiver locations
|
|
B = MfmuI*Mfmu0*B0-B0-MfmuI*Div.T*phi
|
|
|
|
xr = np.linspace(-300, 300, 41)
|
|
yr = np.linspace(-300, 300, 41)
|
|
X, Y = np.meshgrid(xr, yr)
|
|
Z = np.ones((np.size(xr), np.size(yr)))*80
|
|
|
|
rxLoc = np.c_[Utils.mkvc(X), Utils.mkvc(Y), Utils.mkvc(Z)]
|
|
Qfx = M3.getInterpolationMat(rxLoc,'Fx')
|
|
Qfy = M3.getInterpolationMat(rxLoc,'Fy')
|
|
Qfz = M3.getInterpolationMat(rxLoc,'Fz')
|
|
|
|
Bxr = np.reshape(Qfx*B, (np.size(xr), np.size(yr)), order='F')
|
|
Byr = np.reshape(Qfy*B, (np.size(xr), np.size(yr)), order='F')
|
|
Bzr = np.reshape(Qfz*B, (np.size(xr), np.size(yr)), order='F')
|
|
H0 = Box/mu0
|
|
|
|
flag = 'secondary'
|
|
|
|
Bxra, Byra, Bzra = MagSphereAnaFun(X, Y, Z, 50., 0., 0., 0., mu0, mu0*(1+chiblk), H0, flag)
|
|
Bxra = np.reshape(Bxra, (np.size(xr), np.size(yr)), order='F')
|
|
Byra = np.reshape(Byra, (np.size(xr), np.size(yr)), order='F')
|
|
Bzra = np.reshape(Bzra, (np.size(xr), np.size(yr)), order='F')
|
|
|
|
# Step6: comparison to analytics
|
|
fig, ax = plt.subplots(3,2, figsize = (10,15))
|
|
dat1 = ax[0,0].imshow(Bxr); fig.colorbar(dat1, ax=ax[0,0])
|
|
dat2 = ax[0,1].imshow(Bxra); fig.colorbar(dat2, ax=ax[0,1])
|
|
dat3 = ax[1,0].imshow(Byr); fig.colorbar(dat3, ax=ax[1,0])
|
|
dat4 = ax[1,1].imshow(Byra); fig.colorbar(dat4, ax=ax[1,1])
|
|
dat5 = ax[2,0].imshow(Bzr); fig.colorbar(dat5, ax=ax[2,0])
|
|
dat6 = ax[2,1].imshow(Bzra); fig.colorbar(dat6, ax=ax[2,1])
|
|
plt.show() |