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 GSDVN2(KNAME,MOTHER,NDIV,IAXIS,C0I,NUMED)
17 C. ******************************************************************
19 C. * DIVIDES MOTHER INTO NDIV DIVISIONS CALLED NAME *
20 C. * ALONG AXIS IAXIS STARTING AT COORDINATE VALUE C0. *
21 C. * THE NEW VOLUME CREATED WILL BE MEDIUM NUMBER NUMED. *
23 C. * JVO=POINTER TO MOTHER VOLUME *
26 C. * Q(JDIV+1)=IAXIS *
27 C. * Q(JDIV+2)=VOLUME NUMBER *
30 C. * Q(JDIV+5)=STEP SIZE IN COORDINATES. *
32 C. * ==>Called by : <USER>, GSDVX *
33 C. * Authors F.Bruyant, A.McPherson ********* *
35 C. ******************************************************************
37 #include "geant321/gcbank.inc"
38 #include "geant321/gcflag.inc"
39 #include "geant321/gcnum.inc"
40 #include "geant321/gcunit.inc"
41 #include "geant321/gcdraw.inc"
42 #include "geant321/gcshno.inc"
43 CHARACTER*4 KNAME,MOTHER
44 DIMENSION PAR(100),ATT(20)
46 DATA ATT /1.,1.,1.,1.,1.,15*0./
48 C. ------------------------------------------------------------------
50 C CHECK IF VOLUME MASTER BANK EXISTS
52 CALL UCTOH(KNAME,NAME,4,4)
53 IF(JVOLUM.GT.0)GO TO 10
58 C CHECK IF MOTHER VOLUME EXISTS
60 10 CALL GLOOK(MOTHER,IQ(JVOLUM+1),NVOLUM,IVO)
62 WRITE(CHMAIL,2000)MOTHER
66 C CHECK IF NAME VOLUME EXISTS
68 20 CALL GLOOK(KNAME,IQ(JVOLUM+1),NVOLUM,IN)
70 WRITE(CHMAIL,2000)NAME
74 C CHECK IF MOTHER IS NOT DIVIDED
79 WRITE(CHMAIL,4000)MOTHER
83 C CHECK VALIDITY OF AXIS VALUE
85 60 IF(IAXIS.GT.0.AND.IAXIS.LT.4)GO TO 70
86 WRITE(CHMAIL,5000)IAXIS
90 C CHECK VALIDITY OF NDIV
92 70 IF(NDIV.GT.0)GO TO 80
93 WRITE(CHMAIL,6000)NDIV
97 C CREATE BANK TO STORE DIVISION PARAMETERS
99 80 CALL MZBOOK(IXCONS,JDIV,JVO,-1,'VODI',0,0,6,3,0)
100 IF(IEOTRI.NE.0)GO TO 95
103 C NOW STORE PARAMETERS INTO BANK AREA
112 CALL GFIPAR(JVO,0,0,NPAR,NATT,PAR,ATT)
114 C CHECK START AND FIND AND STORE STEP.
118 IF(ISH.NE.1) GO TO 100
122 IF(PAR(IAXIS).LE.0.0) GO TO 920
123 IF(ABS(C0).GT.PAR(IAXIS)) GO TO 910
124 STEP=(PAR(IAXIS)-C0)/NDIV
129 IF(ISH.NE.2) GO TO 110
131 C TRAPEZOID WITH ONLY X THICKNESS VARYING WITH Z.
133 IF(IAXIS.EQ.1) GO TO 900
134 IF(PAR(IAXIS+1).LE.0.0) GO TO 920
135 IF(ABS(C0).GT.PAR(IAXIS+1)) GO TO 910
136 STEP=(PAR(IAXIS+1)-C0)/NDIV
143 IF(ISH.NE.3) GO TO 120
145 C TRAPEZOID WITH BOTH X AND Y THICKNESSES VARYING WITH
148 IF(IAXIS.NE.3) GO TO 900
149 IF(PAR(5).LE.0.0) GO TO 920
150 IF(ABS(C0).GT.PAR(5)) GO TO 910
151 STEP=(PAR(5)-C0)/NDIV
160 IF(ISH.NE.4) GO TO 125
161 IF(IAXIS.NE.3) GO TO 126
162 IF(PAR(1).LE.0.0) GO TO 920
163 IF(ABS(C0).GT.PAR(1)) GO TO 910
164 STEP=(PAR(1)-C0)/NDIV
174 126 IF(IAXIS.NE.2) GO TO 900
175 IF(MOD(PAR(3),180.).EQ.0.) GO TO 127
177 10100 FORMAT(' Division of TRAP ',A4,
178 + ' along Y only possible when PHI=0,180')
181 127 IF(PAR(4).EQ.PAR(8)) GO TO 128
183 10200 FORMAT(' Division of TRAP ',A4,
184 + ' along Y only possible when H1=H2')
188 IF(PAR(4).LE.0.) GO TO 920
189 IF(ABS(C0).GT.PAR(4)) GO TO 910
190 STEP = (PAR(4)-C0)/NDIV
201 IF(ISH.NE.5.AND.ISH.NE.6.AND.ISH.NE.NSCTUB) GO TO 160
203 C Tube, tube segment or cut tube.
205 IF(IAXIS.NE.3) GO TO 130
206 IF(PAR(3).LE.0.0) GO TO 920
207 IF(ABS(C0).GT.PAR(3)) GO TO 910
208 STEP=(PAR(3)-C0)/NDIV
213 IF(IAXIS.NE.1) GO TO 140
214 IF(PAR(1).LE.0.0.OR.PAR(2).LE.0.0) GO TO 920
215 IF(C0.LT.PAR(1).OR.C0.GT.PAR(2)) GO TO 910
216 STEP=(PAR(2)-C0)/NDIV
222 IF(ISH.EQ.6) GO TO 150
235 DC0P = MOD( ABS(DC0P), 360.0)
236 IF(SG.LE.0.0) DC0P = 360.0-DC0P
238 IF(C0-PAR(4).LT.0.0) C0=C0+360.0
239 IF(C0-PAR(4).GT.DP) GO TO 910
241 IF(DP.LT.0.0) DP=DP+360
249 IF(ISH.NE.7.AND.ISH.NE.8) GO TO 190
250 IF(IAXIS.EQ.1) GO TO 165
251 IF(IAXIS.NE.3) GO TO 170
253 IF(PAR(1).LE.0.0) GO TO 920
254 IF(ABS(C0).GT.PAR(1)) GO TO 910
255 STEP=(PAR(1)-C0)/NDIV
267 IF(IAXIS.EQ.1) GO TO 210
269 IF(ISH.EQ.8) GO TO 180
282 DC0P = MOD( ABS(DC0P), 360.0)
283 IF(SG.LE.0.0) DC0P = 360.0-DC0P
285 IF(C0-PAR(6).LT.0.0) C0=C0+360.0
286 IF(C0-PAR(6).GT.DP) GO TO 910
288 IF(DP.LT.0.0) DP=DP+360.0
295 IF(ISH.NE.9) GO TO 200
296 IF(IAXIS.NE.1) GO TO 195
299 IF(C0.LT.PAR(1).OR.C0.GT.PAR(2)) THEN
302 STEP = (PAR(2)-C0)/NDIV
305 IF(IAXIS.NE.2) GO TO 196
311 IF(IAXIS.NE.3) GO TO 210
312 ANGMIN = MOD(PAR(5),360.)
313 IF(ANGMIN.LT.0.) ANGMIN=ANGMIN+360.
314 ANGMAX = MOD(PAR(6),360.)
315 IF(ANGMAX.LE.ANGMIN) ANGMAX=ANGMAX+360.
317 IF(C0.LT.0.0) C0=C0+360.0
318 IF(C0.GT.ANGMAX.OR.C0.LT.ANGMIN) GO TO 910
319 STEP=(ANGMAX-C0)/NDIV
330 C NOW CREATE THE VOLUME FOR DIVISION
336 IF(NVOLUM.GT.NVOL)CALL MZPUSH(IXCONS,JVOLUM,50,50,'I')
337 CALL MZBOOK(IXCONS,JVO,JVOLUM,-NVOLUM,'VOL1',50,50,NW,3,0)
338 IF(IEOTRI.NE.0)GO TO 95
339 IQ(JVOLUM+NVOLUM)=NAME
341 C COPY PARAMETERS IN DATA AREA
344 CALL UCOPY(Q(JVOM+1),Q(JVO+1),NWM)
345 CALL GSIPAR(JVO,0,NPAR,NATT,PAR,ATT)
353 C DIVIDE ACTION NOT SUPPORTED.
357 WRITE(CHMAIL,8001) ISH,IAXIS
364 C C0 START OF DIVISION OUT OF OBJECT.
366 WRITE(CHMAIL,9000) C0
372 C +VE DEFINITE PARAMETER IN DIMENSION OF C0 SET -VE OR 0.
381 95 WRITE(CHMAIL,7000)NAME,MOTHER
385 1000 FORMAT(' ***** GSDVN2 CALLED AND NO VOLUMES DEFINED *****')
386 2000 FORMAT(' ***** GSDVN2 VOLUME ',A4,' ALREADY EXISTS *****')
387 3000 FORMAT(' ***** GSDVN2 ROTATION MATRIX',I5,' DOES NOT EXIST *****')
388 4000 FORMAT(' ***** GSDVN2 MOTHER ',A4,' ALREADY DIVIDED *****')
389 5000 FORMAT(' ***** GSDVN2 BAD AXIS VALUE ',I5,' *****')
390 6000 FORMAT(' ***** GSDVN2 BAD NUMBER OF DIVISIONS ',I5,' *****')
391 7000 FORMAT(' ***** GSDVN2 NOT ENOUGH SPACE TO STORE DIVISIONS ',
392 + ' IN ',A4,' *****')
393 8000 FORMAT(' DIVIDE ACTION WITH C0 REQUESTED NOT SUPPORTED',
395 8001 FORMAT(' ISH =',I5,' IAXIS =',I5)
396 8102 FORMAT(' DIVISION OF A SPHERE ALONG AXIS 2 NOT SUPPORTED')
397 9000 FORMAT(' ***** GSDVN2 C0',E15.5,' OUT OF OBJECT *****')
398 9010 FORMAT(' ***** GSDVN2 C0 WITH -VE DIMENSION IN MOTHER *****')