previous up next print clean
Next: About this document ... Up: Abma: Seismic data processing MathematicaMathematica Previous: REFERENCES

APPENDIX

Several Mathematica packages and run streams are listed here as samples for seismic processing and display.

The following routine generates the Hilbert transform of a trace.

BeginPackage["hilbert`"]

Hilbert::usage =
             "Hilbert- create the Hilbert transform of a trace."
Begin["`Private`"]
Hilbert::Badarg = " Bad input to Hilbert"

Hilbert[x_] := (
 Block[
        {i,half,junk123},
        half= Floor[ N[ Dimensions[x][[1]]/2 +1 ] ];
        junk123 =RotateRight[ Fourier[N[x]],half-1 ];
        Re[InverseFourier[
                         RotateLeft[
                          Table[
                                +Sign[ i-half ] I junk123[[i]],
                                {i,1,Dimensions[x][[1]]}]
                            ,half-1]
                         ]
          ]
      ]
                )
End[]
EndPackage[]

The run stream used to generate the Hilbert transforms in the paper follows. Note that the YPrint.m package produces Postscript files on disk for use in this paper. The GraphicsArray function is used to get around what appears to be a bug in the Sun system's display of these Postscript files. The DEC and IBM do not appear to be troubled by the output not processed with GraphicsArray.

ia = <<WSstack.m;
<<YPrint.m
<<~/amath/Hilbert.m
<<~/amath/Wiggle.m
<<Graphics`Graphics3D`
<<Graphics`PlotField`
a = ia;
ah = Map[Hilbert,a];
env = N[Sqrt[ah^2+a^2]];
p1 = GraphicsArray[{ListDensityPlot[a,Mesh->False]}]
YPrint[p1]
!mv out.ps origden.ps
p2 = GraphicsArray[{ListDensityPlot[ah,Mesh->False]}]
YPrint[p2]
!mv out.ps hilbertden.ps
p3 = GraphicsArray[{ListDensityPlot[env,Mesh->False]}]
YPrint[p3]
!mv out.ps envden.ps

The wiggle trace plot and the vector plot were generated with the following run.

<<YPrint.m
<<~/amath/Hilbert.m
<<~/amath/Wiggle.m
<<Graphics`PlotField`

ia = <<WSstack.m;
a = Table[ia[[i,j]],{i,1,60,2},{j,31,90,2}];
ah = Map[Hilbert,a];
env = N[Sqrt[ah^2+a^2]];

p5 = Wiggle[ia,2 MRMS[ia]]
YPrint[p5]
!mv out.ps wiggle.ps

t = Table[{a[[i,j]],ah[[i,j]]},{i,30},{j,30}];
p4 = ListPlotVectorField[t,ScaleFactor->1.0]
YPrint[p4]
!mv out.ps vector.ps

The Fourier transform of the data in Figure 6 was generated with the following run stream.

<<YPrint.m

a = <<WSstack.m;
bb = Fourier[a];
b=N[ Table[ bb[[i,j]],{i,1,Dimensions[bb][[1]]},{j,1,Dimensions[bb][[2]]/2} ] ];
p1 = GraphicsArray[{ListDensityPlot[Re[N[b]],Mesh->False]}]
YPrint[p1]
!mv out.ps rs.ps
p2 = GraphicsArray[{ListDensityPlot[Im[N[b]],Mesh->False]}]
YPrint[p2]
!mv out.ps imag.ps
p3 = GraphicsArray[{ListDensityPlot[Abs[N[b]],Mesh->False]}]
YPrint[p3]
!mv out.ps abs.ps
p4 = GraphicsArray[{ListPlot3D[Abs[N[b]],Mesh->False,PlotRange->All]}]
YPrint[p4]
!mv out.ps FT3D.ps

A small package that allows a plot to be output to disk in PostScript format is the YPrint.m routine listed below. It outputs the plot as a file out.ps that can be renamed from within Mathematica as seen in the previous example.

System`YPrint::usage =
             "YPrint[-graphics-] sends graphics to out.ps file."
Begin["System`Private`"]
YPrint[x_] := ( Display["!psfix > out.ps", x]; x )
End[]

Finally a FORTRAN program to convert SEP files to Mathematica format is given here. Perhaps a better method of converting the numbers would be to built the output in terms of powers of ten, to avoid the many format statements.

# Convert SEP format to Mathematica format
#
# Main.x head=/dev/null < input.H | cat outfile
#
#%
integer nt, nx
from history:    integer n1 : nt
from history:    integer n2 : nx
allocate:       integer gather(nt,nx)

subroutine doit( nt,nx, gather )
integer it,in,nt, nx
real gather(nt,nx),rnum

#        ----   call hclose()
100     format(a8)

        call sreed( 'in', gather, nt*nx*4)
        write(*,200) '{'
200     format(a)
        do in=1,nx
        {
          write(*,200) '{'
          do it=1,nt
          {
#          write(*,*) gather(it,in)
#          print *, gather(it,in)
           rnum = gather(it,in)
#           write(*,300) gather(it,in)
           if (abs(rnum) .lt. 1)
            write(*,298) rnum
           else if (abs(rnum) .lt. 1000)
           write(*,299) rnum
           else if (abs(rnum) .lt. 1000000)
            write(*,300)  rnum
           else if (abs(rnum) .lt. 1.E9)
                write(*,301)  rnum
           else if (abs(rnum) .lt. 1.E12 )
                write(*,302)  rnum
           else if (abs(rnum) .lt. 1.E16 )
                write(*,303)  rnum
           else if (abs(rnum) .lt. 1.E20 )
                write(*,304)  rnum
           else if (abs(rnum) .lt. 1.E25 )
                write(*,305)  rnum
           else if (abs(rnum) .lt. 1.E30 )
                write(*,306)  rnum
                else {
                       write(*,306)  sign(1.E30,rnum)
                     }
298        format(f14.10)
299        format(f14.7)
300        format(f14.4)
301        format(f17.4)
302        format(f20.4)
303        format(f24.0)
304        format(f28.0)
305        format(f32.0)
306        format(f34.0)

           if (it .ne. nt) write(*,200) ','
          }
          write(*,200) '}'
           if (in .ne. nx) write(*,200) ','
        }
        write(*,200) '}'

#       call srite( 'out', gather, nt*nx*4)
return; end

 


previous up next print clean
Next: About this document ... Up: Abma: Seismic data processing MathematicaMathematica Previous: REFERENCES
Stanford Exploration Project
11/18/1997