]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MINICERN/mathlib/gen/f/tql2.F
Bugfix in AliPoints2Memory
[u/mrichter/AliRoot.git] / MINICERN / mathlib / gen / f / tql2.F
1 *
2 * $Id$
3 *
4 * $Log$
5 * Revision 1.1.1.1  1996/04/01 15:02:37  mclareni
6 * Mathlib gen
7 *
8 *
9 #include "gen/pilot.h"
10       SUBROUTINE TQL2(NM,N,D,E,Z,IERR)
11       INTEGER I,J,K,L,M,N,II,NM,MML,IERR
12       REAL D(N),E(N),Z(NM,N)
13       REAL B,C,F,G,H,P,R,S,MACHEP
14 #if defined(CERNLIB_CDC)
15       MACHEP=2.**(-47)
16 #endif
17 #if !defined(CERNLIB_CDC)
18       MACHEP=2.**(-23)
19 #endif
20       IERR = 0
21       IF (N .EQ. 1) GO TO 1001
22       DO 100 I = 2, N
23   100 E(I-1) = E(I)
24       F = 0.0
25       B = 0.0
26       E(N) = 0.0
27       DO 240 L = 1, N
28          J = 0
29          H = MACHEP * (ABS(D(L)) + ABS(E(L)))
30          IF (B .LT. H) B = H
31          DO 110 M = L, N
32             IF (ABS(E(M)) .LE. B) GO TO 120
33   110    CONTINUE
34   120    IF (M .EQ. L) GO TO 220
35   130    IF (J .EQ. 30) GO TO 1000
36          J = J + 1
37          P = (D(L+1) - D(L)) / (2.0 * E(L))
38          R = SQRT(P*P+1.0)
39          H = D(L) - E(L) / (P + SIGN(R,P))
40          DO 140 I = L, N
41   140    D(I) = D(I) - H
42          F = F + H
43          P = D(M)
44          C = 1.0
45          S = 0.0
46          MML = M - L
47          DO 200 II = 1, MML
48             I = M - II
49             G = C * E(I)
50             H = C * P
51             IF (ABS(P) .LT. ABS(E(I))) GO TO 150
52             C = E(I) / P
53             R = SQRT(C*C+1.0)
54             E(I+1) = S * P * R
55             S = C / R
56             C = 1.0 / R
57             GO TO 160
58   150       C = P / E(I)
59             R = SQRT(C*C+1.0)
60             E(I+1) = S * E(I) * R
61             S = 1.0 / R
62             C = C * S
63   160       P = C * D(I) - S * G
64             D(I+1) = H + S * (C * G + S * D(I))
65             DO 180 K = 1, N
66                H = Z(K,I+1)
67                Z(K,I+1) = S * Z(K,I) + C * H
68                Z(K,I) = C * Z(K,I) - S * H
69   180       CONTINUE
70   200    CONTINUE
71          E(L) = S * P
72          D(L) = C * P
73          IF (ABS(E(L)) .GT. B) GO TO 130
74   220    D(L) = D(L) + F
75   240 CONTINUE
76       DO 300 II = 2, N
77          I = II - 1
78          K = I
79          P = D(I)
80          DO 260 J = II, N
81             IF (D(J) .GE. P) GO TO 260
82             K = J
83             P = D(J)
84   260    CONTINUE
85          IF (K .EQ. I) GO TO 300
86          D(K) = D(I)
87          D(I) = P
88          DO 280 J = 1, N
89             P = Z(J,I)
90             Z(J,I) = Z(J,K)
91             Z(J,K) = P
92   280    CONTINUE
93   300 CONTINUE
94       GO TO 1001
95  1000 IERR = L
96  1001 RETURN
97       END