up [pdf]
## 
 # elastic modeling; wavefield separation operators
 ## illustrate VTI and TTI operators in 2D

from rsf.proj import *
import sys
#sys.path.append('Python')
import fdmod,fdd,spk,pot,pplot,stiff

from math import *

proj=Project()

# ------------------------------------------------------------
par = {
    'nx':600, 'ox':0, 'dx':0.001,  'lx':'x', 'ux':'km',
    'nz':600, 'oz':0, 'dz':0.001,  'lz':'z', 'uz':'km',
    'nt':1001,'ot':0, 'dt':0.0001, 'lt':'t', 'ut':'s',
    'nkx':600, 'okx':-3.14, 'dkx':0.09968,  'lkx':'k\_x\^ ', 'ukx':'',
    'nkz':600, 'okz':-3.14, 'dkz':0.09968,  'lkz':'k\_z\^ ', 'ukz':'',
    'kt':150,
    'jsnap':200,
    'height':10,
    'nb':0,
    'frq':100,
    'ratio':1
    }
fdmod.param(par)
par['labelattr']=par['labelattr']+'''
titlesz=12 labelsz=8 bartype=h  font=4 barlabelsz=6 barlabelfat=3
wantaxis=y wantlabel=y wanttitle=y parallel2=n 
'''
nframe=6
order=8

kformat='''pclip=100 format2=%1.0f format1=%1.0f
           min1=-3.14 max1=3.14 label1="k\_z\^"  unit1=radians
           min2=-3.14 max2=3.14 label2="k\_x\^"  unit2=radians  
           o2num=-3 d2num=1 n2tic=7 '''
xformat='''pclip=100  format2=%3.0f format1=%2.0f
           min1=20 max1=44 min2=20 max2=44 
           label1=sample# label2=sample# unit1= unit2=
           o2num=20 d2num=5 n2tic=5'''



##############################################################
def delt(spk,m,n,par):

    par['nzspk']=m
    par['nxspk']=n

    par['spikex']=par['nxspk']/2+1
    par['spikez']=par['nzspk']/2+1
    par['middlex']=(par['nxspk']/2)*par['dx']
    par['middlez']=(par['nzspk']/2)*par['dz']

    Flow(spk,None,
         '''
         spike nsp=1 mag=1
         n1=%(nzspk)d o1=0 d1=1 k1=%(spikez)g
         n2=%(nxspk)d o2=0 d2=1 k2=%(spikex)g |
         put
         label1=%(lz)s label2=%(lx)s
         unit1=%(uz)s unit2=%(ux)s
         ''' % par)


##############################################################
delt('spk',64,64,par)
# ------------------------------------------------------------
# model parameters
# ------------------------------------------------------------
Flow('zero',None,
     '''
     spike nsp=1 mag=0.0
     n1=%(nz)d o1=%(oz)g d1=%(dz)g 
     n2=%(nx)d o2=%(ox)g d2=%(dx)g |
     put label1=%(lz)s label2=%(lx)s unit1=%(uz)s unit2=%(ux)s
     ''' % par)

for i in range(3):

    vp=3.0
    vs=1.5
    ro=1.0
    epsilon=[0,0.25,0.25]
    delta=[0,-0.29,-0.29]
    nu=[0,0,30]
    taglist=['-ISO','-VTI','-TTI']
    tag=taglist[i]
    par['c']=cos(nu[i]*pi/180.)
    par['s']=sin(nu[i]*pi/180.)
    Flow('vp',     'zero','add add=%f'%vp)
    Flow('vs',     'zero','add add=%f'%vs)
    Flow('ro',     'zero','add add=%f'%ro)
    Flow('epsilon'+tag,'zero','add add=%f'%epsilon[i])
    Flow('delta'+tag,  'zero','add add=%f'%delta[i])
    Flow('nu'+tag, 'zero','add add=%f'%nu[i])


    stiff.tti2d('cA'+tag,'vp','vs','ro','epsilon'+tag,'delta'+tag,'nu'+tag,par)

# ------------------------------------------------------------
# operators with Gaussian filter sigma=1.0
#   K domain
    fdd.separatorD('dzK'+tag,'dxK'+tag,'spk','cA'+tag,'y','k','gaussian',1.0,8,25,25,par)

    #  operators in the k domain rotated to symmetry axis and isotropy planes        
    Flow('dzK-rot'+tag,['dzK'+tag+'-tmp','dxK'+tag+'-tmp'],
         '''
         add scale=%(c)f,-%(s)f ${SOURCES[1]}|
         put label1=%(lkz)s label2=%(lkx)s
             unit1=%(ukz)s unit2=%(lkx)s
             o1=%(okz)f d1=%(dkz)f o2=%(okx)f d2=%(dkx)f 
     '''%par)

    Flow('dxK-rot'+tag,['dzK'+tag+'-tmp','dxK'+tag+'-tmp'],
         '''
         add scale=%(s)f,%(c)f ${SOURCES[1]}|
         put label1=%(lkz)s label2=%(lkx)s
             unit1=%(ukz)s unit2=%(lkx)s
             o1=%(okz)f d1=%(dkz)f o2=%(okx)f d2=%(dkx)f 
     '''%par)


    #  plot the unrotated and rotated
    pot.cliptogetherK( 'dK'+tag,'dzK'+tag+'-tmp','dxK'+tag+'-tmp','"\F5 U\_z"','"\F5 U\_x"',1,kformat,par)
    pot.cliptogetherK( 'dK-rot'+tag,'dzK-rot'+tag,'dxK-rot'+tag,'"\F5 U\_z"','"\F5 U\_x"',1,kformat,par)

#  X domain

    fdd.separatorD('dzX'+tag,'dxX'+tag,'spk','cA'+tag,'y','x','gaussian',1.0,8,25,25,par)
    Flow('dzX-rot'+tag,['dzX'+tag+'-tmp','dxX'+tag+'-tmp'],
         '''add scale=%(c)f,-%(s)f ${SOURCES[1]}
     '''%par)
    Flow('dxX-rot'+tag,['dzX'+tag+'-tmp','dxX'+tag+'-tmp'],
         '''
     add scale=%(s)f,%(c)f ${SOURCES[1]}
        '''%par)


    pot.cliptogetherX( 'dX'+tag, 'dzX'+tag+'-tmp','dxX'+tag+'-tmp','"\F5 L\_z"','"\F5 L\_x"',1,xformat,par)
    pot.cliptogetherX( 'dX-rot'+tag,'dzX-rot'+tag,      'dxX-rot'+tag,      '"\F5 L\_z"','"\F5 L\_x"',1,xformat,par)

# ------------------------------------------------------------
# operators with Gaussian filter different sigma
    for sigindex in range(3):
        sig=0.75+sigindex*0.25
        sigtag='-sig%01d'%sigindex
        print sigtag
        fdd.separatorD('dzK'+sigtag+tag,'dxK'+sigtag+tag,'spk','cA'+tag,'y','k','gaussian',sig,8,25,25,par)
        fdd.separatorD('dzX'+sigtag+tag,'dxX'+sigtag+tag,'spk','cA'+tag,'y','x','gaussian',sig,8,25,25,par)
        Plot('dzK'+sigtag+tag,'dzK'+sigtag+tag+'-tmp',
             '''put label1=%(lkz)s label2=%(lkx)s
             unit1=%(ukz)s unit2=%(lkx)s
             o1=%(okz)f d1=%(dkz)f o2=%(okx)f d2=%(dkx)f |'''%par+
             fdmod.cgrey(kformat+' title="\F5 U\_z"',par))
        Plot('dzX'+sigtag+tag,'dzX'+sigtag+tag+'-tmp',fdmod.cgrey(xformat+' title="\F5 L\_z"',par))

        pplot.p1x2('dzKX'+sigtag+tag,'dzK'+sigtag+tag,'dzX'+sigtag+tag,par['ys']*.8,par['xs']*.8,par['xc']-1)
##############################################################
#   do not apply any taper
#   k domain
    fdd.separatorD('dzK-notaper'+tag,'dxK-notaper'+tag,'spk','cA'+tag,'y','k','notaper',1.0,8,25,25,par)
    Flow('dzK-notaper-rot'+tag,['dzK-notaper'+tag+'-tmp','dxK-notaper'+tag+'-tmp'],
         '''add scale=%(c)f,-%(s)f ${SOURCES[1]}|
     put  label1=%(lkz)s label2=%(lkx)s
         unit1=%(ukz)s unit2=%(lkx)s
         o1=%(okz)f d1=%(dkz)f o2=%(okx)f d2=%(dkx)f 
     '''%par)

    Flow('dxK-notaper-rot'+tag,['dzK-notaper'+tag+'-tmp','dxK-notaper'+tag+'-tmp'],
         '''
     add scale=%(s)f,%(c)f ${SOURCES[1]}|
     put label1=%(lkz)s label2=%(lkx)s
         unit1=%(ukz)s unit2=%(lkx)s
        o1=%(okz)f d1=%(dkz)f o2=%(okx)f d2=%(dkx)f 
     '''%par)



    pot.cliptogetherK( 'dK-notaper'+tag, 'dzK-notaper'+tag+'-tmp','dxK-notaper'+tag+'-tmp','"\F5 U\_z"','"\F5 U\_x"',1,kformat,par)
    pot.cliptogetherK( 'dK-notaper-rot'+tag,'dzK-notaper-rot'+tag,      'dxK-notaper-rot'+tag,      '"\F5 U\_z"','"\F5 U\_x"',1,kformat,par)

# X domain
    fdd.separatorD('dzX-notaper'+tag,'dxX-notaper'+tag,'spk','cA'+tag,'y','x','notaper',1.0,8,25,25,par)
    Flow('dzX-notaper-rot'+tag,['dzX-notaper'+tag+'-tmp','dxX-notaper'+tag+'-tmp'],
         '''add scale=%(c)f,-%(s)f ${SOURCES[1]}
     '''%par)
    Flow('dxX-notaper-rot'+tag,['dzX-notaper'+tag+'-tmp','dxX-notaper'+tag+'-tmp'],
         '''
     add scale=%(s)f,%(c)f ${SOURCES[1]}
        '''%par)
    pot.cliptogetherX( 'dX-notaper'+tag, 'dzX-notaper'+tag+'-tmp','dxX-notaper'+tag+'-tmp','"\F5 L\_z"','"\F5 L\_x"',1,xformat,par)
    pot.cliptogetherX( 'dX-notaper-rot'+tag,'dzX-notaper-rot'+tag,      'dxX-notaper-rot'+tag,      '"\F5 L\_z"','"\F5 L\_x"',1,xformat,par)



End()

sfspike
sfput
sfadd
sfmath
sfcat
sfwindow
sfederiv2d
sfbyte
sfgrey