next up previous [pdf]

Next: Viking Graben data Up: GEO 365N/384S Seismic Data Previous: Generating this document

Alaska data

In the first part of the assignment, we will pick up processing of the Alaska line where he last left it, after the groundroll attenuation step. Figure 1 shows the shot gathers after groundroll removal by the Emc-Hammer team.

rshots
rshots
Figure 1.
Alaska shot gathers after groundroll removal by Emc-Hammer.
[pdf] [png] [scons]

In this assignment, you will process the data further by applying surface-consistent amplitude balancing, velocity analysis, and stack.

  1. Change directory to hw4/alaska.
  2. Run
    scons -c
    
    to remove (clean) previously generated files.
  3. Run
    scons arms.view
    
    to display trace amplitudes for Alaska shot gathers (Figure 2a). The amplitudes show a strong offset trend. To display them after removing the trend (Figure 2b), run
    scons arms2.view
    

    arms arms2
    arms,arms2
    Figure 2.
    Trace amplitudes before (a) and after (b) removing the long-period offset trend.
    [pdf] [pdf] [png] [png] [scons]

    Do you notice stripes in the amplitude going in different directions? These stripes might be caused by near-surface conditions in deploying sources and receivers. The surface-consistent model (Taner and Koehler, 1981) tries to explain the trace amplitude as a function of source and receiver locations $A(s,r)$ using a product of several factors (source, receiver, offset, and midpoint):

    \begin{displaymath}
A(s,r) \approx A_s(s)\,A_r(r)\,A_x(r-s)\,A_m\left(\frac{r+s}{2}\right)\;.
\end{displaymath} (1)

    By applying logarithm to the amplitude, we can turn the product in equation (1) into a sum
    \begin{displaymath}
