This commit was generated by cvs2svn to compensate for changes in r2,
[u/mrichter/AliRoot.git] / GEANT321 / ggeom / gnotra.F
1 *
2 * $Id$
3 *
4 * $Log$
5 * Revision 1.1.1.1  1995/10/24 10:20:53  cernlib
6 * Geant
7 *
8 *
9 #include "geant321/pilot.h"
10 *CMZ :  3.21/02 29/03/94  15.41.30  by  S.Giani
11 *-- Author :
12       SUBROUTINE GNOTRA (X, PAR, IACT, IFLAG, SNEXT, SNXT, SAFE)
13 C.
14 C.    ******************************************************************
15 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) *
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.    *       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       *
29 C.    *                                                                *
30 C.    *    ==>Called by : GNEXT, GTNEXT                                *
31 C.    *         Author  A.McPherson,  P.Weidhaas  *********            *
32 C.    *                                                                *
33 C.    ******************************************************************
34 C.
35 #include "geant321/gconsp.inc"
36       DIMENSION X(6),PAR(5)
37 C.
38 C.    ----------------------------------------------------------------
39 C.
40  
41       SNXT = BIG
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))
47       ENDIF
48  
49       IF (IACT .LT. 3) THEN
50  
51 C       -------------------------------------------------
52 C       |  Compute safety-distance 'SAFE' (P.Weidhaas)  |
53 C       -------------------------------------------------
54  
55         IF (IFLAG .EQ. 1) THEN
56 C*******************************************************
57 C
58 C......  Shape "TRD1":   only x varies with z.
59 C
60 C*******************************************************
61  
62           SAF2  = MAX (ABS(X(2)) - PAR(3),  0.0)
63           SAF3  = MAX (ABS(X(3)) - PAR(4),  0.0)
64 C
65 C......  Distance along x-direction to slanted wall.
66 C
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)
70           ELSE
71             SAF1  = 0.0
72           ENDIF
73  
74  
75         ELSE
76 C*******************************************************
77 C
78 C......  Shape "TRD2":  both x and y vary with z.
79 C
80 C*******************************************************
81  
82           SAF3  = MAX (ABS(X(3)) - PAR(5),  0.0)
83  
84 C
85 C......  Distance along x-direction to slanted wall.
86 C
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)
90           ELSE
91             SAF1  = 0.0
92           ENDIF
93 C
94 C......  Distance along y-direction to slanted wall.
95 C
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)
99           ELSE
100             SAF2  = 0.0
101           ENDIF
102  
103         ENDIF
104  
105         SAFE  = MAX (SAF1, SAF2, SAF3)
106  
107         IF (IACT .EQ. 0) GO TO 999
108         IF (IACT .EQ. 1) THEN
109           IF (SNEXT .LT. SAFE) GO TO 999
110         ENDIF
111       ENDIF
112  
113  
114 C     ------------------------------------------------
115 C     |  Compute vector-distance 'SNXT' (McPherson)  |
116 C     ------------------------------------------------
117  
118  
119 C
120 C                 Only x varies with z.
121 C
122       IF(IFLAG.NE.1) GO TO 50
123       S3=PAR(4)
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)
128       S2=PAR(3)
129       DS21=X(5)
130       DS22=X(5)
131       GO TO 60
132 C
133 C            Both x and y widths vary with z.
134 C
135    50 CONTINUE
136       S3=PAR(5)
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)
145  
146 C
147 C            FIRST DO THE Z COORDINATE.
148 C
149    60 SMAX=9.0E+10
150       SMIN=0.0
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
153       SMIN=(S3-X(3))/X(6)
154       SMAX=(-S3-X(3))/X(6)
155       IF(SMAX.GT.SMIN) GO TO 70
156       SN=SMAX
157       SMAX=SMIN
158       SMIN=SN
159 C
160    70 IF(SMIN.LT.0.0) SMIN=0.0
161       IF(SMAX.LT.SMIN) GO TO 999
162 C
163 C             NOW DO X COORDINATE.
164 C
165       SS1=S1-X(1)
166       SS2=-S1-X(1)
167       SN1=-1.0
168       SN2=SMAX
169 *
170       IF(SS1.LT.0.0) SN1=SMAX
171       IF(SS2.GT.0.0) SN2=-1.0
172 *
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
177       ST=SN2
178       SN2=SN1
179       SN1=ST
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
183       SN2=SMAX
184       GO TO 110
185 C
186    80 CONTINUE
187 C
188       IF(SN2.GT.SN1) SN2=SN1
189       SN1=0.0
190       GO TO 110
191 C
192    90 CONTINUE
193 C
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
199       SN2=SN1
200       SN1=0.0
201       GO TO 110
202 C
203   100 CONTINUE
204       SN1=SN2
205       SN2=SMAX
206 C
207   110 CONTINUE
208 C
209       IF(SN1.GT.SMIN) SMIN=SN1
210       IF(SN2.LT.SMAX) SMAX=SN2
211       IF(SMAX.LE.SMIN) GO TO 999
212 C
213 C             NOW DO Y COORDINATE.
214 C
215       SS1=S2-X(2)
216       SS2=-S2-X(2)
217       SN1=-1.0
218       SN2=SMAX
219 *
220       IF(SS1.LT.0.0) SN1=SMAX
221       IF(SS2.GT.0.0) SN2=-1.0
222 *
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
227       ST=SN2
228       SN2=SN1
229       SN1=ST
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
233       SN2=SMAX
234       GO TO 150
235 C
236   120 CONTINUE
237 C
238       IF(SN2.GT.SN1) SN2=SN1
239       SN1=0.0
240       GO TO 150
241 C
242   130 CONTINUE
243 C
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
249       SN2=SN1
250       SN1=0.0
251       GO TO 150
252 C
253   140 CONTINUE
254       SN1=SN2
255       SN2=SMAX
256 C
257   150 CONTINUE
258 C
259       IF(SN1.GT.SMIN) SMIN=SN1
260       IF(SN2.LT.SMAX) SMAX=SN2
261 C
262       IF(SMAX.LE.SMIN) GO TO 999
263       IF(SMIN.LE.0.)GO TO 999
264       SNXT = SMIN
265  
266  999  CONTINUE
267       END