Doxygen Source Code Documentation
        
Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search   
eis_comqr.c
Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 #include "f2c.h"
00007 
00008  int comqr_(integer *nm, integer *n, integer *low, integer *
00009         igh, doublereal *hr, doublereal *hi, doublereal *wr, doublereal *wi, 
00010         integer *ierr)
00011 {
00012     
00013     integer hr_dim1, hr_offset, hi_dim1, hi_offset, i__1, i__2;
00014     doublereal d__1, d__2, d__3, d__4;
00015 
00016     
00017     extern  int cdiv_(doublereal *, doublereal *, doublereal *
00018             , doublereal *, doublereal *, doublereal *);
00019     static doublereal norm;
00020     static integer i__, j, l, en, ll;
00021     static doublereal si, ti, xi, yi, sr, tr, xr, yr;
00022     extern doublereal pythag_(doublereal *, doublereal *);
00023     extern  int csroot_(doublereal *, doublereal *, 
00024             doublereal *, doublereal *);
00025     static integer lp1, itn, its;
00026     static doublereal zzi, zzr;
00027     static integer enm1;
00028     static doublereal tst1, tst2;
00029 
00030 
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     --wi;
00092     --wr;
00093     hi_dim1 = *nm;
00094     hi_offset = hi_dim1 + 1;
00095     hi -= hi_offset;
00096     hr_dim1 = *nm;
00097     hr_offset = hr_dim1 + 1;
00098     hr -= hr_offset;
00099 
00100     
00101     *ierr = 0;
00102     if (*low == *igh) {
00103         goto L180;
00104     }
00105 
00106     l = *low + 1;
00107 
00108     i__1 = *igh;
00109     for (i__ = l; i__ <= i__1; ++i__) {
00110 
00111         i__2 = i__ + 1;
00112         ll = min(i__2,*igh);
00113         if (hi[i__ + (i__ - 1) * hi_dim1] == 0.) {
00114             goto L170;
00115         }
00116         norm = pythag_(&hr[i__ + (i__ - 1) * hr_dim1], &hi[i__ + (i__ - 1) * 
00117                 hi_dim1]);
00118         yr = hr[i__ + (i__ - 1) * hr_dim1] / norm;
00119         yi = hi[i__ + (i__ - 1) * hi_dim1] / norm;
00120         hr[i__ + (i__ - 1) * hr_dim1] = norm;
00121         hi[i__ + (i__ - 1) * hi_dim1] = 0.;
00122 
00123         i__2 = *igh;
00124         for (j = i__; j <= i__2; ++j) {
00125             si = yr * hi[i__ + j * hi_dim1] - yi * hr[i__ + j * hr_dim1];
00126             hr[i__ + j * hr_dim1] = yr * hr[i__ + j * hr_dim1] + yi * hi[i__ 
00127                     + j * hi_dim1];
00128             hi[i__ + j * hi_dim1] = si;
00129 
00130         }
00131 
00132         i__2 = ll;
00133         for (j = *low; j <= i__2; ++j) {
00134             si = yr * hi[j + i__ * hi_dim1] + yi * hr[j + i__ * hr_dim1];
00135             hr[j + i__ * hr_dim1] = yr * hr[j + i__ * hr_dim1] - yi * hi[j + 
00136                     i__ * hi_dim1];
00137             hi[j + i__ * hi_dim1] = si;
00138 
00139         }
00140 
00141 L170:
00142         ;
00143     }
00144 
00145 L180:
00146     i__1 = *n;
00147     for (i__ = 1; i__ <= i__1; ++i__) {
00148         if (i__ >= *low && i__ <= *igh) {
00149             goto L200;
00150         }
00151         wr[i__] = hr[i__ + i__ * hr_dim1];
00152         wi[i__] = hi[i__ + i__ * hi_dim1];
00153 L200:
00154         ;
00155     }
00156 
00157     en = *igh;
00158     tr = 0.;
00159     ti = 0.;
00160     itn = *n * 30;
00161 
00162 L220:
00163     if (en < *low) {
00164         goto L1001;
00165     }
00166     its = 0;
00167     enm1 = en - 1;
00168 
00169 
00170 L240:
00171     i__1 = en;
00172     for (ll = *low; ll <= i__1; ++ll) {
00173         l = en + *low - ll;
00174         if (l == *low) {
00175             goto L300;
00176         }
00177         tst1 = (d__1 = hr[l - 1 + (l - 1) * hr_dim1], abs(d__1)) + (d__2 = hi[
00178                 l - 1 + (l - 1) * hi_dim1], abs(d__2)) + (d__3 = hr[l + l * 
00179                 hr_dim1], abs(d__3)) + (d__4 = hi[l + l * hi_dim1], abs(d__4))
00180                 ;
00181         tst2 = tst1 + (d__1 = hr[l + (l - 1) * hr_dim1], abs(d__1));
00182         if (tst2 == tst1) {
00183             goto L300;
00184         }
00185 
00186     }
00187 
00188 L300:
00189     if (l == en) {
00190         goto L660;
00191     }
00192     if (itn == 0) {
00193         goto L1000;
00194     }
00195     if (its == 10 || its == 20) {
00196         goto L320;
00197     }
00198     sr = hr[en + en * hr_dim1];
00199     si = hi[en + en * hi_dim1];
00200     xr = hr[enm1 + en * hr_dim1] * hr[en + enm1 * hr_dim1];
00201     xi = hi[enm1 + en * hi_dim1] * hr[en + enm1 * hr_dim1];
00202     if (xr == 0. && xi == 0.) {
00203         goto L340;
00204     }
00205     yr = (hr[enm1 + enm1 * hr_dim1] - sr) / 2.;
00206     yi = (hi[enm1 + enm1 * hi_dim1] - si) / 2.;
00207 
00208     d__2 = yr;
00209 
00210     d__3 = yi;
00211     d__1 = d__2 * d__2 - d__3 * d__3 + xr;
00212     d__4 = yr * 2. * yi + xi;
00213     csroot_(&d__1, &d__4, &zzr, &zzi);
00214     if (yr * zzr + yi * zzi >= 0.) {
00215         goto L310;
00216     }
00217     zzr = -zzr;
00218     zzi = -zzi;
00219 L310:
00220     d__1 = yr + zzr;
00221     d__2 = yi + zzi;
00222     cdiv_(&xr, &xi, &d__1, &d__2, &xr, &xi);
00223     sr -= xr;
00224     si -= xi;
00225     goto L340;
00226 
00227 L320:
00228     sr = (d__1 = hr[en + enm1 * hr_dim1], abs(d__1)) + (d__2 = hr[enm1 + (en 
00229             - 2) * hr_dim1], abs(d__2));
00230     si = 0.;
00231 
00232 L340:
00233     i__1 = en;
00234     for (i__ = *low; i__ <= i__1; ++i__) {
00235         hr[i__ + i__ * hr_dim1] -= sr;
00236         hi[i__ + i__ * hi_dim1] -= si;
00237 
00238     }
00239 
00240     tr += sr;
00241     ti += si;
00242     ++its;
00243     --itn;
00244 
00245     lp1 = l + 1;
00246 
00247     i__1 = en;
00248     for (i__ = lp1; i__ <= i__1; ++i__) {
00249         sr = hr[i__ + (i__ - 1) * hr_dim1];
00250         hr[i__ + (i__ - 1) * hr_dim1] = 0.;
00251         d__1 = pythag_(&hr[i__ - 1 + (i__ - 1) * hr_dim1], &hi[i__ - 1 + (i__ 
00252                 - 1) * hi_dim1]);
00253         norm = pythag_(&d__1, &sr);
00254         xr = hr[i__ - 1 + (i__ - 1) * hr_dim1] / norm;
00255         wr[i__ - 1] = xr;
00256         xi = hi[i__ - 1 + (i__ - 1) * hi_dim1] / norm;
00257         wi[i__ - 1] = xi;
00258         hr[i__ - 1 + (i__ - 1) * hr_dim1] = norm;
00259         hi[i__ - 1 + (i__ - 1) * hi_dim1] = 0.;
00260         hi[i__ + (i__ - 1) * hi_dim1] = sr / norm;
00261 
00262         i__2 = en;
00263         for (j = i__; j <= i__2; ++j) {
00264             yr = hr[i__ - 1 + j * hr_dim1];
00265             yi = hi[i__ - 1 + j * hi_dim1];
00266             zzr = hr[i__ + j * hr_dim1];
00267             zzi = hi[i__ + j * hi_dim1];
00268             hr[i__ - 1 + j * hr_dim1] = xr * yr + xi * yi + hi[i__ + (i__ - 1)
00269                      * hi_dim1] * zzr;
00270             hi[i__ - 1 + j * hi_dim1] = xr * yi - xi * yr + hi[i__ + (i__ - 1)
00271                      * hi_dim1] * zzi;
00272             hr[i__ + j * hr_dim1] = xr * zzr - xi * zzi - hi[i__ + (i__ - 1) *
00273                      hi_dim1] * yr;
00274             hi[i__ + j * hi_dim1] = xr * zzi + xi * zzr - hi[i__ + (i__ - 1) *
00275                      hi_dim1] * yi;
00276 
00277         }
00278 
00279 
00280     }
00281 
00282     si = hi[en + en * hi_dim1];
00283     if (si == 0.) {
00284         goto L540;
00285     }
00286     norm = pythag_(&hr[en + en * hr_dim1], &si);
00287     sr = hr[en + en * hr_dim1] / norm;
00288     si /= norm;
00289     hr[en + en * hr_dim1] = norm;
00290     hi[en + en * hi_dim1] = 0.;
00291 
00292 L540:
00293     i__1 = en;
00294     for (j = lp1; j <= i__1; ++j) {
00295         xr = wr[j - 1];
00296         xi = wi[j - 1];
00297 
00298         i__2 = j;
00299         for (i__ = l; i__ <= i__2; ++i__) {
00300             yr = hr[i__ + (j - 1) * hr_dim1];
00301             yi = 0.;
00302             zzr = hr[i__ + j * hr_dim1];
00303             zzi = hi[i__ + j * hi_dim1];
00304             if (i__ == j) {
00305                 goto L560;
00306             }
00307             yi = hi[i__ + (j - 1) * hi_dim1];
00308             hi[i__ + (j - 1) * hi_dim1] = xr * yi + xi * yr + hi[j + (j - 1) *
00309                      hi_dim1] * zzi;
00310 L560:
00311             hr[i__ + (j - 1) * hr_dim1] = xr * yr - xi * yi + hi[j + (j - 1) *
00312                      hi_dim1] * zzr;
00313             hr[i__ + j * hr_dim1] = xr * zzr + xi * zzi - hi[j + (j - 1) * 
00314                     hi_dim1] * yr;
00315             hi[i__ + j * hi_dim1] = xr * zzi - xi * zzr - hi[j + (j - 1) * 
00316                     hi_dim1] * yi;
00317 
00318         }
00319 
00320 
00321     }
00322 
00323     if (si == 0.) {
00324         goto L240;
00325     }
00326 
00327     i__1 = en;
00328     for (i__ = l; i__ <= i__1; ++i__) {
00329         yr = hr[i__ + en * hr_dim1];
00330         yi = hi[i__ + en * hi_dim1];
00331         hr[i__ + en * hr_dim1] = sr * yr - si * yi;
00332         hi[i__ + en * hi_dim1] = sr * yi + si * yr;
00333 
00334     }
00335 
00336     goto L240;
00337 
00338 L660:
00339     wr[en] = hr[en + en * hr_dim1] + tr;
00340     wi[en] = hi[en + en * hi_dim1] + ti;
00341     en = enm1;
00342     goto L220;
00343 
00344 
00345 L1000:
00346     *ierr = en;
00347 L1001:
00348     return 0;
00349 } 
00350