From 73edef5eb7a929d564576a1117acd771801d8169 Mon Sep 17 00:00:00 2001 From: Lindsey Heagy Date: Thu, 4 Feb 2016 19:34:16 -0800 Subject: [PATCH] the forward for all fields and fluxes can be computed from any formulation (todo: derive) --- SimPEG/EM/FDEM/FieldsFDEM.py | 10 ++-- SimPEG/EM/FDEM/SurveyFDEM.py | 33 ------------- SimPEG/Mesh/TensorMesh.py | 13 +++++ .../em/fdem/forward/test_FDEM_forwardEJHB.py | 49 +++++++++---------- 4 files changed, 42 insertions(+), 63 deletions(-) diff --git a/SimPEG/EM/FDEM/FieldsFDEM.py b/SimPEG/EM/FDEM/FieldsFDEM.py index 8cbc21c0..914e86f3 100644 --- a/SimPEG/EM/FDEM/FieldsFDEM.py +++ b/SimPEG/EM/FDEM/FieldsFDEM.py @@ -20,8 +20,8 @@ class Fields_e(Fields): 'b' : ['eSolution','F','_b'], 'bPrimary' : ['eSolution','F','_bPrimary'], 'bSecondary' : ['eSolution','F','_bSecondary'], - 'j' : ['eSolution','CC','_j'], - 'h' : ['eSolution','CC','_h'], + 'j' : ['eSolution','CCV','_j'], + 'h' : ['eSolution','CCV','_h'], } def __init__(self,mesh,survey,**kwargs): @@ -189,7 +189,7 @@ class Fields_b(Fields): elif fieldType == 'b': return 'F' elif (fieldType == 'h') or (fieldType == 'j'): - return'CC' + return'CCV' else: raise Exception('Field type must be e, b, h, j') @@ -325,7 +325,7 @@ class Fields_j(Fields): elif fieldType == 'j': return 'F' elif (fieldType == 'e') or (fieldType == 'b'): - return 'CC' + return 'CCV' else: raise Exception('Field type must be e, b, h, j') @@ -467,7 +467,7 @@ class Fields_h(Fields): elif fieldType == 'j': return 'F' elif (fieldType == 'e') or (fieldType == 'b'): - return 'CC' + return 'CCV' else: raise Exception('Field type must be e, b, h, j') diff --git a/SimPEG/EM/FDEM/SurveyFDEM.py b/SimPEG/EM/FDEM/SurveyFDEM.py index 7e4c77d0..dde72497 100644 --- a/SimPEG/EM/FDEM/SurveyFDEM.py +++ b/SimPEG/EM/FDEM/SurveyFDEM.py @@ -58,7 +58,6 @@ class Rx(SimPEG.Survey.BaseRx): def projGLoc(self, u): """Grid Location projection (e.g. Ex Fy ...)""" - print 'here', u._GLoc(self.rxType[0]) + self.knownRxTypes[self.rxType][1] return u._GLoc(self.rxType[0]) + self.knownRxTypes[self.rxType][1] def projectFields(self, src, mesh, u): @@ -72,30 +71,6 @@ class Rx(SimPEG.Survey.BaseRx): # get the real or imag component real_or_imag = self.projComp u_part = getattr(u_part_complex, real_or_imag) - - - - # if projGLoc == 'CC': - # P = self.getP(mesh, projGLoc) - # Z = 0.*P - # if mesh.dim == 3: - # if mesh._meshType == 'CYL' and mesh.isSymmetric and u_part.size > mesh.nC: # TODO: there must be a better way to do this! - # if self.knownRxTypes[self.rxType][1] == 'x': - # P = sp.hstack([P,Z]) - # elif self.knownRxTypes[self.rxType][1] == 'z': - # P = sp.hstack([Z,P]) - # elif self.knownRxTypes[self.rxType][1] == 'y': - # raise Exception('Symmetric CylMesh does not support y interpolation, as this variable does not exist.') - # else: - # if self.knownRxTypes[self.rxType][1] == 'x': - # P = sp.hstack([P,Z,Z]) - # elif self.knownRxTypes[self.rxType][1] == 'y': - # P = sp.hstack([Z,P,Z]) - # elif self.knownRxTypes[self.rxType][1] == 'z': - # P = sp.hstack([Z,Z,P]) - # else: - # projGLoc += self.knownRxTypes[self.rxType][1] - # P = self.getP(mesh, projGLoc) return P*u_part @@ -106,12 +81,6 @@ class Rx(SimPEG.Survey.BaseRx): print self.knownRxTypes[self.rxType][:2], 'Deriv', projGLoc projGLoc += self.knownRxTypes[self.rxType][1] - # if projGLoc = 'CC': - # P = self.getP(mesh) - # if sel - - # else projGLoc != 'CC': - # projGLoc += self.knownRxTypes[self.rxType][1] P = self.getP(mesh) if not adjoint: @@ -185,9 +154,7 @@ class Survey(SimPEG.Survey.BaseSurvey): data = SimPEG.Survey.Data(self) for src in self.srcList: for rx in src.rxList: - print rx.nD dat = rx.projectFields(src, self.mesh, u) - print dat.shape data[src, rx] = rx.projectFields(src, self.mesh, u) return data diff --git a/SimPEG/Mesh/TensorMesh.py b/SimPEG/Mesh/TensorMesh.py index 508f015c..1650b5cb 100644 --- a/SimPEG/Mesh/TensorMesh.py +++ b/SimPEG/Mesh/TensorMesh.py @@ -234,6 +234,9 @@ class BaseTensorMesh(BaseMesh): 'Fz' -> z-component of field defined on faces 'N' -> scalar field defined on nodes 'CC' -> scalar field defined on cell centers + 'CCVx' -> x-component of vector field defined on cell centers + 'CCVy' -> y-component of vector field defined on cell centers + 'CCVz' -> z-component of vector field defined on cell centers """ if self._meshType == 'CYL' and self.isSymmetric and locType in ['Ex','Ez','Fy']: raise Exception('Symmetric CylMesh does not support %s interpolation, as this variable does not exist.' % locType) @@ -257,6 +260,16 @@ class BaseTensorMesh(BaseMesh): Q = sp.hstack(components) elif locType in ['CC', 'N']: Q = Utils.interpmat(loc, *self.getTensor(locType)) + elif locType in ['CCVx', 'CCVy', 'CCVz']: + Q = Utils.interpmat(loc, *self.getTensor('CC')) + Z = Utils.spzeros(loc.shape[0],self.nC) + if locType == 'CCVx': + Q = sp.hstack([Q,Z,Z]) + elif locType == 'CCVy': + Q = sp.hstack([Z,Q,Z]) + elif locType == 'CCVz': + Q = sp.hstack([Z,Z,Q]) + else: raise NotImplementedError('getInterpolationMat: locType=='+locType+' and mesh.dim=='+str(self.dim)) diff --git a/tests/em/fdem/forward/test_FDEM_forwardEJHB.py b/tests/em/fdem/forward/test_FDEM_forwardEJHB.py index be389282..1157720a 100644 --- a/tests/em/fdem/forward/test_FDEM_forwardEJHB.py +++ b/tests/em/fdem/forward/test_FDEM_forwardEJHB.py @@ -9,7 +9,6 @@ testEB = True testHJ = True testEJ = True testBH = True -verbose = False TOLEBHJ = 1e-5 TOLEJHB = 1 # averaging and more sensitive to boundary condition violations (ie. the impact of violating the boundary conditions in each case is different.) @@ -21,56 +20,56 @@ SrcList = ['RawVec', 'MagDipole_Bfield', 'MagDipole', 'CircularLoop'] class FDEM_CrossCheck(unittest.TestCase): if testEJ: def test_EJ_CrossCheck_jxr_Jform(self): - self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'jxr', verbose=verbose, TOL=TOLEJHB)) + self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'jxr', TOL=TOLEJHB)) def test_EJ_CrossCheck_jyr_Jform(self): - self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'jyr', verbose=verbose, TOL=TOLEJHB)) + self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'jyr', TOL=TOLEJHB)) def test_EJ_CrossCheck_jzr_Jform(self): - self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'jzr', verbose=verbose, TOL=TOLEJHB)) + self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'jzr', TOL=TOLEJHB)) def test_EJ_CrossCheck_jxi_Jform(self): - self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'jxi', verbose=verbose, TOL=TOLEJHB)) + self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'jxi', TOL=TOLEJHB)) def test_EJ_CrossCheck_jyi_Jform(self): - self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'jyi', verbose=verbose, TOL=TOLEJHB)) + self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'jyi', TOL=TOLEJHB)) def test_EJ_CrossCheck_jzi_Jform(self): - self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'jzi', verbose=verbose, TOL=TOLEJHB)) + self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'jzi', TOL=TOLEJHB)) def test_EJ_CrossCheck_exr_Jform(self): - self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'exr', verbose=verbose, TOL=TOLEJHB)) + self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'exr', TOL=TOLEJHB)) def test_EJ_CrossCheck_eyr_Jform(self): - self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'eyr', verbose=verbose, TOL=TOLEJHB)) + self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'eyr', TOL=TOLEJHB)) def test_EJ_CrossCheck_ezr_Jform(self): - self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'ezr', verbose=verbose, TOL=TOLEJHB)) + self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'ezr', TOL=TOLEJHB)) def test_EJ_CrossCheck_exi_Jform(self): - self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'exi', verbose=verbose, TOL=TOLEJHB)) + self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'exi', TOL=TOLEJHB)) def test_EJ_CrossCheck_eyi_Jform(self): - self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'eyi', verbose=verbose, TOL=TOLEJHB)) + self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'eyi', TOL=TOLEJHB)) def test_EJ_CrossCheck_ezi_Jform(self): - self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'ezi', verbose=verbose, TOL=TOLEJHB)) + self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'ezi', TOL=TOLEJHB)) def test_EJ_CrossCheck_bxr_Jform(self): - self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'bxr', verbose=verbose, TOL=TOLEJHB)) + self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'bxr', TOL=TOLEJHB)) def test_EJ_CrossCheck_byr_Jform(self): - self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'byr', verbose=verbose, TOL=TOLEJHB)) + self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'byr', TOL=TOLEJHB)) def test_EJ_CrossCheck_bzr_Jform(self): - self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'bzr', verbose=verbose, TOL=TOLEJHB)) + self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'bzr', TOL=TOLEJHB)) def test_EJ_CrossCheck_bxi_Jform(self): - self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'bxi', verbose=verbose, TOL=TOLEJHB)) + self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'bxi', TOL=TOLEJHB)) def test_EJ_CrossCheck_byi_Jform(self): - self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'byi', verbose=verbose, TOL=TOLEJHB)) + self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'byi', TOL=TOLEJHB)) def test_EJ_CrossCheck_bzi_Jform(self): - self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'bzi', verbose=verbose, TOL=TOLEJHB)) + self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'bzi', TOL=TOLEJHB)) def test_EJ_CrossCheck_hxr_Jform(self): - self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'hxr', verbose=verbose, TOL=TOLEJHB)) + self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'hxr', TOL=TOLEJHB)) def test_EJ_CrossCheck_hyr_Jform(self): - self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'hyr', verbose=verbose, TOL=TOLEJHB)) + self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'hyr', TOL=TOLEJHB)) def test_EJ_CrossCheck_hzr_Jform(self): - self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'hzr', verbose=verbose, TOL=TOLEJHB)) + self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'hzr', TOL=TOLEJHB)) def test_EJ_CrossCheck_hxi_Jform(self): - self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'hxi', verbose=verbose, TOL=TOLEJHB)) + self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'hxi', TOL=TOLEJHB)) def test_EJ_CrossCheck_hyi_Jform(self): - self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'hyi', verbose=verbose, TOL=TOLEJHB)) + self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'hyi', TOL=TOLEJHB)) def test_EJ_CrossCheck_hzi_Jform(self): - self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'hzi', verbose=verbose, TOL=TOLEJHB)) + self.assertTrue(crossCheckTest(SrcList, 'e', 'j', 'hzi', TOL=TOLEJHB)) if __name__ == '__main__': unittest.main() \ No newline at end of file