5 * Revision 1.1.1.1 1995/10/24 10:20:52 cernlib
9 #include "geant321/pilot.h"
10 *CMZ : 3.21/02 29/03/94 15.41.29 by S.Giani
12 SUBROUTINE GNOPAR (X, PAR, IACT, SNEXT, SNXT, SAFE)
14 C. ******************************************************************
17 C. * COMPUTE DISTANCE UP TO INTERSECTION WITH 'PARA' VOLUME, *
18 C. * FROM OUTSIDE POINT X(1-3) ALONG DISTANCE X(4-6) *
20 C. * PAR (input) : volume parameters *
21 C. * IACT (input) : action flag *
22 C. * = 0 Compute SAFE only *
23 C. * = 1 Compute SAFE, and SNXT only if SNEXT .GT.new SAFE *
24 C. * = 2 Compute both SAFE and SNXT *
25 C. * = 3 Compute SNXT only *
26 C. * SNEXT (input) : see IACT = 1 *
27 C. * SNXT (output) : distance to volume boundary *
28 C. * SAFE (output) : shortest distance to any boundary *
30 C. * ==>Called by : GNEXT, GTNEXT *
31 C. * Author A.McPherson ********* *
33 C. ******************************************************************
35 #include "geant321/gconsp.inc"
36 DIMENSION X(6), PAR(6)
38 C. -------------------------------------------
46 CTY=1.0/SQRT(1.0+PAR(6)**2)
48 XT=X(1)-PAR(5)*X(3)-PAR(4)*YT
51 CTX=1.0/SQRT(1.0+PAR(4)**2+PAR(5)**2)
54 IF(SN3.LT.0.0) SN3=-DN32
56 IF(SN2.LT.0.0) SN2=-DN22*CTY
58 IF(SN1.LT.0.0) SN1=-DN12*CTX
63 C -------------------------------------------------
64 C | Compute safety-distance 'SAFE' (McPherson) |
65 C -------------------------------------------------
69 C IF(SAFETY.LT.0.0) GO TO 900
72 IF (IACT .EQ. 0) GO TO 999
74 IF (SNEXT .LT. SAFE) GO TO 999
79 C ------------------------------------------------
80 C | Compute vector-distance 'SNXT' (McPherson) |
81 C ------------------------------------------------
84 IF(X(6).NE.0.0) GO TO 5
85 IF(DN32*DN31.GT.0.0) GO TO 999
93 IF(X(6).GT.0.0) GO TO 10
101 IF(DN32.LE.0.0) GO TO 999
105 IF(DY.NE.0.0) GO TO 15
106 IF(DN21*DN22.GT.0.0) GO TO 999
113 IF(DY.GT.0.0) GO TO 20
121 IF(DN22.LE.0.0) GO TO 999
123 DX=X(4)-PAR(5)*X(6)-PAR(4)*DY
124 IF(DX.NE.0.0) GO TO 25
125 IF(DN11*DN12.GT.0.0) GO TO 999
132 IF(DX.GT.0.0) GO TO 30
140 IF(DN12.LE.0.0) GO TO 999
142 SMIN=MAX(DN11,DN21,DN31)
143 SMAX=MIN(DN12,DN22,DN32)
145 IF(SMAX.LE.SMIN) GO TO 999
147 IF(SMIN.LE.0.)GO TO 999