mirror of
https://github.com/wassname/simpeg.git
synced 2026-07-06 05:16:51 +08:00
Merge pull request #7 from simpeg/innerProductUpdates
Inner product updates
This commit is contained in:
@@ -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(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(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(sig)(vec)
|
||||
if not adjoint:
|
||||
return dMeSigmaI_dI * ( dMe_dsig * ( dsig_dm * v ) )
|
||||
else:
|
||||
|
||||
+14
-9
@@ -106,13 +106,15 @@ class ProblemTDEM_b(BaseTDEMProblem):
|
||||
|
||||
# fake initial 'e' fields
|
||||
p[:, 'e', 0] = 0.0
|
||||
c = self.mesh.getEdgeInnerProductDeriv(self.curModel.transform)*(self.curModel.transformDeriv*vec)
|
||||
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
|
||||
# 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):
|
||||
@@ -128,16 +130,19 @@ class ProblemTDEM_b(BaseTDEMProblem):
|
||||
if u is None:
|
||||
u = self.fields(m)
|
||||
self.curModel = m
|
||||
dMdsig = self.mesh.getEdgeInnerProductDeriv(self.curModel.transform)
|
||||
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
|
||||
p = -mkvc(self.curModel.transformDeriv.T*(self.mesh.getEdgeInnerProductDeriv(self.curModel.transform).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):
|
||||
|
||||
Reference in New Issue
Block a user