コード例 #1
0
            def get_args(freqtime, ft, ftarg):
                time, freq, ft, ftarg = utils.check_time(
                        freqtime, signal, ft, ftarg, verb)

                # Compute eta, zeta
                etaH = 1/res + np.outer(2j*np.pi*freq, epermH*epsilon_0)
                etaV = 1/(res*aniso*aniso) + np.outer(2j*np.pi*freq,
                                                      epermV*epsilon_0)
                zetaH = np.outer(2j*np.pi*freq, mpermH*mu_0)
                zetaV = np.outer(2j*np.pi*freq, mpermV*mu_0)

                # `model.fem`-signature changed on 9bed72b0
                # (29/04/2018; bef. v1.4.1)
                inp = (ab, off, angle, zsrc, zrec, lsrc, lrec, depth, freq,
                       etaH, etaV, zetaH, zetaV, False, False, ht, htarg,
                       msrc, mrec, loop_freq, loop_off)
                try:
                    if not VERSION2:
                        inp = (*inp[:17], use_ne_eval, *inp[17:])
                    out = model.fem(*inp)
                except VariableCatch:
                    out = model.fem(*inp[:17], True, *inp[17:])

                # `model.fem` returned in the beginning only fEM;
                # then (fEM, kcount) and finally (fEM, kcount, conv).
                if isinstance(out, tuple):
                    fEM = np.squeeze(out[0])
                else:
                    fEM = np.squeeze(out)

                return (fEM, time, freq, ftarg)
コード例 #2
0
ファイル: Survey.py プロジェクト: domfournier/simpegEM1D
    def set_frequency(self):
        """
        Compute Frequency reqired for frequency to time transform
        """
        if self.wave_type == "general":
            _, frequency, ft, ftarg = check_time(
                self.time_int, 0, 'sin',
                {'pts_per_dec': 3, 'fftfilt': self.fftfilt}, 0
            )
        elif self.wave_type == "stepoff":
            _, frequency, ft, ftarg = check_time(
                self.time, 0, 'sin',
                {'pts_per_dec': 3, 'fftfilt': self.fftfilt}, 0
            )
        else:
            raise Exception("wave_type must be either general or stepoff")

        self.frequency = frequency
        self.ftarg = ftarg
コード例 #3
0
ファイル: Survey.py プロジェクト: simpeg/simpegEM1D
    def set_frequency(self):
        """
        Compute Frequency reqired for frequency to time transform
        """
        if self.wave_type == "general":
            _, frequency, ft, ftarg = check_time(
                self.time_int, 0, 'sin',
                {'pts_per_dec': 3, 'fftfilt': self.fftfilt}, 0
            )
        elif self.wave_type == "stepoff":
            _, frequency, ft, ftarg = check_time(
                self.time, 0, 'sin',
                {'pts_per_dec': 3, 'fftfilt': self.fftfilt}, 0
            )
        else:
            raise Exception("wave_type must be either general or stepoff")

        self.frequency = frequency
        self.ftarg = ftarg
コード例 #4
0
ファイル: transform.py プロジェクト: Spencerx/empymod
            DC = test_time(res, off, 1000000, 1)
            resp = DC - resp
        return resp


# Time-domain solution
res = 20  # Ohm.m
off = 4000  # m
t = np.logspace(-1.5, 1, 20)  # s
tEM0 = test_time(res, off, t, 0)
tEM1 = test_time(res, off, t, 1)
tEM2 = test_time(res, off, t, -1)

# # B -- FFTLog # #
# Signal = 0
_, f, _, ftarg = utils.check_time(t, 0, 'fftlog', ['', [-3, 2]], 0)
fEM = test_freq(res, off, f)
fftlog0 = {'fEM': fEM, 'f': f, 'ftarg': ftarg}
# Signal = 1
_, f, _, ftarg = utils.check_time(t, 1, 'fftlog', [30, [-3, 2], -.5], 0)
fEM = test_freq(res, off, f)
fftlog1 = {'fEM': fEM, 'f': f, 'ftarg': ftarg}
# Signal = -1
_, f, _, ftarg = utils.check_time(t, -1, 'fftlog', [30, [-5, 2], .1], 0)
fEM = test_freq(res, off, f)
fftlog2 = {'fEM': fEM, 'f': f, 'ftarg': ftarg}

# # C -- FFHT # #
# Signal = 0
_, f, _, ftarg = utils.check_time(t, 0, 'cos', None, 0)
fEM = test_freq(res, off, f)
コード例 #5
0
inp4 = deepcopy(inp2)
inp4['loop_off'] = True
EM4, kcount4, _ = fem(**inp4)

# 5. 36/63
inp5 = deepcopy(inp2)
inp5['ab'] = 36
inp5['msrc'] = True
EM5, kcount5, _ = fem(**inp5)

# # B -- TEM # #
# Same parameters as for fem, except frequency, time, ab; plus signal

# ab = 22
time = [1, 2, 3]
time, freq, ft, ftarg = utils.check_time(time, 0, 'fftlog', None, 0)
frequency = utils.check_frequency(freq, res, aniso, epermH, epermV, mpermH,
                                  mpermV, 0)
freq, etaH, etaV, zetaH, zetaV = frequency

tinp = deepcopy(inp2)
tinp['freq'] = freq
tinp['etaH'] = etaH
tinp['etaV'] = etaV
tinp['zetaH'] = zetaH
tinp['zetaV'] = zetaV
fEM, _, _ = fem(**tinp)

# 6. TIME; SIGNAL = 0
inp6 = {
    'fEM': fEM,
コード例 #6
0
ファイル: test_utils.py プロジェクト: V107/empymod
def test_check_time(capsys):
    time = np.array([3])

    # # DLF # #
    # verbose
    _, f, ft, ftarg = utils.check_time(time, 0, 'dlf', {}, 4)
    out, _ = capsys.readouterr()
    assert "   time        [s] :  3" in out
    assert "   Fourier         :  DLF (Sine-Filter)" in out
    assert "> DLF type    :  Lagged Convolution" in out
    assert ft == 'dlf'
    assert ftarg['dlf'].name == filters.key_201_CosSin_2012().name
    assert ftarg['pts_per_dec'] == -1
    f1 = np.array([
        4.87534752e-08, 5.60237934e-08, 6.43782911e-08, 7.39786458e-08,
        8.50106448e-08, 9.76877807e-08, 1.12255383e-07, 1.28995366e-07,
        1.48231684e-07
    ])
    f2 = np.array([
        2.88109455e+04, 3.31073518e+04, 3.80444558e+04, 4.37178011e+04,
        5.02371788e+04, 5.77287529e+04, 6.63375012e+04, 7.62300213e+04,
        8.75977547e+04
    ])
    assert_allclose(f[:9], f1)
    assert_allclose(f[-9:], f2)
    assert_allclose(f.size, 201 + 3)
    assert ftarg['kind'] == 'sin'

    # filter-string and unknown parameter
    _, f, _, ftarg = utils.check_time(time, -1, 'dlf', {
        'dlf': 'key_201_CosSin_2012',
        'kind': 'cos',
        'notused': 1
    }, 4)
    out, _ = capsys.readouterr()
    outstr = "   time        [s] :  3\n"
    outstr += "   Fourier         :  DLF (Cosine-Filter)\n     > Filter"
    assert outstr in out
    assert "WARNING :: Unknown ftarg {'notused': 1} for method 'dlf'" in out
    assert ft == 'dlf'
    assert ftarg['dlf'].name == filters.key_201_CosSin_2012().name
    assert ftarg['pts_per_dec'] == -1
    assert_allclose(f[:9], f1)
    assert_allclose(f[-9:], f2)
    assert_allclose(f.size, 201 + 3)
    assert ftarg['kind'] == 'cos'

    # filter instance
    _, _, _, ftarg = utils.check_time(time, 1, 'dlf', {
        'dlf': filters.key_201_CosSin_2012(),
        'kind': 'sin'
    }, 0)
    assert ftarg['dlf'].name == filters.key_201_CosSin_2012().name
    assert ftarg['pts_per_dec'] == -1
    assert ftarg['kind'] == 'sin'

    # pts_per_dec
    out, _ = capsys.readouterr()  # clear buffer
    _, _, _, ftarg = utils.check_time(time, 0, 'dlf', {'pts_per_dec': 30}, 4)
    assert ftarg['dlf'].name == filters.key_201_CosSin_2012().name
    assert ftarg['pts_per_dec'] == 30
    assert ftarg['kind'] == 'sin'
    out, _ = capsys.readouterr()
    assert "     > DLF type    :  Splined, 30.0 pts/dec" in out

    # filter-string and pts_per_dec
    _, _, _, ftarg = utils.check_time(time, 0, 'dlf', {
        'dlf': 'key_81_CosSin_2009',
        'pts_per_dec': -1,
        'kind': 'cos'
    }, 4)
    out, _ = capsys.readouterr()
    assert "     > DLF type    :  Lagged Convolution" in out
    assert ftarg['dlf'].name == filters.key_81_CosSin_2009().name
    assert ftarg['pts_per_dec'] == -1
    assert ftarg['kind'] == 'cos'

    # pts_per_dec
    _, freq, _, ftarg = utils.check_time(time, 0, 'dlf', {
        'pts_per_dec': 0,
        'kind': 'sin'
    }, 4)
    out, _ = capsys.readouterr()
    assert "     > DLF type    :  Standard" in out
    assert ftarg['pts_per_dec'] == 0
    f_base = filters.key_201_CosSin_2012().base
    assert_allclose(np.ravel(f_base / (2 * np.pi * time[:, None])), freq)

    # filter-string and pts_per_dec
    _, _, _, ftarg = utils.check_time(time, 0, 'dlf', {
        'dlf': 'key_81_CosSin_2009',
        'pts_per_dec': 50,
        'kind': 'cos'
    }, 0)
    assert ftarg['dlf'].name == filters.key_81_CosSin_2009().name
    assert ftarg['pts_per_dec'] == 50
    assert ftarg['kind'] == 'cos'

    # just kind
    _, f, _, ftarg = utils.check_time(time, 0, 'dlf', {'kind': 'sin'}, 0)
    assert ftarg['pts_per_dec'] == -1
    assert_allclose(f[:9], f1)
    assert_allclose(f[-9:], f2)
    assert_allclose(f.size, 204)

    # Assert it can be called repetitively
    _, _ = capsys.readouterr()
    _, _, _, ftarg = utils.check_time(time, 0, 'dlf', {}, 1)
    _, _, _, _ = utils.check_time(time, 0, 'dlf', ftarg, 1)
    out, _ = capsys.readouterr()
    assert out == ""

    # # QWE # #
    # verbose
    _, f, ft, ftarg = utils.check_time(time, 0, 'qwe', {}, 4)
    out, _ = capsys.readouterr()
    outstr = "   Fourier         :  Quadrature-with-Extrapolation\n     > rtol"
    assert out[24:87] == outstr
    assert ft == 'qwe'
    assert ftarg['rtol'] == 1e-8
    assert ftarg['atol'] == 1e-20
    assert ftarg['nquad'] == 21
    assert ftarg['maxint'] == 200
    assert ftarg['pts_per_dec'] == 20
    assert ftarg['diff_quad'] == 100
    f1 = np.array([
        3.16227766e-03, 3.54813389e-03, 3.98107171e-03, 4.46683592e-03,
        5.01187234e-03, 5.62341325e-03, 6.30957344e-03, 7.07945784e-03,
        7.94328235e-03
    ])
    f2 = np.array([
        1.00000000e+02, 1.12201845e+02, 1.25892541e+02, 1.41253754e+02,
        1.58489319e+02, 1.77827941e+02, 1.99526231e+02, 2.23872114e+02,
        2.51188643e+02
    ])
    assert_allclose(f[:9], f1)
    assert_allclose(f[-9:], f2)
    assert_allclose(f.size, 99)
    assert ftarg['a'] is None
    assert ftarg['b'] is None
    assert ftarg['limit'] is None
    assert ftarg['sincos'] is np.sin

    # only limit
    _, _, _, ftarg = utils.check_time(time, 1, 'qwe', {'limit': 30}, 0)
    assert ftarg['rtol'] == 1e-8
    assert ftarg['atol'] == 1e-20
    assert ftarg['nquad'] == 21
    assert ftarg['maxint'] == 200
    assert ftarg['pts_per_dec'] == 20
    assert ftarg['diff_quad'] == 100
    assert ftarg['a'] is None
    assert ftarg['b'] is None
    assert ftarg['limit'] == 30
    assert ftarg['sincos'] is np.sin

    # all arguments
    _, _, _, ftarg = utils.check_time(
        time, -1, 'qwe', {
            'rtol': 1e-3,
            'atol': 1e-4,
            'nquad': 31,
            'maxint': 20,
            'pts_per_dec': 30,
            'diff_quad': 200,
            'a': 0.01,
            'b': 0.2,
            'limit': 100
        }, 3)
    out, _ = capsys.readouterr()
    assert "     > a     (quad):  0.01" in out
    assert "     > b     (quad):  0.2" in out
    assert "     > limit (quad):  100" in out
    assert ftarg['rtol'] == 1e-3
    assert ftarg['atol'] == 1e-4
    assert ftarg['nquad'] == 31
    assert ftarg['maxint'] == 20
    assert ftarg['pts_per_dec'] == 30
    assert ftarg['diff_quad'] == 200
    assert ftarg['a'] == 0.01
    assert ftarg['b'] == 0.2
    assert ftarg['limit'] == 100
    assert ftarg['sincos'] is np.cos

    # Assert it can be called repetitively
    _, _ = capsys.readouterr()
    _, _, _, ftarg = utils.check_time(time, 0, 'qwe', {}, 1)
    _, _, _, _ = utils.check_time(time, 0, 'qwe', ftarg, 1)
    out, _ = capsys.readouterr()
    assert out == ""

    # # FFTLog # #
    # verbose
    _, f, ft, ftarg = utils.check_time(time, 0, 'fftlog', {}, 4)
    out, _ = capsys.readouterr()
    outstr = "   Fourier         :  FFTLog\n     > pts_per_dec"
    assert outstr in out
    assert ft == 'fftlog'
    assert ftarg['pts_per_dec'] == 10
    assert_allclose(ftarg['add_dec'], np.array([-2., 1.]))
    assert ftarg['q'] == 0
    tres = np.array([
        0.3571562, 0.44963302, 0.56605443, 0.71262031, 0.89713582, 1.12942708,
        1.42186445, 1.79002129, 2.25350329, 2.83699255, 3.57156202, 4.49633019,
        5.66054433, 7.1262031, 8.97135818, 11.29427079, 14.2186445,
        17.90021288, 22.53503287, 28.36992554, 35.71562019, 44.96330186,
        56.60544331, 71.26203102, 89.71358175, 112.94270785, 142.18644499,
        179.00212881, 225.35032873, 283.69925539
    ])
    assert ftarg['mu'] == 0.5
    assert_allclose(ftarg['tcalc'], tres)
    assert_allclose(ftarg['dlnr'], 0.23025850929940461)
    assert_allclose(ftarg['kr'], 1.0610526667295022)
    assert_allclose(ftarg['rk'], 0.016449035064149849)

    fres = np.array([
        0.00059525, 0.00074937, 0.00094341, 0.00118768, 0.0014952, 0.00188234,
        0.00236973, 0.00298331, 0.00375577, 0.00472823, 0.00595249, 0.00749374,
        0.00943407, 0.01187678, 0.01495199, 0.01882343, 0.0236973, 0.02983313,
        0.03755769, 0.04728233, 0.05952493, 0.07493744, 0.09434065, 0.11876785,
        0.14951986, 0.18823435, 0.23697301, 0.29833134, 0.3755769, 0.47282331
    ])
    assert_allclose(f, fres, rtol=1e-5)

    # Several parameters
    _, _, _, ftarg = utils.check_time(time, -1, 'fftlog', {
        'pts_per_dec': 10,
        'add_dec': [-3, 4],
        'q': 2
    }, 0)
    assert ftarg['pts_per_dec'] == 10
    assert_allclose(ftarg['add_dec'], np.array([-3., 4.]))
    assert ftarg['q'] == 1  # q > 1 reset to 1...
    assert ftarg['mu'] == -0.5
    assert_allclose(ftarg['dlnr'], 0.23025850929940461)
    assert_allclose(ftarg['kr'], 0.94312869748639161)
    assert_allclose(ftarg['rk'], 1.8505737940600746)

    # Assert it can be called repetitively
    _, _ = capsys.readouterr()
    _, _, _, ftarg = utils.check_time(time, 0, 'fftlog', {}, 1)
    _, _, _, _ = utils.check_time(time, 0, 'fftlog', ftarg, 1)
    out, _ = capsys.readouterr()
    assert out == ""

    # # FFT # #
    # verbose
    _, f, ft, ftarg = utils.check_time(time, 0, 'fft', {}, 4)
    out, _ = capsys.readouterr()
    assert "Fourier         :  Fast Fourier Transform FFT\n     > dfreq" in out
    assert "     > pts_per_dec :  (linear)" in out
    assert ft == 'fft'
    assert ftarg['dfreq'] == 0.002
    assert ftarg['nfreq'] == 2048
    assert ftarg['ntot'] == 2048
    assert ftarg['pts_per_dec'] is None
    fres = np.array(
        [0.002, 0.004, 0.006, 0.008, 0.01, 4.088, 4.09, 4.092, 4.094, 4.096])
    assert_allclose(f[:5], fres[:5])
    assert_allclose(f[-5:], fres[-5:])

    # Several parameters
    _, _, _, ftarg = utils.check_time(time, 0, 'fft', {
        'dfreq': 1e-3,
        'nfreq': 2**15 + 1,
        'ntot': 3
    }, 0)
    assert ftarg['dfreq'] == 0.001
    assert ftarg['nfreq'] == 2**15 + 1
    assert ftarg['ntot'] == 2**16

    # Several parameters; pts_per_dec
    _, f, _, ftarg = utils.check_time(time, 0, 'fft', {'pts_per_dec': 5}, 3)
    out, _ = capsys.readouterr()
    assert "     > pts_per_dec :  5" in out
    assert ftarg['dfreq'] == 0.002
    assert ftarg['nfreq'] == 2048
    assert ftarg['ntot'] == 2048
    assert ftarg['pts_per_dec'] == 5
    outf = np.array([
        2.00000000e-03, 3.22098066e-03, 5.18735822e-03, 8.35419026e-03,
        1.34543426e-02, 2.16680888e-02, 3.48962474e-02, 5.62000691e-02,
        9.05096680e-02, 1.45764945e-01, 2.34753035e-01, 3.78067493e-01,
        6.08874043e-01, 9.80585759e-01, 1.57922389e+00, 2.54332480e+00,
        4.09600000e+00
    ])

    assert_allclose(f, outf)

    # Assert it can be called repetitively
    _, _ = capsys.readouterr()
    _, _, _, ftarg = utils.check_time(time, 0, 'fft', {}, 1)
    _, _, _, _ = utils.check_time(time, 0, 'fft', ftarg, 1)
    out, _ = capsys.readouterr()
    assert out == ""

    # # Various # #

    # minimum time
    _ = utils.check_time(0, 0, 'dlf', {
        'dlf': 'key_201_CosSin_2012',
        'kind': 'cos'
    }, 1)
    out, _ = capsys.readouterr()
    assert out[:21] == "* WARNING :: Times < "

    # Signal != -1, 0, 1
    with pytest.raises(ValueError):
        utils.check_time(time, -2, 'dlf', {}, 0)

    # ft != cos, sin, dlf, qwe, fftlog,
    with pytest.raises(ValueError):
        utils.check_time(time, 0, 'bla', {}, 0)

    # filter missing attributes
    with pytest.raises(AttributeError):
        utils.check_time(time, 0, 'dlf', {'dlf': 'key_201_2012'}, 1)

    # filter with wrong kind
    with pytest.raises(ValueError):
        utils.check_time(time, 0, 'dlf', {'kind': 'wrongkind'}, 1)
コード例 #7
0
ファイル: transform.py プロジェクト: victortocantins/empymod
            DC = test_time(res, off, 1000000, 1)
            resp = DC - resp
        return resp


# Time-domain solution
res = 20  # Ohm.m
off = 4000  # m
t = np.logspace(-1.5, 1, 20)  # s
tEM0 = test_time(res, off, t, 0)
tEM1 = test_time(res, off, t, 1)
tEM2 = test_time(res, off, t, -1)

# # B -- Fourier FFTLog # #
# Signal = 0
_, f, _, ftarg = utils.check_time(t, 0, 'fftlog', {'add_dec': [-3, 2]}, 0)
fEM = test_freq(res, off, f)
fourier_fftlog0 = {'fEM': fEM, 'f': f, 'ftarg': ftarg}
# Signal = 1
_, f, _, ftarg = utils.check_time(t, 1, 'fftlog', {
    'pts_per_dec': 30,
    'add_dec': [-3, 2],
    'q': -.5
}, 0)
fEM = test_freq(res, off, f)
fourier_fftlog1 = {'fEM': fEM, 'f': f, 'ftarg': ftarg}
# Signal = -1
_, f, _, ftarg = utils.check_time(t, -1, 'fftlog', {
    'pts_per_dec': 30,
    'add_dec': [-5, 2],
    'q': .1
コード例 #8
0
def test_check_time(capsys):
    time = np.array([3])

    # # FFHT # #
    # verbose
    _, f, ft, ftarg = utils.check_time(time, 0, 'ffht', None, 4)
    out, _ = capsys.readouterr()
    assert "   time        [s] :  3" in out
    assert "   Fourier         :  DLF (Sine-Filter)" in out
    assert "> DLF type    :  Lagged Convolution" in out
    assert ft == 'ffht'
    assert ftarg[0].name == filters.key_201_CosSin_2012().name
    assert ftarg[1] is -1
    f1 = np.array([
        4.87534752e-08, 5.60237934e-08, 6.43782911e-08, 7.39786458e-08,
        8.50106448e-08, 9.76877807e-08, 1.12255383e-07, 1.28995366e-07,
        1.48231684e-07
    ])
    f2 = np.array([
        2.88109455e+04, 3.31073518e+04, 3.80444558e+04, 4.37178011e+04,
        5.02371788e+04, 5.77287529e+04, 6.63375012e+04, 7.62300213e+04,
        8.75977547e+04
    ])
    assert_allclose(f[:9], f1)
    assert_allclose(f[-9:], f2)
    assert_allclose(f.size, 201 + 3)
    assert ftarg[2] == 'sin'

    # [filter str]
    _, f, _, ftarg = utils.check_time(time, -1, 'cos', 'key_201_CosSin_2012',
                                      4)
    out, _ = capsys.readouterr()
    outstr = "   time        [s] :  3\n"
    outstr += "   Fourier         :  DLF (Cosine-Filter)\n     > Filter"
    assert out[:79] == outstr
    assert ft == 'ffht'
    assert ftarg[0].name == filters.key_201_CosSin_2012().name
    assert ftarg[1] is -1
    assert_allclose(f[:9], f1)
    assert_allclose(f[-9:], f2)
    assert_allclose(f.size, 201 + 3)
    assert ftarg[2] == 'cos'

    # [filter inst]
    _, _, _, ftarg = utils.check_time(time, 1, 'sin',
                                      filters.key_201_CosSin_2012(), 0)
    assert ftarg[0].name == filters.key_201_CosSin_2012().name
    assert ftarg[1] is -1
    assert ftarg[2] == 'sin'

    # ['', pts_per_dec]
    out, _ = capsys.readouterr()  # clear buffer
    _, _, _, ftarg = utils.check_time(time, 0, 'ffht', ['', 30], 4)
    assert ftarg[0].name == filters.key_201_CosSin_2012().name
    assert ftarg[1] == 30
    assert ftarg[2] == 'sin'
    out, _ = capsys.readouterr()
    assert "     > DLF type    :  Splined, 30 pts/dec" in out

    # [filter str, pts_per_dec]
    _, _, _, ftarg = utils.check_time(time, 0, 'cos',
                                      ['key_81_CosSin_2009', -1], 4)
    out, _ = capsys.readouterr()
    assert "     > DLF type    :  Lagged Convolution" in out
    assert ftarg[0].name == filters.key_81_CosSin_2009().name
    assert ftarg[1] == -1
    assert ftarg[2] == 'cos'

    # ['', 0]
    _, freq, _, ftarg = utils.check_time(time, 0, 'sin', {'pts_per_dec': 0}, 4)
    out, _ = capsys.readouterr()
    assert "     > DLF type    :  Standard" in out
    assert ftarg[1] == 0
    f_base = filters.key_201_CosSin_2012().base
    assert_allclose(np.ravel(f_base / (2 * np.pi * time[:, None])), freq)

    # [filter str, pts_per_dec] :: dict, deprecated
    _, _, _, ftarg = utils.check_time(time, 0, 'cos', {
        'fftfilt': 'key_81_CosSin_2009',
        'pts_per_dec': 50
    }, 0)
    assert ftarg[0].name == filters.key_81_CosSin_2009().name
    assert ftarg[1] == 50
    assert ftarg[2] == 'cos'

    # ['', 0]  :: dict, deprecated
    _, f, _, ftarg = utils.check_time(time, 0, 'sin', {'pts_per_dec': None}, 0)
    assert ftarg[1] == -1
    assert_allclose(f[:9], f1)
    assert_allclose(f[-9:], f2)
    assert_allclose(f.size, 204)

    # # QWE # #
    # verbose
    _, f, ft, ftarg = utils.check_time(time, 0, 'qwe', None, 4)
    out, _ = capsys.readouterr()
    outstr = "   Fourier         :  Quadrature-with-Extrapolation\n     > rtol"
    assert out[24:87] == outstr
    assert ft == 'fqwe'
    assert_allclose(ftarg[:-4], [1e-8, 1e-20, 21, 200, 20, 100])
    f1 = np.array([
        3.16227766e-03, 3.54813389e-03, 3.98107171e-03, 4.46683592e-03,
        5.01187234e-03, 5.62341325e-03, 6.30957344e-03, 7.07945784e-03,
        7.94328235e-03
    ])
    f2 = np.array([
        1.00000000e+02, 1.12201845e+02, 1.25892541e+02, 1.41253754e+02,
        1.58489319e+02, 1.77827941e+02, 1.99526231e+02, 2.23872114e+02,
        2.51188643e+02
    ])
    assert_allclose(f[:9], f1)
    assert_allclose(f[-9:], f2)
    assert_allclose(f.size, 99)
    assert ftarg[-4] is None
    assert ftarg[-3] is None
    assert ftarg[-2] is None
    assert ftarg[-1] is np.sin

    # only last argument
    _, _, _, ftarg = utils.check_time(time, 1, 'fqwe',
                                      ['', '', '', '', '', '', '', '', 30], 0)
    assert_allclose(ftarg[:-4], [1e-8, 1e-20, 21, 200, 20, 100])
    assert ftarg[-4] is None
    assert ftarg[-3] is None
    assert ftarg[-2] == 30
    assert ftarg[-1] is np.sin

    # all arguments
    _, _, _, ftarg = utils.check_time(
        time, -1, 'qwe', [1e-3, 1e-4, 31, 20, 30, 200, 0.01, .2, 100], 3)
    out, _ = capsys.readouterr()
    assert "     > a     (quad):  0.01" in out
    assert "     > b     (quad):  0.2" in out
    assert "     > limit (quad):  100" in out
    assert_allclose(ftarg[:-1], [1e-3, 1e-4, 31, 20, 30, 200, 0.01, .2, 100])
    assert ftarg[-1] is np.cos

    # # FFTLog # #
    # verbose
    _, f, ft, ftarg = utils.check_time(time, 0, 'fftlog', None, 4)
    out, _ = capsys.readouterr()
    outstr = "   Fourier         :  FFTLog\n     > pts_per_dec"
    assert outstr in out
    assert ft == 'fftlog'
    assert ftarg[0] == 10
    assert_allclose(ftarg[1], np.array([-2., 1.]))
    assert ftarg[2] == 0
    tres = np.array([
        0.3571562, 0.44963302, 0.56605443, 0.71262031, 0.89713582, 1.12942708,
        1.42186445, 1.79002129, 2.25350329, 2.83699255, 3.57156202, 4.49633019,
        5.66054433, 7.1262031, 8.97135818, 11.29427079, 14.2186445,
        17.90021288, 22.53503287, 28.36992554, 35.71562019, 44.96330186,
        56.60544331, 71.26203102, 89.71358175, 112.94270785, 142.18644499,
        179.00212881, 225.35032873, 283.69925539
    ])
    assert ftarg[3] == 0.5
    assert_allclose(ftarg[4], tres)
    assert_allclose(
        ftarg[5:],
        [0.23025850929940461, 1.0610526667295022, 0.016449035064149849])

    fres = np.array([
        0.00059525, 0.00074937, 0.00094341, 0.00118768, 0.0014952, 0.00188234,
        0.00236973, 0.00298331, 0.00375577, 0.00472823, 0.00595249, 0.00749374,
        0.00943407, 0.01187678, 0.01495199, 0.01882343, 0.0236973, 0.02983313,
        0.03755769, 0.04728233, 0.05952493, 0.07493744, 0.09434065, 0.11876785,
        0.14951986, 0.18823435, 0.23697301, 0.29833134, 0.3755769, 0.47282331
    ])
    assert_allclose(f, fres, rtol=1e-5)

    # Several parameters
    _, _, _, ftarg = utils.check_time(time, -1, 'fftlog', [10, [-3, 4], 2], 0)
    assert ftarg[0] == 10
    assert_allclose(ftarg[1], np.array([-3., 4.]))
    assert ftarg[2] == 1  # q > 1 reset to 1...
    assert ftarg[3] == -0.5
    assert_allclose(
        ftarg[5:],
        [0.23025850929940461, 0.94312869748639161, 1.8505737940600746])

    # # FFT # #
    # verbose
    _, f, ft, ftarg = utils.check_time(time, 0, 'fft', None, 4)
    out, _ = capsys.readouterr()
    assert "Fourier         :  Fast Fourier Transform FFT\n     > dfreq" in out
    assert "     > pts_per_dec :  (linear)" in out
    assert ft == 'fft'
    assert ftarg[0] == 0.002
    assert ftarg[1] == 2048
    assert ftarg[2] == 2048
    assert ftarg[3] is None
    fres = np.array(
        [0.002, 0.004, 0.006, 0.008, 0.01, 4.088, 4.09, 4.092, 4.094, 4.096])
    assert_allclose(f[:5], fres[:5])
    assert_allclose(f[-5:], fres[-5:])

    # Several parameters
    _, _, _, ftarg = utils.check_time(time, 0, 'fft', [1e-3, 2**15 + 1, 3], 0)
    assert ftarg[0] == 0.001
    assert ftarg[1] == 2**15 + 1
    assert ftarg[2] == 2**16

    # Several parameters; pts_per_dec
    _, f, _, ftarg = utils.check_time(time, 0, 'fft', ['', '', '', 5], 3)
    out, _ = capsys.readouterr()
    assert "     > pts_per_dec :  5" in out
    assert ftarg[0] == 0.002
    assert ftarg[1] == 2048
    assert ftarg[2] == 2048
    assert ftarg[3] == 5
    outf = np.array([
        2.00000000e-03, 3.22098066e-03, 5.18735822e-03, 8.35419026e-03,
        1.34543426e-02, 2.16680888e-02, 3.48962474e-02, 5.62000691e-02,
        9.05096680e-02, 1.45764945e-01, 2.34753035e-01, 3.78067493e-01,
        6.08874043e-01, 9.80585759e-01, 1.57922389e+00, 2.54332480e+00,
        4.09600000e+00
    ])

    assert_allclose(f, outf)

    # # Various # #

    # minimum time
    _ = utils.check_time(0, 0, 'cos', 'key_201_CosSin_2012', 1)
    out, _ = capsys.readouterr()
    assert out[:21] == "* WARNING :: Times < "

    # Signal != -1, 0, 1
    with pytest.raises(ValueError):
        utils.check_time(time, -2, 'ffht', None, 0)

    # ft != cos, sin, ffht, qwe, hqwe, fftlog,
    with pytest.raises(ValueError):
        utils.check_time(time, 0, 'fht', None, 0)
コード例 #9
0
    def setup_cache(self):
        """setup_cache is not parametrized, so we do it manually. """

        data = {}
        for size in self.params[0]:  # size
            tdat = {}

            # One big, one small model
            if size == 'Small':
                freqtime = np.array([2.])
            else:
                freqtime = np.logspace(-1, 1, 11)

            # Define survey
            lsrc = 1
            lrec = 1
            angle = np.array([0])
            off = np.array([5000])
            ab = 11
            msrc = False
            mrec = False

            if VERSION2:
                zsrc = 250.
                zrec = 300.
            else:
                zsrc = np.array([250.])  # Not sure if this distinction
                zrec = np.array([300.])  # is actually needed
                use_ne_eval = False

            # Define model
            depth = np.array([-np.infty, 0, 300, 2000, 2100])
            res = np.array([2e14, .3, 1, 50, 1])
            aniso = np.ones(res.shape)
            epermH = np.ones(res.shape)
            epermV = np.ones(res.shape)
            mpermH = np.ones(res.shape)
            mpermV = np.ones(res.shape)

            # Other parameters
            verb = 0
            loop_freq = True
            loop_off = False
            signal = 0

            # Get Hankel arguments
            if VERSION2:
                ht, htarg = utils.check_hankel(
                        'dlf', {'pts_per_dec': -1}, verb)
            else:
                # `pts_per_dec` changed at 9bed72b0 (29/04/2018; bef. v1.4.1)
                try:
                    ht, htarg = utils.check_hankel('fht', ['', -1], verb)
                except VariableCatch:
                    # `check_hankel`-signature changed at c73d6647
                    try:
                        ht, htarg = utils.check_hankel('fht', None, verb)
                    except VariableCatch:
                        ht, htarg = utils.check_hankel('fht', None, ab, verb)

            # Get frequency-domain stuff for time-domain computation
            def get_args(freqtime, ft, ftarg):
                time, freq, ft, ftarg = utils.check_time(
                        freqtime, signal, ft, ftarg, verb)

                # Compute eta, zeta
                etaH = 1/res + np.outer(2j*np.pi*freq, epermH*epsilon_0)
                etaV = 1/(res*aniso*aniso) + np.outer(2j*np.pi*freq,
                                                      epermV*epsilon_0)
                zetaH = np.outer(2j*np.pi*freq, mpermH*mu_0)
                zetaV = np.outer(2j*np.pi*freq, mpermV*mu_0)

                # `model.fem`-signature changed on 9bed72b0
                # (29/04/2018; bef. v1.4.1)
                inp = (ab, off, angle, zsrc, zrec, lsrc, lrec, depth, freq,
                       etaH, etaV, zetaH, zetaV, False, False, ht, htarg,
                       msrc, mrec, loop_freq, loop_off)
                try:
                    if not VERSION2:
                        inp = (*inp[:17], use_ne_eval, *inp[17:])
                    out = model.fem(*inp)
                except VariableCatch:
                    out = model.fem(*inp[:17], True, *inp[17:])

                # `model.fem` returned in the beginning only fEM;
                # then (fEM, kcount) and finally (fEM, kcount, conv).
                if isinstance(out, tuple):
                    fEM = np.squeeze(out[0])
                else:
                    fEM = np.squeeze(out)

                return (fEM, time, freq, ftarg)

            # Define function name of transform
            fft_and_ffht = True
            if VERSION2:
                name_dlf = 'fourier_dlf'
                name_fqwe = 'fourier_qwe'
                name_fftlog = 'fourier_fftlog'
                name_fft = 'fourier_fft'
            else:
                name_fqwe = 'fqwe'
                name_fftlog = 'fftlog'
                name_fft = 'fft'
                # ffht used to be fft until the introduction of fft
                try:
                    getattr(transform, 'ffht')
                    name_ffht = 'ffht'
                except VariableCatch:
                    fft_and_ffht = False
                    name_ffht = 'fft'
                name_dlf = name_ffht

            # Store functions
            tdat['fourier_dlf'] = getattr(transform, name_dlf)
            tdat['fourier_qwe'] = getattr(transform, name_fqwe)
            tdat['fourier_fftlog'] = getattr(transform, name_fftlog)
            tdat['fourier_fft'] = getattr(transform, name_fft)

            # Check default pts_per_dec to see if new or old case
            if VERSION2:
                old_case = False
            else:
                try:
                    test = utils.check_time(freqtime, signal, 'sin',
                                            ['key_201_CosSin_2012', 'test'], 0)
                    old_case = test[3][1] is None
                except VariableCatch:
                    old_case = True

            # Get fourier_dlf arguments
            if old_case and not VERSION2:
                tdat['dlf_st'] = ()  # Standard was not possible in old case
                tdat['dlf_la'] = get_args(freqtime, name_ffht, None)
            elif VERSION2:
                tdat['dlf_st'] = get_args(
                        freqtime, 'dlf',
                        {'dlf': 'key_201_CosSin_2012', 'pts_per_dec': 0})
                tdat['dlf_la'] = get_args(
                        freqtime, 'dlf',
                        {'dlf': 'key_201_CosSin_2012', 'pts_per_dec': -1})
            else:
                tdat['dlf_st'] = get_args(
                        freqtime, name_ffht, ['key_201_CosSin_2012', 0])
                tdat['dlf_la'] = get_args(
                        freqtime, name_ffht, ['key_201_CosSin_2012', -1])

            if VERSION2:
                tdat['dlf_sp'] = get_args(
                        freqtime, 'dlf',
                        {'dlf': 'key_201_CosSin_2012', 'pts_per_dec': 10})

                # Get fourier_qwe arguments
                tdat['qwe'] = get_args(freqtime, 'qwe', {'pts_per_dec': 10})

                # Get fourier_fftlog arguments
                tdat['fftlog'] = get_args(freqtime, 'fftlog', {})

                # Get fourier_fft arguments
                tdat['fft'] = get_args(freqtime, 'fft', {})

            else:
                tdat['dlf_sp'] = get_args(
                        freqtime, name_ffht, ['key_201_CosSin_2012', 10])

                # Get fourier_qwe arguments
                tdat['qwe'] = get_args(freqtime, 'fqwe', ['', '', '', '', 10])

                # Get fourier_fftlog arguments
                tdat['fftlog'] = get_args(freqtime, 'fftlog', None)

                # Get fourier_fft arguments
                if fft_and_ffht:
                    tdat['fft'] = get_args(freqtime, 'fft', None)
                else:
                    tdat['fft'] = ()  # Will fail

            data[size] = tdat

        return data