Doxygen Source Code Documentation
        
Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search   
eis_ratqr.c
Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 #include "f2c.h"
00007 
00008  int ratqr_(integer *n, doublereal *eps1, doublereal *d__, 
00009         doublereal *e, doublereal *e2, integer *m, doublereal *w, integer *
00010         ind, doublereal *bd, logical *type__, integer *idef, integer *ierr)
00011 {
00012     
00013     integer i__1, i__2;
00014     doublereal d__1, d__2, d__3;
00015 
00016     
00017     static integer jdef;
00018     static doublereal f;
00019     static integer i__, j, k;
00020     static doublereal p, q, r__, s, delta;
00021     static integer k1, ii, jj;
00022     static doublereal ep, qp;
00023     extern doublereal epslon_(doublereal *);
00024     static doublereal err, tot;
00025 
00026 
00027 
00028 
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 
00092 
00093 
00094 
00095 
00096 
00097 
00098 
00099 
00100 
00101 
00102 
00103 
00104 
00105 
00106 
00107 
00108 
00109 
00110 
00111 
00112 
00113 
00114 
00115 
00116 
00117 
00118 
00119 
00120 
00121 
00122 
00123     
00124     --bd;
00125     --ind;
00126     --w;
00127     --e2;
00128     --e;
00129     --d__;
00130 
00131     
00132     *ierr = 0;
00133     jdef = *idef;
00134 
00135     i__1 = *n;
00136     for (i__ = 1; i__ <= i__1; ++i__) {
00137 
00138         w[i__] = d__[i__];
00139     }
00140 
00141     if (*type__) {
00142         goto L40;
00143     }
00144     j = 1;
00145     goto L400;
00146 L40:
00147     err = 0.;
00148     s = 0.;
00149 
00150 
00151 
00152     tot = w[1];
00153     q = 0.;
00154     j = 0;
00155 
00156     i__1 = *n;
00157     for (i__ = 1; i__ <= i__1; ++i__) {
00158         p = q;
00159         if (i__ == 1) {
00160             goto L60;
00161         }
00162         d__3 = (d__1 = d__[i__], abs(d__1)) + (d__2 = d__[i__ - 1], abs(d__2))
00163                 ;
00164         if (p > epslon_(&d__3)) {
00165             goto L80;
00166         }
00167 L60:
00168         e2[i__] = 0.;
00169 L80:
00170         bd[i__] = e2[i__];
00171 
00172 
00173         if (e2[i__] == 0.) {
00174             ++j;
00175         }
00176         ind[i__] = j;
00177         q = 0.;
00178         if (i__ != *n) {
00179             q = (d__1 = e[i__ + 1], abs(d__1));
00180         }
00181 
00182         d__1 = w[i__] - p - q;
00183         tot = min(d__1,tot);
00184 
00185     }
00186 
00187     if (jdef == 1 && tot < 0.) {
00188         goto L140;
00189     }
00190 
00191     i__1 = *n;
00192     for (i__ = 1; i__ <= i__1; ++i__) {
00193 
00194         w[i__] -= tot;
00195     }
00196 
00197     goto L160;
00198 L140:
00199     tot = 0.;
00200 
00201 L160:
00202     i__1 = *m;
00203     for (k = 1; k <= i__1; ++k) {
00204 
00205 L180:
00206         tot += s;
00207         delta = w[*n] - s;
00208         i__ = *n;
00209         f = (d__1 = epslon_(&tot), abs(d__1));
00210         if (*eps1 < f) {
00211             *eps1 = f;
00212         }
00213         if (delta > *eps1) {
00214             goto L190;
00215         }
00216         if (delta < -(*eps1)) {
00217             goto L1000;
00218         }
00219         goto L300;
00220 
00221 
00222 L190:
00223         if (k == *n) {
00224             goto L210;
00225         }
00226         k1 = k + 1;
00227         i__2 = *n;
00228         for (j = k1; j <= i__2; ++j) {
00229             d__2 = w[j] + w[j - 1];
00230 
00231             d__1 = epslon_(&d__2);
00232             if (bd[j] <= d__1 * d__1) {
00233                 bd[j] = 0.;
00234             }
00235 
00236         }
00237 
00238 L210:
00239         f = bd[*n] / delta;
00240         qp = delta + f;
00241         p = 1.;
00242         if (k == *n) {
00243             goto L260;
00244         }
00245         k1 = *n - k;
00246 
00247         i__2 = k1;
00248         for (ii = 1; ii <= i__2; ++ii) {
00249             i__ = *n - ii;
00250             q = w[i__] - s - f;
00251             r__ = q / qp;
00252             p = p * r__ + 1.;
00253             ep = f * r__;
00254             w[i__ + 1] = qp + ep;
00255             delta = q - ep;
00256             if (delta > *eps1) {
00257                 goto L220;
00258             }
00259             if (delta < -(*eps1)) {
00260                 goto L1000;
00261             }
00262             goto L300;
00263 L220:
00264             f = bd[i__] / q;
00265             qp = delta + f;
00266             bd[i__ + 1] = qp * ep;
00267 
00268         }
00269 
00270 L260:
00271         w[k] = qp;
00272         s = qp / p;
00273         if (tot + s > tot) {
00274             goto L180;
00275         }
00276 
00277 
00278         *ierr = *n * 5 + k;
00279         s = 0.;
00280         delta = qp;
00281 
00282         i__2 = *n;
00283         for (j = k; j <= i__2; ++j) {
00284             if (w[j] > delta) {
00285                 goto L280;
00286             }
00287             i__ = j;
00288             delta = w[j];
00289 L280:
00290             ;
00291         }
00292 
00293 L300:
00294         if (i__ < *n) {
00295             bd[i__ + 1] = bd[i__] * f / qp;
00296         }
00297         ii = ind[i__];
00298         if (i__ == k) {
00299             goto L340;
00300         }
00301         k1 = i__ - k;
00302 
00303         i__2 = k1;
00304         for (jj = 1; jj <= i__2; ++jj) {
00305             j = i__ - jj;
00306             w[j + 1] = w[j] - s;
00307             bd[j + 1] = bd[j];
00308             ind[j + 1] = ind[j];
00309 
00310         }
00311 
00312 L340:
00313         w[k] = tot;
00314         err += abs(delta);
00315         bd[k] = err;
00316         ind[k] = ii;
00317 
00318     }
00319 
00320     if (*type__) {
00321         goto L1001;
00322     }
00323     f = bd[1];
00324     e2[1] = 2.;
00325     bd[1] = f;
00326     j = 2;
00327 
00328 L400:
00329     i__1 = *n;
00330     for (i__ = 1; i__ <= i__1; ++i__) {
00331 
00332         w[i__] = -w[i__];
00333     }
00334 
00335     jdef = -jdef;
00336     switch (j) {
00337         case 1:  goto L40;
00338         case 2:  goto L1001;
00339     }
00340 
00341 L1000:
00342     *ierr = *n * 6 + 1;
00343 L1001:
00344     return 0;
00345 } 
00346