www.pudn.com > Cwell.rar > chkcst.f


* Copyright (c) Colorado School of Mines, 2007.
* All rights reserved.

      SUBROUTINE CHKCST(XRAY1,ZRAY1,XRAY2,ZRAY2,N,NSEG,ICAUST)
c     Checks for caustic by looking to see if two adjacent rays
c     intersect each other on one of their segments.
c     Does not support multiple caustics (ie looks only for
c     one intersection).

      INTEGER  N,           ICAUST,      NSEG

      REAL     XRAY1(0:N),  ZRAY1(0:N),  XRAY2(0:N),  ZRAY2(0:N),
     :         DENOM,       LARGE,       SMALL

      PARAMETER( LARGE = 999999.,
     :           SMALL = .1)

cc    Local variables
      INTEGER  I
      REAL     SR1,   CR1,   SR2,   CR2,   X,   Z,
     :         X1,    X2


c     first set caustic identifier to 'no caustic'
      ICAUST = 1

c     (Note: rays can't intersect in first segment)
      DO 100 I = 2,  NSEG

c        eqn of ray segment for first ray...
         DENOM = ( ZRAY1(I) - ZRAY1(I-1))
         IF(ABS(DENOM).LT.SMALL) THEN
c           ray is horizontal
            SR1 = LARGE
            CR1 = ZRAY1(I)
         ELSE
c           slope
            SR1 = ( XRAY1(I) - XRAY1(I-1) ) / DENOM
c           intercept
            CR1 = ( XRAY1(I-1)*ZRAY1(I) - XRAY1(I)*ZRAY1(I-1) ) 
     :      / DENOM 
         END IF

c        eqn of ray segment for second ray...
         DENOM = ZRAY2(I) - ZRAY2(I-1)
         IF(ABS(DENOM).LT.SMALL) THEN
c           ray is horizontal
            SR2 = LARGE
            CR2 = ZRAY2(I)
         ELSE
c           slope
            SR2 = ( XRAY2(I) - XRAY2(I-1) ) / DENOM
c           intercept
            CR2 = ( XRAY2(I-1)*ZRAY2(I) - XRAY2(I)*ZRAY2(I-1) ) 
     :         / DENOM
         END IF


         IF(SR1.EQ.SR2) THEN
c           ray segments parallel, no intersection
         ELSE
c           intersection point
            Z = ( CR2 - CR1 ) / ( SR1 - SR2 )
            X = SR1 * Z + CR1

            X1 = XRAY1(I-1)
            X2 = XRAY1(I)
c           check to see if intersection occurs within ray segment
c           two cases, depending on whether ray is shooting to left or right
            IF(X.GE.(X1))THEN
               IF(X.LE.X2) THEN
                  ICAUST = 0
c                 not supporting multiple caustics...
                  RETURN
               END IF
            ELSE IF(X.LE.(X1)) THEN
               IF(X.GE.X2) THEN
                  ICAUST = 0
c                 not supporting multiple caustics...
                  RETURN
               END IF
            END IF
         END IF

100      CONTINUE

      RETURN
      END