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 = {0.,0.};
00019 static integer c__2 = 2;
00020 static integer c_n1 = -1;
00021 static integer c__5 = 5;
00022 static integer c__1 = 1;
00023 static doublecomplex c_b44 = {-1.,0.};
00024 static doublecomplex c_b45 = {1.,0.};
00025
00026 int ztgsyl_(char *trans, integer *ijob, integer *m, integer *
00027 n, doublecomplex *a, integer *lda, doublecomplex *b, integer *ldb,
00028 doublecomplex *c__, integer *ldc, doublecomplex *d__, integer *ldd,
00029 doublecomplex *e, integer *lde, doublecomplex *f, integer *ldf,
00030 doublereal *scale, doublereal *dif, doublecomplex *work, integer *
00031 lwork, integer *iwork, integer *info)
00032 {
00033
00034 integer a_dim1, a_offset, b_dim1, b_offset, c_dim1, c_offset, d_dim1,
00035 d_offset, e_dim1, e_offset, f_dim1, f_offset, i__1, i__2, i__3,
00036 i__4;
00037 doublecomplex z__1;
00038
00039
00040 double sqrt(doublereal);
00041
00042
00043 integer i__, j, k, p, q, ie, je, mb, nb, is, js, pq;
00044 doublereal dsum;
00045 extern logical lsame_(char *, char *);
00046 integer ifunc, linfo;
00047 extern int zscal_(integer *, doublecomplex *,
00048 doublecomplex *, integer *), zgemm_(char *, char *, integer *,
00049 integer *, integer *, doublecomplex *, doublecomplex *, integer *,
00050 doublecomplex *, integer *, doublecomplex *, doublecomplex *,
00051 integer *);
00052 integer lwmin;
00053 doublereal scale2, dscale;
00054 extern int ztgsy2_(char *, integer *, integer *, integer
00055 *, doublecomplex *, integer *, doublecomplex *, integer *,
00056 doublecomplex *, integer *, doublecomplex *, integer *,
00057 doublecomplex *, integer *, doublecomplex *, integer *,
00058 doublereal *, doublereal *, doublereal *, integer *);
00059 doublereal scaloc;
00060 extern int xerbla_(char *, integer *);
00061 extern integer ilaenv_(integer *, char *, char *, integer *, integer *,
00062 integer *, integer *);
00063 integer iround;
00064 logical notran;
00065 integer isolve;
00066 extern int zlacpy_(char *, integer *, integer *,
00067 doublecomplex *, integer *, doublecomplex *, integer *),
00068 zlaset_(char *, integer *, integer *, doublecomplex *,
00069 doublecomplex *, doublecomplex *, integer *);
00070 logical lquery;
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
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272 a_dim1 = *lda;
00273 a_offset = 1 + a_dim1;
00274 a -= a_offset;
00275 b_dim1 = *ldb;
00276 b_offset = 1 + b_dim1;
00277 b -= b_offset;
00278 c_dim1 = *ldc;
00279 c_offset = 1 + c_dim1;
00280 c__ -= c_offset;
00281 d_dim1 = *ldd;
00282 d_offset = 1 + d_dim1;
00283 d__ -= d_offset;
00284 e_dim1 = *lde;
00285 e_offset = 1 + e_dim1;
00286 e -= e_offset;
00287 f_dim1 = *ldf;
00288 f_offset = 1 + f_dim1;
00289 f -= f_offset;
00290 --work;
00291 --iwork;
00292
00293
00294 *info = 0;
00295 notran = lsame_(trans, "N");
00296 lquery = *lwork == -1;
00297
00298 if (! notran && ! lsame_(trans, "C")) {
00299 *info = -1;
00300 } else if (notran) {
00301 if (*ijob < 0 || *ijob > 4) {
00302 *info = -2;
00303 }
00304 }
00305 if (*info == 0) {
00306 if (*m <= 0) {
00307 *info = -3;
00308 } else if (*n <= 0) {
00309 *info = -4;
00310 } else if (*lda < max(1,*m)) {
00311 *info = -6;
00312 } else if (*ldb < max(1,*n)) {
00313 *info = -8;
00314 } else if (*ldc < max(1,*m)) {
00315 *info = -10;
00316 } else if (*ldd < max(1,*m)) {
00317 *info = -12;
00318 } else if (*lde < max(1,*n)) {
00319 *info = -14;
00320 } else if (*ldf < max(1,*m)) {
00321 *info = -16;
00322 }
00323 }
00324
00325 if (*info == 0) {
00326 if (notran) {
00327 if (*ijob == 1 || *ijob == 2) {
00328
00329 i__1 = 1, i__2 = (*m << 1) * *n;
00330 lwmin = max(i__1,i__2);
00331 } else {
00332 lwmin = 1;
00333 }
00334 } else {
00335 lwmin = 1;
00336 }
00337 work[1].r = (doublereal) lwmin, work[1].i = 0.;
00338
00339 if (*lwork < lwmin && ! lquery) {
00340 *info = -20;
00341 }
00342 }
00343
00344 if (*info != 0) {
00345 i__1 = -(*info);
00346 xerbla_("ZTGSYL", &i__1);
00347 return 0;
00348 } else if (lquery) {
00349 return 0;
00350 }
00351
00352
00353
00354 if (*m == 0 || *n == 0) {
00355 *scale = 1.;
00356 if (notran) {
00357 if (*ijob != 0) {
00358 *dif = 0.;
00359 }
00360 }
00361 return 0;
00362 }
00363
00364
00365
00366 mb = ilaenv_(&c__2, "ZTGSYL", trans, m, n, &c_n1, &c_n1);
00367 nb = ilaenv_(&c__5, "ZTGSYL", trans, m, n, &c_n1, &c_n1);
00368
00369 isolve = 1;
00370 ifunc = 0;
00371 if (notran) {
00372 if (*ijob >= 3) {
00373 ifunc = *ijob - 2;
00374 zlaset_("F", m, n, &c_b1, &c_b1, &c__[c_offset], ldc);
00375 zlaset_("F", m, n, &c_b1, &c_b1, &f[f_offset], ldf);
00376 } else if (*ijob >= 1 && notran) {
00377 isolve = 2;
00378 }
00379 }
00380
00381 if (mb <= 1 && nb <= 1 || mb >= *m && nb >= *n) {
00382
00383
00384
00385 i__1 = isolve;
00386 for (iround = 1; iround <= i__1; ++iround) {
00387
00388 *scale = 1.;
00389 dscale = 0.;
00390 dsum = 1.;
00391 pq = *m * *n;
00392 ztgsy2_(trans, &ifunc, m, n, &a[a_offset], lda, &b[b_offset], ldb,
00393 &c__[c_offset], ldc, &d__[d_offset], ldd, &e[e_offset],
00394 lde, &f[f_offset], ldf, scale, &dsum, &dscale, info);
00395 if (dscale != 0.) {
00396 if (*ijob == 1 || *ijob == 3) {
00397 *dif = sqrt((doublereal) ((*m << 1) * *n)) / (dscale *
00398 sqrt(dsum));
00399 } else {
00400 *dif = sqrt((doublereal) pq) / (dscale * sqrt(dsum));
00401 }
00402 }
00403 if (isolve == 2 && iround == 1) {
00404 if (notran) {
00405 ifunc = *ijob;
00406 }
00407 scale2 = *scale;
00408 zlacpy_("F", m, n, &c__[c_offset], ldc, &work[1], m);
00409 zlacpy_("F", m, n, &f[f_offset], ldf, &work[*m * *n + 1], m);
00410 zlaset_("F", m, n, &c_b1, &c_b1, &c__[c_offset], ldc);
00411 zlaset_("F", m, n, &c_b1, &c_b1, &f[f_offset], ldf)
00412 ;
00413 } else if (isolve == 2 && iround == 2) {
00414 zlacpy_("F", m, n, &work[1], m, &c__[c_offset], ldc);
00415 zlacpy_("F", m, n, &work[*m * *n + 1], m, &f[f_offset], ldf);
00416 *scale = scale2;
00417 }
00418
00419 }
00420
00421 return 0;
00422
00423 }
00424
00425
00426
00427 p = 0;
00428 i__ = 1;
00429 L40:
00430 if (i__ > *m) {
00431 goto L50;
00432 }
00433 ++p;
00434 iwork[p] = i__;
00435 i__ += mb;
00436 if (i__ >= *m) {
00437 goto L50;
00438 }
00439 goto L40;
00440 L50:
00441 iwork[p + 1] = *m + 1;
00442 if (iwork[p] == iwork[p + 1]) {
00443 --p;
00444 }
00445
00446
00447
00448 q = p + 1;
00449 j = 1;
00450 L60:
00451 if (j > *n) {
00452 goto L70;
00453 }
00454
00455 ++q;
00456 iwork[q] = j;
00457 j += nb;
00458 if (j >= *n) {
00459 goto L70;
00460 }
00461 goto L60;
00462
00463 L70:
00464 iwork[q + 1] = *n + 1;
00465 if (iwork[q] == iwork[q + 1]) {
00466 --q;
00467 }
00468
00469 if (notran) {
00470 i__1 = isolve;
00471 for (iround = 1; iround <= i__1; ++iround) {
00472
00473
00474
00475
00476
00477
00478 pq = 0;
00479 *scale = 1.;
00480 dscale = 0.;
00481 dsum = 1.;
00482 i__2 = q;
00483 for (j = p + 2; j <= i__2; ++j) {
00484 js = iwork[j];
00485 je = iwork[j + 1] - 1;
00486 nb = je - js + 1;
00487 for (i__ = p; i__ >= 1; --i__) {
00488 is = iwork[i__];
00489 ie = iwork[i__ + 1] - 1;
00490 mb = ie - is + 1;
00491 ztgsy2_(trans, &ifunc, &mb, &nb, &a[is + is * a_dim1],
00492 lda, &b[js + js * b_dim1], ldb, &c__[is + js *
00493 c_dim1], ldc, &d__[is + is * d_dim1], ldd, &e[js
00494 + js * e_dim1], lde, &f[is + js * f_dim1], ldf, &
00495 scaloc, &dsum, &dscale, &linfo);
00496 if (linfo > 0) {
00497 *info = linfo;
00498 }
00499 pq += mb * nb;
00500 if (scaloc != 1.) {
00501 i__3 = js - 1;
00502 for (k = 1; k <= i__3; ++k) {
00503 z__1.r = scaloc, z__1.i = 0.;
00504 zscal_(m, &z__1, &c__[k * c_dim1 + 1], &c__1);
00505 z__1.r = scaloc, z__1.i = 0.;
00506 zscal_(m, &z__1, &f[k * f_dim1 + 1], &c__1);
00507
00508 }
00509 i__3 = je;
00510 for (k = js; k <= i__3; ++k) {
00511 i__4 = is - 1;
00512 z__1.r = scaloc, z__1.i = 0.;
00513 zscal_(&i__4, &z__1, &c__[k * c_dim1 + 1], &c__1);
00514 i__4 = is - 1;
00515 z__1.r = scaloc, z__1.i = 0.;
00516 zscal_(&i__4, &z__1, &f[k * f_dim1 + 1], &c__1);
00517
00518 }
00519 i__3 = je;
00520 for (k = js; k <= i__3; ++k) {
00521 i__4 = *m - ie;
00522 z__1.r = scaloc, z__1.i = 0.;
00523 zscal_(&i__4, &z__1, &c__[ie + 1 + k * c_dim1], &
00524 c__1);
00525 i__4 = *m - ie;
00526 z__1.r = scaloc, z__1.i = 0.;
00527 zscal_(&i__4, &z__1, &f[ie + 1 + k * f_dim1], &
00528 c__1);
00529
00530 }
00531 i__3 = *n;
00532 for (k = je + 1; k <= i__3; ++k) {
00533 z__1.r = scaloc, z__1.i = 0.;
00534 zscal_(m, &z__1, &c__[k * c_dim1 + 1], &c__1);
00535 z__1.r = scaloc, z__1.i = 0.;
00536 zscal_(m, &z__1, &f[k * f_dim1 + 1], &c__1);
00537
00538 }
00539 *scale *= scaloc;
00540 }
00541
00542
00543
00544 if (i__ > 1) {
00545 i__3 = is - 1;
00546 zgemm_("N", "N", &i__3, &nb, &mb, &c_b44, &a[is *
00547 a_dim1 + 1], lda, &c__[is + js * c_dim1], ldc,
00548 &c_b45, &c__[js * c_dim1 + 1], ldc);
00549 i__3 = is - 1;
00550 zgemm_("N", "N", &i__3, &nb, &mb, &c_b44, &d__[is *
00551 d_dim1 + 1], ldd, &c__[is + js * c_dim1], ldc,
00552 &c_b45, &f[js * f_dim1 + 1], ldf);
00553 }
00554 if (j < q) {
00555 i__3 = *n - je;
00556 zgemm_("N", "N", &mb, &i__3, &nb, &c_b45, &f[is + js *
00557 f_dim1], ldf, &b[js + (je + 1) * b_dim1],
00558 ldb, &c_b45, &c__[is + (je + 1) * c_dim1],
00559 ldc);
00560 i__3 = *n - je;
00561 zgemm_("N", "N", &mb, &i__3, &nb, &c_b45, &f[is + js *
00562 f_dim1], ldf, &e[js + (je + 1) * e_dim1],
00563 lde, &c_b45, &f[is + (je + 1) * f_dim1], ldf);
00564 }
00565
00566 }
00567
00568 }
00569 if (dscale != 0.) {
00570 if (*ijob == 1 || *ijob == 3) {
00571 *dif = sqrt((doublereal) ((*m << 1) * *n)) / (dscale *
00572 sqrt(dsum));
00573 } else {
00574 *dif = sqrt((doublereal) pq) / (dscale * sqrt(dsum));
00575 }
00576 }
00577 if (isolve == 2 && iround == 1) {
00578 if (notran) {
00579 ifunc = *ijob;
00580 }
00581 scale2 = *scale;
00582 zlacpy_("F", m, n, &c__[c_offset], ldc, &work[1], m);
00583 zlacpy_("F", m, n, &f[f_offset], ldf, &work[*m * *n + 1], m);
00584 zlaset_("F", m, n, &c_b1, &c_b1, &c__[c_offset], ldc);
00585 zlaset_("F", m, n, &c_b1, &c_b1, &f[f_offset], ldf)
00586 ;
00587 } else if (isolve == 2 && iround == 2) {
00588 zlacpy_("F", m, n, &work[1], m, &c__[c_offset], ldc);
00589 zlacpy_("F", m, n, &work[*m * *n + 1], m, &f[f_offset], ldf);
00590 *scale = scale2;
00591 }
00592
00593 }
00594 } else {
00595
00596
00597
00598
00599
00600
00601 *scale = 1.;
00602 i__1 = p;
00603 for (i__ = 1; i__ <= i__1; ++i__) {
00604 is = iwork[i__];
00605 ie = iwork[i__ + 1] - 1;
00606 mb = ie - is + 1;
00607 i__2 = p + 2;
00608 for (j = q; j >= i__2; --j) {
00609 js = iwork[j];
00610 je = iwork[j + 1] - 1;
00611 nb = je - js + 1;
00612 ztgsy2_(trans, &ifunc, &mb, &nb, &a[is + is * a_dim1], lda, &
00613 b[js + js * b_dim1], ldb, &c__[is + js * c_dim1], ldc,
00614 &d__[is + is * d_dim1], ldd, &e[js + js * e_dim1],
00615 lde, &f[is + js * f_dim1], ldf, &scaloc, &dsum, &
00616 dscale, &linfo);
00617 if (linfo > 0) {
00618 *info = linfo;
00619 }
00620 if (scaloc != 1.) {
00621 i__3 = js - 1;
00622 for (k = 1; k <= i__3; ++k) {
00623 z__1.r = scaloc, z__1.i = 0.;
00624 zscal_(m, &z__1, &c__[k * c_dim1 + 1], &c__1);
00625 z__1.r = scaloc, z__1.i = 0.;
00626 zscal_(m, &z__1, &f[k * f_dim1 + 1], &c__1);
00627
00628 }
00629 i__3 = je;
00630 for (k = js; k <= i__3; ++k) {
00631 i__4 = is - 1;
00632 z__1.r = scaloc, z__1.i = 0.;
00633 zscal_(&i__4, &z__1, &c__[k * c_dim1 + 1], &c__1);
00634 i__4 = is - 1;
00635 z__1.r = scaloc, z__1.i = 0.;
00636 zscal_(&i__4, &z__1, &f[k * f_dim1 + 1], &c__1);
00637
00638 }
00639 i__3 = je;
00640 for (k = js; k <= i__3; ++k) {
00641 i__4 = *m - ie;
00642 z__1.r = scaloc, z__1.i = 0.;
00643 zscal_(&i__4, &z__1, &c__[ie + 1 + k * c_dim1], &c__1)
00644 ;
00645 i__4 = *m - ie;
00646 z__1.r = scaloc, z__1.i = 0.;
00647 zscal_(&i__4, &z__1, &f[ie + 1 + k * f_dim1], &c__1);
00648
00649 }
00650 i__3 = *n;
00651 for (k = je + 1; k <= i__3; ++k) {
00652 z__1.r = scaloc, z__1.i = 0.;
00653 zscal_(m, &z__1, &c__[k * c_dim1 + 1], &c__1);
00654 z__1.r = scaloc, z__1.i = 0.;
00655 zscal_(m, &z__1, &f[k * f_dim1 + 1], &c__1);
00656
00657 }
00658 *scale *= scaloc;
00659 }
00660
00661
00662
00663 if (j > p + 2) {
00664 i__3 = js - 1;
00665 zgemm_("N", "C", &mb, &i__3, &nb, &c_b45, &c__[is + js *
00666 c_dim1], ldc, &b[js * b_dim1 + 1], ldb, &c_b45, &
00667 f[is + f_dim1], ldf);
00668 i__3 = js - 1;
00669 zgemm_("N", "C", &mb, &i__3, &nb, &c_b45, &f[is + js *
00670 f_dim1], ldf, &e[js * e_dim1 + 1], lde, &c_b45, &
00671 f[is + f_dim1], ldf);
00672 }
00673 if (i__ < p) {
00674 i__3 = *m - ie;
00675 zgemm_("C", "N", &i__3, &nb, &mb, &c_b44, &a[is + (ie + 1)
00676 * a_dim1], lda, &c__[is + js * c_dim1], ldc, &
00677 c_b45, &c__[ie + 1 + js * c_dim1], ldc);
00678 i__3 = *m - ie;
00679 zgemm_("C", "N", &i__3, &nb, &mb, &c_b44, &d__[is + (ie +
00680 1) * d_dim1], ldd, &f[is + js * f_dim1], ldf, &
00681 c_b45, &c__[ie + 1 + js * c_dim1], ldc);
00682 }
00683
00684 }
00685
00686 }
00687 }
00688
00689 work[1].r = (doublereal) lwmin, work[1].i = 0.;
00690
00691 return 0;
00692
00693
00694
00695 }