|
|
|
|
Homework 3 |
|
|---|
|
data
Figure 2. 2-D synthetic data. |
|
|
|
model
Figure 3. (a) Synthetic model: curved reflectors in a |
|
|---|---|
|
|
|
|---|
|
vscan
Figure 4. Velocity semblance scan. |
|
|
|
|---|
|
vnmo
Figure 5. RMS velocity (a) and picked NMO velocity (b). |
|
|
|
|---|
|
dstack,zoff
Figure 6. (a) DMO stack. (b) Zero-offset section. |
|
|
|
|---|
|
tmig
Figure 7. Kirchhoff poststack time migration. |
|
|
|
dmig2
Figure 8. Time migration converted to depth, with reflectors overlaid. |
|
|---|---|
|
|
Figure 2 shows a synthetic reflection dataset computed
from a reflector model shown in Figure 3 and assuming a
velocity model with a constant vertical gradient
. A small amount of random noise is added to the synthetic data.
Figure 4 shows a conventional velocity semblance scan. Figure 5 compares the RMS velocity with the NMO velocity picked from the scan. Figure 6 compares a DMO stack and the zero-offset section from the data. Finally, Figures 7 and 8 show the result of Kirchhoff time migration before and after conversion from time to depth.
cd hw3/synth
scons viewto generate the figures and display them on your screen. If you are on a computer with multiple CPUs, you can also try
pscons viewto run certain computations in parallel.
from rsf.proj import *
# Generate a reflector model
layers = (
((0,2),(3.5,2),(4.5,2.5),(5,2.25),
(5.5,2),(6.5,2.5),(10,2.5)),
((0,2.5),(10,3.5)),
((0,3.2),(3.5,3.2),(5,3.7),
(6.5,4.2),(10,4.2)),
((0,4.5),(10,4.5))
)
nlays = len(layers)
for i in range(nlays):
inp = 'inp%d' % i
Flow(inp+'.asc',None,
'''
echo %s in=$TARGET
data_format=ascii_float n1=2 n2=%d
''' % (' '.join(map(lambda x: ' '.join(map(str,x)),
layers[i])),len(layers[i])))
dim1 = 'o1=0 d1=0.001 n1=10001'
Flow('lay1','inp0.asc',
'dd form=native | spline %s fp=0,0' % dim1)
Flow('lay2',None ,
'math %s output="2.5+x1*0.1" ' % dim1)
Flow('lay3','inp2.asc',
'dd form=native | spline %s fp=0,0' % dim1)
Flow('lay4',None ,'math %s output=4.5' % dim1)
Flow('lays','lay1 lay2 lay3 lay4',
'cat axis=2 ${SOURCES[1:4]}')
graph = '''
graph min1=2.5 max1=7.5 min2=0 max2=5
yreverse=y wantaxis=n wanttitle=n screenratio=1
'''
Plot('lays0','lays',graph + ' plotfat=10 plotcol=0')
Plot('lays1','lays',graph + ' plotfat=2 plotcol=7')
Plot('lays2','lays',graph + ' plotfat=2')
# Velocity
Flow('vofz',None,
'''
math output="1.5+0.36*x1"
d2=0.01 n2=1001 d1=0.01 n1=501
label1=Depth unit1=km
label2=Distance unit2=km
label=Velocity unit=km/s
''')
Plot('vofz',
'''
window min2=2.5 max2=7.5 |
grey color=j allpos=y bias=1.5
title=Model screenratio=1
''')
Result('model','vofz lays0 lays1','Overlay')
# Model data
Flow('dips','lays','deriv scale=y')
Flow('modl','lays dips',
'''
kirmod cmp=y dip=${SOURCES[1]}
nh=51 dh=0.1 h0=0
ns=201 ds=0.05 s0=0
freq=10 dt=0.004 nt=1501
vel=1.5 gradz=0.36 verb=y |
pow pow1=1 |
put d2=0.05
label1=Time unit1=s
label2=Half-Offset unit2=km
label3=Midpoint unit3=km
''',split=[1,10001], reduce='add')
# Add random noise
Flow('data','modl','noise var=1e-6 seed=101013')
Result('data',
'''
byte |
transp plane=23 |
grey3 flat=n frame1=750 frame2=100 frame3=10
title=Data point1=0.8 point2=0.8
''')
# Velocity estimation
#####################
Flow('voft','vofz',
'depth2time velocity=$SOURCE dt=0.004 nt=1501')
Flow('vrms','voft',
'''
add mode=p $SOURCE | causint |
math output="sqrt(input*0.004/(x1+0.004))"
''')
# Velocity scan
Flow('vscan','data',
'vscan v0=1.5 dv=0.02 nv=51 semblance=y',
split=[3,201], reduce='cat')
Result('vscan',
'''
byte allpos=y gainpanel=all |
transp plane=23 |
grey3 flat=n frame1=750 frame2=100 frame3=25
label1=Time unit1=s color=j
label3=Velocity unit3=km/s
label2=Midpoint unit2=km
title="Velocity Scan" point1=0.8 point2=0.8
''')
# Velocity picking
Flow('vnmo','vscan','pick rect1=100 rect2=10')
for vel in ('vrms','vnmo'):
Plot(vel,
'''
grey color=j allpos=y bias=1.5 clip=0.7
scalebar=y barreverse=y barunit=km/s
label2=Midpoint unit2=km label1=Time unit1=s
title="%s Velocity"
''' % vel[1:].upper())
Result('vnmo','vrms vnmo','SideBySideIso')
# Stacking
##########
Flow('nmo','data vnmo','nmo velocity=${SOURCES[1]}')
Flow('stack','nmo','stack')
# Using vrms is CHEATING
########################
Flow('nmo0','data vrms','nmo velocity=${SOURCES[1]}')
Flow('dstack','nmo0',
'''
window f1=250 |
logstretch | fft1 |
transp plane=13 memsize=1000 |
finstack |
transp memsize=1000 |
fft1 inv=y | logstretch inv=y |
pad beg1=250 | put unit1=s
''')
Flow('zoff','data','window n2=1')
stacks = {
'stack': 'Stack with NMO Velocity',
'dstack': 'DMO Stack',
'zoff': 'Zero Offset'
}
for stack in stacks.keys():
Result(stack,
'''
window min1=1.5 max1=5 min2=1 max2=9 |
grey title="%s"
''' % stacks[stack])
# Kirchhoff Migration
#####################
proj = Project()
prog = proj.Program('kirchhoff',['kirchhoff.c','aal.c'])
exe = str(prog[0])
# Using vrms is CHEATING
########################
Flow('tmig','dstack %s vrms' % prog[0],
'./${SOURCES[1]} vel=${SOURCES[2]} antialias=0')
Result('tmig',
'''
window min2=2.5 max2=7.5 |
grey title="Time Migration"
''')
# Using vofz is CHEATING
########################
Flow('dmig','tmig vofz',
'time2depth velocity=${SOURCES[1]}')
Plot('dmig',
'''
window max1=5 min2=2.5 max2=7.5 |
grey title="Time -> Depth" screenratio=1
label2=Distance label1=Depth unit1=km
''')
Result('dmig','Overlay')
Result('dmig2','dmig lays2','Overlay')
End()
|
/* 2-D Post-stack Kirchhoff time migration. */
#include <rsf.h>
#include "aal.h" /* antialising routines */
int main(int argc, char* argv[])
{
int nt, nx, nz, ix, iz, iy, i;
float *trace, **out, **v;
float x,z, dx, ti, tx, t0,dt, z0,dz, vi,aal;
sf_file inp, mig, vel;
sf_init (argc,argv);
inp = sf_input("in");
vel = sf_input("vel");
mig = sf_output("out");
if (!sf_histint(inp,"n1",&nt)) sf_error("No n1=");
if (!sf_histint(inp,"n2",&nx)) sf_error("No n2=");
if (!sf_histfloat(inp,"o1",&t0)) sf_error("No o1=");
if (!sf_histfloat(inp,"d1",&dt)) sf_error("No d1=");
if (!sf_histfloat(inp,"d2",&dx)) sf_error("No d2=");
if (!sf_getint("nz",&nz)) nz=nt;
if (!sf_getfloat("dz",&dz)) dz=dt;
if (!sf_getfloat("z0",&z0)) z0=t0;
if (!sf_getfloat("antialias",&aal)) aal=1.0;
/* antialiasing */
v = sf_floatalloc2(nz,nx);
sf_floatread(v[0],nz*nx,vel);
trace = sf_floatalloc(nt);
out = sf_floatalloc2(nz,nx);
for (i=0; i < nz*nx; i++) {
out[0][i] = 0.;
}
/* loop over input traces */
for (iy=0; iy < nx; iy++) {
sf_floatread (trace,nt,inp);
aal_doubint(nt,trace);
/* loop over output traces */
for (ix=0; ix < nx; ix++) {
x = (ix-iy)*dx;
/* loop over output time */
for (iz=0; iz < nz; iz++) {
z = z0 + iz*dz;
vi = v[ix][iz];
/* hypot(a,b) = sqrt(a*a+b*b) */
ti = hypotf(z,2.0*x/vi);
/* tx = |dt/dx| */
tx = 4.0*fabsf(x)/(vi*vi*(ti+dt));
out[ix][iz] +=
aal_pick(ti,tx*dx*aal,trace,nt,dt,t0);
}
}
}
sf_floatwrite(out[0],nz*nx,mig);
exit(0);
}
|
|
|---|
|
gulf
Figure 9. 2-D field dataset from the Gulf of Mexico. |
|
|
cd hw3/gulf
scons viewto generate the figures and display them on your screen.
from rsf.proj import *
# Download data
Fetch('beinew.HH','midpts')
# Set dimensions
Flow('gulf','beinew.HH',
'''
dd form=native |
put
label1=Time unit1=s
label2=Half-Offset unit2=km
label3=Midpoint unit3=km
''')
# Display
Result('gulf',
'''
byte |
transp plane=23 |
grey3 flat=n frame1=500 frame2=160 frame3=10
title=Data point1=0.8 point2=0.8
''')
End()
|
|
|
|
|
Homework 3 |