]> git.uio.no Git - u/mrichter/AliRoot.git/blame - GEANT321/ggeom/gsdvt2.F
Allow any Cherenkov-like particle to be transported
[u/mrichter/AliRoot.git] / GEANT321 / ggeom / gsdvt2.F
CommitLineData
fe4da5cc 1*
2* $Id$
3*
4* $Log$
5* Revision 1.1.1.1 1995/10/24 10:20:56 cernlib
6* Geant
7*
8*
9#include "geant321/pilot.h"
10*CMZ : 3.21/03 06/10/94 18.33.17 by S.Giani
11*-- Author :
12 SUBROUTINE GSDVT2(KNAME,MOTHER,STEP,IAXIS,C0,NUMED,NDVMX)
13C.
14C. ******************************************************************
15C. * *
16C. * Divides MOTHER into divisions called NAME along *
17C. * axis IAXIS starting at coordinate value C0 with step *
18C. * size STEP. *
19C. * The new volume created will have medium number NUMED. *
20C. * If NUMED is 0, NUMED of mother is taken. *
21C. * NDVMX is the expected maximum number of divisions *
22C. * (If 0, no protection tests are performed) *
23C. * *
24C. * JVO=Pointer to MOTHER volume *
25C. * JDIV=LQ(JVO-1) *
26C. * *
27C. * Q(JDIV+1)=IAXIS *
28C. * Q(JDIV+2)=Volume number *
29C. * Q(JDIV+3)=Number of divisions. *
30C. * Q(JDIV+4)=C0 *
31C. * Q(JDIV+5)=STEP *
32C. * *
33C. * ==>Called by : ,USER., GSDVS2, GSDVX *
34C. * Authors F.Bruyant, M.Maire, A.McPherson ********* *
35C. * *
36C. ******************************************************************
37C.
38#include "geant321/gcbank.inc"
39#include "geant321/gcflag.inc"
40#include "geant321/gcnum.inc"
41#include "geant321/gcunit.inc"
42#include "geant321/gcdraw.inc"
43#include "geant321/gcshno.inc"
44 CHARACTER*4 KNAME,MOTHER
45 DIMENSION PAR(50),ATT(20)
46 SAVE ATT
47 DATA ATT /1.,1.,1.,1.,1.,15*0./
48C.
49C. ------------------------------------------------------------------
50C.
51C CHECK IF VOLUME MASTER BANK EXISTS
52C
53 CALL UCTOH(KNAME,NAME,4,4)
54 IF(JVOLUM.GT.0)GO TO 10
55 WRITE(CHMAIL,1000)
56 CALL GMAIL(0,0)
57 GO TO 99
58C
59C CHECK IF MOTHER VOLUME EXISTS
60C
61 10 CALL GLOOK(MOTHER,IQ(JVOLUM+1),NVOLUM,IVO)
62 IF(IVO.GT.0)GO TO 20
63 WRITE(CHMAIL,2000)MOTHER
64 CALL GMAIL(0,0)
65 GO TO 99
66C
67C CHECK IF NAME VOLUME EXISTS
68C
69 20 CALL GLOOK(KNAME,IQ(JVOLUM+1),NVOLUM,IN)
70 IF(IN.LE.0)GO TO 50
71 WRITE(CHMAIL,2000)NAME
72 CALL GMAIL(0,0)
73 GO TO 99
74C
75C CHECK IF MOTHER IS NOT DIVIDED
76C
77 50 JVO=LQ(JVOLUM-IVO)
78 NIN=Q(JVO+3)
79 IF(NIN.EQ.0)GO TO 60
80 WRITE(CHMAIL,4000)MOTHER
81 CALL GMAIL(0,0)
82 GO TO 99
83C
84C CHECK VALIDITY OF AXIS VALUE
85C
86 60 IF(IAXIS.GT.0.AND.IAXIS.LT.4)GO TO 70
87 WRITE(CHMAIL,5000)IAXIS
88 CALL GMAIL(0,0)
89 GO TO 99
90C
91C CHECK VALIDITY OF STEP
92C
93 70 IF(STEP.GT.0.0)GO TO 80
94 WRITE(CHMAIL,6000)STEP
95 CALL GMAIL(0,0)
96 GO TO 99
97C
98C CREATE BANK TO STORE DIVISION PARAMETERS
99C
100 80 CALL MZBOOK(IXCONS,JDIV,JVO,-1,'VODI',0,0,6,3,0)
101 IF(IEOTRI.NE.0)GO TO 95
102 IQ(JDIV-5)=IVO
103C
104C NOW STORE PARAMETERS INTO BANK AREA
105C
106 90 Q(JDIV+1)=IAXIS
107 Q(JDIV+2)=NVOLUM+1
108 Q(JVO+3)=-1
109 IVOM= IVO
110 NWM = IQ(JVO-1)
111 NW = NWM
112 CALL GFIPAR(JVO,0,0,NPAR,NATT,PAR,ATT)
113C
114C CHECK START AND STEP AND FIND AND STORE NDIV.
115C
116 ISH=Q(JVO+2)
117 IF(ISH.NE.1) GO TO 100
118C
119C BOX
120C
121 IF(PAR(IAXIS).LE.0.0) GO TO 920
122 IF(ABS(C0).GT.PAR(IAXIS)) GO TO 910
123 NDIV=(PAR(IAXIS)-C0+0.001)/STEP
124 IF (NDIV.LE.0) GO TO 910
125 PAR(IAXIS)=STEP/2.
126 GO TO 210
127C
128 100 CONTINUE
129 IF(ISH.NE.2) GO TO 110
130C
131C TRAPEZOID WITH ONLY X THICKNESS VARYING WITH Z.
132C
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 NDIV=(PAR(IAXIS+1)-C0+0.001)/STEP
137 IF (NDIV.LE.0) GO TO 910
138 PAR(1)=-1.
139 PAR(2)=-1.
140 PAR(IAXIS+1)=STEP/2.
141 GO TO 210
142C
143 110 CONTINUE
144 IF(ISH.NE.3) GO TO 120
145C
146C TRAPEZOID WITH BOTH X AND Y THICKNESSES VARYING WITH
147C Z
148C
149 IF(IAXIS.NE.3) GO TO 900
150 IF(PAR(5).LE.0.0) GO TO 920
151 IF(ABS(C0).GT.PAR(5)) GO TO 910
152 NDIV=(PAR(5)-C0+0.001)/STEP
153 IF (NDIV.LE.0) GO TO 910
154 PAR(1)=-1.
155 PAR(2)=-1.
156 PAR(3)=-1.
157 PAR(4)=-1.
158 PAR(5)=STEP/2.
159 GO TO 210
160C
161 120 CONTINUE
162 IF(ISH.NE.4) GO TO 125
163 IF(IAXIS.NE.3) GO TO 126
164 IF(PAR(1).LE.0.0) GO TO 920
165 IF(ABS(C0).GT.PAR(1)) GO TO 910
166 NDIV=(PAR(1)-C0+0.001)/STEP
167 IF (NDIV.LE.0) GO TO 910
168 PAR(1)=STEP*0.5
169 PAR(4)=-1.0
170 PAR(5)=-1.0
171 PAR(6)=-1.0
172 PAR(8)=-1.0
173 PAR(9)=-1.0
174 PAR(10)=-1.0
175 GO TO 210
176C
177 126 IF(IAXIS.NE.2) GO TO 900
178 IF(MOD(PAR(3),180.).EQ.0.) GO TO 127
179 WRITE(CHMAIL,10100)
18010100 FORMAT(' Division of TRAP ',A4,
181 + ' along Y only possible when PHI=0,180')
182 CALL GMAIL(0,0)
183 GOTO 99
184 127 IF(PAR(4).EQ.PAR(8)) GO TO 128
185 WRITE(CHMAIL,10200)
18610200 FORMAT(' Division of TRAP ',A4,
187 + ' along Y only possible when H1=H2')
188 CALL GMAIL(0,0)
189 GOTO 99
190 128 CONTINUE
191 IF(PAR(4).LT.0.0) GO TO 920
192 IF(ABS(C0).GE.PAR(4)) GO TO 910
193 NDIV = (PAR(4)-C0+0.001)/STEP
194 IF (NDIV.LE.0) GO TO 910
195 PAR(4) = 0.5*STEP
196 PAR(5) = -1.
197 PAR(6) = -1.
198 PAR(8) = 0.5*STEP
199 PAR(9) = -1.
200 PAR(10) = -1.
201C
202 GO TO 210
203C
204 125 CONTINUE
205 IF(ISH.NE.5.AND.ISH.NE.6.AND.ISH.NE.NSCTUB) GO TO 160
206C
207C Tube, tube segment or cut tube.
208C
209 IF(IAXIS.NE.3) GO TO 130
210 IF(PAR(3).LE.0.0) GO TO 920
211 IF(ABS(C0).GT.PAR(3)) GO TO 910
212 NDIV=(PAR(3)-C0+0.001)/STEP
213 IF (NDIV.LE.0) GO TO 910
214 PAR(3)=STEP/2.
215 GO TO 210
216C
217 130 CONTINUE
218 IF(IAXIS.NE.1) GO TO 140
219 IF(PAR(1).LE.0.0.OR.PAR(2).LE.0.0) GO TO 920
220 IF(C0.LT.PAR(1)) GO TO 910
221 NDIV=(PAR(2)-C0+0.001)/STEP
222 IF (NDIV.LE.0) GO TO 910
223 PAR(1)=-1.
224 PAR(2)=-1.
225 GO TO 210
226C
227 140 CONTINUE
228 IF(ISH.EQ.6) GO TO 150
229 NW=NW+2
230 ISH=6
231 NDIV=360.001/STEP
232 IF (NDIV.LE.0) GO TO 910
233 NPAR=5
234 PAR(4)=-STEP/2.
235 PAR(5)=STEP/2.
236 GO TO 210
237C
238 150 CONTINUE
239 DP=PAR(5)-PAR(4)
240 DC0P = C0-PAR(4)
241 SG = SIGN(1.0,DC0P)
242 DC0P = MOD( ABS(DC0P), 360.0)
243 IF(SG.LE.0.0) DC0P = 360.0-DC0P
244 C0 = PAR(4)+DC0P
245 IF(C0-PAR(4).LT.0.0) C0=C0+360.0
246 IF(C0-PAR(4).GT.DP) GO TO 910
247 DP=PAR(5)-C0
248 IF(DP.LT.0.0) DP=DP+360
249 NDIV=(DP+0.001)/STEP
250 IF (NDIV.LE.0) GO TO 910
251 PAR(4)=-STEP/2.
252 PAR(5)=STEP/2.
253 GO TO 210
254C
255 160 CONTINUE
256C
257 IF(ISH.NE.7.AND.ISH.NE.8) GO TO 190
258 IF(IAXIS.EQ.1) GO TO 165
259 IF(IAXIS.NE.3) GO TO 170
260C
261 IF(PAR(1).LE.0.0) GO TO 920
262 IF(ABS(C0).GT.PAR(1)) GO TO 910
263 NDIV=(PAR(1)-C0+0.001)/STEP
264 IF (NDIV.LE.0) GO TO 910
265 PAR(1)=STEP*0.5
266C
267 165 CONTINUE
268C
269 PAR(2)=-1.0
270 PAR(3)=-1.0
271 PAR(4)=-1.0
272 PAR(5)=-1.0
273 GO TO 210
274C
275 170 CONTINUE
276 IF(IAXIS.EQ.1) GO TO 210
277C
278 IF(ISH.EQ.8) GO TO 180
279 NW=NW+2
280 ISH=8
281 NDIV=360.001/STEP
282 IF (NDIV.LE.0) GO TO 910
283 NPAR=7
284 PAR(6)=-STEP/2.
285 PAR(7)=STEP/2.
286 GO TO 210
287C
288 180 CONTINUE
289 DP=PAR(7)-PAR(6)
290 DC0P = C0-PAR(6)
291 SG = SIGN(1.0,DC0P)
292 DC0P = MOD( ABS(DC0P), 360.0)
293 IF(SG.LE.0.0) DC0P = 360.0-DC0P
294 C0 = PAR(6)+DC0P
295 IF(C0-PAR(6).LT.0.0) C0=C0+360.0
296 IF(C0-PAR(6).GT.DP) GO TO 910
297 DP=PAR(7)-C0
298 IF(DP.LT.0.0) DP=DP+360.0
299 NDIV=(DP+0.001)/STEP
300 IF (NDIV.LE.0) GO TO 910
301 PAR(6)=-STEP/2.
302 PAR(7)=STEP/2.
303 GO TO 210
304C
305 190 CONTINUE
306 IF(ISH.NE.9) GO TO 200
307 IF(IAXIS.NE.1) GO TO 195
308 PAR(1)=-1.0
309 PAR(2)=-1.0
310 195 CONTINUE
311C
312 IF(IAXIS.NE.3) GO TO 210
313 DP=PAR(6)-PAR(5)
314 DC0P = C0-PAR(4)
315 SG = SIGN(1.0,DC0P)
316 DC0P = MOD( ABS(DC0P), 360.0)
317 IF(SG.LE.0.0) DC0P = 360.0-DC0P
318 C0 = PAR(4)+DC0P
319 IF(C0.LT.PAR(5)) C0=C0+360.0
320 IF(C0-PAR(5).GT.DP) GO TO 910
321 DP=PAR(6)-C0
322 IF(DP.LT.0.0) DP=DP+360
323 NDIV=(DP+0.001)/STEP
324 IF (NDIV.LE.0) GO TO 910
325 PAR(3)=-1.
326 PAR(4)=-1.
327 PAR(5)=-0.5*STEP
328 PAR(6)=0.5*STEP
329 GO TO 210
330C
331 200 CONTINUE
332C
333 GO TO 900
334C
335C NOW CREATE THE VOLUME FOR DIVISION
336C
337 210 IF (NDVMX.GT.0) THEN
338 IF (NDIV.GT.NDVMX) THEN
339 WRITE (CHMAIL, 1210) NDIV,NDVMX
340 CALL GMAIL(0,0)
341 1210 FORMAT (' GSDVT2 : NDIV gt NDVMX', 2I8,' truncated')
342 NDIV = NDVMX
343 ENDIF
344 ELSE IF (NDVMX.LT.0) THEN
345* Case when called by GSDVX
346 IF (NDIV.GT.-NDVMX) NDIV = -NDVMX
347 ENDIF
348 Q(JDIV+4)=C0
349 Q(JDIV+5)=STEP
350 Q(JDIV+3)=NDIV
351 NVOLUM=NVOLUM+1
352 NVOL =IQ(JVOLUM-2)
353 IF(NVOLUM.GT.NVOL)CALL MZPUSH(IXCONS,JVOLUM,50,50,'I')
354 CALL MZBOOK(IXCONS,JVO,JVOLUM,-NVOLUM,'VOL1',50,50,NW,3,0)
355 IF(IEOTRI.NE.0)GO TO 95
356 IQ(JVOLUM+NVOLUM)=NAME
357C
358C COPY PARAMETERS IN DATA AREA
359C
360 JVOM=LQ(JVOLUM-IVOM)
361 CALL UCOPY(Q(JVOM+1),Q(JVO+1),NWM)
362 CALL GSIPAR(JVO,0,NPAR,NATT,PAR,ATT)
363 Q(JVO+2)=ISH
364 Q(JVO+3)=0.
365 IF (NUMED.GT.0) Q(JVO+4)=NUMED
366 GO TO 99
367C
368 900 CONTINUE
369C
370C DIVIDE ACTION NOT SUPPORTED.
371C
372 WRITE(CHMAIL,8000)
373 CALL GMAIL(0,0)
374 WRITE(CHMAIL,8001) ISH,IAXIS
375 CALL GMAIL(0,0)
376C
377 GO TO 99
378C
379 910 CONTINUE
380C
381C C0 START OF DIVISION OUT OF OBJECT OR STEP SIZE TOO BIG.
382C
383 WRITE(CHMAIL,9000) C0,STEP
384 CALL GMAIL(0,0)
385C
386 GO TO 99
387 920 CONTINUE
388C
389C +VE DEFINITE PARAMETER IN DIMENSION OF C0 SET -VE OR 0.
390C
391 WRITE(CHMAIL,9010)
392 CALL GMAIL(0,0)
393C
394 GO TO 99
395C
396C NOT ENOUGH SPACE
397C
398 95 WRITE(CHMAIL,7000)NAME,MOTHER
399 CALL GMAIL(0,0)
400C
401 99 CONTINUE
402 1000 FORMAT(' ***** GSDVT2 CALLED AND NO VOLUMES DEFINED *****')
403 2000 FORMAT(' ***** GSDVT2 VOLUME ',A4,' ALREADY EXISTS *****')
404 3000 FORMAT(' ***** GSDVT2 ROTATION MATRIX',I5,' DOES NOT EXIST *****')
405 4000 FORMAT(' ***** GSDVT2 MOTHER ',A4,' ALREADY DIVIDED *****')
406 5000 FORMAT(' ***** GSDVT2 BAD AXIS VALUE ',I5,' *****')
407 6000 FORMAT(' ***** GSDVT2 BAD STEP SIZE ',E15.5,' *****')
408 7000 FORMAT(' ***** GSDVT2 NOT ENOUGH SPACE TO STORE DIVISIONS ',
409 + ' IN ',A4,' *****')
410 8000 FORMAT(' DIVIDE ACTION WITH C0 REQUESTED NOT SUPPORTED',
411 +' AT PRESENT.')
412 8001 FORMAT(' ISH =',I5,' IAXIS =',I5)
413 9000 FORMAT(' ***** GSDVT2 C0',E15.5,' OUT OF OBJECT',
414 +' OR STEP',E15.5,' TOO BIG *****')
415 9010 FORMAT(' ATTEMPT TO SPECIFY C0 WHEN APPROPRIATE DIMENSION',
416 +' OF THE MOTHER IS DEFINED -VE (TO BE SELECTED AT RUN TIME)')
417 END