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 GSDVN2(KNAME,MOTHER,NDIV,IAXIS,C0I,NUMED)
14 C. ******************************************************************
16 C. * DIVIDES MOTHER INTO NDIV DIVISIONS CALLED NAME *
17 C. * ALONG AXIS IAXIS STARTING AT COORDINATE VALUE C0. *
18 C. * THE NEW VOLUME CREATED WILL BE MEDIUM NUMBER NUMED. *
20 C. * JVO=POINTER TO MOTHER VOLUME *
23 C. * Q(JDIV+1)=IAXIS *
24 C. * Q(JDIV+2)=VOLUME NUMBER *
27 C. * Q(JDIV+5)=STEP SIZE IN COORDINATES. *
29 C. * ==>Called by : <USER>, GSDVX *
30 C. * Authors F.Bruyant, A.McPherson ********* *
32 C. ******************************************************************
34 #include "geant321/gcbank.inc"
35 #include "geant321/gcflag.inc"
36 #include "geant321/gcnum.inc"
37 #include "geant321/gcunit.inc"
38 #include "geant321/gcdraw.inc"
39 #include "geant321/gcshno.inc"
40 CHARACTER*4 KNAME,MOTHER
41 DIMENSION PAR(50),ATT(20)
43 DATA ATT /1.,1.,1.,1.,1.,15*0./
45 C. ------------------------------------------------------------------
47 C CHECK IF VOLUME MASTER BANK EXISTS
49 CALL UCTOH(KNAME,NAME,4,4)
50 IF(JVOLUM.GT.0)GO TO 10
55 C CHECK IF MOTHER VOLUME EXISTS
57 10 CALL GLOOK(MOTHER,IQ(JVOLUM+1),NVOLUM,IVO)
59 WRITE(CHMAIL,2000)MOTHER
63 C CHECK IF NAME VOLUME EXISTS
65 20 CALL GLOOK(KNAME,IQ(JVOLUM+1),NVOLUM,IN)
67 WRITE(CHMAIL,2000)NAME
71 C CHECK IF MOTHER IS NOT DIVIDED
76 WRITE(CHMAIL,4000)MOTHER
80 C CHECK VALIDITY OF AXIS VALUE
82 60 IF(IAXIS.GT.0.AND.IAXIS.LT.4)GO TO 70
83 WRITE(CHMAIL,5000)IAXIS
87 C CHECK VALIDITY OF NDIV
89 70 IF(NDIV.GT.0)GO TO 80
90 WRITE(CHMAIL,6000)NDIV
94 C CREATE BANK TO STORE DIVISION PARAMETERS
96 80 CALL MZBOOK(IXCONS,JDIV,JVO,-1,'VODI',0,0,6,3,0)
97 IF(IEOTRI.NE.0)GO TO 95
100 C NOW STORE PARAMETERS INTO BANK AREA
109 CALL GFIPAR(JVO,0,0,NPAR,NATT,PAR,ATT)
111 C CHECK START AND FIND AND STORE STEP.
115 IF(ISH.NE.1) GO TO 100
119 IF(PAR(IAXIS).LE.0.0) GO TO 920
120 IF(ABS(C0).GT.PAR(IAXIS)) GO TO 910
121 STEP=(PAR(IAXIS)-C0)/NDIV
126 IF(ISH.NE.2) GO TO 110
128 C TRAPEZOID WITH ONLY X THICKNESS VARYING WITH Z.
130 IF(IAXIS.EQ.1) GO TO 900
131 IF(PAR(IAXIS+1).LE.0.0) GO TO 920
132 IF(ABS(C0).GT.PAR(IAXIS+1)) GO TO 910
133 STEP=(PAR(IAXIS+1)-C0)/NDIV
140 IF(ISH.NE.3) GO TO 120
142 C TRAPEZOID WITH BOTH X AND Y THICKNESSES VARYING WITH
145 IF(IAXIS.NE.3) GO TO 900
146 IF(PAR(5).LE.0.0) GO TO 920
147 IF(ABS(C0).GT.PAR(5)) GO TO 910
148 STEP=(PAR(5)-C0)/NDIV
157 IF(ISH.NE.4) GO TO 125
158 IF(IAXIS.NE.3) GO TO 126
159 IF(PAR(1).LE.0.0) GO TO 920
160 IF(ABS(C0).GT.PAR(1)) GO TO 910
161 STEP=(PAR(1)-C0)/NDIV
171 126 IF(IAXIS.NE.2) GO TO 900
172 IF(MOD(PAR(3),180.).EQ.0.) GO TO 127
174 10100 FORMAT(' Division of TRAP ',A4,
175 + ' along Y only possible when PHI=0,180')
178 127 IF(PAR(4).EQ.PAR(8)) GO TO 128
180 10200 FORMAT(' Division of TRAP ',A4,
181 + ' along Y only possible when H1=H2')
185 IF(PAR(4).LE.0.) GO TO 920
186 IF(ABS(C0).GT.PAR(4)) GO TO 910
187 STEP = (PAR(4)-C0)/NDIV
198 IF(ISH.NE.5.AND.ISH.NE.6.AND.ISH.NE.NSCTUB) GO TO 160
200 C Tube, tube segment or cut tube.
202 IF(IAXIS.NE.3) GO TO 130
203 IF(PAR(3).LE.0.0) GO TO 920
204 IF(ABS(C0).GT.PAR(3)) GO TO 910
205 STEP=(PAR(3)-C0)/NDIV
210 IF(IAXIS.NE.1) GO TO 140
211 IF(PAR(1).LE.0.0.OR.PAR(2).LE.0.0) GO TO 920
212 IF(C0.LT.PAR(1).OR.C0.GT.PAR(2)) GO TO 910
213 STEP=(PAR(2)-C0)/NDIV
219 IF(ISH.EQ.6) GO TO 150
232 DC0P = MOD( ABS(DC0P), 360.0)
233 IF(SG.LE.0.0) DC0P = 360.0-DC0P
235 IF(C0-PAR(4).LT.0.0) C0=C0+360.0
236 IF(C0-PAR(4).GT.DP) GO TO 910
238 IF(DP.LT.0.0) DP=DP+360
246 IF(ISH.NE.7.AND.ISH.NE.8) GO TO 190
247 IF(IAXIS.EQ.1) GO TO 165
248 IF(IAXIS.NE.3) GO TO 170
250 IF(PAR(1).LE.0.0) GO TO 920
251 IF(ABS(C0).GT.PAR(1)) GO TO 910
252 STEP=(PAR(1)-C0)/NDIV
264 IF(IAXIS.EQ.1) GO TO 210
266 IF(ISH.EQ.8) GO TO 180
279 DC0P = MOD( ABS(DC0P), 360.0)
280 IF(SG.LE.0.0) DC0P = 360.0-DC0P
282 IF(C0-PAR(6).LT.0.0) C0=C0+360.0
283 IF(C0-PAR(6).GT.DP) GO TO 910
285 IF(DP.LT.0.0) DP=DP+360.0
292 IF(ISH.NE.9) GO TO 200
293 IF(IAXIS.NE.1) GO TO 195
296 IF(C0.LT.PAR(1).OR.C0.GT.PAR(2)) THEN
299 STEP = (PAR(2)-C0)/NDIV
302 IF(IAXIS.NE.2) GO TO 196
308 IF(IAXIS.NE.3) GO TO 210
309 ANGMIN = MOD(PAR(5),360.)
310 IF(ANGMIN.LT.0.) ANGMIN=ANGMIN+360.
311 ANGMAX = MOD(PAR(6),360.)
312 IF(ANGMAX.LE.ANGMIN) ANGMAX=ANGMAX+360.
314 IF(C0.LT.0.0) C0=C0+360.0
315 IF(C0.GT.ANGMAX.OR.C0.LT.ANGMIN) GO TO 910
316 STEP=(ANGMAX-C0)/NDIV
327 C NOW CREATE THE VOLUME FOR DIVISION
333 IF(NVOLUM.GT.NVOL)CALL MZPUSH(IXCONS,JVOLUM,50,50,'I')
334 CALL MZBOOK(IXCONS,JVO,JVOLUM,-NVOLUM,'VOL1',50,50,NW,3,0)
335 IF(IEOTRI.NE.0)GO TO 95
336 IQ(JVOLUM+NVOLUM)=NAME
338 C COPY PARAMETERS IN DATA AREA
341 CALL UCOPY(Q(JVOM+1),Q(JVO+1),NWM)
342 CALL GSIPAR(JVO,0,NPAR,NATT,PAR,ATT)
350 C DIVIDE ACTION NOT SUPPORTED.
354 WRITE(CHMAIL,8001) ISH,IAXIS
361 C C0 START OF DIVISION OUT OF OBJECT.
363 WRITE(CHMAIL,9000) C0
369 C +VE DEFINITE PARAMETER IN DIMENSION OF C0 SET -VE OR 0.
378 95 WRITE(CHMAIL,7000)NAME,MOTHER
382 1000 FORMAT(' ***** GSDVN2 CALLED AND NO VOLUMES DEFINED *****')
383 2000 FORMAT(' ***** GSDVN2 VOLUME ',A4,' ALREADY EXISTS *****')
384 3000 FORMAT(' ***** GSDVN2 ROTATION MATRIX',I5,' DOES NOT EXIST *****')
385 4000 FORMAT(' ***** GSDVN2 MOTHER ',A4,' ALREADY DIVIDED *****')
386 5000 FORMAT(' ***** GSDVN2 BAD AXIS VALUE ',I5,' *****')
387 6000 FORMAT(' ***** GSDVN2 BAD NUMBER OF DIVISIONS ',I5,' *****')
388 7000 FORMAT(' ***** GSDVN2 NOT ENOUGH SPACE TO STORE DIVISIONS ',
389 + ' IN ',A4,' *****')
390 8000 FORMAT(' DIVIDE ACTION WITH C0 REQUESTED NOT SUPPORTED',
392 8001 FORMAT(' ISH =',I5,' IAXIS =',I5)
393 8102 FORMAT(' DIVISION OF A SPHERE ALONG AXIS 2 NOT SUPPORTED')
394 9000 FORMAT(' ***** GSDVN2 C0',E15.5,' OUT OF OBJECT *****')
395 9010 FORMAT(' ***** GSDVN2 C0 WITH -VE DIMENSION IN MOTHER *****')