C File 'ray.for' for the complete tracing of a ray from a given point C C Date: 2004, June 11 C Coded by Ludek Klimes C C....................................................................... C C This file consists of: C Description of the quantities computed along a ray, see C C.R.T.5.2. C RAY1... Subroutine designed to read the input data for complete C ray tracing and to store them in the common blocks /RAYT/ C and /DCRT/, see C C.R.T.5.6. C RAY1 C RAY2... Subroutine designed to continue in the complete ray C tracing of a ray from the given point, see C C.R.T.5.7. C RAY2 C C....................................................................... C C C Input data DCRT for complete ray tracing: C The data are read in by the list directed input (free format). In C the list of input data below, each numbered paragraph indicates C the beginning of a new input operation (new READ statement). If C the first letter of the symbolic name of the input variable is C I-N, the corresponding value in input data must be of the type C INTEGER. Otherwise (except TEXTR), the input parameter is of the C type REAL. C (1) TEXTR C String describing the data. Only the first 80 characters of the C string are significant. C (2) KSTORE,NEXPS,NHLF,MODCRT C Quantities controlling numerical integration. C The default values represented by a single slash are usually C satisfactory here. C KSTORE..Specifies whether the conversion coefficients are to be C considered, see C C.R.T.5.5.4 C and 5.6e: C KSTORE.LE.1... No amplitude conversion coefficients are C applied at the point of intersection with an interface. C KSTORE.GE.2... Amplitude conversion coefficients are C applied at the point of intersection with an interface. C Whenever KSTORE is changed, data (8) and (9) should be C adjusted properly. C NEXPS.. Specifies independent variable along rays, see C C.R.T.5.1. C Travel time given by NEXPS=0 (default) is highly C recommended. C NHLF... Maximum allowed number of halvings (bisections) of initial C increment of independent variable during numerical C integration. Default value is NHLF=5, and the authors C have never used different one. C MODCRT..Specifies the mode of complete ray tracing, and the ray C elements along which the computed quantities are stored. C 0...Initial mode, C storing the computed quantities along the whole rays, C no storing at the endpoints of the ray elements. C 1...Initial mode, C storing the quantities just along new ray elements, C no storing at the endpoints of the ray elements. C 2...Initial mode, C storing the quantities just along new ray elements, C storing at the endpoints of the new ray elements. C 3...Interpolation mode, C storing the quantities just along new ray elements, C storing at the endpoints of the new ray elements. C *** modcrt=3 is not enabled by the current version of C 'init.for' ***. C Default: KSTORE=0, NEXPS=0, NHLF=5, MODCRT=0. C C (3) STORE,STEP,UEB,UEBPP,UEBPH,UEBHH,UEBDRT C A single slash representing the default values is usually C satisfactory in place of UEBPP,UEBPH,UEBHH,UEBDRT here. C Quantities controlling numerical integration. C STORE...Step of independent variable for storing the computed C quantities along a ray, see C C.R.T.5.5.1. C For STORE=0 the quantities are not stored along rays. C STEP... Initial increment of independent variable for numerical C integration (expressed in travel-time units if NEXPS=0). C Recommended values: C STEP should never exceed the reciprocal value of the C size of the velocity gradient. C STEP should not exceed the grid interval (or preferably C half the grid interval) for B-spline or similar C interpolation divided by the corresponding velocity. C UEB... Upper error bound of travel time per one step of numerical C integration. Errors in the coordinates of points along C the ray are approximately transformed to units of travel C time and are also bounded by UEB. The error per step of C numerical integration is automatically kept within the C limit UEB if this does not require more than NHLF C bisections of the initial increment step. In the opposite C case the upper error bound is 2,4,8... times greater for C the computation of the rest of the ray. Thus the C computation of each ray is completed. C Recommended values: C UEB from TTERR/SQRT(N) for complex models with extensive C B-spline or similar grids to TTERR/N for simple models, C where N is the number of steps along a ray and TTERR is C the maximum desired travel-time error along the ray. C Here TTERR should be smaller (at least several times) C than the accuracy XERR of the two-point ray tracing C converted to the time units, see input data RPAR-(2). C Description of RPAR-(2) C UEBPP,UEBPH,UEBHH... Maximum allowed accumulated deviations of the C two polarization vectors from the conditions of C orthonormality, see C C.R.T.5.8.2d C and 5.8.3i. C The accumulated deviations are expressed in time units. C If any of the accumulated deviations overflows its upper C bound, a warning is generated. C UEBDRT..Maximum allowed deviation of L.H.S. and R.H.S. in C.R.T., C eq.(5.11). C If the deviation of any component of the 4*4 matrix C exceeds UEBDRT, a warning is generated. C Default: UEBPP=0., UEBPH=0., UEBHH=0., UEBDRT=0.. C (4) X1MIN,X1MAX,X2MIN,X2MAX,X3MIN,X3MAX,TMAX C The boundaries of the computational volume. C X1MIN,X1MAX,X2MIN,X2MAX,X3MIN,X3MAX... Coordinates specifying the C coordinate planes bounding the computational volume. The C coordinate planes are indexed 101, 102, 103, 104, 105 and C 106. Default values are the boundaries of the model, see C subroutine MODEL1 and the input data for the model. C TMAX... Maximum travel time for the computation of rays. The C corresponding isochrone is indexed by 107. Default value C is 999999. C (5) NSRFCA C Number of auxiliary surfaces, see C C.R.T.5.3. C The surfaces are indexed sequentially by positive integers C from NSRFC+1 to NSRFC+NSRFCA. Default value is 0. C (6) The indices of end surfaces. C Each index must have the sign corresponding to the side of the C surface at which the computational volume is situated. C The indices may be specified in an arbitrary order and must be C terminated by a slash. See C C.R.T.5.4f. C C (7) The indices of surfaces for storing computed quantities. C The indices of surfaces 1 to NSRFC covering structural interfaces C must include the proper sign. The indices may be specified in an C arbitrary order and must be terminated by a slash. Note that the C same surface may be specified several times, especially if the C quantities at different points of intersections with the surface C are stored in different files, see (8) and (9) below. For details C see C.R.T.5.5.2. C (8) For each above surface, the sequential number of the first point C of intersection of a ray with the surface in which the computed C quantities are stored into the corresponding file. A ray may have C several points of intersection with a specified surface. The C quantities need not be stored at all points of intersection. They C may be stored just from the point of intersection specified in C this input (8) to the one specified in the input (9) below. C Usually, user will wish to store the quantities at all points of C intersection, that corresponds to the values of 1 in this input C and is the default (indicated by a slash in the input data). C For a structural interface (not auxiliary surface), the positive C or negative side of the surface ISRFR is specified, then: C No point of intersection is accounted if the reflected ray is C situated at the other side of the surface ISRFR than the C specified one, and C one point of intersection is accounted if the reflected ray is C situated at the specified side of the surface ISRFR and C KSTORE.GE.2 in the data (2). C Two points of intersection are accounted if the reflected ray is C situated at the specified side of the surface ISRFR and C KSTORE.LE.1 in the data (2). C (9) For each above surface, the sequential number of the last point C of intersection of a ray with the surface in which the computed C quantities are stored into the corresponding file. Default values C of this input are 999999. C (10) The data specifying NSRFCA functions describing the auxiliary C surfaces. The data are read by subroutine SRFC1. For their C description refer to subroutine SRFC1. C Description of data SRFC C This input is performed only if NSRFCA.GT.0, see (5). C Example of data set DCRT C C....................................................................... C C Storage in the memory: C The input data (2) to (9) are stored in common block /DCRT/ C defined in the include file 'dcrt.inc'. C dcrt.inc C C======================================================================= C C Description of the quantities computed along a ray, see C C.R.T.5.2. C C C Local quantities: C (see C.R.T.5.5.4) C YL(1)=VP... Velocity of P-waves at the point. C YL(2)=VS... Velocity of S-waves at the point. C YL(3)=RO... Density at the point. C YL(4)=V1,YL(5)=V2,YL(6)=V3... Velocity derivatives in general C coordinates. C C C Quantities computed along a ray: C (see C.R.T.5.2) C Basic quantities computed along a ray: C (see C.R.T.5.2.1) C Y(1)... Travel time. C Y(2)... Imaginary part of the complex-valued travel time. C Y(3),Y(4),Y(5)... Coordinates of points along the ray. C Y(6),Y(7),Y(8)... Covariant components of the slowness vector. C Y(9),Y(10),Y(11)... Covariant components of the polarization C vector E1 perpendicular to the ray. C ( Y(12),Y(16),Y(20),Y(24) ) Ray propagator matrix (i.e. the C ( Y(13),Y(17),Y(21),Y(25) ) ...matrix of fundamental solutions C ( Y(14),Y(18),Y(22),Y(26) ) of the dynamic ray tracing system. C ( Y(15),Y(19),Y(23),Y(27) ) C Y(28) TO Y(NY), where NY=27+NAMPL... NAMPL real quantities C representing complex-valued vectorial reduced amplitudes. C The vectorial reduced amplitudes are specified in the C ray-centred coordinate system. C P wave at the initial point of the ray, C P wave at the point under consideration: C NAMPL=2, C Y(28)=REAL(A33), Y(29)=AIMAG(A33). C P wave at the initial point of the ray, C S wave at the point under consideration: C NAMPL=4, C Y(28)=REAL(A13), Y(29)=AIMAG(A13), C Y(30)=REAL(A23), Y(31)=AIMAG(A23). C S wave at the initial point of the ray, C P wave at the point under consideration: C NAMPL=4, C Y(28)=REAL(A31), Y(29)=AIMAG(A31), C Y(30)=REAL(A32), Y(31)=AIMAG(A32). C S wave at the initial point of the ray, C S wave at the point under consideration: C NAMPL=8, C Y(28)=REAL(A11), Y(29)=AIMAG(A11), C Y(30)=REAL(A21), Y(31)=AIMAG(A21), C Y(32)=REAL(A12), Y(33)=AIMAG(A12), C Y(34)=REAL(A22), Y(35)=AIMAG(A22). C Y(NY+1) to Y(35), where NY=27+NAMPL... Undefined. C C Auxiliary quantities computed along a ray: C (see C.R.T.5.2.2) C YY(1)...Independent variable along a ray. C YY(2)=UEBRAY... Upper error bound for ray tracing, which is equal C to the input value UEB at the initial point of the ray, C C.R.T.5.6j. C It is always doubled when the numerical integration C requires more than NHLF bisections of the initial C increment step, see C C.R.T.5.6g. C UEBRAY.GT.UEB at the endpoint of the ray indicates C a decreased accuracy of computation. C YY(3)=ERRPP,YY(4)=ERRPH,YY(5)=ERRHH... Deviations (in absolute C values) of the two computed basis vectors of the C ray-centred coordinate system from the conditions of C orthonormality accumulated along the ray. See C C.R.T.5.8.2d C and 5.8.3i. C Any of the deviations may be compared with the C corresponding specified limit UEBPP, UEBPH, UEBHH at the C endpoint of the ray. C C IY(1)=NY=27+NAMPL... Number of the basic quantities C describing the point of a ray, see above. C IY(2)=KODIND... Position in the code (index in array KODE) C corresponding to the considered element of a ray. Its C value is determined by subroutine CODE, see C C.R.T.4. C IY(3)=ICB0... Index of the complex block, from which the ray C entered the complex block in which the computed C element of the ray is situated. C IY(3)=0 before leaving the complex block, in which the C initial point of the ray is situated. C IY(4)=ISB1... Index of the simple block containing the C computed element of the ray. C IY(5)=ICB1... Index of the complex block containing the C computed element of the ray, supplemented by a sign '+' C for P wave and sign '-' for S wave. C IY(6)=ISRF... Index of the surface at which the endpoint of the C computed element of the ray is situated, supplemented by C a sign '+' or '-' for the endpoint situated at the C positive or negative side of the surface, respectively. C Zero inside the complex block. Note: the sign of this C quantity is the exception to the definition in the C original paper on C.R.T. C IY(7)=ISB2... Index of the simple block touching the complex C block ICB1 from the other side of the surface ISRF at C the endpoint of the computed element of the ray. C ISB2=0 for a free space on the other side of ISRF. C Undefined inside the complex block, defined only at C the endpoint of the element of the ray. C IY(8)=ICB2... Index of the complex block touching the complex C block ICB1 from the other side of the surface ISRF at C the endpoint of the computed element of the ray. C ICB2=0 for a free space on the other side of ISRF. C Undefined inside the complex block, defined only at C the endpoint of the element of the ray. C IY(9)=IFCT... Number of invocations of subroutine FCT evaluating C the right-hand sides of the ordinary differential C equations, along the computed part of the ray. C IY(10)=IOUTP... Number of successful steps of the numerical C integration, along the ray (i.e. the number of invocations C of subroutine OUTP decreased by the number of invocations C of subroutine HPCG). C IY(11)=ITRANS... Number of transformations at an interface (i.e. C the number of invocations of subroutine TRANS). C IY(12)=KMAH... Number of caustic points along the ray (the index C of the ray trajectory). C C Date: 1990, January 23 C Written by Vlastislav Cerveny, Ludek Klimes, Ivan Psencik C C======================================================================= C C C SUBROUTINE RAY1(LUN) INTEGER LUN C C Subroutine RAY1 reads the input data for complete ray tracing, see C C.R.T.5.6, and stores C them in common blocks /RAYT/ and /DCRT/. It is called once, before C the complete tracing of individual rays begins. Subroutine RAY1 calls C subroutine SRFC1 in order to read the input data for the auxiliary C surfaces, and to store them in the memory. C C Input: C LUN... Logical unit number of the external input device C containing the input data. C The input parameter is not altered. C C No output. C C Common block /MODELC/ (subroutine file 'model.for'): INCLUDE 'model.inc' C model.inc C None of the storage locations of the common block are altered. C C Common block /DCRT/: INCLUDE 'dcrt.inc' C dcrt.inc C All the storage locations of the common blocks are defined in this C subroutine. C C Subroutines and external functions required: INTEGER NSRFC EXTERNAL NSRFC,SRFC1 C NSRFC...File 'model.for' of the package 'MODEL'. C SRFC1 and subsequent routines... File 'srfc.for' and subsequent C files (like 'val.for' and 'fit.for') of the package C 'MODEL'. C C Date: 2004, May 5 C Coded by Ludek Klimes C C----------------------------------------------------------------------- C C Auxiliary storage locations: CHARACTER*80 TEXTR INTEGER I C TEXTR...The name of the data. String of 80 characters. C C (1) String describing the data READ(LUN,*) TEXTR C (2,3) Quantities controlling numerical integration KSTORE=0 NEXPS=0 NHLF=5 MODCRT=0 READ(LUN,*) KSTORE,NEXPS,NHLF,MODCRT UEBPP =0. UEBPH =0. UEBHH =0. UEBDRT=0. READ(LUN,*) STORE,STEP,UEB,UEBPP,UEBPH,UEBHH,UEBDRT C (4) Coordinate planes and isochrone bounding the computational C volume DO 10 I=1,6 BOUNDR(I)=BOUNDM(I) 10 CONTINUE BOUNDR(7)=999999. READ(LUN,*) BOUNDR C (5) Number of auxiliary surfaces NSRFCA=0 READ(LUN,*) NSRFCA C C (6) End surfaces: C Initializing memory for indices of end surfaces DO 11 I=1,MEND KEND(I)=0 11 CONTINUE C Reading indices of end surfaces: READ(LUN,*) (KEND(I),I=1,MEND) DO 12 I=1,MEND IF(IABS(KEND(I)).GT.NSRFC()+NSRFCA) THEN C 563 CALL ERROR('563 in RAY1: Inadmissible end surface') C The index of an end surface in input data is greater than C the number of specified surfaces. ELSE IF(KEND(I).EQ.0) THEN NEND=I-1 GO TO 13 END IF 12 CONTINUE C 561 CALL ERROR('561 in RAY1: Insufficient memory in /DCRT/') C Insufficient memory for the input data in common block C /DCRT/. The dimension MEND of array KEND must be C enlarged. See the include file 'dcrt.inc'. C dcrt.inc 13 CONTINUE C C (7) Surfaces for storing computed quantities: C Initializing memory for indices of the surfaces DO 21 I=1,MSTOR KSTOR(I)=0 21 CONTINUE C Reading indices of the surfaces: READ(LUN,*) (KSTOR(I),I=1,MSTOR) DO 22 I=1,MSTOR/3+1 IF(KSTOR(I).LT.-NSRFC().OR.KSTOR(I).GT.NSRFC()+NSRFCA) THEN IF(KSTOR(I).LT.101.OR.KSTOR(I).GT.107) THEN C 564 CALL ERROR('564 in RAY1: Inadmissible store surface') C The index of a surface for storing the computed quantities C is greater than the number of specified surfaces and while C not specifying the computational volume boundary, or the C index of an auxiliary surface for storing is negative. END IF ELSE IF(KSTOR(I).EQ.0) THEN NSTOR=I-1 GO TO 23 END IF 22 CONTINUE C 562 CALL ERROR('562 in RAY1: Insufficient memory in /DCRT/') C Insufficient memory for the input data in common block /DCRT/. C The dimension MSTOR of array KSTOR must be enlarged. C See the include file 'dcrt.inc'. C dcrt.inc 23 CONTINUE C (8) Sequential numbers of the first points of intersection DO 28 I=NSTOR+1,2*NSTOR KSTOR(I)=1 28 CONTINUE READ(LUN,*) (KSTOR(I),I=NSTOR+1,2*NSTOR) C (9) Sequential numbers of the last points of intersection DO 29 I=2*NSTOR+1,3*NSTOR KSTOR(I)=999999 29 CONTINUE READ(LUN,*) (KSTOR(I),I=2*NSTOR+1,3*NSTOR) C C (10) Auxiliary surfaces: IF(NSRFCA.GT.0) THEN CALL SRFC1(LUN,NSRFCA) END IF C C SEP data: CALL RSEP3R('UEBMUL',UEBMUL,0.) RETURN END C C======================================================================= C C C SUBROUTINE RAY2(YL,Y,YY,IY,IEND) REAL YL(6),Y(35),YY(5) INTEGER IY(12),IEND C C This subroutine continues in the complete tracing of a ray from the C given point, see C C.R.T.5.7. C For MODCRT.LE.2 (see the input data (2)), C the whole ray is computed. For MODCRT.GE.3, just one ray element C is computed. C C Input: C YL... Array containing local quantities at the given point. C Y... Array containing basic quantities computed along the ray C at the given point. C YY... Array containing real auxiliary quantities computed along C the ray at the given point. C IY... Array containing integer auxiliary quantities computed C along the ray at the given point. C C Output: C YL... Array containing local quantities at the endpoint of the C ray. C Y... Array containing basic quantities computed along the ray C at the endpoint of the ray. C YY... Array containing real auxiliary quantities computed along C the ray at the endpoint of the ray. C IY... Array containing integer auxiliary quantities computed C along the ray at the endpoint of the ray. C IEND... Reason of the termination of the computation of a ray, see C C.R.T.5.4. C IEND=10,21,22,23,30 are indicated in subroutine CODE C (file 'code.for'). C IEND=24,25,26,32,33 are indicated in subroutine TRANS C (file 'trans.for'). C The reasons IEND=39,40,50,60 are checked and indicated C by IY(6) in subroutine RAYCB (file 'raycb.for'). C IEND=61 is indicated in this subroutine using IY(6). C IEND=71,72,73,74 are indicated in subroutine INIT2 C (file 'init.for'). C IEND C 0... The computation of the ray may continue. C 10... Ray satisfies the whole code. C 21... The point of incidence is situated at a different C surface than that specified by the code. C 22... The next element of the ray is required by the code C to be situated in a complex block that does not touch C the point of incidence. C 23,24... Transmission is required by the code at a free C surface. C 25... Ray of the required reflected or transmitted wave C is not real-valued (overcritical reflection or C transmission). C 26... S wave in a liquid block is required by the code. C 30,32... Reflection or type conversion at the fictitious C part of the interface. C 33... Zero reflection/transmission coefficient. C 37... The next element of the ray is required by the code C to be situated in a complex block that does not touch C the point of incidence. IEND=37 is reported as an error C inside this subroutine RAY2 and should not occur as the C output value. C 39... Too small velocity. This usually occurs when a ray C is approaching the region of negative velocity. C Tracing of the ray should be terminated in order to C avoid too many steps of numerical integration (when C integrating with respect to travel time) and consecutive C program failure. C Technical details: C This reason of termination is checked in subroutine C OUTP (file 'raycb.for'), and indicated by IY(6)=108 on C the output of subroutine RAYCB (file 'raycb.for') called C by subroutine RAY2 (this file). When setting IEND=39 in C subroutine RAY2, IY(6) is reset to zero. C 40... Travel time greater than the specified limit. C 50... Ray has intersected a coordinate plane limiting the C computational volume for complete ray tracing. C 60,61... Ray has intersected a smooth surface limiting the C computational volume for complete ray tracing. C 71... There is no ray corresponding to the given ray C parameters. E.g., the given parameters do not belong to C the domain of the initial surface. C 72... Initial point of the ray is not situated in the C required complex block. C 73... Initial point of the ray is not situated in the C computational volume. C 74... Ray of the generated wave is not real-valued. C Other values of IEND may indicate the program failure. C C Common block /DCRT/: INCLUDE 'dcrt.inc' C dcrt.inc C None of the storage locations of the common block are altered. C C Subroutines and external functions required: EXTERNAL NSRFC,KOOR,CODE,RAYCB,TRANS,CONV,RPAR31,RPAR32,RPAR33 EXTERNAL WRIT31,WRIT32,WRIT33 INTEGER NSRFC,KOOR C NSRFC,BLOCK,VELOC... File 'model.for' of the package 'MODEL'. C KOOR,METRIC... File 'metric.for' of the package 'MODEL'. C SRFC2 and subsequent routines... File 'srfc.for' and subsequent C files (like 'val.for' and 'fit.for') of the package C 'MODEL'. C PARM2 and subsequent routines... File 'parm.for' and subsequent C files (like 'val.for' and 'fit.for') of the package C 'MODEL'. C CDE,CROSS,HIVD2,SMVPRD... File 'means.for' of the package 'MODEL'. C HPCG... IBM Scientific Subroutine Package (file 'hpcg.for' of the C package 'MODEL'). C CODE... File 'code.for'. C RAYCB and subsequent routines... File 'raycb.for'. C TRANS,CONV and subsequent routines... File 'trans.for'. C RPAR31,RPAR32,RPAR33... File 'rpar.for'. C WRIT31,WRIT32,WRIT33 and subsequent routines... File 'writ.for'. C C Date: 2004, April 5 C Coded by Ludek Klimes C C----------------------------------------------------------------------- C C Auxiliary storage locations: INTEGER KODIND,ICBNEW,I,NAMPL REAL YC(12) C C KODIND..Position in the code (index in the array KODE) C corresponding to the next element of the ray. C ICBNEW..The index of the complex block in which the next C element of the ray is to be situated, supplemented C by the sign "+" for P wave or "-" for S wave. C I... Auxiliary loop variable. C NAMPL...Number of real quantities representing complex-valued C vectorial reduced amplitudes. See the subroutine CONV of C the subroutine file 'trans.for'. C YC... Array containing real quantities representing complex- C -valued vectorial reduced amplitudes. See C C.R.T.5.5.4 C and the subroutine CONV of the subroutine file C 'trans.for'. C C....................................................................... C 10 CONTINUE IF(IY(6).EQ.0) THEN C C (a1) Element of the ray inside a complex block CALL RAYCB(YL,Y,YY,IY) C C (b1) Storage of the computed quantities at the interface CALL RPAR31(YL,Y,YY,IY) IF(STORE.NE.0) THEN CALL WRIT31(YL,Y,YY,IY) END IF DO 21 I=1,NSTOR IF(KSTOR(I).EQ.IY(6)) THEN CALL RPAR32(I,YL,Y,YY,IY) CALL CONV(KSTORE,YL,Y,IY,NAMPL,YC) CALL WRIT32(I,YL,Y,YY,IY,NAMPL,YC) END IF IF(KSTOR(I).EQ.-IY(6).AND.KSTORE.GE.2) THEN IY(6)=-IY(6) CALL CONV(KSTORE,YL,Y,IY,NAMPL,YC) CALL WRIT32(I,YL,Y,YY,IY,NAMPL,YC) IY(6)=-IY(6) END IF 21 CONTINUE IF(IABS(IY(6)).LE.NSRFC()) THEN CALL RPAR33(YL,Y,YY,IY) CALL WRIT33(YL,Y,YY,IY) END IF C C (a2) Check for the boundary of the computational volume IF(IABS(IY(6)).GE.108) THEN IY(6)=0 IEND=39 GO TO 99 ELSE IF(IABS(IY(6)).GE.107) THEN IEND=40 GO TO 99 ELSE IF(IABS(IY(6)).GE.101) THEN IEND=50 GO TO 99 ELSE IF(IABS(IY(6)).GT.NSRFC()) THEN IEND=60 GO TO 99 ELSE IF(MODCRT.GE.3) THEN IEND=0 GO TO 99 END IF C ELSE C C (b2) Interpretation of the elementary waves code CALL CODE(IY,KODIND,ICBNEW,IEND) IF(IEND.NE.0) THEN GO TO 99 END IF C C (b3) Check for the end surfaces C Note: Reflection from an end surface is allowed. IF(IABS(IY(5)).NE.IABS(ICBNEW)) THEN DO 23 I=1,NEND IF(IABS(KEND(I)).EQ.IABS(IY(6))) THEN IEND=61 GO TO 99 END IF 23 CONTINUE END IF C C (b4) Transformation across the interface CALL TRANS(YL,Y,YY,IY,KODIND,ICBNEW,IEND) IF(IEND.GE.37) THEN C 570 CALL ERROR('570 in RAY2: Wrong function of subroutine CODE') C Reason 37 of the termination of the ray computation C is reported by the subroutine TRANS, although it should be C reported previously by the subroutine CODE as the reason C 22 or 23, respectively. ELSE IF(IEND.NE.0) THEN GO TO 99 END IF C C (b5) Storage of the computed quantities at the interface CALL RPAR31(YL,Y,YY,IY) IF(STORE.NE.0) THEN CALL WRIT31(YL,Y,YY,IY) END IF DO 25 I=1,NSTOR IF(KSTOR(I).EQ.IY(6)) THEN CALL RPAR32(I,YL,Y,YY,IY) IF(KSTORE.LE.1) THEN CALL CONV(KSTORE,YL,Y,IY,NAMPL,YC) CALL WRIT32(I,YL,Y,YY,IY,NAMPL,YC) END IF END IF 25 CONTINUE C C (b6) The ray may continue in the next complex block IY(6)=0 C END IF GO TO 10 C 99 CONTINUE RETURN END C C======================================================================= C