C
C Program GPANAL to calculate the amplitudes of 2-D Gaussian packets
C
C Version: 6.00
C Date: 2006, May 30
C
C Coded by: Karel Zacek
C Department of Geophysics, Charles University Prague,
C Ke Karlovu 3, 121 16 Praha 2, Czech Republic,
C E-mail: zacek@karel.troja.mff.cuni.cz
C
C.......................................................................
C
C Description of data files:
C
C Main input data read from external interactive device (*):
C The data consist of character strings, read by list directed (free
C format) input. The strings have thus to be enclosed in
C apostrophes. The interactive * external unit may be redirected to
C the file containing the data.
C (1) 'SEP'/
C 'SEP'...Name of the file with input parameters.
C Description of file SEP
C If blank, default values of the corresponding data are
C considered.
C Default: 'SEP'=' '.
C
C
C Input file 'SEP' in the SEP format:
C The file has the form of a SEP parameter file.
C For the description of the SEP format refer to file
C 'sep.for'.
C Names of input files:
C TIMESEC='string'... Name of the input file containing the time
C section.
C Default: TIMESEC='timesec.out' (usually sufficient)
C FGBY22='string'... Name of the input file with the initial
C parameters of Gaussian beams - imaginary part.
C Default: FGBY22='fgby22.out' (usually sufficient)
C FGBR22='string'... Name of the input file with the initial
C parameters of Gaussian beams - real part.
C Default: FGBR22='fgbr22.out' (usually sufficient)
C Name of input parameters:
C N44=real... ????????????????????.
C Default: N44=?
C FMIN=real... ????????????????????.
C Default: FMIN=0.
C FMAX=real... ????????????????????.
C Default: FMAX=100.
C Name of the output file:
C GPOUT='string'... Name of the output file containing
C amplitudes of Gaussian packets.
C Default: GPOUT='gpampl.out'
C Data specifying the dimensions of the input grid:
C OT=real, OX=real, OP=real ... Coordinates of the origin
C of the grid.
C Default: OT=0., OX=0., OP=0.
C DT=real... Grid interval along the T axis.
C Default: DT=1.
C DX=real... Grid interval along the X axis.
C Default: DX=1.
C DP=real... Grid interval along the P axis.
C Default: DP=1.
C NT=positive integer... Number of gridpoints along the T axis.
C Default: NT=1
C NX=positive integer... Number of gridpoints along the X axis.
C Default: NX=1
C NP=positive integer... Number of gridpoints along the P axis.
C Default: NP=1
C
C-----------------------------------------------------------------------
C Subroutines and external functions required:
EXTERNAL RARRAY
C RARRAY...File 'forms.for'.
EXTERNAL RARRAI
C RARRAI...File 'forms.for'.
EXTERNAL ERROR
C ERROR...File 'error.for'.
EXTERNAL RSEP1
C RSEP1...File 'sep.for'.
EXTERNAL RSEP3T
C RSEP3T...File 'sep.for'.
EXTERNAL RSEP3I
C RSEP3I...File 'sep.for'.
EXTERNAL RSEP3R
C RSEP3R...File 'sep.for'.
C-----------------------------------------------------------------------
C Common block /RAMC/:
INCLUDE 'ram.inc'
C ram.inc
C Common block /POINTC/ to store the results of complete ray tracing:
INCLUDE 'pointc.inc'
C pointc.inc
C None of the storage locations of the common block are altered.
INCLUDE 'sep.inc'
C sep.inc
C-----------------------------------------------------------------------
C Auxiliary storage locations:
REAL OX,OT,OP,DX,DT,DP,FMAX,FMIN,OMEGAMAX,VSURF,FREF,OMEGAREF
REAL XX,T,P,XR,TR
INTEGER LU1,LU2,LU3,LU4,LU5
INTEGER IRAM(MRAM)
INTEGER NX,NT,NP,NXT,NXTP,N
INTEGER IXR,ITR,IPR,IOMEGA,IX,IT
INTEGER IGRD,IGRD0,IFGBY0,IFGBR0,IFGBY,IFGBR,IFGB
INTEGER IGRDFR,IGRDFI,IGRDF0,IGRDF1,IGRDF2,IGRDF3
INTEGER NXR,NTR,NPR,NOMEGA
REAL DXR,DTR,DPR,DOMEGA,OXR,OTR,OPR,OOMEGA,XRX,TRT,AX,BT
REAL PR,OMEGA,DOMEGA1,KAPPA,PI,FR,FI,W,WW,WR,WI,GWM,DXTPO
REAL DXT,PRMIN,PRMAX,ANIMIN,ANIMAX,ANRMIN,ANRMAX,PARK,PARN
INTEGER IXMAX,IXMIN,ITMAX,ITMIN,IXR0,IPR0,MXR,MPR
REAL AK0,AK0D,AMPLR,AMPLI,DXR1,DPR1
COMPLEX AN,ANDD,AN0,THETA,AMPL,N44,N44D,PRD
COMPLEX THETA1,THETA2,THETA3,THETA4
PARAMETER (LU1=21,LU2=22,LU3=23,LU4=24,LU5=25,LU6=26,LU7=27)
PARAMETER (LU8=28,LU9=29,LU10=30,LU11=31)
PARAMETER (PI=3.141592654)
CHARACTER*80 FILSEP,TIMESEC,FGBY22,FGBR22,GPOUTR,GPOUTI,SYNTSEC
CHARACTER*80 FGBRMIN,FGBRMAX,FGBYMIN,FGBYMAX
EQUIVALENCE (IRAM,RAM)
C.......................................................................
C Reading main input data:
FILSEP=' '
WRITE(*,'(A)')'+GPANAL: Enter filename : '
READ(*,*) FILSEP
IF(FILSEP.EQ.' ') THEN
C GPANAL-01
CALL ERROR('GPANAL-01: No input file specified')
C Input file in the form of the SEP (Stanford Exploration Project)
C parameter or history file must be specified.
C There is no default filename.
ENDIF
WRITE(*,'(A)')'+GPANAL: Reading, calculating... '
C Reading all the data from the SEP file into the memory:
CALL RSEP1(LU1,FILSEP)
C Reading filenames of the input files
CALL RSEP3T('TIMESEC',TIMESEC,'times.out')
CALL RSEP3T('FGBY22',FGBY22,'fgby22.out')
CALL RSEP3T('FGBR22',FGBR22,'fgbr22.out')
CALL RSEP3T('FGBYMIN',FGBYMIN,'fgbymin.out')
CALL RSEP3T('FGBYMAX',FGBYMAX,'fgbymax.out')
CALL RSEP3T('FGBRMIN',FGBRMIN,'fgbrmin.out')
CALL RSEP3T('FGBRMAX',FGBRMAX,'fgbrmax.out')
C Reading filenames of the output files
CALL RSEP3T('GPOUTR',GPOUTR,'gpampr.out')
CALL RSEP3T('GPOUTI',GPOUTI,'gpampi.out')
CALL RSEP3T('SYNTSEC',SYNTSEC,'synts.out')
CALL RSEP3I('NX',NX,1)
CALL RSEP3I('NT',NT,1)
CALL RSEP3I('NXTP',NXTP,1)
CALL RSEP3R('DX',DX,1.)
CALL RSEP3R('DT',DT,1.)
CALL RSEP3R('OX',OX,0.)
CALL RSEP3R('OT',OT,0.)
CALL RSEP3R('PARK',PARK,0.5)
CALL RSEP3R('PARN',PARN,0.5)
CALL RSEP3R('KAPPA',KAPPA,1.253314137)
CALL RSEP3R('GWM',GWM,3.)
CALL RSEP3R('VSURF',VSURF,2000.)
CALL RSEP3R('FMAX',FMAX,1.)
CALL RSEP3R('FMIN',FMIN,1.)
CALL RSEP3R('FREF',FREF,1.)
OPEN(LU2,FILE=TIMESEC,FORM='FORMATTED',STATUS='OLD')
OPEN(LU3,FILE=FGBY22,FORM='FORMATTED',STATUS='OLD')
OPEN(LU4,FILE=FGBR22,FORM='FORMATTED',STATUS='OLD')
OPEN(LU5,FILE=GPOUTR,FORM='FORMATTED')
OPEN(LU6,FILE=GPOUTI,FORM='FORMATTED')
OPEN(LU7,FILE=SYNTSEC,FORM='FORMATTED')
OPEN(LU8,FILE=FGBYMIN,FORM='FORMATTED',STATUS='OLD')
OPEN(LU9,FILE=FGBYMAX,FORM='FORMATTED',STATUS='OLD')
OPEN(LU10,FILE=FGBRMIN,FORM='FORMATTED',STATUS='OLD')
OPEN(LU11,FILE=FGBRMAX,FORM='FORMATTED',STATUS='OLD')
NXT=NX*NT
C NXTP=NXT*NP
CALL RARRAY(LU2,' ','FORMATTED',.FALSE.,0.,NXT,RAM)
CALL RARRAY(LU3,' ','FORMATTED',.FALSE.,0.,NXTP,
* RAM(NXT+1))
CALL RARRAY(LU4,' ','FORMATTED',.FALSE.,0.,NXTP,
* RAM(NXT+NXTP+1))
READ(LU8,*) ANIMIN
READ(LU9,*) ANIMAX
READ(LU10,*) ANRMIN
READ(LU11,*) ANRMAX
OMEGAMAX=2.0*PI*FMAX
OOMEGA=2.0*PI*FMIN
OMEGAREF=2.0*PI*FREF
IF(OOMEGA.LT.(1.0/(DT*(NT-1)))) THEN
OOMEGA= 1.0/(DT*(NT-1))
END IF
C AK0=PARK*OOMEGA*ANIMIN*VSURF**2
C AK0D=AK0*(1.0-PARN)/PARN
C AN0=PARN*2.0*CMPLX(ANRMIN,ANIMIN)
AK0=0.5*OOMEGA*ANIMIN*VSURF**2
AK0D=AK0
AN0=CMPLX(ANRMIN,ANIMIN)
WRITE(*,'(A,1(G16.6,1X))') 'K0 =',AK0
WRITE(*,'(A,1(G16.6,1X))') 'K0D =',AK0D
WRITE(*,'(A,1(G16.6,1X))') 'N0R =',REAL(AN0)
WRITE(*,'(A,1(G16.6,1X))') 'N0I =',AIMAG(AN0)
WRITE(*,'(A,1(G16.6,1X))') 'NMIN =',ANIMIN
WRITE(*,'(A,1(G16.6,1X))') 'NMAX =',ANIMAX
IF(OOMEGA.LT.OMEGAMAX) THEN
DOMEGA=KAPPA*SQRT(2.0*AK0*AK0D/(AK0+AK0D))
C DOMEGA1=2.0*PI/(NT*DT)
C IF(DOMEGA1.LT.DOMEGA) THEN
C WRITE(*,'(A)')'+GPANAL: Aliasing '
C END IF
N=NINT((OMEGAMAX-OOMEGA)/DOMEGA)
NOMEGA=N+2
DOMEGA=(OMEGAMAX-OOMEGA)/(N+1)
ELSE
OOMEGA=OMEGAMAX
DOMEGA=1.0
NOMEGA=1
END IF
C WRITE(*,'(A,1(G16.6,1X))') 'FMIN =',OOMEGA/(2.0*PI)
WRITE(*,'(A,1(G16.6,1X))') 'DF =',DOMEGA/(2.0*PI)
WRITE(*,'(A,I6)') 'NF =',NOMEGA
OXR=OX
C DXR=KAPPA*SQRT(-2.0*(1.0-PARN)/OMEGAREF*AIMAG(
C * (CMPLX(1.0,0.0)-OOMEGA/OMEGAREF*
C * CMPLX(0.0,ANIMIN)/CMPLX(ANRMAX,ANIMAX)*PARK)/
C * CMPLX(ANRMAX,ANIMAX)))
DXR=KAPPA*SQRT(-AIMAG(0.5/(OMEGAREF*AN0)))
N=NINT((NX-1)*DX/DXR)
NXR=N+2
DXR=(NX-1)*DX/(N+1)
WRITE(*,'(A,1(G16.6,1X))') 'DXR =',DXR
WRITE(*,'(A,I6)') 'NXR =',NXR
OTR=OT
C DTR=KAPPA*SQRT(-2.0*PARN*AIMAG(
C * (CMPLX(1.0,0.0)-CMPLX(0.0,ANIMIN)/CMPLX(ANRMIN,ANIMIN)*PARK)
C * /CMPLX(0.0,AK0)))
DTR=KAPPA*SQRT(0.5/AK0)
N=NINT((NT-1)*DT/DTR)
NTR=N+2
DTR=(NT-1)*DT/(N+1)
WRITE(*,'(A,1(G16.6,1X))') 'DTR =',DTR
WRITE(*,'(A,I6)') 'NTR =',NTR
OPR=-1.0/VSURF
DPR=KAPPA*SQRT(AIMAG(AN0)/OMEGAREF)
N=NINT(2.0/(VSURF*DPR))
NPR=N+2
DPR=2.0/(VSURF*(N+1))
WRITE(*,'(A,1(G16.6,1X))') 'DP =',DPR
WRITE(*,'(A,I6)') 'NP =',NPR
NXTPO=NXR*NTR*NPR*NOMEGA
DXTPO=DXR*DTR*DPR*DOMEGA
DXT=DX*DT
WRITE(*,'(A,I6)') 'Expected time is',
* NINT(NXTPO/237006.0*NXT/87000.0*1.5*7200.0)
ccc IFGBY0=NXT+1
IFGBY0=NXT
IFGBR0=IFGBY0+NXTP
IGRDF0=NXT+2*NXTP
IF((IGRDF0+NXTPO).GT.MRAM) THEN
C GPANAL-02
CALL ERROR('GPANAL-02: Too small array RAM(MRAM)')
C Too small array RAM(MRAM). If possible, increase dimension MRAM
C in include file ram.inc.
END IF
C Decomposition of the time section into 2-D Gaussian packets
C -----------------------------------------------------------
WRITE(*,'(A)')'+GPANAL: Decomposition '
BT=GWM/SQRT(AK0D)
DO 500 IXR=1,NXR
XR=OXR+DXR*(IXR-1)
WRITE(*,'(A,I6)') 'IXR =',IXR
IGRDF3=(IXR-1)*NTR
DO 450 ITR=1,NTR
TR=OTR+DTR*(ITR-1)
IGRDF2=(IGRDF3+ITR-1)*NPR
DO 400 IPR=1,NPR
PR=OPR+DPR*(IPR-1)
IGRDF1=IGRDF0+(IGRDF2+IPR-1)*NOMEGA
IFGB=((IXR-1)*NPR+IPR-1)*NTR+ITR
IFGBY=IFGBY0+IFGB
IFGBR=IFGBR0+IFGB
AN=CMPLX(RAM(IFGBR),RAM(IFGBY))
ANDD=AN*AN0/(2.0*AN-AN0)
PRD=-PR*ANDD/AN
DO 350 IOMEGA=1,NOMEGA
OMEGA=OOMEGA+DOMEGA*(IOMEGA-1)
DXR1=KAPPA*SQRT(-2.0*(1.0-PARN)/OMEGA*AIMAG(
* (CMPLX(1.0,0.0)-OOMEGA/OMEGA
* *CMPLX(0.0,ANIMIN)/AN*PARK)/AN))
MXR=INT(DXR1/DXR)
IF(MXR.LT.1) THEN
MXR=1
END IF
IXR0=INT(FLOAT(NXR-MXR*INT(FLOAT(NXR-1)
* /FLOAT(MXR))-1)/2.0)+1
DPR1=KAPPA*SQRT(AIMAG(AN0)/OMEGA)
MPR=INT(DPR1/DPR)
IF(MPR.LT.1) THEN
MPR=1
END IF
IPR0=INT(FLOAT(NPR-MPR*INT(FLOAT(NPR-1)
* /FLOAT(MPR))-1)/2.0)+1
IGRDFR=IGRDF1+IOMEGA
IGRDFI=IGRDFR+NXTPO
IF((MOD((IXR-IXR0),MXR).EQ.0).AND.
* (MOD((IPR-IPR0),MPR).EQ.0)) THEN
FR=0.0
FI=0.0
PRMAX=PI/(OMEGA*DX)
IF((PR.GT.(-PRMAX)).AND.(PR.LT.PRMAX)) THEN
N44=AN*CMPLX(0.0,AK0)
* /(OMEGA*AN-CMPLX(0.0,AK0)*PR**2)
N44D=ANDD*CMPLX(0.0,AK0D)
* /(OMEGA*ANDD-CMPLX(0.0,AK0D)*PRD**2)
AMPL=0.5*CSQRT(CMPLX(0.0,-1.0)*(AN+ANDD))
* *CSQRT(CMPLX(0.0,-1.0)*N44*N44D
* *(OMEGA/CMPLX(0.0,AK0)+OMEGA/CMPLX(0.0,AK0D)))
AMPLR=REAL(AMPL)
AMPLI=AIMAG(AMPL)
THETA1=0.5*ANDD/(ANDD-CMPLX(0.0,AK0D)/OMEGA*PRD**2)
THETA4=CMPLX(0.0,AK0D)/OMEGA
AX=GWM/SQRT(OMEGA*AIMAG(ANDD))
IXMIN=INT((XR-AX)/DX)+1
IF(IXMIN.LT.1) THEN
IXMIN=1
END IF
IXMAX=INT((XR+AX)/DX)+2
IF(IXMAX.GT.NX) THEN
IXMAX=NX
END IF
ITMIN=INT((TR-BT)/DT)+1
IF(ITMIN.LT.1) THEN
ITMIN=1
END IF
ITMAX=INT((TR+BT)/DT)+2
IF(ITMAX.GT.NT) THEN
ITMAX=NT
END IF
DO 300 IX=IXMIN,IXMAX
XX=OX+DX*(IX-1)
XRX=XX-XR
IGRD0=(IX-1)*NT
THETA2=ANDD*XRX**2
THETA3=2.0*PRD*THETA4*XRX
DO 250 IT=ITMIN,ITMAX
T=OT+DT*(IT-1)
TRT=T-TR
IGRD=IGRD0+IT
C THETA=0.5*ANDD/(ANDD-CMPLX(0.0,AK0D)
C * /OMEGA*PRD**2)*(ANDD*XRX**2-2.0*PRD
C * *CMPLX(0.0,AK0D)/OMEGA*XRX*TRT
C * +CMPLX(0.0,AK0D)/OMEGA*TRT**2)
THETA=THETA1*(THETA2-THETA3*TRT+THETA4*TRT**2)
W=RAM(IGRD)*EXP(-OMEGA*AIMAG(THETA))
WW=OMEGA*(REAL(THETA)+TRT-PR*XRX)
WR=W*(AMPLR*COS(WW)-AMPLI*SIN(WW))
WI=W*(AMPLR*SIN(WW)+AMPLI*COS(WW))
FR=FR+WR
FI=FI+WI
250 CONTINUE
300 CONTINUE
END IF
C Complex valued amplitudes of GPs
RAM(IGRDFR)=MXR*MPR*DXT*FR*OMEGA**2/(2.0*PI**3)
RAM(IGRDFI)=MXR*MPR*DXT*FI*OMEGA**2/(2.0*PI**3)
ELSE
RAM(IGRDFR)=0.0
RAM(IGRDFI)=0.0
C WRITE(*,'(A,4(G16.6,1X))') '0 - ',
C * XR,TR,PR,OMEGA/(2.0*PI)
END IF
350 CONTINUE
400 CONTINUE
450 CONTINUE
500 CONTINUE
C Writing output grid values
IF(GPOUTR.NE.' ') THEN
CALL WARRAY(LU5,' ','FORMATTED',.FALSE.,0.,.FALSE.,0.,
* NXTPO,RAM(IGRDF0+1))
END IF
IF(GPOUTI.NE.' ') THEN
CALL WARRAY(LU6,' ','FORMATTED',.FALSE.,0.,.FALSE.,0.,
* NXTPO,RAM(IGRDF0+NXTPO+1))
END IF
C
C Composition of the synthetic time section
C -----------------------------------------
WRITE(*,'(A)')'+GPANAL: Composition '
BT=GWM/SQRT(AK0)
DO 600 IGRD=1,NXT
RAM(IGRD)=0.0
600 CONTINUE
DO 1000 IXR=1,NXR
XR=OXR+DXR*(IXR-1)
WRITE(*,'(A,I6)') 'IXR =',IXR
IGRDF3=(IXR-1)*NTR
DO 950 ITR=1,NTR
TR=OTR+DTR*(ITR-1)
IGRDF2=(IGRDF3+ITR-1)*NPR
DO 900 IPR=1,NPR
PR=OPR+DPR*(IPR-1)
IGRDF1=IGRDF0+(IGRDF2+IPR-1)*NOMEGA
IFGB=((IXR-1)*NPR+IPR-1)*NTR+ITR
IFGBY=IFGBY0+IFGB
IFGBR=IFGBR0+IFGB
AN=CMPLX(RAM(IFGBR),RAM(IFGBY))
DO 850 IOMEGA=1,NOMEGA
OMEGA=OOMEGA+DOMEGA*(IOMEGA-1)
IGRDFR=IGRDF1+IOMEGA
IGRDFI=IGRDFR+NXTPO
IF(((RAM(IGRDFR).GT.900.0).OR.(RAM(IGRDFI).GT.900.0)).OR.
* ((RAM(IGRDFR).LT.-900.0).OR.(RAM(IGRDFI).LT.-900.0)))THEN
PRMAX=PI/(OMEGA*DX)
IF((PR.GT.(-PRMAX)).AND.(PR.LT.PRMAX)) THEN
THETA1=0.5*AN/(AN-CMPLX(0.0,AK0)/OMEGA*PR**2)
THETA4=CMPLX(0.0,AK0)/OMEGA
AX=GWM/SQRT(OMEGA*AIMAG(AN))
IXMIN=INT((XR-AX)/DX)+1
IF(IXMIN.LT.1) THEN
IXMIN=1
END IF
IXMAX=INT((XR+AX)/DX)+2
IF(IXMAX.GT.NX) THEN
IXMAX=NX
END IF
ITMIN=INT((TR-BT)/DT)+1
IF(ITMIN.LT.1) THEN
ITMIN=1
END IF
ITMAX=INT((TR+BT)/DT)+2
IF(ITMAX.GT.NT) THEN
ITMAX=NT
END IF
DO 800 IX=IXMIN,IXMAX
XX=OX+DX*(IX-1)
XRX=XX-XR
IGRD0=(IX-1)*NT
THETA2=AN*XRX**2
THETA3=2.0*PR*THETA4*XRX
DO 750 IT=ITMIN,ITMAX
T=OT+DT*(IT-1)
TRT=T-TR
IGRD=IGRD0+IT
C THETA=0.5*AN/(AN-CMPLX(0.0,AK0)/OMEGA*PR**2)
C * *(AN*XRX**2-2.0*PR*CMPLX(0.0,AK0)/OMEGA
C * *XRX*TRT+CMPLX(0.0,AK0)/OMEGA*TRT**2)
THETA=THETA1*(THETA2-THETA3*TRT+THETA4*TRT**2)
WW=OMEGA*(REAL(THETA)+PR*XRX-TRT)
WR=RAM(IGRDFR)*COS(WW)
* -RAM(IGRDFI)*SIN(WW)
WR=WR*EXP(-OMEGA*AIMAG(THETA))
C Synthetic time section
RAM(IGRD)=RAM(IGRD)+WR*DXTPO
750 CONTINUE
800 CONTINUE
END IF
END IF
850 CONTINUE
900 CONTINUE
950 CONTINUE
1000 CONTINUE
C Writing output grid values
IF(SYNTSEC.NE.' ') THEN
CALL WARRAY(LU7,' ','FORMATTED',.FALSE.,0.,.FALSE.,0.,
* NXT,RAM)
END IF
CLOSE(LU2)
CLOSE(LU3)
CLOSE(LU4)
CLOSE(LU5)
CLOSE(LU6)
CLOSE(LU7)
CLOSE(LU8)
CLOSE(LU9)
CLOSE(LU10)
CLOSE(LU11)
WRITE(*,'(A)') '+GPANAL: Done. '
STOP
END
C=======================================================================
C
INCLUDE 'error.for'
C error.for
INCLUDE 'length.for'
C length.for
INCLUDE 'sep.for'
C sep.for
INCLUDE 'forms.for'
C forms.forC
C
C=======================================================================
C