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 complex c_b1 = {0.f,0.f};
00019 static complex c_b2 = {1.f,0.f};
00020 static integer c__3 = 3;
00021 static integer c__1 = 1;
00022
00023 int clagge_(integer *m, integer *n, integer *kl, integer *ku,
00024 real *d__, complex *a, integer *lda, integer *iseed, complex *work,
00025 integer *info)
00026 {
00027
00028 integer a_dim1, a_offset, i__1, i__2, i__3;
00029 real r__1;
00030 complex q__1;
00031
00032
00033 double c_abs(complex *);
00034 void c_div(complex *, complex *, complex *);
00035
00036
00037 integer i__, j;
00038 complex wa, wb;
00039 real wn;
00040 complex tau;
00041 extern int cgerc_(integer *, integer *, complex *,
00042 complex *, integer *, complex *, integer *, complex *, integer *),
00043 cscal_(integer *, complex *, complex *, integer *), cgemv_(char *
00044 , integer *, integer *, complex *, complex *, integer *, complex *
00045 , integer *, complex *, complex *, integer *);
00046 extern doublereal scnrm2_(integer *, complex *, integer *);
00047 extern int clacgv_(integer *, complex *, integer *),
00048 xerbla_(char *, integer *), clarnv_(integer *, integer *,
00049 integer *, complex *);
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 --d__;
00125 a_dim1 = *lda;
00126 a_offset = 1 + a_dim1;
00127 a -= a_offset;
00128 --iseed;
00129 --work;
00130
00131
00132 *info = 0;
00133 if (*m < 0) {
00134 *info = -1;
00135 } else if (*n < 0) {
00136 *info = -2;
00137 } else if (*kl < 0 || *kl > *m - 1) {
00138 *info = -3;
00139 } else if (*ku < 0 || *ku > *n - 1) {
00140 *info = -4;
00141 } else if (*lda < max(1,*m)) {
00142 *info = -7;
00143 }
00144 if (*info < 0) {
00145 i__1 = -(*info);
00146 xerbla_("CLAGGE", &i__1);
00147 return 0;
00148 }
00149
00150
00151
00152 i__1 = *n;
00153 for (j = 1; j <= i__1; ++j) {
00154 i__2 = *m;
00155 for (i__ = 1; i__ <= i__2; ++i__) {
00156 i__3 = i__ + j * a_dim1;
00157 a[i__3].r = 0.f, a[i__3].i = 0.f;
00158
00159 }
00160
00161 }
00162 i__1 = min(*m,*n);
00163 for (i__ = 1; i__ <= i__1; ++i__) {
00164 i__2 = i__ + i__ * a_dim1;
00165 i__3 = i__;
00166 a[i__2].r = d__[i__3], a[i__2].i = 0.f;
00167
00168 }
00169
00170
00171
00172 for (i__ = min(*m,*n); i__ >= 1; --i__) {
00173 if (i__ < *m) {
00174
00175
00176
00177 i__1 = *m - i__ + 1;
00178 clarnv_(&c__3, &iseed[1], &i__1, &work[1]);
00179 i__1 = *m - i__ + 1;
00180 wn = scnrm2_(&i__1, &work[1], &c__1);
00181 r__1 = wn / c_abs(&work[1]);
00182 q__1.r = r__1 * work[1].r, q__1.i = r__1 * work[1].i;
00183 wa.r = q__1.r, wa.i = q__1.i;
00184 if (wn == 0.f) {
00185 tau.r = 0.f, tau.i = 0.f;
00186 } else {
00187 q__1.r = work[1].r + wa.r, q__1.i = work[1].i + wa.i;
00188 wb.r = q__1.r, wb.i = q__1.i;
00189 i__1 = *m - i__;
00190 c_div(&q__1, &c_b2, &wb);
00191 cscal_(&i__1, &q__1, &work[2], &c__1);
00192 work[1].r = 1.f, work[1].i = 0.f;
00193 c_div(&q__1, &wb, &wa);
00194 r__1 = q__1.r;
00195 tau.r = r__1, tau.i = 0.f;
00196 }
00197
00198
00199
00200 i__1 = *m - i__ + 1;
00201 i__2 = *n - i__ + 1;
00202 cgemv_("Conjugate transpose", &i__1, &i__2, &c_b2, &a[i__ + i__ *
00203 a_dim1], lda, &work[1], &c__1, &c_b1, &work[*m + 1], &
00204 c__1);
00205 i__1 = *m - i__ + 1;
00206 i__2 = *n - i__ + 1;
00207 q__1.r = -tau.r, q__1.i = -tau.i;
00208 cgerc_(&i__1, &i__2, &q__1, &work[1], &c__1, &work[*m + 1], &c__1,
00209 &a[i__ + i__ * a_dim1], lda);
00210 }
00211 if (i__ < *n) {
00212
00213
00214
00215 i__1 = *n - i__ + 1;
00216 clarnv_(&c__3, &iseed[1], &i__1, &work[1]);
00217 i__1 = *n - i__ + 1;
00218 wn = scnrm2_(&i__1, &work[1], &c__1);
00219 r__1 = wn / c_abs(&work[1]);
00220 q__1.r = r__1 * work[1].r, q__1.i = r__1 * work[1].i;
00221 wa.r = q__1.r, wa.i = q__1.i;
00222 if (wn == 0.f) {
00223 tau.r = 0.f, tau.i = 0.f;
00224 } else {
00225 q__1.r = work[1].r + wa.r, q__1.i = work[1].i + wa.i;
00226 wb.r = q__1.r, wb.i = q__1.i;
00227 i__1 = *n - i__;
00228 c_div(&q__1, &c_b2, &wb);
00229 cscal_(&i__1, &q__1, &work[2], &c__1);
00230 work[1].r = 1.f, work[1].i = 0.f;
00231 c_div(&q__1, &wb, &wa);
00232 r__1 = q__1.r;
00233 tau.r = r__1, tau.i = 0.f;
00234 }
00235
00236
00237
00238 i__1 = *m - i__ + 1;
00239 i__2 = *n - i__ + 1;
00240 cgemv_("No transpose", &i__1, &i__2, &c_b2, &a[i__ + i__ * a_dim1]
00241 , lda, &work[1], &c__1, &c_b1, &work[*n + 1], &c__1);
00242 i__1 = *m - i__ + 1;
00243 i__2 = *n - i__ + 1;
00244 q__1.r = -tau.r, q__1.i = -tau.i;
00245 cgerc_(&i__1, &i__2, &q__1, &work[*n + 1], &c__1, &work[1], &c__1,
00246 &a[i__ + i__ * a_dim1], lda);
00247 }
00248
00249 }
00250
00251
00252
00253
00254
00255 i__2 = *m - 1 - *kl, i__3 = *n - 1 - *ku;
00256 i__1 = max(i__2,i__3);
00257 for (i__ = 1; i__ <= i__1; ++i__) {
00258 if (*kl <= *ku) {
00259
00260
00261
00262
00263 i__2 = *m - 1 - *kl;
00264 if (i__ <= min(i__2,*n)) {
00265
00266
00267
00268 i__2 = *m - *kl - i__ + 1;
00269 wn = scnrm2_(&i__2, &a[*kl + i__ + i__ * a_dim1], &c__1);
00270 r__1 = wn / c_abs(&a[*kl + i__ + i__ * a_dim1]);
00271 i__2 = *kl + i__ + i__ * a_dim1;
00272 q__1.r = r__1 * a[i__2].r, q__1.i = r__1 * a[i__2].i;
00273 wa.r = q__1.r, wa.i = q__1.i;
00274 if (wn == 0.f) {
00275 tau.r = 0.f, tau.i = 0.f;
00276 } else {
00277 i__2 = *kl + i__ + i__ * a_dim1;
00278 q__1.r = a[i__2].r + wa.r, q__1.i = a[i__2].i + wa.i;
00279 wb.r = q__1.r, wb.i = q__1.i;
00280 i__2 = *m - *kl - i__;
00281 c_div(&q__1, &c_b2, &wb);
00282 cscal_(&i__2, &q__1, &a[*kl + i__ + 1 + i__ * a_dim1], &
00283 c__1);
00284 i__2 = *kl + i__ + i__ * a_dim1;
00285 a[i__2].r = 1.f, a[i__2].i = 0.f;
00286 c_div(&q__1, &wb, &wa);
00287 r__1 = q__1.r;
00288 tau.r = r__1, tau.i = 0.f;
00289 }
00290
00291
00292
00293 i__2 = *m - *kl - i__ + 1;
00294 i__3 = *n - i__;
00295 cgemv_("Conjugate transpose", &i__2, &i__3, &c_b2, &a[*kl +
00296 i__ + (i__ + 1) * a_dim1], lda, &a[*kl + i__ + i__ *
00297 a_dim1], &c__1, &c_b1, &work[1], &c__1);
00298 i__2 = *m - *kl - i__ + 1;
00299 i__3 = *n - i__;
00300 q__1.r = -tau.r, q__1.i = -tau.i;
00301 cgerc_(&i__2, &i__3, &q__1, &a[*kl + i__ + i__ * a_dim1], &
00302 c__1, &work[1], &c__1, &a[*kl + i__ + (i__ + 1) *
00303 a_dim1], lda);
00304 i__2 = *kl + i__ + i__ * a_dim1;
00305 q__1.r = -wa.r, q__1.i = -wa.i;
00306 a[i__2].r = q__1.r, a[i__2].i = q__1.i;
00307 }
00308
00309
00310 i__2 = *n - 1 - *ku;
00311 if (i__ <= min(i__2,*m)) {
00312
00313
00314
00315 i__2 = *n - *ku - i__ + 1;
00316 wn = scnrm2_(&i__2, &a[i__ + (*ku + i__) * a_dim1], lda);
00317 r__1 = wn / c_abs(&a[i__ + (*ku + i__) * a_dim1]);
00318 i__2 = i__ + (*ku + i__) * a_dim1;
00319 q__1.r = r__1 * a[i__2].r, q__1.i = r__1 * a[i__2].i;
00320 wa.r = q__1.r, wa.i = q__1.i;
00321 if (wn == 0.f) {
00322 tau.r = 0.f, tau.i = 0.f;
00323 } else {
00324 i__2 = i__ + (*ku + i__) * a_dim1;
00325 q__1.r = a[i__2].r + wa.r, q__1.i = a[i__2].i + wa.i;
00326 wb.r = q__1.r, wb.i = q__1.i;
00327 i__2 = *n - *ku - i__;
00328 c_div(&q__1, &c_b2, &wb);
00329 cscal_(&i__2, &q__1, &a[i__ + (*ku + i__ + 1) * a_dim1],
00330 lda);
00331 i__2 = i__ + (*ku + i__) * a_dim1;
00332 a[i__2].r = 1.f, a[i__2].i = 0.f;
00333 c_div(&q__1, &wb, &wa);
00334 r__1 = q__1.r;
00335 tau.r = r__1, tau.i = 0.f;
00336 }
00337
00338
00339
00340 i__2 = *n - *ku - i__ + 1;
00341 clacgv_(&i__2, &a[i__ + (*ku + i__) * a_dim1], lda);
00342 i__2 = *m - i__;
00343 i__3 = *n - *ku - i__ + 1;
00344 cgemv_("No transpose", &i__2, &i__3, &c_b2, &a[i__ + 1 + (*ku
00345 + i__) * a_dim1], lda, &a[i__ + (*ku + i__) * a_dim1],
00346 lda, &c_b1, &work[1], &c__1);
00347 i__2 = *m - i__;
00348 i__3 = *n - *ku - i__ + 1;
00349 q__1.r = -tau.r, q__1.i = -tau.i;
00350 cgerc_(&i__2, &i__3, &q__1, &work[1], &c__1, &a[i__ + (*ku +
00351 i__) * a_dim1], lda, &a[i__ + 1 + (*ku + i__) *
00352 a_dim1], lda);
00353 i__2 = i__ + (*ku + i__) * a_dim1;
00354 q__1.r = -wa.r, q__1.i = -wa.i;
00355 a[i__2].r = q__1.r, a[i__2].i = q__1.i;
00356 }
00357 } else {
00358
00359
00360
00361
00362
00363 i__2 = *n - 1 - *ku;
00364 if (i__ <= min(i__2,*m)) {
00365
00366
00367
00368 i__2 = *n - *ku - i__ + 1;
00369 wn = scnrm2_(&i__2, &a[i__ + (*ku + i__) * a_dim1], lda);
00370 r__1 = wn / c_abs(&a[i__ + (*ku + i__) * a_dim1]);
00371 i__2 = i__ + (*ku + i__) * a_dim1;
00372 q__1.r = r__1 * a[i__2].r, q__1.i = r__1 * a[i__2].i;
00373 wa.r = q__1.r, wa.i = q__1.i;
00374 if (wn == 0.f) {
00375 tau.r = 0.f, tau.i = 0.f;
00376 } else {
00377 i__2 = i__ + (*ku + i__) * a_dim1;
00378 q__1.r = a[i__2].r + wa.r, q__1.i = a[i__2].i + wa.i;
00379 wb.r = q__1.r, wb.i = q__1.i;
00380 i__2 = *n - *ku - i__;
00381 c_div(&q__1, &c_b2, &wb);
00382 cscal_(&i__2, &q__1, &a[i__ + (*ku + i__ + 1) * a_dim1],
00383 lda);
00384 i__2 = i__ + (*ku + i__) * a_dim1;
00385 a[i__2].r = 1.f, a[i__2].i = 0.f;
00386 c_div(&q__1, &wb, &wa);
00387 r__1 = q__1.r;
00388 tau.r = r__1, tau.i = 0.f;
00389 }
00390
00391
00392
00393 i__2 = *n - *ku - i__ + 1;
00394 clacgv_(&i__2, &a[i__ + (*ku + i__) * a_dim1], lda);
00395 i__2 = *m - i__;
00396 i__3 = *n - *ku - i__ + 1;
00397 cgemv_("No transpose", &i__2, &i__3, &c_b2, &a[i__ + 1 + (*ku
00398 + i__) * a_dim1], lda, &a[i__ + (*ku + i__) * a_dim1],
00399 lda, &c_b1, &work[1], &c__1);
00400 i__2 = *m - i__;
00401 i__3 = *n - *ku - i__ + 1;
00402 q__1.r = -tau.r, q__1.i = -tau.i;
00403 cgerc_(&i__2, &i__3, &q__1, &work[1], &c__1, &a[i__ + (*ku +
00404 i__) * a_dim1], lda, &a[i__ + 1 + (*ku + i__) *
00405 a_dim1], lda);
00406 i__2 = i__ + (*ku + i__) * a_dim1;
00407 q__1.r = -wa.r, q__1.i = -wa.i;
00408 a[i__2].r = q__1.r, a[i__2].i = q__1.i;
00409 }
00410
00411
00412 i__2 = *m - 1 - *kl;
00413 if (i__ <= min(i__2,*n)) {
00414
00415
00416
00417 i__2 = *m - *kl - i__ + 1;
00418 wn = scnrm2_(&i__2, &a[*kl + i__ + i__ * a_dim1], &c__1);
00419 r__1 = wn / c_abs(&a[*kl + i__ + i__ * a_dim1]);
00420 i__2 = *kl + i__ + i__ * a_dim1;
00421 q__1.r = r__1 * a[i__2].r, q__1.i = r__1 * a[i__2].i;
00422 wa.r = q__1.r, wa.i = q__1.i;
00423 if (wn == 0.f) {
00424 tau.r = 0.f, tau.i = 0.f;
00425 } else {
00426 i__2 = *kl + i__ + i__ * a_dim1;
00427 q__1.r = a[i__2].r + wa.r, q__1.i = a[i__2].i + wa.i;
00428 wb.r = q__1.r, wb.i = q__1.i;
00429 i__2 = *m - *kl - i__;
00430 c_div(&q__1, &c_b2, &wb);
00431 cscal_(&i__2, &q__1, &a[*kl + i__ + 1 + i__ * a_dim1], &
00432 c__1);
00433 i__2 = *kl + i__ + i__ * a_dim1;
00434 a[i__2].r = 1.f, a[i__2].i = 0.f;
00435 c_div(&q__1, &wb, &wa);
00436 r__1 = q__1.r;
00437 tau.r = r__1, tau.i = 0.f;
00438 }
00439
00440
00441
00442 i__2 = *m - *kl - i__ + 1;
00443 i__3 = *n - i__;
00444 cgemv_("Conjugate transpose", &i__2, &i__3, &c_b2, &a[*kl +
00445 i__ + (i__ + 1) * a_dim1], lda, &a[*kl + i__ + i__ *
00446 a_dim1], &c__1, &c_b1, &work[1], &c__1);
00447 i__2 = *m - *kl - i__ + 1;
00448 i__3 = *n - i__;
00449 q__1.r = -tau.r, q__1.i = -tau.i;
00450 cgerc_(&i__2, &i__3, &q__1, &a[*kl + i__ + i__ * a_dim1], &
00451 c__1, &work[1], &c__1, &a[*kl + i__ + (i__ + 1) *
00452 a_dim1], lda);
00453 i__2 = *kl + i__ + i__ * a_dim1;
00454 q__1.r = -wa.r, q__1.i = -wa.i;
00455 a[i__2].r = q__1.r, a[i__2].i = q__1.i;
00456 }
00457 }
00458
00459 i__2 = *m;
00460 for (j = *kl + i__ + 1; j <= i__2; ++j) {
00461 i__3 = j + i__ * a_dim1;
00462 a[i__3].r = 0.f, a[i__3].i = 0.f;
00463
00464 }
00465
00466 i__2 = *n;
00467 for (j = *ku + i__ + 1; j <= i__2; ++j) {
00468 i__3 = i__ + j * a_dim1;
00469 a[i__3].r = 0.f, a[i__3].i = 0.f;
00470
00471 }
00472
00473 }
00474 return 0;
00475
00476
00477
00478 }