00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "f2c.h"
00014 #include "blaswrap.h"
00015
00016
00017
00018 static doublecomplex c_b1 = {1.,0.};
00019 static integer c__1 = 1;
00020 static integer c_n1 = -1;
00021 static doublereal c_b24 = 1.;
00022
00023 int zlatdf_(integer *ijob, integer *n, doublecomplex *z__,
00024 integer *ldz, doublecomplex *rhs, doublereal *rdsum, doublereal *
00025 rdscal, integer *ipiv, integer *jpiv)
00026 {
00027
00028 integer z_dim1, z_offset, i__1, i__2, i__3, i__4, i__5;
00029 doublecomplex z__1, z__2, z__3;
00030
00031
00032 void z_div(doublecomplex *, doublecomplex *, doublecomplex *);
00033 double z_abs(doublecomplex *);
00034 void z_sqrt(doublecomplex *, doublecomplex *);
00035
00036
00037 integer i__, j, k;
00038 doublecomplex bm, bp, xm[2], xp[2];
00039 integer info;
00040 doublecomplex temp, work[8];
00041 doublereal scale;
00042 extern int zscal_(integer *, doublecomplex *,
00043 doublecomplex *, integer *);
00044 doublecomplex pmone;
00045 extern VOID zdotc_(doublecomplex *, integer *,
00046 doublecomplex *, integer *, doublecomplex *, integer *);
00047 doublereal rtemp, sminu, rwork[2];
00048 extern int zcopy_(integer *, doublecomplex *, integer *,
00049 doublecomplex *, integer *);
00050 doublereal splus;
00051 extern int zaxpy_(integer *, doublecomplex *,
00052 doublecomplex *, integer *, doublecomplex *, integer *), zgesc2_(
00053 integer *, doublecomplex *, integer *, doublecomplex *, integer *,
00054 integer *, doublereal *), zgecon_(char *, integer *,
00055 doublecomplex *, integer *, doublereal *, doublereal *,
00056 doublecomplex *, doublereal *, integer *);
00057 extern doublereal dzasum_(integer *, doublecomplex *, integer *);
00058 extern int zlassq_(integer *, doublecomplex *, integer *,
00059 doublereal *, doublereal *), zlaswp_(integer *, doublecomplex *,
00060 integer *, integer *, integer *, integer *, integer *);
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
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176 z_dim1 = *ldz;
00177 z_offset = 1 + z_dim1;
00178 z__ -= z_offset;
00179 --rhs;
00180 --ipiv;
00181 --jpiv;
00182
00183
00184 if (*ijob != 2) {
00185
00186
00187
00188 i__1 = *n - 1;
00189 zlaswp_(&c__1, &rhs[1], ldz, &c__1, &i__1, &ipiv[1], &c__1);
00190
00191
00192
00193 z__1.r = -1., z__1.i = -0.;
00194 pmone.r = z__1.r, pmone.i = z__1.i;
00195 i__1 = *n - 1;
00196 for (j = 1; j <= i__1; ++j) {
00197 i__2 = j;
00198 z__1.r = rhs[i__2].r + 1., z__1.i = rhs[i__2].i + 0.;
00199 bp.r = z__1.r, bp.i = z__1.i;
00200 i__2 = j;
00201 z__1.r = rhs[i__2].r - 1., z__1.i = rhs[i__2].i - 0.;
00202 bm.r = z__1.r, bm.i = z__1.i;
00203 splus = 1.;
00204
00205
00206
00207
00208 i__2 = *n - j;
00209 zdotc_(&z__1, &i__2, &z__[j + 1 + j * z_dim1], &c__1, &z__[j + 1
00210 + j * z_dim1], &c__1);
00211 splus += z__1.r;
00212 i__2 = *n - j;
00213 zdotc_(&z__1, &i__2, &z__[j + 1 + j * z_dim1], &c__1, &rhs[j + 1],
00214 &c__1);
00215 sminu = z__1.r;
00216 i__2 = j;
00217 splus *= rhs[i__2].r;
00218 if (splus > sminu) {
00219 i__2 = j;
00220 rhs[i__2].r = bp.r, rhs[i__2].i = bp.i;
00221 } else if (sminu > splus) {
00222 i__2 = j;
00223 rhs[i__2].r = bm.r, rhs[i__2].i = bm.i;
00224 } else {
00225
00226
00227
00228
00229
00230
00231
00232 i__2 = j;
00233 i__3 = j;
00234 z__1.r = rhs[i__3].r + pmone.r, z__1.i = rhs[i__3].i +
00235 pmone.i;
00236 rhs[i__2].r = z__1.r, rhs[i__2].i = z__1.i;
00237 pmone.r = 1., pmone.i = 0.;
00238 }
00239
00240
00241
00242 i__2 = j;
00243 z__1.r = -rhs[i__2].r, z__1.i = -rhs[i__2].i;
00244 temp.r = z__1.r, temp.i = z__1.i;
00245 i__2 = *n - j;
00246 zaxpy_(&i__2, &temp, &z__[j + 1 + j * z_dim1], &c__1, &rhs[j + 1],
00247 &c__1);
00248
00249 }
00250
00251
00252
00253
00254
00255
00256 i__1 = *n - 1;
00257 zcopy_(&i__1, &rhs[1], &c__1, work, &c__1);
00258 i__1 = *n - 1;
00259 i__2 = *n;
00260 z__1.r = rhs[i__2].r + 1., z__1.i = rhs[i__2].i + 0.;
00261 work[i__1].r = z__1.r, work[i__1].i = z__1.i;
00262 i__1 = *n;
00263 i__2 = *n;
00264 z__1.r = rhs[i__2].r - 1., z__1.i = rhs[i__2].i - 0.;
00265 rhs[i__1].r = z__1.r, rhs[i__1].i = z__1.i;
00266 splus = 0.;
00267 sminu = 0.;
00268 for (i__ = *n; i__ >= 1; --i__) {
00269 z_div(&z__1, &c_b1, &z__[i__ + i__ * z_dim1]);
00270 temp.r = z__1.r, temp.i = z__1.i;
00271 i__1 = i__ - 1;
00272 i__2 = i__ - 1;
00273 z__1.r = work[i__2].r * temp.r - work[i__2].i * temp.i, z__1.i =
00274 work[i__2].r * temp.i + work[i__2].i * temp.r;
00275 work[i__1].r = z__1.r, work[i__1].i = z__1.i;
00276 i__1 = i__;
00277 i__2 = i__;
00278 z__1.r = rhs[i__2].r * temp.r - rhs[i__2].i * temp.i, z__1.i =
00279 rhs[i__2].r * temp.i + rhs[i__2].i * temp.r;
00280 rhs[i__1].r = z__1.r, rhs[i__1].i = z__1.i;
00281 i__1 = *n;
00282 for (k = i__ + 1; k <= i__1; ++k) {
00283 i__2 = i__ - 1;
00284 i__3 = i__ - 1;
00285 i__4 = k - 1;
00286 i__5 = i__ + k * z_dim1;
00287 z__3.r = z__[i__5].r * temp.r - z__[i__5].i * temp.i, z__3.i =
00288 z__[i__5].r * temp.i + z__[i__5].i * temp.r;
00289 z__2.r = work[i__4].r * z__3.r - work[i__4].i * z__3.i,
00290 z__2.i = work[i__4].r * z__3.i + work[i__4].i *
00291 z__3.r;
00292 z__1.r = work[i__3].r - z__2.r, z__1.i = work[i__3].i -
00293 z__2.i;
00294 work[i__2].r = z__1.r, work[i__2].i = z__1.i;
00295 i__2 = i__;
00296 i__3 = i__;
00297 i__4 = k;
00298 i__5 = i__ + k * z_dim1;
00299 z__3.r = z__[i__5].r * temp.r - z__[i__5].i * temp.i, z__3.i =
00300 z__[i__5].r * temp.i + z__[i__5].i * temp.r;
00301 z__2.r = rhs[i__4].r * z__3.r - rhs[i__4].i * z__3.i, z__2.i =
00302 rhs[i__4].r * z__3.i + rhs[i__4].i * z__3.r;
00303 z__1.r = rhs[i__3].r - z__2.r, z__1.i = rhs[i__3].i - z__2.i;
00304 rhs[i__2].r = z__1.r, rhs[i__2].i = z__1.i;
00305
00306 }
00307 splus += z_abs(&work[i__ - 1]);
00308 sminu += z_abs(&rhs[i__]);
00309
00310 }
00311 if (splus > sminu) {
00312 zcopy_(n, work, &c__1, &rhs[1], &c__1);
00313 }
00314
00315
00316
00317 i__1 = *n - 1;
00318 zlaswp_(&c__1, &rhs[1], ldz, &c__1, &i__1, &jpiv[1], &c_n1);
00319
00320
00321
00322 zlassq_(n, &rhs[1], &c__1, rdscal, rdsum);
00323 return 0;
00324 }
00325
00326
00327
00328
00329
00330 zgecon_("I", n, &z__[z_offset], ldz, &c_b24, &rtemp, work, rwork, &info);
00331 zcopy_(n, &work[*n], &c__1, xm, &c__1);
00332
00333
00334
00335 i__1 = *n - 1;
00336 zlaswp_(&c__1, xm, ldz, &c__1, &i__1, &ipiv[1], &c_n1);
00337 zdotc_(&z__3, n, xm, &c__1, xm, &c__1);
00338 z_sqrt(&z__2, &z__3);
00339 z_div(&z__1, &c_b1, &z__2);
00340 temp.r = z__1.r, temp.i = z__1.i;
00341 zscal_(n, &temp, xm, &c__1);
00342 zcopy_(n, xm, &c__1, xp, &c__1);
00343 zaxpy_(n, &c_b1, &rhs[1], &c__1, xp, &c__1);
00344 z__1.r = -1., z__1.i = -0.;
00345 zaxpy_(n, &z__1, xm, &c__1, &rhs[1], &c__1);
00346 zgesc2_(n, &z__[z_offset], ldz, &rhs[1], &ipiv[1], &jpiv[1], &scale);
00347 zgesc2_(n, &z__[z_offset], ldz, xp, &ipiv[1], &jpiv[1], &scale);
00348 if (dzasum_(n, xp, &c__1) > dzasum_(n, &rhs[1], &c__1)) {
00349 zcopy_(n, xp, &c__1, &rhs[1], &c__1);
00350 }
00351
00352
00353
00354 zlassq_(n, &rhs[1], &c__1, rdscal, rdsum);
00355 return 0;
00356
00357
00358
00359 }