]>
Commit | Line | Data |
---|---|---|
fe4da5cc | 1 | * |
2 | * $Id$ | |
3 | * | |
4 | * $Log$ | |
d43b40e2 | 5 | * Revision 1.1.1.1 1999/05/18 15:55:17 fca |
6 | * AliRoot sources | |
7 | * | |
fe4da5cc | 8 | * Revision 1.1.1.1 1995/10/24 10:20:55 cernlib |
9 | * Geant | |
10 | * | |
11 | * | |
12 | #include "geant321/pilot.h" | |
13 | *CMZ : 3.21/02 29/03/94 15.41.30 by S.Giani | |
14 | *-- Author : | |
15 | SUBROUTINE GSDVT (KNAME,MOTHER,STEP,IAXIS,NUMED,NDVMX) | |
16 | C. | |
17 | C. ****************************************************************** | |
18 | C. * * | |
19 | C. * Divides MOTHER into divisions called NAME along * | |
20 | C. * axis IAXIS in steps of STEP. If not exactly divisible * | |
21 | C. * will make as many as possible and will centre them * | |
22 | C. * with respect to the mother. Divisions will have medium * | |
23 | C. * number NUMED. If NUMED is 0, NUMED of MOTHER is taken. * | |
24 | C. * NDVMX is the expected maximum number of divisions * | |
25 | C. * (If 0, no protection tests are performed) * | |
26 | C. * * | |
27 | C. * JVO=Pointer to MOTHER volume * | |
28 | C. * JDIV=LQ(JVO-1) * | |
29 | C. * * | |
30 | C. * Q(JDIV+1)=IAXIS * | |
31 | C. * Q(JDIV+2)=Volume number. * | |
32 | C. * Q(JDIV+3)=Number of divisions. * | |
33 | C. * Q(JDIV+4)=Lowest coord of slices. * | |
34 | C. * Q(JDIV+5)=STEP * | |
35 | C. * * | |
36 | C. * ==>Called by : <USER>, GSDVS * | |
37 | C. * Authors F.Bruyant, M.Maire, A.McPherson ********* * | |
38 | C. * * | |
39 | C. ****************************************************************** | |
40 | C. | |
41 | #include "geant321/gcbank.inc" | |
42 | #include "geant321/gcflag.inc" | |
43 | #include "geant321/gcnum.inc" | |
44 | #include "geant321/gcunit.inc" | |
45 | #include "geant321/gcdraw.inc" | |
46 | #include "geant321/gcshno.inc" | |
47 | CHARACTER*4 KNAME,MOTHER | |
d43b40e2 | 48 | DIMENSION PAR(100),ATT(20) |
fe4da5cc | 49 | SAVE ATT |
50 | DATA ATT/1.,1.,1.,1.,1.,15*0./ | |
51 | C. | |
52 | C. ------------------------------------------------------------------ | |
53 | C. | |
54 | C Check if volume master bank exists. | |
55 | C | |
56 | CALL UCTOH(KNAME,NAME,4,4) | |
57 | IF(JVOLUM.GT.0)GO TO 10 | |
58 | WRITE(CHMAIL,1000) | |
59 | CALL GMAIL(0,0) | |
60 | GO TO 99 | |
61 | C | |
62 | C Check if MOTHER volume exists. | |
63 | C | |
64 | 10 CALL GLOOK(MOTHER,IQ(JVOLUM+1),NVOLUM,IVO) | |
65 | IF(IVO.GT.0)GO TO 20 | |
66 | WRITE(CHMAIL,2000)MOTHER | |
67 | CALL GMAIL(0,0) | |
68 | GO TO 99 | |
69 | C | |
70 | C Check if NAME volume exists. | |
71 | C | |
72 | 20 CALL GLOOK(KNAME,IQ(JVOLUM+1),NVOLUM,IN) | |
73 | IF(IN.LE.0)GO TO 50 | |
74 | WRITE(CHMAIL,2000)NAME | |
75 | CALL GMAIL(0,0) | |
76 | GO TO 99 | |
77 | C | |
78 | C Check if MOTHER is not divided. | |
79 | C | |
80 | 50 JVO=LQ(JVOLUM-IVO) | |
81 | NIN=Q(JVO+3) | |
82 | IF(NIN.EQ.0)GO TO 60 | |
83 | WRITE(CHMAIL,4000)MOTHER | |
84 | CALL GMAIL(0,0) | |
85 | GO TO 99 | |
86 | C | |
87 | C Check validity of axis value. | |
88 | C | |
89 | 60 IF(IAXIS.GT.0.AND.IAXIS.LT.4)GO TO 70 | |
90 | WRITE(CHMAIL,5000)IAXIS | |
91 | CALL GMAIL(0,0) | |
92 | GO TO 99 | |
93 | C | |
94 | C Check validity of STEP | |
95 | C | |
96 | 70 IF(STEP.GT.0.0) GO TO 80 | |
97 | WRITE(CHMAIL,6000)STEP | |
98 | CALL GMAIL(0,0) | |
99 | GO TO 99 | |
100 | C | |
101 | C Create bank to store division parameters. | |
102 | C | |
103 | 80 CALL MZBOOK(IXCONS,JDIV,JVO,-1,'VODI',0,0,6,3,0) | |
104 | IF(IEOTRI.NE.0)GO TO 95 | |
105 | IQ(JDIV-5)=IVO | |
106 | C | |
107 | C Now store parameters into bank area. | |
108 | C | |
109 | 90 Q(JDIV+1)=IAXIS | |
110 | Q(JDIV+2)=NVOLUM+1 | |
111 | Q(JVO+3)=-1 | |
112 | IVOM= IVO | |
113 | NWM = IQ(JVO-1) | |
114 | NW = NWM | |
115 | ISH = Q(JVO+2) | |
116 | C | |
117 | C Bit to allow division of objects defined | |
118 | C by GSPOSP. | |
119 | C | |
120 | C0=0.0 | |
121 | NDIV=0 | |
122 | NPAR=Q(JVO+5) | |
123 | NATT=Q(JVO+6) | |
124 | CALL UCOPY(Q(JVO+NPAR+7),ATT,NATT) | |
125 | C | |
126 | IF(NPAR.LE.0) GO TO 210 | |
127 | C | |
128 | CALL GFIPAR(JVO,0,0,NPAR,NATT,PAR,ATT) | |
129 | C | |
130 | C Check STEP and find and store start and NDIV. | |
131 | C | |
132 | IF(ISH.NE.1) GO TO 100 | |
133 | C | |
134 | C Box. | |
135 | C | |
136 | IF(PAR(IAXIS).LT.0.0) GO TO 210 | |
137 | NDIV=(PAR(IAXIS)*2.0+0.001)/STEP | |
138 | IF (NDIV.LE.0) GO TO 910 | |
139 | PAR(IAXIS)=STEP/2.0 | |
140 | C0=-STEP*NDIV/2.0 | |
141 | GO TO 210 | |
142 | C | |
143 | 100 CONTINUE | |
144 | IF(ISH.NE.2) GO TO 110 | |
145 | C | |
146 | C Trapezoid with only X thickness varying with Z. | |
147 | C | |
148 | IF(IAXIS.EQ.1) GO TO 900 | |
149 | PAR(1)=-1. | |
150 | PAR(2)=-1. | |
151 | IF(PAR(IAXIS+1).LT.0.0) GO TO 210 | |
152 | NDIV=(PAR(IAXIS+1)*2.0+0.001)/STEP | |
153 | IF (NDIV.LE.0) GO TO 910 | |
154 | PAR(IAXIS+1)=STEP/2.0 | |
155 | C0=-STEP*NDIV/2.0 | |
156 | GO TO 210 | |
157 | C | |
158 | 110 CONTINUE | |
159 | IF(ISH.NE.3) GO TO 120 | |
160 | C | |
161 | C Trapezoid with both X and Y thicknesses varying with | |
162 | C Z. | |
163 | C | |
164 | IF(IAXIS.NE.3) GO TO 900 | |
165 | PAR(1)=-1. | |
166 | PAR(2)=-1. | |
167 | PAR(3)=-1. | |
168 | PAR(4)=-1. | |
169 | IF(PAR(5).LT.0.0) GO TO 210 | |
170 | NDIV=(PAR(5)*2.0+0.001)/STEP | |
171 | IF (NDIV.LE.0) GO TO 910 | |
172 | PAR(5)=STEP/2.0 | |
173 | C0=-STEP*NDIV/2.0 | |
174 | GO TO 210 | |
175 | C | |
176 | 120 CONTINUE | |
177 | IF(ISH.NE.4) GO TO 125 | |
178 | IF(IAXIS.NE.3) GO TO 126 | |
179 | PAR(4)=-1.0 | |
180 | PAR(5)=-1.0 | |
181 | PAR(6)=-1.0 | |
182 | PAR(8)=-1.0 | |
183 | PAR(9)=-1.0 | |
184 | PAR(10)=-1.0 | |
185 | IF(PAR(1).LT.0.0) GO TO 210 | |
186 | NDIV=(PAR(1)*2.0+0.001)/STEP | |
187 | IF (NDIV.LE.0) GO TO 910 | |
188 | PAR(1)=STEP*0.5 | |
189 | C0=-STEP*NDIV*0.5 | |
190 | GO TO 210 | |
191 | C | |
192 | 126 IF(IAXIS.NE.2) GO TO 900 | |
193 | IF(MOD(PAR(3),180.).EQ.0.) GO TO 127 | |
194 | WRITE(CHMAIL,10100) | |
195 | 10100 FORMAT(' Division of TRAP ',A4, | |
196 | + ' along Y only possible when PHI=0,180') | |
197 | CALL GMAIL(0,0) | |
198 | GOTO 99 | |
199 | 127 IF(PAR(4).EQ.PAR(8)) GO TO 128 | |
200 | WRITE(CHMAIL,10200) | |
201 | 10200 FORMAT(' Division of TRAP ',A4, | |
202 | + ' along Y only possible when H1=H2') | |
203 | CALL GMAIL(0,0) | |
204 | GOTO 99 | |
205 | 128 CONTINUE | |
206 | PAR(5) = -1. | |
207 | PAR(6) = -1. | |
208 | PAR(9) = -1. | |
209 | PAR(10) = -1. | |
210 | IF(PAR(4).LT.0.0) GO TO 210 | |
211 | NDIV = (2.*PAR(4)+0.001)/STEP | |
212 | IF (NDIV.LE.0) GO TO 910 | |
213 | PAR(4) = 0.5*STEP | |
214 | PAR(8) = 0.5*STEP | |
215 | C0=-STEP*NDIV*0.5 | |
216 | GO TO 210 | |
217 | C | |
218 | 125 CONTINUE | |
219 | IF(ISH.NE.5.AND.ISH.NE.6.AND.ISH.NE.NSCTUB) GO TO 160 | |
220 | C | |
221 | C Tube, tube segment or cut tube. | |
222 | C | |
223 | IF(IAXIS.NE.3) GO TO 130 | |
224 | IF(PAR(3).LT.0.0) GO TO 210 | |
225 | NDIV=(PAR(3)*2.0+0.001)/STEP | |
226 | IF (NDIV.LE.0) GO TO 910 | |
227 | PAR(3)=STEP/2.0 | |
228 | C0=-STEP*NDIV/2.0 | |
229 | GO TO 210 | |
230 | C | |
231 | 130 CONTINUE | |
232 | IF(IAXIS.NE.1) GO TO 140 | |
233 | PAR(1)=-1. | |
234 | PAR(2)=-1. | |
235 | IF(PAR(1).LT.0.0) GO TO 210 | |
236 | IF(PAR(2).LT.0.0) GO TO 210 | |
237 | NDIV=(PAR(2)-PAR(1)+0.001)/STEP | |
238 | IF (NDIV.LE.0) GO TO 910 | |
239 | C0=(PAR(2)+PAR(1)-STEP*NDIV)/2.0 | |
240 | GO TO 210 | |
241 | C | |
242 | 140 CONTINUE | |
243 | IF(ISH.EQ.6) GO TO 150 | |
244 | NW=NW+2 | |
245 | ISH=6 | |
246 | NDIV=360.001/STEP | |
247 | IF (NDIV.LE.0) GO TO 910 | |
248 | C0=0.0 | |
249 | NPAR=5 | |
250 | PAR(4)=-STEP/2. | |
251 | PAR(5)=STEP/2. | |
252 | GO TO 210 | |
253 | C | |
254 | 150 CONTINUE | |
255 | DP=PAR(5)-PAR(4) | |
256 | IF(DP.LT.0.0) DP=DP+360.0 | |
257 | NDIV=(DP+0.001)/STEP | |
258 | IF (NDIV.LE.0) GO TO 910 | |
259 | C0=PAR(4)+(DP-STEP*NDIV)/2.0 | |
260 | PAR(4)=-STEP/2. | |
261 | PAR(5)=STEP/2. | |
262 | GO TO 210 | |
263 | C | |
264 | 160 CONTINUE | |
265 | C | |
266 | IF(ISH.NE.7.AND.ISH.NE.8) GO TO 190 | |
267 | IF(IAXIS.EQ.1) GO TO 165 | |
268 | IF(IAXIS.NE.3) GO TO 170 | |
269 | C | |
270 | IF(PAR(1).LT.0.0) GO TO 165 | |
271 | NDIV=(PAR(1)*2.0+0.001)/STEP | |
272 | IF (NDIV.LE.0) GO TO 910 | |
273 | PAR(1)=STEP/2.0 | |
274 | C0=-STEP*NDIV/2.0 | |
275 | PAR(1)=STEP*0.5 | |
276 | C | |
277 | 165 CONTINUE | |
278 | C | |
279 | PAR(2)=-1.0 | |
280 | PAR(3)=-1.0 | |
281 | PAR(4)=-1.0 | |
282 | PAR(5)=-1.0 | |
283 | GO TO 210 | |
284 | C | |
285 | 170 CONTINUE | |
286 | IF(IAXIS.EQ.1) GO TO 210 | |
287 | C | |
288 | IF(ISH.EQ.8) GO TO 180 | |
289 | NW=NW+2 | |
290 | ISH=8 | |
291 | C0 =0.0 | |
292 | NDIV=360.001/STEP | |
293 | IF (NDIV.LE.0) GO TO 910 | |
294 | NPAR=7 | |
295 | PAR(6)=-STEP/2. | |
296 | PAR(7)=STEP/2. | |
297 | GO TO 210 | |
298 | C | |
299 | 180 CONTINUE | |
300 | DP=PAR(7)-PAR(6) | |
301 | IF(DP.LT.0.0) DP=DP+360.0 | |
302 | NDIV=(DP+0.001)/STEP | |
303 | IF (NDIV.LE.0) GO TO 910 | |
304 | C0=PAR(6)+(DP-STEP*NDIV)/2.0 | |
305 | PAR(6)=-STEP/2. | |
306 | PAR(7)=STEP/2. | |
307 | GO TO 210 | |
308 | C | |
309 | 190 CONTINUE | |
310 | IF(ISH.NE.9) GO TO 200 | |
311 | IF(IAXIS.NE.1) GO TO 195 | |
312 | PAR(1)=-1.0 | |
313 | PAR(2)=-1.0 | |
314 | 195 CONTINUE | |
315 | C | |
316 | IF(IAXIS.NE.3) GO TO 210 | |
317 | DP=PAR(6)-PAR(5) | |
318 | IF(DP.LT.0.0) DP=DP+360.0 | |
319 | NDIV=(DP+0.001)/STEP | |
320 | IF (NDIV.LE.0) GO TO 910 | |
321 | C0=PAR(5)+(DP-STEP*NDIV)/2.0 | |
322 | PAR(3)=-1. | |
323 | PAR(4)=-1. | |
324 | PAR(5)=-0.5*STEP | |
325 | PAR(6)=0.5*STEP | |
326 | GO TO 210 | |
327 | C | |
328 | 200 CONTINUE | |
329 | C | |
330 | IF(ISH.NE.10) GO TO 900 | |
331 | C | |
332 | C Parallelipiped. | |
333 | C | |
334 | C0 =-PAR(IAXIS) | |
335 | NDIV=(-C0*2.0+0.001)/STEP | |
336 | IF (NDIV.LE.0) GO TO 910 | |
337 | C0=-STEP*NDIV/2.0 | |
338 | PAR(IAXIS)=STEP/2. | |
339 | C | |
340 | GO TO 210 | |
341 | C | |
342 | C | |
343 | C Now create the volume for division. | |
344 | C | |
345 | 210 IF (NDVMX.NE.0) THEN | |
346 | IF (NDIV.EQ.0) NDIV=-NDVMX | |
347 | IF (NDIV.GT.NDVMX) THEN | |
348 | WRITE (CHMAIL, 1210) | |
349 | CALL GMAIL(0,0) | |
350 | 1210 FORMAT (' ***** GSDVT MORE CELLS THAN EXPECTED MAXIMUM') | |
351 | ENDIF | |
352 | ENDIF | |
353 | Q(JDIV+4)=C0 | |
354 | Q(JDIV+5)=STEP | |
355 | Q(JDIV+3)=NDIV | |
356 | NVOLUM=NVOLUM+1 | |
357 | NVOL =IQ(JVOLUM-2) | |
358 | IF(NVOLUM.GT.NVOL)CALL MZPUSH(IXCONS,JVOLUM,50,50,'I') | |
359 | CALL MZBOOK(IXCONS,JVO,JVOLUM,-NVOLUM,'VOL1',50,50,NW,3,0) | |
360 | IF(IEOTRI.NE.0)GO TO 95 | |
361 | IQ(JVOLUM+NVOLUM)=NAME | |
362 | C | |
363 | C Copy parameters in data area. | |
364 | C | |
365 | JVOM=LQ(JVOLUM-IVOM) | |
366 | CALL UCOPY(Q(JVOM+1),Q(JVO+1),NWM) | |
367 | IF(NPAR.GT.0) CALL GSIPAR(JVO,0,NPAR,NATT,PAR,ATT) | |
368 | Q(JVO+2)=ISH | |
369 | Q(JVO+3)=0. | |
370 | IF (NUMED.GT.0) Q(JVO+4)=NUMED | |
371 | GO TO 99 | |
372 | C | |
373 | 900 CONTINUE | |
374 | C | |
375 | C Divide action not supported. | |
376 | C | |
377 | WRITE(CHMAIL,8000) | |
378 | CALL GMAIL(0,0) | |
379 | WRITE(CHMAIL,8001) ISH,IAXIS | |
380 | CALL GMAIL(0,0) | |
381 | C | |
382 | GO TO 99 | |
383 | C | |
384 | 910 CONTINUE | |
385 | C | |
386 | C Step size too big. | |
387 | C | |
388 | WRITE(CHMAIL,9000) STEP | |
389 | CALL GMAIL(0,0) | |
390 | C | |
391 | C Not enough space. | |
392 | C | |
393 | 95 WRITE(CHMAIL,7000)NAME,MOTHER | |
394 | CALL GMAIL(0,0) | |
395 | C | |
396 | 99 CONTINUE | |
397 | 1000 FORMAT(' ***** GSDVT CALLED AND NO VOLUMES DEFINED *****') | |
398 | 2000 FORMAT(' ***** GSDVT VOLUME ',A4,' ALREADY EXISTS *****') | |
399 | 3000 FORMAT(' ***** GSDVT ROTATION MATRIX',I5,' DOES NOT EXIST *****') | |
400 | 4000 FORMAT(' ***** GSDVT MOTHER ',A4,' ALREADY DIVIDED *****') | |
401 | 5000 FORMAT(' ***** GSDVT BAD AXIS VALUE ',I5,' *****') | |
402 | 6000 FORMAT(' ***** GSDVT BAD STEP SIZE ',E15.5,' *****') | |
403 | 7000 FORMAT(' ***** GSDVT NOT ENOUGH SPACE TO STORE DIVISIONS ', | |
404 | + ' IN ',A4,' *****') | |
405 | 8000 FORMAT(' DIVIDE ACTION BY STEP REQUESTED NOT SUPPORTED ', | |
406 | +'AT PRESENT.') | |
407 | 8001 FORMAT(' ISH =',I5,' IAXIS =',I5) | |
408 | 9000 FORMAT(' ***** GSDVT STEP SIZE',E15.5,' TOO BIG *****') | |
409 | END |