1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
|
*DECK TRED2
SUBROUTINE TRED2 (NM, N, A, D, E, Z)
C***BEGIN PROLOGUE TRED2
C***PURPOSE Reduce a real symmetric matrix to a symmetric tridiagonal
C matrix using and accumulating orthogonal transformations.
C***LIBRARY SLATEC (EISPACK)
C***CATEGORY D4C1B1
C***TYPE SINGLE PRECISION (TRED2-S)
C***KEYWORDS EIGENVALUES, EIGENVECTORS, EISPACK
C***AUTHOR Smith, B. T., et al.
C***DESCRIPTION
C
C This subroutine is a translation of the ALGOL procedure TRED2,
C NUM. MATH. 11, 181-195(1968) by Martin, Reinsch, and Wilkinson.
C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971).
C
C This subroutine reduces a REAL SYMMETRIC matrix to a
C symmetric tridiagonal matrix using and accumulating
C orthogonal similarity transformations.
C
C On Input
C
C NM must be set to the row dimension of the two-dimensional
C array parameters, A and Z, as declared in the calling
C program dimension statement. NM is an INTEGER variable.
C
C N is the order of the matrix A. N is an INTEGER variable.
C N must be less than or equal to NM.
C
C A contains the real symmetric input matrix. Only the lower
C triangle of the matrix need be supplied. A is a two-
C dimensional REAL array, dimensioned A(NM,N).
C
C On Output
C
C D contains the diagonal elements of the symmetric tridiagonal
C matrix. D is a one-dimensional REAL array, dimensioned D(N).
C
C E contains the subdiagonal elements of the symmetric
C tridiagonal matrix in its last N-1 positions. E(1) is set
C to zero. E is a one-dimensional REAL array, dimensioned
C E(N).
C
C Z contains the orthogonal transformation matrix produced in
C the reduction. Z is a two-dimensional REAL array,
C dimensioned Z(NM,N).
C
C A and Z may coincide. If distinct, A is unaltered.
C
C Questions and comments should be directed to B. S. Garbow,
C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY
C ------------------------------------------------------------------
C
C***REFERENCES B. T. Smith, J. M. Boyle, J. J. Dongarra, B. S. Garbow,
C Y. Ikebe, V. C. Klema and C. B. Moler, Matrix Eigen-
C system Routines - EISPACK Guide, Springer-Verlag,
C 1976.
C***ROUTINES CALLED (NONE)
C***REVISION HISTORY (YYMMDD)
C 760101 DATE WRITTEN
C 890831 Modified array declarations. (WRB)
C 890831 REVISION DATE from Version 3.2
C 891214 Prologue converted to Version 4.0 format. (BAB)
C 920501 Reformatted the REFERENCES section. (WRB)
C***END PROLOGUE TRED2
C
INTEGER I,J,K,L,N,II,NM,JP1
REAL A(NM,*),D(*),E(*),Z(NM,*)
REAL F,G,H,HH,SCALE
C
C***FIRST EXECUTABLE STATEMENT TRED2
DO 100 I = 1, N
C
DO 100 J = 1, I
Z(I,J) = A(I,J)
100 CONTINUE
C
IF (N .EQ. 1) GO TO 320
C .......... FOR I=N STEP -1 UNTIL 2 DO -- ..........
DO 300 II = 2, N
I = N + 2 - II
L = I - 1
H = 0.0E0
SCALE = 0.0E0
IF (L .LT. 2) GO TO 130
C .......... SCALE ROW (ALGOL TOL THEN NOT NEEDED) ..........
DO 120 K = 1, L
120 SCALE = SCALE + ABS(Z(I,K))
C
IF (SCALE .NE. 0.0E0) GO TO 140
130 E(I) = Z(I,L)
GO TO 290
C
140 DO 150 K = 1, L
Z(I,K) = Z(I,K) / SCALE
H = H + Z(I,K) * Z(I,K)
150 CONTINUE
C
F = Z(I,L)
G = -SIGN(SQRT(H),F)
E(I) = SCALE * G
H = H - F * G
Z(I,L) = F - G
F = 0.0E0
C
DO 240 J = 1, L
Z(J,I) = Z(I,J) / H
G = 0.0E0
C .......... FORM ELEMENT OF A*U ..........
DO 180 K = 1, J
180 G = G + Z(J,K) * Z(I,K)
C
JP1 = J + 1
IF (L .LT. JP1) GO TO 220
C
DO 200 K = JP1, L
200 G = G + Z(K,J) * Z(I,K)
C .......... FORM ELEMENT OF P ..........
220 E(J) = G / H
F = F + E(J) * Z(I,J)
240 CONTINUE
C
HH = F / (H + H)
C .......... FORM REDUCED A ..........
DO 260 J = 1, L
F = Z(I,J)
G = E(J) - HH * F
E(J) = G
C
DO 260 K = 1, J
Z(J,K) = Z(J,K) - F * E(K) - G * Z(I,K)
260 CONTINUE
C
290 D(I) = H
300 CONTINUE
C
320 D(1) = 0.0E0
E(1) = 0.0E0
C .......... ACCUMULATION OF TRANSFORMATION MATRICES ..........
DO 500 I = 1, N
L = I - 1
IF (D(I) .EQ. 0.0E0) GO TO 380
C
DO 360 J = 1, L
G = 0.0E0
C
DO 340 K = 1, L
340 G = G + Z(I,K) * Z(K,J)
C
DO 360 K = 1, L
Z(K,J) = Z(K,J) - G * Z(K,I)
360 CONTINUE
C
380 D(I) = Z(I,I)
Z(I,I) = 1.0E0
IF (L .LT. 1) GO TO 500
C
DO 400 J = 1, L
Z(I,J) = 0.0E0
Z(J,I) = 0.0E0
400 CONTINUE
C
500 CONTINUE
C
RETURN
END
|