Skip to content

AFNI/NIfTI Server

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

Doxygen Source Code Documentation


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

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

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

Definition at line 8 of file eis_qzvec.c.

References a, abs, q, and z1.

Referenced by rgg_().

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

Powered by Plone

This site conforms to the following standards: