Doxygen Source Code Documentation
eispack.h File Reference
#include "f2c.h"Go to the source code of this file.
Function Documentation
| 
 | ||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||
| 
 Definition at line 8 of file eis_cbal.c. 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||
| 
 Definition at line 8 of file eis_comhes.c. 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||
| 
 Definition at line 8 of file eis_elmbak.c. 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||
| 
 Definition at line 8 of file eis_elmhes.c. 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||
| 
 Definition at line 8 of file eis_eltran.c. 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_ */
 | 
| 
 | 
| 
 Definition at line 8 of file eis_epslon.c. 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||
| 
 Definition at line 8 of file eis_htrib3.c. 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||
| 
 Definition at line 8 of file eis_ortbak.c. 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||
| 
 Definition at line 8 of file eis_ortran.c. 
 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_ */
 | 
| 
 | ||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||
| 
 Definition at line 8 of file eis_qzvec.c. 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||
| 
 Definition at line 8 of file eis_reduc2.c. 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||
| 
 Definition at line 8 of file eis_reduc.c. 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||
| 
 Definition at line 8 of file eis_trbak1.c. 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||
| 
 Definition at line 8 of file eis_trbak3.c. 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
| 
 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 
 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_ */
 | 
 
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
                             
 
 
 
 
       
	   
	   
	   
	  