Doxygen Source Code Documentation
Main Page Alphabetical List Data Structures File List Data Fields Globals Search
eis_tql2.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006 #include "f2c.h"
00007
00008
00009
00010 static doublereal c_b10 = 1.;
00011
00012 int tql2_(integer *nm, integer *n, doublereal *d__,
00013 doublereal *e, doublereal *z__, integer *ierr)
00014 {
00015
00016 integer z_dim1, z_offset, i__1, i__2, i__3;
00017 doublereal d__1, d__2;
00018
00019
00020 double d_sign(doublereal *, doublereal *);
00021
00022
00023 static doublereal c__, f, g, h__;
00024 static integer i__, j, k, l, m;
00025 static doublereal p, r__, s, c2, c3;
00026 static integer l1, l2;
00027 static doublereal s2;
00028 static integer ii;
00029 extern doublereal pythag_(doublereal *, doublereal *);
00030 static doublereal dl1, el1;
00031 static integer mml;
00032 static doublereal tst1, tst2;
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 z_dim1 = *nm;
00096 z_offset = z_dim1 + 1;
00097 z__ -= z_offset;
00098 --e;
00099 --d__;
00100
00101
00102 *ierr = 0;
00103 if (*n == 1) {
00104 goto L1001;
00105 }
00106
00107 i__1 = *n;
00108 for (i__ = 2; i__ <= i__1; ++i__) {
00109
00110 e[i__ - 1] = e[i__];
00111 }
00112
00113 f = 0.;
00114 tst1 = 0.;
00115 e[*n] = 0.;
00116
00117 i__1 = *n;
00118 for (l = 1; l <= i__1; ++l) {
00119 j = 0;
00120 h__ = (d__1 = d__[l], abs(d__1)) + (d__2 = e[l], abs(d__2));
00121 if (tst1 < h__) {
00122 tst1 = h__;
00123 }
00124
00125 i__2 = *n;
00126 for (m = l; m <= i__2; ++m) {
00127 tst2 = tst1 + (d__1 = e[m], abs(d__1));
00128 if (tst2 == tst1) {
00129 goto L120;
00130 }
00131
00132
00133
00134 }
00135
00136 L120:
00137 if (m == l) {
00138 goto L220;
00139 }
00140 L130:
00141 if (j == 30) {
00142 goto L1000;
00143 }
00144 ++j;
00145
00146 l1 = l + 1;
00147 l2 = l1 + 1;
00148 g = d__[l];
00149 p = (d__[l1] - g) / (e[l] * 2.);
00150 r__ = pythag_(&p, &c_b10);
00151 d__[l] = e[l] / (p + d_sign(&r__, &p));
00152 d__[l1] = e[l] * (p + d_sign(&r__, &p));
00153 dl1 = d__[l1];
00154 h__ = g - d__[l];
00155 if (l2 > *n) {
00156 goto L145;
00157 }
00158
00159 i__2 = *n;
00160 for (i__ = l2; i__ <= i__2; ++i__) {
00161
00162 d__[i__] -= h__;
00163 }
00164
00165 L145:
00166 f += h__;
00167
00168 p = d__[m];
00169 c__ = 1.;
00170 c2 = c__;
00171 el1 = e[l1];
00172 s = 0.;
00173 mml = m - l;
00174
00175 i__2 = mml;
00176 for (ii = 1; ii <= i__2; ++ii) {
00177 c3 = c2;
00178 c2 = c__;
00179 s2 = s;
00180 i__ = m - ii;
00181 g = c__ * e[i__];
00182 h__ = c__ * p;
00183 r__ = pythag_(&p, &e[i__]);
00184 e[i__ + 1] = s * r__;
00185 s = e[i__] / r__;
00186 c__ = p / r__;
00187 p = c__ * d__[i__] - s * g;
00188 d__[i__ + 1] = h__ + s * (c__ * g + s * d__[i__]);
00189
00190 i__3 = *n;
00191 for (k = 1; k <= i__3; ++k) {
00192 h__ = z__[k + (i__ + 1) * z_dim1];
00193 z__[k + (i__ + 1) * z_dim1] = s * z__[k + i__ * z_dim1] + c__
00194 * h__;
00195 z__[k + i__ * z_dim1] = c__ * z__[k + i__ * z_dim1] - s * h__;
00196
00197 }
00198
00199
00200 }
00201
00202 p = -s * s2 * c3 * el1 * e[l] / dl1;
00203 e[l] = s * p;
00204 d__[l] = c__ * p;
00205 tst2 = tst1 + (d__1 = e[l], abs(d__1));
00206 if (tst2 > tst1) {
00207 goto L130;
00208 }
00209 L220:
00210 d__[l] += f;
00211
00212 }
00213
00214 i__1 = *n;
00215 for (ii = 2; ii <= i__1; ++ii) {
00216 i__ = ii - 1;
00217 k = i__;
00218 p = d__[i__];
00219
00220 i__2 = *n;
00221 for (j = ii; j <= i__2; ++j) {
00222 if (d__[j] >= p) {
00223 goto L260;
00224 }
00225 k = j;
00226 p = d__[j];
00227 L260:
00228 ;
00229 }
00230
00231 if (k == i__) {
00232 goto L300;
00233 }
00234 d__[k] = d__[i__];
00235 d__[i__] = p;
00236
00237 i__2 = *n;
00238 for (j = 1; j <= i__2; ++j) {
00239 p = z__[j + i__ * z_dim1];
00240 z__[j + i__ * z_dim1] = z__[j + k * z_dim1];
00241 z__[j + k * z_dim1] = p;
00242
00243 }
00244
00245 L300:
00246 ;
00247 }
00248
00249 goto L1001;
00250
00251
00252 L1000:
00253 *ierr = l;
00254 L1001:
00255 return 0;
00256 }
00257