]> git.uio.no Git - u/mrichter/AliRoot.git/blame - GEANT321/ggeom/gntrp.F
Bugfix in AliPoints2Memory
[u/mrichter/AliRoot.git] / GEANT321 / ggeom / gntrp.F
CommitLineData
fe4da5cc 1*
2* $Id$
3*
4* $Log$
5* Revision 1.1.1.1 1995/10/24 10:20:54 cernlib
6* Geant
7*
8*
9#include "geant321/pilot.h"
10*CMZ : 3.21/02 29/03/94 15.41.30 by S.Giani
11*-- Author :
12 SUBROUTINE GNTRP (X, PAR, IACT, SNEXT, SNXT, SAFE)
13C.
14C. ******************************************************************
15C. * *
16C. * COMPUTE DISTANCE UP TO INTERSECTION WITH 'TRAP' VOLUME, *
17C. * FROM INSIDE POINT X(1-3) ALONG DIRECTION X(4-6) *
18C. * *
19C. * PAR (input) : volume parameters *
20C. * IACT (input) : action flag *
21C. * = 0 Compute SAFE only *
22C. * = 1 Compute SAFE, and SNXT only if SNEXT .GT.new SAFE *
23C. * = 2 Compute both SAFE and SNXT *
24C. * = 3 Compute SNXT only *
25C. * SNEXT (input) : see IACT = 1 *
26C. * SNXT (output) : distance to volume boundary *
27C. * SAFE (output) : shortest distance to any boundary *
28C. * *
29C. * ==>Called by : GNEXT, GTNEXT *
30C. * Author A.McPherson ********* *
31C. * *
32C. ******************************************************************
33C.
34#include "geant321/gconsp.inc"
35 DIMENSION X(6), PAR(11)
36#if defined(CERNLIB_SINGLE)
37 DIMENSION XT(6), P(11)
38#endif
39#if !defined(CERNLIB_SINGLE)
40 DOUBLE PRECISION XT(6), P(11)
41 DOUBLE PRECISION A,B,C,DSN,TOP1,TOP2,BOT1,BOT2
42 DOUBLE PRECISION DX1,DX2,X1,X2,X3,DCX1,DCX2,DX,DY
43 DOUBLE PRECISION SP1,SP2,DCX,DCY,TANG1,TANG2,A1,B1,A2,B2
44 DOUBLE PRECISION XL1,XL2,XL3,XL4,CY,SY,SX,CX,C1,C2
45 DOUBLE PRECISION TX,H0,DHDZ,CH
46 DOUBLE PRECISION CHTAN,SHTAN
47 DOUBLE PRECISION SN1,SN2,SN3,SN4,SN5,SN6,SN7,SN8,P15
48#endif
49C.
50C. --------------------------------------
51C.
52 SNXT = BIG
53 SAFE = 0.0
54 DO 1 I=1,6
55 1 XT(I)=X(I)
56 DO 2 I=1,11
57 2 P(I)=PAR(I)
58
59 P15=0.5/P(1)
60 DHDZ=(P(4)-P(8))*P15
61
62 IF (IACT .LT. 3) THEN
63
64
65C -------------------------------------------------
66C | Compute safety-distance 'SAFE' (McPherson) |
67C -------------------------------------------------
68
69
70C CALCULATE RECTANGLE ON FACE AT Z=-DZ.
71
72 DX1=P(4)*P(7)
73 X1=-DX1-P(5)
74 X2=DX1-P(6)
75 IF(X2.GT.X1) X1=X2
76 X2=-DX1+P(5)
77 X3=DX1+P(6)
78 IF(X3.LT.X2) X2=X3
79 DCX1=(X1+X2)*0.5
80 DX1=(X2-X1)*0.5
81C
82C CALCULATE RECTANGLE ON FACE AT Z=DZ.
83C
84 DX2=P(8)*P(11)
85 X1=-DX2-P(9)
86 X2=DX2-P(10)
87 IF(X2.GT.X1) X1=X2
88 X2=-DX2+P(9)
89 X3=DX2+P(10)
90 IF(X3.LT.X2) X2=X3
91 DCX2=(X1+X2)*0.5
92 DX2=(X2-X1)*0.5
93
94C
95 TX=P(2)+(DCX2-DCX1)*P15
96C
97C CALCULATE LOCAL RECTANGLE.
98C
99 SP1=(P(1)-XT(3))*P15
100 SP2=(P(1)+XT(3))*P15
101C
102 DY=P(4)*SP1+P(8)*SP2
103 DX=DX1*SP1+DX2*SP2
104 DCX=(DCX1+DCX2)*0.5+TX*XT(3)
105 DCY=P(3)*XT(3)
106C
107C CHECK POINT IS INSIDE RECTANGLE.
108C
109 IF(ABS(XT(1)-DCX).GT.DX) GO TO 10
110C
111C CALCULATE ANGLE OF YZ PLANES.
112C
113 TANG1=TX+(DX1-DX2)*P15
114 TANG2=TX-(DX1-DX2)*P15
115C
116C CALCULATE SAFETY FROM YZ PLANES.
117C
118 SAF1=(XT(1)-DCX+DX)/SQRT(1.0+TANG1*TANG1)
119 SAF2=(DX-XT(1)+DCX)/SQRT(1.0+TANG2*TANG2)
120C
121C CALCULATE ANGLE OF XZ PLANES.
122C
123 TANG1=P(3)+DHDZ
124 TANG2=P(3)-DHDZ
125C
126C CALCULATE SAFETY FROM XZ PLANES.
127C
128 SAF3=(XT(2)-DCY+DY)/SQRT(1.0+TANG1*TANG1)
129 SAF4=(DY-XT(2)+DCY)/SQRT(1.0+TANG2*TANG2)
130C
131C CALCULATE SAFETY FROM XY PLANES.
132C
133 SAF5=P(1)-ABS(XT(3))
134C
135C OVERALL SAFETY.
136C
137 SAFE = MIN(SAF1,SAF2,SAF3,SAF4,SAF5)
138
139
140 IF (IACT .EQ. 0) GO TO 999
141 IF (IACT .EQ. 1) THEN
142 IF (SNEXT .LT. SAFE) GO TO 999
143 ENDIF
144 ENDIF
145
146
147 10 CONTINUE
148
149C ------------------------------------------------
150C | Compute vector-distance 'SNXT' (McPherson) |
151C ------------------------------------------------
152
153
154
155C FIRST FIND S TO Z LIMITS.
156
157 SN1=BIG
158 SN2=BIG
159 SN3=BIG
160 SN4=BIG
161C
162 IF(XT(6).EQ.0.0) GOTO 15
163 SN1=(P(1)-XT(3))/XT(6)
164 SN2=-(P(1)+XT(3))/XT(6)
165 IF(SN1.GE.0.) GOTO 15
166 SNX=SN1
167 SN1=SN2
168 SN2=SNX
16915 CONTINUE
170C
171C NOW Y LIMITS.
172C
173 H0=(P(4)+P(8))*0.5
174C
175 TOP1=H0-DHDZ*XT(3)
176 TOP2=XT(2)-XT(3)*P(3)
177 BOT1=XT(5)-XT(6)*P(3)
178 BOT2=DHDZ*XT(6)
179C
180 IF(BOT1+BOT2.NE.0.0) SN3=(TOP1-TOP2)/(BOT1+BOT2)
181 IF(BOT2-BOT1.NE.0.0) SN4=(TOP1+TOP2)/(BOT2-BOT1)
182C
183C NOW X LIMTS.
184C
185 XL1=(P(5)+P(6)+P(9)+P(10))*0.25
186 XL2=(P(5)-P(6)+P(9)-P(10))*0.25
187 XL3=(P(5)+P(6)-P(9)-P(10))*0.25
188 XL4=(P(5)-P(6)-P(9)+P(10))*0.25
189C
190 CY=XT(2)-XT(3)*P(3)
191 SY=XT(5)-XT(6)*P(3)
192 CH=H0-DHDZ*XT(3)
193C
194 A1=XL4*XT(6)*SY+XL3*XT(6)*XT(6)*DHDZ
195 B1=XL4*(XT(6)*CY+XT(3)*SY)-XL3*XT(6)*(CH-XT(3)*DHDZ)-XL2*P(1)*SY-
196 +XL1*XT(6)*DHDZ*P(1)
197 C1=XL4*CY*XT(3)-XL3*XT(3)*CH-XL2*CY*P(1)+XL1*CH*P(1)
198C
199 CHTAN=(P(7)*P(4)+P(11)*P(8))*0.5
200 SHTAN=-(P(7)*P(4)-P(11)*P(8))*P15
201 CHTAN=CHTAN+SHTAN*XT(3)
202 SHTAN=SHTAN*XT(6)
203 CX=XT(1)-XT(3)*P(2)
204 SX=XT(4)-XT(6)*P(2)
205C
206 A2=-P(1)*(DHDZ*XT(6)*SX+SY*SHTAN)
207 B2=P(1)*(CH*SX-DHDZ*XT(6)*CX-CY*SHTAN-SY*CHTAN)
208 C2=P(1)*(CH*CX-CY*CHTAN)
209C
210 ISN56=0
211 A=A1+A2
212 B=B1+B2
213 C=C1+C2
214 IF(B*B-A*C*4.0.LT.0.0) GO TO 20
215 IF(ABS(A).LT.1.0E-7) GO TO 19
216 DSN=SQRT(B*B-A*C*4.0)
217 SN5=(-B+DSN)*0.5/A
218 SN6=(-B-DSN)*0.5/A
219 ISN56=1
220 GO TO 20
221 19 CONTINUE
222 IF(ABS(B).LT.1.0E-5) GO TO 20
223 ISN56=1
224 SN5=-C/B
225 SN6=-C/B
226 20 CONTINUE
227C
228 ISN78=0
229 A=A1-A2
230 B=B1-B2
231 C=C1-C2
232 IF(B*B-A*C*4.0.LT.0.0) GO TO 30
233 DSN=SQRT(B*B-A*C*4.0)
234 IF(ABS(A).LT.1.0E-7) GO TO 25
235 SN7=(-B+DSN)*0.5/A
236 SN8=(-B-DSN)*0.5/A
237 ISN78=1
238 GO TO 30
239 25 CONTINUE
240 IF(ABS(B).LT.1.0E-5) GO TO 30
241 ISN78=1
242 SN7=-C/B
243 SN8=-C/B
244 30 CONTINUE
245C
246 IF(SN2.GT.0.0.AND.SN2.LT.SN1) SN1=SN2
247 IF(SN3.GT.0.0.AND.SN3.LT.SN1) SN1=SN3
248 IF(SN4.GT.0.0.AND.SN4.LT.SN1) SN1=SN4
249 IF(ISN56.EQ.0) GO TO 40
250 IF(SN5.GT.0.0.AND.SN5.LT.SN1) SN1=SN5
251 IF(SN6.GT.0.0.AND.SN6.LT.SN1) SN1=SN6
252 40 CONTINUE
253 IF(ISN78.EQ.0) GO TO 50
254 IF(SN7.GT.0.0.AND.SN7.LT.SN1) SN1=SN7
255 IF(SN8.GT.0.0.AND.SN8.LT.SN1) SN1=SN8
256 50 CONTINUE
257C
258 SNXT=SN1
259C
260 999 CONTINUE
261 END