Example #1
0
def test_plane_land():
    modfile = resource_filename('telewavesim',
                                'examples/models/model_Audet2016.txt')
    model = ut.read_model(modfile)
    npts = 2000
    wvtype = 'P'
    dt = 0.05
    slow = 0.04
    baz = 0.
    ut.model2for(model)
    ut.wave2for(dt, slow, baz)
    yx, yy, yz = pw_f.plane_land(npts, model.nlay, np.array(wvtype, dtype='c'))
    ux = np.real(fft(yx))
    uy = np.real(fft(yy))
    uz = np.real(fft(yz))

    # seismogram should be maximized on vertical component
    assert np.max(np.abs(uz)) > np.max(np.abs(ux)) > np.max(np.abs(uy)), \
        'Failed! Energy is not maximized on vertical component'

    # tangential component should all be close to zero
    assert np.allclose(uy, np.zeros(len(uy))), 'non-zero values in uy'

    trxyz = ut.get_trxyz(ux, uy, uz, npts, dt, slow, baz, wvtype)
    tfs = ut.tf_from_xyz(trxyz)

    nt = tfs[0].stats.npts

    assert nt == npts

    # zero-lag should be maximized on radial component
    assert tfs[0].data[int(nt/2)] > tfs[1].data[int(nt/2)], \
        'Failed! Zero-lag is not maximized on radial component'
Example #2
0
def test_Porter2011():
    import matplotlib
    matplotlib.use('Agg')
    import numpy as np
    from obspy.core import Stream
    from telewavesim import utils as ut
    from telewavesim import wiggle as wg

    modfile = resource_filename('telewavesim',
                                'examples/models/model_Porter2011.txt')
    wvtype = 'P'
    npts = 3000  # Number of samples
    dt = 0.01  # Sample distance in seconds
    slow = 0.06  # Horizontal slowness (or ray parameter) in s/km
    baz = np.arange(0., 360., 10.)
    model = ut.read_model(modfile)
    trR = Stream()
    trT = Stream()
    # Loop over range of data
    for bb in baz:
        # Calculate the plane waves seismograms
        trxyz = ut.run_plane(model, slow, npts, dt, bb, wvtype=wvtype,
                             obs=False)
        # Then the transfer functions in Z-R-T coordinate system
        tfs = ut.tf_from_xyz(trxyz, pvh=False)
        # Append to streams
        trR.append(tfs[0])
        trT.append(tfs[1])
    # Set frequency corners in Hz
    f1 = 0.01
    f2 = 1.0
    # Filter to get wave-like traces
    trR.filter('bandpass', freqmin=f1, freqmax=f2, corners=2, zerophase=True)
    trT.filter('bandpass', freqmin=f1, freqmax=f2, corners=2, zerophase=True)
    # Stack over all traces
    trR_stack, trT_stack = ut.stack_all(trR, trT, pws=True)
    # Plot as wiggles
    with tempfile.TemporaryDirectory() as tempdir:
        wg.rf_wiggles_baz(trR, trT, trR_stack, trT_stack, 'test', btyp='baz',
                          scale=1.e3, tmin=-5., tmax=8., save=True,
                          ftitle=join(tempdir, 'porter2011.png'),
                          wvtype='P')
