mirror of
https://github.com/wassname/simpeg.git
synced 2026-07-19 11:28:00 +08:00
Changed default input of Jvec for f to u
This commit is contained in:
+13
-13
@@ -27,7 +27,7 @@ class BaseMTProblem(BaseFDEMProblem):
|
|||||||
# Might need to add more stuff here.
|
# Might need to add more stuff here.
|
||||||
|
|
||||||
## NEED to clean up the Jvec and Jtvec to use Zero and Identities for None components.
|
## NEED to clean up the Jvec and Jtvec to use Zero and Identities for None components.
|
||||||
def Jvec(self, m, v, f=None):
|
def Jvec(self, m, v, u=None):
|
||||||
"""
|
"""
|
||||||
Function to calculate the data sensitivities dD/dm times a vector.
|
Function to calculate the data sensitivities dD/dm times a vector.
|
||||||
|
|
||||||
@@ -39,8 +39,8 @@ class BaseMTProblem(BaseFDEMProblem):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
# Calculate the fields
|
# Calculate the fields
|
||||||
if f is None:
|
if u is None:
|
||||||
f = self.fields(m)
|
u = self.fields(m)
|
||||||
# Set current model
|
# Set current model
|
||||||
self.curModel = m
|
self.curModel = m
|
||||||
# Initiate the Jv object
|
# Initiate the Jv object
|
||||||
@@ -56,9 +56,9 @@ class BaseMTProblem(BaseFDEMProblem):
|
|||||||
# We need fDeriv_m = df/du*du/dm + df/dm
|
# We need fDeriv_m = df/du*du/dm + df/dm
|
||||||
# Construct du/dm, it requires a solve
|
# Construct du/dm, it requires a solve
|
||||||
# NOTE: need to account for the 2 polarizations in the derivatives.
|
# NOTE: need to account for the 2 polarizations in the derivatives.
|
||||||
f_src = f[src,:]
|
u = u[src,:]
|
||||||
# dA_dm and dRHS_dm should be of size nE,2, so that we can multiply by dA_duI. The 2 columns are each of the polarizations.
|
# dA_dm and dRHS_dm should be of size nE,2, so that we can multiply by dA_duI. The 2 columns are each of the polarizations.
|
||||||
dA_dm = self.getADeriv_m(freq, f_src, v) # Size: nE,2 (u_px,u_py) in the columns.
|
dA_dm = self.getADeriv_m(freq, u_src, v) # Size: nE,2 (u_px,u_py) in the columns.
|
||||||
dRHS_dm = self.getRHSDeriv_m(freq, v) # Size: nE,2 (u_px,u_py) in the columns.
|
dRHS_dm = self.getRHSDeriv_m(freq, v) # Size: nE,2 (u_px,u_py) in the columns.
|
||||||
if dRHS_dm is None:
|
if dRHS_dm is None:
|
||||||
du_dm = dA_duI * ( -dA_dm )
|
du_dm = dA_duI * ( -dA_dm )
|
||||||
@@ -68,25 +68,25 @@ class BaseMTProblem(BaseFDEMProblem):
|
|||||||
for rx in src.rxList:
|
for rx in src.rxList:
|
||||||
# Get the projection derivative
|
# Get the projection derivative
|
||||||
# v should be of size 2*nE (for 2 polarizations)
|
# v should be of size 2*nE (for 2 polarizations)
|
||||||
PDeriv_u = lambda t: rx.projectFieldsDeriv(src, self.mesh, f, t) # wrt u, we don't have have PDeriv wrt m
|
PDeriv_u = lambda t: rx.projectFieldsDeriv(src, self.mesh, u, t) # wrt u, we don't have have PDeriv wrt m
|
||||||
Jv[src, rx] = PDeriv_u(mkvc(du_dm))
|
Jv[src, rx] = PDeriv_u(mkvc(du_dm))
|
||||||
dA_duI.clean()
|
dA_duI.clean()
|
||||||
# Return the vectorized sensitivities
|
# Return the vectorized sensitivities
|
||||||
return mkvc(Jv)
|
return mkvc(Jv)
|
||||||
|
|
||||||
def Jtvec(self, m, v, f=None):
|
def Jtvec(self, m, v, u=None):
|
||||||
"""
|
"""
|
||||||
Function to calculate the transpose of the data sensitivities (dD/dm)^T times a vector.
|
Function to calculate the transpose of the data sensitivities (dD/dm)^T times a vector.
|
||||||
|
|
||||||
:param numpy.ndarray m (nC, 1) - conductive model
|
:param numpy.ndarray m (nC, 1) - conductive model
|
||||||
:param numpy.ndarray v (nD, 1) - vector
|
:param numpy.ndarray v (nD, 1) - vector
|
||||||
:param MTfields object f (optional) - MT fields object, if not given it is calculated
|
:param MTfields object u (optional) - MT fields object, if not given it is calculated
|
||||||
:rtype: MTdata object
|
:rtype: MTdata object
|
||||||
:return: Data sensitivities wrt m
|
:return: Data sensitivities wrt m
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if f is None:
|
if u is None:
|
||||||
f = self.fields(m)
|
u = self.fields(m)
|
||||||
|
|
||||||
self.curModel = m
|
self.curModel = m
|
||||||
|
|
||||||
@@ -103,15 +103,15 @@ class BaseMTProblem(BaseFDEMProblem):
|
|||||||
|
|
||||||
for src in self.survey.getSrcByFreq(freq):
|
for src in self.survey.getSrcByFreq(freq):
|
||||||
ftype = self._fieldType + 'Solution'
|
ftype = self._fieldType + 'Solution'
|
||||||
f_src = f[src, :]
|
u_src = u[src, :]
|
||||||
|
|
||||||
for rx in src.rxList:
|
for rx in src.rxList:
|
||||||
# Get the adjoint projectFieldsDeriv
|
# Get the adjoint projectFieldsDeriv
|
||||||
# PTv needs to be nE,
|
# PTv needs to be nE,
|
||||||
PTv = rx.projectFieldsDeriv(src, self.mesh, f, mkvc(v[src, rx],2), adjoint=True) # wrt u, need possibility wrt m
|
PTv = rx.projectFieldsDeriv(src, self.mesh, u, mkvc(v[src, rx],2), adjoint=True) # wrt u, need possibility wrt m
|
||||||
# Get the
|
# Get the
|
||||||
dA_duIT = ATinv * PTv
|
dA_duIT = ATinv * PTv
|
||||||
dA_dmT = self.getADeriv_m(freq, f_src, mkvc(dA_duIT), adjoint=True)
|
dA_dmT = self.getADeriv_m(freq, u_src, mkvc(dA_duIT), adjoint=True)
|
||||||
dRHS_dmT = self.getRHSDeriv_m(freq, mkvc(dA_duIT), adjoint=True)
|
dRHS_dmT = self.getRHSDeriv_m(freq, mkvc(dA_duIT), adjoint=True)
|
||||||
# Make du_dmT
|
# Make du_dmT
|
||||||
if dRHS_dmT is None:
|
if dRHS_dmT is None:
|
||||||
|
|||||||
+3
-30
@@ -46,34 +46,6 @@ class Rx(SimPEGsurvey.BaseRx):
|
|||||||
def __init__(self, locs, rxType):
|
def __init__(self, locs, rxType):
|
||||||
SimPEGsurvey.BaseRx.__init__(self, locs, rxType)
|
SimPEGsurvey.BaseRx.__init__(self, locs, rxType)
|
||||||
|
|
||||||
@property
|
|
||||||
def projField(self):
|
|
||||||
"""
|
|
||||||
Field Type projection (e.g. e b ...)
|
|
||||||
:param str fracPos: Position of the field in the data ratio
|
|
||||||
|
|
||||||
"""
|
|
||||||
if 'numerator' in fracPos:
|
|
||||||
return self.knownRxTypes[self.rxType][0][0]
|
|
||||||
elif 'denominator' in fracPos:
|
|
||||||
return self.knownRxTypes[self.rxType][1][0]
|
|
||||||
else:
|
|
||||||
raise Exception('{s} is an unknown option. Use numerator or denominator.')
|
|
||||||
|
|
||||||
@property
|
|
||||||
def projGLoc(self):
|
|
||||||
"""
|
|
||||||
Grid Location projection (e.g. Ex Fy ...)
|
|
||||||
:param str fracPos: Position of the field in the data ratio
|
|
||||||
|
|
||||||
"""
|
|
||||||
if 'numerator' in fracPos:
|
|
||||||
return self.knownRxTypes[self.rxType][0][1]
|
|
||||||
elif 'denominator' in fracPos:
|
|
||||||
return self.knownRxTypes[self.rxType][0][1]
|
|
||||||
else:
|
|
||||||
raise Exception('{s} is an unknown option. Use numerator or denominator.')
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def projType(self):
|
def projType(self):
|
||||||
"""
|
"""
|
||||||
@@ -471,10 +443,11 @@ class Survey(SimPEGsurvey.BaseSurvey):
|
|||||||
#################
|
#################
|
||||||
class Data(SimPEGsurvey.Data):
|
class Data(SimPEGsurvey.Data):
|
||||||
'''
|
'''
|
||||||
Data class for MTdata
|
Data class for MTdata. Stores the data vector indexed by the survey.
|
||||||
|
|
||||||
:param SimPEG survey object survey:
|
:param SimPEG survey object survey:
|
||||||
:param v vector with data
|
:param v vector of the data in order matching of the survey
|
||||||
|
|
||||||
|
|
||||||
'''
|
'''
|
||||||
def __init__(self, survey, v=None):
|
def __init__(self, survey, v=None):
|
||||||
|
|||||||
Reference in New Issue
Block a user