Пример #1
0
def test_MDC_1virtualsource(par):
    """Dot-test and inversion for MDC operator of 1 virtual source
    """
    if par['twosided']:
        par['nt2'] = 2*par['nt'] - 1
    else:
        par['nt2'] = par['nt']
    v = 1500
    t0_m = 0.2
    theta_m = 0
    amp_m = 1.

    t0_G = (0.1, 0.2, 0.3)
    theta_G = (0, 0, 0)
    phi_G = (0, 0, 0)
    amp_G = (1., 0.6, 2.)

    # Create axis
    t, _, x, y = makeaxis(par)

    # Create wavelet
    wav = ricker(t[:41], f0=par['f0'])[0]

    # Generate model
    _, mwav = linear2d(x, t, v, t0_m, theta_m, amp_m, wav)
    # Generate operator
    _, Gwav = linear3d(x, y, t, v, t0_G, theta_G, phi_G, amp_G, wav)

    # Add negative part to data and model
    if par['twosided']:
        mwav = np.concatenate((np.zeros((par['nx'], par['nt'] - 1)), mwav), axis=-1)
        Gwav = np.concatenate((np.zeros((par['ny'], par['nx'], par['nt'] - 1)), Gwav), axis=-1)

    # Define MDC linear operator
    Gwav_fft = np.fft.fft(Gwav, par['nt2'], axis=-1)
    Gwav_fft = Gwav_fft[..., :par['nfmax']]

    MDCop = MDC(Gwav_fft, nt=par['nt2'], nv=1,
                dt=par['dt'], dr=par['dx'],
                twosided=par['twosided'], dtype='float32')
    dottest(MDCop, par['nt2']*par['ny'], par['nt2']*par['nx'])

    # Create data
    d = MDCop * mwav.flatten()
    d = d.reshape(par['ny'], par['nt2'])

    # Apply mdd function
    minv = MDD(Gwav[:, :, par['nt']-1:] if par['twosided'] else Gwav,
               d[:, par['nt']-1:] if par['twosided'] else d,
               dt=par['dt'], dr=par['dx'], nfmax=par['nfmax'],
               twosided=par['twosided'], adjoint=False, psf=False, dtype='complex64',
               dottest=False,
               **dict(damp=1e-10, iter_lim=50, show=1))
    assert_array_almost_equal(mwav, minv, decimal=2)