Example #3
0
def test_Audet2016():
    import matplotlib
    matplotlib.use('Agg')
    from obspy.core import Stream
    from obspy.signal.rotate import rotate_ne_rt
    from telewavesim import utils as ut
    from telewavesim import wiggle as wg
    modfile = resource_filename('telewavesim',
                                'examples/models/model_Audet2016.txt')
    wvtype = 'P'
    npts = 3000  # Number of samples
    dt = 0.01  # Sample distance in seconds
    dp = 2000.  # Deployment depth below sea level in meters
    c = 1.500    # P-wave velocity in salt water (km/s)
    rhof = 1027.  # Density of salt water (kg/m^3)
    slow = 0.06  # Horizontal slowness (or ray parameter) in s/km
    # Back-azimuth direction in degrees
    # (has no influence if model is isotropic)
    baz = 0.
    model = ut.read_model(modfile)
    assert list(model.rho) == [2800.0, 2800.0, 3200.0]
    t1 = ut.calc_ttime(model, slow, wvtype=wvtype)
    assert round(t1, 1) == 1.1
    trxyz = ut.run_plane(model, slow, npts, dt, baz=baz, wvtype=wvtype,
                         obs=True, dp=dp, c=c, rhof=rhof)
    tfs = ut.tf_from_xyz(trxyz, pvh=False)
    ntr = trxyz[0]  # North component
    etr = trxyz[1]  # East component
    ztr = trxyz[2]  # Vertical component
    rtr = ntr.copy()  # Radial component
    ttr = etr.copy()  # Transverse component
    rtr.data, ttr.data = rotate_ne_rt(ntr.data, etr.data, baz)
    strf = Stream(traces=[tfs[0], ztr, rtr])
    # Set frequency corners in Hz
    f1 = 0.1
    f2 = 1.0
    # Plot as wiggles
    with tempfile.TemporaryDirectory() as tempdir:
        wg.pw_wiggles_Audet2016(strf, t1=t1, tmax=10., f1=f1, f2=f2,
                                ftitle=join(tempdir, 'audet2016'),
                                scale=2.e-7, save=True)
Example #4
0
File: hk.py Project: shineusn/RfPy
    def _residuals(self):
        """ 
        Internal method to obtain residuals between observed and predicted
        receiver functions given the Moho depth and Vp/Vs obtained from
        the Hk stack.
        """
        from telewavesim import utils

        # Simple 1-layer model over half-space
        model = utils.Model([self.h0, 0.], [2800., 3300.], [self.vp, 8.0],
                            [self.vp / self.k0, 4.5], ['iso', 'iso'])

        # Parameters for run
        slow = [tr.stats.slow for tr in self.rfV1]
        npts = self.rfV1[0].stats.npts
        dt = self.rfV1[0].stats.delta

        trR = Stream()

        for sl in slow:
            trxyz = utils.run_plane(model, sl, npts, dt)
            tfs = utils.tf_from_xyz(trxyz,
                                    pvh=True,
                                    vp=self.vp,
                                    vs=self.vp / self.k0)
            tfs[0].data = np.fft.fftshift(tfs[0].data)
            trR.append(tfs[0])

        trR.filter('bandpass',
                   freqmin=0.05,
                   freqmax=0.5,
                   corners=2,
                   zerophase=True)

        # Get stream of residuals
        res = trR.copy()
        for i in range(len(res)):
            res[i].data = self.rfV1[i].data - trR[i].data
        return res
Example #5
0
def test_plane_land(load_params):

    yx, yy, yz = pw_f.plane_land(cf.nt, cf.nlay, np.array(cf.wvtype,
                                                          dtype='c'))
    ux = np.real(pyfftw.interfaces.numpy_fft.fft(yx))
    uy = np.real(pyfftw.interfaces.numpy_fft.fft(yy))
    uz = np.real(pyfftw.interfaces.numpy_fft.fft(yz))

    # seismogram should be maximized on vertical component
    assert np.max(np.abs(uz)) > np.max(np.abs(ux)) > np.max(np.abs(uy)), \
        'Failed! Energy is not maximized on vertical component'

    # tangential component should all be close to zero
    assert np.allclose(uy, np.zeros(len(uy))), 'non-zero values in uy'

    trxyz = ut.get_trxyz(ux, uy, uz)
    tfs = ut.tf_from_xyz(trxyz)

    nt = tfs[0].stats.npts

    # zero-lag should be maximized on radial component
    assert tfs[0].data[int(nt/2)] > tfs[1].data[int(nt/2)], \
        'Failed! Zero-lag is not maximized on radial component'