5 * Revision 1.1.1.1 1995/10/24 10:20:53 cernlib
9 #include "geant321/pilot.h"
10 *CMZ : 3.21/02 29/03/94 15.41.29 by S.Giani
12 SUBROUTINE GNOSPH (X, PAR, IACT, SNEXT, SNXT, SAFE)
14 C. ******************************************************************
16 C. * COMPUTE DISTANCE UP TO INTERSECTION WITH 'SPHE' VOLUME, *
17 C. * FROM OUTSIDE POINT X(1-3) ALONG DIRECTION X(4-6)SPHERE *
19 C. * PAR (input) : volume parameters *
20 C. * IACT (input) : action flag *
21 C. * = 0 Compute SAFE only *
22 C. * = 1 Compute SAFE, and SNXT only if SNEXT .GT.new SAFE *
23 C. * = 2 Compute both SAFE and SNXT *
24 C. * = 3 Compute SNXT only *
25 C. * SNEXT (input) : see IACT = 1 *
26 C. * SNXT (output) : distance to volume boundary *
27 C. * SAFE (output) : shortest distance to any boundary *
29 C. * ==>Called by : GNEXT, GTNEXT *
30 C. * Author A.McPherson, P.Weidhaas ********* *
32 C. ******************************************************************
34 #if !defined(CERNLIB_SINGLE)
35 IMPLICIT DOUBLE PRECISION (A-H,O-Z)
37 #include "geant321/gconsp.inc"
38 REAL X(6),PAR(6),SNEXT,SNXT,SAFE
41 C. ----------------------------------------------------------------
45 R2 = X(1)*X(1) + X(2)*X(2) + X(3)*X(3)
50 C -------------------------------------------------
51 C | Compute safety-distance 'SAFE' (P.Weidhaas) |
52 C -------------------------------------------------
58 ELSEIF (R .GT. ROUT) THEN
63 IF (IACT .EQ. 0) GO TO 999
65 IF (SNEXT .LT. SAFE) GO TO 999
70 C ------------------------------------------------
71 C | Compute vector-distance 'SNXT' (McPherson) |
72 C ------------------------------------------------
75 BA=X(1)*X(4)+X(2)*X(5)+X(3)*X(6)
76 IF(R2.GE.PAR(2)*PAR(2).AND.BA.GE.0.0) GO TO 999
80 IF(DISC.LE.0.0) GO TO 999
96 IF(DISC.LE.0.0) GO TO 30
103 C NOW DO THE PHI STUFF.
109 IF(PAR(6)-PAR(5).GE.360.0) GO TO 110
111 DPSGN=X(1)*X(5)-X(2)*X(4)
119 DEN=X(4)*TSGN-X(5)*TCSG
120 IF(DEN.EQ.0.0) GO TO 40
121 SNL=(X(2)*TCSG-X(1)*TSGN)/DEN
122 IF(ABS(TSGN).GT.1.E-6.AND.(X(2)+SNL*X(5))*TSGN.LT.0.) GO TO 40
123 IF(ABS(TCSG).GT.1.E-6.AND.(X(1)+SNL*X(4))*TCSG.LT.0.) GO TO 40
127 IF(DPSGN.GT.0.0) GO TO 40
136 DEN=X(4)*TSGN-X(5)*TCSG
137 IF(DEN.EQ.0.0) GO TO 60
138 SNH=(X(2)*TCSG-X(1)*TSGN)/DEN
139 IF(ABS(TSGN).GT.1.E-6.AND.(X(2)+SNH*X(5))*TSGN.LT.0.) GO TO 60
140 IF(ABS(TCSG).GT.1.E-6.AND.(X(1)+SNH*X(4))*TCSG.LT.0.) GO TO 60
141 IF(DPSGN.LT.0.0) GO TO 50
152 IF(ISMIN.EQ.0.OR.ISMAX.EQ.0) GO TO 80
153 IF(SMAX.LT.0.0.AND.SMAX.GT.SMIN) GO TO 999
154 IF(SMIN.LT.0.0) SMIN=0.0
155 IF(SMAX.LT.0.0) GO TO 100
156 IF(SMAX.GT.SMIN) GO TO 70
158 C SMAX +VE AND LESS THAN SMIN - 2 ALLOWED
169 C SMIN +VE AND SMAX GT SMIN: NORMAL SINGLE
177 IF(ISMIN.EQ.1) GO TO 100
178 IF(ISMAX.EQ.0) GO TO 90
187 C NO SMIN OR SMAX: ALWAYS IN OR ALWAYS OUT.
190 IF(DPH.LT.180.0.AND.DPH.GT.0.0) GO TO 999
191 IF(DPH.LT.-180.0) GO TO 999
207 IF(PAR(4)-PAR(3).GE.180.0) GO TO 360
218 IF(TH.NE.90.0) GO TO 130
219 IF(X(6).EQ.0.0) GO TO 220
230 A=X(4)*X(4)+X(5)*X(5)-TT2*X(6)*X(6)
231 B=X(1)*X(4)+X(2)*X(5)-TT2*X(3)*X(6)
232 C=X(1)*X(1)+X(2)*X(2)-TT2*X(3)*X(3)
234 IF(A.NE.0.0) GO TO 140
235 IF(B.EQ.0.0) GO TO 220
240 IF(Z*TT.LT.0.0) GO TO 220
251 IF(DISC.LT.0.0) GO TO 220
254 IF(DISC.GT.0.0) RDISC=SQRT(DISC)
260 IF(ST.LT.0.0) GO TO 160
262 IF(Z.EQ.0.0.AND.ABS(A).LT.0.0) GO TO 170
263 IF(RDISC.EQ.0.0) GO TO 160
264 IF(Z*TT.LT.0.0) GO TO 160
271 IF(ITRY.EQ.2) GO TO 220
280 IF(IT.NE.1) GO TO 200
281 IF(STST.GT.0.0) GO TO 190
292 IF(STST.GT.0.0) GO TO 210
303 IF(IT.EQ.2) GO TO 230
310 C ORDER THE VARIOUS BOUNDARIES.
313 IF(ITLN.EQ.0.OR.SMNTL.LE.0.0) GO TO 240
319 IF(ITLX.EQ.0.OR.SMXTL.LE.0.0) GO TO 260
321 IF(ICOUNT.EQ.0.OR.SMXTL.GT.SS(1)) GO TO 250
332 IF(ITHN.EQ.0.OR.SMNTH.LE.0.0) GO TO 320
337 IF(ICOUNT.EQ.0) GO TO 310
340 IF(STEST.GT.SS(IC1)) GO TO 290
345 IF(IPL.EQ.ICOUNT+1) GO TO 310
360 IF(IST.EQ.4) GO TO 330
361 IF(ITHX.EQ.0.OR.SMXTH.LE.0.0) GO TO 330
368 C CHECK WHETHER 1ST IS MAX OR MIN.
370 IF(ICOUNT.EQ.0) GO TO 350
371 IF(IS(1).EQ.2.OR.IS(1).EQ.4) GO TO 340
376 IF(ICOUNT.GE.2) SMXT1=SS(2)
377 IF(ICOUNT.LE.2) GO TO 360
381 IF(ICOUNT.GE.4) SMXT2=SS(4)
386 C START WITH MAX SO 1ST MIN IS 0.0
390 IF(ICOUNT.LE.1) GO TO 360
394 IF(ICOUNT.GE.3) SMXT2=SS(3)
399 C NO INTERSECTIONS ALWAYS IN OR ALWAYS OUT.
401 R=X(1)*X(1)+X(2)*X(2)
402 IF(R.GT.0.0) R=SQRT(R)
404 IF(X(3).NE.0.0) TH=ATAN(R/X(3))*RADDEG
405 IF(TH.LT.0.0) TH=180.0+TH
406 IF(TH.LT.PAR(3).OR.TH.GT.PAR(4)) GO TO 999
410 C NOW FIND SMALLEST S ALOWED BY ALL.
412 IF(SMAX1.LE.SMIN1) GO TO 370
424 IF(SMNP1.GT.SMAXR) GO TO 430
425 IF(SMXP1.LT.SMINR) GO TO 390
428 IF(SMNP1.GT.SMIN) SMIN=SMNP1
429 IF(SMXP1.LT.SMAX) SMAX=SMXP1
434 IF(IP2.EQ.0) GO TO 430
435 IF(SMNP2.GT.SMAXR) GO TO 430
436 IF(SMXP2.LT.SMINR) GO TO 430
439 IF(SMNP2.GT.SMIN) SMIN=SMNP2
440 IF(SMXP2.LT.SMAX) SMAX=SMXP2
445 IF(SMNT1.GT.SMAX) GO TO 420
446 IF(SMXT1.LT.SMIN) GO TO 410
447 IF(SMNT1.GT.SMIN) SMIN=SMNT1
451 IF(IT2.EQ.0) GO TO 420
452 IF(SMNT2.GT.SMAX) GO TO 420
453 IF(SMXT2.LT.SMIN) GO TO 420
454 IF(SMNT2.GT.SMIN) SMIN=SMNT2
458 IF(IPT.EQ.1) GO TO 390
460 IF(IRT.EQ.1) GO TO 370
464 IF(SMIN.LE.0.)GO TO 999