Skip to content

AFNI/NIfTI Server

Sections
Personal tools
You are here: Home » AFNI » Documentation

Doxygen Source Code Documentation


Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search  

eispack.h File Reference

#include "f2c.h"

Go to the source code of this file.


Functions

int bakvec_ (integer *nm, integer *n, doublereal *t, doublereal *e, integer *m, doublereal *z__, integer *ierr)
int balanc_ (integer *nm, integer *n, doublereal *a, integer *low, integer *igh, doublereal *scale)
int balbak_ (integer *nm, integer *n, integer *low, integer *igh, doublereal *scale, integer *m, doublereal *z__)
int bandr_ (integer *nm, integer *n, integer *mb, doublereal *a, doublereal *d__, doublereal *e, doublereal *e2, logical *matz, doublereal *z__)
int bandv_ (integer *nm, integer *n, integer *mbw, doublereal *a, doublereal *e21, integer *m, doublereal *w, doublereal *z__, integer *ierr, integer *nv, doublereal *rv, doublereal *rv6)
int bisect_ (integer *n, doublereal *eps1, doublereal *d__, doublereal *e, doublereal *e2, doublereal *lb, doublereal *ub, integer *mm, integer *m, doublereal *w, integer *ind, integer *ierr, doublereal *rv4, doublereal *rv5)
int bqr_ (integer *nm, integer *n, integer *mb, doublereal *a, doublereal *t, doublereal *r__, integer *ierr, integer *nv, doublereal *rv)
int cbabk2_ (integer *nm, integer *n, integer *low, integer *igh, doublereal *scale, integer *m, doublereal *zr, doublereal *zi)
int cbal_ (integer *nm, integer *n, doublereal *ar, doublereal *ai, integer *low, integer *igh, doublereal *scale)
int cdiv_ (doublereal *ar, doublereal *ai, doublereal *br, doublereal *bi, doublereal *cr, doublereal *ci)
int cg_ (integer *nm, integer *n, doublereal *ar, doublereal *ai, doublereal *wr, doublereal *wi, integer *matz, doublereal *zr, doublereal *zi, doublereal *fv1, doublereal *fv2, doublereal *fv3, integer *ierr)
int ch_ (integer *nm, integer *n, doublereal *ar, doublereal *ai, doublereal *w, integer *matz, doublereal *zr, doublereal *zi, doublereal *fv1, doublereal *fv2, doublereal *fm1, integer *ierr)
int cinvit_ (integer *nm, integer *n, doublereal *ar, doublereal *ai, doublereal *wr, doublereal *wi, logical *select, integer *mm, integer *m, doublereal *zr, doublereal *zi, integer *ierr, doublereal *rm1, doublereal *rm2, doublereal *rv1, doublereal *rv2)
int combak_ (integer *nm, integer *low, integer *igh, doublereal *ar, doublereal *ai, integer *int__, integer *m, doublereal *zr, doublereal *zi)
int comhes_ (integer *nm, integer *n, integer *low, integer *igh, doublereal *ar, doublereal *ai, integer *int__)
int comlr_ (integer *nm, integer *n, integer *low, integer *igh, doublereal *hr, doublereal *hi, doublereal *wr, doublereal *wi, integer *ierr)
int comlr2_ (integer *nm, integer *n, integer *low, integer *igh, integer *int__, doublereal *hr, doublereal *hi, doublereal *wr, doublereal *wi, doublereal *zr, doublereal *zi, integer *ierr)
int comqr_ (integer *nm, integer *n, integer *low, integer *igh, doublereal *hr, doublereal *hi, doublereal *wr, doublereal *wi, integer *ierr)
int comqr2_ (integer *nm, integer *n, integer *low, integer *igh, doublereal *ortr, doublereal *orti, doublereal *hr, doublereal *hi, doublereal *wr, doublereal *wi, doublereal *zr, doublereal *zi, integer *ierr)
int cortb_ (integer *nm, integer *low, integer *igh, doublereal *ar, doublereal *ai, doublereal *ortr, doublereal *orti, integer *m, doublereal *zr, doublereal *zi)
int corth_ (integer *nm, integer *n, integer *low, integer *igh, doublereal *ar, doublereal *ai, doublereal *ortr, doublereal *orti)
int csroot_ (doublereal *xr, doublereal *xi, doublereal *yr, doublereal *yi)
int elmbak_ (integer *nm, integer *low, integer *igh, doublereal *a, integer *int__, integer *m, doublereal *z__)
int elmhes_ (integer *nm, integer *n, integer *low, integer *igh, doublereal *a, integer *int__)
int eltran_ (integer *nm, integer *n, integer *low, integer *igh, doublereal *a, integer *int__, doublereal *z__)
doublereal epslon_ (doublereal *x)
int figi_ (integer *nm, integer *n, doublereal *t, doublereal *d__, doublereal *e, doublereal *e2, integer *ierr)
int figi2_ (integer *nm, integer *n, doublereal *t, doublereal *d__, doublereal *e, doublereal *z__, integer *ierr)
int hqr_ (integer *nm, integer *n, integer *low, integer *igh, doublereal *h__, doublereal *wr, doublereal *wi, integer *ierr)
int hqr2_ (integer *nm, integer *n, integer *low, integer *igh, doublereal *h__, doublereal *wr, doublereal *wi, doublereal *z__, integer *ierr)
int htrib3_ (integer *nm, integer *n, doublereal *a, doublereal *tau, integer *m, doublereal *zr, doublereal *zi)
int htribk_ (integer *nm, integer *n, doublereal *ar, doublereal *ai, doublereal *tau, integer *m, doublereal *zr, doublereal *zi)
int htrid3_ (integer *nm, integer *n, doublereal *a, doublereal *d__, doublereal *e, doublereal *e2, doublereal *tau)
int htridi_ (integer *nm, integer *n, doublereal *ar, doublereal *ai, doublereal *d__, doublereal *e, doublereal *e2, doublereal *tau)
int imtql1_ (integer *n, doublereal *d__, doublereal *e, integer *ierr)
int imtql2_ (integer *nm, integer *n, doublereal *d__, doublereal *e, doublereal *z__, integer *ierr)
int imtqlv_ (integer *n, doublereal *d__, doublereal *e, doublereal *e2, doublereal *w, integer *ind, integer *ierr, doublereal *rv1)
int invit_ (integer *nm, integer *n, doublereal *a, doublereal *wr, doublereal *wi, logical *select, integer *mm, integer *m, doublereal *z__, integer *ierr, doublereal *rm1, doublereal *rv1, doublereal *rv2)
int minfit_ (integer *nm, integer *m, integer *n, doublereal *a, doublereal *w, integer *ip, doublereal *b, integer *ierr, doublereal *rv1)
int ortbak_ (integer *nm, integer *low, integer *igh, doublereal *a, doublereal *ort, integer *m, doublereal *z__)
int orthes_ (integer *nm, integer *n, integer *low, integer *igh, doublereal *a, doublereal *ort)
int ortran_ (integer *nm, integer *n, integer *low, integer *igh, doublereal *a, doublereal *ort, doublereal *z__)
doublereal pythag_ (doublereal *a, doublereal *b)
int qzhes_ (integer *nm, integer *n, doublereal *a, doublereal *b, logical *matz, doublereal *z__)
int qzit_ (integer *nm, integer *n, doublereal *a, doublereal *b, doublereal *eps1, logical *matz, doublereal *z__, integer *ierr)
int qzval_ (integer *nm, integer *n, doublereal *a, doublereal *b, doublereal *alfr, doublereal *alfi, doublereal *beta, logical *matz, doublereal *z__)
int qzvec_ (integer *nm, integer *n, doublereal *a, doublereal *b, doublereal *alfr, doublereal *alfi, doublereal *beta, doublereal *z__)
int ratqr_ (integer *n, doublereal *eps1, doublereal *d__, doublereal *e, doublereal *e2, integer *m, doublereal *w, integer *ind, doublereal *bd, logical *type__, integer *idef, integer *ierr)
int rebak_ (integer *nm, integer *n, doublereal *b, doublereal *dl, integer *m, doublereal *z__)
int rebakb_ (integer *nm, integer *n, doublereal *b, doublereal *dl, integer *m, doublereal *z__)
int reduc_ (integer *nm, integer *n, doublereal *a, doublereal *b, doublereal *dl, integer *ierr)
int reduc2_ (integer *nm, integer *n, doublereal *a, doublereal *b, doublereal *dl, integer *ierr)
int rg_ (integer *nm, integer *n, doublereal *a, doublereal *wr, doublereal *wi, integer *matz, doublereal *z__, integer *iv1, doublereal *fv1, integer *ierr)
int rgg_ (integer *nm, integer *n, doublereal *a, doublereal *b, doublereal *alfr, doublereal *alfi, doublereal *beta, integer *matz, doublereal *z__, integer *ierr)
int rs_ (integer *nm, integer *n, doublereal *a, doublereal *w, integer *matz, doublereal *z__, doublereal *fv1, doublereal *fv2, integer *ierr)
int rsb_ (integer *nm, integer *n, integer *mb, doublereal *a, doublereal *w, integer *matz, doublereal *z__, doublereal *fv1, doublereal *fv2, integer *ierr)
int rsg_ (integer *nm, integer *n, doublereal *a, doublereal *b, doublereal *w, integer *matz, doublereal *z__, doublereal *fv1, doublereal *fv2, integer *ierr)
int rsgab_ (integer *nm, integer *n, doublereal *a, doublereal *b, doublereal *w, integer *matz, doublereal *z__, doublereal *fv1, doublereal *fv2, integer *ierr)
int rsgba_ (integer *nm, integer *n, doublereal *a, doublereal *b, doublereal *w, integer *matz, doublereal *z__, doublereal *fv1, doublereal *fv2, integer *ierr)
int rsm_ (integer *nm, integer *n, doublereal *a, doublereal *w, integer *m, doublereal *z__, doublereal *fwork, integer *iwork, integer *ierr)
int rsp_ (integer *nm, integer *n, integer *nv, doublereal *a, doublereal *w, integer *matz, doublereal *z__, doublereal *fv1, doublereal *fv2, integer *ierr)
int rst_ (integer *nm, integer *n, doublereal *w, doublereal *e, integer *matz, doublereal *z__, integer *ierr)
int rt_ (integer *nm, integer *n, doublereal *a, doublereal *w, integer *matz, doublereal *z__, doublereal *fv1, integer *ierr)
int svd_ (integer *m, integer *n, integer *lda, doublereal *a, doublereal *w, logical *matu, integer *ldu, doublereal *u, logical *matv, integer *ldv, doublereal *v, integer *ierr, doublereal *rv1)
int tql1_ (integer *n, doublereal *d__, doublereal *e, integer *ierr)
int tql2_ (integer *nm, integer *n, doublereal *d__, doublereal *e, doublereal *z__, integer *ierr)
int tqlrat_ (integer *n, doublereal *d__, doublereal *e2, integer *ierr)
int trbak1_ (integer *nm, integer *n, doublereal *a, doublereal *e, integer *m, doublereal *z__)
int trbak3_ (integer *nm, integer *n, integer *nv, doublereal *a, integer *m, doublereal *z__)
int tred1_ (integer *nm, integer *n, doublereal *a, doublereal *d__, doublereal *e, doublereal *e2)
int tred2_ (integer *nm, integer *n, doublereal *a, doublereal *d__, doublereal *e, doublereal *z__)
int tred3_ (integer *n, integer *nv, doublereal *a, doublereal *d__, doublereal *e, doublereal *e2)
int tridib_ (integer *n, doublereal *eps1, doublereal *d__, doublereal *e, doublereal *e2, doublereal *lb, doublereal *ub, integer *m11, integer *m, doublereal *w, integer *ind, integer *ierr, doublereal *rv4, doublereal *rv5)
int tsturm_ (integer *nm, integer *n, doublereal *eps1, doublereal *d__, doublereal *e, doublereal *e2, doublereal *lb, doublereal *ub, integer *mm, integer *m, doublereal *w, doublereal *z__, integer *ierr, doublereal *rv1, doublereal *rv2, doublereal *rv3, doublereal *rv4, doublereal *rv5, doublereal *rv6)

Function Documentation

int bakvec_ integer   nm,
integer   n,
doublereal   t,
doublereal   e,
integer   m,
doublereal   z__,
integer   ierr
 

Definition at line 8 of file eis_bakvec.c.

00010 {
00011     /* System generated locals */
00012     integer t_dim1, t_offset, z_dim1, z_offset, i__1, i__2;
00013 
00014     /* Local variables */
00015     static integer i__, j;
00016 
00017 
00018 
00019 /*     THIS SUBROUTINE FORMS THE EIGENVECTORS OF A NONSYMMETRIC */
00020 /*     TRIDIAGONAL MATRIX BY BACK TRANSFORMING THOSE OF THE */
00021 /*     CORRESPONDING SYMMETRIC MATRIX DETERMINED BY  FIGI. */
00022 
00023 /*     ON INPUT */
00024 
00025 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00026 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00027 /*          DIMENSION STATEMENT. */
00028 
00029 /*        N IS THE ORDER OF THE MATRIX. */
00030 
00031 /*        T CONTAINS THE NONSYMMETRIC MATRIX.  ITS SUBDIAGONAL IS */
00032 /*          STORED IN THE LAST N-1 POSITIONS OF THE FIRST COLUMN, */
00033 /*          ITS DIAGONAL IN THE N POSITIONS OF THE SECOND COLUMN, */
00034 /*          AND ITS SUPERDIAGONAL IN THE FIRST N-1 POSITIONS OF */
00035 /*          THE THIRD COLUMN.  T(1,1) AND T(N,3) ARE ARBITRARY. */
00036 
00037 /*        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE SYMMETRIC */
00038 /*          MATRIX IN ITS LAST N-1 POSITIONS.  E(1) IS ARBITRARY. */
00039 
00040 /*        M IS THE NUMBER OF EIGENVECTORS TO BE BACK TRANSFORMED. */
00041 
00042 /*        Z CONTAINS THE EIGENVECTORS TO BE BACK TRANSFORMED */
00043 /*          IN ITS FIRST M COLUMNS. */
00044 
00045 /*     ON OUTPUT */
00046 
00047 /*        T IS UNALTERED. */
00048 
00049 /*        E IS DESTROYED. */
00050 
00051 /*        Z CONTAINS THE TRANSFORMED EIGENVECTORS */
00052 /*          IN ITS FIRST M COLUMNS. */
00053 
00054 /*        IERR IS SET TO */
00055 /*          ZERO       FOR NORMAL RETURN, */
00056 /*          2*N+I      IF E(I) IS ZERO WITH T(I,1) OR T(I-1,3) NON-ZERO. 
00057 */
00058 /*                     IN THIS CASE, THE SYMMETRIC MATRIX IS NOT SIMILAR 
00059 */
00060 /*                     TO THE ORIGINAL MATRIX, AND THE EIGENVECTORS */
00061 /*                     CANNOT BE FOUND BY THIS PROGRAM. */
00062 
00063 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00064 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00065 */
00066 
00067 /*     THIS VERSION DATED AUGUST 1983. */
00068 
00069 /*     ------------------------------------------------------------------ 
00070 */
00071 
00072     /* Parameter adjustments */
00073     t_dim1 = *nm;
00074     t_offset = t_dim1 + 1;
00075     t -= t_offset;
00076     --e;
00077     z_dim1 = *nm;
00078     z_offset = z_dim1 + 1;
00079     z__ -= z_offset;
00080 
00081     /* Function Body */
00082     *ierr = 0;
00083     if (*m == 0) {
00084         goto L1001;
00085     }
00086     e[1] = 1.;
00087     if (*n == 1) {
00088         goto L1001;
00089     }
00090 
00091     i__1 = *n;
00092     for (i__ = 2; i__ <= i__1; ++i__) {
00093         if (e[i__] != 0.) {
00094             goto L80;
00095         }
00096         if (t[i__ + t_dim1] != 0. || t[i__ - 1 + t_dim1 * 3] != 0.) {
00097             goto L1000;
00098         }
00099         e[i__] = 1.;
00100         goto L100;
00101 L80:
00102         e[i__] = e[i__ - 1] * e[i__] / t[i__ - 1 + t_dim1 * 3];
00103 L100:
00104         ;
00105     }
00106 
00107     i__1 = *m;
00108     for (j = 1; j <= i__1; ++j) {
00109 
00110         i__2 = *n;
00111         for (i__ = 2; i__ <= i__2; ++i__) {
00112             z__[i__ + j * z_dim1] *= e[i__];
00113 /* L120: */
00114         }
00115     }
00116 
00117     goto L1001;
00118 /*     .......... SET ERROR -- EIGENVECTORS CANNOT BE */
00119 /*                FOUND BY THIS PROGRAM .......... */
00120 L1000:
00121     *ierr = (*n << 1) + i__;
00122 L1001:
00123     return 0;
00124 } /* bakvec_ */

int balanc_ integer   nm,
integer   n,
doublereal   a,
integer   low,
integer   igh,
doublereal   scale
 

Definition at line 8 of file eis_balanc.c.

References a, abs, l, and scale.

Referenced by rg_().

00010 {
00011     /* System generated locals */
00012     integer a_dim1, a_offset, i__1, i__2;
00013     doublereal d__1;
00014 
00015     /* Local variables */
00016     static integer iexc;
00017     static doublereal c__, f, g;
00018     static integer i__, j, k, l, m;
00019     static doublereal r__, s, radix, b2;
00020     static integer jj;
00021     static logical noconv;
00022 
00023 
00024 
00025 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE BALANCE, */
00026 /*     NUM. MATH. 13, 293-304(1969) BY PARLETT AND REINSCH. */
00027 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 315-326(1971). */
00028 
00029 /*     THIS SUBROUTINE BALANCES A REAL MATRIX AND ISOLATES */
00030 /*     EIGENVALUES WHENEVER POSSIBLE. */
00031 
00032 /*     ON INPUT */
00033 
00034 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00035 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00036 /*          DIMENSION STATEMENT. */
00037 
00038 /*        N IS THE ORDER OF THE MATRIX. */
00039 
00040 /*        A CONTAINS THE INPUT MATRIX TO BE BALANCED. */
00041 
00042 /*     ON OUTPUT */
00043 
00044 /*        A CONTAINS THE BALANCED MATRIX. */
00045 
00046 /*        LOW AND IGH ARE TWO INTEGERS SUCH THAT A(I,J) */
00047 /*          IS EQUAL TO ZERO IF */
00048 /*           (1) I IS GREATER THAN J AND */
00049 /*           (2) J=1,...,LOW-1 OR I=IGH+1,...,N. */
00050 
00051 /*        SCALE CONTAINS INFORMATION DETERMINING THE */
00052 /*           PERMUTATIONS AND SCALING FACTORS USED. */
00053 
00054 /*     SUPPOSE THAT THE PRINCIPAL SUBMATRIX IN ROWS LOW THROUGH IGH */
00055 /*     HAS BEEN BALANCED, THAT P(J) DENOTES THE INDEX INTERCHANGED */
00056 /*     WITH J DURING THE PERMUTATION STEP, AND THAT THE ELEMENTS */
00057 /*     OF THE DIAGONAL MATRIX USED ARE DENOTED BY D(I,J).  THEN */
00058 /*        SCALE(J) = P(J),    FOR J = 1,...,LOW-1 */
00059 /*                 = D(J,J),      J = LOW,...,IGH */
00060 /*                 = P(J)         J = IGH+1,...,N. */
00061 /*     THE ORDER IN WHICH THE INTERCHANGES ARE MADE IS N TO IGH+1, */
00062 /*     THEN 1 TO LOW-1. */
00063 
00064 /*     NOTE THAT 1 IS RETURNED FOR IGH IF IGH IS ZERO FORMALLY. */
00065 
00066 /*     THE ALGOL PROCEDURE EXC CONTAINED IN BALANCE APPEARS IN */
00067 /*     BALANC  IN LINE.  (NOTE THAT THE ALGOL ROLES OF IDENTIFIERS */
00068 /*     K,L HAVE BEEN REVERSED.) */
00069 
00070 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00071 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00072 */
00073 
00074 /*     THIS VERSION DATED AUGUST 1983. */
00075 
00076 /*     ------------------------------------------------------------------ 
00077 */
00078 
00079     /* Parameter adjustments */
00080     --scale;
00081     a_dim1 = *nm;
00082     a_offset = a_dim1 + 1;
00083     a -= a_offset;
00084 
00085     /* Function Body */
00086     radix = 16.;
00087 
00088     b2 = radix * radix;
00089     k = 1;
00090     l = *n;
00091     goto L100;
00092 /*     .......... IN-LINE PROCEDURE FOR ROW AND */
00093 /*                COLUMN EXCHANGE .......... */
00094 L20:
00095     scale[m] = (doublereal) j;
00096     if (j == m) {
00097         goto L50;
00098     }
00099 
00100     i__1 = l;
00101     for (i__ = 1; i__ <= i__1; ++i__) {
00102         f = a[i__ + j * a_dim1];
00103         a[i__ + j * a_dim1] = a[i__ + m * a_dim1];
00104         a[i__ + m * a_dim1] = f;
00105 /* L30: */
00106     }
00107 
00108     i__1 = *n;
00109     for (i__ = k; i__ <= i__1; ++i__) {
00110         f = a[j + i__ * a_dim1];
00111         a[j + i__ * a_dim1] = a[m + i__ * a_dim1];
00112         a[m + i__ * a_dim1] = f;
00113 /* L40: */
00114     }
00115 
00116 L50:
00117     switch (iexc) {
00118         case 1:  goto L80;
00119         case 2:  goto L130;
00120     }
00121 /*     .......... SEARCH FOR ROWS ISOLATING AN EIGENVALUE */
00122 /*                AND PUSH THEM DOWN .......... */
00123 L80:
00124     if (l == 1) {
00125         goto L280;
00126     }
00127     --l;
00128 /*     .......... FOR J=L STEP -1 UNTIL 1 DO -- .......... */
00129 L100:
00130     i__1 = l;
00131     for (jj = 1; jj <= i__1; ++jj) {
00132         j = l + 1 - jj;
00133 
00134         i__2 = l;
00135         for (i__ = 1; i__ <= i__2; ++i__) {
00136             if (i__ == j) {
00137                 goto L110;
00138             }
00139             if (a[j + i__ * a_dim1] != 0.) {
00140                 goto L120;
00141             }
00142 L110:
00143             ;
00144         }
00145 
00146         m = l;
00147         iexc = 1;
00148         goto L20;
00149 L120:
00150         ;
00151     }
00152 
00153     goto L140;
00154 /*     .......... SEARCH FOR COLUMNS ISOLATING AN EIGENVALUE */
00155 /*                AND PUSH THEM LEFT .......... */
00156 L130:
00157     ++k;
00158 
00159 L140:
00160     i__1 = l;
00161     for (j = k; j <= i__1; ++j) {
00162 
00163         i__2 = l;
00164         for (i__ = k; i__ <= i__2; ++i__) {
00165             if (i__ == j) {
00166                 goto L150;
00167             }
00168             if (a[i__ + j * a_dim1] != 0.) {
00169                 goto L170;
00170             }
00171 L150:
00172             ;
00173         }
00174 
00175         m = k;
00176         iexc = 2;
00177         goto L20;
00178 L170:
00179         ;
00180     }
00181 /*     .......... NOW BALANCE THE SUBMATRIX IN ROWS K TO L .......... */
00182     i__1 = l;
00183     for (i__ = k; i__ <= i__1; ++i__) {
00184 /* L180: */
00185         scale[i__] = 1.;
00186     }
00187 /*     .......... ITERATIVE LOOP FOR NORM REDUCTION .......... */
00188 L190:
00189     noconv = FALSE_;
00190 
00191     i__1 = l;
00192     for (i__ = k; i__ <= i__1; ++i__) {
00193         c__ = 0.;
00194         r__ = 0.;
00195 
00196         i__2 = l;
00197         for (j = k; j <= i__2; ++j) {
00198             if (j == i__) {
00199                 goto L200;
00200             }
00201             c__ += (d__1 = a[j + i__ * a_dim1], abs(d__1));
00202             r__ += (d__1 = a[i__ + j * a_dim1], abs(d__1));
00203 L200:
00204             ;
00205         }
00206 /*     .......... GUARD AGAINST ZERO C OR R DUE TO UNDERFLOW .........
00207 . */
00208         if (c__ == 0. || r__ == 0.) {
00209             goto L270;
00210         }
00211         g = r__ / radix;
00212         f = 1.;
00213         s = c__ + r__;
00214 L210:
00215         if (c__ >= g) {
00216             goto L220;
00217         }
00218         f *= radix;
00219         c__ *= b2;
00220         goto L210;
00221 L220:
00222         g = r__ * radix;
00223 L230:
00224         if (c__ < g) {
00225             goto L240;
00226         }
00227         f /= radix;
00228         c__ /= b2;
00229         goto L230;
00230 /*     .......... NOW BALANCE .......... */
00231 L240:
00232         if ((c__ + r__) / f >= s * .95) {
00233             goto L270;
00234         }
00235         g = 1. / f;
00236         scale[i__] *= f;
00237         noconv = TRUE_;
00238 
00239         i__2 = *n;
00240         for (j = k; j <= i__2; ++j) {
00241 /* L250: */
00242             a[i__ + j * a_dim1] *= g;
00243         }
00244 
00245         i__2 = l;
00246         for (j = 1; j <= i__2; ++j) {
00247 /* L260: */
00248             a[j + i__ * a_dim1] *= f;
00249         }
00250 
00251 L270:
00252         ;
00253     }
00254 
00255     if (noconv) {
00256         goto L190;
00257     }
00258 
00259 L280:
00260     *low = k;
00261     *igh = l;
00262     return 0;
00263 } /* balanc_ */

int balbak_ integer   nm,
integer   n,
integer   low,
integer   igh,
doublereal   scale,
integer   m,
doublereal   z__
 

Definition at line 8 of file eis_balbak.c.

References scale.

Referenced by rg_().

00010 {
00011     /* System generated locals */
00012     integer z_dim1, z_offset, i__1, i__2;
00013 
00014     /* Local variables */
00015     static integer i__, j, k;
00016     static doublereal s;
00017     static integer ii;
00018 
00019 
00020 
00021 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE BALBAK, */
00022 /*     NUM. MATH. 13, 293-304(1969) BY PARLETT AND REINSCH. */
00023 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 315-326(1971). */
00024 
00025 /*     THIS SUBROUTINE FORMS THE EIGENVECTORS OF A REAL GENERAL */
00026 /*     MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDING */
00027 /*     BALANCED MATRIX DETERMINED BY  BALANC. */
00028 
00029 /*     ON INPUT */
00030 
00031 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00032 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00033 /*          DIMENSION STATEMENT. */
00034 
00035 /*        N IS THE ORDER OF THE MATRIX. */
00036 
00037 /*        LOW AND IGH ARE INTEGERS DETERMINED BY  BALANC. */
00038 
00039 /*        SCALE CONTAINS INFORMATION DETERMINING THE PERMUTATIONS */
00040 /*          AND SCALING FACTORS USED BY  BALANC. */
00041 
00042 /*        M IS THE NUMBER OF COLUMNS OF Z TO BE BACK TRANSFORMED. */
00043 
00044 /*        Z CONTAINS THE REAL AND IMAGINARY PARTS OF THE EIGEN- */
00045 /*          VECTORS TO BE BACK TRANSFORMED IN ITS FIRST M COLUMNS. */
00046 
00047 /*     ON OUTPUT */
00048 
00049 /*        Z CONTAINS THE REAL AND IMAGINARY PARTS OF THE */
00050 /*          TRANSFORMED EIGENVECTORS IN ITS FIRST M COLUMNS. */
00051 
00052 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00053 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00054 */
00055 
00056 /*     THIS VERSION DATED AUGUST 1983. */
00057 
00058 /*     ------------------------------------------------------------------ 
00059 */
00060 
00061     /* Parameter adjustments */
00062     --scale;
00063     z_dim1 = *nm;
00064     z_offset = z_dim1 + 1;
00065     z__ -= z_offset;
00066 
00067     /* Function Body */
00068     if (*m == 0) {
00069         goto L200;
00070     }
00071     if (*igh == *low) {
00072         goto L120;
00073     }
00074 
00075     i__1 = *igh;
00076     for (i__ = *low; i__ <= i__1; ++i__) {
00077         s = scale[i__];
00078 /*     .......... LEFT HAND EIGENVECTORS ARE BACK TRANSFORMED */
00079 /*                IF THE FOREGOING STATEMENT IS REPLACED BY */
00080 /*                S=1.0D0/SCALE(I). .......... */
00081         i__2 = *m;
00082         for (j = 1; j <= i__2; ++j) {
00083 /* L100: */
00084             z__[i__ + j * z_dim1] *= s;
00085         }
00086 
00087 /* L110: */
00088     }
00089 /*     ......... FOR I=LOW-1 STEP -1 UNTIL 1, */
00090 /*               IGH+1 STEP 1 UNTIL N DO -- .......... */
00091 L120:
00092     i__1 = *n;
00093     for (ii = 1; ii <= i__1; ++ii) {
00094         i__ = ii;
00095         if (i__ >= *low && i__ <= *igh) {
00096             goto L140;
00097         }
00098         if (i__ < *low) {
00099             i__ = *low - ii;
00100         }
00101         k = (integer) scale[i__];
00102         if (k == i__) {
00103             goto L140;
00104         }
00105 
00106         i__2 = *m;
00107         for (j = 1; j <= i__2; ++j) {
00108             s = z__[i__ + j * z_dim1];
00109             z__[i__ + j * z_dim1] = z__[k + j * z_dim1];
00110             z__[k + j * z_dim1] = s;
00111 /* L130: */
00112         }
00113 
00114 L140:
00115         ;
00116     }
00117 
00118 L200:
00119     return 0;
00120 } /* balbak_ */

int bandr_ integer   nm,
integer   n,
integer   mb,
doublereal   a,
doublereal   d__,
doublereal   e,
doublereal   e2,
logical   matz,
doublereal   z__
 

Definition at line 8 of file eis_bandr.c.

References a, i1, i2, l, m1, max, min, n2, and s2.

Referenced by rsb_().

00011 {
00012     /* System generated locals */
00013     integer a_dim1, a_offset, z_dim1, z_offset, i__1, i__2, i__3, i__4, i__5, 
00014             i__6;
00015     doublereal d__1;
00016 
00017     /* Builtin functions */
00018     double sqrt(doublereal);
00019 
00020     /* Local variables */
00021     static doublereal dmin__;
00022     static integer maxl, maxr;
00023     static doublereal g;
00024     static integer j, k, l, r__;
00025     static doublereal u, b1, b2, c2, f1, f2;
00026     static integer i1, i2, j1, j2, m1, n2, r1;
00027     static doublereal s2;
00028     static integer kr, mr;
00029     static doublereal dminrt;
00030     static integer ugl;
00031 
00032 
00033 
00034 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE BANDRD, */
00035 /*     NUM. MATH. 12, 231-241(1968) BY SCHWARZ. */
00036 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 273-283(1971). */
00037 
00038 /*     THIS SUBROUTINE REDUCES A REAL SYMMETRIC BAND MATRIX */
00039 /*     TO A SYMMETRIC TRIDIAGONAL MATRIX USING AND OPTIONALLY */
00040 /*     ACCUMULATING ORTHOGONAL SIMILARITY TRANSFORMATIONS. */
00041 
00042 /*     ON INPUT */
00043 
00044 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00045 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00046 /*          DIMENSION STATEMENT. */
00047 
00048 /*        N IS THE ORDER OF THE MATRIX. */
00049 
00050 /*        MB IS THE (HALF) BAND WIDTH OF THE MATRIX, DEFINED AS THE */
00051 /*          NUMBER OF ADJACENT DIAGONALS, INCLUDING THE PRINCIPAL */
00052 /*          DIAGONAL, REQUIRED TO SPECIFY THE NON-ZERO PORTION OF THE */
00053 /*          LOWER TRIANGLE OF THE MATRIX. */
00054 
00055 /*        A CONTAINS THE LOWER TRIANGLE OF THE SYMMETRIC BAND INPUT */
00056 /*          MATRIX STORED AS AN N BY MB ARRAY.  ITS LOWEST SUBDIAGONAL */
00057 /*          IS STORED IN THE LAST N+1-MB POSITIONS OF THE FIRST COLUMN, */
00058 /*          ITS NEXT SUBDIAGONAL IN THE LAST N+2-MB POSITIONS OF THE */
00059 /*          SECOND COLUMN, FURTHER SUBDIAGONALS SIMILARLY, AND FINALLY */
00060 /*          ITS PRINCIPAL DIAGONAL IN THE N POSITIONS OF THE LAST COLUMN. 
00061 */
00062 /*          CONTENTS OF STORAGES NOT PART OF THE MATRIX ARE ARBITRARY. */
00063 
00064 /*        MATZ SHOULD BE SET TO .TRUE. IF THE TRANSFORMATION MATRIX IS */
00065 /*          TO BE ACCUMULATED, AND TO .FALSE. OTHERWISE. */
00066 
00067 /*     ON OUTPUT */
00068 
00069 /*        A HAS BEEN DESTROYED, EXCEPT FOR ITS LAST TWO COLUMNS WHICH */
00070 /*          CONTAIN A COPY OF THE TRIDIAGONAL MATRIX. */
00071 
00072 /*        D CONTAINS THE DIAGONAL ELEMENTS OF THE TRIDIAGONAL MATRIX. */
00073 
00074 /*        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE TRIDIAGONAL */
00075 /*          MATRIX IN ITS LAST N-1 POSITIONS.  E(1) IS SET TO ZERO. */
00076 
00077 /*        E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E. */
00078 /*          E2 MAY COINCIDE WITH E IF THE SQUARES ARE NOT NEEDED. */
00079 
00080 /*        Z CONTAINS THE ORTHOGONAL TRANSFORMATION MATRIX PRODUCED IN */
00081 /*          THE REDUCTION IF MATZ HAS BEEN SET TO .TRUE.  OTHERWISE, Z */
00082 /*          IS NOT REFERENCED. */
00083 
00084 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00085 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00086 */
00087 
00088 /*     THIS VERSION DATED AUGUST 1983. */
00089 
00090 /*     ------------------------------------------------------------------ 
00091 */
00092 
00093     /* Parameter adjustments */
00094     z_dim1 = *nm;
00095     z_offset = z_dim1 + 1;
00096     z__ -= z_offset;
00097     --e2;
00098     --e;
00099     --d__;
00100     a_dim1 = *nm;
00101     a_offset = a_dim1 + 1;
00102     a -= a_offset;
00103 
00104     /* Function Body */
00105     dmin__ = 5.4210108624275222e-20;
00106     dminrt = 2.3283064365386963e-10;
00107 /*     .......... INITIALIZE DIAGONAL SCALING MATRIX .......... */
00108     i__1 = *n;
00109     for (j = 1; j <= i__1; ++j) {
00110 /* L30: */
00111         d__[j] = 1.;
00112     }
00113 
00114     if (! (*matz)) {
00115         goto L60;
00116     }
00117 
00118     i__1 = *n;
00119     for (j = 1; j <= i__1; ++j) {
00120 
00121         i__2 = *n;
00122         for (k = 1; k <= i__2; ++k) {
00123 /* L40: */
00124             z__[j + k * z_dim1] = 0.;
00125         }
00126 
00127         z__[j + j * z_dim1] = 1.;
00128 /* L50: */
00129     }
00130 
00131 L60:
00132     m1 = *mb - 1;
00133     if ((i__1 = m1 - 1) < 0) {
00134         goto L900;
00135     } else if (i__1 == 0) {
00136         goto L800;
00137     } else {
00138         goto L70;
00139     }
00140 L70:
00141     n2 = *n - 2;
00142 
00143     i__1 = n2;
00144     for (k = 1; k <= i__1; ++k) {
00145 /* Computing MIN */
00146         i__2 = m1, i__3 = *n - k;
00147         maxr = min(i__2,i__3);
00148 /*     .......... FOR R=MAXR STEP -1 UNTIL 2 DO -- .......... */
00149         i__2 = maxr;
00150         for (r1 = 2; r1 <= i__2; ++r1) {
00151             r__ = maxr + 2 - r1;
00152             kr = k + r__;
00153             mr = *mb - r__;
00154             g = a[kr + mr * a_dim1];
00155             a[kr - 1 + a_dim1] = a[kr - 1 + (mr + 1) * a_dim1];
00156             ugl = k;
00157 
00158             i__3 = *n;
00159             i__4 = m1;
00160             for (j = kr; i__4 < 0 ? j >= i__3 : j <= i__3; j += i__4) {
00161                 j1 = j - 1;
00162                 j2 = j1 - 1;
00163                 if (g == 0.) {
00164                     goto L600;
00165                 }
00166                 b1 = a[j1 + a_dim1] / g;
00167                 b2 = b1 * d__[j1] / d__[j];
00168                 s2 = 1. / (b1 * b2 + 1.);
00169                 if (s2 >= .5) {
00170                     goto L450;
00171                 }
00172                 b1 = g / a[j1 + a_dim1];
00173                 b2 = b1 * d__[j] / d__[j1];
00174                 c2 = 1. - s2;
00175                 d__[j1] = c2 * d__[j1];
00176                 d__[j] = c2 * d__[j];
00177                 f1 = a[j + m1 * a_dim1] * 2.;
00178                 f2 = b1 * a[j1 + *mb * a_dim1];
00179                 a[j + m1 * a_dim1] = -b2 * (b1 * a[j + m1 * a_dim1] - a[j + *
00180                         mb * a_dim1]) - f2 + a[j + m1 * a_dim1];
00181                 a[j1 + *mb * a_dim1] = b2 * (b2 * a[j + *mb * a_dim1] + f1) + 
00182                         a[j1 + *mb * a_dim1];
00183                 a[j + *mb * a_dim1] = b1 * (f2 - f1) + a[j + *mb * a_dim1];
00184 
00185                 i__5 = j2;
00186                 for (l = ugl; l <= i__5; ++l) {
00187                     i2 = *mb - j + l;
00188                     u = a[j1 + (i2 + 1) * a_dim1] + b2 * a[j + i2 * a_dim1];
00189                     a[j + i2 * a_dim1] = -b1 * a[j1 + (i2 + 1) * a_dim1] + a[
00190                             j + i2 * a_dim1];
00191                     a[j1 + (i2 + 1) * a_dim1] = u;
00192 /* L200: */
00193                 }
00194 
00195                 ugl = j;
00196                 a[j1 + a_dim1] += b2 * g;
00197                 if (j == *n) {
00198                     goto L350;
00199                 }
00200 /* Computing MIN */
00201                 i__5 = m1, i__6 = *n - j1;
00202                 maxl = min(i__5,i__6);
00203 
00204                 i__5 = maxl;
00205                 for (l = 2; l <= i__5; ++l) {
00206                     i1 = j1 + l;
00207                     i2 = *mb - l;
00208                     u = a[i1 + i2 * a_dim1] + b2 * a[i1 + (i2 + 1) * a_dim1];
00209                     a[i1 + (i2 + 1) * a_dim1] = -b1 * a[i1 + i2 * a_dim1] + a[
00210                             i1 + (i2 + 1) * a_dim1];
00211                     a[i1 + i2 * a_dim1] = u;
00212 /* L300: */
00213                 }
00214 
00215                 i1 = j + m1;
00216                 if (i1 > *n) {
00217                     goto L350;
00218                 }
00219                 g = b2 * a[i1 + a_dim1];
00220 L350:
00221                 if (! (*matz)) {
00222                     goto L500;
00223                 }
00224 
00225                 i__5 = *n;
00226                 for (l = 1; l <= i__5; ++l) {
00227                     u = z__[l + j1 * z_dim1] + b2 * z__[l + j * z_dim1];
00228                     z__[l + j * z_dim1] = -b1 * z__[l + j1 * z_dim1] + z__[l 
00229                             + j * z_dim1];
00230                     z__[l + j1 * z_dim1] = u;
00231 /* L400: */
00232                 }
00233 
00234                 goto L500;
00235 
00236 L450:
00237                 u = d__[j1];
00238                 d__[j1] = s2 * d__[j];
00239                 d__[j] = s2 * u;
00240                 f1 = a[j + m1 * a_dim1] * 2.;
00241                 f2 = b1 * a[j + *mb * a_dim1];
00242                 u = b1 * (f2 - f1) + a[j1 + *mb * a_dim1];
00243                 a[j + m1 * a_dim1] = b2 * (b1 * a[j + m1 * a_dim1] - a[j1 + *
00244                         mb * a_dim1]) + f2 - a[j + m1 * a_dim1];
00245                 a[j1 + *mb * a_dim1] = b2 * (b2 * a[j1 + *mb * a_dim1] + f1) 
00246                         + a[j + *mb * a_dim1];
00247                 a[j + *mb * a_dim1] = u;
00248 
00249                 i__5 = j2;
00250                 for (l = ugl; l <= i__5; ++l) {
00251                     i2 = *mb - j + l;
00252                     u = b2 * a[j1 + (i2 + 1) * a_dim1] + a[j + i2 * a_dim1];
00253                     a[j + i2 * a_dim1] = -a[j1 + (i2 + 1) * a_dim1] + b1 * a[
00254                             j + i2 * a_dim1];
00255                     a[j1 + (i2 + 1) * a_dim1] = u;
00256 /* L460: */
00257                 }
00258 
00259                 ugl = j;
00260                 a[j1 + a_dim1] = b2 * a[j1 + a_dim1] + g;
00261                 if (j == *n) {
00262                     goto L480;
00263                 }
00264 /* Computing MIN */
00265                 i__5 = m1, i__6 = *n - j1;
00266                 maxl = min(i__5,i__6);
00267 
00268                 i__5 = maxl;
00269                 for (l = 2; l <= i__5; ++l) {
00270                     i1 = j1 + l;
00271                     i2 = *mb - l;
00272                     u = b2 * a[i1 + i2 * a_dim1] + a[i1 + (i2 + 1) * a_dim1];
00273                     a[i1 + (i2 + 1) * a_dim1] = -a[i1 + i2 * a_dim1] + b1 * a[
00274                             i1 + (i2 + 1) * a_dim1];
00275                     a[i1 + i2 * a_dim1] = u;
00276 /* L470: */
00277                 }
00278 
00279                 i1 = j + m1;
00280                 if (i1 > *n) {
00281                     goto L480;
00282                 }
00283                 g = a[i1 + a_dim1];
00284                 a[i1 + a_dim1] = b1 * a[i1 + a_dim1];
00285 L480:
00286                 if (! (*matz)) {
00287                     goto L500;
00288                 }
00289 
00290                 i__5 = *n;
00291                 for (l = 1; l <= i__5; ++l) {
00292                     u = b2 * z__[l + j1 * z_dim1] + z__[l + j * z_dim1];
00293                     z__[l + j * z_dim1] = -z__[l + j1 * z_dim1] + b1 * z__[l 
00294                             + j * z_dim1];
00295                     z__[l + j1 * z_dim1] = u;
00296 /* L490: */
00297                 }
00298 
00299 L500:
00300                 ;
00301             }
00302 
00303 L600:
00304             ;
00305         }
00306 
00307         if (k % 64 != 0) {
00308             goto L700;
00309         }
00310 /*     .......... RESCALE TO AVOID UNDERFLOW OR OVERFLOW .......... */
00311         i__2 = *n;
00312         for (j = k; j <= i__2; ++j) {
00313             if (d__[j] >= dmin__) {
00314                 goto L650;
00315             }
00316 /* Computing MAX */
00317             i__4 = 1, i__3 = *mb + 1 - j;
00318             maxl = max(i__4,i__3);
00319 
00320             i__4 = m1;
00321             for (l = maxl; l <= i__4; ++l) {
00322 /* L610: */
00323                 a[j + l * a_dim1] = dminrt * a[j + l * a_dim1];
00324             }
00325 
00326             if (j == *n) {
00327                 goto L630;
00328             }
00329 /* Computing MIN */
00330             i__4 = m1, i__3 = *n - j;
00331             maxl = min(i__4,i__3);
00332 
00333             i__4 = maxl;
00334             for (l = 1; l <= i__4; ++l) {
00335                 i1 = j + l;
00336                 i2 = *mb - l;
00337                 a[i1 + i2 * a_dim1] = dminrt * a[i1 + i2 * a_dim1];
00338 /* L620: */
00339             }
00340 
00341 L630:
00342             if (! (*matz)) {
00343                 goto L645;
00344             }
00345 
00346             i__4 = *n;
00347             for (l = 1; l <= i__4; ++l) {
00348 /* L640: */
00349                 z__[l + j * z_dim1] = dminrt * z__[l + j * z_dim1];
00350             }
00351 
00352 L645:
00353             a[j + *mb * a_dim1] = dmin__ * a[j + *mb * a_dim1];
00354             d__[j] /= dmin__;
00355 L650:
00356             ;
00357         }
00358 
00359 L700:
00360         ;
00361     }
00362 /*     .......... FORM SQUARE ROOT OF SCALING MATRIX .......... */
00363 L800:
00364     i__1 = *n;
00365     for (j = 2; j <= i__1; ++j) {
00366 /* L810: */
00367         e[j] = sqrt(d__[j]);
00368     }
00369 
00370     if (! (*matz)) {
00371         goto L840;
00372     }
00373 
00374     i__1 = *n;
00375     for (j = 1; j <= i__1; ++j) {
00376 
00377         i__2 = *n;
00378         for (k = 2; k <= i__2; ++k) {
00379 /* L820: */
00380             z__[j + k * z_dim1] = e[k] * z__[j + k * z_dim1];
00381         }
00382 
00383 /* L830: */
00384     }
00385 
00386 L840:
00387     u = 1.;
00388 
00389     i__1 = *n;
00390     for (j = 2; j <= i__1; ++j) {
00391         a[j + m1 * a_dim1] = u * e[j] * a[j + m1 * a_dim1];
00392         u = e[j];
00393 /* Computing 2nd power */
00394         d__1 = a[j + m1 * a_dim1];
00395         e2[j] = d__1 * d__1;
00396         a[j + *mb * a_dim1] = d__[j] * a[j + *mb * a_dim1];
00397         d__[j] = a[j + *mb * a_dim1];
00398         e[j] = a[j + m1 * a_dim1];
00399 /* L850: */
00400     }
00401 
00402     d__[1] = a[*mb * a_dim1 + 1];
00403     e[1] = 0.;
00404     e2[1] = 0.;
00405     goto L1001;
00406 
00407 L900:
00408     i__1 = *n;
00409     for (j = 1; j <= i__1; ++j) {
00410         d__[j] = a[j + *mb * a_dim1];
00411         e[j] = 0.;
00412         e2[j] = 0.;
00413 /* L950: */
00414     }
00415 
00416 L1001:
00417     return 0;
00418 } /* bandr_ */

int bandv_ integer   nm,
integer   n,
integer   mbw,
doublereal   a,
doublereal   e21,
integer   m,
doublereal   w,
doublereal   z__,
integer   ierr,
integer   nv,
doublereal   rv,
doublereal   rv6
 

Definition at line 8 of file eis_bandv.c.

References a, abs, d_sign(), epslon_(), m1, max, min, pythag_(), v, and x0.

00011 {
00012     /* System generated locals */
00013     integer a_dim1, a_offset, z_dim1, z_offset, i__1, i__2, i__3, i__4, i__5;
00014     doublereal d__1;
00015 
00016     /* Builtin functions */
00017     double sqrt(doublereal), d_sign(doublereal *, doublereal *);
00018 
00019     /* Local variables */
00020     static integer maxj, maxk;
00021     static doublereal norm;
00022     static integer i__, j, k, r__;
00023     static doublereal u, v, order;
00024     static integer group, m1;
00025     static doublereal x0, x1;
00026     static integer mb, m21, ii, ij, jj, kj;
00027     static doublereal uk, xu;
00028     extern doublereal pythag_(doublereal *, doublereal *), epslon_(doublereal 
00029             *);
00030     static integer ij1, kj1, its;
00031     static doublereal eps2, eps3, eps4;
00032 
00033 
00034 
00035 /*     THIS SUBROUTINE FINDS THOSE EIGENVECTORS OF A REAL SYMMETRIC */
00036 /*     BAND MATRIX CORRESPONDING TO SPECIFIED EIGENVALUES, USING INVERSE 
00037 */
00038 /*     ITERATION.  THE SUBROUTINE MAY ALSO BE USED TO SOLVE SYSTEMS */
00039 /*     OF LINEAR EQUATIONS WITH A SYMMETRIC OR NON-SYMMETRIC BAND */
00040 /*     COEFFICIENT MATRIX. */
00041 
00042 /*     ON INPUT */
00043 
00044 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00045 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00046 /*          DIMENSION STATEMENT. */
00047 
00048 /*        N IS THE ORDER OF THE MATRIX. */
00049 
00050 /*        MBW IS THE NUMBER OF COLUMNS OF THE ARRAY A USED TO STORE THE */
00051 /*          BAND MATRIX.  IF THE MATRIX IS SYMMETRIC, MBW IS ITS (HALF) */
00052 /*          BAND WIDTH, DENOTED MB AND DEFINED AS THE NUMBER OF ADJACENT 
00053 */
00054 /*          DIAGONALS, INCLUDING THE PRINCIPAL DIAGONAL, REQUIRED TO */
00055 /*          SPECIFY THE NON-ZERO PORTION OF THE LOWER TRIANGLE OF THE */
00056 /*          MATRIX.  IF THE SUBROUTINE IS BEING USED TO SOLVE SYSTEMS */
00057 /*          OF LINEAR EQUATIONS AND THE COEFFICIENT MATRIX IS NOT */
00058 /*          SYMMETRIC, IT MUST HOWEVER HAVE THE SAME NUMBER OF ADJACENT */
00059 /*          DIAGONALS ABOVE THE MAIN DIAGONAL AS BELOW, AND IN THIS */
00060 /*          CASE, MBW=2*MB-1. */
00061 
00062 /*        A CONTAINS THE LOWER TRIANGLE OF THE SYMMETRIC BAND INPUT */
00063 /*          MATRIX STORED AS AN N BY MB ARRAY.  ITS LOWEST SUBDIAGONAL */
00064 /*          IS STORED IN THE LAST N+1-MB POSITIONS OF THE FIRST COLUMN, */
00065 /*          ITS NEXT SUBDIAGONAL IN THE LAST N+2-MB POSITIONS OF THE */
00066 /*          SECOND COLUMN, FURTHER SUBDIAGONALS SIMILARLY, AND FINALLY */
00067 /*          ITS PRINCIPAL DIAGONAL IN THE N POSITIONS OF COLUMN MB. */
00068 /*          IF THE SUBROUTINE IS BEING USED TO SOLVE SYSTEMS OF LINEAR */
00069 /*          EQUATIONS AND THE COEFFICIENT MATRIX IS NOT SYMMETRIC, A IS */
00070 /*          N BY 2*MB-1 INSTEAD WITH LOWER TRIANGLE AS ABOVE AND WITH */
00071 /*          ITS FIRST SUPERDIAGONAL STORED IN THE FIRST N-1 POSITIONS OF 
00072 */
00073 /*          COLUMN MB+1, ITS SECOND SUPERDIAGONAL IN THE FIRST N-2 */
00074 /*          POSITIONS OF COLUMN MB+2, FURTHER SUPERDIAGONALS SIMILARLY, */
00075 /*          AND FINALLY ITS HIGHEST SUPERDIAGONAL IN THE FIRST N+1-MB */
00076 /*          POSITIONS OF THE LAST COLUMN. */
00077 /*          CONTENTS OF STORAGES NOT PART OF THE MATRIX ARE ARBITRARY. */
00078 
00079 /*        E21 SPECIFIES THE ORDERING OF THE EIGENVALUES AND CONTAINS */
00080 /*            0.0D0 IF THE EIGENVALUES ARE IN ASCENDING ORDER, OR */
00081 /*            2.0D0 IF THE EIGENVALUES ARE IN DESCENDING ORDER. */
00082 /*          IF THE SUBROUTINE IS BEING USED TO SOLVE SYSTEMS OF LINEAR */
00083 /*          EQUATIONS, E21 SHOULD BE SET TO 1.0D0 IF THE COEFFICIENT */
00084 /*          MATRIX IS SYMMETRIC AND TO -1.0D0 IF NOT. */
00085 
00086 /*        M IS THE NUMBER OF SPECIFIED EIGENVALUES OR THE NUMBER OF */
00087 /*          SYSTEMS OF LINEAR EQUATIONS. */
00088 
00089 /*        W CONTAINS THE M EIGENVALUES IN ASCENDING OR DESCENDING ORDER. 
00090 */
00091 /*          IF THE SUBROUTINE IS BEING USED TO SOLVE SYSTEMS OF LINEAR */
00092 /*          EQUATIONS (A-W(R)*I)*X(R)=B(R), WHERE I IS THE IDENTITY */
00093 /*          MATRIX, W(R) SHOULD BE SET ACCORDINGLY, FOR R=1,2,...,M. */
00094 
00095 /*        Z CONTAINS THE CONSTANT MATRIX COLUMNS (B(R),R=1,2,...,M), IF */
00096 /*          THE SUBROUTINE IS USED TO SOLVE SYSTEMS OF LINEAR EQUATIONS. 
00097 */
00098 
00099 /*        NV MUST BE SET TO THE DIMENSION OF THE ARRAY PARAMETER RV */
00100 /*          AS DECLARED IN THE CALLING PROGRAM DIMENSION STATEMENT. */
00101 
00102 /*     ON OUTPUT */
00103 
00104 /*        A AND W ARE UNALTERED. */
00105 
00106 /*        Z CONTAINS THE ASSOCIATED SET OF ORTHOGONAL EIGENVECTORS. */
00107 /*          ANY VECTOR WHICH FAILS TO CONVERGE IS SET TO ZERO.  IF THE */
00108 /*          SUBROUTINE IS USED TO SOLVE SYSTEMS OF LINEAR EQUATIONS, */
00109 /*          Z CONTAINS THE SOLUTION MATRIX COLUMNS (X(R),R=1,2,...,M). */
00110 
00111 /*        IERR IS SET TO */
00112 /*          ZERO       FOR NORMAL RETURN, */
00113 /*          -R         IF THE EIGENVECTOR CORRESPONDING TO THE R-TH */
00114 /*                     EIGENVALUE FAILS TO CONVERGE, OR IF THE R-TH */
00115 /*                     SYSTEM OF LINEAR EQUATIONS IS NEARLY SINGULAR. */
00116 
00117 /*        RV AND RV6 ARE TEMPORARY STORAGE ARRAYS.  NOTE THAT RV IS */
00118 /*          OF DIMENSION AT LEAST N*(2*MB-1).  IF THE SUBROUTINE */
00119 /*          IS BEING USED TO SOLVE SYSTEMS OF LINEAR EQUATIONS, THE */
00120 /*          DETERMINANT (UP TO SIGN) OF A-W(M)*I IS AVAILABLE, UPON */
00121 /*          RETURN, AS THE PRODUCT OF THE FIRST N ELEMENTS OF RV. */
00122 
00123 /*     CALLS PYTHAG FOR  DSQRT(A*A + B*B) . */
00124 
00125 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00126 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00127 */
00128 
00129 /*     THIS VERSION DATED AUGUST 1983. */
00130 
00131 /*     ------------------------------------------------------------------ 
00132 */
00133 
00134     /* Parameter adjustments */
00135     --rv6;
00136     a_dim1 = *nm;
00137     a_offset = a_dim1 + 1;
00138     a -= a_offset;
00139     z_dim1 = *nm;
00140     z_offset = z_dim1 + 1;
00141     z__ -= z_offset;
00142     --w;
00143     --rv;
00144 
00145     /* Function Body */
00146     *ierr = 0;
00147     if (*m == 0) {
00148         goto L1001;
00149     }
00150     mb = *mbw;
00151     if (*e21 < 0.) {
00152         mb = (*mbw + 1) / 2;
00153     }
00154     m1 = mb - 1;
00155     m21 = m1 + mb;
00156     order = 1. - abs(*e21);
00157 /*     .......... FIND VECTORS BY INVERSE ITERATION .......... */
00158     i__1 = *m;
00159     for (r__ = 1; r__ <= i__1; ++r__) {
00160         its = 1;
00161         x1 = w[r__];
00162         if (r__ != 1) {
00163             goto L100;
00164         }
00165 /*     .......... COMPUTE NORM OF MATRIX .......... */
00166         norm = 0.;
00167 
00168         i__2 = mb;
00169         for (j = 1; j <= i__2; ++j) {
00170             jj = mb + 1 - j;
00171             kj = jj + m1;
00172             ij = 1;
00173             v = 0.;
00174 
00175             i__3 = *n;
00176             for (i__ = jj; i__ <= i__3; ++i__) {
00177                 v += (d__1 = a[i__ + j * a_dim1], abs(d__1));
00178                 if (*e21 >= 0.) {
00179                     goto L40;
00180                 }
00181                 v += (d__1 = a[ij + kj * a_dim1], abs(d__1));
00182                 ++ij;
00183 L40:
00184                 ;
00185             }
00186 
00187             norm = max(norm,v);
00188 /* L60: */
00189         }
00190 
00191         if (*e21 < 0.) {
00192             norm *= .5;
00193         }
00194 /*     .......... EPS2 IS THE CRITERION FOR GROUPING, */
00195 /*                EPS3 REPLACES ZERO PIVOTS AND EQUAL */
00196 /*                ROOTS ARE MODIFIED BY EPS3, */
00197 /*                EPS4 IS TAKEN VERY SMALL TO AVOID OVERFLOW .........
00198 . */
00199         if (norm == 0.) {
00200             norm = 1.;
00201         }
00202         eps2 = norm * .001 * abs(order);
00203         eps3 = epslon_(&norm);
00204         uk = (doublereal) (*n);
00205         uk = sqrt(uk);
00206         eps4 = uk * eps3;
00207 L80:
00208         group = 0;
00209         goto L120;
00210 /*     .......... LOOK FOR CLOSE OR COINCIDENT ROOTS .......... */
00211 L100:
00212         if ((d__1 = x1 - x0, abs(d__1)) >= eps2) {
00213             goto L80;
00214         }
00215         ++group;
00216         if (order * (x1 - x0) <= 0.) {
00217             x1 = x0 + order * eps3;
00218         }
00219 /*     .......... EXPAND MATRIX, SUBTRACT EIGENVALUE, */
00220 /*                AND INITIALIZE VECTOR .......... */
00221 L120:
00222         i__2 = *n;
00223         for (i__ = 1; i__ <= i__2; ++i__) {
00224 /* Computing MIN */
00225             i__3 = 0, i__4 = i__ - m1;
00226             ij = i__ + min(i__3,i__4) * *n;
00227             kj = ij + mb * *n;
00228             ij1 = kj + m1 * *n;
00229             if (m1 == 0) {
00230                 goto L180;
00231             }
00232 
00233             i__3 = m1;
00234             for (j = 1; j <= i__3; ++j) {
00235                 if (ij > m1) {
00236                     goto L125;
00237                 }
00238                 if (ij > 0) {
00239                     goto L130;
00240                 }
00241                 rv[ij1] = 0.;
00242                 ij1 += *n;
00243                 goto L130;
00244 L125:
00245                 rv[ij] = a[i__ + j * a_dim1];
00246 L130:
00247                 ij += *n;
00248                 ii = i__ + j;
00249                 if (ii > *n) {
00250                     goto L150;
00251                 }
00252                 jj = mb - j;
00253                 if (*e21 >= 0.) {
00254                     goto L140;
00255                 }
00256                 ii = i__;
00257                 jj = mb + j;
00258 L140:
00259                 rv[kj] = a[ii + jj * a_dim1];
00260                 kj += *n;
00261 L150:
00262                 ;
00263             }
00264 
00265 L180:
00266             rv[ij] = a[i__ + mb * a_dim1] - x1;
00267             rv6[i__] = eps4;
00268             if (order == 0.) {
00269                 rv6[i__] = z__[i__ + r__ * z_dim1];
00270             }
00271 /* L200: */
00272         }
00273 
00274         if (m1 == 0) {
00275             goto L600;
00276         }
00277 /*     .......... ELIMINATION WITH INTERCHANGES .......... */
00278         i__2 = *n;
00279         for (i__ = 1; i__ <= i__2; ++i__) {
00280             ii = i__ + 1;
00281 /* Computing MIN */
00282             i__3 = i__ + m1 - 1;
00283             maxk = min(i__3,*n);
00284 /* Computing MIN */
00285             i__3 = *n - i__, i__4 = m21 - 2;
00286             maxj = min(i__3,i__4) * *n;
00287 
00288             i__3 = maxk;
00289             for (k = i__; k <= i__3; ++k) {
00290                 kj1 = k;
00291                 j = kj1 + *n;
00292                 jj = j + maxj;
00293 
00294                 i__4 = jj;
00295                 i__5 = *n;
00296                 for (kj = j; i__5 < 0 ? kj >= i__4 : kj <= i__4; kj += i__5) {
00297                     rv[kj1] = rv[kj];
00298                     kj1 = kj;
00299 /* L340: */
00300                 }
00301 
00302                 rv[kj1] = 0.;
00303 /* L360: */
00304             }
00305 
00306             if (i__ == *n) {
00307                 goto L580;
00308             }
00309             u = 0.;
00310 /* Computing MIN */
00311             i__3 = i__ + m1;
00312             maxk = min(i__3,*n);
00313 /* Computing MIN */
00314             i__3 = *n - ii, i__5 = m21 - 2;
00315             maxj = min(i__3,i__5) * *n;
00316 
00317             i__3 = maxk;
00318             for (j = i__; j <= i__3; ++j) {
00319                 if ((d__1 = rv[j], abs(d__1)) < abs(u)) {
00320                     goto L450;
00321                 }
00322                 u = rv[j];
00323                 k = j;
00324 L450:
00325                 ;
00326             }
00327 
00328             j = i__ + *n;
00329             jj = j + maxj;
00330             if (k == i__) {
00331                 goto L520;
00332             }
00333             kj = k;
00334 
00335             i__3 = jj;
00336             i__5 = *n;
00337             for (ij = i__; i__5 < 0 ? ij >= i__3 : ij <= i__3; ij += i__5) {
00338                 v = rv[ij];
00339                 rv[ij] = rv[kj];
00340                 rv[kj] = v;
00341                 kj += *n;
00342 /* L500: */
00343             }
00344 
00345             if (order != 0.) {
00346                 goto L520;
00347             }
00348             v = rv6[i__];
00349             rv6[i__] = rv6[k];
00350             rv6[k] = v;
00351 L520:
00352             if (u == 0.) {
00353                 goto L580;
00354             }
00355 
00356             i__5 = maxk;
00357             for (k = ii; k <= i__5; ++k) {
00358                 v = rv[k] / u;
00359                 kj = k;
00360 
00361                 i__3 = jj;
00362                 i__4 = *n;
00363                 for (ij = j; i__4 < 0 ? ij >= i__3 : ij <= i__3; ij += i__4) {
00364                     kj += *n;
00365                     rv[kj] -= v * rv[ij];
00366 /* L540: */
00367                 }
00368 
00369                 if (order == 0.) {
00370                     rv6[k] -= v * rv6[i__];
00371                 }
00372 /* L560: */
00373             }
00374 
00375 L580:
00376             ;
00377         }
00378 /*     .......... BACK SUBSTITUTION */
00379 /*                FOR I=N STEP -1 UNTIL 1 DO -- .......... */
00380 L600:
00381         i__2 = *n;
00382         for (ii = 1; ii <= i__2; ++ii) {
00383             i__ = *n + 1 - ii;
00384             maxj = min(ii,m21);
00385             if (maxj == 1) {
00386                 goto L620;
00387             }
00388             ij1 = i__;
00389             j = ij1 + *n;
00390             jj = j + (maxj - 2) * *n;
00391 
00392             i__5 = jj;
00393             i__4 = *n;
00394             for (ij = j; i__4 < 0 ? ij >= i__5 : ij <= i__5; ij += i__4) {
00395                 ++ij1;
00396                 rv6[i__] -= rv[ij] * rv6[ij1];
00397 /* L610: */
00398             }
00399 
00400 L620:
00401             v = rv[i__];
00402             if (abs(v) >= eps3) {
00403                 goto L625;
00404             }
00405 /*     .......... SET ERROR -- NEARLY SINGULAR LINEAR SYSTEM .....
00406 ..... */
00407             if (order == 0.) {
00408                 *ierr = -r__;
00409             }
00410             v = d_sign(&eps3, &v);
00411 L625:
00412             rv6[i__] /= v;
00413 /* L630: */
00414         }
00415 
00416         xu = 1.;
00417         if (order == 0.) {
00418             goto L870;
00419         }
00420 /*     .......... ORTHOGONALIZE WITH RESPECT TO PREVIOUS */
00421 /*                MEMBERS OF GROUP .......... */
00422         if (group == 0) {
00423             goto L700;
00424         }
00425 
00426         i__2 = group;
00427         for (jj = 1; jj <= i__2; ++jj) {
00428             j = r__ - group - 1 + jj;
00429             xu = 0.;
00430 
00431             i__4 = *n;
00432             for (i__ = 1; i__ <= i__4; ++i__) {
00433 /* L640: */
00434                 xu += rv6[i__] * z__[i__ + j * z_dim1];
00435             }
00436 
00437             i__4 = *n;
00438             for (i__ = 1; i__ <= i__4; ++i__) {
00439 /* L660: */
00440                 rv6[i__] -= xu * z__[i__ + j * z_dim1];
00441             }
00442 
00443 /* L680: */
00444         }
00445 
00446 L700:
00447         norm = 0.;
00448 
00449         i__2 = *n;
00450         for (i__ = 1; i__ <= i__2; ++i__) {
00451 /* L720: */
00452             norm += (d__1 = rv6[i__], abs(d__1));
00453         }
00454 
00455         if (norm >= .1) {
00456             goto L840;
00457         }
00458 /*     .......... IN-LINE PROCEDURE FOR CHOOSING */
00459 /*                A NEW STARTING VECTOR .......... */
00460         if (its >= *n) {
00461             goto L830;
00462         }
00463         ++its;
00464         xu = eps4 / (uk + 1.);
00465         rv6[1] = eps4;
00466 
00467         i__2 = *n;
00468         for (i__ = 2; i__ <= i__2; ++i__) {
00469 /* L760: */
00470             rv6[i__] = xu;
00471         }
00472 
00473         rv6[its] -= eps4 * uk;
00474         goto L600;
00475 /*     .......... SET ERROR -- NON-CONVERGED EIGENVECTOR .......... */
00476 L830:
00477         *ierr = -r__;
00478         xu = 0.;
00479         goto L870;
00480 /*     .......... NORMALIZE SO THAT SUM OF SQUARES IS */
00481 /*                1 AND EXPAND TO FULL ORDER .......... */
00482 L840:
00483         u = 0.;
00484 
00485         i__2 = *n;
00486         for (i__ = 1; i__ <= i__2; ++i__) {
00487 /* L860: */
00488             u = pythag_(&u, &rv6[i__]);
00489         }
00490 
00491         xu = 1. / u;
00492 
00493 L870:
00494         i__2 = *n;
00495         for (i__ = 1; i__ <= i__2; ++i__) {
00496 /* L900: */
00497             z__[i__ + r__ * z_dim1] = rv6[i__] * xu;
00498         }
00499 
00500         x0 = x1;
00501 /* L920: */
00502     }
00503 
00504 L1001:
00505     return 0;
00506 } /* bandv_ */

int bisect_ integer   n,
doublereal   eps1,
doublereal   d__,
doublereal   e,
doublereal   e2,
doublereal   lb,
doublereal   ub,
integer   mm,
integer   m,
doublereal   w,
integer   ind,
integer   ierr,
doublereal   rv4,
doublereal   rv5
 

Definition at line 12 of file eis_bisect.c.

References abs, c_b26, epslon_(), ind, l, m1, m2, max, min, p, q, v, and x0.

00016 {
00017     /* System generated locals */
00018     integer i__1, i__2;
00019     doublereal d__1, d__2, d__3;
00020 
00021     /* Local variables */
00022     static integer i__, j, k, l, p, q, r__, s;
00023     static doublereal u, v;
00024     static integer m1, m2;
00025     static doublereal t1, t2, x0, x1;
00026     static integer ii;
00027     static doublereal xu;
00028     extern doublereal epslon_(doublereal *);
00029     static integer isturm, tag;
00030     static doublereal tst1, tst2;
00031 
00032 
00033 
00034 /*     THIS SUBROUTINE IS A TRANSLATION OF THE BISECTION TECHNIQUE */
00035 /*     IN THE ALGOL PROCEDURE TRISTURM BY PETERS AND WILKINSON. */
00036 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 418-439(1971). */
00037 
00038 /*     THIS SUBROUTINE FINDS THOSE EIGENVALUES OF A TRIDIAGONAL */
00039 /*     SYMMETRIC MATRIX WHICH LIE IN A SPECIFIED INTERVAL, */
00040 /*     USING BISECTION. */
00041 
00042 /*     ON INPUT */
00043 
00044 /*        N IS THE ORDER OF THE MATRIX. */
00045 
00046 /*        EPS1 IS AN ABSOLUTE ERROR TOLERANCE FOR THE COMPUTED */
00047 /*          EIGENVALUES.  IF THE INPUT EPS1 IS NON-POSITIVE, */
00048 /*          IT IS RESET FOR EACH SUBMATRIX TO A DEFAULT VALUE, */
00049 /*          NAMELY, MINUS THE PRODUCT OF THE RELATIVE MACHINE */
00050 /*          PRECISION AND THE 1-NORM OF THE SUBMATRIX. */
00051 
00052 /*        D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX. */
00053 
00054 /*        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX */
00055 /*          IN ITS LAST N-1 POSITIONS.  E(1) IS ARBITRARY. */
00056 
00057 /*        E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E. */
00058 /*          E2(1) IS ARBITRARY. */
00059 
00060 /*        LB AND UB DEFINE THE INTERVAL TO BE SEARCHED FOR EIGENVALUES. */
00061 /*          IF LB IS NOT LESS THAN UB, NO EIGENVALUES WILL BE FOUND. */
00062 
00063 /*        MM SHOULD BE SET TO AN UPPER BOUND FOR THE NUMBER OF */
00064 /*          EIGENVALUES IN THE INTERVAL.  WARNING. IF MORE THAN */
00065 /*          MM EIGENVALUES ARE DETERMINED TO LIE IN THE INTERVAL, */
00066 /*          AN ERROR RETURN IS MADE WITH NO EIGENVALUES FOUND. */
00067 
00068 /*     ON OUTPUT */
00069 
00070 /*        EPS1 IS UNALTERED UNLESS IT HAS BEEN RESET TO ITS */
00071 /*          (LAST) DEFAULT VALUE. */
00072 
00073 /*        D AND E ARE UNALTERED. */
00074 
00075 /*        ELEMENTS OF E2, CORRESPONDING TO ELEMENTS OF E REGARDED */
00076 /*          AS NEGLIGIBLE, HAVE BEEN REPLACED BY ZERO CAUSING THE */
00077 /*          MATRIX TO SPLIT INTO A DIRECT SUM OF SUBMATRICES. */
00078 /*          E2(1) IS ALSO SET TO ZERO. */
00079 
00080 /*        M IS THE NUMBER OF EIGENVALUES DETERMINED TO LIE IN (LB,UB). */
00081 
00082 /*        W CONTAINS THE M EIGENVALUES IN ASCENDING ORDER. */
00083 
00084 /*        IND CONTAINS IN ITS FIRST M POSITIONS THE SUBMATRIX INDICES */
00085 /*          ASSOCIATED WITH THE CORRESPONDING EIGENVALUES IN W -- */
00086 /*          1 FOR EIGENVALUES BELONGING TO THE FIRST SUBMATRIX FROM */
00087 /*          THE TOP, 2 FOR THOSE BELONGING TO THE SECOND SUBMATRIX, ETC.. 
00088 */
00089 
00090 /*        IERR IS SET TO */
00091 /*          ZERO       FOR NORMAL RETURN, */
00092 /*          3*N+1      IF M EXCEEDS MM. */
00093 
00094 /*        RV4 AND RV5 ARE TEMPORARY STORAGE ARRAYS. */
00095 
00096 /*     THE ALGOL PROCEDURE STURMCNT CONTAINED IN TRISTURM */
00097 /*     APPEARS IN BISECT IN-LINE. */
00098 
00099 /*     NOTE THAT SUBROUTINE TQL1 OR IMTQL1 IS GENERALLY FASTER THAN */
00100 /*     BISECT, IF MORE THAN N/4 EIGENVALUES ARE TO BE FOUND. */
00101 
00102 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00103 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00104 */
00105 
00106 /*     THIS VERSION DATED AUGUST 1983. */
00107 
00108 /*     ------------------------------------------------------------------ 
00109 */
00110 
00111     /* Parameter adjustments */
00112     --rv5;
00113     --rv4;
00114     --e2;
00115     --e;
00116     --d__;
00117     --ind;
00118     --w;
00119 
00120     /* Function Body */
00121     *ierr = 0;
00122     tag = 0;
00123     t1 = *lb;
00124     t2 = *ub;
00125 /*     .......... LOOK FOR SMALL SUB-DIAGONAL ENTRIES .......... */
00126     i__1 = *n;
00127     for (i__ = 1; i__ <= i__1; ++i__) {
00128         if (i__ == 1) {
00129             goto L20;
00130         }
00131         tst1 = (d__1 = d__[i__], abs(d__1)) + (d__2 = d__[i__ - 1], abs(d__2))
00132                 ;
00133         tst2 = tst1 + (d__1 = e[i__], abs(d__1));
00134         if (tst2 > tst1) {
00135             goto L40;
00136         }
00137 L20:
00138         e2[i__] = 0.;
00139 L40:
00140         ;
00141     }
00142 /*     .......... DETERMINE THE NUMBER OF EIGENVALUES */
00143 /*                IN THE INTERVAL .......... */
00144     p = 1;
00145     q = *n;
00146     x1 = *ub;
00147     isturm = 1;
00148     goto L320;
00149 L60:
00150     *m = s;
00151     x1 = *lb;
00152     isturm = 2;
00153     goto L320;
00154 L80:
00155     *m -= s;
00156     if (*m > *mm) {
00157         goto L980;
00158     }
00159     q = 0;
00160     r__ = 0;
00161 /*     .......... ESTABLISH AND PROCESS NEXT SUBMATRIX, REFINING */
00162 /*                INTERVAL BY THE GERSCHGORIN BOUNDS .......... */
00163 L100:
00164     if (r__ == *m) {
00165         goto L1001;
00166     }
00167     ++tag;
00168     p = q + 1;
00169     xu = d__[p];
00170     x0 = d__[p];
00171     u = 0.;
00172 
00173     i__1 = *n;
00174     for (q = p; q <= i__1; ++q) {
00175         x1 = u;
00176         u = 0.;
00177         v = 0.;
00178         if (q == *n) {
00179             goto L110;
00180         }
00181         u = (d__1 = e[q + 1], abs(d__1));
00182         v = e2[q + 1];
00183 L110:
00184 /* Computing MIN */
00185         d__1 = d__[q] - (x1 + u);
00186         xu = min(d__1,xu);
00187 /* Computing MAX */
00188         d__1 = d__[q] + (x1 + u);
00189         x0 = max(d__1,x0);
00190         if (v == 0.) {
00191             goto L140;
00192         }
00193 /* L120: */
00194     }
00195 
00196 L140:
00197 /* Computing MAX */
00198     d__2 = abs(xu), d__3 = abs(x0);
00199     d__1 = max(d__2,d__3);
00200     x1 = epslon_(&d__1);
00201     if (*eps1 <= 0.) {
00202         *eps1 = -x1;
00203     }
00204     if (p != q) {
00205         goto L180;
00206     }
00207 /*     .......... CHECK FOR ISOLATED ROOT WITHIN INTERVAL .......... */
00208     if (t1 > d__[p] || d__[p] >= t2) {
00209         goto L940;
00210     }
00211     m1 = p;
00212     m2 = p;
00213     rv5[p] = d__[p];
00214     goto L900;
00215 L180:
00216     x1 *= q - p + 1;
00217 /* Computing MAX */
00218     d__1 = t1, d__2 = xu - x1;
00219     *lb = max(d__1,d__2);
00220 /* Computing MIN */
00221     d__1 = t2, d__2 = x0 + x1;
00222     *ub = min(d__1,d__2);
00223     x1 = *lb;
00224     isturm = 3;
00225     goto L320;
00226 L200:
00227     m1 = s + 1;
00228     x1 = *ub;
00229     isturm = 4;
00230     goto L320;
00231 L220:
00232     m2 = s;
00233     if (m1 > m2) {
00234         goto L940;
00235     }
00236 /*     .......... FIND ROOTS BY BISECTION .......... */
00237     x0 = *ub;
00238     isturm = 5;
00239 
00240     i__1 = m2;
00241     for (i__ = m1; i__ <= i__1; ++i__) {
00242         rv5[i__] = *ub;
00243         rv4[i__] = *lb;
00244 /* L240: */
00245     }
00246 /*     .......... LOOP FOR K-TH EIGENVALUE */
00247 /*                FOR K=M2 STEP -1 UNTIL M1 DO -- */
00248 /*                (-DO- NOT USED TO LEGALIZE -COMPUTED GO TO-) .......... 
00249 */
00250     k = m2;
00251 L250:
00252     xu = *lb;
00253 /*     .......... FOR I=K STEP -1 UNTIL M1 DO -- .......... */
00254     i__1 = k;
00255     for (ii = m1; ii <= i__1; ++ii) {
00256         i__ = m1 + k - ii;
00257         if (xu >= rv4[i__]) {
00258             goto L260;
00259         }
00260         xu = rv4[i__];
00261         goto L280;
00262 L260:
00263         ;
00264     }
00265 
00266 L280:
00267     if (x0 > rv5[k]) {
00268         x0 = rv5[k];
00269     }
00270 /*     .......... NEXT BISECTION STEP .......... */
00271 L300:
00272     x1 = (xu + x0) * .5;
00273     if (x0 - xu <= abs(*eps1)) {
00274         goto L420;
00275     }
00276     tst1 = (abs(xu) + abs(x0)) * 2.;
00277     tst2 = tst1 + (x0 - xu);
00278     if (tst2 == tst1) {
00279         goto L420;
00280     }
00281 /*     .......... IN-LINE PROCEDURE FOR STURM SEQUENCE .......... */
00282 L320:
00283     s = p - 1;
00284     u = 1.;
00285 
00286     i__1 = q;
00287     for (i__ = p; i__ <= i__1; ++i__) {
00288         if (u != 0.) {
00289             goto L325;
00290         }
00291         v = (d__1 = e[i__], abs(d__1)) / epslon_(&c_b26);
00292         if (e2[i__] == 0.) {
00293             v = 0.;
00294         }
00295         goto L330;
00296 L325:
00297         v = e2[i__] / u;
00298 L330:
00299         u = d__[i__] - x1 - v;
00300         if (u < 0.) {
00301             ++s;
00302         }
00303 /* L340: */
00304     }
00305 
00306     switch (isturm) {
00307         case 1:  goto L60;
00308         case 2:  goto L80;
00309         case 3:  goto L200;
00310         case 4:  goto L220;
00311         case 5:  goto L360;
00312     }
00313 /*     .......... REFINE INTERVALS .......... */
00314 L360:
00315     if (s >= k) {
00316         goto L400;
00317     }
00318     xu = x1;
00319     if (s >= m1) {
00320         goto L380;
00321     }
00322     rv4[m1] = x1;
00323     goto L300;
00324 L380:
00325     rv4[s + 1] = x1;
00326     if (rv5[s] > x1) {
00327         rv5[s] = x1;
00328     }
00329     goto L300;
00330 L400:
00331     x0 = x1;
00332     goto L300;
00333 /*     .......... K-TH EIGENVALUE FOUND .......... */
00334 L420:
00335     rv5[k] = x1;
00336     --k;
00337     if (k >= m1) {
00338         goto L250;
00339     }
00340 /*     .......... ORDER EIGENVALUES TAGGED WITH THEIR */
00341 /*                SUBMATRIX ASSOCIATIONS .......... */
00342 L900:
00343     s = r__;
00344     r__ = r__ + m2 - m1 + 1;
00345     j = 1;
00346     k = m1;
00347 
00348     i__1 = r__;
00349     for (l = 1; l <= i__1; ++l) {
00350         if (j > s) {
00351             goto L910;
00352         }
00353         if (k > m2) {
00354             goto L940;
00355         }
00356         if (rv5[k] >= w[l]) {
00357             goto L915;
00358         }
00359 
00360         i__2 = s;
00361         for (ii = j; ii <= i__2; ++ii) {
00362             i__ = l + s - ii;
00363             w[i__ + 1] = w[i__];
00364             ind[i__ + 1] = ind[i__];
00365 /* L905: */
00366         }
00367 
00368 L910:
00369         w[l] = rv5[k];
00370         ind[l] = tag;
00371         ++k;
00372         goto L920;
00373 L915:
00374         ++j;
00375 L920:
00376         ;
00377     }
00378 
00379 L940:
00380     if (q < *n) {
00381         goto L100;
00382     }
00383     goto L1001;
00384 /*     .......... SET ERROR -- UNDERESTIMATE OF NUMBER OF */
00385 /*                EIGENVALUES IN INTERVAL .......... */
00386 L980:
00387     *ierr = *n * 3 + 1;
00388 L1001:
00389     *lb = t1;
00390     *ub = t2;
00391     return 0;
00392 } /* bisect_ */

int bqr_ integer   nm,
integer   n,
integer   mb,
doublereal   a,
doublereal   t,
doublereal   r__,
integer   ierr,
integer   nv,
doublereal   rv
 

Definition at line 12 of file eis_bqr.c.

References a, abs, c_b8, d_sign(), l, m1, m2, max, min, pythag_(), q, and scale.

00015 {
00016     /* System generated locals */
00017     integer a_dim1, a_offset, i__1, i__2, i__3;
00018     doublereal d__1;
00019 
00020     /* Builtin functions */
00021     double d_sign(doublereal *, doublereal *), sqrt(doublereal);
00022 
00023     /* Local variables */
00024     static doublereal f, g;
00025     static integer i__, j, k, l, m;
00026     static doublereal q, s, scale;
00027     static integer imult, m1, m2, m3, m4, m21, m31, ii, ik, jk, kj, jm, kk, 
00028             km, ll, mk, mn, ni, mz;
00029     extern doublereal pythag_(doublereal *, doublereal *);
00030     static integer kj1, its;
00031     static doublereal tst1, tst2;
00032 
00033 
00034 
00035 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE BQR, */
00036 /*     NUM. MATH. 16, 85-92(1970) BY MARTIN, REINSCH, AND WILKINSON. */
00037 /*     HANDBOOK FOR AUTO. COMP., VOL II-LINEAR ALGEBRA, 266-272(1971). */
00038 
00039 /*     THIS SUBROUTINE FINDS THE EIGENVALUE OF SMALLEST (USUALLY) */
00040 /*     MAGNITUDE OF A REAL SYMMETRIC BAND MATRIX USING THE */
00041 /*     QR ALGORITHM WITH SHIFTS OF ORIGIN.  CONSECUTIVE CALLS */
00042 /*     CAN BE MADE TO FIND FURTHER EIGENVALUES. */
00043 
00044 /*     ON INPUT */
00045 
00046 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00047 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00048 /*          DIMENSION STATEMENT. */
00049 
00050 /*        N IS THE ORDER OF THE MATRIX. */
00051 
00052 /*        MB IS THE (HALF) BAND WIDTH OF THE MATRIX, DEFINED AS THE */
00053 /*          NUMBER OF ADJACENT DIAGONALS, INCLUDING THE PRINCIPAL */
00054 /*          DIAGONAL, REQUIRED TO SPECIFY THE NON-ZERO PORTION OF THE */
00055 /*          LOWER TRIANGLE OF THE MATRIX. */
00056 
00057 /*        A CONTAINS THE LOWER TRIANGLE OF THE SYMMETRIC BAND INPUT */
00058 /*          MATRIX STORED AS AN N BY MB ARRAY.  ITS LOWEST SUBDIAGONAL */
00059 /*          IS STORED IN THE LAST N+1-MB POSITIONS OF THE FIRST COLUMN, */
00060 /*          ITS NEXT SUBDIAGONAL IN THE LAST N+2-MB POSITIONS OF THE */
00061 /*          SECOND COLUMN, FURTHER SUBDIAGONALS SIMILARLY, AND FINALLY */
00062 /*          ITS PRINCIPAL DIAGONAL IN THE N POSITIONS OF THE LAST COLUMN. 
00063 */
00064 /*          CONTENTS OF STORAGES NOT PART OF THE MATRIX ARE ARBITRARY. */
00065 /*          ON A SUBSEQUENT CALL, ITS OUTPUT CONTENTS FROM THE PREVIOUS */
00066 /*          CALL SHOULD BE PASSED. */
00067 
00068 /*        T SPECIFIES THE SHIFT (OF EIGENVALUES) APPLIED TO THE DIAGONAL 
00069 */
00070 /*          OF A IN FORMING THE INPUT MATRIX. WHAT IS ACTUALLY DETERMINED 
00071 */
00072 /*          IS THE EIGENVALUE OF A+TI (I IS THE IDENTITY MATRIX) NEAREST 
00073 */
00074 /*          TO T.  ON A SUBSEQUENT CALL, THE OUTPUT VALUE OF T FROM THE */
00075 /*          PREVIOUS CALL SHOULD BE PASSED IF THE NEXT NEAREST EIGENVALUE 
00076 */
00077 /*          IS SOUGHT. */
00078 
00079 /*        R SHOULD BE SPECIFIED AS ZERO ON THE FIRST CALL, AND AS ITS */
00080 /*          OUTPUT VALUE FROM THE PREVIOUS CALL ON A SUBSEQUENT CALL. */
00081 /*          IT IS USED TO DETERMINE WHEN THE LAST ROW AND COLUMN OF */
00082 /*          THE TRANSFORMED BAND MATRIX CAN BE REGARDED AS NEGLIGIBLE. */
00083 
00084 /*        NV MUST BE SET TO THE DIMENSION OF THE ARRAY PARAMETER RV */
00085 /*          AS DECLARED IN THE CALLING PROGRAM DIMENSION STATEMENT. */
00086 
00087 /*     ON OUTPUT */
00088 
00089 /*        A CONTAINS THE TRANSFORMED BAND MATRIX.  THE MATRIX A+TI */
00090 /*          DERIVED FROM THE OUTPUT PARAMETERS IS SIMILAR TO THE */
00091 /*          INPUT A+TI TO WITHIN ROUNDING ERRORS.  ITS LAST ROW AND */
00092 /*          COLUMN ARE NULL (IF IERR IS ZERO). */
00093 
00094 /*        T CONTAINS THE COMPUTED EIGENVALUE OF A+TI (IF IERR IS ZERO). */
00095 
00096 /*        R CONTAINS THE MAXIMUM OF ITS INPUT VALUE AND THE NORM OF THE */
00097 /*          LAST COLUMN OF THE INPUT MATRIX A. */
00098 
00099 /*        IERR IS SET TO */
00100 /*          ZERO       FOR NORMAL RETURN, */
00101 /*          N          IF THE EIGENVALUE HAS NOT BEEN */
00102 /*                     DETERMINED AFTER 30 ITERATIONS. */
00103 
00104 /*        RV IS A TEMPORARY STORAGE ARRAY OF DIMENSION AT LEAST */
00105 /*          (2*MB**2+4*MB-3).  THE FIRST (3*MB-2) LOCATIONS CORRESPOND */
00106 /*          TO THE ALGOL ARRAY B, THE NEXT (2*MB-1) LOCATIONS CORRESPOND 
00107 */
00108 /*          TO THE ALGOL ARRAY H, AND THE FINAL (2*MB**2-MB) LOCATIONS */
00109 /*          CORRESPOND TO THE MB BY (2*MB-1) ALGOL ARRAY U. */
00110 
00111 /*     NOTE. FOR A SUBSEQUENT CALL, N SHOULD BE REPLACED BY N-1, BUT */
00112 /*     MB SHOULD NOT BE ALTERED EVEN WHEN IT EXCEEDS THE CURRENT N. */
00113 
00114 /*     CALLS PYTHAG FOR  DSQRT(A*A + B*B) . */
00115 
00116 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00117 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00118 */
00119 
00120 /*     THIS VERSION DATED AUGUST 1983. */
00121 
00122 /*     ------------------------------------------------------------------ 
00123 */
00124 
00125     /* Parameter adjustments */
00126     a_dim1 = *nm;
00127     a_offset = a_dim1 + 1;
00128     a -= a_offset;
00129     --rv;
00130 
00131     /* Function Body */
00132     *ierr = 0;
00133     m1 = min(*mb,*n);
00134     m = m1 - 1;
00135     m2 = m + m;
00136     m21 = m2 + 1;
00137     m3 = m21 + m;
00138     m31 = m3 + 1;
00139     m4 = m31 + m2;
00140     mn = m + *n;
00141     mz = *mb - m1;
00142     its = 0;
00143 /*     .......... TEST FOR CONVERGENCE .......... */
00144 L40:
00145     g = a[*n + *mb * a_dim1];
00146     if (m == 0) {
00147         goto L360;
00148     }
00149     f = 0.;
00150 
00151     i__1 = m;
00152     for (k = 1; k <= i__1; ++k) {
00153         mk = k + mz;
00154         f += (d__1 = a[*n + mk * a_dim1], abs(d__1));
00155 /* L50: */
00156     }
00157 
00158     if (its == 0 && f > *r__) {
00159         *r__ = f;
00160     }
00161     tst1 = *r__;
00162     tst2 = tst1 + f;
00163     if (tst2 <= tst1) {
00164         goto L360;
00165     }
00166     if (its == 30) {
00167         goto L1000;
00168     }
00169     ++its;
00170 /*     .......... FORM SHIFT FROM BOTTOM 2 BY 2 MINOR .......... */
00171     if (f > *r__ * .25 && its < 5) {
00172         goto L90;
00173     }
00174     f = a[*n + (*mb - 1) * a_dim1];
00175     if (f == 0.) {
00176         goto L70;
00177     }
00178     q = (a[*n - 1 + *mb * a_dim1] - g) / (f * 2.);
00179     s = pythag_(&q, &c_b8);
00180     g -= f / (q + d_sign(&s, &q));
00181 L70:
00182     *t += g;
00183 
00184     i__1 = *n;
00185     for (i__ = 1; i__ <= i__1; ++i__) {
00186 /* L80: */
00187         a[i__ + *mb * a_dim1] -= g;
00188     }
00189 
00190 L90:
00191     i__1 = m4;
00192     for (k = m31; k <= i__1; ++k) {
00193 /* L100: */
00194         rv[k] = 0.;
00195     }
00196 
00197     i__1 = mn;
00198     for (ii = 1; ii <= i__1; ++ii) {
00199         i__ = ii - m;
00200         ni = *n - ii;
00201         if (ni < 0) {
00202             goto L230;
00203         }
00204 /*     .......... FORM COLUMN OF SHIFTED MATRIX A-G*I .......... */
00205 /* Computing MAX */
00206         i__2 = 1, i__3 = 2 - i__;
00207         l = max(i__2,i__3);
00208 
00209         i__2 = m3;
00210         for (k = 1; k <= i__2; ++k) {
00211 /* L110: */
00212             rv[k] = 0.;
00213         }
00214 
00215         i__2 = m1;
00216         for (k = l; k <= i__2; ++k) {
00217             km = k + m;
00218             mk = k + mz;
00219             rv[km] = a[ii + mk * a_dim1];
00220 /* L120: */
00221         }
00222 
00223         ll = min(m,ni);
00224         if (ll == 0) {
00225             goto L135;
00226         }
00227 
00228         i__2 = ll;
00229         for (k = 1; k <= i__2; ++k) {
00230             km = k + m21;
00231             ik = ii + k;
00232             mk = *mb - k;
00233             rv[km] = a[ik + mk * a_dim1];
00234 /* L130: */
00235         }
00236 /*     .......... PRE-MULTIPLY WITH HOUSEHOLDER REFLECTIONS ..........
00237  */
00238 L135:
00239         ll = m2;
00240         imult = 0;
00241 /*     .......... MULTIPLICATION PROCEDURE .......... */
00242 L140:
00243         kj = m4 - m1;
00244 
00245         i__2 = ll;
00246         for (j = 1; j <= i__2; ++j) {
00247             kj += m1;
00248             jm = j + m3;
00249             if (rv[jm] == 0.) {
00250                 goto L170;
00251             }
00252             f = 0.;
00253 
00254             i__3 = m1;
00255             for (k = 1; k <= i__3; ++k) {
00256                 ++kj;
00257                 jk = j + k - 1;
00258                 f += rv[kj] * rv[jk];
00259 /* L150: */
00260             }
00261 
00262             f /= rv[jm];
00263             kj -= m1;
00264 
00265             i__3 = m1;
00266             for (k = 1; k <= i__3; ++k) {
00267                 ++kj;
00268                 jk = j + k - 1;
00269                 rv[jk] -= rv[kj] * f;
00270 /* L160: */
00271             }
00272 
00273             kj -= m1;
00274 L170:
00275             ;
00276         }
00277 
00278         if (imult != 0) {
00279             goto L280;
00280         }
00281 /*     .......... HOUSEHOLDER REFLECTION .......... */
00282         f = rv[m21];
00283         s = 0.;
00284         rv[m4] = 0.;
00285         scale = 0.;
00286 
00287         i__2 = m3;
00288         for (k = m21; k <= i__2; ++k) {
00289 /* L180: */
00290             scale += (d__1 = rv[k], abs(d__1));
00291         }
00292 
00293         if (scale == 0.) {
00294             goto L210;
00295         }
00296 
00297         i__2 = m3;
00298         for (k = m21; k <= i__2; ++k) {
00299 /* L190: */
00300 /* Computing 2nd power */
00301             d__1 = rv[k] / scale;
00302             s += d__1 * d__1;
00303         }
00304 
00305         s = scale * scale * s;
00306         d__1 = sqrt(s);
00307         g = -d_sign(&d__1, &f);
00308         rv[m21] = g;
00309         rv[m4] = s - f * g;
00310         kj = m4 + m2 * m1 + 1;
00311         rv[kj] = f - g;
00312 
00313         i__2 = m1;
00314         for (k = 2; k <= i__2; ++k) {
00315             ++kj;
00316             km = k + m2;
00317             rv[kj] = rv[km];
00318 /* L200: */
00319         }
00320 /*     .......... SAVE COLUMN OF TRIANGULAR FACTOR R .......... */
00321 L210:
00322         i__2 = m1;
00323         for (k = l; k <= i__2; ++k) {
00324             km = k + m;
00325             mk = k + mz;
00326             a[ii + mk * a_dim1] = rv[km];
00327 /* L220: */
00328         }
00329 
00330 L230:
00331 /* Computing MAX */
00332         i__2 = 1, i__3 = m1 + 1 - i__;
00333         l = max(i__2,i__3);
00334         if (i__ <= 0) {
00335             goto L300;
00336         }
00337 /*     .......... PERFORM ADDITIONAL STEPS .......... */
00338         i__2 = m21;
00339         for (k = 1; k <= i__2; ++k) {
00340 /* L240: */
00341             rv[k] = 0.;
00342         }
00343 
00344 /* Computing MIN */
00345         i__2 = m1, i__3 = ni + m1;
00346         ll = min(i__2,i__3);
00347 /*     .......... GET ROW OF TRIANGULAR FACTOR R .......... */
00348         i__2 = ll;
00349         for (kk = 1; kk <= i__2; ++kk) {
00350             k = kk - 1;
00351             km = k + m1;
00352             ik = i__ + k;
00353             mk = *mb - k;
00354             rv[km] = a[ik + mk * a_dim1];
00355 /* L250: */
00356         }
00357 /*     .......... POST-MULTIPLY WITH HOUSEHOLDER REFLECTIONS .........
00358 . */
00359         ll = m1;
00360         imult = 1;
00361         goto L140;
00362 /*     .......... STORE COLUMN OF NEW A MATRIX .......... */
00363 L280:
00364         i__2 = m1;
00365         for (k = l; k <= i__2; ++k) {
00366             mk = k + mz;
00367             a[i__ + mk * a_dim1] = rv[k];
00368 /* L290: */
00369         }
00370 /*     .......... UPDATE HOUSEHOLDER REFLECTIONS .......... */
00371 L300:
00372         if (l > 1) {
00373             --l;
00374         }
00375         kj1 = m4 + l * m1;
00376 
00377         i__2 = m2;
00378         for (j = l; j <= i__2; ++j) {
00379             jm = j + m3;
00380             rv[jm] = rv[jm + 1];
00381 
00382             i__3 = m1;
00383             for (k = 1; k <= i__3; ++k) {
00384                 ++kj1;
00385                 kj = kj1 - m1;
00386                 rv[kj] = rv[kj1];
00387 /* L320: */
00388             }
00389         }
00390 
00391 /* L350: */
00392     }
00393 
00394     goto L40;
00395 /*     .......... CONVERGENCE .......... */
00396 L360:
00397     *t += g;
00398 
00399     i__1 = *n;
00400     for (i__ = 1; i__ <= i__1; ++i__) {
00401 /* L380: */
00402         a[i__ + *mb * a_dim1] -= g;
00403     }
00404 
00405     i__1 = m1;
00406     for (k = 1; k <= i__1; ++k) {
00407         mk = k + mz;
00408         a[*n + mk * a_dim1] = 0.;
00409 /* L400: */
00410     }
00411 
00412     goto L1001;
00413 /*     .......... SET ERROR -- NO CONVERGENCE TO */
00414 /*                EIGENVALUE AFTER 30 ITERATIONS .......... */
00415 L1000:
00416     *ierr = *n;
00417 L1001:
00418     return 0;
00419 } /* bqr_ */

int cbabk2_ integer   nm,
integer   n,
integer   low,
integer   igh,
doublereal   scale,
integer   m,
doublereal   zr,
doublereal   zi
 

Definition at line 8 of file eis_cbabk2.c.

References scale.

Referenced by cg_().

00010 {
00011     /* System generated locals */
00012     integer zr_dim1, zr_offset, zi_dim1, zi_offset, i__1, i__2;
00013 
00014     /* Local variables */
00015     static integer i__, j, k;
00016     static doublereal s;
00017     static integer ii;
00018 
00019 
00020 
00021 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE */
00022 /*     CBABK2, WHICH IS A COMPLEX VERSION OF BALBAK, */
00023 /*     NUM. MATH. 13, 293-304(1969) BY PARLETT AND REINSCH. */
00024 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 315-326(1971). */
00025 
00026 /*     THIS SUBROUTINE FORMS THE EIGENVECTORS OF A COMPLEX GENERAL */
00027 /*     MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDING */
00028 /*     BALANCED MATRIX DETERMINED BY  CBAL. */
00029 
00030 /*     ON INPUT */
00031 
00032 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00033 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00034 /*          DIMENSION STATEMENT. */
00035 
00036 /*        N IS THE ORDER OF THE MATRIX. */
00037 
00038 /*        LOW AND IGH ARE INTEGERS DETERMINED BY  CBAL. */
00039 
00040 /*        SCALE CONTAINS INFORMATION DETERMINING THE PERMUTATIONS */
00041 /*          AND SCALING FACTORS USED BY  CBAL. */
00042 
00043 /*        M IS THE NUMBER OF EIGENVECTORS TO BE BACK TRANSFORMED. */
00044 
00045 /*        ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS, */
00046 /*          RESPECTIVELY, OF THE EIGENVECTORS TO BE */
00047 /*          BACK TRANSFORMED IN THEIR FIRST M COLUMNS. */
00048 
00049 /*     ON OUTPUT */
00050 
00051 /*        ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS, */
00052 /*          RESPECTIVELY, OF THE TRANSFORMED EIGENVECTORS */
00053 /*          IN THEIR FIRST M COLUMNS. */
00054 
00055 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00056 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00057 */
00058 
00059 /*     THIS VERSION DATED AUGUST 1983. */
00060 
00061 /*     ------------------------------------------------------------------ 
00062 */
00063 
00064     /* Parameter adjustments */
00065     --scale;
00066     zi_dim1 = *nm;
00067     zi_offset = zi_dim1 + 1;
00068     zi -= zi_offset;
00069     zr_dim1 = *nm;
00070     zr_offset = zr_dim1 + 1;
00071     zr -= zr_offset;
00072 
00073     /* Function Body */
00074     if (*m == 0) {
00075         goto L200;
00076     }
00077     if (*igh == *low) {
00078         goto L120;
00079     }
00080 
00081     i__1 = *igh;
00082     for (i__ = *low; i__ <= i__1; ++i__) {
00083         s = scale[i__];
00084 /*     .......... LEFT HAND EIGENVECTORS ARE BACK TRANSFORMED */
00085 /*                IF THE FOREGOING STATEMENT IS REPLACED BY */
00086 /*                S=1.0D0/SCALE(I). .......... */
00087         i__2 = *m;
00088         for (j = 1; j <= i__2; ++j) {
00089             zr[i__ + j * zr_dim1] *= s;
00090             zi[i__ + j * zi_dim1] *= s;
00091 /* L100: */
00092         }
00093 
00094 /* L110: */
00095     }
00096 /*     .......... FOR I=LOW-1 STEP -1 UNTIL 1, */
00097 /*                IGH+1 STEP 1 UNTIL N DO -- .......... */
00098 L120:
00099     i__1 = *n;
00100     for (ii = 1; ii <= i__1; ++ii) {
00101         i__ = ii;
00102         if (i__ >= *low && i__ <= *igh) {
00103             goto L140;
00104         }
00105         if (i__ < *low) {
00106             i__ = *low - ii;
00107         }
00108         k = (integer) scale[i__];
00109         if (k == i__) {
00110             goto L140;
00111         }
00112 
00113         i__2 = *m;
00114         for (j = 1; j <= i__2; ++j) {
00115             s = zr[i__ + j * zr_dim1];
00116             zr[i__ + j * zr_dim1] = zr[k + j * zr_dim1];
00117             zr[k + j * zr_dim1] = s;
00118             s = zi[i__ + j * zi_dim1];
00119             zi[i__ + j * zi_dim1] = zi[k + j * zi_dim1];
00120             zi[k + j * zi_dim1] = s;
00121 /* L130: */
00122         }
00123 
00124 L140:
00125         ;
00126     }
00127 
00128 L200:
00129     return 0;
00130 } /* cbabk2_ */

int cbal_ integer   nm,
integer   n,
doublereal   ar,
doublereal   ai,
integer   low,
integer   igh,
doublereal   scale
 

Definition at line 8 of file eis_cbal.c.

References abs, l, and scale.

Referenced by cg_().

00010 {
00011     /* System generated locals */
00012     integer ar_dim1, ar_offset, ai_dim1, ai_offset, i__1, i__2;
00013     doublereal d__1, d__2;
00014 
00015     /* Local variables */
00016     static integer iexc;
00017     static doublereal c__, f, g;
00018     static integer i__, j, k, l, m;
00019     static doublereal r__, s, radix, b2;
00020     static integer jj;
00021     static logical noconv;
00022 
00023 
00024 
00025 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE */
00026 /*     CBALANCE, WHICH IS A COMPLEX VERSION OF BALANCE, */
00027 /*     NUM. MATH. 13, 293-304(1969) BY PARLETT AND REINSCH. */
00028 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 315-326(1971). */
00029 
00030 /*     THIS SUBROUTINE BALANCES A COMPLEX MATRIX AND ISOLATES */
00031 /*     EIGENVALUES WHENEVER POSSIBLE. */
00032 
00033 /*     ON INPUT */
00034 
00035 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00036 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00037 /*          DIMENSION STATEMENT. */
00038 
00039 /*        N IS THE ORDER OF THE MATRIX. */
00040 
00041 /*        AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS, */
00042 /*          RESPECTIVELY, OF THE COMPLEX MATRIX TO BE BALANCED. */
00043 
00044 /*     ON OUTPUT */
00045 
00046 /*        AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS, */
00047 /*          RESPECTIVELY, OF THE BALANCED MATRIX. */
00048 
00049 /*        LOW AND IGH ARE TWO INTEGERS SUCH THAT AR(I,J) AND AI(I,J) */
00050 /*          ARE EQUAL TO ZERO IF */
00051 /*           (1) I IS GREATER THAN J AND */
00052 /*           (2) J=1,...,LOW-1 OR I=IGH+1,...,N. */
00053 
00054 /*        SCALE CONTAINS INFORMATION DETERMINING THE */
00055 /*           PERMUTATIONS AND SCALING FACTORS USED. */
00056 
00057 /*     SUPPOSE THAT THE PRINCIPAL SUBMATRIX IN ROWS LOW THROUGH IGH */
00058 /*     HAS BEEN BALANCED, THAT P(J) DENOTES THE INDEX INTERCHANGED */
00059 /*     WITH J DURING THE PERMUTATION STEP, AND THAT THE ELEMENTS */
00060 /*     OF THE DIAGONAL MATRIX USED ARE DENOTED BY D(I,J).  THEN */
00061 /*        SCALE(J) = P(J),    FOR J = 1,...,LOW-1 */
00062 /*                 = D(J,J)       J = LOW,...,IGH */
00063 /*                 = P(J)         J = IGH+1,...,N. */
00064 /*     THE ORDER IN WHICH THE INTERCHANGES ARE MADE IS N TO IGH+1, */
00065 /*     THEN 1 TO LOW-1. */
00066 
00067 /*     NOTE THAT 1 IS RETURNED FOR IGH IF IGH IS ZERO FORMALLY. */
00068 
00069 /*     THE ALGOL PROCEDURE EXC CONTAINED IN CBALANCE APPEARS IN */
00070 /*     CBAL  IN LINE.  (NOTE THAT THE ALGOL ROLES OF IDENTIFIERS */
00071 /*     K,L HAVE BEEN REVERSED.) */
00072 
00073 /*     ARITHMETIC IS REAL THROUGHOUT. */
00074 
00075 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00076 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00077 */
00078 
00079 /*     THIS VERSION DATED AUGUST 1983. */
00080 
00081 /*     ------------------------------------------------------------------ 
00082 */
00083 
00084     /* Parameter adjustments */
00085     --scale;
00086     ai_dim1 = *nm;
00087     ai_offset = ai_dim1 + 1;
00088     ai -= ai_offset;
00089     ar_dim1 = *nm;
00090     ar_offset = ar_dim1 + 1;
00091     ar -= ar_offset;
00092 
00093     /* Function Body */
00094     radix = 16.;
00095 
00096     b2 = radix * radix;
00097     k = 1;
00098     l = *n;
00099     goto L100;
00100 /*     .......... IN-LINE PROCEDURE FOR ROW AND */
00101 /*                COLUMN EXCHANGE .......... */
00102 L20:
00103     scale[m] = (doublereal) j;
00104     if (j == m) {
00105         goto L50;
00106     }
00107 
00108     i__1 = l;
00109     for (i__ = 1; i__ <= i__1; ++i__) {
00110         f = ar[i__ + j * ar_dim1];
00111         ar[i__ + j * ar_dim1] = ar[i__ + m * ar_dim1];
00112         ar[i__ + m * ar_dim1] = f;
00113         f = ai[i__ + j * ai_dim1];
00114         ai[i__ + j * ai_dim1] = ai[i__ + m * ai_dim1];
00115         ai[i__ + m * ai_dim1] = f;
00116 /* L30: */
00117     }
00118 
00119     i__1 = *n;
00120     for (i__ = k; i__ <= i__1; ++i__) {
00121         f = ar[j + i__ * ar_dim1];
00122         ar[j + i__ * ar_dim1] = ar[m + i__ * ar_dim1];
00123         ar[m + i__ * ar_dim1] = f;
00124         f = ai[j + i__ * ai_dim1];
00125         ai[j + i__ * ai_dim1] = ai[m + i__ * ai_dim1];
00126         ai[m + i__ * ai_dim1] = f;
00127 /* L40: */
00128     }
00129 
00130 L50:
00131     switch (iexc) {
00132         case 1:  goto L80;
00133         case 2:  goto L130;
00134     }
00135 /*     .......... SEARCH FOR ROWS ISOLATING AN EIGENVALUE */
00136 /*                AND PUSH THEM DOWN .......... */
00137 L80:
00138     if (l == 1) {
00139         goto L280;
00140     }
00141     --l;
00142 /*     .......... FOR J=L STEP -1 UNTIL 1 DO -- .......... */
00143 L100:
00144     i__1 = l;
00145     for (jj = 1; jj <= i__1; ++jj) {
00146         j = l + 1 - jj;
00147 
00148         i__2 = l;
00149         for (i__ = 1; i__ <= i__2; ++i__) {
00150             if (i__ == j) {
00151                 goto L110;
00152             }
00153             if (ar[j + i__ * ar_dim1] != 0. || ai[j + i__ * ai_dim1] != 0.) {
00154                 goto L120;
00155             }
00156 L110:
00157             ;
00158         }
00159 
00160         m = l;
00161         iexc = 1;
00162         goto L20;
00163 L120:
00164         ;
00165     }
00166 
00167     goto L140;
00168 /*     .......... SEARCH FOR COLUMNS ISOLATING AN EIGENVALUE */
00169 /*                AND PUSH THEM LEFT .......... */
00170 L130:
00171     ++k;
00172 
00173 L140:
00174     i__1 = l;
00175     for (j = k; j <= i__1; ++j) {
00176 
00177         i__2 = l;
00178         for (i__ = k; i__ <= i__2; ++i__) {
00179             if (i__ == j) {
00180                 goto L150;
00181             }
00182             if (ar[i__ + j * ar_dim1] != 0. || ai[i__ + j * ai_dim1] != 0.) {
00183                 goto L170;
00184             }
00185 L150:
00186             ;
00187         }
00188 
00189         m = k;
00190         iexc = 2;
00191         goto L20;
00192 L170:
00193         ;
00194     }
00195 /*     .......... NOW BALANCE THE SUBMATRIX IN ROWS K TO L .......... */
00196     i__1 = l;
00197     for (i__ = k; i__ <= i__1; ++i__) {
00198 /* L180: */
00199         scale[i__] = 1.;
00200     }
00201 /*     .......... ITERATIVE LOOP FOR NORM REDUCTION .......... */
00202 L190:
00203     noconv = FALSE_;
00204 
00205     i__1 = l;
00206     for (i__ = k; i__ <= i__1; ++i__) {
00207         c__ = 0.;
00208         r__ = 0.;
00209 
00210         i__2 = l;
00211         for (j = k; j <= i__2; ++j) {
00212             if (j == i__) {
00213                 goto L200;
00214             }
00215             c__ = c__ + (d__1 = ar[j + i__ * ar_dim1], abs(d__1)) + (d__2 = 
00216                     ai[j + i__ * ai_dim1], abs(d__2));
00217             r__ = r__ + (d__1 = ar[i__ + j * ar_dim1], abs(d__1)) + (d__2 = 
00218                     ai[i__ + j * ai_dim1], abs(d__2));
00219 L200:
00220             ;
00221         }
00222 /*     .......... GUARD AGAINST ZERO C OR R DUE TO UNDERFLOW .........
00223 . */
00224         if (c__ == 0. || r__ == 0.) {
00225             goto L270;
00226         }
00227         g = r__ / radix;
00228         f = 1.;
00229         s = c__ + r__;
00230 L210:
00231         if (c__ >= g) {
00232             goto L220;
00233         }
00234         f *= radix;
00235         c__ *= b2;
00236         goto L210;
00237 L220:
00238         g = r__ * radix;
00239 L230:
00240         if (c__ < g) {
00241             goto L240;
00242         }
00243         f /= radix;
00244         c__ /= b2;
00245         goto L230;
00246 /*     .......... NOW BALANCE .......... */
00247 L240:
00248         if ((c__ + r__) / f >= s * .95) {
00249             goto L270;
00250         }
00251         g = 1. / f;
00252         scale[i__] *= f;
00253         noconv = TRUE_;
00254 
00255         i__2 = *n;
00256         for (j = k; j <= i__2; ++j) {
00257             ar[i__ + j * ar_dim1] *= g;
00258             ai[i__ + j * ai_dim1] *= g;
00259 /* L250: */
00260         }
00261 
00262         i__2 = l;
00263         for (j = 1; j <= i__2; ++j) {
00264             ar[j + i__ * ar_dim1] *= f;
00265             ai[j + i__ * ai_dim1] *= f;
00266 /* L260: */
00267         }
00268 
00269 L270:
00270         ;
00271     }
00272 
00273     if (noconv) {
00274         goto L190;
00275     }
00276 
00277 L280:
00278     *low = k;
00279     *igh = l;
00280     return 0;
00281 } /* cbal_ */

int cdiv_ doublereal   ar,
doublereal   ai,
doublereal   br,
doublereal   bi,
doublereal   cr,
doublereal   ci
 

Definition at line 8 of file eis_cdiv.c.

References abs.

Referenced by cinvit_(), comhes_(), comlr2_(), comlr_(), comqr2_(), comqr_(), hqr2_(), and invit_().

00010 {
00011     /* System generated locals */
00012     doublereal d__1, d__2;
00013 
00014     /* Local variables */
00015     static doublereal s, ais, bis, ars, brs;
00016 
00017 
00018 /*     COMPLEX DIVISION, (CR,CI) = (AR,AI)/(BR,BI) */
00019 
00020     s = abs(*br) + abs(*bi);
00021     ars = *ar / s;
00022     ais = *ai / s;
00023     brs = *br / s;
00024     bis = *bi / s;
00025 /* Computing 2nd power */
00026     d__1 = brs;
00027 /* Computing 2nd power */
00028     d__2 = bis;
00029     s = d__1 * d__1 + d__2 * d__2;
00030     *cr = (ars * brs + ais * bis) / s;
00031     *ci = (ais * brs - ars * bis) / s;
00032     return 0;
00033 } /* cdiv_ */

int cg_ integer   nm,
integer   n,
doublereal   ar,
doublereal   ai,
doublereal   wr,
doublereal   wi,
integer   matz,
doublereal   zr,
doublereal   zi,
doublereal   fv1,
doublereal   fv2,
doublereal   fv3,
integer   ierr
 

Definition at line 8 of file eis_cg.c.

References cbabk2_(), cbal_(), comqr2_(), comqr_(), and corth_().

00012 {
00013     /* System generated locals */
00014     integer ar_dim1, ar_offset, ai_dim1, ai_offset, zr_dim1, zr_offset, 
00015             zi_dim1, zi_offset;
00016 
00017     /* Local variables */
00018     extern /* Subroutine */ int cbal_(integer *, integer *, doublereal *, 
00019             doublereal *, integer *, integer *, doublereal *), corth_(integer 
00020             *, integer *, integer *, integer *, doublereal *, doublereal *, 
00021             doublereal *, doublereal *), comqr_(integer *, integer *, integer 
00022             *, integer *, doublereal *, doublereal *, doublereal *, 
00023             doublereal *, integer *), cbabk2_(integer *, integer *, integer *,
00024              integer *, doublereal *, integer *, doublereal *, doublereal *), 
00025             comqr2_(integer *, integer *, integer *, integer *, doublereal *, 
00026             doublereal *, doublereal *, doublereal *, doublereal *, 
00027             doublereal *, doublereal *, doublereal *, integer *);
00028     static integer is1, is2;
00029 
00030 
00031 
00032 /*     THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OF */
00033 /*     SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK) */
00034 /*     TO FIND THE EIGENVALUES AND EIGENVECTORS (IF DESIRED) */
00035 /*     OF A COMPLEX GENERAL MATRIX. */
00036 
00037 /*     ON INPUT */
00038 
00039 /*        NM  MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL */
00040 /*        ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00041 /*        DIMENSION STATEMENT. */
00042 
00043 /*        N  IS THE ORDER OF THE MATRIX  A=(AR,AI). */
00044 
00045 /*        AR  AND  AI  CONTAIN THE REAL AND IMAGINARY PARTS, */
00046 /*        RESPECTIVELY, OF THE COMPLEX GENERAL MATRIX. */
00047 
00048 /*        MATZ  IS AN INTEGER VARIABLE SET EQUAL TO ZERO IF */
00049 /*        ONLY EIGENVALUES ARE DESIRED.  OTHERWISE IT IS SET TO */
00050 /*        ANY NON-ZERO INTEGER FOR BOTH EIGENVALUES AND EIGENVECTORS. */
00051 
00052 /*     ON OUTPUT */
00053 
00054 /*        WR  AND  WI  CONTAIN THE REAL AND IMAGINARY PARTS, */
00055 /*        RESPECTIVELY, OF THE EIGENVALUES. */
00056 
00057 /*        ZR  AND  ZI  CONTAIN THE REAL AND IMAGINARY PARTS, */
00058 /*        RESPECTIVELY, OF THE EIGENVECTORS IF MATZ IS NOT ZERO. */
00059 
00060 /*        IERR  IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERROR */
00061 /*           COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR COMQR */
00062 /*           AND COMQR2.  THE NORMAL COMPLETION CODE IS ZERO. */
00063 
00064 /*        FV1, FV2, AND  FV3  ARE TEMPORARY STORAGE ARRAYS. */
00065 
00066 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00067 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00068 */
00069 
00070 /*     THIS VERSION DATED AUGUST 1983. */
00071 
00072 /*     ------------------------------------------------------------------ 
00073 */
00074 
00075     /* Parameter adjustments */
00076     --fv3;
00077     --fv2;
00078     --fv1;
00079     zi_dim1 = *nm;
00080     zi_offset = zi_dim1 + 1;
00081     zi -= zi_offset;
00082     zr_dim1 = *nm;
00083     zr_offset = zr_dim1 + 1;
00084     zr -= zr_offset;
00085     --wi;
00086     --wr;
00087     ai_dim1 = *nm;
00088     ai_offset = ai_dim1 + 1;
00089     ai -= ai_offset;
00090     ar_dim1 = *nm;
00091     ar_offset = ar_dim1 + 1;
00092     ar -= ar_offset;
00093 
00094     /* Function Body */
00095     if (*n <= *nm) {
00096         goto L10;
00097     }
00098     *ierr = *n * 10;
00099     goto L50;
00100 
00101 L10:
00102     cbal_(nm, n, &ar[ar_offset], &ai[ai_offset], &is1, &is2, &fv1[1]);
00103     corth_(nm, n, &is1, &is2, &ar[ar_offset], &ai[ai_offset], &fv2[1], &fv3[1]
00104             );
00105     if (*matz != 0) {
00106         goto L20;
00107     }
00108 /*     .......... FIND EIGENVALUES ONLY .......... */
00109     comqr_(nm, n, &is1, &is2, &ar[ar_offset], &ai[ai_offset], &wr[1], &wi[1], 
00110             ierr);
00111     goto L50;
00112 /*     .......... FIND BOTH EIGENVALUES AND EIGENVECTORS .......... */
00113 L20:
00114     comqr2_(nm, n, &is1, &is2, &fv2[1], &fv3[1], &ar[ar_offset], &ai[
00115             ai_offset], &wr[1], &wi[1], &zr[zr_offset], &zi[zi_offset], ierr);
00116     if (*ierr != 0) {
00117         goto L50;
00118     }
00119     cbabk2_(nm, n, &is1, &is2, &fv1[1], n, &zr[zr_offset], &zi[zi_offset]);
00120 L50:
00121     return 0;
00122 } /* cg_ */

int ch_ integer   nm,
integer   n,
doublereal   ar,
doublereal   ai,
doublereal   w,
integer   matz,
doublereal   zr,
doublereal   zi,
doublereal   fv1,
doublereal   fv2,
doublereal   fm1,
integer   ierr
 

Definition at line 8 of file eis_ch.c.

References htribk_(), htridi_(), tql2_(), and tqlrat_().

00011 {
00012     /* System generated locals */
00013     integer ar_dim1, ar_offset, ai_dim1, ai_offset, zr_dim1, zr_offset, 
00014             zi_dim1, zi_offset, i__1, i__2;
00015 
00016     /* Local variables */
00017     static integer i__, j;
00018     extern /* Subroutine */ int htridi_(integer *, integer *, doublereal *, 
00019             doublereal *, doublereal *, doublereal *, doublereal *, 
00020             doublereal *), htribk_(integer *, integer *, doublereal *, 
00021             doublereal *, doublereal *, integer *, doublereal *, doublereal *)
00022             , tqlrat_(integer *, doublereal *, doublereal *, integer *), 
00023             tql2_(integer *, integer *, doublereal *, doublereal *, 
00024             doublereal *, integer *);
00025 
00026 
00027 
00028 /*     THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OF */
00029 /*     SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK) */
00030 /*     TO FIND THE EIGENVALUES AND EIGENVECTORS (IF DESIRED) */
00031 /*     OF A COMPLEX HERMITIAN MATRIX. */
00032 
00033 /*     ON INPUT */
00034 
00035 /*        NM  MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL */
00036 /*        ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00037 /*        DIMENSION STATEMENT. */
00038 
00039 /*        N  IS THE ORDER OF THE MATRIX  A=(AR,AI). */
00040 
00041 /*        AR  AND  AI  CONTAIN THE REAL AND IMAGINARY PARTS, */
00042 /*        RESPECTIVELY, OF THE COMPLEX HERMITIAN MATRIX. */
00043 
00044 /*        MATZ  IS AN INTEGER VARIABLE SET EQUAL TO ZERO IF */
00045 /*        ONLY EIGENVALUES ARE DESIRED.  OTHERWISE IT IS SET TO */
00046 /*        ANY NON-ZERO INTEGER FOR BOTH EIGENVALUES AND EIGENVECTORS. */
00047 
00048 /*     ON OUTPUT */
00049 
00050 /*        W  CONTAINS THE EIGENVALUES IN ASCENDING ORDER. */
00051 
00052 /*        ZR  AND  ZI  CONTAIN THE REAL AND IMAGINARY PARTS, */
00053 /*        RESPECTIVELY, OF THE EIGENVECTORS IF MATZ IS NOT ZERO. */
00054 
00055 /*        IERR  IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERROR */
00056 /*           COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR TQLRAT */
00057 /*           AND TQL2.  THE NORMAL COMPLETION CODE IS ZERO. */
00058 
00059 /*        FV1, FV2, AND  FM1  ARE TEMPORARY STORAGE ARRAYS. */
00060 
00061 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00062 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00063 */
00064 
00065 /*     THIS VERSION DATED AUGUST 1983. */
00066 
00067 /*     ------------------------------------------------------------------ 
00068 */
00069 
00070     /* Parameter adjustments */
00071     fm1 -= 3;
00072     --fv2;
00073     --fv1;
00074     zi_dim1 = *nm;
00075     zi_offset = zi_dim1 + 1;
00076     zi -= zi_offset;
00077     zr_dim1 = *nm;
00078     zr_offset = zr_dim1 + 1;
00079     zr -= zr_offset;
00080     --w;
00081     ai_dim1 = *nm;
00082     ai_offset = ai_dim1 + 1;
00083     ai -= ai_offset;
00084     ar_dim1 = *nm;
00085     ar_offset = ar_dim1 + 1;
00086     ar -= ar_offset;
00087 
00088     /* Function Body */
00089     if (*n <= *nm) {
00090         goto L10;
00091     }
00092     *ierr = *n * 10;
00093     goto L50;
00094 
00095 L10:
00096     htridi_(nm, n, &ar[ar_offset], &ai[ai_offset], &w[1], &fv1[1], &fv2[1], &
00097             fm1[3]);
00098     if (*matz != 0) {
00099         goto L20;
00100     }
00101 /*     .......... FIND EIGENVALUES ONLY .......... */
00102     tqlrat_(n, &w[1], &fv2[1], ierr);
00103     goto L50;
00104 /*     .......... FIND BOTH EIGENVALUES AND EIGENVECTORS .......... */
00105 L20:
00106     i__1 = *n;
00107     for (i__ = 1; i__ <= i__1; ++i__) {
00108 
00109         i__2 = *n;
00110         for (j = 1; j <= i__2; ++j) {
00111             zr[j + i__ * zr_dim1] = 0.;
00112 /* L30: */
00113         }
00114 
00115         zr[i__ + i__ * zr_dim1] = 1.;
00116 /* L40: */
00117     }
00118 
00119     tql2_(nm, n, &w[1], &fv1[1], &zr[zr_offset], ierr);
00120     if (*ierr != 0) {
00121         goto L50;
00122     }
00123     htribk_(nm, n, &ar[ar_offset], &ai[ai_offset], &fm1[3], n, &zr[zr_offset],
00124              &zi[zi_offset]);
00125 L50:
00126     return 0;
00127 } /* ch_ */

int cinvit_ integer   nm,
integer   n,
doublereal   ar,
doublereal   ai,
doublereal   wr,
doublereal   wi,
logical   select,
integer   mm,
integer   m,
doublereal   zr,
doublereal   zi,
integer   ierr,
doublereal   rm1,
doublereal   rm2,
doublereal   rv1,
doublereal   rv2
 

Definition at line 8 of file eis_cinvit.c.

References abs, cdiv_(), epslon_(), mp, and pythag_().

00013 {
00014     /* System generated locals */
00015     integer ar_dim1, ar_offset, ai_dim1, ai_offset, zr_dim1, zr_offset, 
00016             zi_dim1, zi_offset, rm1_dim1, rm1_offset, rm2_dim1, rm2_offset, 
00017             i__1, i__2, i__3;
00018     doublereal d__1, d__2;
00019 
00020     /* Builtin functions */
00021     double sqrt(doublereal);
00022 
00023     /* Local variables */
00024     extern /* Subroutine */ int cdiv_(doublereal *, doublereal *, doublereal *
00025             , doublereal *, doublereal *, doublereal *);
00026     static doublereal norm;
00027     static integer i__, j, k, s;
00028     static doublereal x, y, normv;
00029     static integer ii;
00030     static doublereal ilambd;
00031     static integer mp, uk;
00032     static doublereal rlambd;
00033     extern doublereal pythag_(doublereal *, doublereal *), epslon_(doublereal 
00034             *);
00035     static integer km1, ip1;
00036     static doublereal growto, ukroot;
00037     static integer its;
00038     static doublereal eps3;
00039 
00040 
00041 
00042 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE CX INVIT */
00043 /*     BY PETERS AND WILKINSON. */
00044 /*     HANDBOOK FOR AUTO. COMP. VOL.II-LINEAR ALGEBRA, 418-439(1971). */
00045 
00046 /*     THIS SUBROUTINE FINDS THOSE EIGENVECTORS OF A COMPLEX UPPER */
00047 /*     HESSENBERG MATRIX CORRESPONDING TO SPECIFIED EIGENVALUES, */
00048 /*     USING INVERSE ITERATION. */
00049 
00050 /*     ON INPUT */
00051 
00052 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00053 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00054 /*          DIMENSION STATEMENT. */
00055 
00056 /*        N IS THE ORDER OF THE MATRIX. */
00057 
00058 /*        AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS, */
00059 /*          RESPECTIVELY, OF THE HESSENBERG MATRIX. */
00060 
00061 /*        WR AND WI CONTAIN THE REAL AND IMAGINARY PARTS, RESPECTIVELY, */
00062 /*          OF THE EIGENVALUES OF THE MATRIX.  THE EIGENVALUES MUST BE */
00063 /*          STORED IN A MANNER IDENTICAL TO THAT OF SUBROUTINE  COMLR, */
00064 /*          WHICH RECOGNIZES POSSIBLE SPLITTING OF THE MATRIX. */
00065 
00066 /*        SELECT SPECIFIES THE EIGENVECTORS TO BE FOUND.  THE */
00067 /*          EIGENVECTOR CORRESPONDING TO THE J-TH EIGENVALUE IS */
00068 /*          SPECIFIED BY SETTING SELECT(J) TO .TRUE.. */
00069 
00070 /*        MM SHOULD BE SET TO AN UPPER BOUND FOR THE NUMBER OF */
00071 /*          EIGENVECTORS TO BE FOUND. */
00072 
00073 /*     ON OUTPUT */
00074 
00075 /*        AR, AI, WI, AND SELECT ARE UNALTERED. */
00076 
00077 /*        WR MAY HAVE BEEN ALTERED SINCE CLOSE EIGENVALUES ARE PERTURBED 
00078 */
00079 /*          SLIGHTLY IN SEARCHING FOR INDEPENDENT EIGENVECTORS. */
00080 
00081 /*        M IS THE NUMBER OF EIGENVECTORS ACTUALLY FOUND. */
00082 
00083 /*        ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS, RESPECTIVELY, */
00084 /*          OF THE EIGENVECTORS.  THE EIGENVECTORS ARE NORMALIZED */
00085 /*          SO THAT THE COMPONENT OF LARGEST MAGNITUDE IS 1. */
00086 /*          ANY VECTOR WHICH FAILS THE ACCEPTANCE TEST IS SET TO ZERO. */
00087 
00088 /*        IERR IS SET TO */
00089 /*          ZERO       FOR NORMAL RETURN, */
00090 /*          -(2*N+1)   IF MORE THAN MM EIGENVECTORS HAVE BEEN SPECIFIED, 
00091 */
00092 /*          -K         IF THE ITERATION CORRESPONDING TO THE K-TH */
00093 /*                     VALUE FAILS, */
00094 /*          -(N+K)     IF BOTH ERROR SITUATIONS OCCUR. */
00095 
00096 /*        RM1, RM2, RV1, AND RV2 ARE TEMPORARY STORAGE ARRAYS. */
00097 
00098 /*     THE ALGOL PROCEDURE GUESSVEC APPEARS IN CINVIT IN LINE. */
00099 
00100 /*     CALLS CDIV FOR COMPLEX DIVISION. */
00101 /*     CALLS PYTHAG FOR  DSQRT(A*A + B*B) . */
00102 
00103 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00104 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00105 */
00106 
00107 /*     THIS VERSION DATED AUGUST 1983. */
00108 
00109 /*     ------------------------------------------------------------------ 
00110 */
00111 
00112     /* Parameter adjustments */
00113     --rv2;
00114     --rv1;
00115     rm2_dim1 = *n;
00116     rm2_offset = rm2_dim1 + 1;
00117     rm2 -= rm2_offset;
00118     rm1_dim1 = *n;
00119     rm1_offset = rm1_dim1 + 1;
00120     rm1 -= rm1_offset;
00121     --select;
00122     --wi;
00123     --wr;
00124     ai_dim1 = *nm;
00125     ai_offset = ai_dim1 + 1;
00126     ai -= ai_offset;
00127     ar_dim1 = *nm;
00128     ar_offset = ar_dim1 + 1;
00129     ar -= ar_offset;
00130     zi_dim1 = *nm;
00131     zi_offset = zi_dim1 + 1;
00132     zi -= zi_offset;
00133     zr_dim1 = *nm;
00134     zr_offset = zr_dim1 + 1;
00135     zr -= zr_offset;
00136 
00137     /* Function Body */
00138     *ierr = 0;
00139     uk = 0;
00140     s = 1;
00141 
00142     i__1 = *n;
00143     for (k = 1; k <= i__1; ++k) {
00144         if (! select[k]) {
00145             goto L980;
00146         }
00147         if (s > *mm) {
00148             goto L1000;
00149         }
00150         if (uk >= k) {
00151             goto L200;
00152         }
00153 /*     .......... CHECK FOR POSSIBLE SPLITTING .......... */
00154         i__2 = *n;
00155         for (uk = k; uk <= i__2; ++uk) {
00156             if (uk == *n) {
00157                 goto L140;
00158             }
00159             if (ar[uk + 1 + uk * ar_dim1] == 0. && ai[uk + 1 + uk * ai_dim1] 
00160                     == 0.) {
00161                 goto L140;
00162             }
00163 /* L120: */
00164         }
00165 /*     .......... COMPUTE INFINITY NORM OF LEADING UK BY UK */
00166 /*                (HESSENBERG) MATRIX .......... */
00167 L140:
00168         norm = 0.;
00169         mp = 1;
00170 
00171         i__2 = uk;
00172         for (i__ = 1; i__ <= i__2; ++i__) {
00173             x = 0.;
00174 
00175             i__3 = uk;
00176             for (j = mp; j <= i__3; ++j) {
00177 /* L160: */
00178                 x += pythag_(&ar[i__ + j * ar_dim1], &ai[i__ + j * ai_dim1]);
00179             }
00180 
00181             if (x > norm) {
00182                 norm = x;
00183             }
00184             mp = i__;
00185 /* L180: */
00186         }
00187 /*     .......... EPS3 REPLACES ZERO PIVOT IN DECOMPOSITION */
00188 /*                AND CLOSE ROOTS ARE MODIFIED BY EPS3 .......... */
00189         if (norm == 0.) {
00190             norm = 1.;
00191         }
00192         eps3 = epslon_(&norm);
00193 /*     .......... GROWTO IS THE CRITERION FOR GROWTH .......... */
00194         ukroot = (doublereal) uk;
00195         ukroot = sqrt(ukroot);
00196         growto = .1 / ukroot;
00197 L200:
00198         rlambd = wr[k];
00199         ilambd = wi[k];
00200         if (k == 1) {
00201             goto L280;
00202         }
00203         km1 = k - 1;
00204         goto L240;
00205 /*     .......... PERTURB EIGENVALUE IF IT IS CLOSE */
00206 /*                TO ANY PREVIOUS EIGENVALUE .......... */
00207 L220:
00208         rlambd += eps3;
00209 /*     .......... FOR I=K-1 STEP -1 UNTIL 1 DO -- .......... */
00210 L240:
00211         i__2 = km1;
00212         for (ii = 1; ii <= i__2; ++ii) {
00213             i__ = k - ii;
00214             if (select[i__] && (d__1 = wr[i__] - rlambd, abs(d__1)) < eps3 && 
00215                     (d__2 = wi[i__] - ilambd, abs(d__2)) < eps3) {
00216                 goto L220;
00217             }
00218 /* L260: */
00219         }
00220 
00221         wr[k] = rlambd;
00222 /*     .......... FORM UPPER HESSENBERG (AR,AI)-(RLAMBD,ILAMBD)*I */
00223 /*                AND INITIAL COMPLEX VECTOR .......... */
00224 L280:
00225         mp = 1;
00226 
00227         i__2 = uk;
00228         for (i__ = 1; i__ <= i__2; ++i__) {
00229 
00230             i__3 = uk;
00231             for (j = mp; j <= i__3; ++j) {
00232                 rm1[i__ + j * rm1_dim1] = ar[i__ + j * ar_dim1];
00233                 rm2[i__ + j * rm2_dim1] = ai[i__ + j * ai_dim1];
00234 /* L300: */
00235             }
00236 
00237             rm1[i__ + i__ * rm1_dim1] -= rlambd;
00238             rm2[i__ + i__ * rm2_dim1] -= ilambd;
00239             mp = i__;
00240             rv1[i__] = eps3;
00241 /* L320: */
00242         }
00243 /*     .......... TRIANGULAR DECOMPOSITION WITH INTERCHANGES, */
00244 /*                REPLACING ZERO PIVOTS BY EPS3 .......... */
00245         if (uk == 1) {
00246             goto L420;
00247         }
00248 
00249         i__2 = uk;
00250         for (i__ = 2; i__ <= i__2; ++i__) {
00251             mp = i__ - 1;
00252             if (pythag_(&rm1[i__ + mp * rm1_dim1], &rm2[i__ + mp * rm2_dim1]) 
00253                     <= pythag_(&rm1[mp + mp * rm1_dim1], &rm2[mp + mp * 
00254                     rm2_dim1])) {
00255                 goto L360;
00256             }
00257 
00258             i__3 = uk;
00259             for (j = mp; j <= i__3; ++j) {
00260                 y = rm1[i__ + j * rm1_dim1];
00261                 rm1[i__ + j * rm1_dim1] = rm1[mp + j * rm1_dim1];
00262                 rm1[mp + j * rm1_dim1] = y;
00263                 y = rm2[i__ + j * rm2_dim1];
00264                 rm2[i__ + j * rm2_dim1] = rm2[mp + j * rm2_dim1];
00265                 rm2[mp + j * rm2_dim1] = y;
00266 /* L340: */
00267             }
00268 
00269 L360:
00270             if (rm1[mp + mp * rm1_dim1] == 0. && rm2[mp + mp * rm2_dim1] == 
00271                     0.) {
00272                 rm1[mp + mp * rm1_dim1] = eps3;
00273             }
00274             cdiv_(&rm1[i__ + mp * rm1_dim1], &rm2[i__ + mp * rm2_dim1], &rm1[
00275                     mp + mp * rm1_dim1], &rm2[mp + mp * rm2_dim1], &x, &y);
00276             if (x == 0. && y == 0.) {
00277                 goto L400;
00278             }
00279 
00280             i__3 = uk;
00281             for (j = i__; j <= i__3; ++j) {
00282                 rm1[i__ + j * rm1_dim1] = rm1[i__ + j * rm1_dim1] - x * rm1[
00283                         mp + j * rm1_dim1] + y * rm2[mp + j * rm2_dim1];
00284                 rm2[i__ + j * rm2_dim1] = rm2[i__ + j * rm2_dim1] - x * rm2[
00285                         mp + j * rm2_dim1] - y * rm1[mp + j * rm1_dim1];
00286 /* L380: */
00287             }
00288 
00289 L400:
00290             ;
00291         }
00292 
00293 L420:
00294         if (rm1[uk + uk * rm1_dim1] == 0. && rm2[uk + uk * rm2_dim1] == 0.) {
00295             rm1[uk + uk * rm1_dim1] = eps3;
00296         }
00297         its = 0;
00298 /*     .......... BACK SUBSTITUTION */
00299 /*                FOR I=UK STEP -1 UNTIL 1 DO -- .......... */
00300 L660:
00301         i__2 = uk;
00302         for (ii = 1; ii <= i__2; ++ii) {
00303             i__ = uk + 1 - ii;
00304             x = rv1[i__];
00305             y = 0.;
00306             if (i__ == uk) {
00307                 goto L700;
00308             }
00309             ip1 = i__ + 1;
00310 
00311             i__3 = uk;
00312             for (j = ip1; j <= i__3; ++j) {
00313                 x = x - rm1[i__ + j * rm1_dim1] * rv1[j] + rm2[i__ + j * 
00314                         rm2_dim1] * rv2[j];
00315                 y = y - rm1[i__ + j * rm1_dim1] * rv2[j] - rm2[i__ + j * 
00316                         rm2_dim1] * rv1[j];
00317 /* L680: */
00318             }
00319 
00320 L700:
00321             cdiv_(&x, &y, &rm1[i__ + i__ * rm1_dim1], &rm2[i__ + i__ * 
00322                     rm2_dim1], &rv1[i__], &rv2[i__]);
00323 /* L720: */
00324         }
00325 /*     .......... ACCEPTANCE TEST FOR EIGENVECTOR */
00326 /*                AND NORMALIZATION .......... */
00327         ++its;
00328         norm = 0.;
00329         normv = 0.;
00330 
00331         i__2 = uk;
00332         for (i__ = 1; i__ <= i__2; ++i__) {
00333             x = pythag_(&rv1[i__], &rv2[i__]);
00334             if (normv >= x) {
00335                 goto L760;
00336             }
00337             normv = x;
00338             j = i__;
00339 L760:
00340             norm += x;
00341 /* L780: */
00342         }
00343 
00344         if (norm < growto) {
00345             goto L840;
00346         }
00347 /*     .......... ACCEPT VECTOR .......... */
00348         x = rv1[j];
00349         y = rv2[j];
00350 
00351         i__2 = uk;
00352         for (i__ = 1; i__ <= i__2; ++i__) {
00353             cdiv_(&rv1[i__], &rv2[i__], &x, &y, &zr[i__ + s * zr_dim1], &zi[
00354                     i__ + s * zi_dim1]);
00355 /* L820: */
00356         }
00357 
00358         if (uk == *n) {
00359             goto L940;
00360         }
00361         j = uk + 1;
00362         goto L900;
00363 /*     .......... IN-LINE PROCEDURE FOR CHOOSING */
00364 /*                A NEW STARTING VECTOR .......... */
00365 L840:
00366         if (its >= uk) {
00367             goto L880;
00368         }
00369         x = ukroot;
00370         y = eps3 / (x + 1.);
00371         rv1[1] = eps3;
00372 
00373         i__2 = uk;
00374         for (i__ = 2; i__ <= i__2; ++i__) {
00375 /* L860: */
00376             rv1[i__] = y;
00377         }
00378 
00379         j = uk - its + 1;
00380         rv1[j] -= eps3 * x;
00381         goto L660;
00382 /*     .......... SET ERROR -- UNACCEPTED EIGENVECTOR .......... */
00383 L880:
00384         j = 1;
00385         *ierr = -k;
00386 /*     .......... SET REMAINING VECTOR COMPONENTS TO ZERO .......... 
00387 */
00388 L900:
00389         i__2 = *n;
00390         for (i__ = j; i__ <= i__2; ++i__) {
00391             zr[i__ + s * zr_dim1] = 0.;
00392             zi[i__ + s * zi_dim1] = 0.;
00393 /* L920: */
00394         }
00395 
00396 L940:
00397         ++s;
00398 L980:
00399         ;
00400     }
00401 
00402     goto L1001;
00403 /*     .......... SET ERROR -- UNDERESTIMATE OF EIGENVECTOR */
00404 /*                SPACE REQUIRED .......... */
00405 L1000:
00406     if (*ierr != 0) {
00407         *ierr -= *n;
00408     }
00409     if (*ierr == 0) {
00410         *ierr = -((*n << 1) + 1);
00411     }
00412 L1001:
00413     *m = s - 1;
00414     return 0;
00415 } /* cinvit_ */

int combak_ integer   nm,
integer   low,
integer   igh,
doublereal   ar,
doublereal   ai,
integer   int__,
integer   m,
doublereal   zr,
doublereal   zi
 

Definition at line 8 of file eis_combak.c.

References mp.

00011 {
00012     /* System generated locals */
00013     integer ar_dim1, ar_offset, ai_dim1, ai_offset, zr_dim1, zr_offset, 
00014             zi_dim1, zi_offset, i__1, i__2, i__3;
00015 
00016     /* Local variables */
00017     static integer i__, j, la, mm, mp;
00018     static doublereal xi, xr;
00019     static integer kp1, mp1;
00020 
00021 
00022 
00023 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE COMBAK, */
00024 /*     NUM. MATH. 12, 349-368(1968) BY MARTIN AND WILKINSON. */
00025 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 339-358(1971). */
00026 
00027 /*     THIS SUBROUTINE FORMS THE EIGENVECTORS OF A COMPLEX GENERAL */
00028 /*     MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDING */
00029 /*     UPPER HESSENBERG MATRIX DETERMINED BY  COMHES. */
00030 
00031 /*     ON INPUT */
00032 
00033 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00034 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00035 /*          DIMENSION STATEMENT. */
00036 
00037 /*        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING */
00038 /*          SUBROUTINE  CBAL.  IF  CBAL  HAS NOT BEEN USED, */
00039 /*          SET LOW=1 AND IGH EQUAL TO THE ORDER OF THE MATRIX. */
00040 
00041 /*        AR AND AI CONTAIN THE MULTIPLIERS WHICH WERE USED IN THE */
00042 /*          REDUCTION BY  COMHES  IN THEIR LOWER TRIANGLES */
00043 /*          BELOW THE SUBDIAGONAL. */
00044 
00045 /*        INT CONTAINS INFORMATION ON THE ROWS AND COLUMNS */
00046 /*          INTERCHANGED IN THE REDUCTION BY  COMHES. */
00047 /*          ONLY ELEMENTS LOW THROUGH IGH ARE USED. */
00048 
00049 /*        M IS THE NUMBER OF EIGENVECTORS TO BE BACK TRANSFORMED. */
00050 
00051 /*        ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS, */
00052 /*          RESPECTIVELY, OF THE EIGENVECTORS TO BE */
00053 /*          BACK TRANSFORMED IN THEIR FIRST M COLUMNS. */
00054 
00055 /*     ON OUTPUT */
00056 
00057 /*        ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS, */
00058 /*          RESPECTIVELY, OF THE TRANSFORMED EIGENVECTORS */
00059 /*          IN THEIR FIRST M COLUMNS. */
00060 
00061 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00062 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00063 */
00064 
00065 /*     THIS VERSION DATED AUGUST 1983. */
00066 
00067 /*     ------------------------------------------------------------------ 
00068 */
00069 
00070     /* Parameter adjustments */
00071     --int__;
00072     ai_dim1 = *nm;
00073     ai_offset = ai_dim1 + 1;
00074     ai -= ai_offset;
00075     ar_dim1 = *nm;
00076     ar_offset = ar_dim1 + 1;
00077     ar -= ar_offset;
00078     zi_dim1 = *nm;
00079     zi_offset = zi_dim1 + 1;
00080     zi -= zi_offset;
00081     zr_dim1 = *nm;
00082     zr_offset = zr_dim1 + 1;
00083     zr -= zr_offset;
00084 
00085     /* Function Body */
00086     if (*m == 0) {
00087         goto L200;
00088     }
00089     la = *igh - 1;
00090     kp1 = *low + 1;
00091     if (la < kp1) {
00092         goto L200;
00093     }
00094 /*     .......... FOR MP=IGH-1 STEP -1 UNTIL LOW+1 DO -- .......... */
00095     i__1 = la;
00096     for (mm = kp1; mm <= i__1; ++mm) {
00097         mp = *low + *igh - mm;
00098         mp1 = mp + 1;
00099 
00100         i__2 = *igh;
00101         for (i__ = mp1; i__ <= i__2; ++i__) {
00102             xr = ar[i__ + (mp - 1) * ar_dim1];
00103             xi = ai[i__ + (mp - 1) * ai_dim1];
00104             if (xr == 0. && xi == 0.) {
00105                 goto L110;
00106             }
00107 
00108             i__3 = *m;
00109             for (j = 1; j <= i__3; ++j) {
00110                 zr[i__ + j * zr_dim1] = zr[i__ + j * zr_dim1] + xr * zr[mp + 
00111                         j * zr_dim1] - xi * zi[mp + j * zi_dim1];
00112                 zi[i__ + j * zi_dim1] = zi[i__ + j * zi_dim1] + xr * zi[mp + 
00113                         j * zi_dim1] + xi * zr[mp + j * zr_dim1];
00114 /* L100: */
00115             }
00116 
00117 L110:
00118             ;
00119         }
00120 
00121         i__ = int__[mp];
00122         if (i__ == mp) {
00123             goto L140;
00124         }
00125 
00126         i__2 = *m;
00127         for (j = 1; j <= i__2; ++j) {
00128             xr = zr[i__ + j * zr_dim1];
00129             zr[i__ + j * zr_dim1] = zr[mp + j * zr_dim1];
00130             zr[mp + j * zr_dim1] = xr;
00131             xi = zi[i__ + j * zi_dim1];
00132             zi[i__ + j * zi_dim1] = zi[mp + j * zi_dim1];
00133             zi[mp + j * zi_dim1] = xi;
00134 /* L130: */
00135         }
00136 
00137 L140:
00138         ;
00139     }
00140 
00141 L200:
00142     return 0;
00143 } /* combak_ */

int comhes_ integer   nm,
integer   n,
integer   low,
integer   igh,
doublereal   ar,
doublereal   ai,
integer   int__
 

Definition at line 8 of file eis_comhes.c.

References abs, and cdiv_().

00010 {
00011     /* System generated locals */
00012     integer ar_dim1, ar_offset, ai_dim1, ai_offset, i__1, i__2, i__3;
00013     doublereal d__1, d__2;
00014 
00015     /* Local variables */
00016     extern /* Subroutine */ int cdiv_(doublereal *, doublereal *, doublereal *
00017             , doublereal *, doublereal *, doublereal *);
00018     static integer i__, j, m, la;
00019     static doublereal xi, yi, xr, yr;
00020     static integer mm1, kp1, mp1;
00021 
00022 
00023 
00024 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE COMHES, */
00025 /*     NUM. MATH. 12, 349-368(1968) BY MARTIN AND WILKINSON. */
00026 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 339-358(1971). */
00027 
00028 /*     GIVEN A COMPLEX GENERAL MATRIX, THIS SUBROUTINE */
00029 /*     REDUCES A SUBMATRIX SITUATED IN ROWS AND COLUMNS */
00030 /*     LOW THROUGH IGH TO UPPER HESSENBERG FORM BY */
00031 /*     STABILIZED ELEMENTARY SIMILARITY TRANSFORMATIONS. */
00032 
00033 /*     ON INPUT */
00034 
00035 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00036 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00037 /*          DIMENSION STATEMENT. */
00038 
00039 /*        N IS THE ORDER OF THE MATRIX. */
00040 
00041 /*        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING */
00042 /*          SUBROUTINE  CBAL.  IF  CBAL  HAS NOT BEEN USED, */
00043 /*          SET LOW=1, IGH=N. */
00044 
00045 /*        AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS, */
00046 /*          RESPECTIVELY, OF THE COMPLEX INPUT MATRIX. */
00047 
00048 /*     ON OUTPUT */
00049 
00050 /*        AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS, */
00051 /*          RESPECTIVELY, OF THE HESSENBERG MATRIX.  THE */
00052 /*          MULTIPLIERS WHICH WERE USED IN THE REDUCTION */
00053 /*          ARE STORED IN THE REMAINING TRIANGLES UNDER THE */
00054 /*          HESSENBERG MATRIX. */
00055 
00056 /*        INT CONTAINS INFORMATION ON THE ROWS AND COLUMNS */
00057 /*          INTERCHANGED IN THE REDUCTION. */
00058 /*          ONLY ELEMENTS LOW THROUGH IGH ARE USED. */
00059 
00060 /*     CALLS CDIV FOR COMPLEX DIVISION. */
00061 
00062 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00063 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00064 */
00065 
00066 /*     THIS VERSION DATED AUGUST 1983. */
00067 
00068 /*     ------------------------------------------------------------------ 
00069 */
00070 
00071     /* Parameter adjustments */
00072     ai_dim1 = *nm;
00073     ai_offset = ai_dim1 + 1;
00074     ai -= ai_offset;
00075     ar_dim1 = *nm;
00076     ar_offset = ar_dim1 + 1;
00077     ar -= ar_offset;
00078     --int__;
00079 
00080     /* Function Body */
00081     la = *igh - 1;
00082     kp1 = *low + 1;
00083     if (la < kp1) {
00084         goto L200;
00085     }
00086 
00087     i__1 = la;
00088     for (m = kp1; m <= i__1; ++m) {
00089         mm1 = m - 1;
00090         xr = 0.;
00091         xi = 0.;
00092         i__ = m;
00093 
00094         i__2 = *igh;
00095         for (j = m; j <= i__2; ++j) {
00096             if ((d__1 = ar[j + mm1 * ar_dim1], abs(d__1)) + (d__2 = ai[j + 
00097                     mm1 * ai_dim1], abs(d__2)) <= abs(xr) + abs(xi)) {
00098                 goto L100;
00099             }
00100             xr = ar[j + mm1 * ar_dim1];
00101             xi = ai[j + mm1 * ai_dim1];
00102             i__ = j;
00103 L100:
00104             ;
00105         }
00106 
00107         int__[m] = i__;
00108         if (i__ == m) {
00109             goto L130;
00110         }
00111 /*     .......... INTERCHANGE ROWS AND COLUMNS OF AR AND AI ..........
00112  */
00113         i__2 = *n;
00114         for (j = mm1; j <= i__2; ++j) {
00115             yr = ar[i__ + j * ar_dim1];
00116             ar[i__ + j * ar_dim1] = ar[m + j * ar_dim1];
00117             ar[m + j * ar_dim1] = yr;
00118             yi = ai[i__ + j * ai_dim1];
00119             ai[i__ + j * ai_dim1] = ai[m + j * ai_dim1];
00120             ai[m + j * ai_dim1] = yi;
00121 /* L110: */
00122         }
00123 
00124         i__2 = *igh;
00125         for (j = 1; j <= i__2; ++j) {
00126             yr = ar[j + i__ * ar_dim1];
00127             ar[j + i__ * ar_dim1] = ar[j + m * ar_dim1];
00128             ar[j + m * ar_dim1] = yr;
00129             yi = ai[j + i__ * ai_dim1];
00130             ai[j + i__ * ai_dim1] = ai[j + m * ai_dim1];
00131             ai[j + m * ai_dim1] = yi;
00132 /* L120: */
00133         }
00134 /*     .......... END INTERCHANGE .......... */
00135 L130:
00136         if (xr == 0. && xi == 0.) {
00137             goto L180;
00138         }
00139         mp1 = m + 1;
00140 
00141         i__2 = *igh;
00142         for (i__ = mp1; i__ <= i__2; ++i__) {
00143             yr = ar[i__ + mm1 * ar_dim1];
00144             yi = ai[i__ + mm1 * ai_dim1];
00145             if (yr == 0. && yi == 0.) {
00146                 goto L160;
00147             }
00148             cdiv_(&yr, &yi, &xr, &xi, &yr, &yi);
00149             ar[i__ + mm1 * ar_dim1] = yr;
00150             ai[i__ + mm1 * ai_dim1] = yi;
00151 
00152             i__3 = *n;
00153             for (j = m; j <= i__3; ++j) {
00154                 ar[i__ + j * ar_dim1] = ar[i__ + j * ar_dim1] - yr * ar[m + j 
00155                         * ar_dim1] + yi * ai[m + j * ai_dim1];
00156                 ai[i__ + j * ai_dim1] = ai[i__ + j * ai_dim1] - yr * ai[m + j 
00157                         * ai_dim1] - yi * ar[m + j * ar_dim1];
00158 /* L140: */
00159             }
00160 
00161             i__3 = *igh;
00162             for (j = 1; j <= i__3; ++j) {
00163                 ar[j + m * ar_dim1] = ar[j + m * ar_dim1] + yr * ar[j + i__ * 
00164                         ar_dim1] - yi * ai[j + i__ * ai_dim1];
00165                 ai[j + m * ai_dim1] = ai[j + m * ai_dim1] + yr * ai[j + i__ * 
00166                         ai_dim1] + yi * ar[j + i__ * ar_dim1];
00167 /* L150: */
00168             }
00169 
00170 L160:
00171             ;
00172         }
00173 
00174 L180:
00175         ;
00176     }
00177 
00178 L200:
00179     return 0;
00180 } /* comhes_ */

int comlr2_ integer   nm,
integer   n,
integer   low,
integer   igh,
integer   int__,
doublereal   hr,
doublereal   hi,
doublereal   wr,
doublereal   wi,
doublereal   zr,
doublereal   zi,
integer   ierr
 

Definition at line 8 of file eis_comlr2.c.

References abs, cdiv_(), csroot_(), l, and min.

00011 {
00012     /* System generated locals */
00013     integer hr_dim1, hr_offset, hi_dim1, hi_offset, zr_dim1, zr_offset, 
00014             zi_dim1, zi_offset, i__1, i__2, i__3;
00015     doublereal d__1, d__2, d__3, d__4;
00016 
00017     /* Local variables */
00018     static integer iend;
00019     extern /* Subroutine */ int cdiv_(doublereal *, doublereal *, doublereal *
00020             , doublereal *, doublereal *, doublereal *);
00021     static doublereal norm;
00022     static integer i__, j, k, l, m, ii, en, jj, ll, mm, nn;
00023     static doublereal si, ti, xi, yi, sr, tr, xr, yr;
00024     static integer im1;
00025     extern /* Subroutine */ int csroot_(doublereal *, doublereal *, 
00026             doublereal *, doublereal *);
00027     static integer ip1, mp1, itn, its;
00028     static doublereal zzi, zzr;
00029     static integer enm1;
00030     static doublereal tst1, tst2;
00031 
00032 
00033 
00034 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE COMLR2, */
00035 /*     NUM. MATH. 16, 181-204(1970) BY PETERS AND WILKINSON. */
00036 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 372-395(1971). */
00037 
00038 /*     THIS SUBROUTINE FINDS THE EIGENVALUES AND EIGENVECTORS */
00039 /*     OF A COMPLEX UPPER HESSENBERG MATRIX BY THE MODIFIED LR */
00040 /*     METHOD.  THE EIGENVECTORS OF A COMPLEX GENERAL MATRIX */
00041 /*     CAN ALSO BE FOUND IF  COMHES  HAS BEEN USED TO REDUCE */
00042 /*     THIS GENERAL MATRIX TO HESSENBERG FORM. */
00043 
00044 /*     ON INPUT */
00045 
00046 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00047 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00048 /*          DIMENSION STATEMENT. */
00049 
00050 /*        N IS THE ORDER OF THE MATRIX. */
00051 
00052 /*        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING */
00053 /*          SUBROUTINE  CBAL.  IF  CBAL  HAS NOT BEEN USED, */
00054 /*          SET LOW=1, IGH=N. */
00055 
00056 /*        INT CONTAINS INFORMATION ON THE ROWS AND COLUMNS INTERCHANGED */
00057 /*          IN THE REDUCTION BY  COMHES, IF PERFORMED.  ONLY ELEMENTS */
00058 /*          LOW THROUGH IGH ARE USED.  IF THE EIGENVECTORS OF THE HESSEN- 
00059 */
00060 /*          BERG MATRIX ARE DESIRED, SET INT(J)=J FOR THESE ELEMENTS. */
00061 
00062 /*        HR AND HI CONTAIN THE REAL AND IMAGINARY PARTS, */
00063 /*          RESPECTIVELY, OF THE COMPLEX UPPER HESSENBERG MATRIX. */
00064 /*          THEIR LOWER TRIANGLES BELOW THE SUBDIAGONAL CONTAIN THE */
00065 /*          MULTIPLIERS WHICH WERE USED IN THE REDUCTION BY  COMHES, */
00066 /*          IF PERFORMED.  IF THE EIGENVECTORS OF THE HESSENBERG */
00067 /*          MATRIX ARE DESIRED, THESE ELEMENTS MUST BE SET TO ZERO. */
00068 
00069 /*     ON OUTPUT */
00070 
00071 /*        THE UPPER HESSENBERG PORTIONS OF HR AND HI HAVE BEEN */
00072 /*          DESTROYED, BUT THE LOCATION HR(1,1) CONTAINS THE NORM */
00073 /*          OF THE TRIANGULARIZED MATRIX. */
00074 
00075 /*        WR AND WI CONTAIN THE REAL AND IMAGINARY PARTS, */
00076 /*          RESPECTIVELY, OF THE EIGENVALUES.  IF AN ERROR */
00077 /*          EXIT IS MADE, THE EIGENVALUES SHOULD BE CORRECT */
00078 /*          FOR INDICES IERR+1,...,N. */
00079 
00080 /*        ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS, */
00081 /*          RESPECTIVELY, OF THE EIGENVECTORS.  THE EIGENVECTORS */
00082 /*          ARE UNNORMALIZED.  IF AN ERROR EXIT IS MADE, NONE OF */
00083 /*          THE EIGENVECTORS HAS BEEN FOUND. */
00084 
00085 /*        IERR IS SET TO */
00086 /*          ZERO       FOR NORMAL RETURN, */
00087 /*          J          IF THE LIMIT OF 30*N ITERATIONS IS EXHAUSTED */
00088 /*                     WHILE THE J-TH EIGENVALUE IS BEING SOUGHT. */
00089 
00090 
00091 /*     CALLS CDIV FOR COMPLEX DIVISION. */
00092 /*     CALLS CSROOT FOR COMPLEX SQUARE ROOT. */
00093 
00094 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00095 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00096 */
00097 
00098 /*     THIS VERSION DATED AUGUST 1983. */
00099 
00100 /*     ------------------------------------------------------------------ 
00101 */
00102 
00103     /* Parameter adjustments */
00104     zi_dim1 = *nm;
00105     zi_offset = zi_dim1 + 1;
00106     zi -= zi_offset;
00107     zr_dim1 = *nm;
00108     zr_offset = zr_dim1 + 1;
00109     zr -= zr_offset;
00110     --wi;
00111     --wr;
00112     hi_dim1 = *nm;
00113     hi_offset = hi_dim1 + 1;
00114     hi -= hi_offset;
00115     hr_dim1 = *nm;
00116     hr_offset = hr_dim1 + 1;
00117     hr -= hr_offset;
00118     --int__;
00119 
00120     /* Function Body */
00121     *ierr = 0;
00122 /*     .......... INITIALIZE EIGENVECTOR MATRIX .......... */
00123     i__1 = *n;
00124     for (i__ = 1; i__ <= i__1; ++i__) {
00125 
00126         i__2 = *n;
00127         for (j = 1; j <= i__2; ++j) {
00128             zr[i__ + j * zr_dim1] = 0.;
00129             zi[i__ + j * zi_dim1] = 0.;
00130             if (i__ == j) {
00131                 zr[i__ + j * zr_dim1] = 1.;
00132             }
00133 /* L100: */
00134         }
00135     }
00136 /*     .......... FORM THE MATRIX OF ACCUMULATED TRANSFORMATIONS */
00137 /*                FROM THE INFORMATION LEFT BY COMHES .......... */
00138     iend = *igh - *low - 1;
00139     if (iend <= 0) {
00140         goto L180;
00141     }
00142 /*     .......... FOR I=IGH-1 STEP -1 UNTIL LOW+1 DO -- .......... */
00143     i__2 = iend;
00144     for (ii = 1; ii <= i__2; ++ii) {
00145         i__ = *igh - ii;
00146         ip1 = i__ + 1;
00147 
00148         i__1 = *igh;
00149         for (k = ip1; k <= i__1; ++k) {
00150             zr[k + i__ * zr_dim1] = hr[k + (i__ - 1) * hr_dim1];
00151             zi[k + i__ * zi_dim1] = hi[k + (i__ - 1) * hi_dim1];
00152 /* L120: */
00153         }
00154 
00155         j = int__[i__];
00156         if (i__ == j) {
00157             goto L160;
00158         }
00159 
00160         i__1 = *igh;
00161         for (k = i__; k <= i__1; ++k) {
00162             zr[i__ + k * zr_dim1] = zr[j + k * zr_dim1];
00163             zi[i__ + k * zi_dim1] = zi[j + k * zi_dim1];
00164             zr[j + k * zr_dim1] = 0.;
00165             zi[j + k * zi_dim1] = 0.;
00166 /* L140: */
00167         }
00168 
00169         zr[j + i__ * zr_dim1] = 1.;
00170 L160:
00171         ;
00172     }
00173 /*     .......... STORE ROOTS ISOLATED BY CBAL .......... */
00174 L180:
00175     i__2 = *n;
00176     for (i__ = 1; i__ <= i__2; ++i__) {
00177         if (i__ >= *low && i__ <= *igh) {
00178             goto L200;
00179         }
00180         wr[i__] = hr[i__ + i__ * hr_dim1];
00181         wi[i__] = hi[i__ + i__ * hi_dim1];
00182 L200:
00183         ;
00184     }
00185 
00186     en = *igh;
00187     tr = 0.;
00188     ti = 0.;
00189     itn = *n * 30;
00190 /*     .......... SEARCH FOR NEXT EIGENVALUE .......... */
00191 L220:
00192     if (en < *low) {
00193         goto L680;
00194     }
00195     its = 0;
00196     enm1 = en - 1;
00197 /*     .......... LOOK FOR SINGLE SMALL SUB-DIAGONAL ELEMENT */
00198 /*                FOR L=EN STEP -1 UNTIL LOW DO -- .......... */
00199 L240:
00200     i__2 = en;
00201     for (ll = *low; ll <= i__2; ++ll) {
00202         l = en + *low - ll;
00203         if (l == *low) {
00204             goto L300;
00205         }
00206         tst1 = (d__1 = hr[l - 1 + (l - 1) * hr_dim1], abs(d__1)) + (d__2 = hi[
00207                 l - 1 + (l - 1) * hi_dim1], abs(d__2)) + (d__3 = hr[l + l * 
00208                 hr_dim1], abs(d__3)) + (d__4 = hi[l + l * hi_dim1], abs(d__4))
00209                 ;
00210         tst2 = tst1 + (d__1 = hr[l + (l - 1) * hr_dim1], abs(d__1)) + (d__2 = 
00211                 hi[l + (l - 1) * hi_dim1], abs(d__2));
00212         if (tst2 == tst1) {
00213             goto L300;
00214         }
00215 /* L260: */
00216     }
00217 /*     .......... FORM SHIFT .......... */
00218 L300:
00219     if (l == en) {
00220         goto L660;
00221     }
00222     if (itn == 0) {
00223         goto L1000;
00224     }
00225     if (its == 10 || its == 20) {
00226         goto L320;
00227     }
00228     sr = hr[en + en * hr_dim1];
00229     si = hi[en + en * hi_dim1];
00230     xr = hr[enm1 + en * hr_dim1] * hr[en + enm1 * hr_dim1] - hi[enm1 + en * 
00231             hi_dim1] * hi[en + enm1 * hi_dim1];
00232     xi = hr[enm1 + en * hr_dim1] * hi[en + enm1 * hi_dim1] + hi[enm1 + en * 
00233             hi_dim1] * hr[en + enm1 * hr_dim1];
00234     if (xr == 0. && xi == 0.) {
00235         goto L340;
00236     }
00237     yr = (hr[enm1 + enm1 * hr_dim1] - sr) / 2.;
00238     yi = (hi[enm1 + enm1 * hi_dim1] - si) / 2.;
00239 /* Computing 2nd power */
00240     d__2 = yr;
00241 /* Computing 2nd power */
00242     d__3 = yi;
00243     d__1 = d__2 * d__2 - d__3 * d__3 + xr;
00244     d__4 = yr * 2. * yi + xi;
00245     csroot_(&d__1, &d__4, &zzr, &zzi);
00246     if (yr * zzr + yi * zzi >= 0.) {
00247         goto L310;
00248     }
00249     zzr = -zzr;
00250     zzi = -zzi;
00251 L310:
00252     d__1 = yr + zzr;
00253     d__2 = yi + zzi;
00254     cdiv_(&xr, &xi, &d__1, &d__2, &xr, &xi);
00255     sr -= xr;
00256     si -= xi;
00257     goto L340;
00258 /*     .......... FORM EXCEPTIONAL SHIFT .......... */
00259 L320:
00260     sr = (d__1 = hr[en + enm1 * hr_dim1], abs(d__1)) + (d__2 = hr[enm1 + (en 
00261             - 2) * hr_dim1], abs(d__2));
00262     si = (d__1 = hi[en + enm1 * hi_dim1], abs(d__1)) + (d__2 = hi[enm1 + (en 
00263             - 2) * hi_dim1], abs(d__2));
00264 
00265 L340:
00266     i__2 = en;
00267     for (i__ = *low; i__ <= i__2; ++i__) {
00268         hr[i__ + i__ * hr_dim1] -= sr;
00269         hi[i__ + i__ * hi_dim1] -= si;
00270 /* L360: */
00271     }
00272 
00273     tr += sr;
00274     ti += si;
00275     ++its;
00276     --itn;
00277 /*     .......... LOOK FOR TWO CONSECUTIVE SMALL */
00278 /*                SUB-DIAGONAL ELEMENTS .......... */
00279     xr = (d__1 = hr[enm1 + enm1 * hr_dim1], abs(d__1)) + (d__2 = hi[enm1 + 
00280             enm1 * hi_dim1], abs(d__2));
00281     yr = (d__1 = hr[en + enm1 * hr_dim1], abs(d__1)) + (d__2 = hi[en + enm1 * 
00282             hi_dim1], abs(d__2));
00283     zzr = (d__1 = hr[en + en * hr_dim1], abs(d__1)) + (d__2 = hi[en + en * 
00284             hi_dim1], abs(d__2));
00285 /*     .......... FOR M=EN-1 STEP -1 UNTIL L DO -- .......... */
00286     i__2 = enm1;
00287     for (mm = l; mm <= i__2; ++mm) {
00288         m = enm1 + l - mm;
00289         if (m == l) {
00290             goto L420;
00291         }
00292         yi = yr;
00293         yr = (d__1 = hr[m + (m - 1) * hr_dim1], abs(d__1)) + (d__2 = hi[m + (
00294                 m - 1) * hi_dim1], abs(d__2));
00295         xi = zzr;
00296         zzr = xr;
00297         xr = (d__1 = hr[m - 1 + (m - 1) * hr_dim1], abs(d__1)) + (d__2 = hi[m 
00298                 - 1 + (m - 1) * hi_dim1], abs(d__2));
00299         tst1 = zzr / yi * (zzr + xr + xi);
00300         tst2 = tst1 + yr;
00301         if (tst2 == tst1) {
00302             goto L420;
00303         }
00304 /* L380: */
00305     }
00306 /*     .......... TRIANGULAR DECOMPOSITION H=L*R .......... */
00307 L420:
00308     mp1 = m + 1;
00309 
00310     i__2 = en;
00311     for (i__ = mp1; i__ <= i__2; ++i__) {
00312         im1 = i__ - 1;
00313         xr = hr[im1 + im1 * hr_dim1];
00314         xi = hi[im1 + im1 * hi_dim1];
00315         yr = hr[i__ + im1 * hr_dim1];
00316         yi = hi[i__ + im1 * hi_dim1];
00317         if (abs(xr) + abs(xi) >= abs(yr) + abs(yi)) {
00318             goto L460;
00319         }
00320 /*     .......... INTERCHANGE ROWS OF HR AND HI .......... */
00321         i__1 = *n;
00322         for (j = im1; j <= i__1; ++j) {
00323             zzr = hr[im1 + j * hr_dim1];
00324             hr[im1 + j * hr_dim1] = hr[i__ + j * hr_dim1];
00325             hr[i__ + j * hr_dim1] = zzr;
00326             zzi = hi[im1 + j * hi_dim1];
00327             hi[im1 + j * hi_dim1] = hi[i__ + j * hi_dim1];
00328             hi[i__ + j * hi_dim1] = zzi;
00329 /* L440: */
00330         }
00331 
00332         cdiv_(&xr, &xi, &yr, &yi, &zzr, &zzi);
00333         wr[i__] = 1.;
00334         goto L480;
00335 L460:
00336         cdiv_(&yr, &yi, &xr, &xi, &zzr, &zzi);
00337         wr[i__] = -1.;
00338 L480:
00339         hr[i__ + im1 * hr_dim1] = zzr;
00340         hi[i__ + im1 * hi_dim1] = zzi;
00341 
00342         i__1 = *n;
00343         for (j = i__; j <= i__1; ++j) {
00344             hr[i__ + j * hr_dim1] = hr[i__ + j * hr_dim1] - zzr * hr[im1 + j *
00345                      hr_dim1] + zzi * hi[im1 + j * hi_dim1];
00346             hi[i__ + j * hi_dim1] = hi[i__ + j * hi_dim1] - zzr * hi[im1 + j *
00347                      hi_dim1] - zzi * hr[im1 + j * hr_dim1];
00348 /* L500: */
00349         }
00350 
00351 /* L520: */
00352     }
00353 /*     .......... COMPOSITION R*L=H .......... */
00354     i__2 = en;
00355     for (j = mp1; j <= i__2; ++j) {
00356         xr = hr[j + (j - 1) * hr_dim1];
00357         xi = hi[j + (j - 1) * hi_dim1];
00358         hr[j + (j - 1) * hr_dim1] = 0.;
00359         hi[j + (j - 1) * hi_dim1] = 0.;
00360 /*     .......... INTERCHANGE COLUMNS OF HR, HI, ZR, AND ZI, */
00361 /*                IF NECESSARY .......... */
00362         if (wr[j] <= 0.) {
00363             goto L580;
00364         }
00365 
00366         i__1 = j;
00367         for (i__ = 1; i__ <= i__1; ++i__) {
00368             zzr = hr[i__ + (j - 1) * hr_dim1];
00369             hr[i__ + (j - 1) * hr_dim1] = hr[i__ + j * hr_dim1];
00370             hr[i__ + j * hr_dim1] = zzr;
00371             zzi = hi[i__ + (j - 1) * hi_dim1];
00372             hi[i__ + (j - 1) * hi_dim1] = hi[i__ + j * hi_dim1];
00373             hi[i__ + j * hi_dim1] = zzi;
00374 /* L540: */
00375         }
00376 
00377         i__1 = *igh;
00378         for (i__ = *low; i__ <= i__1; ++i__) {
00379             zzr = zr[i__ + (j - 1) * zr_dim1];
00380             zr[i__ + (j - 1) * zr_dim1] = zr[i__ + j * zr_dim1];
00381             zr[i__ + j * zr_dim1] = zzr;
00382             zzi = zi[i__ + (j - 1) * zi_dim1];
00383             zi[i__ + (j - 1) * zi_dim1] = zi[i__ + j * zi_dim1];
00384             zi[i__ + j * zi_dim1] = zzi;
00385 /* L560: */
00386         }
00387 
00388 L580:
00389         i__1 = j;
00390         for (i__ = 1; i__ <= i__1; ++i__) {
00391             hr[i__ + (j - 1) * hr_dim1] = hr[i__ + (j - 1) * hr_dim1] + xr * 
00392                     hr[i__ + j * hr_dim1] - xi * hi[i__ + j * hi_dim1];
00393             hi[i__ + (j - 1) * hi_dim1] = hi[i__ + (j - 1) * hi_dim1] + xr * 
00394                     hi[i__ + j * hi_dim1] + xi * hr[i__ + j * hr_dim1];
00395 /* L600: */
00396         }
00397 /*     .......... ACCUMULATE TRANSFORMATIONS .......... */
00398         i__1 = *igh;
00399         for (i__ = *low; i__ <= i__1; ++i__) {
00400             zr[i__ + (j - 1) * zr_dim1] = zr[i__ + (j - 1) * zr_dim1] + xr * 
00401                     zr[i__ + j * zr_dim1] - xi * zi[i__ + j * zi_dim1];
00402             zi[i__ + (j - 1) * zi_dim1] = zi[i__ + (j - 1) * zi_dim1] + xr * 
00403                     zi[i__ + j * zi_dim1] + xi * zr[i__ + j * zr_dim1];
00404 /* L620: */
00405         }
00406 
00407 /* L640: */
00408     }
00409 
00410     goto L240;
00411 /*     .......... A ROOT FOUND .......... */
00412 L660:
00413     hr[en + en * hr_dim1] += tr;
00414     wr[en] = hr[en + en * hr_dim1];
00415     hi[en + en * hi_dim1] += ti;
00416     wi[en] = hi[en + en * hi_dim1];
00417     en = enm1;
00418     goto L220;
00419 /*     .......... ALL ROOTS FOUND.  BACKSUBSTITUTE TO FIND */
00420 /*                VECTORS OF UPPER TRIANGULAR FORM .......... */
00421 L680:
00422     norm = 0.;
00423 
00424     i__2 = *n;
00425     for (i__ = 1; i__ <= i__2; ++i__) {
00426 
00427         i__1 = *n;
00428         for (j = i__; j <= i__1; ++j) {
00429             tr = (d__1 = hr[i__ + j * hr_dim1], abs(d__1)) + (d__2 = hi[i__ + 
00430                     j * hi_dim1], abs(d__2));
00431             if (tr > norm) {
00432                 norm = tr;
00433             }
00434 /* L720: */
00435         }
00436     }
00437 
00438     hr[hr_dim1 + 1] = norm;
00439     if (*n == 1 || norm == 0.) {
00440         goto L1001;
00441     }
00442 /*     .......... FOR EN=N STEP -1 UNTIL 2 DO -- .......... */
00443     i__1 = *n;
00444     for (nn = 2; nn <= i__1; ++nn) {
00445         en = *n + 2 - nn;
00446         xr = wr[en];
00447         xi = wi[en];
00448         hr[en + en * hr_dim1] = 1.;
00449         hi[en + en * hi_dim1] = 0.;
00450         enm1 = en - 1;
00451 /*     .......... FOR I=EN-1 STEP -1 UNTIL 1 DO -- .......... */
00452         i__2 = enm1;
00453         for (ii = 1; ii <= i__2; ++ii) {
00454             i__ = en - ii;
00455             zzr = 0.;
00456             zzi = 0.;
00457             ip1 = i__ + 1;
00458 
00459             i__3 = en;
00460             for (j = ip1; j <= i__3; ++j) {
00461                 zzr = zzr + hr[i__ + j * hr_dim1] * hr[j + en * hr_dim1] - hi[
00462                         i__ + j * hi_dim1] * hi[j + en * hi_dim1];
00463                 zzi = zzi + hr[i__ + j * hr_dim1] * hi[j + en * hi_dim1] + hi[
00464                         i__ + j * hi_dim1] * hr[j + en * hr_dim1];
00465 /* L740: */
00466             }
00467 
00468             yr = xr - wr[i__];
00469             yi = xi - wi[i__];
00470             if (yr != 0. || yi != 0.) {
00471                 goto L765;
00472             }
00473             tst1 = norm;
00474             yr = tst1;
00475 L760:
00476             yr *= .01;
00477             tst2 = norm + yr;
00478             if (tst2 > tst1) {
00479                 goto L760;
00480             }
00481 L765:
00482             cdiv_(&zzr, &zzi, &yr, &yi, &hr[i__ + en * hr_dim1], &hi[i__ + en 
00483                     * hi_dim1]);
00484 /*     .......... OVERFLOW CONTROL .......... */
00485             tr = (d__1 = hr[i__ + en * hr_dim1], abs(d__1)) + (d__2 = hi[i__ 
00486                     + en * hi_dim1], abs(d__2));
00487             if (tr == 0.) {
00488                 goto L780;
00489             }
00490             tst1 = tr;
00491             tst2 = tst1 + 1. / tst1;
00492             if (tst2 > tst1) {
00493                 goto L780;
00494             }
00495             i__3 = en;
00496             for (j = i__; j <= i__3; ++j) {
00497                 hr[j + en * hr_dim1] /= tr;
00498                 hi[j + en * hi_dim1] /= tr;
00499 /* L770: */
00500             }
00501 
00502 L780:
00503             ;
00504         }
00505 
00506 /* L800: */
00507     }
00508 /*     .......... END BACKSUBSTITUTION .......... */
00509     enm1 = *n - 1;
00510 /*     .......... VECTORS OF ISOLATED ROOTS .......... */
00511     i__1 = enm1;
00512     for (i__ = 1; i__ <= i__1; ++i__) {
00513         if (i__ >= *low && i__ <= *igh) {
00514             goto L840;
00515         }
00516         ip1 = i__ + 1;
00517 
00518         i__2 = *n;
00519         for (j = ip1; j <= i__2; ++j) {
00520             zr[i__ + j * zr_dim1] = hr[i__ + j * hr_dim1];
00521             zi[i__ + j * zi_dim1] = hi[i__ + j * hi_dim1];
00522 /* L820: */
00523         }
00524 
00525 L840:
00526         ;
00527     }
00528 /*     .......... MULTIPLY BY TRANSFORMATION MATRIX TO GIVE */
00529 /*                VECTORS OF ORIGINAL FULL MATRIX. */
00530 /*                FOR J=N STEP -1 UNTIL LOW+1 DO -- .......... */
00531     i__1 = enm1;
00532     for (jj = *low; jj <= i__1; ++jj) {
00533         j = *n + *low - jj;
00534         m = min(j,*igh);
00535 
00536         i__2 = *igh;
00537         for (i__ = *low; i__ <= i__2; ++i__) {
00538             zzr = 0.;
00539             zzi = 0.;
00540 
00541             i__3 = m;
00542             for (k = *low; k <= i__3; ++k) {
00543                 zzr = zzr + zr[i__ + k * zr_dim1] * hr[k + j * hr_dim1] - zi[
00544                         i__ + k * zi_dim1] * hi[k + j * hi_dim1];
00545                 zzi = zzi + zr[i__ + k * zr_dim1] * hi[k + j * hi_dim1] + zi[
00546                         i__ + k * zi_dim1] * hr[k + j * hr_dim1];
00547 /* L860: */
00548             }
00549 
00550             zr[i__ + j * zr_dim1] = zzr;
00551             zi[i__ + j * zi_dim1] = zzi;
00552 /* L880: */
00553         }
00554     }
00555 
00556     goto L1001;
00557 /*     .......... SET ERROR -- ALL EIGENVALUES HAVE NOT */
00558 /*                CONVERGED AFTER 30*N ITERATIONS .......... */
00559 L1000:
00560     *ierr = en;
00561 L1001:
00562     return 0;
00563 } /* comlr2_ */

int comlr_ integer   nm,
integer   n,
integer   low,
integer   igh,
doublereal   hr,
doublereal   hi,
doublereal   wr,
doublereal   wi,
integer   ierr
 

Definition at line 8 of file eis_comlr.c.

References abs, cdiv_(), csroot_(), and l.

00011 {
00012     /* System generated locals */
00013     integer hr_dim1, hr_offset, hi_dim1, hi_offset, i__1, i__2;
00014     doublereal d__1, d__2, d__3, d__4;
00015 
00016     /* Local variables */
00017     extern /* Subroutine */ int cdiv_(doublereal *, doublereal *, doublereal *
00018             , doublereal *, doublereal *, doublereal *);
00019     static integer i__, j, l, m, en, ll, mm;
00020     static doublereal si, ti, xi, yi, sr, tr, xr, yr;
00021     static integer im1;
00022     extern /* Subroutine */ int csroot_(doublereal *, doublereal *, 
00023             doublereal *, doublereal *);
00024     static integer mp1, itn, its;
00025     static doublereal zzi, zzr;
00026     static integer enm1;
00027     static doublereal tst1, tst2;
00028 
00029 
00030 
00031 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE COMLR, */
00032 /*     NUM. MATH. 12, 369-376(1968) BY MARTIN AND WILKINSON. */
00033 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 396-403(1971). */
00034 
00035 /*     THIS SUBROUTINE FINDS THE EIGENVALUES OF A COMPLEX */
00036 /*     UPPER HESSENBERG MATRIX BY THE MODIFIED LR METHOD. */
00037 
00038 /*     ON INPUT */
00039 
00040 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00041 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00042 /*          DIMENSION STATEMENT. */
00043 
00044 /*        N IS THE ORDER OF THE MATRIX. */
00045 
00046 /*        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING */
00047 /*          SUBROUTINE  CBAL.  IF  CBAL  HAS NOT BEEN USED, */
00048 /*          SET LOW=1, IGH=N. */
00049 
00050 /*        HR AND HI CONTAIN THE REAL AND IMAGINARY PARTS, */
00051 /*          RESPECTIVELY, OF THE COMPLEX UPPER HESSENBERG MATRIX. */
00052 /*          THEIR LOWER TRIANGLES BELOW THE SUBDIAGONAL CONTAIN THE */
00053 /*          MULTIPLIERS WHICH WERE USED IN THE REDUCTION BY  COMHES, */
00054 /*          IF PERFORMED. */
00055 
00056 /*     ON OUTPUT */
00057 
00058 /*        THE UPPER HESSENBERG PORTIONS OF HR AND HI HAVE BEEN */
00059 /*          DESTROYED.  THEREFORE, THEY MUST BE SAVED BEFORE */
00060 /*          CALLING  COMLR  IF SUBSEQUENT CALCULATION OF */
00061 /*          EIGENVECTORS IS TO BE PERFORMED. */
00062 
00063 /*        WR AND WI CONTAIN THE REAL AND IMAGINARY PARTS, */
00064 /*          RESPECTIVELY, OF THE EIGENVALUES.  IF AN ERROR */
00065 /*          EXIT IS MADE, THE EIGENVALUES SHOULD BE CORRECT */
00066 /*          FOR INDICES IERR+1,...,N. */
00067 
00068 /*        IERR IS SET TO */
00069 /*          ZERO       FOR NORMAL RETURN, */
00070 /*          J          IF THE LIMIT OF 30*N ITERATIONS IS EXHAUSTED */
00071 /*                     WHILE THE J-TH EIGENVALUE IS BEING SOUGHT. */
00072 
00073 /*     CALLS CDIV FOR COMPLEX DIVISION. */
00074 /*     CALLS CSROOT FOR COMPLEX SQUARE ROOT. */
00075 
00076 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00077 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00078 */
00079 
00080 /*     THIS VERSION DATED AUGUST 1983. */
00081 
00082 /*     ------------------------------------------------------------------ 
00083 */
00084 
00085     /* Parameter adjustments */
00086     --wi;
00087     --wr;
00088     hi_dim1 = *nm;
00089     hi_offset = hi_dim1 + 1;
00090     hi -= hi_offset;
00091     hr_dim1 = *nm;
00092     hr_offset = hr_dim1 + 1;
00093     hr -= hr_offset;
00094 
00095     /* Function Body */
00096     *ierr = 0;
00097 /*     .......... STORE ROOTS ISOLATED BY CBAL .......... */
00098     i__1 = *n;
00099     for (i__ = 1; i__ <= i__1; ++i__) {
00100         if (i__ >= *low && i__ <= *igh) {
00101             goto L200;
00102         }
00103         wr[i__] = hr[i__ + i__ * hr_dim1];
00104         wi[i__] = hi[i__ + i__ * hi_dim1];
00105 L200:
00106         ;
00107     }
00108 
00109     en = *igh;
00110     tr = 0.;
00111     ti = 0.;
00112     itn = *n * 30;
00113 /*     .......... SEARCH FOR NEXT EIGENVALUE .......... */
00114 L220:
00115     if (en < *low) {
00116         goto L1001;
00117     }
00118     its = 0;
00119     enm1 = en - 1;
00120 /*     .......... LOOK FOR SINGLE SMALL SUB-DIAGONAL ELEMENT */
00121 /*                FOR L=EN STEP -1 UNTIL LOW D0 -- .......... */
00122 L240:
00123     i__1 = en;
00124     for (ll = *low; ll <= i__1; ++ll) {
00125         l = en + *low - ll;
00126         if (l == *low) {
00127             goto L300;
00128         }
00129         tst1 = (d__1 = hr[l - 1 + (l - 1) * hr_dim1], abs(d__1)) + (d__2 = hi[
00130                 l - 1 + (l - 1) * hi_dim1], abs(d__2)) + (d__3 = hr[l + l * 
00131                 hr_dim1], abs(d__3)) + (d__4 = hi[l + l * hi_dim1], abs(d__4))
00132                 ;
00133         tst2 = tst1 + (d__1 = hr[l + (l - 1) * hr_dim1], abs(d__1)) + (d__2 = 
00134                 hi[l + (l - 1) * hi_dim1], abs(d__2));
00135         if (tst2 == tst1) {
00136             goto L300;
00137         }
00138 /* L260: */
00139     }
00140 /*     .......... FORM SHIFT .......... */
00141 L300:
00142     if (l == en) {
00143         goto L660;
00144     }
00145     if (itn == 0) {
00146         goto L1000;
00147     }
00148     if (its == 10 || its == 20) {
00149         goto L320;
00150     }
00151     sr = hr[en + en * hr_dim1];
00152     si = hi[en + en * hi_dim1];
00153     xr = hr[enm1 + en * hr_dim1] * hr[en + enm1 * hr_dim1] - hi[enm1 + en * 
00154             hi_dim1] * hi[en + enm1 * hi_dim1];
00155     xi = hr[enm1 + en * hr_dim1] * hi[en + enm1 * hi_dim1] + hi[enm1 + en * 
00156             hi_dim1] * hr[en + enm1 * hr_dim1];
00157     if (xr == 0. && xi == 0.) {
00158         goto L340;
00159     }
00160     yr = (hr[enm1 + enm1 * hr_dim1] - sr) / 2.;
00161     yi = (hi[enm1 + enm1 * hi_dim1] - si) / 2.;
00162 /* Computing 2nd power */
00163     d__2 = yr;
00164 /* Computing 2nd power */
00165     d__3 = yi;
00166     d__1 = d__2 * d__2 - d__3 * d__3 + xr;
00167     d__4 = yr * 2. * yi + xi;
00168     csroot_(&d__1, &d__4, &zzr, &zzi);
00169     if (yr * zzr + yi * zzi >= 0.) {
00170         goto L310;
00171     }
00172     zzr = -zzr;
00173     zzi = -zzi;
00174 L310:
00175     d__1 = yr + zzr;
00176     d__2 = yi + zzi;
00177     cdiv_(&xr, &xi, &d__1, &d__2, &xr, &xi);
00178     sr -= xr;
00179     si -= xi;
00180     goto L340;
00181 /*     .......... FORM EXCEPTIONAL SHIFT .......... */
00182 L320:
00183     sr = (d__1 = hr[en + enm1 * hr_dim1], abs(d__1)) + (d__2 = hr[enm1 + (en 
00184             - 2) * hr_dim1], abs(d__2));
00185     si = (d__1 = hi[en + enm1 * hi_dim1], abs(d__1)) + (d__2 = hi[enm1 + (en 
00186             - 2) * hi_dim1], abs(d__2));
00187 
00188 L340:
00189     i__1 = en;
00190     for (i__ = *low; i__ <= i__1; ++i__) {
00191         hr[i__ + i__ * hr_dim1] -= sr;
00192         hi[i__ + i__ * hi_dim1] -= si;
00193 /* L360: */
00194     }
00195 
00196     tr += sr;
00197     ti += si;
00198     ++its;
00199     --itn;
00200 /*     .......... LOOK FOR TWO CONSECUTIVE SMALL */
00201 /*                SUB-DIAGONAL ELEMENTS .......... */
00202     xr = (d__1 = hr[enm1 + enm1 * hr_dim1], abs(d__1)) + (d__2 = hi[enm1 + 
00203             enm1 * hi_dim1], abs(d__2));
00204     yr = (d__1 = hr[en + enm1 * hr_dim1], abs(d__1)) + (d__2 = hi[en + enm1 * 
00205             hi_dim1], abs(d__2));
00206     zzr = (d__1 = hr[en + en * hr_dim1], abs(d__1)) + (d__2 = hi[en + en * 
00207             hi_dim1], abs(d__2));
00208 /*     .......... FOR M=EN-1 STEP -1 UNTIL L DO -- .......... */
00209     i__1 = enm1;
00210     for (mm = l; mm <= i__1; ++mm) {
00211         m = enm1 + l - mm;
00212         if (m == l) {
00213             goto L420;
00214         }
00215         yi = yr;
00216         yr = (d__1 = hr[m + (m - 1) * hr_dim1], abs(d__1)) + (d__2 = hi[m + (
00217                 m - 1) * hi_dim1], abs(d__2));
00218         xi = zzr;
00219         zzr = xr;
00220         xr = (d__1 = hr[m - 1 + (m - 1) * hr_dim1], abs(d__1)) + (d__2 = hi[m 
00221                 - 1 + (m - 1) * hi_dim1], abs(d__2));
00222         tst1 = zzr / yi * (zzr + xr + xi);
00223         tst2 = tst1 + yr;
00224         if (tst2 == tst1) {
00225             goto L420;
00226         }
00227 /* L380: */
00228     }
00229 /*     .......... TRIANGULAR DECOMPOSITION H=L*R .......... */
00230 L420:
00231     mp1 = m + 1;
00232 
00233     i__1 = en;
00234     for (i__ = mp1; i__ <= i__1; ++i__) {
00235         im1 = i__ - 1;
00236         xr = hr[im1 + im1 * hr_dim1];
00237         xi = hi[im1 + im1 * hi_dim1];
00238         yr = hr[i__ + im1 * hr_dim1];
00239         yi = hi[i__ + im1 * hi_dim1];
00240         if (abs(xr) + abs(xi) >= abs(yr) + abs(yi)) {
00241             goto L460;
00242         }
00243 /*     .......... INTERCHANGE ROWS OF HR AND HI .......... */
00244         i__2 = en;
00245         for (j = im1; j <= i__2; ++j) {
00246             zzr = hr[im1 + j * hr_dim1];
00247             hr[im1 + j * hr_dim1] = hr[i__ + j * hr_dim1];
00248             hr[i__ + j * hr_dim1] = zzr;
00249             zzi = hi[im1 + j * hi_dim1];
00250             hi[im1 + j * hi_dim1] = hi[i__ + j * hi_dim1];
00251             hi[i__ + j * hi_dim1] = zzi;
00252 /* L440: */
00253         }
00254 
00255         cdiv_(&xr, &xi, &yr, &yi, &zzr, &zzi);
00256         wr[i__] = 1.;
00257         goto L480;
00258 L460:
00259         cdiv_(&yr, &yi, &xr, &xi, &zzr, &zzi);
00260         wr[i__] = -1.;
00261 L480:
00262         hr[i__ + im1 * hr_dim1] = zzr;
00263         hi[i__ + im1 * hi_dim1] = zzi;
00264 
00265         i__2 = en;
00266         for (j = i__; j <= i__2; ++j) {
00267             hr[i__ + j * hr_dim1] = hr[i__ + j * hr_dim1] - zzr * hr[im1 + j *
00268                      hr_dim1] + zzi * hi[im1 + j * hi_dim1];
00269             hi[i__ + j * hi_dim1] = hi[i__ + j * hi_dim1] - zzr * hi[im1 + j *
00270                      hi_dim1] - zzi * hr[im1 + j * hr_dim1];
00271 /* L500: */
00272         }
00273 
00274 /* L520: */
00275     }
00276 /*     .......... COMPOSITION R*L=H .......... */
00277     i__1 = en;
00278     for (j = mp1; j <= i__1; ++j) {
00279         xr = hr[j + (j - 1) * hr_dim1];
00280         xi = hi[j + (j - 1) * hi_dim1];
00281         hr[j + (j - 1) * hr_dim1] = 0.;
00282         hi[j + (j - 1) * hi_dim1] = 0.;
00283 /*     .......... INTERCHANGE COLUMNS OF HR AND HI, */
00284 /*                IF NECESSARY .......... */
00285         if (wr[j] <= 0.) {
00286             goto L580;
00287         }
00288 
00289         i__2 = j;
00290         for (i__ = l; i__ <= i__2; ++i__) {
00291             zzr = hr[i__ + (j - 1) * hr_dim1];
00292             hr[i__ + (j - 1) * hr_dim1] = hr[i__ + j * hr_dim1];
00293             hr[i__ + j * hr_dim1] = zzr;
00294             zzi = hi[i__ + (j - 1) * hi_dim1];
00295             hi[i__ + (j - 1) * hi_dim1] = hi[i__ + j * hi_dim1];
00296             hi[i__ + j * hi_dim1] = zzi;
00297 /* L540: */
00298         }
00299 
00300 L580:
00301         i__2 = j;
00302         for (i__ = l; i__ <= i__2; ++i__) {
00303             hr[i__ + (j - 1) * hr_dim1] = hr[i__ + (j - 1) * hr_dim1] + xr * 
00304                     hr[i__ + j * hr_dim1] - xi * hi[i__ + j * hi_dim1];
00305             hi[i__ + (j - 1) * hi_dim1] = hi[i__ + (j - 1) * hi_dim1] + xr * 
00306                     hi[i__ + j * hi_dim1] + xi * hr[i__ + j * hr_dim1];
00307 /* L600: */
00308         }
00309 
00310 /* L640: */
00311     }
00312 
00313     goto L240;
00314 /*     .......... A ROOT FOUND .......... */
00315 L660:
00316     wr[en] = hr[en + en * hr_dim1] + tr;
00317     wi[en] = hi[en + en * hi_dim1] + ti;
00318     en = enm1;
00319     goto L220;
00320 /*     .......... SET ERROR -- ALL EIGENVALUES HAVE NOT */
00321 /*                CONVERGED AFTER 30*N ITERATIONS .......... */
00322 L1000:
00323     *ierr = en;
00324 L1001:
00325     return 0;
00326 } /* comlr_ */

int comqr2_ integer   nm,
integer   n,
integer   low,
integer   igh,
doublereal   ortr,
doublereal   orti,
doublereal   hr,
doublereal   hi,
doublereal   wr,
doublereal   wi,
doublereal   zr,
doublereal   zi,
integer   ierr
 

Definition at line 8 of file eis_comqr2.c.

References abs, cdiv_(), csroot_(), l, min, and pythag_().

Referenced by cg_().

00012 {
00013     /* System generated locals */
00014     integer hr_dim1, hr_offset, hi_dim1, hi_offset, zr_dim1, zr_offset, 
00015             zi_dim1, zi_offset, i__1, i__2, i__3;
00016     doublereal d__1, d__2, d__3, d__4;
00017 
00018     /* Local variables */
00019     static integer iend;
00020     extern /* Subroutine */ int cdiv_(doublereal *, doublereal *, doublereal *
00021             , doublereal *, doublereal *, doublereal *);
00022     static doublereal norm;
00023     static integer i__, j, k, l, m, ii, en, jj, ll, nn;
00024     static doublereal si, ti, xi, yi, sr, tr, xr, yr;
00025     extern doublereal pythag_(doublereal *, doublereal *);
00026     extern /* Subroutine */ int csroot_(doublereal *, doublereal *, 
00027             doublereal *, doublereal *);
00028     static integer ip1, lp1, itn, its;
00029     static doublereal zzi, zzr;
00030     static integer enm1;
00031     static doublereal tst1, tst2;
00032 
00033 
00034 
00035 /*     THIS SUBROUTINE IS A TRANSLATION OF A UNITARY ANALOGUE OF THE */
00036 /*     ALGOL PROCEDURE  COMLR2, NUM. MATH. 16, 181-204(1970) BY PETERS */
00037 /*     AND WILKINSON. */
00038 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 372-395(1971). */
00039 /*     THE UNITARY ANALOGUE SUBSTITUTES THE QR ALGORITHM OF FRANCIS */
00040 /*     (COMP. JOUR. 4, 332-345(1962)) FOR THE LR ALGORITHM. */
00041 
00042 /*     THIS SUBROUTINE FINDS THE EIGENVALUES AND EIGENVECTORS */
00043 /*     OF A COMPLEX UPPER HESSENBERG MATRIX BY THE QR */
00044 /*     METHOD.  THE EIGENVECTORS OF A COMPLEX GENERAL MATRIX */
00045 /*     CAN ALSO BE FOUND IF  CORTH  HAS BEEN USED TO REDUCE */
00046 /*     THIS GENERAL MATRIX TO HESSENBERG FORM. */
00047 
00048 /*     ON INPUT */
00049 
00050 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00051 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00052 /*          DIMENSION STATEMENT. */
00053 
00054 /*        N IS THE ORDER OF THE MATRIX. */
00055 
00056 /*        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING */
00057 /*          SUBROUTINE  CBAL.  IF  CBAL  HAS NOT BEEN USED, */
00058 /*          SET LOW=1, IGH=N. */
00059 
00060 /*        ORTR AND ORTI CONTAIN INFORMATION ABOUT THE UNITARY TRANS- */
00061 /*          FORMATIONS USED IN THE REDUCTION BY  CORTH, IF PERFORMED. */
00062 /*          ONLY ELEMENTS LOW THROUGH IGH ARE USED.  IF THE EIGENVECTORS 
00063 */
00064 /*          OF THE HESSENBERG MATRIX ARE DESIRED, SET ORTR(J) AND */
00065 /*          ORTI(J) TO 0.0D0 FOR THESE ELEMENTS. */
00066 
00067 /*        HR AND HI CONTAIN THE REAL AND IMAGINARY PARTS, */
00068 /*          RESPECTIVELY, OF THE COMPLEX UPPER HESSENBERG MATRIX. */
00069 /*          THEIR LOWER TRIANGLES BELOW THE SUBDIAGONAL CONTAIN FURTHER */
00070 /*          INFORMATION ABOUT THE TRANSFORMATIONS WHICH WERE USED IN THE 
00071 */
00072 /*          REDUCTION BY  CORTH, IF PERFORMED.  IF THE EIGENVECTORS OF */
00073 /*          THE HESSENBERG MATRIX ARE DESIRED, THESE ELEMENTS MAY BE */
00074 /*          ARBITRARY. */
00075 
00076 /*     ON OUTPUT */
00077 
00078 /*        ORTR, ORTI, AND THE UPPER HESSENBERG PORTIONS OF HR AND HI */
00079 /*          HAVE BEEN DESTROYED. */
00080 
00081 /*        WR AND WI CONTAIN THE REAL AND IMAGINARY PARTS, */
00082 /*          RESPECTIVELY, OF THE EIGENVALUES.  IF AN ERROR */
00083 /*          EXIT IS MADE, THE EIGENVALUES SHOULD BE CORRECT */
00084 /*          FOR INDICES IERR+1,...,N. */
00085 
00086 /*        ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS, */
00087 /*          RESPECTIVELY, OF THE EIGENVECTORS.  THE EIGENVECTORS */
00088 /*          ARE UNNORMALIZED.  IF AN ERROR EXIT IS MADE, NONE OF */
00089 /*          THE EIGENVECTORS HAS BEEN FOUND. */
00090 
00091 /*        IERR IS SET TO */
00092 /*          ZERO       FOR NORMAL RETURN, */
00093 /*          J          IF THE LIMIT OF 30*N ITERATIONS IS EXHAUSTED */
00094 /*                     WHILE THE J-TH EIGENVALUE IS BEING SOUGHT. */
00095 
00096 /*     CALLS CDIV FOR COMPLEX DIVISION. */
00097 /*     CALLS CSROOT FOR COMPLEX SQUARE ROOT. */
00098 /*     CALLS PYTHAG FOR  DSQRT(A*A + B*B) . */
00099 
00100 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00101 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00102 */
00103 
00104 /*     THIS VERSION DATED AUGUST 1983. */
00105 
00106 /*     ------------------------------------------------------------------ 
00107 */
00108 
00109     /* Parameter adjustments */
00110     zi_dim1 = *nm;
00111     zi_offset = zi_dim1 + 1;
00112     zi -= zi_offset;
00113     zr_dim1 = *nm;
00114     zr_offset = zr_dim1 + 1;
00115     zr -= zr_offset;
00116     --wi;
00117     --wr;
00118     hi_dim1 = *nm;
00119     hi_offset = hi_dim1 + 1;
00120     hi -= hi_offset;
00121     hr_dim1 = *nm;
00122     hr_offset = hr_dim1 + 1;
00123     hr -= hr_offset;
00124     --orti;
00125     --ortr;
00126 
00127     /* Function Body */
00128     *ierr = 0;
00129 /*     .......... INITIALIZE EIGENVECTOR MATRIX .......... */
00130     i__1 = *n;
00131     for (j = 1; j <= i__1; ++j) {
00132 
00133         i__2 = *n;
00134         for (i__ = 1; i__ <= i__2; ++i__) {
00135             zr[i__ + j * zr_dim1] = 0.;
00136             zi[i__ + j * zi_dim1] = 0.;
00137 /* L100: */
00138         }
00139         zr[j + j * zr_dim1] = 1.;
00140 /* L101: */
00141     }
00142 /*     .......... FORM THE MATRIX OF ACCUMULATED TRANSFORMATIONS */
00143 /*                FROM THE INFORMATION LEFT BY CORTH .......... */
00144     iend = *igh - *low - 1;
00145     if (iend < 0) {
00146         goto L180;
00147     } else if (iend == 0) {
00148         goto L150;
00149     } else {
00150         goto L105;
00151     }
00152 /*     .......... FOR I=IGH-1 STEP -1 UNTIL LOW+1 DO -- .......... */
00153 L105:
00154     i__1 = iend;
00155     for (ii = 1; ii <= i__1; ++ii) {
00156         i__ = *igh - ii;
00157         if (ortr[i__] == 0. && orti[i__] == 0.) {
00158             goto L140;
00159         }
00160         if (hr[i__ + (i__ - 1) * hr_dim1] == 0. && hi[i__ + (i__ - 1) * 
00161                 hi_dim1] == 0.) {
00162             goto L140;
00163         }
00164 /*     .......... NORM BELOW IS NEGATIVE OF H FORMED IN CORTH ........
00165 .. */
00166         norm = hr[i__ + (i__ - 1) * hr_dim1] * ortr[i__] + hi[i__ + (i__ - 1) 
00167                 * hi_dim1] * orti[i__];
00168         ip1 = i__ + 1;
00169 
00170         i__2 = *igh;
00171         for (k = ip1; k <= i__2; ++k) {
00172             ortr[k] = hr[k + (i__ - 1) * hr_dim1];
00173             orti[k] = hi[k + (i__ - 1) * hi_dim1];
00174 /* L110: */
00175         }
00176 
00177         i__2 = *igh;
00178         for (j = i__; j <= i__2; ++j) {
00179             sr = 0.;
00180             si = 0.;
00181 
00182             i__3 = *igh;
00183             for (k = i__; k <= i__3; ++k) {
00184                 sr = sr + ortr[k] * zr[k + j * zr_dim1] + orti[k] * zi[k + j *
00185                          zi_dim1];
00186                 si = si + ortr[k] * zi[k + j * zi_dim1] - orti[k] * zr[k + j *
00187                          zr_dim1];
00188 /* L115: */
00189             }
00190 
00191             sr /= norm;
00192             si /= norm;
00193 
00194             i__3 = *igh;
00195             for (k = i__; k <= i__3; ++k) {
00196                 zr[k + j * zr_dim1] = zr[k + j * zr_dim1] + sr * ortr[k] - si 
00197                         * orti[k];
00198                 zi[k + j * zi_dim1] = zi[k + j * zi_dim1] + sr * orti[k] + si 
00199                         * ortr[k];
00200 /* L120: */
00201             }
00202 
00203 /* L130: */
00204         }
00205 
00206 L140:
00207         ;
00208     }
00209 /*     .......... CREATE REAL SUBDIAGONAL ELEMENTS .......... */
00210 L150:
00211     l = *low + 1;
00212 
00213     i__1 = *igh;
00214     for (i__ = l; i__ <= i__1; ++i__) {
00215 /* Computing MIN */
00216         i__2 = i__ + 1;
00217         ll = min(i__2,*igh);
00218         if (hi[i__ + (i__ - 1) * hi_dim1] == 0.) {
00219             goto L170;
00220         }
00221         norm = pythag_(&hr[i__ + (i__ - 1) * hr_dim1], &hi[i__ + (i__ - 1) * 
00222                 hi_dim1]);
00223         yr = hr[i__ + (i__ - 1) * hr_dim1] / norm;
00224         yi = hi[i__ + (i__ - 1) * hi_dim1] / norm;
00225         hr[i__ + (i__ - 1) * hr_dim1] = norm;
00226         hi[i__ + (i__ - 1) * hi_dim1] = 0.;
00227 
00228         i__2 = *n;
00229         for (j = i__; j <= i__2; ++j) {
00230             si = yr * hi[i__ + j * hi_dim1] - yi * hr[i__ + j * hr_dim1];
00231             hr[i__ + j * hr_dim1] = yr * hr[i__ + j * hr_dim1] + yi * hi[i__ 
00232                     + j * hi_dim1];
00233             hi[i__ + j * hi_dim1] = si;
00234 /* L155: */
00235         }
00236 
00237         i__2 = ll;
00238         for (j = 1; j <= i__2; ++j) {
00239             si = yr * hi[j + i__ * hi_dim1] + yi * hr[j + i__ * hr_dim1];
00240             hr[j + i__ * hr_dim1] = yr * hr[j + i__ * hr_dim1] - yi * hi[j + 
00241                     i__ * hi_dim1];
00242             hi[j + i__ * hi_dim1] = si;
00243 /* L160: */
00244         }
00245 
00246         i__2 = *igh;
00247         for (j = *low; j <= i__2; ++j) {
00248             si = yr * zi[j + i__ * zi_dim1] + yi * zr[j + i__ * zr_dim1];
00249             zr[j + i__ * zr_dim1] = yr * zr[j + i__ * zr_dim1] - yi * zi[j + 
00250                     i__ * zi_dim1];
00251             zi[j + i__ * zi_dim1] = si;
00252 /* L165: */
00253         }
00254 
00255 L170:
00256         ;
00257     }
00258 /*     .......... STORE ROOTS ISOLATED BY CBAL .......... */
00259 L180:
00260     i__1 = *n;
00261     for (i__ = 1; i__ <= i__1; ++i__) {
00262         if (i__ >= *low && i__ <= *igh) {
00263             goto L200;
00264         }
00265         wr[i__] = hr[i__ + i__ * hr_dim1];
00266         wi[i__] = hi[i__ + i__ * hi_dim1];
00267 L200:
00268         ;
00269     }
00270 
00271     en = *igh;
00272     tr = 0.;
00273     ti = 0.;
00274     itn = *n * 30;
00275 /*     .......... SEARCH FOR NEXT EIGENVALUE .......... */
00276 L220:
00277     if (en < *low) {
00278         goto L680;
00279     }
00280     its = 0;
00281     enm1 = en - 1;
00282 /*     .......... LOOK FOR SINGLE SMALL SUB-DIAGONAL ELEMENT */
00283 /*                FOR L=EN STEP -1 UNTIL LOW DO -- .......... */
00284 L240:
00285     i__1 = en;
00286     for (ll = *low; ll <= i__1; ++ll) {
00287         l = en + *low - ll;
00288         if (l == *low) {
00289             goto L300;
00290         }
00291         tst1 = (d__1 = hr[l - 1 + (l - 1) * hr_dim1], abs(d__1)) + (d__2 = hi[
00292                 l - 1 + (l - 1) * hi_dim1], abs(d__2)) + (d__3 = hr[l + l * 
00293                 hr_dim1], abs(d__3)) + (d__4 = hi[l + l * hi_dim1], abs(d__4))
00294                 ;
00295         tst2 = tst1 + (d__1 = hr[l + (l - 1) * hr_dim1], abs(d__1));
00296         if (tst2 == tst1) {
00297             goto L300;
00298         }
00299 /* L260: */
00300     }
00301 /*     .......... FORM SHIFT .......... */
00302 L300:
00303     if (l == en) {
00304         goto L660;
00305     }
00306     if (itn == 0) {
00307         goto L1000;
00308     }
00309     if (its == 10 || its == 20) {
00310         goto L320;
00311     }
00312     sr = hr[en + en * hr_dim1];
00313     si = hi[en + en * hi_dim1];
00314     xr = hr[enm1 + en * hr_dim1] * hr[en + enm1 * hr_dim1];
00315     xi = hi[enm1 + en * hi_dim1] * hr[en + enm1 * hr_dim1];
00316     if (xr == 0. && xi == 0.) {
00317         goto L340;
00318     }
00319     yr = (hr[enm1 + enm1 * hr_dim1] - sr) / 2.;
00320     yi = (hi[enm1 + enm1 * hi_dim1] - si) / 2.;
00321 /* Computing 2nd power */
00322     d__2 = yr;
00323 /* Computing 2nd power */
00324     d__3 = yi;
00325     d__1 = d__2 * d__2 - d__3 * d__3 + xr;
00326     d__4 = yr * 2. * yi + xi;
00327     csroot_(&d__1, &d__4, &zzr, &zzi);
00328     if (yr * zzr + yi * zzi >= 0.) {
00329         goto L310;
00330     }
00331     zzr = -zzr;
00332     zzi = -zzi;
00333 L310:
00334     d__1 = yr + zzr;
00335     d__2 = yi + zzi;
00336     cdiv_(&xr, &xi, &d__1, &d__2, &xr, &xi);
00337     sr -= xr;
00338     si -= xi;
00339     goto L340;
00340 /*     .......... FORM EXCEPTIONAL SHIFT .......... */
00341 L320:
00342     sr = (d__1 = hr[en + enm1 * hr_dim1], abs(d__1)) + (d__2 = hr[enm1 + (en 
00343             - 2) * hr_dim1], abs(d__2));
00344     si = 0.;
00345 
00346 L340:
00347     i__1 = en;
00348     for (i__ = *low; i__ <= i__1; ++i__) {
00349         hr[i__ + i__ * hr_dim1] -= sr;
00350         hi[i__ + i__ * hi_dim1] -= si;
00351 /* L360: */
00352     }
00353 
00354     tr += sr;
00355     ti += si;
00356     ++its;
00357     --itn;
00358 /*     .......... REDUCE TO TRIANGLE (ROWS) .......... */
00359     lp1 = l + 1;
00360 
00361     i__1 = en;
00362     for (i__ = lp1; i__ <= i__1; ++i__) {
00363         sr = hr[i__ + (i__ - 1) * hr_dim1];
00364         hr[i__ + (i__ - 1) * hr_dim1] = 0.;
00365         d__1 = pythag_(&hr[i__ - 1 + (i__ - 1) * hr_dim1], &hi[i__ - 1 + (i__ 
00366                 - 1) * hi_dim1]);
00367         norm = pythag_(&d__1, &sr);
00368         xr = hr[i__ - 1 + (i__ - 1) * hr_dim1] / norm;
00369         wr[i__ - 1] = xr;
00370         xi = hi[i__ - 1 + (i__ - 1) * hi_dim1] / norm;
00371         wi[i__ - 1] = xi;
00372         hr[i__ - 1 + (i__ - 1) * hr_dim1] = norm;
00373         hi[i__ - 1 + (i__ - 1) * hi_dim1] = 0.;
00374         hi[i__ + (i__ - 1) * hi_dim1] = sr / norm;
00375 
00376         i__2 = *n;
00377         for (j = i__; j <= i__2; ++j) {
00378             yr = hr[i__ - 1 + j * hr_dim1];
00379             yi = hi[i__ - 1 + j * hi_dim1];
00380             zzr = hr[i__ + j * hr_dim1];
00381             zzi = hi[i__ + j * hi_dim1];
00382             hr[i__ - 1 + j * hr_dim1] = xr * yr + xi * yi + hi[i__ + (i__ - 1)
00383                      * hi_dim1] * zzr;
00384             hi[i__ - 1 + j * hi_dim1] = xr * yi - xi * yr + hi[i__ + (i__ - 1)
00385                      * hi_dim1] * zzi;
00386             hr[i__ + j * hr_dim1] = xr * zzr - xi * zzi - hi[i__ + (i__ - 1) *
00387                      hi_dim1] * yr;
00388             hi[i__ + j * hi_dim1] = xr * zzi + xi * zzr - hi[i__ + (i__ - 1) *
00389                      hi_dim1] * yi;
00390 /* L490: */
00391         }
00392 
00393 /* L500: */
00394     }
00395 
00396     si = hi[en + en * hi_dim1];
00397     if (si == 0.) {
00398         goto L540;
00399     }
00400     norm = pythag_(&hr[en + en * hr_dim1], &si);
00401     sr = hr[en + en * hr_dim1] / norm;
00402     si /= norm;
00403     hr[en + en * hr_dim1] = norm;
00404     hi[en + en * hi_dim1] = 0.;
00405     if (en == *n) {
00406         goto L540;
00407     }
00408     ip1 = en + 1;
00409 
00410     i__1 = *n;
00411     for (j = ip1; j <= i__1; ++j) {
00412         yr = hr[en + j * hr_dim1];
00413         yi = hi[en + j * hi_dim1];
00414         hr[en + j * hr_dim1] = sr * yr + si * yi;
00415         hi[en + j * hi_dim1] = sr * yi - si * yr;
00416 /* L520: */
00417     }
00418 /*     .......... INVERSE OPERATION (COLUMNS) .......... */
00419 L540:
00420     i__1 = en;
00421     for (j = lp1; j <= i__1; ++j) {
00422         xr = wr[j - 1];
00423         xi = wi[j - 1];
00424 
00425         i__2 = j;
00426         for (i__ = 1; i__ <= i__2; ++i__) {
00427             yr = hr[i__ + (j - 1) * hr_dim1];
00428             yi = 0.;
00429             zzr = hr[i__ + j * hr_dim1];
00430             zzi = hi[i__ + j * hi_dim1];
00431             if (i__ == j) {
00432                 goto L560;
00433             }
00434             yi = hi[i__ + (j - 1) * hi_dim1];
00435             hi[i__ + (j - 1) * hi_dim1] = xr * yi + xi * yr + hi[j + (j - 1) *
00436                      hi_dim1] * zzi;
00437 L560:
00438             hr[i__ + (j - 1) * hr_dim1] = xr * yr - xi * yi + hi[j + (j - 1) *
00439                      hi_dim1] * zzr;
00440             hr[i__ + j * hr_dim1] = xr * zzr + xi * zzi - hi[j + (j - 1) * 
00441                     hi_dim1] * yr;
00442             hi[i__ + j * hi_dim1] = xr * zzi - xi * zzr - hi[j + (j - 1) * 
00443                     hi_dim1] * yi;
00444 /* L580: */
00445         }
00446 
00447         i__2 = *igh;
00448         for (i__ = *low; i__ <= i__2; ++i__) {
00449             yr = zr[i__ + (j - 1) * zr_dim1];
00450             yi = zi[i__ + (j - 1) * zi_dim1];
00451             zzr = zr[i__ + j * zr_dim1];
00452             zzi = zi[i__ + j * zi_dim1];
00453             zr[i__ + (j - 1) * zr_dim1] = xr * yr - xi * yi + hi[j + (j - 1) *
00454                      hi_dim1] * zzr;
00455             zi[i__ + (j - 1) * zi_dim1] = xr * yi + xi * yr + hi[j + (j - 1) *
00456                      hi_dim1] * zzi;
00457             zr[i__ + j * zr_dim1] = xr * zzr + xi * zzi - hi[j + (j - 1) * 
00458                     hi_dim1] * yr;
00459             zi[i__ + j * zi_dim1] = xr * zzi - xi * zzr - hi[j + (j - 1) * 
00460                     hi_dim1] * yi;
00461 /* L590: */
00462         }
00463 
00464 /* L600: */
00465     }
00466 
00467     if (si == 0.) {
00468         goto L240;
00469     }
00470 
00471     i__1 = en;
00472     for (i__ = 1; i__ <= i__1; ++i__) {
00473         yr = hr[i__ + en * hr_dim1];
00474         yi = hi[i__ + en * hi_dim1];
00475         hr[i__ + en * hr_dim1] = sr * yr - si * yi;
00476         hi[i__ + en * hi_dim1] = sr * yi + si * yr;
00477 /* L630: */
00478     }
00479 
00480     i__1 = *igh;
00481     for (i__ = *low; i__ <= i__1; ++i__) {
00482         yr = zr[i__ + en * zr_dim1];
00483         yi = zi[i__ + en * zi_dim1];
00484         zr[i__ + en * zr_dim1] = sr * yr - si * yi;
00485         zi[i__ + en * zi_dim1] = sr * yi + si * yr;
00486 /* L640: */
00487     }
00488 
00489     goto L240;
00490 /*     .......... A ROOT FOUND .......... */
00491 L660:
00492     hr[en + en * hr_dim1] += tr;
00493     wr[en] = hr[en + en * hr_dim1];
00494     hi[en + en * hi_dim1] += ti;
00495     wi[en] = hi[en + en * hi_dim1];
00496     en = enm1;
00497     goto L220;
00498 /*     .......... ALL ROOTS FOUND.  BACKSUBSTITUTE TO FIND */
00499 /*                VECTORS OF UPPER TRIANGULAR FORM .......... */
00500 L680:
00501     norm = 0.;
00502 
00503     i__1 = *n;
00504     for (i__ = 1; i__ <= i__1; ++i__) {
00505 
00506         i__2 = *n;
00507         for (j = i__; j <= i__2; ++j) {
00508             tr = (d__1 = hr[i__ + j * hr_dim1], abs(d__1)) + (d__2 = hi[i__ + 
00509                     j * hi_dim1], abs(d__2));
00510             if (tr > norm) {
00511                 norm = tr;
00512             }
00513 /* L720: */
00514         }
00515     }
00516 
00517     if (*n == 1 || norm == 0.) {
00518         goto L1001;
00519     }
00520 /*     .......... FOR EN=N STEP -1 UNTIL 2 DO -- .......... */
00521     i__2 = *n;
00522     for (nn = 2; nn <= i__2; ++nn) {
00523         en = *n + 2 - nn;
00524         xr = wr[en];
00525         xi = wi[en];
00526         hr[en + en * hr_dim1] = 1.;
00527         hi[en + en * hi_dim1] = 0.;
00528         enm1 = en - 1;
00529 /*     .......... FOR I=EN-1 STEP -1 UNTIL 1 DO -- .......... */
00530         i__1 = enm1;
00531         for (ii = 1; ii <= i__1; ++ii) {
00532             i__ = en - ii;
00533             zzr = 0.;
00534             zzi = 0.;
00535             ip1 = i__ + 1;
00536 
00537             i__3 = en;
00538             for (j = ip1; j <= i__3; ++j) {
00539                 zzr = zzr + hr[i__ + j * hr_dim1] * hr[j + en * hr_dim1] - hi[
00540                         i__ + j * hi_dim1] * hi[j + en * hi_dim1];
00541                 zzi = zzi + hr[i__ + j * hr_dim1] * hi[j + en * hi_dim1] + hi[
00542                         i__ + j * hi_dim1] * hr[j + en * hr_dim1];
00543 /* L740: */
00544             }
00545 
00546             yr = xr - wr[i__];
00547             yi = xi - wi[i__];
00548             if (yr != 0. || yi != 0.) {
00549                 goto L765;
00550             }
00551             tst1 = norm;
00552             yr = tst1;
00553 L760:
00554             yr *= .01;
00555             tst2 = norm + yr;
00556             if (tst2 > tst1) {
00557                 goto L760;
00558             }
00559 L765:
00560             cdiv_(&zzr, &zzi, &yr, &yi, &hr[i__ + en * hr_dim1], &hi[i__ + en 
00561                     * hi_dim1]);
00562 /*     .......... OVERFLOW CONTROL .......... */
00563             tr = (d__1 = hr[i__ + en * hr_dim1], abs(d__1)) + (d__2 = hi[i__ 
00564                     + en * hi_dim1], abs(d__2));
00565             if (tr == 0.) {
00566                 goto L780;
00567             }
00568             tst1 = tr;
00569             tst2 = tst1 + 1. / tst1;
00570             if (tst2 > tst1) {
00571                 goto L780;
00572             }
00573             i__3 = en;
00574             for (j = i__; j <= i__3; ++j) {
00575                 hr[j + en * hr_dim1] /= tr;
00576                 hi[j + en * hi_dim1] /= tr;
00577 /* L770: */
00578             }
00579 
00580 L780:
00581             ;
00582         }
00583 
00584 /* L800: */
00585     }
00586 /*     .......... END BACKSUBSTITUTION .......... */
00587     enm1 = *n - 1;
00588 /*     .......... VECTORS OF ISOLATED ROOTS .......... */
00589     i__2 = enm1;
00590     for (i__ = 1; i__ <= i__2; ++i__) {
00591         if (i__ >= *low && i__ <= *igh) {
00592             goto L840;
00593         }
00594         ip1 = i__ + 1;
00595 
00596         i__1 = *n;
00597         for (j = ip1; j <= i__1; ++j) {
00598             zr[i__ + j * zr_dim1] = hr[i__ + j * hr_dim1];
00599             zi[i__ + j * zi_dim1] = hi[i__ + j * hi_dim1];
00600 /* L820: */
00601         }
00602 
00603 L840:
00604         ;
00605     }
00606 /*     .......... MULTIPLY BY TRANSFORMATION MATRIX TO GIVE */
00607 /*                VECTORS OF ORIGINAL FULL MATRIX. */
00608 /*                FOR J=N STEP -1 UNTIL LOW+1 DO -- .......... */
00609     i__2 = enm1;
00610     for (jj = *low; jj <= i__2; ++jj) {
00611         j = *n + *low - jj;
00612         m = min(j,*igh);
00613 
00614         i__1 = *igh;
00615         for (i__ = *low; i__ <= i__1; ++i__) {
00616             zzr = 0.;
00617             zzi = 0.;
00618 
00619             i__3 = m;
00620             for (k = *low; k <= i__3; ++k) {
00621                 zzr = zzr + zr[i__ + k * zr_dim1] * hr[k + j * hr_dim1] - zi[
00622                         i__ + k * zi_dim1] * hi[k + j * hi_dim1];
00623                 zzi = zzi + zr[i__ + k * zr_dim1] * hi[k + j * hi_dim1] + zi[
00624                         i__ + k * zi_dim1] * hr[k + j * hr_dim1];
00625 /* L860: */
00626             }
00627 
00628             zr[i__ + j * zr_dim1] = zzr;
00629             zi[i__ + j * zi_dim1] = zzi;
00630 /* L880: */
00631         }
00632     }
00633 
00634     goto L1001;
00635 /*     .......... SET ERROR -- ALL EIGENVALUES HAVE NOT */
00636 /*                CONVERGED AFTER 30*N ITERATIONS .......... */
00637 L1000:
00638     *ierr = en;
00639 L1001:
00640     return 0;
00641 } /* comqr2_ */

int comqr_ integer   nm,
integer   n,
integer   low,
integer   igh,
doublereal   hr,
doublereal   hi,
doublereal   wr,
doublereal   wi,
integer   ierr
 

Definition at line 8 of file eis_comqr.c.

References abs, cdiv_(), csroot_(), l, min, and pythag_().

Referenced by cg_().

00011 {
00012     /* System generated locals */
00013     integer hr_dim1, hr_offset, hi_dim1, hi_offset, i__1, i__2;
00014     doublereal d__1, d__2, d__3, d__4;
00015 
00016     /* Local variables */
00017     extern /* Subroutine */ int cdiv_(doublereal *, doublereal *, doublereal *
00018             , doublereal *, doublereal *, doublereal *);
00019     static doublereal norm;
00020     static integer i__, j, l, en, ll;
00021     static doublereal si, ti, xi, yi, sr, tr, xr, yr;
00022     extern doublereal pythag_(doublereal *, doublereal *);
00023     extern /* Subroutine */ int csroot_(doublereal *, doublereal *, 
00024             doublereal *, doublereal *);
00025     static integer lp1, itn, its;
00026     static doublereal zzi, zzr;
00027     static integer enm1;
00028     static doublereal tst1, tst2;
00029 
00030 
00031 
00032 /*     THIS SUBROUTINE IS A TRANSLATION OF A UNITARY ANALOGUE OF THE */
00033 /*     ALGOL PROCEDURE  COMLR, NUM. MATH. 12, 369-376(1968) BY MARTIN */
00034 /*     AND WILKINSON. */
00035 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 396-403(1971). */
00036 /*     THE UNITARY ANALOGUE SUBSTITUTES THE QR ALGORITHM OF FRANCIS */
00037 /*     (COMP. JOUR. 4, 332-345(1962)) FOR THE LR ALGORITHM. */
00038 
00039 /*     THIS SUBROUTINE FINDS THE EIGENVALUES OF A COMPLEX */
00040 /*     UPPER HESSENBERG MATRIX BY THE QR METHOD. */
00041 
00042 /*     ON INPUT */
00043 
00044 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00045 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00046 /*          DIMENSION STATEMENT. */
00047 
00048 /*        N IS THE ORDER OF THE MATRIX. */
00049 
00050 /*        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING */
00051 /*          SUBROUTINE  CBAL.  IF  CBAL  HAS NOT BEEN USED, */
00052 /*          SET LOW=1, IGH=N. */
00053 
00054 /*        HR AND HI CONTAIN THE REAL AND IMAGINARY PARTS, */
00055 /*          RESPECTIVELY, OF THE COMPLEX UPPER HESSENBERG MATRIX. */
00056 /*          THEIR LOWER TRIANGLES BELOW THE SUBDIAGONAL CONTAIN */
00057 /*          INFORMATION ABOUT THE UNITARY TRANSFORMATIONS USED IN */
00058 /*          THE REDUCTION BY  CORTH, IF PERFORMED. */
00059 
00060 /*     ON OUTPUT */
00061 
00062 /*        THE UPPER HESSENBERG PORTIONS OF HR AND HI HAVE BEEN */
00063 /*          DESTROYED.  THEREFORE, THEY MUST BE SAVED BEFORE */
00064 /*          CALLING  COMQR  IF SUBSEQUENT CALCULATION OF */
00065 /*          EIGENVECTORS IS TO BE PERFORMED. */
00066 
00067 /*        WR AND WI CONTAIN THE REAL AND IMAGINARY PARTS, */
00068 /*          RESPECTIVELY, OF THE EIGENVALUES.  IF AN ERROR */
00069 /*          EXIT IS MADE, THE EIGENVALUES SHOULD BE CORRECT */
00070 /*          FOR INDICES IERR+1,...,N. */
00071 
00072 /*        IERR IS SET TO */
00073 /*          ZERO       FOR NORMAL RETURN, */
00074 /*          J          IF THE LIMIT OF 30*N ITERATIONS IS EXHAUSTED */
00075 /*                     WHILE THE J-TH EIGENVALUE IS BEING SOUGHT. */
00076 
00077 /*     CALLS CDIV FOR COMPLEX DIVISION. */
00078 /*     CALLS CSROOT FOR COMPLEX SQUARE ROOT. */
00079 /*     CALLS PYTHAG FOR  DSQRT(A*A + B*B) . */
00080 
00081 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00082 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00083 */
00084 
00085 /*     THIS VERSION DATED AUGUST 1983. */
00086 
00087 /*     ------------------------------------------------------------------ 
00088 */
00089 
00090     /* Parameter adjustments */
00091     --wi;
00092     --wr;
00093     hi_dim1 = *nm;
00094     hi_offset = hi_dim1 + 1;
00095     hi -= hi_offset;
00096     hr_dim1 = *nm;
00097     hr_offset = hr_dim1 + 1;
00098     hr -= hr_offset;
00099 
00100     /* Function Body */
00101     *ierr = 0;
00102     if (*low == *igh) {
00103         goto L180;
00104     }
00105 /*     .......... CREATE REAL SUBDIAGONAL ELEMENTS .......... */
00106     l = *low + 1;
00107 
00108     i__1 = *igh;
00109     for (i__ = l; i__ <= i__1; ++i__) {
00110 /* Computing MIN */
00111         i__2 = i__ + 1;
00112         ll = min(i__2,*igh);
00113         if (hi[i__ + (i__ - 1) * hi_dim1] == 0.) {
00114             goto L170;
00115         }
00116         norm = pythag_(&hr[i__ + (i__ - 1) * hr_dim1], &hi[i__ + (i__ - 1) * 
00117                 hi_dim1]);
00118         yr = hr[i__ + (i__ - 1) * hr_dim1] / norm;
00119         yi = hi[i__ + (i__ - 1) * hi_dim1] / norm;
00120         hr[i__ + (i__ - 1) * hr_dim1] = norm;
00121         hi[i__ + (i__ - 1) * hi_dim1] = 0.;
00122 
00123         i__2 = *igh;
00124         for (j = i__; j <= i__2; ++j) {
00125             si = yr * hi[i__ + j * hi_dim1] - yi * hr[i__ + j * hr_dim1];
00126             hr[i__ + j * hr_dim1] = yr * hr[i__ + j * hr_dim1] + yi * hi[i__ 
00127                     + j * hi_dim1];
00128             hi[i__ + j * hi_dim1] = si;
00129 /* L155: */
00130         }
00131 
00132         i__2 = ll;
00133         for (j = *low; j <= i__2; ++j) {
00134             si = yr * hi[j + i__ * hi_dim1] + yi * hr[j + i__ * hr_dim1];
00135             hr[j + i__ * hr_dim1] = yr * hr[j + i__ * hr_dim1] - yi * hi[j + 
00136                     i__ * hi_dim1];
00137             hi[j + i__ * hi_dim1] = si;
00138 /* L160: */
00139         }
00140 
00141 L170:
00142         ;
00143     }
00144 /*     .......... STORE ROOTS ISOLATED BY CBAL .......... */
00145 L180:
00146     i__1 = *n;
00147     for (i__ = 1; i__ <= i__1; ++i__) {
00148         if (i__ >= *low && i__ <= *igh) {
00149             goto L200;
00150         }
00151         wr[i__] = hr[i__ + i__ * hr_dim1];
00152         wi[i__] = hi[i__ + i__ * hi_dim1];
00153 L200:
00154         ;
00155     }
00156 
00157     en = *igh;
00158     tr = 0.;
00159     ti = 0.;
00160     itn = *n * 30;
00161 /*     .......... SEARCH FOR NEXT EIGENVALUE .......... */
00162 L220:
00163     if (en < *low) {
00164         goto L1001;
00165     }
00166     its = 0;
00167     enm1 = en - 1;
00168 /*     .......... LOOK FOR SINGLE SMALL SUB-DIAGONAL ELEMENT */
00169 /*                FOR L=EN STEP -1 UNTIL LOW D0 -- .......... */
00170 L240:
00171     i__1 = en;
00172     for (ll = *low; ll <= i__1; ++ll) {
00173         l = en + *low - ll;
00174         if (l == *low) {
00175             goto L300;
00176         }
00177         tst1 = (d__1 = hr[l - 1 + (l - 1) * hr_dim1], abs(d__1)) + (d__2 = hi[
00178                 l - 1 + (l - 1) * hi_dim1], abs(d__2)) + (d__3 = hr[l + l * 
00179                 hr_dim1], abs(d__3)) + (d__4 = hi[l + l * hi_dim1], abs(d__4))
00180                 ;
00181         tst2 = tst1 + (d__1 = hr[l + (l - 1) * hr_dim1], abs(d__1));
00182         if (tst2 == tst1) {
00183             goto L300;
00184         }
00185 /* L260: */
00186     }
00187 /*     .......... FORM SHIFT .......... */
00188 L300:
00189     if (l == en) {
00190         goto L660;
00191     }
00192     if (itn == 0) {
00193         goto L1000;
00194     }
00195     if (its == 10 || its == 20) {
00196         goto L320;
00197     }
00198     sr = hr[en + en * hr_dim1];
00199     si = hi[en + en * hi_dim1];
00200     xr = hr[enm1 + en * hr_dim1] * hr[en + enm1 * hr_dim1];
00201     xi = hi[enm1 + en * hi_dim1] * hr[en + enm1 * hr_dim1];
00202     if (xr == 0. && xi == 0.) {
00203         goto L340;
00204     }
00205     yr = (hr[enm1 + enm1 * hr_dim1] - sr) / 2.;
00206     yi = (hi[enm1 + enm1 * hi_dim1] - si) / 2.;
00207 /* Computing 2nd power */
00208     d__2 = yr;
00209 /* Computing 2nd power */
00210     d__3 = yi;
00211     d__1 = d__2 * d__2 - d__3 * d__3 + xr;
00212     d__4 = yr * 2. * yi + xi;
00213     csroot_(&d__1, &d__4, &zzr, &zzi);
00214     if (yr * zzr + yi * zzi >= 0.) {
00215         goto L310;
00216     }
00217     zzr = -zzr;
00218     zzi = -zzi;
00219 L310:
00220     d__1 = yr + zzr;
00221     d__2 = yi + zzi;
00222     cdiv_(&xr, &xi, &d__1, &d__2, &xr, &xi);
00223     sr -= xr;
00224     si -= xi;
00225     goto L340;
00226 /*     .......... FORM EXCEPTIONAL SHIFT .......... */
00227 L320:
00228     sr = (d__1 = hr[en + enm1 * hr_dim1], abs(d__1)) + (d__2 = hr[enm1 + (en 
00229             - 2) * hr_dim1], abs(d__2));
00230     si = 0.;
00231 
00232 L340:
00233     i__1 = en;
00234     for (i__ = *low; i__ <= i__1; ++i__) {
00235         hr[i__ + i__ * hr_dim1] -= sr;
00236         hi[i__ + i__ * hi_dim1] -= si;
00237 /* L360: */
00238     }
00239 
00240     tr += sr;
00241     ti += si;
00242     ++its;
00243     --itn;
00244 /*     .......... REDUCE TO TRIANGLE (ROWS) .......... */
00245     lp1 = l + 1;
00246 
00247     i__1 = en;
00248     for (i__ = lp1; i__ <= i__1; ++i__) {
00249         sr = hr[i__ + (i__ - 1) * hr_dim1];
00250         hr[i__ + (i__ - 1) * hr_dim1] = 0.;
00251         d__1 = pythag_(&hr[i__ - 1 + (i__ - 1) * hr_dim1], &hi[i__ - 1 + (i__ 
00252                 - 1) * hi_dim1]);
00253         norm = pythag_(&d__1, &sr);
00254         xr = hr[i__ - 1 + (i__ - 1) * hr_dim1] / norm;
00255         wr[i__ - 1] = xr;
00256         xi = hi[i__ - 1 + (i__ - 1) * hi_dim1] / norm;
00257         wi[i__ - 1] = xi;
00258         hr[i__ - 1 + (i__ - 1) * hr_dim1] = norm;
00259         hi[i__ - 1 + (i__ - 1) * hi_dim1] = 0.;
00260         hi[i__ + (i__ - 1) * hi_dim1] = sr / norm;
00261 
00262         i__2 = en;
00263         for (j = i__; j <= i__2; ++j) {
00264             yr = hr[i__ - 1 + j * hr_dim1];
00265             yi = hi[i__ - 1 + j * hi_dim1];
00266             zzr = hr[i__ + j * hr_dim1];
00267             zzi = hi[i__ + j * hi_dim1];
00268             hr[i__ - 1 + j * hr_dim1] = xr * yr + xi * yi + hi[i__ + (i__ - 1)
00269                      * hi_dim1] * zzr;
00270             hi[i__ - 1 + j * hi_dim1] = xr * yi - xi * yr + hi[i__ + (i__ - 1)
00271                      * hi_dim1] * zzi;
00272             hr[i__ + j * hr_dim1] = xr * zzr - xi * zzi - hi[i__ + (i__ - 1) *
00273                      hi_dim1] * yr;
00274             hi[i__ + j * hi_dim1] = xr * zzi + xi * zzr - hi[i__ + (i__ - 1) *
00275                      hi_dim1] * yi;
00276 /* L490: */
00277         }
00278 
00279 /* L500: */
00280     }
00281 
00282     si = hi[en + en * hi_dim1];
00283     if (si == 0.) {
00284         goto L540;
00285     }
00286     norm = pythag_(&hr[en + en * hr_dim1], &si);
00287     sr = hr[en + en * hr_dim1] / norm;
00288     si /= norm;
00289     hr[en + en * hr_dim1] = norm;
00290     hi[en + en * hi_dim1] = 0.;
00291 /*     .......... INVERSE OPERATION (COLUMNS) .......... */
00292 L540:
00293     i__1 = en;
00294     for (j = lp1; j <= i__1; ++j) {
00295         xr = wr[j - 1];
00296         xi = wi[j - 1];
00297 
00298         i__2 = j;
00299         for (i__ = l; i__ <= i__2; ++i__) {
00300             yr = hr[i__ + (j - 1) * hr_dim1];
00301             yi = 0.;
00302             zzr = hr[i__ + j * hr_dim1];
00303             zzi = hi[i__ + j * hi_dim1];
00304             if (i__ == j) {
00305                 goto L560;
00306             }
00307             yi = hi[i__ + (j - 1) * hi_dim1];
00308             hi[i__ + (j - 1) * hi_dim1] = xr * yi + xi * yr + hi[j + (j - 1) *
00309                      hi_dim1] * zzi;
00310 L560:
00311             hr[i__ + (j - 1) * hr_dim1] = xr * yr - xi * yi + hi[j + (j - 1) *
00312                      hi_dim1] * zzr;
00313             hr[i__ + j * hr_dim1] = xr * zzr + xi * zzi - hi[j + (j - 1) * 
00314                     hi_dim1] * yr;
00315             hi[i__ + j * hi_dim1] = xr * zzi - xi * zzr - hi[j + (j - 1) * 
00316                     hi_dim1] * yi;
00317 /* L580: */
00318         }
00319 
00320 /* L600: */
00321     }
00322 
00323     if (si == 0.) {
00324         goto L240;
00325     }
00326 
00327     i__1 = en;
00328     for (i__ = l; i__ <= i__1; ++i__) {
00329         yr = hr[i__ + en * hr_dim1];
00330         yi = hi[i__ + en * hi_dim1];
00331         hr[i__ + en * hr_dim1] = sr * yr - si * yi;
00332         hi[i__ + en * hi_dim1] = sr * yi + si * yr;
00333 /* L630: */
00334     }
00335 
00336     goto L240;
00337 /*     .......... A ROOT FOUND .......... */
00338 L660:
00339     wr[en] = hr[en + en * hr_dim1] + tr;
00340     wi[en] = hi[en + en * hi_dim1] + ti;
00341     en = enm1;
00342     goto L220;
00343 /*     .......... SET ERROR -- ALL EIGENVALUES HAVE NOT */
00344 /*                CONVERGED AFTER 30*N ITERATIONS .......... */
00345 L1000:
00346     *ierr = en;
00347 L1001:
00348     return 0;
00349 } /* comqr_ */

int cortb_ integer   nm,
integer   low,
integer   igh,
doublereal   ar,
doublereal   ai,
doublereal   ortr,
doublereal   orti,
integer   m,
doublereal   zr,
doublereal   zi
 

Definition at line 8 of file eis_cortb.c.

References mp.

00011 {
00012     /* System generated locals */
00013     integer ar_dim1, ar_offset, ai_dim1, ai_offset, zr_dim1, zr_offset, 
00014             zi_dim1, zi_offset, i__1, i__2, i__3;
00015 
00016     /* Local variables */
00017     static doublereal h__;
00018     static integer i__, j, la;
00019     static doublereal gi, gr;
00020     static integer mm, mp, kp1, mp1;
00021 
00022 
00023 
00024 /*     THIS SUBROUTINE IS A TRANSLATION OF A COMPLEX ANALOGUE OF */
00025 /*     THE ALGOL PROCEDURE ORTBAK, NUM. MATH. 12, 349-368(1968) */
00026 /*     BY MARTIN AND WILKINSON. */
00027 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 339-358(1971). */
00028 
00029 /*     THIS SUBROUTINE FORMS THE EIGENVECTORS OF A COMPLEX GENERAL */
00030 /*     MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDING */
00031 /*     UPPER HESSENBERG MATRIX DETERMINED BY  CORTH. */
00032 
00033 /*     ON INPUT */
00034 
00035 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00036 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00037 /*          DIMENSION STATEMENT. */
00038 
00039 /*        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING */
00040 /*          SUBROUTINE  CBAL.  IF  CBAL  HAS NOT BEEN USED, */
00041 /*          SET LOW=1 AND IGH EQUAL TO THE ORDER OF THE MATRIX. */
00042 
00043 /*        AR AND AI CONTAIN INFORMATION ABOUT THE UNITARY */
00044 /*          TRANSFORMATIONS USED IN THE REDUCTION BY  CORTH */
00045 /*          IN THEIR STRICT LOWER TRIANGLES. */
00046 
00047 /*        ORTR AND ORTI CONTAIN FURTHER INFORMATION ABOUT THE */
00048 /*          TRANSFORMATIONS USED IN THE REDUCTION BY  CORTH. */
00049 /*          ONLY ELEMENTS LOW THROUGH IGH ARE USED. */
00050 
00051 /*        M IS THE NUMBER OF COLUMNS OF ZR AND ZI TO BE BACK TRANSFORMED. 
00052 */
00053 
00054 /*        ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS, */
00055 /*          RESPECTIVELY, OF THE EIGENVECTORS TO BE */
00056 /*          BACK TRANSFORMED IN THEIR FIRST M COLUMNS. */
00057 
00058 /*     ON OUTPUT */
00059 
00060 /*        ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS, */
00061 /*          RESPECTIVELY, OF THE TRANSFORMED EIGENVECTORS */
00062 /*          IN THEIR FIRST M COLUMNS. */
00063 
00064 /*        ORTR AND ORTI HAVE BEEN ALTERED. */
00065 
00066 /*     NOTE THAT CORTB PRESERVES VECTOR EUCLIDEAN NORMS. */
00067 
00068 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00069 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00070 */
00071 
00072 /*     THIS VERSION DATED AUGUST 1983. */
00073 
00074 /*     ------------------------------------------------------------------ 
00075 */
00076 
00077     /* Parameter adjustments */
00078     --orti;
00079     --ortr;
00080     ai_dim1 = *nm;
00081     ai_offset = ai_dim1 + 1;
00082     ai -= ai_offset;
00083     ar_dim1 = *nm;
00084     ar_offset = ar_dim1 + 1;
00085     ar -= ar_offset;
00086     zi_dim1 = *nm;
00087     zi_offset = zi_dim1 + 1;
00088     zi -= zi_offset;
00089     zr_dim1 = *nm;
00090     zr_offset = zr_dim1 + 1;
00091     zr -= zr_offset;
00092 
00093     /* Function Body */
00094     if (*m == 0) {
00095         goto L200;
00096     }
00097     la = *igh - 1;
00098     kp1 = *low + 1;
00099     if (la < kp1) {
00100         goto L200;
00101     }
00102 /*     .......... FOR MP=IGH-1 STEP -1 UNTIL LOW+1 DO -- .......... */
00103     i__1 = la;
00104     for (mm = kp1; mm <= i__1; ++mm) {
00105         mp = *low + *igh - mm;
00106         if (ar[mp + (mp - 1) * ar_dim1] == 0. && ai[mp + (mp - 1) * ai_dim1] 
00107                 == 0.) {
00108             goto L140;
00109         }
00110 /*     .......... H BELOW IS NEGATIVE OF H FORMED IN CORTH .......... 
00111 */
00112         h__ = ar[mp + (mp - 1) * ar_dim1] * ortr[mp] + ai[mp + (mp - 1) * 
00113                 ai_dim1] * orti[mp];
00114         mp1 = mp + 1;
00115 
00116         i__2 = *igh;
00117         for (i__ = mp1; i__ <= i__2; ++i__) {
00118             ortr[i__] = ar[i__ + (mp - 1) * ar_dim1];
00119             orti[i__] = ai[i__ + (mp - 1) * ai_dim1];
00120 /* L100: */
00121         }
00122 
00123         i__2 = *m;
00124         for (j = 1; j <= i__2; ++j) {
00125             gr = 0.;
00126             gi = 0.;
00127 
00128             i__3 = *igh;
00129             for (i__ = mp; i__ <= i__3; ++i__) {
00130                 gr = gr + ortr[i__] * zr[i__ + j * zr_dim1] + orti[i__] * zi[
00131                         i__ + j * zi_dim1];
00132                 gi = gi + ortr[i__] * zi[i__ + j * zi_dim1] - orti[i__] * zr[
00133                         i__ + j * zr_dim1];
00134 /* L110: */
00135             }
00136 
00137             gr /= h__;
00138             gi /= h__;
00139 
00140             i__3 = *igh;
00141             for (i__ = mp; i__ <= i__3; ++i__) {
00142                 zr[i__ + j * zr_dim1] = zr[i__ + j * zr_dim1] + gr * ortr[i__]
00143                          - gi * orti[i__];
00144                 zi[i__ + j * zi_dim1] = zi[i__ + j * zi_dim1] + gr * orti[i__]
00145                          + gi * ortr[i__];
00146 /* L120: */
00147             }
00148 
00149 /* L130: */
00150         }
00151 
00152 L140:
00153         ;
00154     }
00155 
00156 L200:
00157     return 0;
00158 } /* cortb_ */

int corth_ integer   nm,
integer   n,
integer   low,
integer   igh,
doublereal   ar,
doublereal   ai,
doublereal   ortr,
doublereal   orti
 

Definition at line 8 of file eis_corth.c.

References abs, mp, pythag_(), and scale.

Referenced by cg_().

00011 {
00012     /* System generated locals */
00013     integer ar_dim1, ar_offset, ai_dim1, ai_offset, i__1, i__2, i__3;
00014     doublereal d__1, d__2;
00015 
00016     /* Builtin functions */
00017     double sqrt(doublereal);
00018 
00019     /* Local variables */
00020     static doublereal f, g, h__;
00021     static integer i__, j, m;
00022     static doublereal scale;
00023     static integer la;
00024     static doublereal fi;
00025     static integer ii, jj;
00026     static doublereal fr;
00027     static integer mp;
00028     extern doublereal pythag_(doublereal *, doublereal *);
00029     static integer kp1;
00030 
00031 
00032 
00033 /*     THIS SUBROUTINE IS A TRANSLATION OF A COMPLEX ANALOGUE OF */
00034 /*     THE ALGOL PROCEDURE ORTHES, NUM. MATH. 12, 349-368(1968) */
00035 /*     BY MARTIN AND WILKINSON. */
00036 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 339-358(1971). */
00037 
00038 /*     GIVEN A COMPLEX GENERAL MATRIX, THIS SUBROUTINE */
00039 /*     REDUCES A SUBMATRIX SITUATED IN ROWS AND COLUMNS */
00040 /*     LOW THROUGH IGH TO UPPER HESSENBERG FORM BY */
00041 /*     UNITARY SIMILARITY TRANSFORMATIONS. */
00042 
00043 /*     ON INPUT */
00044 
00045 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00046 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00047 /*          DIMENSION STATEMENT. */
00048 
00049 /*        N IS THE ORDER OF THE MATRIX. */
00050 
00051 /*        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING */
00052 /*          SUBROUTINE  CBAL.  IF  CBAL  HAS NOT BEEN USED, */
00053 /*          SET LOW=1, IGH=N. */
00054 
00055 /*        AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS, */
00056 /*          RESPECTIVELY, OF THE COMPLEX INPUT MATRIX. */
00057 
00058 /*     ON OUTPUT */
00059 
00060 /*        AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS, */
00061 /*          RESPECTIVELY, OF THE HESSENBERG MATRIX.  INFORMATION */
00062 /*          ABOUT THE UNITARY TRANSFORMATIONS USED IN THE REDUCTION */
00063 /*          IS STORED IN THE REMAINING TRIANGLES UNDER THE */
00064 /*          HESSENBERG MATRIX. */
00065 
00066 /*        ORTR AND ORTI CONTAIN FURTHER INFORMATION ABOUT THE */
00067 /*          TRANSFORMATIONS.  ONLY ELEMENTS LOW THROUGH IGH ARE USED. */
00068 
00069 /*     CALLS PYTHAG FOR  DSQRT(A*A + B*B) . */
00070 
00071 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00072 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00073 */
00074 
00075 /*     THIS VERSION DATED AUGUST 1983. */
00076 
00077 /*     ------------------------------------------------------------------ 
00078 */
00079 
00080     /* Parameter adjustments */
00081     ai_dim1 = *nm;
00082     ai_offset = ai_dim1 + 1;
00083     ai -= ai_offset;
00084     ar_dim1 = *nm;
00085     ar_offset = ar_dim1 + 1;
00086     ar -= ar_offset;
00087     --orti;
00088     --ortr;
00089 
00090     /* Function Body */
00091     la = *igh - 1;
00092     kp1 = *low + 1;
00093     if (la < kp1) {
00094         goto L200;
00095     }
00096 
00097     i__1 = la;
00098     for (m = kp1; m <= i__1; ++m) {
00099         h__ = 0.;
00100         ortr[m] = 0.;
00101         orti[m] = 0.;
00102         scale = 0.;
00103 /*     .......... SCALE COLUMN (ALGOL TOL THEN NOT NEEDED) .......... 
00104 */
00105         i__2 = *igh;
00106         for (i__ = m; i__ <= i__2; ++i__) {
00107 /* L90: */
00108             scale = scale + (d__1 = ar[i__ + (m - 1) * ar_dim1], abs(d__1)) + 
00109                     (d__2 = ai[i__ + (m - 1) * ai_dim1], abs(d__2));
00110         }
00111 
00112         if (scale == 0.) {
00113             goto L180;
00114         }
00115         mp = m + *igh;
00116 /*     .......... FOR I=IGH STEP -1 UNTIL M DO -- .......... */
00117         i__2 = *igh;
00118         for (ii = m; ii <= i__2; ++ii) {
00119             i__ = mp - ii;
00120             ortr[i__] = ar[i__ + (m - 1) * ar_dim1] / scale;
00121             orti[i__] = ai[i__ + (m - 1) * ai_dim1] / scale;
00122             h__ = h__ + ortr[i__] * ortr[i__] + orti[i__] * orti[i__];
00123 /* L100: */
00124         }
00125 
00126         g = sqrt(h__);
00127         f = pythag_(&ortr[m], &orti[m]);
00128         if (f == 0.) {
00129             goto L103;
00130         }
00131         h__ += f * g;
00132         g /= f;
00133         ortr[m] = (g + 1.) * ortr[m];
00134         orti[m] = (g + 1.) * orti[m];
00135         goto L105;
00136 
00137 L103:
00138         ortr[m] = g;
00139         ar[m + (m - 1) * ar_dim1] = scale;
00140 /*     .......... FORM (I-(U*UT)/H) * A .......... */
00141 L105:
00142         i__2 = *n;
00143         for (j = m; j <= i__2; ++j) {
00144             fr = 0.;
00145             fi = 0.;
00146 /*     .......... FOR I=IGH STEP -1 UNTIL M DO -- .......... */
00147             i__3 = *igh;
00148             for (ii = m; ii <= i__3; ++ii) {
00149                 i__ = mp - ii;
00150                 fr = fr + ortr[i__] * ar[i__ + j * ar_dim1] + orti[i__] * ai[
00151                         i__ + j * ai_dim1];
00152                 fi = fi + ortr[i__] * ai[i__ + j * ai_dim1] - orti[i__] * ar[
00153                         i__ + j * ar_dim1];
00154 /* L110: */
00155             }
00156 
00157             fr /= h__;
00158             fi /= h__;
00159 
00160             i__3 = *igh;
00161             for (i__ = m; i__ <= i__3; ++i__) {
00162                 ar[i__ + j * ar_dim1] = ar[i__ + j * ar_dim1] - fr * ortr[i__]
00163                          + fi * orti[i__];
00164                 ai[i__ + j * ai_dim1] = ai[i__ + j * ai_dim1] - fr * orti[i__]
00165                          - fi * ortr[i__];
00166 /* L120: */
00167             }
00168 
00169 /* L130: */
00170         }
00171 /*     .......... FORM (I-(U*UT)/H)*A*(I-(U*UT)/H) .......... */
00172         i__2 = *igh;
00173         for (i__ = 1; i__ <= i__2; ++i__) {
00174             fr = 0.;
00175             fi = 0.;
00176 /*     .......... FOR J=IGH STEP -1 UNTIL M DO -- .......... */
00177             i__3 = *igh;
00178             for (jj = m; jj <= i__3; ++jj) {
00179                 j = mp - jj;
00180                 fr = fr + ortr[j] * ar[i__ + j * ar_dim1] - orti[j] * ai[i__ 
00181                         + j * ai_dim1];
00182                 fi = fi + ortr[j] * ai[i__ + j * ai_dim1] + orti[j] * ar[i__ 
00183                         + j * ar_dim1];
00184 /* L140: */
00185             }
00186 
00187             fr /= h__;
00188             fi /= h__;
00189 
00190             i__3 = *igh;
00191             for (j = m; j <= i__3; ++j) {
00192                 ar[i__ + j * ar_dim1] = ar[i__ + j * ar_dim1] - fr * ortr[j] 
00193                         - fi * orti[j];
00194                 ai[i__ + j * ai_dim1] = ai[i__ + j * ai_dim1] + fr * orti[j] 
00195                         - fi * ortr[j];
00196 /* L150: */
00197             }
00198 
00199 /* L160: */
00200         }
00201 
00202         ortr[m] = scale * ortr[m];
00203         orti[m] = scale * orti[m];
00204         ar[m + (m - 1) * ar_dim1] = -g * ar[m + (m - 1) * ar_dim1];
00205         ai[m + (m - 1) * ai_dim1] = -g * ai[m + (m - 1) * ai_dim1];
00206 L180:
00207         ;
00208     }
00209 
00210 L200:
00211     return 0;
00212 } /* corth_ */

int csroot_ doublereal   xr,
doublereal   xi,
doublereal   yr,
doublereal   yi
 

Definition at line 8 of file eis_csroot.c.

References abs, and pythag_().

Referenced by comlr2_(), comlr_(), comqr2_(), and comqr_().

00010 {
00011     /* Builtin functions */
00012     double sqrt(doublereal);
00013 
00014     /* Local variables */
00015     static doublereal s, ti, tr;
00016     extern doublereal pythag_(doublereal *, doublereal *);
00017 
00018 
00019 /*     (YR,YI) = COMPLEX DSQRT(XR,XI) */
00020 /*     BRANCH CHOSEN SO THAT YR .GE. 0.0 AND SIGN(YI) .EQ. SIGN(XI) */
00021 
00022     tr = *xr;
00023     ti = *xi;
00024     s = sqrt((pythag_(&tr, &ti) + abs(tr)) * .5);
00025     if (tr >= 0.) {
00026         *yr = s;
00027     }
00028     if (ti < 0.) {
00029         s = -s;
00030     }
00031     if (tr <= 0.) {
00032         *yi = s;
00033     }
00034     if (tr < 0.) {
00035         *yr = ti / *yi * .5;
00036     }
00037     if (tr > 0.) {
00038         *yi = ti / *yr * .5;
00039     }
00040     return 0;
00041 } /* csroot_ */

int elmbak_ integer   nm,
integer   low,
integer   igh,
doublereal   a,
integer   int__,
integer   m,
doublereal   z__
 

Definition at line 8 of file eis_elmbak.c.

References a, and mp.

00010 {
00011     /* System generated locals */
00012     integer a_dim1, a_offset, z_dim1, z_offset, i__1, i__2, i__3;
00013 
00014     /* Local variables */
00015     static integer i__, j;
00016     static doublereal x;
00017     static integer la, mm, mp, kp1, mp1;
00018 
00019 
00020 
00021 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE ELMBAK, */
00022 /*     NUM. MATH. 12, 349-368(1968) BY MARTIN AND WILKINSON. */
00023 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 339-358(1971). */
00024 
00025 /*     THIS SUBROUTINE FORMS THE EIGENVECTORS OF A REAL GENERAL */
00026 /*     MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDING */
00027 /*     UPPER HESSENBERG MATRIX DETERMINED BY  ELMHES. */
00028 
00029 /*     ON INPUT */
00030 
00031 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00032 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00033 /*          DIMENSION STATEMENT. */
00034 
00035 /*        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING */
00036 /*          SUBROUTINE  BALANC.  IF  BALANC  HAS NOT BEEN USED, */
00037 /*          SET LOW=1 AND IGH EQUAL TO THE ORDER OF THE MATRIX. */
00038 
00039 /*        A CONTAINS THE MULTIPLIERS WHICH WERE USED IN THE */
00040 /*          REDUCTION BY  ELMHES  IN ITS LOWER TRIANGLE */
00041 /*          BELOW THE SUBDIAGONAL. */
00042 
00043 /*        INT CONTAINS INFORMATION ON THE ROWS AND COLUMNS */
00044 /*          INTERCHANGED IN THE REDUCTION BY  ELMHES. */
00045 /*          ONLY ELEMENTS LOW THROUGH IGH ARE USED. */
00046 
00047 /*        M IS THE NUMBER OF COLUMNS OF Z TO BE BACK TRANSFORMED. */
00048 
00049 /*        Z CONTAINS THE REAL AND IMAGINARY PARTS OF THE EIGEN- */
00050 /*          VECTORS TO BE BACK TRANSFORMED IN ITS FIRST M COLUMNS. */
00051 
00052 /*     ON OUTPUT */
00053 
00054 /*        Z CONTAINS THE REAL AND IMAGINARY PARTS OF THE */
00055 /*          TRANSFORMED EIGENVECTORS IN ITS FIRST M COLUMNS. */
00056 
00057 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00058 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00059 */
00060 
00061 /*     THIS VERSION DATED AUGUST 1983. */
00062 
00063 /*     ------------------------------------------------------------------ 
00064 */
00065 
00066     /* Parameter adjustments */
00067     --int__;
00068     a_dim1 = *nm;
00069     a_offset = a_dim1 + 1;
00070     a -= a_offset;
00071     z_dim1 = *nm;
00072     z_offset = z_dim1 + 1;
00073     z__ -= z_offset;
00074 
00075     /* Function Body */
00076     if (*m == 0) {
00077         goto L200;
00078     }
00079     la = *igh - 1;
00080     kp1 = *low + 1;
00081     if (la < kp1) {
00082         goto L200;
00083     }
00084 /*     .......... FOR MP=IGH-1 STEP -1 UNTIL LOW+1 DO -- .......... */
00085     i__1 = la;
00086     for (mm = kp1; mm <= i__1; ++mm) {
00087         mp = *low + *igh - mm;
00088         mp1 = mp + 1;
00089 
00090         i__2 = *igh;
00091         for (i__ = mp1; i__ <= i__2; ++i__) {
00092             x = a[i__ + (mp - 1) * a_dim1];
00093             if (x == 0.) {
00094                 goto L110;
00095             }
00096 
00097             i__3 = *m;
00098             for (j = 1; j <= i__3; ++j) {
00099 /* L100: */
00100                 z__[i__ + j * z_dim1] += x * z__[mp + j * z_dim1];
00101             }
00102 
00103 L110:
00104             ;
00105         }
00106 
00107         i__ = int__[mp];
00108         if (i__ == mp) {
00109             goto L140;
00110         }
00111 
00112         i__2 = *m;
00113         for (j = 1; j <= i__2; ++j) {
00114             x = z__[i__ + j * z_dim1];
00115             z__[i__ + j * z_dim1] = z__[mp + j * z_dim1];
00116             z__[mp + j * z_dim1] = x;
00117 /* L130: */
00118         }
00119 
00120 L140:
00121         ;
00122     }
00123 
00124 L200:
00125     return 0;
00126 } /* elmbak_ */

int elmhes_ integer   nm,
integer   n,
integer   low,
integer   igh,
doublereal   a,
integer   int__
 

Definition at line 8 of file eis_elmhes.c.

References a, and abs.

Referenced by rg_().

00010 {
00011     /* System generated locals */
00012     integer a_dim1, a_offset, i__1, i__2, i__3;
00013     doublereal d__1;
00014 
00015     /* Local variables */
00016     static integer i__, j, m;
00017     static doublereal x, y;
00018     static integer la, mm1, kp1, mp1;
00019 
00020 
00021 
00022 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE ELMHES, */
00023 /*     NUM. MATH. 12, 349-368(1968) BY MARTIN AND WILKINSON. */
00024 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 339-358(1971). */
00025 
00026 /*     GIVEN A REAL GENERAL MATRIX, THIS SUBROUTINE */
00027 /*     REDUCES A SUBMATRIX SITUATED IN ROWS AND COLUMNS */
00028 /*     LOW THROUGH IGH TO UPPER HESSENBERG FORM BY */
00029 /*     STABILIZED ELEMENTARY SIMILARITY TRANSFORMATIONS. */
00030 
00031 /*     ON INPUT */
00032 
00033 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00034 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00035 /*          DIMENSION STATEMENT. */
00036 
00037 /*        N IS THE ORDER OF THE MATRIX. */
00038 
00039 /*        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING */
00040 /*          SUBROUTINE  BALANC.  IF  BALANC  HAS NOT BEEN USED, */
00041 /*          SET LOW=1, IGH=N. */
00042 
00043 /*        A CONTAINS THE INPUT MATRIX. */
00044 
00045 /*     ON OUTPUT */
00046 
00047 /*        A CONTAINS THE HESSENBERG MATRIX.  THE MULTIPLIERS */
00048 /*          WHICH WERE USED IN THE REDUCTION ARE STORED IN THE */
00049 /*          REMAINING TRIANGLE UNDER THE HESSENBERG MATRIX. */
00050 
00051 /*        INT CONTAINS INFORMATION ON THE ROWS AND COLUMNS */
00052 /*          INTERCHANGED IN THE REDUCTION. */
00053 /*          ONLY ELEMENTS LOW THROUGH IGH ARE USED. */
00054 
00055 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00056 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00057 */
00058 
00059 /*     THIS VERSION DATED AUGUST 1983. */
00060 
00061 /*     ------------------------------------------------------------------ 
00062 */
00063 
00064     /* Parameter adjustments */
00065     a_dim1 = *nm;
00066     a_offset = a_dim1 + 1;
00067     a -= a_offset;
00068     --int__;
00069 
00070     /* Function Body */
00071     la = *igh - 1;
00072     kp1 = *low + 1;
00073     if (la < kp1) {
00074         goto L200;
00075     }
00076 
00077     i__1 = la;
00078     for (m = kp1; m <= i__1; ++m) {
00079         mm1 = m - 1;
00080         x = 0.;
00081         i__ = m;
00082 
00083         i__2 = *igh;
00084         for (j = m; j <= i__2; ++j) {
00085             if ((d__1 = a[j + mm1 * a_dim1], abs(d__1)) <= abs(x)) {
00086                 goto L100;
00087             }
00088             x = a[j + mm1 * a_dim1];
00089             i__ = j;
00090 L100:
00091             ;
00092         }
00093 
00094         int__[m] = i__;
00095         if (i__ == m) {
00096             goto L130;
00097         }
00098 /*     .......... INTERCHANGE ROWS AND COLUMNS OF A .......... */
00099         i__2 = *n;
00100         for (j = mm1; j <= i__2; ++j) {
00101             y = a[i__ + j * a_dim1];
00102             a[i__ + j * a_dim1] = a[m + j * a_dim1];
00103             a[m + j * a_dim1] = y;
00104 /* L110: */
00105         }
00106 
00107         i__2 = *igh;
00108         for (j = 1; j <= i__2; ++j) {
00109             y = a[j + i__ * a_dim1];
00110             a[j + i__ * a_dim1] = a[j + m * a_dim1];
00111             a[j + m * a_dim1] = y;
00112 /* L120: */
00113         }
00114 /*     .......... END INTERCHANGE .......... */
00115 L130:
00116         if (x == 0.) {
00117             goto L180;
00118         }
00119         mp1 = m + 1;
00120 
00121         i__2 = *igh;
00122         for (i__ = mp1; i__ <= i__2; ++i__) {
00123             y = a[i__ + mm1 * a_dim1];
00124             if (y == 0.) {
00125                 goto L160;
00126             }
00127             y /= x;
00128             a[i__ + mm1 * a_dim1] = y;
00129 
00130             i__3 = *n;
00131             for (j = m; j <= i__3; ++j) {
00132 /* L140: */
00133                 a[i__ + j * a_dim1] -= y * a[m + j * a_dim1];
00134             }
00135 
00136             i__3 = *igh;
00137             for (j = 1; j <= i__3; ++j) {
00138 /* L150: */
00139                 a[j + m * a_dim1] += y * a[j + i__ * a_dim1];
00140             }
00141 
00142 L160:
00143             ;
00144         }
00145 
00146 L180:
00147         ;
00148     }
00149 
00150 L200:
00151     return 0;
00152 } /* elmhes_ */

int eltran_ integer   nm,
integer   n,
integer   low,
integer   igh,
doublereal   a,
integer   int__,
doublereal   z__
 

Definition at line 8 of file eis_eltran.c.

References a, and mp.

Referenced by rg_().

00010 {
00011     /* System generated locals */
00012     integer a_dim1, a_offset, z_dim1, z_offset, i__1, i__2;
00013 
00014     /* Local variables */
00015     static integer i__, j, kl, mm, mp, mp1;
00016 
00017 
00018 
00019 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE ELMTRANS, 
00020 */
00021 /*     NUM. MATH. 16, 181-204(1970) BY PETERS AND WILKINSON. */
00022 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 372-395(1971). */
00023 
00024 /*     THIS SUBROUTINE ACCUMULATES THE STABILIZED ELEMENTARY */
00025 /*     SIMILARITY TRANSFORMATIONS USED IN THE REDUCTION OF A */
00026 /*     REAL GENERAL MATRIX TO UPPER HESSENBERG FORM BY  ELMHES. */
00027 
00028 /*     ON INPUT */
00029 
00030 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00031 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00032 /*          DIMENSION STATEMENT. */
00033 
00034 /*        N IS THE ORDER OF THE MATRIX. */
00035 
00036 /*        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING */
00037 /*          SUBROUTINE  BALANC.  IF  BALANC  HAS NOT BEEN USED, */
00038 /*          SET LOW=1, IGH=N. */
00039 
00040 /*        A CONTAINS THE MULTIPLIERS WHICH WERE USED IN THE */
00041 /*          REDUCTION BY  ELMHES  IN ITS LOWER TRIANGLE */
00042 /*          BELOW THE SUBDIAGONAL. */
00043 
00044 /*        INT CONTAINS INFORMATION ON THE ROWS AND COLUMNS */
00045 /*          INTERCHANGED IN THE REDUCTION BY  ELMHES. */
00046 /*          ONLY ELEMENTS LOW THROUGH IGH ARE USED. */
00047 
00048 /*     ON OUTPUT */
00049 
00050 /*        Z CONTAINS THE TRANSFORMATION MATRIX PRODUCED IN THE */
00051 /*          REDUCTION BY  ELMHES. */
00052 
00053 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00054 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00055 */
00056 
00057 /*     THIS VERSION DATED AUGUST 1983. */
00058 
00059 /*     ------------------------------------------------------------------ 
00060 */
00061 
00062 /*     .......... INITIALIZE Z TO IDENTITY MATRIX .......... */
00063     /* Parameter adjustments */
00064     z_dim1 = *nm;
00065     z_offset = z_dim1 + 1;
00066     z__ -= z_offset;
00067     --int__;
00068     a_dim1 = *nm;
00069     a_offset = a_dim1 + 1;
00070     a -= a_offset;
00071 
00072     /* Function Body */
00073     i__1 = *n;
00074     for (j = 1; j <= i__1; ++j) {
00075 
00076         i__2 = *n;
00077         for (i__ = 1; i__ <= i__2; ++i__) {
00078 /* L60: */
00079             z__[i__ + j * z_dim1] = 0.;
00080         }
00081 
00082         z__[j + j * z_dim1] = 1.;
00083 /* L80: */
00084     }
00085 
00086     kl = *igh - *low - 1;
00087     if (kl < 1) {
00088         goto L200;
00089     }
00090 /*     .......... FOR MP=IGH-1 STEP -1 UNTIL LOW+1 DO -- .......... */
00091     i__1 = kl;
00092     for (mm = 1; mm <= i__1; ++mm) {
00093         mp = *igh - mm;
00094         mp1 = mp + 1;
00095 
00096         i__2 = *igh;
00097         for (i__ = mp1; i__ <= i__2; ++i__) {
00098 /* L100: */
00099             z__[i__ + mp * z_dim1] = a[i__ + (mp - 1) * a_dim1];
00100         }
00101 
00102         i__ = int__[mp];
00103         if (i__ == mp) {
00104             goto L140;
00105         }
00106 
00107         i__2 = *igh;
00108         for (j = mp; j <= i__2; ++j) {
00109             z__[mp + j * z_dim1] = z__[i__ + j * z_dim1];
00110             z__[i__ + j * z_dim1] = 0.;
00111 /* L130: */
00112         }
00113 
00114         z__[i__ + mp * z_dim1] = 1.;
00115 L140:
00116         ;
00117     }
00118 
00119 L200:
00120     return 0;
00121 } /* eltran_ */

doublereal epslon_ doublereal   x
 

Definition at line 8 of file eis_epslon.c.

References a, and abs.

Referenced by bandv_(), bisect_(), cinvit_(), invit_(), qzit_(), ratqr_(), tinvit_(), tqlrat_(), tridib_(), and tsturm_().

00009 {
00010     /* System generated locals */
00011     doublereal ret_val, d__1;
00012 
00013     /* Local variables */
00014     static doublereal a, b, c__, eps;
00015 
00016 
00017 /*     ESTIMATE UNIT ROUNDOFF IN QUANTITIES OF SIZE X. */
00018 
00019 
00020 /*     THIS PROGRAM SHOULD FUNCTION PROPERLY ON ALL SYSTEMS */
00021 /*     SATISFYING THE FOLLOWING TWO ASSUMPTIONS, */
00022 /*        1.  THE BASE USED IN REPRESENTING FLOATING POINT */
00023 /*            NUMBERS IS NOT A POWER OF THREE. */
00024 /*        2.  THE QUANTITY  A  IN STATEMENT 10 IS REPRESENTED TO */
00025 /*            THE ACCURACY USED IN FLOATING POINT VARIABLES */
00026 /*            THAT ARE STORED IN MEMORY. */
00027 /*     THE STATEMENT NUMBER 10 AND THE GO TO 10 ARE INTENDED TO */
00028 /*     FORCE OPTIMIZING COMPILERS TO GENERATE CODE SATISFYING */
00029 /*     ASSUMPTION 2. */
00030 /*     UNDER THESE ASSUMPTIONS, IT SHOULD BE TRUE THAT, */
00031 /*            A  IS NOT EXACTLY EQUAL TO FOUR-THIRDS, */
00032 /*            B  HAS A ZERO FOR ITS LAST BIT OR DIGIT, */
00033 /*            C  IS NOT EXACTLY EQUAL TO ONE, */
00034 /*            EPS  MEASURES THE SEPARATION OF 1.0 FROM */
00035 /*                 THE NEXT LARGER FLOATING POINT NUMBER. */
00036 /*     THE DEVELOPERS OF EISPACK WOULD APPRECIATE BEING INFORMED */
00037 /*     ABOUT ANY SYSTEMS WHERE THESE ASSUMPTIONS DO NOT HOLD. */
00038 
00039 /*     THIS VERSION DATED 4/6/83. */
00040 
00041     a = 1.3333333333333333;
00042 L10:
00043     b = a - 1.;
00044     c__ = b + b + b;
00045     eps = (d__1 = c__ - 1., abs(d__1));
00046     if (eps == 0.) {
00047         goto L10;
00048     }
00049     ret_val = eps * abs(*x);
00050     return ret_val;
00051 } /* epslon_ */

int figi2_ integer   nm,
integer   n,
doublereal   t,
doublereal   d__,
doublereal   e,
doublereal   z__,
integer   ierr
 

Definition at line 8 of file eis_figi2.c.

Referenced by rt_().

00010 {
00011     /* System generated locals */
00012     integer t_dim1, t_offset, z_dim1, z_offset, i__1, i__2;
00013 
00014     /* Builtin functions */
00015     double sqrt(doublereal);
00016 
00017     /* Local variables */
00018     static doublereal h__;
00019     static integer i__, j;
00020 
00021 
00022 
00023 /*     GIVEN A NONSYMMETRIC TRIDIAGONAL MATRIX SUCH THAT THE PRODUCTS */
00024 /*     OF CORRESPONDING PAIRS OF OFF-DIAGONAL ELEMENTS ARE ALL */
00025 /*     NON-NEGATIVE, AND ZERO ONLY WHEN BOTH FACTORS ARE ZERO, THIS */
00026 /*     SUBROUTINE REDUCES IT TO A SYMMETRIC TRIDIAGONAL MATRIX */
00027 /*     USING AND ACCUMULATING DIAGONAL SIMILARITY TRANSFORMATIONS. */
00028 
00029 /*     ON INPUT */
00030 
00031 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00032 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00033 /*          DIMENSION STATEMENT. */
00034 
00035 /*        N IS THE ORDER OF THE MATRIX. */
00036 
00037 /*        T CONTAINS THE INPUT MATRIX.  ITS SUBDIAGONAL IS */
00038 /*          STORED IN THE LAST N-1 POSITIONS OF THE FIRST COLUMN, */
00039 /*          ITS DIAGONAL IN THE N POSITIONS OF THE SECOND COLUMN, */
00040 /*          AND ITS SUPERDIAGONAL IN THE FIRST N-1 POSITIONS OF */
00041 /*          THE THIRD COLUMN.  T(1,1) AND T(N,3) ARE ARBITRARY. */
00042 
00043 /*     ON OUTPUT */
00044 
00045 /*        T IS UNALTERED. */
00046 
00047 /*        D CONTAINS THE DIAGONAL ELEMENTS OF THE SYMMETRIC MATRIX. */
00048 
00049 /*        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE SYMMETRIC */
00050 /*          MATRIX IN ITS LAST N-1 POSITIONS.  E(1) IS NOT SET. */
00051 
00052 /*        Z CONTAINS THE TRANSFORMATION MATRIX PRODUCED IN */
00053 /*          THE REDUCTION. */
00054 
00055 /*        IERR IS SET TO */
00056 /*          ZERO       FOR NORMAL RETURN, */
00057 /*          N+I        IF T(I,1)*T(I-1,3) IS NEGATIVE, */
00058 /*          2*N+I      IF T(I,1)*T(I-1,3) IS ZERO WITH */
00059 /*                     ONE FACTOR NON-ZERO. */
00060 
00061 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00062 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00063 */
00064 
00065 /*     THIS VERSION DATED AUGUST 1983. */
00066 
00067 /*     ------------------------------------------------------------------ 
00068 */
00069 
00070     /* Parameter adjustments */
00071     t_dim1 = *nm;
00072     t_offset = t_dim1 + 1;
00073     t -= t_offset;
00074     z_dim1 = *nm;
00075     z_offset = z_dim1 + 1;
00076     z__ -= z_offset;
00077     --e;
00078     --d__;
00079 
00080     /* Function Body */
00081     *ierr = 0;
00082 
00083     i__1 = *n;
00084     for (i__ = 1; i__ <= i__1; ++i__) {
00085 
00086         i__2 = *n;
00087         for (j = 1; j <= i__2; ++j) {
00088 /* L50: */
00089             z__[i__ + j * z_dim1] = 0.;
00090         }
00091 
00092         if (i__ == 1) {
00093             goto L70;
00094         }
00095         h__ = t[i__ + t_dim1] * t[i__ - 1 + t_dim1 * 3];
00096         if (h__ < 0.) {
00097             goto L900;
00098         } else if (h__ == 0) {
00099             goto L60;
00100         } else {
00101             goto L80;
00102         }
00103 L60:
00104         if (t[i__ + t_dim1] != 0. || t[i__ - 1 + t_dim1 * 3] != 0.) {
00105             goto L1000;
00106         }
00107         e[i__] = 0.;
00108 L70:
00109         z__[i__ + i__ * z_dim1] = 1.;
00110         goto L90;
00111 L80:
00112         e[i__] = sqrt(h__);
00113         z__[i__ + i__ * z_dim1] = z__[i__ - 1 + (i__ - 1) * z_dim1] * e[i__] /
00114                  t[i__ - 1 + t_dim1 * 3];
00115 L90:
00116         d__[i__] = t[i__ + (t_dim1 << 1)];
00117 /* L100: */
00118     }
00119 
00120     goto L1001;
00121 /*     .......... SET ERROR -- PRODUCT OF SOME PAIR OF OFF-DIAGONAL */
00122 /*                ELEMENTS IS NEGATIVE .......... */
00123 L900:
00124     *ierr = *n + i__;
00125     goto L1001;
00126 /*     .......... SET ERROR -- PRODUCT OF SOME PAIR OF OFF-DIAGONAL */
00127 /*                ELEMENTS IS ZERO WITH ONE MEMBER NON-ZERO .......... */
00128 L1000:
00129     *ierr = (*n << 1) + i__;
00130 L1001:
00131     return 0;
00132 } /* figi2_ */

int figi_ integer   nm,
integer   n,
doublereal   t,
doublereal   d__,
doublereal   e,
doublereal   e2,
integer   ierr
 

Definition at line 8 of file eis_figi.c.

Referenced by rt_().

00010 {
00011     /* System generated locals */
00012     integer t_dim1, t_offset, i__1;
00013     doublereal d__1;
00014 
00015     /* Builtin functions */
00016     double sqrt(doublereal);
00017 
00018     /* Local variables */
00019     static integer i__;
00020 
00021 
00022 
00023 /*     GIVEN A NONSYMMETRIC TRIDIAGONAL MATRIX SUCH THAT THE PRODUCTS */
00024 /*     OF CORRESPONDING PAIRS OF OFF-DIAGONAL ELEMENTS ARE ALL */
00025 /*     NON-NEGATIVE, THIS SUBROUTINE REDUCES IT TO A SYMMETRIC */
00026 /*     TRIDIAGONAL MATRIX WITH THE SAME EIGENVALUES.  IF, FURTHER, */
00027 /*     A ZERO PRODUCT ONLY OCCURS WHEN BOTH FACTORS ARE ZERO, */
00028 /*     THE REDUCED MATRIX IS SIMILAR TO THE ORIGINAL MATRIX. */
00029 
00030 /*     ON INPUT */
00031 
00032 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00033 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00034 /*          DIMENSION STATEMENT. */
00035 
00036 /*        N IS THE ORDER OF THE MATRIX. */
00037 
00038 /*        T CONTAINS THE INPUT MATRIX.  ITS SUBDIAGONAL IS */
00039 /*          STORED IN THE LAST N-1 POSITIONS OF THE FIRST COLUMN, */
00040 /*          ITS DIAGONAL IN THE N POSITIONS OF THE SECOND COLUMN, */
00041 /*          AND ITS SUPERDIAGONAL IN THE FIRST N-1 POSITIONS OF */
00042 /*          THE THIRD COLUMN.  T(1,1) AND T(N,3) ARE ARBITRARY. */
00043 
00044 /*     ON OUTPUT */
00045 
00046 /*        T IS UNALTERED. */
00047 
00048 /*        D CONTAINS THE DIAGONAL ELEMENTS OF THE SYMMETRIC MATRIX. */
00049 
00050 /*        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE SYMMETRIC */
00051 /*          MATRIX IN ITS LAST N-1 POSITIONS.  E(1) IS NOT SET. */
00052 
00053 /*        E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E. */
00054 /*          E2 MAY COINCIDE WITH E IF THE SQUARES ARE NOT NEEDED. */
00055 
00056 /*        IERR IS SET TO */
00057 /*          ZERO       FOR NORMAL RETURN, */
00058 /*          N+I        IF T(I,1)*T(I-1,3) IS NEGATIVE, */
00059 /*          -(3*N+I)   IF T(I,1)*T(I-1,3) IS ZERO WITH ONE FACTOR */
00060 /*                     NON-ZERO.  IN THIS CASE, THE EIGENVECTORS OF */
00061 /*                     THE SYMMETRIC MATRIX ARE NOT SIMPLY RELATED */
00062 /*                     TO THOSE OF  T  AND SHOULD NOT BE SOUGHT. */
00063 
00064 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00065 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00066 */
00067 
00068 /*     THIS VERSION DATED AUGUST 1983. */
00069 
00070 /*     ------------------------------------------------------------------ 
00071 */
00072 
00073     /* Parameter adjustments */
00074     t_dim1 = *nm;
00075     t_offset = t_dim1 + 1;
00076     t -= t_offset;
00077     --e2;
00078     --e;
00079     --d__;
00080 
00081     /* Function Body */
00082     *ierr = 0;
00083 
00084     i__1 = *n;
00085     for (i__ = 1; i__ <= i__1; ++i__) {
00086         if (i__ == 1) {
00087             goto L90;
00088         }
00089         e2[i__] = t[i__ + t_dim1] * t[i__ - 1 + t_dim1 * 3];
00090         if ((d__1 = e2[i__]) < 0.) {
00091             goto L1000;
00092         } else if (d__1 == 0) {
00093             goto L60;
00094         } else {
00095             goto L80;
00096         }
00097 L60:
00098         if (t[i__ + t_dim1] == 0. && t[i__ - 1 + t_dim1 * 3] == 0.) {
00099             goto L80;
00100         }
00101 /*     .......... SET ERROR -- PRODUCT OF SOME PAIR OF OFF-DIAGONAL */
00102 /*                ELEMENTS IS ZERO WITH ONE MEMBER NON-ZERO ..........
00103  */
00104         *ierr = -(*n * 3 + i__);
00105 L80:
00106         e[i__] = sqrt(e2[i__]);
00107 L90:
00108         d__[i__] = t[i__ + (t_dim1 << 1)];
00109 /* L100: */
00110     }
00111 
00112     goto L1001;
00113 /*     .......... SET ERROR -- PRODUCT OF SOME PAIR OF OFF-DIAGONAL */
00114 /*                ELEMENTS IS NEGATIVE .......... */
00115 L1000:
00116     *ierr = *n + i__;
00117 L1001:
00118     return 0;
00119 } /* figi_ */

int hqr2_ integer   nm,
integer   n,
integer   low,
integer   igh,
doublereal   h__,
doublereal   wr,
doublereal   wi,
doublereal   z__,
integer   ierr
 

Definition at line 12 of file eis_hqr2.c.

References abs, c_b49, cdiv_(), d_sign(), l, max, min, p, and q.

Referenced by rg_().

00015 {
00016     /* System generated locals */
00017     integer h_dim1, h_offset, z_dim1, z_offset, i__1, i__2, i__3;
00018     doublereal d__1, d__2, d__3, d__4;
00019 
00020     /* Builtin functions */
00021     double sqrt(doublereal), d_sign(doublereal *, doublereal *);
00022 
00023     /* Local variables */
00024     extern /* Subroutine */ int cdiv_(doublereal *, doublereal *, doublereal *
00025             , doublereal *, doublereal *, doublereal *);
00026     static doublereal norm;
00027     static integer i__, j, k, l, m;
00028     static doublereal p, q, r__, s, t, w, x, y;
00029     static integer na, ii, en, jj;
00030     static doublereal ra, sa;
00031     static integer ll, mm, nn;
00032     static doublereal vi, vr, zz;
00033     static logical notlas;
00034     static integer mp2, itn, its, enm2;
00035     static doublereal tst1, tst2;
00036 
00037 
00038 
00039 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE HQR2, */
00040 /*     NUM. MATH. 16, 181-204(1970) BY PETERS AND WILKINSON. */
00041 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 372-395(1971). */
00042 
00043 /*     THIS SUBROUTINE FINDS THE EIGENVALUES AND EIGENVECTORS */
00044 /*     OF A REAL UPPER HESSENBERG MATRIX BY THE QR METHOD.  THE */
00045 /*     EIGENVECTORS OF A REAL GENERAL MATRIX CAN ALSO BE FOUND */
00046 /*     IF  ELMHES  AND  ELTRAN  OR  ORTHES  AND  ORTRAN  HAVE */
00047 /*     BEEN USED TO REDUCE THIS GENERAL MATRIX TO HESSENBERG FORM */
00048 /*     AND TO ACCUMULATE THE SIMILARITY TRANSFORMATIONS. */
00049 
00050 /*     ON INPUT */
00051 
00052 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00053 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00054 /*          DIMENSION STATEMENT. */
00055 
00056 /*        N IS THE ORDER OF THE MATRIX. */
00057 
00058 /*        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING */
00059 /*          SUBROUTINE  BALANC.  IF  BALANC  HAS NOT BEEN USED, */
00060 /*          SET LOW=1, IGH=N. */
00061 
00062 /*        H CONTAINS THE UPPER HESSENBERG MATRIX. */
00063 
00064 /*        Z CONTAINS THE TRANSFORMATION MATRIX PRODUCED BY  ELTRAN */
00065 /*          AFTER THE REDUCTION BY  ELMHES, OR BY  ORTRAN  AFTER THE */
00066 /*          REDUCTION BY  ORTHES, IF PERFORMED.  IF THE EIGENVECTORS */
00067 /*          OF THE HESSENBERG MATRIX ARE DESIRED, Z MUST CONTAIN THE */
00068 /*          IDENTITY MATRIX. */
00069 
00070 /*     ON OUTPUT */
00071 
00072 /*        H HAS BEEN DESTROYED. */
00073 
00074 /*        WR AND WI CONTAIN THE REAL AND IMAGINARY PARTS, */
00075 /*          RESPECTIVELY, OF THE EIGENVALUES.  THE EIGENVALUES */
00076 /*          ARE UNORDERED EXCEPT THAT COMPLEX CONJUGATE PAIRS */
00077 /*          OF VALUES APPEAR CONSECUTIVELY WITH THE EIGENVALUE */
00078 /*          HAVING THE POSITIVE IMAGINARY PART FIRST.  IF AN */
00079 /*          ERROR EXIT IS MADE, THE EIGENVALUES SHOULD BE CORRECT */
00080 /*          FOR INDICES IERR+1,...,N. */
00081 
00082 /*        Z CONTAINS THE REAL AND IMAGINARY PARTS OF THE EIGENVECTORS. */
00083 /*          IF THE I-TH EIGENVALUE IS REAL, THE I-TH COLUMN OF Z */
00084 /*          CONTAINS ITS EIGENVECTOR.  IF THE I-TH EIGENVALUE IS COMPLEX 
00085 */
00086 /*          WITH POSITIVE IMAGINARY PART, THE I-TH AND (I+1)-TH */
00087 /*          COLUMNS OF Z CONTAIN THE REAL AND IMAGINARY PARTS OF ITS */
00088 /*          EIGENVECTOR.  THE EIGENVECTORS ARE UNNORMALIZED.  IF AN */
00089 /*          ERROR EXIT IS MADE, NONE OF THE EIGENVECTORS HAS BEEN FOUND. 
00090 */
00091 
00092 /*        IERR IS SET TO */
00093 /*          ZERO       FOR NORMAL RETURN, */
00094 /*          J          IF THE LIMIT OF 30*N ITERATIONS IS EXHAUSTED */
00095 /*                     WHILE THE J-TH EIGENVALUE IS BEING SOUGHT. */
00096 
00097 /*     CALLS CDIV FOR COMPLEX DIVISION. */
00098 
00099 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00100 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00101 */
00102 
00103 /*     THIS VERSION DATED AUGUST 1983. */
00104 
00105 /*     ------------------------------------------------------------------ 
00106 */
00107 
00108     /* Parameter adjustments */
00109     z_dim1 = *nm;
00110     z_offset = z_dim1 + 1;
00111     z__ -= z_offset;
00112     --wi;
00113     --wr;
00114     h_dim1 = *nm;
00115     h_offset = h_dim1 + 1;
00116     h__ -= h_offset;
00117 
00118     /* Function Body */
00119     *ierr = 0;
00120     norm = 0.;
00121     k = 1;
00122 /*     .......... STORE ROOTS ISOLATED BY BALANC */
00123 /*                AND COMPUTE MATRIX NORM .......... */
00124     i__1 = *n;
00125     for (i__ = 1; i__ <= i__1; ++i__) {
00126 
00127         i__2 = *n;
00128         for (j = k; j <= i__2; ++j) {
00129 /* L40: */
00130             norm += (d__1 = h__[i__ + j * h_dim1], abs(d__1));
00131         }
00132 
00133         k = i__;
00134         if (i__ >= *low && i__ <= *igh) {
00135             goto L50;
00136         }
00137         wr[i__] = h__[i__ + i__ * h_dim1];
00138         wi[i__] = 0.;
00139 L50:
00140         ;
00141     }
00142 
00143     en = *igh;
00144     t = 0.;
00145     itn = *n * 30;
00146 /*     .......... SEARCH FOR NEXT EIGENVALUES .......... */
00147 L60:
00148     if (en < *low) {
00149         goto L340;
00150     }
00151     its = 0;
00152     na = en - 1;
00153     enm2 = na - 1;
00154 /*     .......... LOOK FOR SINGLE SMALL SUB-DIAGONAL ELEMENT */
00155 /*                FOR L=EN STEP -1 UNTIL LOW DO -- .......... */
00156 L70:
00157     i__1 = en;
00158     for (ll = *low; ll <= i__1; ++ll) {
00159         l = en + *low - ll;
00160         if (l == *low) {
00161             goto L100;
00162         }
00163         s = (d__1 = h__[l - 1 + (l - 1) * h_dim1], abs(d__1)) + (d__2 = h__[l 
00164                 + l * h_dim1], abs(d__2));
00165         if (s == 0.) {
00166             s = norm;
00167         }
00168         tst1 = s;
00169         tst2 = tst1 + (d__1 = h__[l + (l - 1) * h_dim1], abs(d__1));
00170         if (tst2 == tst1) {
00171             goto L100;
00172         }
00173 /* L80: */
00174     }
00175 /*     .......... FORM SHIFT .......... */
00176 L100:
00177     x = h__[en + en * h_dim1];
00178     if (l == en) {
00179         goto L270;
00180     }
00181     y = h__[na + na * h_dim1];
00182     w = h__[en + na * h_dim1] * h__[na + en * h_dim1];
00183     if (l == na) {
00184         goto L280;
00185     }
00186     if (itn == 0) {
00187         goto L1000;
00188     }
00189     if (its != 10 && its != 20) {
00190         goto L130;
00191     }
00192 /*     .......... FORM EXCEPTIONAL SHIFT .......... */
00193     t += x;
00194 
00195     i__1 = en;
00196     for (i__ = *low; i__ <= i__1; ++i__) {
00197 /* L120: */
00198         h__[i__ + i__ * h_dim1] -= x;
00199     }
00200 
00201     s = (d__1 = h__[en + na * h_dim1], abs(d__1)) + (d__2 = h__[na + enm2 * 
00202             h_dim1], abs(d__2));
00203     x = s * .75;
00204     y = x;
00205     w = s * -.4375 * s;
00206 L130:
00207     ++its;
00208     --itn;
00209 /*     .......... LOOK FOR TWO CONSECUTIVE SMALL */
00210 /*                SUB-DIAGONAL ELEMENTS. */
00211 /*                FOR M=EN-2 STEP -1 UNTIL L DO -- .......... */
00212     i__1 = enm2;
00213     for (mm = l; mm <= i__1; ++mm) {
00214         m = enm2 + l - mm;
00215         zz = h__[m + m * h_dim1];
00216         r__ = x - zz;
00217         s = y - zz;
00218         p = (r__ * s - w) / h__[m + 1 + m * h_dim1] + h__[m + (m + 1) * 
00219                 h_dim1];
00220         q = h__[m + 1 + (m + 1) * h_dim1] - zz - r__ - s;
00221         r__ = h__[m + 2 + (m + 1) * h_dim1];
00222         s = abs(p) + abs(q) + abs(r__);
00223         p /= s;
00224         q /= s;
00225         r__ /= s;
00226         if (m == l) {
00227             goto L150;
00228         }
00229         tst1 = abs(p) * ((d__1 = h__[m - 1 + (m - 1) * h_dim1], abs(d__1)) + 
00230                 abs(zz) + (d__2 = h__[m + 1 + (m + 1) * h_dim1], abs(d__2)));
00231         tst2 = tst1 + (d__1 = h__[m + (m - 1) * h_dim1], abs(d__1)) * (abs(q) 
00232                 + abs(r__));
00233         if (tst2 == tst1) {
00234             goto L150;
00235         }
00236 /* L140: */
00237     }
00238 
00239 L150:
00240     mp2 = m + 2;
00241 
00242     i__1 = en;
00243     for (i__ = mp2; i__ <= i__1; ++i__) {
00244         h__[i__ + (i__ - 2) * h_dim1] = 0.;
00245         if (i__ == mp2) {
00246             goto L160;
00247         }
00248         h__[i__ + (i__ - 3) * h_dim1] = 0.;
00249 L160:
00250         ;
00251     }
00252 /*     .......... DOUBLE QR STEP INVOLVING ROWS L TO EN AND */
00253 /*                COLUMNS M TO EN .......... */
00254     i__1 = na;
00255     for (k = m; k <= i__1; ++k) {
00256         notlas = k != na;
00257         if (k == m) {
00258             goto L170;
00259         }
00260         p = h__[k + (k - 1) * h_dim1];
00261         q = h__[k + 1 + (k - 1) * h_dim1];
00262         r__ = 0.;
00263         if (notlas) {
00264             r__ = h__[k + 2 + (k - 1) * h_dim1];
00265         }
00266         x = abs(p) + abs(q) + abs(r__);
00267         if (x == 0.) {
00268             goto L260;
00269         }
00270         p /= x;
00271         q /= x;
00272         r__ /= x;
00273 L170:
00274         d__1 = sqrt(p * p + q * q + r__ * r__);
00275         s = d_sign(&d__1, &p);
00276         if (k == m) {
00277             goto L180;
00278         }
00279         h__[k + (k - 1) * h_dim1] = -s * x;
00280         goto L190;
00281 L180:
00282         if (l != m) {
00283             h__[k + (k - 1) * h_dim1] = -h__[k + (k - 1) * h_dim1];
00284         }
00285 L190:
00286         p += s;
00287         x = p / s;
00288         y = q / s;
00289         zz = r__ / s;
00290         q /= p;
00291         r__ /= p;
00292         if (notlas) {
00293             goto L225;
00294         }
00295 /*     .......... ROW MODIFICATION .......... */
00296         i__2 = *n;
00297         for (j = k; j <= i__2; ++j) {
00298             p = h__[k + j * h_dim1] + q * h__[k + 1 + j * h_dim1];
00299             h__[k + j * h_dim1] -= p * x;
00300             h__[k + 1 + j * h_dim1] -= p * y;
00301 /* L200: */
00302         }
00303 
00304 /* Computing MIN */
00305         i__2 = en, i__3 = k + 3;
00306         j = min(i__2,i__3);
00307 /*     .......... COLUMN MODIFICATION .......... */
00308         i__2 = j;
00309         for (i__ = 1; i__ <= i__2; ++i__) {
00310             p = x * h__[i__ + k * h_dim1] + y * h__[i__ + (k + 1) * h_dim1];
00311             h__[i__ + k * h_dim1] -= p;
00312             h__[i__ + (k + 1) * h_dim1] -= p * q;
00313 /* L210: */
00314         }
00315 /*     .......... ACCUMULATE TRANSFORMATIONS .......... */
00316         i__2 = *igh;
00317         for (i__ = *low; i__ <= i__2; ++i__) {
00318             p = x * z__[i__ + k * z_dim1] + y * z__[i__ + (k + 1) * z_dim1];
00319             z__[i__ + k * z_dim1] -= p;
00320             z__[i__ + (k + 1) * z_dim1] -= p * q;
00321 /* L220: */
00322         }
00323         goto L255;
00324 L225:
00325 /*     .......... ROW MODIFICATION .......... */
00326         i__2 = *n;
00327         for (j = k; j <= i__2; ++j) {
00328             p = h__[k + j * h_dim1] + q * h__[k + 1 + j * h_dim1] + r__ * h__[
00329                     k + 2 + j * h_dim1];
00330             h__[k + j * h_dim1] -= p * x;
00331             h__[k + 1 + j * h_dim1] -= p * y;
00332             h__[k + 2 + j * h_dim1] -= p * zz;
00333 /* L230: */
00334         }
00335 
00336 /* Computing MIN */
00337         i__2 = en, i__3 = k + 3;
00338         j = min(i__2,i__3);
00339 /*     .......... COLUMN MODIFICATION .......... */
00340         i__2 = j;
00341         for (i__ = 1; i__ <= i__2; ++i__) {
00342             p = x * h__[i__ + k * h_dim1] + y * h__[i__ + (k + 1) * h_dim1] + 
00343                     zz * h__[i__ + (k + 2) * h_dim1];
00344             h__[i__ + k * h_dim1] -= p;
00345             h__[i__ + (k + 1) * h_dim1] -= p * q;
00346             h__[i__ + (k + 2) * h_dim1] -= p * r__;
00347 /* L240: */
00348         }
00349 /*     .......... ACCUMULATE TRANSFORMATIONS .......... */
00350         i__2 = *igh;
00351         for (i__ = *low; i__ <= i__2; ++i__) {
00352             p = x * z__[i__ + k * z_dim1] + y * z__[i__ + (k + 1) * z_dim1] + 
00353                     zz * z__[i__ + (k + 2) * z_dim1];
00354             z__[i__ + k * z_dim1] -= p;
00355             z__[i__ + (k + 1) * z_dim1] -= p * q;
00356             z__[i__ + (k + 2) * z_dim1] -= p * r__;
00357 /* L250: */
00358         }
00359 L255:
00360 
00361 L260:
00362         ;
00363     }
00364 
00365     goto L70;
00366 /*     .......... ONE ROOT FOUND .......... */
00367 L270:
00368     h__[en + en * h_dim1] = x + t;
00369     wr[en] = h__[en + en * h_dim1];
00370     wi[en] = 0.;
00371     en = na;
00372     goto L60;
00373 /*     .......... TWO ROOTS FOUND .......... */
00374 L280:
00375     p = (y - x) / 2.;
00376     q = p * p + w;
00377     zz = sqrt((abs(q)));
00378     h__[en + en * h_dim1] = x + t;
00379     x = h__[en + en * h_dim1];
00380     h__[na + na * h_dim1] = y + t;
00381     if (q < 0.) {
00382         goto L320;
00383     }
00384 /*     .......... REAL PAIR .......... */
00385     zz = p + d_sign(&zz, &p);
00386     wr[na] = x + zz;
00387     wr[en] = wr[na];
00388     if (zz != 0.) {
00389         wr[en] = x - w / zz;
00390     }
00391     wi[na] = 0.;
00392     wi[en] = 0.;
00393     x = h__[en + na * h_dim1];
00394     s = abs(x) + abs(zz);
00395     p = x / s;
00396     q = zz / s;
00397     r__ = sqrt(p * p + q * q);
00398     p /= r__;
00399     q /= r__;
00400 /*     .......... ROW MODIFICATION .......... */
00401     i__1 = *n;
00402     for (j = na; j <= i__1; ++j) {
00403         zz = h__[na + j * h_dim1];
00404         h__[na + j * h_dim1] = q * zz + p * h__[en + j * h_dim1];
00405         h__[en + j * h_dim1] = q * h__[en + j * h_dim1] - p * zz;
00406 /* L290: */
00407     }
00408 /*     .......... COLUMN MODIFICATION .......... */
00409     i__1 = en;
00410     for (i__ = 1; i__ <= i__1; ++i__) {
00411         zz = h__[i__ + na * h_dim1];
00412         h__[i__ + na * h_dim1] = q * zz + p * h__[i__ + en * h_dim1];
00413         h__[i__ + en * h_dim1] = q * h__[i__ + en * h_dim1] - p * zz;
00414 /* L300: */
00415     }
00416 /*     .......... ACCUMULATE TRANSFORMATIONS .......... */
00417     i__1 = *igh;
00418     for (i__ = *low; i__ <= i__1; ++i__) {
00419         zz = z__[i__ + na * z_dim1];
00420         z__[i__ + na * z_dim1] = q * zz + p * z__[i__ + en * z_dim1];
00421         z__[i__ + en * z_dim1] = q * z__[i__ + en * z_dim1] - p * zz;
00422 /* L310: */
00423     }
00424 
00425     goto L330;
00426 /*     .......... COMPLEX PAIR .......... */
00427 L320:
00428     wr[na] = x + p;
00429     wr[en] = x + p;
00430     wi[na] = zz;
00431     wi[en] = -zz;
00432 L330:
00433     en = enm2;
00434     goto L60;
00435 /*     .......... ALL ROOTS FOUND.  BACKSUBSTITUTE TO FIND */
00436 /*                VECTORS OF UPPER TRIANGULAR FORM .......... */
00437 L340:
00438     if (norm == 0.) {
00439         goto L1001;
00440     }
00441 /*     .......... FOR EN=N STEP -1 UNTIL 1 DO -- .......... */
00442     i__1 = *n;
00443     for (nn = 1; nn <= i__1; ++nn) {
00444         en = *n + 1 - nn;
00445         p = wr[en];
00446         q = wi[en];
00447         na = en - 1;
00448         if (q < 0.) {
00449             goto L710;
00450         } else if (q == 0) {
00451             goto L600;
00452         } else {
00453             goto L800;
00454         }
00455 /*     .......... REAL VECTOR .......... */
00456 L600:
00457         m = en;
00458         h__[en + en * h_dim1] = 1.;
00459         if (na == 0) {
00460             goto L800;
00461         }
00462 /*     .......... FOR I=EN-1 STEP -1 UNTIL 1 DO -- .......... */
00463         i__2 = na;
00464         for (ii = 1; ii <= i__2; ++ii) {
00465             i__ = en - ii;
00466             w = h__[i__ + i__ * h_dim1] - p;
00467             r__ = 0.;
00468 
00469             i__3 = en;
00470             for (j = m; j <= i__3; ++j) {
00471 /* L610: */
00472                 r__ += h__[i__ + j * h_dim1] * h__[j + en * h_dim1];
00473             }
00474 
00475             if (wi[i__] >= 0.) {
00476                 goto L630;
00477             }
00478             zz = w;
00479             s = r__;
00480             goto L700;
00481 L630:
00482             m = i__;
00483             if (wi[i__] != 0.) {
00484                 goto L640;
00485             }
00486             t = w;
00487             if (t != 0.) {
00488                 goto L635;
00489             }
00490             tst1 = norm;
00491             t = tst1;
00492 L632:
00493             t *= .01;
00494             tst2 = norm + t;
00495             if (tst2 > tst1) {
00496                 goto L632;
00497             }
00498 L635:
00499             h__[i__ + en * h_dim1] = -r__ / t;
00500             goto L680;
00501 /*     .......... SOLVE REAL EQUATIONS .......... */
00502 L640:
00503             x = h__[i__ + (i__ + 1) * h_dim1];
00504             y = h__[i__ + 1 + i__ * h_dim1];
00505             q = (wr[i__] - p) * (wr[i__] - p) + wi[i__] * wi[i__];
00506             t = (x * s - zz * r__) / q;
00507             h__[i__ + en * h_dim1] = t;
00508             if (abs(x) <= abs(zz)) {
00509                 goto L650;
00510             }
00511             h__[i__ + 1 + en * h_dim1] = (-r__ - w * t) / x;
00512             goto L680;
00513 L650:
00514             h__[i__ + 1 + en * h_dim1] = (-s - y * t) / zz;
00515 
00516 /*     .......... OVERFLOW CONTROL .......... */
00517 L680:
00518             t = (d__1 = h__[i__ + en * h_dim1], abs(d__1));
00519             if (t == 0.) {
00520                 goto L700;
00521             }
00522             tst1 = t;
00523             tst2 = tst1 + 1. / tst1;
00524             if (tst2 > tst1) {
00525                 goto L700;
00526             }
00527             i__3 = en;
00528             for (j = i__; j <= i__3; ++j) {
00529                 h__[j + en * h_dim1] /= t;
00530 /* L690: */
00531             }
00532 
00533 L700:
00534             ;
00535         }
00536 /*     .......... END REAL VECTOR .......... */
00537         goto L800;
00538 /*     .......... COMPLEX VECTOR .......... */
00539 L710:
00540         m = na;
00541 /*     .......... LAST VECTOR COMPONENT CHOSEN IMAGINARY SO THAT */
00542 /*                EIGENVECTOR MATRIX IS TRIANGULAR .......... */
00543         if ((d__1 = h__[en + na * h_dim1], abs(d__1)) <= (d__2 = h__[na + en *
00544                  h_dim1], abs(d__2))) {
00545             goto L720;
00546         }
00547         h__[na + na * h_dim1] = q / h__[en + na * h_dim1];
00548         h__[na + en * h_dim1] = -(h__[en + en * h_dim1] - p) / h__[en + na * 
00549                 h_dim1];
00550         goto L730;
00551 L720:
00552         d__1 = -h__[na + en * h_dim1];
00553         d__2 = h__[na + na * h_dim1] - p;
00554         cdiv_(&c_b49, &d__1, &d__2, &q, &h__[na + na * h_dim1], &h__[na + en *
00555                  h_dim1]);
00556 L730:
00557         h__[en + na * h_dim1] = 0.;
00558         h__[en + en * h_dim1] = 1.;
00559         enm2 = na - 1;
00560         if (enm2 == 0) {
00561             goto L800;
00562         }
00563 /*     .......... FOR I=EN-2 STEP -1 UNTIL 1 DO -- .......... */
00564         i__2 = enm2;
00565         for (ii = 1; ii <= i__2; ++ii) {
00566             i__ = na - ii;
00567             w = h__[i__ + i__ * h_dim1] - p;
00568             ra = 0.;
00569             sa = 0.;
00570 
00571             i__3 = en;
00572             for (j = m; j <= i__3; ++j) {
00573                 ra += h__[i__ + j * h_dim1] * h__[j + na * h_dim1];
00574                 sa += h__[i__ + j * h_dim1] * h__[j + en * h_dim1];
00575 /* L760: */
00576             }
00577 
00578             if (wi[i__] >= 0.) {
00579                 goto L770;
00580             }
00581             zz = w;
00582             r__ = ra;
00583             s = sa;
00584             goto L795;
00585 L770:
00586             m = i__;
00587             if (wi[i__] != 0.) {
00588                 goto L780;
00589             }
00590             d__1 = -ra;
00591             d__2 = -sa;
00592             cdiv_(&d__1, &d__2, &w, &q, &h__[i__ + na * h_dim1], &h__[i__ + 
00593                     en * h_dim1]);
00594             goto L790;
00595 /*     .......... SOLVE COMPLEX EQUATIONS .......... */
00596 L780:
00597             x = h__[i__ + (i__ + 1) * h_dim1];
00598             y = h__[i__ + 1 + i__ * h_dim1];
00599             vr = (wr[i__] - p) * (wr[i__] - p) + wi[i__] * wi[i__] - q * q;
00600             vi = (wr[i__] - p) * 2. * q;
00601             if (vr != 0. || vi != 0.) {
00602                 goto L784;
00603             }
00604             tst1 = norm * (abs(w) + abs(q) + abs(x) + abs(y) + abs(zz));
00605             vr = tst1;
00606 L783:
00607             vr *= .01;
00608             tst2 = tst1 + vr;
00609             if (tst2 > tst1) {
00610                 goto L783;
00611             }
00612 L784:
00613             d__1 = x * r__ - zz * ra + q * sa;
00614             d__2 = x * s - zz * sa - q * ra;
00615             cdiv_(&d__1, &d__2, &vr, &vi, &h__[i__ + na * h_dim1], &h__[i__ + 
00616                     en * h_dim1]);
00617             if (abs(x) <= abs(zz) + abs(q)) {
00618                 goto L785;
00619             }
00620             h__[i__ + 1 + na * h_dim1] = (-ra - w * h__[i__ + na * h_dim1] + 
00621                     q * h__[i__ + en * h_dim1]) / x;
00622             h__[i__ + 1 + en * h_dim1] = (-sa - w * h__[i__ + en * h_dim1] - 
00623                     q * h__[i__ + na * h_dim1]) / x;
00624             goto L790;
00625 L785:
00626             d__1 = -r__ - y * h__[i__ + na * h_dim1];
00627             d__2 = -s - y * h__[i__ + en * h_dim1];
00628             cdiv_(&d__1, &d__2, &zz, &q, &h__[i__ + 1 + na * h_dim1], &h__[
00629                     i__ + 1 + en * h_dim1]);
00630 
00631 /*     .......... OVERFLOW CONTROL .......... */
00632 L790:
00633 /* Computing MAX */
00634             d__3 = (d__1 = h__[i__ + na * h_dim1], abs(d__1)), d__4 = (d__2 = 
00635                     h__[i__ + en * h_dim1], abs(d__2));
00636             t = max(d__3,d__4);
00637             if (t == 0.) {
00638                 goto L795;
00639             }
00640             tst1 = t;
00641             tst2 = tst1 + 1. / tst1;
00642             if (tst2 > tst1) {
00643                 goto L795;
00644             }
00645             i__3 = en;
00646             for (j = i__; j <= i__3; ++j) {
00647                 h__[j + na * h_dim1] /= t;
00648                 h__[j + en * h_dim1] /= t;
00649 /* L792: */
00650             }
00651 
00652 L795:
00653             ;
00654         }
00655 /*     .......... END COMPLEX VECTOR .......... */
00656 L800:
00657         ;
00658     }
00659 /*     .......... END BACK SUBSTITUTION. */
00660 /*                VECTORS OF ISOLATED ROOTS .......... */
00661     i__1 = *n;
00662     for (i__ = 1; i__ <= i__1; ++i__) {
00663         if (i__ >= *low && i__ <= *igh) {
00664             goto L840;
00665         }
00666 
00667         i__2 = *n;
00668         for (j = i__; j <= i__2; ++j) {
00669 /* L820: */
00670             z__[i__ + j * z_dim1] = h__[i__ + j * h_dim1];
00671         }
00672 
00673 L840:
00674         ;
00675     }
00676 /*     .......... MULTIPLY BY TRANSFORMATION MATRIX TO GIVE */
00677 /*                VECTORS OF ORIGINAL FULL MATRIX. */
00678 /*                FOR J=N STEP -1 UNTIL LOW DO -- .......... */
00679     i__1 = *n;
00680     for (jj = *low; jj <= i__1; ++jj) {
00681         j = *n + *low - jj;
00682         m = min(j,*igh);
00683 
00684         i__2 = *igh;
00685         for (i__ = *low; i__ <= i__2; ++i__) {
00686             zz = 0.;
00687 
00688             i__3 = m;
00689             for (k = *low; k <= i__3; ++k) {
00690 /* L860: */
00691                 zz += z__[i__ + k * z_dim1] * h__[k + j * h_dim1];
00692             }
00693 
00694             z__[i__ + j * z_dim1] = zz;
00695 /* L880: */
00696         }
00697     }
00698 
00699     goto L1001;
00700 /*     .......... SET ERROR -- ALL EIGENVALUES HAVE NOT */
00701 /*                CONVERGED AFTER 30*N ITERATIONS .......... */
00702 L1000:
00703     *ierr = en;
00704 L1001:
00705     return 0;
00706 } /* hqr2_ */

int hqr_ integer   nm,
integer   n,
integer   low,
integer   igh,
doublereal   h__,
doublereal   wr,
doublereal   wi,
integer   ierr
 

Definition at line 8 of file eis_hqr.c.

References abs, d_sign(), l, min, p, and q.

Referenced by rg_().

00010 {
00011     /* System generated locals */
00012     integer h_dim1, h_offset, i__1, i__2, i__3;
00013     doublereal d__1, d__2;
00014 
00015     /* Builtin functions */
00016     double sqrt(doublereal), d_sign(doublereal *, doublereal *);
00017 
00018     /* Local variables */
00019     static doublereal norm;
00020     static integer i__, j, k, l, m;
00021     static doublereal p, q, r__, s, t, w, x, y;
00022     static integer na, en, ll, mm;
00023     static doublereal zz;
00024     static logical notlas;
00025     static integer mp2, itn, its, enm2;
00026     static doublereal tst1, tst2;
00027 
00028 
00029 
00030 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE HQR, */
00031 /*     NUM. MATH. 14, 219-231(1970) BY MARTIN, PETERS, AND WILKINSON. */
00032 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 359-371(1971). */
00033 
00034 /*     THIS SUBROUTINE FINDS THE EIGENVALUES OF A REAL */
00035 /*     UPPER HESSENBERG MATRIX BY THE QR METHOD. */
00036 
00037 /*     ON INPUT */
00038 
00039 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00040 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00041 /*          DIMENSION STATEMENT. */
00042 
00043 /*        N IS THE ORDER OF THE MATRIX. */
00044 
00045 /*        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING */
00046 /*          SUBROUTINE  BALANC.  IF  BALANC  HAS NOT BEEN USED, */
00047 /*          SET LOW=1, IGH=N. */
00048 
00049 /*        H CONTAINS THE UPPER HESSENBERG MATRIX.  INFORMATION ABOUT */
00050 /*          THE TRANSFORMATIONS USED IN THE REDUCTION TO HESSENBERG */
00051 /*          FORM BY  ELMHES  OR  ORTHES, IF PERFORMED, IS STORED */
00052 /*          IN THE REMAINING TRIANGLE UNDER THE HESSENBERG MATRIX. */
00053 
00054 /*     ON OUTPUT */
00055 
00056 /*        H HAS BEEN DESTROYED.  THEREFORE, IT MUST BE SAVED */
00057 /*          BEFORE CALLING  HQR  IF SUBSEQUENT CALCULATION AND */
00058 /*          BACK TRANSFORMATION OF EIGENVECTORS IS TO BE PERFORMED. */
00059 
00060 /*        WR AND WI CONTAIN THE REAL AND IMAGINARY PARTS, */
00061 /*          RESPECTIVELY, OF THE EIGENVALUES.  THE EIGENVALUES */
00062 /*          ARE UNORDERED EXCEPT THAT COMPLEX CONJUGATE PAIRS */
00063 /*          OF VALUES APPEAR CONSECUTIVELY WITH THE EIGENVALUE */
00064 /*          HAVING THE POSITIVE IMAGINARY PART FIRST.  IF AN */
00065 /*          ERROR EXIT IS MADE, THE EIGENVALUES SHOULD BE CORRECT */
00066 /*          FOR INDICES IERR+1,...,N. */
00067 
00068 /*        IERR IS SET TO */
00069 /*          ZERO       FOR NORMAL RETURN, */
00070 /*          J          IF THE LIMIT OF 30*N ITERATIONS IS EXHAUSTED */
00071 /*                     WHILE THE J-TH EIGENVALUE IS BEING SOUGHT. */
00072 
00073 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00074 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00075 */
00076 
00077 /*     THIS VERSION DATED AUGUST 1983. */
00078 
00079 /*     ------------------------------------------------------------------ 
00080 */
00081 
00082     /* Parameter adjustments */
00083     --wi;
00084     --wr;
00085     h_dim1 = *nm;
00086     h_offset = h_dim1 + 1;
00087     h__ -= h_offset;
00088 
00089     /* Function Body */
00090     *ierr = 0;
00091     norm = 0.;
00092     k = 1;
00093 /*     .......... STORE ROOTS ISOLATED BY BALANC */
00094 /*                AND COMPUTE MATRIX NORM .......... */
00095     i__1 = *n;
00096     for (i__ = 1; i__ <= i__1; ++i__) {
00097 
00098         i__2 = *n;
00099         for (j = k; j <= i__2; ++j) {
00100 /* L40: */
00101             norm += (d__1 = h__[i__ + j * h_dim1], abs(d__1));
00102         }
00103 
00104         k = i__;
00105         if (i__ >= *low && i__ <= *igh) {
00106             goto L50;
00107         }
00108         wr[i__] = h__[i__ + i__ * h_dim1];
00109         wi[i__] = 0.;
00110 L50:
00111         ;
00112     }
00113 
00114     en = *igh;
00115     t = 0.;
00116     itn = *n * 30;
00117 /*     .......... SEARCH FOR NEXT EIGENVALUES .......... */
00118 L60:
00119     if (en < *low) {
00120         goto L1001;
00121     }
00122     its = 0;
00123     na = en - 1;
00124     enm2 = na - 1;
00125 /*     .......... LOOK FOR SINGLE SMALL SUB-DIAGONAL ELEMENT */
00126 /*                FOR L=EN STEP -1 UNTIL LOW DO -- .......... */
00127 L70:
00128     i__1 = en;
00129     for (ll = *low; ll <= i__1; ++ll) {
00130         l = en + *low - ll;
00131         if (l == *low) {
00132             goto L100;
00133         }
00134         s = (d__1 = h__[l - 1 + (l - 1) * h_dim1], abs(d__1)) + (d__2 = h__[l 
00135                 + l * h_dim1], abs(d__2));
00136         if (s == 0.) {
00137             s = norm;
00138         }
00139         tst1 = s;
00140         tst2 = tst1 + (d__1 = h__[l + (l - 1) * h_dim1], abs(d__1));
00141         if (tst2 == tst1) {
00142             goto L100;
00143         }
00144 /* L80: */
00145     }
00146 /*     .......... FORM SHIFT .......... */
00147 L100:
00148     x = h__[en + en * h_dim1];
00149     if (l == en) {
00150         goto L270;
00151     }
00152     y = h__[na + na * h_dim1];
00153     w = h__[en + na * h_dim1] * h__[na + en * h_dim1];
00154     if (l == na) {
00155         goto L280;
00156     }
00157     if (itn == 0) {
00158         goto L1000;
00159     }
00160     if (its != 10 && its != 20) {
00161         goto L130;
00162     }
00163 /*     .......... FORM EXCEPTIONAL SHIFT .......... */
00164     t += x;
00165 
00166     i__1 = en;
00167     for (i__ = *low; i__ <= i__1; ++i__) {
00168 /* L120: */
00169         h__[i__ + i__ * h_dim1] -= x;
00170     }
00171 
00172     s = (d__1 = h__[en + na * h_dim1], abs(d__1)) + (d__2 = h__[na + enm2 * 
00173             h_dim1], abs(d__2));
00174     x = s * .75;
00175     y = x;
00176     w = s * -.4375 * s;
00177 L130:
00178     ++its;
00179     --itn;
00180 /*     .......... LOOK FOR TWO CONSECUTIVE SMALL */
00181 /*                SUB-DIAGONAL ELEMENTS. */
00182 /*                FOR M=EN-2 STEP -1 UNTIL L DO -- .......... */
00183     i__1 = enm2;
00184     for (mm = l; mm <= i__1; ++mm) {
00185         m = enm2 + l - mm;
00186         zz = h__[m + m * h_dim1];
00187         r__ = x - zz;
00188         s = y - zz;
00189         p = (r__ * s - w) / h__[m + 1 + m * h_dim1] + h__[m + (m + 1) * 
00190                 h_dim1];
00191         q = h__[m + 1 + (m + 1) * h_dim1] - zz - r__ - s;
00192         r__ = h__[m + 2 + (m + 1) * h_dim1];
00193         s = abs(p) + abs(q) + abs(r__);
00194         p /= s;
00195         q /= s;
00196         r__ /= s;
00197         if (m == l) {
00198             goto L150;
00199         }
00200         tst1 = abs(p) * ((d__1 = h__[m - 1 + (m - 1) * h_dim1], abs(d__1)) + 
00201                 abs(zz) + (d__2 = h__[m + 1 + (m + 1) * h_dim1], abs(d__2)));
00202         tst2 = tst1 + (d__1 = h__[m + (m - 1) * h_dim1], abs(d__1)) * (abs(q) 
00203                 + abs(r__));
00204         if (tst2 == tst1) {
00205             goto L150;
00206         }
00207 /* L140: */
00208     }
00209 
00210 L150:
00211     mp2 = m + 2;
00212 
00213     i__1 = en;
00214     for (i__ = mp2; i__ <= i__1; ++i__) {
00215         h__[i__ + (i__ - 2) * h_dim1] = 0.;
00216         if (i__ == mp2) {
00217             goto L160;
00218         }
00219         h__[i__ + (i__ - 3) * h_dim1] = 0.;
00220 L160:
00221         ;
00222     }
00223 /*     .......... DOUBLE QR STEP INVOLVING ROWS L TO EN AND */
00224 /*                COLUMNS M TO EN .......... */
00225     i__1 = na;
00226     for (k = m; k <= i__1; ++k) {
00227         notlas = k != na;
00228         if (k == m) {
00229             goto L170;
00230         }
00231         p = h__[k + (k - 1) * h_dim1];
00232         q = h__[k + 1 + (k - 1) * h_dim1];
00233         r__ = 0.;
00234         if (notlas) {
00235             r__ = h__[k + 2 + (k - 1) * h_dim1];
00236         }
00237         x = abs(p) + abs(q) + abs(r__);
00238         if (x == 0.) {
00239             goto L260;
00240         }
00241         p /= x;
00242         q /= x;
00243         r__ /= x;
00244 L170:
00245         d__1 = sqrt(p * p + q * q + r__ * r__);
00246         s = d_sign(&d__1, &p);
00247         if (k == m) {
00248             goto L180;
00249         }
00250         h__[k + (k - 1) * h_dim1] = -s * x;
00251         goto L190;
00252 L180:
00253         if (l != m) {
00254             h__[k + (k - 1) * h_dim1] = -h__[k + (k - 1) * h_dim1];
00255         }
00256 L190:
00257         p += s;
00258         x = p / s;
00259         y = q / s;
00260         zz = r__ / s;
00261         q /= p;
00262         r__ /= p;
00263         if (notlas) {
00264             goto L225;
00265         }
00266 /*     .......... ROW MODIFICATION .......... */
00267         i__2 = *n;
00268         for (j = k; j <= i__2; ++j) {
00269             p = h__[k + j * h_dim1] + q * h__[k + 1 + j * h_dim1];
00270             h__[k + j * h_dim1] -= p * x;
00271             h__[k + 1 + j * h_dim1] -= p * y;
00272 /* L200: */
00273         }
00274 
00275 /* Computing MIN */
00276         i__2 = en, i__3 = k + 3;
00277         j = min(i__2,i__3);
00278 /*     .......... COLUMN MODIFICATION .......... */
00279         i__2 = j;
00280         for (i__ = 1; i__ <= i__2; ++i__) {
00281             p = x * h__[i__ + k * h_dim1] + y * h__[i__ + (k + 1) * h_dim1];
00282             h__[i__ + k * h_dim1] -= p;
00283             h__[i__ + (k + 1) * h_dim1] -= p * q;
00284 /* L210: */
00285         }
00286         goto L255;
00287 L225:
00288 /*     .......... ROW MODIFICATION .......... */
00289         i__2 = *n;
00290         for (j = k; j <= i__2; ++j) {
00291             p = h__[k + j * h_dim1] + q * h__[k + 1 + j * h_dim1] + r__ * h__[
00292                     k + 2 + j * h_dim1];
00293             h__[k + j * h_dim1] -= p * x;
00294             h__[k + 1 + j * h_dim1] -= p * y;
00295             h__[k + 2 + j * h_dim1] -= p * zz;
00296 /* L230: */
00297         }
00298 
00299 /* Computing MIN */
00300         i__2 = en, i__3 = k + 3;
00301         j = min(i__2,i__3);
00302 /*     .......... COLUMN MODIFICATION .......... */
00303         i__2 = j;
00304         for (i__ = 1; i__ <= i__2; ++i__) {
00305             p = x * h__[i__ + k * h_dim1] + y * h__[i__ + (k + 1) * h_dim1] + 
00306                     zz * h__[i__ + (k + 2) * h_dim1];
00307             h__[i__ + k * h_dim1] -= p;
00308             h__[i__ + (k + 1) * h_dim1] -= p * q;
00309             h__[i__ + (k + 2) * h_dim1] -= p * r__;
00310 /* L240: */
00311         }
00312 L255:
00313 
00314 L260:
00315         ;
00316     }
00317 
00318     goto L70;
00319 /*     .......... ONE ROOT FOUND .......... */
00320 L270:
00321     wr[en] = x + t;
00322     wi[en] = 0.;
00323     en = na;
00324     goto L60;
00325 /*     .......... TWO ROOTS FOUND .......... */
00326 L280:
00327     p = (y - x) / 2.;
00328     q = p * p + w;
00329     zz = sqrt((abs(q)));
00330     x += t;
00331     if (q < 0.) {
00332         goto L320;
00333     }
00334 /*     .......... REAL PAIR .......... */
00335     zz = p + d_sign(&zz, &p);
00336     wr[na] = x + zz;
00337     wr[en] = wr[na];
00338     if (zz != 0.) {
00339         wr[en] = x - w / zz;
00340     }
00341     wi[na] = 0.;
00342     wi[en] = 0.;
00343     goto L330;
00344 /*     .......... COMPLEX PAIR .......... */
00345 L320:
00346     wr[na] = x + p;
00347     wr[en] = x + p;
00348     wi[na] = zz;
00349     wi[en] = -zz;
00350 L330:
00351     en = enm2;
00352     goto L60;
00353 /*     .......... SET ERROR -- ALL EIGENVALUES HAVE NOT */
00354 /*                CONVERGED AFTER 30*N ITERATIONS .......... */
00355 L1000:
00356     *ierr = en;
00357 L1001:
00358     return 0;
00359 } /* hqr_ */

int htrib3_ integer   nm,
integer   n,
doublereal   a,
doublereal   tau,
integer   m,
doublereal   zr,
doublereal   zi
 

Definition at line 8 of file eis_htrib3.c.

References a, and l.

00010 {
00011     /* System generated locals */
00012     integer a_dim1, a_offset, zr_dim1, zr_offset, zi_dim1, zi_offset, i__1, 
00013             i__2, i__3;
00014 
00015     /* Local variables */
00016     static doublereal h__;
00017     static integer i__, j, k, l;
00018     static doublereal s, si;
00019 
00020 
00021 
00022 /*     THIS SUBROUTINE IS A TRANSLATION OF A COMPLEX ANALOGUE OF */
00023 /*     THE ALGOL PROCEDURE TRBAK3, NUM. MATH. 11, 181-195(1968) */
00024 /*     BY MARTIN, REINSCH, AND WILKINSON. */
00025 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971). */
00026 
00027 /*     THIS SUBROUTINE FORMS THE EIGENVECTORS OF A COMPLEX HERMITIAN */
00028 /*     MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDING */
00029 /*     REAL SYMMETRIC TRIDIAGONAL MATRIX DETERMINED BY  HTRID3. */
00030 
00031 /*     ON INPUT */
00032 
00033 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00034 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00035 /*          DIMENSION STATEMENT. */
00036 
00037 /*        N IS THE ORDER OF THE MATRIX. */
00038 
00039 /*        A CONTAINS INFORMATION ABOUT THE UNITARY TRANSFORMATIONS */
00040 /*          USED IN THE REDUCTION BY  HTRID3. */
00041 
00042 /*        TAU CONTAINS FURTHER INFORMATION ABOUT THE TRANSFORMATIONS. */
00043 
00044 /*        M IS THE NUMBER OF EIGENVECTORS TO BE BACK TRANSFORMED. */
00045 
00046 /*        ZR CONTAINS THE EIGENVECTORS TO BE BACK TRANSFORMED */
00047 /*          IN ITS FIRST M COLUMNS. */
00048 
00049 /*     ON OUTPUT */
00050 
00051 /*        ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS, */
00052 /*          RESPECTIVELY, OF THE TRANSFORMED EIGENVECTORS */
00053 /*          IN THEIR FIRST M COLUMNS. */
00054 
00055 /*     NOTE THAT THE LAST COMPONENT OF EACH RETURNED VECTOR */
00056 /*     IS REAL AND THAT VECTOR EUCLIDEAN NORMS ARE PRESERVED. */
00057 
00058 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00059 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00060 */
00061 
00062 /*     THIS VERSION DATED AUGUST 1983. */
00063 
00064 /*     ------------------------------------------------------------------ 
00065 */
00066 
00067     /* Parameter adjustments */
00068     tau -= 3;
00069     a_dim1 = *nm;
00070     a_offset = a_dim1 + 1;
00071     a -= a_offset;
00072     zi_dim1 = *nm;
00073     zi_offset = zi_dim1 + 1;
00074     zi -= zi_offset;
00075     zr_dim1 = *nm;
00076     zr_offset = zr_dim1 + 1;
00077     zr -= zr_offset;
00078 
00079     /* Function Body */
00080     if (*m == 0) {
00081         goto L200;
00082     }
00083 /*     .......... TRANSFORM THE EIGENVECTORS OF THE REAL SYMMETRIC */
00084 /*                TRIDIAGONAL MATRIX TO THOSE OF THE HERMITIAN */
00085 /*                TRIDIAGONAL MATRIX. .......... */
00086     i__1 = *n;
00087     for (k = 1; k <= i__1; ++k) {
00088 
00089         i__2 = *m;
00090         for (j = 1; j <= i__2; ++j) {
00091             zi[k + j * zi_dim1] = -zr[k + j * zr_dim1] * tau[(k << 1) + 2];
00092             zr[k + j * zr_dim1] *= tau[(k << 1) + 1];
00093 /* L50: */
00094         }
00095     }
00096 
00097     if (*n == 1) {
00098         goto L200;
00099     }
00100 /*     .......... RECOVER AND APPLY THE HOUSEHOLDER MATRICES .......... */
00101     i__2 = *n;
00102     for (i__ = 2; i__ <= i__2; ++i__) {
00103         l = i__ - 1;
00104         h__ = a[i__ + i__ * a_dim1];
00105         if (h__ == 0.) {
00106             goto L140;
00107         }
00108 
00109         i__1 = *m;
00110         for (j = 1; j <= i__1; ++j) {
00111             s = 0.;
00112             si = 0.;
00113 
00114             i__3 = l;
00115             for (k = 1; k <= i__3; ++k) {
00116                 s = s + a[i__ + k * a_dim1] * zr[k + j * zr_dim1] - a[k + i__ 
00117                         * a_dim1] * zi[k + j * zi_dim1];
00118                 si = si + a[i__ + k * a_dim1] * zi[k + j * zi_dim1] + a[k + 
00119                         i__ * a_dim1] * zr[k + j * zr_dim1];
00120 /* L110: */
00121             }
00122 /*     .......... DOUBLE DIVISIONS AVOID POSSIBLE UNDERFLOW ......
00123 .... */
00124             s = s / h__ / h__;
00125             si = si / h__ / h__;
00126 
00127             i__3 = l;
00128             for (k = 1; k <= i__3; ++k) {
00129                 zr[k + j * zr_dim1] = zr[k + j * zr_dim1] - s * a[i__ + k * 
00130                         a_dim1] - si * a[k + i__ * a_dim1];
00131                 zi[k + j * zi_dim1] = zi[k + j * zi_dim1] - si * a[i__ + k * 
00132                         a_dim1] + s * a[k + i__ * a_dim1];
00133 /* L120: */
00134             }
00135 
00136 /* L130: */
00137         }
00138 
00139 L140:
00140         ;
00141     }
00142 
00143 L200:
00144     return 0;
00145 } /* htrib3_ */

int htribk_ integer   nm,
integer   n,
doublereal   ar,
doublereal   ai,
doublereal   tau,
integer   m,
doublereal   zr,
doublereal   zi
 

Definition at line 8 of file eis_htribk.c.

References l.

Referenced by ch_().

00011 {
00012     /* System generated locals */
00013     integer ar_dim1, ar_offset, ai_dim1, ai_offset, zr_dim1, zr_offset, 
00014             zi_dim1, zi_offset, i__1, i__2, i__3;
00015 
00016     /* Local variables */
00017     static doublereal h__;
00018     static integer i__, j, k, l;
00019     static doublereal s, si;
00020 
00021 
00022 
00023 /*     THIS SUBROUTINE IS A TRANSLATION OF A COMPLEX ANALOGUE OF */
00024 /*     THE ALGOL PROCEDURE TRBAK1, NUM. MATH. 11, 181-195(1968) */
00025 /*     BY MARTIN, REINSCH, AND WILKINSON. */
00026 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971). */
00027 
00028 /*     THIS SUBROUTINE FORMS THE EIGENVECTORS OF A COMPLEX HERMITIAN */
00029 /*     MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDING */
00030 /*     REAL SYMMETRIC TRIDIAGONAL MATRIX DETERMINED BY  HTRIDI. */
00031 
00032 /*     ON INPUT */
00033 
00034 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00035 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00036 /*          DIMENSION STATEMENT. */
00037 
00038 /*        N IS THE ORDER OF THE MATRIX. */
00039 
00040 /*        AR AND AI CONTAIN INFORMATION ABOUT THE UNITARY TRANS- */
00041 /*          FORMATIONS USED IN THE REDUCTION BY  HTRIDI  IN THEIR */
00042 /*          FULL LOWER TRIANGLES EXCEPT FOR THE DIAGONAL OF AR. */
00043 
00044 /*        TAU CONTAINS FURTHER INFORMATION ABOUT THE TRANSFORMATIONS. */
00045 
00046 /*        M IS THE NUMBER OF EIGENVECTORS TO BE BACK TRANSFORMED. */
00047 
00048 /*        ZR CONTAINS THE EIGENVECTORS TO BE BACK TRANSFORMED */
00049 /*          IN ITS FIRST M COLUMNS. */
00050 
00051 /*     ON OUTPUT */
00052 
00053 /*        ZR AND ZI CONTAIN THE REAL AND IMAGINARY PARTS, */
00054 /*          RESPECTIVELY, OF THE TRANSFORMED EIGENVECTORS */
00055 /*          IN THEIR FIRST M COLUMNS. */
00056 
00057 /*     NOTE THAT THE LAST COMPONENT OF EACH RETURNED VECTOR */
00058 /*     IS REAL AND THAT VECTOR EUCLIDEAN NORMS ARE PRESERVED. */
00059 
00060 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00061 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00062 */
00063 
00064 /*     THIS VERSION DATED AUGUST 1983. */
00065 
00066 /*     ------------------------------------------------------------------ 
00067 */
00068 
00069     /* Parameter adjustments */
00070     tau -= 3;
00071     ai_dim1 = *nm;
00072     ai_offset = ai_dim1 + 1;
00073     ai -= ai_offset;
00074     ar_dim1 = *nm;
00075     ar_offset = ar_dim1 + 1;
00076     ar -= ar_offset;
00077     zi_dim1 = *nm;
00078     zi_offset = zi_dim1 + 1;
00079     zi -= zi_offset;
00080     zr_dim1 = *nm;
00081     zr_offset = zr_dim1 + 1;
00082     zr -= zr_offset;
00083 
00084     /* Function Body */
00085     if (*m == 0) {
00086         goto L200;
00087     }
00088 /*     .......... TRANSFORM THE EIGENVECTORS OF THE REAL SYMMETRIC */
00089 /*                TRIDIAGONAL MATRIX TO THOSE OF THE HERMITIAN */
00090 /*                TRIDIAGONAL MATRIX. .......... */
00091     i__1 = *n;
00092     for (k = 1; k <= i__1; ++k) {
00093 
00094         i__2 = *m;
00095         for (j = 1; j <= i__2; ++j) {
00096             zi[k + j * zi_dim1] = -zr[k + j * zr_dim1] * tau[(k << 1) + 2];
00097             zr[k + j * zr_dim1] *= tau[(k << 1) + 1];
00098 /* L50: */
00099         }
00100     }
00101 
00102     if (*n == 1) {
00103         goto L200;
00104     }
00105 /*     .......... RECOVER AND APPLY THE HOUSEHOLDER MATRICES .......... */
00106     i__2 = *n;
00107     for (i__ = 2; i__ <= i__2; ++i__) {
00108         l = i__ - 1;
00109         h__ = ai[i__ + i__ * ai_dim1];
00110         if (h__ == 0.) {
00111             goto L140;
00112         }
00113 
00114         i__1 = *m;
00115         for (j = 1; j <= i__1; ++j) {
00116             s = 0.;
00117             si = 0.;
00118 
00119             i__3 = l;
00120             for (k = 1; k <= i__3; ++k) {
00121                 s = s + ar[i__ + k * ar_dim1] * zr[k + j * zr_dim1] - ai[i__ 
00122                         + k * ai_dim1] * zi[k + j * zi_dim1];
00123                 si = si + ar[i__ + k * ar_dim1] * zi[k + j * zi_dim1] + ai[
00124                         i__ + k * ai_dim1] * zr[k + j * zr_dim1];
00125 /* L110: */
00126             }
00127 /*     .......... DOUBLE DIVISIONS AVOID POSSIBLE UNDERFLOW ......
00128 .... */
00129             s = s / h__ / h__;
00130             si = si / h__ / h__;
00131 
00132             i__3 = l;
00133             for (k = 1; k <= i__3; ++k) {
00134                 zr[k + j * zr_dim1] = zr[k + j * zr_dim1] - s * ar[i__ + k * 
00135                         ar_dim1] - si * ai[i__ + k * ai_dim1];
00136                 zi[k + j * zi_dim1] = zi[k + j * zi_dim1] - si * ar[i__ + k * 
00137                         ar_dim1] + s * ai[i__ + k * ai_dim1];
00138 /* L120: */
00139             }
00140 
00141 /* L130: */
00142         }
00143 
00144 L140:
00145         ;
00146     }
00147 
00148 L200:
00149     return 0;
00150 } /* htribk_ */

int htrid3_ integer   nm,
integer   n,
doublereal   a,
doublereal   d__,
doublereal   e,
doublereal   e2,
doublereal   tau
 

Definition at line 8 of file eis_htrid3.c.

References a, abs, l, pythag_(), and scale.

00010 {
00011     /* System generated locals */
00012     integer a_dim1, a_offset, i__1, i__2, i__3;
00013     doublereal d__1, d__2;
00014 
00015     /* Builtin functions */
00016     double sqrt(doublereal);
00017 
00018     /* Local variables */
00019     static doublereal f, g, h__;
00020     static integer i__, j, k, l;
00021     static doublereal scale, fi, gi, hh;
00022     static integer ii;
00023     static doublereal si;
00024     extern doublereal pythag_(doublereal *, doublereal *);
00025     static integer jm1, jp1;
00026 
00027 
00028 
00029 /*     THIS SUBROUTINE IS A TRANSLATION OF A COMPLEX ANALOGUE OF */
00030 /*     THE ALGOL PROCEDURE TRED3, NUM. MATH. 11, 181-195(1968) */
00031 /*     BY MARTIN, REINSCH, AND WILKINSON. */
00032 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971). */
00033 
00034 /*     THIS SUBROUTINE REDUCES A COMPLEX HERMITIAN MATRIX, STORED AS */
00035 /*     A SINGLE SQUARE ARRAY, TO A REAL SYMMETRIC TRIDIAGONAL MATRIX */
00036 /*     USING UNITARY SIMILARITY TRANSFORMATIONS. */
00037 
00038 /*     ON INPUT */
00039 
00040 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00041 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00042 /*          DIMENSION STATEMENT. */
00043 
00044 /*        N IS THE ORDER OF THE MATRIX. */
00045 
00046 /*        A CONTAINS THE LOWER TRIANGLE OF THE COMPLEX HERMITIAN INPUT */
00047 /*          MATRIX.  THE REAL PARTS OF THE MATRIX ELEMENTS ARE STORED */
00048 /*          IN THE FULL LOWER TRIANGLE OF A, AND THE IMAGINARY PARTS */
00049 /*          ARE STORED IN THE TRANSPOSED POSITIONS OF THE STRICT UPPER */
00050 /*          TRIANGLE OF A.  NO STORAGE IS REQUIRED FOR THE ZERO */
00051 /*          IMAGINARY PARTS OF THE DIAGONAL ELEMENTS. */
00052 
00053 /*     ON OUTPUT */
00054 
00055 /*        A CONTAINS INFORMATION ABOUT THE UNITARY TRANSFORMATIONS */
00056 /*          USED IN THE REDUCTION. */
00057 
00058 /*        D CONTAINS THE DIAGONAL ELEMENTS OF THE THE TRIDIAGONAL MATRIX. 
00059 */
00060 
00061 /*        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE TRIDIAGONAL */
00062 /*          MATRIX IN ITS LAST N-1 POSITIONS.  E(1) IS SET TO ZERO. */
00063 
00064 /*        E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E. */
00065 /*          E2 MAY COINCIDE WITH E IF THE SQUARES ARE NOT NEEDED. */
00066 
00067 /*        TAU CONTAINS FURTHER INFORMATION ABOUT THE TRANSFORMATIONS. */
00068 
00069 /*     CALLS PYTHAG FOR  DSQRT(A*A + B*B) . */
00070 
00071 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00072 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00073 */
00074 
00075 /*     THIS VERSION DATED AUGUST 1983. */
00076 
00077 /*     ------------------------------------------------------------------ 
00078 */
00079 
00080     /* Parameter adjustments */
00081     tau -= 3;
00082     --e2;
00083     --e;
00084     --d__;
00085     a_dim1 = *nm;
00086     a_offset = a_dim1 + 1;
00087     a -= a_offset;
00088 
00089     /* Function Body */
00090     tau[(*n << 1) + 1] = 1.;
00091     tau[(*n << 1) + 2] = 0.;
00092 /*     .......... FOR I=N STEP -1 UNTIL 1 DO -- .......... */
00093     i__1 = *n;
00094     for (ii = 1; ii <= i__1; ++ii) {
00095         i__ = *n + 1 - ii;
00096         l = i__ - 1;
00097         h__ = 0.;
00098         scale = 0.;
00099         if (l < 1) {
00100             goto L130;
00101         }
00102 /*     .......... SCALE ROW (ALGOL TOL THEN NOT NEEDED) .......... */
00103         i__2 = l;
00104         for (k = 1; k <= i__2; ++k) {
00105 /* L120: */
00106             scale = scale + (d__1 = a[i__ + k * a_dim1], abs(d__1)) + (d__2 = 
00107                     a[k + i__ * a_dim1], abs(d__2));
00108         }
00109 
00110         if (scale != 0.) {
00111             goto L140;
00112         }
00113         tau[(l << 1) + 1] = 1.;
00114         tau[(l << 1) + 2] = 0.;
00115 L130:
00116         e[i__] = 0.;
00117         e2[i__] = 0.;
00118         goto L290;
00119 
00120 L140:
00121         i__2 = l;
00122         for (k = 1; k <= i__2; ++k) {
00123             a[i__ + k * a_dim1] /= scale;
00124             a[k + i__ * a_dim1] /= scale;
00125             h__ = h__ + a[i__ + k * a_dim1] * a[i__ + k * a_dim1] + a[k + i__ 
00126                     * a_dim1] * a[k + i__ * a_dim1];
00127 /* L150: */
00128         }
00129 
00130         e2[i__] = scale * scale * h__;
00131         g = sqrt(h__);
00132         e[i__] = scale * g;
00133         f = pythag_(&a[i__ + l * a_dim1], &a[l + i__ * a_dim1]);
00134 /*     .......... FORM NEXT DIAGONAL ELEMENT OF MATRIX T .......... */
00135         if (f == 0.) {
00136             goto L160;
00137         }
00138         tau[(l << 1) + 1] = (a[l + i__ * a_dim1] * tau[(i__ << 1) + 2] - a[
00139                 i__ + l * a_dim1] * tau[(i__ << 1) + 1]) / f;
00140         si = (a[i__ + l * a_dim1] * tau[(i__ << 1) + 2] + a[l + i__ * a_dim1] 
00141                 * tau[(i__ << 1) + 1]) / f;
00142         h__ += f * g;
00143         g = g / f + 1.;
00144         a[i__ + l * a_dim1] = g * a[i__ + l * a_dim1];
00145         a[l + i__ * a_dim1] = g * a[l + i__ * a_dim1];
00146         if (l == 1) {
00147             goto L270;
00148         }
00149         goto L170;
00150 L160:
00151         tau[(l << 1) + 1] = -tau[(i__ << 1) + 1];
00152         si = tau[(i__ << 1) + 2];
00153         a[i__ + l * a_dim1] = g;
00154 L170:
00155         f = 0.;
00156 
00157         i__2 = l;
00158         for (j = 1; j <= i__2; ++j) {
00159             g = 0.;
00160             gi = 0.;
00161             if (j == 1) {
00162                 goto L190;
00163             }
00164             jm1 = j - 1;
00165 /*     .......... FORM ELEMENT OF A*U .......... */
00166             i__3 = jm1;
00167             for (k = 1; k <= i__3; ++k) {
00168                 g = g + a[j + k * a_dim1] * a[i__ + k * a_dim1] + a[k + j * 
00169                         a_dim1] * a[k + i__ * a_dim1];
00170                 gi = gi - a[j + k * a_dim1] * a[k + i__ * a_dim1] + a[k + j * 
00171                         a_dim1] * a[i__ + k * a_dim1];
00172 /* L180: */
00173             }
00174 
00175 L190:
00176             g += a[j + j * a_dim1] * a[i__ + j * a_dim1];
00177             gi -= a[j + j * a_dim1] * a[j + i__ * a_dim1];
00178             jp1 = j + 1;
00179             if (l < jp1) {
00180                 goto L220;
00181             }
00182 
00183             i__3 = l;
00184             for (k = jp1; k <= i__3; ++k) {
00185                 g = g + a[k + j * a_dim1] * a[i__ + k * a_dim1] - a[j + k * 
00186                         a_dim1] * a[k + i__ * a_dim1];
00187                 gi = gi - a[k + j * a_dim1] * a[k + i__ * a_dim1] - a[j + k * 
00188                         a_dim1] * a[i__ + k * a_dim1];
00189 /* L200: */
00190             }
00191 /*     .......... FORM ELEMENT OF P .......... */
00192 L220:
00193             e[j] = g / h__;
00194             tau[(j << 1) + 2] = gi / h__;
00195             f = f + e[j] * a[i__ + j * a_dim1] - tau[(j << 1) + 2] * a[j + 
00196                     i__ * a_dim1];
00197 /* L240: */
00198         }
00199 
00200         hh = f / (h__ + h__);
00201 /*     .......... FORM REDUCED A .......... */
00202         i__2 = l;
00203         for (j = 1; j <= i__2; ++j) {
00204             f = a[i__ + j * a_dim1];
00205             g = e[j] - hh * f;
00206             e[j] = g;
00207             fi = -a[j + i__ * a_dim1];
00208             gi = tau[(j << 1) + 2] - hh * fi;
00209             tau[(j << 1) + 2] = -gi;
00210             a[j + j * a_dim1] -= (f * g + fi * gi) * 2.;
00211             if (j == 1) {
00212                 goto L260;
00213             }
00214             jm1 = j - 1;
00215 
00216             i__3 = jm1;
00217             for (k = 1; k <= i__3; ++k) {
00218                 a[j + k * a_dim1] = a[j + k * a_dim1] - f * e[k] - g * a[i__ 
00219                         + k * a_dim1] + fi * tau[(k << 1) + 2] + gi * a[k + 
00220                         i__ * a_dim1];
00221                 a[k + j * a_dim1] = a[k + j * a_dim1] - f * tau[(k << 1) + 2] 
00222                         - g * a[k + i__ * a_dim1] - fi * e[k] - gi * a[i__ + 
00223                         k * a_dim1];
00224 /* L250: */
00225             }
00226 
00227 L260:
00228             ;
00229         }
00230 
00231 L270:
00232         i__2 = l;
00233         for (k = 1; k <= i__2; ++k) {
00234             a[i__ + k * a_dim1] = scale * a[i__ + k * a_dim1];
00235             a[k + i__ * a_dim1] = scale * a[k + i__ * a_dim1];
00236 /* L280: */
00237         }
00238 
00239         tau[(l << 1) + 2] = -si;
00240 L290:
00241         d__[i__] = a[i__ + i__ * a_dim1];
00242         a[i__ + i__ * a_dim1] = scale * sqrt(h__);
00243 /* L300: */
00244     }
00245 
00246     return 0;
00247 } /* htrid3_ */

int htridi_ integer   nm,
integer   n,
doublereal   ar,
doublereal   ai,
doublereal   d__,
doublereal   e,
doublereal   e2,
doublereal   tau
 

Definition at line 8 of file eis_htridi.c.

References abs, l, pythag_(), and scale.

Referenced by ch_().

00011 {
00012     /* System generated locals */
00013     integer ar_dim1, ar_offset, ai_dim1, ai_offset, i__1, i__2, i__3;
00014     doublereal d__1, d__2;
00015 
00016     /* Builtin functions */
00017     double sqrt(doublereal);
00018 
00019     /* Local variables */
00020     static doublereal f, g, h__;
00021     static integer i__, j, k, l;
00022     static doublereal scale, fi, gi, hh;
00023     static integer ii;
00024     static doublereal si;
00025     extern doublereal pythag_(doublereal *, doublereal *);
00026     static integer jp1;
00027 
00028 
00029 
00030 /*     THIS SUBROUTINE IS A TRANSLATION OF A COMPLEX ANALOGUE OF */
00031 /*     THE ALGOL PROCEDURE TRED1, NUM. MATH. 11, 181-195(1968) */
00032 /*     BY MARTIN, REINSCH, AND WILKINSON. */
00033 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971). */
00034 
00035 /*     THIS SUBROUTINE REDUCES A COMPLEX HERMITIAN MATRIX */
00036 /*     TO A REAL SYMMETRIC TRIDIAGONAL MATRIX USING */
00037 /*     UNITARY SIMILARITY TRANSFORMATIONS. */
00038 
00039 /*     ON INPUT */
00040 
00041 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00042 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00043 /*          DIMENSION STATEMENT. */
00044 
00045 /*        N IS THE ORDER OF THE MATRIX. */
00046 
00047 /*        AR AND AI CONTAIN THE REAL AND IMAGINARY PARTS, */
00048 /*          RESPECTIVELY, OF THE COMPLEX HERMITIAN INPUT MATRIX. */
00049 /*          ONLY THE LOWER TRIANGLE OF THE MATRIX NEED BE SUPPLIED. */
00050 
00051 /*     ON OUTPUT */
00052 
00053 /*        AR AND AI CONTAIN INFORMATION ABOUT THE UNITARY TRANS- */
00054 /*          FORMATIONS USED IN THE REDUCTION IN THEIR FULL LOWER */
00055 /*          TRIANGLES.  THEIR STRICT UPPER TRIANGLES AND THE */
00056 /*          DIAGONAL OF AR ARE UNALTERED. */
00057 
00058 /*        D CONTAINS THE DIAGONAL ELEMENTS OF THE THE TRIDIAGONAL MATRIX. 
00059 */
00060 
00061 /*        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE TRIDIAGONAL */
00062 /*          MATRIX IN ITS LAST N-1 POSITIONS.  E(1) IS SET TO ZERO. */
00063 
00064 /*        E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E. */
00065 /*          E2 MAY COINCIDE WITH E IF THE SQUARES ARE NOT NEEDED. */
00066 
00067 /*        TAU CONTAINS FURTHER INFORMATION ABOUT THE TRANSFORMATIONS. */
00068 
00069 /*     CALLS PYTHAG FOR  DSQRT(A*A + B*B) . */
00070 
00071 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00072 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00073 */
00074 
00075 /*     THIS VERSION DATED AUGUST 1983. */
00076 
00077 /*     ------------------------------------------------------------------ 
00078 */
00079 
00080     /* Parameter adjustments */
00081     tau -= 3;
00082     --e2;
00083     --e;
00084     --d__;
00085     ai_dim1 = *nm;
00086     ai_offset = ai_dim1 + 1;
00087     ai -= ai_offset;
00088     ar_dim1 = *nm;
00089     ar_offset = ar_dim1 + 1;
00090     ar -= ar_offset;
00091 
00092     /* Function Body */
00093     tau[(*n << 1) + 1] = 1.;
00094     tau[(*n << 1) + 2] = 0.;
00095 
00096     i__1 = *n;
00097     for (i__ = 1; i__ <= i__1; ++i__) {
00098 /* L100: */
00099         d__[i__] = ar[i__ + i__ * ar_dim1];
00100     }
00101 /*     .......... FOR I=N STEP -1 UNTIL 1 DO -- .......... */
00102     i__1 = *n;
00103     for (ii = 1; ii <= i__1; ++ii) {
00104         i__ = *n + 1 - ii;
00105         l = i__ - 1;
00106         h__ = 0.;
00107         scale = 0.;
00108         if (l < 1) {
00109             goto L130;
00110         }
00111 /*     .......... SCALE ROW (ALGOL TOL THEN NOT NEEDED) .......... */
00112         i__2 = l;
00113         for (k = 1; k <= i__2; ++k) {
00114 /* L120: */
00115             scale = scale + (d__1 = ar[i__ + k * ar_dim1], abs(d__1)) + (d__2 
00116                     = ai[i__ + k * ai_dim1], abs(d__2));
00117         }
00118 
00119         if (scale != 0.) {
00120             goto L140;
00121         }
00122         tau[(l << 1) + 1] = 1.;
00123         tau[(l << 1) + 2] = 0.;
00124 L130:
00125         e[i__] = 0.;
00126         e2[i__] = 0.;
00127         goto L290;
00128 
00129 L140:
00130         i__2 = l;
00131         for (k = 1; k <= i__2; ++k) {
00132             ar[i__ + k * ar_dim1] /= scale;
00133             ai[i__ + k * ai_dim1] /= scale;
00134             h__ = h__ + ar[i__ + k * ar_dim1] * ar[i__ + k * ar_dim1] + ai[
00135                     i__ + k * ai_dim1] * ai[i__ + k * ai_dim1];
00136 /* L150: */
00137         }
00138 
00139         e2[i__] = scale * scale * h__;
00140         g = sqrt(h__);
00141         e[i__] = scale * g;
00142         f = pythag_(&ar[i__ + l * ar_dim1], &ai[i__ + l * ai_dim1]);
00143 /*     .......... FORM NEXT DIAGONAL ELEMENT OF MATRIX T .......... */
00144         if (f == 0.) {
00145             goto L160;
00146         }
00147         tau[(l << 1) + 1] = (ai[i__ + l * ai_dim1] * tau[(i__ << 1) + 2] - ar[
00148                 i__ + l * ar_dim1] * tau[(i__ << 1) + 1]) / f;
00149         si = (ar[i__ + l * ar_dim1] * tau[(i__ << 1) + 2] + ai[i__ + l * 
00150                 ai_dim1] * tau[(i__ << 1) + 1]) / f;
00151         h__ += f * g;
00152         g = g / f + 1.;
00153         ar[i__ + l * ar_dim1] = g * ar[i__ + l * ar_dim1];
00154         ai[i__ + l * ai_dim1] = g * ai[i__ + l * ai_dim1];
00155         if (l == 1) {
00156             goto L270;
00157         }
00158         goto L170;
00159 L160:
00160         tau[(l << 1) + 1] = -tau[(i__ << 1) + 1];
00161         si = tau[(i__ << 1) + 2];
00162         ar[i__ + l * ar_dim1] = g;
00163 L170:
00164         f = 0.;
00165 
00166         i__2 = l;
00167         for (j = 1; j <= i__2; ++j) {
00168             g = 0.;
00169             gi = 0.;
00170 /*     .......... FORM ELEMENT OF A*U .......... */
00171             i__3 = j;
00172             for (k = 1; k <= i__3; ++k) {
00173                 g = g + ar[j + k * ar_dim1] * ar[i__ + k * ar_dim1] + ai[j + 
00174                         k * ai_dim1] * ai[i__ + k * ai_dim1];
00175                 gi = gi - ar[j + k * ar_dim1] * ai[i__ + k * ai_dim1] + ai[j 
00176                         + k * ai_dim1] * ar[i__ + k * ar_dim1];
00177 /* L180: */
00178             }
00179 
00180             jp1 = j + 1;
00181             if (l < jp1) {
00182                 goto L220;
00183             }
00184 
00185             i__3 = l;
00186             for (k = jp1; k <= i__3; ++k) {
00187                 g = g + ar[k + j * ar_dim1] * ar[i__ + k * ar_dim1] - ai[k + 
00188                         j * ai_dim1] * ai[i__ + k * ai_dim1];
00189                 gi = gi - ar[k + j * ar_dim1] * ai[i__ + k * ai_dim1] - ai[k 
00190                         + j * ai_dim1] * ar[i__ + k * ar_dim1];
00191 /* L200: */
00192             }
00193 /*     .......... FORM ELEMENT OF P .......... */
00194 L220:
00195             e[j] = g / h__;
00196             tau[(j << 1) + 2] = gi / h__;
00197             f = f + e[j] * ar[i__ + j * ar_dim1] - tau[(j << 1) + 2] * ai[i__ 
00198                     + j * ai_dim1];
00199 /* L240: */
00200         }
00201 
00202         hh = f / (h__ + h__);
00203 /*     .......... FORM REDUCED A .......... */
00204         i__2 = l;
00205         for (j = 1; j <= i__2; ++j) {
00206             f = ar[i__ + j * ar_dim1];
00207             g = e[j] - hh * f;
00208             e[j] = g;
00209             fi = -ai[i__ + j * ai_dim1];
00210             gi = tau[(j << 1) + 2] - hh * fi;
00211             tau[(j << 1) + 2] = -gi;
00212 
00213             i__3 = j;
00214             for (k = 1; k <= i__3; ++k) {
00215                 ar[j + k * ar_dim1] = ar[j + k * ar_dim1] - f * e[k] - g * ar[
00216                         i__ + k * ar_dim1] + fi * tau[(k << 1) + 2] + gi * ai[
00217                         i__ + k * ai_dim1];
00218                 ai[j + k * ai_dim1] = ai[j + k * ai_dim1] - f * tau[(k << 1) 
00219                         + 2] - g * ai[i__ + k * ai_dim1] - fi * e[k] - gi * 
00220                         ar[i__ + k * ar_dim1];
00221 /* L260: */
00222             }
00223         }
00224 
00225 L270:
00226         i__3 = l;
00227         for (k = 1; k <= i__3; ++k) {
00228             ar[i__ + k * ar_dim1] = scale * ar[i__ + k * ar_dim1];
00229             ai[i__ + k * ai_dim1] = scale * ai[i__ + k * ai_dim1];
00230 /* L280: */
00231         }
00232 
00233         tau[(l << 1) + 2] = -si;
00234 L290:
00235         hh = d__[i__];
00236         d__[i__] = ar[i__ + i__ * ar_dim1];
00237         ar[i__ + i__ * ar_dim1] = hh;
00238         ai[i__ + i__ * ai_dim1] = scale * sqrt(h__);
00239 /* L300: */
00240     }
00241 
00242     return 0;
00243 } /* htridi_ */

int imtql1_ integer   n,
doublereal   d__,
doublereal   e,
integer   ierr
 

Definition at line 12 of file eis_imtql1.c.

References abs, c_b10, d_sign(), l, p, and pythag_().

Referenced by rst_(), and rt_().

00014 {
00015     /* System generated locals */
00016     integer i__1, i__2;
00017     doublereal d__1, d__2;
00018 
00019     /* Builtin functions */
00020     double d_sign(doublereal *, doublereal *);
00021 
00022     /* Local variables */
00023     static doublereal b, c__, f, g;
00024     static integer i__, j, l, m;
00025     static doublereal p, r__, s;
00026     static integer ii;
00027     extern doublereal pythag_(doublereal *, doublereal *);
00028     static integer mml;
00029     static doublereal tst1, tst2;
00030 
00031 
00032 
00033 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE IMTQL1, */
00034 /*     NUM. MATH. 12, 377-383(1968) BY MARTIN AND WILKINSON, */
00035 /*     AS MODIFIED IN NUM. MATH. 15, 450(1970) BY DUBRULLE. */
00036 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 241-248(1971). */
00037 
00038 /*     THIS SUBROUTINE FINDS THE EIGENVALUES OF A SYMMETRIC */
00039 /*     TRIDIAGONAL MATRIX BY THE IMPLICIT QL METHOD. */
00040 
00041 /*     ON INPUT */
00042 
00043 /*        N IS THE ORDER OF THE MATRIX. */
00044 
00045 /*        D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX. */
00046 
00047 /*        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX */
00048 /*          IN ITS LAST N-1 POSITIONS.  E(1) IS ARBITRARY. */
00049 
00050 /*      ON OUTPUT */
00051 
00052 /*        D CONTAINS THE EIGENVALUES IN ASCENDING ORDER.  IF AN */
00053 /*          ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT AND */
00054 /*          ORDERED FOR INDICES 1,2,...IERR-1, BUT MAY NOT BE */
00055 /*          THE SMALLEST EIGENVALUES. */
00056 
00057 /*        E HAS BEEN DESTROYED. */
00058 
00059 /*        IERR IS SET TO */
00060 /*          ZERO       FOR NORMAL RETURN, */
00061 /*          J          IF THE J-TH EIGENVALUE HAS NOT BEEN */
00062 /*                     DETERMINED AFTER 30 ITERATIONS. */
00063 
00064 /*     CALLS PYTHAG FOR  DSQRT(A*A + B*B) . */
00065 
00066 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00067 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00068 */
00069 
00070 /*     THIS VERSION DATED AUGUST 1983. */
00071 
00072 /*     ------------------------------------------------------------------ 
00073 */
00074 
00075     /* Parameter adjustments */
00076     --e;
00077     --d__;
00078 
00079     /* Function Body */
00080     *ierr = 0;
00081     if (*n == 1) {
00082         goto L1001;
00083     }
00084 
00085     i__1 = *n;
00086     for (i__ = 2; i__ <= i__1; ++i__) {
00087 /* L100: */
00088         e[i__ - 1] = e[i__];
00089     }
00090 
00091     e[*n] = 0.;
00092 
00093     i__1 = *n;
00094     for (l = 1; l <= i__1; ++l) {
00095         j = 0;
00096 /*     .......... LOOK FOR SMALL SUB-DIAGONAL ELEMENT .......... */
00097 L105:
00098         i__2 = *n;
00099         for (m = l; m <= i__2; ++m) {
00100             if (m == *n) {
00101                 goto L120;
00102             }
00103             tst1 = (d__1 = d__[m], abs(d__1)) + (d__2 = d__[m + 1], abs(d__2))
00104                     ;
00105             tst2 = tst1 + (d__1 = e[m], abs(d__1));
00106             if (tst2 == tst1) {
00107                 goto L120;
00108             }
00109 /* L110: */
00110         }
00111 
00112 L120:
00113         p = d__[l];
00114         if (m == l) {
00115             goto L215;
00116         }
00117         if (j == 30) {
00118             goto L1000;
00119         }
00120         ++j;
00121 /*     .......... FORM SHIFT .......... */
00122         g = (d__[l + 1] - p) / (e[l] * 2.);
00123         r__ = pythag_(&g, &c_b10);
00124         g = d__[m] - p + e[l] / (g + d_sign(&r__, &g));
00125         s = 1.;
00126         c__ = 1.;
00127         p = 0.;
00128         mml = m - l;
00129 /*     .......... FOR I=M-1 STEP -1 UNTIL L DO -- .......... */
00130         i__2 = mml;
00131         for (ii = 1; ii <= i__2; ++ii) {
00132             i__ = m - ii;
00133             f = s * e[i__];
00134             b = c__ * e[i__];
00135             r__ = pythag_(&f, &g);
00136             e[i__ + 1] = r__;
00137             if (r__ == 0.) {
00138                 goto L210;
00139             }
00140             s = f / r__;
00141             c__ = g / r__;
00142             g = d__[i__ + 1] - p;
00143             r__ = (d__[i__] - g) * s + c__ * 2. * b;
00144             p = s * r__;
00145             d__[i__ + 1] = g + p;
00146             g = c__ * r__ - b;
00147 /* L200: */
00148         }
00149 
00150         d__[l] -= p;
00151         e[l] = g;
00152         e[m] = 0.;
00153         goto L105;
00154 /*     .......... RECOVER FROM UNDERFLOW .......... */
00155 L210:
00156         d__[i__ + 1] -= p;
00157         e[m] = 0.;
00158         goto L105;
00159 /*     .......... ORDER EIGENVALUES .......... */
00160 L215:
00161         if (l == 1) {
00162             goto L250;
00163         }
00164 /*     .......... FOR I=L STEP -1 UNTIL 2 DO -- .......... */
00165         i__2 = l;
00166         for (ii = 2; ii <= i__2; ++ii) {
00167             i__ = l + 2 - ii;
00168             if (p >= d__[i__ - 1]) {
00169                 goto L270;
00170             }
00171             d__[i__] = d__[i__ - 1];
00172 /* L230: */
00173         }
00174 
00175 L250:
00176         i__ = 1;
00177 L270:
00178         d__[i__] = p;
00179 /* L290: */
00180     }
00181 
00182     goto L1001;
00183 /*     .......... SET ERROR -- NO CONVERGENCE TO AN */
00184 /*                EIGENVALUE AFTER 30 ITERATIONS .......... */
00185 L1000:
00186     *ierr = l;
00187 L1001:
00188     return 0;
00189 } /* imtql1_ */

int imtql2_ integer   nm,
integer   n,
doublereal   d__,
doublereal   e,
doublereal   z__,
integer   ierr
 

Definition at line 12 of file eis_imtql2.c.

References abs, c_b9, d_sign(), l, p, and pythag_().

Referenced by rst_(), and rt_().

00014 {
00015     /* System generated locals */
00016     integer z_dim1, z_offset, i__1, i__2, i__3;
00017     doublereal d__1, d__2;
00018 
00019     /* Builtin functions */
00020     double d_sign(doublereal *, doublereal *);
00021 
00022     /* Local variables */
00023     static doublereal b, c__, f, g;
00024     static integer i__, j, k, l, m;
00025     static doublereal p, r__, s;
00026     static integer ii;
00027     extern doublereal pythag_(doublereal *, doublereal *);
00028     static integer mml;
00029     static doublereal tst1, tst2;
00030 
00031 
00032 
00033 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE IMTQL2, */
00034 /*     NUM. MATH. 12, 377-383(1968) BY MARTIN AND WILKINSON, */
00035 /*     AS MODIFIED IN NUM. MATH. 15, 450(1970) BY DUBRULLE. */
00036 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 241-248(1971). */
00037 
00038 /*     THIS SUBROUTINE FINDS THE EIGENVALUES AND EIGENVECTORS */
00039 /*     OF A SYMMETRIC TRIDIAGONAL MATRIX BY THE IMPLICIT QL METHOD. */
00040 /*     THE EIGENVECTORS OF A FULL SYMMETRIC MATRIX CAN ALSO */
00041 /*     BE FOUND IF  TRED2  HAS BEEN USED TO REDUCE THIS */
00042 /*     FULL MATRIX TO TRIDIAGONAL FORM. */
00043 
00044 /*     ON INPUT */
00045 
00046 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00047 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00048 /*          DIMENSION STATEMENT. */
00049 
00050 /*        N IS THE ORDER OF THE MATRIX. */
00051 
00052 /*        D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX. */
00053 
00054 /*        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX */
00055 /*          IN ITS LAST N-1 POSITIONS.  E(1) IS ARBITRARY. */
00056 
00057 /*        Z CONTAINS THE TRANSFORMATION MATRIX PRODUCED IN THE */
00058 /*          REDUCTION BY  TRED2, IF PERFORMED.  IF THE EIGENVECTORS */
00059 /*          OF THE TRIDIAGONAL MATRIX ARE DESIRED, Z MUST CONTAIN */
00060 /*          THE IDENTITY MATRIX. */
00061 
00062 /*      ON OUTPUT */
00063 
00064 /*        D CONTAINS THE EIGENVALUES IN ASCENDING ORDER.  IF AN */
00065 /*          ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT BUT */
00066 /*          UNORDERED FOR INDICES 1,2,...,IERR-1. */
00067 
00068 /*        E HAS BEEN DESTROYED. */
00069 
00070 /*        Z CONTAINS ORTHONORMAL EIGENVECTORS OF THE SYMMETRIC */
00071 /*          TRIDIAGONAL (OR FULL) MATRIX.  IF AN ERROR EXIT IS MADE, */
00072 /*          Z CONTAINS THE EIGENVECTORS ASSOCIATED WITH THE STORED */
00073 /*          EIGENVALUES. */
00074 
00075 /*        IERR IS SET TO */
00076 /*          ZERO       FOR NORMAL RETURN, */
00077 /*          J          IF THE J-TH EIGENVALUE HAS NOT BEEN */
00078 /*                     DETERMINED AFTER 30 ITERATIONS. */
00079 
00080 /*     CALLS PYTHAG FOR  DSQRT(A*A + B*B) . */
00081 
00082 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00083 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00084 */
00085 
00086 /*     THIS VERSION DATED AUGUST 1983. */
00087 
00088 /*     ------------------------------------------------------------------ 
00089 */
00090 
00091     /* Parameter adjustments */
00092     z_dim1 = *nm;
00093     z_offset = z_dim1 + 1;
00094     z__ -= z_offset;
00095     --e;
00096     --d__;
00097 
00098     /* Function Body */
00099     *ierr = 0;
00100     if (*n == 1) {
00101         goto L1001;
00102     }
00103 
00104     i__1 = *n;
00105     for (i__ = 2; i__ <= i__1; ++i__) {
00106 /* L100: */
00107         e[i__ - 1] = e[i__];
00108     }
00109 
00110     e[*n] = 0.;
00111 
00112     i__1 = *n;
00113     for (l = 1; l <= i__1; ++l) {
00114         j = 0;
00115 /*     .......... LOOK FOR SMALL SUB-DIAGONAL ELEMENT .......... */
00116 L105:
00117         i__2 = *n;
00118         for (m = l; m <= i__2; ++m) {
00119             if (m == *n) {
00120                 goto L120;
00121             }
00122             tst1 = (d__1 = d__[m], abs(d__1)) + (d__2 = d__[m + 1], abs(d__2))
00123                     ;
00124             tst2 = tst1 + (d__1 = e[m], abs(d__1));
00125             if (tst2 == tst1) {
00126                 goto L120;
00127             }
00128 /* L110: */
00129         }
00130 
00131 L120:
00132         p = d__[l];
00133         if (m == l) {
00134             goto L240;
00135         }
00136         if (j == 30) {
00137             goto L1000;
00138         }
00139         ++j;
00140 /*     .......... FORM SHIFT .......... */
00141         g = (d__[l + 1] - p) / (e[l] * 2.);
00142         r__ = pythag_(&g, &c_b9);
00143         g = d__[m] - p + e[l] / (g + d_sign(&r__, &g));
00144         s = 1.;
00145         c__ = 1.;
00146         p = 0.;
00147         mml = m - l;
00148 /*     .......... FOR I=M-1 STEP -1 UNTIL L DO -- .......... */
00149         i__2 = mml;
00150         for (ii = 1; ii <= i__2; ++ii) {
00151             i__ = m - ii;
00152             f = s * e[i__];
00153             b = c__ * e[i__];
00154             r__ = pythag_(&f, &g);
00155             e[i__ + 1] = r__;
00156             if (r__ == 0.) {
00157                 goto L210;
00158             }
00159             s = f / r__;
00160             c__ = g / r__;
00161             g = d__[i__ + 1] - p;
00162             r__ = (d__[i__] - g) * s + c__ * 2. * b;
00163             p = s * r__;
00164             d__[i__ + 1] = g + p;
00165             g = c__ * r__ - b;
00166 /*     .......... FORM VECTOR .......... */
00167             i__3 = *n;
00168             for (k = 1; k <= i__3; ++k) {
00169                 f = z__[k + (i__ + 1) * z_dim1];
00170                 z__[k + (i__ + 1) * z_dim1] = s * z__[k + i__ * z_dim1] + c__ 
00171                         * f;
00172                 z__[k + i__ * z_dim1] = c__ * z__[k + i__ * z_dim1] - s * f;
00173 /* L180: */
00174             }
00175 
00176 /* L200: */
00177         }
00178 
00179         d__[l] -= p;
00180         e[l] = g;
00181         e[m] = 0.;
00182         goto L105;
00183 /*     .......... RECOVER FROM UNDERFLOW .......... */
00184 L210:
00185         d__[i__ + 1] -= p;
00186         e[m] = 0.;
00187         goto L105;
00188 L240:
00189         ;
00190     }
00191 /*     .......... ORDER EIGENVALUES AND EIGENVECTORS .......... */
00192     i__1 = *n;
00193     for (ii = 2; ii <= i__1; ++ii) {
00194         i__ = ii - 1;
00195         k = i__;
00196         p = d__[i__];
00197 
00198         i__2 = *n;
00199         for (j = ii; j <= i__2; ++j) {
00200             if (d__[j] >= p) {
00201                 goto L260;
00202             }
00203             k = j;
00204             p = d__[j];
00205 L260:
00206             ;
00207         }
00208 
00209         if (k == i__) {
00210             goto L300;
00211         }
00212         d__[k] = d__[i__];
00213         d__[i__] = p;
00214 
00215         i__2 = *n;
00216         for (j = 1; j <= i__2; ++j) {
00217             p = z__[j + i__ * z_dim1];
00218             z__[j + i__ * z_dim1] = z__[j + k * z_dim1];
00219             z__[j + k * z_dim1] = p;
00220 /* L280: */
00221         }
00222 
00223 L300:
00224         ;
00225     }
00226 
00227     goto L1001;
00228 /*     .......... SET ERROR -- NO CONVERGENCE TO AN */
00229 /*                EIGENVALUE AFTER 30 ITERATIONS .......... */
00230 L1000:
00231     *ierr = l;
00232 L1001:
00233     return 0;
00234 } /* imtql2_ */

int imtqlv_ integer   n,
doublereal   d__,
doublereal   e,
doublereal   e2,
doublereal   w,
integer   ind,
integer   ierr,
doublereal   rv1
 

Definition at line 12 of file eis_imtqlv.c.

References abs, c_b11, d_sign(), ind, l, p, and pythag_().

Referenced by rsm_().

00015 {
00016     /* System generated locals */
00017     integer i__1, i__2;
00018     doublereal d__1, d__2;
00019 
00020     /* Builtin functions */
00021     double d_sign(doublereal *, doublereal *);
00022 
00023     /* Local variables */
00024     static doublereal b, c__, f, g;
00025     static integer i__, j, k, l, m;
00026     static doublereal p, r__, s;
00027     static integer ii;
00028     extern doublereal pythag_(doublereal *, doublereal *);
00029     static integer tag, mml;
00030     static doublereal tst1, tst2;
00031 
00032 
00033 
00034 /*     THIS SUBROUTINE IS A VARIANT OF  IMTQL1  WHICH IS A TRANSLATION OF 
00035 */
00036 /*     ALGOL PROCEDURE IMTQL1, NUM. MATH. 12, 377-383(1968) BY MARTIN AND 
00037 */
00038 /*     WILKINSON, AS MODIFIED IN NUM. MATH. 15, 450(1970) BY DUBRULLE. */
00039 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 241-248(1971). */
00040 
00041 /*     THIS SUBROUTINE FINDS THE EIGENVALUES OF A SYMMETRIC TRIDIAGONAL */
00042 /*     MATRIX BY THE IMPLICIT QL METHOD AND ASSOCIATES WITH THEM */
00043 /*     THEIR CORRESPONDING SUBMATRIX INDICES. */
00044 
00045 /*     ON INPUT */
00046 
00047 /*        N IS THE ORDER OF THE MATRIX. */
00048 
00049 /*        D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX. */
00050 
00051 /*        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX */
00052 /*          IN ITS LAST N-1 POSITIONS.  E(1) IS ARBITRARY. */
00053 
00054 /*        E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E. */
00055 /*          E2(1) IS ARBITRARY. */
00056 
00057 /*     ON OUTPUT */
00058 
00059 /*        D AND E ARE UNALTERED. */
00060 
00061 /*        ELEMENTS OF E2, CORRESPONDING TO ELEMENTS OF E REGARDED */
00062 /*          AS NEGLIGIBLE, HAVE BEEN REPLACED BY ZERO CAUSING THE */
00063 /*          MATRIX TO SPLIT INTO A DIRECT SUM OF SUBMATRICES. */
00064 /*          E2(1) IS ALSO SET TO ZERO. */
00065 
00066 /*        W CONTAINS THE EIGENVALUES IN ASCENDING ORDER.  IF AN */
00067 /*          ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT AND */
00068 /*          ORDERED FOR INDICES 1,2,...IERR-1, BUT MAY NOT BE */
00069 /*          THE SMALLEST EIGENVALUES. */
00070 
00071 /*        IND CONTAINS THE SUBMATRIX INDICES ASSOCIATED WITH THE */
00072 /*          CORRESPONDING EIGENVALUES IN W -- 1 FOR EIGENVALUES */
00073 /*          BELONGING TO THE FIRST SUBMATRIX FROM THE TOP, */
00074 /*          2 FOR THOSE BELONGING TO THE SECOND SUBMATRIX, ETC.. */
00075 
00076 /*        IERR IS SET TO */
00077 /*          ZERO       FOR NORMAL RETURN, */
00078 /*          J          IF THE J-TH EIGENVALUE HAS NOT BEEN */
00079 /*                     DETERMINED AFTER 30 ITERATIONS. */
00080 
00081 /*        RV1 IS A TEMPORARY STORAGE ARRAY. */
00082 
00083 /*     CALLS PYTHAG FOR  DSQRT(A*A + B*B) . */
00084 
00085 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00086 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00087 */
00088 
00089 /*     THIS VERSION DATED AUGUST 1983. */
00090 
00091 /*     ------------------------------------------------------------------ 
00092 */
00093 
00094     /* Parameter adjustments */
00095     --rv1;
00096     --ind;
00097     --w;
00098     --e2;
00099     --e;
00100     --d__;
00101 
00102     /* Function Body */
00103     *ierr = 0;
00104     k = 0;
00105     tag = 0;
00106 
00107     i__1 = *n;
00108     for (i__ = 1; i__ <= i__1; ++i__) {
00109         w[i__] = d__[i__];
00110         if (i__ != 1) {
00111             rv1[i__ - 1] = e[i__];
00112         }
00113 /* L100: */
00114     }
00115 
00116     e2[1] = 0.;
00117     rv1[*n] = 0.;
00118 
00119     i__1 = *n;
00120     for (l = 1; l <= i__1; ++l) {
00121         j = 0;
00122 /*     .......... LOOK FOR SMALL SUB-DIAGONAL ELEMENT .......... */
00123 L105:
00124         i__2 = *n;
00125         for (m = l; m <= i__2; ++m) {
00126             if (m == *n) {
00127                 goto L120;
00128             }
00129             tst1 = (d__1 = w[m], abs(d__1)) + (d__2 = w[m + 1], abs(d__2));
00130             tst2 = tst1 + (d__1 = rv1[m], abs(d__1));
00131             if (tst2 == tst1) {
00132                 goto L120;
00133             }
00134 /*     .......... GUARD AGAINST UNDERFLOWED ELEMENT OF E2 ........
00135 .. */
00136             if (e2[m + 1] == 0.) {
00137                 goto L125;
00138             }
00139 /* L110: */
00140         }
00141 
00142 L120:
00143         if (m <= k) {
00144             goto L130;
00145         }
00146         if (m != *n) {
00147             e2[m + 1] = 0.;
00148         }
00149 L125:
00150         k = m;
00151         ++tag;
00152 L130:
00153         p = w[l];
00154         if (m == l) {
00155             goto L215;
00156         }
00157         if (j == 30) {
00158             goto L1000;
00159         }
00160         ++j;
00161 /*     .......... FORM SHIFT .......... */
00162         g = (w[l + 1] - p) / (rv1[l] * 2.);
00163         r__ = pythag_(&g, &c_b11);
00164         g = w[m] - p + rv1[l] / (g + d_sign(&r__, &g));
00165         s = 1.;
00166         c__ = 1.;
00167         p = 0.;
00168         mml = m - l;
00169 /*     .......... FOR I=M-1 STEP -1 UNTIL L DO -- .......... */
00170         i__2 = mml;
00171         for (ii = 1; ii <= i__2; ++ii) {
00172             i__ = m - ii;
00173             f = s * rv1[i__];
00174             b = c__ * rv1[i__];
00175             r__ = pythag_(&f, &g);
00176             rv1[i__ + 1] = r__;
00177             if (r__ == 0.) {
00178                 goto L210;
00179             }
00180             s = f / r__;
00181             c__ = g / r__;
00182             g = w[i__ + 1] - p;
00183             r__ = (w[i__] - g) * s + c__ * 2. * b;
00184             p = s * r__;
00185             w[i__ + 1] = g + p;
00186             g = c__ * r__ - b;
00187 /* L200: */
00188         }
00189 
00190         w[l] -= p;
00191         rv1[l] = g;
00192         rv1[m] = 0.;
00193         goto L105;
00194 /*     .......... RECOVER FROM UNDERFLOW .......... */
00195 L210:
00196         w[i__ + 1] -= p;
00197         rv1[m] = 0.;
00198         goto L105;
00199 /*     .......... ORDER EIGENVALUES .......... */
00200 L215:
00201         if (l == 1) {
00202             goto L250;
00203         }
00204 /*     .......... FOR I=L STEP -1 UNTIL 2 DO -- .......... */
00205         i__2 = l;
00206         for (ii = 2; ii <= i__2; ++ii) {
00207             i__ = l + 2 - ii;
00208             if (p >= w[i__ - 1]) {
00209                 goto L270;
00210             }
00211             w[i__] = w[i__ - 1];
00212             ind[i__] = ind[i__ - 1];
00213 /* L230: */
00214         }
00215 
00216 L250:
00217         i__ = 1;
00218 L270:
00219         w[i__] = p;
00220         ind[i__] = tag;
00221 /* L290: */
00222     }
00223 
00224     goto L1001;
00225 /*     .......... SET ERROR -- NO CONVERGENCE TO AN */
00226 /*                EIGENVALUE AFTER 30 ITERATIONS .......... */
00227 L1000:
00228     *ierr = l;
00229 L1001:
00230     return 0;
00231 } /* imtqlv_ */

int invit_ integer   nm,
integer   n,
doublereal   a,
doublereal   wr,
doublereal   wi,
logical   select,
integer   mm,
integer   m,
doublereal   z__,
integer   ierr,
doublereal   rm1,
doublereal   rv1,
doublereal   rv2
 

Definition at line 8 of file eis_invit.c.

References a, abs, cdiv_(), epslon_(), l, mp, n1, and pythag_().

00012 {
00013     /* System generated locals */
00014     integer a_dim1, a_offset, z_dim1, z_offset, rm1_dim1, rm1_offset, i__1, 
00015             i__2, i__3;
00016     doublereal d__1, d__2;
00017 
00018     /* Builtin functions */
00019     double sqrt(doublereal);
00020 
00021     /* Local variables */
00022     extern /* Subroutine */ int cdiv_(doublereal *, doublereal *, doublereal *
00023             , doublereal *, doublereal *, doublereal *);
00024     static doublereal norm;
00025     static integer i__, j, k, l, s;
00026     static doublereal t, w, x, y;
00027     static integer n1;
00028     static doublereal normv;
00029     static integer ii;
00030     static doublereal ilambd;
00031     static integer ip, mp, ns, uk;
00032     static doublereal rlambd;
00033     extern doublereal pythag_(doublereal *, doublereal *), epslon_(doublereal 
00034             *);
00035     static integer km1, ip1;
00036     static doublereal growto, ukroot;
00037     static integer its;
00038     static doublereal eps3;
00039 
00040 
00041 
00042 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE INVIT */
00043 /*     BY PETERS AND WILKINSON. */
00044 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 418-439(1971). */
00045 
00046 /*     THIS SUBROUTINE FINDS THOSE EIGENVECTORS OF A REAL UPPER */
00047 /*     HESSENBERG MATRIX CORRESPONDING TO SPECIFIED EIGENVALUES, */
00048 /*     USING INVERSE ITERATION. */
00049 
00050 /*     ON INPUT */
00051 
00052 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00053 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00054 /*          DIMENSION STATEMENT. */
00055 
00056 /*        N IS THE ORDER OF THE MATRIX. */
00057 
00058 /*        A CONTAINS THE HESSENBERG MATRIX. */
00059 
00060 /*        WR AND WI CONTAIN THE REAL AND IMAGINARY PARTS, RESPECTIVELY, */
00061 /*          OF THE EIGENVALUES OF THE MATRIX.  THE EIGENVALUES MUST BE */
00062 /*          STORED IN A MANNER IDENTICAL TO THAT OF SUBROUTINE  HQR, */
00063 /*          WHICH RECOGNIZES POSSIBLE SPLITTING OF THE MATRIX. */
00064 
00065 /*        SELECT SPECIFIES THE EIGENVECTORS TO BE FOUND. THE */
00066 /*          EIGENVECTOR CORRESPONDING TO THE J-TH EIGENVALUE IS */
00067 /*          SPECIFIED BY SETTING SELECT(J) TO .TRUE.. */
00068 
00069 /*        MM SHOULD BE SET TO AN UPPER BOUND FOR THE NUMBER OF */
00070 /*          COLUMNS REQUIRED TO STORE THE EIGENVECTORS TO BE FOUND. */
00071 /*          NOTE THAT TWO COLUMNS ARE REQUIRED TO STORE THE */
00072 /*          EIGENVECTOR CORRESPONDING TO A COMPLEX EIGENVALUE. */
00073 
00074 /*     ON OUTPUT */
00075 
00076 /*        A AND WI ARE UNALTERED. */
00077 
00078 /*        WR MAY HAVE BEEN ALTERED SINCE CLOSE EIGENVALUES ARE PERTURBED 
00079 */
00080 /*          SLIGHTLY IN SEARCHING FOR INDEPENDENT EIGENVECTORS. */
00081 
00082 /*        SELECT MAY HAVE BEEN ALTERED.  IF THE ELEMENTS CORRESPONDING */
00083 /*          TO A PAIR OF CONJUGATE COMPLEX EIGENVALUES WERE EACH */
00084 /*          INITIALLY SET TO .TRUE., THE PROGRAM RESETS THE SECOND OF */
00085 /*          THE TWO ELEMENTS TO .FALSE.. */
00086 
00087 /*        M IS THE NUMBER OF COLUMNS ACTUALLY USED TO STORE */
00088 /*          THE EIGENVECTORS. */
00089 
00090 /*        Z CONTAINS THE REAL AND IMAGINARY PARTS OF THE EIGENVECTORS. */
00091 /*          IF THE NEXT SELECTED EIGENVALUE IS REAL, THE NEXT COLUMN */
00092 /*          OF Z CONTAINS ITS EIGENVECTOR.  IF THE EIGENVALUE IS */
00093 /*          COMPLEX, THE NEXT TWO COLUMNS OF Z CONTAIN THE REAL AND */
00094 /*          IMAGINARY PARTS OF ITS EIGENVECTOR.  THE EIGENVECTORS ARE */
00095 /*          NORMALIZED SO THAT THE COMPONENT OF LARGEST MAGNITUDE IS 1. */
00096 /*          ANY VECTOR WHICH FAILS THE ACCEPTANCE TEST IS SET TO ZERO. */
00097 
00098 /*        IERR IS SET TO */
00099 /*          ZERO       FOR NORMAL RETURN, */
00100 /*          -(2*N+1)   IF MORE THAN MM COLUMNS OF Z ARE NECESSARY */
00101 /*                     TO STORE THE EIGENVECTORS CORRESPONDING TO */
00102 /*                     THE SPECIFIED EIGENVALUES. */
00103 /*          -K         IF THE ITERATION CORRESPONDING TO THE K-TH */
00104 /*                     VALUE FAILS, */
00105 /*          -(N+K)     IF BOTH ERROR SITUATIONS OCCUR. */
00106 
00107 /*        RM1, RV1, AND RV2 ARE TEMPORARY STORAGE ARRAYS.  NOTE THAT RM1 
00108 */
00109 /*          IS SQUARE OF DIMENSION N BY N AND, AUGMENTED BY TWO COLUMNS */
00110 /*          OF Z, IS THE TRANSPOSE OF THE CORRESPONDING ALGOL B ARRAY. */
00111 
00112 /*     THE ALGOL PROCEDURE GUESSVEC APPEARS IN INVIT IN LINE. */
00113 
00114 /*     CALLS CDIV FOR COMPLEX DIVISION. */
00115 /*     CALLS PYTHAG FOR  DSQRT(A*A + B*B) . */
00116 
00117 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00118 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00119 */
00120 
00121 /*     THIS VERSION DATED AUGUST 1983. */
00122 
00123 /*     ------------------------------------------------------------------ 
00124 */
00125 
00126     /* Parameter adjustments */
00127     --rv2;
00128     --rv1;
00129     rm1_dim1 = *n;
00130     rm1_offset = rm1_dim1 + 1;
00131     rm1 -= rm1_offset;
00132     --select;
00133     --wi;
00134     --wr;
00135     a_dim1 = *nm;
00136     a_offset = a_dim1 + 1;
00137     a -= a_offset;
00138     z_dim1 = *nm;
00139     z_offset = z_dim1 + 1;
00140     z__ -= z_offset;
00141 
00142     /* Function Body */
00143     *ierr = 0;
00144     uk = 0;
00145     s = 1;
00146 /*     .......... IP = 0, REAL EIGENVALUE */
00147 /*                     1, FIRST OF CONJUGATE COMPLEX PAIR */
00148 /*                    -1, SECOND OF CONJUGATE COMPLEX PAIR .......... */
00149     ip = 0;
00150     n1 = *n - 1;
00151 
00152     i__1 = *n;
00153     for (k = 1; k <= i__1; ++k) {
00154         if (wi[k] == 0. || ip < 0) {
00155             goto L100;
00156         }
00157         ip = 1;
00158         if (select[k] && select[k + 1]) {
00159             select[k + 1] = FALSE_;
00160         }
00161 L100:
00162         if (! select[k]) {
00163             goto L960;
00164         }
00165         if (wi[k] != 0.) {
00166             ++s;
00167         }
00168         if (s > *mm) {
00169             goto L1000;
00170         }
00171         if (uk >= k) {
00172             goto L200;
00173         }
00174 /*     .......... CHECK FOR POSSIBLE SPLITTING .......... */
00175         i__2 = *n;
00176         for (uk = k; uk <= i__2; ++uk) {
00177             if (uk == *n) {
00178                 goto L140;
00179             }
00180             if (a[uk + 1 + uk * a_dim1] == 0.) {
00181                 goto L140;
00182             }
00183 /* L120: */
00184         }
00185 /*     .......... COMPUTE INFINITY NORM OF LEADING UK BY UK */
00186 /*                (HESSENBERG) MATRIX .......... */
00187 L140:
00188         norm = 0.;
00189         mp = 1;
00190 
00191         i__2 = uk;
00192         for (i__ = 1; i__ <= i__2; ++i__) {
00193             x = 0.;
00194 
00195             i__3 = uk;
00196             for (j = mp; j <= i__3; ++j) {
00197 /* L160: */
00198                 x += (d__1 = a[i__ + j * a_dim1], abs(d__1));
00199             }
00200 
00201             if (x > norm) {
00202                 norm = x;
00203             }
00204             mp = i__;
00205 /* L180: */
00206         }
00207 /*     .......... EPS3 REPLACES ZERO PIVOT IN DECOMPOSITION */
00208 /*                AND CLOSE ROOTS ARE MODIFIED BY EPS3 .......... */
00209         if (norm == 0.) {
00210             norm = 1.;
00211         }
00212         eps3 = epslon_(&norm);
00213 /*     .......... GROWTO IS THE CRITERION FOR THE GROWTH .......... */
00214         ukroot = (doublereal) uk;
00215         ukroot = sqrt(ukroot);
00216         growto = .1 / ukroot;
00217 L200:
00218         rlambd = wr[k];
00219         ilambd = wi[k];
00220         if (k == 1) {
00221             goto L280;
00222         }
00223         km1 = k - 1;
00224         goto L240;
00225 /*     .......... PERTURB EIGENVALUE IF IT IS CLOSE */
00226 /*                TO ANY PREVIOUS EIGENVALUE .......... */
00227 L220:
00228         rlambd += eps3;
00229 /*     .......... FOR I=K-1 STEP -1 UNTIL 1 DO -- .......... */
00230 L240:
00231         i__2 = km1;
00232         for (ii = 1; ii <= i__2; ++ii) {
00233             i__ = k - ii;
00234             if (select[i__] && (d__1 = wr[i__] - rlambd, abs(d__1)) < eps3 && 
00235                     (d__2 = wi[i__] - ilambd, abs(d__2)) < eps3) {
00236                 goto L220;
00237             }
00238 /* L260: */
00239         }
00240 
00241         wr[k] = rlambd;
00242 /*     .......... PERTURB CONJUGATE EIGENVALUE TO MATCH .......... */
00243         ip1 = k + ip;
00244         wr[ip1] = rlambd;
00245 /*     .......... FORM UPPER HESSENBERG A-RLAMBD*I (TRANSPOSED) */
00246 /*                AND INITIAL REAL VECTOR .......... */
00247 L280:
00248         mp = 1;
00249 
00250         i__2 = uk;
00251         for (i__ = 1; i__ <= i__2; ++i__) {
00252 
00253             i__3 = uk;
00254             for (j = mp; j <= i__3; ++j) {
00255 /* L300: */
00256                 rm1[j + i__ * rm1_dim1] = a[i__ + j * a_dim1];
00257             }
00258 
00259             rm1[i__ + i__ * rm1_dim1] -= rlambd;
00260             mp = i__;
00261             rv1[i__] = eps3;
00262 /* L320: */
00263         }
00264 
00265         its = 0;
00266         if (ilambd != 0.) {
00267             goto L520;
00268         }
00269 /*     .......... REAL EIGENVALUE. */
00270 /*                TRIANGULAR DECOMPOSITION WITH INTERCHANGES, */
00271 /*                REPLACING ZERO PIVOTS BY EPS3 .......... */
00272         if (uk == 1) {
00273             goto L420;
00274         }
00275 
00276         i__2 = uk;
00277         for (i__ = 2; i__ <= i__2; ++i__) {
00278             mp = i__ - 1;
00279             if ((d__1 = rm1[mp + i__ * rm1_dim1], abs(d__1)) <= (d__2 = rm1[
00280                     mp + mp * rm1_dim1], abs(d__2))) {
00281                 goto L360;
00282             }
00283 
00284             i__3 = uk;
00285             for (j = mp; j <= i__3; ++j) {
00286                 y = rm1[j + i__ * rm1_dim1];
00287                 rm1[j + i__ * rm1_dim1] = rm1[j + mp * rm1_dim1];
00288                 rm1[j + mp * rm1_dim1] = y;
00289 /* L340: */
00290             }
00291 
00292 L360:
00293             if (rm1[mp + mp * rm1_dim1] == 0.) {
00294                 rm1[mp + mp * rm1_dim1] = eps3;
00295             }
00296             x = rm1[mp + i__ * rm1_dim1] / rm1[mp + mp * rm1_dim1];
00297             if (x == 0.) {
00298                 goto L400;
00299             }
00300 
00301             i__3 = uk;
00302             for (j = i__; j <= i__3; ++j) {
00303 /* L380: */
00304                 rm1[j + i__ * rm1_dim1] -= x * rm1[j + mp * rm1_dim1];
00305             }
00306 
00307 L400:
00308             ;
00309         }
00310 
00311 L420:
00312         if (rm1[uk + uk * rm1_dim1] == 0.) {
00313             rm1[uk + uk * rm1_dim1] = eps3;
00314         }
00315 /*     .......... BACK SUBSTITUTION FOR REAL VECTOR */
00316 /*                FOR I=UK STEP -1 UNTIL 1 DO -- .......... */
00317 L440:
00318         i__2 = uk;
00319         for (ii = 1; ii <= i__2; ++ii) {
00320             i__ = uk + 1 - ii;
00321             y = rv1[i__];
00322             if (i__ == uk) {
00323                 goto L480;
00324             }
00325             ip1 = i__ + 1;
00326 
00327             i__3 = uk;
00328             for (j = ip1; j <= i__3; ++j) {
00329 /* L460: */
00330                 y -= rm1[j + i__ * rm1_dim1] * rv1[j];
00331             }
00332 
00333 L480:
00334             rv1[i__] = y / rm1[i__ + i__ * rm1_dim1];
00335 /* L500: */
00336         }
00337 
00338         goto L740;
00339 /*     .......... COMPLEX EIGENVALUE. */
00340 /*                TRIANGULAR DECOMPOSITION WITH INTERCHANGES, */
00341 /*                REPLACING ZERO PIVOTS BY EPS3.  STORE IMAGINARY */
00342 /*                PARTS IN UPPER TRIANGLE STARTING AT (1,3) ..........
00343  */
00344 L520:
00345         ns = *n - s;
00346         z__[(s - 1) * z_dim1 + 1] = -ilambd;
00347         z__[s * z_dim1 + 1] = 0.;
00348         if (*n == 2) {
00349             goto L550;
00350         }
00351         rm1[rm1_dim1 * 3 + 1] = -ilambd;
00352         z__[(s - 1) * z_dim1 + 1] = 0.;
00353         if (*n == 3) {
00354             goto L550;
00355         }
00356 
00357         i__2 = *n;
00358         for (i__ = 4; i__ <= i__2; ++i__) {
00359 /* L540: */
00360             rm1[i__ * rm1_dim1 + 1] = 0.;
00361         }
00362 
00363 L550:
00364         i__2 = uk;
00365         for (i__ = 2; i__ <= i__2; ++i__) {
00366             mp = i__ - 1;
00367             w = rm1[mp + i__ * rm1_dim1];
00368             if (i__ < *n) {
00369                 t = rm1[mp + (i__ + 1) * rm1_dim1];
00370             }
00371             if (i__ == *n) {
00372                 t = z__[mp + (s - 1) * z_dim1];
00373             }
00374             x = rm1[mp + mp * rm1_dim1] * rm1[mp + mp * rm1_dim1] + t * t;
00375             if (w * w <= x) {
00376                 goto L580;
00377             }
00378             x = rm1[mp + mp * rm1_dim1] / w;
00379             y = t / w;
00380             rm1[mp + mp * rm1_dim1] = w;
00381             if (i__ < *n) {
00382                 rm1[mp + (i__ + 1) * rm1_dim1] = 0.;
00383             }
00384             if (i__ == *n) {
00385                 z__[mp + (s - 1) * z_dim1] = 0.;
00386             }
00387 
00388             i__3 = uk;
00389             for (j = i__; j <= i__3; ++j) {
00390                 w = rm1[j + i__ * rm1_dim1];
00391                 rm1[j + i__ * rm1_dim1] = rm1[j + mp * rm1_dim1] - x * w;
00392                 rm1[j + mp * rm1_dim1] = w;
00393                 if (j < n1) {
00394                     goto L555;
00395                 }
00396                 l = j - ns;
00397                 z__[i__ + l * z_dim1] = z__[mp + l * z_dim1] - y * w;
00398                 z__[mp + l * z_dim1] = 0.;
00399                 goto L560;
00400 L555:
00401                 rm1[i__ + (j + 2) * rm1_dim1] = rm1[mp + (j + 2) * rm1_dim1] 
00402                         - y * w;
00403                 rm1[mp + (j + 2) * rm1_dim1] = 0.;
00404 L560:
00405                 ;
00406             }
00407 
00408             rm1[i__ + i__ * rm1_dim1] -= y * ilambd;
00409             if (i__ < n1) {
00410                 goto L570;
00411             }
00412             l = i__ - ns;
00413             z__[mp + l * z_dim1] = -ilambd;
00414             z__[i__ + l * z_dim1] += x * ilambd;
00415             goto L640;
00416 L570:
00417             rm1[mp + (i__ + 2) * rm1_dim1] = -ilambd;
00418             rm1[i__ + (i__ + 2) * rm1_dim1] += x * ilambd;
00419             goto L640;
00420 L580:
00421             if (x != 0.) {
00422                 goto L600;
00423             }
00424             rm1[mp + mp * rm1_dim1] = eps3;
00425             if (i__ < *n) {
00426                 rm1[mp + (i__ + 1) * rm1_dim1] = 0.;
00427             }
00428             if (i__ == *n) {
00429                 z__[mp + (s - 1) * z_dim1] = 0.;
00430             }
00431             t = 0.;
00432             x = eps3 * eps3;
00433 L600:
00434             w /= x;
00435             x = rm1[mp + mp * rm1_dim1] * w;
00436             y = -t * w;
00437 
00438             i__3 = uk;
00439             for (j = i__; j <= i__3; ++j) {
00440                 if (j < n1) {
00441                     goto L610;
00442                 }
00443                 l = j - ns;
00444                 t = z__[mp + l * z_dim1];
00445                 z__[i__ + l * z_dim1] = -x * t - y * rm1[j + mp * rm1_dim1];
00446                 goto L615;
00447 L610:
00448                 t = rm1[mp + (j + 2) * rm1_dim1];
00449                 rm1[i__ + (j + 2) * rm1_dim1] = -x * t - y * rm1[j + mp * 
00450                         rm1_dim1];
00451 L615:
00452                 rm1[j + i__ * rm1_dim1] = rm1[j + i__ * rm1_dim1] - x * rm1[j 
00453                         + mp * rm1_dim1] + y * t;
00454 /* L620: */
00455             }
00456 
00457             if (i__ < n1) {
00458                 goto L630;
00459             }
00460             l = i__ - ns;
00461             z__[i__ + l * z_dim1] -= ilambd;
00462             goto L640;
00463 L630:
00464             rm1[i__ + (i__ + 2) * rm1_dim1] -= ilambd;
00465 L640:
00466             ;
00467         }
00468 
00469         if (uk < n1) {
00470             goto L650;
00471         }
00472         l = uk - ns;
00473         t = z__[uk + l * z_dim1];
00474         goto L655;
00475 L650:
00476         t = rm1[uk + (uk + 2) * rm1_dim1];
00477 L655:
00478         if (rm1[uk + uk * rm1_dim1] == 0. && t == 0.) {
00479             rm1[uk + uk * rm1_dim1] = eps3;
00480         }
00481 /*     .......... BACK SUBSTITUTION FOR COMPLEX VECTOR */
00482 /*                FOR I=UK STEP -1 UNTIL 1 DO -- .......... */
00483 L660:
00484         i__2 = uk;
00485         for (ii = 1; ii <= i__2; ++ii) {
00486             i__ = uk + 1 - ii;
00487             x = rv1[i__];
00488             y = 0.;
00489             if (i__ == uk) {
00490                 goto L700;
00491             }
00492             ip1 = i__ + 1;
00493 
00494             i__3 = uk;
00495             for (j = ip1; j <= i__3; ++j) {
00496                 if (j < n1) {
00497                     goto L670;
00498                 }
00499                 l = j - ns;
00500                 t = z__[i__ + l * z_dim1];
00501                 goto L675;
00502 L670:
00503                 t = rm1[i__ + (j + 2) * rm1_dim1];
00504 L675:
00505                 x = x - rm1[j + i__ * rm1_dim1] * rv1[j] + t * rv2[j];
00506                 y = y - rm1[j + i__ * rm1_dim1] * rv2[j] - t * rv1[j];
00507 /* L680: */
00508             }
00509 
00510 L700:
00511             if (i__ < n1) {
00512                 goto L710;
00513             }
00514             l = i__ - ns;
00515             t = z__[i__ + l * z_dim1];
00516             goto L715;
00517 L710:
00518             t = rm1[i__ + (i__ + 2) * rm1_dim1];
00519 L715:
00520             cdiv_(&x, &y, &rm1[i__ + i__ * rm1_dim1], &t, &rv1[i__], &rv2[i__]
00521                     );
00522 /* L720: */
00523         }
00524 /*     .......... ACCEPTANCE TEST FOR REAL OR COMPLEX */
00525 /*                EIGENVECTOR AND NORMALIZATION .......... */
00526 L740:
00527         ++its;
00528         norm = 0.;
00529         normv = 0.;
00530 
00531         i__2 = uk;
00532         for (i__ = 1; i__ <= i__2; ++i__) {
00533             if (ilambd == 0.) {
00534                 x = (d__1 = rv1[i__], abs(d__1));
00535             }
00536             if (ilambd != 0.) {
00537                 x = pythag_(&rv1[i__], &rv2[i__]);
00538             }
00539             if (normv >= x) {
00540                 goto L760;
00541             }
00542             normv = x;
00543             j = i__;
00544 L760:
00545             norm += x;
00546 /* L780: */
00547         }
00548 
00549         if (norm < growto) {
00550             goto L840;
00551         }
00552 /*     .......... ACCEPT VECTOR .......... */
00553         x = rv1[j];
00554         if (ilambd == 0.) {
00555             x = 1. / x;
00556         }
00557         if (ilambd != 0.) {
00558             y = rv2[j];
00559         }
00560 
00561         i__2 = uk;
00562         for (i__ = 1; i__ <= i__2; ++i__) {
00563             if (ilambd != 0.) {
00564                 goto L800;
00565             }
00566             z__[i__ + s * z_dim1] = rv1[i__] * x;
00567             goto L820;
00568 L800:
00569             cdiv_(&rv1[i__], &rv2[i__], &x, &y, &z__[i__ + (s - 1) * z_dim1], 
00570                     &z__[i__ + s * z_dim1]);
00571 L820:
00572             ;
00573         }
00574 
00575         if (uk == *n) {
00576             goto L940;
00577         }
00578         j = uk + 1;
00579         goto L900;
00580 /*     .......... IN-LINE PROCEDURE FOR CHOOSING */
00581 /*                A NEW STARTING VECTOR .......... */
00582 L840:
00583         if (its >= uk) {
00584             goto L880;
00585         }
00586         x = ukroot;
00587         y = eps3 / (x + 1.);
00588         rv1[1] = eps3;
00589 
00590         i__2 = uk;
00591         for (i__ = 2; i__ <= i__2; ++i__) {
00592 /* L860: */
00593             rv1[i__] = y;
00594         }
00595 
00596         j = uk - its + 1;
00597         rv1[j] -= eps3 * x;
00598         if (ilambd == 0.) {
00599             goto L440;
00600         }
00601         goto L660;
00602 /*     .......... SET ERROR -- UNACCEPTED EIGENVECTOR .......... */
00603 L880:
00604         j = 1;
00605         *ierr = -k;
00606 /*     .......... SET REMAINING VECTOR COMPONENTS TO ZERO .......... 
00607 */
00608 L900:
00609         i__2 = *n;
00610         for (i__ = j; i__ <= i__2; ++i__) {
00611             z__[i__ + s * z_dim1] = 0.;
00612             if (ilambd != 0.) {
00613                 z__[i__ + (s - 1) * z_dim1] = 0.;
00614             }
00615 /* L920: */
00616         }
00617 
00618 L940:
00619         ++s;
00620 L960:
00621         if (ip == -1) {
00622             ip = 0;
00623         }
00624         if (ip == 1) {
00625             ip = -1;
00626         }
00627 /* L980: */
00628     }
00629 
00630     goto L1001;
00631 /*     .......... SET ERROR -- UNDERESTIMATE OF EIGENVECTOR */
00632 /*                SPACE REQUIRED .......... */
00633 L1000:
00634     if (*ierr != 0) {
00635         *ierr -= *n;
00636     }
00637     if (*ierr == 0) {
00638         *ierr = -((*n << 1) + 1);
00639     }
00640 L1001:
00641     *m = s - 1 - abs(ip);
00642     return 0;
00643 } /* invit_ */

int minfit_ integer   nm,
integer   m,
integer   n,
doublereal   a,
doublereal   w,
integer   ip,
doublereal   b,
integer   ierr,
doublereal   rv1
 

Definition at line 12 of file eis_minfit.c.

References a, abs, c_b39, d_sign(), i1, l, m1, max, pythag_(), and scale.

00015 {
00016     /* System generated locals */
00017     integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3;
00018     doublereal d__1, d__2, d__3, d__4;
00019 
00020     /* Builtin functions */
00021     double sqrt(doublereal), d_sign(doublereal *, doublereal *);
00022 
00023     /* Local variables */
00024     static doublereal c__, f, g, h__;
00025     static integer i__, j, k, l;
00026     static doublereal s, x, y, z__, scale;
00027     static integer i1, k1, l1, m1, ii, kk, ll;
00028     extern doublereal pythag_(doublereal *, doublereal *);
00029     static integer its;
00030     static doublereal tst1, tst2;
00031 
00032 
00033 
00034 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE MINFIT, */
00035 /*     NUM. MATH. 14, 403-420(1970) BY GOLUB AND REINSCH. */
00036 /*     HANDBOOK FOR AUTO. COMP., VOL II-LINEAR ALGEBRA, 134-151(1971). */
00037 
00038 /*     THIS SUBROUTINE DETERMINES, TOWARDS THE SOLUTION OF THE LINEAR */
00039 /*                                                        T */
00040 /*     SYSTEM AX=B, THE SINGULAR VALUE DECOMPOSITION A=USV  OF A REAL */
00041 /*                                         T */
00042 /*     M BY N RECTANGULAR MATRIX, FORMING U B RATHER THAN U.  HOUSEHOLDER 
00043 */
00044 /*     BIDIAGONALIZATION AND A VARIANT OF THE QR ALGORITHM ARE USED. */
00045 
00046 /*     ON INPUT */
00047 
00048 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00049 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00050 /*          DIMENSION STATEMENT.  NOTE THAT NM MUST BE AT LEAST */
00051 /*          AS LARGE AS THE MAXIMUM OF M AND N. */
00052 
00053 /*        M IS THE NUMBER OF ROWS OF A AND B. */
00054 
00055 /*        N IS THE NUMBER OF COLUMNS OF A AND THE ORDER OF V. */
00056 
00057 /*        A CONTAINS THE RECTANGULAR COEFFICIENT MATRIX OF THE SYSTEM. */
00058 
00059 /*        IP IS THE NUMBER OF COLUMNS OF B.  IP CAN BE ZERO. */
00060 
00061 /*        B CONTAINS THE CONSTANT COLUMN MATRIX OF THE SYSTEM */
00062 /*          IF IP IS NOT ZERO.  OTHERWISE B IS NOT REFERENCED. */
00063 
00064 /*     ON OUTPUT */
00065 
00066 /*        A HAS BEEN OVERWRITTEN BY THE MATRIX V (ORTHOGONAL) OF THE */
00067 /*          DECOMPOSITION IN ITS FIRST N ROWS AND COLUMNS.  IF AN */
00068 /*          ERROR EXIT IS MADE, THE COLUMNS OF V CORRESPONDING TO */
00069 /*          INDICES OF CORRECT SINGULAR VALUES SHOULD BE CORRECT. */
00070 
00071 /*        W CONTAINS THE N (NON-NEGATIVE) SINGULAR VALUES OF A (THE */
00072 /*          DIAGONAL ELEMENTS OF S).  THEY ARE UNORDERED.  IF AN */
00073 /*          ERROR EXIT IS MADE, THE SINGULAR VALUES SHOULD BE CORRECT */
00074 /*          FOR INDICES IERR+1,IERR+2,...,N. */
00075 
00076 /*                                   T */
00077 /*        B HAS BEEN OVERWRITTEN BY U B.  IF AN ERROR EXIT IS MADE, */
00078 /*                       T */
00079 /*          THE ROWS OF U B CORRESPONDING TO INDICES OF CORRECT */
00080 /*          SINGULAR VALUES SHOULD BE CORRECT. */
00081 
00082 /*        IERR IS SET TO */
00083 /*          ZERO       FOR NORMAL RETURN, */
00084 /*          K          IF THE K-TH SINGULAR VALUE HAS NOT BEEN */
00085 /*                     DETERMINED AFTER 30 ITERATIONS. */
00086 
00087 /*        RV1 IS A TEMPORARY STORAGE ARRAY. */
00088 
00089 /*     CALLS PYTHAG FOR  DSQRT(A*A + B*B) . */
00090 
00091 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00092 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00093 */
00094 
00095 /*     THIS VERSION DATED AUGUST 1983. */
00096 
00097 /*     ------------------------------------------------------------------ 
00098 */
00099 
00100     /* Parameter adjustments */
00101     --rv1;
00102     --w;
00103     a_dim1 = *nm;
00104     a_offset = a_dim1 + 1;
00105     a -= a_offset;
00106     b_dim1 = *nm;
00107     b_offset = b_dim1 + 1;
00108     b -= b_offset;
00109 
00110     /* Function Body */
00111     *ierr = 0;
00112 /*     .......... HOUSEHOLDER REDUCTION TO BIDIAGONAL FORM .......... */
00113     g = 0.;
00114     scale = 0.;
00115     x = 0.;
00116 
00117     i__1 = *n;
00118     for (i__ = 1; i__ <= i__1; ++i__) {
00119         l = i__ + 1;
00120         rv1[i__] = scale * g;
00121         g = 0.;
00122         s = 0.;
00123         scale = 0.;
00124         if (i__ > *m) {
00125             goto L210;
00126         }
00127 
00128         i__2 = *m;
00129         for (k = i__; k <= i__2; ++k) {
00130 /* L120: */
00131             scale += (d__1 = a[k + i__ * a_dim1], abs(d__1));
00132         }
00133 
00134         if (scale == 0.) {
00135             goto L210;
00136         }
00137 
00138         i__2 = *m;
00139         for (k = i__; k <= i__2; ++k) {
00140             a[k + i__ * a_dim1] /= scale;
00141 /* Computing 2nd power */
00142             d__1 = a[k + i__ * a_dim1];
00143             s += d__1 * d__1;
00144 /* L130: */
00145         }
00146 
00147         f = a[i__ + i__ * a_dim1];
00148         d__1 = sqrt(s);
00149         g = -d_sign(&d__1, &f);
00150         h__ = f * g - s;
00151         a[i__ + i__ * a_dim1] = f - g;
00152         if (i__ == *n) {
00153             goto L160;
00154         }
00155 
00156         i__2 = *n;
00157         for (j = l; j <= i__2; ++j) {
00158             s = 0.;
00159 
00160             i__3 = *m;
00161             for (k = i__; k <= i__3; ++k) {
00162 /* L140: */
00163                 s += a[k + i__ * a_dim1] * a[k + j * a_dim1];
00164             }
00165 
00166             f = s / h__;
00167 
00168             i__3 = *m;
00169             for (k = i__; k <= i__3; ++k) {
00170                 a[k + j * a_dim1] += f * a[k + i__ * a_dim1];
00171 /* L150: */
00172             }
00173         }
00174 
00175 L160:
00176         if (*ip == 0) {
00177             goto L190;
00178         }
00179 
00180         i__3 = *ip;
00181         for (j = 1; j <= i__3; ++j) {
00182             s = 0.;
00183 
00184             i__2 = *m;
00185             for (k = i__; k <= i__2; ++k) {
00186 /* L170: */
00187                 s += a[k + i__ * a_dim1] * b[k + j * b_dim1];
00188             }
00189 
00190             f = s / h__;
00191 
00192             i__2 = *m;
00193             for (k = i__; k <= i__2; ++k) {
00194                 b[k + j * b_dim1] += f * a[k + i__ * a_dim1];
00195 /* L180: */
00196             }
00197         }
00198 
00199 L190:
00200         i__2 = *m;
00201         for (k = i__; k <= i__2; ++k) {
00202 /* L200: */
00203             a[k + i__ * a_dim1] = scale * a[k + i__ * a_dim1];
00204         }
00205 
00206 L210:
00207         w[i__] = scale * g;
00208         g = 0.;
00209         s = 0.;
00210         scale = 0.;
00211         if (i__ > *m || i__ == *n) {
00212             goto L290;
00213         }
00214 
00215         i__2 = *n;
00216         for (k = l; k <= i__2; ++k) {
00217 /* L220: */
00218             scale += (d__1 = a[i__ + k * a_dim1], abs(d__1));
00219         }
00220 
00221         if (scale == 0.) {
00222             goto L290;
00223         }
00224 
00225         i__2 = *n;
00226         for (k = l; k <= i__2; ++k) {
00227             a[i__ + k * a_dim1] /= scale;
00228 /* Computing 2nd power */
00229             d__1 = a[i__ + k * a_dim1];
00230             s += d__1 * d__1;
00231 /* L230: */
00232         }
00233 
00234         f = a[i__ + l * a_dim1];
00235         d__1 = sqrt(s);
00236         g = -d_sign(&d__1, &f);
00237         h__ = f * g - s;
00238         a[i__ + l * a_dim1] = f - g;
00239 
00240         i__2 = *n;
00241         for (k = l; k <= i__2; ++k) {
00242 /* L240: */
00243             rv1[k] = a[i__ + k * a_dim1] / h__;
00244         }
00245 
00246         if (i__ == *m) {
00247             goto L270;
00248         }
00249 
00250         i__2 = *m;
00251         for (j = l; j <= i__2; ++j) {
00252             s = 0.;
00253 
00254             i__3 = *n;
00255             for (k = l; k <= i__3; ++k) {
00256 /* L250: */
00257                 s += a[j + k * a_dim1] * a[i__ + k * a_dim1];
00258             }
00259 
00260             i__3 = *n;
00261             for (k = l; k <= i__3; ++k) {
00262                 a[j + k * a_dim1] += s * rv1[k];
00263 /* L260: */
00264             }
00265         }
00266 
00267 L270:
00268         i__3 = *n;
00269         for (k = l; k <= i__3; ++k) {
00270 /* L280: */
00271             a[i__ + k * a_dim1] = scale * a[i__ + k * a_dim1];
00272         }
00273 
00274 L290:
00275 /* Computing MAX */
00276         d__3 = x, d__4 = (d__1 = w[i__], abs(d__1)) + (d__2 = rv1[i__], abs(
00277                 d__2));
00278         x = max(d__3,d__4);
00279 /* L300: */
00280     }
00281 /*     .......... ACCUMULATION OF RIGHT-HAND TRANSFORMATIONS. */
00282 /*                FOR I=N STEP -1 UNTIL 1 DO -- .......... */
00283     i__1 = *n;
00284     for (ii = 1; ii <= i__1; ++ii) {
00285         i__ = *n + 1 - ii;
00286         if (i__ == *n) {
00287             goto L390;
00288         }
00289         if (g == 0.) {
00290             goto L360;
00291         }
00292 
00293         i__3 = *n;
00294         for (j = l; j <= i__3; ++j) {
00295 /*     .......... DOUBLE DIVISION AVOIDS POSSIBLE UNDERFLOW ......
00296 .... */
00297 /* L320: */
00298             a[j + i__ * a_dim1] = a[i__ + j * a_dim1] / a[i__ + l * a_dim1] / 
00299                     g;
00300         }
00301 
00302         i__3 = *n;
00303         for (j = l; j <= i__3; ++j) {
00304             s = 0.;
00305 
00306             i__2 = *n;
00307             for (k = l; k <= i__2; ++k) {
00308 /* L340: */
00309                 s += a[i__ + k * a_dim1] * a[k + j * a_dim1];
00310             }
00311 
00312             i__2 = *n;
00313             for (k = l; k <= i__2; ++k) {
00314                 a[k + j * a_dim1] += s * a[k + i__ * a_dim1];
00315 /* L350: */
00316             }
00317         }
00318 
00319 L360:
00320         i__2 = *n;
00321         for (j = l; j <= i__2; ++j) {
00322             a[i__ + j * a_dim1] = 0.;
00323             a[j + i__ * a_dim1] = 0.;
00324 /* L380: */
00325         }
00326 
00327 L390:
00328         a[i__ + i__ * a_dim1] = 1.;
00329         g = rv1[i__];
00330         l = i__;
00331 /* L400: */
00332     }
00333 
00334     if (*m >= *n || *ip == 0) {
00335         goto L510;
00336     }
00337     m1 = *m + 1;
00338 
00339     i__1 = *n;
00340     for (i__ = m1; i__ <= i__1; ++i__) {
00341 
00342         i__2 = *ip;
00343         for (j = 1; j <= i__2; ++j) {
00344             b[i__ + j * b_dim1] = 0.;
00345 /* L500: */
00346         }
00347     }
00348 /*     .......... DIAGONALIZATION OF THE BIDIAGONAL FORM .......... */
00349 L510:
00350     tst1 = x;
00351 /*     .......... FOR K=N STEP -1 UNTIL 1 DO -- .......... */
00352     i__2 = *n;
00353     for (kk = 1; kk <= i__2; ++kk) {
00354         k1 = *n - kk;
00355         k = k1 + 1;
00356         its = 0;
00357 /*     .......... TEST FOR SPLITTING. */
00358 /*                FOR L=K STEP -1 UNTIL 1 DO -- .......... */
00359 L520:
00360         i__1 = k;
00361         for (ll = 1; ll <= i__1; ++ll) {
00362             l1 = k - ll;
00363             l = l1 + 1;
00364             tst2 = tst1 + (d__1 = rv1[l], abs(d__1));
00365             if (tst2 == tst1) {
00366                 goto L565;
00367             }
00368 /*     .......... RV1(1) IS ALWAYS ZERO, SO THERE IS NO EXIT */
00369 /*                THROUGH THE BOTTOM OF THE LOOP .......... */
00370             tst2 = tst1 + (d__1 = w[l1], abs(d__1));
00371             if (tst2 == tst1) {
00372                 goto L540;
00373             }
00374 /* L530: */
00375         }
00376 /*     .......... CANCELLATION OF RV1(L) IF L GREATER THAN 1 .........
00377 . */
00378 L540:
00379         c__ = 0.;
00380         s = 1.;
00381 
00382         i__1 = k;
00383         for (i__ = l; i__ <= i__1; ++i__) {
00384             f = s * rv1[i__];
00385             rv1[i__] = c__ * rv1[i__];
00386             tst2 = tst1 + abs(f);
00387             if (tst2 == tst1) {
00388                 goto L565;
00389             }
00390             g = w[i__];
00391             h__ = pythag_(&f, &g);
00392             w[i__] = h__;
00393             c__ = g / h__;
00394             s = -f / h__;
00395             if (*ip == 0) {
00396                 goto L560;
00397             }
00398 
00399             i__3 = *ip;
00400             for (j = 1; j <= i__3; ++j) {
00401                 y = b[l1 + j * b_dim1];
00402                 z__ = b[i__ + j * b_dim1];
00403                 b[l1 + j * b_dim1] = y * c__ + z__ * s;
00404                 b[i__ + j * b_dim1] = -y * s + z__ * c__;
00405 /* L550: */
00406             }
00407 
00408 L560:
00409             ;
00410         }
00411 /*     .......... TEST FOR CONVERGENCE .......... */
00412 L565:
00413         z__ = w[k];
00414         if (l == k) {
00415             goto L650;
00416         }
00417 /*     .......... SHIFT FROM BOTTOM 2 BY 2 MINOR .......... */
00418         if (its == 30) {
00419             goto L1000;
00420         }
00421         ++its;
00422         x = w[l];
00423         y = w[k1];
00424         g = rv1[k1];
00425         h__ = rv1[k];
00426         f = ((g + z__) / h__ * ((g - z__) / y) + y / h__ - h__ / y) * .5;
00427         g = pythag_(&f, &c_b39);
00428         f = x - z__ / x * z__ + h__ / x * (y / (f + d_sign(&g, &f)) - h__);
00429 /*     .......... NEXT QR TRANSFORMATION .......... */
00430         c__ = 1.;
00431         s = 1.;
00432 
00433         i__1 = k1;
00434         for (i1 = l; i1 <= i__1; ++i1) {
00435             i__ = i1 + 1;
00436             g = rv1[i__];
00437             y = w[i__];
00438             h__ = s * g;
00439             g = c__ * g;
00440             z__ = pythag_(&f, &h__);
00441             rv1[i1] = z__;
00442             c__ = f / z__;
00443             s = h__ / z__;
00444             f = x * c__ + g * s;
00445             g = -x * s + g * c__;
00446             h__ = y * s;
00447             y *= c__;
00448 
00449             i__3 = *n;
00450             for (j = 1; j <= i__3; ++j) {
00451                 x = a[j + i1 * a_dim1];
00452                 z__ = a[j + i__ * a_dim1];
00453                 a[j + i1 * a_dim1] = x * c__ + z__ * s;
00454                 a[j + i__ * a_dim1] = -x * s + z__ * c__;
00455 /* L570: */
00456             }
00457 
00458             z__ = pythag_(&f, &h__);
00459             w[i1] = z__;
00460 /*     .......... ROTATION CAN BE ARBITRARY IF Z IS ZERO .........
00461 . */
00462             if (z__ == 0.) {
00463                 goto L580;
00464             }
00465             c__ = f / z__;
00466             s = h__ / z__;
00467 L580:
00468             f = c__ * g + s * y;
00469             x = -s * g + c__ * y;
00470             if (*ip == 0) {
00471                 goto L600;
00472             }
00473 
00474             i__3 = *ip;
00475             for (j = 1; j <= i__3; ++j) {
00476                 y = b[i1 + j * b_dim1];
00477                 z__ = b[i__ + j * b_dim1];
00478                 b[i1 + j * b_dim1] = y * c__ + z__ * s;
00479                 b[i__ + j * b_dim1] = -y * s + z__ * c__;
00480 /* L590: */
00481             }
00482 
00483 L600:
00484             ;
00485         }
00486 
00487         rv1[l] = 0.;
00488         rv1[k] = f;
00489         w[k] = x;
00490         goto L520;
00491 /*     .......... CONVERGENCE .......... */
00492 L650:
00493         if (z__ >= 0.) {
00494             goto L700;
00495         }
00496 /*     .......... W(K) IS MADE NON-NEGATIVE .......... */
00497         w[k] = -z__;
00498 
00499         i__1 = *n;
00500         for (j = 1; j <= i__1; ++j) {
00501 /* L690: */
00502             a[j + k * a_dim1] = -a[j + k * a_dim1];
00503         }
00504 
00505 L700:
00506         ;
00507     }
00508 
00509     goto L1001;
00510 /*     .......... SET ERROR -- NO CONVERGENCE TO A */
00511 /*                SINGULAR VALUE AFTER 30 ITERATIONS .......... */
00512 L1000:
00513     *ierr = k;
00514 L1001:
00515     return 0;
00516 } /* minfit_ */

int ortbak_ integer   nm,
integer   low,
integer   igh,
doublereal   a,
doublereal   ort,
integer   m,
doublereal   z__
 

Definition at line 8 of file eis_ortbak.c.

References a, and mp.

00010 {
00011     /* System generated locals */
00012     integer a_dim1, a_offset, z_dim1, z_offset, i__1, i__2, i__3;
00013 
00014     /* Local variables */
00015     static doublereal g;
00016     static integer i__, j, la, mm, mp, kp1, mp1;
00017 
00018 
00019 
00020 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE ORTBAK, */
00021 /*     NUM. MATH. 12, 349-368(1968) BY MARTIN AND WILKINSON. */
00022 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 339-358(1971). */
00023 
00024 /*     THIS SUBROUTINE FORMS THE EIGENVECTORS OF A REAL GENERAL */
00025 /*     MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDING */
00026 /*     UPPER HESSENBERG MATRIX DETERMINED BY  ORTHES. */
00027 
00028 /*     ON INPUT */
00029 
00030 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00031 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00032 /*          DIMENSION STATEMENT. */
00033 
00034 /*        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING */
00035 /*          SUBROUTINE  BALANC.  IF  BALANC  HAS NOT BEEN USED, */
00036 /*          SET LOW=1 AND IGH EQUAL TO THE ORDER OF THE MATRIX. */
00037 
00038 /*        A CONTAINS INFORMATION ABOUT THE ORTHOGONAL TRANS- */
00039 /*          FORMATIONS USED IN THE REDUCTION BY  ORTHES */
00040 /*          IN ITS STRICT LOWER TRIANGLE. */
00041 
00042 /*        ORT CONTAINS FURTHER INFORMATION ABOUT THE TRANS- */
00043 /*          FORMATIONS USED IN THE REDUCTION BY  ORTHES. */
00044 /*          ONLY ELEMENTS LOW THROUGH IGH ARE USED. */
00045 
00046 /*        M IS THE NUMBER OF COLUMNS OF Z TO BE BACK TRANSFORMED. */
00047 
00048 /*        Z CONTAINS THE REAL AND IMAGINARY PARTS OF THE EIGEN- */
00049 /*          VECTORS TO BE BACK TRANSFORMED IN ITS FIRST M COLUMNS. */
00050 
00051 /*     ON OUTPUT */
00052 
00053 /*        Z CONTAINS THE REAL AND IMAGINARY PARTS OF THE */
00054 /*          TRANSFORMED EIGENVECTORS IN ITS FIRST M COLUMNS. */
00055 
00056 /*        ORT HAS BEEN ALTERED. */
00057 
00058 /*     NOTE THAT ORTBAK PRESERVES VECTOR EUCLIDEAN NORMS. */
00059 
00060 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00061 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00062 */
00063 
00064 /*     THIS VERSION DATED AUGUST 1983. */
00065 
00066 /*     ------------------------------------------------------------------ 
00067 */
00068 
00069     /* Parameter adjustments */
00070     --ort;
00071     a_dim1 = *nm;
00072     a_offset = a_dim1 + 1;
00073     a -= a_offset;
00074     z_dim1 = *nm;
00075     z_offset = z_dim1 + 1;
00076     z__ -= z_offset;
00077 
00078     /* Function Body */
00079     if (*m == 0) {
00080         goto L200;
00081     }
00082     la = *igh - 1;
00083     kp1 = *low + 1;
00084     if (la < kp1) {
00085         goto L200;
00086     }
00087 /*     .......... FOR MP=IGH-1 STEP -1 UNTIL LOW+1 DO -- .......... */
00088     i__1 = la;
00089     for (mm = kp1; mm <= i__1; ++mm) {
00090         mp = *low + *igh - mm;
00091         if (a[mp + (mp - 1) * a_dim1] == 0.) {
00092             goto L140;
00093         }
00094         mp1 = mp + 1;
00095 
00096         i__2 = *igh;
00097         for (i__ = mp1; i__ <= i__2; ++i__) {
00098 /* L100: */
00099             ort[i__] = a[i__ + (mp - 1) * a_dim1];
00100         }
00101 
00102         i__2 = *m;
00103         for (j = 1; j <= i__2; ++j) {
00104             g = 0.;
00105 
00106             i__3 = *igh;
00107             for (i__ = mp; i__ <= i__3; ++i__) {
00108 /* L110: */
00109                 g += ort[i__] * z__[i__ + j * z_dim1];
00110             }
00111 /*     .......... DIVISOR BELOW IS NEGATIVE OF H FORMED IN ORTHES.
00112  */
00113 /*                DOUBLE DIVISION AVOIDS POSSIBLE UNDERFLOW ......
00114 .... */
00115             g = g / ort[mp] / a[mp + (mp - 1) * a_dim1];
00116 
00117             i__3 = *igh;
00118             for (i__ = mp; i__ <= i__3; ++i__) {
00119 /* L120: */
00120                 z__[i__ + j * z_dim1] += g * ort[i__];
00121             }
00122 
00123 /* L130: */
00124         }
00125 
00126 L140:
00127         ;
00128     }
00129 
00130 L200:
00131     return 0;
00132 } /* ortbak_ */

int orthes_ integer   nm,
integer   n,
integer   low,
integer   igh,
doublereal   a,
doublereal   ort
 

Definition at line 8 of file eis_orthes.c.

References a, abs, d_sign(), mp, and scale.

00010 {
00011     /* System generated locals */
00012     integer a_dim1, a_offset, i__1, i__2, i__3;
00013     doublereal d__1;
00014 
00015     /* Builtin functions */
00016     double sqrt(doublereal), d_sign(doublereal *, doublereal *);
00017 
00018     /* Local variables */
00019     static doublereal f, g, h__;
00020     static integer i__, j, m;
00021     static doublereal scale;
00022     static integer la, ii, jj, mp, kp1;
00023 
00024 
00025 
00026 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE ORTHES, */
00027 /*     NUM. MATH. 12, 349-368(1968) BY MARTIN AND WILKINSON. */
00028 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 339-358(1971). */
00029 
00030 /*     GIVEN A REAL GENERAL MATRIX, THIS SUBROUTINE */
00031 /*     REDUCES A SUBMATRIX SITUATED IN ROWS AND COLUMNS */
00032 /*     LOW THROUGH IGH TO UPPER HESSENBERG FORM BY */
00033 /*     ORTHOGONAL SIMILARITY TRANSFORMATIONS. */
00034 
00035 /*     ON INPUT */
00036 
00037 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00038 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00039 /*          DIMENSION STATEMENT. */
00040 
00041 /*        N IS THE ORDER OF THE MATRIX. */
00042 
00043 /*        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING */
00044 /*          SUBROUTINE  BALANC.  IF  BALANC  HAS NOT BEEN USED, */
00045 /*          SET LOW=1, IGH=N. */
00046 
00047 /*        A CONTAINS THE INPUT MATRIX. */
00048 
00049 /*     ON OUTPUT */
00050 
00051 /*        A CONTAINS THE HESSENBERG MATRIX.  INFORMATION ABOUT */
00052 /*          THE ORTHOGONAL TRANSFORMATIONS USED IN THE REDUCTION */
00053 /*          IS STORED IN THE REMAINING TRIANGLE UNDER THE */
00054 /*          HESSENBERG MATRIX. */
00055 
00056 /*        ORT CONTAINS FURTHER INFORMATION ABOUT THE TRANSFORMATIONS. */
00057 /*          ONLY ELEMENTS LOW THROUGH IGH ARE USED. */
00058 
00059 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00060 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00061 */
00062 
00063 /*     THIS VERSION DATED AUGUST 1983. */
00064 
00065 /*     ------------------------------------------------------------------ 
00066 */
00067 
00068     /* Parameter adjustments */
00069     a_dim1 = *nm;
00070     a_offset = a_dim1 + 1;
00071     a -= a_offset;
00072     --ort;
00073 
00074     /* Function Body */
00075     la = *igh - 1;
00076     kp1 = *low + 1;
00077     if (la < kp1) {
00078         goto L200;
00079     }
00080 
00081     i__1 = la;
00082     for (m = kp1; m <= i__1; ++m) {
00083         h__ = 0.;
00084         ort[m] = 0.;
00085         scale = 0.;
00086 /*     .......... SCALE COLUMN (ALGOL TOL THEN NOT NEEDED) .......... 
00087 */
00088         i__2 = *igh;
00089         for (i__ = m; i__ <= i__2; ++i__) {
00090 /* L90: */
00091             scale += (d__1 = a[i__ + (m - 1) * a_dim1], abs(d__1));
00092         }
00093 
00094         if (scale == 0.) {
00095             goto L180;
00096         }
00097         mp = m + *igh;
00098 /*     .......... FOR I=IGH STEP -1 UNTIL M DO -- .......... */
00099         i__2 = *igh;
00100         for (ii = m; ii <= i__2; ++ii) {
00101             i__ = mp - ii;
00102             ort[i__] = a[i__ + (m - 1) * a_dim1] / scale;
00103             h__ += ort[i__] * ort[i__];
00104 /* L100: */
00105         }
00106 
00107         d__1 = sqrt(h__);
00108         g = -d_sign(&d__1, &ort[m]);
00109         h__ -= ort[m] * g;
00110         ort[m] -= g;
00111 /*     .......... FORM (I-(U*UT)/H) * A .......... */
00112         i__2 = *n;
00113         for (j = m; j <= i__2; ++j) {
00114             f = 0.;
00115 /*     .......... FOR I=IGH STEP -1 UNTIL M DO -- .......... */
00116             i__3 = *igh;
00117             for (ii = m; ii <= i__3; ++ii) {
00118                 i__ = mp - ii;
00119                 f += ort[i__] * a[i__ + j * a_dim1];
00120 /* L110: */
00121             }
00122 
00123             f /= h__;
00124 
00125             i__3 = *igh;
00126             for (i__ = m; i__ <= i__3; ++i__) {
00127 /* L120: */
00128                 a[i__ + j * a_dim1] -= f * ort[i__];
00129             }
00130 
00131 /* L130: */
00132         }
00133 /*     .......... FORM (I-(U*UT)/H)*A*(I-(U*UT)/H) .......... */
00134         i__2 = *igh;
00135         for (i__ = 1; i__ <= i__2; ++i__) {
00136             f = 0.;
00137 /*     .......... FOR J=IGH STEP -1 UNTIL M DO -- .......... */
00138             i__3 = *igh;
00139             for (jj = m; jj <= i__3; ++jj) {
00140                 j = mp - jj;
00141                 f += ort[j] * a[i__ + j * a_dim1];
00142 /* L140: */
00143             }
00144 
00145             f /= h__;
00146 
00147             i__3 = *igh;
00148             for (j = m; j <= i__3; ++j) {
00149 /* L150: */
00150                 a[i__ + j * a_dim1] -= f * ort[j];
00151             }
00152 
00153 /* L160: */
00154         }
00155 
00156         ort[m] = scale * ort[m];
00157         a[m + (m - 1) * a_dim1] = scale * g;
00158 L180:
00159         ;
00160     }
00161 
00162 L200:
00163     return 0;
00164 } /* orthes_ */

int ortran_ integer   nm,
integer   n,
integer   low,
integer   igh,
doublereal   a,
doublereal   ort,
doublereal   z__
 

Definition at line 8 of file eis_ortran.c.

References a, and mp.

00010 {
00011     /* System generated locals */
00012     integer a_dim1, a_offset, z_dim1, z_offset, i__1, i__2, i__3;
00013 
00014     /* Local variables */
00015     static doublereal g;
00016     static integer i__, j, kl, mm, mp, mp1;
00017 
00018 
00019 
00020 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE ORTRANS, */
00021 /*     NUM. MATH. 16, 181-204(1970) BY PETERS AND WILKINSON. */
00022 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 372-395(1971). */
00023 
00024 /*     THIS SUBROUTINE ACCUMULATES THE ORTHOGONAL SIMILARITY */
00025 /*     TRANSFORMATIONS USED IN THE REDUCTION OF A REAL GENERAL */
00026 /*     MATRIX TO UPPER HESSENBERG FORM BY  ORTHES. */
00027 
00028 /*     ON INPUT */
00029 
00030 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00031 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00032 /*          DIMENSION STATEMENT. */
00033 
00034 /*        N IS THE ORDER OF THE MATRIX. */
00035 
00036 /*        LOW AND IGH ARE INTEGERS DETERMINED BY THE BALANCING */
00037 /*          SUBROUTINE  BALANC.  IF  BALANC  HAS NOT BEEN USED, */
00038 /*          SET LOW=1, IGH=N. */
00039 
00040 /*        A CONTAINS INFORMATION ABOUT THE ORTHOGONAL TRANS- */
00041 /*          FORMATIONS USED IN THE REDUCTION BY  ORTHES */
00042 /*          IN ITS STRICT LOWER TRIANGLE. */
00043 
00044 /*        ORT CONTAINS FURTHER INFORMATION ABOUT THE TRANS- */
00045 /*          FORMATIONS USED IN THE REDUCTION BY  ORTHES. */
00046 /*          ONLY ELEMENTS LOW THROUGH IGH ARE USED. */
00047 
00048 /*     ON OUTPUT */
00049 
00050 /*        Z CONTAINS THE TRANSFORMATION MATRIX PRODUCED IN THE */
00051 /*          REDUCTION BY  ORTHES. */
00052 
00053 /*        ORT HAS BEEN ALTERED. */
00054 
00055 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00056 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00057 */
00058 
00059 /*     THIS VERSION DATED AUGUST 1983. */
00060 
00061 /*     ------------------------------------------------------------------ 
00062 */
00063 
00064 /*     .......... INITIALIZE Z TO IDENTITY MATRIX .......... */
00065     /* Parameter adjustments */
00066     z_dim1 = *nm;
00067     z_offset = z_dim1 + 1;
00068     z__ -= z_offset;
00069     --ort;
00070     a_dim1 = *nm;
00071     a_offset = a_dim1 + 1;
00072     a -= a_offset;
00073 
00074     /* Function Body */
00075     i__1 = *n;
00076     for (j = 1; j <= i__1; ++j) {
00077 
00078         i__2 = *n;
00079         for (i__ = 1; i__ <= i__2; ++i__) {
00080 /* L60: */
00081             z__[i__ + j * z_dim1] = 0.;
00082         }
00083 
00084         z__[j + j * z_dim1] = 1.;
00085 /* L80: */
00086     }
00087 
00088     kl = *igh - *low - 1;
00089     if (kl < 1) {
00090         goto L200;
00091     }
00092 /*     .......... FOR MP=IGH-1 STEP -1 UNTIL LOW+1 DO -- .......... */
00093     i__1 = kl;
00094     for (mm = 1; mm <= i__1; ++mm) {
00095         mp = *igh - mm;
00096         if (a[mp + (mp - 1) * a_dim1] == 0.) {
00097             goto L140;
00098         }
00099         mp1 = mp + 1;
00100 
00101         i__2 = *igh;
00102         for (i__ = mp1; i__ <= i__2; ++i__) {
00103 /* L100: */
00104             ort[i__] = a[i__ + (mp - 1) * a_dim1];
00105         }
00106 
00107         i__2 = *igh;
00108         for (j = mp; j <= i__2; ++j) {
00109             g = 0.;
00110 
00111             i__3 = *igh;
00112             for (i__ = mp; i__ <= i__3; ++i__) {
00113 /* L110: */
00114                 g += ort[i__] * z__[i__ + j * z_dim1];
00115             }
00116 /*     .......... DIVISOR BELOW IS NEGATIVE OF H FORMED IN ORTHES.
00117  */
00118 /*                DOUBLE DIVISION AVOIDS POSSIBLE UNDERFLOW ......
00119 .... */
00120             g = g / ort[mp] / a[mp + (mp - 1) * a_dim1];
00121 
00122             i__3 = *igh;
00123             for (i__ = mp; i__ <= i__3; ++i__) {
00124 /* L120: */
00125                 z__[i__ + j * z_dim1] += g * ort[i__];
00126             }
00127 
00128 /* L130: */
00129         }
00130 
00131 L140:
00132         ;
00133     }
00134 
00135 L200:
00136     return 0;
00137 } /* ortran_ */

doublereal pythag_ doublereal   a,
doublereal   b
 

Definition at line 8 of file eis_pythag.c.

References a, abs, max, min, and p.

Referenced by bandv_(), bqr_(), cinvit_(), comqr2_(), comqr_(), corth_(), csroot_(), htrid3_(), htridi_(), imtql1_(), imtql2_(), imtqlv_(), invit_(), minfit_(), svd_(), tinvit_(), tql1_(), tql2_(), tqlrat_(), and tsturm_().

00009 {
00010     /* System generated locals */
00011     doublereal ret_val, d__1, d__2, d__3;
00012 
00013     /* Local variables */
00014     static doublereal p, r__, s, t, u;
00015 
00016 
00017 /*     FINDS DSQRT(A**2+B**2) WITHOUT OVERFLOW OR DESTRUCTIVE UNDERFLOW */
00018 
00019 /* Computing MAX */
00020     d__1 = abs(*a), d__2 = abs(*b);
00021     p = max(d__1,d__2);
00022     if (p == 0.) {
00023         goto L20;
00024     }
00025 /* Computing MIN */
00026     d__2 = abs(*a), d__3 = abs(*b);
00027 /* Computing 2nd power */
00028     d__1 = min(d__2,d__3) / p;
00029     r__ = d__1 * d__1;
00030 L10:
00031     t = r__ + 4.;
00032     if (t == 4.) {
00033         goto L20;
00034     }
00035     s = r__ / t;
00036     u = s * 2. + 1.;
00037     p = u * p;
00038 /* Computing 2nd power */
00039     d__1 = s / u;
00040     r__ = d__1 * d__1 * r__;
00041     goto L10;
00042 L20:
00043     ret_val = p;
00044     return ret_val;
00045 } /* pythag_ */

int qzhes_ integer   nm,
integer   n,
doublereal   a,
doublereal   b,
logical   matz,
doublereal   z__
 

Definition at line 8 of file eis_qzhes.c.

References a, abs, d_sign(), l, and v1.

Referenced by rgg_().

00010 {
00011     /* System generated locals */
00012     integer a_dim1, a_offset, b_dim1, b_offset, z_dim1, z_offset, i__1, i__2, 
00013             i__3;
00014     doublereal d__1, d__2;
00015 
00016     /* Builtin functions */
00017     double sqrt(doublereal), d_sign(doublereal *, doublereal *);
00018 
00019     /* Local variables */
00020     static integer i__, j, k, l;
00021     static doublereal r__, s, t;
00022     static integer l1;
00023     static doublereal u1, u2, v1, v2;
00024     static integer lb, nk1, nm1, nm2;
00025     static doublereal rho;
00026 
00027 
00028 
00029 /*     THIS SUBROUTINE IS THE FIRST STEP OF THE QZ ALGORITHM */
00030 /*     FOR SOLVING GENERALIZED MATRIX EIGENVALUE PROBLEMS, */
00031 /*     SIAM J. NUMER. ANAL. 10, 241-256(1973) BY MOLER AND STEWART. */
00032 
00033 /*     THIS SUBROUTINE ACCEPTS A PAIR OF REAL GENERAL MATRICES AND */
00034 /*     REDUCES ONE OF THEM TO UPPER HESSENBERG FORM AND THE OTHER */
00035 /*     TO UPPER TRIANGULAR FORM USING ORTHOGONAL TRANSFORMATIONS. */
00036 /*     IT IS USUALLY FOLLOWED BY  QZIT,  QZVAL  AND, POSSIBLY,  QZVEC. */
00037 
00038 /*     ON INPUT */
00039 
00040 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00041 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00042 /*          DIMENSION STATEMENT. */
00043 
00044 /*        N IS THE ORDER OF THE MATRICES. */
00045 
00046 /*        A CONTAINS A REAL GENERAL MATRIX. */
00047 
00048 /*        B CONTAINS A REAL GENERAL MATRIX. */
00049 
00050 /*        MATZ SHOULD BE SET TO .TRUE. IF THE RIGHT HAND TRANSFORMATIONS 
00051 */
00052 /*          ARE TO BE ACCUMULATED FOR LATER USE IN COMPUTING */
00053 /*          EIGENVECTORS, AND TO .FALSE. OTHERWISE. */
00054 
00055 /*     ON OUTPUT */
00056 
00057 /*        A HAS BEEN REDUCED TO UPPER HESSENBERG FORM.  THE ELEMENTS */
00058 /*          BELOW THE FIRST SUBDIAGONAL HAVE BEEN SET TO ZERO. */
00059 
00060 /*        B HAS BEEN REDUCED TO UPPER TRIANGULAR FORM.  THE ELEMENTS */
00061 /*          BELOW THE MAIN DIAGONAL HAVE BEEN SET TO ZERO. */
00062 
00063 /*        Z CONTAINS THE PRODUCT OF THE RIGHT HAND TRANSFORMATIONS IF */
00064 /*          MATZ HAS BEEN SET TO .TRUE.  OTHERWISE, Z IS NOT REFERENCED. 
00065 */
00066 
00067 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00068 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00069 */
00070 
00071 /*     THIS VERSION DATED AUGUST 1983. */
00072 
00073 /*     ------------------------------------------------------------------ 
00074 */
00075 
00076 /*     .......... INITIALIZE Z .......... */
00077     /* Parameter adjustments */
00078     z_dim1 = *nm;
00079     z_offset = z_dim1 + 1;
00080     z__ -= z_offset;
00081     b_dim1 = *nm;
00082     b_offset = b_dim1 + 1;
00083     b -= b_offset;
00084     a_dim1 = *nm;
00085     a_offset = a_dim1 + 1;
00086     a -= a_offset;
00087 
00088     /* Function Body */
00089     if (! (*matz)) {
00090         goto L10;
00091     }
00092 
00093     i__1 = *n;
00094     for (j = 1; j <= i__1; ++j) {
00095 
00096         i__2 = *n;
00097         for (i__ = 1; i__ <= i__2; ++i__) {
00098             z__[i__ + j * z_dim1] = 0.;
00099 /* L2: */
00100         }
00101 
00102         z__[j + j * z_dim1] = 1.;
00103 /* L3: */
00104     }
00105 /*     .......... REDUCE B TO UPPER TRIANGULAR FORM .......... */
00106 L10:
00107     if (*n <= 1) {
00108         goto L170;
00109     }
00110     nm1 = *n - 1;
00111 
00112     i__1 = nm1;
00113     for (l = 1; l <= i__1; ++l) {
00114         l1 = l + 1;
00115         s = 0.;
00116 
00117         i__2 = *n;
00118         for (i__ = l1; i__ <= i__2; ++i__) {
00119             s += (d__1 = b[i__ + l * b_dim1], abs(d__1));
00120 /* L20: */
00121         }
00122 
00123         if (s == 0.) {
00124             goto L100;
00125         }
00126         s += (d__1 = b[l + l * b_dim1], abs(d__1));
00127         r__ = 0.;
00128 
00129         i__2 = *n;
00130         for (i__ = l; i__ <= i__2; ++i__) {
00131             b[i__ + l * b_dim1] /= s;
00132 /* Computing 2nd power */
00133             d__1 = b[i__ + l * b_dim1];
00134             r__ += d__1 * d__1;
00135 /* L25: */
00136         }
00137 
00138         d__1 = sqrt(r__);
00139         r__ = d_sign(&d__1, &b[l + l * b_dim1]);
00140         b[l + l * b_dim1] += r__;
00141         rho = r__ * b[l + l * b_dim1];
00142 
00143         i__2 = *n;
00144         for (j = l1; j <= i__2; ++j) {
00145             t = 0.;
00146 
00147             i__3 = *n;
00148             for (i__ = l; i__ <= i__3; ++i__) {
00149                 t += b[i__ + l * b_dim1] * b[i__ + j * b_dim1];
00150 /* L30: */
00151             }
00152 
00153             t = -t / rho;
00154 
00155             i__3 = *n;
00156             for (i__ = l; i__ <= i__3; ++i__) {
00157                 b[i__ + j * b_dim1] += t * b[i__ + l * b_dim1];
00158 /* L40: */
00159             }
00160 
00161 /* L50: */
00162         }
00163 
00164         i__2 = *n;
00165         for (j = 1; j <= i__2; ++j) {
00166             t = 0.;
00167 
00168             i__3 = *n;
00169             for (i__ = l; i__ <= i__3; ++i__) {
00170                 t += b[i__ + l * b_dim1] * a[i__ + j * a_dim1];
00171 /* L60: */
00172             }
00173 
00174             t = -t / rho;
00175 
00176             i__3 = *n;
00177             for (i__ = l; i__ <= i__3; ++i__) {
00178                 a[i__ + j * a_dim1] += t * b[i__ + l * b_dim1];
00179 /* L70: */
00180             }
00181 
00182 /* L80: */
00183         }
00184 
00185         b[l + l * b_dim1] = -s * r__;
00186 
00187         i__2 = *n;
00188         for (i__ = l1; i__ <= i__2; ++i__) {
00189             b[i__ + l * b_dim1] = 0.;
00190 /* L90: */
00191         }
00192 
00193 L100:
00194         ;
00195     }
00196 /*     .......... REDUCE A TO UPPER HESSENBERG FORM, WHILE */
00197 /*                KEEPING B TRIANGULAR .......... */
00198     if (*n == 2) {
00199         goto L170;
00200     }
00201     nm2 = *n - 2;
00202 
00203     i__1 = nm2;
00204     for (k = 1; k <= i__1; ++k) {
00205         nk1 = nm1 - k;
00206 /*     .......... FOR L=N-1 STEP -1 UNTIL K+1 DO -- .......... */
00207         i__2 = nk1;
00208         for (lb = 1; lb <= i__2; ++lb) {
00209             l = *n - lb;
00210             l1 = l + 1;
00211 /*     .......... ZERO A(L+1,K) .......... */
00212             s = (d__1 = a[l + k * a_dim1], abs(d__1)) + (d__2 = a[l1 + k * 
00213                     a_dim1], abs(d__2));
00214             if (s == 0.) {
00215                 goto L150;
00216             }
00217             u1 = a[l + k * a_dim1] / s;
00218             u2 = a[l1 + k * a_dim1] / s;
00219             d__1 = sqrt(u1 * u1 + u2 * u2);
00220             r__ = d_sign(&d__1, &u1);
00221             v1 = -(u1 + r__) / r__;
00222             v2 = -u2 / r__;
00223             u2 = v2 / v1;
00224 
00225             i__3 = *n;
00226             for (j = k; j <= i__3; ++j) {
00227                 t = a[l + j * a_dim1] + u2 * a[l1 + j * a_dim1];
00228                 a[l + j * a_dim1] += t * v1;
00229                 a[l1 + j * a_dim1] += t * v2;
00230 /* L110: */
00231             }
00232 
00233             a[l1 + k * a_dim1] = 0.;
00234 
00235             i__3 = *n;
00236             for (j = l; j <= i__3; ++j) {
00237                 t = b[l + j * b_dim1] + u2 * b[l1 + j * b_dim1];
00238                 b[l + j * b_dim1] += t * v1;
00239                 b[l1 + j * b_dim1] += t * v2;
00240 /* L120: */
00241             }
00242 /*     .......... ZERO B(L+1,L) .......... */
00243             s = (d__1 = b[l1 + l1 * b_dim1], abs(d__1)) + (d__2 = b[l1 + l * 
00244                     b_dim1], abs(d__2));
00245             if (s == 0.) {
00246                 goto L150;
00247             }
00248             u1 = b[l1 + l1 * b_dim1] / s;
00249             u2 = b[l1 + l * b_dim1] / s;
00250             d__1 = sqrt(u1 * u1 + u2 * u2);
00251             r__ = d_sign(&d__1, &u1);
00252             v1 = -(u1 + r__) / r__;
00253             v2 = -u2 / r__;
00254             u2 = v2 / v1;
00255 
00256             i__3 = l1;
00257             for (i__ = 1; i__ <= i__3; ++i__) {
00258                 t = b[i__ + l1 * b_dim1] + u2 * b[i__ + l * b_dim1];
00259                 b[i__ + l1 * b_dim1] += t * v1;
00260                 b[i__ + l * b_dim1] += t * v2;
00261 /* L130: */
00262             }
00263 
00264             b[l1 + l * b_dim1] = 0.;
00265 
00266             i__3 = *n;
00267             for (i__ = 1; i__ <= i__3; ++i__) {
00268                 t = a[i__ + l1 * a_dim1] + u2 * a[i__ + l * a_dim1];
00269                 a[i__ + l1 * a_dim1] += t * v1;
00270                 a[i__ + l * a_dim1] += t * v2;
00271 /* L140: */
00272             }
00273 
00274             if (! (*matz)) {
00275                 goto L150;
00276             }
00277 
00278             i__3 = *n;
00279             for (i__ = 1; i__ <= i__3; ++i__) {
00280                 t = z__[i__ + l1 * z_dim1] + u2 * z__[i__ + l * z_dim1];
00281                 z__[i__ + l1 * z_dim1] += t * v1;
00282                 z__[i__ + l * z_dim1] += t * v2;
00283 /* L145: */
00284             }
00285 
00286 L150:
00287             ;
00288         }
00289 
00290 /* L160: */
00291     }
00292 
00293 L170:
00294     return 0;
00295 } /* qzhes_ */

int qzit_ integer   nm,
integer   n,
doublereal   a,
doublereal   b,
doublereal   eps1,
logical   matz,
doublereal   z__,
integer   ierr
 

Definition at line 12 of file eis_qzit.c.

References a, a2, abs, c_b5, d_sign(), ep, epslon_(), l, max, min, and v1.

Referenced by rgg_().

00014 {
00015     /* System generated locals */
00016     integer a_dim1, a_offset, b_dim1, b_offset, z_dim1, z_offset, i__1, i__2, 
00017             i__3;
00018     doublereal d__1, d__2, d__3;
00019 
00020     /* Builtin functions */
00021     double sqrt(doublereal), d_sign(doublereal *, doublereal *);
00022 
00023     /* Local variables */
00024     static doublereal epsa, epsb;
00025     static integer i__, j, k, l;
00026     static doublereal r__, s, t, anorm, bnorm;
00027     static integer enorn;
00028     static doublereal a1, a2, a3;
00029     static integer k1, k2, l1;
00030     static doublereal u1, u2, u3, v1, v2, v3, a11, a12, a21, a22, a33, a34, 
00031             a43, a44, b11, b12, b22, b33;
00032     static integer na, ld;
00033     static doublereal b34, b44;
00034     static integer en;
00035     static doublereal ep;
00036     static integer ll;
00037     static doublereal sh;
00038     extern doublereal epslon_(doublereal *);
00039     static logical notlas;
00040     static integer km1, lm1;
00041     static doublereal ani, bni;
00042     static integer ish, itn, its, enm2, lor1;
00043 
00044 
00045 
00046 /*     THIS SUBROUTINE IS THE SECOND STEP OF THE QZ ALGORITHM */
00047 /*     FOR SOLVING GENERALIZED MATRIX EIGENVALUE PROBLEMS, */
00048 /*     SIAM J. NUMER. ANAL. 10, 241-256(1973) BY MOLER AND STEWART, */
00049 /*     AS MODIFIED IN TECHNICAL NOTE NASA TN D-7305(1973) BY WARD. */
00050 
00051 /*     THIS SUBROUTINE ACCEPTS A PAIR OF REAL MATRICES, ONE OF THEM */
00052 /*     IN UPPER HESSENBERG FORM AND THE OTHER IN UPPER TRIANGULAR FORM. */
00053 /*     IT REDUCES THE HESSENBERG MATRIX TO QUASI-TRIANGULAR FORM USING */
00054 /*     ORTHOGONAL TRANSFORMATIONS WHILE MAINTAINING THE TRIANGULAR FORM */
00055 /*     OF THE OTHER MATRIX.  IT IS USUALLY PRECEDED BY  QZHES  AND */
00056 /*     FOLLOWED BY  QZVAL  AND, POSSIBLY,  QZVEC. */
00057 
00058 /*     ON INPUT */
00059 
00060 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00061 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00062 /*          DIMENSION STATEMENT. */
00063 
00064 /*        N IS THE ORDER OF THE MATRICES. */
00065 
00066 /*        A CONTAINS A REAL UPPER HESSENBERG MATRIX. */
00067 
00068 /*        B CONTAINS A REAL UPPER TRIANGULAR MATRIX. */
00069 
00070 /*        EPS1 IS A TOLERANCE USED TO DETERMINE NEGLIGIBLE ELEMENTS. */
00071 /*          EPS1 = 0.0 (OR NEGATIVE) MAY BE INPUT, IN WHICH CASE AN */
00072 /*          ELEMENT WILL BE NEGLECTED ONLY IF IT IS LESS THAN ROUNDOFF */
00073 /*          ERROR TIMES THE NORM OF ITS MATRIX.  IF THE INPUT EPS1 IS */
00074 /*          POSITIVE, THEN AN ELEMENT WILL BE CONSIDERED NEGLIGIBLE */
00075 /*          IF IT IS LESS THAN EPS1 TIMES THE NORM OF ITS MATRIX.  A */
00076 /*          POSITIVE VALUE OF EPS1 MAY RESULT IN FASTER EXECUTION, */
00077 /*          BUT LESS ACCURATE RESULTS. */
00078 
00079 /*        MATZ SHOULD BE SET TO .TRUE. IF THE RIGHT HAND TRANSFORMATIONS 
00080 */
00081 /*          ARE TO BE ACCUMULATED FOR LATER USE IN COMPUTING */
00082 /*          EIGENVECTORS, AND TO .FALSE. OTHERWISE. */
00083 
00084 /*        Z CONTAINS, IF MATZ HAS BEEN SET TO .TRUE., THE */
00085 /*          TRANSFORMATION MATRIX PRODUCED IN THE REDUCTION */
00086 /*          BY  QZHES, IF PERFORMED, OR ELSE THE IDENTITY MATRIX. */
00087 /*          IF MATZ HAS BEEN SET TO .FALSE., Z IS NOT REFERENCED. */
00088 
00089 /*     ON OUTPUT */
00090 
00091 /*        A HAS BEEN REDUCED TO QUASI-TRIANGULAR FORM.  THE ELEMENTS */
00092 /*          BELOW THE FIRST SUBDIAGONAL ARE STILL ZERO AND NO TWO */
00093 /*          CONSECUTIVE SUBDIAGONAL ELEMENTS ARE NONZERO. */
00094 
00095 /*        B IS STILL IN UPPER TRIANGULAR FORM, ALTHOUGH ITS ELEMENTS */
00096 /*          HAVE BEEN ALTERED.  THE LOCATION B(N,1) IS USED TO STORE */
00097 /*          EPS1 TIMES THE NORM OF B FOR LATER USE BY  QZVAL  AND  QZVEC. 
00098 */
00099 
00100 /*        Z CONTAINS THE PRODUCT OF THE RIGHT HAND TRANSFORMATIONS */
00101 /*          (FOR BOTH STEPS) IF MATZ HAS BEEN SET TO .TRUE.. */
00102 
00103 /*        IERR IS SET TO */
00104 /*          ZERO       FOR NORMAL RETURN, */
00105 /*          J          IF THE LIMIT OF 30*N ITERATIONS IS EXHAUSTED */
00106 /*                     WHILE THE J-TH EIGENVALUE IS BEING SOUGHT. */
00107 
00108 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00109 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00110 */
00111 
00112 /*     THIS VERSION DATED AUGUST 1983. */
00113 
00114 /*     ------------------------------------------------------------------ 
00115 */
00116 
00117     /* Parameter adjustments */
00118     z_dim1 = *nm;
00119     z_offset = z_dim1 + 1;
00120     z__ -= z_offset;
00121     b_dim1 = *nm;
00122     b_offset = b_dim1 + 1;
00123     b -= b_offset;
00124     a_dim1 = *nm;
00125     a_offset = a_dim1 + 1;
00126     a -= a_offset;
00127 
00128     /* Function Body */
00129     *ierr = 0;
00130 /*     .......... COMPUTE EPSA,EPSB .......... */
00131     anorm = 0.;
00132     bnorm = 0.;
00133 
00134     i__1 = *n;
00135     for (i__ = 1; i__ <= i__1; ++i__) {
00136         ani = 0.;
00137         if (i__ != 1) {
00138             ani = (d__1 = a[i__ + (i__ - 1) * a_dim1], abs(d__1));
00139         }
00140         bni = 0.;
00141 
00142         i__2 = *n;
00143         for (j = i__; j <= i__2; ++j) {
00144             ani += (d__1 = a[i__ + j * a_dim1], abs(d__1));
00145             bni += (d__1 = b[i__ + j * b_dim1], abs(d__1));
00146 /* L20: */
00147         }
00148 
00149         if (ani > anorm) {
00150             anorm = ani;
00151         }
00152         if (bni > bnorm) {
00153             bnorm = bni;
00154         }
00155 /* L30: */
00156     }
00157 
00158     if (anorm == 0.) {
00159         anorm = 1.;
00160     }
00161     if (bnorm == 0.) {
00162         bnorm = 1.;
00163     }
00164     ep = *eps1;
00165     if (ep > 0.) {
00166         goto L50;
00167     }
00168 /*     .......... USE ROUNDOFF LEVEL IF EPS1 IS ZERO .......... */
00169     ep = epslon_(&c_b5);
00170 L50:
00171     epsa = ep * anorm;
00172     epsb = ep * bnorm;
00173 /*     .......... REDUCE A TO QUASI-TRIANGULAR FORM, WHILE */
00174 /*                KEEPING B TRIANGULAR .......... */
00175     lor1 = 1;
00176     enorn = *n;
00177     en = *n;
00178     itn = *n * 30;
00179 /*     .......... BEGIN QZ STEP .......... */
00180 L60:
00181     if (en <= 2) {
00182         goto L1001;
00183     }
00184     if (! (*matz)) {
00185         enorn = en;
00186     }
00187     its = 0;
00188     na = en - 1;
00189     enm2 = na - 1;
00190 L70:
00191     ish = 2;
00192 /*     .......... CHECK FOR CONVERGENCE OR REDUCIBILITY. */
00193 /*                FOR L=EN STEP -1 UNTIL 1 DO -- .......... */
00194     i__1 = en;
00195     for (ll = 1; ll <= i__1; ++ll) {
00196         lm1 = en - ll;
00197         l = lm1 + 1;
00198         if (l == 1) {
00199             goto L95;
00200         }
00201         if ((d__1 = a[l + lm1 * a_dim1], abs(d__1)) <= epsa) {
00202             goto L90;
00203         }
00204 /* L80: */
00205     }
00206 
00207 L90:
00208     a[l + lm1 * a_dim1] = 0.;
00209     if (l < na) {
00210         goto L95;
00211     }
00212 /*     .......... 1-BY-1 OR 2-BY-2 BLOCK ISOLATED .......... */
00213     en = lm1;
00214     goto L60;
00215 /*     .......... CHECK FOR SMALL TOP OF B .......... */
00216 L95:
00217     ld = l;
00218 L100:
00219     l1 = l + 1;
00220     b11 = b[l + l * b_dim1];
00221     if (abs(b11) > epsb) {
00222         goto L120;
00223     }
00224     b[l + l * b_dim1] = 0.;
00225     s = (d__1 = a[l + l * a_dim1], abs(d__1)) + (d__2 = a[l1 + l * a_dim1], 
00226             abs(d__2));
00227     u1 = a[l + l * a_dim1] / s;
00228     u2 = a[l1 + l * a_dim1] / s;
00229     d__1 = sqrt(u1 * u1 + u2 * u2);
00230     r__ = d_sign(&d__1, &u1);
00231     v1 = -(u1 + r__) / r__;
00232     v2 = -u2 / r__;
00233     u2 = v2 / v1;
00234 
00235     i__1 = enorn;
00236     for (j = l; j <= i__1; ++j) {
00237         t = a[l + j * a_dim1] + u2 * a[l1 + j * a_dim1];
00238         a[l + j * a_dim1] += t * v1;
00239         a[l1 + j * a_dim1] += t * v2;
00240         t = b[l + j * b_dim1] + u2 * b[l1 + j * b_dim1];
00241         b[l + j * b_dim1] += t * v1;
00242         b[l1 + j * b_dim1] += t * v2;
00243 /* L110: */
00244     }
00245 
00246     if (l != 1) {
00247         a[l + lm1 * a_dim1] = -a[l + lm1 * a_dim1];
00248     }
00249     lm1 = l;
00250     l = l1;
00251     goto L90;
00252 L120:
00253     a11 = a[l + l * a_dim1] / b11;
00254     a21 = a[l1 + l * a_dim1] / b11;
00255     if (ish == 1) {
00256         goto L140;
00257     }
00258 /*     .......... ITERATION STRATEGY .......... */
00259     if (itn == 0) {
00260         goto L1000;
00261     }
00262     if (its == 10) {
00263         goto L155;
00264     }
00265 /*     .......... DETERMINE TYPE OF SHIFT .......... */
00266     b22 = b[l1 + l1 * b_dim1];
00267     if (abs(b22) < epsb) {
00268         b22 = epsb;
00269     }
00270     b33 = b[na + na * b_dim1];
00271     if (abs(b33) < epsb) {
00272         b33 = epsb;
00273     }
00274     b44 = b[en + en * b_dim1];
00275     if (abs(b44) < epsb) {
00276         b44 = epsb;
00277     }
00278     a33 = a[na + na * a_dim1] / b33;
00279     a34 = a[na + en * a_dim1] / b44;
00280     a43 = a[en + na * a_dim1] / b33;
00281     a44 = a[en + en * a_dim1] / b44;
00282     b34 = b[na + en * b_dim1] / b44;
00283     t = (a43 * b34 - a33 - a44) * .5;
00284     r__ = t * t + a34 * a43 - a33 * a44;
00285     if (r__ < 0.) {
00286         goto L150;
00287     }
00288 /*     .......... DETERMINE SINGLE SHIFT ZEROTH COLUMN OF A .......... */
00289     ish = 1;
00290     r__ = sqrt(r__);
00291     sh = -t + r__;
00292     s = -t - r__;
00293     if ((d__1 = s - a44, abs(d__1)) < (d__2 = sh - a44, abs(d__2))) {
00294         sh = s;
00295     }
00296 /*     .......... LOOK FOR TWO CONSECUTIVE SMALL */
00297 /*                SUB-DIAGONAL ELEMENTS OF A. */
00298 /*                FOR L=EN-2 STEP -1 UNTIL LD DO -- .......... */
00299     i__1 = enm2;
00300     for (ll = ld; ll <= i__1; ++ll) {
00301         l = enm2 + ld - ll;
00302         if (l == ld) {
00303             goto L140;
00304         }
00305         lm1 = l - 1;
00306         l1 = l + 1;
00307         t = a[l + l * a_dim1];
00308         if ((d__1 = b[l + l * b_dim1], abs(d__1)) > epsb) {
00309             t -= sh * b[l + l * b_dim1];
00310         }
00311         if ((d__1 = a[l + lm1 * a_dim1], abs(d__1)) <= (d__2 = t / a[l1 + l * 
00312                 a_dim1], abs(d__2)) * epsa) {
00313             goto L100;
00314         }
00315 /* L130: */
00316     }
00317 
00318 L140:
00319     a1 = a11 - sh;
00320     a2 = a21;
00321     if (l != ld) {
00322         a[l + lm1 * a_dim1] = -a[l + lm1 * a_dim1];
00323     }
00324     goto L160;
00325 /*     .......... DETERMINE DOUBLE SHIFT ZEROTH COLUMN OF A .......... */
00326 L150:
00327     a12 = a[l + l1 * a_dim1] / b22;
00328     a22 = a[l1 + l1 * a_dim1] / b22;
00329     b12 = b[l + l1 * b_dim1] / b22;
00330     a1 = ((a33 - a11) * (a44 - a11) - a34 * a43 + a43 * b34 * a11) / a21 + 
00331             a12 - a11 * b12;
00332     a2 = a22 - a11 - a21 * b12 - (a33 - a11) - (a44 - a11) + a43 * b34;
00333     a3 = a[l1 + 1 + l1 * a_dim1] / b22;
00334     goto L160;
00335 /*     .......... AD HOC SHIFT .......... */
00336 L155:
00337     a1 = 0.;
00338     a2 = 1.;
00339     a3 = 1.1605;
00340 L160:
00341     ++its;
00342     --itn;
00343     if (! (*matz)) {
00344         lor1 = ld;
00345     }
00346 /*     .......... MAIN LOOP .......... */
00347     i__1 = na;
00348     for (k = l; k <= i__1; ++k) {
00349         notlas = k != na && ish == 2;
00350         k1 = k + 1;
00351         k2 = k + 2;
00352 /* Computing MAX */
00353         i__2 = k - 1;
00354         km1 = max(i__2,l);
00355 /* Computing MIN */
00356         i__2 = en, i__3 = k1 + ish;
00357         ll = min(i__2,i__3);
00358         if (notlas) {
00359             goto L190;
00360         }
00361 /*     .......... ZERO A(K+1,K-1) .......... */
00362         if (k == l) {
00363             goto L170;
00364         }
00365         a1 = a[k + km1 * a_dim1];
00366         a2 = a[k1 + km1 * a_dim1];
00367 L170:
00368         s = abs(a1) + abs(a2);
00369         if (s == 0.) {
00370             goto L70;
00371         }
00372         u1 = a1 / s;
00373         u2 = a2 / s;
00374         d__1 = sqrt(u1 * u1 + u2 * u2);
00375         r__ = d_sign(&d__1, &u1);
00376         v1 = -(u1 + r__) / r__;
00377         v2 = -u2 / r__;
00378         u2 = v2 / v1;
00379 
00380         i__2 = enorn;
00381         for (j = km1; j <= i__2; ++j) {
00382             t = a[k + j * a_dim1] + u2 * a[k1 + j * a_dim1];
00383             a[k + j * a_dim1] += t * v1;
00384             a[k1 + j * a_dim1] += t * v2;
00385             t = b[k + j * b_dim1] + u2 * b[k1 + j * b_dim1];
00386             b[k + j * b_dim1] += t * v1;
00387             b[k1 + j * b_dim1] += t * v2;
00388 /* L180: */
00389         }
00390 
00391         if (k != l) {
00392             a[k1 + km1 * a_dim1] = 0.;
00393         }
00394         goto L240;
00395 /*     .......... ZERO A(K+1,K-1) AND A(K+2,K-1) .......... */
00396 L190:
00397         if (k == l) {
00398             goto L200;
00399         }
00400         a1 = a[k + km1 * a_dim1];
00401         a2 = a[k1 + km1 * a_dim1];
00402         a3 = a[k2 + km1 * a_dim1];
00403 L200:
00404         s = abs(a1) + abs(a2) + abs(a3);
00405         if (s == 0.) {
00406             goto L260;
00407         }
00408         u1 = a1 / s;
00409         u2 = a2 / s;
00410         u3 = a3 / s;
00411         d__1 = sqrt(u1 * u1 + u2 * u2 + u3 * u3);
00412         r__ = d_sign(&d__1, &u1);
00413         v1 = -(u1 + r__) / r__;
00414         v2 = -u2 / r__;
00415         v3 = -u3 / r__;
00416         u2 = v2 / v1;
00417         u3 = v3 / v1;
00418 
00419         i__2 = enorn;
00420         for (j = km1; j <= i__2; ++j) {
00421             t = a[k + j * a_dim1] + u2 * a[k1 + j * a_dim1] + u3 * a[k2 + j * 
00422                     a_dim1];
00423             a[k + j * a_dim1] += t * v1;
00424             a[k1 + j * a_dim1] += t * v2;
00425             a[k2 + j * a_dim1] += t * v3;
00426             t = b[k + j * b_dim1] + u2 * b[k1 + j * b_dim1] + u3 * b[k2 + j * 
00427                     b_dim1];
00428             b[k + j * b_dim1] += t * v1;
00429             b[k1 + j * b_dim1] += t * v2;
00430             b[k2 + j * b_dim1] += t * v3;
00431 /* L210: */
00432         }
00433 
00434         if (k == l) {
00435             goto L220;
00436         }
00437         a[k1 + km1 * a_dim1] = 0.;
00438         a[k2 + km1 * a_dim1] = 0.;
00439 /*     .......... ZERO B(K+2,K+1) AND B(K+2,K) .......... */
00440 L220:
00441         s = (d__1 = b[k2 + k2 * b_dim1], abs(d__1)) + (d__2 = b[k2 + k1 * 
00442                 b_dim1], abs(d__2)) + (d__3 = b[k2 + k * b_dim1], abs(d__3));
00443         if (s == 0.) {
00444             goto L240;
00445         }
00446         u1 = b[k2 + k2 * b_dim1] / s;
00447         u2 = b[k2 + k1 * b_dim1] / s;
00448         u3 = b[k2 + k * b_dim1] / s;
00449         d__1 = sqrt(u1 * u1 + u2 * u2 + u3 * u3);
00450         r__ = d_sign(&d__1, &u1);
00451         v1 = -(u1 + r__) / r__;
00452         v2 = -u2 / r__;
00453         v3 = -u3 / r__;
00454         u2 = v2 / v1;
00455         u3 = v3 / v1;
00456 
00457         i__2 = ll;
00458         for (i__ = lor1; i__ <= i__2; ++i__) {
00459             t = a[i__ + k2 * a_dim1] + u2 * a[i__ + k1 * a_dim1] + u3 * a[i__ 
00460                     + k * a_dim1];
00461             a[i__ + k2 * a_dim1] += t * v1;
00462             a[i__ + k1 * a_dim1] += t * v2;
00463             a[i__ + k * a_dim1] += t * v3;
00464             t = b[i__ + k2 * b_dim1] + u2 * b[i__ + k1 * b_dim1] + u3 * b[i__ 
00465                     + k * b_dim1];
00466             b[i__ + k2 * b_dim1] += t * v1;
00467             b[i__ + k1 * b_dim1] += t * v2;
00468             b[i__ + k * b_dim1] += t * v3;
00469 /* L230: */
00470         }
00471 
00472         b[k2 + k * b_dim1] = 0.;
00473         b[k2 + k1 * b_dim1] = 0.;
00474         if (! (*matz)) {
00475             goto L240;
00476         }
00477 
00478         i__2 = *n;
00479         for (i__ = 1; i__ <= i__2; ++i__) {
00480             t = z__[i__ + k2 * z_dim1] + u2 * z__[i__ + k1 * z_dim1] + u3 * 
00481                     z__[i__ + k * z_dim1];
00482             z__[i__ + k2 * z_dim1] += t * v1;
00483             z__[i__ + k1 * z_dim1] += t * v2;
00484             z__[i__ + k * z_dim1] += t * v3;
00485 /* L235: */
00486         }
00487 /*     .......... ZERO B(K+1,K) .......... */
00488 L240:
00489         s = (d__1 = b[k1 + k1 * b_dim1], abs(d__1)) + (d__2 = b[k1 + k * 
00490                 b_dim1], abs(d__2));
00491         if (s == 0.) {
00492             goto L260;
00493         }
00494         u1 = b[k1 + k1 * b_dim1] / s;
00495         u2 = b[k1 + k * b_dim1] / s;
00496         d__1 = sqrt(u1 * u1 + u2 * u2);
00497         r__ = d_sign(&d__1, &u1);
00498         v1 = -(u1 + r__) / r__;
00499         v2 = -u2 / r__;
00500         u2 = v2 / v1;
00501 
00502         i__2 = ll;
00503         for (i__ = lor1; i__ <= i__2; ++i__) {
00504             t = a[i__ + k1 * a_dim1] + u2 * a[i__ + k * a_dim1];
00505             a[i__ + k1 * a_dim1] += t * v1;
00506             a[i__ + k * a_dim1] += t * v2;
00507             t = b[i__ + k1 * b_dim1] + u2 * b[i__ + k * b_dim1];
00508             b[i__ + k1 * b_dim1] += t * v1;
00509             b[i__ + k * b_dim1] += t * v2;
00510 /* L250: */
00511         }
00512 
00513         b[k1 + k * b_dim1] = 0.;
00514         if (! (*matz)) {
00515             goto L260;
00516         }
00517 
00518         i__2 = *n;
00519         for (i__ = 1; i__ <= i__2; ++i__) {
00520             t = z__[i__ + k1 * z_dim1] + u2 * z__[i__ + k * z_dim1];
00521             z__[i__ + k1 * z_dim1] += t * v1;
00522             z__[i__ + k * z_dim1] += t * v2;
00523 /* L255: */
00524         }
00525 
00526 L260:
00527         ;
00528     }
00529 /*     .......... END QZ STEP .......... */
00530     goto L70;
00531 /*     .......... SET ERROR -- ALL EIGENVALUES HAVE NOT */
00532 /*                CONVERGED AFTER 30*N ITERATIONS .......... */
00533 L1000:
00534     *ierr = en;
00535 /*     .......... SAVE EPSB FOR USE BY QZVAL AND QZVEC .......... */
00536 L1001:
00537     if (*n > 1) {
00538         b[*n + b_dim1] = epsb;
00539     }
00540     return 0;
00541 } /* qzit_ */

int qzval_ integer   nm,
integer   n,
doublereal   a,
doublereal   b,
doublereal   alfr,
doublereal   alfi,
doublereal   beta,
logical   matz,
doublereal   z__
 

Definition at line 8 of file eis_qzval.c.

References a, a2, abs, d_sign(), and v1.

Referenced by rgg_().

00011 {
00012     /* System generated locals */
00013     integer a_dim1, a_offset, b_dim1, b_offset, z_dim1, z_offset, i__1, i__2;
00014     doublereal d__1, d__2, d__3, d__4;
00015 
00016     /* Builtin functions */
00017     double sqrt(doublereal), d_sign(doublereal *, doublereal *);
00018 
00019     /* Local variables */
00020     static doublereal epsb, c__, d__, e;
00021     static integer i__, j;
00022     static doublereal r__, s, t, a1, a2, u1, u2, v1, v2, a11, a12, a21, a22, 
00023             b11, b12, b22, di, ei;
00024     static integer na;
00025     static doublereal an, bn;
00026     static integer en;
00027     static doublereal cq, dr;
00028     static integer nn;
00029     static doublereal cz, ti, tr, a1i, a2i, a11i, a12i, a22i, a11r, a12r, 
00030             a22r, sqi, ssi;
00031     static integer isw;
00032     static doublereal sqr, szi, ssr, szr;
00033 
00034 
00035 
00036 /*     THIS SUBROUTINE IS THE THIRD STEP OF THE QZ ALGORITHM */
00037 /*     FOR SOLVING GENERALIZED MATRIX EIGENVALUE PROBLEMS, */
00038 /*     SIAM J. NUMER. ANAL. 10, 241-256(1973) BY MOLER AND STEWART. */
00039 
00040 /*     THIS SUBROUTINE ACCEPTS A PAIR OF REAL MATRICES, ONE OF THEM */
00041 /*     IN QUASI-TRIANGULAR FORM AND THE OTHER IN UPPER TRIANGULAR FORM. */
00042 /*     IT REDUCES THE QUASI-TRIANGULAR MATRIX FURTHER, SO THAT ANY */
00043 /*     REMAINING 2-BY-2 BLOCKS CORRESPOND TO PAIRS OF COMPLEX */
00044 /*     EIGENVALUES, AND RETURNS QUANTITIES WHOSE RATIOS GIVE THE */
00045 /*     GENERALIZED EIGENVALUES.  IT IS USUALLY PRECEDED BY  QZHES */
00046 /*     AND  QZIT  AND MAY BE FOLLOWED BY  QZVEC. */
00047 
00048 /*     ON INPUT */
00049 
00050 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00051 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00052 /*          DIMENSION STATEMENT. */
00053 
00054 /*        N IS THE ORDER OF THE MATRICES. */
00055 
00056 /*        A CONTAINS A REAL UPPER QUASI-TRIANGULAR MATRIX. */
00057 
00058 /*        B CONTAINS A REAL UPPER TRIANGULAR MATRIX.  IN ADDITION, */
00059 /*          LOCATION B(N,1) CONTAINS THE TOLERANCE QUANTITY (EPSB) */
00060 /*          COMPUTED AND SAVED IN  QZIT. */
00061 
00062 /*        MATZ SHOULD BE SET TO .TRUE. IF THE RIGHT HAND TRANSFORMATIONS 
00063 */
00064 /*          ARE TO BE ACCUMULATED FOR LATER USE IN COMPUTING */
00065 /*          EIGENVECTORS, AND TO .FALSE. OTHERWISE. */
00066 
00067 /*        Z CONTAINS, IF MATZ HAS BEEN SET TO .TRUE., THE */
00068 /*          TRANSFORMATION MATRIX PRODUCED IN THE REDUCTIONS BY QZHES */
00069 /*          AND QZIT, IF PERFORMED, OR ELSE THE IDENTITY MATRIX. */
00070 /*          IF MATZ HAS BEEN SET TO .FALSE., Z IS NOT REFERENCED. */
00071 
00072 /*     ON OUTPUT */
00073 
00074 /*        A HAS BEEN REDUCED FURTHER TO A QUASI-TRIANGULAR MATRIX */
00075 /*          IN WHICH ALL NONZERO SUBDIAGONAL ELEMENTS CORRESPOND TO */
00076 /*          PAIRS OF COMPLEX EIGENVALUES. */
00077 
00078 /*        B IS STILL IN UPPER TRIANGULAR FORM, ALTHOUGH ITS ELEMENTS */
00079 /*          HAVE BEEN ALTERED.  B(N,1) IS UNALTERED. */
00080 
00081 /*        ALFR AND ALFI CONTAIN THE REAL AND IMAGINARY PARTS OF THE */
00082 /*          DIAGONAL ELEMENTS OF THE TRIANGULAR MATRIX THAT WOULD BE */
00083 /*          OBTAINED IF A WERE REDUCED COMPLETELY TO TRIANGULAR FORM */
00084 /*          BY UNITARY TRANSFORMATIONS.  NON-ZERO VALUES OF ALFI OCCUR */
00085 /*          IN PAIRS, THE FIRST MEMBER POSITIVE AND THE SECOND NEGATIVE. 
00086 */
00087 
00088 /*        BETA CONTAINS THE DIAGONAL ELEMENTS OF THE CORRESPONDING B, */
00089 /*          NORMALIZED TO BE REAL AND NON-NEGATIVE.  THE GENERALIZED */
00090 /*          EIGENVALUES ARE THEN THE RATIOS ((ALFR+I*ALFI)/BETA). */
00091 
00092 /*        Z CONTAINS THE PRODUCT OF THE RIGHT HAND TRANSFORMATIONS */
00093 /*          (FOR ALL THREE STEPS) IF MATZ HAS BEEN SET TO .TRUE. */
00094 
00095 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00096 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00097 */
00098 
00099 /*     THIS VERSION DATED AUGUST 1983. */
00100 
00101 /*     ------------------------------------------------------------------ 
00102 */
00103 
00104     /* Parameter adjustments */
00105     z_dim1 = *nm;
00106     z_offset = z_dim1 + 1;
00107     z__ -= z_offset;
00108     --beta;
00109     --alfi;
00110     --alfr;
00111     b_dim1 = *nm;
00112     b_offset = b_dim1 + 1;
00113     b -= b_offset;
00114     a_dim1 = *nm;
00115     a_offset = a_dim1 + 1;
00116     a -= a_offset;
00117 
00118     /* Function Body */
00119     epsb = b[*n + b_dim1];
00120     isw = 1;
00121 /*     .......... FIND EIGENVALUES OF QUASI-TRIANGULAR MATRICES. */
00122 /*                FOR EN=N STEP -1 UNTIL 1 DO -- .......... */
00123     i__1 = *n;
00124     for (nn = 1; nn <= i__1; ++nn) {
00125         en = *n + 1 - nn;
00126         na = en - 1;
00127         if (isw == 2) {
00128             goto L505;
00129         }
00130         if (en == 1) {
00131             goto L410;
00132         }
00133         if (a[en + na * a_dim1] != 0.) {
00134             goto L420;
00135         }
00136 /*     .......... 1-BY-1 BLOCK, ONE REAL ROOT .......... */
00137 L410:
00138         alfr[en] = a[en + en * a_dim1];
00139         if (b[en + en * b_dim1] < 0.) {
00140             alfr[en] = -alfr[en];
00141         }
00142         beta[en] = (d__1 = b[en + en * b_dim1], abs(d__1));
00143         alfi[en] = 0.;
00144         goto L510;
00145 /*     .......... 2-BY-2 BLOCK .......... */
00146 L420:
00147         if ((d__1 = b[na + na * b_dim1], abs(d__1)) <= epsb) {
00148             goto L455;
00149         }
00150         if ((d__1 = b[en + en * b_dim1], abs(d__1)) > epsb) {
00151             goto L430;
00152         }
00153         a1 = a[en + en * a_dim1];
00154         a2 = a[en + na * a_dim1];
00155         bn = 0.;
00156         goto L435;
00157 L430:
00158         an = (d__1 = a[na + na * a_dim1], abs(d__1)) + (d__2 = a[na + en * 
00159                 a_dim1], abs(d__2)) + (d__3 = a[en + na * a_dim1], abs(d__3)) 
00160                 + (d__4 = a[en + en * a_dim1], abs(d__4));
00161         bn = (d__1 = b[na + na * b_dim1], abs(d__1)) + (d__2 = b[na + en * 
00162                 b_dim1], abs(d__2)) + (d__3 = b[en + en * b_dim1], abs(d__3));
00163         a11 = a[na + na * a_dim1] / an;
00164         a12 = a[na + en * a_dim1] / an;
00165         a21 = a[en + na * a_dim1] / an;
00166         a22 = a[en + en * a_dim1] / an;
00167         b11 = b[na + na * b_dim1] / bn;
00168         b12 = b[na + en * b_dim1] / bn;
00169         b22 = b[en + en * b_dim1] / bn;
00170         e = a11 / b11;
00171         ei = a22 / b22;
00172         s = a21 / (b11 * b22);
00173         t = (a22 - e * b22) / b22;
00174         if (abs(e) <= abs(ei)) {
00175             goto L431;
00176         }
00177         e = ei;
00178         t = (a11 - e * b11) / b11;
00179 L431:
00180         c__ = (t - s * b12) * .5;
00181         d__ = c__ * c__ + s * (a12 - e * b12);
00182         if (d__ < 0.) {
00183             goto L480;
00184         }
00185 /*     .......... TWO REAL ROOTS. */
00186 /*                ZERO BOTH A(EN,NA) AND B(EN,NA) .......... */
00187         d__1 = sqrt(d__);
00188         e += c__ + d_sign(&d__1, &c__);
00189         a11 -= e * b11;
00190         a12 -= e * b12;
00191         a22 -= e * b22;
00192         if (abs(a11) + abs(a12) < abs(a21) + abs(a22)) {
00193             goto L432;
00194         }
00195         a1 = a12;
00196         a2 = a11;
00197         goto L435;
00198 L432:
00199         a1 = a22;
00200         a2 = a21;
00201 /*     .......... CHOOSE AND APPLY REAL Z .......... */
00202 L435:
00203         s = abs(a1) + abs(a2);
00204         u1 = a1 / s;
00205         u2 = a2 / s;
00206         d__1 = sqrt(u1 * u1 + u2 * u2);
00207         r__ = d_sign(&d__1, &u1);
00208         v1 = -(u1 + r__) / r__;
00209         v2 = -u2 / r__;
00210         u2 = v2 / v1;
00211 
00212         i__2 = en;
00213         for (i__ = 1; i__ <= i__2; ++i__) {
00214             t = a[i__ + en * a_dim1] + u2 * a[i__ + na * a_dim1];
00215             a[i__ + en * a_dim1] += t * v1;
00216             a[i__ + na * a_dim1] += t * v2;
00217             t = b[i__ + en * b_dim1] + u2 * b[i__ + na * b_dim1];
00218             b[i__ + en * b_dim1] += t * v1;
00219             b[i__ + na * b_dim1] += t * v2;
00220 /* L440: */
00221         }
00222 
00223         if (! (*matz)) {
00224             goto L450;
00225         }
00226 
00227         i__2 = *n;
00228         for (i__ = 1; i__ <= i__2; ++i__) {
00229             t = z__[i__ + en * z_dim1] + u2 * z__[i__ + na * z_dim1];
00230             z__[i__ + en * z_dim1] += t * v1;
00231             z__[i__ + na * z_dim1] += t * v2;
00232 /* L445: */
00233         }
00234 
00235 L450:
00236         if (bn == 0.) {
00237             goto L475;
00238         }
00239         if (an < abs(e) * bn) {
00240             goto L455;
00241         }
00242         a1 = b[na + na * b_dim1];
00243         a2 = b[en + na * b_dim1];
00244         goto L460;
00245 L455:
00246         a1 = a[na + na * a_dim1];
00247         a2 = a[en + na * a_dim1];
00248 /*     .......... CHOOSE AND APPLY REAL Q .......... */
00249 L460:
00250         s = abs(a1) + abs(a2);
00251         if (s == 0.) {
00252             goto L475;
00253         }
00254         u1 = a1 / s;
00255         u2 = a2 / s;
00256         d__1 = sqrt(u1 * u1 + u2 * u2);
00257         r__ = d_sign(&d__1, &u1);
00258         v1 = -(u1 + r__) / r__;
00259         v2 = -u2 / r__;
00260         u2 = v2 / v1;
00261 
00262         i__2 = *n;
00263         for (j = na; j <= i__2; ++j) {
00264             t = a[na + j * a_dim1] + u2 * a[en + j * a_dim1];
00265             a[na + j * a_dim1] += t * v1;
00266             a[en + j * a_dim1] += t * v2;
00267             t = b[na + j * b_dim1] + u2 * b[en + j * b_dim1];
00268             b[na + j * b_dim1] += t * v1;
00269             b[en + j * b_dim1] += t * v2;
00270 /* L470: */
00271         }
00272 
00273 L475:
00274         a[en + na * a_dim1] = 0.;
00275         b[en + na * b_dim1] = 0.;
00276         alfr[na] = a[na + na * a_dim1];
00277         alfr[en] = a[en + en * a_dim1];
00278         if (b[na + na * b_dim1] < 0.) {
00279             alfr[na] = -alfr[na];
00280         }
00281         if (b[en + en * b_dim1] < 0.) {
00282             alfr[en] = -alfr[en];
00283         }
00284         beta[na] = (d__1 = b[na + na * b_dim1], abs(d__1));
00285         beta[en] = (d__1 = b[en + en * b_dim1], abs(d__1));
00286         alfi[en] = 0.;
00287         alfi[na] = 0.;
00288         goto L505;
00289 /*     .......... TWO COMPLEX ROOTS .......... */
00290 L480:
00291         e += c__;
00292         ei = sqrt(-d__);
00293         a11r = a11 - e * b11;
00294         a11i = ei * b11;
00295         a12r = a12 - e * b12;
00296         a12i = ei * b12;
00297         a22r = a22 - e * b22;
00298         a22i = ei * b22;
00299         if (abs(a11r) + abs(a11i) + abs(a12r) + abs(a12i) < abs(a21) + abs(
00300                 a22r) + abs(a22i)) {
00301             goto L482;
00302         }
00303         a1 = a12r;
00304         a1i = a12i;
00305         a2 = -a11r;
00306         a2i = -a11i;
00307         goto L485;
00308 L482:
00309         a1 = a22r;
00310         a1i = a22i;
00311         a2 = -a21;
00312         a2i = 0.;
00313 /*     .......... CHOOSE COMPLEX Z .......... */
00314 L485:
00315         cz = sqrt(a1 * a1 + a1i * a1i);
00316         if (cz == 0.) {
00317             goto L487;
00318         }
00319         szr = (a1 * a2 + a1i * a2i) / cz;
00320         szi = (a1 * a2i - a1i * a2) / cz;
00321         r__ = sqrt(cz * cz + szr * szr + szi * szi);
00322         cz /= r__;
00323         szr /= r__;
00324         szi /= r__;
00325         goto L490;
00326 L487:
00327         szr = 1.;
00328         szi = 0.;
00329 L490:
00330         if (an < (abs(e) + ei) * bn) {
00331             goto L492;
00332         }
00333         a1 = cz * b11 + szr * b12;
00334         a1i = szi * b12;
00335         a2 = szr * b22;
00336         a2i = szi * b22;
00337         goto L495;
00338 L492:
00339         a1 = cz * a11 + szr * a12;
00340         a1i = szi * a12;
00341         a2 = cz * a21 + szr * a22;
00342         a2i = szi * a22;
00343 /*     .......... CHOOSE COMPLEX Q .......... */
00344 L495:
00345         cq = sqrt(a1 * a1 + a1i * a1i);
00346         if (cq == 0.) {
00347             goto L497;
00348         }
00349         sqr = (a1 * a2 + a1i * a2i) / cq;
00350         sqi = (a1 * a2i - a1i * a2) / cq;
00351         r__ = sqrt(cq * cq + sqr * sqr + sqi * sqi);
00352         cq /= r__;
00353         sqr /= r__;
00354         sqi /= r__;
00355         goto L500;
00356 L497:
00357         sqr = 1.;
00358         sqi = 0.;
00359 /*     .......... COMPUTE DIAGONAL ELEMENTS THAT WOULD RESULT */
00360 /*                IF TRANSFORMATIONS WERE APPLIED .......... */
00361 L500:
00362         ssr = sqr * szr + sqi * szi;
00363         ssi = sqr * szi - sqi * szr;
00364         i__ = 1;
00365         tr = cq * cz * a11 + cq * szr * a12 + sqr * cz * a21 + ssr * a22;
00366         ti = cq * szi * a12 - sqi * cz * a21 + ssi * a22;
00367         dr = cq * cz * b11 + cq * szr * b12 + ssr * b22;
00368         di = cq * szi * b12 + ssi * b22;
00369         goto L503;
00370 L502:
00371         i__ = 2;
00372         tr = ssr * a11 - sqr * cz * a12 - cq * szr * a21 + cq * cz * a22;
00373         ti = -ssi * a11 - sqi * cz * a12 + cq * szi * a21;
00374         dr = ssr * b11 - sqr * cz * b12 + cq * cz * b22;
00375         di = -ssi * b11 - sqi * cz * b12;
00376 L503:
00377         t = ti * dr - tr * di;
00378         j = na;
00379         if (t < 0.) {
00380             j = en;
00381         }
00382         r__ = sqrt(dr * dr + di * di);
00383         beta[j] = bn * r__;
00384         alfr[j] = an * (tr * dr + ti * di) / r__;
00385         alfi[j] = an * t / r__;
00386         if (i__ == 1) {
00387             goto L502;
00388         }
00389 L505:
00390         isw = 3 - isw;
00391 L510:
00392         ;
00393     }
00394     b[*n + b_dim1] = epsb;
00395 
00396     return 0;
00397 } /* qzval_ */

int qzvec_ integer   nm,
integer   n,
doublereal   a,
doublereal   b,
doublereal   alfr,
doublereal   alfi,
doublereal   beta,
doublereal   z__
 

Definition at line 8 of file eis_qzvec.c.

References a, abs, q, and z1.

Referenced by rgg_().

00011 {
00012     /* System generated locals */
00013     integer a_dim1, a_offset, b_dim1, b_offset, z_dim1, z_offset, i__1, i__2, 
00014             i__3;
00015     doublereal d__1, d__2;
00016 
00017     /* Builtin functions */
00018     double sqrt(doublereal);
00019 
00020     /* Local variables */
00021     static doublereal alfm, almi, betm, epsb, almr, d__;
00022     static integer i__, j, k, m;
00023     static doublereal q, r__, s, t, w, x, y, t1, t2, w1, x1, z1, di;
00024     static integer na, ii, en, jj;
00025     static doublereal ra, dr, sa;
00026     static integer nn;
00027     static doublereal ti, rr, tr, zz;
00028     static integer isw, enm2;
00029 
00030 
00031 
00032 /*     THIS SUBROUTINE IS THE OPTIONAL FOURTH STEP OF THE QZ ALGORITHM */
00033 /*     FOR SOLVING GENERALIZED MATRIX EIGENVALUE PROBLEMS, */
00034 /*     SIAM J. NUMER. ANAL. 10, 241-256(1973) BY MOLER AND STEWART. */
00035 
00036 /*     THIS SUBROUTINE ACCEPTS A PAIR OF REAL MATRICES, ONE OF THEM IN */
00037 /*     QUASI-TRIANGULAR FORM (IN WHICH EACH 2-BY-2 BLOCK CORRESPONDS TO */
00038 /*     A PAIR OF COMPLEX EIGENVALUES) AND THE OTHER IN UPPER TRIANGULAR */
00039 /*     FORM.  IT COMPUTES THE EIGENVECTORS OF THE TRIANGULAR PROBLEM AND 
00040 */
00041 /*     TRANSFORMS THE RESULTS BACK TO THE ORIGINAL COORDINATE SYSTEM. */
00042 /*     IT IS USUALLY PRECEDED BY  QZHES,  QZIT, AND  QZVAL. */
00043 
00044 /*     ON INPUT */
00045 
00046 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00047 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00048 /*          DIMENSION STATEMENT. */
00049 
00050 /*        N IS THE ORDER OF THE MATRICES. */
00051 
00052 /*        A CONTAINS A REAL UPPER QUASI-TRIANGULAR MATRIX. */
00053 
00054 /*        B CONTAINS A REAL UPPER TRIANGULAR MATRIX.  IN ADDITION, */
00055 /*          LOCATION B(N,1) CONTAINS THE TOLERANCE QUANTITY (EPSB) */
00056 /*          COMPUTED AND SAVED IN  QZIT. */
00057 
00058 /*        ALFR, ALFI, AND BETA  ARE VECTORS WITH COMPONENTS WHOSE */
00059 /*          RATIOS ((ALFR+I*ALFI)/BETA) ARE THE GENERALIZED */
00060 /*          EIGENVALUES.  THEY ARE USUALLY OBTAINED FROM  QZVAL. */
00061 
00062 /*        Z CONTAINS THE TRANSFORMATION MATRIX PRODUCED IN THE */
00063 /*          REDUCTIONS BY  QZHES,  QZIT, AND  QZVAL, IF PERFORMED. */
00064 /*          IF THE EIGENVECTORS OF THE TRIANGULAR PROBLEM ARE */
00065 /*          DESIRED, Z MUST CONTAIN THE IDENTITY MATRIX. */
00066 
00067 /*     ON OUTPUT */
00068 
00069 /*        A IS UNALTERED.  ITS SUBDIAGONAL ELEMENTS PROVIDE INFORMATION */
00070 /*           ABOUT THE STORAGE OF THE COMPLEX EIGENVECTORS. */
00071 
00072 /*        B HAS BEEN DESTROYED. */
00073 
00074 /*        ALFR, ALFI, AND BETA ARE UNALTERED. */
00075 
00076 /*        Z CONTAINS THE REAL AND IMAGINARY PARTS OF THE EIGENVECTORS. */
00077 /*          IF ALFI(I) .EQ. 0.0, THE I-TH EIGENVALUE IS REAL AND */
00078 /*            THE I-TH COLUMN OF Z CONTAINS ITS EIGENVECTOR. */
00079 /*          IF ALFI(I) .NE. 0.0, THE I-TH EIGENVALUE IS COMPLEX. */
00080 /*            IF ALFI(I) .GT. 0.0, THE EIGENVALUE IS THE FIRST OF */
00081 /*              A COMPLEX PAIR AND THE I-TH AND (I+1)-TH COLUMNS */
00082 /*              OF Z CONTAIN ITS EIGENVECTOR. */
00083 /*            IF ALFI(I) .LT. 0.0, THE EIGENVALUE IS THE SECOND OF */
00084 /*              A COMPLEX PAIR AND THE (I-1)-TH AND I-TH COLUMNS */
00085 /*              OF Z CONTAIN THE CONJUGATE OF ITS EIGENVECTOR. */
00086 /*          EACH EIGENVECTOR IS NORMALIZED SO THAT THE MODULUS */
00087 /*          OF ITS LARGEST COMPONENT IS 1.0 . */
00088 
00089 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00090 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00091 */
00092 
00093 /*     THIS VERSION DATED AUGUST 1983. */
00094 
00095 /*     ------------------------------------------------------------------ 
00096 */
00097 
00098     /* Parameter adjustments */
00099     z_dim1 = *nm;
00100     z_offset = z_dim1 + 1;
00101     z__ -= z_offset;
00102     --beta;
00103     --alfi;
00104     --alfr;
00105     b_dim1 = *nm;
00106     b_offset = b_dim1 + 1;
00107     b -= b_offset;
00108     a_dim1 = *nm;
00109     a_offset = a_dim1 + 1;
00110     a -= a_offset;
00111 
00112     /* Function Body */
00113     epsb = b[*n + b_dim1];
00114     isw = 1;
00115 /*     .......... FOR EN=N STEP -1 UNTIL 1 DO -- .......... */
00116     i__1 = *n;
00117     for (nn = 1; nn <= i__1; ++nn) {
00118         en = *n + 1 - nn;
00119         na = en - 1;
00120         if (isw == 2) {
00121             goto L795;
00122         }
00123         if (alfi[en] != 0.) {
00124             goto L710;
00125         }
00126 /*     .......... REAL VECTOR .......... */
00127         m = en;
00128         b[en + en * b_dim1] = 1.;
00129         if (na == 0) {
00130             goto L800;
00131         }
00132         alfm = alfr[m];
00133         betm = beta[m];
00134 /*     .......... FOR I=EN-1 STEP -1 UNTIL 1 DO -- .......... */
00135         i__2 = na;
00136         for (ii = 1; ii <= i__2; ++ii) {
00137             i__ = en - ii;
00138             w = betm * a[i__ + i__ * a_dim1] - alfm * b[i__ + i__ * b_dim1];
00139             r__ = 0.;
00140 
00141             i__3 = en;
00142             for (j = m; j <= i__3; ++j) {
00143 /* L610: */
00144                 r__ += (betm * a[i__ + j * a_dim1] - alfm * b[i__ + j * 
00145                         b_dim1]) * b[j + en * b_dim1];
00146             }
00147 
00148             if (i__ == 1 || isw == 2) {
00149                 goto L630;
00150             }
00151             if (betm * a[i__ + (i__ - 1) * a_dim1] == 0.) {
00152                 goto L630;
00153             }
00154             zz = w;
00155             s = r__;
00156             goto L690;
00157 L630:
00158             m = i__;
00159             if (isw == 2) {
00160                 goto L640;
00161             }
00162 /*     .......... REAL 1-BY-1 BLOCK .......... */
00163             t = w;
00164             if (w == 0.) {
00165                 t = epsb;
00166             }
00167             b[i__ + en * b_dim1] = -r__ / t;
00168             goto L700;
00169 /*     .......... REAL 2-BY-2 BLOCK .......... */
00170 L640:
00171             x = betm * a[i__ + (i__ + 1) * a_dim1] - alfm * b[i__ + (i__ + 1) 
00172                     * b_dim1];
00173             y = betm * a[i__ + 1 + i__ * a_dim1];
00174             q = w * zz - x * y;
00175             t = (x * s - zz * r__) / q;
00176             b[i__ + en * b_dim1] = t;
00177             if (abs(x) <= abs(zz)) {
00178                 goto L650;
00179             }
00180             b[i__ + 1 + en * b_dim1] = (-r__ - w * t) / x;
00181             goto L690;
00182 L650:
00183             b[i__ + 1 + en * b_dim1] = (-s - y * t) / zz;
00184 L690:
00185             isw = 3 - isw;
00186 L700:
00187             ;
00188         }
00189 /*     .......... END REAL VECTOR .......... */
00190         goto L800;
00191 /*     .......... COMPLEX VECTOR .......... */
00192 L710:
00193         m = na;
00194         almr = alfr[m];
00195         almi = alfi[m];
00196         betm = beta[m];
00197 /*     .......... LAST VECTOR COMPONENT CHOSEN IMAGINARY SO THAT */
00198 /*                EIGENVECTOR MATRIX IS TRIANGULAR .......... */
00199         y = betm * a[en + na * a_dim1];
00200         b[na + na * b_dim1] = -almi * b[en + en * b_dim1] / y;
00201         b[na + en * b_dim1] = (almr * b[en + en * b_dim1] - betm * a[en + en *
00202                  a_dim1]) / y;
00203         b[en + na * b_dim1] = 0.;
00204         b[en + en * b_dim1] = 1.;
00205         enm2 = na - 1;
00206         if (enm2 == 0) {
00207             goto L795;
00208         }
00209 /*     .......... FOR I=EN-2 STEP -1 UNTIL 1 DO -- .......... */
00210         i__2 = enm2;
00211         for (ii = 1; ii <= i__2; ++ii) {
00212             i__ = na - ii;
00213             w = betm * a[i__ + i__ * a_dim1] - almr * b[i__ + i__ * b_dim1];
00214             w1 = -almi * b[i__ + i__ * b_dim1];
00215             ra = 0.;
00216             sa = 0.;
00217 
00218             i__3 = en;
00219             for (j = m; j <= i__3; ++j) {
00220                 x = betm * a[i__ + j * a_dim1] - almr * b[i__ + j * b_dim1];
00221                 x1 = -almi * b[i__ + j * b_dim1];
00222                 ra = ra + x * b[j + na * b_dim1] - x1 * b[j + en * b_dim1];
00223                 sa = sa + x * b[j + en * b_dim1] + x1 * b[j + na * b_dim1];
00224 /* L760: */
00225             }
00226 
00227             if (i__ == 1 || isw == 2) {
00228                 goto L770;
00229             }
00230             if (betm * a[i__ + (i__ - 1) * a_dim1] == 0.) {
00231                 goto L770;
00232             }
00233             zz = w;
00234             z1 = w1;
00235             r__ = ra;
00236             s = sa;
00237             isw = 2;
00238             goto L790;
00239 L770:
00240             m = i__;
00241             if (isw == 2) {
00242                 goto L780;
00243             }
00244 /*     .......... COMPLEX 1-BY-1 BLOCK .......... */
00245             tr = -ra;
00246             ti = -sa;
00247 L773:
00248             dr = w;
00249             di = w1;
00250 /*     .......... COMPLEX DIVIDE (T1,T2) = (TR,TI) / (DR,DI) .....
00251 ..... */
00252 L775:
00253             if (abs(di) > abs(dr)) {
00254                 goto L777;
00255             }
00256             rr = di / dr;
00257             d__ = dr + di * rr;
00258             t1 = (tr + ti * rr) / d__;
00259             t2 = (ti - tr * rr) / d__;
00260             switch (isw) {
00261                 case 1:  goto L787;
00262                 case 2:  goto L782;
00263             }
00264 L777:
00265             rr = dr / di;
00266             d__ = dr * rr + di;
00267             t1 = (tr * rr + ti) / d__;
00268             t2 = (ti * rr - tr) / d__;
00269             switch (isw) {
00270                 case 1:  goto L787;
00271                 case 2:  goto L782;
00272             }
00273 /*     .......... COMPLEX 2-BY-2 BLOCK .......... */
00274 L780:
00275             x = betm * a[i__ + (i__ + 1) * a_dim1] - almr * b[i__ + (i__ + 1) 
00276                     * b_dim1];
00277             x1 = -almi * b[i__ + (i__ + 1) * b_dim1];
00278             y = betm * a[i__ + 1 + i__ * a_dim1];
00279             tr = y * ra - w * r__ + w1 * s;
00280             ti = y * sa - w * s - w1 * r__;
00281             dr = w * zz - w1 * z1 - x * y;
00282             di = w * z1 + w1 * zz - x1 * y;
00283             if (dr == 0. && di == 0.) {
00284                 dr = epsb;
00285             }
00286             goto L775;
00287 L782:
00288             b[i__ + 1 + na * b_dim1] = t1;
00289             b[i__ + 1 + en * b_dim1] = t2;
00290             isw = 1;
00291             if (abs(y) > abs(w) + abs(w1)) {
00292                 goto L785;
00293             }
00294             tr = -ra - x * b[i__ + 1 + na * b_dim1] + x1 * b[i__ + 1 + en * 
00295                     b_dim1];
00296             ti = -sa - x * b[i__ + 1 + en * b_dim1] - x1 * b[i__ + 1 + na * 
00297                     b_dim1];
00298             goto L773;
00299 L785:
00300             t1 = (-r__ - zz * b[i__ + 1 + na * b_dim1] + z1 * b[i__ + 1 + en *
00301                      b_dim1]) / y;
00302             t2 = (-s - zz * b[i__ + 1 + en * b_dim1] - z1 * b[i__ + 1 + na * 
00303                     b_dim1]) / y;
00304 L787:
00305             b[i__ + na * b_dim1] = t1;
00306             b[i__ + en * b_dim1] = t2;
00307 L790:
00308             ;
00309         }
00310 /*     .......... END COMPLEX VECTOR .......... */
00311 L795:
00312         isw = 3 - isw;
00313 L800:
00314         ;
00315     }
00316 /*     .......... END BACK SUBSTITUTION. */
00317 /*                TRANSFORM TO ORIGINAL COORDINATE SYSTEM. */
00318 /*                FOR J=N STEP -1 UNTIL 1 DO -- .......... */
00319     i__1 = *n;
00320     for (jj = 1; jj <= i__1; ++jj) {
00321         j = *n + 1 - jj;
00322 
00323         i__2 = *n;
00324         for (i__ = 1; i__ <= i__2; ++i__) {
00325             zz = 0.;
00326 
00327             i__3 = j;
00328             for (k = 1; k <= i__3; ++k) {
00329 /* L860: */
00330                 zz += z__[i__ + k * z_dim1] * b[k + j * b_dim1];
00331             }
00332 
00333             z__[i__ + j * z_dim1] = zz;
00334 /* L880: */
00335         }
00336     }
00337 /*     .......... NORMALIZE SO THAT MODULUS OF LARGEST */
00338 /*                COMPONENT OF EACH VECTOR IS 1. */
00339 /*                (ISW IS 1 INITIALLY FROM BEFORE) .......... */
00340     i__2 = *n;
00341     for (j = 1; j <= i__2; ++j) {
00342         d__ = 0.;
00343         if (isw == 2) {
00344             goto L920;
00345         }
00346         if (alfi[j] != 0.) {
00347             goto L945;
00348         }
00349 
00350         i__1 = *n;
00351         for (i__ = 1; i__ <= i__1; ++i__) {
00352             if ((d__1 = z__[i__ + j * z_dim1], abs(d__1)) > d__) {
00353                 d__ = (d__2 = z__[i__ + j * z_dim1], abs(d__2));
00354             }
00355 /* L890: */
00356         }
00357 
00358         i__1 = *n;
00359         for (i__ = 1; i__ <= i__1; ++i__) {
00360 /* L900: */
00361             z__[i__ + j * z_dim1] /= d__;
00362         }
00363 
00364         goto L950;
00365 
00366 L920:
00367         i__1 = *n;
00368         for (i__ = 1; i__ <= i__1; ++i__) {
00369             r__ = (d__1 = z__[i__ + (j - 1) * z_dim1], abs(d__1)) + (d__2 = 
00370                     z__[i__ + j * z_dim1], abs(d__2));
00371             if (r__ != 0.) {
00372 /* Computing 2nd power */
00373                 d__1 = z__[i__ + (j - 1) * z_dim1] / r__;
00374 /* Computing 2nd power */
00375                 d__2 = z__[i__ + j * z_dim1] / r__;
00376                 r__ *= sqrt(d__1 * d__1 + d__2 * d__2);
00377             }
00378             if (r__ > d__) {
00379                 d__ = r__;
00380             }
00381 /* L930: */
00382         }
00383 
00384         i__1 = *n;
00385         for (i__ = 1; i__ <= i__1; ++i__) {
00386             z__[i__ + (j - 1) * z_dim1] /= d__;
00387             z__[i__ + j * z_dim1] /= d__;
00388 /* L940: */
00389         }
00390 
00391 L945:
00392         isw = 3 - isw;
00393 L950:
00394         ;
00395     }
00396 
00397     return 0;
00398 } /* qzvec_ */

int ratqr_ integer   n,
doublereal   eps1,
doublereal   d__,
doublereal   e,
doublereal   e2,
integer   m,
doublereal   w,
integer   ind,
doublereal   bd,
logical   type__,
integer   idef,
integer   ierr
 

Definition at line 8 of file eis_ratqr.c.

References abs, ep, epslon_(), ind, min, p, and q.

00011 {
00012     /* System generated locals */
00013     integer i__1, i__2;
00014     doublereal d__1, d__2, d__3;
00015 
00016     /* Local variables */
00017     static integer jdef;
00018     static doublereal f;
00019     static integer i__, j, k;
00020     static doublereal p, q, r__, s, delta;
00021     static integer k1, ii, jj;
00022     static doublereal ep, qp;
00023     extern doublereal epslon_(doublereal *);
00024     static doublereal err, tot;
00025 
00026 
00027 
00028 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE RATQR, */
00029 /*     NUM. MATH. 11, 264-272(1968) BY REINSCH AND BAUER. */
00030 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 257-265(1971). */
00031 
00032 /*     THIS SUBROUTINE FINDS THE ALGEBRAICALLY SMALLEST OR LARGEST */
00033 /*     EIGENVALUES OF A SYMMETRIC TRIDIAGONAL MATRIX BY THE */
00034 /*     RATIONAL QR METHOD WITH NEWTON CORRECTIONS. */
00035 
00036 /*     ON INPUT */
00037 
00038 /*        N IS THE ORDER OF THE MATRIX. */
00039 
00040 /*        EPS1 IS A THEORETICAL ABSOLUTE ERROR TOLERANCE FOR THE */
00041 /*          COMPUTED EIGENVALUES.  IF THE INPUT EPS1 IS NON-POSITIVE, */
00042 /*          OR INDEED SMALLER THAN ITS DEFAULT VALUE, IT IS RESET */
00043 /*          AT EACH ITERATION TO THE RESPECTIVE DEFAULT VALUE, */
00044 /*          NAMELY, THE PRODUCT OF THE RELATIVE MACHINE PRECISION */
00045 /*          AND THE MAGNITUDE OF THE CURRENT EIGENVALUE ITERATE. */
00046 /*          THE THEORETICAL ABSOLUTE ERROR IN THE K-TH EIGENVALUE */
00047 /*          IS USUALLY NOT GREATER THAN K TIMES EPS1. */
00048 
00049 /*        D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX. */
00050 
00051 /*        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX */
00052 /*          IN ITS LAST N-1 POSITIONS.  E(1) IS ARBITRARY. */
00053 
00054 /*        E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E. */
00055 /*          E2(1) IS ARBITRARY. */
00056 
00057 /*        M IS THE NUMBER OF EIGENVALUES TO BE FOUND. */
00058 
00059 /*        IDEF SHOULD BE SET TO 1 IF THE INPUT MATRIX IS KNOWN TO BE */
00060 /*          POSITIVE DEFINITE, TO -1 IF THE INPUT MATRIX IS KNOWN TO */
00061 /*          BE NEGATIVE DEFINITE, AND TO 0 OTHERWISE. */
00062 
00063 /*        TYPE SHOULD BE SET TO .TRUE. IF THE SMALLEST EIGENVALUES */
00064 /*          ARE TO BE FOUND, AND TO .FALSE. IF THE LARGEST EIGENVALUES */
00065 /*          ARE TO BE FOUND. */
00066 
00067 /*     ON OUTPUT */
00068 
00069 /*        EPS1 IS UNALTERED UNLESS IT HAS BEEN RESET TO ITS */
00070 /*          (LAST) DEFAULT VALUE. */
00071 
00072 /*        D AND E ARE UNALTERED (UNLESS W OVERWRITES D). */
00073 
00074 /*        ELEMENTS OF E2, CORRESPONDING TO ELEMENTS OF E REGARDED */
00075 /*          AS NEGLIGIBLE, HAVE BEEN REPLACED BY ZERO CAUSING THE */
00076 /*          MATRIX TO SPLIT INTO A DIRECT SUM OF SUBMATRICES. */
00077 /*          E2(1) IS SET TO 0.0D0 IF THE SMALLEST EIGENVALUES HAVE BEEN */
00078 /*          FOUND, AND TO 2.0D0 IF THE LARGEST EIGENVALUES HAVE BEEN */
00079 /*          FOUND.  E2 IS OTHERWISE UNALTERED (UNLESS OVERWRITTEN BY BD). 
00080 */
00081 
00082 /*        W CONTAINS THE M ALGEBRAICALLY SMALLEST EIGENVALUES IN */
00083 /*          ASCENDING ORDER, OR THE M LARGEST EIGENVALUES IN */
00084 /*          DESCENDING ORDER.  IF AN ERROR EXIT IS MADE BECAUSE OF */
00085 /*          AN INCORRECT SPECIFICATION OF IDEF, NO EIGENVALUES */
00086 /*          ARE FOUND.  IF THE NEWTON ITERATES FOR A PARTICULAR */
00087 /*          EIGENVALUE ARE NOT MONOTONE, THE BEST ESTIMATE OBTAINED */
00088 /*          IS RETURNED AND IERR IS SET.  W MAY COINCIDE WITH D. */
00089 
00090 /*        IND CONTAINS IN ITS FIRST M POSITIONS THE SUBMATRIX INDICES */
00091 /*          ASSOCIATED WITH THE CORRESPONDING EIGENVALUES IN W -- */
00092 /*          1 FOR EIGENVALUES BELONGING TO THE FIRST SUBMATRIX FROM */
00093 /*          THE TOP, 2 FOR THOSE BELONGING TO THE SECOND SUBMATRIX, ETC.. 
00094 */
00095 
00096 /*        BD CONTAINS REFINED BOUNDS FOR THE THEORETICAL ERRORS OF THE */
00097 /*          CORRESPONDING EIGENVALUES IN W.  THESE BOUNDS ARE USUALLY */
00098 /*          WITHIN THE TOLERANCE SPECIFIED BY EPS1.  BD MAY COINCIDE */
00099 /*          WITH E2. */
00100 
00101 /*        IERR IS SET TO */
00102 /*          ZERO       FOR NORMAL RETURN, */
00103 /*          6*N+1      IF  IDEF  IS SET TO 1 AND  TYPE  TO .TRUE. */
00104 /*                     WHEN THE MATRIX IS NOT POSITIVE DEFINITE, OR */
00105 /*                     IF  IDEF  IS SET TO -1 AND  TYPE  TO .FALSE. */
00106 /*                     WHEN THE MATRIX IS NOT NEGATIVE DEFINITE, */
00107 /*          5*N+K      IF SUCCESSIVE ITERATES TO THE K-TH EIGENVALUE */
00108 /*                     ARE NOT MONOTONE INCREASING, WHERE K REFERS */
00109 /*                     TO THE LAST SUCH OCCURRENCE. */
00110 
00111 /*     NOTE THAT SUBROUTINE TRIDIB IS GENERALLY FASTER AND MORE */
00112 /*     ACCURATE THAN RATQR IF THE EIGENVALUES ARE CLUSTERED. */
00113 
00114 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00115 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00116 */
00117 
00118 /*     THIS VERSION DATED AUGUST 1983. */
00119 
00120 /*     ------------------------------------------------------------------ 
00121 */
00122 
00123     /* Parameter adjustments */
00124     --bd;
00125     --ind;
00126     --w;
00127     --e2;
00128     --e;
00129     --d__;
00130 
00131     /* Function Body */
00132     *ierr = 0;
00133     jdef = *idef;
00134 /*     .......... COPY D ARRAY INTO W .......... */
00135     i__1 = *n;
00136     for (i__ = 1; i__ <= i__1; ++i__) {
00137 /* L20: */
00138         w[i__] = d__[i__];
00139     }
00140 
00141     if (*type__) {
00142         goto L40;
00143     }
00144     j = 1;
00145     goto L400;
00146 L40:
00147     err = 0.;
00148     s = 0.;
00149 /*     .......... LOOK FOR SMALL SUB-DIAGONAL ENTRIES AND DEFINE */
00150 /*                INITIAL SHIFT FROM LOWER GERSCHGORIN BOUND. */
00151 /*                COPY E2 ARRAY INTO BD .......... */
00152     tot = w[1];
00153     q = 0.;
00154     j = 0;
00155 
00156     i__1 = *n;
00157     for (i__ = 1; i__ <= i__1; ++i__) {
00158         p = q;
00159         if (i__ == 1) {
00160             goto L60;
00161         }
00162         d__3 = (d__1 = d__[i__], abs(d__1)) + (d__2 = d__[i__ - 1], abs(d__2))
00163                 ;
00164         if (p > epslon_(&d__3)) {
00165             goto L80;
00166         }
00167 L60:
00168         e2[i__] = 0.;
00169 L80:
00170         bd[i__] = e2[i__];
00171 /*     .......... COUNT ALSO IF ELEMENT OF E2 HAS UNDERFLOWED ........
00172 .. */
00173         if (e2[i__] == 0.) {
00174             ++j;
00175         }
00176         ind[i__] = j;
00177         q = 0.;
00178         if (i__ != *n) {
00179             q = (d__1 = e[i__ + 1], abs(d__1));
00180         }
00181 /* Computing MIN */
00182         d__1 = w[i__] - p - q;
00183         tot = min(d__1,tot);
00184 /* L100: */
00185     }
00186 
00187     if (jdef == 1 && tot < 0.) {
00188         goto L140;
00189     }
00190 
00191     i__1 = *n;
00192     for (i__ = 1; i__ <= i__1; ++i__) {
00193 /* L110: */
00194         w[i__] -= tot;
00195     }
00196 
00197     goto L160;
00198 L140:
00199     tot = 0.;
00200 
00201 L160:
00202     i__1 = *m;
00203     for (k = 1; k <= i__1; ++k) {
00204 /*     .......... NEXT QR TRANSFORMATION .......... */
00205 L180:
00206         tot += s;
00207         delta = w[*n] - s;
00208         i__ = *n;
00209         f = (d__1 = epslon_(&tot), abs(d__1));
00210         if (*eps1 < f) {
00211             *eps1 = f;
00212         }
00213         if (delta > *eps1) {
00214             goto L190;
00215         }
00216         if (delta < -(*eps1)) {
00217             goto L1000;
00218         }
00219         goto L300;
00220 /*     .......... REPLACE SMALL SUB-DIAGONAL SQUARES BY ZERO */
00221 /*                TO REDUCE THE INCIDENCE OF UNDERFLOWS .......... */
00222 L190:
00223         if (k == *n) {
00224             goto L210;
00225         }
00226         k1 = k + 1;
00227         i__2 = *n;
00228         for (j = k1; j <= i__2; ++j) {
00229             d__2 = w[j] + w[j - 1];
00230 /* Computing 2nd power */
00231             d__1 = epslon_(&d__2);
00232             if (bd[j] <= d__1 * d__1) {
00233                 bd[j] = 0.;
00234             }
00235 /* L200: */
00236         }
00237 
00238 L210:
00239         f = bd[*n] / delta;
00240         qp = delta + f;
00241         p = 1.;
00242         if (k == *n) {
00243             goto L260;
00244         }
00245         k1 = *n - k;
00246 /*     .......... FOR I=N-1 STEP -1 UNTIL K DO -- .......... */
00247         i__2 = k1;
00248         for (ii = 1; ii <= i__2; ++ii) {
00249             i__ = *n - ii;
00250             q = w[i__] - s - f;
00251             r__ = q / qp;
00252             p = p * r__ + 1.;
00253             ep = f * r__;
00254             w[i__ + 1] = qp + ep;
00255             delta = q - ep;
00256             if (delta > *eps1) {
00257                 goto L220;
00258             }
00259             if (delta < -(*eps1)) {
00260                 goto L1000;
00261             }
00262             goto L300;
00263 L220:
00264             f = bd[i__] / q;
00265             qp = delta + f;
00266             bd[i__ + 1] = qp * ep;
00267 /* L240: */
00268         }
00269 
00270 L260:
00271         w[k] = qp;
00272         s = qp / p;
00273         if (tot + s > tot) {
00274             goto L180;
00275         }
00276 /*     .......... SET ERROR -- IRREGULAR END OF ITERATION. */
00277 /*                DEFLATE MINIMUM DIAGONAL ELEMENT .......... */
00278         *ierr = *n * 5 + k;
00279         s = 0.;
00280         delta = qp;
00281 
00282         i__2 = *n;
00283         for (j = k; j <= i__2; ++j) {
00284             if (w[j] > delta) {
00285                 goto L280;
00286             }
00287             i__ = j;
00288             delta = w[j];
00289 L280:
00290             ;
00291         }
00292 /*     .......... CONVERGENCE .......... */
00293 L300:
00294         if (i__ < *n) {
00295             bd[i__ + 1] = bd[i__] * f / qp;
00296         }
00297         ii = ind[i__];
00298         if (i__ == k) {
00299             goto L340;
00300         }
00301         k1 = i__ - k;
00302 /*     .......... FOR J=I-1 STEP -1 UNTIL K DO -- .......... */
00303         i__2 = k1;
00304         for (jj = 1; jj <= i__2; ++jj) {
00305             j = i__ - jj;
00306             w[j + 1] = w[j] - s;
00307             bd[j + 1] = bd[j];
00308             ind[j + 1] = ind[j];
00309 /* L320: */
00310         }
00311 
00312 L340:
00313         w[k] = tot;
00314         err += abs(delta);
00315         bd[k] = err;
00316         ind[k] = ii;
00317 /* L360: */
00318     }
00319 
00320     if (*type__) {
00321         goto L1001;
00322     }
00323     f = bd[1];
00324     e2[1] = 2.;
00325     bd[1] = f;
00326     j = 2;
00327 /*     .......... NEGATE ELEMENTS OF W FOR LARGEST VALUES .......... */
00328 L400:
00329     i__1 = *n;
00330     for (i__ = 1; i__ <= i__1; ++i__) {
00331 /* L500: */
00332         w[i__] = -w[i__];
00333     }
00334 
00335     jdef = -jdef;
00336     switch (j) {
00337         case 1:  goto L40;
00338         case 2:  goto L1001;
00339     }
00340 /*     .......... SET ERROR -- IDEF SPECIFIED INCORRECTLY .......... */
00341 L1000:
00342     *ierr = *n * 6 + 1;
00343 L1001:
00344     return 0;
00345 } /* ratqr_ */

int rebak_ integer   nm,
integer   n,
doublereal   b,
doublereal   dl,
integer   m,
doublereal   z__
 

Definition at line 8 of file eis_rebak.c.

References i1.

Referenced by rsg_(), and rsgab_().

00010 {
00011     /* System generated locals */
00012     integer b_dim1, b_offset, z_dim1, z_offset, i__1, i__2, i__3;
00013 
00014     /* Local variables */
00015     static integer i__, j, k;
00016     static doublereal x;
00017     static integer i1, ii;
00018 
00019 
00020 
00021 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE REBAKA, */
00022 /*     NUM. MATH. 11, 99-110(1968) BY MARTIN AND WILKINSON. */
00023 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 303-314(1971). */
00024 
00025 /*     THIS SUBROUTINE FORMS THE EIGENVECTORS OF A GENERALIZED */
00026 /*     SYMMETRIC EIGENSYSTEM BY BACK TRANSFORMING THOSE OF THE */
00027 /*     DERIVED SYMMETRIC MATRIX DETERMINED BY  REDUC. */
00028 
00029 /*     ON INPUT */
00030 
00031 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00032 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00033 /*          DIMENSION STATEMENT. */
00034 
00035 /*        N IS THE ORDER OF THE MATRIX SYSTEM. */
00036 
00037 /*        B CONTAINS INFORMATION ABOUT THE SIMILARITY TRANSFORMATION */
00038 /*          (CHOLESKY DECOMPOSITION) USED IN THE REDUCTION BY  REDUC */
00039 /*          IN ITS STRICT LOWER TRIANGLE. */
00040 
00041 /*        DL CONTAINS FURTHER INFORMATION ABOUT THE TRANSFORMATION. */
00042 
00043 /*        M IS THE NUMBER OF EIGENVECTORS TO BE BACK TRANSFORMED. */
00044 
00045 /*        Z CONTAINS THE EIGENVECTORS TO BE BACK TRANSFORMED */
00046 /*          IN ITS FIRST M COLUMNS. */
00047 
00048 /*     ON OUTPUT */
00049 
00050 /*        Z CONTAINS THE TRANSFORMED EIGENVECTORS */
00051 /*          IN ITS FIRST M COLUMNS. */
00052 
00053 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00054 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00055 */
00056 
00057 /*     THIS VERSION DATED AUGUST 1983. */
00058 
00059 /*     ------------------------------------------------------------------ 
00060 */
00061 
00062     /* Parameter adjustments */
00063     --dl;
00064     b_dim1 = *nm;
00065     b_offset = b_dim1 + 1;
00066     b -= b_offset;
00067     z_dim1 = *nm;
00068     z_offset = z_dim1 + 1;
00069     z__ -= z_offset;
00070 
00071     /* Function Body */
00072     if (*m == 0) {
00073         goto L200;
00074     }
00075 
00076     i__1 = *m;
00077     for (j = 1; j <= i__1; ++j) {
00078 /*     .......... FOR I=N STEP -1 UNTIL 1 DO -- .......... */
00079         i__2 = *n;
00080         for (ii = 1; ii <= i__2; ++ii) {
00081             i__ = *n + 1 - ii;
00082             i1 = i__ + 1;
00083             x = z__[i__ + j * z_dim1];
00084             if (i__ == *n) {
00085                 goto L80;
00086             }
00087 
00088             i__3 = *n;
00089             for (k = i1; k <= i__3; ++k) {
00090 /* L60: */
00091                 x -= b[k + i__ * b_dim1] * z__[k + j * z_dim1];
00092             }
00093 
00094 L80:
00095             z__[i__ + j * z_dim1] = x / dl[i__];
00096 /* L100: */
00097         }
00098     }
00099 
00100 L200:
00101     return 0;
00102 } /* rebak_ */

int rebakb_ integer   nm,
integer   n,
doublereal   b,
doublereal   dl,
integer   m,
doublereal   z__
 

Definition at line 8 of file eis_rebakb.c.

References i1.

Referenced by rsgba_().

00010 {
00011     /* System generated locals */
00012     integer b_dim1, b_offset, z_dim1, z_offset, i__1, i__2, i__3;
00013 
00014     /* Local variables */
00015     static integer i__, j, k;
00016     static doublereal x;
00017     static integer i1, ii;
00018 
00019 
00020 
00021 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE REBAKB, */
00022 /*     NUM. MATH. 11, 99-110(1968) BY MARTIN AND WILKINSON. */
00023 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 303-314(1971). */
00024 
00025 /*     THIS SUBROUTINE FORMS THE EIGENVECTORS OF A GENERALIZED */
00026 /*     SYMMETRIC EIGENSYSTEM BY BACK TRANSFORMING THOSE OF THE */
00027 /*     DERIVED SYMMETRIC MATRIX DETERMINED BY  REDUC2. */
00028 
00029 /*     ON INPUT */
00030 
00031 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00032 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00033 /*          DIMENSION STATEMENT. */
00034 
00035 /*        N IS THE ORDER OF THE MATRIX SYSTEM. */
00036 
00037 /*        B CONTAINS INFORMATION ABOUT THE SIMILARITY TRANSFORMATION */
00038 /*          (CHOLESKY DECOMPOSITION) USED IN THE REDUCTION BY  REDUC2 */
00039 /*          IN ITS STRICT LOWER TRIANGLE. */
00040 
00041 /*        DL CONTAINS FURTHER INFORMATION ABOUT THE TRANSFORMATION. */
00042 
00043 /*        M IS THE NUMBER OF EIGENVECTORS TO BE BACK TRANSFORMED. */
00044 
00045 /*        Z CONTAINS THE EIGENVECTORS TO BE BACK TRANSFORMED */
00046 /*          IN ITS FIRST M COLUMNS. */
00047 
00048 /*     ON OUTPUT */
00049 
00050 /*        Z CONTAINS THE TRANSFORMED EIGENVECTORS */
00051 /*          IN ITS FIRST M COLUMNS. */
00052 
00053 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00054 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00055 */
00056 
00057 /*     THIS VERSION DATED AUGUST 1983. */
00058 
00059 /*     ------------------------------------------------------------------ 
00060 */
00061 
00062     /* Parameter adjustments */
00063     --dl;
00064     b_dim1 = *nm;
00065     b_offset = b_dim1 + 1;
00066     b -= b_offset;
00067     z_dim1 = *nm;
00068     z_offset = z_dim1 + 1;
00069     z__ -= z_offset;
00070 
00071     /* Function Body */
00072     if (*m == 0) {
00073         goto L200;
00074     }
00075 
00076     i__1 = *m;
00077     for (j = 1; j <= i__1; ++j) {
00078 /*     .......... FOR I=N STEP -1 UNTIL 1 DO -- .......... */
00079         i__2 = *n;
00080         for (ii = 1; ii <= i__2; ++ii) {
00081             i1 = *n - ii;
00082             i__ = i1 + 1;
00083             x = dl[i__] * z__[i__ + j * z_dim1];
00084             if (i__ == 1) {
00085                 goto L80;
00086             }
00087 
00088             i__3 = i1;
00089             for (k = 1; k <= i__3; ++k) {
00090 /* L60: */
00091                 x += b[i__ + k * b_dim1] * z__[k + j * z_dim1];
00092             }
00093 
00094 L80:
00095             z__[i__ + j * z_dim1] = x;
00096 /* L100: */
00097         }
00098     }
00099 
00100 L200:
00101     return 0;
00102 } /* rebakb_ */

int reduc2_ integer   nm,
integer   n,
doublereal   a,
doublereal   b,
doublereal   dl,
integer   ierr
 

Definition at line 8 of file eis_reduc2.c.

References a, abs, and i1.

Referenced by rsgab_(), and rsgba_().

00010 {
00011     /* System generated locals */
00012     integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3;
00013 
00014     /* Builtin functions */
00015     double sqrt(doublereal);
00016 
00017     /* Local variables */
00018     static integer i__, j, k;
00019     static doublereal x, y;
00020     static integer i1, j1, nn;
00021 
00022 
00023 
00024 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE REDUC2, */
00025 /*     NUM. MATH. 11, 99-110(1968) BY MARTIN AND WILKINSON. */
00026 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 303-314(1971). */
00027 
00028 /*     THIS SUBROUTINE REDUCES THE GENERALIZED SYMMETRIC EIGENPROBLEMS */
00029 /*     ABX=(LAMBDA)X OR BAY=(LAMBDA)Y, WHERE B IS POSITIVE DEFINITE, */
00030 /*     TO THE STANDARD SYMMETRIC EIGENPROBLEM USING THE CHOLESKY */
00031 /*     FACTORIZATION OF B. */
00032 
00033 /*     ON INPUT */
00034 
00035 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00036 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00037 /*          DIMENSION STATEMENT. */
00038 
00039 /*        N IS THE ORDER OF THE MATRICES A AND B.  IF THE CHOLESKY */
00040 /*          FACTOR L OF B IS ALREADY AVAILABLE, N SHOULD BE PREFIXED */
00041 /*          WITH A MINUS SIGN. */
00042 
00043 /*        A AND B CONTAIN THE REAL SYMMETRIC INPUT MATRICES.  ONLY THE */
00044 /*          FULL UPPER TRIANGLES OF THE MATRICES NEED BE SUPPLIED.  IF */
00045 /*          N IS NEGATIVE, THE STRICT LOWER TRIANGLE OF B CONTAINS, */
00046 /*          INSTEAD, THE STRICT LOWER TRIANGLE OF ITS CHOLESKY FACTOR L. 
00047 */
00048 
00049 /*        DL CONTAINS, IF N IS NEGATIVE, THE DIAGONAL ELEMENTS OF L. */
00050 
00051 /*     ON OUTPUT */
00052 
00053 /*        A CONTAINS IN ITS FULL LOWER TRIANGLE THE FULL LOWER TRIANGLE */
00054 /*          OF THE SYMMETRIC MATRIX DERIVED FROM THE REDUCTION TO THE */
00055 /*          STANDARD FORM.  THE STRICT UPPER TRIANGLE OF A IS UNALTERED. 
00056 */
00057 
00058 /*        B CONTAINS IN ITS STRICT LOWER TRIANGLE THE STRICT LOWER */
00059 /*          TRIANGLE OF ITS CHOLESKY FACTOR L.  THE FULL UPPER */
00060 /*          TRIANGLE OF B IS UNALTERED. */
00061 
00062 /*        DL CONTAINS THE DIAGONAL ELEMENTS OF L. */
00063 
00064 /*        IERR IS SET TO */
00065 /*          ZERO       FOR NORMAL RETURN, */
00066 /*          7*N+1      IF B IS NOT POSITIVE DEFINITE. */
00067 
00068 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00069 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00070 */
00071 
00072 /*     THIS VERSION DATED AUGUST 1983. */
00073 
00074 /*     ------------------------------------------------------------------ 
00075 */
00076 
00077     /* Parameter adjustments */
00078     --dl;
00079     b_dim1 = *nm;
00080     b_offset = b_dim1 + 1;
00081     b -= b_offset;
00082     a_dim1 = *nm;
00083     a_offset = a_dim1 + 1;
00084     a -= a_offset;
00085 
00086     /* Function Body */
00087     *ierr = 0;
00088     nn = abs(*n);
00089     if (*n < 0) {
00090         goto L100;
00091     }
00092 /*     .......... FORM L IN THE ARRAYS B AND DL .......... */
00093     i__1 = *n;
00094     for (i__ = 1; i__ <= i__1; ++i__) {
00095         i1 = i__ - 1;
00096 
00097         i__2 = *n;
00098         for (j = i__; j <= i__2; ++j) {
00099             x = b[i__ + j * b_dim1];
00100             if (i__ == 1) {
00101                 goto L40;
00102             }
00103 
00104             i__3 = i1;
00105             for (k = 1; k <= i__3; ++k) {
00106 /* L20: */
00107                 x -= b[i__ + k * b_dim1] * b[j + k * b_dim1];
00108             }
00109 
00110 L40:
00111             if (j != i__) {
00112                 goto L60;
00113             }
00114             if (x <= 0.) {
00115                 goto L1000;
00116             }
00117             y = sqrt(x);
00118             dl[i__] = y;
00119             goto L80;
00120 L60:
00121             b[j + i__ * b_dim1] = x / y;
00122 L80:
00123             ;
00124         }
00125     }
00126 /*     .......... FORM THE LOWER TRIANGLE OF A*L */
00127 /*                IN THE LOWER TRIANGLE OF THE ARRAY A .......... */
00128 L100:
00129     i__2 = nn;
00130     for (i__ = 1; i__ <= i__2; ++i__) {
00131         i1 = i__ + 1;
00132 
00133         i__1 = i__;
00134         for (j = 1; j <= i__1; ++j) {
00135             x = a[j + i__ * a_dim1] * dl[j];
00136             if (j == i__) {
00137                 goto L140;
00138             }
00139             j1 = j + 1;
00140 
00141             i__3 = i__;
00142             for (k = j1; k <= i__3; ++k) {
00143 /* L120: */
00144                 x += a[k + i__ * a_dim1] * b[k + j * b_dim1];
00145             }
00146 
00147 L140:
00148             if (i__ == nn) {
00149                 goto L180;
00150             }
00151 
00152             i__3 = nn;
00153             for (k = i1; k <= i__3; ++k) {
00154 /* L160: */
00155                 x += a[i__ + k * a_dim1] * b[k + j * b_dim1];
00156             }
00157 
00158 L180:
00159             a[i__ + j * a_dim1] = x;
00160 /* L200: */
00161         }
00162     }
00163 /*     .......... PRE-MULTIPLY BY TRANSPOSE(L) AND OVERWRITE .......... */
00164     i__1 = nn;
00165     for (i__ = 1; i__ <= i__1; ++i__) {
00166         i1 = i__ + 1;
00167         y = dl[i__];
00168 
00169         i__2 = i__;
00170         for (j = 1; j <= i__2; ++j) {
00171             x = y * a[i__ + j * a_dim1];
00172             if (i__ == nn) {
00173                 goto L280;
00174             }
00175 
00176             i__3 = nn;
00177             for (k = i1; k <= i__3; ++k) {
00178 /* L260: */
00179                 x += a[k + j * a_dim1] * b[k + i__ * b_dim1];
00180             }
00181 
00182 L280:
00183             a[i__ + j * a_dim1] = x;
00184 /* L300: */
00185         }
00186     }
00187 
00188     goto L1001;
00189 /*     .......... SET ERROR -- B IS NOT POSITIVE DEFINITE .......... */
00190 L1000:
00191     *ierr = *n * 7 + 1;
00192 L1001:
00193     return 0;
00194 } /* reduc2_ */

int reduc_ integer   nm,
integer   n,
doublereal   a,
doublereal   b,
doublereal   dl,
integer   ierr
 

Definition at line 8 of file eis_reduc.c.

References a, abs, and i1.

Referenced by rsg_().

00010 {
00011     /* System generated locals */
00012     integer a_dim1, a_offset, b_dim1, b_offset, i__1, i__2, i__3;
00013 
00014     /* Builtin functions */
00015     double sqrt(doublereal);
00016 
00017     /* Local variables */
00018     static integer i__, j, k;
00019     static doublereal x, y;
00020     static integer i1, j1, nn;
00021 
00022 
00023 
00024 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE REDUC1, */
00025 /*     NUM. MATH. 11, 99-110(1968) BY MARTIN AND WILKINSON. */
00026 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 303-314(1971). */
00027 
00028 /*     THIS SUBROUTINE REDUCES THE GENERALIZED SYMMETRIC EIGENPROBLEM */
00029 /*     AX=(LAMBDA)BX, WHERE B IS POSITIVE DEFINITE, TO THE STANDARD */
00030 /*     SYMMETRIC EIGENPROBLEM USING THE CHOLESKY FACTORIZATION OF B. */
00031 
00032 /*     ON INPUT */
00033 
00034 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00035 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00036 /*          DIMENSION STATEMENT. */
00037 
00038 /*        N IS THE ORDER OF THE MATRICES A AND B.  IF THE CHOLESKY */
00039 /*          FACTOR L OF B IS ALREADY AVAILABLE, N SHOULD BE PREFIXED */
00040 /*          WITH A MINUS SIGN. */
00041 
00042 /*        A AND B CONTAIN THE REAL SYMMETRIC INPUT MATRICES.  ONLY THE */
00043 /*          FULL UPPER TRIANGLES OF THE MATRICES NEED BE SUPPLIED.  IF */
00044 /*          N IS NEGATIVE, THE STRICT LOWER TRIANGLE OF B CONTAINS, */
00045 /*          INSTEAD, THE STRICT LOWER TRIANGLE OF ITS CHOLESKY FACTOR L. 
00046 */
00047 
00048 /*        DL CONTAINS, IF N IS NEGATIVE, THE DIAGONAL ELEMENTS OF L. */
00049 
00050 /*     ON OUTPUT */
00051 
00052 /*        A CONTAINS IN ITS FULL LOWER TRIANGLE THE FULL LOWER TRIANGLE */
00053 /*          OF THE SYMMETRIC MATRIX DERIVED FROM THE REDUCTION TO THE */
00054 /*          STANDARD FORM.  THE STRICT UPPER TRIANGLE OF A IS UNALTERED. 
00055 */
00056 
00057 /*        B CONTAINS IN ITS STRICT LOWER TRIANGLE THE STRICT LOWER */
00058 /*          TRIANGLE OF ITS CHOLESKY FACTOR L.  THE FULL UPPER */
00059 /*          TRIANGLE OF B IS UNALTERED. */
00060 
00061 /*        DL CONTAINS THE DIAGONAL ELEMENTS OF L. */
00062 
00063 /*        IERR IS SET TO */
00064 /*          ZERO       FOR NORMAL RETURN, */
00065 /*          7*N+1      IF B IS NOT POSITIVE DEFINITE. */
00066 
00067 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00068 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00069 */
00070 
00071 /*     THIS VERSION DATED AUGUST 1983. */
00072 
00073 /*     ------------------------------------------------------------------ 
00074 */
00075 
00076     /* Parameter adjustments */
00077     --dl;
00078     b_dim1 = *nm;
00079     b_offset = b_dim1 + 1;
00080     b -= b_offset;
00081     a_dim1 = *nm;
00082     a_offset = a_dim1 + 1;
00083     a -= a_offset;
00084 
00085     /* Function Body */
00086     *ierr = 0;
00087     nn = abs(*n);
00088     if (*n < 0) {
00089         goto L100;
00090     }
00091 /*     .......... FORM L IN THE ARRAYS B AND DL .......... */
00092     i__1 = *n;
00093     for (i__ = 1; i__ <= i__1; ++i__) {
00094         i1 = i__ - 1;
00095 
00096         i__2 = *n;
00097         for (j = i__; j <= i__2; ++j) {
00098             x = b[i__ + j * b_dim1];
00099             if (i__ == 1) {
00100                 goto L40;
00101             }
00102 
00103             i__3 = i1;
00104             for (k = 1; k <= i__3; ++k) {
00105 /* L20: */
00106                 x -= b[i__ + k * b_dim1] * b[j + k * b_dim1];
00107             }
00108 
00109 L40:
00110             if (j != i__) {
00111                 goto L60;
00112             }
00113             if (x <= 0.) {
00114                 goto L1000;
00115             }
00116             y = sqrt(x);
00117             dl[i__] = y;
00118             goto L80;
00119 L60:
00120             b[j + i__ * b_dim1] = x / y;
00121 L80:
00122             ;
00123         }
00124     }
00125 /*     .......... FORM THE TRANSPOSE OF THE UPPER TRIANGLE OF INV(L)*A */
00126 /*                IN THE LOWER TRIANGLE OF THE ARRAY A .......... */
00127 L100:
00128     i__2 = nn;
00129     for (i__ = 1; i__ <= i__2; ++i__) {
00130         i1 = i__ - 1;
00131         y = dl[i__];
00132 
00133         i__1 = nn;
00134         for (j = i__; j <= i__1; ++j) {
00135             x = a[i__ + j * a_dim1];
00136             if (i__ == 1) {
00137                 goto L180;
00138             }
00139 
00140             i__3 = i1;
00141             for (k = 1; k <= i__3; ++k) {
00142 /* L160: */
00143                 x -= b[i__ + k * b_dim1] * a[j + k * a_dim1];
00144             }
00145 
00146 L180:
00147             a[j + i__ * a_dim1] = x / y;
00148 /* L200: */
00149         }
00150     }
00151 /*     .......... PRE-MULTIPLY BY INV(L) AND OVERWRITE .......... */
00152     i__1 = nn;
00153     for (j = 1; j <= i__1; ++j) {
00154         j1 = j - 1;
00155 
00156         i__2 = nn;
00157         for (i__ = j; i__ <= i__2; ++i__) {
00158             x = a[i__ + j * a_dim1];
00159             if (i__ == j) {
00160                 goto L240;
00161             }
00162             i1 = i__ - 1;
00163 
00164             i__3 = i1;
00165             for (k = j; k <= i__3; ++k) {
00166 /* L220: */
00167                 x -= a[k + j * a_dim1] * b[i__ + k * b_dim1];
00168             }
00169 
00170 L240:
00171             if (j == 1) {
00172                 goto L280;
00173             }
00174 
00175             i__3 = j1;
00176             for (k = 1; k <= i__3; ++k) {
00177 /* L260: */
00178                 x -= a[j + k * a_dim1] * b[i__ + k * b_dim1];
00179             }
00180 
00181 L280:
00182             a[i__ + j * a_dim1] = x / dl[i__];
00183 /* L300: */
00184         }
00185     }
00186 
00187     goto L1001;
00188 /*     .......... SET ERROR -- B IS NOT POSITIVE DEFINITE .......... */
00189 L1000:
00190     *ierr = *n * 7 + 1;
00191 L1001:
00192     return 0;
00193 } /* reduc_ */

int rg_ integer   nm,
integer   n,
doublereal   a,
doublereal   wr,
doublereal   wi,
integer   matz,
doublereal   z__,
integer   iv1,
doublereal   fv1,
integer   ierr
 

Definition at line 8 of file eis_rg.c.

References a, balanc_(), balbak_(), elmhes_(), eltran_(), hqr2_(), and hqr_().

00011 {
00012     /* System generated locals */
00013     integer a_dim1, a_offset, z_dim1, z_offset;
00014 
00015     /* Local variables */
00016     extern /* Subroutine */ int balbak_(integer *, integer *, integer *, 
00017             integer *, doublereal *, integer *, doublereal *), balanc_(
00018             integer *, integer *, doublereal *, integer *, integer *, 
00019             doublereal *), elmhes_(integer *, integer *, integer *, integer *,
00020              doublereal *, integer *), eltran_(integer *, integer *, integer *
00021             , integer *, doublereal *, integer *, doublereal *);
00022     static integer is1, is2;
00023     extern /* Subroutine */ int hqr_(integer *, integer *, integer *, integer 
00024             *, doublereal *, doublereal *, doublereal *, integer *), hqr2_(
00025             integer *, integer *, integer *, integer *, doublereal *, 
00026             doublereal *, doublereal *, doublereal *, integer *);
00027 
00028 
00029 
00030 /*     THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OF */
00031 /*     SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK) */
00032 /*     TO FIND THE EIGENVALUES AND EIGENVECTORS (IF DESIRED) */
00033 /*     OF A REAL GENERAL MATRIX. */
00034 
00035 /*     ON INPUT */
00036 
00037 /*        NM  MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL */
00038 /*        ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00039 /*        DIMENSION STATEMENT. */
00040 
00041 /*        N  IS THE ORDER OF THE MATRIX  A. */
00042 
00043 /*        A  CONTAINS THE REAL GENERAL MATRIX. */
00044 
00045 /*        MATZ  IS AN INTEGER VARIABLE SET EQUAL TO ZERO IF */
00046 /*        ONLY EIGENVALUES ARE DESIRED.  OTHERWISE IT IS SET TO */
00047 /*        ANY NON-ZERO INTEGER FOR BOTH EIGENVALUES AND EIGENVECTORS. */
00048 
00049 /*     ON OUTPUT */
00050 
00051 /*        WR  AND  WI  CONTAIN THE REAL AND IMAGINARY PARTS, */
00052 /*        RESPECTIVELY, OF THE EIGENVALUES.  COMPLEX CONJUGATE */
00053 /*        PAIRS OF EIGENVALUES APPEAR CONSECUTIVELY WITH THE */
00054 /*        EIGENVALUE HAVING THE POSITIVE IMAGINARY PART FIRST. */
00055 
00056 /*        Z  CONTAINS THE REAL AND IMAGINARY PARTS OF THE EIGENVECTORS */
00057 /*        IF MATZ IS NOT ZERO.  IF THE J-TH EIGENVALUE IS REAL, THE */
00058 /*        J-TH COLUMN OF  Z  CONTAINS ITS EIGENVECTOR.  IF THE J-TH */
00059 /*        EIGENVALUE IS COMPLEX WITH POSITIVE IMAGINARY PART, THE */
00060 /*        J-TH AND (J+1)-TH COLUMNS OF  Z  CONTAIN THE REAL AND */
00061 /*        IMAGINARY PARTS OF ITS EIGENVECTOR.  THE CONJUGATE OF THIS */
00062 /*        VECTOR IS THE EIGENVECTOR FOR THE CONJUGATE EIGENVALUE. */
00063 
00064 /*        IERR  IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERROR */
00065 /*           COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR HQR */
00066 /*           AND HQR2.  THE NORMAL COMPLETION CODE IS ZERO. */
00067 
00068 /*        IV1  AND  FV1  ARE TEMPORARY STORAGE ARRAYS. */
00069 
00070 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00071 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00072 */
00073 
00074 /*     THIS VERSION DATED AUGUST 1983. */
00075 
00076 /*     ------------------------------------------------------------------ 
00077 */
00078 
00079     /* Parameter adjustments */
00080     --fv1;
00081     --iv1;
00082     z_dim1 = *nm;
00083     z_offset = z_dim1 + 1;
00084     z__ -= z_offset;
00085     --wi;
00086     --wr;
00087     a_dim1 = *nm;
00088     a_offset = a_dim1 + 1;
00089     a -= a_offset;
00090 
00091     /* Function Body */
00092     if (*n <= *nm) {
00093         goto L10;
00094     }
00095     *ierr = *n * 10;
00096     goto L50;
00097 
00098 L10:
00099     balanc_(nm, n, &a[a_offset], &is1, &is2, &fv1[1]);
00100     elmhes_(nm, n, &is1, &is2, &a[a_offset], &iv1[1]);
00101     if (*matz != 0) {
00102         goto L20;
00103     }
00104 /*     .......... FIND EIGENVALUES ONLY .......... */
00105     hqr_(nm, n, &is1, &is2, &a[a_offset], &wr[1], &wi[1], ierr);
00106     goto L50;
00107 /*     .......... FIND BOTH EIGENVALUES AND EIGENVECTORS .......... */
00108 L20:
00109     eltran_(nm, n, &is1, &is2, &a[a_offset], &iv1[1], &z__[z_offset]);
00110     hqr2_(nm, n, &is1, &is2, &a[a_offset], &wr[1], &wi[1], &z__[z_offset], 
00111             ierr);
00112     if (*ierr != 0) {
00113         goto L50;
00114     }
00115     balbak_(nm, n, &is1, &is2, &fv1[1], n, &z__[z_offset]);
00116 L50:
00117     return 0;
00118 } /* rg_ */

int rgg_ integer   nm,
integer   n,
doublereal   a,
doublereal   b,
doublereal   alfr,
doublereal   alfi,
doublereal   beta,
integer   matz,
doublereal   z__,
integer   ierr
 

Definition at line 12 of file eis_rgg.c.

References a, c_b5, qzhes_(), qzit_(), qzval_(), and qzvec_().

00015 {
00016     /* System generated locals */
00017     integer a_dim1, a_offset, b_dim1, b_offset, z_dim1, z_offset;
00018 
00019     /* Local variables */
00020     extern /* Subroutine */ int qzit_(integer *, integer *, doublereal *, 
00021             doublereal *, doublereal *, logical *, doublereal *, integer *), 
00022             qzvec_(integer *, integer *, doublereal *, doublereal *, 
00023             doublereal *, doublereal *, doublereal *, doublereal *), qzhes_(
00024             integer *, integer *, doublereal *, doublereal *, logical *, 
00025             doublereal *), qzval_(integer *, integer *, doublereal *, 
00026             doublereal *, doublereal *, doublereal *, doublereal *, logical *,
00027              doublereal *);
00028     static logical tf;
00029 
00030 
00031 
00032 /*     THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OF */
00033 /*     SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK) */
00034 /*     TO FIND THE EIGENVALUES AND EIGENVECTORS (IF DESIRED) */
00035 /*     FOR THE REAL GENERAL GENERALIZED EIGENPROBLEM  AX = (LAMBDA)BX. */
00036 
00037 /*     ON INPUT */
00038 
00039 /*        NM  MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL */
00040 /*        ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00041 /*        DIMENSION STATEMENT. */
00042 
00043 /*        N  IS THE ORDER OF THE MATRICES  A  AND  B. */
00044 
00045 /*        A  CONTAINS A REAL GENERAL MATRIX. */
00046 
00047 /*        B  CONTAINS A REAL GENERAL MATRIX. */
00048 
00049 /*        MATZ  IS AN INTEGER VARIABLE SET EQUAL TO ZERO IF */
00050 /*        ONLY EIGENVALUES ARE DESIRED.  OTHERWISE IT IS SET TO */
00051 /*        ANY NON-ZERO INTEGER FOR BOTH EIGENVALUES AND EIGENVECTORS. */
00052 
00053 /*     ON OUTPUT */
00054 
00055 /*        ALFR  AND  ALFI  CONTAIN THE REAL AND IMAGINARY PARTS, */
00056 /*        RESPECTIVELY, OF THE NUMERATORS OF THE EIGENVALUES. */
00057 
00058 /*        BETA  CONTAINS THE DENOMINATORS OF THE EIGENVALUES, */
00059 /*        WHICH ARE THUS GIVEN BY THE RATIOS  (ALFR+I*ALFI)/BETA. */
00060 /*        COMPLEX CONJUGATE PAIRS OF EIGENVALUES APPEAR CONSECUTIVELY */
00061 /*        WITH THE EIGENVALUE HAVING THE POSITIVE IMAGINARY PART FIRST. */
00062 
00063 /*        Z  CONTAINS THE REAL AND IMAGINARY PARTS OF THE EIGENVECTORS */
00064 /*        IF MATZ IS NOT ZERO.  IF THE J-TH EIGENVALUE IS REAL, THE */
00065 /*        J-TH COLUMN OF  Z  CONTAINS ITS EIGENVECTOR.  IF THE J-TH */
00066 /*        EIGENVALUE IS COMPLEX WITH POSITIVE IMAGINARY PART, THE */
00067 /*        J-TH AND (J+1)-TH COLUMNS OF  Z  CONTAIN THE REAL AND */
00068 /*        IMAGINARY PARTS OF ITS EIGENVECTOR.  THE CONJUGATE OF THIS */
00069 /*        VECTOR IS THE EIGENVECTOR FOR THE CONJUGATE EIGENVALUE. */
00070 
00071 /*        IERR  IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERROR */
00072 /*           COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR QZIT. */
00073 /*           THE NORMAL COMPLETION CODE IS ZERO. */
00074 
00075 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00076 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00077 */
00078 
00079 /*     THIS VERSION DATED AUGUST 1983. */
00080 
00081 /*     ------------------------------------------------------------------ 
00082 */
00083 
00084     /* Parameter adjustments */
00085     z_dim1 = *nm;
00086     z_offset = z_dim1 + 1;
00087     z__ -= z_offset;
00088     --beta;
00089     --alfi;
00090     --alfr;
00091     b_dim1 = *nm;
00092     b_offset = b_dim1 + 1;
00093     b -= b_offset;
00094     a_dim1 = *nm;
00095     a_offset = a_dim1 + 1;
00096     a -= a_offset;
00097 
00098     /* Function Body */
00099     if (*n <= *nm) {
00100         goto L10;
00101     }
00102     *ierr = *n * 10;
00103     goto L50;
00104 
00105 L10:
00106     if (*matz != 0) {
00107         goto L20;
00108     }
00109 /*     .......... FIND EIGENVALUES ONLY .......... */
00110     tf = FALSE_;
00111     qzhes_(nm, n, &a[a_offset], &b[b_offset], &tf, &z__[z_offset]);
00112     qzit_(nm, n, &a[a_offset], &b[b_offset], &c_b5, &tf, &z__[z_offset], ierr)
00113             ;
00114     qzval_(nm, n, &a[a_offset], &b[b_offset], &alfr[1], &alfi[1], &beta[1], &
00115             tf, &z__[z_offset]);
00116     goto L50;
00117 /*     .......... FIND BOTH EIGENVALUES AND EIGENVECTORS .......... */
00118 L20:
00119     tf = TRUE_;
00120     qzhes_(nm, n, &a[a_offset], &b[b_offset], &tf, &z__[z_offset]);
00121     qzit_(nm, n, &a[a_offset], &b[b_offset], &c_b5, &tf, &z__[z_offset], ierr)
00122             ;
00123     qzval_(nm, n, &a[a_offset], &b[b_offset], &alfr[1], &alfi[1], &beta[1], &
00124             tf, &z__[z_offset]);
00125     if (*ierr != 0) {
00126         goto L50;
00127     }
00128     qzvec_(nm, n, &a[a_offset], &b[b_offset], &alfr[1], &alfi[1], &beta[1], &
00129             z__[z_offset]);
00130 L50:
00131     return 0;
00132 } /* rgg_ */

int rs_ integer   nm,
integer   n,
doublereal   a,
doublereal   w,
integer   matz,
doublereal   z__,
doublereal   fv1,
doublereal   fv2,
integer   ierr
 

Definition at line 8 of file eis_rs.c.

References a, tql2_(), tqlrat_(), tred1_(), and tred2_().

Referenced by symeig_double(), and symeigval_double().

00011 {
00012     /* System generated locals */
00013     integer a_dim1, a_offset, z_dim1, z_offset;
00014 
00015     /* Local variables */
00016     extern /* Subroutine */ int tred1_(integer *, integer *, doublereal *, 
00017             doublereal *, doublereal *, doublereal *), tred2_(integer *, 
00018             integer *, doublereal *, doublereal *, doublereal *, doublereal *)
00019             , tqlrat_(integer *, doublereal *, doublereal *, integer *), 
00020             tql2_(integer *, integer *, doublereal *, doublereal *, 
00021             doublereal *, integer *);
00022 
00023 
00024 
00025 /*     THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OF */
00026 /*     SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK) */
00027 /*     TO FIND THE EIGENVALUES AND EIGENVECTORS (IF DESIRED) */
00028 /*     OF A REAL SYMMETRIC MATRIX. */
00029 
00030 /*     ON INPUT */
00031 
00032 /*        NM  MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL */
00033 /*        ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00034 /*        DIMENSION STATEMENT. */
00035 
00036 /*        N  IS THE ORDER OF THE MATRIX  A. */
00037 
00038 /*        A  CONTAINS THE REAL SYMMETRIC MATRIX. */
00039 
00040 /*        MATZ  IS AN INTEGER VARIABLE SET EQUAL TO ZERO IF */
00041 /*        ONLY EIGENVALUES ARE DESIRED.  OTHERWISE IT IS SET TO */
00042 /*        ANY NON-ZERO INTEGER FOR BOTH EIGENVALUES AND EIGENVECTORS. */
00043 
00044 /*     ON OUTPUT */
00045 
00046 /*        W  CONTAINS THE EIGENVALUES IN ASCENDING ORDER. */
00047 
00048 /*        Z  CONTAINS THE EIGENVECTORS IF MATZ IS NOT ZERO. */
00049 
00050 /*        IERR  IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERROR */
00051 /*           COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR TQLRAT */
00052 /*           AND TQL2.  THE NORMAL COMPLETION CODE IS ZERO. */
00053 
00054 /*        FV1  AND  FV2  ARE TEMPORARY STORAGE ARRAYS. */
00055 
00056 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00057 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00058 */
00059 
00060 /*     THIS VERSION DATED AUGUST 1983. */
00061 
00062 /*     ------------------------------------------------------------------ 
00063 */
00064 
00065     /* Parameter adjustments */
00066     --fv2;
00067     --fv1;
00068     z_dim1 = *nm;
00069     z_offset = z_dim1 + 1;
00070     z__ -= z_offset;
00071     --w;
00072     a_dim1 = *nm;
00073     a_offset = a_dim1 + 1;
00074     a -= a_offset;
00075 
00076     /* Function Body */
00077     if (*n <= *nm) {
00078         goto L10;
00079     }
00080     *ierr = *n * 10;
00081     goto L50;
00082 
00083 L10:
00084     if (*matz != 0) {
00085         goto L20;
00086     }
00087 /*     .......... FIND EIGENVALUES ONLY .......... */
00088     tred1_(nm, n, &a[a_offset], &w[1], &fv1[1], &fv2[1]);
00089     tqlrat_(n, &w[1], &fv2[1], ierr);
00090     goto L50;
00091 /*     .......... FIND BOTH EIGENVALUES AND EIGENVECTORS .......... */
00092 L20:
00093     tred2_(nm, n, &a[a_offset], &w[1], &fv1[1], &z__[z_offset]);
00094     tql2_(nm, n, &w[1], &fv1[1], &z__[z_offset], ierr);
00095 L50:
00096     return 0;
00097 } /* rs_ */

int rsb_ integer   nm,
integer   n,
integer   mb,
doublereal   a,
doublereal   w,
integer   matz,
doublereal   z__,
doublereal   fv1,
doublereal   fv2,
integer   ierr
 

Definition at line 8 of file eis_rsb.c.

References a, bandr_(), tql2_(), and tqlrat_().

00011 {
00012     /* System generated locals */
00013     integer a_dim1, a_offset, z_dim1, z_offset;
00014 
00015     /* Local variables */
00016     extern /* Subroutine */ int bandr_(integer *, integer *, integer *, 
00017             doublereal *, doublereal *, doublereal *, doublereal *, logical *,
00018              doublereal *);
00019     static logical tf;
00020     extern /* Subroutine */ int tqlrat_(integer *, doublereal *, doublereal *,
00021              integer *), tql2_(integer *, integer *, doublereal *, doublereal 
00022             *, doublereal *, integer *);
00023 
00024 
00025 
00026 /*     THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OF */
00027 /*     SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK) */
00028 /*     TO FIND THE EIGENVALUES AND EIGENVECTORS (IF DESIRED) */
00029 /*     OF A REAL SYMMETRIC BAND MATRIX. */
00030 
00031 /*     ON INPUT */
00032 
00033 /*        NM  MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL */
00034 /*        ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00035 /*        DIMENSION STATEMENT. */
00036 
00037 /*        N  IS THE ORDER OF THE MATRIX  A. */
00038 
00039 /*        MB  IS THE HALF BAND WIDTH OF THE MATRIX, DEFINED AS THE */
00040 /*        NUMBER OF ADJACENT DIAGONALS, INCLUDING THE PRINCIPAL */
00041 /*        DIAGONAL, REQUIRED TO SPECIFY THE NON-ZERO PORTION OF THE */
00042 /*        LOWER TRIANGLE OF THE MATRIX. */
00043 
00044 /*        A  CONTAINS THE LOWER TRIANGLE OF THE REAL SYMMETRIC */
00045 /*        BAND MATRIX.  ITS LOWEST SUBDIAGONAL IS STORED IN THE */
00046 /*        LAST  N+1-MB  POSITIONS OF THE FIRST COLUMN, ITS NEXT */
00047 /*        SUBDIAGONAL IN THE LAST  N+2-MB  POSITIONS OF THE */
00048 /*        SECOND COLUMN, FURTHER SUBDIAGONALS SIMILARLY, AND */
00049 /*        FINALLY ITS PRINCIPAL DIAGONAL IN THE  N  POSITIONS */
00050 /*        OF THE LAST COLUMN.  CONTENTS OF STORAGES NOT PART */
00051 /*        OF THE MATRIX ARE ARBITRARY. */
00052 
00053 /*        MATZ  IS AN INTEGER VARIABLE SET EQUAL TO ZERO IF */
00054 /*        ONLY EIGENVALUES ARE DESIRED.  OTHERWISE IT IS SET TO */
00055 /*        ANY NON-ZERO INTEGER FOR BOTH EIGENVALUES AND EIGENVECTORS. */
00056 
00057 /*     ON OUTPUT */
00058 
00059 /*        W  CONTAINS THE EIGENVALUES IN ASCENDING ORDER. */
00060 
00061 /*        Z  CONTAINS THE EIGENVECTORS IF MATZ IS NOT ZERO. */
00062 
00063 /*        IERR  IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERROR */
00064 /*           COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR TQLRAT */
00065 /*           AND TQL2.  THE NORMAL COMPLETION CODE IS ZERO. */
00066 
00067 /*        FV1  AND  FV2  ARE TEMPORARY STORAGE ARRAYS. */
00068 
00069 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00070 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00071 */
00072 
00073 /*     THIS VERSION DATED AUGUST 1983. */
00074 
00075 /*     ------------------------------------------------------------------ 
00076 */
00077 
00078     /* Parameter adjustments */
00079     --fv2;
00080     --fv1;
00081     z_dim1 = *nm;
00082     z_offset = z_dim1 + 1;
00083     z__ -= z_offset;
00084     --w;
00085     a_dim1 = *nm;
00086     a_offset = a_dim1 + 1;
00087     a -= a_offset;
00088 
00089     /* Function Body */
00090     if (*n <= *nm) {
00091         goto L5;
00092     }
00093     *ierr = *n * 10;
00094     goto L50;
00095 L5:
00096     if (*mb > 0) {
00097         goto L10;
00098     }
00099     *ierr = *n * 12;
00100     goto L50;
00101 L10:
00102     if (*mb <= *n) {
00103         goto L15;
00104     }
00105     *ierr = *n * 12;
00106     goto L50;
00107 
00108 L15:
00109     if (*matz != 0) {
00110         goto L20;
00111     }
00112 /*     .......... FIND EIGENVALUES ONLY .......... */
00113     tf = FALSE_;
00114     bandr_(nm, n, mb, &a[a_offset], &w[1], &fv1[1], &fv2[1], &tf, &z__[
00115             z_offset]);
00116     tqlrat_(n, &w[1], &fv2[1], ierr);
00117     goto L50;
00118 /*     .......... FIND BOTH EIGENVALUES AND EIGENVECTORS .......... */
00119 L20:
00120     tf = TRUE_;
00121     bandr_(nm, n, mb, &a[a_offset], &w[1], &fv1[1], &fv1[1], &tf, &z__[
00122             z_offset]);
00123     tql2_(nm, n, &w[1], &fv1[1], &z__[z_offset], ierr);
00124 L50:
00125     return 0;
00126 } /* rsb_ */

int rsg_ integer   nm,
integer   n,
doublereal   a,
doublereal   b,
doublereal   w,
integer   matz,
doublereal   z__,
doublereal   fv1,
doublereal   fv2,
integer   ierr
 

Definition at line 8 of file eis_rsg.c.

References a, rebak_(), reduc_(), tql2_(), tqlrat_(), tred1_(), and tred2_().

00011 {
00012     /* System generated locals */
00013     integer a_dim1, a_offset, b_dim1, b_offset, z_dim1, z_offset;
00014 
00015     /* Local variables */
00016     extern /* Subroutine */ int tred1_(integer *, integer *, doublereal *, 
00017             doublereal *, doublereal *, doublereal *), tred2_(integer *, 
00018             integer *, doublereal *, doublereal *, doublereal *, doublereal *)
00019             , rebak_(integer *, integer *, doublereal *, doublereal *, 
00020             integer *, doublereal *), reduc_(integer *, integer *, doublereal 
00021             *, doublereal *, doublereal *, integer *), tqlrat_(integer *, 
00022             doublereal *, doublereal *, integer *), tql2_(integer *, integer *
00023             , doublereal *, doublereal *, doublereal *, integer *);
00024 
00025 
00026 
00027 /*     THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OF */
00028 /*     SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK) */
00029 /*     TO FIND THE EIGENVALUES AND EIGENVECTORS (IF DESIRED) */
00030 /*     FOR THE REAL SYMMETRIC GENERALIZED EIGENPROBLEM  AX = (LAMBDA)BX. 
00031 */
00032 
00033 /*     ON INPUT */
00034 
00035 /*        NM  MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL */
00036 /*        ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00037 /*        DIMENSION STATEMENT. */
00038 
00039 /*        N  IS THE ORDER OF THE MATRICES  A  AND  B. */
00040 
00041 /*        A  CONTAINS A REAL SYMMETRIC MATRIX. */
00042 
00043 /*        B  CONTAINS A POSITIVE DEFINITE REAL SYMMETRIC MATRIX. */
00044 
00045 /*        MATZ  IS AN INTEGER VARIABLE SET EQUAL TO ZERO IF */
00046 /*        ONLY EIGENVALUES ARE DESIRED.  OTHERWISE IT IS SET TO */
00047 /*        ANY NON-ZERO INTEGER FOR BOTH EIGENVALUES AND EIGENVECTORS. */
00048 
00049 /*     ON OUTPUT */
00050 
00051 /*        W  CONTAINS THE EIGENVALUES IN ASCENDING ORDER. */
00052 
00053 /*        Z  CONTAINS THE EIGENVECTORS IF MATZ IS NOT ZERO. */
00054 
00055 /*        IERR  IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERROR */
00056 /*           COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR TQLRAT */
00057 /*           AND TQL2.  THE NORMAL COMPLETION CODE IS ZERO. */
00058 
00059 /*        FV1  AND  FV2  ARE TEMPORARY STORAGE ARRAYS. */
00060 
00061 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00062 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00063 */
00064 
00065 /*     THIS VERSION DATED AUGUST 1983. */
00066 
00067 /*     ------------------------------------------------------------------ 
00068 */
00069 
00070     /* Parameter adjustments */
00071     --fv2;
00072     --fv1;
00073     z_dim1 = *nm;
00074     z_offset = z_dim1 + 1;
00075     z__ -= z_offset;
00076     --w;
00077     b_dim1 = *nm;
00078     b_offset = b_dim1 + 1;
00079     b -= b_offset;
00080     a_dim1 = *nm;
00081     a_offset = a_dim1 + 1;
00082     a -= a_offset;
00083 
00084     /* Function Body */
00085     if (*n <= *nm) {
00086         goto L10;
00087     }
00088     *ierr = *n * 10;
00089     goto L50;
00090 
00091 L10:
00092     reduc_(nm, n, &a[a_offset], &b[b_offset], &fv2[1], ierr);
00093     if (*ierr != 0) {
00094         goto L50;
00095     }
00096     if (*matz != 0) {
00097         goto L20;
00098     }
00099 /*     .......... FIND EIGENVALUES ONLY .......... */
00100     tred1_(nm, n, &a[a_offset], &w[1], &fv1[1], &fv2[1]);
00101     tqlrat_(n, &w[1], &fv2[1], ierr);
00102     goto L50;
00103 /*     .......... FIND BOTH EIGENVALUES AND EIGENVECTORS .......... */
00104 L20:
00105     tred2_(nm, n, &a[a_offset], &w[1], &fv1[1], &z__[z_offset]);
00106     tql2_(nm, n, &w[1], &fv1[1], &z__[z_offset], ierr);
00107     if (*ierr != 0) {
00108         goto L50;
00109     }
00110     rebak_(nm, n, &b[b_offset], &fv2[1], n, &z__[z_offset]);
00111 L50:
00112     return 0;
00113 } /* rsg_ */

int rsgab_ integer   nm,
integer   n,
doublereal   a,
doublereal   b,
doublereal   w,
integer   matz,
doublereal   z__,
doublereal   fv1,
doublereal   fv2,
integer   ierr
 

Definition at line 8 of file eis_rsgab.c.

References a, rebak_(), reduc2_(), tql2_(), tqlrat_(), tred1_(), and tred2_().

00011 {
00012     /* System generated locals */
00013     integer a_dim1, a_offset, b_dim1, b_offset, z_dim1, z_offset;
00014 
00015     /* Local variables */
00016     extern /* Subroutine */ int tred1_(integer *, integer *, doublereal *, 
00017             doublereal *, doublereal *, doublereal *), tred2_(integer *, 
00018             integer *, doublereal *, doublereal *, doublereal *, doublereal *)
00019             , rebak_(integer *, integer *, doublereal *, doublereal *, 
00020             integer *, doublereal *), reduc2_(integer *, integer *, 
00021             doublereal *, doublereal *, doublereal *, integer *), tqlrat_(
00022             integer *, doublereal *, doublereal *, integer *), tql2_(integer *
00023             , integer *, doublereal *, doublereal *, doublereal *, integer *);
00024 
00025 
00026 
00027 /*     THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OF */
00028 /*     SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK) */
00029 /*     TO FIND THE EIGENVALUES AND EIGENVECTORS (IF DESIRED) */
00030 /*     FOR THE REAL SYMMETRIC GENERALIZED EIGENPROBLEM  ABX = (LAMBDA)X. 
00031 */
00032 
00033 /*     ON INPUT */
00034 
00035 /*        NM  MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL */
00036 /*        ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00037 /*        DIMENSION STATEMENT. */
00038 
00039 /*        N  IS THE ORDER OF THE MATRICES  A  AND  B. */
00040 
00041 /*        A  CONTAINS A REAL SYMMETRIC MATRIX. */
00042 
00043 /*        B  CONTAINS A POSITIVE DEFINITE REAL SYMMETRIC MATRIX. */
00044 
00045 /*        MATZ  IS AN INTEGER VARIABLE SET EQUAL TO ZERO IF */
00046 /*        ONLY EIGENVALUES ARE DESIRED.  OTHERWISE IT IS SET TO */
00047 /*        ANY NON-ZERO INTEGER FOR BOTH EIGENVALUES AND EIGENVECTORS. */
00048 
00049 /*     ON OUTPUT */
00050 
00051 /*        W  CONTAINS THE EIGENVALUES IN ASCENDING ORDER. */
00052 
00053 /*        Z  CONTAINS THE EIGENVECTORS IF MATZ IS NOT ZERO. */
00054 
00055 /*        IERR  IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERROR */
00056 /*           COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR TQLRAT */
00057 /*           AND TQL2.  THE NORMAL COMPLETION CODE IS ZERO. */
00058 
00059 /*        FV1  AND  FV2  ARE TEMPORARY STORAGE ARRAYS. */
00060 
00061 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00062 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00063 */
00064 
00065 /*     THIS VERSION DATED AUGUST 1983. */
00066 
00067 /*     ------------------------------------------------------------------ 
00068 */
00069 
00070     /* Parameter adjustments */
00071     --fv2;
00072     --fv1;
00073     z_dim1 = *nm;
00074     z_offset = z_dim1 + 1;
00075     z__ -= z_offset;
00076     --w;
00077     b_dim1 = *nm;
00078     b_offset = b_dim1 + 1;
00079     b -= b_offset;
00080     a_dim1 = *nm;
00081     a_offset = a_dim1 + 1;
00082     a -= a_offset;
00083 
00084     /* Function Body */
00085     if (*n <= *nm) {
00086         goto L10;
00087     }
00088     *ierr = *n * 10;
00089     goto L50;
00090 
00091 L10:
00092     reduc2_(nm, n, &a[a_offset], &b[b_offset], &fv2[1], ierr);
00093     if (*ierr != 0) {
00094         goto L50;
00095     }
00096     if (*matz != 0) {
00097         goto L20;
00098     }
00099 /*     .......... FIND EIGENVALUES ONLY .......... */
00100     tred1_(nm, n, &a[a_offset], &w[1], &fv1[1], &fv2[1]);
00101     tqlrat_(n, &w[1], &fv2[1], ierr);
00102     goto L50;
00103 /*     .......... FIND BOTH EIGENVALUES AND EIGENVECTORS .......... */
00104 L20:
00105     tred2_(nm, n, &a[a_offset], &w[1], &fv1[1], &z__[z_offset]);
00106     tql2_(nm, n, &w[1], &fv1[1], &z__[z_offset], ierr);
00107     if (*ierr != 0) {
00108         goto L50;
00109     }
00110     rebak_(nm, n, &b[b_offset], &fv2[1], n, &z__[z_offset]);
00111 L50:
00112     return 0;
00113 } /* rsgab_ */

int rsgba_ integer   nm,
integer   n,
doublereal   a,
doublereal   b,
doublereal   w,
integer   matz,
doublereal   z__,
doublereal   fv1,
doublereal   fv2,
integer   ierr
 

Definition at line 8 of file eis_rsgba.c.

References a, rebakb_(), reduc2_(), tql2_(), tqlrat_(), tred1_(), and tred2_().

00011 {
00012     /* System generated locals */
00013     integer a_dim1, a_offset, b_dim1, b_offset, z_dim1, z_offset;
00014 
00015     /* Local variables */
00016     extern /* Subroutine */ int tred1_(integer *, integer *, doublereal *, 
00017             doublereal *, doublereal *, doublereal *), tred2_(integer *, 
00018             integer *, doublereal *, doublereal *, doublereal *, doublereal *)
00019             , reduc2_(integer *, integer *, doublereal *, doublereal *, 
00020             doublereal *, integer *), rebakb_(integer *, integer *, 
00021             doublereal *, doublereal *, integer *, doublereal *), tqlrat_(
00022             integer *, doublereal *, doublereal *, integer *), tql2_(integer *
00023             , integer *, doublereal *, doublereal *, doublereal *, integer *);
00024 
00025 
00026 
00027 /*     THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OF */
00028 /*     SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK) */
00029 /*     TO FIND THE EIGENVALUES AND EIGENVECTORS (IF DESIRED) */
00030 /*     FOR THE REAL SYMMETRIC GENERALIZED EIGENPROBLEM  BAX = (LAMBDA)X. 
00031 */
00032 
00033 /*     ON INPUT */
00034 
00035 /*        NM  MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL */
00036 /*        ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00037 /*        DIMENSION STATEMENT. */
00038 
00039 /*        N  IS THE ORDER OF THE MATRICES  A  AND  B. */
00040 
00041 /*        A  CONTAINS A REAL SYMMETRIC MATRIX. */
00042 
00043 /*        B  CONTAINS A POSITIVE DEFINITE REAL SYMMETRIC MATRIX. */
00044 
00045 /*        MATZ  IS AN INTEGER VARIABLE SET EQUAL TO ZERO IF */
00046 /*        ONLY EIGENVALUES ARE DESIRED.  OTHERWISE IT IS SET TO */
00047 /*        ANY NON-ZERO INTEGER FOR BOTH EIGENVALUES AND EIGENVECTORS. */
00048 
00049 /*     ON OUTPUT */
00050 
00051 /*        W  CONTAINS THE EIGENVALUES IN ASCENDING ORDER. */
00052 
00053 /*        Z  CONTAINS THE EIGENVECTORS IF MATZ IS NOT ZERO. */
00054 
00055 /*        IERR  IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERROR */
00056 /*           COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR TQLRAT */
00057 /*           AND TQL2.  THE NORMAL COMPLETION CODE IS ZERO. */
00058 
00059 /*        FV1  AND  FV2  ARE TEMPORARY STORAGE ARRAYS. */
00060 
00061 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00062 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00063 */
00064 
00065 /*     THIS VERSION DATED AUGUST 1983. */
00066 
00067 /*     ------------------------------------------------------------------ 
00068 */
00069 
00070     /* Parameter adjustments */
00071     --fv2;
00072     --fv1;
00073     z_dim1 = *nm;
00074     z_offset = z_dim1 + 1;
00075     z__ -= z_offset;
00076     --w;
00077     b_dim1 = *nm;
00078     b_offset = b_dim1 + 1;
00079     b -= b_offset;
00080     a_dim1 = *nm;
00081     a_offset = a_dim1 + 1;
00082     a -= a_offset;
00083 
00084     /* Function Body */
00085     if (*n <= *nm) {
00086         goto L10;
00087     }
00088     *ierr = *n * 10;
00089     goto L50;
00090 
00091 L10:
00092     reduc2_(nm, n, &a[a_offset], &b[b_offset], &fv2[1], ierr);
00093     if (*ierr != 0) {
00094         goto L50;
00095     }
00096     if (*matz != 0) {
00097         goto L20;
00098     }
00099 /*     .......... FIND EIGENVALUES ONLY .......... */
00100     tred1_(nm, n, &a[a_offset], &w[1], &fv1[1], &fv2[1]);
00101     tqlrat_(n, &w[1], &fv2[1], ierr);
00102     goto L50;
00103 /*     .......... FIND BOTH EIGENVALUES AND EIGENVECTORS .......... */
00104 L20:
00105     tred2_(nm, n, &a[a_offset], &w[1], &fv1[1], &z__[z_offset]);
00106     tql2_(nm, n, &w[1], &fv1[1], &z__[z_offset], ierr);
00107     if (*ierr != 0) {
00108         goto L50;
00109     }
00110     rebakb_(nm, n, &b[b_offset], &fv2[1], n, &z__[z_offset]);
00111 L50:
00112     return 0;
00113 } /* rsgba_ */

int rsm_ integer   nm,
integer   n,
doublereal   a,
doublereal   w,
integer   m,
doublereal   z__,
doublereal   fwork,
integer   iwork,
integer   ierr
 

Definition at line 8 of file eis_rsm.c.

References a, imtqlv_(), tinvit_(), tqlrat_(), trbak1_(), and tred1_().

00011 {
00012     /* System generated locals */
00013     integer a_dim1, a_offset, z_dim1, z_offset;
00014 
00015     /* Local variables */
00016     extern /* Subroutine */ int tred1_(integer *, integer *, doublereal *, 
00017             doublereal *, doublereal *, doublereal *);
00018     static integer k1, k2, k3, k4, k5, k6, k7, k8;
00019     extern /* Subroutine */ int trbak1_(integer *, integer *, doublereal *, 
00020             doublereal *, integer *, doublereal *), tqlrat_(integer *, 
00021             doublereal *, doublereal *, integer *), imtqlv_(integer *, 
00022             doublereal *, doublereal *, doublereal *, doublereal *, integer *,
00023              integer *, doublereal *), tinvit_(integer *, integer *, 
00024             doublereal *, doublereal *, doublereal *, integer *, doublereal *,
00025              integer *, doublereal *, integer *, doublereal *, doublereal *, 
00026             doublereal *, doublereal *, doublereal *);
00027 
00028 
00029 
00030 /*     THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OF */
00031 /*     SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK) */
00032 /*     TO FIND ALL OF THE EIGENVALUES AND SOME OF THE EIGENVECTORS */
00033 /*     OF A REAL SYMMETRIC MATRIX. */
00034 
00035 /*     ON INPUT */
00036 
00037 /*        NM  MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL */
00038 /*        ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00039 /*        DIMENSION STATEMENT. */
00040 
00041 /*        N  IS THE ORDER OF THE MATRIX  A. */
00042 
00043 /*        A  CONTAINS THE REAL SYMMETRIC MATRIX. */
00044 
00045 /*        M  THE EIGENVECTORS CORRESPONDING TO THE FIRST M EIGENVALUES */
00046 /*           ARE TO BE COMPUTED. */
00047 /*           IF M = 0 THEN NO EIGENVECTORS ARE COMPUTED. */
00048 /*           IF M = N THEN ALL OF THE EIGENVECTORS ARE COMPUTED. */
00049 
00050 /*     ON OUTPUT */
00051 
00052 /*        W  CONTAINS ALL N EIGENVALUES IN ASCENDING ORDER. */
00053 
00054 /*        Z  CONTAINS THE ORTHONORMAL EIGENVECTORS ASSOCIATED WITH */
00055 /*           THE FIRST M EIGENVALUES. */
00056 
00057 /*        IERR  IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERROR */
00058 /*           COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR TQLRAT, */
00059 /*           IMTQLV AND TINVIT.  THE NORMAL COMPLETION CODE IS ZERO. */
00060 
00061 /*        FWORK  IS A TEMPORARY STORAGE ARRAY OF DIMENSION 8*N. */
00062 
00063 /*        IWORK  IS AN INTEGER TEMPORARY STORAGE ARRAY OF DIMENSION N. */
00064 
00065 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00066 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00067 */
00068 
00069 /*     THIS VERSION DATED AUGUST 1983. */
00070 
00071 /*     ------------------------------------------------------------------ 
00072 */
00073 
00074     /* Parameter adjustments */
00075     --iwork;
00076     --w;
00077     a_dim1 = *nm;
00078     a_offset = a_dim1 + 1;
00079     a -= a_offset;
00080     z_dim1 = *nm;
00081     z_offset = z_dim1 + 1;
00082     z__ -= z_offset;
00083     --fwork;
00084 
00085     /* Function Body */
00086     *ierr = *n * 10;
00087     if (*n > *nm || *m > *nm) {
00088         goto L50;
00089     }
00090     k1 = 1;
00091     k2 = k1 + *n;
00092     k3 = k2 + *n;
00093     k4 = k3 + *n;
00094     k5 = k4 + *n;
00095     k6 = k5 + *n;
00096     k7 = k6 + *n;
00097     k8 = k7 + *n;
00098     if (*m > 0) {
00099         goto L10;
00100     }
00101 /*     .......... FIND EIGENVALUES ONLY .......... */
00102     tred1_(nm, n, &a[a_offset], &w[1], &fwork[k1], &fwork[k2]);
00103     tqlrat_(n, &w[1], &fwork[k2], ierr);
00104     goto L50;
00105 /*     .......... FIND ALL EIGENVALUES AND M EIGENVECTORS .......... */
00106 L10:
00107     tred1_(nm, n, &a[a_offset], &fwork[k1], &fwork[k2], &fwork[k3]);
00108     imtqlv_(n, &fwork[k1], &fwork[k2], &fwork[k3], &w[1], &iwork[1], ierr, &
00109             fwork[k4]);
00110     tinvit_(nm, n, &fwork[k1], &fwork[k2], &fwork[k3], m, &w[1], &iwork[1], &
00111             z__[z_offset], ierr, &fwork[k4], &fwork[k5], &fwork[k6], &fwork[
00112             k7], &fwork[k8]);
00113     trbak1_(nm, n, &a[a_offset], &fwork[k2], m, &z__[z_offset]);
00114 L50:
00115     return 0;
00116 } /* rsm_ */

int rsp_ integer   nm,
integer   n,
integer   nv,
doublereal   a,
doublereal   w,
integer   matz,
doublereal   z__,
doublereal   fv1,
doublereal   fv2,
integer   ierr
 

Definition at line 8 of file eis_rsp.c.

References a, tql2_(), tqlrat_(), trbak3_(), and tred3_().

00011 {
00012     /* System generated locals */
00013     integer z_dim1, z_offset, i__1, i__2;
00014 
00015     /* Local variables */
00016     extern /* Subroutine */ int tred3_(integer *, integer *, doublereal *, 
00017             doublereal *, doublereal *, doublereal *);
00018     static integer i__, j;
00019     extern /* Subroutine */ int trbak3_(integer *, integer *, integer *, 
00020             doublereal *, integer *, doublereal *), tqlrat_(integer *, 
00021             doublereal *, doublereal *, integer *), tql2_(integer *, integer *
00022             , doublereal *, doublereal *, doublereal *, integer *);
00023 
00024 
00025 
00026 /*     THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OF */
00027 /*     SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK) */
00028 /*     TO FIND THE EIGENVALUES AND EIGENVECTORS (IF DESIRED) */
00029 /*     OF A REAL SYMMETRIC PACKED MATRIX. */
00030 
00031 /*     ON INPUT */
00032 
00033 /*        NM  MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL */
00034 /*        ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00035 /*        DIMENSION STATEMENT. */
00036 
00037 /*        N  IS THE ORDER OF THE MATRIX  A. */
00038 
00039 /*        NV  IS AN INTEGER VARIABLE SET EQUAL TO THE */
00040 /*        DIMENSION OF THE ARRAY  A  AS SPECIFIED FOR */
00041 /*        A  IN THE CALLING PROGRAM.  NV  MUST NOT BE */
00042 /*        LESS THAN  N*(N+1)/2. */
00043 
00044 /*        A  CONTAINS THE LOWER TRIANGLE OF THE REAL SYMMETRIC */
00045 /*        PACKED MATRIX STORED ROW-WISE. */
00046 
00047 /*        MATZ  IS AN INTEGER VARIABLE SET EQUAL TO ZERO IF */
00048 /*        ONLY EIGENVALUES ARE DESIRED.  OTHERWISE IT IS SET TO */
00049 /*        ANY NON-ZERO INTEGER FOR BOTH EIGENVALUES AND EIGENVECTORS. */
00050 
00051 /*     ON OUTPUT */
00052 
00053 /*        W  CONTAINS THE EIGENVALUES IN ASCENDING ORDER. */
00054 
00055 /*        Z  CONTAINS THE EIGENVECTORS IF MATZ IS NOT ZERO. */
00056 
00057 /*        IERR  IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERROR */
00058 /*           COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR TQLRAT */
00059 /*           AND TQL2.  THE NORMAL COMPLETION CODE IS ZERO. */
00060 
00061 /*        FV1  AND  FV2  ARE TEMPORARY STORAGE ARRAYS. */
00062 
00063 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00064 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00065 */
00066 
00067 /*     THIS VERSION DATED AUGUST 1983. */
00068 
00069 /*     ------------------------------------------------------------------ 
00070 */
00071 
00072     /* Parameter adjustments */
00073     --fv2;
00074     --fv1;
00075     z_dim1 = *nm;
00076     z_offset = z_dim1 + 1;
00077     z__ -= z_offset;
00078     --w;
00079     --a;
00080 
00081     /* Function Body */
00082     if (*n <= *nm) {
00083         goto L5;
00084     }
00085     *ierr = *n * 10;
00086     goto L50;
00087 L5:
00088     if (*nv >= *n * (*n + 1) / 2) {
00089         goto L10;
00090     }
00091     *ierr = *n * 20;
00092     goto L50;
00093 
00094 L10:
00095     tred3_(n, nv, &a[1], &w[1], &fv1[1], &fv2[1]);
00096     if (*matz != 0) {
00097         goto L20;
00098     }
00099 /*     .......... FIND EIGENVALUES ONLY .......... */
00100     tqlrat_(n, &w[1], &fv2[1], ierr);
00101     goto L50;
00102 /*     .......... FIND BOTH EIGENVALUES AND EIGENVECTORS .......... */
00103 L20:
00104     i__1 = *n;
00105     for (i__ = 1; i__ <= i__1; ++i__) {
00106 
00107         i__2 = *n;
00108         for (j = 1; j <= i__2; ++j) {
00109             z__[j + i__ * z_dim1] = 0.;
00110 /* L30: */
00111         }
00112 
00113         z__[i__ + i__ * z_dim1] = 1.;
00114 /* L40: */
00115     }
00116 
00117     tql2_(nm, n, &w[1], &fv1[1], &z__[z_offset], ierr);
00118     if (*ierr != 0) {
00119         goto L50;
00120     }
00121     trbak3_(nm, n, nv, &a[1], n, &z__[z_offset]);
00122 L50:
00123     return 0;
00124 } /* rsp_ */

int rst_ integer   nm,
integer   n,
doublereal   w,
doublereal   e,
integer   matz,
doublereal   z__,
integer   ierr
 

Definition at line 8 of file eis_rst.c.

References imtql1_(), and imtql2_().

00010 {
00011     /* System generated locals */
00012     integer z_dim1, z_offset, i__1, i__2;
00013 
00014     /* Local variables */
00015     static integer i__, j;
00016     extern /* Subroutine */ int imtql1_(integer *, doublereal *, doublereal *,
00017              integer *), imtql2_(integer *, integer *, doublereal *, 
00018             doublereal *, doublereal *, integer *);
00019 
00020 
00021 
00022 /*     THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OF */
00023 /*     SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK) */
00024 /*     TO FIND THE EIGENVALUES AND EIGENVECTORS (IF DESIRED) */
00025 /*     OF A REAL SYMMETRIC TRIDIAGONAL MATRIX. */
00026 
00027 /*     ON INPUT */
00028 
00029 /*        NM  MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL */
00030 /*        ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00031 /*        DIMENSION STATEMENT. */
00032 
00033 /*        N  IS THE ORDER OF THE MATRIX. */
00034 
00035 /*        W  CONTAINS THE DIAGONAL ELEMENTS OF THE REAL */
00036 /*        SYMMETRIC TRIDIAGONAL MATRIX. */
00037 
00038 /*        E  CONTAINS THE SUBDIAGONAL ELEMENTS OF THE MATRIX IN */
00039 /*        ITS LAST N-1 POSITIONS.  E(1) IS ARBITRARY. */
00040 
00041 /*        MATZ  IS AN INTEGER VARIABLE SET EQUAL TO ZERO IF */
00042 /*        ONLY EIGENVALUES ARE DESIRED.  OTHERWISE IT IS SET TO */
00043 /*        ANY NON-ZERO INTEGER FOR BOTH EIGENVALUES AND EIGENVECTORS. */
00044 
00045 /*     ON OUTPUT */
00046 
00047 /*        W  CONTAINS THE EIGENVALUES IN ASCENDING ORDER. */
00048 
00049 /*        Z  CONTAINS THE EIGENVECTORS IF MATZ IS NOT ZERO. */
00050 
00051 /*        IERR  IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERROR */
00052 /*           COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR IMTQL1 */
00053 /*           AND IMTQL2.  THE NORMAL COMPLETION CODE IS ZERO. */
00054 
00055 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00056 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00057 */
00058 
00059 /*     THIS VERSION DATED AUGUST 1983. */
00060 
00061 /*     ------------------------------------------------------------------ 
00062 */
00063 
00064     /* Parameter adjustments */
00065     z_dim1 = *nm;
00066     z_offset = z_dim1 + 1;
00067     z__ -= z_offset;
00068     --e;
00069     --w;
00070 
00071     /* Function Body */
00072     if (*n <= *nm) {
00073         goto L10;
00074     }
00075     *ierr = *n * 10;
00076     goto L50;
00077 
00078 L10:
00079     if (*matz != 0) {
00080         goto L20;
00081     }
00082 /*     .......... FIND EIGENVALUES ONLY .......... */
00083     imtql1_(n, &w[1], &e[1], ierr);
00084     goto L50;
00085 /*     .......... FIND BOTH EIGENVALUES AND EIGENVECTORS .......... */
00086 L20:
00087     i__1 = *n;
00088     for (i__ = 1; i__ <= i__1; ++i__) {
00089 
00090         i__2 = *n;
00091         for (j = 1; j <= i__2; ++j) {
00092             z__[j + i__ * z_dim1] = 0.;
00093 /* L30: */
00094         }
00095 
00096         z__[i__ + i__ * z_dim1] = 1.;
00097 /* L40: */
00098     }
00099 
00100     imtql2_(nm, n, &w[1], &e[1], &z__[z_offset], ierr);
00101 L50:
00102     return 0;
00103 } /* rst_ */

int rt_ integer   nm,
integer   n,
doublereal   a,
doublereal   w,
integer   matz,
doublereal   z__,
doublereal   fv1,
integer   ierr
 

Definition at line 8 of file eis_rt.c.

References a, figi2_(), figi_(), imtql1_(), and imtql2_().

00010 {
00011     /* System generated locals */
00012     integer a_dim1, a_offset, z_dim1, z_offset;
00013 
00014     /* Local variables */
00015     extern /* Subroutine */ int figi_(integer *, integer *, doublereal *, 
00016             doublereal *, doublereal *, doublereal *, integer *), figi2_(
00017             integer *, integer *, doublereal *, doublereal *, doublereal *, 
00018             doublereal *, integer *), imtql1_(integer *, doublereal *, 
00019             doublereal *, integer *), imtql2_(integer *, integer *, 
00020             doublereal *, doublereal *, doublereal *, integer *);
00021 
00022 
00023 
00024 /*     THIS SUBROUTINE CALLS THE RECOMMENDED SEQUENCE OF */
00025 /*     SUBROUTINES FROM THE EIGENSYSTEM SUBROUTINE PACKAGE (EISPACK) */
00026 /*     TO FIND THE EIGENVALUES AND EIGENVECTORS (IF DESIRED) */
00027 /*     OF A SPECIAL REAL TRIDIAGONAL MATRIX. */
00028 
00029 /*     ON INPUT */
00030 
00031 /*        NM  MUST BE SET TO THE ROW DIMENSION OF THE TWO-DIMENSIONAL */
00032 /*        ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00033 /*        DIMENSION STATEMENT. */
00034 
00035 /*        N  IS THE ORDER OF THE MATRIX  A. */
00036 
00037 /*        A  CONTAINS THE SPECIAL REAL TRIDIAGONAL MATRIX IN ITS */
00038 /*        FIRST THREE COLUMNS.  THE SUBDIAGONAL ELEMENTS ARE STORED */
00039 /*        IN THE LAST  N-1  POSITIONS OF THE FIRST COLUMN, THE */
00040 /*        DIAGONAL ELEMENTS IN THE SECOND COLUMN, AND THE SUPERDIAGONAL */
00041 /*        ELEMENTS IN THE FIRST  N-1  POSITIONS OF THE THIRD COLUMN. */
00042 /*        ELEMENTS  A(1,1)  AND  A(N,3)  ARE ARBITRARY. */
00043 
00044 /*        MATZ  IS AN INTEGER VARIABLE SET EQUAL TO ZERO IF */
00045 /*        ONLY EIGENVALUES ARE DESIRED.  OTHERWISE IT IS SET TO */
00046 /*        ANY NON-ZERO INTEGER FOR BOTH EIGENVALUES AND EIGENVECTORS. */
00047 
00048 /*     ON OUTPUT */
00049 
00050 /*        W  CONTAINS THE EIGENVALUES IN ASCENDING ORDER. */
00051 
00052 /*        Z  CONTAINS THE EIGENVECTORS IF MATZ IS NOT ZERO. */
00053 
00054 /*        IERR  IS AN INTEGER OUTPUT VARIABLE SET EQUAL TO AN ERROR */
00055 /*           COMPLETION CODE DESCRIBED IN THE DOCUMENTATION FOR IMTQL1 */
00056 /*           AND IMTQL2.  THE NORMAL COMPLETION CODE IS ZERO. */
00057 
00058 /*        FV1  IS A TEMPORARY STORAGE ARRAY. */
00059 
00060 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00061 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00062 */
00063 
00064 /*     THIS VERSION DATED AUGUST 1983. */
00065 
00066 /*     ------------------------------------------------------------------ 
00067 */
00068 
00069     /* Parameter adjustments */
00070     a_dim1 = *nm;
00071     a_offset = a_dim1 + 1;
00072     a -= a_offset;
00073     --fv1;
00074     z_dim1 = *nm;
00075     z_offset = z_dim1 + 1;
00076     z__ -= z_offset;
00077     --w;
00078 
00079     /* Function Body */
00080     if (*n <= *nm) {
00081         goto L10;
00082     }
00083     *ierr = *n * 10;
00084     goto L50;
00085 
00086 L10:
00087     if (*matz != 0) {
00088         goto L20;
00089     }
00090 /*     .......... FIND EIGENVALUES ONLY .......... */
00091     figi_(nm, n, &a[a_offset], &w[1], &fv1[1], &fv1[1], ierr);
00092     if (*ierr > 0) {
00093         goto L50;
00094     }
00095     imtql1_(n, &w[1], &fv1[1], ierr);
00096     goto L50;
00097 /*     .......... FIND BOTH EIGENVALUES AND EIGENVECTORS .......... */
00098 L20:
00099     figi2_(nm, n, &a[a_offset], &w[1], &fv1[1], &z__[z_offset], ierr);
00100     if (*ierr != 0) {
00101         goto L50;
00102     }
00103     imtql2_(nm, n, &w[1], &fv1[1], &z__[z_offset], ierr);
00104 L50:
00105     return 0;
00106 } /* rt_ */

int svd_ integer   m,
integer   n,
integer   lda,
doublereal   a,
doublereal   w,
logical   matu,
integer   ldu,
doublereal   u,
logical   matv,
integer   ldv,
doublereal   v,
integer   ierr,
doublereal   rv1
 

Definition at line 12 of file eis_svd.c.

References a, abs, c_b47, d_sign(), i1, l, max, pythag_(), scale, and v.

Referenced by svd_double().

00015 {
00016     /* System generated locals */
00017     integer a_dim1, a_offset, u_dim1, u_offset, v_dim1, v_offset, i__1, i__2, 
00018             i__3;
00019     doublereal d__1, d__2, d__3, d__4;
00020 
00021     /* Builtin functions */
00022     double sqrt(doublereal), d_sign(doublereal *, doublereal *);
00023 
00024     /* Local variables */
00025     static doublereal c__, f, g, h__;
00026     static integer i__, j, k, l;
00027     static doublereal s, x, y, z__, scale;
00028     static integer i1, k1, l1, ii, kk, ll, mn;
00029     extern doublereal pythag_(doublereal *, doublereal *);
00030     static integer its;
00031     static doublereal tst1, tst2;
00032 
00033 
00034 
00035 /*     this subroutine is a translation of the algol procedure svd, */
00036 /*     num. math. 14, 403-420(1970) by golub and reinsch. */
00037 /*     handbook for auto. comp., vol ii-linear algebra, 134-151(1971). */
00038 
00039 /*     this subroutine determines the singular value decomposition */
00040 /*          t */
00041 /*     a=usv  of a real m by n rectangular matrix.  householder */
00042 /*     bidiagonalization and a variant of the qr algorithm are used. */
00043 
00044 /*     on input */
00045 
00046 /*        nm must be set to the row dimension of two-dimensional */
00047 /*          array parameters as declared in the calling program */
00048 /*          dimension statement.  note that nm must be at least */
00049 /*          as large as the maximum of m and n. */
00050 
00051 /*        m is the number of rows of a (and u). */
00052 
00053 /*        n is the number of columns of a, u, and v */
00054 
00055 /*        a contains the rectangular input matrix to be decomposed. */
00056 
00057 /*        matu should be set to .true. if the u matrix in the */
00058 /*          decomposition is desired, and to .false. otherwise. */
00059 
00060 /*        matv should be set to .true. if the v matrix in the */
00061 /*          decomposition is desired, and to .false. otherwise. */
00062 
00063 /*        lda, ldu, ldv: are the leading dimensions of matrices */
00064 /*          a, u, and v (respectively);  must have */
00065 /*           lda >= m ; ldu >= m ; ldv >= n */
00066 
00067 /*     on output */
00068 
00069 /*        a is unaltered (unless overwritten by u or v). */
00070 
00071 /*        w contains the n (non-negative) singular values of a (the */
00072 /*          diagonal elements of s).  they are unordered.  if an */
00073 /*          error exit is made, the singular values should be correct */
00074 /*          for indices ierr+1,ierr+2,...,n. */
00075 
00076 /*        u contains the matrix u (orthogonal column vectors) of the */
00077 /*          decomposition if matu has been set to .true.  otherwise */
00078 /*          u is used as a temporary array.  u may coincide with a. */
00079 /*          if an error exit is made, the columns of u corresponding */
00080 /*          to indices of correct singular values should be correct. */
00081 
00082 /*        v contains the matrix v (orthogonal) of the decomposition if */
00083 /*          matv has been set to .true.  otherwise v is not referenced. */
00084 /*          v may also coincide with a if u is not needed.  if an error */
00085 /*          exit is made, the columns of v corresponding to indices of */
00086 /*          correct singular values should be correct. */
00087 
00088 /*        ierr is set to */
00089 /*          zero       for normal return, */
00090 /*          k          if the k-th singular value has not been */
00091 /*                     determined after 30 iterations. */
00092 
00093 /*        rv1 is a temporary storage array. */
00094 
00095 /*     calls pythag for  dsqrt(a*a + b*b) . */
00096 
00097 /*     questions and comments should be directed to burton s. garbow, */
00098 /*     mathematics and computer science div, argonne national laboratory 
00099 */
00100 
00101 /*     this version dated august 1983. */
00102 
00103 /*     ------------------------------------------------------------------ 
00104 */
00105 
00106     /* Parameter adjustments */
00107     --rv1;
00108     --w;
00109     a_dim1 = *lda;
00110     a_offset = a_dim1 + 1;
00111     a -= a_offset;
00112     u_dim1 = *ldu;
00113     u_offset = u_dim1 + 1;
00114     u -= u_offset;
00115     v_dim1 = *ldv;
00116     v_offset = v_dim1 + 1;
00117     if( v != (doublereal *)0 ) v -= v_offset;
00118 
00119     /* Function Body */
00120     *ierr = 0;
00121 
00122     i__1 = *m;
00123     for (i__ = 1; i__ <= i__1; ++i__) {
00124 
00125         i__2 = *n;
00126         for (j = 1; j <= i__2; ++j) {
00127             u[i__ + j * u_dim1] = a[i__ + j * a_dim1];
00128 /* L100: */
00129         }
00130     }
00131 /*     .......... householder reduction to bidiagonal form .......... */
00132     g = 0.;
00133     scale = 0.;
00134     x = 0.;
00135 
00136     i__2 = *n;
00137     for (i__ = 1; i__ <= i__2; ++i__) {
00138         l = i__ + 1;
00139         rv1[i__] = scale * g;
00140         g = 0.;
00141         s = 0.;
00142         scale = 0.;
00143         if (i__ > *m) {
00144             goto L210;
00145         }
00146 
00147         i__1 = *m;
00148         for (k = i__; k <= i__1; ++k) {
00149 /* L120: */
00150             scale += (d__1 = u[k + i__ * u_dim1], abs(d__1));
00151         }
00152 
00153         if (scale == 0.) {
00154             goto L210;
00155         }
00156 
00157         i__1 = *m;
00158         for (k = i__; k <= i__1; ++k) {
00159             u[k + i__ * u_dim1] /= scale;
00160 /* Computing 2nd power */
00161             d__1 = u[k + i__ * u_dim1];
00162             s += d__1 * d__1;
00163 /* L130: */
00164         }
00165 
00166         f = u[i__ + i__ * u_dim1];
00167         d__1 = sqrt(s);
00168         g = -d_sign(&d__1, &f);
00169         h__ = f * g - s;
00170         u[i__ + i__ * u_dim1] = f - g;
00171         if (i__ == *n) {
00172             goto L190;
00173         }
00174 
00175         i__1 = *n;
00176         for (j = l; j <= i__1; ++j) {
00177             s = 0.;
00178 
00179             i__3 = *m;
00180             for (k = i__; k <= i__3; ++k) {
00181 /* L140: */
00182                 s += u[k + i__ * u_dim1] * u[k + j * u_dim1];
00183             }
00184 
00185             f = s / h__;
00186 
00187             i__3 = *m;
00188             for (k = i__; k <= i__3; ++k) {
00189                 u[k + j * u_dim1] += f * u[k + i__ * u_dim1];
00190 /* L150: */
00191             }
00192         }
00193 
00194 L190:
00195         i__3 = *m;
00196         for (k = i__; k <= i__3; ++k) {
00197 /* L200: */
00198             u[k + i__ * u_dim1] = scale * u[k + i__ * u_dim1];
00199         }
00200 
00201 L210:
00202         w[i__] = scale * g;
00203         g = 0.;
00204         s = 0.;
00205         scale = 0.;
00206         if (i__ > *m || i__ == *n) {
00207             goto L290;
00208         }
00209 
00210         i__3 = *n;
00211         for (k = l; k <= i__3; ++k) {
00212 /* L220: */
00213             scale += (d__1 = u[i__ + k * u_dim1], abs(d__1));
00214         }
00215 
00216         if (scale == 0.) {
00217             goto L290;
00218         }
00219 
00220         i__3 = *n;
00221         for (k = l; k <= i__3; ++k) {
00222             u[i__ + k * u_dim1] /= scale;
00223 /* Computing 2nd power */
00224             d__1 = u[i__ + k * u_dim1];
00225             s += d__1 * d__1;
00226 /* L230: */
00227         }
00228 
00229         f = u[i__ + l * u_dim1];
00230         d__1 = sqrt(s);
00231         g = -d_sign(&d__1, &f);
00232         h__ = f * g - s;
00233         u[i__ + l * u_dim1] = f - g;
00234 
00235         i__3 = *n;
00236         for (k = l; k <= i__3; ++k) {
00237 /* L240: */
00238             rv1[k] = u[i__ + k * u_dim1] / h__;
00239         }
00240 
00241         if (i__ == *m) {
00242             goto L270;
00243         }
00244 
00245         i__3 = *m;
00246         for (j = l; j <= i__3; ++j) {
00247             s = 0.;
00248 
00249             i__1 = *n;
00250             for (k = l; k <= i__1; ++k) {
00251 /* L250: */
00252                 s += u[j + k * u_dim1] * u[i__ + k * u_dim1];
00253             }
00254 
00255             i__1 = *n;
00256             for (k = l; k <= i__1; ++k) {
00257                 u[j + k * u_dim1] += s * rv1[k];
00258 /* L260: */
00259             }
00260         }
00261 
00262 L270:
00263         i__1 = *n;
00264         for (k = l; k <= i__1; ++k) {
00265 /* L280: */
00266             u[i__ + k * u_dim1] = scale * u[i__ + k * u_dim1];
00267         }
00268 
00269 L290:
00270 /* Computing MAX */
00271         d__3 = x, d__4 = (d__1 = w[i__], abs(d__1)) + (d__2 = rv1[i__], abs(
00272                 d__2));
00273         x = max(d__3,d__4);
00274 /* L300: */
00275     }
00276 /*     .......... accumulation of right-hand transformations .......... */
00277     if (! (*matv)) {
00278         goto L410;
00279     }
00280 /*     .......... for i=n step -1 until 1 do -- .......... */
00281     i__2 = *n;
00282     for (ii = 1; ii <= i__2; ++ii) {
00283         i__ = *n + 1 - ii;
00284         if (i__ == *n) {
00285             goto L390;
00286         }
00287         if (g == 0.) {
00288             goto L360;
00289         }
00290 
00291         i__1 = *n;
00292         for (j = l; j <= i__1; ++j) {
00293 /*     .......... double division avoids possible underflow ......
00294 .... */
00295 /* L320: */
00296             v[j + i__ * v_dim1] = u[i__ + j * u_dim1] / u[i__ + l * u_dim1] / 
00297                     g;
00298         }
00299 
00300         i__1 = *n;
00301         for (j = l; j <= i__1; ++j) {
00302             s = 0.;
00303 
00304             i__3 = *n;
00305             for (k = l; k <= i__3; ++k) {
00306 /* L340: */
00307                 s += u[i__ + k * u_dim1] * v[k + j * v_dim1];
00308             }
00309 
00310             i__3 = *n;
00311             for (k = l; k <= i__3; ++k) {
00312                 v[k + j * v_dim1] += s * v[k + i__ * v_dim1];
00313 /* L350: */
00314             }
00315         }
00316 
00317 L360:
00318         i__3 = *n;
00319         for (j = l; j <= i__3; ++j) {
00320             v[i__ + j * v_dim1] = 0.;
00321             v[j + i__ * v_dim1] = 0.;
00322 /* L380: */
00323         }
00324 
00325 L390:
00326         v[i__ + i__ * v_dim1] = 1.;
00327         g = rv1[i__];
00328         l = i__;
00329 /* L400: */
00330     }
00331 /*     .......... accumulation of left-hand transformations .......... */
00332 L410:
00333     if (! (*matu)) {
00334         goto L510;
00335     }
00336 /*     ..........for i=min(m,n) step -1 until 1 do -- .......... */
00337     mn = *n;
00338     if (*m < *n) {
00339         mn = *m;
00340     }
00341 
00342     i__2 = mn;
00343     for (ii = 1; ii <= i__2; ++ii) {
00344         i__ = mn + 1 - ii;
00345         l = i__ + 1;
00346         g = w[i__];
00347         if (i__ == *n) {
00348             goto L430;
00349         }
00350 
00351         i__3 = *n;
00352         for (j = l; j <= i__3; ++j) {
00353 /* L420: */
00354             u[i__ + j * u_dim1] = 0.;
00355         }
00356 
00357 L430:
00358         if (g == 0.) {
00359             goto L475;
00360         }
00361         if (i__ == mn) {
00362             goto L460;
00363         }
00364 
00365         i__3 = *n;
00366         for (j = l; j <= i__3; ++j) {
00367             s = 0.;
00368 
00369             i__1 = *m;
00370             for (k = l; k <= i__1; ++k) {
00371 /* L440: */
00372                 s += u[k + i__ * u_dim1] * u[k + j * u_dim1];
00373             }
00374 /*     .......... double division avoids possible underflow ......
00375 .... */
00376             f = s / u[i__ + i__ * u_dim1] / g;
00377 
00378             i__1 = *m;
00379             for (k = i__; k <= i__1; ++k) {
00380                 u[k + j * u_dim1] += f * u[k + i__ * u_dim1];
00381 /* L450: */
00382             }
00383         }
00384 
00385 L460:
00386         i__1 = *m;
00387         for (j = i__; j <= i__1; ++j) {
00388 /* L470: */
00389             u[j + i__ * u_dim1] /= g;
00390         }
00391 
00392         goto L490;
00393 
00394 L475:
00395         i__1 = *m;
00396         for (j = i__; j <= i__1; ++j) {
00397 /* L480: */
00398             u[j + i__ * u_dim1] = 0.;
00399         }
00400 
00401 L490:
00402         u[i__ + i__ * u_dim1] += 1.;
00403 /* L500: */
00404     }
00405 /*     .......... diagonalization of the bidiagonal form .......... */
00406 L510:
00407     tst1 = x;
00408 /*     .......... for k=n step -1 until 1 do -- .......... */
00409     i__2 = *n;
00410     for (kk = 1; kk <= i__2; ++kk) {
00411         k1 = *n - kk;
00412         k = k1 + 1;
00413         its = 0;
00414 /*     .......... test for splitting. */
00415 /*                for l=k step -1 until 1 do -- .......... */
00416 L520:
00417         i__1 = k;
00418         for (ll = 1; ll <= i__1; ++ll) {
00419             l1 = k - ll;
00420             l = l1 + 1;
00421             tst2 = tst1 + (d__1 = rv1[l], abs(d__1));
00422             if (tst2 == tst1) {
00423                 goto L565;
00424             }
00425 /*     .......... rv1(1) is always zero, so there is no exit */
00426 /*                through the bottom of the loop .......... */
00427             tst2 = tst1 + (d__1 = w[l1], abs(d__1));
00428             if (tst2 == tst1) {
00429                 goto L540;
00430             }
00431 /* L530: */
00432         }
00433 /*     .......... cancellation of rv1(l) if l greater than 1 .........
00434 . */
00435 L540:
00436         c__ = 0.;
00437         s = 1.;
00438 
00439         i__1 = k;
00440         for (i__ = l; i__ <= i__1; ++i__) {
00441             f = s * rv1[i__];
00442             rv1[i__] = c__ * rv1[i__];
00443             tst2 = tst1 + abs(f);
00444             if (tst2 == tst1) {
00445                 goto L565;
00446             }
00447             g = w[i__];
00448             h__ = pythag_(&f, &g);
00449             w[i__] = h__;
00450             c__ = g / h__;
00451             s = -f / h__;
00452             if (! (*matu)) {
00453                 goto L560;
00454             }
00455 
00456             i__3 = *m;
00457             for (j = 1; j <= i__3; ++j) {
00458                 y = u[j + l1 * u_dim1];
00459                 z__ = u[j + i__ * u_dim1];
00460                 u[j + l1 * u_dim1] = y * c__ + z__ * s;
00461                 u[j + i__ * u_dim1] = -y * s + z__ * c__;
00462 /* L550: */
00463             }
00464 
00465 L560:
00466             ;
00467         }
00468 /*     .......... test for convergence .......... */
00469 L565:
00470         z__ = w[k];
00471         if (l == k) {
00472             goto L650;
00473         }
00474 /*     .......... shift from bottom 2 by 2 minor .......... */
00475         if (its == 30) {
00476             goto L1000;
00477         }
00478         ++its;
00479         x = w[l];
00480         y = w[k1];
00481         g = rv1[k1];
00482         h__ = rv1[k];
00483         f = ((g + z__) / h__ * ((g - z__) / y) + y / h__ - h__ / y) * .5;
00484         g = pythag_(&f, &c_b47);
00485         f = x - z__ / x * z__ + h__ / x * (y / (f + d_sign(&g, &f)) - h__);
00486 /*     .......... next qr transformation .......... */
00487         c__ = 1.;
00488         s = 1.;
00489 
00490         i__1 = k1;
00491         for (i1 = l; i1 <= i__1; ++i1) {
00492             i__ = i1 + 1;
00493             g = rv1[i__];
00494             y = w[i__];
00495             h__ = s * g;
00496             g = c__ * g;
00497             z__ = pythag_(&f, &h__);
00498             rv1[i1] = z__;
00499             c__ = f / z__;
00500             s = h__ / z__;
00501             f = x * c__ + g * s;
00502             g = -x * s + g * c__;
00503             h__ = y * s;
00504             y *= c__;
00505             if (! (*matv)) {
00506                 goto L575;
00507             }
00508 
00509             i__3 = *n;
00510             for (j = 1; j <= i__3; ++j) {
00511                 x = v[j + i1 * v_dim1];
00512                 z__ = v[j + i__ * v_dim1];
00513                 v[j + i1 * v_dim1] = x * c__ + z__ * s;
00514                 v[j + i__ * v_dim1] = -x * s + z__ * c__;
00515 /* L570: */
00516             }
00517 
00518 L575:
00519             z__ = pythag_(&f, &h__);
00520             w[i1] = z__;
00521 /*     .......... rotation can be arbitrary if z is zero .........
00522 . */
00523             if (z__ == 0.) {
00524                 goto L580;
00525             }
00526             c__ = f / z__;
00527             s = h__ / z__;
00528 L580:
00529             f = c__ * g + s * y;
00530             x = -s * g + c__ * y;
00531             if (! (*matu)) {
00532                 goto L600;
00533             }
00534 
00535             i__3 = *m;
00536             for (j = 1; j <= i__3; ++j) {
00537                 y = u[j + i1 * u_dim1];
00538                 z__ = u[j + i__ * u_dim1];
00539                 u[j + i1 * u_dim1] = y * c__ + z__ * s;
00540                 u[j + i__ * u_dim1] = -y * s + z__ * c__;
00541 /* L590: */
00542             }
00543 
00544 L600:
00545             ;
00546         }
00547 
00548         rv1[l] = 0.;
00549         rv1[k] = f;
00550         w[k] = x;
00551         goto L520;
00552 /*     .......... convergence .......... */
00553 L650:
00554         if (z__ >= 0.) {
00555             goto L700;
00556         }
00557 /*     .......... w(k) is made non-negative .......... */
00558         w[k] = -z__;
00559         if (! (*matv)) {
00560             goto L700;
00561         }
00562 
00563         i__1 = *n;
00564         for (j = 1; j <= i__1; ++j) {
00565 /* L690: */
00566             v[j + k * v_dim1] = -v[j + k * v_dim1];
00567         }
00568 
00569 L700:
00570         ;
00571     }
00572 
00573     goto L1001;
00574 /*     .......... set error -- no convergence to a */
00575 /*                singular value after 30 iterations .......... */
00576 L1000:
00577     *ierr = k;
00578 L1001:
00579     return 0;
00580 } /* svd_ */

int tql1_ integer   n,
doublereal   d__,
doublereal   e,
integer   ierr
 

Definition at line 12 of file eis_tql1.c.

References abs, c_b10, d_sign(), l, p, pythag_(), and s2.

00014 {
00015     /* System generated locals */
00016     integer i__1, i__2;
00017     doublereal d__1, d__2;
00018 
00019     /* Builtin functions */
00020     double d_sign(doublereal *, doublereal *);
00021 
00022     /* Local variables */
00023     static doublereal c__, f, g, h__;
00024     static integer i__, j, l, m;
00025     static doublereal p, r__, s, c2, c3;
00026     static integer l1, l2;
00027     static doublereal s2;
00028     static integer ii;
00029     extern doublereal pythag_(doublereal *, doublereal *);
00030     static doublereal dl1, el1;
00031     static integer mml;
00032     static doublereal tst1, tst2;
00033 
00034 
00035 
00036 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TQL1, */
00037 /*     NUM. MATH. 11, 293-306(1968) BY BOWDLER, MARTIN, REINSCH, AND */
00038 /*     WILKINSON. */
00039 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 227-240(1971). */
00040 
00041 /*     THIS SUBROUTINE FINDS THE EIGENVALUES OF A SYMMETRIC */
00042 /*     TRIDIAGONAL MATRIX BY THE QL METHOD. */
00043 
00044 /*     ON INPUT */
00045 
00046 /*        N IS THE ORDER OF THE MATRIX. */
00047 
00048 /*        D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX. */
00049 
00050 /*        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX */
00051 /*          IN ITS LAST N-1 POSITIONS.  E(1) IS ARBITRARY. */
00052 
00053 /*      ON OUTPUT */
00054 
00055 /*        D CONTAINS THE EIGENVALUES IN ASCENDING ORDER.  IF AN */
00056 /*          ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT AND */
00057 /*          ORDERED FOR INDICES 1,2,...IERR-1, BUT MAY NOT BE */
00058 /*          THE SMALLEST EIGENVALUES. */
00059 
00060 /*        E HAS BEEN DESTROYED. */
00061 
00062 /*        IERR IS SET TO */
00063 /*          ZERO       FOR NORMAL RETURN, */
00064 /*          J          IF THE J-TH EIGENVALUE HAS NOT BEEN */
00065 /*                     DETERMINED AFTER 30 ITERATIONS. */
00066 
00067 /*     CALLS PYTHAG FOR  DSQRT(A*A + B*B) . */
00068 
00069 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00070 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00071 */
00072 
00073 /*     THIS VERSION DATED AUGUST 1983. */
00074 
00075 /*     ------------------------------------------------------------------ 
00076 */
00077 
00078     /* Parameter adjustments */
00079     --e;
00080     --d__;
00081 
00082     /* Function Body */
00083     *ierr = 0;
00084     if (*n == 1) {
00085         goto L1001;
00086     }
00087 
00088     i__1 = *n;
00089     for (i__ = 2; i__ <= i__1; ++i__) {
00090 /* L100: */
00091         e[i__ - 1] = e[i__];
00092     }
00093 
00094     f = 0.;
00095     tst1 = 0.;
00096     e[*n] = 0.;
00097 
00098     i__1 = *n;
00099     for (l = 1; l <= i__1; ++l) {
00100         j = 0;
00101         h__ = (d__1 = d__[l], abs(d__1)) + (d__2 = e[l], abs(d__2));
00102         if (tst1 < h__) {
00103             tst1 = h__;
00104         }
00105 /*     .......... LOOK FOR SMALL SUB-DIAGONAL ELEMENT .......... */
00106         i__2 = *n;
00107         for (m = l; m <= i__2; ++m) {
00108             tst2 = tst1 + (d__1 = e[m], abs(d__1));
00109             if (tst2 == tst1) {
00110                 goto L120;
00111             }
00112 /*     .......... E(N) IS ALWAYS ZERO, SO THERE IS NO EXIT */
00113 /*                THROUGH THE BOTTOM OF THE LOOP .......... */
00114 /* L110: */
00115         }
00116 
00117 L120:
00118         if (m == l) {
00119             goto L210;
00120         }
00121 L130:
00122         if (j == 30) {
00123             goto L1000;
00124         }
00125         ++j;
00126 /*     .......... FORM SHIFT .......... */
00127         l1 = l + 1;
00128         l2 = l1 + 1;
00129         g = d__[l];
00130         p = (d__[l1] - g) / (e[l] * 2.);
00131         r__ = pythag_(&p, &c_b10);
00132         d__[l] = e[l] / (p + d_sign(&r__, &p));
00133         d__[l1] = e[l] * (p + d_sign(&r__, &p));
00134         dl1 = d__[l1];
00135         h__ = g - d__[l];
00136         if (l2 > *n) {
00137             goto L145;
00138         }
00139 
00140         i__2 = *n;
00141         for (i__ = l2; i__ <= i__2; ++i__) {
00142 /* L140: */
00143             d__[i__] -= h__;
00144         }
00145 
00146 L145:
00147         f += h__;
00148 /*     .......... QL TRANSFORMATION .......... */
00149         p = d__[m];
00150         c__ = 1.;
00151         c2 = c__;
00152         el1 = e[l1];
00153         s = 0.;
00154         mml = m - l;
00155 /*     .......... FOR I=M-1 STEP -1 UNTIL L DO -- .......... */
00156         i__2 = mml;
00157         for (ii = 1; ii <= i__2; ++ii) {
00158             c3 = c2;
00159             c2 = c__;
00160             s2 = s;
00161             i__ = m - ii;
00162             g = c__ * e[i__];
00163             h__ = c__ * p;
00164             r__ = pythag_(&p, &e[i__]);
00165             e[i__ + 1] = s * r__;
00166             s = e[i__] / r__;
00167             c__ = p / r__;
00168             p = c__ * d__[i__] - s * g;
00169             d__[i__ + 1] = h__ + s * (c__ * g + s * d__[i__]);
00170 /* L200: */
00171         }
00172 
00173         p = -s * s2 * c3 * el1 * e[l] / dl1;
00174         e[l] = s * p;
00175         d__[l] = c__ * p;
00176         tst2 = tst1 + (d__1 = e[l], abs(d__1));
00177         if (tst2 > tst1) {
00178             goto L130;
00179         }
00180 L210:
00181         p = d__[l] + f;
00182 /*     .......... ORDER EIGENVALUES .......... */
00183         if (l == 1) {
00184             goto L250;
00185         }
00186 /*     .......... FOR I=L STEP -1 UNTIL 2 DO -- .......... */
00187         i__2 = l;
00188         for (ii = 2; ii <= i__2; ++ii) {
00189             i__ = l + 2 - ii;
00190             if (p >= d__[i__ - 1]) {
00191                 goto L270;
00192             }
00193             d__[i__] = d__[i__ - 1];
00194 /* L230: */
00195         }
00196 
00197 L250:
00198         i__ = 1;
00199 L270:
00200         d__[i__] = p;
00201 /* L290: */
00202     }
00203 
00204     goto L1001;
00205 /*     .......... SET ERROR -- NO CONVERGENCE TO AN */
00206 /*                EIGENVALUE AFTER 30 ITERATIONS .......... */
00207 L1000:
00208     *ierr = l;
00209 L1001:
00210     return 0;
00211 } /* tql1_ */

int tql2_ integer   nm,
integer   n,
doublereal   d__,
doublereal   e,
doublereal   z__,
integer   ierr
 

Definition at line 12 of file eis_tql2.c.

References abs, c_b10, d_sign(), l, p, pythag_(), and s2.

Referenced by ch_(), rs_(), rsb_(), rsg_(), rsgab_(), rsgba_(), and rsp_().

00014 {
00015     /* System generated locals */
00016     integer z_dim1, z_offset, i__1, i__2, i__3;
00017     doublereal d__1, d__2;
00018 
00019     /* Builtin functions */
00020     double d_sign(doublereal *, doublereal *);
00021 
00022     /* Local variables */
00023     static doublereal c__, f, g, h__;
00024     static integer i__, j, k, l, m;
00025     static doublereal p, r__, s, c2, c3;
00026     static integer l1, l2;
00027     static doublereal s2;
00028     static integer ii;
00029     extern doublereal pythag_(doublereal *, doublereal *);
00030     static doublereal dl1, el1;
00031     static integer mml;
00032     static doublereal tst1, tst2;
00033 
00034 
00035 
00036 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TQL2, */
00037 /*     NUM. MATH. 11, 293-306(1968) BY BOWDLER, MARTIN, REINSCH, AND */
00038 /*     WILKINSON. */
00039 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 227-240(1971). */
00040 
00041 /*     THIS SUBROUTINE FINDS THE EIGENVALUES AND EIGENVECTORS */
00042 /*     OF A SYMMETRIC TRIDIAGONAL MATRIX BY THE QL METHOD. */
00043 /*     THE EIGENVECTORS OF A FULL SYMMETRIC MATRIX CAN ALSO */
00044 /*     BE FOUND IF  TRED2  HAS BEEN USED TO REDUCE THIS */
00045 /*     FULL MATRIX TO TRIDIAGONAL FORM. */
00046 
00047 /*     ON INPUT */
00048 
00049 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00050 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00051 /*          DIMENSION STATEMENT. */
00052 
00053 /*        N IS THE ORDER OF THE MATRIX. */
00054 
00055 /*        D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX. */
00056 
00057 /*        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX */
00058 /*          IN ITS LAST N-1 POSITIONS.  E(1) IS ARBITRARY. */
00059 
00060 /*        Z CONTAINS THE TRANSFORMATION MATRIX PRODUCED IN THE */
00061 /*          REDUCTION BY  TRED2, IF PERFORMED.  IF THE EIGENVECTORS */
00062 /*          OF THE TRIDIAGONAL MATRIX ARE DESIRED, Z MUST CONTAIN */
00063 /*          THE IDENTITY MATRIX. */
00064 
00065 /*      ON OUTPUT */
00066 
00067 /*        D CONTAINS THE EIGENVALUES IN ASCENDING ORDER.  IF AN */
00068 /*          ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT BUT */
00069 /*          UNORDERED FOR INDICES 1,2,...,IERR-1. */
00070 
00071 /*        E HAS BEEN DESTROYED. */
00072 
00073 /*        Z CONTAINS ORTHONORMAL EIGENVECTORS OF THE SYMMETRIC */
00074 /*          TRIDIAGONAL (OR FULL) MATRIX.  IF AN ERROR EXIT IS MADE, */
00075 /*          Z CONTAINS THE EIGENVECTORS ASSOCIATED WITH THE STORED */
00076 /*          EIGENVALUES. */
00077 
00078 /*        IERR IS SET TO */
00079 /*          ZERO       FOR NORMAL RETURN, */
00080 /*          J          IF THE J-TH EIGENVALUE HAS NOT BEEN */
00081 /*                     DETERMINED AFTER 30 ITERATIONS. */
00082 
00083 /*     CALLS PYTHAG FOR  DSQRT(A*A + B*B) . */
00084 
00085 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00086 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00087 */
00088 
00089 /*     THIS VERSION DATED AUGUST 1983. */
00090 
00091 /*     ------------------------------------------------------------------ 
00092 */
00093 
00094     /* Parameter adjustments */
00095     z_dim1 = *nm;
00096     z_offset = z_dim1 + 1;
00097     z__ -= z_offset;
00098     --e;
00099     --d__;
00100 
00101     /* Function Body */
00102     *ierr = 0;
00103     if (*n == 1) {
00104         goto L1001;
00105     }
00106 
00107     i__1 = *n;
00108     for (i__ = 2; i__ <= i__1; ++i__) {
00109 /* L100: */
00110         e[i__ - 1] = e[i__];
00111     }
00112 
00113     f = 0.;
00114     tst1 = 0.;
00115     e[*n] = 0.;
00116 
00117     i__1 = *n;
00118     for (l = 1; l <= i__1; ++l) {
00119         j = 0;
00120         h__ = (d__1 = d__[l], abs(d__1)) + (d__2 = e[l], abs(d__2));
00121         if (tst1 < h__) {
00122             tst1 = h__;
00123         }
00124 /*     .......... LOOK FOR SMALL SUB-DIAGONAL ELEMENT .......... */
00125         i__2 = *n;
00126         for (m = l; m <= i__2; ++m) {
00127             tst2 = tst1 + (d__1 = e[m], abs(d__1));
00128             if (tst2 == tst1) {
00129                 goto L120;
00130             }
00131 /*     .......... E(N) IS ALWAYS ZERO, SO THERE IS NO EXIT */
00132 /*                THROUGH THE BOTTOM OF THE LOOP .......... */
00133 /* L110: */
00134         }
00135 
00136 L120:
00137         if (m == l) {
00138             goto L220;
00139         }
00140 L130:
00141         if (j == 30) {
00142             goto L1000;
00143         }
00144         ++j;
00145 /*     .......... FORM SHIFT .......... */
00146         l1 = l + 1;
00147         l2 = l1 + 1;
00148         g = d__[l];
00149         p = (d__[l1] - g) / (e[l] * 2.);
00150         r__ = pythag_(&p, &c_b10);
00151         d__[l] = e[l] / (p + d_sign(&r__, &p));
00152         d__[l1] = e[l] * (p + d_sign(&r__, &p));
00153         dl1 = d__[l1];
00154         h__ = g - d__[l];
00155         if (l2 > *n) {
00156             goto L145;
00157         }
00158 
00159         i__2 = *n;
00160         for (i__ = l2; i__ <= i__2; ++i__) {
00161 /* L140: */
00162             d__[i__] -= h__;
00163         }
00164 
00165 L145:
00166         f += h__;
00167 /*     .......... QL TRANSFORMATION .......... */
00168         p = d__[m];
00169         c__ = 1.;
00170         c2 = c__;
00171         el1 = e[l1];
00172         s = 0.;
00173         mml = m - l;
00174 /*     .......... FOR I=M-1 STEP -1 UNTIL L DO -- .......... */
00175         i__2 = mml;
00176         for (ii = 1; ii <= i__2; ++ii) {
00177             c3 = c2;
00178             c2 = c__;
00179             s2 = s;
00180             i__ = m - ii;
00181             g = c__ * e[i__];
00182             h__ = c__ * p;
00183             r__ = pythag_(&p, &e[i__]);
00184             e[i__ + 1] = s * r__;
00185             s = e[i__] / r__;
00186             c__ = p / r__;
00187             p = c__ * d__[i__] - s * g;
00188             d__[i__ + 1] = h__ + s * (c__ * g + s * d__[i__]);
00189 /*     .......... FORM VECTOR .......... */
00190             i__3 = *n;
00191             for (k = 1; k <= i__3; ++k) {
00192                 h__ = z__[k + (i__ + 1) * z_dim1];
00193                 z__[k + (i__ + 1) * z_dim1] = s * z__[k + i__ * z_dim1] + c__ 
00194                         * h__;
00195                 z__[k + i__ * z_dim1] = c__ * z__[k + i__ * z_dim1] - s * h__;
00196 /* L180: */
00197             }
00198 
00199 /* L200: */
00200         }
00201 
00202         p = -s * s2 * c3 * el1 * e[l] / dl1;
00203         e[l] = s * p;
00204         d__[l] = c__ * p;
00205         tst2 = tst1 + (d__1 = e[l], abs(d__1));
00206         if (tst2 > tst1) {
00207             goto L130;
00208         }
00209 L220:
00210         d__[l] += f;
00211 /* L240: */
00212     }
00213 /*     .......... ORDER EIGENVALUES AND EIGENVECTORS .......... */
00214     i__1 = *n;
00215     for (ii = 2; ii <= i__1; ++ii) {
00216         i__ = ii - 1;
00217         k = i__;
00218         p = d__[i__];
00219 
00220         i__2 = *n;
00221         for (j = ii; j <= i__2; ++j) {
00222             if (d__[j] >= p) {
00223                 goto L260;
00224             }
00225             k = j;
00226             p = d__[j];
00227 L260:
00228             ;
00229         }
00230 
00231         if (k == i__) {
00232             goto L300;
00233         }
00234         d__[k] = d__[i__];
00235         d__[i__] = p;
00236 
00237         i__2 = *n;
00238         for (j = 1; j <= i__2; ++j) {
00239             p = z__[j + i__ * z_dim1];
00240             z__[j + i__ * z_dim1] = z__[j + k * z_dim1];
00241             z__[j + k * z_dim1] = p;
00242 /* L280: */
00243         }
00244 
00245 L300:
00246         ;
00247     }
00248 
00249     goto L1001;
00250 /*     .......... SET ERROR -- NO CONVERGENCE TO AN */
00251 /*                EIGENVALUE AFTER 30 ITERATIONS .......... */
00252 L1000:
00253     *ierr = l;
00254 L1001:
00255     return 0;
00256 } /* tql2_ */

int tqlrat_ integer   n,
doublereal   d__,
doublereal   e2,
integer   ierr
 

Definition at line 12 of file eis_tqlrat.c.

References abs, c_b11, d_sign(), epslon_(), l, p, and pythag_().

Referenced by ch_(), rs_(), rsb_(), rsg_(), rsgab_(), rsgba_(), rsm_(), and rsp_().

00014 {
00015     /* System generated locals */
00016     integer i__1, i__2;
00017     doublereal d__1, d__2;
00018 
00019     /* Builtin functions */
00020     double d_sign(doublereal *, doublereal *);
00021 
00022     /* Local variables */
00023     static doublereal b, c__, f, g, h__;
00024     static integer i__, j, l, m;
00025     static doublereal p, r__, s, t;
00026     static integer l1, ii;
00027     extern doublereal pythag_(doublereal *, doublereal *), epslon_(doublereal 
00028             *);
00029     static integer mml;
00030 
00031 
00032 
00033 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TQLRAT, */
00034 /*     ALGORITHM 464, COMM. ACM 16, 689(1973) BY REINSCH. */
00035 
00036 /*     THIS SUBROUTINE FINDS THE EIGENVALUES OF A SYMMETRIC */
00037 /*     TRIDIAGONAL MATRIX BY THE RATIONAL QL METHOD. */
00038 
00039 /*     ON INPUT */
00040 
00041 /*        N IS THE ORDER OF THE MATRIX. */
00042 
00043 /*        D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX. */
00044 
00045 /*        E2 CONTAINS THE SQUARES OF THE SUBDIAGONAL ELEMENTS OF THE */
00046 /*          INPUT MATRIX IN ITS LAST N-1 POSITIONS.  E2(1) IS ARBITRARY. 
00047 */
00048 
00049 /*      ON OUTPUT */
00050 
00051 /*        D CONTAINS THE EIGENVALUES IN ASCENDING ORDER.  IF AN */
00052 /*          ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT AND */
00053 /*          ORDERED FOR INDICES 1,2,...IERR-1, BUT MAY NOT BE */
00054 /*          THE SMALLEST EIGENVALUES. */
00055 
00056 /*        E2 HAS BEEN DESTROYED. */
00057 
00058 /*        IERR IS SET TO */
00059 /*          ZERO       FOR NORMAL RETURN, */
00060 /*          J          IF THE J-TH EIGENVALUE HAS NOT BEEN */
00061 /*                     DETERMINED AFTER 30 ITERATIONS. */
00062 
00063 /*     CALLS PYTHAG FOR  DSQRT(A*A + B*B) . */
00064 
00065 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00066 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00067 */
00068 
00069 /*     THIS VERSION DATED AUGUST 1983. */
00070 
00071 /*     ------------------------------------------------------------------ 
00072 */
00073 
00074     /* Parameter adjustments */
00075     --e2;
00076     --d__;
00077 
00078     /* Function Body */
00079     *ierr = 0;
00080     if (*n == 1) {
00081         goto L1001;
00082     }
00083 
00084     i__1 = *n;
00085     for (i__ = 2; i__ <= i__1; ++i__) {
00086 /* L100: */
00087         e2[i__ - 1] = e2[i__];
00088     }
00089 
00090     f = 0.;
00091     t = 0.;
00092     e2[*n] = 0.;
00093 
00094     i__1 = *n;
00095     for (l = 1; l <= i__1; ++l) {
00096         j = 0;
00097         h__ = (d__1 = d__[l], abs(d__1)) + sqrt(e2[l]);
00098         if (t > h__) {
00099             goto L105;
00100         }
00101         t = h__;
00102         b = epslon_(&t);
00103         c__ = b * b;
00104 /*     .......... LOOK FOR SMALL SQUARED SUB-DIAGONAL ELEMENT ........
00105 .. */
00106 L105:
00107         i__2 = *n;
00108         for (m = l; m <= i__2; ++m) {
00109             if (e2[m] <= c__) {
00110                 goto L120;
00111             }
00112 /*     .......... E2(N) IS ALWAYS ZERO, SO THERE IS NO EXIT */
00113 /*                THROUGH THE BOTTOM OF THE LOOP .......... */
00114 /* L110: */
00115         }
00116 
00117 L120:
00118         if (m == l) {
00119             goto L210;
00120         }
00121 L130:
00122         if (j == 30) {
00123             goto L1000;
00124         }
00125         ++j;
00126 /*     .......... FORM SHIFT .......... */
00127         l1 = l + 1;
00128         s = sqrt(e2[l]);
00129         g = d__[l];
00130         p = (d__[l1] - g) / (s * 2.);
00131         r__ = pythag_(&p, &c_b11);
00132         d__[l] = s / (p + d_sign(&r__, &p));
00133         h__ = g - d__[l];
00134 
00135         i__2 = *n;
00136         for (i__ = l1; i__ <= i__2; ++i__) {
00137 /* L140: */
00138             d__[i__] -= h__;
00139         }
00140 
00141         f += h__;
00142 /*     .......... RATIONAL QL TRANSFORMATION .......... */
00143         g = d__[m];
00144         if (g == 0.) {
00145             g = b;
00146         }
00147         h__ = g;
00148         s = 0.;
00149         mml = m - l;
00150 /*     .......... FOR I=M-1 STEP -1 UNTIL L DO -- .......... */
00151         i__2 = mml;
00152         for (ii = 1; ii <= i__2; ++ii) {
00153             i__ = m - ii;
00154             p = g * h__;
00155             r__ = p + e2[i__];
00156             e2[i__ + 1] = s * r__;
00157             s = e2[i__] / r__;
00158             d__[i__ + 1] = h__ + s * (h__ + d__[i__]);
00159             g = d__[i__] - e2[i__] / g;
00160             if (g == 0.) {
00161                 g = b;
00162             }
00163             h__ = g * p / r__;
00164 /* L200: */
00165         }
00166 
00167         e2[l] = s * g;
00168         d__[l] = h__;
00169 /*     .......... GUARD AGAINST UNDERFLOW IN CONVERGENCE TEST ........
00170 .. */
00171         if (h__ == 0.) {
00172             goto L210;
00173         }
00174         if ((d__1 = e2[l], abs(d__1)) <= (d__2 = c__ / h__, abs(d__2))) {
00175             goto L210;
00176         }
00177         e2[l] = h__ * e2[l];
00178         if (e2[l] != 0.) {
00179             goto L130;
00180         }
00181 L210:
00182         p = d__[l] + f;
00183 /*     .......... ORDER EIGENVALUES .......... */
00184         if (l == 1) {
00185             goto L250;
00186         }
00187 /*     .......... FOR I=L STEP -1 UNTIL 2 DO -- .......... */
00188         i__2 = l;
00189         for (ii = 2; ii <= i__2; ++ii) {
00190             i__ = l + 2 - ii;
00191             if (p >= d__[i__ - 1]) {
00192                 goto L270;
00193             }
00194             d__[i__] = d__[i__ - 1];
00195 /* L230: */
00196         }
00197 
00198 L250:
00199         i__ = 1;
00200 L270:
00201         d__[i__] = p;
00202 /* L290: */
00203     }
00204 
00205     goto L1001;
00206 /*     .......... SET ERROR -- NO CONVERGENCE TO AN */
00207 /*                EIGENVALUE AFTER 30 ITERATIONS .......... */
00208 L1000:
00209     *ierr = l;
00210 L1001:
00211     return 0;
00212 } /* tqlrat_ */

int trbak1_ integer   nm,
integer   n,
doublereal   a,
doublereal   e,
integer   m,
doublereal   z__
 

Definition at line 8 of file eis_trbak1.c.

References a, and l.

Referenced by rsm_().

00010 {
00011     /* System generated locals */
00012     integer a_dim1, a_offset, z_dim1, z_offset, i__1, i__2, i__3;
00013 
00014     /* Local variables */
00015     static integer i__, j, k, l;
00016     static doublereal s;
00017 
00018 
00019 
00020 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TRBAK1, */
00021 /*     NUM. MATH. 11, 181-195(1968) BY MARTIN, REINSCH, AND WILKINSON. */
00022 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971). */
00023 
00024 /*     THIS SUBROUTINE FORMS THE EIGENVECTORS OF A REAL SYMMETRIC */
00025 /*     MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDING */
00026 /*     SYMMETRIC TRIDIAGONAL MATRIX DETERMINED BY  TRED1. */
00027 
00028 /*     ON INPUT */
00029 
00030 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00031 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00032 /*          DIMENSION STATEMENT. */
00033 
00034 /*        N IS THE ORDER OF THE MATRIX. */
00035 
00036 /*        A CONTAINS INFORMATION ABOUT THE ORTHOGONAL TRANS- */
00037 /*          FORMATIONS USED IN THE REDUCTION BY  TRED1 */
00038 /*          IN ITS STRICT LOWER TRIANGLE. */
00039 
00040 /*        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE TRIDIAGONAL */
00041 /*          MATRIX IN ITS LAST N-1 POSITIONS.  E(1) IS ARBITRARY. */
00042 
00043 /*        M IS THE NUMBER OF EIGENVECTORS TO BE BACK TRANSFORMED. */
00044 
00045 /*        Z CONTAINS THE EIGENVECTORS TO BE BACK TRANSFORMED */
00046 /*          IN ITS FIRST M COLUMNS. */
00047 
00048 /*     ON OUTPUT */
00049 
00050 /*        Z CONTAINS THE TRANSFORMED EIGENVECTORS */
00051 /*          IN ITS FIRST M COLUMNS. */
00052 
00053 /*     NOTE THAT TRBAK1 PRESERVES VECTOR EUCLIDEAN NORMS. */
00054 
00055 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00056 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00057 */
00058 
00059 /*     THIS VERSION DATED AUGUST 1983. */
00060 
00061 /*     ------------------------------------------------------------------ 
00062 */
00063 
00064     /* Parameter adjustments */
00065     --e;
00066     a_dim1 = *nm;
00067     a_offset = a_dim1 + 1;
00068     a -= a_offset;
00069     z_dim1 = *nm;
00070     z_offset = z_dim1 + 1;
00071     z__ -= z_offset;
00072 
00073     /* Function Body */
00074     if (*m == 0) {
00075         goto L200;
00076     }
00077     if (*n == 1) {
00078         goto L200;
00079     }
00080 
00081     i__1 = *n;
00082     for (i__ = 2; i__ <= i__1; ++i__) {
00083         l = i__ - 1;
00084         if (e[i__] == 0.) {
00085             goto L140;
00086         }
00087 
00088         i__2 = *m;
00089         for (j = 1; j <= i__2; ++j) {
00090             s = 0.;
00091 
00092             i__3 = l;
00093             for (k = 1; k <= i__3; ++k) {
00094 /* L110: */
00095                 s += a[i__ + k * a_dim1] * z__[k + j * z_dim1];
00096             }
00097 /*     .......... DIVISOR BELOW IS NEGATIVE OF H FORMED IN TRED1. 
00098 */
00099 /*                DOUBLE DIVISION AVOIDS POSSIBLE UNDERFLOW ......
00100 .... */
00101             s = s / a[i__ + l * a_dim1] / e[i__];
00102 
00103             i__3 = l;
00104             for (k = 1; k <= i__3; ++k) {
00105 /* L120: */
00106                 z__[k + j * z_dim1] += s * a[i__ + k * a_dim1];
00107             }
00108 
00109 /* L130: */
00110         }
00111 
00112 L140:
00113         ;
00114     }
00115 
00116 L200:
00117     return 0;
00118 } /* trbak1_ */

int trbak3_ integer   nm,
integer   n,
integer   nv,
doublereal   a,
integer   m,
doublereal   z__
 

Definition at line 8 of file eis_trbak3.c.

References a, and l.

Referenced by rsp_().

00010 {
00011     /* System generated locals */
00012     integer z_dim1, z_offset, i__1, i__2, i__3;
00013 
00014     /* Local variables */
00015     static doublereal h__;
00016     static integer i__, j, k, l;
00017     static doublereal s;
00018     static integer ik, iz;
00019 
00020 
00021 
00022 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TRBAK3, */
00023 /*     NUM. MATH. 11, 181-195(1968) BY MARTIN, REINSCH, AND WILKINSON. */
00024 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971). */
00025 
00026 /*     THIS SUBROUTINE FORMS THE EIGENVECTORS OF A REAL SYMMETRIC */
00027 /*     MATRIX BY BACK TRANSFORMING THOSE OF THE CORRESPONDING */
00028 /*     SYMMETRIC TRIDIAGONAL MATRIX DETERMINED BY  TRED3. */
00029 
00030 /*     ON INPUT */
00031 
00032 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00033 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00034 /*          DIMENSION STATEMENT. */
00035 
00036 /*        N IS THE ORDER OF THE MATRIX. */
00037 
00038 /*        NV MUST BE SET TO THE DIMENSION OF THE ARRAY PARAMETER A */
00039 /*          AS DECLARED IN THE CALLING PROGRAM DIMENSION STATEMENT. */
00040 
00041 /*        A CONTAINS INFORMATION ABOUT THE ORTHOGONAL TRANSFORMATIONS */
00042 /*          USED IN THE REDUCTION BY  TRED3  IN ITS FIRST */
00043 /*          N*(N+1)/2 POSITIONS. */
00044 
00045 /*        M IS THE NUMBER OF EIGENVECTORS TO BE BACK TRANSFORMED. */
00046 
00047 /*        Z CONTAINS THE EIGENVECTORS TO BE BACK TRANSFORMED */
00048 /*          IN ITS FIRST M COLUMNS. */
00049 
00050 /*     ON OUTPUT */
00051 
00052 /*        Z CONTAINS THE TRANSFORMED EIGENVECTORS */
00053 /*          IN ITS FIRST M COLUMNS. */
00054 
00055 /*     NOTE THAT TRBAK3 PRESERVES VECTOR EUCLIDEAN NORMS. */
00056 
00057 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00058 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00059 */
00060 
00061 /*     THIS VERSION DATED AUGUST 1983. */
00062 
00063 /*     ------------------------------------------------------------------ 
00064 */
00065 
00066     /* Parameter adjustments */
00067     --a;
00068     z_dim1 = *nm;
00069     z_offset = z_dim1 + 1;
00070     z__ -= z_offset;
00071 
00072     /* Function Body */
00073     if (*m == 0) {
00074         goto L200;
00075     }
00076     if (*n == 1) {
00077         goto L200;
00078     }
00079 
00080     i__1 = *n;
00081     for (i__ = 2; i__ <= i__1; ++i__) {
00082         l = i__ - 1;
00083         iz = i__ * l / 2;
00084         ik = iz + i__;
00085         h__ = a[ik];
00086         if (h__ == 0.) {
00087             goto L140;
00088         }
00089 
00090         i__2 = *m;
00091         for (j = 1; j <= i__2; ++j) {
00092             s = 0.;
00093             ik = iz;
00094 
00095             i__3 = l;
00096             for (k = 1; k <= i__3; ++k) {
00097                 ++ik;
00098                 s += a[ik] * z__[k + j * z_dim1];
00099 /* L110: */
00100             }
00101 /*     .......... DOUBLE DIVISION AVOIDS POSSIBLE UNDERFLOW ......
00102 .... */
00103             s = s / h__ / h__;
00104             ik = iz;
00105 
00106             i__3 = l;
00107             for (k = 1; k <= i__3; ++k) {
00108                 ++ik;
00109                 z__[k + j * z_dim1] -= s * a[ik];
00110 /* L120: */
00111             }
00112 
00113 /* L130: */
00114         }
00115 
00116 L140:
00117         ;
00118     }
00119 
00120 L200:
00121     return 0;
00122 } /* trbak3_ */

int tred1_ integer   nm,
integer   n,
doublereal   a,
doublereal   d__,
doublereal   e,
doublereal   e2
 

Definition at line 8 of file eis_tred1.c.

References a, abs, d_sign(), l, and scale.

Referenced by rs_(), rsg_(), rsgab_(), rsgba_(), and rsm_().

00010 {
00011     /* System generated locals */
00012     integer a_dim1, a_offset, i__1, i__2, i__3;
00013     doublereal d__1;
00014 
00015     /* Builtin functions */
00016     double d_sign(doublereal *, doublereal *);
00017 
00018     /* Local variables */
00019     static doublereal f, g, h__;
00020     static integer i__, j, k, l;
00021     static doublereal scale;
00022     static integer ii, jp1;
00023 
00024 
00025 
00026 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TRED1, */
00027 /*     NUM. MATH. 11, 181-195(1968) BY MARTIN, REINSCH, AND WILKINSON. */
00028 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971). */
00029 
00030 /*     THIS SUBROUTINE REDUCES A REAL SYMMETRIC MATRIX */
00031 /*     TO A SYMMETRIC TRIDIAGONAL MATRIX USING */
00032 /*     ORTHOGONAL SIMILARITY TRANSFORMATIONS. */
00033 
00034 /*     ON INPUT */
00035 
00036 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00037 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00038 /*          DIMENSION STATEMENT. */
00039 
00040 /*        N IS THE ORDER OF THE MATRIX. */
00041 
00042 /*        A CONTAINS THE REAL SYMMETRIC INPUT MATRIX.  ONLY THE */
00043 /*          LOWER TRIANGLE OF THE MATRIX NEED BE SUPPLIED. */
00044 
00045 /*     ON OUTPUT */
00046 
00047 /*        A CONTAINS INFORMATION ABOUT THE ORTHOGONAL TRANS- */
00048 /*          FORMATIONS USED IN THE REDUCTION IN ITS STRICT LOWER */
00049 /*          TRIANGLE.  THE FULL UPPER TRIANGLE OF A IS UNALTERED. */
00050 
00051 /*        D CONTAINS THE DIAGONAL ELEMENTS OF THE TRIDIAGONAL MATRIX. */
00052 
00053 /*        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE TRIDIAGONAL */
00054 /*          MATRIX IN ITS LAST N-1 POSITIONS.  E(1) IS SET TO ZERO. */
00055 
00056 /*        E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E. */
00057 /*          E2 MAY COINCIDE WITH E IF THE SQUARES ARE NOT NEEDED. */
00058 
00059 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00060 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00061 */
00062 
00063 /*     THIS VERSION DATED AUGUST 1983. */
00064 
00065 /*     ------------------------------------------------------------------ 
00066 */
00067 
00068     /* Parameter adjustments */
00069     --e2;
00070     --e;
00071     --d__;
00072     a_dim1 = *nm;
00073     a_offset = a_dim1 + 1;
00074     a -= a_offset;
00075 
00076     /* Function Body */
00077     i__1 = *n;
00078     for (i__ = 1; i__ <= i__1; ++i__) {
00079         d__[i__] = a[*n + i__ * a_dim1];
00080         a[*n + i__ * a_dim1] = a[i__ + i__ * a_dim1];
00081 /* L100: */
00082     }
00083 /*     .......... FOR I=N STEP -1 UNTIL 1 DO -- .......... */
00084     i__1 = *n;
00085     for (ii = 1; ii <= i__1; ++ii) {
00086         i__ = *n + 1 - ii;
00087         l = i__ - 1;
00088         h__ = 0.;
00089         scale = 0.;
00090         if (l < 1) {
00091             goto L130;
00092         }
00093 /*     .......... SCALE ROW (ALGOL TOL THEN NOT NEEDED) .......... */
00094         i__2 = l;
00095         for (k = 1; k <= i__2; ++k) {
00096 /* L120: */
00097             scale += (d__1 = d__[k], abs(d__1));
00098         }
00099 
00100         if (scale != 0.) {
00101             goto L140;
00102         }
00103 
00104         i__2 = l;
00105         for (j = 1; j <= i__2; ++j) {
00106             d__[j] = a[l + j * a_dim1];
00107             a[l + j * a_dim1] = a[i__ + j * a_dim1];
00108             a[i__ + j * a_dim1] = 0.;
00109 /* L125: */
00110         }
00111 
00112 L130:
00113         e[i__] = 0.;
00114         e2[i__] = 0.;
00115         goto L300;
00116 
00117 L140:
00118         i__2 = l;
00119         for (k = 1; k <= i__2; ++k) {
00120             d__[k] /= scale;
00121             h__ += d__[k] * d__[k];
00122 /* L150: */
00123         }
00124 
00125         e2[i__] = scale * scale * h__;
00126         f = d__[l];
00127         d__1 = sqrt(h__);
00128         g = -d_sign(&d__1, &f);
00129         e[i__] = scale * g;
00130         h__ -= f * g;
00131         d__[l] = f - g;
00132         if (l == 1) {
00133             goto L285;
00134         }
00135 /*     .......... FORM A*U .......... */
00136         i__2 = l;
00137         for (j = 1; j <= i__2; ++j) {
00138 /* L170: */
00139             e[j] = 0.;
00140         }
00141 
00142         i__2 = l;
00143         for (j = 1; j <= i__2; ++j) {
00144             f = d__[j];
00145             g = e[j] + a[j + j * a_dim1] * f;
00146             jp1 = j + 1;
00147             if (l < jp1) {
00148                 goto L220;
00149             }
00150 
00151             i__3 = l;
00152             for (k = jp1; k <= i__3; ++k) {
00153                 g += a[k + j * a_dim1] * d__[k];
00154                 e[k] += a[k + j * a_dim1] * f;
00155 /* L200: */
00156             }
00157 
00158 L220:
00159             e[j] = g;
00160 /* L240: */
00161         }
00162 /*     .......... FORM P .......... */
00163         f = 0.;
00164 
00165         i__2 = l;
00166         for (j = 1; j <= i__2; ++j) {
00167             e[j] /= h__;
00168             f += e[j] * d__[j];
00169 /* L245: */
00170         }
00171 
00172         h__ = f / (h__ + h__);
00173 /*     .......... FORM Q .......... */
00174         i__2 = l;
00175         for (j = 1; j <= i__2; ++j) {
00176 /* L250: */
00177             e[j] -= h__ * d__[j];
00178         }
00179 /*     .......... FORM REDUCED A .......... */
00180         i__2 = l;
00181         for (j = 1; j <= i__2; ++j) {
00182             f = d__[j];
00183             g = e[j];
00184 
00185             i__3 = l;
00186             for (k = j; k <= i__3; ++k) {
00187 /* L260: */
00188                 a[k + j * a_dim1] = a[k + j * a_dim1] - f * e[k] - g * d__[k];
00189             }
00190 
00191 /* L280: */
00192         }
00193 
00194 L285:
00195         i__2 = l;
00196         for (j = 1; j <= i__2; ++j) {
00197             f = d__[j];
00198             d__[j] = a[l + j * a_dim1];
00199             a[l + j * a_dim1] = a[i__ + j * a_dim1];
00200             a[i__ + j * a_dim1] = f * scale;
00201 /* L290: */
00202         }
00203 
00204 L300:
00205         ;
00206     }
00207 
00208     return 0;
00209 } /* tred1_ */

int tred2_ integer   nm,
integer   n,
doublereal   a,
doublereal   d__,
doublereal   e,
doublereal   z__
 

Definition at line 8 of file eis_tred2.c.

References a, abs, d_sign(), l, and scale.

Referenced by rs_(), rsg_(), rsgab_(), and rsgba_().

00010 {
00011     /* System generated locals */
00012     integer a_dim1, a_offset, z_dim1, z_offset, i__1, i__2, i__3;
00013     doublereal d__1;
00014 
00015     /* Builtin functions */
00016     double d_sign(doublereal *, doublereal *);
00017 
00018     /* Local variables */
00019     static doublereal f, g, h__;
00020     static integer i__, j, k, l;
00021     static doublereal scale, hh;
00022     static integer ii, jp1;
00023 
00024 
00025 
00026 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TRED2, */
00027 /*     NUM. MATH. 11, 181-195(1968) BY MARTIN, REINSCH, AND WILKINSON. */
00028 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971). */
00029 
00030 /*     THIS SUBROUTINE REDUCES A REAL SYMMETRIC MATRIX TO A */
00031 /*     SYMMETRIC TRIDIAGONAL MATRIX USING AND ACCUMULATING */
00032 /*     ORTHOGONAL SIMILARITY TRANSFORMATIONS. */
00033 
00034 /*     ON INPUT */
00035 
00036 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00037 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00038 /*          DIMENSION STATEMENT. */
00039 
00040 /*        N IS THE ORDER OF THE MATRIX. */
00041 
00042 /*        A CONTAINS THE REAL SYMMETRIC INPUT MATRIX.  ONLY THE */
00043 /*          LOWER TRIANGLE OF THE MATRIX NEED BE SUPPLIED. */
00044 
00045 /*     ON OUTPUT */
00046 
00047 /*        D CONTAINS THE DIAGONAL ELEMENTS OF THE TRIDIAGONAL MATRIX. */
00048 
00049 /*        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE TRIDIAGONAL */
00050 /*          MATRIX IN ITS LAST N-1 POSITIONS.  E(1) IS SET TO ZERO. */
00051 
00052 /*        Z CONTAINS THE ORTHOGONAL TRANSFORMATION MATRIX */
00053 /*          PRODUCED IN THE REDUCTION. */
00054 
00055 /*        A AND Z MAY COINCIDE.  IF DISTINCT, A IS UNALTERED. */
00056 
00057 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00058 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00059 */
00060 
00061 /*     THIS VERSION DATED AUGUST 1983. */
00062 
00063 /*     ------------------------------------------------------------------ 
00064 */
00065 
00066     /* Parameter adjustments */
00067     z_dim1 = *nm;
00068     z_offset = z_dim1 + 1;
00069     z__ -= z_offset;
00070     --e;
00071     --d__;
00072     a_dim1 = *nm;
00073     a_offset = a_dim1 + 1;
00074     a -= a_offset;
00075 
00076     /* Function Body */
00077     i__1 = *n;
00078     for (i__ = 1; i__ <= i__1; ++i__) {
00079 
00080         i__2 = *n;
00081         for (j = i__; j <= i__2; ++j) {
00082 /* L80: */
00083             z__[j + i__ * z_dim1] = a[j + i__ * a_dim1];
00084         }
00085 
00086         d__[i__] = a[*n + i__ * a_dim1];
00087 /* L100: */
00088     }
00089 
00090     if (*n == 1) {
00091         goto L510;
00092     }
00093 /*     .......... FOR I=N STEP -1 UNTIL 2 DO -- .......... */
00094     i__1 = *n;
00095     for (ii = 2; ii <= i__1; ++ii) {
00096         i__ = *n + 2 - ii;
00097         l = i__ - 1;
00098         h__ = 0.;
00099         scale = 0.;
00100         if (l < 2) {
00101             goto L130;
00102         }
00103 /*     .......... SCALE ROW (ALGOL TOL THEN NOT NEEDED) .......... */
00104         i__2 = l;
00105         for (k = 1; k <= i__2; ++k) {
00106 /* L120: */
00107             scale += (d__1 = d__[k], abs(d__1));
00108         }
00109 
00110         if (scale != 0.) {
00111             goto L140;
00112         }
00113 L130:
00114         e[i__] = d__[l];
00115 
00116         i__2 = l;
00117         for (j = 1; j <= i__2; ++j) {
00118             d__[j] = z__[l + j * z_dim1];
00119             z__[i__ + j * z_dim1] = 0.;
00120             z__[j + i__ * z_dim1] = 0.;
00121 /* L135: */
00122         }
00123 
00124         goto L290;
00125 
00126 L140:
00127         i__2 = l;
00128         for (k = 1; k <= i__2; ++k) {
00129             d__[k] /= scale;
00130             h__ += d__[k] * d__[k];
00131 /* L150: */
00132         }
00133 
00134         f = d__[l];
00135         d__1 = sqrt(h__);
00136         g = -d_sign(&d__1, &f);
00137         e[i__] = scale * g;
00138         h__ -= f * g;
00139         d__[l] = f - g;
00140 /*     .......... FORM A*U .......... */
00141         i__2 = l;
00142         for (j = 1; j <= i__2; ++j) {
00143 /* L170: */
00144             e[j] = 0.;
00145         }
00146 
00147         i__2 = l;
00148         for (j = 1; j <= i__2; ++j) {
00149             f = d__[j];
00150             z__[j + i__ * z_dim1] = f;
00151             g = e[j] + z__[j + j * z_dim1] * f;
00152             jp1 = j + 1;
00153             if (l < jp1) {
00154                 goto L220;
00155             }
00156 
00157             i__3 = l;
00158             for (k = jp1; k <= i__3; ++k) {
00159                 g += z__[k + j * z_dim1] * d__[k];
00160                 e[k] += z__[k + j * z_dim1] * f;
00161 /* L200: */
00162             }
00163 
00164 L220:
00165             e[j] = g;
00166 /* L240: */
00167         }
00168 /*     .......... FORM P .......... */
00169         f = 0.;
00170 
00171         i__2 = l;
00172         for (j = 1; j <= i__2; ++j) {
00173             e[j] /= h__;
00174             f += e[j] * d__[j];
00175 /* L245: */
00176         }
00177 
00178         hh = f / (h__ + h__);
00179 /*     .......... FORM Q .......... */
00180         i__2 = l;
00181         for (j = 1; j <= i__2; ++j) {
00182 /* L250: */
00183             e[j] -= hh * d__[j];
00184         }
00185 /*     .......... FORM REDUCED A .......... */
00186         i__2 = l;
00187         for (j = 1; j <= i__2; ++j) {
00188             f = d__[j];
00189             g = e[j];
00190 
00191             i__3 = l;
00192             for (k = j; k <= i__3; ++k) {
00193 /* L260: */
00194                 z__[k + j * z_dim1] = z__[k + j * z_dim1] - f * e[k] - g * 
00195                         d__[k];
00196             }
00197 
00198             d__[j] = z__[l + j * z_dim1];
00199             z__[i__ + j * z_dim1] = 0.;
00200 /* L280: */
00201         }
00202 
00203 L290:
00204         d__[i__] = h__;
00205 /* L300: */
00206     }
00207 /*     .......... ACCUMULATION OF TRANSFORMATION MATRICES .......... */
00208     i__1 = *n;
00209     for (i__ = 2; i__ <= i__1; ++i__) {
00210         l = i__ - 1;
00211         z__[*n + l * z_dim1] = z__[l + l * z_dim1];
00212         z__[l + l * z_dim1] = 1.;
00213         h__ = d__[i__];
00214         if (h__ == 0.) {
00215             goto L380;
00216         }
00217 
00218         i__2 = l;
00219         for (k = 1; k <= i__2; ++k) {
00220 /* L330: */
00221             d__[k] = z__[k + i__ * z_dim1] / h__;
00222         }
00223 
00224         i__2 = l;
00225         for (j = 1; j <= i__2; ++j) {
00226             g = 0.;
00227 
00228             i__3 = l;
00229             for (k = 1; k <= i__3; ++k) {
00230 /* L340: */
00231                 g += z__[k + i__ * z_dim1] * z__[k + j * z_dim1];
00232             }
00233 
00234             i__3 = l;
00235             for (k = 1; k <= i__3; ++k) {
00236                 z__[k + j * z_dim1] -= g * d__[k];
00237 /* L360: */
00238             }
00239         }
00240 
00241 L380:
00242         i__3 = l;
00243         for (k = 1; k <= i__3; ++k) {
00244 /* L400: */
00245             z__[k + i__ * z_dim1] = 0.;
00246         }
00247 
00248 /* L500: */
00249     }
00250 
00251 L510:
00252     i__1 = *n;
00253     for (i__ = 1; i__ <= i__1; ++i__) {
00254         d__[i__] = z__[*n + i__ * z_dim1];
00255         z__[*n + i__ * z_dim1] = 0.;
00256 /* L520: */
00257     }
00258 
00259     z__[*n + *n * z_dim1] = 1.;
00260     e[1] = 0.;
00261     return 0;
00262 } /* tred2_ */

int tred3_ integer   n,
integer   nv,
doublereal   a,
doublereal   d__,
doublereal   e,
doublereal   e2
 

Definition at line 8 of file eis_tred3.c.

References a, abs, d_sign(), l, and scale.

Referenced by rsp_().

00010 {
00011     /* System generated locals */
00012     integer i__1, i__2, i__3;
00013     doublereal d__1;
00014 
00015     /* Builtin functions */
00016     double sqrt(doublereal), d_sign(doublereal *, doublereal *);
00017 
00018     /* Local variables */
00019     static doublereal f, g, h__;
00020     static integer i__, j, k, l;
00021     static doublereal scale, hh;
00022     static integer ii, jk, iz, jm1;
00023 
00024 
00025 
00026 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TRED3, */
00027 /*     NUM. MATH. 11, 181-195(1968) BY MARTIN, REINSCH, AND WILKINSON. */
00028 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 212-226(1971). */
00029 
00030 /*     THIS SUBROUTINE REDUCES A REAL SYMMETRIC MATRIX, STORED AS */
00031 /*     A ONE-DIMENSIONAL ARRAY, TO A SYMMETRIC TRIDIAGONAL MATRIX */
00032 /*     USING ORTHOGONAL SIMILARITY TRANSFORMATIONS. */
00033 
00034 /*     ON INPUT */
00035 
00036 /*        N IS THE ORDER OF THE MATRIX. */
00037 
00038 /*        NV MUST BE SET TO THE DIMENSION OF THE ARRAY PARAMETER A */
00039 /*          AS DECLARED IN THE CALLING PROGRAM DIMENSION STATEMENT. */
00040 
00041 /*        A CONTAINS THE LOWER TRIANGLE OF THE REAL SYMMETRIC */
00042 /*          INPUT MATRIX, STORED ROW-WISE AS A ONE-DIMENSIONAL */
00043 /*          ARRAY, IN ITS FIRST N*(N+1)/2 POSITIONS. */
00044 
00045 /*     ON OUTPUT */
00046 
00047 /*        A CONTAINS INFORMATION ABOUT THE ORTHOGONAL */
00048 /*          TRANSFORMATIONS USED IN THE REDUCTION. */
00049 
00050 /*        D CONTAINS THE DIAGONAL ELEMENTS OF THE TRIDIAGONAL MATRIX. */
00051 
00052 /*        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE TRIDIAGONAL */
00053 /*          MATRIX IN ITS LAST N-1 POSITIONS.  E(1) IS SET TO ZERO. */
00054 
00055 /*        E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E. */
00056 /*          E2 MAY COINCIDE WITH E IF THE SQUARES ARE NOT NEEDED. */
00057 
00058 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00059 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00060 */
00061 
00062 /*     THIS VERSION DATED AUGUST 1983. */
00063 
00064 /*     ------------------------------------------------------------------ 
00065 */
00066 
00067 /*     .......... FOR I=N STEP -1 UNTIL 1 DO -- .......... */
00068     /* Parameter adjustments */
00069     --e2;
00070     --e;
00071     --d__;
00072     --a;
00073 
00074     /* Function Body */
00075     i__1 = *n;
00076     for (ii = 1; ii <= i__1; ++ii) {
00077         i__ = *n + 1 - ii;
00078         l = i__ - 1;
00079         iz = i__ * l / 2;
00080         h__ = 0.;
00081         scale = 0.;
00082         if (l < 1) {
00083             goto L130;
00084         }
00085 /*     .......... SCALE ROW (ALGOL TOL THEN NOT NEEDED) .......... */
00086         i__2 = l;
00087         for (k = 1; k <= i__2; ++k) {
00088             ++iz;
00089             d__[k] = a[iz];
00090             scale += (d__1 = d__[k], abs(d__1));
00091 /* L120: */
00092         }
00093 
00094         if (scale != 0.) {
00095             goto L140;
00096         }
00097 L130:
00098         e[i__] = 0.;
00099         e2[i__] = 0.;
00100         goto L290;
00101 
00102 L140:
00103         i__2 = l;
00104         for (k = 1; k <= i__2; ++k) {
00105             d__[k] /= scale;
00106             h__ += d__[k] * d__[k];
00107 /* L150: */
00108         }
00109 
00110         e2[i__] = scale * scale * h__;
00111         f = d__[l];
00112         d__1 = sqrt(h__);
00113         g = -d_sign(&d__1, &f);
00114         e[i__] = scale * g;
00115         h__ -= f * g;
00116         d__[l] = f - g;
00117         a[iz] = scale * d__[l];
00118         if (l == 1) {
00119             goto L290;
00120         }
00121         jk = 1;
00122 
00123         i__2 = l;
00124         for (j = 1; j <= i__2; ++j) {
00125             f = d__[j];
00126             g = 0.;
00127             jm1 = j - 1;
00128             if (jm1 < 1) {
00129                 goto L220;
00130             }
00131 
00132             i__3 = jm1;
00133             for (k = 1; k <= i__3; ++k) {
00134                 g += a[jk] * d__[k];
00135                 e[k] += a[jk] * f;
00136                 ++jk;
00137 /* L200: */
00138             }
00139 
00140 L220:
00141             e[j] = g + a[jk] * f;
00142             ++jk;
00143 /* L240: */
00144         }
00145 /*     .......... FORM P .......... */
00146         f = 0.;
00147 
00148         i__2 = l;
00149         for (j = 1; j <= i__2; ++j) {
00150             e[j] /= h__;
00151             f += e[j] * d__[j];
00152 /* L245: */
00153         }
00154 
00155         hh = f / (h__ + h__);
00156 /*     .......... FORM Q .......... */
00157         i__2 = l;
00158         for (j = 1; j <= i__2; ++j) {
00159 /* L250: */
00160             e[j] -= hh * d__[j];
00161         }
00162 
00163         jk = 1;
00164 /*     .......... FORM REDUCED A .......... */
00165         i__2 = l;
00166         for (j = 1; j <= i__2; ++j) {
00167             f = d__[j];
00168             g = e[j];
00169 
00170             i__3 = j;
00171             for (k = 1; k <= i__3; ++k) {
00172                 a[jk] = a[jk] - f * e[k] - g * d__[k];
00173                 ++jk;
00174 /* L260: */
00175             }
00176 
00177 /* L280: */
00178         }
00179 
00180 L290:
00181         d__[i__] = a[iz + 1];
00182         a[iz + 1] = scale * sqrt(h__);
00183 /* L300: */
00184     }
00185 
00186     return 0;
00187 } /* tred3_ */

int tridib_ integer   n,
doublereal   eps1,
doublereal   d__,
doublereal   e,
doublereal   e2,
doublereal   lb,
doublereal   ub,
integer   m11,
integer   m,
doublereal   w,
integer   ind,
integer   ierr,
doublereal   rv4,
doublereal   rv5
 

Definition at line 12 of file eis_tridib.c.

References abs, c_b33, epslon_(), ind, l, m1, m2, max, min, p, q, v, and x0.

00016 {
00017     /* System generated locals */
00018     integer i__1, i__2;
00019     doublereal d__1, d__2, d__3;
00020 
00021     /* Local variables */
00022     static integer i__, j, k, l, p, q, r__, s;
00023     static doublereal u, v;
00024     static integer m1, m2;
00025     static doublereal t1, t2, x0, x1;
00026     static integer m22, ii;
00027     static doublereal xu;
00028     extern doublereal epslon_(doublereal *);
00029     static integer isturm, tag;
00030     static doublereal tst1, tst2;
00031 
00032 
00033 
00034 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE BISECT, */
00035 /*     NUM. MATH. 9, 386-393(1967) BY BARTH, MARTIN, AND WILKINSON. */
00036 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 249-256(1971). */
00037 
00038 /*     THIS SUBROUTINE FINDS THOSE EIGENVALUES OF A TRIDIAGONAL */
00039 /*     SYMMETRIC MATRIX BETWEEN SPECIFIED BOUNDARY INDICES, */
00040 /*     USING BISECTION. */
00041 
00042 /*     ON INPUT */
00043 
00044 /*        N IS THE ORDER OF THE MATRIX. */
00045 
00046 /*        EPS1 IS AN ABSOLUTE ERROR TOLERANCE FOR THE COMPUTED */
00047 /*          EIGENVALUES.  IF THE INPUT EPS1 IS NON-POSITIVE, */
00048 /*          IT IS RESET FOR EACH SUBMATRIX TO A DEFAULT VALUE, */
00049 /*          NAMELY, MINUS THE PRODUCT OF THE RELATIVE MACHINE */
00050 /*          PRECISION AND THE 1-NORM OF THE SUBMATRIX. */
00051 
00052 /*        D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX. */
00053 
00054 /*        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX */
00055 /*          IN ITS LAST N-1 POSITIONS.  E(1) IS ARBITRARY. */
00056 
00057 /*        E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E. */
00058 /*          E2(1) IS ARBITRARY. */
00059 
00060 /*        M11 SPECIFIES THE LOWER BOUNDARY INDEX FOR THE DESIRED */
00061 /*          EIGENVALUES. */
00062 
00063 /*        M SPECIFIES THE NUMBER OF EIGENVALUES DESIRED.  THE UPPER */
00064 /*          BOUNDARY INDEX M22 IS THEN OBTAINED AS M22=M11+M-1. */
00065 
00066 /*     ON OUTPUT */
00067 
00068 /*        EPS1 IS UNALTERED UNLESS IT HAS BEEN RESET TO ITS */
00069 /*          (LAST) DEFAULT VALUE. */
00070 
00071 /*        D AND E ARE UNALTERED. */
00072 
00073 /*        ELEMENTS OF E2, CORRESPONDING TO ELEMENTS OF E REGARDED */
00074 /*          AS NEGLIGIBLE, HAVE BEEN REPLACED BY ZERO CAUSING THE */
00075 /*          MATRIX TO SPLIT INTO A DIRECT SUM OF SUBMATRICES. */
00076 /*          E2(1) IS ALSO SET TO ZERO. */
00077 
00078 /*        LB AND UB DEFINE AN INTERVAL CONTAINING EXACTLY THE DESIRED */
00079 /*          EIGENVALUES. */
00080 
00081 /*        W CONTAINS, IN ITS FIRST M POSITIONS, THE EIGENVALUES */
00082 /*          BETWEEN INDICES M11 AND M22 IN ASCENDING ORDER. */
00083 
00084 /*        IND CONTAINS IN ITS FIRST M POSITIONS THE SUBMATRIX INDICES */
00085 /*          ASSOCIATED WITH THE CORRESPONDING EIGENVALUES IN W -- */
00086 /*          1 FOR EIGENVALUES BELONGING TO THE FIRST SUBMATRIX FROM */
00087 /*          THE TOP, 2 FOR THOSE BELONGING TO THE SECOND SUBMATRIX, ETC.. 
00088 */
00089 
00090 /*        IERR IS SET TO */
00091 /*          ZERO       FOR NORMAL RETURN, */
00092 /*          3*N+1      IF MULTIPLE EIGENVALUES AT INDEX M11 MAKE */
00093 /*                     UNIQUE SELECTION IMPOSSIBLE, */
00094 /*          3*N+2      IF MULTIPLE EIGENVALUES AT INDEX M22 MAKE */
00095 /*                     UNIQUE SELECTION IMPOSSIBLE. */
00096 
00097 /*        RV4 AND RV5 ARE TEMPORARY STORAGE ARRAYS. */
00098 
00099 /*     NOTE THAT SUBROUTINE TQL1, IMTQL1, OR TQLRAT IS GENERALLY FASTER */
00100 /*     THAN TRIDIB, IF MORE THAN N/4 EIGENVALUES ARE TO BE FOUND. */
00101 
00102 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00103 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00104 */
00105 
00106 /*     THIS VERSION DATED AUGUST 1983. */
00107 
00108 /*     ------------------------------------------------------------------ 
00109 */
00110 
00111     /* Parameter adjustments */
00112     --rv5;
00113     --rv4;
00114     --e2;
00115     --e;
00116     --d__;
00117     --ind;
00118     --w;
00119 
00120     /* Function Body */
00121     *ierr = 0;
00122     tag = 0;
00123     xu = d__[1];
00124     x0 = d__[1];
00125     u = 0.;
00126 /*     .......... LOOK FOR SMALL SUB-DIAGONAL ENTRIES AND DETERMINE AN */
00127 /*                INTERVAL CONTAINING ALL THE EIGENVALUES .......... */
00128     i__1 = *n;
00129     for (i__ = 1; i__ <= i__1; ++i__) {
00130         x1 = u;
00131         u = 0.;
00132         if (i__ != *n) {
00133             u = (d__1 = e[i__ + 1], abs(d__1));
00134         }
00135 /* Computing MIN */
00136         d__1 = d__[i__] - (x1 + u);
00137         xu = min(d__1,xu);
00138 /* Computing MAX */
00139         d__1 = d__[i__] + (x1 + u);
00140         x0 = max(d__1,x0);
00141         if (i__ == 1) {
00142             goto L20;
00143         }
00144         tst1 = (d__1 = d__[i__], abs(d__1)) + (d__2 = d__[i__ - 1], abs(d__2))
00145                 ;
00146         tst2 = tst1 + (d__1 = e[i__], abs(d__1));
00147         if (tst2 > tst1) {
00148             goto L40;
00149         }
00150 L20:
00151         e2[i__] = 0.;
00152 L40:
00153         ;
00154     }
00155 
00156     x1 = (doublereal) (*n);
00157 /* Computing MAX */
00158     d__2 = abs(xu), d__3 = abs(x0);
00159     d__1 = max(d__2,d__3);
00160     x1 *= epslon_(&d__1);
00161     xu -= x1;
00162     t1 = xu;
00163     x0 += x1;
00164     t2 = x0;
00165 /*     .......... DETERMINE AN INTERVAL CONTAINING EXACTLY */
00166 /*                THE DESIRED EIGENVALUES .......... */
00167     p = 1;
00168     q = *n;
00169     m1 = *m11 - 1;
00170     if (m1 == 0) {
00171         goto L75;
00172     }
00173     isturm = 1;
00174 L50:
00175     v = x1;
00176     x1 = xu + (x0 - xu) * .5;
00177     if (x1 == v) {
00178         goto L980;
00179     }
00180     goto L320;
00181 L60:
00182     if ((i__1 = s - m1) < 0) {
00183         goto L65;
00184     } else if (i__1 == 0) {
00185         goto L73;
00186     } else {
00187         goto L70;
00188     }
00189 L65:
00190     xu = x1;
00191     goto L50;
00192 L70:
00193     x0 = x1;
00194     goto L50;
00195 L73:
00196     xu = x1;
00197     t1 = x1;
00198 L75:
00199     m22 = m1 + *m;
00200     if (m22 == *n) {
00201         goto L90;
00202     }
00203     x0 = t2;
00204     isturm = 2;
00205     goto L50;
00206 L80:
00207     if ((i__1 = s - m22) < 0) {
00208         goto L65;
00209     } else if (i__1 == 0) {
00210         goto L85;
00211     } else {
00212         goto L70;
00213     }
00214 L85:
00215     t2 = x1;
00216 L90:
00217     q = 0;
00218     r__ = 0;
00219 /*     .......... ESTABLISH AND PROCESS NEXT SUBMATRIX, REFINING */
00220 /*                INTERVAL BY THE GERSCHGORIN BOUNDS .......... */
00221 L100:
00222     if (r__ == *m) {
00223         goto L1001;
00224     }
00225     ++tag;
00226     p = q + 1;
00227     xu = d__[p];
00228     x0 = d__[p];
00229     u = 0.;
00230 
00231     i__1 = *n;
00232     for (q = p; q <= i__1; ++q) {
00233         x1 = u;
00234         u = 0.;
00235         v = 0.;
00236         if (q == *n) {
00237             goto L110;
00238         }
00239         u = (d__1 = e[q + 1], abs(d__1));
00240         v = e2[q + 1];
00241 L110:
00242 /* Computing MIN */
00243         d__1 = d__[q] - (x1 + u);
00244         xu = min(d__1,xu);
00245 /* Computing MAX */
00246         d__1 = d__[q] + (x1 + u);
00247         x0 = max(d__1,x0);
00248         if (v == 0.) {
00249             goto L140;
00250         }
00251 /* L120: */
00252     }
00253 
00254 L140:
00255 /* Computing MAX */
00256     d__2 = abs(xu), d__3 = abs(x0);
00257     d__1 = max(d__2,d__3);
00258     x1 = epslon_(&d__1);
00259     if (*eps1 <= 0.) {
00260         *eps1 = -x1;
00261     }
00262     if (p != q) {
00263         goto L180;
00264     }
00265 /*     .......... CHECK FOR ISOLATED ROOT WITHIN INTERVAL .......... */
00266     if (t1 > d__[p] || d__[p] >= t2) {
00267         goto L940;
00268     }
00269     m1 = p;
00270     m2 = p;
00271     rv5[p] = d__[p];
00272     goto L900;
00273 L180:
00274     x1 *= q - p + 1;
00275 /* Computing MAX */
00276     d__1 = t1, d__2 = xu - x1;
00277     *lb = max(d__1,d__2);
00278 /* Computing MIN */
00279     d__1 = t2, d__2 = x0 + x1;
00280     *ub = min(d__1,d__2);
00281     x1 = *lb;
00282     isturm = 3;
00283     goto L320;
00284 L200:
00285     m1 = s + 1;
00286     x1 = *ub;
00287     isturm = 4;
00288     goto L320;
00289 L220:
00290     m2 = s;
00291     if (m1 > m2) {
00292         goto L940;
00293     }
00294 /*     .......... FIND ROOTS BY BISECTION .......... */
00295     x0 = *ub;
00296     isturm = 5;
00297 
00298     i__1 = m2;
00299     for (i__ = m1; i__ <= i__1; ++i__) {
00300         rv5[i__] = *ub;
00301         rv4[i__] = *lb;
00302 /* L240: */
00303     }
00304 /*     .......... LOOP FOR K-TH EIGENVALUE */
00305 /*                FOR K=M2 STEP -1 UNTIL M1 DO -- */
00306 /*                (-DO- NOT USED TO LEGALIZE -COMPUTED GO TO-) .......... 
00307 */
00308     k = m2;
00309 L250:
00310     xu = *lb;
00311 /*     .......... FOR I=K STEP -1 UNTIL M1 DO -- .......... */
00312     i__1 = k;
00313     for (ii = m1; ii <= i__1; ++ii) {
00314         i__ = m1 + k - ii;
00315         if (xu >= rv4[i__]) {
00316             goto L260;
00317         }
00318         xu = rv4[i__];
00319         goto L280;
00320 L260:
00321         ;
00322     }
00323 
00324 L280:
00325     if (x0 > rv5[k]) {
00326         x0 = rv5[k];
00327     }
00328 /*     .......... NEXT BISECTION STEP .......... */
00329 L300:
00330     x1 = (xu + x0) * .5;
00331     if (x0 - xu <= abs(*eps1)) {
00332         goto L420;
00333     }
00334     tst1 = (abs(xu) + abs(x0)) * 2.;
00335     tst2 = tst1 + (x0 - xu);
00336     if (tst2 == tst1) {
00337         goto L420;
00338     }
00339 /*     .......... IN-LINE PROCEDURE FOR STURM SEQUENCE .......... */
00340 L320:
00341     s = p - 1;
00342     u = 1.;
00343 
00344     i__1 = q;
00345     for (i__ = p; i__ <= i__1; ++i__) {
00346         if (u != 0.) {
00347             goto L325;
00348         }
00349         v = (d__1 = e[i__], abs(d__1)) / epslon_(&c_b33);
00350         if (e2[i__] == 0.) {
00351             v = 0.;
00352         }
00353         goto L330;
00354 L325:
00355         v = e2[i__] / u;
00356 L330:
00357         u = d__[i__] - x1 - v;
00358         if (u < 0.) {
00359             ++s;
00360         }
00361 /* L340: */
00362     }
00363 
00364     switch (isturm) {
00365         case 1:  goto L60;
00366         case 2:  goto L80;
00367         case 3:  goto L200;
00368         case 4:  goto L220;
00369         case 5:  goto L360;
00370     }
00371 /*     .......... REFINE INTERVALS .......... */
00372 L360:
00373     if (s >= k) {
00374         goto L400;
00375     }
00376     xu = x1;
00377     if (s >= m1) {
00378         goto L380;
00379     }
00380     rv4[m1] = x1;
00381     goto L300;
00382 L380:
00383     rv4[s + 1] = x1;
00384     if (rv5[s] > x1) {
00385         rv5[s] = x1;
00386     }
00387     goto L300;
00388 L400:
00389     x0 = x1;
00390     goto L300;
00391 /*     .......... K-TH EIGENVALUE FOUND .......... */
00392 L420:
00393     rv5[k] = x1;
00394     --k;
00395     if (k >= m1) {
00396         goto L250;
00397     }
00398 /*     .......... ORDER EIGENVALUES TAGGED WITH THEIR */
00399 /*                SUBMATRIX ASSOCIATIONS .......... */
00400 L900:
00401     s = r__;
00402     r__ = r__ + m2 - m1 + 1;
00403     j = 1;
00404     k = m1;
00405 
00406     i__1 = r__;
00407     for (l = 1; l <= i__1; ++l) {
00408         if (j > s) {
00409             goto L910;
00410         }
00411         if (k > m2) {
00412             goto L940;
00413         }
00414         if (rv5[k] >= w[l]) {
00415             goto L915;
00416         }
00417 
00418         i__2 = s;
00419         for (ii = j; ii <= i__2; ++ii) {
00420             i__ = l + s - ii;
00421             w[i__ + 1] = w[i__];
00422             ind[i__ + 1] = ind[i__];
00423 /* L905: */
00424         }
00425 
00426 L910:
00427         w[l] = rv5[k];
00428         ind[l] = tag;
00429         ++k;
00430         goto L920;
00431 L915:
00432         ++j;
00433 L920:
00434         ;
00435     }
00436 
00437 L940:
00438     if (q < *n) {
00439         goto L100;
00440     }
00441     goto L1001;
00442 /*     .......... SET ERROR -- INTERVAL CANNOT BE FOUND CONTAINING */
00443 /*                EXACTLY THE DESIRED EIGENVALUES .......... */
00444 L980:
00445     *ierr = *n * 3 + isturm;
00446 L1001:
00447     *lb = t1;
00448     *ub = t2;
00449     return 0;
00450 } /* tridib_ */

int tsturm_ integer   nm,
integer   n,
doublereal   eps1,
doublereal   d__,
doublereal   e,
doublereal   e2,
doublereal   lb,
doublereal   ub,
integer   mm,
integer   m,
doublereal   w,
doublereal   z__,
integer   ierr,
doublereal   rv1,
doublereal   rv2,
doublereal   rv3,
doublereal   rv4,
doublereal   rv5,
doublereal   rv6
 

Definition at line 12 of file eis_tsturm.c.

References abs, c_b26, epslon_(), m1, m2, max, min, p, pythag_(), q, v, and x0.

00017 {
00018     /* System generated locals */
00019     integer z_dim1, z_offset, i__1, i__2, i__3;
00020     doublereal d__1, d__2, d__3, d__4;
00021 
00022     /* Builtin functions */
00023     double sqrt(doublereal);
00024 
00025     /* Local variables */
00026     static doublereal norm;
00027     static integer i__, j, k, p, q, r__, s;
00028     static doublereal u, v;
00029     static integer group, m1, m2;
00030     static doublereal t1, t2, x0, x1;
00031     static integer ii, jj, ip;
00032     static doublereal uk, xu;
00033     extern doublereal pythag_(doublereal *, doublereal *), epslon_(doublereal 
00034             *);
00035     static integer isturm, its;
00036     static doublereal eps2, eps3, eps4, tst1, tst2;
00037 
00038 
00039 
00040 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TRISTURM */
00041 /*     BY PETERS AND WILKINSON. */
00042 /*     HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 418-439(1971). */
00043 
00044 /*     THIS SUBROUTINE FINDS THOSE EIGENVALUES OF A TRIDIAGONAL */
00045 /*     SYMMETRIC MATRIX WHICH LIE IN A SPECIFIED INTERVAL AND THEIR */
00046 /*     ASSOCIATED EIGENVECTORS, USING BISECTION AND INVERSE ITERATION. */
00047 
00048 /*     ON INPUT */
00049 
00050 /*        NM MUST BE SET TO THE ROW DIMENSION OF TWO-DIMENSIONAL */
00051 /*          ARRAY PARAMETERS AS DECLARED IN THE CALLING PROGRAM */
00052 /*          DIMENSION STATEMENT. */
00053 
00054 /*        N IS THE ORDER OF THE MATRIX. */
00055 
00056 /*        EPS1 IS AN ABSOLUTE ERROR TOLERANCE FOR THE COMPUTED */
00057 /*          EIGENVALUES.  IT SHOULD BE CHOSEN COMMENSURATE WITH */
00058 /*          RELATIVE PERTURBATIONS IN THE MATRIX ELEMENTS OF THE */
00059 /*          ORDER OF THE RELATIVE MACHINE PRECISION.  IF THE */
00060 /*          INPUT EPS1 IS NON-POSITIVE, IT IS RESET FOR EACH */
00061 /*          SUBMATRIX TO A DEFAULT VALUE, NAMELY, MINUS THE */
00062 /*          PRODUCT OF THE RELATIVE MACHINE PRECISION AND THE */
00063 /*          1-NORM OF THE SUBMATRIX. */
00064 
00065 /*        D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX. */
00066 
00067 /*        E CONTAINS THE SUBDIAGONAL ELEMENTS OF THE INPUT MATRIX */
00068 /*          IN ITS LAST N-1 POSITIONS.  E(1) IS ARBITRARY. */
00069 
00070 /*        E2 CONTAINS THE SQUARES OF THE CORRESPONDING ELEMENTS OF E. */
00071 /*          E2(1) IS ARBITRARY. */
00072 
00073 /*        LB AND UB DEFINE THE INTERVAL TO BE SEARCHED FOR EIGENVALUES. */
00074 /*          IF LB IS NOT LESS THAN UB, NO EIGENVALUES WILL BE FOUND. */
00075 
00076 /*        MM SHOULD BE SET TO AN UPPER BOUND FOR THE NUMBER OF */
00077 /*          EIGENVALUES IN THE INTERVAL.  WARNING. IF MORE THAN */
00078 /*          MM EIGENVALUES ARE DETERMINED TO LIE IN THE INTERVAL, */
00079 /*          AN ERROR RETURN IS MADE WITH NO VALUES OR VECTORS FOUND. */
00080 
00081 /*     ON OUTPUT */
00082 
00083 /*        EPS1 IS UNALTERED UNLESS IT HAS BEEN RESET TO ITS */
00084 /*          (LAST) DEFAULT VALUE. */
00085 
00086 /*        D AND E ARE UNALTERED. */
00087 
00088 /*        ELEMENTS OF E2, CORRESPONDING TO ELEMENTS OF E REGARDED */
00089 /*          AS NEGLIGIBLE, HAVE BEEN REPLACED BY ZERO CAUSING THE */
00090 /*          MATRIX TO SPLIT INTO A DIRECT SUM OF SUBMATRICES. */
00091 /*          E2(1) IS ALSO SET TO ZERO. */
00092 
00093 /*        M IS THE NUMBER OF EIGENVALUES DETERMINED TO LIE IN (LB,UB). */
00094 
00095 /*        W CONTAINS THE M EIGENVALUES IN ASCENDING ORDER IF THE MATRIX */
00096 /*          DOES NOT SPLIT.  IF THE MATRIX SPLITS, THE EIGENVALUES ARE */
00097 /*          IN ASCENDING ORDER FOR EACH SUBMATRIX.  IF A VECTOR ERROR */
00098 /*          EXIT IS MADE, W CONTAINS THOSE VALUES ALREADY FOUND. */
00099 
00100 /*        Z CONTAINS THE ASSOCIATED SET OF ORTHONORMAL EIGENVECTORS. */
00101 /*          IF AN ERROR EXIT IS MADE, Z CONTAINS THOSE VECTORS */
00102 /*          ALREADY FOUND. */
00103 
00104 /*        IERR IS SET TO */
00105 /*          ZERO       FOR NORMAL RETURN, */
00106 /*          3*N+1      IF M EXCEEDS MM. */
00107 /*          4*N+R      IF THE EIGENVECTOR CORRESPONDING TO THE R-TH */
00108 /*                     EIGENVALUE FAILS TO CONVERGE IN 5 ITERATIONS. */
00109 
00110 /*        RV1, RV2, RV3, RV4, RV5, AND RV6 ARE TEMPORARY STORAGE ARRAYS. 
00111 */
00112 
00113 /*     THE ALGOL PROCEDURE STURMCNT CONTAINED IN TRISTURM */
00114 /*     APPEARS IN TSTURM IN-LINE. */
00115 
00116 /*     CALLS PYTHAG FOR  DSQRT(A*A + B*B) . */
00117 
00118 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00119 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00120 */
00121 
00122 /*     THIS VERSION DATED AUGUST 1983. */
00123 
00124 /*     ------------------------------------------------------------------ 
00125 */
00126 
00127     /* Parameter adjustments */
00128     --rv6;
00129     --rv5;
00130     --rv4;
00131     --rv3;
00132     --rv2;
00133     --rv1;
00134     --e2;
00135     --e;
00136     --d__;
00137     z_dim1 = *nm;
00138     z_offset = z_dim1 + 1;
00139     z__ -= z_offset;
00140     --w;
00141 
00142     /* Function Body */
00143     *ierr = 0;
00144     t1 = *lb;
00145     t2 = *ub;
00146 /*     .......... LOOK FOR SMALL SUB-DIAGONAL ENTRIES .......... */
00147     i__1 = *n;
00148     for (i__ = 1; i__ <= i__1; ++i__) {
00149         if (i__ == 1) {
00150             goto L20;
00151         }
00152         tst1 = (d__1 = d__[i__], abs(d__1)) + (d__2 = d__[i__ - 1], abs(d__2))
00153                 ;
00154         tst2 = tst1 + (d__1 = e[i__], abs(d__1));
00155         if (tst2 > tst1) {
00156             goto L40;
00157         }
00158 L20:
00159         e2[i__] = 0.;
00160 L40:
00161         ;
00162     }
00163 /*     .......... DETERMINE THE NUMBER OF EIGENVALUES */
00164 /*                IN THE INTERVAL .......... */
00165     p = 1;
00166     q = *n;
00167     x1 = *ub;
00168     isturm = 1;
00169     goto L320;
00170 L60:
00171     *m = s;
00172     x1 = *lb;
00173     isturm = 2;
00174     goto L320;
00175 L80:
00176     *m -= s;
00177     if (*m > *mm) {
00178         goto L980;
00179     }
00180     q = 0;
00181     r__ = 0;
00182 /*     .......... ESTABLISH AND PROCESS NEXT SUBMATRIX, REFINING */
00183 /*                INTERVAL BY THE GERSCHGORIN BOUNDS .......... */
00184 L100:
00185     if (r__ == *m) {
00186         goto L1001;
00187     }
00188     p = q + 1;
00189     xu = d__[p];
00190     x0 = d__[p];
00191     u = 0.;
00192 
00193     i__1 = *n;
00194     for (q = p; q <= i__1; ++q) {
00195         x1 = u;
00196         u = 0.;
00197         v = 0.;
00198         if (q == *n) {
00199             goto L110;
00200         }
00201         u = (d__1 = e[q + 1], abs(d__1));
00202         v = e2[q + 1];
00203 L110:
00204 /* Computing MIN */
00205         d__1 = d__[q] - (x1 + u);
00206         xu = min(d__1,xu);
00207 /* Computing MAX */
00208         d__1 = d__[q] + (x1 + u);
00209         x0 = max(d__1,x0);
00210         if (v == 0.) {
00211             goto L140;
00212         }
00213 /* L120: */
00214     }
00215 
00216 L140:
00217 /* Computing MAX */
00218     d__2 = abs(xu), d__3 = abs(x0);
00219     d__1 = max(d__2,d__3);
00220     x1 = epslon_(&d__1);
00221     if (*eps1 <= 0.) {
00222         *eps1 = -x1;
00223     }
00224     if (p != q) {
00225         goto L180;
00226     }
00227 /*     .......... CHECK FOR ISOLATED ROOT WITHIN INTERVAL .......... */
00228     if (t1 > d__[p] || d__[p] >= t2) {
00229         goto L940;
00230     }
00231     ++r__;
00232 
00233     i__1 = *n;
00234     for (i__ = 1; i__ <= i__1; ++i__) {
00235 /* L160: */
00236         z__[i__ + r__ * z_dim1] = 0.;
00237     }
00238 
00239     w[r__] = d__[p];
00240     z__[p + r__ * z_dim1] = 1.;
00241     goto L940;
00242 L180:
00243     u = (doublereal) (q - p + 1);
00244     x1 = u * x1;
00245 /* Computing MAX */
00246     d__1 = t1, d__2 = xu - x1;
00247     *lb = max(d__1,d__2);
00248 /* Computing MIN */
00249     d__1 = t2, d__2 = x0 + x1;
00250     *ub = min(d__1,d__2);
00251     x1 = *lb;
00252     isturm = 3;
00253     goto L320;
00254 L200:
00255     m1 = s + 1;
00256     x1 = *ub;
00257     isturm = 4;
00258     goto L320;
00259 L220:
00260     m2 = s;
00261     if (m1 > m2) {
00262         goto L940;
00263     }
00264 /*     .......... FIND ROOTS BY BISECTION .......... */
00265     x0 = *ub;
00266     isturm = 5;
00267 
00268     i__1 = m2;
00269     for (i__ = m1; i__ <= i__1; ++i__) {
00270         rv5[i__] = *ub;
00271         rv4[i__] = *lb;
00272 /* L240: */
00273     }
00274 /*     .......... LOOP FOR K-TH EIGENVALUE */
00275 /*                FOR K=M2 STEP -1 UNTIL M1 DO -- */
00276 /*                (-DO- NOT USED TO LEGALIZE -COMPUTED GO TO-) .......... 
00277 */
00278     k = m2;
00279 L250:
00280     xu = *lb;
00281 /*     .......... FOR I=K STEP -1 UNTIL M1 DO -- .......... */
00282     i__1 = k;
00283     for (ii = m1; ii <= i__1; ++ii) {
00284         i__ = m1 + k - ii;
00285         if (xu >= rv4[i__]) {
00286             goto L260;
00287         }
00288         xu = rv4[i__];
00289         goto L280;
00290 L260:
00291         ;
00292     }
00293 
00294 L280:
00295     if (x0 > rv5[k]) {
00296         x0 = rv5[k];
00297     }
00298 /*     .......... NEXT BISECTION STEP .......... */
00299 L300:
00300     x1 = (xu + x0) * .5;
00301     if (x0 - xu <= abs(*eps1)) {
00302         goto L420;
00303     }
00304     tst1 = (abs(xu) + abs(x0)) * 2.;
00305     tst2 = tst1 + (x0 - xu);
00306     if (tst2 == tst1) {
00307         goto L420;
00308     }
00309 /*     .......... IN-LINE PROCEDURE FOR STURM SEQUENCE .......... */
00310 L320:
00311     s = p - 1;
00312     u = 1.;
00313 
00314     i__1 = q;
00315     for (i__ = p; i__ <= i__1; ++i__) {
00316         if (u != 0.) {
00317             goto L325;
00318         }
00319         v = (d__1 = e[i__], abs(d__1)) / epslon_(&c_b26);
00320         if (e2[i__] == 0.) {
00321             v = 0.;
00322         }
00323         goto L330;
00324 L325:
00325         v = e2[i__] / u;
00326 L330:
00327         u = d__[i__] - x1 - v;
00328         if (u < 0.) {
00329             ++s;
00330         }
00331 /* L340: */
00332     }
00333 
00334     switch (isturm) {
00335         case 1:  goto L60;
00336         case 2:  goto L80;
00337         case 3:  goto L200;
00338         case 4:  goto L220;
00339         case 5:  goto L360;
00340     }
00341 /*     .......... REFINE INTERVALS .......... */
00342 L360:
00343     if (s >= k) {
00344         goto L400;
00345     }
00346     xu = x1;
00347     if (s >= m1) {
00348         goto L380;
00349     }
00350     rv4[m1] = x1;
00351     goto L300;
00352 L380:
00353     rv4[s + 1] = x1;
00354     if (rv5[s] > x1) {
00355         rv5[s] = x1;
00356     }
00357     goto L300;
00358 L400:
00359     x0 = x1;
00360     goto L300;
00361 /*     .......... K-TH EIGENVALUE FOUND .......... */
00362 L420:
00363     rv5[k] = x1;
00364     --k;
00365     if (k >= m1) {
00366         goto L250;
00367     }
00368 /*     .......... FIND VECTORS BY INVERSE ITERATION .......... */
00369     norm = (d__1 = d__[p], abs(d__1));
00370     ip = p + 1;
00371 
00372     i__1 = q;
00373     for (i__ = ip; i__ <= i__1; ++i__) {
00374 /* L500: */
00375 /* Computing MAX */
00376         d__3 = norm, d__4 = (d__1 = d__[i__], abs(d__1)) + (d__2 = e[i__], 
00377                 abs(d__2));
00378         norm = max(d__3,d__4);
00379     }
00380 /*     .......... EPS2 IS THE CRITERION FOR GROUPING, */
00381 /*                EPS3 REPLACES ZERO PIVOTS AND EQUAL */
00382 /*                ROOTS ARE MODIFIED BY EPS3, */
00383 /*                EPS4 IS TAKEN VERY SMALL TO AVOID OVERFLOW .......... */
00384     eps2 = norm * .001;
00385     eps3 = epslon_(&norm);
00386     uk = (doublereal) (q - p + 1);
00387     eps4 = uk * eps3;
00388     uk = eps4 / sqrt(uk);
00389     group = 0;
00390     s = p;
00391 
00392     i__1 = m2;
00393     for (k = m1; k <= i__1; ++k) {
00394         ++r__;
00395         its = 1;
00396         w[r__] = rv5[k];
00397         x1 = rv5[k];
00398 /*     .......... LOOK FOR CLOSE OR COINCIDENT ROOTS .......... */
00399         if (k == m1) {
00400             goto L520;
00401         }
00402         if (x1 - x0 >= eps2) {
00403             group = -1;
00404         }
00405         ++group;
00406         if (x1 <= x0) {
00407             x1 = x0 + eps3;
00408         }
00409 /*     .......... ELIMINATION WITH INTERCHANGES AND */
00410 /*                INITIALIZATION OF VECTOR .......... */
00411 L520:
00412         v = 0.;
00413 
00414         i__2 = q;
00415         for (i__ = p; i__ <= i__2; ++i__) {
00416             rv6[i__] = uk;
00417             if (i__ == p) {
00418                 goto L560;
00419             }
00420             if ((d__1 = e[i__], abs(d__1)) < abs(u)) {
00421                 goto L540;
00422             }
00423             xu = u / e[i__];
00424             rv4[i__] = xu;
00425             rv1[i__ - 1] = e[i__];
00426             rv2[i__ - 1] = d__[i__] - x1;
00427             rv3[i__ - 1] = 0.;
00428             if (i__ != q) {
00429                 rv3[i__ - 1] = e[i__ + 1];
00430             }
00431             u = v - xu * rv2[i__ - 1];
00432             v = -xu * rv3[i__ - 1];
00433             goto L580;
00434 L540:
00435             xu = e[i__] / u;
00436             rv4[i__] = xu;
00437             rv1[i__ - 1] = u;
00438             rv2[i__ - 1] = v;
00439             rv3[i__ - 1] = 0.;
00440 L560:
00441             u = d__[i__] - x1 - xu * v;
00442             if (i__ != q) {
00443                 v = e[i__ + 1];
00444             }
00445 L580:
00446             ;
00447         }
00448 
00449         if (u == 0.) {
00450             u = eps3;
00451         }
00452         rv1[q] = u;
00453         rv2[q] = 0.;
00454         rv3[q] = 0.;
00455 /*     .......... BACK SUBSTITUTION */
00456 /*                FOR I=Q STEP -1 UNTIL P DO -- .......... */
00457 L600:
00458         i__2 = q;
00459         for (ii = p; ii <= i__2; ++ii) {
00460             i__ = p + q - ii;
00461             rv6[i__] = (rv6[i__] - u * rv2[i__] - v * rv3[i__]) / rv1[i__];
00462             v = u;
00463             u = rv6[i__];
00464 /* L620: */
00465         }
00466 /*     .......... ORTHOGONALIZE WITH RESPECT TO PREVIOUS */
00467 /*                MEMBERS OF GROUP .......... */
00468         if (group == 0) {
00469             goto L700;
00470         }
00471 
00472         i__2 = group;
00473         for (jj = 1; jj <= i__2; ++jj) {
00474             j = r__ - group - 1 + jj;
00475             xu = 0.;
00476 
00477             i__3 = q;
00478             for (i__ = p; i__ <= i__3; ++i__) {
00479 /* L640: */
00480                 xu += rv6[i__] * z__[i__ + j * z_dim1];
00481             }
00482 
00483             i__3 = q;
00484             for (i__ = p; i__ <= i__3; ++i__) {
00485 /* L660: */
00486                 rv6[i__] -= xu * z__[i__ + j * z_dim1];
00487             }
00488 
00489 /* L680: */
00490         }
00491 
00492 L700:
00493         norm = 0.;
00494 
00495         i__2 = q;
00496         for (i__ = p; i__ <= i__2; ++i__) {
00497 /* L720: */
00498             norm += (d__1 = rv6[i__], abs(d__1));
00499         }
00500 
00501         if (norm >= 1.) {
00502             goto L840;
00503         }
00504 /*     .......... FORWARD SUBSTITUTION .......... */
00505         if (its == 5) {
00506             goto L960;
00507         }
00508         if (norm != 0.) {
00509             goto L740;
00510         }
00511         rv6[s] = eps4;
00512         ++s;
00513         if (s > q) {
00514             s = p;
00515         }
00516         goto L780;
00517 L740:
00518         xu = eps4 / norm;
00519 
00520         i__2 = q;
00521         for (i__ = p; i__ <= i__2; ++i__) {
00522 /* L760: */
00523             rv6[i__] *= xu;
00524         }
00525 /*     .......... ELIMINATION OPERATIONS ON NEXT VECTOR */
00526 /*                ITERATE .......... */
00527 L780:
00528         i__2 = q;
00529         for (i__ = ip; i__ <= i__2; ++i__) {
00530             u = rv6[i__];
00531 /*     .......... IF RV1(I-1) .EQ. E(I), A ROW INTERCHANGE */
00532 /*                WAS PERFORMED EARLIER IN THE */
00533 /*                TRIANGULARIZATION PROCESS .......... */
00534             if (rv1[i__ - 1] != e[i__]) {
00535                 goto L800;
00536             }
00537             u = rv6[i__ - 1];
00538             rv6[i__ - 1] = rv6[i__];
00539 L800:
00540             rv6[i__] = u - rv4[i__] * rv6[i__ - 1];
00541 /* L820: */
00542         }
00543 
00544         ++its;
00545         goto L600;
00546 /*     .......... NORMALIZE SO THAT SUM OF SQUARES IS */
00547 /*                1 AND EXPAND TO FULL ORDER .......... */
00548 L840:
00549         u = 0.;
00550 
00551         i__2 = q;
00552         for (i__ = p; i__ <= i__2; ++i__) {
00553 /* L860: */
00554             u = pythag_(&u, &rv6[i__]);
00555         }
00556 
00557         xu = 1. / u;
00558 
00559         i__2 = *n;
00560         for (i__ = 1; i__ <= i__2; ++i__) {
00561 /* L880: */
00562             z__[i__ + r__ * z_dim1] = 0.;
00563         }
00564 
00565         i__2 = q;
00566         for (i__ = p; i__ <= i__2; ++i__) {
00567 /* L900: */
00568             z__[i__ + r__ * z_dim1] = rv6[i__] * xu;
00569         }
00570 
00571         x0 = x1;
00572 /* L920: */
00573     }
00574 
00575 L940:
00576     if (q < *n) {
00577         goto L100;
00578     }
00579     goto L1001;
00580 /*     .......... SET ERROR -- NON-CONVERGED EIGENVECTOR .......... */
00581 L960:
00582     *ierr = (*n << 2) + r__;
00583     goto L1001;
00584 /*     .......... SET ERROR -- UNDERESTIMATE OF NUMBER OF */
00585 /*                EIGENVALUES IN INTERVAL .......... */
00586 L980:
00587     *ierr = *n * 3 + 1;
00588 L1001:
00589     *lb = t1;
00590     *ub = t2;
00591     return 0;
00592 } /* tsturm_ */
 

Powered by Plone

This site conforms to the following standards: