* * $Id$ * * $Log$ * Revision 1.1.1.1 1995/10/24 10:20:52 cernlib * Geant * * #include "geant321/pilot.h" *CMZ : 3.21/02 29/03/94 15.41.29 by S.Giani *-- Author : SUBROUTINE GNHYPE (X, PAR, IACT, SNEXT, SNXT, SAFE) C. C. ****************************************************************** C. * * C. * COMPUTE DISTANCE UP TO INTERSECTION WITH HYPErboloid * C. * VOLUME FROM INSIDE POINT X(1-3) ALONG DIRECTION X(4-6) * C. * * C. * PAR (input) : volume parameters * C. * inner radius * C. * outer radius * C. * half length in z * C. * straw stereo angle in degrees * C. * r**2 = (z*tan(theta))**2 + a**2 * C. * * C. * IACT (input) : action flag * C. * = 0 Compute SAFE only * C. * = 1 Compute SAFE, and SNXT only if SNEXT .GT.new SAFE * C. * = 2 Compute both SAFE and SNXT * C. * = 3 Compute SNXT only * C. * SNEXT (input) : see IACT = 1 * C. * SNXT (output) : distance to volume boundary * C. * SAFE (output) : shortest distance to any boundary * C. * * C. * ==>Called by : GNEXT, GTNEXT * C. * Authors M.J. Corden, A.Palounek * C. * * C. ****************************************************************** C. #include "geant321/gconsp.inc" DIMENSION X(6),PAR(4) C------------------------------------------------------------- SNXT = BIG R2 = X(1)*X(1) + X(2)*X(2) TANTHS=(TAN(PAR(4)*DEGRAD))**2 C ------------------------------------------------- C | Compute safety-distance 'SAFE' (P.Weidhaas) | C ------------------------------------------------- SAFZ1 = PAR(3) - X(3) SAFZ2 = PAR(3) + X(3) IF (IACT .LT. 3) THEN C tube version: C R = SQRT (R2) C IF (PAR(1).NE.0.) THEN C SAFR1 = R - PAR(1) C ELSE C SAFR1 = BIG C ENDIF C SAFR2 = PAR(2) - R C C SAFE = MIN (SAFZ1, SAFZ2, SAFR1, SAFR2) C C simple, safe choice for hyperboloid for now: SAFE=0. C IF (IACT .EQ. 0) GO TO 999 IF (IACT .EQ. 1) THEN IF (SNEXT .LT. SAFE) GO TO 999 ENDIF ENDIF C ------------------------------------------------ C | Compute vector-distance 'SNXT' (McPherson) | C ------------------------------------------------ C C Compute intersection with z-boundaries. C IF(X(6).GT.0.)THEN SNXT=SAFZ1/X(6) ELSEIF(X(6).LT.0.)THEN SNXT=-SAFZ2/X(6) ENDIF C C Compute intercepts with inner & outer curved surfaces: C A = X(4)**2 + X(5)**2 - X(6)**2*TANTHS B = X(1)*X(4) + X(2)*X(5) - X(3)*X(6)*TANTHS DO 38 NCYL =1,2 C = R2 - X(3)**2*TANTHS - PAR(NCYL)**2 SURD = B**2 - A*C IF(SURD.GT.0.) THEN SURD=SQRT(SURD) DIST1=(-B+SURD)/A IF(DIST1.GT.0.) SNXT=MIN(SNXT,DIST1) DIST2=(-B-SURD)/A IF(DIST2.GT.0.) SNXT=MIN(SNXT,DIST2) C not necessary to compute intercept with outer surface C if there is a positive intercept with inner surface: IF(DIST1.GT.0. .OR. DIST2.GT.0.) GO TO 999 ENDIF 38 CONTINUE C 999 CONTINUE END