]> git.uio.no Git - u/mrichter/AliRoot.git/blame - GEANT321/ggeom/gntrap.F
Allow any Cherenkov-like particle to be transported
[u/mrichter/AliRoot.git] / GEANT321 / ggeom / gntrap.F
CommitLineData
fe4da5cc 1*
2* $Id$
3*
4* $Log$
5* Revision 1.1.1.1 1995/10/24 10:20:54 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 GNTRAP (X, PAR, IACT, IFLAG, SNEXT, SNXT, SAFE)
13C.
14C. ******************************************************************
15C. * *
16C. * COMPUTE DISTANCE UP TO INTERSECTION WITH 'TRD1' OR 'TRD2' *
17C. * VOLUME, FROM INSIDE POINT X(1-3) ALONG DIRECTION X(4-6) *
18C. * *
19C. * PAR (input) : volume parameters *
20C. * IACT (input) : action flag *
21C. * = 0 Compute SAFE only *
22C. * = 1 Compute SAFE, and SNXT only if SNEXT .GT.new SAFE *
23C. * = 2 Compute both SAFE and SNXT *
24C. * = 3 Compute SNXT only *
25C. * IFLAG (input) : 1 for TRD1, 2 for TRD2 *
26C. * SNEXT (input) : see IACT = 1 *
27C. * SNXT (output) : distance to volume boundary *
28C. * SAFE (output) : shortest distance to any boundary *
29C. * *
30C. * ==>Called by : GNEXT, GTNEXT *
31C. * Author A.McPherson, P.Weidhaas ********* *
32C. * *
33C. ******************************************************************
34C.
35#include "geant321/gconsp.inc"
36 DIMENSION X(6),PAR(5)
37C.
38C. ------------------------------------------------------------------
39C.
40 SNXT = BIG
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))
46 ENDIF
47
48 IF (IACT .LT. 3) THEN
49
50C -------------------------------------------------
51C | Compute safety-distance 'SAFE' (P.Weidhaas) |
52C -------------------------------------------------
53
54 IF (IFLAG .EQ. 1) THEN
55C*******************************************************
56C
57C...... Shape "TRD1": only x varies with z.
58C
59C*******************************************************
60
61 SAF2 = PAR(3) - ABS(X(2))
62 SAF3 = PAR(4) - ABS(X(3))
63C
64C...... Distance alng x-direction to slanted wall.
65C
66 DISTX = PAR(1) + FACTX * (PAR(4) + X(3)) - ABS(X(1))
67 SAF1 = DISTX / SQRT (1.0 + FACTX*FACTX)
68 ELSE
69C*******************************************************
70C
71C...... Shape "TRD2": both x and y vary with z.
72C
73C*******************************************************
74 SAF3 = PAR(5) - ABS(X(3))
75C
76C...... Distance along x-direction to slanted wall.
77C
78 DISTX = PAR(1) + FACTX * (PAR(5) + X(3)) - ABS(X(1))
79 SAF1 = DISTX / SQRT (1.0 + FACTX*FACTX)
80C
81C...... Distance along y-direction to slanted wall.
82C
83 DISTY = PAR(3) + FACTY * (PAR(5) + X(3)) - ABS(X(2))
84 SAF2 = DISTY / SQRT (1.0 + FACTY*FACTY)
85 ENDIF
86
87 SAFE = MIN (SAF1, SAF2, SAF3)
88
89 IF (IACT .EQ. 0) GO TO 999
90 IF (IACT .EQ. 1) THEN
91 IF (SNEXT .LT. SAFE) GO TO 999
92 ENDIF
93 ENDIF
94
95
96C ------------------------------------------------
97C | Compute vector-distance 'SNXT' (McPherson) |
98C ------------------------------------------------
99
100
101 IF(IFLAG.NE.1) GO TO 20
102C
103C Only x-thickness varies with z.
104C
105C
106C First check z.
107C
108 ZEND=PAR(4)
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)
112C
113C Now do Y.
114C
115 5 YEND=PAR(3)
116 IF(X(5).LT.0.0) YEND=-YEND
117 IF(X(5).EQ.0.)GO TO 7
118 SN=(YEND-X(2))/X(5)
119 IF(SN.LT.SNXT) SNXT=SN
120C
121C Now do X.
122C
123 7 DXM=0.5*(PAR(1)+PAR(2))
124 ANUM=DXM+FACTX*X(3)-X(1)
125 DENO=X(4)-FACTX*X(6)
126C
127 IF(DENO.EQ.0.0) GO TO 10
128 QUOT = ANUM/DENO
129 IF(QUOT.LE.0.0.OR.QUOT.GT.SNXT) GO TO 10
130 SNXT=QUOT
131 GO TO 999
132C
133 10 CONTINUE
134C
135 ANUM=-FACTX*X(3)-X(1)-DXM
136 DENO=FACTX*X(6)+X(4)
137C
138 IF(DENO.EQ.0.0) GO TO 999
139 QUOT = ANUM/DENO
140 IF(QUOT.GT.0.0.AND.QUOT.LT.SNXT) SNXT=QUOT
141C
142 GO TO 999
143 20 CONTINUE
144C
145C x- and y-thicknesses vary with z.
146C
147C
148C First check z
149C
150 ZEND=PAR(5)
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)
154C
155C Now do x.
156C
157 25 DXM=0.5*(PAR(1)+PAR(2))
158 ANUM=DXM+FACTX*X(3)-X(1)
159 DENO=X(4)-FACTX*X(6)
160C
161 IF(DENO.EQ.0.0) GO TO 40
162 QUOT = ANUM/DENO
163 IF(QUOT.LE.0.0.OR.QUOT.GT.SNXT) GO TO 40
164 SNXT=QUOT
165 GO TO 60
166C
167 40 CONTINUE
168C
169 ANUM=-FACTX*X(3)-X(1)-DXM
170 DENO=FACTX*X(6)+X(4)
171C
172 IF(DENO.EQ.0.0) GO TO 60
173 QUOT = ANUM/DENO
174 IF(QUOT.GT.0.0.AND.QUOT.LT.SNXT) SNXT=QUOT
175C
176 60 CONTINUE
177C
178C Now do y.
179C
180 DYM=0.5*(PAR(3)+PAR(4))
181 ANUM=DYM+FACTY*X(3)-X(2)
182 DENO=X(5)-FACTY*X(6)
183C
184 IF(DENO.EQ.0.0) GO TO 80
185 QUOT = ANUM/DENO
186 IF(QUOT.LE.0.0.OR.QUOT.GT.SNXT) GO TO 80
187 SNXT=QUOT
188 GO TO 999
189C
190 80 CONTINUE
191C
192 ANUM=-FACTY*X(3)-X(2)-DYM
193 DENO=FACTY*X(6)+X(5)
194C
195 IF(DENO.EQ.0.0) GO TO 999
196 QUOT = ANUM/DENO
197 IF(QUOT.GT.0.0.AND.QUOT.LT.SNXT) SNXT=QUOT
198C
199 999 CONTINUE
200 END