From cb4f699be516bb734c410d591224b3bbc66651ce Mon Sep 17 00:00:00 2001 From: rowanc1 Date: Fri, 2 May 2014 13:54:45 -0700 Subject: [PATCH] currentModel changes to avoid recalculations of the modelTransform --- simpegEM/TDEM/BaseTDEM.py | 4 ++++ simpegEM/TDEM/TDEM_b.py | 12 +++++------- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/simpegEM/TDEM/BaseTDEM.py b/simpegEM/TDEM/BaseTDEM.py index 11193cf4..b903ae0b 100644 --- a/simpegEM/TDEM/BaseTDEM.py +++ b/simpegEM/TDEM/BaseTDEM.py @@ -27,6 +27,7 @@ class BaseTDEMProblem(BaseTimeProblem, BaseEMProblem): def forward(self, m, RHS, CalcFields, F=None): + self.curModel = m F = F or FieldsTDEM(self.mesh, self.survey) dtFact = None @@ -45,6 +46,7 @@ class BaseTDEMProblem(BaseTimeProblem, BaseEMProblem): return F def adjoint(self, m, RHS, CalcFields, F=None): + self.curModel = m F = F or FieldsTDEM(self.mesh, self.survey) dtFact = None @@ -77,6 +79,7 @@ class BaseTDEMProblem(BaseTimeProblem, BaseEMProblem): * Compute \\\(\\\\vec{w} = -\\\mathbf{Q} \\\\vec{y}\\\) """ + self.curModel = m u = u or self.fields(m) p = self.Gvec(m, v, u) y = self.solveAh(m, p) @@ -98,6 +101,7 @@ class BaseTDEMProblem(BaseTimeProblem, BaseEMProblem): * Compute \\\(\\\\vec{w} = -\\\mathbf{G}^\\\\top y\\\) """ + self.curModel = m u = u or self.fields(m) if not isinstance(v, self.dataPair): diff --git a/simpegEM/TDEM/TDEM_b.py b/simpegEM/TDEM/TDEM_b.py index 360697cc..adf43f65 100644 --- a/simpegEM/TDEM/TDEM_b.py +++ b/simpegEM/TDEM/TDEM_b.py @@ -68,6 +68,7 @@ class ProblemTDEM_b(BaseTDEMProblem): Multiply G by a vector """ u = u or self.fields(m) + self.curModel = m # Note: Fields has shape (nF/E, nTx, nT+1) # However, p will only really fill (:,:,1:nT+1) @@ -75,8 +76,7 @@ class ProblemTDEM_b(BaseTDEMProblem): p = FieldsTDEM(self.mesh, self.survey) p[:, 'b', :] = 0.0 # b at all times is zero. p[:, 'e', 0] = 0.0 # fake initial fields - curModel = self.mapping.transform(m) - c = self.mesh.getEdgeInnerProductDeriv(curModel)*self.mapping.transformDeriv(m)*vec + c = self.mesh.getEdgeInnerProductDeriv(self.curTModel)*self.curTModelDeriv*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) @@ -95,6 +95,8 @@ class ProblemTDEM_b(BaseTDEMProblem): Multiply G.T by a vector """ u = u or self.fields(m) + self.curModel = m + nTx, nE = self.survey.nTx, self.mesh.nE tmp = np.zeros(nE) # Here we can do internal multiplications of Gt*v and then multiply by MsigDeriv.T in one go. @@ -103,9 +105,7 @@ class ProblemTDEM_b(BaseTDEMProblem): if nTx > 1: vu = vu.sum(axis=1) tmp += vu - - curModel = self.mapping.transform(m) - p = -mkvc(self.mapping.transformDeriv(m).T*self.mesh.getEdgeInnerProductDeriv(curModel).T*tmp) + p = -mkvc(self.curTModelDeriv.T*(self.mesh.getEdgeInnerProductDeriv(self.curTModel).T*tmp)) return p def solveAh(self, m, p): @@ -156,7 +156,6 @@ class ProblemTDEM_b(BaseTDEMProblem): y_e = self.MeSigmaI*self.mesh.edgeCurl.T*self.MfMui*y_b - self.MeSigmaI*p[:,'e',tInd+1] return {'b':y_b, 'e':y_e} - self.curModel = m return self.forward(m, AhRHS, AhCalcFields) def solveAht(self, m, p): @@ -230,7 +229,6 @@ class ProblemTDEM_b(BaseTDEMProblem): y_e += - self.MeSigmaI*p[:,'e',tInd] return {'b':y_b, 'e':y_e} - self.curModel = m return self.adjoint(m, AhtRHS, AhtCalcFields) ####################################################