5 * Revision 1.1.1.1 1995/10/24 10:20:57 cernlib
9 #include "geant321/pilot.h"
10 *CMZ : 3.21/04 02/03/95 11.58.00 by S.Giani
12 SUBROUTINE GVDPHI(ISH,IROT,DX,PARS,CL,CH,IERR)
14 C. **********************************************************
16 C. * ROUTINE TO FIND THE PHI LIMITS OF THE OBJECT SHAPE *
17 C. * ISH ROTATED BY MATRIX IROT AND DISPLACED BY VECTOR *
18 C. * DX. IT HAS NPAR PARAMTERS IN THE ARRAY PARS. THE *
19 C. * LOWER LIMIT IS RETURNED IN CL AND THE HIGHER IN CH. *
20 C. * NOTE THE OBJECT IS CONTAINED IN THE RANGE OF *
21 C. * INCREASING PHI FROM CL TO CH THOUGH CL AND CH ARE *
22 C. * FORCED TO LIE IN THE RANGE 0.0 TO 360.0 SO THAT THE *
23 C. * VALUE OF CL CAN BE HIGHER THAN THAT OF CH. *
25 C. * ==>Called by : GVDLIM modified *
26 C. * Author S.Giani ********* *
28 C. **********************************************************
30 #include "geant321/gcbank.inc"
31 #include "geant321/gconsp.inc"
32 #include "geant321/gcshno.inc"
33 DIMENSION DX(3),PARS(50),X(3),XT(3)
35 C. -------------------------------------------
39 DXS=DX(1)*DX(1)+DX(2)*DX(2)
40 IF(DXS.GT.0.0) DXS=SQRT(DXS)
42 IF(ISH.GT.4.AND.ISH.NE.10.AND.ISH.NE.28) GO TO 40
45 C CUBOIDS, TRAPEZOIDS, PARALLELEPIPEDS.
51 C IF IN DOUBT SET IT TO FULL RANGE.
53 IF(DXS.LE.0.0) GO TO 999
56 IF(DX(1).NE.0.)PHC=ATAN2(DX(2),DX(1))*RADDEG
57 IF(DX(1).EQ.0..AND.DX(2).LT.0.)PHC=-90.
58 IF(PHC.LT.0.0) PHC=PHC+360
64 C THIS IS A LOOP OVER THE 8 CORNERS.
65 C FIRST FIND THE LOCAL COORDINATES.
69 C General twisted trapezoid.
75 X(1)=PARS(I0)+PARS(I0+2)*X(3)
76 X(2)=PARS(I0+1)+PARS(I0+3)*X(3)
85 IF(IP.LE.4) X(3)=-X(3)
87 IF(ISH.GT.2.AND.X(3).GT.0.0) IP2=4
88 IF(ISH.EQ.1.OR.ISH.EQ.10) IP2=2
90 IF(ISH.EQ.4.AND.X(3).GT.0.0) IP2=8
92 IF(MOD(IP+3,4).LT.2) X(2)=-X(2)
94 IF(ISH.NE.1.AND.ISH.NE.10.AND.X(3).GT.0.0) IP1=2
96 IF(ISH.EQ.4.AND.X(3).GT.0.0) IP1=IP1+4
97 IF(ISH.EQ.4.AND.X(2).GT.0.0) IP1=IP1+1
99 IF(MOD(IP,2).EQ.1) X(1)=-X(1)
101 IF(ISH.NE.10) GO TO 10
102 X(1)=X(1)+X(2)*PARS(4)+X(3)*PARS(5)
103 X(2)=X(2)+X(3)*PARS(6)
106 IF(ISH.NE.4) GO TO 20
108 IF(X(3).GT.0.0) IP4=11
109 X(1)=X(1)+X(2)*PARS(IP4)+X(3)*PARS(2)
110 X(2)=X(2)+X(3)*PARS(3)
119 IF(IROT.NE.0) CALL GINROT(X,Q(JROT+1),XT)
121 XPT=DXS+(DX(1)*XT(1)+DX(2)*XT(2))/DXS
122 YPT=(DX(1)*XT(2)-DX(2)*XT(1))/DXS
124 IF(YPT.EQ.0.0.AND.XPT.EQ.0.0) GO TO 999
126 IF(P.GT.PI) P=P-PI*2.0
134 IF(PH-PL.GT.PI) GO TO 999
138 *** SG = SIGN(1.0,CL)
139 *** CL = MOD( ABS(CL),360.0 )
140 *** IF(SG.LE.0.0) CL=360.-CL
142 *** CH = MOD( ABS(CH),360.0 )
143 *** IF(SG.LE.0.0) CH=360.-CH
158 DO 145 I=7,IZLAST+2,3
159 IF(PARS(I).GT.TMPRAD)TMPRAD=PARS(I)
160 IF(PARS(I-1).LT.TMPMIN)TMPMIN=PARS(I-1)
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)
174 IF(PARS(2).EQ.360)THEN
177 PHIMIN=PARS(1)*DEGRAD
178 PHIMAX=(PARS(1)+PARS(2))*DEGRAD
181 ELSEIF(ISH.EQ.12)THEN
190 DO 146 I=6,IZLAST+2,3
191 IF(PARS(I).GT.TMPRAD)TMPRAD=PARS(I)
192 IF(PARS(I-1).LT.TMPMIN)TMPMIN=PARS(I-1)
196 IF(PARS(2).EQ.360)THEN
199 PHIMIN=PARS(1)*DEGRAD
200 PHIMAX=(PARS(1)+PARS(2))*DEGRAD
203 ELSEIF(ISH.GT.8.AND.ISH.NE.NSCTUB.AND.ISH.NE.13.AND.ISH.NE.14)THEN
213 C WHEN IN DOUBT SET TO FULL RANGE.
215 IF(MYFLAG.EQ.0)RM=PARS(2)
216 IF(ISH.LE.6.OR.ISH.EQ.NSCTUB.OR.MYFLAG.NE.0) GO TO 50
220 ** approxime to a cylinder whit radius
221 ** equal to the ellipse major axis
223 IF(PARS(1).GT.RM) RM=PARS(1)
227 RM = SQRT(PARS(2)**2+(PARS(3)*TAN(PARS(4)*DEGRAD))**2)
231 IF(PARS(5).GT.RM) RM=PARS(5)
235 IF(DXS.GT.RM) GO TO 70
236 IF(ISH.EQ.5.OR.ISH.EQ.7.OR.ISH.EQ.14.OR.MYFLAG.EQ.5) GO TO 999
237 IF(ISH.EQ.13) GOTO 999
238 * Here we treat the CONS and TUBS
239 * This is the simple case, no rotation
240 * Compute the position of the limits on
242 IF(MYFLAG.EQ.0.AND.ISH.LE.6)THEN
243 PHIMIN=PARS(4)*DEGRAD
244 PHIMAX=PARS(5)*DEGRAD
246 ELSEIF(MYFLAG.EQ.0.AND.ISH.EQ.8)THEN
247 PHIMIN=PARS(6)*DEGRAD
248 PHIMAX=PARS(7)*DEGRAD
249 RLOW=MIN(PARS(2),PARS(4))
254 DDX1 = DX(1)+RM*COS(PHIMIN)
255 DDY1 = DX(2)+RM*SIN(PHIMIN)
256 DDX2 = DX(1)+RM*COS(PHIMAX)
257 DDY2 = DX(2)+RM*SIN(PHIMAX)
258 CLA = ATAN2(DDY1,DDX1)*RADDEG
259 CHA = ATAN2(DDY2,DDX2)*RADDEG
260 DDX1 = DX(1)+RLOW*COS(PHIMIN)
261 DDY1 = DX(2)+RLOW*SIN(PHIMIN)
262 DDX2 = DX(1)+RLOW*COS(PHIMAX)
263 DDY2 = DX(2)+RLOW*SIN(PHIMAX)
264 CLB = ATAN2(DDY1,DDX1)*RADDEG
265 CHB = ATAN2(DDY2,DDX2)*RADDEG
266 CL=MIN(CLA,CLB,CHA,CHB)
267 CH=MAX(CLA,CLB,CHA,CHB)
268 IF((CH-CL).GT.(PHIMAX-PHIMIN)*RADDEG)THEN
269 IF(ISH.EQ.6.OR.ISH.EQ.8.OR.MYFLAG.EQ.6)THEN
283 IF(IROT.EQ.0) GO TO 65
284 IF(CL.EQ.0..AND.CH.EQ.360.)GOTO 65
286 IF(Q(JROT+15).NE.0.0.AND.Q(JROT+15).NE.180.0)THEN
294 IF(PHY.LT.PHX) PHY=PHY+360.0
296 IF(PHY-PHX.GT.180.0) ISPH=-1
298 PHI1 = ISPH*PHIMIN+PHX*DEGRAD
299 PHI2 = ISPH*PHIMAX+PHX*DEGRAD
300 DDX1 = DX(1)+RM*COS(PHI1)
301 DDY1 = DX(2)+RM*SIN(PHI1)
302 DDX2 = DX(1)+RM*COS(PHI2)
303 DDY2 = DX(2)+RM*SIN(PHI2)
304 CLA = ATAN2(DDY1,DDX1)*RADDEG
305 CHA = ATAN2(DDY2,DDX2)*RADDEG
306 DDX1 = DX(1)+RLOW*COS(PHI1)
307 DDY1 = DX(2)+RLOW*SIN(PHI1)
308 DDX2 = DX(1)+RLOW*COS(PHI2)
309 DDY2 = DX(2)+RLOW*SIN(PHI2)
310 CLB = ATAN2(DDY1,DDX1)*RADDEG
311 CHB = ATAN2(DDY2,DDX2)*RADDEG
312 CL=MIN(CLA,CLB,CHA,CHB)
313 CH=MAX(CLA,CLB,CHA,CHB)
318 IF(ISPH.EQ.1) GO TO 65
326 *** CL = MOD( ABS(CL),360.0 )
327 *** IF(SG.LE.0.0) CL=360.-CL
329 *** CH = MOD( ABS(CH),360.0 )
330 *** IF(SG.LE.0.0) CH=360.-CH
336 C DISPLACEMENT GREATER THAN MAXIMUM RADIUS SO
337 C ASSUME COMPLETE TUBE TO GENERATE 'WORST CASE'.
339 IF(MYFLAG.EQ.0)DZ=PARS(3)
340 IF(ISH.EQ.NSCTUB) THEN
341 S1 = (1.0-PARS(8))*(1.0+PARS(8))
342 IF( S1 .GT. 0.0) S1 = SQRT(S1)
343 S2 = (1.0-PARS(11))*(1.0+PARS(11))
344 IF( S2 .GT. 0.0) S2 = SQRT(S2)
345 IF( S2 .GT. S1 ) S1 = S2
347 ELSEIF(ISH.GT.6.AND.ISH.NE.13.AND.ISH.NE.14.AND.MYFLAG.EQ.0)THEN
361 IF(IROT.NE.0) CALL GINROT(X,Q(JROT+1),XT)
363 COST=ABS(DX(1)*XT(1)+DX(2)*XT(2))
364 COS2=ABS(DX(1)*XT(2)-DX(2)*XT(1))
365 SINT=(DXS+COST)*(DXS-COST)
366 SIN2=(DXS+COS2)*(DXS-COS2)
367 IF(SINT.GT.0.0) SINT=SQRT(SINT)
368 IF(SIN2.GT.0.0) SIN2=SQRT(SIN2)
370 XPT=DXS-(COST*DZ+SINT*RM)/DXS
372 IF(XPT.LE.0.0) GO TO 999
373 YPT=(SIN2*RM+COS2*DZ)/DXS
376 P0=ATAN2(DX(2),DX(1))
381 *** CL = MOD( ABS(CL),360.0 )
382 *** IF(SG.LE.0.0) CL=360.-CL
384 *** CH = MOD( ABS(CH),360.0 )
385 *** IF(SG.LE.0.0) CH=360.-CH
390 IF(ISH.GT.9.AND.MYFLAG.EQ.0) GO TO 999
398 IF(IROT.NE.0.OR.DXS.GT.0.0) GO TO 90
400 C UNROTATED AND CENTERED.
406 *** CL = MOD( ABS(CL),360.0 )
407 *** IF(SG.LE.0.0) CL=360.-CL
409 *** CH = MOD( ABS(CH),360.0 )
410 *** IF(SG.LE.0.0) CH=360.-CH
416 C ROTATED OR NOT CENTERED.
418 IF(DXS.LT.PARS(2)) GO TO 999
419 P0=ATAN2(DX(2),DX(1))
425 *** CL = MOD( ABS(CL),360.0 )
426 *** IF(SG.LE.0.0) CL=360.-CL
428 *** CH = MOD( ABS(CH),360.0 )
429 *** IF(SG.LE.0.0) CH=360.-CH