]> git.uio.no Git - u/mrichter/AliRoot.git/blob - GEANT321/ggeom/gnobox.F
This commit was generated by cvs2svn to compensate for changes in r2,
[u/mrichter/AliRoot.git] / GEANT321 / ggeom / gnobox.F
1 *
2 * $Id$
3 *
4 * $Log$
5 * Revision 1.1.1.1  1995/10/24 10:20:52  cernlib
6 * Geant
7 *
8 *
9 #include "geant321/pilot.h"
10 *CMZ :  3.21/02 29/03/94  15.41.29  by  S.Giani
11 *-- Author :
12       SUBROUTINE GNOBOX (X, PAR, IACT, SNEXT, SNXT, SAFE)
13 C.
14 C.    ******************************************************************
15 C.    *                                                                *
16 C.    *       COMPUTE DISTANCE UP TO INTERSECTION WITH 'BOX' VOLUME,   *
17 C.    *        FROM OUTSIDE POINT X(1-3) ALONG DIRECTION X(4-6)        *
18 C.    *                                                                *
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       *
28 C.    *                                                                *
29 C.    *       ==>Called by : GNEXT, GTNEXT                             *
30 C.    *       Author  A.McPherson, P.Weidhaas  ******                  *
31 C.    ******************************************************************
32 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)
36 C.
37 C.    ----------------------------------------------------------------
38 C.
39  
40       SNXT = BIG
41       DO 5 I=1,3
42         SAF(I)=ABS(X(I))-PAR(I)
43    5  CONTINUE
44  
45       IF (IACT .LT. 3) THEN
46  
47 C       -------------------------------------------------
48 C       |  Compute safety-distance 'SAFE' (P.Weidhaas)  |
49 C       -------------------------------------------------
50  
51         SAFE  = MAX (SAF1, SAF2, SAF3, 0.0)
52  
53         IF (IACT .EQ. 0) GO TO 999
54         IF (IACT .EQ. 1) THEN
55           IF (SNEXT .LT. SAFE) GO TO 999
56         ENDIF
57       ENDIF
58  
59 C     ------------------------------------------------
60 C     |  Compute vector-distance 'SNXT' (McPherson)  |
61 C     ------------------------------------------------
62  
63  
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
67 C
68       SMAX1=BIG
69       SMAX2=BIG
70       SMAX3=BIG
71       SMIN1=0.0
72 C
73       IF(SAF1.LT.0.) GO TO 10
74       IF(X(4).EQ.0.0) GO TO 999
75       S4 = ABS(X(4))
76       SMIN1=SAF1 / S4
77       SMAX1=(PAR(1)+ABS(X(1))) / S4
78       GO TO 20
79 C
80    10 CONTINUE
81       IF(X(4).NE.0.)THEN
82          SMAX1=PAR(1)/ABS(X(4))-X(1)/X(4)
83       ENDIF
84    20 CONTINUE
85 C
86       SMIN2=0.0
87       IF(SAF2.LT.0.) GO TO 30
88       IF(X(5).EQ.0.0) GO TO 999
89       S5=ABS(X(5))
90       SMIN2=SAF2/S5
91       SMAX2=(PAR(2)+ABS(X(2)))/S5
92       GO TO 40
93 C
94    30 CONTINUE
95       IF(X(5).NE.0.)THEN
96          SMAX2=PAR(2)/ABS(X(5))-X(2)/X(5)
97       ENDIF
98    40 CONTINUE
99 C
100       SMIN3=0.0
101       IF(SAF3.LT.0.) GO TO 50
102       IF(X(6).EQ.0.0) GO TO 999
103       S6=ABS(X(6))
104       SMIN3=SAF3/S6
105       SMAX3=(PAR(3)+ABS(X(3)))/S6
106       GO TO 60
107 C
108    50 CONTINUE
109       IF(X(6).NE.0.)THEN
110          SMAX3=PAR(3)/ABS(X(6))-X(3)/X(6)
111       ENDIF
112    60 CONTINUE
113 C
114       SMIN=MAX(SMIN1,SMIN2,SMIN3)
115       SMAX=MIN(SMAX1,SMAX2,SMAX3)
116       IF(SMAX.LT.SMIN) GO TO 999
117 C
118       IF(SMIN.LE.0.)GO TO 999
119       SNXT = SMIN
120  
121   999 CONTINUE
122       END