]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MINICERN/mathlib/gen/f/tql1.F
Bugfix in AliPoints2Memory
[u/mrichter/AliRoot.git] / MINICERN / mathlib / gen / f / tql1.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 TQL1(N,D,E,IERR)
11       INTEGER I,J,L,M,N,II,MML,IERR
12       REAL D(N),E(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 290 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 210
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   200    CONTINUE
66          E(L) = S * P
67          D(L) = C * P
68          IF (ABS(E(L)) .GT. B) GO TO 130
69   210    P = D(L) + F
70          IF (L .EQ. 1) GO TO 250
71          DO 230 II = 2, L
72             I = L + 2 - II
73             IF (P .GE. D(I-1)) GO TO 270
74             D(I) = D(I-1)
75   230    CONTINUE
76   250    I = 1
77   270    D(I) = P
78   290 CONTINUE
79       GO TO 1001
80  1000 IERR = L
81  1001 RETURN
82       END