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'
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')
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)
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
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'