C
C Program GPMIG for 2-D Gaussian packet prestack depth migration
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 with the results of ray tracing from a receiver:
C RAYALL='string'... Name of the input file CRT-R with the
C quantities stored along rays (see C.R.T.5.5.1).
C Default: RAYALL='r01.out' (usually sufficient)
C INIALL='string'... Name of the input file CRT-I with the
C quantities at the initial points of rays, corresponding
C to file RAYALL (see C.R.T.6.1).
C Default: INIALL='r01i.out' (usually sufficient)
C Names of input formatted files with quantities corresponding to the
C common source, interpolated at the nodes of input grid:
C NUM='string'...Name of the input file with N1*N2*N3 array
C of integer values, containing the number of arrivals at
C each gridpoint of the target grid.
C Default: NUM='mtt-num.out'
C MTT='string'...Name of the input file with the array of real
C values, containing for each gridpoint the travel times
C of all determined arrivals.
C Default: MTT='mtt-tt.out'
C AMP='string'...Name of the input file with the array of real
C values, containing for each gridpoint the amplitudes.
C Default: AMP='mtt-ap.out'
C Names of input formatted files with amplitudes of Gaussian packets:
C GPAMPR='string'...Name of the input file with ...
C Default: GPAMPR='gpampr.out'
C GPAMPI='string'...Name of the input file with ...
C Default: GPAMPR='gpampi.out'
C Names of output files:
C GPMSEC='string'... Name of the output file containing
C migrated section.
C Default: GPMSEC='gpmsec.out'
C Data specifying the dimensions of the input grid:
C O1=real, O2=real ... Coordinates of the origin of the grid.
C Default: O1=0., O2=0.
C D1=real... Grid interval along the X1 axis.
C Default: D1=1.
C D2=real... Grid interval along the X2 axis.
C Default: D2=1.
C N1=positive integer... Number of gridpoints along the X1 axis.
C Default: N1=1
C N2=positive integer... Number of gridpoints along the X2 axis.
C Default: N2=1
C
C Input unformatted file RAYALL:
C See the description within source code file 'writ.for'.
C Description of files CRT-R
C
C Input unformatted file INIALL:
C See the description within source code file 'writ.for'.
C Description of files CRT-I
C
C-----------------------------------------------------------------------
C
C Subroutines and external functions required:
EXTERNAL AP00
C AP00... File 'ap.for'.
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 O1,O2,D1,D2,PI,KAPPA,X1,X2,R1,R2,R4,R4A,W1,W2,W4
REAL HI(18),H(18),HUI(9),HH(3,3)
REAL VI1,VI2,VI3,VI,V1,V2,V3,V
REAL GPVAL,GPMIN,GPMAX,RFAR,RFAI,AK0,DETT
REAL TR,GPAR,GPAI,DXR,DTR,DOMEGA,DPR,OXR,OTR,OOMEGA,OPR,DT,D
COMPLEX M0(4,4),N(4,4),M(4,4),C,Q1,Q2,Q3,Q4,P1,P2,P3,P4,DET,N44
COMPLEX GPIMAGE,GPEXP,GP1,GP2,GPA
INTEGER I,J,K,L,IGRD
INTEGER LU1,LU2,LU3,LU4,LU5,LU6,LU7,LU8,LU9,LU10,LU11
INTEGER IRAM(MRAM)
INTEGER ITR,NTR,IOMEGA,NOMEGA,N1,N2,N1N2,ISH
INTEGER IXR,NXR,IPR,NPR,NXPT,NXPTO,IGRDA,IGRDB,IGRDC,IGRDG
INTEGER IHISTORY,NHISTORY,IXTZL,IXTZR,IXTZU,IXTZD,IPROLD,IXROLD
INTEGER IX1,IX2,IX1U,IX1D,IX2L,IX2R
INTEGER INUM,IMTT,IAPR,IAPI,IGPMSEC,IGPAPTZ
INTEGER IGPAR,IGPAI,IFGBR,IFGBI,IX1NEW,IX2NEW,IGRDNEW,ID
LOGICAL TZONE
PARAMETER (LU1=21,LU2=22,LU3=23,LU4=24,LU5=25,LU6=26,LU7=27)
PARAMETER (LU8=28,LU9=29,LU10=30,LU11=31,LU12=32,LU13=33)
PARAMETER (LU14=34,LU15=35)
CHARACTER*80 FILSEP,RAYALL,INIALL,NUM,MTT,APR,API,GPK0
CHARACTER*80 GPAMPR,GPAMPI,FGBY22,FGBR22,GPGRID,GPMSEC,GPAPTZ
EQUIVALENCE (IRAM,RAM)
C PARAMETER (GPMIN=1.0E-10)
PARAMETER (GPMIN=0.0)
PARAMETER (PI=3.141592654)
C.......................................................................
C Reading main input data:
FILSEP=' '
WRITE(*,'(A)')'+GPMIG: Enter filename : '
READ(*,*) FILSEP
IF(FILSEP.EQ.' ') THEN
C GPMIG-01
CALL ERROR('GPMIG-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)')'+GPMIG: Reading, calculating... '
C Reading all the data from the SEP file into the memory:
CALL RSEP1(LU1,FILSEP)
C Reading filenames of the files with computed rays and
C multivalued travel times
CALL RSEP3T('RAYALL',RAYALL,'r01.out')
CALL RSEP3T('INIALL',INIALL,'r01i.out')
CALL RSEP3T('NUM',NUM,'mtt-num.out')
CALL RSEP3T('MTT',MTT,'mtt-tt.out')
CALL RSEP3T('APR',APR,'mtt-apr.out')
C CALL RSEP3T('API',API,'mtt-api.out')
CALL RSEP3T('GPAMPR',GPAMPR,'gpampr.out')
CALL RSEP3T('GPAMPI',GPAMPI,'gpampi.out')
C CALL RSEP3T('FGBR22',FGBR22,'fgbr22.out')
C CALL RSEP3T('FGBY22',FGBY22,'fgby22.out')
CALL RSEP3T('GPGRID',GPGRID,'gpgrid.out')
CALL RSEP3T('GPK0',GPK0,'gpm-par.out')
C Reading filenames of the output files
CALL RSEP3T('GPMSEC',GPMSEC,'gpmsec.out')
C CALL RSEP3T('GPAPTZ',GPAPTZ,'gpaptz.out')
CALL RSEP3I('N1',N1,1)
CALL RSEP3I('N2',N2,1)
CALL RSEP3R('D1',D1,4.)
CALL RSEP3R('D2',D2,4.)
CALL RSEP3R('O1',O1,0.)
CALL RSEP3R('O2',O2,0.)
CALL RSEP3R('DT',DT,0.1)
CALL RSEP3I('IXTZU',IXTZU,1)
CALL RSEP3I('IXTZD',IXTZD,1)
CALL RSEP3I('IXTZL',IXTZL,1)
CALL RSEP3I('IXTZR',IXTZR,1)
CALL RSEP3R('KAPPA',KAPPA,1.253314137)
OPEN(LU2,FILE=RAYALL,FORM='UNFORMATTED',STATUS='OLD')
OPEN(LU3,FILE=INIALL,FORM='UNFORMATTED',STATUS='OLD')
OPEN(LU4,FILE=NUM,FORM='FORMATTED',STATUS='OLD')
OPEN(LU5,FILE=MTT,FORM='FORMATTED',STATUS='OLD')
OPEN(LU6,FILE=APR,FORM='FORMATTED',STATUS='OLD')
C OPEN(LU7,FILE=API,FORM='FORMATTED',STATUS='OLD')
OPEN(LU8,FILE=GPAMPR,FORM='FORMATTED',STATUS='OLD')
OPEN(LU9,FILE=GPAMPI,FORM='FORMATTED',STATUS='OLD')
C OPEN(LU10,FILE=FGBR22,FORM='FORMATTED',STATUS='OLD')
C OPEN(LU11,FILE=FGBY22,FORM='FORMATTED',STATUS='OLD')
OPEN(LU12,FILE=GPGRID,FORM='FORMATTED',STATUS='OLD')
OPEN(LU13,FILE=GPK0,FORM='FORMATTED',STATUS='OLD')
OPEN(LU14,FILE=GPMSEC,FORM='FORMATTED')
C OPEN(LU15,FILE=GPAPTZ,FORM='FORMATTED')
N1N2=N1*N2
ISH=2*N1N2+1
READ(LU12,*) OXR,OPR,OTR,OOMEGA,DXR,DPR,DTR,DOMEGA,
* NXR,NPR,NTR,NOMEGA
NXPT =NXR*NPR*NTR
NXPTO=NXPT*NOMEGA
READ(LU13,*) AK0
CALL RARRAI(LU4,' ','FORMATTED',.FALSE.,0,N1N2,IRAM)
IRAM(N1N2+1)=0
DO 10 IGRD=1,N1N2
IRAM(N1N2+IGRD+1)=IRAM(N1N2+IGRD)+IRAM(IGRD)
10 CONTINUE
IF(3*N1N2+2*IRAM(ISH)+1.GT.MRAM) THEN
C GPMIG-02
CALL ERROR('GPMIG-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
CALL RARRAY(LU5,' ','FORMATTED',.FALSE.,0.,IRAM(ISH),
* RAM(ISH+1))
CALL RARRAY(LU6,' ','FORMATTED',.FALSE.,1.,IRAM(ISH),
* RAM(ISH+IRAM(ISH)+1))
C CALL RARRAY(LU7,' ','FORMATTED',.FALSE.,1.,IRAM(ISH),
C * RAM(ISH+2*IRAM(ISH)+1))
CALL RARRAY(LU8,' ','FORMATTED',.FALSE.,0.,NXPTO,
* RAM(ISH+3*IRAM(ISH)+1))
CALL RARRAY(LU9,' ','FORMATTED',.FALSE.,0.,NXPTO,
* RAM(ISH+3*IRAM(ISH)+NXPTO+1))
C CALL RARRAY(LU10,' ','FORMATTED',.FALSE.,0.,NXPT,
C * RAM(ISH+3*IRAM(ISH)+2*NXPTO+1))
C CALL RARRAY(LU11,' ','FORMATTED',.FALSE.,0.,NXPT,
C * RAM(ISH+3*IRAM(ISH)+2*NXPTO+NXPT+1))
INUM =N1N2
IMTT =ISH
IAPR =ISH+IRAM(ISH)
IAPI =ISH+2*IRAM(ISH)
IGPAR =ISH+3*IRAM(ISH)
IGPAI =ISH+3*IRAM(ISH)+NXPTO
IFGBR =ISH+3*IRAM(ISH)+2*NXPTO
IFGBI =ISH+3*IRAM(ISH)+2*NXPTO+NXPT
IGPMSEC=ISH+3*IRAM(ISH)+2*NXPTO+2*NXPT
C IGPAPTZ=IGPMSEC+N1N2
IGPAPTZ=IGPMSEC+N1N2+2301*751
IF((IXTZU.LT.1).OR.(IXTZU.GT.N1)) THEN
IXTZU=1
END IF
IF((IXTZD.LT.1).OR.(IXTZD.GT.N1)) THEN
IXTZD=N1
END IF
IF((IXTZL.LT.1).OR.(IXTZL.GT.N2)) THEN
IXTZL=1
END IF
IF((IXTZR.LT.1).OR.(IXTZR.GT.N2)) THEN
IXTZR=N2
END IF
IXROLD=0
IPROLD=0
DO 12 I=1,N1N2
RAM(IGPMSEC+I)=0.0
C RAM(IGPMSEC+I)=1.0E20
12 CONTINUE
DO 15 I=IXTZU,IXTZD
DO 14 J=IXTZL,IXTZR
RAM(IGPMSEC+N2*(N1-I)+J)=0.0
14 CONTINUE
15 CONTINUE
DO 18 I=1,NXTPO
RAM(IGPAPTZ+I)=0.0
18 CONTINUE
C Loop for the points of rays
20 CONTINUE
C Reading the results of the complete ray tracing
CALL AP00(0,LU2,LU3)
CALL AP03(0,HI,H,HUI)
IF(IWAVE.LT.1)THEN
C End of rays
GO TO 100
END IF
IF (IPT.LE.1) THEN
C New ray
IXR=NINT((YI(4)-OXR)/DXR)+1
IPR=NPR-NINT((YI(7)-OPR)/DPR)
C IF ((YLI(1)*YI(4)).LE.-1.000001) THEN
C IPR=IPROLD-1
C ELSE IF ((YLI(1)*YI(4)).GE.0.999999) THEN
C IPR=IPROLD-1
C END IF
C IPROLD=IPR
C IF (IPR.EQ.1) THEN
C IPROLD=NPR+1
C END IF
IF ((IPR.EQ.IPROLD).AND.(IXR.EQ.IXROLD)) THEN
GO TO 20
END IF
IXROLD=IXR
IPROLD=IPR
C WRITE(*,'(A,1(G16.6,1X))') '(YI(4)-OXR)/DXR=',(YI(4)-OXR)/DXR
C WRITE(*,'(A,1(G16.6,1X))') '(YI(7)-OPR)/DPR=',(YI(7)-OPR)/DPR
C WRITE(*,'(A,1(G16.6,1X))') 'YI(4) =',YI(4)
C WRITE(*,'(A,1(G16.6,1X))') 'YI(7) =',YI(7)
C WRITE(*,'(A,I6)') 'IXR =',IXR
C WRITE(*,'(A,I6)') 'IPR =',IPR
WRITE(*,'(A,I6,A,I6)') 'IXR =',IXR,' IPR =',IPR
HH(1,1)= HI(1)
HH(2,1)= HI(2)
HH(3,1)= HI(3)
HH(1,2)= HI(4)
HH(2,2)= HI(5)
HH(3,2)= HI(6)
HH(1,3)=-HI(7)
HH(2,3)=-HI(8)
HH(3,3)=-HI(9)
VI =YLI(1)
VI1 =YLI(4)*HH(1,1)+YLI(5)*HH(2,1)+YLI(6)*HH(3,1)
VI2 =YLI(4)*HH(1,2)+YLI(5)*HH(2,2)+YLI(6)*HH(3,2)
VI3 =YLI(4)*HH(1,3)+YLI(5)*HH(2,3)+YLI(6)*HH(3,3)
END IF
IX1=NINT((Y(5)-O1)/D1)+1
IX2=NINT((Y(4)-O2)/D2)+1
C IF(IX1.GT.IXTZD) THEN
C GO TO 20
C ELSE IF(IX1.LT.IXTZU) THEN
C GO TO 20
C ELSE IF(IX2.GT.IXTZR) THEN
C GO TO 20
C ELSE IF(IX2.LT.IXTZL) THEN
C GO TO 20
C END IF
IF(IX1.GT.(IXTZD+20)) THEN
GO TO 20
ELSE IF(IX1.LT.(IXTZU-20)) THEN
GO TO 20
ELSE IF(IX2.GT.(IXTZR+20)) THEN
GO TO 20
ELSE IF(IX2.LT.(IXTZL-20)) THEN
GO TO 20
END IF
C IX1U=IX1-9
C IX1D=IX1+10
C IX2L=IX2-9
C IX2R=IX2+10
IX1U=IX1-14
IX1D=IX1+15
IX2L=IX2-14
IX2R=IX2+15
C IX1U=IX1-49
C IX1D=IX1+50
C IX2L=IX2-49
C IX2R=IX2+50
IF(IX1D.GT.IXTZD) THEN
IX1D=IXTZD
END IF
IF(IX1U.LT.IXTZU) THEN
IX1U=IXTZU
END IF
IF(IX2R.GT.IXTZR) THEN
IX2R=IXTZR
END IF
IF(IX2L.LT.IXTZL) THEN
IX2L=IXTZL
END IF
C IX1U=IXTZU
C IX1D=IXTZD
C IX2L=IXTZL
C IX2R=IXTZR
C WRITE(*,'(A,I6)') 'IX1 =',IX1
C WRITE(*,'(A,I6)') 'IX2 =',IX2
C WRITE(*,'(A,I6)') 'IX1U =',IX1U
C WRITE(*,'(A,I6)') 'IX1D =',IX1D
C WRITE(*,'(A,I6)') 'IX2L =',IX2L
C WRITE(*,'(A,I6)') 'IX2R =',IX2R
W1=-Y(8)
W2=-Y(7)
W4=-1.0
C Loop over time in the common-shot gather
DO 90 ITR=1,NTR
C WRITE(*,'(A,I6)') 'ITR =',ITR
C WRITE(*,'(A,I6)') 'NTR =',NTR
TR=OTR+DTR*(ITR-1)
R4A=Y(1)-TR
C Loop over frequency
DO 80 IOMEGA=1,NOMEGA
OMEGA=OOMEGA+DOMEGA*(IOMEGA-1)
C IF((1.5*D1*OMEGA).GE.(PI*YL(1))) THEN
C IF(ABS(D1*OMEGA*YI(7)).GE.PI) THEN
C GO TO 79
C END IF
C IF(((IXR.NE.20).OR.(IPR.NE.12)).OR.
C * ((ITR.NE.8).OR.(IOMEGA.NE.40))) THEN
C GO TO 79
C END IF
C AK0=30.0
C IF(((IXR.NE.10).OR.(IPR.NE.14)).OR.
C * (IOMEGA.NE.10)) THEN
C GO TO 79
C END IF
C IF(((IXR.NE.10).OR.(IPR.NE.8)).OR.
C * (ITR.NE.20)) THEN
C GO TO 79
C END IF
C WRITE(*,'(A,1(G16.6,1X))') 'Y(1) =',Y(1)
C IF(NINT(Y(1)/DT).NE.15) THEN
C GO TO 79
C END IF
C IF((IXR.NE.10).OR.(IPR.NE.8)) THEN
C GO TO 79
C END IF
C IF(IXR.NE.25) THEN
C GO TO 79
C END IF
C Initial shape of GPs
DO 25 I=1,4
DO 24 J=1,4
N(I,J) =CMPLX(0.0,0.0)
M0(I,J)=CMPLX(0.0,0.0)
24 CONTINUE
25 CONTINUE
IGRD=((IXR-1)*NPR+IPR-1)*NTR+ITR
C N44=CMPLX(0.0,0.25E-6)*CMPLX(0.0,AK0)
C * /CMPLX(0.0,0.25E-6*OMEGA-AK0*YI(7)**2)
N44=CMPLX(-0.25E-6,0.25E-6)*CMPLX(0.0,AK0)
* /CMPLX(-0.25E-6*OMEGA,0.25E-6*OMEGA-AK0*YI(7)**2)
C N(2,2)=CMPLX(RAM(IFGBR+IGRD),RAM(IFGBI+IGRD))+N44*YI(7)**2
C N(2,2)=CMPLX(-0.25E-6,0.25E-6)+N44*YI(7)**2
C N(2,4)=-N44*YI(7)
C N(4,2)=N(2,4)
C N(4,4)=N44
M0(4,4)= N44
M0(3,3)=(M0(4,4)-VI3)/VI**2
M0(3,2)=-VI2/VI**2
M0(2,3)= M0(3,2)
M0(4,3)=-M0(4,4)/VI
M0(3,4)= M0(4,3)
C M0(2,2)=(CMPLX(RAM(IFGBR+IGRD),RAM(IFGBI+IGRD))
C * +2.0*VI2*HH(2,2)*HH(2,3)/VI**2
C * +VI3*HH(3,2)*HH(3,2)/VI**2)/HH(2,2)**2
C M0(2,2)=(CMPLX(-0.25E-6,0.25E-6)
C * +2.0*VI2*HH(2,2)*HH(2,3)/VI**2
C * +VI3*HH(3,2)*HH(3,2)/VI**2)/HH(2,2)**2
C M0(2,2)=(CMPLX(0.0,0.25E-6)
C * -2.0*VI2*HI(5)*HI(8)/VI**2
C * +VI3*HI(8)*HI(8)/VI**2)/HI(5)**2
M0(2,2)=(CMPLX(-0.25E-6,0.25E-6)
* -2.0*VI2*HI(5)*HI(8)/VI**2
* +VI3*HI(8)*HI(8)/VI**2)/HI(5)**2
C M0(1,1)=CMPLX(-REAL(M0(1,1)), AIMAG(M0(1,1)))
C M0(1,2)=CMPLX(-REAL(M0(1,2)), AIMAG(M0(1,2)))
C M0(1,3)=CMPLX(-REAL(M0(1,3)), AIMAG(M0(1,3)))
C M0(1,4)=CMPLX( REAL(M0(1,4)),-AIMAG(M0(1,4)))
C M0(2,1)=CMPLX(-REAL(M0(2,1)), AIMAG(M0(2,1)))
C M0(2,2)=CMPLX(-REAL(M0(2,2)), AIMAG(M0(2,2)))
C M0(2,3)=CMPLX(-REAL(M0(2,3)), AIMAG(M0(2,3)))
C M0(2,4)=CMPLX( REAL(M0(2,4)),-AIMAG(M0(2,4)))
C M0(3,1)=CMPLX(-REAL(M0(3,1)), AIMAG(M0(3,1)))
C M0(3,2)=CMPLX(-REAL(M0(3,2)), AIMAG(M0(3,2)))
C M0(3,3)=CMPLX(-REAL(M0(3,3)), AIMAG(M0(3,3)))
C M0(3,4)=CMPLX( REAL(M0(3,4)),-AIMAG(M0(3,4)))
C M0(4,1)=CMPLX( REAL(M0(4,1)),-AIMAG(M0(4,1)))
C M0(4,2)=CMPLX( REAL(M0(4,2)),-AIMAG(M0(4,2)))
C M0(4,3)=CMPLX( REAL(M0(4,3)),-AIMAG(M0(4,3)))
C M0(4,4)=CMPLX(-REAL(M0(4,4)), AIMAG(M0(4,4)))
HH(1,1)= H(1)
HH(2,1)= H(2)
HH(3,1)= H(3)
HH(1,2)= H(4)
HH(2,2)= H(5)
HH(3,2)= H(6)
HH(1,3)=-H(7)
HH(2,3)=-H(8)
HH(3,3)=-H(9)
V =YL(1)
V1=YL(4)*HH(1,1)+YL(5)*HH(2,1)+YL(6)*HH(3,1)
V2=YL(4)*HH(1,2)+YL(5)*HH(2,2)+YL(6)*HH(3,2)
V3=YL(4)*HH(1,3)+YL(5)*HH(2,3)+YL(6)*HH(3,3)
C C=M0(4,4)+CMPLX(0.0,0.5)*(M0(1,4)**2+M0(2,4)**2)
C * /AIMAG(M0(2,2))
C=M0(4,4)
Q1= Y(12)-Y(20)*M0(1,1)-Y(24)*M0(2,1)
Q2= Y(13)-Y(21)*M0(1,1)-Y(25)*M0(2,1)
Q3= Y(16)-Y(20)*M0(1,2)-Y(24)*M0(2,2)
Q4= Y(17)-Y(21)*M0(1,2)-Y(25)*M0(2,2)
P1=-Y(14)+Y(22)*M0(1,1)+Y(26)*M0(2,1)
P2=-Y(15)+Y(23)*M0(1,1)+Y(27)*M0(2,1)
P3=-Y(18)+Y(22)*M0(1,2)+Y(26)*M0(2,2)
P4=-Y(19)+Y(23)*M0(1,2)+Y(27)*M0(2,2)
DET = Q1*Q4-Q2*Q3
M(1,1)= (P1*Q4-P3*Q2)/DET
M(2,1)= (P2*Q4-P4*Q2)/DET
M(1,2)= M(2,1)
M(2,2)= (P4*Q1-P2*Q3)/DET
M(1,4)=(Q4*M0(1,4)-Q2*M0(2,4))/DET
M(2,4)=(Q1*M0(2,4)-Q3*M0(1,4))/DET
M(4,1)= M(1,4)
M(4,2)= M(2,4)
M(1,3)=-M(1,4)/V-V1/V**2
M(2,3)=-M(2,4)/V-V2/V**2
M(3,1)= M(1,3)
M(3,2)= M(2,3)
M(4,4)= C-CMPLX(0.0,0.5)*(M0(1,4)**2*(Q3**2+Q4**2)
* -2.0*M0(1,4)*M0(2,4)*(Q1*Q3+Q2*Q4)
* +M0(2,4)**2*(Q1**2+Q2**2))
* /(AIMAG(M(2,2))*DET**2)
M(3,4)=-M(4,4)/V
M(4,3)= M(3,4)
M(3,3)=(M(4,4)-V3)/V**2
C M(1,1)=CMPLX(-REAL(M(1,1)), AIMAG(M(1,1)))
C M(1,2)=CMPLX(-REAL(M(1,2)), AIMAG(M(1,2)))
C M(1,4)=CMPLX( REAL(M(1,4)),-AIMAG(M(1,4)))
C M(2,1)=CMPLX(-REAL(M(2,1)), AIMAG(M(2,1)))
C M(2,2)=CMPLX(-REAL(M(2,2)), AIMAG(M(2,2)))
C M(2,4)=CMPLX( REAL(M(2,4)),-AIMAG(M(2,4)))
C M(4,1)=CMPLX( REAL(M(4,1)),-AIMAG(M(4,1)))
C M(4,2)=CMPLX( REAL(M(4,2)),-AIMAG(M(4,2)))
C M(4,4)=CMPLX(-REAL(M(4,4)), AIMAG(M(4,4)))
C M(1,3)=-M(1,4)/V-V1/V**2
C M(2,3)=-M(2,4)/V-V2/V**2
C M(3,1)= M(1,3)
C M(3,2)= M(2,3)
C M(3,3)=(M(4,4)-V3)/V**2
C M(3,4)=-M(4,4)/V
C M(4,3)= M(3,4)
C M(1,3)=CMPLX(-REAL(M(1,3)), AIMAG(M(1,3)))
C M(2,3)=CMPLX(-REAL(M(2,3)), AIMAG(M(2,3)))
C M(3,1)=CMPLX(-REAL(M(3,1)), AIMAG(M(3,1)))
C M(3,2)=CMPLX(-REAL(M(3,2)), AIMAG(M(3,2)))
C M(3,3)=CMPLX(-REAL(M(3,3)), AIMAG(M(3,3)))
C M(3,4)=CMPLX( REAL(M(3,4)),-AIMAG(M(3,4)))
C M(4,3)=CMPLX( REAL(M(4,3)),-AIMAG(M(4,3)))
N(4,4)=M(4,4)
DO 43 I=1,3
N(I,4)=CMPLX(0.0,0.0)
DO 42 J=1,3
N(I,4)=N(I,4)+M(J,4)*HH(I,J)
N(4,I)=N(I,4)
N(I,J)=CMPLX(0.0,0.0)
DO 41 K=1,3
DO 40 L=1,3
N(I,J)=N(I,J)+M(K,L)*HH(I,K)*HH(J,L)
40 CONTINUE
41 CONTINUE
42 CONTINUE
43 CONTINUE
C Loop over ray history
IX1=NINT((Y(5)-O1)/D1)+1
IX2=NINT((Y(4)-O2)/D2)+1
NHISTORY=IRAM(N1*(IX2-1)+IX1)
DO 45 IHISTORY=1,NHISTORY
R4=R4A+RAM(IMTT+IRAM(INUM+N1*(IX2-1)+IX1)+IHISTORY)
IF(ABS(R4).LT.2.0*SQRT(1.0/(OMEGA*AIMAG(N(4,4))))) THEN
GO TO 46
END IF
45 CONTINUE
C WRITE(*,'(A,1(G16.6,1X))') 'huh =',R4
GO TO 79
46 CONTINUE
C Initial amplitudes of GPs
IGRD=(((IXR-1)*NTR+ITR-1)*NPR+IPR-1)*NOMEGA+IOMEGA
GPAR=RAM(IGPAR+IGRD)
GPAI=RAM(IGPAI+IGRD)
C GPAR=500.0
C WRITE(*,'(A,1(G16.6,1X))') 'GPAR =',GPAR
C WRITE(*,'(A,1(G16.6,1X))') 'GPAI =',GPAI
IF(((GPAR.GT.-100.0).AND.(GPAR.LT.100.0)).AND.
* ((GPAI.GT.-100.0).AND.(GPAI.LT.100.0))) THEN
GO TO 79
END IF
C Amplitudes of GPs
GPA=SQRT(CMPLX(0.0,1.0)*(Y(20)*Y(25)-Y(21)*Y(24))
* /(ABS(Y(20)*Y(25)-Y(21)*Y(24))*DET))
GPA=CMPLX(ABS(REAL(GPA)),AIMAG(GPA))
GPA=GPA*CMPLX(GPAR,GPAI)*SQRT(VI/V)
* *CEXP(CMPLX(0.0,1.0)*PI/2.0*(KMAH-0.5))
GPAR= REAL(GPA)
GPAI=AIMAG(GPA)
C WRITE(*,'(A,I6,A,I6,A,I6,A,I6)') 'IXR=',IXR,' ITR=',ITR,
C * ' IPR=',IPR,' IOMEGA=',IOMEGA
C WRITE(*,'(A,1(G16.6,1X),A,1(G16.6,1X))') 'GPAR=',GPAR,
C * ' GPAI=',GPAI
IGRDG=IGPAPTZ+IGRD
C IX1=IXTZU
IX1=IX1U
C Loops over the target zone
50 CONTINUE
IX1=IX1+1
C IF(IX1.GT.IXTZD) THEN
C GO TO 79
C END IF
IF(IX1.GT.IX1D) THEN
GO TO 79
END IF
IGRDA=N2*(IX1-1)
X1=O1+D1*(IX1-1)
R1=X1-Y(5)
C IX2=IXTZL
IX2=IX2L
60 CONTINUE
IX2=IX2+1
C IF(IX2.GT.IXTZR) THEN
C GO TO 50
C END IF
IF(IX2.GT.IX2R) THEN
GO TO 50
END IF
C IGRDB=IGRDA+IX2
IGRDB=N1*(IX2-1)+IX1
C IGRDC=N2*(IX1-1)+IX2
IGRDC=N2*(N1-IX1)+IX2
X2=O2+D2*(IX2-1)
R2=X2-Y(4)
C GPEXP=CMPLX(0.0,OMEGA)*(R1*W1+R2*W2
C * +0.5*R1*R1*N(3,3)+R1*R2*N(3,2)+0.5*R2*R2*N(2,2))
C * -(KAPPA*(R1*W1+R2*W2)/DT)**2
GPEXP=CMPLX(0.0,OMEGA)*(R1*W1+R2*W2
* +0.5*R1*R1*N(3,3)+R1*R2*N(3,2)+0.5*R2*R2*N(2,2))
* -(KAPPA*(R1*Y(8)+R2*Y(7))/DT)**2
GP1=CMPLX(0.0,0.0)
GP2=CMPLX(0.0,0.0)
NHISTORY=IRAM(IGRDB)
C WRITE(*,'(A,I6)') 'NHISTORY =',NHISTORY
C Loop over ray history
DO 70 IHISTORY=1,NHISTORY
J=IRAM(INUM+IGRDB)+IHISTORY
R4=R4A+RAM(IMTT+J)
C R4=R4A+1.0
C R4=-R4
C WRITE(*,'(A,1(G16.6,1X))') 'R4 =',R4
GPIMAGE=CEXP(GPEXP+CMPLX(0.0,OMEGA)*(R4*W4
* +R1*R4*N(3,4)+R2*R4*N(2,4)
* +0.5*R4*R4*N(4,4)))
RFAR=RAM(IAPR+J)*1.0E10
C RFAI=RAM(IAPI+J)*1.0E10
C RFAR=1.0
RFAI=0.0
GP1=GP1+CMPLX(RFAR,-RFAI)*CMPLX(GPAR,GPAI)*GPIMAGE
GP2=GP2+CMPLX(RFAR,-RFAI)*CMPLX(RFAR,RFAI)
69 CONTINUE
70 CONTINUE
IF((REAL(GP2).NE.0.0).OR.(AIMAG(GP2).NE.0.0)) THEN
I =IGPMSEC+IGRDC
RAM(I) =RAM(I)+REAL(GP1/GP2)
C RAM(I) =RAM(I)+AIMAG(GP1/GP2)
C RAM(IGRDG)=RAM(IGRDG)+RAM(I)
END IF
GO TO 60
GO TO 50
79 CONTINUE
80 CONTINUE
90 CONTINUE
GO TO 20
100 CONTINUE
C Interpolating output grid values
WRITE(*,'(A)')'+GPMIG: Interpolating... '
DO 105 I=1,1728051
RAM(IGPMSEC+N1N2+I)=0.0
105 CONTINUE
D= D1/4.0
ID=NINT(D)
IF(ID.EQ.1) THEN
DO 107 I=1,1728051
RAM(IGPMSEC+N1N2+I)=RAM(IGPMSEC+I)
107 CONTINUE
GO TO 160
END IF
DO 115 IX2=1,N2
IX2NEW=(IX2-1)*ID+1
DO 110 IX1=1,N1
IX1NEW=(IX1-1)*ID+1
IGRD = N2*(IX1 -1)+IX2
IGRDNEW=2301*(IX1NEW-1)+IX2NEW
RAM(IGPMSEC+N1N2+IGRDNEW)=RAM(IGPMSEC+IGRD)
110 CONTINUE
115 CONTINUE
C GO TO 160
DO 130 IX2=1,N2
IX2NEW=(IX2-1)*ID+1
DO 125 IX1=1,N1
IX1NEW=(IX1-1)*ID+1
C IGRDNEW=751*(IX2NEW-1)+IX1NEW
IGRDNEW=2301*(IX1NEW-1)+IX2NEW
DO 120 I=1,751
IF(I.NE.IX1NEW) THEN
C IGRD=751*(IX2NEW-1)+I
IGRD=2301*(I-1)+IX2NEW
RAM(IGPMSEC+N1N2+IGRD)=RAM(IGPMSEC+N1N2+IGRD)
* +RAM(IGPMSEC+N1N2+IGRDNEW)
* *SIN(PI*(I-IX1NEW)/D)/(PI*(I-IX1NEW)/D)
END IF
120 CONTINUE
125 CONTINUE
130 CONTINUE
DO 150 I=1,751
DO 145 IX2=1,N2
IX2NEW=(IX2-1)*ID+1
C IGRDNEW=751*(IX2NEW-1)+I
IGRDNEW=2301*(I-1)+IX2NEW
DO 140 J=1,2301
IF(J.NE.IX2NEW) THEN
C IGRD=751*(J-1)+I
IGRD=2301*(I-1)+J
RAM(IGPMSEC+N1N2+IGRD)=RAM(IGPMSEC+N1N2+IGRD)
* +RAM(IGPMSEC+N1N2+IGRDNEW)
* *SIN(PI*(J-IX2NEW)/D)/(PI*(J-IX2NEW)/D)
END IF
140 CONTINUE
145 CONTINUE
150 CONTINUE
160 CONTINUE
C Writing output grid values
C IF(GPMSEC.NE.' ') THEN
C CALL WARRAY(LU14,' ','FORMATTED',.FALSE.,0.,.FALSE.,0.,
C * N1N2,RAM(IGPMSEC+1))
C END IF
IF(GPMSEC.NE.' ') THEN
CALL WARRAY(LU14,' ','FORMATTED',.FALSE.,0.,.FALSE.,0.,
* 1728051,RAM(IGPMSEC+N1N2+1))
END IF
C IF(GPAPTZ.NE.' ') THEN
C CALL WARRAY(LU15,' ','FORMATTED',.FALSE.,0.,.FALSE.,0.,
C * NXTPO,RAM(IGPAPTZ+1))
C END IF
CLOSE(LU2)
CLOSE(LU3)
CLOSE(LU4)
CLOSE(LU5)
CLOSE(LU6)
C CLOSE(LU7)
CLOSE(LU8)
CLOSE(LU9)
C CLOSE(LU10)
C CLOSE(LU11)
CLOSE(LU12)
CLOSE(LU13)
CLOSE(LU14)
C CLOSE(LU15)
STOP
END
C
C=======================================================================
C
INCLUDE 'error.for'
C error.for
INCLUDE 'length.for'
C length.for
INCLUDE 'sep.for'
C sep.for
INCLUDE 'ap.for'
C ap.for
INCLUDE 'forms.for'
C forms.forC
C
C=======================================================================
C