mirror of
https://github.com/wassname/simpeg.git
synced 2026-08-10 12:40:59 +08:00
h,j jvec now with Zero and identity classes
This commit is contained in:
+40
-35
@@ -4,6 +4,7 @@ from SurveyFDEM import SurveyFDEM
|
||||
from FieldsFDEM import FieldsFDEM, FieldsFDEM_e, FieldsFDEM_b, FieldsFDEM_h, FieldsFDEM_j
|
||||
from SimPEG.EM.Base import BaseEMProblem
|
||||
from SimPEG.EM.Utils.EMUtils import omega
|
||||
from SimPEG.Utils import Zero, Identity
|
||||
|
||||
|
||||
class BaseFDEMProblem(BaseEMProblem):
|
||||
@@ -73,7 +74,7 @@ class BaseFDEMProblem(BaseEMProblem):
|
||||
ftype = self._fieldType + 'Solution'
|
||||
u_src = f[src, ftype]
|
||||
dA_dm = self.getADeriv_m(freq, u_src, v)
|
||||
dRHS_dm = self.getRHSDeriv_m(freq, src, v)
|
||||
dRHS_dm = self.getRHSDeriv_m(freq, src, v)
|
||||
# if dRHS_dm is None:
|
||||
# du_dm = dA_duI * ( - dA_dm )
|
||||
# else:
|
||||
@@ -532,25 +533,25 @@ class ProblemFDEM_j(BaseFDEMProblem):
|
||||
v = MfRho*v
|
||||
S_mDerivv = S_mDeriv(MeMuI.T * (C.T * v))
|
||||
S_eDerivv = S_eDeriv(v)
|
||||
if S_mDerivv is not None and S_eDerivv is not None:
|
||||
return S_mDerivv - 1j * omega(freq) * S_eDerivv
|
||||
elif S_mDerivv is not None:
|
||||
return S_mDerivv
|
||||
elif S_eDerivv is not None:
|
||||
return - 1j * omega(freq) * S_eDerivv
|
||||
else:
|
||||
return None
|
||||
# if S_mDerivv is not None and S_eDerivv is not None:
|
||||
return S_mDerivv - 1j * omega(freq) * S_eDerivv
|
||||
# elif S_mDerivv is not None:
|
||||
# return S_mDerivv
|
||||
# elif S_eDerivv is not None:
|
||||
# return - 1j * omega(freq) * S_eDerivv
|
||||
# else:
|
||||
# return None
|
||||
else:
|
||||
S_mDerivv, S_eDerivv = S_mDeriv(v), S_eDeriv(v)
|
||||
|
||||
if S_mDerivv is not None and S_eDerivv is not None:
|
||||
RHSDeriv = C * (MeMuI * S_mDerivv) - 1j * omega(freq) * S_eDerivv
|
||||
elif S_mDerivv is not None:
|
||||
RHSDeriv = C * (MeMuI * S_mDerivv)
|
||||
elif S_eDerivv is not None:
|
||||
RHSDeriv = - 1j * omega(freq) * S_eDerivv
|
||||
else:
|
||||
return None
|
||||
# if S_mDerivv is not None and S_eDerivv is not None:
|
||||
RHSDeriv = C * (MeMuI * S_mDerivv) - 1j * omega(freq) * S_eDerivv
|
||||
# elif S_mDerivv is not None:
|
||||
# RHSDeriv = C * (MeMuI * S_mDerivv)
|
||||
# elif S_eDerivv is not None:
|
||||
# RHSDeriv = - 1j * omega(freq) * S_eDerivv
|
||||
# else:
|
||||
# return None
|
||||
|
||||
if self._makeASymmetric:
|
||||
MfRho = self.MfRho
|
||||
@@ -634,30 +635,34 @@ class ProblemFDEM_h(BaseFDEMProblem):
|
||||
C = self.mesh.edgeCurl
|
||||
MfRho = self.MfRho
|
||||
|
||||
RHSDeriv = None
|
||||
# RHSDeriv = Zero()
|
||||
|
||||
if S_e is not None:
|
||||
MfRhoDeriv = self.MfRhoDeriv(S_e)
|
||||
if not adjoint:
|
||||
RHSDeriv = C.T * (MfRhoDeriv * v)
|
||||
elif adjoint:
|
||||
RHSDeriv = MfRhoDeriv.T * (C * v)
|
||||
# if S_e is not None:
|
||||
MfRhoDeriv = self.MfRhoDeriv(S_e)
|
||||
if not adjoint:
|
||||
RHSDeriv = C.T * (MfRhoDeriv * v)
|
||||
elif adjoint:
|
||||
RHSDeriv = MfRhoDeriv.T * (C * v)
|
||||
|
||||
# print S_e, RHSDeriv
|
||||
|
||||
S_mDeriv, S_eDeriv = src.evalDeriv(self, adjoint)
|
||||
|
||||
S_mDeriv = S_mDeriv(v)
|
||||
S_eDeriv = S_eDeriv(v)
|
||||
|
||||
if S_mDeriv is not None:
|
||||
if RHSDeriv is not None:
|
||||
RHSDeriv += S_mDeriv(v)
|
||||
else:
|
||||
RHSDeriv = S_mDeriv(v)
|
||||
if S_eDeriv is not None:
|
||||
if RHSDeriv is not None:
|
||||
RHSDeriv += C.T * (MfRho * S_e)
|
||||
else:
|
||||
RHSDeriv = C.T * (MfRho * S_e)
|
||||
# if S_mDeriv is not None:
|
||||
# if RHSDeriv is not None:
|
||||
RHSDeriv += S_mDeriv
|
||||
|
||||
return RHSDeriv
|
||||
# else:
|
||||
# RHSDeriv = S_mDeriv(v)
|
||||
# if S_eDeriv is not None:
|
||||
# if RHSDeriv is not None:
|
||||
return RHSDeriv + C.T * (MfRho * S_eDeriv)
|
||||
# print RHSDeriv
|
||||
# # else:
|
||||
# # RHSDeriv = C.T * (MfRho * S_e)
|
||||
# print RHSDeriv
|
||||
# return RHSDeriv
|
||||
|
||||
|
||||
@@ -228,11 +228,11 @@ class FieldsFDEM_j(FieldsFDEM):
|
||||
return self._jPrimary(jSolution, srcList) + self._jSecondary(jSolution, srcList)
|
||||
|
||||
def _jDeriv_u(self, src, v, adjoint=False):
|
||||
return None
|
||||
return Identity()*v
|
||||
|
||||
def _jDeriv_m(self, src, v, adjoint=False):
|
||||
# assuming primary does not depend on the model
|
||||
return None
|
||||
return Zero()
|
||||
|
||||
def _hPrimary(self, jSolution, srcList):
|
||||
hPrimary = np.zeros([self._edgeCurl.shape[1],jSolution.shape[1]],dtype = complex)
|
||||
@@ -274,12 +274,12 @@ class FieldsFDEM_j(FieldsFDEM):
|
||||
|
||||
if not adjoint:
|
||||
S_mDeriv = S_mDeriv(v)
|
||||
if S_mDeriv is not None:
|
||||
hDeriv_m += 1./(1j*omega(src.freq)) * MeMuI * (Me * S_mDeriv)
|
||||
# if S_mDeriv is not None:
|
||||
hDeriv_m += 1./(1j*omega(src.freq)) * MeMuI * (Me * S_mDeriv)
|
||||
elif adjoint:
|
||||
S_mDeriv = S_mDeriv(Me.T * (MeMuI.T * v))
|
||||
if S_mDeriv is not None:
|
||||
hDeriv_m += 1./(1j*omega(src.freq)) * S_mDeriv
|
||||
# if S_mDeriv is not None:
|
||||
hDeriv_m += 1./(1j*omega(src.freq)) * S_mDeriv
|
||||
return hDeriv_m
|
||||
|
||||
|
||||
@@ -329,11 +329,11 @@ class FieldsFDEM_h(FieldsFDEM):
|
||||
return self._hPrimary(hSolution, srcList) + self._hSecondary(hSolution, srcList)
|
||||
|
||||
def _hDeriv_u(self, src, v, adjoint=False):
|
||||
return None
|
||||
return Identity()*v
|
||||
|
||||
def _hDeriv_m(self, src, v, adjoint=False):
|
||||
# assuming primary does not depend on the model
|
||||
return None
|
||||
return Zero()
|
||||
|
||||
def _jPrimary(self, hSolution, srcList):
|
||||
jPrimary = np.zeros([self._edgeCurl.shape[0], hSolution.shape[1]], dtype = complex)
|
||||
@@ -360,9 +360,9 @@ class FieldsFDEM_h(FieldsFDEM):
|
||||
def _jSecondaryDeriv_m(self, src, v, adjoint=False):
|
||||
_,S_eDeriv = src.evalDeriv(self.prob, adjoint)
|
||||
S_eDeriv = S_eDeriv(v)
|
||||
if S_eDeriv is not None:
|
||||
return -S_eDeriv
|
||||
return None
|
||||
# if S_eDeriv is not None:
|
||||
return -S_eDeriv
|
||||
# return None
|
||||
|
||||
def _j(self, hSolution, srcList):
|
||||
return self._jPrimary(hSolution, srcList) + self._jSecondary(hSolution, srcList)
|
||||
|
||||
@@ -118,10 +118,10 @@ class SrcFDEM(Survey.BaseSrc):
|
||||
return None
|
||||
|
||||
def S_m(self, prob):
|
||||
return None
|
||||
return Zero()
|
||||
|
||||
def S_e(self, prob):
|
||||
return None
|
||||
return Zero()
|
||||
|
||||
def S_mDeriv(self, prob, v, adjoint = False):
|
||||
return Zero()
|
||||
|
||||
Reference in New Issue
Block a user