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

#include "f2c.h"

Go to the source code of this file.


Functions

int tqlrat_ (integer *n, doublereal *d__, doublereal *e2, integer *ierr)

Variables

doublereal c_b11 = 1.

Function Documentation

int tqlrat_ integer   n,
doublereal   d__,
doublereal   e2,
integer   ierr
 

Definition at line 12 of file eis_tqlrat.c.

References abs, c_b11, d_sign(), epslon_(), l, p, and pythag_().

Referenced by ch_(), rs_(), rsb_(), rsg_(), rsgab_(), rsgba_(), rsm_(), and rsp_().

00014 {
00015     /* System generated locals */
00016     integer i__1, i__2;
00017     doublereal d__1, d__2;
00018 
00019     /* Builtin functions */
00020     double d_sign(doublereal *, doublereal *);
00021 
00022     /* Local variables */
00023     static doublereal b, c__, f, g, h__;
00024     static integer i__, j, l, m;
00025     static doublereal p, r__, s, t;
00026     static integer l1, ii;
00027     extern doublereal pythag_(doublereal *, doublereal *), epslon_(doublereal 
00028             *);
00029     static integer mml;
00030 
00031 
00032 
00033 /*     THIS SUBROUTINE IS A TRANSLATION OF THE ALGOL PROCEDURE TQLRAT, */
00034 /*     ALGORITHM 464, COMM. ACM 16, 689(1973) BY REINSCH. */
00035 
00036 /*     THIS SUBROUTINE FINDS THE EIGENVALUES OF A SYMMETRIC */
00037 /*     TRIDIAGONAL MATRIX BY THE RATIONAL QL METHOD. */
00038 
00039 /*     ON INPUT */
00040 
00041 /*        N IS THE ORDER OF THE MATRIX. */
00042 
00043 /*        D CONTAINS THE DIAGONAL ELEMENTS OF THE INPUT MATRIX. */
00044 
00045 /*        E2 CONTAINS THE SQUARES OF THE SUBDIAGONAL ELEMENTS OF THE */
00046 /*          INPUT MATRIX IN ITS LAST N-1 POSITIONS.  E2(1) IS ARBITRARY. 
00047 */
00048 
00049 /*      ON OUTPUT */
00050 
00051 /*        D CONTAINS THE EIGENVALUES IN ASCENDING ORDER.  IF AN */
00052 /*          ERROR EXIT IS MADE, THE EIGENVALUES ARE CORRECT AND */
00053 /*          ORDERED FOR INDICES 1,2,...IERR-1, BUT MAY NOT BE */
00054 /*          THE SMALLEST EIGENVALUES. */
00055 
00056 /*        E2 HAS BEEN DESTROYED. */
00057 
00058 /*        IERR IS SET TO */
00059 /*          ZERO       FOR NORMAL RETURN, */
00060 /*          J          IF THE J-TH EIGENVALUE HAS NOT BEEN */
00061 /*                     DETERMINED AFTER 30 ITERATIONS. */
00062 
00063 /*     CALLS PYTHAG FOR  DSQRT(A*A + B*B) . */
00064 
00065 /*     QUESTIONS AND COMMENTS SHOULD BE DIRECTED TO BURTON S. GARBOW, */
00066 /*     MATHEMATICS AND COMPUTER SCIENCE DIV, ARGONNE NATIONAL LABORATORY 
00067 */
00068 
00069 /*     THIS VERSION DATED AUGUST 1983. */
00070 
00071 /*     ------------------------------------------------------------------ 
00072 */
00073 
00074     /* Parameter adjustments */
00075     --e2;
00076     --d__;
00077 
00078     /* Function Body */
00079     *ierr = 0;
00080     if (*n == 1) {
00081         goto L1001;
00082     }
00083 
00084     i__1 = *n;
00085     for (i__ = 2; i__ <= i__1; ++i__) {
00086 /* L100: */
00087         e2[i__ - 1] = e2[i__];
00088     }
00089 
00090     f = 0.;
00091     t = 0.;
00092     e2[*n] = 0.;
00093 
00094     i__1 = *n;
00095     for (l = 1; l <= i__1; ++l) {
00096         j = 0;
00097         h__ = (d__1 = d__[l], abs(d__1)) + sqrt(e2[l]);
00098         if (t > h__) {
00099             goto L105;
00100         }
00101         t = h__;
00102         b = epslon_(&t);
00103         c__ = b * b;
00104 /*     .......... LOOK FOR SMALL SQUARED SUB-DIAGONAL ELEMENT ........
00105 .. */
00106 L105:
00107         i__2 = *n;
00108         for (m = l; m <= i__2; ++m) {
00109             if (e2[m] <= c__) {
00110                 goto L120;
00111             }
00112 /*     .......... E2(N) IS ALWAYS ZERO, SO THERE IS NO EXIT */
00113 /*                THROUGH THE BOTTOM OF THE LOOP .......... */
00114 /* L110: */
00115         }
00116 
00117 L120:
00118         if (m == l) {
00119             goto L210;
00120         }
00121 L130:
00122         if (j == 30) {
00123             goto L1000;
00124         }
00125         ++j;
00126 /*     .......... FORM SHIFT .......... */
00127         l1 = l + 1;
00128         s = sqrt(e2[l]);
00129         g = d__[l];
00130         p = (d__[l1] - g) / (s * 2.);
00131         r__ = pythag_(&p, &c_b11);
00132         d__[l] = s / (p + d_sign(&r__, &p));
00133         h__ = g - d__[l];
00134 
00135         i__2 = *n;
00136         for (i__ = l1; i__ <= i__2; ++i__) {
00137 /* L140: */
00138             d__[i__] -= h__;
00139         }
00140 
00141         f += h__;
00142 /*     .......... RATIONAL QL TRANSFORMATION .......... */
00143         g = d__[m];
00144         if (g == 0.) {
00145             g = b;
00146         }
00147         h__ = g;
00148         s = 0.;
00149         mml = m - l;
00150 /*     .......... FOR I=M-1 STEP -1 UNTIL L DO -- .......... */
00151         i__2 = mml;
00152         for (ii = 1; ii <= i__2; ++ii) {
00153             i__ = m - ii;
00154             p = g * h__;
00155             r__ = p + e2[i__];
00156             e2[i__ + 1] = s * r__;
00157             s = e2[i__] / r__;
00158             d__[i__ + 1] = h__ + s * (h__ + d__[i__]);
00159             g = d__[i__] - e2[i__] / g;
00160             if (g == 0.) {
00161                 g = b;
00162             }
00163             h__ = g * p / r__;
00164 /* L200: */
00165         }
00166 
00167         e2[l] = s * g;
00168         d__[l] = h__;
00169 /*     .......... GUARD AGAINST UNDERFLOW IN CONVERGENCE TEST ........
00170 .. */
00171         if (h__ == 0.) {
00172             goto L210;
00173         }
00174         if ((d__1 = e2[l], abs(d__1)) <= (d__2 = c__ / h__, abs(d__2))) {
00175             goto L210;
00176         }
00177         e2[l] = h__ * e2[l];
00178         if (e2[l] != 0.) {
00179             goto L130;
00180         }
00181 L210:
00182         p = d__[l] + f;
00183 /*     .......... ORDER EIGENVALUES .......... */
00184         if (l == 1) {
00185             goto L250;
00186         }
00187 /*     .......... FOR I=L STEP -1 UNTIL 2 DO -- .......... */
00188         i__2 = l;
00189         for (ii = 2; ii <= i__2; ++ii) {
00190             i__ = l + 2 - ii;
00191             if (p >= d__[i__ - 1]) {
00192                 goto L270;
00193             }
00194             d__[i__] = d__[i__ - 1];
00195 /* L230: */
00196         }
00197 
00198 L250:
00199         i__ = 1;
00200 L270:
00201         d__[i__] = p;
00202 /* L290: */
00203     }
00204 
00205     goto L1001;
00206 /*     .......... SET ERROR -- NO CONVERGENCE TO AN */
00207 /*                EIGENVALUE AFTER 30 ITERATIONS .......... */
00208 L1000:
00209     *ierr = l;
00210 L1001:
00211     return 0;
00212 } /* tqlrat_ */

Variable Documentation

doublereal c_b11 = 1. [static]
 

Definition at line 10 of file eis_tqlrat.c.

Referenced by tqlrat_().

 

Powered by Plone

This site conforms to the following standards: