]> git.uio.no Git - u/mrichter/AliRoot.git/blame - GEANT321/ggeom/gsdvt.F
Bugfix in AliPoints2Memory
[u/mrichter/AliRoot.git] / GEANT321 / ggeom / gsdvt.F
CommitLineData
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)
16C.
17C. ******************************************************************
18C. * *
19C. * Divides MOTHER into divisions called NAME along *
20C. * axis IAXIS in steps of STEP. If not exactly divisible *
21C. * will make as many as possible and will centre them *
22C. * with respect to the mother. Divisions will have medium *
23C. * number NUMED. If NUMED is 0, NUMED of MOTHER is taken. *
24C. * NDVMX is the expected maximum number of divisions *
25C. * (If 0, no protection tests are performed) *
26C. * *
27C. * JVO=Pointer to MOTHER volume *
28C. * JDIV=LQ(JVO-1) *
29C. * *
30C. * Q(JDIV+1)=IAXIS *
31C. * Q(JDIV+2)=Volume number. *
32C. * Q(JDIV+3)=Number of divisions. *
33C. * Q(JDIV+4)=Lowest coord of slices. *
34C. * Q(JDIV+5)=STEP *
35C. * *
36C. * ==>Called by : <USER>, GSDVS *
37C. * Authors F.Bruyant, M.Maire, A.McPherson ********* *
38C. * *
39C. ******************************************************************
40C.
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./
51C.
52C. ------------------------------------------------------------------
53C.
54C Check if volume master bank exists.
55C
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
61C
62C Check if MOTHER volume exists.
63C
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
69C
70C Check if NAME volume exists.
71C
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
77C
78C Check if MOTHER is not divided.
79C
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
86C
87C Check validity of axis value.
88C
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
93C
94C Check validity of STEP
95C
96 70 IF(STEP.GT.0.0) GO TO 80
97 WRITE(CHMAIL,6000)STEP
98 CALL GMAIL(0,0)
99 GO TO 99
100C
101C Create bank to store division parameters.
102C
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
106C
107C Now store parameters into bank area.
108C
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)
116C
117C Bit to allow division of objects defined
118C by GSPOSP.
119C
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)
125C
126 IF(NPAR.LE.0) GO TO 210
127C
128 CALL GFIPAR(JVO,0,0,NPAR,NATT,PAR,ATT)
129C
130C Check STEP and find and store start and NDIV.
131C
132 IF(ISH.NE.1) GO TO 100
133C
134C Box.
135C
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
142C
143 100 CONTINUE
144 IF(ISH.NE.2) GO TO 110
145C
146C Trapezoid with only X thickness varying with Z.
147C
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
157C
158 110 CONTINUE
159 IF(ISH.NE.3) GO TO 120
160C
161C Trapezoid with both X and Y thicknesses varying with
162C Z.
163C
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
175C
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
191C
192 126 IF(IAXIS.NE.2) GO TO 900
193 IF(MOD(PAR(3),180.).EQ.0.) GO TO 127
194 WRITE(CHMAIL,10100)
19510100 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)
20110200 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
217C
218 125 CONTINUE
219 IF(ISH.NE.5.AND.ISH.NE.6.AND.ISH.NE.NSCTUB) GO TO 160
220C
221C Tube, tube segment or cut tube.
222C
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
230C
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
241C
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
253C
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
263C
264 160 CONTINUE
265C
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
269C
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
276C
277 165 CONTINUE
278C
279 PAR(2)=-1.0
280 PAR(3)=-1.0
281 PAR(4)=-1.0
282 PAR(5)=-1.0
283 GO TO 210
284C
285 170 CONTINUE
286 IF(IAXIS.EQ.1) GO TO 210
287C
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
298C
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
308C
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
315C
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
327C
328 200 CONTINUE
329C
330 IF(ISH.NE.10) GO TO 900
331C
332C Parallelipiped.
333C
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.
339C
340 GO TO 210
341C
342C
343C Now create the volume for division.
344C
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
362C
363C Copy parameters in data area.
364C
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
372C
373 900 CONTINUE
374C
375C Divide action not supported.
376C
377 WRITE(CHMAIL,8000)
378 CALL GMAIL(0,0)
379 WRITE(CHMAIL,8001) ISH,IAXIS
380 CALL GMAIL(0,0)
381C
382 GO TO 99
383C
384 910 CONTINUE
385C
386C Step size too big.
387C
388 WRITE(CHMAIL,9000) STEP
389 CALL GMAIL(0,0)
390C
391C Not enough space.
392C
393 95 WRITE(CHMAIL,7000)NAME,MOTHER
394 CALL GMAIL(0,0)
395C
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