@process directive('" (') subroutine tred2(nm,n,a,d,e,z) c integer i,j,k,l,n,nm real a(nm,n),d(n),e(n),z(nm,n) real f,g,h,hh,scale 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 two-dimensional c array parameters as declared in the calling program c dimension statement. c c n is the order of the matrix. c c a contains the real symmetric input matrix. only the c lower triangle of the matrix need be supplied. c c on output c c d contains the diagonal elements of the tridiagonal matrix. c c e contains the subdiagonal elements of the tridiagonal c matrix in its last n-1 positions. e(1) is set to zero. c c z contains the orthogonal transformation matrix c produced in the reduction. c c a and z may coincide. if distinct, a is unaltered. c c Questions and comments should be directed to Alan K. Cline, c Pleasant Valley Software, 8603 Altus Cove, Austin, TX 78759. c Electronic mail to cline@cs.utexas.edu. c c this version dated january 1989. (for the IBM 3090vf) c c ------------------------------------------------------------------ c call xuflow(0) do 100 i = 1, n do 100 j = i, n 100 z(j,i) = a(j,i) c do 110 i = 1, n 110 d(i) = a(n,i) c do 300 i = n, 2, -1 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(d(k)) c if (scale .ne. 0.0e0) go to 140 130 e(i) = d(l) c c" ( ignore recrdeps do 135 j = 1, l d(j) = z(l,j) z(i,j) = 0.0e0 z(j,i) = 0.0e0 135 continue c go to 290 c 140 do 150 k = 1, l d(k) = d(k) / scale h = h + d(k) * d(k) 150 continue c f = d(l) g = -sign(sqrt(h),f) e(i) = scale * g h = h - f * g d(l) = f - g c .......... form a*u .......... do 170 j = 1, l 170 e(j) = 0.0e0 c do 240 j = 1, l f = d(j) z(j,i) = f g = e(j) + z(j,j) * f c do 200 k = j+1, l g = g + z(k,j) * d(k) e(k) = e(k) + z(k,j) * f 200 continue c e(j) = g 240 continue c .......... form p .......... f = 0.0e0 c do 245 j = 1, l e(j) = e(j) / h f = f + e(j) * d(j) 245 continue c hh = -f / (h + h) c .......... form q .......... do 250 j = 1, l 250 e(j) = e(j) + hh * d(j) c .......... form reduced a .......... do 280 j = 1, l f = -d(j) g = -e(j) c do 260 k = j, l 260 z(k,j) = z(k,j) + f * e(k) + g * d(k) c d(j) = z(l,j) z(i,j) = 0.0e0 280 continue c 290 d(i) = h 300 continue c .......... accumulation of transformation matrices .......... do 500 i = 2, n l = i - 1 z(n,l) = z(l,l) z(l,l) = 1.0e0 h = d(i) if (h .eq. 0.0e0) go to 380 c do 330 k = 1, l 330 d(k) = z(k,i) / h c" ( ignore recrdeps c" ( prefer vector do 360 j = 1, l g = 0.0e0 c do 340 k = 1, l 340 g = g + z(k,i) * z(k,j) c g = -g c do 350 k = 1, l 350 z(k,j) = z(k,j) + g * d(k) 360 continue c 380 do 400 k = 1, l 400 z(k,i) = 0.0e0 c 500 continue c c" ( prefer vector do 520 i = 1, n d(i) = z(n,i) z(n,i) = 0.0e0 520 continue c z(n,n) = 1.0e0 e(1) = 0.0e0 return end