mirror of
https://github.com/wassname/simpeg.git
synced 2026-06-27 20:53:38 +08:00
e8bd78f63d
- Fwd - Jvec - Jtvec
89 lines
2.4 KiB
Python
89 lines
2.4 KiB
Python
import SimPEG
|
|
import numpy as np
|
|
from SimPEG.Utils import Zero, closestPoints
|
|
|
|
class BaseRx(SimPEG.Survey.BaseTimeRx):
|
|
locs = None
|
|
rxType = None
|
|
|
|
knownRxTypes = {
|
|
'phi':['phi',None],
|
|
'ex':['e','x'],
|
|
'ey':['e','y'],
|
|
'ez':['e','z'],
|
|
'jx':['j','x'],
|
|
'jy':['j','y'],
|
|
'jz':['j','z'],
|
|
}
|
|
|
|
def __init__(self, locs, times, rxType, **kwargs):
|
|
SimPEG.Survey.BaseTimeRx.__init__(self, locs, times, rxType, **kwargs)
|
|
|
|
@property
|
|
def projField(self):
|
|
"""Field Type projection (e.g. e b ...)"""
|
|
return self.knownRxTypes[self.rxType][0]
|
|
|
|
def projGLoc(self, f):
|
|
"""Grid Location projection (e.g. Ex Fy ...)"""
|
|
comp = self.knownRxTypes[self.rxType][1]
|
|
if comp is not None:
|
|
return f._GLoc(self.rxType) + comp
|
|
return f._GLoc(self.rxType)
|
|
|
|
def getTimeP(self, timesall):
|
|
"""
|
|
Returns the time projection matrix.
|
|
|
|
.. note::
|
|
|
|
This is not stored in memory, but is created on demand.
|
|
"""
|
|
time_inds = np.in1d(timesall, self.times)
|
|
return time_inds
|
|
|
|
def evalDeriv(self, src, mesh, f, v, adjoint=False):
|
|
P = self.getP(mesh, self.projGLoc(f))
|
|
if not adjoint:
|
|
return P*v
|
|
elif adjoint:
|
|
return P.T*v
|
|
|
|
|
|
# DC.Rx.Dipole(locs)
|
|
class Dipole(BaseRx):
|
|
|
|
def __init__(self, locsM, locsN, times, rxType = 'phi', **kwargs):
|
|
assert locsM.shape == locsN.shape, 'locsM and locsN need to be the same size'
|
|
locs = [locsM, locsN]
|
|
# We may not need this ...
|
|
BaseRx.__init__(self, locs, times, rxType)
|
|
|
|
@property
|
|
def nD(self):
|
|
"""Number of data in the receiver."""
|
|
# return self.locs[0].shape[0] * len(self.times)
|
|
return self.locs[0].shape[0]
|
|
|
|
@property
|
|
def nRx(self):
|
|
"""Number of data in the receiver."""
|
|
return self.locs[0].shape[0]
|
|
|
|
# Not sure why ...
|
|
# return int(self.locs[0].size / 2)
|
|
|
|
|
|
def getP(self, mesh, Gloc):
|
|
if mesh in self._Ps:
|
|
return self._Ps[mesh]
|
|
|
|
P0 = mesh.getInterpolationMat(self.locs[0], Gloc)
|
|
P1 = mesh.getInterpolationMat(self.locs[1], Gloc)
|
|
P = P0 - P1
|
|
|
|
if self.storeProjections:
|
|
self._Ps[mesh] = P
|
|
|
|
return P
|