Doxygen Source Code Documentation
eis_qzvec.c File Reference
#include "f2c.h"
Go to the source code of this file.
Functions | |
int | qzvec_ (integer *nm, integer *n, doublereal *a, doublereal *b, doublereal *alfr, doublereal *alfi, doublereal *beta, doublereal *z__) |
Function Documentation
|
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_ */ |