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