5 * Revision 1.1.1.1 1999/05/18 15:55:17 fca
8 * Revision 1.1.1.1 1995/10/24 10:20:55 cernlib
12 #include "geant321/pilot.h"
13 *CMZ : 3.21/02 29/03/94 15.41.30 by S.Giani
15 SUBROUTINE GSDVT (KNAME,MOTHER,STEP,IAXIS,NUMED,NDVMX)
17 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) *
27 C. * JVO=Pointer to MOTHER volume *
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. *
36 C. * ==>Called by : <USER>, GSDVS *
37 C. * Authors F.Bruyant, M.Maire, A.McPherson ********* *
39 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)
50 DATA ATT/1.,1.,1.,1.,1.,15*0./
52 C. ------------------------------------------------------------------
54 C Check if volume master bank exists.
56 CALL UCTOH(KNAME,NAME,4,4)
57 IF(JVOLUM.GT.0)GO TO 10
62 C Check if MOTHER volume exists.
64 10 CALL GLOOK(MOTHER,IQ(JVOLUM+1),NVOLUM,IVO)
66 WRITE(CHMAIL,2000)MOTHER
70 C Check if NAME volume exists.
72 20 CALL GLOOK(KNAME,IQ(JVOLUM+1),NVOLUM,IN)
74 WRITE(CHMAIL,2000)NAME
78 C Check if MOTHER is not divided.
83 WRITE(CHMAIL,4000)MOTHER
87 C Check validity of axis value.
89 60 IF(IAXIS.GT.0.AND.IAXIS.LT.4)GO TO 70
90 WRITE(CHMAIL,5000)IAXIS
94 C Check validity of STEP
96 70 IF(STEP.GT.0.0) GO TO 80
97 WRITE(CHMAIL,6000)STEP
101 C Create bank to store division parameters.
103 80 CALL MZBOOK(IXCONS,JDIV,JVO,-1,'VODI',0,0,6,3,0)
104 IF(IEOTRI.NE.0)GO TO 95
107 C Now store parameters into bank area.
117 C Bit to allow division of objects defined
124 CALL UCOPY(Q(JVO+NPAR+7),ATT,NATT)
126 IF(NPAR.LE.0) GO TO 210
128 CALL GFIPAR(JVO,0,0,NPAR,NATT,PAR,ATT)
130 C Check STEP and find and store start and NDIV.
132 IF(ISH.NE.1) GO TO 100
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
144 IF(ISH.NE.2) GO TO 110
146 C Trapezoid with only X thickness varying with Z.
148 IF(IAXIS.EQ.1) GO TO 900
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
159 IF(ISH.NE.3) GO TO 120
161 C Trapezoid with both X and Y thicknesses varying with
164 IF(IAXIS.NE.3) GO TO 900
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
177 IF(ISH.NE.4) GO TO 125
178 IF(IAXIS.NE.3) GO TO 126
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
192 126 IF(IAXIS.NE.2) GO TO 900
193 IF(MOD(PAR(3),180.).EQ.0.) GO TO 127
195 10100 FORMAT(' Division of TRAP ',A4,
196 + ' along Y only possible when PHI=0,180')
199 127 IF(PAR(4).EQ.PAR(8)) GO TO 128
201 10200 FORMAT(' Division of TRAP ',A4,
202 + ' along Y only possible when H1=H2')
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
219 IF(ISH.NE.5.AND.ISH.NE.6.AND.ISH.NE.NSCTUB) GO TO 160
221 C Tube, tube segment or cut tube.
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
232 IF(IAXIS.NE.1) GO TO 140
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
243 IF(ISH.EQ.6) GO TO 150
247 IF (NDIV.LE.0) GO TO 910
256 IF(DP.LT.0.0) DP=DP+360.0
258 IF (NDIV.LE.0) GO TO 910
259 C0=PAR(4)+(DP-STEP*NDIV)/2.0
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
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
286 IF(IAXIS.EQ.1) GO TO 210
288 IF(ISH.EQ.8) GO TO 180
293 IF (NDIV.LE.0) GO TO 910
301 IF(DP.LT.0.0) DP=DP+360.0
303 IF (NDIV.LE.0) GO TO 910
304 C0=PAR(6)+(DP-STEP*NDIV)/2.0
310 IF(ISH.NE.9) GO TO 200
311 IF(IAXIS.NE.1) GO TO 195
316 IF(IAXIS.NE.3) GO TO 210
318 IF(DP.LT.0.0) DP=DP+360.0
320 IF (NDIV.LE.0) GO TO 910
321 C0=PAR(5)+(DP-STEP*NDIV)/2.0
330 IF(ISH.NE.10) GO TO 900
335 NDIV=(-C0*2.0+0.001)/STEP
336 IF (NDIV.LE.0) GO TO 910
343 C Now create the volume for division.
345 210 IF (NDVMX.NE.0) THEN
346 IF (NDIV.EQ.0) NDIV=-NDVMX
347 IF (NDIV.GT.NDVMX) THEN
350 1210 FORMAT (' ***** GSDVT MORE CELLS THAN EXPECTED MAXIMUM')
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
363 C Copy parameters in data area.
366 CALL UCOPY(Q(JVOM+1),Q(JVO+1),NWM)
367 IF(NPAR.GT.0) CALL GSIPAR(JVO,0,NPAR,NATT,PAR,ATT)
370 IF (NUMED.GT.0) Q(JVO+4)=NUMED
375 C Divide action not supported.
379 WRITE(CHMAIL,8001) ISH,IAXIS
388 WRITE(CHMAIL,9000) STEP
393 95 WRITE(CHMAIL,7000)NAME,MOTHER
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 ',
407 8001 FORMAT(' ISH =',I5,' IAXIS =',I5)
408 9000 FORMAT(' ***** GSDVT STEP SIZE',E15.5,' TOO BIG *****')