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.30 by S.Giani
12 SUBROUTINE GNOTRA (X, PAR, IACT, IFLAG, SNEXT, SNXT, SAFE)
14 C. ******************************************************************
16 C. * COMPUTE DISTANCE UP TO INTERSECTION WITH 'TRD1' OR 'TRD2' *
17 C. * VOLUME, 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. * IFLAG (input) : = 1 for TRD1, 2 for TRD2 *
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, P.Weidhaas ********* *
33 C. ******************************************************************
35 #include "geant321/gconsp.inc"
38 C. ----------------------------------------------------------------
42 IF (IFLAG .EQ. 1) THEN
43 FACTX = (PAR(2) - PAR(1)) / (2.0*PAR(4))
44 ELSEIF (IFLAG .EQ. 2) THEN
45 FACTX = (PAR(2) - PAR(1)) / (2.0*PAR(5))
46 FACTY = (PAR(4) - PAR(3)) / (2.0*PAR(5))
51 C -------------------------------------------------
52 C | Compute safety-distance 'SAFE' (P.Weidhaas) |
53 C -------------------------------------------------
55 IF (IFLAG .EQ. 1) THEN
56 C*******************************************************
58 C...... Shape "TRD1": only x varies with z.
60 C*******************************************************
62 SAF2 = MAX (ABS(X(2)) - PAR(3), 0.0)
63 SAF3 = MAX (ABS(X(3)) - PAR(4), 0.0)
65 C...... Distance along x-direction to slanted wall.
67 DISTX = PAR(1) + FACTX * (PAR(4) + X(3))
68 IF (ABS(X(1)) .GT. DISTX) THEN
69 SAF1 = (ABS(X(1)) - DISTX) / SQRT(1.0 + FACTX*FACTX)
76 C*******************************************************
78 C...... Shape "TRD2": both x and y vary with z.
80 C*******************************************************
82 SAF3 = MAX (ABS(X(3)) - PAR(5), 0.0)
85 C...... Distance along x-direction to slanted wall.
87 DISTX = PAR(1) + FACTX * (PAR(5) + X(3))
88 IF (ABS(X(1)) .GT. DISTX) THEN
89 SAF1 = (ABS(X(1)) - DISTX) / SQRT(1.0 + FACTX*FACTX)
94 C...... Distance along y-direction to slanted wall.
96 DISTY = PAR(3) + FACTY * (PAR(5) + X(3))
97 IF (ABS(X(2)) .GT. DISTY) THEN
98 SAF2 = (ABS(X(2)) - DISTY) / SQRT(1.0 + FACTY*FACTY)
105 SAFE = MAX (SAF1, SAF2, SAF3)
107 IF (IACT .EQ. 0) GO TO 999
108 IF (IACT .EQ. 1) THEN
109 IF (SNEXT .LT. SAFE) GO TO 999
114 C ------------------------------------------------
115 C | Compute vector-distance 'SNXT' (McPherson) |
116 C ------------------------------------------------
120 C Only x varies with z.
122 IF(IFLAG.NE.1) GO TO 50
124 FACTX = (PAR(2) - PAR(1)) / (2.0*S3)
125 S1 = 0.5 * (PAR(1) + PAR(2)) + FACTX * X(3)
126 DS11=X(4) - FACTX * X(6)
127 DS12=X(4) + FACTX * X(6)
133 C Both x and y widths vary with z.
137 FACTX = (PAR(2) - PAR(1)) / (2.0*S3)
138 FACTY = (PAR(4) - PAR(3)) / (2.0*S3)
139 S1 = 0.5 * (PAR(1) + PAR(2)) + FACTX * X(3)
140 DS11=X(4) - FACTX * X(6)
141 DS12=X(4) + FACTX * X(6)
142 S2 = 0.5 * (PAR(3) + PAR(4)) + FACTY * X(3)
143 DS21=X(5) - FACTY * X(6)
144 DS22=X(5) + FACTY * X(6)
147 C FIRST DO THE Z COORDINATE.
151 IF(X(6).EQ.0.0.AND.S3.LT.ABS(X(3))) GO TO 999
152 IF(X(6).EQ.0.0) GO TO 70
155 IF(SMAX.GT.SMIN) GO TO 70
160 70 IF(SMIN.LT.0.0) SMIN=0.0
161 IF(SMAX.LT.SMIN) GO TO 999
163 C NOW DO X COORDINATE.
170 IF(SS1.LT.0.0) SN1=SMAX
171 IF(SS2.GT.0.0) SN2=-1.0
173 IF(DS11.NE.0.0) SN1=SS1/DS11
174 IF(DS12.NE.0.0) SN2=SS2/DS12
175 IF(DS12*DS11.EQ.0.0) GO TO 90
176 IF(DS12.LT.0.0.AND.DS11.LT.0.0) GO TO 110
180 IF(DS12.GT.0.0.AND.DS11.GT.0.0) GO TO 110
181 IF(DS12.LT.0.0) GO TO 80
182 IF(SN2.GT.SN1) SN1=SN2
188 IF(SN2.GT.SN1) SN2=SN1
194 IF(DS12.EQ.0.0.AND.SS2.GT.0.0) GO TO 999
195 IF(DS12.EQ.0.0.AND.DS11.LT.0.0) GO TO 110
196 IF(DS11.EQ.0.0.AND.SS1.LT.0.0) GO TO 999
197 IF(DS11.EQ.0.0.AND.DS12.LE.0.0) GO TO 110
198 IF(DS11.EQ.0.0) GO TO 100
209 IF(SN1.GT.SMIN) SMIN=SN1
210 IF(SN2.LT.SMAX) SMAX=SN2
211 IF(SMAX.LE.SMIN) GO TO 999
213 C NOW DO Y COORDINATE.
220 IF(SS1.LT.0.0) SN1=SMAX
221 IF(SS2.GT.0.0) SN2=-1.0
223 IF(DS21.NE.0.0) SN1=SS1/DS21
224 IF(DS22.NE.0.0) SN2=SS2/DS22
225 IF(DS22*DS21.EQ.0.0) GO TO 130
226 IF(DS22.LT.0.0.AND.DS21.LT.0.0) GO TO 150
230 IF(DS22.GT.0.0.AND.DS21.GT.0.0) GO TO 150
231 IF(DS22.LT.0.0) GO TO 120
232 IF(SN2.GT.SN1) SN1=SN2
238 IF(SN2.GT.SN1) SN2=SN1
244 IF(DS22.EQ.0.0.AND.SS2.GT.0.0) GO TO 999
245 IF(DS22.EQ.0.0.AND.DS21.LT.0.0) GO TO 150
246 IF(DS21.EQ.0.0.AND.SS1.LT.0.0) GO TO 999
247 IF(DS21.EQ.0.0.AND.DS22.LE.0.0) GO TO 150
248 IF(DS21.EQ.0.0) GO TO 140
259 IF(SN1.GT.SMIN) SMIN=SN1
260 IF(SN2.LT.SMAX) SMAX=SN2
262 IF(SMAX.LE.SMIN) GO TO 999
263 IF(SMIN.LE.0.)GO TO 999