start of j implementation, UNTESTED

This commit is contained in:
Lindsey
2015-02-23 17:42:25 -08:00
parent bc7fb2f1d7
commit ed1457df86
3 changed files with 86 additions and 2 deletions
+16 -1
View File
@@ -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
+69
View File
@@ -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 -1
View File
@@ -1,2 +1,2 @@
from SurveyFDEM import *
from FDEM import ProblemFDEM_e, ProblemFDEM_b
from FDEM import ProblemFDEM_e, ProblemFDEM_b, ProblemFDEM_j