5 * Revision 1.1.1.1 1995/10/24 10:20:55 cernlib
9 #include "geant321/pilot.h"
10 *CMZ : 3.21/02 29/03/94 15.41.30 by S.Giani
12 SUBROUTINE GSDVT (KNAME,MOTHER,STEP,IAXIS,NUMED,NDVMX)
14 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) *
24 C. * JVO=Pointer to MOTHER volume *
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. *
33 C. * ==>Called by : <USER>, GSDVS *
34 C. * Authors F.Bruyant, M.Maire, A.McPherson ********* *
36 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)
47 DATA ATT/1.,1.,1.,1.,1.,15*0./
49 C. ------------------------------------------------------------------
51 C Check if volume master bank exists.
53 CALL UCTOH(KNAME,NAME,4,4)
54 IF(JVOLUM.GT.0)GO TO 10
59 C Check if MOTHER volume exists.
61 10 CALL GLOOK(MOTHER,IQ(JVOLUM+1),NVOLUM,IVO)
63 WRITE(CHMAIL,2000)MOTHER
67 C Check if NAME volume exists.
69 20 CALL GLOOK(KNAME,IQ(JVOLUM+1),NVOLUM,IN)
71 WRITE(CHMAIL,2000)NAME
75 C Check if MOTHER is not divided.
80 WRITE(CHMAIL,4000)MOTHER
84 C Check validity of axis value.
86 60 IF(IAXIS.GT.0.AND.IAXIS.LT.4)GO TO 70
87 WRITE(CHMAIL,5000)IAXIS
91 C Check validity of STEP
93 70 IF(STEP.GT.0.0) GO TO 80
94 WRITE(CHMAIL,6000)STEP
98 C Create bank to store division parameters.
100 80 CALL MZBOOK(IXCONS,JDIV,JVO,-1,'VODI',0,0,6,3,0)
101 IF(IEOTRI.NE.0)GO TO 95
104 C Now store parameters into bank area.
114 C Bit to allow division of objects defined
121 CALL UCOPY(Q(JVO+NPAR+7),ATT,NATT)
123 IF(NPAR.LE.0) GO TO 210
125 CALL GFIPAR(JVO,0,0,NPAR,NATT,PAR,ATT)
127 C Check STEP and find and store start and NDIV.
129 IF(ISH.NE.1) GO TO 100
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
141 IF(ISH.NE.2) GO TO 110
143 C Trapezoid with only X thickness varying with Z.
145 IF(IAXIS.EQ.1) GO TO 900
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
156 IF(ISH.NE.3) GO TO 120
158 C Trapezoid with both X and Y thicknesses varying with
161 IF(IAXIS.NE.3) GO TO 900
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
174 IF(ISH.NE.4) GO TO 125
175 IF(IAXIS.NE.3) GO TO 126
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
189 126 IF(IAXIS.NE.2) GO TO 900
190 IF(MOD(PAR(3),180.).EQ.0.) GO TO 127
192 10100 FORMAT(' Division of TRAP ',A4,
193 + ' along Y only possible when PHI=0,180')
196 127 IF(PAR(4).EQ.PAR(8)) GO TO 128
198 10200 FORMAT(' Division of TRAP ',A4,
199 + ' along Y only possible when H1=H2')
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
216 IF(ISH.NE.5.AND.ISH.NE.6.AND.ISH.NE.NSCTUB) GO TO 160
218 C Tube, tube segment or cut tube.
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
229 IF(IAXIS.NE.1) GO TO 140
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
240 IF(ISH.EQ.6) GO TO 150
244 IF (NDIV.LE.0) GO TO 910
253 IF(DP.LT.0.0) DP=DP+360.0
255 IF (NDIV.LE.0) GO TO 910
256 C0=PAR(4)+(DP-STEP*NDIV)/2.0
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
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
283 IF(IAXIS.EQ.1) GO TO 210
285 IF(ISH.EQ.8) GO TO 180
290 IF (NDIV.LE.0) GO TO 910
298 IF(DP.LT.0.0) DP=DP+360.0
300 IF (NDIV.LE.0) GO TO 910
301 C0=PAR(6)+(DP-STEP*NDIV)/2.0
307 IF(ISH.NE.9) GO TO 200
308 IF(IAXIS.NE.1) GO TO 195
313 IF(IAXIS.NE.3) GO TO 210
315 IF(DP.LT.0.0) DP=DP+360.0
317 IF (NDIV.LE.0) GO TO 910
318 C0=PAR(5)+(DP-STEP*NDIV)/2.0
327 IF(ISH.NE.10) GO TO 900
332 NDIV=(-C0*2.0+0.001)/STEP
333 IF (NDIV.LE.0) GO TO 910
340 C Now create the volume for division.
342 210 IF (NDVMX.NE.0) THEN
343 IF (NDIV.EQ.0) NDIV=-NDVMX
344 IF (NDIV.GT.NDVMX) THEN
347 1210 FORMAT (' ***** GSDVT MORE CELLS THAN EXPECTED MAXIMUM')
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
360 C Copy parameters in data area.
363 CALL UCOPY(Q(JVOM+1),Q(JVO+1),NWM)
364 IF(NPAR.GT.0) CALL GSIPAR(JVO,0,NPAR,NATT,PAR,ATT)
367 IF (NUMED.GT.0) Q(JVO+4)=NUMED
372 C Divide action not supported.
376 WRITE(CHMAIL,8001) ISH,IAXIS
385 WRITE(CHMAIL,9000) STEP
390 95 WRITE(CHMAIL,7000)NAME,MOTHER
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 ',
404 8001 FORMAT(' ISH =',I5,' IAXIS =',I5)
405 9000 FORMAT(' ***** GSDVT STEP SIZE',E15.5,' TOO BIG *****')