/* tred2.f -- translated by f2c (version 19961017). You must link the resulting object file with the libraries: -lf2c -lm (in that order) */ #include "f2c.h" /* Subroutine */ int tred2_(integer *nm, integer *n, doublereal *a, doublereal *d__, doublereal *e, doublereal *z__) { /* System generated locals */ integer a_dim1, a_offset, z_dim1, z_offset, i__1, i__2, i__3; doublereal d__1; /* Builtin functions */ double d_sign(doublereal *, doublereal *); /* Local variables */ static doublereal f, g, h__; static integer i__, j, k, l; static doublereal scale, hh; static integer ii, jp1; /* THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TRED2, */ /* NUM. MATH. 11, 181-195(1968) BY MARTIN, REINSCH, AND WILKINSON. */ /* HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971). */ /* THIS SUBROUTINE REDUCES A REAL SYMMETRIC MATRIX TO A */ /* SYMMETRIC TRIDIAGONAL MATRIX USING AND ACCUMULATING */ /* ORTHOGONAL SIMILARITY TRANSFORMATIONS. */ /* ON INPUT */ /* NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */ /* ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */ /* DIMENSION STATEMENT. */ /* N IS THE ORDER OF THE MATRIX. */ /* A CONTAINS THE REAL SYMMETRIC INPUT MATRIX. ONLY THE */ /* LOWER TRIANGLE OF THE MATRIX NEED BE SUPPLIED. */ /* ON OUTPUT */ /* D CONTAINS THE DIAGONAL ELEMENTS OF THE TRIDIAGONAL MATRIX. */ /* E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE TRIDIAGONAL */ /* MATRIX IN ITS LAST N-1 POSITIONS. E(1) IS SET TO ZERO. */ /* Z CONTAINS THE ORTHOGONAL TRANSFORMATION MATRIX */ /* PRODUCED IN THE REDUCTION. */ /* A AND Z MAY COINCIDE. IF DISTINCT, A IS UNALTERED. */ /* QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */ /* MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY */ /* THIS VERSION DATED AUGUST 1983. */ /* ------------------------------------------------------------------ */ /* Parameter adjustments */ z_dim1 = *nm; z_offset = z_dim1 + 1; z__ -= z_offset; --e; --d__; a_dim1 = *nm; a_offset = a_dim1 + 1; a -= a_offset; /* Function Body */ i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { i__2 = *n; for (j = i__; j <= i__2; ++j) { /* L80: */ z__[j + i__ * z_dim1] = a[j + i__ * a_dim1]; } d__[i__] = a[*n + i__ * a_dim1]; /* L100: */ } if (*n == 1) { goto L510; } /* .......... FOR I=N STEP -1 UNTIL 2 DO -- .......... */ i__1 = *n; for (ii = 2; ii <= i__1; ++ii) { i__ = *n + 2 - ii; l = i__ - 1; h__ = 0.; scale = 0.; if (l < 2) { goto L130; } /* .......... SCALE ROW (ALGOL TOL THEN NOT NEEDED) .......... */ i__2 = l; for (k = 1; k <= i__2; ++k) { /* L120: */ scale += (d__1 = d__[k], abs(d__1)); } if (scale != 0.) { goto L140; } L130: e[i__] = d__[l]; i__2 = l; for (j = 1; j <= i__2; ++j) { d__[j] = z__[l + j * z_dim1]; z__[i__ + j * z_dim1] = 0.; z__[j + i__ * z_dim1] = 0.; /* L135: */ } goto L290; L140: i__2 = l; for (k = 1; k <= i__2; ++k) { d__[k] /= scale; h__ += d__[k] * d__[k]; /* L150: */ } f = d__[l]; d__1 = sqrt(h__); g = -d_sign(&d__1, &f); e[i__] = scale * g; h__ -= f * g; d__[l] = f - g; /* .......... FORM A*U .......... */ i__2 = l; for (j = 1; j <= i__2; ++j) { /* L170: */ e[j] = 0.; } i__2 = l; for (j = 1; j <= i__2; ++j) { f = d__[j]; z__[j + i__ * z_dim1] = f; g = e[j] + z__[j + j * z_dim1] * f; jp1 = j + 1; if (l < jp1) { goto L220; } i__3 = l; for (k = jp1; k <= i__3; ++k) { g += z__[k + j * z_dim1] * d__[k]; e[k] += z__[k + j * z_dim1] * f; /* L200: */ } L220: e[j] = g; /* L240: */ } /* .......... FORM P .......... */ f = 0.; i__2 = l; for (j = 1; j <= i__2; ++j) { e[j] /= h__; f += e[j] * d__[j]; /* L245: */ } hh = f / (h__ + h__); /* .......... FORM Q .......... */ i__2 = l; for (j = 1; j <= i__2; ++j) { /* L250: */ e[j] -= hh * d__[j]; } /* .......... FORM REDUCED A .......... */ i__2 = l; for (j = 1; j <= i__2; ++j) { f = d__[j]; g = e[j]; i__3 = l; for (k = j; k <= i__3; ++k) { /* L260: */ z__[k + j * z_dim1] = z__[k + j * z_dim1] - f * e[k] - g * d__[k]; } d__[j] = z__[l + j * z_dim1]; z__[i__ + j * z_dim1] = 0.; /* L280: */ } L290: d__[i__] = h__; /* L300: */ } /* .......... ACCUMULATION OF TRANSFORMATION MATRICES .......... */ i__1 = *n; for (i__ = 2; i__ <= i__1; ++i__) { l = i__ - 1; z__[*n + l * z_dim1] = z__[l + l * z_dim1]; z__[l + l * z_dim1] = 1.; h__ = d__[i__]; if (h__ == 0.) { goto L380; } i__2 = l; for (k = 1; k <= i__2; ++k) { /* L330: */ d__[k] = z__[k + i__ * z_dim1] / h__; } i__2 = l; for (j = 1; j <= i__2; ++j) { g = 0.; i__3 = l; for (k = 1; k <= i__3; ++k) { /* L340: */ g += z__[k + i__ * z_dim1] * z__[k + j * z_dim1]; } i__3 = l; for (k = 1; k <= i__3; ++k) { z__[k + j * z_dim1] -= g * d__[k]; /* L360: */ } } L380: i__3 = l; for (k = 1; k <= i__3; ++k) { /* L400: */ z__[k + i__ * z_dim1] = 0.; } /* L500: */ } L510: i__1 = *n; for (i__ = 1; i__ <= i__1; ++i__) { d__[i__] = z__[*n + i__ * z_dim1]; z__[*n + i__ * z_dim1] = 0.; /* L520: */ } z__[*n + *n * z_dim1] = 1.; e[1] = 0.; return 0; } /* tred2_ */