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