]> git.uio.no Git - u/mrichter/AliRoot.git/blob - GEANT321/ggeom/gnopar.F
Minor corrections after big transformer changes
[u/mrichter/AliRoot.git] / GEANT321 / ggeom / gnopar.F
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)
13 C.
14 C.    ******************************************************************
15 C.    *                                                                *
16 C.    *                                                                *
17 C.    *      COMPUTE DISTANCE UP TO INTERSECTION WITH 'PARA' VOLUME,   *
18 C.    *       FROM OUTSIDE POINT X(1-3) ALONG DISTANCE X(4-6)          *
19 C.    *                                                                *
20 C.    *       PAR   (input)  : volume parameters                       *
21 C.    *       IACT  (input)  : action flag                             *
22 C.    *         = 0  Compute SAFE only                                 *
23 C.    *         = 1  Compute SAFE, and SNXT only if SNEXT .GT.new SAFE *
24 C.    *         = 2  Compute both SAFE and SNXT                        *
25 C.    *         = 3  Compute SNXT only                                 *
26 C.    *       SNEXT (input)  : see IACT = 1                            *
27 C.    *       SNXT  (output) : distance to volume boundary             *
28 C.    *       SAFE  (output) : shortest distance to any boundary       *
29 C.    *                                                                *
30 C.    *    ==>Called by : GNEXT, GTNEXT                                *
31 C.    *         Author  A.McPherson  *********                         *
32 C.    *                                                                *
33 C.    ******************************************************************
34 C.
35 #include "geant321/gconsp.inc"
36       DIMENSION X(6), PAR(6)
37 C.
38 C.    -------------------------------------------
39 C.
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)
47 C
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)
52 C
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  
63 C       -------------------------------------------------
64 C       |  Compute safety-distance 'SAFE' (McPherson)   |
65 C       -------------------------------------------------
66  
67         SAFE=MAX(SN1,SN2,SN3)
68 C
69 C      IF(SAFETY.LT.0.0) GO TO 900
70 C
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  
79 C     ------------------------------------------------
80 C     |  Compute vector-distance 'SNXT' (McPherson)  |
81 C     ------------------------------------------------
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
90 C
91       DN31=DN31/X(6)
92       DN32=DN32/X(6)
93       IF(X(6).GT.0.0) GO TO 10
94 C
95       DNS=DN31
96       DN31=DN32
97       DN32=DNS
98 C
99    10 CONTINUE
100 C
101       IF(DN32.LE.0.0) GO TO 999
102 C
103       DY=X(5)-PAR(6)*X(6)
104 C
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
114 C
115       DNS=DN21
116       DN21=DN22
117       DN22=DNS
118 C
119    20 CONTINUE
120 C
121       IF(DN22.LE.0.0) GO TO 999
122 C
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
133 C
134       DNS=DN11
135       DN11=DN12
136       DN12=DNS
137 C
138    30 CONTINUE
139 C
140       IF(DN12.LE.0.0) GO TO 999
141 C
142       SMIN=MAX(DN11,DN21,DN31)
143       SMAX=MIN(DN12,DN22,DN32)
144 C
145       IF(SMAX.LE.SMIN) GO TO 999
146 C
147       IF(SMIN.LE.0.)GO TO 999
148       SNXT = SMIN
149 C
150   999 CONTINUE
151       END