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

#include "f2c.h"

Go to the source code of this file.


Functions

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

Function Documentation

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

Definition at line 8 of file eis_cbal.c.

References abs, l, and scale.

Referenced by cg_().

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

Powered by Plone

This site conforms to the following standards: