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_qzhes.c File Reference

#include "f2c.h"

Go to the source code of this file.


Functions

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

Function Documentation

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

Definition at line 8 of file eis_qzhes.c.

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

Referenced by rgg_().

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

Powered by Plone

This site conforms to the following standards: