From 932f1dbd056cf677468cc0a2b11cc685ea56a140 Mon Sep 17 00:00:00 2001 From: rowanc1 Date: Tue, 17 Jun 2014 10:03:28 -0600 Subject: [PATCH 1/4] minimal updates to get it working (with depreciation warnings) --- simpegEM/FDEM/FDEM.py | 6 +++--- simpegEM/TDEM/TDEM_b.py | 8 +++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/simpegEM/FDEM/FDEM.py b/simpegEM/FDEM/FDEM.py index b201d403..f15994c0 100644 --- a/simpegEM/FDEM/FDEM.py +++ b/simpegEM/FDEM/FDEM.py @@ -144,7 +144,7 @@ class ProblemFDEM_e(BaseFDEMProblem): def getADeriv(self, freq, u, v, adjoint=False): sig = self.curModel.transform dsig_dm = self.curModel.transformDeriv - dMe_dsig = self.mesh.getEdgeInnerProductDeriv(sig, v=u) + dMe_dsig = self.mesh.getEdgeInnerProductDeriv(Utils.TensorType(self.mesh,sig))(u) if adjoint: return 1j * omega(freq) * ( dsig_dm.T * ( dMe_dsig.T * v ) ) @@ -228,7 +228,7 @@ class ProblemFDEM_b(BaseFDEMProblem): dMeSigmaI_dI = - self.MeSigmaI**2 vec = (C.T*(mui*u)) - dMe_dsig = self.mesh.getEdgeInnerProductDeriv(sig, v=vec) + dMe_dsig = self.mesh.getEdgeInnerProductDeriv(Utils.TensorType(self.mesh,sig))(vec) if adjoint: return dsig_dm.T * ( dMe_dsig.T * ( dMeSigmaI_dI.T * ( C.T * ( mui.T * v ) ) ) ) @@ -285,7 +285,7 @@ class ProblemFDEM_b(BaseFDEMProblem): dMeSigmaI_dI = - self.MeSigmaI**2 vec = C.T * ( mui * b ) - dMe_dsig = self.mesh.getEdgeInnerProductDeriv(sig, v=vec) + dMe_dsig = self.mesh.getEdgeInnerProductDeriv(Utils.TensorType(self.mesh,sig))(vec) if not adjoint: return dMeSigmaI_dI * ( dMe_dsig * ( dsig_dm * v ) ) else: diff --git a/simpegEM/TDEM/TDEM_b.py b/simpegEM/TDEM/TDEM_b.py index 4463cef6..ac1254f1 100644 --- a/simpegEM/TDEM/TDEM_b.py +++ b/simpegEM/TDEM/TDEM_b.py @@ -1,5 +1,5 @@ from BaseTDEM import BaseTDEMProblem, FieldsTDEM -from SimPEG.Utils import mkvc, sdiag +from SimPEG.Utils import mkvc, sdiag, TensorType import numpy as np from SurveyTDEM import SurveyTDEM @@ -106,7 +106,8 @@ class ProblemTDEM_b(BaseTDEMProblem): # fake initial 'e' fields p[:, 'e', 0] = 0.0 - c = self.mesh.getEdgeInnerProductDeriv(self.curModel.transform)*(self.curModel.transformDeriv*vec) + tt = TensorType(self.mesh, self.curModel.transform) + c = self.mesh.getEdgeInnerProductDeriv(tt)()*(self.curModel.transformDeriv*vec) for i in range(1,self.nT+1): # TODO: G[1] may be dependent on the model # for a galvanic source (deriv of the dc problem) @@ -137,7 +138,8 @@ class ProblemTDEM_b(BaseTDEMProblem): if nTx > 1: vu = vu.sum(axis=1) tmp += vu - p = -mkvc(self.curModel.transformDeriv.T*(self.mesh.getEdgeInnerProductDeriv(self.curModel.transform).T*tmp)) + tt = TensorType(self.mesh, self.curModel.transform) + p = -mkvc(self.curModel.transformDeriv.T*(self.mesh.getEdgeInnerProductDeriv(tt)().T*tmp)) return p def solveAh(self, m, p): From 57f16fc408ba5829306839e7b5265581e1184861 Mon Sep 17 00:00:00 2001 From: rowanc1 Date: Tue, 17 Jun 2014 14:01:57 -0600 Subject: [PATCH 2/4] updates (a bit slower implementation that is more general) --- simpegEM/TDEM/TDEM_b.py | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/simpegEM/TDEM/TDEM_b.py b/simpegEM/TDEM/TDEM_b.py index ac1254f1..853746cb 100644 --- a/simpegEM/TDEM/TDEM_b.py +++ b/simpegEM/TDEM/TDEM_b.py @@ -107,13 +107,15 @@ class ProblemTDEM_b(BaseTDEMProblem): # fake initial 'e' fields p[:, 'e', 0] = 0.0 tt = TensorType(self.mesh, self.curModel.transform) - c = self.mesh.getEdgeInnerProductDeriv(tt)()*(self.curModel.transformDeriv*vec) + dMdsig = self.mesh.getEdgeInnerProductDeriv(tt) + dsigdm_x_v = self.curModel.transformDeriv*vec for i in range(1,self.nT+1): # TODO: G[1] may be dependent on the model # for a galvanic source (deriv of the dc problem) # # Do multiplication for all tx in self.survey.txList - p[:, 'e', i] = - sdiag(c) * u[:,'e',i] # i.e.: - sdiag(MsigDeriv * v) * e + for tx in self.survey.txList: + p[tx, 'e', i] = - dMdsig(u[tx,'e',i]) * dsigdm_x_v return p def Gtvec(self, m, vec, u=None): @@ -129,17 +131,20 @@ class ProblemTDEM_b(BaseTDEMProblem): if u is None: u = self.fields(m) self.curModel = m + tt = TensorType(self.mesh, self.curModel.transform) + dMdsig = self.mesh.getEdgeInnerProductDeriv(tt) + dsigdm = self.curModel.transformDeriv - nTx, nE = self.survey.nTx, self.mesh.nE - tmp = np.zeros(nE) + nTx = self.survey.nTx + VUs = None # Here we can do internal multiplications of Gt*v and then multiply by MsigDeriv.T in one go. for i in range(1,self.nT+1): - vu = vec[:,'e',i]*u[:,'e',i] - if nTx > 1: - vu = vu.sum(axis=1) - tmp += vu - tt = TensorType(self.mesh, self.curModel.transform) - p = -mkvc(self.curModel.transformDeriv.T*(self.mesh.getEdgeInnerProductDeriv(tt)().T*tmp)) + vu = None + for tx in self.survey.txList: + vutx = dMdsig(u[tx,'e',i]).T * vec[tx,'e',i] + vu = vutx if vu is None else vu + vutx + VUs = vu if VUs is None else VUs + vu + p = -dsigdm.T*VUs return p def solveAh(self, m, p): From 2e3f98800c678ccfaf1faad16f34402c70ecdf9f Mon Sep 17 00:00:00 2001 From: rowanc1 Date: Wed, 18 Jun 2014 11:09:23 -0700 Subject: [PATCH 3/4] tensorType in problem. --- simpegEM/FDEM/FDEM.py | 6 +++--- simpegEM/TDEM/TDEM_b.py | 8 +++----- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/simpegEM/FDEM/FDEM.py b/simpegEM/FDEM/FDEM.py index f15994c0..7213f81f 100644 --- a/simpegEM/FDEM/FDEM.py +++ b/simpegEM/FDEM/FDEM.py @@ -144,7 +144,7 @@ class ProblemFDEM_e(BaseFDEMProblem): def getADeriv(self, freq, u, v, adjoint=False): sig = self.curModel.transform dsig_dm = self.curModel.transformDeriv - dMe_dsig = self.mesh.getEdgeInnerProductDeriv(Utils.TensorType(self.mesh,sig))(u) + dMe_dsig = self.mesh.getEdgeInnerProductDeriv(self.tensorType)(u) if adjoint: return 1j * omega(freq) * ( dsig_dm.T * ( dMe_dsig.T * v ) ) @@ -228,7 +228,7 @@ class ProblemFDEM_b(BaseFDEMProblem): dMeSigmaI_dI = - self.MeSigmaI**2 vec = (C.T*(mui*u)) - dMe_dsig = self.mesh.getEdgeInnerProductDeriv(Utils.TensorType(self.mesh,sig))(vec) + dMe_dsig = self.mesh.getEdgeInnerProductDeriv(self.tensorType)(vec) if adjoint: return dsig_dm.T * ( dMe_dsig.T * ( dMeSigmaI_dI.T * ( C.T * ( mui.T * v ) ) ) ) @@ -285,7 +285,7 @@ class ProblemFDEM_b(BaseFDEMProblem): dMeSigmaI_dI = - self.MeSigmaI**2 vec = C.T * ( mui * b ) - dMe_dsig = self.mesh.getEdgeInnerProductDeriv(Utils.TensorType(self.mesh,sig))(vec) + dMe_dsig = self.mesh.getEdgeInnerProductDeriv(self.tensorType)(vec) if not adjoint: return dMeSigmaI_dI * ( dMe_dsig * ( dsig_dm * v ) ) else: diff --git a/simpegEM/TDEM/TDEM_b.py b/simpegEM/TDEM/TDEM_b.py index 853746cb..ed4d3f3f 100644 --- a/simpegEM/TDEM/TDEM_b.py +++ b/simpegEM/TDEM/TDEM_b.py @@ -1,5 +1,5 @@ from BaseTDEM import BaseTDEMProblem, FieldsTDEM -from SimPEG.Utils import mkvc, sdiag, TensorType +from SimPEG.Utils import mkvc, sdiag import numpy as np from SurveyTDEM import SurveyTDEM @@ -106,8 +106,7 @@ class ProblemTDEM_b(BaseTDEMProblem): # fake initial 'e' fields p[:, 'e', 0] = 0.0 - tt = TensorType(self.mesh, self.curModel.transform) - dMdsig = self.mesh.getEdgeInnerProductDeriv(tt) + dMdsig = self.mesh.getEdgeInnerProductDeriv(self.tensorType) dsigdm_x_v = self.curModel.transformDeriv*vec for i in range(1,self.nT+1): # TODO: G[1] may be dependent on the model @@ -131,8 +130,7 @@ class ProblemTDEM_b(BaseTDEMProblem): if u is None: u = self.fields(m) self.curModel = m - tt = TensorType(self.mesh, self.curModel.transform) - dMdsig = self.mesh.getEdgeInnerProductDeriv(tt) + dMdsig = self.mesh.getEdgeInnerProductDeriv(self.tensorType) dsigdm = self.curModel.transformDeriv nTx = self.survey.nTx From 896bb68bacd9551b76e11d8a76f76bcf46290d38 Mon Sep 17 00:00:00 2001 From: rowanc1 Date: Thu, 3 Jul 2014 11:13:53 -0700 Subject: [PATCH 4/4] Updates to innerproductsDervis --- simpegEM/FDEM/FDEM.py | 6 +++--- simpegEM/TDEM/TDEM_b.py | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/simpegEM/FDEM/FDEM.py b/simpegEM/FDEM/FDEM.py index 7213f81f..3381a6ab 100644 --- a/simpegEM/FDEM/FDEM.py +++ b/simpegEM/FDEM/FDEM.py @@ -144,7 +144,7 @@ class ProblemFDEM_e(BaseFDEMProblem): def getADeriv(self, freq, u, v, adjoint=False): sig = self.curModel.transform dsig_dm = self.curModel.transformDeriv - dMe_dsig = self.mesh.getEdgeInnerProductDeriv(self.tensorType)(u) + dMe_dsig = self.mesh.getEdgeInnerProductDeriv(sig)(u) if adjoint: return 1j * omega(freq) * ( dsig_dm.T * ( dMe_dsig.T * v ) ) @@ -228,7 +228,7 @@ class ProblemFDEM_b(BaseFDEMProblem): dMeSigmaI_dI = - self.MeSigmaI**2 vec = (C.T*(mui*u)) - dMe_dsig = self.mesh.getEdgeInnerProductDeriv(self.tensorType)(vec) + dMe_dsig = self.mesh.getEdgeInnerProductDeriv(sig)(vec) if adjoint: return dsig_dm.T * ( dMe_dsig.T * ( dMeSigmaI_dI.T * ( C.T * ( mui.T * v ) ) ) ) @@ -285,7 +285,7 @@ class ProblemFDEM_b(BaseFDEMProblem): dMeSigmaI_dI = - self.MeSigmaI**2 vec = C.T * ( mui * b ) - dMe_dsig = self.mesh.getEdgeInnerProductDeriv(self.tensorType)(vec) + dMe_dsig = self.mesh.getEdgeInnerProductDeriv(sig)(vec) if not adjoint: return dMeSigmaI_dI * ( dMe_dsig * ( dsig_dm * v ) ) else: diff --git a/simpegEM/TDEM/TDEM_b.py b/simpegEM/TDEM/TDEM_b.py index ed4d3f3f..ccaff98c 100644 --- a/simpegEM/TDEM/TDEM_b.py +++ b/simpegEM/TDEM/TDEM_b.py @@ -106,7 +106,7 @@ class ProblemTDEM_b(BaseTDEMProblem): # fake initial 'e' fields p[:, 'e', 0] = 0.0 - dMdsig = self.mesh.getEdgeInnerProductDeriv(self.tensorType) + dMdsig = self.mesh.getEdgeInnerProductDeriv(self.curModel.transform) dsigdm_x_v = self.curModel.transformDeriv*vec for i in range(1,self.nT+1): # TODO: G[1] may be dependent on the model @@ -130,7 +130,7 @@ class ProblemTDEM_b(BaseTDEMProblem): if u is None: u = self.fields(m) self.curModel = m - dMdsig = self.mesh.getEdgeInnerProductDeriv(self.tensorType) + dMdsig = self.mesh.getEdgeInnerProductDeriv(self.curModel.transform) dsigdm = self.curModel.transformDeriv nTx = self.survey.nTx