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