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

#include "f2c.h"

Go to the source code of this file.


Functions

int balanc_ (integer *nm, integer *n, doublereal *a, integer *low, integer *igh, doublereal *scale)

Function Documentation

int balanc_ integer   nm,
integer   n,
doublereal   a,
integer   low,
integer   igh,
doublereal   scale
 

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_ */
 

Powered by Plone

This site conforms to the following standards: