]> git.uio.no Git - u/mrichter/AliRoot.git/blame - GEANT321/ggeom/gvdcar.F
This commit was generated by cvs2svn to compensate for changes in r2,
[u/mrichter/AliRoot.git] / GEANT321 / ggeom / gvdcar.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 10/10/94 20.01.58 by S.Giani
11*-- Author :
12 SUBROUTINE GVDCAR(IAXIS,ISH,IROT,PARS,CL,CH,IERR)
13C.
14C. *****************************************************************
15C. * *
16C. * ROUTINE TO FIND THE LIMITS ALONG AXIS IAXIS IN CARTESIAN *
17C. * COORDINATES FOR VOLUME OF SHAPE ISH ROTATED BY THE *
18C. * ROTATION MATRIX IROT. THE SHAPE HAS NPAR PARAMETERS IN *
19C. * THE ARRAY PARS. THE LOWER LIMIT IS RETURNED IN CL, THE *
20C. * HIGHER IN CH. IF THE CALCULATION CANNOT BE MADE IERR IS *
21C. * SET TO 1 OTHERWISE IT IS SET TO 0. *
22C. * *
23C. * ==>Called by : GVDLIM *
24C. * Author S.Giani ******** *
25C. * *
26C. *****************************************************************
27C.
28#include "geant321/gcbank.inc"
29#include "geant321/gconsp.inc"
30#include "geant321/gcshno.inc"
31 DIMENSION PARS(50),X(3),XT(3)
32C.
33C. ---------------------------------------------------
34C.
35 IERR=1
36 IF (ISH.GT.4.AND.ISH.NE.10.AND.ISH.NE.28) GO TO 40
37C
38C CUBOIDS, TRAPEZOIDS, PARALLELEPIPEDS.
39C
40C
41 IERR=0
42 CL=0
43 CH=0
44C
45 DO 30 IP=1,8
46C
47C THIS IS A LOOP OVER THE 8 CORNERS.
48C FIRST FIND THE LOCAL COORDINATES.
49C
50 IF(ISH.EQ.28) THEN
51C
52C General twisted trapezoid.
53C
54 IL=(IP+1)/2
55 I0=IL*4+11
56 IS=(IP-IL*2)*2+1
57 X(3)=PARS(1)*IS
58 X(1)=PARS(I0)+PARS(I0+2)*X(3)
59 X(2)=PARS(I0+1)+PARS(I0+3)*X(3)
60 GO TO 20
61C
62 ENDIF
63C
64 IP3=ISH+2
65 IF(ISH.EQ.10) IP3=3
66 IF(ISH.EQ.4) IP3=1
67 X(3)=PARS(IP3)
68 IF(IP.LE.4) X(3)=-X(3)
69 IP2=3
70 IF(ISH.GT.2.AND.X(3).GT.0.0) IP2=4
71 IF(ISH.EQ.1.OR.ISH.EQ.10) IP2=2
72 IF(ISH.EQ.4) IP2=4
73 IF(ISH.EQ.4.AND.X(3).GT.0.0) IP2=8
74 X(2)=PARS(IP2)
75 IF(MOD(IP+3,4).LT.2) X(2)=-X(2)
76 IP1=1
77 IF(ISH.NE.1.AND.ISH.NE.10.AND.X(3).GT.0.0) IP1=2
78 IF(ISH.EQ.4) IP1=5
79 IF(ISH.EQ.4.AND.X(3).GT.0.0) IP1=IP1+4
80 IF(ISH.EQ.4.AND.X(2).GT.0.0) IP1=IP1+1
81 X(1)=PARS(IP1)
82 IF(MOD(IP,2).EQ.1) X(1)=-X(1)
83C
84 IF(ISH.NE.10) GO TO 10
85 X(1)=X(1)+X(2)*PARS(4)+X(3)*PARS(5)
86 X(2)=X(2)+X(3)*PARS(6)
87 10 CONTINUE
88C
89 IF(ISH.NE.4) GO TO 20
90 IP4=7
91 IF(X(3).GT.0.0) IP4=11
92 X(1)=X(1)+X(2)*PARS(IP4)+X(3)*PARS(2)
93 X(2)=X(2)+X(3)*PARS(3)
94 20 CONTINUE
95C
96C ROTATE.
97C
98 JROT=LQ(JROTM-IROT)
99 XT(1)=X(1)
100 XT(2)=X(2)
101 XT(3)=X(3)
102 IF(IROT.NE.0) CALL GINROT(X,Q(JROT+1),XT)
103C
104C UPDATE LIMITS IF NECESSARY.
105C
106 IF(XT(IAXIS).LT.CL) CL=XT(IAXIS)
107 IF(XT(IAXIS).GT.CH) CH=XT(IAXIS)
108C
109 30 CONTINUE
110C
111 GO TO 999
112C
113 40 CONTINUE
114 IF(ISH.EQ.9) GO TO 90
115C
116C TUBES , CONES, POLYGONS, POLYCONES.
117C AND CUT TUBES.
118C
119 MYFLAG=0
120 IF((ISH.EQ.11.OR.ISH.EQ.12).AND.(IAXIS.LT.3))THEN
121 MYFLAG=1
122 ENDIF
123 X(1)=0.0
124 X(2)=0.0
125 X(3)=1.0
126 JROT=LQ(JROTM-IROT)
127 XT(1)=X(1)
128 XT(2)=X(2)
129 XT(3)=X(3)
130 IF(IROT.NE.0) CALL GINROT(X,Q(JROT+1),XT)
131C
132C XT IS Z AXIS ROTATED.
133C
134 IF(MYFLAG.EQ.0)THEN
135 IF(ABS(XT(IAXIS)).LT.0.99) GO TO 50
136 ELSE
137 IF(ABS(XT(3)).LT.0.99) GO TO 50
138 ENDIF
139 IF(ISH.EQ.11)GO TO 45
140 IF(ISH.EQ.12)GO TO 46
141C
142C PARALLEL.
143C
144 IP=3
145 IF(ISH.GT.6.AND.ISH.NE.NSCTUB.AND.ISH.NE.13.AND.ISH.NE.14) IP=1
146 CL=-PARS(IP)
147 CH=PARS(IP)
148 IERR=0
149C
150 GO TO 999
151 45 IF(MYFLAG.EQ.0)THEN
152 NZLAST=PARS(4)
153 IZLAST=2+3*NZLAST
154 CL=PARS(5)
155 GO TO 49
156 ELSEIF(MYFLAG.EQ.1)THEN
157 NZLAST=PARS(4)
158 IZLAST=2+3*NZLAST
159 TMPRAD=0.
160 DO 145 I=7,IZLAST+2,3
161 IF(PARS(I).GT.TMPRAD)TMPRAD=PARS(I)
162 145 CONTINUE
163 PHIMIN=PARS(1)
164 PHIMAX=PHIMIN+PARS(2)
165 AANG=ABS(PHIMAX-PHIMIN)
166 NANG=PARS(3)
167 AATMAX=NANG*360./AANG
168 LATMAX=AATMAX
169 ALA=AATMAX-LATMAX
170 IF(ALA.GT..5)LATMAX=LATMAX+1
171 AFINV=1./COS(PI/LATMAX)
172 FINV=ABS(AFINV)
173 R=TMPRAD*FINV
174 CL=-R
175 CH= R
176 IERR=0
177 GOTO 999
178 ENDIF
179C
180 46 IF(MYFLAG.EQ.0)THEN
181 NZLAST=PARS(3)
182 IZLAST=1+3*NZLAST
183 CL=PARS(4)
184 ELSEIF(MYFLAG.EQ.1)THEN
185 NZLAST=PARS(3)
186 IZLAST=1+3*NZLAST
187 TMPRAD=0.
188 DO 146 I=6,IZLAST+2,3
189 IF(PARS(I).GT.TMPRAD)TMPRAD=PARS(I)
190 146 CONTINUE
191 CL=-TMPRAD
192 CH= TMPRAD
193 IERR=0
194 GOTO 999
195 ENDIF
196C
197 49 CH=PARS(IZLAST)
198 IF ( ABS(XT(IAXIS)-X(IAXIS)) .GT.1.) THEN
199 TEMP = CL
200 CL = -CH
201 CH = -TEMP
202 ENDIF
203 IERR=0
204 GO TO 999
205C
206 50 CONTINUE
207**
208 IF(ISH.EQ.13) THEN
209 CL=-PARS(IAXIS)
210 CH=PARS(IAXIS)
211 IERR=0
212 GOTO 999
213 ENDIF
214**
215 IF(ISH.EQ.14) THEN
216C for hyperboloid, use escribed cylinder
217 CH = SQRT(PARS(2)**2+(PARS(3)*TAN(PARS(4)*DEGRAD))**2)
218 CL = -CH
219 IERR=0
220 GOTO 999
221 ENDIF
222**
223 IF(ISH.GT.10.AND.ISH.NE.NSCTUB)GO TO 999
224 IF(ABS(XT(IAXIS)).GT.0.01) GO TO 70
225C
226C Z AXIS PERPENDICULAR TO IAXIS. ASSUME COMPLETE TUBE OR
227C CONE (I.E. IGNORE PHI SEGMENTATION).
228C
229 IF(ISH.GT.6.AND.ISH.NE.NSCTUB) GO TO 60
230C
231 CL=-PARS(2)
232 CH=PARS(2)
233 IERR=0
234 IF(ISH.EQ.6)THEN
235 RMIN=PARS(1)
236 RMAX=PARS(2)
237 IF(IROT.NE.0)THEN
238 IF(Q(JROT+15).EQ.0.)THEN
239 PHI1=(PARS(4)+Q(JROT+12))*DEGRAD
240 PHI2=(PARS(5)+Q(JROT+12))*DEGRAD
241 ELSEIF(Q(JROT+15).EQ.180.)THEN
242 PHI1=(PARS(4)+Q(JROT+12)-(PARS(5)-PARS(4)))*DEGRAD
243 PHI2=(PARS(5)+Q(JROT+12)-(PARS(5)-PARS(4)))*DEGRAD
244 ELSE
245 GOTO 999
246 ENDIF
247 ELSE
248 PHI1=PARS(4)*DEGRAD
249 PHI2=PARS(5)*DEGRAD
250 ENDIF
251 IF(IAXIS.EQ.1)THEN
252 IF(PHI1.GE.0..AND.PHI2.LE.PI)THEN
253 XMIN1=RMIN*COS(PHI2)
254 XMIN2=RMAX*COS(PHI2)
255 CL=MIN(XMIN1,XMIN2)
256 XMAX1=RMIN*COS(PHI1)
257 XMAX2=RMAX*COS(PHI1)
258 CH=MAX(XMAX1,XMAX2)
259 ELSEIF(PHI1.GE.PI.AND.PHI2.LE.TWOPI.OR.
260 + PHI1.GE.-PI.AND.PHI2.LE.0.)THEN
261 XMIN1=RMIN*COS(PHI1)
262 XMIN2=RMAX*COS(PHI1)
263 CL=MIN(XMIN1,XMIN2)
264 XMAX1=RMIN*COS(PHI2)
265 XMAX2=RMAX*COS(PHI2)
266 CH=MAX(XMAX1,XMAX2)
267 ELSEIF(PHI1.LT.0..AND.PHI2.GT.0..AND.
268 + (PHI2-PHI1).LE.PI)THEN
269 XMIN1=RMIN*COS(PHI2)
270 XMIN2=RMIN*COS(PHI1)
271 CL1=MIN(XMIN1,XMIN2)
272 XMIN3=RMAX*COS(PHI2)
273 XMIN4=RMAX*COS(PHI1)
274 CL2=MIN(XMIN3,XMIN4)
275 CL=MIN(CL1,CL2)
276 CH=RMAX
277 ELSEIF(PHI1.LT.PI.AND.PHI2.GT.PI.AND.
278 + (PHI2-PHI1).LE.PI)THEN
279 CL=-RMAX
280 XMAX1=RMIN*COS(PHI2)
281 XMAX2=RMIN*COS(PHI1)
282 CH1=MAX(XMAX1,XMAX2)
283 XMAX3=RMAX*COS(PHI2)
284 XMAX4=RMAX*COS(PHI1)
285 CH2=MAX(XMAX3,XMAX4)
286 CH=MAX(CH1,CH2)
287 ENDIF
288 ELSEIF(IAXIS.EQ.2)THEN
289 IF(PHI1.GE.(-PI*.5).AND.PHI2.LE.(PI*.5))THEN
290 YMIN1=RMIN*SIN(PHI1)
291 YMIN2=RMAX*SIN(PHI1)
292 CL=MIN(YMIN1,YMIN2)
293 YMAX1=RMIN*SIN(PHI2)
294 YMAX2=RMAX*SIN(PHI2)
295 CH=MAX(YMAX1,YMAX2)
296 ELSEIF(PHI1.GE.(PI*.5).AND.PHI2.LE.(PI*3*.5))THEN
297 YMIN1=RMIN*SIN(PHI2)
298 YMIN2=RMAX*SIN(PHI2)
299 CL=MIN(YMIN1,YMIN2)
300 YMAX1=RMIN*SIN(PHI1)
301 YMAX2=RMAX*SIN(PHI1)
302 CH=MAX(YMAX1,YMAX2)
303 ELSEIF(PHI1.LT.(PI*.5).AND.PHI2.GT.(PI*.5).AND.
304 + (PHI2-PHI1).LE.PI)THEN
305 YMIN1=RMIN*SIN(PHI2)
306 YMIN2=RMIN*SIN(PHI1)
307 CL1=MIN(YMIN1,YMIN2)
308 YMIN3=RMAX*SIN(PHI2)
309 YMIN4=RMAX*SIN(PHI1)
310 CL2=MIN(YMIN3,YMIN4)
311 CL=MIN(CL1,CL2)
312 CH=RMAX
313 ELSEIF(((PHI1.LT.(PI*3*.5).AND.PHI2.GT.(PI*3*.5)).OR.
314 + (PHI1.LT.-(PI*.5).AND.PHI2.GT.-(PI*.5)))
315 + .AND.(PHI2-PHI1).LE.PI)THEN
316 CL=-RMAX
317 YMAX1=RMIN*SIN(PHI2)
318 YMAX2=RMIN*SIN(PHI1)
319 CH1=MAX(YMAX1,YMAX2)
320 YMAX3=RMAX*SIN(PHI2)
321 YMAX4=RMAX*SIN(PHI1)
322 CH2=MAX(YMAX3,YMAX4)
323 CH=MAX(CH1,CH2)
324 ENDIF
325 ENDIF
326 ENDIF
327C
328 GO TO 999
329C
330 60 CONTINUE
331C
332 RM=PARS(3)
333 IF(PARS(5).GT.PARS(3)) RM=PARS(5)
334C
335 CL=-RM
336 CH=RM
337 IERR=0
338C
339 GO TO 999
340C
341 70 CONTINUE
342C
343C ARBITRARY ROTATION.
344C
345 DZ=PARS(3)
346 RM=PARS(2)
347 IF(ISH.EQ.13) THEN
348**
349** approxime to a cylinder whit radius
350** equal to the ellipse major axis
351**
352 IF(PARS(1).GT.RM) RM=PARS(1)
353 GOTO 80
354 ENDIF
355**
356 IF(ISH.EQ.14) THEN
357 RM = SQRT(PARS(2)**2+(PARS(3)*TAN(PARS(4)*DEGRAD))**2)
358 GO TO 80
359 ENDIF
360*
361 IF(ISH.EQ.NSCTUB) THEN
362 S1 = (1.0-PARS(8))*(1.0+PARS(8))
363 IF( S1 .GT. 0.0) S1 = SQRT(S1)
364 S2 = (1.0-PARS(11))*(1.0+PARS(11))
365 IF( S2 .GT. 0.0) S2 = SQRT(S2)
366 IF( S2 .GT. S1 ) S1 = S2
367 DZ = DZ+RM*S1
368 ENDIF
369 IF(ISH.LE.6) GO TO 80
370C
371 DZ=PARS(1)
372 RM=PARS(3)
373 IF(PARS(5).GT.RM) RM=PARS(5)
374C
375 80 CONTINUE
376C
377 COST=ABS(XT(IAXIS))
378 SINT=(1+COST)*(1-COST)
379 IF(SINT.GT.0.0) SINT=SQRT(SINT)
380C
381 CH=COST*DZ+SINT*RM
382 CL=-CH
383 IERR=0
384C
385 GO TO 999
386 90 CONTINUE
387C
388C SPHERE - ASSUME COMPLETE SPHERE, TAKE OUTER RADIUS.
389C
390 IERR=0
391 CL=-PARS(2)
392 CH=PARS(2)
393C
394 999 CONTINUE
395 END