Doxygen Source Code Documentation
Main Page Alphabetical List Data Structures File List Data Fields Globals Search
eis_hqr2.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006 #include "f2c.h"
00007
00008
00009
00010 static doublereal c_b49 = 0.;
00011
00012 int hqr2_(integer *nm, integer *n, integer *low, integer *
00013 igh, doublereal *h__, doublereal *wr, doublereal *wi, doublereal *z__,
00014 integer *ierr)
00015 {
00016
00017 integer h_dim1, h_offset, z_dim1, z_offset, i__1, i__2, i__3;
00018 doublereal d__1, d__2, d__3, d__4;
00019
00020
00021 double sqrt(doublereal), d_sign(doublereal *, doublereal *);
00022
00023
00024 extern int cdiv_(doublereal *, doublereal *, doublereal *
00025 , doublereal *, doublereal *, doublereal *);
00026 static doublereal norm;
00027 static integer i__, j, k, l, m;
00028 static doublereal p, q, r__, s, t, w, x, y;
00029 static integer na, ii, en, jj;
00030 static doublereal ra, sa;
00031 static integer ll, mm, nn;
00032 static doublereal vi, vr, zz;
00033 static logical notlas;
00034 static integer mp2, itn, its, enm2;
00035 static doublereal tst1, tst2;
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
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109 z_dim1 = *nm;
00110 z_offset = z_dim1 + 1;
00111 z__ -= z_offset;
00112 --wi;
00113 --wr;
00114 h_dim1 = *nm;
00115 h_offset = h_dim1 + 1;
00116 h__ -= h_offset;
00117
00118
00119 *ierr = 0;
00120 norm = 0.;
00121 k = 1;
00122
00123
00124 i__1 = *n;
00125 for (i__ = 1; i__ <= i__1; ++i__) {
00126
00127 i__2 = *n;
00128 for (j = k; j <= i__2; ++j) {
00129
00130 norm += (d__1 = h__[i__ + j * h_dim1], abs(d__1));
00131 }
00132
00133 k = i__;
00134 if (i__ >= *low && i__ <= *igh) {
00135 goto L50;
00136 }
00137 wr[i__] = h__[i__ + i__ * h_dim1];
00138 wi[i__] = 0.;
00139 L50:
00140 ;
00141 }
00142
00143 en = *igh;
00144 t = 0.;
00145 itn = *n * 30;
00146
00147 L60:
00148 if (en < *low) {
00149 goto L340;
00150 }
00151 its = 0;
00152 na = en - 1;
00153 enm2 = na - 1;
00154
00155
00156 L70:
00157 i__1 = en;
00158 for (ll = *low; ll <= i__1; ++ll) {
00159 l = en + *low - ll;
00160 if (l == *low) {
00161 goto L100;
00162 }
00163 s = (d__1 = h__[l - 1 + (l - 1) * h_dim1], abs(d__1)) + (d__2 = h__[l
00164 + l * h_dim1], abs(d__2));
00165 if (s == 0.) {
00166 s = norm;
00167 }
00168 tst1 = s;
00169 tst2 = tst1 + (d__1 = h__[l + (l - 1) * h_dim1], abs(d__1));
00170 if (tst2 == tst1) {
00171 goto L100;
00172 }
00173
00174 }
00175
00176 L100:
00177 x = h__[en + en * h_dim1];
00178 if (l == en) {
00179 goto L270;
00180 }
00181 y = h__[na + na * h_dim1];
00182 w = h__[en + na * h_dim1] * h__[na + en * h_dim1];
00183 if (l == na) {
00184 goto L280;
00185 }
00186 if (itn == 0) {
00187 goto L1000;
00188 }
00189 if (its != 10 && its != 20) {
00190 goto L130;
00191 }
00192
00193 t += x;
00194
00195 i__1 = en;
00196 for (i__ = *low; i__ <= i__1; ++i__) {
00197
00198 h__[i__ + i__ * h_dim1] -= x;
00199 }
00200
00201 s = (d__1 = h__[en + na * h_dim1], abs(d__1)) + (d__2 = h__[na + enm2 *
00202 h_dim1], abs(d__2));
00203 x = s * .75;
00204 y = x;
00205 w = s * -.4375 * s;
00206 L130:
00207 ++its;
00208 --itn;
00209
00210
00211
00212 i__1 = enm2;
00213 for (mm = l; mm <= i__1; ++mm) {
00214 m = enm2 + l - mm;
00215 zz = h__[m + m * h_dim1];
00216 r__ = x - zz;
00217 s = y - zz;
00218 p = (r__ * s - w) / h__[m + 1 + m * h_dim1] + h__[m + (m + 1) *
00219 h_dim1];
00220 q = h__[m + 1 + (m + 1) * h_dim1] - zz - r__ - s;
00221 r__ = h__[m + 2 + (m + 1) * h_dim1];
00222 s = abs(p) + abs(q) + abs(r__);
00223 p /= s;
00224 q /= s;
00225 r__ /= s;
00226 if (m == l) {
00227 goto L150;
00228 }
00229 tst1 = abs(p) * ((d__1 = h__[m - 1 + (m - 1) * h_dim1], abs(d__1)) +
00230 abs(zz) + (d__2 = h__[m + 1 + (m + 1) * h_dim1], abs(d__2)));
00231 tst2 = tst1 + (d__1 = h__[m + (m - 1) * h_dim1], abs(d__1)) * (abs(q)
00232 + abs(r__));
00233 if (tst2 == tst1) {
00234 goto L150;
00235 }
00236
00237 }
00238
00239 L150:
00240 mp2 = m + 2;
00241
00242 i__1 = en;
00243 for (i__ = mp2; i__ <= i__1; ++i__) {
00244 h__[i__ + (i__ - 2) * h_dim1] = 0.;
00245 if (i__ == mp2) {
00246 goto L160;
00247 }
00248 h__[i__ + (i__ - 3) * h_dim1] = 0.;
00249 L160:
00250 ;
00251 }
00252
00253
00254 i__1 = na;
00255 for (k = m; k <= i__1; ++k) {
00256 notlas = k != na;
00257 if (k == m) {
00258 goto L170;
00259 }
00260 p = h__[k + (k - 1) * h_dim1];
00261 q = h__[k + 1 + (k - 1) * h_dim1];
00262 r__ = 0.;
00263 if (notlas) {
00264 r__ = h__[k + 2 + (k - 1) * h_dim1];
00265 }
00266 x = abs(p) + abs(q) + abs(r__);
00267 if (x == 0.) {
00268 goto L260;
00269 }
00270 p /= x;
00271 q /= x;
00272 r__ /= x;
00273 L170:
00274 d__1 = sqrt(p * p + q * q + r__ * r__);
00275 s = d_sign(&d__1, &p);
00276 if (k == m) {
00277 goto L180;
00278 }
00279 h__[k + (k - 1) * h_dim1] = -s * x;
00280 goto L190;
00281 L180:
00282 if (l != m) {
00283 h__[k + (k - 1) * h_dim1] = -h__[k + (k - 1) * h_dim1];
00284 }
00285 L190:
00286 p += s;
00287 x = p / s;
00288 y = q / s;
00289 zz = r__ / s;
00290 q /= p;
00291 r__ /= p;
00292 if (notlas) {
00293 goto L225;
00294 }
00295
00296 i__2 = *n;
00297 for (j = k; j <= i__2; ++j) {
00298 p = h__[k + j * h_dim1] + q * h__[k + 1 + j * h_dim1];
00299 h__[k + j * h_dim1] -= p * x;
00300 h__[k + 1 + j * h_dim1] -= p * y;
00301
00302 }
00303
00304
00305 i__2 = en, i__3 = k + 3;
00306 j = min(i__2,i__3);
00307
00308 i__2 = j;
00309 for (i__ = 1; i__ <= i__2; ++i__) {
00310 p = x * h__[i__ + k * h_dim1] + y * h__[i__ + (k + 1) * h_dim1];
00311 h__[i__ + k * h_dim1] -= p;
00312 h__[i__ + (k + 1) * h_dim1] -= p * q;
00313
00314 }
00315
00316 i__2 = *igh;
00317 for (i__ = *low; i__ <= i__2; ++i__) {
00318 p = x * z__[i__ + k * z_dim1] + y * z__[i__ + (k + 1) * z_dim1];
00319 z__[i__ + k * z_dim1] -= p;
00320 z__[i__ + (k + 1) * z_dim1] -= p * q;
00321
00322 }
00323 goto L255;
00324 L225:
00325
00326 i__2 = *n;
00327 for (j = k; j <= i__2; ++j) {
00328 p = h__[k + j * h_dim1] + q * h__[k + 1 + j * h_dim1] + r__ * h__[
00329 k + 2 + j * h_dim1];
00330 h__[k + j * h_dim1] -= p * x;
00331 h__[k + 1 + j * h_dim1] -= p * y;
00332 h__[k + 2 + j * h_dim1] -= p * zz;
00333
00334 }
00335
00336
00337 i__2 = en, i__3 = k + 3;
00338 j = min(i__2,i__3);
00339
00340 i__2 = j;
00341 for (i__ = 1; i__ <= i__2; ++i__) {
00342 p = x * h__[i__ + k * h_dim1] + y * h__[i__ + (k + 1) * h_dim1] +
00343 zz * h__[i__ + (k + 2) * h_dim1];
00344 h__[i__ + k * h_dim1] -= p;
00345 h__[i__ + (k + 1) * h_dim1] -= p * q;
00346 h__[i__ + (k + 2) * h_dim1] -= p * r__;
00347
00348 }
00349
00350 i__2 = *igh;
00351 for (i__ = *low; i__ <= i__2; ++i__) {
00352 p = x * z__[i__ + k * z_dim1] + y * z__[i__ + (k + 1) * z_dim1] +
00353 zz * z__[i__ + (k + 2) * z_dim1];
00354 z__[i__ + k * z_dim1] -= p;
00355 z__[i__ + (k + 1) * z_dim1] -= p * q;
00356 z__[i__ + (k + 2) * z_dim1] -= p * r__;
00357
00358 }
00359 L255:
00360
00361 L260:
00362 ;
00363 }
00364
00365 goto L70;
00366
00367 L270:
00368 h__[en + en * h_dim1] = x + t;
00369 wr[en] = h__[en + en * h_dim1];
00370 wi[en] = 0.;
00371 en = na;
00372 goto L60;
00373
00374 L280:
00375 p = (y - x) / 2.;
00376 q = p * p + w;
00377 zz = sqrt((abs(q)));
00378 h__[en + en * h_dim1] = x + t;
00379 x = h__[en + en * h_dim1];
00380 h__[na + na * h_dim1] = y + t;
00381 if (q < 0.) {
00382 goto L320;
00383 }
00384
00385 zz = p + d_sign(&zz, &p);
00386 wr[na] = x + zz;
00387 wr[en] = wr[na];
00388 if (zz != 0.) {
00389 wr[en] = x - w / zz;
00390 }
00391 wi[na] = 0.;
00392 wi[en] = 0.;
00393 x = h__[en + na * h_dim1];
00394 s = abs(x) + abs(zz);
00395 p = x / s;
00396 q = zz / s;
00397 r__ = sqrt(p * p + q * q);
00398 p /= r__;
00399 q /= r__;
00400
00401 i__1 = *n;
00402 for (j = na; j <= i__1; ++j) {
00403 zz = h__[na + j * h_dim1];
00404 h__[na + j * h_dim1] = q * zz + p * h__[en + j * h_dim1];
00405 h__[en + j * h_dim1] = q * h__[en + j * h_dim1] - p * zz;
00406
00407 }
00408
00409 i__1 = en;
00410 for (i__ = 1; i__ <= i__1; ++i__) {
00411 zz = h__[i__ + na * h_dim1];
00412 h__[i__ + na * h_dim1] = q * zz + p * h__[i__ + en * h_dim1];
00413 h__[i__ + en * h_dim1] = q * h__[i__ + en * h_dim1] - p * zz;
00414
00415 }
00416
00417 i__1 = *igh;
00418 for (i__ = *low; i__ <= i__1; ++i__) {
00419 zz = z__[i__ + na * z_dim1];
00420 z__[i__ + na * z_dim1] = q * zz + p * z__[i__ + en * z_dim1];
00421 z__[i__ + en * z_dim1] = q * z__[i__ + en * z_dim1] - p * zz;
00422
00423 }
00424
00425 goto L330;
00426
00427 L320:
00428 wr[na] = x + p;
00429 wr[en] = x + p;
00430 wi[na] = zz;
00431 wi[en] = -zz;
00432 L330:
00433 en = enm2;
00434 goto L60;
00435
00436
00437 L340:
00438 if (norm == 0.) {
00439 goto L1001;
00440 }
00441
00442 i__1 = *n;
00443 for (nn = 1; nn <= i__1; ++nn) {
00444 en = *n + 1 - nn;
00445 p = wr[en];
00446 q = wi[en];
00447 na = en - 1;
00448 if (q < 0.) {
00449 goto L710;
00450 } else if (q == 0) {
00451 goto L600;
00452 } else {
00453 goto L800;
00454 }
00455
00456 L600:
00457 m = en;
00458 h__[en + en * h_dim1] = 1.;
00459 if (na == 0) {
00460 goto L800;
00461 }
00462
00463 i__2 = na;
00464 for (ii = 1; ii <= i__2; ++ii) {
00465 i__ = en - ii;
00466 w = h__[i__ + i__ * h_dim1] - p;
00467 r__ = 0.;
00468
00469 i__3 = en;
00470 for (j = m; j <= i__3; ++j) {
00471
00472 r__ += h__[i__ + j * h_dim1] * h__[j + en * h_dim1];
00473 }
00474
00475 if (wi[i__] >= 0.) {
00476 goto L630;
00477 }
00478 zz = w;
00479 s = r__;
00480 goto L700;
00481 L630:
00482 m = i__;
00483 if (wi[i__] != 0.) {
00484 goto L640;
00485 }
00486 t = w;
00487 if (t != 0.) {
00488 goto L635;
00489 }
00490 tst1 = norm;
00491 t = tst1;
00492 L632:
00493 t *= .01;
00494 tst2 = norm + t;
00495 if (tst2 > tst1) {
00496 goto L632;
00497 }
00498 L635:
00499 h__[i__ + en * h_dim1] = -r__ / t;
00500 goto L680;
00501
00502 L640:
00503 x = h__[i__ + (i__ + 1) * h_dim1];
00504 y = h__[i__ + 1 + i__ * h_dim1];
00505 q = (wr[i__] - p) * (wr[i__] - p) + wi[i__] * wi[i__];
00506 t = (x * s - zz * r__) / q;
00507 h__[i__ + en * h_dim1] = t;
00508 if (abs(x) <= abs(zz)) {
00509 goto L650;
00510 }
00511 h__[i__ + 1 + en * h_dim1] = (-r__ - w * t) / x;
00512 goto L680;
00513 L650:
00514 h__[i__ + 1 + en * h_dim1] = (-s - y * t) / zz;
00515
00516
00517 L680:
00518 t = (d__1 = h__[i__ + en * h_dim1], abs(d__1));
00519 if (t == 0.) {
00520 goto L700;
00521 }
00522 tst1 = t;
00523 tst2 = tst1 + 1. / tst1;
00524 if (tst2 > tst1) {
00525 goto L700;
00526 }
00527 i__3 = en;
00528 for (j = i__; j <= i__3; ++j) {
00529 h__[j + en * h_dim1] /= t;
00530
00531 }
00532
00533 L700:
00534 ;
00535 }
00536
00537 goto L800;
00538
00539 L710:
00540 m = na;
00541
00542
00543 if ((d__1 = h__[en + na * h_dim1], abs(d__1)) <= (d__2 = h__[na + en *
00544 h_dim1], abs(d__2))) {
00545 goto L720;
00546 }
00547 h__[na + na * h_dim1] = q / h__[en + na * h_dim1];
00548 h__[na + en * h_dim1] = -(h__[en + en * h_dim1] - p) / h__[en + na *
00549 h_dim1];
00550 goto L730;
00551 L720:
00552 d__1 = -h__[na + en * h_dim1];
00553 d__2 = h__[na + na * h_dim1] - p;
00554 cdiv_(&c_b49, &d__1, &d__2, &q, &h__[na + na * h_dim1], &h__[na + en *
00555 h_dim1]);
00556 L730:
00557 h__[en + na * h_dim1] = 0.;
00558 h__[en + en * h_dim1] = 1.;
00559 enm2 = na - 1;
00560 if (enm2 == 0) {
00561 goto L800;
00562 }
00563
00564 i__2 = enm2;
00565 for (ii = 1; ii <= i__2; ++ii) {
00566 i__ = na - ii;
00567 w = h__[i__ + i__ * h_dim1] - p;
00568 ra = 0.;
00569 sa = 0.;
00570
00571 i__3 = en;
00572 for (j = m; j <= i__3; ++j) {
00573 ra += h__[i__ + j * h_dim1] * h__[j + na * h_dim1];
00574 sa += h__[i__ + j * h_dim1] * h__[j + en * h_dim1];
00575
00576 }
00577
00578 if (wi[i__] >= 0.) {
00579 goto L770;
00580 }
00581 zz = w;
00582 r__ = ra;
00583 s = sa;
00584 goto L795;
00585 L770:
00586 m = i__;
00587 if (wi[i__] != 0.) {
00588 goto L780;
00589 }
00590 d__1 = -ra;
00591 d__2 = -sa;
00592 cdiv_(&d__1, &d__2, &w, &q, &h__[i__ + na * h_dim1], &h__[i__ +
00593 en * h_dim1]);
00594 goto L790;
00595
00596 L780:
00597 x = h__[i__ + (i__ + 1) * h_dim1];
00598 y = h__[i__ + 1 + i__ * h_dim1];
00599 vr = (wr[i__] - p) * (wr[i__] - p) + wi[i__] * wi[i__] - q * q;
00600 vi = (wr[i__] - p) * 2. * q;
00601 if (vr != 0. || vi != 0.) {
00602 goto L784;
00603 }
00604 tst1 = norm * (abs(w) + abs(q) + abs(x) + abs(y) + abs(zz));
00605 vr = tst1;
00606 L783:
00607 vr *= .01;
00608 tst2 = tst1 + vr;
00609 if (tst2 > tst1) {
00610 goto L783;
00611 }
00612 L784:
00613 d__1 = x * r__ - zz * ra + q * sa;
00614 d__2 = x * s - zz * sa - q * ra;
00615 cdiv_(&d__1, &d__2, &vr, &vi, &h__[i__ + na * h_dim1], &h__[i__ +
00616 en * h_dim1]);
00617 if (abs(x) <= abs(zz) + abs(q)) {
00618 goto L785;
00619 }
00620 h__[i__ + 1 + na * h_dim1] = (-ra - w * h__[i__ + na * h_dim1] +
00621 q * h__[i__ + en * h_dim1]) / x;
00622 h__[i__ + 1 + en * h_dim1] = (-sa - w * h__[i__ + en * h_dim1] -
00623 q * h__[i__ + na * h_dim1]) / x;
00624 goto L790;
00625 L785:
00626 d__1 = -r__ - y * h__[i__ + na * h_dim1];
00627 d__2 = -s - y * h__[i__ + en * h_dim1];
00628 cdiv_(&d__1, &d__2, &zz, &q, &h__[i__ + 1 + na * h_dim1], &h__[
00629 i__ + 1 + en * h_dim1]);
00630
00631
00632 L790:
00633
00634 d__3 = (d__1 = h__[i__ + na * h_dim1], abs(d__1)), d__4 = (d__2 =
00635 h__[i__ + en * h_dim1], abs(d__2));
00636 t = max(d__3,d__4);
00637 if (t == 0.) {
00638 goto L795;
00639 }
00640 tst1 = t;
00641 tst2 = tst1 + 1. / tst1;
00642 if (tst2 > tst1) {
00643 goto L795;
00644 }
00645 i__3 = en;
00646 for (j = i__; j <= i__3; ++j) {
00647 h__[j + na * h_dim1] /= t;
00648 h__[j + en * h_dim1] /= t;
00649
00650 }
00651
00652 L795:
00653 ;
00654 }
00655
00656 L800:
00657 ;
00658 }
00659
00660
00661 i__1 = *n;
00662 for (i__ = 1; i__ <= i__1; ++i__) {
00663 if (i__ >= *low && i__ <= *igh) {
00664 goto L840;
00665 }
00666
00667 i__2 = *n;
00668 for (j = i__; j <= i__2; ++j) {
00669
00670 z__[i__ + j * z_dim1] = h__[i__ + j * h_dim1];
00671 }
00672
00673 L840:
00674 ;
00675 }
00676
00677
00678
00679 i__1 = *n;
00680 for (jj = *low; jj <= i__1; ++jj) {
00681 j = *n + *low - jj;
00682 m = min(j,*igh);
00683
00684 i__2 = *igh;
00685 for (i__ = *low; i__ <= i__2; ++i__) {
00686 zz = 0.;
00687
00688 i__3 = m;
00689 for (k = *low; k <= i__3; ++k) {
00690
00691 zz += z__[i__ + k * z_dim1] * h__[k + j * h_dim1];
00692 }
00693
00694 z__[i__ + j * z_dim1] = zz;
00695
00696 }
00697 }
00698
00699 goto L1001;
00700
00701
00702 L1000:
00703 *ierr = en;
00704 L1001:
00705 return 0;
00706 }
00707