/* bakvec.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 bakvec_(integer *nm, integer *n, doublereal *t,
doublereal *e, integer *m, doublereal *z__, integer *ierr)
{
/* System generated locals */
integer t_dim1, t_offset, z_dim1, z_offset, i__1, i__2;
/* Local variables */
static integer i__, j;
/* THIS SUBROUTINE FORMS THE EIGENVECTORS OF A NONSYMMETRIC */
/* TRIDIAGONAL MATRIX BY BACK TRANSFORMING THOSE OF THE */
/* CORRESPONDING SYMMETRIC MATRIX DETERMINED BY FIGI. */
/* 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. */
/* T CONTAINS THE NONSYMMETRIC MATRIX. ITS SUBDIAGONAL IS */
/* STORED IN THE LAST N-1 POSITIONS OF THE FIRST COLUMN, */
/* ITS DIAGONAL IN THE N POSITIONS OF THE SECOND COLUMN, */
/* AND ITS SUPERDIAGONAL IN THE FIRST N-1 POSITIONS OF */
/* THE THIRD COLUMN. T(1,1) AND T(N,3) ARE ARBITRARY. */
/* E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE SYMMETRIC */
/* MATRIX IN ITS LAST N-1 POSITIONS. E(1) IS ARBITRARY. */
/* M IS THE NUMBER OF EIGENVECTORS TO BE BACK TRANSFORMED. */
/* Z CONTAINS THE EIGENVECTORS TO BE BACK TRANSFORMED */
/* IN ITS FIRST M COLUMNS. */
/* ON OUTPUT */
/* T IS UNALTERED. */
/* E IS DESTROYED. */
/* Z CONTAINS THE TRANSFORMED EIGENVECTORS */
/* IN ITS FIRST M COLUMNS. */
/* IERR IS SET TO */
/* ZERO FOR NORMAL RETURN, */
/* 2*N+I IF E(I) IS ZERO WITH T(I,1) OR T(I-1,3) NON-ZERO.
*/
/* IN THIS CASE, THE SYMMETRIC MATRIX IS NOT SIMILAR
*/
/* TO THE ORIGINAL MATRIX, AND THE EIGENVECTORS */
/* CANNOT BE FOUND BY THIS PROGRAM. */
/* 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 */
t_dim1 = *nm;
t_offset = t_dim1 + 1;
t -= t_offset;
--e;
z_dim1 = *nm;
z_offset = z_dim1 + 1;
z__ -= z_offset;
/* Function Body */
*ierr = 0;
if (*m == 0) {
goto L1001;
}
e[1] = 1.;
if (*n == 1) {
goto L1001;
}
i__1 = *n;
for (i__ = 2; i__ <= i__1; ++i__) {
if (e[i__] != 0.) {
goto L80;
}
if (t[i__ + t_dim1] != 0. || t[i__ - 1 + t_dim1 * 3] != 0.) {
goto L1000;
}
e[i__] = 1.;
goto L100;
L80:
e[i__] = e[i__ - 1] * e[i__] / t[i__ - 1 + t_dim1 * 3];
L100:
;
}
i__1 = *m;
for (j = 1; j <= i__1; ++j) {
i__2 = *n;
for (i__ = 2; i__ <= i__2; ++i__) {
z__[i__ + j * z_dim1] *= e[i__];
/* L120: */
}
}
goto L1001;
/* .......... SET ERROR -- EIGENVECTORS CANNOT BE */
/* FOUND BY THIS PROGRAM .......... */
L1000:
*ierr = (*n << 1) + i__;
L1001:
return 0;
} /* bakvec_ */
syntax highlighted by Code2HTML, v. 0.9.1