5 * Revision 1.1.1.1 1995/10/24 10:20:54 cernlib
9 #include "geant321/pilot.h"
10 *CMZ : 3.21/02 29/03/94 15.41.30 by S.Giani
12 SUBROUTINE GNTRAP (X, PAR, IACT, IFLAG, SNEXT, SNXT, SAFE)
14 C. ******************************************************************
16 C. * COMPUTE DISTANCE UP TO INTERSECTION WITH 'TRD1' OR 'TRD2' *
17 C. * VOLUME, FROM INSIDE 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. ------------------------------------------------------------------
41 IF (IFLAG .EQ. 1) THEN
42 FACTX = (PAR(2) - PAR(1)) / (2.0 * PAR(4))
43 ELSEIF (IFLAG .EQ. 2) THEN
44 FACTX = (PAR(2) - PAR(1)) / (2.0 * PAR(5))
45 FACTY = (PAR(4) - PAR(3)) / (2.0 * PAR(5))
50 C -------------------------------------------------
51 C | Compute safety-distance 'SAFE' (P.Weidhaas) |
52 C -------------------------------------------------
54 IF (IFLAG .EQ. 1) THEN
55 C*******************************************************
57 C...... Shape "TRD1": only x varies with z.
59 C*******************************************************
61 SAF2 = PAR(3) - ABS(X(2))
62 SAF3 = PAR(4) - ABS(X(3))
64 C...... Distance alng x-direction to slanted wall.
66 DISTX = PAR(1) + FACTX * (PAR(4) + X(3)) - ABS(X(1))
67 SAF1 = DISTX / SQRT (1.0 + FACTX*FACTX)
69 C*******************************************************
71 C...... Shape "TRD2": both x and y vary with z.
73 C*******************************************************
74 SAF3 = PAR(5) - ABS(X(3))
76 C...... Distance along x-direction to slanted wall.
78 DISTX = PAR(1) + FACTX * (PAR(5) + X(3)) - ABS(X(1))
79 SAF1 = DISTX / SQRT (1.0 + FACTX*FACTX)
81 C...... Distance along y-direction to slanted wall.
83 DISTY = PAR(3) + FACTY * (PAR(5) + X(3)) - ABS(X(2))
84 SAF2 = DISTY / SQRT (1.0 + FACTY*FACTY)
87 SAFE = MIN (SAF1, SAF2, SAF3)
89 IF (IACT .EQ. 0) GO TO 999
91 IF (SNEXT .LT. SAFE) GO TO 999
96 C ------------------------------------------------
97 C | Compute vector-distance 'SNXT' (McPherson) |
98 C ------------------------------------------------
101 IF(IFLAG.NE.1) GO TO 20
103 C Only x-thickness varies with z.
109 IF(X(6).LT.0.0) ZEND=-ZEND
110 IF(X(6).EQ.0.)GO TO 5
111 SNXT=(ZEND-X(3))/X(6)
116 IF(X(5).LT.0.0) YEND=-YEND
117 IF(X(5).EQ.0.)GO TO 7
119 IF(SN.LT.SNXT) SNXT=SN
123 7 DXM=0.5*(PAR(1)+PAR(2))
124 ANUM=DXM+FACTX*X(3)-X(1)
127 IF(DENO.EQ.0.0) GO TO 10
129 IF(QUOT.LE.0.0.OR.QUOT.GT.SNXT) GO TO 10
135 ANUM=-FACTX*X(3)-X(1)-DXM
138 IF(DENO.EQ.0.0) GO TO 999
140 IF(QUOT.GT.0.0.AND.QUOT.LT.SNXT) SNXT=QUOT
145 C x- and y-thicknesses vary with z.
151 IF(X(6).LT.0.0) ZEND=-ZEND
152 IF(X(6).EQ.0.)GO TO 25
153 SNXT=(ZEND-X(3))/X(6)
157 25 DXM=0.5*(PAR(1)+PAR(2))
158 ANUM=DXM+FACTX*X(3)-X(1)
161 IF(DENO.EQ.0.0) GO TO 40
163 IF(QUOT.LE.0.0.OR.QUOT.GT.SNXT) GO TO 40
169 ANUM=-FACTX*X(3)-X(1)-DXM
172 IF(DENO.EQ.0.0) GO TO 60
174 IF(QUOT.GT.0.0.AND.QUOT.LT.SNXT) SNXT=QUOT
180 DYM=0.5*(PAR(3)+PAR(4))
181 ANUM=DYM+FACTY*X(3)-X(2)
184 IF(DENO.EQ.0.0) GO TO 80
186 IF(QUOT.LE.0.0.OR.QUOT.GT.SNXT) GO TO 80
192 ANUM=-FACTY*X(3)-X(2)-DYM
195 IF(DENO.EQ.0.0) GO TO 999
197 IF(QUOT.GT.0.0.AND.QUOT.LT.SNXT) SNXT=QUOT