def test_tem(): # Just ensure functionality stays the same, with one example. for i in ['6', '7', '8']: # Signal = 0, 1, -1 res = DATAFEMTEM['out'+i][()] tEM, _ = tem(**res['inp']) assert_allclose(tEM, res['EM']) # Test `xdirect=None` through analytical/dipole-comparison with a simple # model # Fullspace model inp = {'src': [[0, -100], [0, -200], 200], 'rec': [np.arange(1, 11)*500, np.arange(1, 11)*100, 300], 'freqtime': [0.1, 1, 10], 'res': 1} fEM_fs = analytical(**inp) # Add two layers inp['depth'] = [0, 500] inp['res'] = [10, 1, 30] fEM_tot1 = dipole(xdirect=False, **inp) fEM_tot2 = dipole(xdirect=True, **inp) fEM_secondary = dipole(xdirect=None, **inp) # `xdirect=False` and `xdirect=True` have to agree assert_allclose(fEM_tot2, fEM_tot1) # Total field minus minus direct field equals secondary field assert_allclose(fEM_tot1 - fEM_fs, fEM_secondary)
def test_analytical(): # 1. fullspace model = {'src': [500, -100, -200], 'rec': [0, 1000, 200], 'res': 6.71, 'aniso': 1.2, 'freqtime': 40, 'ab': 42, 'verb': 0} dip_res = dipole(depth=[], **model) ana_res = analytical(**model) assert_allclose(dip_res, ana_res) # \= Check 36/63 model['ab'] = 63 ana_res2 = analytical(**model) assert_allclose(ana_res.shape, ana_res.shape) assert np.count_nonzero(ana_res2) == 0 # 2. halfspace for signal in [0, 1]: # Frequency, Time model = {'src': [500, -100, 5], 'rec': [0, 1000, 20], 'res': 6.71, 'aniso': 1.2, 'freqtime': 1, 'signal': signal, 'ab': 12, 'verb': 0} # Check dhs, dsplit, and dtetm ana_res = analytical(solution='dhs', **model) res1, res2, res3 = analytical(solution='dsplit', **model) dTE, dTM, rTE, rTM, air = analytical(solution='dtetm', **model) model['res'] = [2e14, model['res']] model['aniso'] = [1, model['aniso']] dip_res = dipole(depth=0, **model) # Check dhs, dsplit assert_allclose(dip_res, ana_res, rtol=1e-3) assert_allclose(ana_res, res1+res2+res3) # Check dsplit and dtetm assert_allclose(res1, dTE+dTM) assert_allclose(res2, rTE+rTM) assert_allclose(res3, air)
def test_analytical(): # 1. fullspace model = { 'src': [500, -100, -200], 'rec': [0, 1000, 200], 'res': 6.71, 'aniso': 1.2, 'freqtime': 40, 'ab': 42, 'verb': 0 } dip_res = dipole(depth=[], **model) ana_res = analytical(**model) assert_allclose(dip_res, ana_res) # 2. halfspace model = { 'src': [500, -100, 5], 'rec': [0, 1000, 20], 'res': 6.71, 'aniso': 1.2, 'freqtime': 10, 'signal': 1, 'ab': 12, 'verb': 0 } # Check dhs, dsplit, and dtetm ana_res = analytical(solution='dhs', **model) res1, res2, res3 = analytical(solution='dsplit', **model) dTE, dTM, rTE, rTM, air = analytical(solution='dtetm', **model) model['res'] = [2e14, model['res']] model['aniso'] = [1, model['aniso']] dip_res = dipole(depth=0, **model) # Check dhs, dsplit assert_allclose(dip_res, ana_res, rtol=1e-4) assert_allclose(ana_res, res1 + res2 + res3) # Check dsplit and dtetm assert_allclose(res1, dTE + dTM) assert_allclose(res2, rTE + rTM) assert_allclose(res3, air)
'res': [2e14, 1], 'freqtime': 1, 'ab': 11, 'aniso': [1, 2], 'xdirect': False, 'verb': 0, } # Used Hankel filter hfilt = empymod.filters.key_201_2009() # Calculate analytical solution resp = empymod.analytical(params['src'], params['rec'], params['res'][1], params['freqtime'], solution='dhs', aniso=params['aniso'][1], ab=params['ab'], verb=params['verb']) ############################################################################### # Calculate numerically the model using different Hankel options # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ standard = empymod.dipole(**params, htarg=[hfilt, 0]) laggedco = empymod.dipole(**params, htarg=[hfilt, -1]) spline10 = empymod.dipole(**params, htarg=[hfilt, 10]) spline30 = empymod.dipole(**params, htarg=[hfilt, 30]) splin100 = empymod.dipole(**params, htarg=[hfilt, 100]) ###############################################################################
def test_analytical(): # 1. fullspace model = {'src': [500, -100, -200], 'rec': [0, 1000, 200], 'res': 6.71, 'aniso': 1.2, 'freqtime': 40, 'ab': 42, 'verb': 0} dip_res = dipole(depth=[], **model) ana_res = analytical(**model) assert_allclose(dip_res, ana_res) # \= Check 36/63 model['ab'] = 63 ana_res2 = analytical(**model) assert_allclose(ana_res.shape, ana_res.shape) assert np.count_nonzero(ana_res2) == 0 # 2. halfspace for signal in [None, 0, 1]: # Frequency, Time model = {'src': [500, -100, 5], 'rec': [0, 1000, 20], 'res': 6.71, 'aniso': 1.2, 'freqtime': 1, 'signal': signal, 'ab': 12, 'verb': 0} # Check dhs, dsplit, and dtetm ana_res = analytical(solution='dhs', **model) res1, res2, res3 = analytical(solution='dsplit', **model) dTE, dTM, rTE, rTM, air = analytical(solution='dtetm', **model) model['res'] = [2e14, model['res']] model['aniso'] = [1, model['aniso']] dip_res = dipole(depth=0, **model) # Check dhs, dsplit assert_allclose(dip_res, ana_res, rtol=1e-3) assert_allclose(ana_res, res1+res2+res3) # Check dsplit and dtetm assert_allclose(res1, dTE+dTM) assert_allclose(res2, rTE+rTM) assert_allclose(res3, air) # As above, but Laplace domain. model = {'src': [500, -100, 5], 'rec': [0, 1000, 20], 'res': 6.71, 'aniso': 1.2, 'freqtime': -1, 'signal': None, 'ab': 12, 'verb': 0} # Check dhs, dsplit, and dtetm ana_res = analytical(solution='dhs', **model) res1, res2, res3 = analytical(solution='dsplit', **model) dTE, dTM, rTE, rTM, air = analytical(solution='dtetm', **model) model['res'] = [2e14, model['res']] model['aniso'] = [1, model['aniso']] dip_res = dipole(depth=0, **model) # Check dhs, dsplit assert_allclose(dip_res, ana_res, rtol=1e-3) assert_allclose(ana_res, res1+res2+res3) # Check dsplit and dtetm assert_allclose(res1, dTE+dTM) assert_allclose(res2, rTE+rTM) assert_allclose(res3, air) # 3. Check user-hook for eta/zeta def func_eta(inp, pdict): # Dummy function to check if it works. etaH = pdict['etaH'].real*inp['fact'] + 1j*pdict['etaH'].imag etaV = pdict['etaV'].real*inp['fact'] + 1j*pdict['etaV'].imag return etaH, etaV def func_zeta(inp, pdict): # Dummy function to check if it works. etaH = pdict['zetaH']/inp['fact'] etaV = pdict['zetaV']/inp['fact'] return etaH, etaV model = {'src': [0, 0, 500], 'rec': [500, 0, 600], 'freqtime': [0.1, 1, 10]} res = 10 fact = 2 eta = {'res': fact*res, 'fact': fact, 'func_eta': func_eta} zeta = {'res': res, 'fact': fact, 'func_zeta': func_zeta} # Frequency domain fs standard = analytical(res=res, **model) outeta = analytical(res=eta, **model) assert_allclose(standard, outeta) outzeta = analytical(res=zeta, mpermH=fact, mpermV=fact, **model) assert_allclose(standard, outzeta) # Time domain dhs standard = analytical(res=res, solution='dhs', signal=0, **model) outeta = analytical(res=eta, solution='dhs', signal=0, **model) assert_allclose(standard, outeta) outzeta = analytical(res=zeta, solution='dhs', signal=0, mpermH=fact, mpermV=fact, **model) assert_allclose(standard, outzeta)
'freqtime': freq, 'aniso': aniso, 'ab': ab, 'epermH': perm, 'epermV': perm, 'mpermH': perm, 'mpermV': perm, 'verb': 0 } ############################################################################### # Calculation # ----------- # Halfspace hs = empymod.analytical(**inp, solution='dfs') hs = hs.reshape(np.shape(rx)) # Fullspace fs = empymod.analytical(**inp) fs = fs.reshape(np.shape(rx)) # Relative error (%) amperr = np.abs((fs.amp - hs.amp)/fs.amp)*100 phaerr = np.abs((np.angle(fs) - np.angle(hs))/np.angle(fs))*100 ############################################################################### # Plot # ---- fig, axs = plt.subplots(figsize=(10, 4.2), nrows=1, ncols=2)
def plot_t(EM, HS, title, i): plt.figure(title, figsize=(10, 8)) plt.subplot(i) plt.semilogx(t, EM) plt.semilogx(t, HS, '--') ############################################################################### # Impulse HS plt.figure('Impulse HS') i = 330 for ab in all_abs: i += 1 EM = empymod.dipole(**inpEM, **modHS, ab=ab, signal=0, depth=0) HS = empymod.analytical(**inpEM, **modFS, solution='dhs', ab=ab, signal=0) plot_t(EM, HS, 'Impulse HS', i) plt.suptitle('Impulse HS') plt.show() ############################################################################### # Switch-on HS plt.figure('Switch-on HS') i = 330 for ab in all_abs: i += 1 EM = empymod.dipole(**inpEM, **modHS, ab=ab, signal=1, depth=0) HS = empymod.analytical(**inpEM, **modFS, solution='dhs', ab=ab, signal=1) plot_t(EM, HS, 'Switch-on HS', i) plt.suptitle('Switch-on HS')