]>
Commit | Line | Data |
---|---|---|
fe4da5cc | 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 |