mirror of
https://github.com/wassname/simpeg.git
synced 2026-07-03 12:37:13 +08:00
Initial work on bringing mag into simpeg framework
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
from SimPEG import Model, Data, np, sp
|
||||
from scipy.constants import mu_0
|
||||
|
||||
|
||||
class BaseMagData(Data.BaseData):
|
||||
"""Base Magnetics Data"""
|
||||
|
||||
rxLoc = None #: receiver locations
|
||||
rxType = None #: receiver type
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
Data.BaseData.__init__(**kwargs)
|
||||
|
||||
|
||||
#TODO: change to inc, dec, intensity
|
||||
def setBackgroundField(self, x, y, z):
|
||||
# Primary field in x-direction (background)
|
||||
self.B0 = np.r_[1.,0,0]
|
||||
|
||||
|
||||
class BaseMagModel(Model.BaseModel):
|
||||
"""BaseMagModel"""
|
||||
|
||||
def __init__(self, mesh, **kwargs):
|
||||
Model.BaseModel.__init__(mesh, **kwargs)
|
||||
|
||||
def transform(self, m, asMu=True):
|
||||
if asMu:
|
||||
return mu_0*(1 + m)
|
||||
return m
|
||||
|
||||
def transformDeriv(self, m, asMu=True):
|
||||
if asMu:
|
||||
return mu_0*sp.identity(self.nP)
|
||||
return sp.identity(self.nP)
|
||||
|
||||
@@ -87,7 +87,7 @@ def CongruousMagBC(mesh, Bo, chi):
|
||||
ind = chi > 0.
|
||||
V = mesh.vol[ind].sum()
|
||||
|
||||
gamma = 1/V*(chi*mesh.vol).sum()
|
||||
gamma = 1/V*(chi*mesh.vol).sum() # like a mass!
|
||||
|
||||
Bot = np.sqrt(sum(Bo**2))
|
||||
mx = Bo[0]/Bot
|
||||
|
||||
+63
-7
@@ -1,11 +1,62 @@
|
||||
from SimPEG import *
|
||||
from SimPEG import Problem, Utils
|
||||
import BaseMag
|
||||
from scipy.constants import mu_0
|
||||
|
||||
|
||||
class Magnetics(object):
|
||||
"""docstring for Magnetics"""
|
||||
def __init__(self, arg):
|
||||
super(Magnetics, self).__init__()
|
||||
self.arg = arg
|
||||
|
||||
class MagneticsDiffSecondary(Problem.BaseProblem):
|
||||
"""Secondary field approach using differential equations!"""
|
||||
|
||||
dataPair = BaseMag.BaseMagData
|
||||
modelPair = BaseMag.BaseMagModel
|
||||
|
||||
def __init__(self, mesh, model, **kwargs):
|
||||
Problem.BaseProblem.__init__(mesh, model, **kwargs)
|
||||
|
||||
self._Pbc, self._Pin, self._Pout = /
|
||||
self.mesh.getBCProjWF('neumann', discretization='CC')
|
||||
|
||||
Dface = self.mesh.faceDiv
|
||||
Mc = Utils.sdiag(self.mesh.vol)
|
||||
self._Div = Mc*Dface*self.Pin.T*self.Pin
|
||||
|
||||
@property
|
||||
def Pbc(self): return self._Pbc
|
||||
|
||||
@property
|
||||
def Pin(self): return self._Pin
|
||||
|
||||
@property
|
||||
def Pout(self): return self._Pout
|
||||
|
||||
@property
|
||||
def Div(self): return self._Div
|
||||
|
||||
@property
|
||||
def MfMuI(self): return self._MfMuI
|
||||
|
||||
@property
|
||||
def Mfmu0(self): return self._Mfmu0
|
||||
|
||||
def makeMassMatrices(self, m):
|
||||
mu = self.model.transform(m)
|
||||
Mfmui = self.mesh.getFaceInnerProduct(1./mu)
|
||||
#TODO: this will break if tensor mu
|
||||
self._MfmuI = Utils.sdiag(1./Mfmui.diagonal())
|
||||
self._Mfmu0 = self.mesh.getFaceInnerProduct(1/mu_0)
|
||||
|
||||
def getRHS(self):
|
||||
b0 = self.data.B0
|
||||
B0 = np.r_[b0[0]*np.ones(M3.nFx),
|
||||
b0[1]*np.ones(M3.nFy),
|
||||
b0[2]*np.ones(M3.nFz)]
|
||||
|
||||
Dface = self.mesh.faceDiv
|
||||
Mc = Utils.sdiag(self.mesh.vol)
|
||||
|
||||
Bbc = CongruousMagBC(M3, np.array([Box, Boy, Boz]), chi)
|
||||
|
||||
rhs = -self.Div*self.MfmuI*self.Mfmu0*B0 + self.Div*B0 - Mc*Dface*self.Pout.T*Bbc
|
||||
|
||||
def getA(self, m):
|
||||
"""
|
||||
@@ -20,7 +71,12 @@ class Magnetics(object):
|
||||
|
||||
|
||||
"""
|
||||
return self.mesh.faceDiv
|
||||
return -self.Div*self.MfmuI*self.Div.T
|
||||
|
||||
|
||||
def fields(self, m):
|
||||
self.makeMassMatrices(m)
|
||||
# F = self.getInitialFields()
|
||||
# return self.forward(m, self.getRHS, self.calcFields, F=F)
|
||||
|
||||
|
||||
|
||||
@@ -1 +1,3 @@
|
||||
# Init!
|
||||
import MagAnalytics
|
||||
import MagData
|
||||
import Magnetics
|
||||
|
||||
Reference in New Issue
Block a user