Doxygen Source Code Documentation
Main Page Alphabetical List Data Structures File List Data Fields Globals Search
eis_comqr2.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006 #include "f2c.h"
00007
00008 int comqr2_(integer *nm, integer *n, integer *low, integer *
00009 igh, doublereal *ortr, doublereal *orti, doublereal *hr, doublereal *
00010 hi, doublereal *wr, doublereal *wi, doublereal *zr, doublereal *zi,
00011 integer *ierr)
00012 {
00013
00014 integer hr_dim1, hr_offset, hi_dim1, hi_offset, zr_dim1, zr_offset,
00015 zi_dim1, zi_offset, i__1, i__2, i__3;
00016 doublereal d__1, d__2, d__3, d__4;
00017
00018
00019 static integer iend;
00020 extern int cdiv_(doublereal *, doublereal *, doublereal *
00021 , doublereal *, doublereal *, doublereal *);
00022 static doublereal norm;
00023 static integer i__, j, k, l, m, ii, en, jj, ll, nn;
00024 static doublereal si, ti, xi, yi, sr, tr, xr, yr;
00025 extern doublereal pythag_(doublereal *, doublereal *);
00026 extern int csroot_(doublereal *, doublereal *,
00027 doublereal *, doublereal *);
00028 static integer ip1, lp1, itn, its;
00029 static doublereal zzi, zzr;
00030 static integer enm1;
00031 static doublereal tst1, tst2;
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
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110 zi_dim1 = *nm;
00111 zi_offset = zi_dim1 + 1;
00112 zi -= zi_offset;
00113 zr_dim1 = *nm;
00114 zr_offset = zr_dim1 + 1;
00115 zr -= zr_offset;
00116 --wi;
00117 --wr;
00118 hi_dim1 = *nm;
00119 hi_offset = hi_dim1 + 1;
00120 hi -= hi_offset;
00121 hr_dim1 = *nm;
00122 hr_offset = hr_dim1 + 1;
00123 hr -= hr_offset;
00124 --orti;
00125 --ortr;
00126
00127
00128 *ierr = 0;
00129
00130 i__1 = *n;
00131 for (j = 1; j <= i__1; ++j) {
00132
00133 i__2 = *n;
00134 for (i__ = 1; i__ <= i__2; ++i__) {
00135 zr[i__ + j * zr_dim1] = 0.;
00136 zi[i__ + j * zi_dim1] = 0.;
00137
00138 }
00139 zr[j + j * zr_dim1] = 1.;
00140
00141 }
00142
00143
00144 iend = *igh - *low - 1;
00145 if (iend < 0) {
00146 goto L180;
00147 } else if (iend == 0) {
00148 goto L150;
00149 } else {
00150 goto L105;
00151 }
00152
00153 L105:
00154 i__1 = iend;
00155 for (ii = 1; ii <= i__1; ++ii) {
00156 i__ = *igh - ii;
00157 if (ortr[i__] == 0. && orti[i__] == 0.) {
00158 goto L140;
00159 }
00160 if (hr[i__ + (i__ - 1) * hr_dim1] == 0. && hi[i__ + (i__ - 1) *
00161 hi_dim1] == 0.) {
00162 goto L140;
00163 }
00164
00165
00166 norm = hr[i__ + (i__ - 1) * hr_dim1] * ortr[i__] + hi[i__ + (i__ - 1)
00167 * hi_dim1] * orti[i__];
00168 ip1 = i__ + 1;
00169
00170 i__2 = *igh;
00171 for (k = ip1; k <= i__2; ++k) {
00172 ortr[k] = hr[k + (i__ - 1) * hr_dim1];
00173 orti[k] = hi[k + (i__ - 1) * hi_dim1];
00174
00175 }
00176
00177 i__2 = *igh;
00178 for (j = i__; j <= i__2; ++j) {
00179 sr = 0.;
00180 si = 0.;
00181
00182 i__3 = *igh;
00183 for (k = i__; k <= i__3; ++k) {
00184 sr = sr + ortr[k] * zr[k + j * zr_dim1] + orti[k] * zi[k + j *
00185 zi_dim1];
00186 si = si + ortr[k] * zi[k + j * zi_dim1] - orti[k] * zr[k + j *
00187 zr_dim1];
00188
00189 }
00190
00191 sr /= norm;
00192 si /= norm;
00193
00194 i__3 = *igh;
00195 for (k = i__; k <= i__3; ++k) {
00196 zr[k + j * zr_dim1] = zr[k + j * zr_dim1] + sr * ortr[k] - si
00197 * orti[k];
00198 zi[k + j * zi_dim1] = zi[k + j * zi_dim1] + sr * orti[k] + si
00199 * ortr[k];
00200
00201 }
00202
00203
00204 }
00205
00206 L140:
00207 ;
00208 }
00209
00210 L150:
00211 l = *low + 1;
00212
00213 i__1 = *igh;
00214 for (i__ = l; i__ <= i__1; ++i__) {
00215
00216 i__2 = i__ + 1;
00217 ll = min(i__2,*igh);
00218 if (hi[i__ + (i__ - 1) * hi_dim1] == 0.) {
00219 goto L170;
00220 }
00221 norm = pythag_(&hr[i__ + (i__ - 1) * hr_dim1], &hi[i__ + (i__ - 1) *
00222 hi_dim1]);
00223 yr = hr[i__ + (i__ - 1) * hr_dim1] / norm;
00224 yi = hi[i__ + (i__ - 1) * hi_dim1] / norm;
00225 hr[i__ + (i__ - 1) * hr_dim1] = norm;
00226 hi[i__ + (i__ - 1) * hi_dim1] = 0.;
00227
00228 i__2 = *n;
00229 for (j = i__; j <= i__2; ++j) {
00230 si = yr * hi[i__ + j * hi_dim1] - yi * hr[i__ + j * hr_dim1];
00231 hr[i__ + j * hr_dim1] = yr * hr[i__ + j * hr_dim1] + yi * hi[i__
00232 + j * hi_dim1];
00233 hi[i__ + j * hi_dim1] = si;
00234
00235 }
00236
00237 i__2 = ll;
00238 for (j = 1; j <= i__2; ++j) {
00239 si = yr * hi[j + i__ * hi_dim1] + yi * hr[j + i__ * hr_dim1];
00240 hr[j + i__ * hr_dim1] = yr * hr[j + i__ * hr_dim1] - yi * hi[j +
00241 i__ * hi_dim1];
00242 hi[j + i__ * hi_dim1] = si;
00243
00244 }
00245
00246 i__2 = *igh;
00247 for (j = *low; j <= i__2; ++j) {
00248 si = yr * zi[j + i__ * zi_dim1] + yi * zr[j + i__ * zr_dim1];
00249 zr[j + i__ * zr_dim1] = yr * zr[j + i__ * zr_dim1] - yi * zi[j +
00250 i__ * zi_dim1];
00251 zi[j + i__ * zi_dim1] = si;
00252
00253 }
00254
00255 L170:
00256 ;
00257 }
00258
00259 L180:
00260 i__1 = *n;
00261 for (i__ = 1; i__ <= i__1; ++i__) {
00262 if (i__ >= *low && i__ <= *igh) {
00263 goto L200;
00264 }
00265 wr[i__] = hr[i__ + i__ * hr_dim1];
00266 wi[i__] = hi[i__ + i__ * hi_dim1];
00267 L200:
00268 ;
00269 }
00270
00271 en = *igh;
00272 tr = 0.;
00273 ti = 0.;
00274 itn = *n * 30;
00275
00276 L220:
00277 if (en < *low) {
00278 goto L680;
00279 }
00280 its = 0;
00281 enm1 = en - 1;
00282
00283
00284 L240:
00285 i__1 = en;
00286 for (ll = *low; ll <= i__1; ++ll) {
00287 l = en + *low - ll;
00288 if (l == *low) {
00289 goto L300;
00290 }
00291 tst1 = (d__1 = hr[l - 1 + (l - 1) * hr_dim1], abs(d__1)) + (d__2 = hi[
00292 l - 1 + (l - 1) * hi_dim1], abs(d__2)) + (d__3 = hr[l + l *
00293 hr_dim1], abs(d__3)) + (d__4 = hi[l + l * hi_dim1], abs(d__4))
00294 ;
00295 tst2 = tst1 + (d__1 = hr[l + (l - 1) * hr_dim1], abs(d__1));
00296 if (tst2 == tst1) {
00297 goto L300;
00298 }
00299
00300 }
00301
00302 L300:
00303 if (l == en) {
00304 goto L660;
00305 }
00306 if (itn == 0) {
00307 goto L1000;
00308 }
00309 if (its == 10 || its == 20) {
00310 goto L320;
00311 }
00312 sr = hr[en + en * hr_dim1];
00313 si = hi[en + en * hi_dim1];
00314 xr = hr[enm1 + en * hr_dim1] * hr[en + enm1 * hr_dim1];
00315 xi = hi[enm1 + en * hi_dim1] * hr[en + enm1 * hr_dim1];
00316 if (xr == 0. && xi == 0.) {
00317 goto L340;
00318 }
00319 yr = (hr[enm1 + enm1 * hr_dim1] - sr) / 2.;
00320 yi = (hi[enm1 + enm1 * hi_dim1] - si) / 2.;
00321
00322 d__2 = yr;
00323
00324 d__3 = yi;
00325 d__1 = d__2 * d__2 - d__3 * d__3 + xr;
00326 d__4 = yr * 2. * yi + xi;
00327 csroot_(&d__1, &d__4, &zzr, &zzi);
00328 if (yr * zzr + yi * zzi >= 0.) {
00329 goto L310;
00330 }
00331 zzr = -zzr;
00332 zzi = -zzi;
00333 L310:
00334 d__1 = yr + zzr;
00335 d__2 = yi + zzi;
00336 cdiv_(&xr, &xi, &d__1, &d__2, &xr, &xi);
00337 sr -= xr;
00338 si -= xi;
00339 goto L340;
00340
00341 L320:
00342 sr = (d__1 = hr[en + enm1 * hr_dim1], abs(d__1)) + (d__2 = hr[enm1 + (en
00343 - 2) * hr_dim1], abs(d__2));
00344 si = 0.;
00345
00346 L340:
00347 i__1 = en;
00348 for (i__ = *low; i__ <= i__1; ++i__) {
00349 hr[i__ + i__ * hr_dim1] -= sr;
00350 hi[i__ + i__ * hi_dim1] -= si;
00351
00352 }
00353
00354 tr += sr;
00355 ti += si;
00356 ++its;
00357 --itn;
00358
00359 lp1 = l + 1;
00360
00361 i__1 = en;
00362 for (i__ = lp1; i__ <= i__1; ++i__) {
00363 sr = hr[i__ + (i__ - 1) * hr_dim1];
00364 hr[i__ + (i__ - 1) * hr_dim1] = 0.;
00365 d__1 = pythag_(&hr[i__ - 1 + (i__ - 1) * hr_dim1], &hi[i__ - 1 + (i__
00366 - 1) * hi_dim1]);
00367 norm = pythag_(&d__1, &sr);
00368 xr = hr[i__ - 1 + (i__ - 1) * hr_dim1] / norm;
00369 wr[i__ - 1] = xr;
00370 xi = hi[i__ - 1 + (i__ - 1) * hi_dim1] / norm;
00371 wi[i__ - 1] = xi;
00372 hr[i__ - 1 + (i__ - 1) * hr_dim1] = norm;
00373 hi[i__ - 1 + (i__ - 1) * hi_dim1] = 0.;
00374 hi[i__ + (i__ - 1) * hi_dim1] = sr / norm;
00375
00376 i__2 = *n;
00377 for (j = i__; j <= i__2; ++j) {
00378 yr = hr[i__ - 1 + j * hr_dim1];
00379 yi = hi[i__ - 1 + j * hi_dim1];
00380 zzr = hr[i__ + j * hr_dim1];
00381 zzi = hi[i__ + j * hi_dim1];
00382 hr[i__ - 1 + j * hr_dim1] = xr * yr + xi * yi + hi[i__ + (i__ - 1)
00383 * hi_dim1] * zzr;
00384 hi[i__ - 1 + j * hi_dim1] = xr * yi - xi * yr + hi[i__ + (i__ - 1)
00385 * hi_dim1] * zzi;
00386 hr[i__ + j * hr_dim1] = xr * zzr - xi * zzi - hi[i__ + (i__ - 1) *
00387 hi_dim1] * yr;
00388 hi[i__ + j * hi_dim1] = xr * zzi + xi * zzr - hi[i__ + (i__ - 1) *
00389 hi_dim1] * yi;
00390
00391 }
00392
00393
00394 }
00395
00396 si = hi[en + en * hi_dim1];
00397 if (si == 0.) {
00398 goto L540;
00399 }
00400 norm = pythag_(&hr[en + en * hr_dim1], &si);
00401 sr = hr[en + en * hr_dim1] / norm;
00402 si /= norm;
00403 hr[en + en * hr_dim1] = norm;
00404 hi[en + en * hi_dim1] = 0.;
00405 if (en == *n) {
00406 goto L540;
00407 }
00408 ip1 = en + 1;
00409
00410 i__1 = *n;
00411 for (j = ip1; j <= i__1; ++j) {
00412 yr = hr[en + j * hr_dim1];
00413 yi = hi[en + j * hi_dim1];
00414 hr[en + j * hr_dim1] = sr * yr + si * yi;
00415 hi[en + j * hi_dim1] = sr * yi - si * yr;
00416
00417 }
00418
00419 L540:
00420 i__1 = en;
00421 for (j = lp1; j <= i__1; ++j) {
00422 xr = wr[j - 1];
00423 xi = wi[j - 1];
00424
00425 i__2 = j;
00426 for (i__ = 1; i__ <= i__2; ++i__) {
00427 yr = hr[i__ + (j - 1) * hr_dim1];
00428 yi = 0.;
00429 zzr = hr[i__ + j * hr_dim1];
00430 zzi = hi[i__ + j * hi_dim1];
00431 if (i__ == j) {
00432 goto L560;
00433 }
00434 yi = hi[i__ + (j - 1) * hi_dim1];
00435 hi[i__ + (j - 1) * hi_dim1] = xr * yi + xi * yr + hi[j + (j - 1) *
00436 hi_dim1] * zzi;
00437 L560:
00438 hr[i__ + (j - 1) * hr_dim1] = xr * yr - xi * yi + hi[j + (j - 1) *
00439 hi_dim1] * zzr;
00440 hr[i__ + j * hr_dim1] = xr * zzr + xi * zzi - hi[j + (j - 1) *
00441 hi_dim1] * yr;
00442 hi[i__ + j * hi_dim1] = xr * zzi - xi * zzr - hi[j + (j - 1) *
00443 hi_dim1] * yi;
00444
00445 }
00446
00447 i__2 = *igh;
00448 for (i__ = *low; i__ <= i__2; ++i__) {
00449 yr = zr[i__ + (j - 1) * zr_dim1];
00450 yi = zi[i__ + (j - 1) * zi_dim1];
00451 zzr = zr[i__ + j * zr_dim1];
00452 zzi = zi[i__ + j * zi_dim1];
00453 zr[i__ + (j - 1) * zr_dim1] = xr * yr - xi * yi + hi[j + (j - 1) *
00454 hi_dim1] * zzr;
00455 zi[i__ + (j - 1) * zi_dim1] = xr * yi + xi * yr + hi[j + (j - 1) *
00456 hi_dim1] * zzi;
00457 zr[i__ + j * zr_dim1] = xr * zzr + xi * zzi - hi[j + (j - 1) *
00458 hi_dim1] * yr;
00459 zi[i__ + j * zi_dim1] = xr * zzi - xi * zzr - hi[j + (j - 1) *
00460 hi_dim1] * yi;
00461
00462 }
00463
00464
00465 }
00466
00467 if (si == 0.) {
00468 goto L240;
00469 }
00470
00471 i__1 = en;
00472 for (i__ = 1; i__ <= i__1; ++i__) {
00473 yr = hr[i__ + en * hr_dim1];
00474 yi = hi[i__ + en * hi_dim1];
00475 hr[i__ + en * hr_dim1] = sr * yr - si * yi;
00476 hi[i__ + en * hi_dim1] = sr * yi + si * yr;
00477
00478 }
00479
00480 i__1 = *igh;
00481 for (i__ = *low; i__ <= i__1; ++i__) {
00482 yr = zr[i__ + en * zr_dim1];
00483 yi = zi[i__ + en * zi_dim1];
00484 zr[i__ + en * zr_dim1] = sr * yr - si * yi;
00485 zi[i__ + en * zi_dim1] = sr * yi + si * yr;
00486
00487 }
00488
00489 goto L240;
00490
00491 L660:
00492 hr[en + en * hr_dim1] += tr;
00493 wr[en] = hr[en + en * hr_dim1];
00494 hi[en + en * hi_dim1] += ti;
00495 wi[en] = hi[en + en * hi_dim1];
00496 en = enm1;
00497 goto L220;
00498
00499
00500 L680:
00501 norm = 0.;
00502
00503 i__1 = *n;
00504 for (i__ = 1; i__ <= i__1; ++i__) {
00505
00506 i__2 = *n;
00507 for (j = i__; j <= i__2; ++j) {
00508 tr = (d__1 = hr[i__ + j * hr_dim1], abs(d__1)) + (d__2 = hi[i__ +
00509 j * hi_dim1], abs(d__2));
00510 if (tr > norm) {
00511 norm = tr;
00512 }
00513
00514 }
00515 }
00516
00517 if (*n == 1 || norm == 0.) {
00518 goto L1001;
00519 }
00520
00521 i__2 = *n;
00522 for (nn = 2; nn <= i__2; ++nn) {
00523 en = *n + 2 - nn;
00524 xr = wr[en];
00525 xi = wi[en];
00526 hr[en + en * hr_dim1] = 1.;
00527 hi[en + en * hi_dim1] = 0.;
00528 enm1 = en - 1;
00529
00530 i__1 = enm1;
00531 for (ii = 1; ii <= i__1; ++ii) {
00532 i__ = en - ii;
00533 zzr = 0.;
00534 zzi = 0.;
00535 ip1 = i__ + 1;
00536
00537 i__3 = en;
00538 for (j = ip1; j <= i__3; ++j) {
00539 zzr = zzr + hr[i__ + j * hr_dim1] * hr[j + en * hr_dim1] - hi[
00540 i__ + j * hi_dim1] * hi[j + en * hi_dim1];
00541 zzi = zzi + hr[i__ + j * hr_dim1] * hi[j + en * hi_dim1] + hi[
00542 i__ + j * hi_dim1] * hr[j + en * hr_dim1];
00543
00544 }
00545
00546 yr = xr - wr[i__];
00547 yi = xi - wi[i__];
00548 if (yr != 0. || yi != 0.) {
00549 goto L765;
00550 }
00551 tst1 = norm;
00552 yr = tst1;
00553 L760:
00554 yr *= .01;
00555 tst2 = norm + yr;
00556 if (tst2 > tst1) {
00557 goto L760;
00558 }
00559 L765:
00560 cdiv_(&zzr, &zzi, &yr, &yi, &hr[i__ + en * hr_dim1], &hi[i__ + en
00561 * hi_dim1]);
00562
00563 tr = (d__1 = hr[i__ + en * hr_dim1], abs(d__1)) + (d__2 = hi[i__
00564 + en * hi_dim1], abs(d__2));
00565 if (tr == 0.) {
00566 goto L780;
00567 }
00568 tst1 = tr;
00569 tst2 = tst1 + 1. / tst1;
00570 if (tst2 > tst1) {
00571 goto L780;
00572 }
00573 i__3 = en;
00574 for (j = i__; j <= i__3; ++j) {
00575 hr[j + en * hr_dim1] /= tr;
00576 hi[j + en * hi_dim1] /= tr;
00577
00578 }
00579
00580 L780:
00581 ;
00582 }
00583
00584
00585 }
00586
00587 enm1 = *n - 1;
00588
00589 i__2 = enm1;
00590 for (i__ = 1; i__ <= i__2; ++i__) {
00591 if (i__ >= *low && i__ <= *igh) {
00592 goto L840;
00593 }
00594 ip1 = i__ + 1;
00595
00596 i__1 = *n;
00597 for (j = ip1; j <= i__1; ++j) {
00598 zr[i__ + j * zr_dim1] = hr[i__ + j * hr_dim1];
00599 zi[i__ + j * zi_dim1] = hi[i__ + j * hi_dim1];
00600
00601 }
00602
00603 L840:
00604 ;
00605 }
00606
00607
00608
00609 i__2 = enm1;
00610 for (jj = *low; jj <= i__2; ++jj) {
00611 j = *n + *low - jj;
00612 m = min(j,*igh);
00613
00614 i__1 = *igh;
00615 for (i__ = *low; i__ <= i__1; ++i__) {
00616 zzr = 0.;
00617 zzi = 0.;
00618
00619 i__3 = m;
00620 for (k = *low; k <= i__3; ++k) {
00621 zzr = zzr + zr[i__ + k * zr_dim1] * hr[k + j * hr_dim1] - zi[
00622 i__ + k * zi_dim1] * hi[k + j * hi_dim1];
00623 zzi = zzi + zr[i__ + k * zr_dim1] * hi[k + j * hi_dim1] + zi[
00624 i__ + k * zi_dim1] * hr[k + j * hr_dim1];
00625
00626 }
00627
00628 zr[i__ + j * zr_dim1] = zzr;
00629 zi[i__ + j * zi_dim1] = zzi;
00630
00631 }
00632 }
00633
00634 goto L1001;
00635
00636
00637 L1000:
00638 *ierr = en;
00639 L1001:
00640 return 0;
00641 }
00642