C
C Program RPPLOT to plot ray parameters C C Version: 5.90 C Date: 2005, May 10 C C Coded by Petr Bulant C Department of Geophysics, Charles University Prague, C Ke Karlovu 3, 121 16 Praha 2, Czech Republic, C http://sw3d.cz/staff/bulant.htm C C Program to create simple PostScript plot of the distribution of the C rays and homogeneous triangles either on the normalized ray domain or C on the reference surface. The program is able to plot any of following C objects: basic rays, two-point rays, auxiliary rays, homogeneous C triangles, receivers. Objects are colour-coded according to the C ray history, colours may be chosen. Rays are symbol-coded according C to the ray history, symbols and their heights may be chosen. The C limits of displayed part of the ray domain (or reference surface) C may also be given by input data. C C The program is intended for results of two-parametric ray tracing, C but may be also used to display results of one-parametric ray tracing. C Note that then the dimension of normalized ray domain is ANUM x BNUM C and there are no triangles and no auxiliary rays. C C....................................................................... C C Description of data files: C C Input data read from the standard input device (*): C The data are read by the list directed input (free format) and C consist of a single string 'SEP': C 'SEP'...String in apostrophes containing the name of the input C SEP parameter or history file with the input data. C No default, 'SEP' must be specified and cannot be blank. C C C Input data file 'SEP': C File 'SEP' has the form of the C SEP C parameter file. The parameters, which do not differ from their C defaults, need not be specified in file 'SEP'. C Integers describing, what is to be plotted: C IRBAS=integer ... 1 if basic rays are to be plotted. Other value C means that the basic rays are not to be plotted. C Default: IRBAS=1 C IRTWO=integer ... 1 if two-point rays are to be plotted. C Other value disables plotting of the two-point rays. C Default: IRTWO=1 C IRAUX=integer ... 1 if auxiliary rays are to be plotted. C Other value disables plotting of the auxiliary rays. C Default: IRAUX=1 C ITHOM=integer ... 1 if homogeneous triangles are to be plotted. C Other value disables plotting of the triangles. C Default: ITHOM=1 C ISANG=integer ... 1 if the distribution of rays and (or) triangles C on the normalized ray domain is to be plotted. Otherwise C the distribution of (end)points of the successful rays C on the receiver surface will be plotted. C Default: ISANG=1 C ISHP=integer ... 0 if objects of all histories are to be plotted, C otherwise only the objects of the history equal to ISHP C will be plotted. C Default: ISHP=0 C ISUC=integer ... 1 if objects of positive histories are to be C plotted in colors according to COLORS, and objects of C negative histories are to be ploted in black. Note that C positive ray histories correspond to the successful rays, C which pass the reference surface. C Otherwise objects of all histories are to be plotted C in colors according to file COLORS. C Default: ISUC=0 C ISRCS=nonnegative integer ... Index of the source for which ray C parameters are to be plotted. File 'CRT-I' with initial C points may contain several waves of several sources, but C only one elementary wave may be plotted by a single C invocation of RPPLOT. C For ISRCS=0 the first elementary wave from file 'CRT-I' C is plotted, regardless of its source index. C Default: ISRCS=0 C IWAVES=nonnegative integer ... Index of the wave to be plotted. C File 'CRT-I' with initial points may contain several C waves, but only one wave may be plotted by a single C invocation of RPPLOT. C For IWAVES=0 the first elementary wave from file 'CRT-I' C is plotted. C Default: IWAVES=0 C C Limits of the plot, either in normalized ray parameters (if ISANG=1), C or in reference surface coordinates. C PLIM1=real ... Minimum of first parameter (coordinate). C Default: PLIM1=0. C PLIM2=real ... Maximum of first parameter (coordinate). C Default: PLIM2=1. C PLIM3=real ... Minimum of second parameter (coordinate). C Default: PLIM3=0. C PLIM4=real ... Maximum of second parameter (coordinate). C Default: PLIM4=1. C C Heights of symbols on the resulting plot in centimeters: C HRBAS=real ... Height of symbols for basic rays. C Default: HRBAS=0.2 C HRTWO=real ... Height of symbols for two-point rays. C Default: HRTWO=0.2 C HRAUX=real ... Height of symbols for auxiliary rays. C Default: HRAUX=0.2 C HTEXT=real ... Height of the text along axes of the figure. C Default: HTEXT=0.5 C C Dimensiones of the plot in centimeters: C HSIZE=real ... Horizontal dimension of the plot. C Default: HSIZE=15. C VSIZE=real ... Vertical dimension of the plot. C Default: VSIZE=15. C C Initial PostScript instructions: C CALCOPS='string'... String with the PostScript instructions, see C file C calcops.for. C C Names of output and input files: C RPPLOT='string' ... Name of the output PostScript file with the C figure. If RPPLOT=' ' (default), files 'plot00.ps', C 'plot01.ps', ... are generated. C Default: RPPLOT=' ' C SYMBOLS='string' ... Name of the file with numbers of symbols. C This file has on each line a single integer number, C which is the number of symbol to be used for rays C and triangles of the history equal to number of the C line. I.e., on the first line is a number of symbol C to be used for plotting of rays and triangles with C history 1 or -1. C Description of file SYMBOLS. C Default: SYMBOLS=' ' C COLORS='string' ... Name of the file with numbers of colors. C Description of file COLORS. C Default: COLORS=' ' C CRTOUT='string'...File with the names of the output files of C program CRT. If blank, default names are considered. C For general description of file CRTOUT refer to file C writ.for. C Description specific to this program: C Just the first set of names of CRT output files is read C from file CRTOUT. Only files C 'CRT-I' and C 'CRT-T' C are read by RPPLOT. C Default: CRTOUT=' ' which means 'CRT-I'='s01i.out' and C 'CRT-T'='t01.out' C C Filename and parameters used for plotting receivers. Used only C when ISANG=0. C REC='string'... If non-blank, the name of the file with the names C and coordinates of the receiver points. C Description of file C REC. C Default: REC=' ' C RPAR='string'... String containing the name of the file with the C data specifying the take-off parameters of the calculated C rays. Only the values ISRFX1 and ISRFX2 are read from C RPAR. Data set RPAR must be in separate file, it must C not be appended to file DCRT. See the C description of data set C RPAR C in subroutine file 'rpar.for'. C Default: RPAR=' ' which means ISRFX1=-1 and ISRFX2=-2 C ICREC=positive integer ... Color to be used for plotting the C receivers. The color is chosen according to COLORS. C Default: ICREC=1 C ISREC=positive integer ... Index of symbol to be used for plotting C the receivers according to the file SYMBOLS. C Default: ISREC=3 C HREC=real ... Height (in centimeters) of the symbols used for C plotting the receivers. C Default: HREC=0.3 C C Example of the input parameters in history file C len-crt.h. C C C C Input formatted file SYMBOLS: C The file contains in I-th line a single integer telling the index C of symbol to be used to plot the rays or triangles of the history C I or -I. Only MSYMB different symbols are available, all the rays C with value of ray history greater or equal (in absolut value) C MSYMB will be ploted with the same symbols. C For MSYMB refer to the file C 'rpplot.inc'. C Example of data C SYMBOLS. C Another example of data C SYMBOLS. C C C Input formatted file COLORS: C The file contains in I-th line a single integer telling the index C of colour to be used to plot the rays or triangles of the history C I or -I according to the file C 'calcops.rgb', C or according to the colors defined in the source code C 'calcops.for' C if 'calcops.rgb' is not available. c Only MCOL different colors are available, all the rays C and triangles with value of ray history greater or equal (in C absolut value) MCOL will be ploted in the same colors. C For MCOL refer to the file C 'rpplot.inc'. C Example of data C COLORS. C C ...................................................................... C Subroutines and external functions required: EXTERNAL RPPLER,CIREAD,CIERAS,RPTPL,RPRPL,RPSYMB,SYMBOL, *ERROR,RSEP1,RSEP3T,RSEP3R,RSEP3I,PLOTS,PLOT,NEWPEN,PLOTN,AP00 C RPPLER,CIREAD,CIERAS,RPTPL,RPRPL ... This file. C RPSYMB ... File C rpsymb.for. C ERROR ... File C error.for. C RSEP1,RSEP3I,RSEP3T,RSEP3R ... File C sep.for. C PLOTS,PLOT,NEWPEN,PLOTN,SYMBOL ... File C calcops.for. C AP00 ... File ap.for. C C Common block /RAM/ to store the information about triangles and rays: INCLUDE 'rpplot.inc' C C....................................................................... C C Auxiliary storage locations: INTEGER IRAY1,IRAY2,IRAY3,IR0 INTEGER I1,I2,IT1 INTEGER I,J,K,L,M,N,ISRFX1,ISRFX2 INTEGER IRBAS,IRTWO,IRAUX,ITHOM,ISANG,ISREC,ICREC,IWAVES,ISRCS REAL HREC,XREC(3),P1,P2 INTEGER LU0,LU1,LU2,LU3,LU4,LU5,LU6,LU7 LOGICAL LEND PARAMETER (LU0=10,LU1=1,LU2=2,LU3=3,LU4=4,LU5=5,LU6=6,LU7=7) CHARACTER*80 FILSEP,FILINI,FILTRI,FILSYM,FILCOL,FILCRT,FILREC, * FILRPA,CH,CH1,FILEPS C----------------------------------------------------------------------- C LEND=.FALSE. C C Reading name of SEP file with input data: WRITE(*,'(A)') '+RPPLOT: Enter input filename: ' FILSEP=' ' READ(*,*) FILSEP C C Reading all data from the SEP file into the memory: IF (FILSEP.NE.' ') THEN CALL RSEP1(LU0,FILSEP) ELSE C RPPLOT-04 CALL ERROR('RPPLOT-04: SEP file not given') 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)') '+RPPLOT: Working... ' C C Reading quantities telling what is to be plotted: CALL RSEP3I('IRBAS',IRBAS,1) CALL RSEP3I('IRTWO',IRTWO,1) CALL RSEP3I('IRAUX',IRAUX,1) CALL RSEP3I('ITHOM',ITHOM,1) CALL RSEP3I('ISANG',ISANG,1) CALL RSEP3I('ISHP ',ISHP ,0) CALL RSEP3I('ISUC ',ISUC ,0) LRBAS=.FALSE. LRTWO=.FALSE. LRAUX=.FALSE. LTHOM=.FALSE. LSANG=.FALSE. IF (IRBAS.EQ.1) LRBAS=.TRUE. IF (IRTWO.EQ.1) LRTWO=.TRUE. IF (IRAUX.EQ.1) LRAUX=.TRUE. IF (ITHOM.EQ.1) LTHOM=.TRUE. IF (ISANG.EQ.1) LSANG=.TRUE. C C Reading limits of the plot: CALL RSEP3R('PLIM1',PLIMIT(1),0.) CALL RSEP3R('PLIM2',PLIMIT(2),1.) CALL RSEP3R('PLIM3',PLIMIT(3),0.) CALL RSEP3R('PLIM4',PLIMIT(4),1.) C C Reading heights of symbols and names of files: CALL RSEP3R('HRBAS',HRBAS,0.2) CALL RSEP3R('HRTWO',HRTWO,0.2) CALL RSEP3R('HRAUX',HRAUX,0.2) CALL RSEP3R('HSIZE',HOR,15.) CALL RSEP3R('VSIZE',VER,15.) CALL RSEP3R('HTEXT',HTEXT,0.5) CALL RSEP3T('SYMBOLS',FILSYM,' ') CALL RSEP3T('COLORS',FILCOL,' ') CALL RSEP3T('RPPLOT',FILEPS,' ') C C Reading filenames of the files with computed triangles and rays C and index of the wave: CALL RSEP3T('CRTOUT',FILCRT,' ') FILINI='s01i.out' FILTRI='t01.out' IF (FILCRT.NE.' ') THEN OPEN(LU1,FILE=FILCRT,FORM='FORMATTED',STATUS='OLD') READ(LU1,*) CH,CH1,FILINI,FILTRI CLOSE(LU1) ENDIF CALL RSEP3I('ISRCS',ISRCS,0) CALL RSEP3I('IWAVES',IWAVES,0) C C Reading quantities and filename used for plotting receivers: CALL RSEP3T('REC',FILREC,' ') CALL RSEP3T('RPAR',FILRPA,' ') CALL RSEP3I('ISREC',ISREC,3) CALL RSEP3I('ICREC',ICREC,1) CALL RSEP3R('HREC',HREC,0.3) C C IF (LTHOM) THEN C Reading file with computed triangles, C sorting the rays in triangles: NT=0 NRAMP=0 IRAYMI=1 IRAYMA=0 OPEN(LU3,FILE=FILTRI,FORM='FORMATTED',STATUS='OLD') 10 CONTINUE READ(LU3,*,END=20) IRAY1,IRAY2,IRAY3 IF (IRAY1.EQ.0) THEN C New elementary wave: 12 CONTINUE IF (((ISRCS.NE.0).AND.(IRAY2.NE.ISRCS)).OR. * ((IWAVES.NE.0).AND.(IRAY3.NE.IWAVES))) THEN C Skipping all the rays of this elementary wave: 14 CONTINUE READ(LU3,*,END=20) IRAY1,IRAY2,IRAY3 IF (IRAY1.NE.0) GOTO 14 GOTO 12 ELSE GOTO 10 ENDIF ENDIF C IF (IRAY3.EQ.0) THEN C RPPLOT-05 CALL WARN('RPPLOT-05: Triangles can not be plotted') C The third index of the ray in file 'CRT-T' is zero, which C indicates one-parametric shooting, homogeneous triangles C cannot be plotted. GOTO 20 ENDIF C IF (IRAY1.GT.IRAYMA) IRAYMA=IRAY1 IF (IRAY2.GT.IRAYMA) IRAYMA=IRAY2 IF (IRAY3.GT.IRAYMA) IRAYMA=IRAY3 IF (IRAY1.LT.IRAY2) THEN I=IRAY1 IRAY1=IRAY2 IRAY2=I ENDIF IF (IRAY2.LT.IRAY3) THEN I=IRAY2 IRAY2=IRAY3 IRAY3=I ENDIF IF (IRAY1.LT.IRAY2) THEN I=IRAY1 IRAY1=IRAY2 IRAY2=I ENDIF NRAMP=NRAMP+1 IF (NRAMP.GT.MRAM) CALL RPPLER IRAM(NRAMP)=IRAY1 NRAMP=NRAMP+1 IF (NRAMP.GT.MRAM) CALL RPPLER IRAM(NRAMP)=IRAY2 NRAMP=NRAMP+1 IF (NRAMP.GT.MRAM) CALL RPPLER IRAM(NRAMP)=IRAY3 NT=NT+1 GOTO 10 20 CONTINUE CLOSE(LU3) NR=IRAYMA C C Sorting the triangles: DO 40, I1=NRAMP-5,1,-3 DO 30, I2=1,I1,3 L=I2+3 IF (IRAM(I2).GT.IRAM(L)) THEN J=I2+1 K=I2+2 M=I2+4 N=I2+5 I =IRAM(I2) IRAM(I2)=IRAM(L) IRAM(L) =I I =IRAM(J) IRAM(J) =IRAM(M) IRAM(M) =I I =IRAM(K) IRAM(K) =IRAM(N) IRAM(N) =I ENDIF 30 CONTINUE 40 CONTINUE C C C Forming an auxiliary array with information about when can be C rays erased from the memory ("deleting array"): IF (NRAMP+NR.GT.MRAM) CALL RPPLER DO 50, I1=NRAMP+1,NRAMP+NR IRAM(I1)=I1-NRAMP 50 CONTINUE NRAMP=NRAMP+NR ORAYE=-3*NT DO 60, I1=1,3*NT,3 IRAM(IRAM(I1 )-ORAYE)=IRAM(I1) IRAM(IRAM(I1+1)-ORAYE)=IRAM(I1) IRAM(IRAM(I1+2)-ORAYE)=IRAM(I1) 60 CONTINUE ELSE NR=0 NT=0 ORAYE=0 NRAMP=0 IRAYMI=0 ENDIF C C C Forming an auxiliary array with information about addresses C of the ends of records for rays in array RAM ("addressing array"): C "Ray" IRAYMI-1: NRAMP=NRAMP+1 IF (NRAMP.GT.MRAM) CALL RPPLER IRAM(NRAMP)=NRAMP+NR C All other rays: IF (NRAMP+NR.GT.MRAM) CALL RPPLER DO 70, I1=NRAMP+1,NRAMP+NR IRAM(I1)=0 70 CONTINUE NRAMP=NRAMP+NR ORAYA=-3*NT-NR-1 C C C Choosing symbols: DO 71, I1=1,MSYMB ISYMB(I1)=I1 71 CONTINUE C OPEN(LU4,FILE=FILSYM,STATUS='OLD',ERR=74) DO 72, I1=1,MSYMB READ (LU4,*,END=74) ISYMB(I1) 72 CONTINUE 74 CONTINUE CLOSE (LU4) C C Choosing colours: DO 75, I1=1,MCOL ICOL(I1)=I1 75 CONTINUE C OPEN(LU5,FILE=FILCOL,STATUS='OLD',ERR=78) DO 76, I1=1,MCOL READ (LU5,*,END=78) ICOL(I1) 76 CONTINUE 78 CONTINUE CLOSE (LU5) C P1DIF=PLIMIT(2)-PLIMIT(1) P2DIF=PLIMIT(4)-PLIMIT(3) DO=(HOR+VER)/13. C IF(FILEPS.NE.' ') THEN CALL PLOTN(FILEPS,0) END IF CALL PLOTS(0,0,0) CALL RPSYMB(0,0.,0.,0.) C C Contures: CALL NEWPEN(1) CALL PLOT(HOR*((PLIMIT(1)-PLIMIT(1))/P1DIF)+DO, * VER*((PLIMIT(3)-PLIMIT(3))/P2DIF)+DO,3) CALL PLOT(HOR*((PLIMIT(2)-PLIMIT(1))/P1DIF)+DO, * VER*((PLIMIT(3)-PLIMIT(3))/P2DIF)+DO,2) CALL PLOT(HOR*((PLIMIT(2)-PLIMIT(1))/P1DIF)+DO, * VER*((PLIMIT(4)-PLIMIT(3))/P2DIF)+DO,2) CALL PLOT(HOR*((PLIMIT(1)-PLIMIT(1))/P1DIF)+DO, * VER*((PLIMIT(4)-PLIMIT(3))/P2DIF)+DO,2) CALL PLOT(HOR*((PLIMIT(1)-PLIMIT(1))/P1DIF)+DO, * VER*((PLIMIT(3)-PLIMIT(3))/P2DIF)+DO,2) CALL PLOT(HOR*((PLIMIT(1)-PLIMIT(1))/P1DIF)+DO, * VER*((PLIMIT(3)-PLIMIT(3))/P2DIF)+DO,3) C C Labels along the figure: IF (LSANG) THEN CALL SYMBOL(HOR*( 0.1 )+DO, * VER*( 0. )+DO-1.5*HTEXT, * HTEXT,'FIRST SHOOTING PARAMETER',0.,24) CALL SYMBOL(HOR*(0. )+DO-0.5*HTEXT, * VER*(0.1 )+DO , * HTEXT,'SECOND SHOOTING PARAMETER',90.,25) ELSE CALL SYMBOL(HOR*( 0.1 )+DO, * VER*( 0. )+DO-1.5*HTEXT, * HTEXT,'FIRST SURFACE COORDINATE',0.,24) CALL SYMBOL(HOR*(0. )+DO-0.5*HTEXT, * VER*(0.1 )+DO , * HTEXT,'SECOND SURFACE COORDINATE',90.,25) ENDIF C C Plotting receivers: IF (.NOT.LSANG) THEN OPEN(LU6,FILE=FILREC,FORM='FORMATTED',STATUS='OLD',ERR=80) READ(LU6,*,END=80) CH CALL NEWPEN(ICREC) ISRFX1=1 ISRFX2=2 IF (FILRPA.NE.' ') THEN OPEN(LU7,FILE=FILRPA,FORM='FORMATTED',STATUS='OLD') READ(LU7,*,END=79,ERR=79) CH READ(LU7,*,END=79,ERR=79) I1,ISRFX1,ISRFX2 ISRFX1=IABS(ISRFX1) ISRFX2=IABS(ISRFX2) IF (((ISRFX1.NE.1).AND.(ISRFX1.NE.2).AND.(ISRFX1.NE.3)).OR. * ((ISRFX2.NE.1).AND.(ISRFX2.NE.2).AND.(ISRFX2.NE.3))) THEN C RPPLOT-06 CALL ERROR('RPPLOT-06: Cannot handle this value of ISRFXi') C Program RPPLOT can handle only the values -1, -2 and -3 for C ISRFX1 and ISRFX2 - the X1 and X2 functions must coincide C with the model coordinates. ENDIF CLOSE(LU7) GOTO 81 79 CONTINUE C RPPLOT-07 CALL ERROR('RPPLOT-07: Error when reading ISRFXi') C Program RPPLOT was not able to read the values of ISRFX1 C and ISRFX2 from the file RPAR. C See the description of parameter RPAR. ENDIF 81 CONTINUE CH='$' XREC(1)=0. XREC(2)=0. XREC(3)=0. READ(LU6,*,END=80) CH,XREC IF (CH.EQ.'$') GOTO 81 P1=XREC(ISRFX1) P2=XREC(ISRFX2) IF ((P1.GE.PLIMIT(1)).AND.(P1.LE.PLIMIT(2)).AND. * (P2.GE.PLIMIT(3)).AND.(P2.LE.PLIMIT(4))) * CALL RPSYMB(ISREC, * HOR*((P1-PLIMIT(1))/P1DIF)+DO, * VER*((P2-PLIMIT(3))/P2DIF)+DO,HREC) GOTO 81 ENDIF C C 80 CLOSE(LU6) OPEN(LU2,FILE=FILINI,FORM='UNFORMATTED',STATUS='OLD') IR0=0 IF (LTHOM) THEN C Loop for all the triangles: DO 100, IT1=1,3*NT-2,3 C C If necessary, reading new rays: IF ((IRAM(IRAM(IT1)-ORAYA+1).EQ.0).AND.(.NOT.LEND)) THEN CALL CIREAD(LU2,IRAM(IT1),ISRCS,IWAVES,LEND) ENDIF C C Empting the array RAM: IF ((MRAM-NRAMP).LT.(MRAM/10.)) CALL CIERAS C C Plotting the triangle: CALL RPTPL(IT1) C C Plotting the rays: DO 102, I1=IR0+1,IRAM(IT1) CALL RPRPL(I1) 102 CONTINUE IR0=IRAM(IT1) C 100 CONTINUE C End of the loop for all the triangles. ENDIF C Plotting remaining rays: 110 CONTINUE IF (.NOT.LEND) THEN IR0=IR0+1 CALL CIREAD(LU2,IR0,ISRCS,IWAVES,LEND) CALL RPRPL(IR0) GOTO 110 ENDIF C CALL PLOT(0.,0.,999) WRITE(*,'(A)') '+RPPLOT: Done. ' STOP END C C C======================================================================= C SUBROUTINE CIREAD(LU2,IR1,ISRCS,IWAVES,LEND) C C---------------------------------------------------------------------- C Subroutine to read the unformatted output of program CRT and C to write it into array (I)RAM. C Reading the output files is completed by a simple invocation of C subroutine AP00 of file 'ap.for'. C INTEGER LU2,IR1,ISRCS,IWAVES LOGICAL LEND C Input: C LU2 ... Number of logical unit corresponding to the file with C the quantities at the initial points of rays. C IR1 ... Index of the first ray of the actually processed C triangle. C ISRCS .. Index of the source of the wave to be plotted. C IWAVES.. Index of the elementary wave to be plotted. C Output: C LEND .. .TRUE. when the end of file with rays is reached, C othervise .FALSE.. C C Coded by Petr Bulant C C ........................... C Common block /POINTC/ to store the results of complete ray tracing: INCLUDE 'pointc.inc' C None of the storage locations of the common block are altered. C ........................... C Common block /RAM/ to store the information about triangles and rays: INCLUDE 'rpplot.inc' C C----------------------------------------------------------------------- C Loop for the points of rays: 10 CONTINUE IF ((NRAMP+2*NQ).GT.MRAM) THEN C Freeing the memory: CALL CIERAS IF ((NRAMP+2*NQ).GT.MRAM) CALL RPPLER ENDIF C Reading the results of the complete ray tracing: CALL AP00(0,0,LU2) IF (IWAVE.LT.1) THEN C End of rays: CLOSE(LU2) LEND=.TRUE. RETURN ENDIF IF (((ISRCS.NE.0).AND.(ISRCS.NE.ISRC)).OR. * ((IWAVES.NE.0).AND.(IWAVES.NE.IWAVE))) C Skipping this elementary wave: * GOTO 10 IF (IRAY.LT.IRAYMI) GOTO 10 IF (IRAM(IRAY-ORAYE).NE.0) THEN C Writing the results of the complete ray tracing - recording C new initial point on a ray: IF (LSANG) THEN C Normalized ray parameters: RAM(NRAMP+1)=YI(26) RAM(NRAMP+2)=YI(27) ELSE C Reference surface coordinates: RAM(NRAMP+1)=YI(28) RAM(NRAMP+2)=YI(29) ENDIF C Index of the receiver: IRAM(NRAMP+3)=IREC C History: IF (ISHEET.EQ.0) ISHEET=1 IRAM(NRAMP+4)=ISHEET NRAMP=NRAMP+NQ ENDIF IRAM(IRAY-ORAYA)=NRAMP IF (IRAY.GT.IR1) RETURN GOTO 10 C END C C C======================================================================= C SUBROUTINE CIERAS C C---------------------------------------------------------------------- C Subroutine for empting the array (I)RAM. All the parameters C of all the rays, which will no more be used, are erased. C C No input. C No output. C C Subroutines and external functions required: C C Coded by Petr Bulant C C ........................... C Common block /POINTC/ to store the results of complete ray tracing: INCLUDE 'pointc.inc' C IRAY .. Index of the ray being actually read in by CIREAD. C This procedure supposes, that any ray with higher C index than IRAY was not read in. C None of the storage locations of the common block are altered. C ........................... C Common block /RAM/ to store the information about triangles and rays: INCLUDE 'rpplot.inc' C....................................................................... C Auxiliary storage locations: INTEGER I1,I2,J1 INTEGER IADDRP C I1 ... Controls main loop over rays. C I2 ... Controls the loop over parameters of ray I1. C J1 ... address of the last used record of array RAM. C C----------------------------------------------------------------------- J1=IRAM(IRAYMI-1-ORAYA) IADDRP=J1 C Loop for the rays: DO 20, I1=IRAYMI,IRAY IF (IRAM(I1-ORAYE).GE.(IRAY-1)) THEN C This ray is not to be erased: DO 10, I2=IADDRP+1,IRAM(I1-ORAYA) J1=J1+1 RAM(J1)=RAM(I2) 10 CONTINUE IADDRP=IRAM(I1-ORAYA) IRAM(I1-ORAYA)=J1 ELSE C This ray is to be erased: IRAM(I1-ORAYE)=0 IADDRP=IRAM(I1-ORAYA) IRAM(I1-ORAYA)=J1 ENDIF 20 CONTINUE NRAMP=J1 RETURN END C======================================================================= C SUBROUTINE RPTPL(IT1) C C---------------------------------------------------------------------- C Subroutine for plotting the triangle formed by the rays C IRAM(IT1), IRAM(IT1+1), IRAM(IT1+2). C INTEGER IT1 C Input: C IT1 ... The address of the index of the first ray of the triangle C to be plotted. C No output. C C Coded by Petr Bulant C C ........................... C Common block /RAM/ to store the information about triangles and rays: INCLUDE 'rpplot.inc' C....................................................................... C Auxiliary storage locations: INTEGER I1,ILIN,ISH REAL P1A,P2A,P1B,P2B,P1C,P2C,P1,P2,P1O,P2O REAL P1MI,P1MA,P2MI,P2MA,DP1,DP2 LOGICAL LPL C----------------------------------------------------------------------- IF ((IRAM(IRAM(IT1 )-ORAYA).EQ.0).OR. * (IRAM(IRAM(IT1+1)-ORAYA).EQ.0).OR. * (IRAM(IRAM(IT1+2)-ORAYA).EQ.0)) THEN C RPPLOT-01 CALL ERROR('RPPLOT-01: Parameters of a ray not found in memory') C This error may be caused by C K2P C not equal to zero, then only two-point rays are stored in C output files of CRT. C It may occur also in case, when a file with points along rays is C specified instead of input file with initial points of rays. C This also happens when there is less than ISRCS sources or less C than IWAVES elementary waves in the file with initial points. ENDIF C P1A=RAM(IRAM(IRAM(IT1 )-ORAYA-1)+1) P2A=RAM(IRAM(IRAM(IT1 )-ORAYA-1)+2) P1B=RAM(IRAM(IRAM(IT1+1)-ORAYA-1)+1) P2B=RAM(IRAM(IRAM(IT1+1)-ORAYA-1)+2) P1C=RAM(IRAM(IRAM(IT1+2)-ORAYA-1)+1) P2C=RAM(IRAM(IRAM(IT1+2)-ORAYA-1)+2) ISH=IRAM(IRAM(IRAM(IT1+2)-ORAYA-1)+4) C IF ((ISHP.NE.0).AND.(ISHP.NE.ISH)) RETURN C IF ((.NOT.LSANG).AND.(ISH.LE.0)) RETURN C P1MI=AMIN1(P1A,P1B,P1C) P1MA=AMAX1(P1A,P1B,P1C) P2MI=AMIN1(P2A,P2B,P2C) P2MA=AMAX1(P2A,P2B,P2C) C ILIN=50*INT(AMAX1(((P1MA-P1MI)/P1DIF),((P2MA-P2MI)/P2DIF),1.)) IF ((P1MI.GE.PLIMIT(1)).AND.(P1MA.LE.PLIMIT(2)).AND. * (P2MI.GE.PLIMIT(3)).AND.(P2MA.LE.PLIMIT(4))) ILIN=1 C P1=P1A P2=P2A IF ((P1.GE.PLIMIT(1)).AND.(P1.LE.PLIMIT(2)).AND. * (P2.GE.PLIMIT(3)).AND.(P2.LE.PLIMIT(4))) THEN IF ((ISUC.EQ.1).AND.(ISH.LT.0)) THEN CALL NEWPEN(1) ELSE CALL NEWPEN(ICOL(MIN0(MCOL,IABS(ISH)))) ENDIF CALL PLOT(HOR*((P1-PLIMIT(1))/P1DIF) +DO, * VER*((P2-PLIMIT(3))/P2DIF) +DO,3) P1O=P1 P2O=P2 LPL=.TRUE. ELSE LPL=.FALSE. ENDIF DP1=(P1B-P1A)/ILIN DP2=(P2B-P2A)/ILIN DO 30, I1=1,ILIN P1=P1+DP1 P2=P2+DP2 IF ((P1.GE.PLIMIT(1)).AND.(P1.LE.PLIMIT(2)).AND. * (P2.GE.PLIMIT(3)).AND.(P2.LE.PLIMIT(4))) THEN IF (LPL) THEN CALL PLOT(HOR*((P1-PLIMIT(1))/P1DIF) +DO, * VER*((P2-PLIMIT(3))/P2DIF) +DO,2) P1O=P1 P2O=P2 ELSE IF ((ISUC.EQ.1).AND.(ISH.LT.0)) THEN CALL NEWPEN(1) ELSE CALL NEWPEN(ICOL(MIN0(MCOL,IABS(ISH)))) ENDIF CALL PLOT(HOR*((P1-PLIMIT(1))/P1DIF) +DO, * VER*((P2-PLIMIT(3))/P2DIF) +DO,3) P1O=P1 P2O=P2 LPL=.TRUE. ENDIF ELSE IF (LPL) THEN CALL PLOT(HOR*((P1O-PLIMIT(1))/P1DIF) +DO, * VER*((P2O-PLIMIT(3))/P2DIF) +DO,3) LPL=.FALSE. ENDIF ENDIF 30 CONTINUE DP1=(P1C-P1B)/ILIN DP2=(P2C-P2B)/ILIN DO 32, I1=1,ILIN P1=P1+DP1 P2=P2+DP2 IF ((P1.GE.PLIMIT(1)).AND.(P1.LE.PLIMIT(2)).AND. * (P2.GE.PLIMIT(3)).AND.(P2.LE.PLIMIT(4))) THEN IF (LPL) THEN CALL PLOT(HOR*((P1-PLIMIT(1))/P1DIF) +DO, * VER*((P2-PLIMIT(3))/P2DIF) +DO,2) P1O=P1 P2O=P2 ELSE IF ((ISUC.EQ.1).AND.(ISH.LT.0)) THEN CALL NEWPEN(1) ELSE CALL NEWPEN(ICOL(MIN0(MCOL,IABS(ISH)))) ENDIF CALL PLOT(HOR*((P1-PLIMIT(1))/P1DIF) +DO, * VER*((P2-PLIMIT(3))/P2DIF) +DO,3) P1O=P1 P2O=P2 LPL=.TRUE. ENDIF ELSE IF (LPL) THEN CALL PLOT(HOR*((P1O-PLIMIT(1))/P1DIF) +DO, * VER*((P2O-PLIMIT(3))/P2DIF) +DO,3) LPL=.FALSE. ENDIF ENDIF 32 CONTINUE DP1=(P1A-P1C)/ILIN DP2=(P2A-P2C)/ILIN DO 34, I1=1,ILIN P1=P1+DP1 P2=P2+DP2 IF ((P1.GE.PLIMIT(1)).AND.(P1.LE.PLIMIT(2)).AND. * (P2.GE.PLIMIT(3)).AND.(P2.LE.PLIMIT(4))) THEN IF (LPL) THEN CALL PLOT(HOR*((P1-PLIMIT(1))/P1DIF) +DO, * VER*((P2-PLIMIT(3))/P2DIF) +DO,2) P1O=P1 P2O=P2 ELSE IF ((ISUC.EQ.1).AND.(ISH.LT.0)) THEN CALL NEWPEN(1) ELSE CALL NEWPEN(ICOL(MIN0(MCOL,IABS(ISH)))) ENDIF CALL PLOT(HOR*((P1-PLIMIT(1))/P1DIF) +DO, * VER*((P2-PLIMIT(3))/P2DIF) +DO,3) P1O=P1 P2O=P2 LPL=.TRUE. ENDIF ELSE IF (LPL) THEN CALL PLOT(HOR*((P1O-PLIMIT(1))/P1DIF) +DO, * VER*((P2O-PLIMIT(3))/P2DIF) +DO,3) LPL=.FALSE. ENDIF ENDIF 34 CONTINUE RETURN END C======================================================================= C SUBROUTINE RPRPL(IR1) C C---------------------------------------------------------------------- C Subroutine for plotting the ray IR1. C INTEGER IR1 C Input: C IR1 ... Index of the ray to be plotted. C No output. C C Coded by Petr Bulant C C ........................... C Common block /RAM/ to store the information about triangles and rays: INCLUDE 'rpplot.inc' C....................................................................... C Auxiliary storage locations: INTEGER ISH,IREC REAL P1,P2 C----------------------------------------------------------------------- IF (IRAM(IR1-ORAYA).EQ.0) THEN C RPPLOT-02 CALL ERROR('RPPLOT-02: Parameters of a ray not found in memory') C This error may be caused by C K2P C not equal to zero, then only two-point rays are stored in C output files of CRT. C It may occur also in case, when a file with points along rays is C specified instead of input file with initial points of rays. C This also happens when there is less than ISRCS sources or less C than IWAVES elementary waves in the file with initial points. ENDIF C P1=RAM(IRAM(IR1-ORAYA-1)+1) P2=RAM(IRAM(IR1-ORAYA-1)+2) IREC=IRAM(IRAM(IR1-ORAYA-1)+3) ISH =IRAM(IRAM(IR1-ORAYA-1)+4) C IF ((ISHP.NE.0).AND.(ISHP.NE.ISH)) RETURN C IF ((.NOT.LSANG).AND.(ISH.LE.0)) RETURN C IF ((P1.GE.PLIMIT(1)).AND.(P1.LE.PLIMIT(2)).AND. * (P2.GE.PLIMIT(3)).AND.(P2.LE.PLIMIT(4))) THEN IF ((ISUC.EQ.1).AND.(ISH.LT.0)) THEN CALL NEWPEN(1) ELSE CALL NEWPEN(ICOL(MIN0(MCOL,IABS(ISH)))) ENDIF IF (LRBAS.AND.(IREC.EQ.0)) THEN C Basic ray: CALL RPSYMB(ISYMB(MIN0(MSYMB,IABS(ISH))), * HOR*((P1-PLIMIT(1))/P1DIF)+DO, * VER*((P2-PLIMIT(3))/P2DIF)+DO,HRBAS) RETURN ENDIF IF (LRTWO.AND.(IREC.GT.0)) THEN C Two-point ray: CALL RPSYMB(ISYMB(MIN0(MSYMB,IABS(ISH))), * HOR*((P1-PLIMIT(1))/P1DIF)+DO, * VER*((P2-PLIMIT(3))/P2DIF)+DO,HRTWO) RETURN ENDIF IF (LRAUX.AND.(IREC.EQ.-1)) THEN C Auxiliary ray: CALL RPSYMB(ISYMB(MIN0(MSYMB,IABS(ISH))), * HOR*((P1-PLIMIT(1))/P1DIF)+DO, * VER*((P2-PLIMIT(3))/P2DIF)+DO,HRAUX) RETURN ENDIF ENDIF END C======================================================================= C SUBROUTINE RPPLER C C---------------------------------------------------------------------- C RPPLOT-03 CALL ERROR('RPPLOT-03: Array (I)RAM too small') C This error may be caused by too small dimension of array C RAM. Try to enlarge the parameter MRAM in common block C RAM. END C C======================================================================= C INCLUDE 'error.for' C error.for INCLUDE 'sep.for' C sep.for INCLUDE 'forms.for' C forms.for INCLUDE 'length.for' C length.for INCLUDE 'calcops.for' C calcops.for INCLUDE 'ap.for' C ap.for INCLUDE 'rpsymb.for' C rpsymb.for C C======================================================================= C