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__65 = 65;
00021
00022 int zgbtrf_(integer *m, integer *n, integer *kl, integer *ku,
00023 doublecomplex *ab, integer *ldab, integer *ipiv, integer *info)
00024 {
00025
00026 integer ab_dim1, ab_offset, i__1, i__2, i__3, i__4, i__5, i__6;
00027 doublecomplex z__1;
00028
00029
00030 void z_div(doublecomplex *, doublecomplex *, doublecomplex *);
00031
00032
00033 integer i__, j, i2, i3, j2, j3, k2, jb, nb, ii, jj, jm, ip, jp, km, ju,
00034 kv, nw;
00035 doublecomplex temp;
00036 extern int zscal_(integer *, doublecomplex *,
00037 doublecomplex *, integer *), zgemm_(char *, char *, integer *,
00038 integer *, integer *, doublecomplex *, doublecomplex *, integer *,
00039 doublecomplex *, integer *, doublecomplex *, doublecomplex *,
00040 integer *);
00041 doublecomplex work13[4160] , work31[4160]
00042 ;
00043 extern int zgeru_(integer *, integer *, doublecomplex *,
00044 doublecomplex *, integer *, doublecomplex *, integer *,
00045 doublecomplex *, integer *), zcopy_(integer *, doublecomplex *,
00046 integer *, doublecomplex *, integer *), zswap_(integer *,
00047 doublecomplex *, integer *, doublecomplex *, integer *), ztrsm_(
00048 char *, char *, char *, char *, integer *, integer *,
00049 doublecomplex *, doublecomplex *, integer *, doublecomplex *,
00050 integer *), zgbtf2_(integer *,
00051 integer *, integer *, integer *, doublecomplex *, integer *,
00052 integer *, integer *), xerbla_(char *, integer *);
00053 extern integer ilaenv_(integer *, char *, char *, integer *, integer *,
00054 integer *, integer *), izamax_(integer *,
00055 doublecomplex *, integer *);
00056 extern int zlaswp_(integer *, doublecomplex *, integer *,
00057 integer *, integer *, integer *, integer *);
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
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 ab_dim1 = *ldab;
00160 ab_offset = 1 + ab_dim1;
00161 ab -= ab_offset;
00162 --ipiv;
00163
00164
00165 kv = *ku + *kl;
00166
00167
00168
00169 *info = 0;
00170 if (*m < 0) {
00171 *info = -1;
00172 } else if (*n < 0) {
00173 *info = -2;
00174 } else if (*kl < 0) {
00175 *info = -3;
00176 } else if (*ku < 0) {
00177 *info = -4;
00178 } else if (*ldab < *kl + kv + 1) {
00179 *info = -6;
00180 }
00181 if (*info != 0) {
00182 i__1 = -(*info);
00183 xerbla_("ZGBTRF", &i__1);
00184 return 0;
00185 }
00186
00187
00188
00189 if (*m == 0 || *n == 0) {
00190 return 0;
00191 }
00192
00193
00194
00195 nb = ilaenv_(&c__1, "ZGBTRF", " ", m, n, kl, ku);
00196
00197
00198
00199
00200 nb = min(nb,64);
00201
00202 if (nb <= 1 || nb > *kl) {
00203
00204
00205
00206 zgbtf2_(m, n, kl, ku, &ab[ab_offset], ldab, &ipiv[1], info);
00207 } else {
00208
00209
00210
00211
00212
00213 i__1 = nb;
00214 for (j = 1; j <= i__1; ++j) {
00215 i__2 = j - 1;
00216 for (i__ = 1; i__ <= i__2; ++i__) {
00217 i__3 = i__ + j * 65 - 66;
00218 work13[i__3].r = 0., work13[i__3].i = 0.;
00219
00220 }
00221
00222 }
00223
00224
00225
00226 i__1 = nb;
00227 for (j = 1; j <= i__1; ++j) {
00228 i__2 = nb;
00229 for (i__ = j + 1; i__ <= i__2; ++i__) {
00230 i__3 = i__ + j * 65 - 66;
00231 work31[i__3].r = 0., work31[i__3].i = 0.;
00232
00233 }
00234
00235 }
00236
00237
00238
00239
00240
00241 i__1 = min(kv,*n);
00242 for (j = *ku + 2; j <= i__1; ++j) {
00243 i__2 = *kl;
00244 for (i__ = kv - j + 2; i__ <= i__2; ++i__) {
00245 i__3 = i__ + j * ab_dim1;
00246 ab[i__3].r = 0., ab[i__3].i = 0.;
00247
00248 }
00249
00250 }
00251
00252
00253
00254
00255 ju = 1;
00256
00257 i__1 = min(*m,*n);
00258 i__2 = nb;
00259 for (j = 1; i__2 < 0 ? j >= i__1 : j <= i__1; j += i__2) {
00260
00261 i__3 = nb, i__4 = min(*m,*n) - j + 1;
00262 jb = min(i__3,i__4);
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277 i__3 = *kl - jb, i__4 = *m - j - jb + 1;
00278 i2 = min(i__3,i__4);
00279
00280 i__3 = jb, i__4 = *m - j - *kl + 1;
00281 i3 = min(i__3,i__4);
00282
00283
00284
00285
00286
00287 i__3 = j + jb - 1;
00288 for (jj = j; jj <= i__3; ++jj) {
00289
00290
00291
00292 if (jj + kv <= *n) {
00293 i__4 = *kl;
00294 for (i__ = 1; i__ <= i__4; ++i__) {
00295 i__5 = i__ + (jj + kv) * ab_dim1;
00296 ab[i__5].r = 0., ab[i__5].i = 0.;
00297
00298 }
00299 }
00300
00301
00302
00303
00304
00305 i__4 = *kl, i__5 = *m - jj;
00306 km = min(i__4,i__5);
00307 i__4 = km + 1;
00308 jp = izamax_(&i__4, &ab[kv + 1 + jj * ab_dim1], &c__1);
00309 ipiv[jj] = jp + jj - j;
00310 i__4 = kv + jp + jj * ab_dim1;
00311 if (ab[i__4].r != 0. || ab[i__4].i != 0.) {
00312
00313
00314 i__6 = jj + *ku + jp - 1;
00315 i__4 = ju, i__5 = min(i__6,*n);
00316 ju = max(i__4,i__5);
00317 if (jp != 1) {
00318
00319
00320
00321 if (jp + jj - 1 < j + *kl) {
00322
00323 i__4 = *ldab - 1;
00324 i__5 = *ldab - 1;
00325 zswap_(&jb, &ab[kv + 1 + jj - j + j * ab_dim1], &
00326 i__4, &ab[kv + jp + jj - j + j * ab_dim1],
00327 &i__5);
00328 } else {
00329
00330
00331
00332
00333 i__4 = jj - j;
00334 i__5 = *ldab - 1;
00335 zswap_(&i__4, &ab[kv + 1 + jj - j + j * ab_dim1],
00336 &i__5, &work31[jp + jj - j - *kl - 1], &
00337 c__65);
00338 i__4 = j + jb - jj;
00339 i__5 = *ldab - 1;
00340 i__6 = *ldab - 1;
00341 zswap_(&i__4, &ab[kv + 1 + jj * ab_dim1], &i__5, &
00342 ab[kv + jp + jj * ab_dim1], &i__6);
00343 }
00344 }
00345
00346
00347
00348 z_div(&z__1, &c_b1, &ab[kv + 1 + jj * ab_dim1]);
00349 zscal_(&km, &z__1, &ab[kv + 2 + jj * ab_dim1], &c__1);
00350
00351
00352
00353
00354
00355
00356 i__4 = ju, i__5 = j + jb - 1;
00357 jm = min(i__4,i__5);
00358 if (jm > jj) {
00359 i__4 = jm - jj;
00360 z__1.r = -1., z__1.i = -0.;
00361 i__5 = *ldab - 1;
00362 i__6 = *ldab - 1;
00363 zgeru_(&km, &i__4, &z__1, &ab[kv + 2 + jj * ab_dim1],
00364 &c__1, &ab[kv + (jj + 1) * ab_dim1], &i__5, &
00365 ab[kv + 1 + (jj + 1) * ab_dim1], &i__6);
00366 }
00367 } else {
00368
00369
00370
00371
00372 if (*info == 0) {
00373 *info = jj;
00374 }
00375 }
00376
00377
00378
00379
00380 i__4 = jj - j + 1;
00381 nw = min(i__4,i3);
00382 if (nw > 0) {
00383 zcopy_(&nw, &ab[kv + *kl + 1 - jj + j + jj * ab_dim1], &
00384 c__1, &work31[(jj - j + 1) * 65 - 65], &c__1);
00385 }
00386
00387 }
00388 if (j + jb <= *n) {
00389
00390
00391
00392
00393 i__3 = ju - j + 1;
00394 j2 = min(i__3,kv) - jb;
00395
00396 i__3 = 0, i__4 = ju - j - kv + 1;
00397 j3 = max(i__3,i__4);
00398
00399
00400
00401
00402 i__3 = *ldab - 1;
00403 zlaswp_(&j2, &ab[kv + 1 - jb + (j + jb) * ab_dim1], &i__3, &
00404 c__1, &jb, &ipiv[j], &c__1);
00405
00406
00407
00408 i__3 = j + jb - 1;
00409 for (i__ = j; i__ <= i__3; ++i__) {
00410 ipiv[i__] = ipiv[i__] + j - 1;
00411
00412 }
00413
00414
00415
00416
00417 k2 = j - 1 + jb + j2;
00418 i__3 = j3;
00419 for (i__ = 1; i__ <= i__3; ++i__) {
00420 jj = k2 + i__;
00421 i__4 = j + jb - 1;
00422 for (ii = j + i__ - 1; ii <= i__4; ++ii) {
00423 ip = ipiv[ii];
00424 if (ip != ii) {
00425 i__5 = kv + 1 + ii - jj + jj * ab_dim1;
00426 temp.r = ab[i__5].r, temp.i = ab[i__5].i;
00427 i__5 = kv + 1 + ii - jj + jj * ab_dim1;
00428 i__6 = kv + 1 + ip - jj + jj * ab_dim1;
00429 ab[i__5].r = ab[i__6].r, ab[i__5].i = ab[i__6].i;
00430 i__5 = kv + 1 + ip - jj + jj * ab_dim1;
00431 ab[i__5].r = temp.r, ab[i__5].i = temp.i;
00432 }
00433
00434 }
00435
00436 }
00437
00438
00439
00440 if (j2 > 0) {
00441
00442
00443
00444 i__3 = *ldab - 1;
00445 i__4 = *ldab - 1;
00446 ztrsm_("Left", "Lower", "No transpose", "Unit", &jb, &j2,
00447 &c_b1, &ab[kv + 1 + j * ab_dim1], &i__3, &ab[kv +
00448 1 - jb + (j + jb) * ab_dim1], &i__4);
00449
00450 if (i2 > 0) {
00451
00452
00453
00454 z__1.r = -1., z__1.i = -0.;
00455 i__3 = *ldab - 1;
00456 i__4 = *ldab - 1;
00457 i__5 = *ldab - 1;
00458 zgemm_("No transpose", "No transpose", &i2, &j2, &jb,
00459 &z__1, &ab[kv + 1 + jb + j * ab_dim1], &i__3,
00460 &ab[kv + 1 - jb + (j + jb) * ab_dim1], &i__4,
00461 &c_b1, &ab[kv + 1 + (j + jb) * ab_dim1], &
00462 i__5);
00463 }
00464
00465 if (i3 > 0) {
00466
00467
00468
00469 z__1.r = -1., z__1.i = -0.;
00470 i__3 = *ldab - 1;
00471 i__4 = *ldab - 1;
00472 zgemm_("No transpose", "No transpose", &i3, &j2, &jb,
00473 &z__1, work31, &c__65, &ab[kv + 1 - jb + (j +
00474 jb) * ab_dim1], &i__3, &c_b1, &ab[kv + *kl +
00475 1 - jb + (j + jb) * ab_dim1], &i__4);
00476 }
00477 }
00478
00479 if (j3 > 0) {
00480
00481
00482
00483
00484 i__3 = j3;
00485 for (jj = 1; jj <= i__3; ++jj) {
00486 i__4 = jb;
00487 for (ii = jj; ii <= i__4; ++ii) {
00488 i__5 = ii + jj * 65 - 66;
00489 i__6 = ii - jj + 1 + (jj + j + kv - 1) * ab_dim1;
00490 work13[i__5].r = ab[i__6].r, work13[i__5].i = ab[
00491 i__6].i;
00492
00493 }
00494
00495 }
00496
00497
00498
00499 i__3 = *ldab - 1;
00500 ztrsm_("Left", "Lower", "No transpose", "Unit", &jb, &j3,
00501 &c_b1, &ab[kv + 1 + j * ab_dim1], &i__3, work13, &
00502 c__65);
00503
00504 if (i2 > 0) {
00505
00506
00507
00508 z__1.r = -1., z__1.i = -0.;
00509 i__3 = *ldab - 1;
00510 i__4 = *ldab - 1;
00511 zgemm_("No transpose", "No transpose", &i2, &j3, &jb,
00512 &z__1, &ab[kv + 1 + jb + j * ab_dim1], &i__3,
00513 work13, &c__65, &c_b1, &ab[jb + 1 + (j + kv) *
00514 ab_dim1], &i__4);
00515 }
00516
00517 if (i3 > 0) {
00518
00519
00520
00521 z__1.r = -1., z__1.i = -0.;
00522 i__3 = *ldab - 1;
00523 zgemm_("No transpose", "No transpose", &i3, &j3, &jb,
00524 &z__1, work31, &c__65, work13, &c__65, &c_b1,
00525 &ab[*kl + 1 + (j + kv) * ab_dim1], &i__3);
00526 }
00527
00528
00529
00530 i__3 = j3;
00531 for (jj = 1; jj <= i__3; ++jj) {
00532 i__4 = jb;
00533 for (ii = jj; ii <= i__4; ++ii) {
00534 i__5 = ii - jj + 1 + (jj + j + kv - 1) * ab_dim1;
00535 i__6 = ii + jj * 65 - 66;
00536 ab[i__5].r = work13[i__6].r, ab[i__5].i = work13[
00537 i__6].i;
00538
00539 }
00540
00541 }
00542 }
00543 } else {
00544
00545
00546
00547 i__3 = j + jb - 1;
00548 for (i__ = j; i__ <= i__3; ++i__) {
00549 ipiv[i__] = ipiv[i__] + j - 1;
00550
00551 }
00552 }
00553
00554
00555
00556
00557
00558 i__3 = j;
00559 for (jj = j + jb - 1; jj >= i__3; --jj) {
00560 jp = ipiv[jj] - jj + 1;
00561 if (jp != 1) {
00562
00563
00564
00565 if (jp + jj - 1 < j + *kl) {
00566
00567
00568
00569 i__4 = jj - j;
00570 i__5 = *ldab - 1;
00571 i__6 = *ldab - 1;
00572 zswap_(&i__4, &ab[kv + 1 + jj - j + j * ab_dim1], &
00573 i__5, &ab[kv + jp + jj - j + j * ab_dim1], &
00574 i__6);
00575 } else {
00576
00577
00578
00579 i__4 = jj - j;
00580 i__5 = *ldab - 1;
00581 zswap_(&i__4, &ab[kv + 1 + jj - j + j * ab_dim1], &
00582 i__5, &work31[jp + jj - j - *kl - 1], &c__65);
00583 }
00584 }
00585
00586
00587
00588
00589 i__4 = i3, i__5 = jj - j + 1;
00590 nw = min(i__4,i__5);
00591 if (nw > 0) {
00592 zcopy_(&nw, &work31[(jj - j + 1) * 65 - 65], &c__1, &ab[
00593 kv + *kl + 1 - jj + j + jj * ab_dim1], &c__1);
00594 }
00595
00596 }
00597
00598 }
00599 }
00600
00601 return 0;
00602
00603
00604
00605 }