]> git.uio.no Git - u/mrichter/AliRoot.git/blob - GEANT321/ggeom/gsdvt.F
100 parameters now allowed for geant shapes
[u/mrichter/AliRoot.git] / GEANT321 / ggeom / gsdvt.F
1 *
2 * $Id$
3 *
4 * $Log$
5 * Revision 1.1.1.1  1999/05/18 15:55:17  fca
6 * AliRoot sources
7 *
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
48       DIMENSION PAR(100),ATT(20)
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