/* reduc2.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 reduc2_(integer *nm, integer *n, doublereal *a,
doublereal *b, doublereal *dl, integer *ierr)
{
/* System generated locals */
integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3;
/* Builtin functions */
double sqrt(doublereal);
/* Local variables */
static integer i__, j, k;
static doublereal x, y;
static integer i1, j1, nn;
/* THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE REDUC2, */
/* NUM. MATH. 11, 99-110(1968) BY MARTIN AND WILKINSON. */
/* HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 303-314(1971). */
/* THIS SUBROUTINE REDUCES THE GENERALIZED SYMMETRIC EIGENPROBLEMS */
/* ABX=(LAMBDA)X OR BAY=(LAMBDA)Y, WHERE B IS POSITIVE DEFINITE, */
/* TO THE STANDARD SYMMETRIC EIGENPROBLEM USING THE CHOLESKY */
/* FACTORIZATION OF B. */
/* 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 MATRICES A AND B. IF THE CHOLESKY */
/* FACTOR L OF B IS ALREADY AVAILABLE, N SHOULD BE PREFIXED */
/* WITH A MINUS SIGN. */
/* A AND B CONTAIN THE REAL SYMMETRIC INPUT MATRICES. ONLY THE */
/* FULL UPPER TRIANGLES OF THE MATRICES NEED BE SUPPLIED. IF */
/* N IS NEGATIVE, THE STRICT LOWER TRIANGLE OF B CONTAINS, */
/* INSTEAD, THE STRICT LOWER TRIANGLE OF ITS CHOLESKY FACTOR L.
*/
/* DL CONTAINS, IF N IS NEGATIVE, THE DIAGONAL ELEMENTS OF L. */
/* ON OUTPUT */
/* A CONTAINS IN ITS FULL LOWER TRIANGLE THE FULL LOWER TRIANGLE */
/* OF THE SYMMETRIC MATRIX DERIVED FROM THE REDUCTION TO THE */
/* STANDARD FORM. THE STRICT UPPER TRIANGLE OF A IS UNALTERED.
*/
/* B CONTAINS IN ITS STRICT LOWER TRIANGLE THE STRICT LOWER */
/* TRIANGLE OF ITS CHOLESKY FACTOR L. THE FULL UPPER */
/* TRIANGLE OF B IS UNALTERED. */
/* DL CONTAINS THE DIAGONAL ELEMENTS OF L. */
/* IERR IS SET TO */
/* ZERO FOR NORMAL RETURN, */
/* 7*N+1 IF B IS NOT POSITIVE DEFINITE. */
/* 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 */
--dl;
b_dim1 = *nm;
b_offset = b_dim1 + 1;
b -= b_offset;
a_dim1 = *nm;
a_offset = a_dim1 + 1;
a -= a_offset;
/* Function Body */
*ierr = 0;
nn = abs(*n);
if (*n < 0) {
goto L100;
}
/* .......... FORM L IN THE ARRAYS B AND DL .......... */
i__1 = *n;
for (i__ = 1; i__ <= i__1; ++i__) {
i1 = i__ - 1;
i__2 = *n;
for (j = i__; j <= i__2; ++j) {
x = b[i__ + j * b_dim1];
if (i__ == 1) {
goto L40;
}
i__3 = i1;
for (k = 1; k <= i__3; ++k) {
/* L20: */
x -= b[i__ + k * b_dim1] * b[j + k * b_dim1];
}
L40:
if (j != i__) {
goto L60;
}
if (x <= 0.) {
goto L1000;
}
y = sqrt(x);
dl[i__] = y;
goto L80;
L60:
b[j + i__ * b_dim1] = x / y;
L80:
;
}
}
/* .......... FORM THE LOWER TRIANGLE OF A*L */
/* IN THE LOWER TRIANGLE OF THE ARRAY A .......... */
L100:
i__2 = nn;
for (i__ = 1; i__ <= i__2; ++i__) {
i1 = i__ + 1;
i__1 = i__;
for (j = 1; j <= i__1; ++j) {
x = a[j + i__ * a_dim1] * dl[j];
if (j == i__) {
goto L140;
}
j1 = j + 1;
i__3 = i__;
for (k = j1; k <= i__3; ++k) {
/* L120: */
x += a[k + i__ * a_dim1] * b[k + j * b_dim1];
}
L140:
if (i__ == nn) {
goto L180;
}
i__3 = nn;
for (k = i1; k <= i__3; ++k) {
/* L160: */
x += a[i__ + k * a_dim1] * b[k + j * b_dim1];
}
L180:
a[i__ + j * a_dim1] = x;
/* L200: */
}
}
/* .......... PRE-MULTIPLY BY TRANSPOSE(L) AND OVERWRITE .......... */
i__1 = nn;
for (i__ = 1; i__ <= i__1; ++i__) {
i1 = i__ + 1;
y = dl[i__];
i__2 = i__;
for (j = 1; j <= i__2; ++j) {
x = y * a[i__ + j * a_dim1];
if (i__ == nn) {
goto L280;
}
i__3 = nn;
for (k = i1; k <= i__3; ++k) {
/* L260: */
x += a[k + j * a_dim1] * b[k + i__ * b_dim1];
}
L280:
a[i__ + j * a_dim1] = x;
/* L300: */
}
}
goto L1001;
/* .......... SET ERROR -- B IS NOT POSITIVE DEFINITE .......... */
L1000:
*ierr = *n * 7 + 1;
L1001:
return 0;
} /* reduc2_ */
syntax highlighted by Code2HTML, v. 0.9.1