]>
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:56 cernlib |
9 | * Geant | |
10 | * | |
11 | * | |
12 | #include "geant321/pilot.h" | |
13 | *CMZ : 3.21/03 06/10/94 18.33.17 by S.Giani | |
14 | *-- Author : | |
15 | SUBROUTINE GSDVT2(KNAME,MOTHER,STEP,IAXIS,C0,NUMED,NDVMX) | |
16 | C. | |
17 | C. ****************************************************************** | |
18 | C. * * | |
19 | C. * Divides MOTHER into divisions called NAME along * | |
20 | C. * axis IAXIS starting at coordinate value C0 with step * | |
21 | C. * size STEP. * | |
22 | C. * The new volume created will have medium number NUMED. * | |
23 | C. * 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)=C0 * | |
34 | C. * Q(JDIV+5)=STEP * | |
35 | C. * * | |
36 | C. * ==>Called by : ,USER., GSDVS2, GSDVX * | |
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 | CALL GFIPAR(JVO,0,0,NPAR,NATT,PAR,ATT) | |
116 | C | |
117 | C CHECK START AND STEP AND FIND AND STORE NDIV. | |
118 | C | |
119 | ISH=Q(JVO+2) | |
120 | IF(ISH.NE.1) GO TO 100 | |
121 | C | |
122 | C BOX | |
123 | C | |
124 | IF(PAR(IAXIS).LE.0.0) GO TO 920 | |
125 | IF(ABS(C0).GT.PAR(IAXIS)) GO TO 910 | |
126 | NDIV=(PAR(IAXIS)-C0+0.001)/STEP | |
127 | IF (NDIV.LE.0) GO TO 910 | |
128 | PAR(IAXIS)=STEP/2. | |
129 | GO TO 210 | |
130 | C | |
131 | 100 CONTINUE | |
132 | IF(ISH.NE.2) GO TO 110 | |
133 | C | |
134 | C TRAPEZOID WITH ONLY X THICKNESS VARYING WITH Z. | |
135 | C | |
136 | IF(IAXIS.EQ.1) GO TO 900 | |
137 | IF(PAR(IAXIS+1).LE.0.0) GO TO 920 | |
138 | IF(ABS(C0).GT.PAR(IAXIS+1)) GO TO 910 | |
139 | NDIV=(PAR(IAXIS+1)-C0+0.001)/STEP | |
140 | IF (NDIV.LE.0) GO TO 910 | |
141 | PAR(1)=-1. | |
142 | PAR(2)=-1. | |
143 | PAR(IAXIS+1)=STEP/2. | |
144 | GO TO 210 | |
145 | C | |
146 | 110 CONTINUE | |
147 | IF(ISH.NE.3) GO TO 120 | |
148 | C | |
149 | C TRAPEZOID WITH BOTH X AND Y THICKNESSES VARYING WITH | |
150 | C Z | |
151 | C | |
152 | IF(IAXIS.NE.3) GO TO 900 | |
153 | IF(PAR(5).LE.0.0) GO TO 920 | |
154 | IF(ABS(C0).GT.PAR(5)) GO TO 910 | |
155 | NDIV=(PAR(5)-C0+0.001)/STEP | |
156 | IF (NDIV.LE.0) GO TO 910 | |
157 | PAR(1)=-1. | |
158 | PAR(2)=-1. | |
159 | PAR(3)=-1. | |
160 | PAR(4)=-1. | |
161 | PAR(5)=STEP/2. | |
162 | GO TO 210 | |
163 | C | |
164 | 120 CONTINUE | |
165 | IF(ISH.NE.4) GO TO 125 | |
166 | IF(IAXIS.NE.3) GO TO 126 | |
167 | IF(PAR(1).LE.0.0) GO TO 920 | |
168 | IF(ABS(C0).GT.PAR(1)) GO TO 910 | |
169 | NDIV=(PAR(1)-C0+0.001)/STEP | |
170 | IF (NDIV.LE.0) GO TO 910 | |
171 | PAR(1)=STEP*0.5 | |
172 | PAR(4)=-1.0 | |
173 | PAR(5)=-1.0 | |
174 | PAR(6)=-1.0 | |
175 | PAR(8)=-1.0 | |
176 | PAR(9)=-1.0 | |
177 | PAR(10)=-1.0 | |
178 | GO TO 210 | |
179 | C | |
180 | 126 IF(IAXIS.NE.2) GO TO 900 | |
181 | IF(MOD(PAR(3),180.).EQ.0.) GO TO 127 | |
182 | WRITE(CHMAIL,10100) | |
183 | 10100 FORMAT(' Division of TRAP ',A4, | |
184 | + ' along Y only possible when PHI=0,180') | |
185 | CALL GMAIL(0,0) | |
186 | GOTO 99 | |
187 | 127 IF(PAR(4).EQ.PAR(8)) GO TO 128 | |
188 | WRITE(CHMAIL,10200) | |
189 | 10200 FORMAT(' Division of TRAP ',A4, | |
190 | + ' along Y only possible when H1=H2') | |
191 | CALL GMAIL(0,0) | |
192 | GOTO 99 | |
193 | 128 CONTINUE | |
194 | IF(PAR(4).LT.0.0) GO TO 920 | |
195 | IF(ABS(C0).GE.PAR(4)) GO TO 910 | |
196 | NDIV = (PAR(4)-C0+0.001)/STEP | |
197 | IF (NDIV.LE.0) GO TO 910 | |
198 | PAR(4) = 0.5*STEP | |
199 | PAR(5) = -1. | |
200 | PAR(6) = -1. | |
201 | PAR(8) = 0.5*STEP | |
202 | PAR(9) = -1. | |
203 | PAR(10) = -1. | |
204 | C | |
205 | GO TO 210 | |
206 | C | |
207 | 125 CONTINUE | |
208 | IF(ISH.NE.5.AND.ISH.NE.6.AND.ISH.NE.NSCTUB) GO TO 160 | |
209 | C | |
210 | C Tube, tube segment or cut tube. | |
211 | C | |
212 | IF(IAXIS.NE.3) GO TO 130 | |
213 | IF(PAR(3).LE.0.0) GO TO 920 | |
214 | IF(ABS(C0).GT.PAR(3)) GO TO 910 | |
215 | NDIV=(PAR(3)-C0+0.001)/STEP | |
216 | IF (NDIV.LE.0) GO TO 910 | |
217 | PAR(3)=STEP/2. | |
218 | GO TO 210 | |
219 | C | |
220 | 130 CONTINUE | |
221 | IF(IAXIS.NE.1) GO TO 140 | |
222 | IF(PAR(1).LE.0.0.OR.PAR(2).LE.0.0) GO TO 920 | |
223 | IF(C0.LT.PAR(1)) GO TO 910 | |
224 | NDIV=(PAR(2)-C0+0.001)/STEP | |
225 | IF (NDIV.LE.0) GO TO 910 | |
226 | PAR(1)=-1. | |
227 | PAR(2)=-1. | |
228 | GO TO 210 | |
229 | C | |
230 | 140 CONTINUE | |
231 | IF(ISH.EQ.6) GO TO 150 | |
232 | NW=NW+2 | |
233 | ISH=6 | |
234 | NDIV=360.001/STEP | |
235 | IF (NDIV.LE.0) GO TO 910 | |
236 | NPAR=5 | |
237 | PAR(4)=-STEP/2. | |
238 | PAR(5)=STEP/2. | |
239 | GO TO 210 | |
240 | C | |
241 | 150 CONTINUE | |
242 | DP=PAR(5)-PAR(4) | |
243 | DC0P = C0-PAR(4) | |
244 | SG = SIGN(1.0,DC0P) | |
245 | DC0P = MOD( ABS(DC0P), 360.0) | |
246 | IF(SG.LE.0.0) DC0P = 360.0-DC0P | |
247 | C0 = PAR(4)+DC0P | |
248 | IF(C0-PAR(4).LT.0.0) C0=C0+360.0 | |
249 | IF(C0-PAR(4).GT.DP) GO TO 910 | |
250 | DP=PAR(5)-C0 | |
251 | IF(DP.LT.0.0) DP=DP+360 | |
252 | NDIV=(DP+0.001)/STEP | |
253 | IF (NDIV.LE.0) GO TO 910 | |
254 | PAR(4)=-STEP/2. | |
255 | PAR(5)=STEP/2. | |
256 | GO TO 210 | |
257 | C | |
258 | 160 CONTINUE | |
259 | C | |
260 | IF(ISH.NE.7.AND.ISH.NE.8) GO TO 190 | |
261 | IF(IAXIS.EQ.1) GO TO 165 | |
262 | IF(IAXIS.NE.3) GO TO 170 | |
263 | C | |
264 | IF(PAR(1).LE.0.0) GO TO 920 | |
265 | IF(ABS(C0).GT.PAR(1)) GO TO 910 | |
266 | NDIV=(PAR(1)-C0+0.001)/STEP | |
267 | IF (NDIV.LE.0) GO TO 910 | |
268 | PAR(1)=STEP*0.5 | |
269 | C | |
270 | 165 CONTINUE | |
271 | C | |
272 | PAR(2)=-1.0 | |
273 | PAR(3)=-1.0 | |
274 | PAR(4)=-1.0 | |
275 | PAR(5)=-1.0 | |
276 | GO TO 210 | |
277 | C | |
278 | 170 CONTINUE | |
279 | IF(IAXIS.EQ.1) GO TO 210 | |
280 | C | |
281 | IF(ISH.EQ.8) GO TO 180 | |
282 | NW=NW+2 | |
283 | ISH=8 | |
284 | NDIV=360.001/STEP | |
285 | IF (NDIV.LE.0) GO TO 910 | |
286 | NPAR=7 | |
287 | PAR(6)=-STEP/2. | |
288 | PAR(7)=STEP/2. | |
289 | GO TO 210 | |
290 | C | |
291 | 180 CONTINUE | |
292 | DP=PAR(7)-PAR(6) | |
293 | DC0P = C0-PAR(6) | |
294 | SG = SIGN(1.0,DC0P) | |
295 | DC0P = MOD( ABS(DC0P), 360.0) | |
296 | IF(SG.LE.0.0) DC0P = 360.0-DC0P | |
297 | C0 = PAR(6)+DC0P | |
298 | IF(C0-PAR(6).LT.0.0) C0=C0+360.0 | |
299 | IF(C0-PAR(6).GT.DP) GO TO 910 | |
300 | DP=PAR(7)-C0 | |
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 | PAR(6)=-STEP/2. | |
305 | PAR(7)=STEP/2. | |
306 | GO TO 210 | |
307 | C | |
308 | 190 CONTINUE | |
309 | IF(ISH.NE.9) GO TO 200 | |
310 | IF(IAXIS.NE.1) GO TO 195 | |
311 | PAR(1)=-1.0 | |
312 | PAR(2)=-1.0 | |
313 | 195 CONTINUE | |
314 | C | |
315 | IF(IAXIS.NE.3) GO TO 210 | |
316 | DP=PAR(6)-PAR(5) | |
317 | DC0P = C0-PAR(4) | |
318 | SG = SIGN(1.0,DC0P) | |
319 | DC0P = MOD( ABS(DC0P), 360.0) | |
320 | IF(SG.LE.0.0) DC0P = 360.0-DC0P | |
321 | C0 = PAR(4)+DC0P | |
322 | IF(C0.LT.PAR(5)) C0=C0+360.0 | |
323 | IF(C0-PAR(5).GT.DP) GO TO 910 | |
324 | DP=PAR(6)-C0 | |
325 | IF(DP.LT.0.0) DP=DP+360 | |
326 | NDIV=(DP+0.001)/STEP | |
327 | IF (NDIV.LE.0) GO TO 910 | |
328 | PAR(3)=-1. | |
329 | PAR(4)=-1. | |
330 | PAR(5)=-0.5*STEP | |
331 | PAR(6)=0.5*STEP | |
332 | GO TO 210 | |
333 | C | |
334 | 200 CONTINUE | |
335 | C | |
336 | GO TO 900 | |
337 | C | |
338 | C NOW CREATE THE VOLUME FOR DIVISION | |
339 | C | |
340 | 210 IF (NDVMX.GT.0) THEN | |
341 | IF (NDIV.GT.NDVMX) THEN | |
342 | WRITE (CHMAIL, 1210) NDIV,NDVMX | |
343 | CALL GMAIL(0,0) | |
344 | 1210 FORMAT (' GSDVT2 : NDIV gt NDVMX', 2I8,' truncated') | |
345 | NDIV = NDVMX | |
346 | ENDIF | |
347 | ELSE IF (NDVMX.LT.0) THEN | |
348 | * Case when called by GSDVX | |
349 | IF (NDIV.GT.-NDVMX) NDIV = -NDVMX | |
350 | ENDIF | |
351 | Q(JDIV+4)=C0 | |
352 | Q(JDIV+5)=STEP | |
353 | Q(JDIV+3)=NDIV | |
354 | NVOLUM=NVOLUM+1 | |
355 | NVOL =IQ(JVOLUM-2) | |
356 | IF(NVOLUM.GT.NVOL)CALL MZPUSH(IXCONS,JVOLUM,50,50,'I') | |
357 | CALL MZBOOK(IXCONS,JVO,JVOLUM,-NVOLUM,'VOL1',50,50,NW,3,0) | |
358 | IF(IEOTRI.NE.0)GO TO 95 | |
359 | IQ(JVOLUM+NVOLUM)=NAME | |
360 | C | |
361 | C COPY PARAMETERS IN DATA AREA | |
362 | C | |
363 | JVOM=LQ(JVOLUM-IVOM) | |
364 | CALL UCOPY(Q(JVOM+1),Q(JVO+1),NWM) | |
365 | CALL GSIPAR(JVO,0,NPAR,NATT,PAR,ATT) | |
366 | Q(JVO+2)=ISH | |
367 | Q(JVO+3)=0. | |
368 | IF (NUMED.GT.0) Q(JVO+4)=NUMED | |
369 | GO TO 99 | |
370 | C | |
371 | 900 CONTINUE | |
372 | C | |
373 | C DIVIDE ACTION NOT SUPPORTED. | |
374 | C | |
375 | WRITE(CHMAIL,8000) | |
376 | CALL GMAIL(0,0) | |
377 | WRITE(CHMAIL,8001) ISH,IAXIS | |
378 | CALL GMAIL(0,0) | |
379 | C | |
380 | GO TO 99 | |
381 | C | |
382 | 910 CONTINUE | |
383 | C | |
384 | C C0 START OF DIVISION OUT OF OBJECT OR STEP SIZE TOO BIG. | |
385 | C | |
386 | WRITE(CHMAIL,9000) C0,STEP | |
387 | CALL GMAIL(0,0) | |
388 | C | |
389 | GO TO 99 | |
390 | 920 CONTINUE | |
391 | C | |
392 | C +VE DEFINITE PARAMETER IN DIMENSION OF C0 SET -VE OR 0. | |
393 | C | |
394 | WRITE(CHMAIL,9010) | |
395 | CALL GMAIL(0,0) | |
396 | C | |
397 | GO TO 99 | |
398 | C | |
399 | C NOT ENOUGH SPACE | |
400 | C | |
401 | 95 WRITE(CHMAIL,7000)NAME,MOTHER | |
402 | CALL GMAIL(0,0) | |
403 | C | |
404 | 99 CONTINUE | |
405 | 1000 FORMAT(' ***** GSDVT2 CALLED AND NO VOLUMES DEFINED *****') | |
406 | 2000 FORMAT(' ***** GSDVT2 VOLUME ',A4,' ALREADY EXISTS *****') | |
407 | 3000 FORMAT(' ***** GSDVT2 ROTATION MATRIX',I5,' DOES NOT EXIST *****') | |
408 | 4000 FORMAT(' ***** GSDVT2 MOTHER ',A4,' ALREADY DIVIDED *****') | |
409 | 5000 FORMAT(' ***** GSDVT2 BAD AXIS VALUE ',I5,' *****') | |
410 | 6000 FORMAT(' ***** GSDVT2 BAD STEP SIZE ',E15.5,' *****') | |
411 | 7000 FORMAT(' ***** GSDVT2 NOT ENOUGH SPACE TO STORE DIVISIONS ', | |
412 | + ' IN ',A4,' *****') | |
413 | 8000 FORMAT(' DIVIDE ACTION WITH C0 REQUESTED NOT SUPPORTED', | |
414 | +' AT PRESENT.') | |
415 | 8001 FORMAT(' ISH =',I5,' IAXIS =',I5) | |
416 | 9000 FORMAT(' ***** GSDVT2 C0',E15.5,' OUT OF OBJECT', | |
417 | +' OR STEP',E15.5,' TOO BIG *****') | |
418 | 9010 FORMAT(' ATTEMPT TO SPECIFY C0 WHEN APPROPRIATE DIMENSION', | |
419 | +' OF THE MOTHER IS DEFINED -VE (TO BE SELECTED AT RUN TIME)') | |
420 | END |