\log\left[A(s,r)\right] \approx L_s(s) + L_r(r) + L_x(r-s) + L_m\left(\frac{r+s}{2}\right)\;.
\end{displaymath} (2)

  4. In its discrete version, equation (2) represents a system of linear equations with given $\log\left[A(s,r)\right]$ and unknown factors $L_s$, $L_r$, $L_x$, and $L_m$.

    Does this system have more equations than unknowns or more unknowns than equations?

    \fbox{\parbox{\boxwidth}{\textbf{Answer:} % Fill your answer here
}}

    Does this system have a unique solution?

    \fbox{\parbox{\boxwidth}{\textbf{Answer:} % Fill your answer here
}}

    We will attempt to solve the system represented by equation (2) using the the least-squares method and the iterative conjugate-gradient algorithm (Fletcher and Reeves, 1964; Hestenes and Stiefel, 1952). The algorithm requires implementing the linear operator and its adjoint. The implementation of the linear operator from equation (2) is provided in the surface-consistent.c program.

    /* Surface-consistent decomposition */
    #include <rsf.h>
    
    int main(int argc, char* argv[])
    {
        bool adj, verb;
        int nd, nm, nx, im, min, max, id, i, ix, sx;
        int **indx, *size;
        float *model, *data;
        sf_file inp, index, out;
    
        sf_init(argc,argv);
      
        if (!sf_getbool("adj",&adj)) adj=true;
        /* adjoint flag */
        if (!sf_getbool("verb",&verb)) verb=false;
        /* verbosity flag */
    
        inp = sf_input("in");
        if (SF_FLOAT != sf_gettype(inp)) 
    	sf_error("Need float input");
    
        out = sf_output("out");
    
        index = sf_input("index");
        if (SF_INT != sf_gettype(index)) 
    	sf_error("Need int index");
    
        if (!sf_histint(index,"n1",&nd)) 
    	sf_error("No n1= in index");
        nm = sf_leftsize(index,1);
    
        if (adj) {
    	if (nd != sf_filesize(inp)) 
    	    sf_error("Wrong data size");
        } else {
    	sf_putint(out,"n1",nd);
        }
    
        data = sf_floatalloc(nd);
        indx = sf_intalloc2(nd,nm);
        size = sf_intalloc(nm);
    
        sf_intread(indx[0],nd*nm,index);
    
        nx = 0;
        for (im=0; im < nm; im++) {
    	min = max = indx[im][0];
    	for (id=1; id < nd; id++) {
    	    i = indx[im][id];
    	    if (i < min) min=i;
    	    if (i > max) max=i;
    	}
    	if (min) {
    	    for (id=0; id < nd; id++) {
    		indx[im][id] -= min;
    	    }
    	}
    	size[im]=max-min+1;
    	nx += size[im];
    	if (verb) sf_warning("size%d=%d",im+1,size[im]);
        }
    
        if (adj) {
    	sf_putint(out,"n1",nx);
        } else {
    	if (nx != sf_filesize(inp)) 
    	    sf_error("Wrong model size");
        }
    
        model = sf_floatalloc(nx);
        
        if (adj) {
    	sf_floatread(data,nd,inp);
    	for (ix=0; ix < nx; ix++) {
    	    model[ix] = 0.0f;
    	}
        } else {
    	sf_floatread(model,nx,inp);
    	for (id=0; id < nd; id++) {
    	    data[id] = 0.0f;
    	}
        }
    
        sx=0;
        for (im=0; im < nm; im++) {
    	for (id=0; id < nd; id++) {
    	    ix = indx[im][id]+sx;
    	    
    	    if (adj) {
    		model[ix] += data[id];
    	    } else {
    		data[id] += model[ix];
    	    }
    	}
    	sx += size[im];
        }
    
        if (adj) {
    	sf_floatwrite(model,nx,out);
        } else {	
    	sf_floatwrite(data,nd,out);
        } 
        
        exit(0);
    }
    
    

    To run the iterative inversion and to see the result of matching the data (logarithm of the amplitude), run

    scons scarms.view
    
    Does it manage to predict the stripes seen in Figure 2b?

    scarms adiff
    scarms,adiff
    Figure 3.
    (a) Estimated surface-consistent trace amplitudes. (b) Difference with Figure 2b.
    [pdf] [pdf] [png] [png] [scons]

    The individual factors (composing the estimated model vector) are shown in Figure 4.

    shot receiver offset cmp
    shot,receiver,offset,cmp
    Figure 4.
    Estimated surface-consistent factors.
    [pdf] [pdf] [pdf] [pdf] [png] [png] [png] [png] [scons]

    To display the shot gathers after the surface-consistent amplitude correction (Figure 5), run

    scons ashots.view
    
    To compare the output with the input, run
    sfpen Fig/rshots.vpl Fig/ashots.vpl
    

    ashots
    ashots
    Figure 5.
    Alaska shot gathers after surface-consistent amplitude balancing.
    [pdf] [png] [scons]

  5. After the correction, we can proceed with the data processing sequence by doing the familiar steps of sorting into CMP gathers, velocity analysis, NMO, and stack. Run
    scons stack0.view
    
    to go through these steps. The resultant stack (Figure 6a) appears to contain spiky noise. We can try to remove it by median filtering (Figure 6b)
    scons stack1.view
    

    stack0 stack1
    stack0,stack1
    Figure 6.
    (a) First attempt at NMO stack. (b) NMO stack after despiking by median filtering.
    [pdf] [pdf] [png] [png] [scons]

    The NMO velocity extracted by the automatic picker is shown in Figure 7, and the velocity analysis and NMO applied to an individual CMP gather are shown in Figure 8, displayed with

    scons nmo2.view
    

    vpicks
    vpicks
    Figure 7.
    NMO velocity estimated by the automatic picker.
    [pdf] [png] [scons]

    nmo2
    nmo2
    Figure 8.
    Velocity analysis and NMO applied to a selected CMP gather.
    [pdf] [png] [scons]

  6. Your task:
    1. By modifying the SConstruct file, extract velocity analysis and NMO from several other CMP gathers and examine the results.
    2. Try to improve the quality of the stack. To achieve a better result, you are free to use any of the techniques that you learned previously.

from rsf.proj import *

# Shots after ground-roll removal by Emc-Hammer
Fetch('rshots.HH','alaska')
Flow('rshots','rshots.HH','dd form=native')

def plotshots(title):
    return '''
    pow pow1=1.5 | byte gainpanel=all pclip=90 |
    grey3 frame1=1000 frame2=55 frame3=30 title="%s"
    flat=n point1=0.7 point2=0.7
    ''' % title

Result('rshots',plotshots('Shots after Groundroll Attenuation'))

# Average trace amplitude
Flow('arms','rshots',
     'mul $SOURCE | stack axis=1 | math output="log(input)" ')
Result('arms','grey title=Log-Amplitude mean=y pclip=90')

# Remove long-period offset term
Flow('arms2','arms','smooth rect1=5 | add scale=-1,1 $SOURCE')
Result('arms2','grey title=Log-Amplitude clip=1.13')

# Integer indeces for different terms
Flow('shot','arms2','math output="(x2-44)/0.44" ')
Flow('offset','arms2','math output="(x1+5.225)/0.11" ')
Flow('receiver','arms2','math output="(x1+x2-44+5.225)/0.11" ')
Flow('cmp','arms2','math output="(x1/2+x2-44+5.225/2)*2/0.11" ')

nx = 96 # number of offsets
ns = 56 # number of shots
nt = nx*ns # number of traces

