5 * Revision 1.1.1.1 1995/10/24 10:20:53 cernlib
9 #include "geant321/pilot.h"
10 *CMZ : 3.21/02 29/03/94 15.41.29 by S.Giani
12 SUBROUTINE GNOPGO (X, PAR, IACT, SNEXT, SNXT, SAFE)
14 C. ******************************************************************
16 C. * COMPUTE DISTANCE UP TO INTERSECTION WITH 'PGON' VOLUME, *
17 C. * FROM OUTSIDE POINT X(1-3) ALONG DIRECTION X(4-6) *
19 C. * PAR (input) : volume parameters *
20 C. * IACT (input) : action flag *
21 C. * = 0 Compute SAFE only *
22 C. * = 1 Compute SAFE, and SNXT only if SNEXT .GT.new SAFE *
23 C. * = 2 Compute both SAFE and SNXT *
24 C. * = 3 Compute SNXT only *
25 C. * SNEXT (input) : see IACT = 1 *
26 C. * SNXT (output) : distance to volume boundary *
27 C. * from point X(1-3) along direction X(4-6) *
28 C. * SAFE (output) : shortest distance from point X(1-3) to *
29 C. * any boundary (possibly overestimated) *
31 C. * ==>Called by : GNEXT, GTNEXT *
32 C. * Authors R.Nierhaus, F.Bruyant ********* *
34 C. ******************************************************************
36 #include "geant321/gconsp.inc"
39 C. ------------------------------------------------------------------
48 DPHI2 = 0.5*PAR(2)*DEGRAD/PAR(3)
52 IF (X(3).LT.PAR(5)) THEN
54 ELSE IF (X(3).GT.PAR(3*NZ+2)) THEN
55 SAFEZ = X(3) -PAR(3*NZ+2)
63 IF (PAR(I).LT.RMIN) RMIN = PAR(I)
64 IF (PAR(I+1).GT.RMAX) RMAX = PAR(I+1)
68 * ** Treat outside Z-limits first
70 IF (SAFEZ.LT.0.9*BIG) THEN
72 SAFE = MAX(SAFEZ,RMIN-R)
73 ELSE IF (R.GT.RMAX) THEN
74 SAFE = MAX(SAFEZ,R-RMAX)
81 * ** Now one is inside the Z-limits
84 IF (X(3).GT.PAR(I)) GO TO 20
85 IF (PAR(I+1).EQ.PAR(I-2)) THEN
86 IF (R.LT.PAR(I+1)) THEN
89 XT3 = X(3) -0.5*(PAR(I)+PAR(I-3))
90 DZ = 0.5*(PAR(I)-PAR(I-3))
93 ELSE IF (PAR(I+2).EQ.PAR(I-1)) THEN
94 IF (R.GT.PAR(I+2)) THEN
97 XT3 = X(3) -0.5*(PAR(I)+PAR(I-3))
98 DZ = 0.5*(PAR(I)-PAR(I-3))
103 XT3 = X(3) -0.5*(PAR(I)+PAR(I-3))
104 DZ = 0.5*(PAR(I)-PAR(I-3))
105 FACT = 0.5*(PAR(I+1)-PAR(I-2))/DZ
106 RAD1 = PAR(I-2) +FACT*(DZ+XT3)
108 SAFE = (RAD1-R)/SQRT(1.+FACT**2)
110 FACT = 0.5*(PAR(I+2)-PAR(I-1))/DZ
111 RAD2 = PAR(I-1) +FACT*(DZ+XT3)
114 SAFE = (R-RAD2)/SQRT(1.+FACT**2)
119 IF (NZ.EQ.2) GO TO 19
121 18 SAFEZ = DZ-ABS(XT3)
122 SAFE = MIN(SAFEZ,SAFE)
124 19 IF (R.LT.RMIN) THEN
125 SAFE = MAX(RMIN-R,SAFE)
126 ELSE IF (R.GT.RMAX) THEN
127 SAFE = MAX(R-RMAX,SAFE)
133 * ** Case of a Phi segmented polygon
137 IF (IACT .EQ. 0) GO TO 999
138 IF (IACT .EQ. 1) THEN
139 IF (SNEXT .LT. SAFE) GO TO 999
143 CALL GNOPG1 (X, PAR, SNXT)