h,j jvec now with Zero and identity classes

This commit is contained in:
Lindsey Heagy
2015-11-06 10:58:23 -08:00
parent 4553d6db51
commit 0af1f59891
3 changed files with 53 additions and 48 deletions
+40 -35
View File
@@ -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
+11 -11
View File
@@ -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)
+2 -2
View File
@@ -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()