Flow('index','shot offset receiver cmp',
     '''
     cat axis=3 ${SOURCES[1:4]} | dd type=int | 
     put n1=%d n2=4 n3=1
     ''' % nt)

# Transform from 2-D to 1-D
Flow('arms1','arms2','put n2=1 n1=%d' % nt)

prog = Program('surface-consistent.c')
sc = str(prog[0])

Flow('model',['arms1','index',sc],
     './${SOURCES[2]} index=${SOURCES[1]} verb=y')

# Least-squares inversion by conjugate gradients
Flow('sc',['arms1','index',sc,'model'],
     '''
     conjgrad ./${SOURCES[2]} index=${SOURCES[1]} 
     mod=${SOURCES[3]} niter=30
     ''')

Flow('scarms',['sc','index',sc],
     '''
     ./${SOURCES[2]} index=${SOURCES[1]} adj=n | 
     put n1=%d n2=%d
     ''' % (nx,ns))
Result('scarms',
       '''
       grey mean=y title="Surface-Consistent Log-Amplitude" 
       clip=1.13
       ''')

Flow('adiff','arms2 scarms','add scale=1,-1 ${SOURCES[1]}')
Result('adiff','grey title=Difference clip=1.13')

size=dict(shot=ns,offset=nx,receiver=316,cmp=536)

f1 = 0
for case in ('shot','offset','receiver','cmp'):
    n1=size[case]
    
    Result(case,'sc',
           '''
           window n1=%d f1=%d | put o1=1 d1=1 | 
           graph title="%s Term" 
           label1="%s Number" unit1= label2=Amplitude unit2=
           ''' % (n1,f1,case.capitalize(),case.capitalize()))
    f1 += n1

Flow('ampl','scarms',
     'math output="exp(-input/2)" | spray axis=1 n=3000 d=0.002 o=0')
Flow('ashots','rshots ampl','mul ${SOURCES[1]} | cut n3=1 f3=49')

Result('ashots',plotshots('Shots after Amplitude Normalization'))

# Sort to CMPs

Flow('cmps mask','ashots',
     'shot2cmp half=n mask=${TARGETS[1]} | pow pow1=2')
Flow('mask1','mask','spray axis=1 n=1')

# Select one CMP

Flow('cmp1','cmps','window n3=1 f3=200')
Plot('cmp1','grey title=CMP')

Flow('vscan1','cmp1','vscan semblance=y half=n nv=151 v0=7 dv=0.1')
Plot('vscan1','grey color=j allpos=y title="Velocity Scan" ')

Flow('vpick1','vscan1','pick rect1=100')
Plot('vpick1',
     '''
     graph plotcol=7 plotfat=5 wantaxis=n wanttitle=n 
     yreverse=y transp=y min2=7 max2=22 pad=n
     ''')
Plot('vscanpick1','vscan1 vpick1','Overlay')

Flow('nmo1','cmp1 vpick1','nmo velocity=${SOURCES[1]} half=n')
Plot('nmo1','grey title=NMO')

Result('nmo','cmp1 vscanpick1 nmo1','SideBySideAniso')

# Apply to all CMPs

Flow('vscans','cmps mask1',
     '''
     vscan semblance=y half=n nv=151 v0=7 dv=0.1 
     mask=${SOURCES[1]}
     ''',split=[3,'omp'])
Flow('vpicks','vscans','pick rect1=100 rect2=20')

Result('vpicks',
       '''
       grey color=j scalebar=y barreverse=y mean=y 
       title="Picked NMO Velocity" 
       ''')

Flow('nmos','cmps vpicks','nmo velocity=${SOURCES[1]} half=n')

# Examine one CMP

cmp = 200 # !!! MODIFY ME !!!

Flow('vscan2','vscans','window n3=1 f3=%d' % cmp)
Plot('vscan2','grey color=j allpos=y title="Velocity Scan" ')

Flow('vpick2','vpicks','window n2=1 f2=%d' % cmp)
Plot('vpick2',
     '''
     graph plotcol=7 plotfat=5 wantaxis=n wanttitle=n 
     yreverse=y transp=y min2=7 max2=22 pad=n
     ''')
Plot('vscanpick2','vscan2 vpick2','Overlay')

Flow('nmo2','nmos','window n3=1 f3=%d' % cmp)
Plot('nmo2','grey title=NMO')

Result('nmo2','cmp1 vscanpick2 nmo2','SideBySideAniso')

# Stack

Flow('stack0','nmos','stack')
Result('stack0','grey title="First Stack" ')

Flow('stack1','stack0','despike2 wide2=10')
Result('stack1','grey title="Median-Filtered Stack" ')

End()


next up previous [pdf]

Next: Viking Graben data Up: GEO 365N/384S Seismic Data Previous: Generating this document

2016-08-17