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 GSDVN(KNAME,MOTHER,NDIV,IAXIS)
17 C. ******************************************************************
19 C. * Routine divides MOTHER into NDIV divisions called NAME *
20 C. * along axis number IAXIS. *
21 C. * JVO=Pointer to MOTHER volume *
24 C. * Q(JDIV+1)=IAXIS *
25 C. * Q(JDIV+2)=Volume number. *
27 C. * Q(JDIV+4)=Lowest coord of slices. *
28 C. * Q(JDIV+5)=Step size in coordinates. *
30 C. * ==>Called by : <USER>, GEDITV *
31 C. * Authors R.Brun, A.McPherson ********* *
33 C. ******************************************************************
35 #include "geant321/gcbank.inc"
36 #include "geant321/gcflag.inc"
37 #include "geant321/gcnum.inc"
38 #include "geant321/gcunit.inc"
39 #include "geant321/gcdraw.inc"
40 #include "geant321/gcshno.inc"
41 CHARACTER*4 KNAME,MOTHER
42 DIMENSION PAR(100),PARM(100),ATT(20)
44 DATA ATT /1.,1.,1.,1.,1.,15*0./
46 C. ------------------------------------------------------------------
48 C Check if volume master bank exists.
50 CALL UCTOH(KNAME,NAME,4,4)
51 IF(JVOLUM.GT.0)GO TO 10
56 C Check if MOTHER volume exists.
58 10 CALL GLOOK(MOTHER,IQ(JVOLUM+1),NVOLUM,IVO)
60 WRITE(CHMAIL,1100)MOTHER
64 C Check if NAME volume exists.
66 20 CALL GLOOK(KNAME,IQ(JVOLUM+1),NVOLUM,IN)
68 WRITE(CHMAIL,2000)NAME
72 C Check if MOTHER is not divided.
77 WRITE(CHMAIL,4000)MOTHER
81 C Check validity of axis value.
83 60 IF(IAXIS.GT.0.AND.IAXIS.LT.4)GO TO 70
84 WRITE(CHMAIL,5000)IAXIS
88 C Check validity of NDIV
90 70 IF(NDIV.GT.0)GO TO 80
91 WRITE(CHMAIL,6000)NDIV
95 C Create bank to store division parameters.
97 80 CALL MZBOOK(IXCONS,JDIV,JVO,-1,'VODI',0,0,6,3,0)
98 IF(IEOTRI.NE.0)GO TO 95
101 C Now store parameters into bank area.
112 C Bit to allow division of objects defined
119 CALL UCOPY(Q(JVO+NPAR+7),ATT,NATT)
120 IF(NPAR.LE.0) GO TO 230
122 CALL GFIPAR(JVO,0,0,NPAR,NATT,PAR,ATT)
123 CALL UCOPY(PAR,PARM,NPAR)
125 C Find and store start and step.
127 IF(ISH.NE.1) GO TO 100
133 IF(PARM(IAXIS).LT.0.0) GO TO 230
135 STEP=PARM(IAXIS)*2.0/NDIV
140 IF(ISH.NE.2) GO TO 110
142 C Trapezoid with only X thickness varying with Z.
144 IF(IAXIS.EQ.1) GO TO 900
149 IF(PARM(IAXIS+1).LT.0.0) GO TO 230
151 STEP=PARM(IAXIS+1)*2.0/NDIV
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
168 IF(PARM(5).LT.0.0) GO TO 230
170 STEP=PARM(5)*2.0/NDIV
175 IF(ISH.NE.4) GO TO 125
176 IF(IAXIS.NE.3) GO TO 126
185 IF(PARM(1).LT.0.0) GO TO 230
187 STEP=PARM(1)*2.0/NDIV
192 126 IF(IAXIS.NE.2) GO TO 900
193 IF(MOD(PARM(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(PARM(4).EQ.PARM(8)) GO TO 128
201 10200 FORMAT(' Division of TRAP ',A4,
202 + ' along Y only possible when H1=H2')
207 IF(PARM(4).LT.0.0) GO TO 230
221 IF(ISH.NE.5.AND.ISH.NE.6.AND.ISH.NE.NSCTUB) GO TO 160
223 C Tube, tube segment or cut tube.
225 IF(IAXIS.NE.3) GO TO 130
228 IF(PARM(3).LT.0.0) GO TO 230
230 STEP=PARM(3)*2.0/NDIV
235 IF(IAXIS.NE.1) GO TO 140
239 IF(PARM(1).LT.0.0) GO TO 230
241 IF(PARM(2).LT.0.0) GO TO 230
242 STEP=(PARM(2)-PARM(1))/NDIV
246 IF(ISH.EQ.6) GO TO 150
258 IF(DP.LT.0.0) DP=DP+360.0
267 IF(ISH.NE.7.AND.ISH.NE.8) GO TO 190
268 IF(IAXIS.EQ.1) GO TO 165
269 IF(IAXIS.NE.3) GO TO 170
273 IF(PARM(1).LT.0.0) GO TO 165
275 STEP=PARM(1)*2.0/NDIV
287 IF(IAXIS.EQ.1) GO TO 230
289 IF(ISH.EQ.8) GO TO 180
301 IF(DP.LT.0.0) DP=DP+360.0
309 IF(ISH.NE.9) GO TO 200
310 IF(IAXIS.NE.1) GO TO 195
314 STEP = (PARM(2)-PARM(1))/NDIV
316 IF(IAXIS.NE.2) GO TO 196
322 IF(IAXIS.NE.3) GO TO 230
325 IF(DP.LE.0.0) DP=DP+360.0
335 IF(ISH.NE.10) GO TO 210
345 IF(ISH.GT.12) GO TO 900
346 IF(IAXIS.EQ.1) GO TO 230
347 IF(IAXIS.EQ.2) GO TO 220
351 IF(PAR(IPNZ).NE.2) GO TO 910
358 PAR(IPNZ+1)=-PAR(IPNZ+4)
368 IF(ISH.EQ.11) NDV=PAR(3)
374 IF(ISH.EQ.11)PAR(3)=1.
378 C Now create the volume for division.
384 IF(NVOLUM.GT.NVOL)CALL MZPUSH(IXCONS,JVOLUM,50,50,'I')
385 CALL MZBOOK(IXCONS,JVO,JVOLUM,-NVOLUM,'VOL1',50,50,NW,3,0)
386 IF(IEOTRI.NE.0)GO TO 95
387 IQ(JVOLUM+NVOLUM)=NAME
389 C Copy parameters in data area.
392 CALL UCOPY(Q(JVOM+1),Q(JVO+1),NWM)
393 IF(NPAR.GT.0) CALL GSIPAR(JVO,0,NPAR,NATT,PAR,ATT)
400 C Divide action not supported.
404 WRITE(CHMAIL,8001) ISH,IAXIS
411 C Trying to divide multi Z sector shape along Z.
415 WRITE(CHMAIL,8101) ISH,IAXIS,IPNZ,INT(PAR(IPNZ))
422 95 WRITE(CHMAIL,7000)NAME,MOTHER
426 1000 FORMAT(' ***** GSDVN CALLED AND NO VOLUMES DEFINED *****')
427 1100 FORMAT(' ***** GSDVN MOTHER VOLUME ',A4,' DOES NOT EXIST *****')
428 2000 FORMAT(' ***** GSDVN VOLUME ',A4,' ALREADY EXISTS *****')
429 3000 FORMAT(' ***** GSDVN ROTATION MATRIX',I5,' DOES NOT EXISTS *****')
430 4000 FORMAT(' ***** GSDVN MOTHER ',A4,' ALREADY DIVIDED *****')
431 5000 FORMAT(' ***** GSDVN BAD AXIS VALUE ',I5,' *****')
432 6000 FORMAT(' ***** GSDVN BAD NUMBER OF DIVISIONS ',I5,' *****')
433 7000 FORMAT(' ***** GSDVN NOT ENOUGH SPACE TO STORE DIVISIONS ',
434 + ' IN ',A4,' *****')
435 8000 FORMAT(' DIVIDE ACTION REQUESTED NOT SUPPORTED AT PRESENT.')
436 8001 FORMAT(' ISH =',I5,' IAXIS =',I5)
437 8100 FORMAT(' ATTEMPT TO DIVIDE MULTI Z SECTOR SHAPE ALONG Z.')
438 8101 FORMAT(' ISH =',I5,' IAXIS =',I5,' NZ (THE',I3,'TH PAR) IS',I5)
439 8102 FORMAT(' DIVISION OF A SPHERE ALONG AXIS 2 NOT SUPPORTED')