Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
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)
Exemplo n.º 4
0
    '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])

###############################################################################
Exemplo n.º 5
0
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)
Exemplo n.º 6
0
    '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)
Exemplo n.º 7
0
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')