![]() |
![]() |
![]() |
![]() | Homework 4 | ![]() |
![]() |
![]() |
---|
data
Figure 1. 2-D synthetic data. |
![]() ![]() ![]() |
model
Figure 2. (a) Synthetic model: curved reflectors in a ![]() |
![]() |
---|---|
![]() ![]() ![]() |
![]() |
---|
mig
Figure 3. Initial constant-velocity migration. |
![]() ![]() ![]() |
dmig2
Figure 4. Time migration converted to depth, with reflectors overlaid. |
![]() |
---|---|
![]() ![]() ![]() |
Figure 6 shows a synthetic reflection dataset computed
from a reflector model shown in Figure 2 and assuming a
velocity model with a constant vertical gradient
. A small amount of random noise is added to the data.
Figure 3 shows an initial prestack common-offset time migration using a constant velocity of 1.5 km/s. Figure 4 shows the result of prestack time migration after velocity continuation, extraction of a velocity slice, and conversion from time to depth.
cd hw4/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.
pscons velcon.vplto display a movie of the velocity continuation process.
pscons semb.vplto display a movie slicing through a semblance cube computed from velocity continuation.
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.01 n1=1001' 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.25*x1" d2=0.05 n2=201 d1=0.01 n1=501 label1=Depth unit1=km label2=Distance unit2=km label=Velocity unit=km/s ''') Plot('vofz', ''' window min2=2.75 max2=7.25 | 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 dscale=100') 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.25 verb=y | tpow tpow=1 | put d2=0.05 label3=Midpoint unit3=km ''',split=[1,1001], reduce='add') # Add random noise Flow('data','modl','noise var=1e-6 seed=101811') Result('data', ''' byte | transp plane=23 | grey3 flat=n frame1=750 frame2=100 frame3=10 label1=Time unit1=s label3=Half-Offset unit3=km title=Data point1=0.8 point2=0.8 ''') # Initial constant-velocity migration ##################################### Flow('mig','data', ''' transp plane=23 | spray axis=3 n=1 d=0.1 o=0 | preconstkirch vel=1.5 | halfint inv=1 adj=1 ''',split=[2,51],reduce='cat axis=4') Result('mig', ''' byte | window | grey3 flat=n frame1=750 frame2=100 frame3=10 label1=Time unit1=s label3=Half-Offset unit3=km title="Initial Migration" point1=0.8 point2=0.8 ''') # Velocity continuation ####################### Flow('thk','mig', 'window | transp plane=23 | cosft sign3=1') Flow('velconk','thk', 'fourvc nv=81 dv=0.01 v0=1.5 verb=y', split=[3,201]) Flow('velcon','velconk','cosft sign3=-1') Plot('velcon', ''' transp plane=23 memsize=1000 | window min2=2.5 max2=7.5 | grey title="Velocity Continuation" ''',view=1) # Continue data squared Flow('thk2','mig', ''' mul $SOURCE | window | transp plane=23 | cosft sign3=1 ''') Flow('velconk2','thk2', 'fourvc nv=81 dv=0.01 v0=1.5 verb=y', split=[3,201]) Flow('velcon2','velconk2','cosft sign3=-1') # Compute semblance Flow('semb','velcon velcon2', ''' mul $SOURCE | divn den=${SOURCES[1]} rect1=25 ''',split=[3,201]) Plot('semb', ''' byte gainpanel=all allpos=y | transp plane=23 | grey3 flat=n frame1=750 frame2=0 frame3=48 label1=Time unit1=s color=j label3=Velocity unit3=km/s movie=2 dframe=5 title=Semblance point1=0.8 point2=0.8 ''',view=1) # Extracting images ################### 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))" ''') # Using vrms is CHEATING ######################## Flow('slice','velcon vrms','slice pick=${SOURCES[1]}') # Using vofz is CHEATING ######################## Flow('dmig','slice 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() |
Figure 5 shows a famous Sigsbee synthetic velocity model. We will focus on the left part of the model, which is appropriate for time-domain imaging. A synthetically generated zero-offset section is shown in Figure 6.
Our processing strategy is to extract diffractions from the data (Figure 7) and to image them using zero-offset velocity continuation (Figure 8). In addition, we are going to analyze the image by expanding it in dip angles by using dip-angle migration (Figure 9).
vel
Figure 5. Sigsbee velocity model. |
![]() |
---|---|
![]() ![]() ![]() |
![]() |
---|
data
Figure 6. Zero-offset synthetic data. |
![]() ![]() ![]() |
![]() |
---|
dif
Figure 7. Diffractions extracted from the data by plane-wave destruction. |
![]() ![]() ![]() |
![]() |
---|
dimage
Figure 8. Time-migrated image of diffractions. |
![]() ![]() ![]() |
![]() |
---|
anglemig
Figure 9. Dip angle gathers from constant-velocity angle-domain migration. |
![]() ![]() ![]() |
cd hw4/sigsbee
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.
pscons anglemig.viewDo you notice a difference?
from rsf.proj import * # Download velocity model from the data server ############################################## vstr = 'sigsbee2a_stratigraphy.sgy' Fetch(vstr,'sigsbee') Flow('zvstr',vstr,'segyread read=data') Flow('vel','zvstr', ''' put d1=0.00762 o2=3.048 d2=0.00762 label1=Depth unit1=km label2=Distance unit2=km label=Velocity unit=km/s | scale dscale=0.0003048 ''') Result('vel', ''' grey wanttitle=n color=j allpos=y screenratio=0.3125 screenht=4 labelsz=4 scalebar=y barreverse=y ''') # Window a portion Flow('vel2','vel','window max2=9.5') dt = 0.002 nt = 5001 # Convert to RMS Flow('voft','vel2', 'depth2time velocity=$SOURCE dt=%g nt=%d' % (dt,nt)) Flow('vrms','voft', ''' add mode=p $SOURCE | causint | math output="sqrt(input*%g/(x1+%g))" | smooth rect2=10 | window j2=2 ''' % (dt,dt)) # Download zero-offset from the data server ########################################### Fetch('sigexp_ns.rsf','sigsbee') Flow('data','sigexp_ns.rsf', ''' dd form=native | bandpass flo=2 fhi=60 | window max2=9.5 j1=2 j2=2 n1=%d | costaper nw1=50 nw2=50 ''' % nt) Result('data', 'window min1=3 | grey title="Zero-Offset Data" ') # Slope estimation Flow('dip','data','fdip rect1=100 rect2=10') Result('dip', ''' grey color=j scalebar=y title="Dominant Slope" barlabel=Slope barunit=samples ''') # Plane-wave destruction Flow('dif','data dip','pwd dip=${SOURCES[1]}') Result('dif', ''' window min1=3 | grey title="Separated Diffractions" ''') # Velocity continuation Flow('fourier','dif','pad n2=1025 | cosft sign2=1') Flow('velconf','fourier', ''' put o3=0 | stolt vel=1.4 | spray axis=2 n=1 o=0 d=1 | fourvc pad2=8192 nv=61 dv=0.02 v0=1.4 verb=y ''',split=[2,1025],reduce='cat axis=3') Flow('velcon','velconf', ''' transp plane=23 memsize=1000 | cosft sign2=-1 | window n2=424 | transp plane=23 memsize=1000 ''') # Picking a slice ################# Flow('dimage','velcon vrms', 'slice pick=${SOURCES[1]}') Result('dimage', ''' window min1=3 | grey title="Imaged Diffractions" ''') # Angle-gather migration ######################## proj = Project() prog = proj.Program('anglemig.c') Flow('anglemig','dif %s' % prog[0], './${SOURCES[1]} vel=2 na=90 a0=-45 da=1') Result('anglemig', ''' window min2=2 | transp | transp plane=23 memsize=1000 | byte gainpanel=all | grey3 frame1=1000 frame2=200 frame3=60 unit3="ô_" title="Dip Angle Gathers" point1=0.7 point2=0.7 ''') End() |
/* 2-D angle-domain zero-offset migration. */ #include <rsf.h> static float get_sample (float **dat, float t, float y, float t0, float y0, float dt, float dy, int nt, int ny) /* extract data sample by linear interpolation */ { int it, iy; y = (y - y0)/dy; iy = floorf (y); y -= (float)iy; if (iy < 0 || iy >= (ny - 1)) return 0.0; t = (t - t0)/dt; it = floorf (t); t -= (float)it; if (it < 0 || it >= (nt - 1)) return 0.0; return (dat[iy][it]*(1.0 - y)*(1.0 - t) + dat[iy][it + 1]*(1.0 - y)*t + dat[iy + 1][it]*y*(1.0 - t) + dat[iy + 1][it + 1]*y*t); } int main (int argc, char* argv[]) { int it, nt, ix, nx, ia, na; float dt, vel, da, a0, dx, z, t, x, y, a; float **dat, *img; sf_file data, imag; sf_init (argc, argv); data = sf_input ("in"); imag = sf_output ("out"); /* get dimensions */ if (!sf_histint (data, "n1", &nt)) sf_error ("n1"); if (!sf_histint (data, "n2", &nx)) sf_error ("n2"); if (!sf_histfloat (data, "d1", &dt)) sf_error ("d1"); if (!sf_histfloat (data, "d2", &dx)) sf_error ("d2"); if (!sf_getint("na",&na)) sf_error("Need na="); /* number of angles */ if (!sf_getfloat("da",&da)) sf_error("Need da="); /* angle increment */ if (!sf_getfloat("a0",&a0)) sf_error("Need a0="); /* initial angle */ sf_shiftdim(data, imag, 1); sf_putint(imag,"n1",na); sf_putfloat(imag,"d1",da); sf_putfloat(imag,"o1",a0); sf_putstring(imag,"label1","Angle"); /* degrees to radians */ a0 *= SF_PI/180.; da *= SF_PI/180.; if (!sf_getfloat("vel",&vel)) vel=1.5; /* constant velocity */ dat = sf_floatalloc2(nt,nx); sf_floatread (dat[0],nt*nx, data); img = sf_floatalloc (na); /* loop over image location */ for (ix = 0; ix < nx; ix++) { x = ix*dx; sf_warning ("CMP %d of %d;", ix, nx); /* loop over image time */ for (it = 0; it < nt; it++) { z = it*dt; /* loop over angle */ for (ia = 0; ia < na; ia++) { a = a0+ia*da; t = z/cosf(a); /* escape time */ y = x+0.5*vel*t*sinf(a); /* escape location */ img[ia] = get_sample (dat,t,y,0.,0., dt,dx,nt,nx); } /* ia */ sf_floatwrite (img, na, imag); } /* it */ } /* ix */ exit(0); } |
![]() |
---|
stack
Figure 10. 2-D field dataset from the Gulf of Mexico after DMO stack. |
![]() ![]() ![]() |
cd hw4/gulf
scons viewto generate Figure 10 and display it on your screen.
from rsf.proj import * Fetch('bei-stack.rsf','midpts') Flow('stack','bei-stack', ''' dd form=native | put label2=Distance unit2=km label1=Time unit1=s ''') Result('stack','grey title="DMO Stack" ') End() |
![]() |
![]() |
![]() |
![]() | Homework 4 | ![]() |
![]() |