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 GSDVN(KNAME,MOTHER,NDIV,IAXIS)
14 C. ******************************************************************
16 C. * Routine divides MOTHER into NDIV divisions called NAME *
17 C. * along axis number IAXIS. *
18 C. * JVO=Pointer to MOTHER volume *
21 C. * Q(JDIV+1)=IAXIS *
22 C. * Q(JDIV+2)=Volume number. *
24 C. * Q(JDIV+4)=Lowest coord of slices. *
25 C. * Q(JDIV+5)=Step size in coordinates. *
27 C. * ==>Called by : <USER>, GEDITV *
28 C. * Authors R.Brun, A.McPherson ********* *
30 C. ******************************************************************
32 #include "geant321/gcbank.inc"
33 #include "geant321/gcflag.inc"
34 #include "geant321/gcnum.inc"
35 #include "geant321/gcunit.inc"
36 #include "geant321/gcdraw.inc"
37 #include "geant321/gcshno.inc"
38 CHARACTER*4 KNAME,MOTHER
39 DIMENSION PAR(50),PARM(50),ATT(20)
41 DATA ATT /1.,1.,1.,1.,1.,15*0./
43 C. ------------------------------------------------------------------
45 C Check if volume master bank exists.
47 CALL UCTOH(KNAME,NAME,4,4)
48 IF(JVOLUM.GT.0)GO TO 10
53 C Check if MOTHER volume exists.
55 10 CALL GLOOK(MOTHER,IQ(JVOLUM+1),NVOLUM,IVO)
57 WRITE(CHMAIL,1100)MOTHER
61 C Check if NAME volume exists.
63 20 CALL GLOOK(KNAME,IQ(JVOLUM+1),NVOLUM,IN)
65 WRITE(CHMAIL,2000)NAME
69 C Check if MOTHER is not divided.
74 WRITE(CHMAIL,4000)MOTHER
78 C Check validity of axis value.
80 60 IF(IAXIS.GT.0.AND.IAXIS.LT.4)GO TO 70
81 WRITE(CHMAIL,5000)IAXIS
85 C Check validity of NDIV
87 70 IF(NDIV.GT.0)GO TO 80
88 WRITE(CHMAIL,6000)NDIV
92 C Create bank to store division parameters.
94 80 CALL MZBOOK(IXCONS,JDIV,JVO,-1,'VODI',0,0,6,3,0)
95 IF(IEOTRI.NE.0)GO TO 95
98 C Now store parameters into bank area.
109 C Bit to allow division of objects defined
116 CALL UCOPY(Q(JVO+NPAR+7),ATT,NATT)
117 IF(NPAR.LE.0) GO TO 230
119 CALL GFIPAR(JVO,0,0,NPAR,NATT,PAR,ATT)
120 CALL UCOPY(PAR,PARM,NPAR)
122 C Find and store start and step.
124 IF(ISH.NE.1) GO TO 100
130 IF(PARM(IAXIS).LT.0.0) GO TO 230
132 STEP=PARM(IAXIS)*2.0/NDIV
137 IF(ISH.NE.2) GO TO 110
139 C Trapezoid with only X thickness varying with Z.
141 IF(IAXIS.EQ.1) GO TO 900
146 IF(PARM(IAXIS+1).LT.0.0) GO TO 230
148 STEP=PARM(IAXIS+1)*2.0/NDIV
153 IF(ISH.NE.3) GO TO 120
155 C Trapezoid with both X and Y thicknesses varying with
158 IF(IAXIS.NE.3) GO TO 900
165 IF(PARM(5).LT.0.0) GO TO 230
167 STEP=PARM(5)*2.0/NDIV
172 IF(ISH.NE.4) GO TO 125
173 IF(IAXIS.NE.3) GO TO 126
182 IF(PARM(1).LT.0.0) GO TO 230
184 STEP=PARM(1)*2.0/NDIV
189 126 IF(IAXIS.NE.2) GO TO 900
190 IF(MOD(PARM(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(PARM(4).EQ.PARM(8)) GO TO 128
198 10200 FORMAT(' Division of TRAP ',A4,
199 + ' along Y only possible when H1=H2')
204 IF(PARM(4).LT.0.0) GO TO 230
218 IF(ISH.NE.5.AND.ISH.NE.6.AND.ISH.NE.NSCTUB) GO TO 160
220 C Tube, tube segment or cut tube.
222 IF(IAXIS.NE.3) GO TO 130
225 IF(PARM(3).LT.0.0) GO TO 230
227 STEP=PARM(3)*2.0/NDIV
232 IF(IAXIS.NE.1) GO TO 140
236 IF(PARM(1).LT.0.0) GO TO 230
238 IF(PARM(2).LT.0.0) GO TO 230
239 STEP=(PARM(2)-PARM(1))/NDIV
243 IF(ISH.EQ.6) GO TO 150
255 IF(DP.LT.0.0) DP=DP+360.0
264 IF(ISH.NE.7.AND.ISH.NE.8) GO TO 190
265 IF(IAXIS.EQ.1) GO TO 165
266 IF(IAXIS.NE.3) GO TO 170
270 IF(PARM(1).LT.0.0) GO TO 165
272 STEP=PARM(1)*2.0/NDIV
284 IF(IAXIS.EQ.1) GO TO 230
286 IF(ISH.EQ.8) GO TO 180
298 IF(DP.LT.0.0) DP=DP+360.0
306 IF(ISH.NE.9) GO TO 200
307 IF(IAXIS.NE.1) GO TO 195
311 STEP = (PARM(2)-PARM(1))/NDIV
313 IF(IAXIS.NE.2) GO TO 196
319 IF(IAXIS.NE.3) GO TO 230
322 IF(DP.LE.0.0) DP=DP+360.0
332 IF(ISH.NE.10) GO TO 210
342 IF(ISH.GT.12) GO TO 900
343 IF(IAXIS.EQ.1) GO TO 230
344 IF(IAXIS.EQ.2) GO TO 220
348 IF(PAR(IPNZ).NE.2) GO TO 910
355 PAR(IPNZ+1)=-PAR(IPNZ+4)
365 IF(ISH.EQ.11) NDV=PAR(3)
371 IF(ISH.EQ.11)PAR(3)=1.
375 C Now create the volume for division.
381 IF(NVOLUM.GT.NVOL)CALL MZPUSH(IXCONS,JVOLUM,50,50,'I')
382 CALL MZBOOK(IXCONS,JVO,JVOLUM,-NVOLUM,'VOL1',50,50,NW,3,0)
383 IF(IEOTRI.NE.0)GO TO 95
384 IQ(JVOLUM+NVOLUM)=NAME
386 C Copy parameters in data area.
389 CALL UCOPY(Q(JVOM+1),Q(JVO+1),NWM)
390 IF(NPAR.GT.0) CALL GSIPAR(JVO,0,NPAR,NATT,PAR,ATT)
397 C Divide action not supported.
401 WRITE(CHMAIL,8001) ISH,IAXIS
408 C Trying to divide multi Z sector shape along Z.
412 WRITE(CHMAIL,8101) ISH,IAXIS,IPNZ,INT(PAR(IPNZ))
419 95 WRITE(CHMAIL,7000)NAME,MOTHER
423 1000 FORMAT(' ***** GSDVN CALLED AND NO VOLUMES DEFINED *****')
424 1100 FORMAT(' ***** GSDVN MOTHER VOLUME ',A4,' DOES NOT EXIST *****')
425 2000 FORMAT(' ***** GSDVN VOLUME ',A4,' ALREADY EXISTS *****')
426 3000 FORMAT(' ***** GSDVN ROTATION MATRIX',I5,' DOES NOT EXISTS *****')
427 4000 FORMAT(' ***** GSDVN MOTHER ',A4,' ALREADY DIVIDED *****')
428 5000 FORMAT(' ***** GSDVN BAD AXIS VALUE ',I5,' *****')
429 6000 FORMAT(' ***** GSDVN BAD NUMBER OF DIVISIONS ',I5,' *****')
430 7000 FORMAT(' ***** GSDVN NOT ENOUGH SPACE TO STORE DIVISIONS ',
431 + ' IN ',A4,' *****')
432 8000 FORMAT(' DIVIDE ACTION REQUESTED NOT SUPPORTED AT PRESENT.')
433 8001 FORMAT(' ISH =',I5,' IAXIS =',I5)
434 8100 FORMAT(' ATTEMPT TO DIVIDE MULTI Z SECTOR SHAPE ALONG Z.')
435 8101 FORMAT(' ISH =',I5,' IAXIS =',I5,' NZ (THE',I3,'TH PAR) IS',I5)
436 8102 FORMAT(' DIVISION OF A SPHERE ALONG AXIS 2 NOT SUPPORTED')