]>
Commit | Line | Data |
---|---|---|
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) | |
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 |