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 GNTRP (X, PAR, IACT, SNEXT, SNXT, SAFE)
14 C. ******************************************************************
16 C. * COMPUTE DISTANCE UP TO INTERSECTION WITH 'TRAP' VOLUME, *
17 C. * 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. * SNEXT (input) : see IACT = 1 *
26 C. * SNXT (output) : distance to volume boundary *
27 C. * SAFE (output) : shortest distance to any boundary *
29 C. * ==>Called by : GNEXT, GTNEXT *
30 C. * Author A.McPherson ********* *
32 C. ******************************************************************
34 #include "geant321/gconsp.inc"
35 DIMENSION X(6), PAR(11)
36 #if defined(CERNLIB_SINGLE)
37 DIMENSION XT(6), P(11)
39 #if !defined(CERNLIB_SINGLE)
40 DOUBLE PRECISION XT(6), P(11)
41 DOUBLE PRECISION A,B,C,DSN,TOP1,TOP2,BOT1,BOT2
42 DOUBLE PRECISION DX1,DX2,X1,X2,X3,DCX1,DCX2,DX,DY
43 DOUBLE PRECISION SP1,SP2,DCX,DCY,TANG1,TANG2,A1,B1,A2,B2
44 DOUBLE PRECISION XL1,XL2,XL3,XL4,CY,SY,SX,CX,C1,C2
45 DOUBLE PRECISION TX,H0,DHDZ,CH
46 DOUBLE PRECISION CHTAN,SHTAN
47 DOUBLE PRECISION SN1,SN2,SN3,SN4,SN5,SN6,SN7,SN8,P15
50 C. --------------------------------------
65 C -------------------------------------------------
66 C | Compute safety-distance 'SAFE' (McPherson) |
67 C -------------------------------------------------
70 C CALCULATE RECTANGLE ON FACE AT Z=-DZ.
82 C CALCULATE RECTANGLE ON FACE AT Z=DZ.
95 TX=P(2)+(DCX2-DCX1)*P15
97 C CALCULATE LOCAL RECTANGLE.
104 DCX=(DCX1+DCX2)*0.5+TX*XT(3)
107 C CHECK POINT IS INSIDE RECTANGLE.
109 IF(ABS(XT(1)-DCX).GT.DX) GO TO 10
111 C CALCULATE ANGLE OF YZ PLANES.
113 TANG1=TX+(DX1-DX2)*P15
114 TANG2=TX-(DX1-DX2)*P15
116 C CALCULATE SAFETY FROM YZ PLANES.
118 SAF1=(XT(1)-DCX+DX)/SQRT(1.0+TANG1*TANG1)
119 SAF2=(DX-XT(1)+DCX)/SQRT(1.0+TANG2*TANG2)
121 C CALCULATE ANGLE OF XZ PLANES.
126 C CALCULATE SAFETY FROM XZ PLANES.
128 SAF3=(XT(2)-DCY+DY)/SQRT(1.0+TANG1*TANG1)
129 SAF4=(DY-XT(2)+DCY)/SQRT(1.0+TANG2*TANG2)
131 C CALCULATE SAFETY FROM XY PLANES.
137 SAFE = MIN(SAF1,SAF2,SAF3,SAF4,SAF5)
140 IF (IACT .EQ. 0) GO TO 999
141 IF (IACT .EQ. 1) THEN
142 IF (SNEXT .LT. SAFE) GO TO 999
149 C ------------------------------------------------
150 C | Compute vector-distance 'SNXT' (McPherson) |
151 C ------------------------------------------------
155 C FIRST FIND S TO Z LIMITS.
162 IF(XT(6).EQ.0.0) GOTO 15
163 SN1=(P(1)-XT(3))/XT(6)
164 SN2=-(P(1)+XT(3))/XT(6)
165 IF(SN1.GE.0.) GOTO 15
176 TOP2=XT(2)-XT(3)*P(3)
177 BOT1=XT(5)-XT(6)*P(3)
180 IF(BOT1+BOT2.NE.0.0) SN3=(TOP1-TOP2)/(BOT1+BOT2)
181 IF(BOT2-BOT1.NE.0.0) SN4=(TOP1+TOP2)/(BOT2-BOT1)
185 XL1=(P(5)+P(6)+P(9)+P(10))*0.25
186 XL2=(P(5)-P(6)+P(9)-P(10))*0.25
187 XL3=(P(5)+P(6)-P(9)-P(10))*0.25
188 XL4=(P(5)-P(6)-P(9)+P(10))*0.25
194 A1=XL4*XT(6)*SY+XL3*XT(6)*XT(6)*DHDZ
195 B1=XL4*(XT(6)*CY+XT(3)*SY)-XL3*XT(6)*(CH-XT(3)*DHDZ)-XL2*P(1)*SY-
197 C1=XL4*CY*XT(3)-XL3*XT(3)*CH-XL2*CY*P(1)+XL1*CH*P(1)
199 CHTAN=(P(7)*P(4)+P(11)*P(8))*0.5
200 SHTAN=-(P(7)*P(4)-P(11)*P(8))*P15
201 CHTAN=CHTAN+SHTAN*XT(3)
206 A2=-P(1)*(DHDZ*XT(6)*SX+SY*SHTAN)
207 B2=P(1)*(CH*SX-DHDZ*XT(6)*CX-CY*SHTAN-SY*CHTAN)
208 C2=P(1)*(CH*CX-CY*CHTAN)
214 IF(B*B-A*C*4.0.LT.0.0) GO TO 20
215 IF(ABS(A).LT.1.0E-7) GO TO 19
216 DSN=SQRT(B*B-A*C*4.0)
222 IF(ABS(B).LT.1.0E-5) GO TO 20
232 IF(B*B-A*C*4.0.LT.0.0) GO TO 30
233 DSN=SQRT(B*B-A*C*4.0)
234 IF(ABS(A).LT.1.0E-7) GO TO 25
240 IF(ABS(B).LT.1.0E-5) GO TO 30
246 IF(SN2.GT.0.0.AND.SN2.LT.SN1) SN1=SN2
247 IF(SN3.GT.0.0.AND.SN3.LT.SN1) SN1=SN3
248 IF(SN4.GT.0.0.AND.SN4.LT.SN1) SN1=SN4
249 IF(ISN56.EQ.0) GO TO 40
250 IF(SN5.GT.0.0.AND.SN5.LT.SN1) SN1=SN5
251 IF(SN6.GT.0.0.AND.SN6.LT.SN1) SN1=SN6
253 IF(ISN78.EQ.0) GO TO 50
254 IF(SN7.GT.0.0.AND.SN7.LT.SN1) SN1=SN7
255 IF(SN8.GT.0.0.AND.SN8.LT.SN1) SN1=SN8