/* tred1.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 tred1_(integer *nm, integer *n, doublereal *a, doublereal *d__, doublereal *e, doublereal *e2) { /* System generated locals */ integer a_dim1, a_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; static integer ii, jp1; /* THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TRED1, */ /* 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 */ /* 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 */ /* A CONTAINS INFORMATION ABOUT THE ORTHOGONAL TRANS- */ /* FORMATIONS USED IN THE REDUCTION IN ITS STRICT LOWER */ /* TRIANGLE. THE FULL UPPER TRIANGLE OF A IS UNALTERED. */ /* 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. */ /* E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E. */ /* E2 MAY COINCIDE WITH E IF THE SQUARES ARE NOT NEEDED. */ /* 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 */ --e2; --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__) { d__[i__] = a[*n + i__ * a_dim1]; a[*n + i__ * a_dim1] = a[i__ + i__ * a_dim1]; /* L100: */ } /* .......... FOR I=N STEP -1 UNTIL 1 DO -- .......... */ i__1 = *n; for (ii = 1; ii <= i__1; ++ii) { i__ = *n + 1 - ii; l = i__ - 1; h__ = 0.; scale = 0.; if (l < 1) { 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; } i__2 = l; for (j = 1; j <= i__2; ++j) { d__[j] = a[l + j * a_dim1]; a[l + j * a_dim1] = a[i__ + j * a_dim1]; a[i__ + j * a_dim1] = 0.; /* L125: */ } L130: e[i__] = 0.; e2[i__] = 0.; goto L300; L140: i__2 = l; for (k = 1; k <= i__2; ++k) { d__[k] /= scale; h__ += d__[k] * d__[k]; /* L150: */ } e2[i__] = scale * scale * h__; f = d__[l]; d__1 = sqrt(h__); g = -d_sign(&d__1, &f); e[i__] = scale * g; h__ -= f * g; d__[l] = f - g; if (l == 1) { goto L285; } /* .......... 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]; g = e[j] + a[j + j * a_dim1] * f; jp1 = j + 1; if (l < jp1) { goto L220; } i__3 = l; for (k = jp1; k <= i__3; ++k) { g += a[k + j * a_dim1] * d__[k]; e[k] += a[k + j * a_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: */ } h__ = f / (h__ + h__); /* .......... FORM Q .......... */ i__2 = l; for (j = 1; j <= i__2; ++j) { /* L250: */ e[j] -= h__ * 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: */ a[k + j * a_dim1] = a[k + j * a_dim1] - f * e[k] - g * d__[k]; } /* L280: */ } L285: i__2 = l; for (j = 1; j <= i__2; ++j) { f = d__[j]; d__[j] = a[l + j * a_dim1]; a[l + j * a_dim1] = a[i__ + j * a_dim1]; a[i__ + j * a_dim1] = f * scale; /* L290: */ } L300: ; } return 0; } /* tred1_ */