C
C Program GPSTEP to calculate the discretization steps C for the decomposition of the wavefield into optimized C 2-D Gaussian packets C C Version: 6.00 C Date: 2006, May 31 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'. EXTERNAL PARM1 C PARM1...File 'parm.for'. EXTERNAL PARM2 C PARM2...File 'parm.for'. C----------------------------------------------------------------------- C Common block /RAMC/: INCLUDE 'ram.inc' C ram.inc INCLUDE 'sep.inc' C sep.inc INCLUDE 'model.inc' C model.inc INCLUDE 'auxmod.inc' C auxmod.inc C----------------------------------------------------------------------- C Auxiliary storage locations: REAL DX,DT,FMAX,FMIN,OMEGAMAX,VSURF,FREF,OMEGAREF INTEGER LU1,LU2,LU3,LU4,LU5 INTEGER IRAM(MRAM) INTEGER IXR,IPR,ISHOT INTEGER N,NX,NT,NXR,NTR,NPR,NOMEGA REAL DXR,DTR,DPR,DOMEGA,OXR,OPR,OOMEGA REAL XR,PR,KAPPA,PI,VEL,HUH REAL PRMIN,PRMAX,ANIMIN,ANIMAX,ANRMIN,ANRMAX,PARK,PARN REAL AK0,AK0D,THETA REAL COOR(3),RHO COMPLEX AN,ANDD,AN0,AMPL,N44,N44D PARAMETER (LU1=21,LU2=22,LU3=23,LU4=24,LU5=25) PARAMETER (LU6=26,LU7=27,LU8=28,LU9=29,LU10=30,LU11=31) PARAMETER (PI=3.141592654) CHARACTER*80 FILSEP,FGBRMIN,FGBRMAX,FGBYMIN,FGBYMAX CHARACTER*80 GPGRID,GPPAR,RAYPAR,MODEL,SRC,CSG EQUIVALENCE (IRAM,RAM) C....................................................................... C Reading main input data: FILSEP=' ' WRITE(*,'(A)')'+GPSTEP: Enter filename : ' READ(*,*) FILSEP IF(FILSEP.EQ.' ') THEN C GPSTEP-01 CALL ERROR('GPSTEP-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)')'+GPSTEP: 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('FGBYMIN',FGBYMIN,'fgbymin.out') CALL RSEP3T('FGBYMAX',FGBYMAX,'fgbymax.out') CALL RSEP3T('FGBRMIN',FGBRMIN,'fgbrmin.out') CALL RSEP3T('FGBRMAX',FGBRMAX,'fgbrmax.out') CALL RSEP3T('MODEL',MODEL,'gpm-mod.dat') C CALL RSEP3T('MODEL',MODEL,'model2.dat') C Reading filenames of the output files CALL RSEP3T('GPPAR',GPPAR,'gpm-par.out') CALL RSEP3T('GPGRID',GPGRID,'gpgrid.out') CALL RSEP3T('RAYPAR',RAYPAR,'gpm-rp.dat') CALL RSEP3T('SRC',SRC,'gpm-src.dat') CALL RSEP3T('CSG',CSG,'gpm-csg.dat') CALL RSEP3I('NT',NT,750) CALL RSEP3I('NX',NX,116) CALL RSEP3R('DT',DT,0.004) CALL RSEP3R('DX',DX,25.0) CALL RSEP3I('SHOT',ISHOT,1) CALL RSEP3R('PARK',PARK,0.5) CALL RSEP3R('PARN',PARN,0.5) CALL RSEP3R('KAPPA',KAPPA,1.253314137) CALL RSEP3R('VSURF',VSURF,2000.) CALL RSEP3R('FMAX',FMAX,1.) CALL RSEP3R('FMIN',FMIN,1.) CALL RSEP3R('FREF',FREF,1.) OPEN(LU2,FILE=FGBYMIN,FORM='FORMATTED',STATUS='OLD') OPEN(LU3,FILE=FGBYMAX,FORM='FORMATTED',STATUS='OLD') OPEN(LU4,FILE=FGBRMIN,FORM='FORMATTED',STATUS='OLD') OPEN(LU5,FILE=FGBRMAX,FORM='FORMATTED',STATUS='OLD') OPEN(LU6,FILE=MODEL,FORM='FORMATTED',STATUS='OLD') OPEN(LU7,FILE=GPPAR,FORM='FORMATTED') OPEN(LU8,FILE=GPGRID,FORM='FORMATTED') OPEN(LU9,FILE=RAYPAR,FORM='FORMATTED') OPEN(LU10,FILE=SRC,FORM='FORMATTED') OPEN(LU11,FILE=CSG,FORM='FORMATTED') READ(LU2,*) ANIMIN READ(LU3,*) ANIMAX READ(LU4,*) ANRMIN READ(LU5,*) 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(LU7,'(1(G16.6,1X))') AK0 WRITE(LU7,'(1(G16.6,1X))') AK0D WRITE(LU7,'(1(G16.6,1X))') REAL(AN0) WRITE(LU7,'(1(G16.6,1X))') AIMAG(AN0) WRITE(LU7,'(1(G16.6,1X))') ANIMIN IF(OOMEGA.LT.OMEGAMAX) THEN DOMEGA=KAPPA*SQRT(2.0*AK0*AK0D/(AK0+AK0D)) N=NINT((OMEGAMAX-OOMEGA)/DOMEGA) NOMEGA=N+2 DOMEGA=(OMEGAMAX-OOMEGA)/(N+1) ELSE OOMEGA=OMEGAMAX DOMEGA=1.0 NOMEGA=1 END IF WRITE(*,'(A,1(G16.6,1X))') 'DF =',DOMEGA/(2.0*PI) WRITE(*,'(A,I6)') 'NF =',NOMEGA 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 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 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 OXR=150.0+ISHOT*25.0 OTR=0.0 WRITE(LU8,'(1(G16.6,1X))') OXR WRITE(LU8,'(1(G16.6,1X))') OPR WRITE(LU8,'(1(G16.6,1X))') OTR WRITE(LU8,'(1(G16.6,1X))') OOMEGA WRITE(LU8,'(1(G16.6,1X))') DXR WRITE(LU8,'(1(G16.6,1X))') DPR WRITE(LU8,'(1(G16.6,1X))') DTR WRITE(LU8,'(1(G16.6,1X))') DOMEGA WRITE(LU8,'(I6)') NXR WRITE(LU8,'(I6)') NPR WRITE(LU8,'(I6)') NTR WRITE(LU8,'(I6)') NOMEGA C CALL PARM1(LU6,1) CALL MODEL1(LU6) WRITE(LU9,'(A)') '''RPAR''' WRITE(LU9,'(A)') '0 0 0 /' WRITE(LU10,'(A)') '/' DO 20 IXR=1,NXR XR=OXR+(IXR-1)*DXR COOR(1)=0.0 COOR(2)=XR COOR(3)=12.0 WRITE(LU10,'(A,3(G16.6,1X),A)') * '''SRC'' ', COOR(1),COOR(2),COOR(3),' /' CALL PARM2(1,COOR,UP,US,RHO,QP,QS) VEL=UP(1) C VEL=2000.0 DO 10 IPR=1,NPR HUH=VEL*(OPR+(IPR-1)*DPR) IF(HUH.LT.-1.0) THEN THETA=-PI/2.0 ELSE IF(HUH.GT.1.0) THEN THETA=PI/2.0 ELSE THETA=ASIN(HUH) END IF WRITE(LU9,'(A,1(G16.6,1X),A)')'0 ',THETA,' 0 2 1 0 0.1 0.1 /' 10 CONTINUE WRITE(LU9,'(A)') '/' 20 CONTINUE WRITE(LU10,'(A)') '/' XR=3000.0+(ISHOT-1)*25.0 COOR(1)=0.0 COOR(2)=XR COOR(3)=12.0 WRITE(LU11,'(A)') '/' WRITE(LU11,'(A,3(G16.6,1X),A)') * '''SRC'' ', COOR(3),COOR(2),COOR(1),' /' WRITE(LU11,'(A)') '/' CLOSE(LU2) CLOSE(LU3) CLOSE(LU4) CLOSE(LU5) CLOSE(LU6) CLOSE(LU7) CLOSE(LU8) CLOSE(LU9) WRITE(*,'(A)') '+GPSTEP: 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.for INCLUDE 'model.for' C model.for INCLUDE 'srfc.for' C srfc.for INCLUDE 'metric.for' C metric.for INCLUDE 'parm.for' C parm.for INCLUDE 'val.for' C val.for INCLUDE 'fit.for' C fit.forC C C======================================================================= C