]> git.uio.no Git - u/mrichter/AliRoot.git/blob - GEANT321/ggeom/gvpsqr.F
Allow any Cherenkov-like particle to be transported
[u/mrichter/AliRoot.git] / GEANT321 / ggeom / gvpsqr.F
1 *
2 * $Id$
3 *
4 * $Log$
5 * Revision 1.1.1.1  1995/10/24 10:20:57  cernlib
6 * Geant
7 *
8 *
9 #include "geant321/pilot.h"
10 *CMZ :  3.21/02 29/03/94  15.41.31  by  S.Giani
11 *-- Author :
12 *
13       SUBROUTINE GVPSQR (CBA, SOL, NSOL)
14 ************************************************************************
15 *                                                                      *
16 *     SUBROUTINE GVPSQR (CBA,SOL,NSOL)             870924  VP          *
17 *                                                                      *
18 *       SOLVE  QUADRATIC  EQUATION                                     *
19 *                                                                      *
20 *   ARGUMENTS:                                                         *
21 *       CBA     Array of coeff's A0 + A1*x + A2*x**2                   *
22 *       SOL     Solutions                                              *
23 *       NSOL    Number of solutions :                                  *
24 *               if zero - SOL(1)= extremum                             *
25 *               if -ve  - No solution at all                           *
26 *                                                                      *
27 ************************************************************************
28  
29       PARAMETER      (ZERO2=1.E-12)
30       REAL           CBA(3), SOL(2), SWAP
31 *-----------------------------------------------------------------------
32  
33       A = CBA(3)
34       B = CBA(2)*.5
35       C = CBA(1)
36       IF (B.LT.0.)              THEN
37         A = -A
38         B = -B
39         C = -C
40       ENDIF
41  
42       AMX = MAX (ABS(A),ABS(B),ABS(C))
43       IF (AMX.LE.0.)            GO TO 100
44       A   = A/AMX
45       B   = B/AMX
46       C   = C/AMX
47  
48       DIS = B**2 - A*C
49       NSOL = 1
50       IF (ABS(DIS) .LE. ZERO2)  DIS = 0.
51       IF (DIS.LT.0.)            THEN
52         NSOL = 0
53         DIS  = 0.
54       ENDIF
55  
56       IF (DIS.GT.0.)            DIS = SQRT(DIS)
57       BDIS = B + DIS
58       IF (ABS(C).GT.1.E+10*BDIS)        GO TO 100
59       SOL(1) = 0.
60       IF (ABS(BDIS).LE.0.)      GO TO 999
61       SOL(1) = (-C/BDIS)
62       IF (DIS.LE.0.)            GO TO 999
63       IF (BDIS.GE.1.E+10*ABS(A))        GO TO 999
64       NSOL   = 2
65       SOL(2) = (-BDIS/A)
66       IF (SOL(1).GT.SOL(2))     THEN
67         SWAP = SOL(1)
68         SOL(1) = SOL(2)
69         SOL(2) = SWAP
70       ENDIF
71       GO TO 999
72  
73 *
74 **      No solutions
75   100 NSOL = -1
76  
77   999 RETURN
78       END