Doxygen Source Code Documentation
        
Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search   
eis_imtqlv.c
Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 #include "f2c.h"
00007 
00008 
00009 
00010 static doublereal c_b11 = 1.;
00011 
00012  int imtqlv_(integer *n, doublereal *d__, doublereal *e, 
00013         doublereal *e2, doublereal *w, integer *ind, integer *ierr, 
00014         doublereal *rv1)
00015 {
00016     
00017     integer i__1, i__2;
00018     doublereal d__1, d__2;
00019 
00020     
00021     double d_sign(doublereal *, doublereal *);
00022 
00023     
00024     static doublereal b, c__, f, g;
00025     static integer i__, j, k, l, m;
00026     static doublereal p, r__, s;
00027     static integer ii;
00028     extern doublereal pythag_(doublereal *, doublereal *);
00029     static integer tag, mml;
00030     static doublereal tst1, tst2;
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00056 
00057 
00058 
00059 
00060 
00061 
00062 
00063 
00064 
00065 
00066 
00067 
00068 
00069 
00070 
00071 
00072 
00073 
00074 
00075 
00076 
00077 
00078 
00079 
00080 
00081 
00082 
00083 
00084 
00085 
00086 
00087 
00088 
00089 
00090 
00091 
00092 
00093 
00094     
00095     --rv1;
00096     --ind;
00097     --w;
00098     --e2;
00099     --e;
00100     --d__;
00101 
00102     
00103     *ierr = 0;
00104     k = 0;
00105     tag = 0;
00106 
00107     i__1 = *n;
00108     for (i__ = 1; i__ <= i__1; ++i__) {
00109         w[i__] = d__[i__];
00110         if (i__ != 1) {
00111             rv1[i__ - 1] = e[i__];
00112         }
00113 
00114     }
00115 
00116     e2[1] = 0.;
00117     rv1[*n] = 0.;
00118 
00119     i__1 = *n;
00120     for (l = 1; l <= i__1; ++l) {
00121         j = 0;
00122 
00123 L105:
00124         i__2 = *n;
00125         for (m = l; m <= i__2; ++m) {
00126             if (m == *n) {
00127                 goto L120;
00128             }
00129             tst1 = (d__1 = w[m], abs(d__1)) + (d__2 = w[m + 1], abs(d__2));
00130             tst2 = tst1 + (d__1 = rv1[m], abs(d__1));
00131             if (tst2 == tst1) {
00132                 goto L120;
00133             }
00134 
00135 
00136             if (e2[m + 1] == 0.) {
00137                 goto L125;
00138             }
00139 
00140         }
00141 
00142 L120:
00143         if (m <= k) {
00144             goto L130;
00145         }
00146         if (m != *n) {
00147             e2[m + 1] = 0.;
00148         }
00149 L125:
00150         k = m;
00151         ++tag;
00152 L130:
00153         p = w[l];
00154         if (m == l) {
00155             goto L215;
00156         }
00157         if (j == 30) {
00158             goto L1000;
00159         }
00160         ++j;
00161 
00162         g = (w[l + 1] - p) / (rv1[l] * 2.);
00163         r__ = pythag_(&g, &c_b11);
00164         g = w[m] - p + rv1[l] / (g + d_sign(&r__, &g));
00165         s = 1.;
00166         c__ = 1.;
00167         p = 0.;
00168         mml = m - l;
00169 
00170         i__2 = mml;
00171         for (ii = 1; ii <= i__2; ++ii) {
00172             i__ = m - ii;
00173             f = s * rv1[i__];
00174             b = c__ * rv1[i__];
00175             r__ = pythag_(&f, &g);
00176             rv1[i__ + 1] = r__;
00177             if (r__ == 0.) {
00178                 goto L210;
00179             }
00180             s = f / r__;
00181             c__ = g / r__;
00182             g = w[i__ + 1] - p;
00183             r__ = (w[i__] - g) * s + c__ * 2. * b;
00184             p = s * r__;
00185             w[i__ + 1] = g + p;
00186             g = c__ * r__ - b;
00187 
00188         }
00189 
00190         w[l] -= p;
00191         rv1[l] = g;
00192         rv1[m] = 0.;
00193         goto L105;
00194 
00195 L210:
00196         w[i__ + 1] -= p;
00197         rv1[m] = 0.;
00198         goto L105;
00199 
00200 L215:
00201         if (l == 1) {
00202             goto L250;
00203         }
00204 
00205         i__2 = l;
00206         for (ii = 2; ii <= i__2; ++ii) {
00207             i__ = l + 2 - ii;
00208             if (p >= w[i__ - 1]) {
00209                 goto L270;
00210             }
00211             w[i__] = w[i__ - 1];
00212             ind[i__] = ind[i__ - 1];
00213 
00214         }
00215 
00216 L250:
00217         i__ = 1;
00218 L270:
00219         w[i__] = p;
00220         ind[i__] = tag;
00221 
00222     }
00223 
00224     goto L1001;
00225 
00226 
00227 L1000:
00228     *ierr = l;
00229 L1001:
00230     return 0;
00231 } 
00232