Пример #2
0
def test_MDC_1virtualsource(par):
    """Dot-test and inversion for MDC operator of 1 virtual source"""
    if par["twosided"]:
        par["nt2"] = 2 * par["nt"] - 1
    else:
        par["nt2"] = par["nt"]
    v = 1500
    it0_m = 25
    t0_m = it0_m * par["dt"]
    theta_m = 0
    amp_m = 1.0

    it0_G = np.array([25, 50, 75])
    t0_G = it0_G * par["dt"]
    theta_G = (0, 0, 0)
    phi_G = (0, 0, 0)
    amp_G = (1.0, 0.6, 2.0)

    # Create axis
    t, _, x, y = makeaxis(par)

    # Create wavelet
    wav = ricker(t[:41], f0=par["f0"])[0]

    # Generate model
    _, mwav = linear2d(x, t, v, t0_m, theta_m, amp_m, wav)
    # Generate operator
    _, Gwav = linear3d(x, y, t, v, t0_G, theta_G, phi_G, amp_G, wav)

    # Add negative part to data and model
    if par["twosided"]:
        mwav = np.concatenate((np.zeros((par["nx"], par["nt"] - 1)), mwav),
                              axis=-1)
        Gwav = np.concatenate((np.zeros(
            (par["ny"], par["nx"], par["nt"] - 1)), Gwav),
                              axis=-1)

    # Define MDC linear operator
    Gwav_fft = np.fft.fft(Gwav, par["nt2"], axis=-1)
    Gwav_fft = Gwav_fft[..., :par["nfmax"]]
    MDCop = MDC(
        Gwav_fft,
        nt=par["nt2"],
        nv=1,
        dt=par["dt"],
        dr=par["dx"],
        fftengine="fftw",
        twosided=par["twosided"],
        dtype="float32",
    )
    dottest(MDCop, par["nt2"] * par["ny"], par["nt2"] * par["nx"])
    # Create data
    d = MDCop * mwav.ravel()
    d = d.reshape(par["ny"], par["nt2"])

    # Check that events are at correct time and correct amplitude
    for it, amp in zip(it0_G, amp_G):
        ittot = it0_m + it
        if par["twosided"]:
            ittot += par["nt"] - 1
        assert (np.abs(d[par["ny"] // 2, ittot] -
                       np.abs(wav**2).sum() * amp_m * amp * par["nx"] *
                       par["dx"] * par["dt"] * np.sqrt(par["nt2"])) < 1e-2)

    # Check that MDC with prescaled=True gives same result
    MDCpreop = MDC(
        np.sqrt(par["nt2"]) * par["dt"] * par["dx"] * Gwav_fft,
        nt=par["nt2"],
        nv=1,
        dt=par["dt"],
        dr=par["dx"],
        fftengine="fftw",
        twosided=par["twosided"],
        prescaled=True,
        dtype="float32",
    )
    dottest(MDCpreop, par["nt2"] * par["ny"], par["nt2"] * par["nx"])
    dpre = MDCpreop * mwav.ravel()
    dpre = dpre.reshape(par["ny"], par["nt2"])
    assert_array_equal(d, dpre)

    # Apply mdd function
    minv = MDD(Gwav[:, :, par["nt"] - 1:] if par["twosided"] else Gwav,
               d[:, par["nt"] - 1:] if par["twosided"] else d,
               dt=par["dt"],
               dr=par["dx"],
               nfmax=par["nfmax"],
               twosided=par["twosided"],
               adjoint=False,
               psf=False,
               dtype="complex64",
               dottest=False,
               **dict(damp=1e-10, iter_lim=50, show=0))
    assert_array_almost_equal(mwav, minv, decimal=2)

    # Same tests for future behaviour (remove tests above in v2.0.0)
    MDCop = MDC(
        Gwav_fft.transpose(2, 0, 1),
        nt=par["nt2"],
        nv=1,
        dt=par["dt"],
        dr=par["dx"],
        twosided=par["twosided"],
        transpose=False,
        dtype="float32",
    )
    dottest(MDCop, par["nt2"] * par["ny"], par["nt2"] * par["nx"])
    mwav = mwav.T
    d = MDCop * mwav.ravel()
    d = d.reshape(par["nt2"], par["ny"])

    for it, amp in zip(it0_G, amp_G):
        ittot = it0_m + it
        if par["twosided"]:
            ittot += par["nt"] - 1
        assert (np.abs(d[ittot, par["ny"] // 2] -
                       np.abs(wav**2).sum() * amp_m * amp * par["nx"] *
                       par["dx"] * par["dt"] * np.sqrt(par["nt2"])) < 1e-2)

    minv = MDD(Gwav[:, :, par["nt"] - 1:] if par["twosided"] else Gwav,
               d[par["nt"] - 1:].T if par["twosided"] else d.T,
               dt=par["dt"],
               dr=par["dx"],
               nfmax=par["nfmax"],
               twosided=par["twosided"],
               add_negative=True,
               adjoint=False,
               psf=False,
               dtype="complex64",
               dottest=False,
               **dict(damp=1e-10, iter_lim=50, show=0))
    assert_array_almost_equal(mwav, minv.T, decimal=2)
Пример #3
0
def test_MDC_Nvirtualsources(par):
    """Dot-test and inversion for MDC operator of N virtual source
    """
    if par['twosided']:
        par['nt2'] = 2 * par['nt'] - 1
    else:
        par['nt2'] = par['nt']
    v = 1500
    it0_m = 25
    t0_m = it0_m * par['dt']
    theta_m = 0
    phi_m = 0
    amp_m = 1.

    it0_G = np.array([25, 50, 75])
    t0_G = it0_G * par['dt']
    theta_G = (0, 0, 0)
    phi_G = (0, 0, 0)
    amp_G = (1., 0.6, 2.)

    # Create axis
    t, _, x, y = makeaxis(par)

    # Create wavelet
    wav = ricker(t[:41], f0=par['f0'])[0]

    # Generate model
    _, mwav = linear3d(x, x, t, v, t0_m, theta_m, phi_m, amp_m, wav)

    # Generate operator
    _, Gwav = linear3d(x, y, t, v, t0_G, theta_G, phi_G, amp_G, wav)

    # Add negative part to data and model
    if par['twosided']:
        mwav = np.concatenate((np.zeros(
            (par['nx'], par['nx'], par['nt'] - 1)), mwav),
                              axis=-1)
        Gwav = np.concatenate((np.zeros(
            (par['ny'], par['nx'], par['nt'] - 1)), Gwav),
                              axis=-1)

    # Define MDC linear operator
    Gwav_fft = np.fft.fft(Gwav, par['nt2'], axis=-1)
    Gwav_fft = Gwav_fft[..., :par['nfmax']]

    MDCop = MDC(Gwav_fft,
                nt=par['nt2'],
                nv=par['nx'],
                dt=par['dt'],
                dr=par['dx'],
                twosided=par['twosided'],
                dtype='float32')
    dottest(MDCop, par['nt2'] * par['ny'] * par['nx'],
            par['nt2'] * par['nx'] * par['nx'])

    # Create data
    d = MDCop * mwav.flatten()
    d = d.reshape(par['ny'], par['nx'], par['nt2'])

    # Check that events are at correct time
    for it, amp in zip(it0_G, amp_G):
        ittot = it0_m + it
        if par['twosided']:
            ittot += par['nt'] - 1
        assert d[par['ny'] // 2, par['nx'] // 2, ittot] > \
               d[par['ny'] // 2, par['nx'] // 2, ittot - 1]
        assert d[par['ny'] // 2, par['nx'] // 2, ittot] > \
               d[par['ny'] // 2, par['nx'] // 2, ittot + 1]

    # Apply mdd function
    minv = MDD(Gwav[:, :, par['nt'] - 1:] if par['twosided'] else Gwav,
               d[:, :, par['nt'] - 1:] if par['twosided'] else d,
               dt=par['dt'],
               dr=par['dx'],
               nfmax=par['nfmax'],
               twosided=par['twosided'],
               adjoint=False,
               psf=False,
               dtype='complex64',
               dottest=False,
               **dict(damp=1e-10, iter_lim=50, show=1))
    assert_array_almost_equal(mwav, minv, decimal=2)

    # Same tests for future behaviour (remove tests above in v2.0.0)
    MDCop = MDC(Gwav_fft.transpose(2, 0, 1),
                nt=par['nt2'],
                nv=par['nx'],
                dt=par['dt'],
                dr=par['dx'],
                twosided=par['twosided'],
                transpose=False,
                dtype='float32')
    dottest(MDCop, par['nt2'] * par['ny'] * par['nx'],
            par['nt2'] * par['nx'] * par['nx'])

    mwav = mwav.transpose(2, 0, 1)
    d = MDCop * mwav.flatten()
    d = d.reshape(par['nt2'], par['ny'], par['nx'])

    for it, amp in zip(it0_G, amp_G):
        ittot = it0_m + it
        if par['twosided']:
            ittot += par['nt'] - 1
        assert d[ittot, par['ny'] // 2, par['nx'] // 2] > \
               d[ittot - 1, par['ny'] // 2, par['nx'] // 2]
        assert d[ittot, par['ny'] // 2, par['nx'] // 2] > \
               d[ittot + 1, par['ny'] // 2, par['nx'] // 2]

    minv = MDD(
        Gwav[:, :, par['nt'] - 1:] if par['twosided'] else Gwav,
        d[par['nt'] -
          1:].transpose(1, 2, 0) if par['twosided'] else d.transpose(1, 2, 0),
        dt=par['dt'],
        dr=par['dx'],
        nfmax=par['nfmax'],
        twosided=par['twosided'],
        add_negative=True,
        adjoint=False,
        psf=False,
        dtype='complex64',
        dottest=False,
        **dict(damp=1e-10, iter_lim=50, show=1))
    assert_array_almost_equal(mwav, minv.transpose(2, 0, 1), decimal=2)