]> git.uio.no Git - u/mrichter/AliRoot.git/blame - GEANT321/ggeom/gnopar.F
Allow any Cherenkov-like particle to be transported
[u/mrichter/AliRoot.git] / GEANT321 / ggeom / gnopar.F
CommitLineData
fe4da5cc 1*
2* $Id$
3*
4* $Log$
5* Revision 1.1.1.1 1995/10/24 10:20:52 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 GNOPAR (X, PAR, IACT, SNEXT, SNXT, SAFE)
13C.
14C. ******************************************************************
15C. * *
16C. * *
17C. * COMPUTE DISTANCE UP TO INTERSECTION WITH 'PARA' VOLUME, *
18C. * FROM OUTSIDE POINT X(1-3) ALONG DISTANCE X(4-6) *
19C. * *
20C. * PAR (input) : volume parameters *
21C. * IACT (input) : action flag *
22C. * = 0 Compute SAFE only *
23C. * = 1 Compute SAFE, and SNXT only if SNEXT .GT.new SAFE *
24C. * = 2 Compute both SAFE and SNXT *
25C. * = 3 Compute SNXT only *
26C. * SNEXT (input) : see IACT = 1 *
27C. * SNXT (output) : distance to volume boundary *
28C. * SAFE (output) : shortest distance to any boundary *
29C. * *
30C. * ==>Called by : GNEXT, GTNEXT *
31C. * Author A.McPherson ********* *
32C. * *
33C. ******************************************************************
34C.
35#include "geant321/gconsp.inc"
36 DIMENSION X(6), PAR(6)
37C.
38C. -------------------------------------------
39C.
40 SNXT=BIG
41 DN31=-PAR(3)-X(3)
42 DN32=PAR(3)-X(3)
43 YT=X(2)-PAR(6)*X(3)
44 DN21=-PAR(2)-YT
45 DN22=PAR(2)-YT
46 CTY=1.0/SQRT(1.0+PAR(6)**2)
47C
48 XT=X(1)-PAR(5)*X(3)-PAR(4)*YT
49 DN11=-PAR(1)-XT
50 DN12=PAR(1)-XT
51 CTX=1.0/SQRT(1.0+PAR(4)**2+PAR(5)**2)
52C
53 SN3=DN31
54 IF(SN3.LT.0.0) SN3=-DN32
55 SN2=DN21*CTY
56 IF(SN2.LT.0.0) SN2=-DN22*CTY
57 SN1=DN11*CTX
58 IF(SN1.LT.0.0) SN1=-DN12*CTX
59
60 IF (IACT .LT. 3) THEN
61
62
63C -------------------------------------------------
64C | Compute safety-distance 'SAFE' (McPherson) |
65C -------------------------------------------------
66
67 SAFE=MAX(SN1,SN2,SN3)
68C
69C IF(SAFETY.LT.0.0) GO TO 900
70C
71
72 IF (IACT .EQ. 0) GO TO 999
73 IF (IACT .EQ. 1) THEN
74 IF (SNEXT .LT. SAFE) GO TO 999
75 ENDIF
76 ENDIF
77
78
79C ------------------------------------------------
80C | Compute vector-distance 'SNXT' (McPherson) |
81C ------------------------------------------------
82
83
84 IF(X(6).NE.0.0) GO TO 5
85 IF(DN32*DN31.GT.0.0) GO TO 999
86 DN31=0.0
87 DN32=BIG
88 GO TO 10
89 5 CONTINUE
90C
91 DN31=DN31/X(6)
92 DN32=DN32/X(6)
93 IF(X(6).GT.0.0) GO TO 10
94C
95 DNS=DN31
96 DN31=DN32
97 DN32=DNS
98C
99 10 CONTINUE
100C
101 IF(DN32.LE.0.0) GO TO 999
102C
103 DY=X(5)-PAR(6)*X(6)
104C
105 IF(DY.NE.0.0) GO TO 15
106 IF(DN21*DN22.GT.0.0) GO TO 999
107 DN21=0.0
108 DN22=BIG
109 GO TO 20
110 15 CONTINUE
111 DN21=DN21/DY
112 DN22=DN22/DY
113 IF(DY.GT.0.0) GO TO 20
114C
115 DNS=DN21
116 DN21=DN22
117 DN22=DNS
118C
119 20 CONTINUE
120C
121 IF(DN22.LE.0.0) GO TO 999
122C
123 DX=X(4)-PAR(5)*X(6)-PAR(4)*DY
124 IF(DX.NE.0.0) GO TO 25
125 IF(DN11*DN12.GT.0.0) GO TO 999
126 DN11=0.0
127 DN12=BIG
128 GO TO 30
129 25 CONTINUE
130 DN11=DN11/DX
131 DN12=DN12/DX
132 IF(DX.GT.0.0) GO TO 30
133C
134 DNS=DN11
135 DN11=DN12
136 DN12=DNS
137C
138 30 CONTINUE
139C
140 IF(DN12.LE.0.0) GO TO 999
141C
142 SMIN=MAX(DN11,DN21,DN31)
143 SMAX=MIN(DN12,DN22,DN32)
144C
145 IF(SMAX.LE.SMIN) GO TO 999
146C
147 IF(SMIN.LE.0.)GO TO 999
148 SNXT = SMIN
149C
150 999 CONTINUE
151 END