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 GNOBOX (X, PAR, IACT, SNEXT, SNXT, SAFE)
14 C. ******************************************************************
16 C. * COMPUTE DISTANCE UP TO INTERSECTION WITH 'BOX' 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. * SAFE (output) : shortest distance to any boundary *
29 C. * ==>Called by : GNEXT, GTNEXT *
30 C. * Author A.McPherson, P.Weidhaas ****** *
31 C. ******************************************************************
33 #include "geant321/gconsp.inc"
34 DIMENSION X(6),PAR(3),SAF(3)
35 EQUIVALENCE (SAF(1),SAF1),(SAF(2),SAF2),(SAF(3),SAF3)
37 C. ----------------------------------------------------------------
42 SAF(I)=ABS(X(I))-PAR(I)
47 C -------------------------------------------------
48 C | Compute safety-distance 'SAFE' (P.Weidhaas) |
49 C -------------------------------------------------
51 SAFE = MAX (SAF1, SAF2, SAF3, 0.0)
53 IF (IACT .EQ. 0) GO TO 999
55 IF (SNEXT .LT. SAFE) GO TO 999
59 C ------------------------------------------------
60 C | Compute vector-distance 'SNXT' (McPherson) |
61 C ------------------------------------------------
64 IF(X(1)*X(4).GE.0.0.AND.SAF1.GT.0.) GO TO 999
65 IF(X(2)*X(5).GE.0.0.AND.SAF2.GT.0.) GO TO 999
66 IF(X(3)*X(6).GE.0.0.AND.SAF3.GT.0.) GO TO 999
73 IF(SAF1.LT.0.) GO TO 10
74 IF(X(4).EQ.0.0) GO TO 999
77 SMAX1=(PAR(1)+ABS(X(1))) / S4
82 SMAX1=PAR(1)/ABS(X(4))-X(1)/X(4)
87 IF(SAF2.LT.0.) GO TO 30
88 IF(X(5).EQ.0.0) GO TO 999
91 SMAX2=(PAR(2)+ABS(X(2)))/S5
96 SMAX2=PAR(2)/ABS(X(5))-X(2)/X(5)
101 IF(SAF3.LT.0.) GO TO 50
102 IF(X(6).EQ.0.0) GO TO 999
105 SMAX3=(PAR(3)+ABS(X(3)))/S6
110 SMAX3=PAR(3)/ABS(X(6))-X(3)/X(6)
114 SMIN=MAX(SMIN1,SMIN2,SMIN3)
115 SMAX=MIN(SMAX1,SMAX2,SMAX3)
116 IF(SMAX.LT.SMIN) GO TO 999
118 IF(SMIN.LE.0.)GO TO 999