]> git.uio.no Git - u/mrichter/AliRoot.git/blob - GEANT321/ggeom/ginpgo.F
This commit was generated by cvs2svn to compensate for changes in r2,
[u/mrichter/AliRoot.git] / GEANT321 / ggeom / ginpgo.F
1 *
2 * $Id$
3 *
4 * $Log$
5 * Revision 1.1.1.1  1995/10/24 10:20:50  cernlib
6 * Geant
7 *
8 *
9 #include "geant321/pilot.h"
10 *CMZ :  3.21/02 29/03/94  15.41.29  by  S.Giani
11 *-- Author :
12       SUBROUTINE GINPGO(X,P,IYES)
13 C.
14 C.    ******************************************************************
15 C.    *                                                                *
16 C.    *    ROUTINE TO PERFORM GINME FUNCTION FOR A POLYGON.            *
17 C.    *        X  -  A VECTOR DIMENSION 3 GIVING THE POINT.            *
18 C.    *        P  -  THE VECTOR OF PARAMETERS, (1) = PHIMIN,           *
19 C.    *                   (2) = DPHI, (3) = NDIV, (4) = NZ, (5) = Z(1) *
20 C.    *                   (6) = RMIN(1), (7) = RMAX(1), (8) = Z(2),    *
21 C.    *                   (9) = RMIN(2), (10) = RMAX(2), ETC.          *
22 C.    *                   RMIN IS THE DISTANCE FROM THE ORIGIN TO THE  *
23 C.    *                   INSIDE EDGE PROJECTED ALONG THE CENTRE LINE  *
24 C.    *                   OF THE DIVISION. RMAX IS THE CORRESPONDING   *
25 C.    *                   PROJECTED DISTANCE FOR THE OUTER EDGE.       *
26 C.    *     IYES  -  RETURNED AS 1 IF POINT IS INSIDE, OTHERWISE 0.    *
27 C.    *                                                                *
28 C.    *    ==>Called by : GINME                                        *
29 C.    *         Author  A.McPherson  *********                         *
30 C.    *                                                                *
31 C.    ******************************************************************
32 C.
33 #include "geant321/gconsp.inc"
34 #include "geant321/gcpoly.inc"
35 #if !defined(CERNLIB_SINGLE)
36       DOUBLE PRECISION XX1,XX2,PHI,DELPHI,PH0,R,DZRAT,DIVPHI
37       DOUBLE PRECISION RMN,RMX,HNDIV
38 #endif
39       DIMENSION P(10),X(3)
40 C.
41 C.                ---------------------------------
42 C.
43       IYES=0
44 C
45 C                 FIRST CHECK TOTAL Z RANGE.
46 C
47       NZ=P(4)
48       IF(X(3).LT.P(5).OR.X(3).GT.P(NZ*3+2)) GO TO 999
49 C
50 C             Find smallest RMIN and largest RMAX
51 C
52       RMIN=P(6)
53       RMAX=P(7)
54       DO 10 I=2,NZ
55          IP=I*3+3
56          IF(P(IP).LT.RMIN)RMIN=P(IP)
57          IF(P(IP+1).GT.RMAX) RMAX=P(IP+1)
58    10 CONTINUE
59 *
60 * ***         Check R against RMIN
61 *
62       XX1 = X(1)
63       XX2 = X(2)
64       R   = SQRT(XX1**2+XX2**2)
65       IF(R.LT.RMIN)GO TO 999
66       HNDIV=P(3)
67       DELPHI=P(2)
68       DIVPHI=DELPHI/HNDIV
69 *
70 * ***     Find the radius of the outscribed circle
71 *
72       RMAX = RMAX/COS(0.5*DIVPHI*DEGRAD)
73 *
74 * ***         Check R against RMAX
75 *
76       IF(R.GT.RMAX)GO TO 999
77 C
78 C               If R sufficiently small ignore phi structure.
79 C
80       IPSEC=1
81 C
82       IF(R.LT.1.0E-5) GO TO 20
83 C
84 C                 NOW CHECK PHI.
85 C
86       PHI=ATAN2(XX2,XX1)*RADDEG
87       IF(PHI.LT.P(1)) PHI=PHI+360.0
88       IF(PHI.LT.P(1).OR.PHI-P(1).GT.P(2)) GO TO 999
89 C
90 C                 NOW FIND PHI DIVISION.
91 C
92       IPSEC=MIN((PHI-P(1))/DIVPHI+1.,HNDIV)
93 C
94       PH0=(P(1)+DIVPHI*(IPSEC-0.5))*DEGRAD
95 C
96 C                 NOW CHECK PROJECTED DISTANCE. FIRST COMPUTE IT.
97 C
98       R=XX1*COS(PH0)+XX2*SIN(PH0)
99 C
100    20 CONTINUE
101 C
102 C                 NOW FIND WHICH Z SECTION THE POINT IS IN.
103 C
104       IZL=1
105       IZH=NZ
106       IPL=IZL*3+2
107       IPH=IZH*3+2
108 C
109    30 IF(IZH-IZL.GT.1) THEN
110 C
111          IZT=(IZL+IZH)/2
112          IPT=IZT*3+2
113          IF(X(3).LE.P(IPT)) THEN
114 C
115             IZH=IZT
116             IPH=IPT
117          ELSE
118 C
119             IZL=IZT
120             IPL=IPT
121          ENDIF
122 C
123          GO TO 30
124       ENDIF
125 C
126 C          THE POINT IS IN THE SECTION BOUNDED BY THE IZL TH AND THE
127 C          IZH TH Z VALUES.
128 C
129 C          NOW COMPUTE RMIN AND RMAX AND TEST THE VALUE OF R .
130 C
131       IZSEC=IZL
132       DZRAT=X(3)-P(IPL)
133       DZRAT=DZRAT/(P(IPH)-P(IPL))
134       RMN=P(IPL+1)+DZRAT*(P(IPH+1)-P(IPL+1))
135 *
136 * ***     Is the point inside the 'hole' at the centre of the volume?
137 *
138       IF(R.LT.RMN) GO TO 999
139 *
140       RMX=P(IPL+2)+DZRAT*(P(IPH+2)-P(IPL+2))
141 *
142 * ***     Is the point outside the volume?
143 *
144       IF(R.GT.RMX) GO TO 999
145 C
146 C           POINT IS IN POLYGON.
147 C
148       IYES=1
149 C
150   999 END