5 * Revision 1.1.1.1 1995/10/24 10:20:56 cernlib
9 #include "geant321/pilot.h"
10 *CMZ : 3.21/03 10/10/94 20.01.58 by S.Giani
12 SUBROUTINE GVDCAR(IAXIS,ISH,IROT,PARS,CL,CH,IERR)
14 C. *****************************************************************
16 C. * ROUTINE TO FIND THE LIMITS ALONG AXIS IAXIS IN CARTESIAN *
17 C. * COORDINATES FOR VOLUME OF SHAPE ISH ROTATED BY THE *
18 C. * ROTATION MATRIX IROT. THE SHAPE HAS NPAR PARAMETERS IN *
19 C. * THE ARRAY PARS. THE LOWER LIMIT IS RETURNED IN CL, THE *
20 C. * HIGHER IN CH. IF THE CALCULATION CANNOT BE MADE IERR IS *
21 C. * SET TO 1 OTHERWISE IT IS SET TO 0. *
23 C. * ==>Called by : GVDLIM *
24 C. * Author S.Giani ******** *
26 C. *****************************************************************
28 #include "geant321/gcbank.inc"
29 #include "geant321/gconsp.inc"
30 #include "geant321/gcshno.inc"
31 DIMENSION PARS(50),X(3),XT(3)
33 C. ---------------------------------------------------
36 IF (ISH.GT.4.AND.ISH.NE.10.AND.ISH.NE.28) GO TO 40
38 C CUBOIDS, TRAPEZOIDS, PARALLELEPIPEDS.
47 C THIS IS A LOOP OVER THE 8 CORNERS.
48 C FIRST FIND THE LOCAL COORDINATES.
52 C General twisted trapezoid.
58 X(1)=PARS(I0)+PARS(I0+2)*X(3)
59 X(2)=PARS(I0+1)+PARS(I0+3)*X(3)
68 IF(IP.LE.4) X(3)=-X(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
73 IF(ISH.EQ.4.AND.X(3).GT.0.0) IP2=8
75 IF(MOD(IP+3,4).LT.2) X(2)=-X(2)
77 IF(ISH.NE.1.AND.ISH.NE.10.AND.X(3).GT.0.0) IP1=2
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
82 IF(MOD(IP,2).EQ.1) X(1)=-X(1)
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)
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)
102 IF(IROT.NE.0) CALL GINROT(X,Q(JROT+1),XT)
104 C UPDATE LIMITS IF NECESSARY.
106 IF(XT(IAXIS).LT.CL) CL=XT(IAXIS)
107 IF(XT(IAXIS).GT.CH) CH=XT(IAXIS)
114 IF(ISH.EQ.9) GO TO 90
116 C TUBES , CONES, POLYGONS, POLYCONES.
120 IF((ISH.EQ.11.OR.ISH.EQ.12).AND.(IAXIS.LT.3))THEN
130 IF(IROT.NE.0) CALL GINROT(X,Q(JROT+1),XT)
132 C XT IS Z AXIS ROTATED.
135 IF(ABS(XT(IAXIS)).LT.0.99) GO TO 50
137 IF(ABS(XT(3)).LT.0.99) GO TO 50
139 IF(ISH.EQ.11)GO TO 45
140 IF(ISH.EQ.12)GO TO 46
145 IF(ISH.GT.6.AND.ISH.NE.NSCTUB.AND.ISH.NE.13.AND.ISH.NE.14) IP=1
151 45 IF(MYFLAG.EQ.0)THEN
156 ELSEIF(MYFLAG.EQ.1)THEN
160 DO 145 I=7,IZLAST+2,3
161 IF(PARS(I).GT.TMPRAD)TMPRAD=PARS(I)
164 PHIMAX=PHIMIN+PARS(2)
165 AANG=ABS(PHIMAX-PHIMIN)
167 AATMAX=NANG*360./AANG
170 IF(ALA.GT..5)LATMAX=LATMAX+1
171 AFINV=1./COS(PI/LATMAX)
180 46 IF(MYFLAG.EQ.0)THEN
184 ELSEIF(MYFLAG.EQ.1)THEN
188 DO 146 I=6,IZLAST+2,3
189 IF(PARS(I).GT.TMPRAD)TMPRAD=PARS(I)
198 IF ( ABS(XT(IAXIS)-X(IAXIS)) .GT.1.) THEN
216 C for hyperboloid, use escribed cylinder
217 CH = SQRT(PARS(2)**2+(PARS(3)*TAN(PARS(4)*DEGRAD))**2)
223 IF(ISH.GT.10.AND.ISH.NE.NSCTUB)GO TO 999
224 IF(ABS(XT(IAXIS)).GT.0.01) GO TO 70
226 C Z AXIS PERPENDICULAR TO IAXIS. ASSUME COMPLETE TUBE OR
227 C CONE (I.E. IGNORE PHI SEGMENTATION).
229 IF(ISH.GT.6.AND.ISH.NE.NSCTUB) GO TO 60
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
252 IF(PHI1.GE.0..AND.PHI2.LE.PI)THEN
259 ELSEIF(PHI1.GE.PI.AND.PHI2.LE.TWOPI.OR.
260 + PHI1.GE.-PI.AND.PHI2.LE.0.)THEN
267 ELSEIF(PHI1.LT.0..AND.PHI2.GT.0..AND.
268 + (PHI2-PHI1).LE.PI)THEN
277 ELSEIF(PHI1.LT.PI.AND.PHI2.GT.PI.AND.
278 + (PHI2-PHI1).LE.PI)THEN
288 ELSEIF(IAXIS.EQ.2)THEN
289 IF(PHI1.GE.(-PI*.5).AND.PHI2.LE.(PI*.5))THEN
296 ELSEIF(PHI1.GE.(PI*.5).AND.PHI2.LE.(PI*3*.5))THEN
303 ELSEIF(PHI1.LT.(PI*.5).AND.PHI2.GT.(PI*.5).AND.
304 + (PHI2-PHI1).LE.PI)THEN
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
333 IF(PARS(5).GT.PARS(3)) RM=PARS(5)
343 C ARBITRARY ROTATION.
349 ** approxime to a cylinder whit radius
350 ** equal to the ellipse major axis
352 IF(PARS(1).GT.RM) RM=PARS(1)
357 RM = SQRT(PARS(2)**2+(PARS(3)*TAN(PARS(4)*DEGRAD))**2)
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
369 IF(ISH.LE.6) GO TO 80
373 IF(PARS(5).GT.RM) RM=PARS(5)
378 SINT=(1+COST)*(1-COST)
379 IF(SINT.GT.0.0) SINT=SQRT(SINT)
388 C SPHERE - ASSUME COMPLETE SPHERE, TAKE OUTER RADIUS.