This commit was generated by cvs2svn to compensate for changes in r2,
[u/mrichter/AliRoot.git] / MINICERN / mathlib / gen / f / imtql2.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 IMTQL2(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,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       E(N) = 0.0
25       DO 240 L = 1, N
26          J = 0
27   105    DO 110 M = L, N
28             IF (M .EQ. N) GO TO 120
29             IF (ABS(E(M)) .LE. MACHEP * (ABS(D(M)) + ABS(D(M+1))))
30      X         GO TO 120
31   110    CONTINUE
32   120    P = D(L)
33          IF (M .EQ. L) GO TO 240
34          IF (J .EQ. 30) GO TO 1000
35          J = J + 1
36          G = (D(L+1) - P) / (2.0 * E(L))
37          R = SQRT(G*G+1.0)
38          G = D(M) - P + E(L) / (G + SIGN(R,G))
39          S = 1.0
40          C = 1.0
41          P = 0.0
42          MML = M - L
43          DO 200 II = 1, MML
44             I = M - II
45             F = S * E(I)
46             B = C * E(I)
47             IF (ABS(F) .LT. ABS(G)) GO TO 150
48             C = G / F
49             R = SQRT(C*C+1.0)
50             E(I+1) = F * R
51             S = 1.0 / R
52             C = C * S
53             GO TO 160
54   150       S = F / G
55             R = SQRT(S*S+1.0)
56             E(I+1) = G * R
57             C = 1.0 / R
58             S = S * C
59   160       G = D(I+1) - P
60             R = (D(I) - G) * S + 2.0 * C * B
61             P = S * R
62             D(I+1) = G + P
63             G = C * R - B
64             DO 180 K = 1, N
65                F = Z(K,I+1)
66                Z(K,I+1) = S * Z(K,I) + C * F
67                Z(K,I) = C * Z(K,I) - S * F
68   180       CONTINUE
69   200    CONTINUE
70          D(L) = D(L) - P
71          E(L) = G
72          E(M) = 0.0
73          GO TO 105
74   240 CONTINUE
75       DO 300 II = 2, N
76          I = II - 1
77          K = I
78          P = D(I)
79          DO 260 J = II, N
80             IF (D(J) .GE. P) GO TO 260
81             K = J
82             P = D(J)
83   260    CONTINUE
84          IF (K .EQ. I) GO TO 300
85          D(K) = D(I)
86          D(I) = P
87          DO 280 J = 1, N
88             P = Z(J,I)
89             Z(J,I) = Z(J,K)
90             Z(J,K) = P
91   280    CONTINUE
92   300 CONTINUE
93       GO TO 1001
94  1000 IERR = L
95  1001 RETURN
96       END