mirror of
https://github.com/wassname/simpeg.git
synced 2026-07-06 01:42:21 +08:00
start of j implementation, UNTESTED
This commit is contained in:
+16
-1
@@ -28,6 +28,13 @@ class BaseEMProblem(Problem.BaseProblem):
|
||||
self._MfMui = self.mesh.getFaceInnerProduct(1/mu_0)
|
||||
return self._MfMui
|
||||
|
||||
@property
|
||||
def MeMuI(self):
|
||||
#TODO: assuming constant mu
|
||||
if getattr(self, '_MeMuI', None) is None:
|
||||
self._MeMuI = self.mesh.getEdgeInnerProduct(1/mu_0)
|
||||
return self._MeMuI
|
||||
|
||||
@property
|
||||
def Me(self):
|
||||
if getattr(self, '_Me', None) is None:
|
||||
@@ -50,7 +57,15 @@ class BaseEMProblem(Problem.BaseProblem):
|
||||
self._MeSigmaI = self.mesh.getEdgeInnerProduct(sigma, invMat=True)
|
||||
return self._MeSigmaI
|
||||
|
||||
deleteTheseOnModelUpdate = ['_MeSigma', '_MeSigmaI']
|
||||
@property
|
||||
def MfSigmaI(self):
|
||||
#TODO: hardcoded to sigma as the model
|
||||
if getattr(self, '_MfSigmaI', None) is None:
|
||||
sigma = self.curModel.transform
|
||||
self._MfSigmaI = self.mesh.getFaceInnerProduct(sigma, invMat=True)
|
||||
return self._MfSigmaI
|
||||
|
||||
deleteTheseOnModelUpdate = ['_MeSigma', '_MeSigmaI','_MfSigmaI']
|
||||
|
||||
def fields(self, m):
|
||||
self.curModel = m
|
||||
|
||||
@@ -335,3 +335,72 @@ class ProblemFDEM_b(BaseFDEMProblem):
|
||||
return None
|
||||
raise NotImplementedError('fieldType "%s" is not implemented.' % fieldType)
|
||||
|
||||
|
||||
class ProblemFDEM_j(BaseFDEMProblem):
|
||||
"""
|
||||
Using the H-J formulation of Maxwell's equations
|
||||
|
||||
.. math::
|
||||
\\nabla \\times \\sigma^{-1} \\vec{J} + i\\omega\\mu\\vec{H} = 0
|
||||
\\nabla \\times \\vec{H} - \\vec{J} = \\vec{J_s}
|
||||
|
||||
Since \(\\vec{J}\) is a flux and \(\\vec{H}\) is a field, we discretize \(\\vec{J}\) on faces and \(\\vec{H}\) on edges.
|
||||
|
||||
For this implementation, we solve for J, using \( \\vec{H} = - (i\\omega\\mu)^{-1} \\nabla \\times \\sigma^{-1} \\vec{J} \) :
|
||||
|
||||
.. math::
|
||||
\\nabla \\times ( \\mu^{-1} \\nabla \\times \\sigma^{-1} \\vec{J} ) + i\\omega \\vec{J} = - i\\omega\\vec{J_s}
|
||||
"""
|
||||
|
||||
solType = 'j'
|
||||
|
||||
def __init__(self, model, **kwargs):
|
||||
BaseFDEMProblem.__init__(self, model, **kwargs)
|
||||
|
||||
def getA(self, freq):
|
||||
"""
|
||||
:param float freq: Frequency
|
||||
:rtype: scipy.sparse.csr_matrix
|
||||
:return: A
|
||||
"""
|
||||
|
||||
muI = self.MeMuI
|
||||
sigI = self.MfSigmaI
|
||||
C = self.mesh.edgeCurl
|
||||
|
||||
return C * muI * C.T * sigI + 1j * omega(freq)
|
||||
|
||||
def getADeriv(self, freq, u, v, adjoint=False):
|
||||
|
||||
muI = self.MeMuI
|
||||
C = self.mesh.edgeCurl
|
||||
sig = self.curModel.transform
|
||||
dsig_dm = self.curModel.transformDeriv
|
||||
#TODO: This only works if diagonal (no tensors)...
|
||||
dMfSigmaI_dI = - self.MfSigmaI**2
|
||||
|
||||
dMf_dsig = self.mesh.getFaceInnerProductDeriv(sig)(u)
|
||||
|
||||
if adjoint:
|
||||
raise NotImplementedError('fieldType "%s" is not implemented.' % fieldType)
|
||||
|
||||
return C * ( muI * ( C.T * ( dMfSigmaI_dI * ( dMf_dsig * ( dsig_dm * v ) ) ) ) )
|
||||
|
||||
|
||||
raise NotImplementedError('fieldType "%s" is not implemented.' % fieldType)
|
||||
|
||||
|
||||
|
||||
def getRHS(self, freq):
|
||||
"""
|
||||
:param float freq: Frequency
|
||||
:rtype: numpy.ndarray (nE, nTx)
|
||||
:return: RHS
|
||||
"""
|
||||
raise NotImplementedError('fieldType "%s" is not implemented.' % fieldType)
|
||||
|
||||
def calcFields(self, sol, freq, fieldType, adjoint=False):
|
||||
raise NotImplementedError('fieldType "%s" is not implemented.' % fieldType)
|
||||
|
||||
def calcFieldsDeriv(self, sol, freq, fieldType, v, adjoint=False):
|
||||
raise NotImplementedError('fieldType "%s" is not implemented.' % fieldType)
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
from SurveyFDEM import *
|
||||
from FDEM import ProblemFDEM_e, ProblemFDEM_b
|
||||
from FDEM import ProblemFDEM_e, ProblemFDEM_b, ProblemFDEM_j
|
||||
|
||||
Reference in New Issue
Block a user