00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "f2c.h"
00014 #include "blaswrap.h"
00015
00016
00017
00018 struct {
00019 integer infot, iounit;
00020 logical ok, lerr;
00021 } infoc_;
00022
00023 #define infoc_1 infoc_
00024
00025 struct {
00026 char srnamt[32];
00027 } srnamc_;
00028
00029 #define srnamc_1 srnamc_
00030
00031
00032
00033 static complex c_b1 = {0.f,0.f};
00034 static real c_b15 = 1.f;
00035 static integer c__1 = 1;
00036 static integer c__3 = 3;
00037
00038 int cchkq3_(logical *dotype, integer *nm, integer *mval,
00039 integer *nn, integer *nval, integer *nnb, integer *nbval, integer *
00040 nxval, real *thresh, complex *a, complex *copya, real *s, real *copys,
00041 complex *tau, complex *work, real *rwork, integer *iwork, integer *
00042 nout)
00043 {
00044
00045
00046 static integer iseedy[4] = { 1988,1989,1990,1991 };
00047
00048
00049 static char fmt_9999[] = "(1x,a,\002 M =\002,i5,\002, N =\002,i5,\002, N"
00050 "B =\002,i4,\002, type \002,i2,\002, test \002,i2,\002, ratio "
00051 "=\002,g12.5)";
00052
00053
00054 integer i__1, i__2, i__3, i__4;
00055 real r__1;
00056
00057
00058 int s_copy(char *, char *, ftnlen, ftnlen);
00059 integer s_wsfe(cilist *), do_fio(integer *, char *, ftnlen), e_wsfe(void);
00060
00061
00062 integer i__, k, m, n, nb, im, in, lw, nx, lda, inb;
00063 real eps;
00064 integer mode, info;
00065 char path[3];
00066 integer ilow, nrun;
00067 extern int alahd_(integer *, char *);
00068 integer ihigh, nfail, iseed[4], imode;
00069 extern doublereal cqpt01_(integer *, integer *, integer *, complex *,
00070 complex *, integer *, complex *, integer *, complex *, integer *),
00071 cqrt11_(integer *, integer *, complex *, integer *, complex *,
00072 complex *, integer *), cqrt12_(integer *, integer *, complex *,
00073 integer *, real *, complex *, integer *, real *);
00074 integer mnmin;
00075 extern int icopy_(integer *, integer *, integer *,
00076 integer *, integer *);
00077 integer istep, nerrs, lwork;
00078 extern int cgeqp3_(integer *, integer *, complex *,
00079 integer *, integer *, complex *, complex *, integer *, real *,
00080 integer *);
00081 extern doublereal slamch_(char *);
00082 extern int clacpy_(char *, integer *, integer *, complex
00083 *, integer *, complex *, integer *), claset_(char *,
00084 integer *, integer *, complex *, complex *, complex *, integer *), alasum_(char *, integer *, integer *, integer *, integer
00085 *), clatms_(integer *, integer *, char *, integer *, char
00086 *, real *, integer *, real *, real *, integer *, integer *, char *
00087 , complex *, integer *, complex *, integer *), slaord_(char *, integer *, real *, integer *),
00088 xlaenv_(integer *, integer *);
00089 real result[3];
00090
00091
00092 static cilist io___28 = { 0, 0, 0, fmt_9999, 0 };
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 --iwork;
00191 --rwork;
00192 --work;
00193 --tau;
00194 --copys;
00195 --s;
00196 --copya;
00197 --a;
00198 --nxval;
00199 --nbval;
00200 --nval;
00201 --mval;
00202 --dotype;
00203
00204
00205
00206
00207
00208
00209
00210 s_copy(path, "Complex precision", (ftnlen)1, (ftnlen)17);
00211 s_copy(path + 1, "Q3", (ftnlen)2, (ftnlen)2);
00212 nrun = 0;
00213 nfail = 0;
00214 nerrs = 0;
00215 for (i__ = 1; i__ <= 4; ++i__) {
00216 iseed[i__ - 1] = iseedy[i__ - 1];
00217
00218 }
00219 eps = slamch_("Epsilon");
00220 infoc_1.infot = 0;
00221
00222 i__1 = *nm;
00223 for (im = 1; im <= i__1; ++im) {
00224
00225
00226
00227 m = mval[im];
00228 lda = max(1,m);
00229
00230 i__2 = *nn;
00231 for (in = 1; in <= i__2; ++in) {
00232
00233
00234
00235 n = nval[in];
00236 mnmin = min(m,n);
00237
00238 i__3 = 1, i__4 = m * max(m,n) + (mnmin << 2) + max(m,n);
00239 lwork = max(i__3,i__4);
00240
00241 for (imode = 1; imode <= 6; ++imode) {
00242 if (! dotype[imode]) {
00243 goto L70;
00244 }
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254 mode = imode;
00255 if (imode > 3) {
00256 mode = 1;
00257 }
00258
00259
00260
00261
00262 i__3 = n;
00263 for (i__ = 1; i__ <= i__3; ++i__) {
00264 iwork[i__] = 0;
00265
00266 }
00267 if (imode == 1) {
00268 claset_("Full", &m, &n, &c_b1, &c_b1, ©a[1], &lda);
00269 i__3 = mnmin;
00270 for (i__ = 1; i__ <= i__3; ++i__) {
00271 copys[i__] = 0.f;
00272
00273 }
00274 } else {
00275 r__1 = 1.f / eps;
00276 clatms_(&m, &n, "Uniform", iseed, "Nonsymm", ©s[1], &
00277 mode, &r__1, &c_b15, &m, &n, "No packing", ©a[
00278 1], &lda, &work[1], &info);
00279 if (imode >= 4) {
00280 if (imode == 4) {
00281 ilow = 1;
00282 istep = 1;
00283
00284 i__3 = 1, i__4 = n / 2;
00285 ihigh = max(i__3,i__4);
00286 } else if (imode == 5) {
00287
00288 i__3 = 1, i__4 = n / 2;
00289 ilow = max(i__3,i__4);
00290 istep = 1;
00291 ihigh = n;
00292 } else if (imode == 6) {
00293 ilow = 1;
00294 istep = 2;
00295 ihigh = n;
00296 }
00297 i__3 = ihigh;
00298 i__4 = istep;
00299 for (i__ = ilow; i__4 < 0 ? i__ >= i__3 : i__ <= i__3;
00300 i__ += i__4) {
00301 iwork[i__] = 1;
00302
00303 }
00304 }
00305 slaord_("Decreasing", &mnmin, ©s[1], &c__1);
00306 }
00307
00308 i__4 = *nnb;
00309 for (inb = 1; inb <= i__4; ++inb) {
00310
00311
00312
00313 nb = nbval[inb];
00314 xlaenv_(&c__1, &nb);
00315 nx = nxval[inb];
00316 xlaenv_(&c__3, &nx);
00317
00318
00319
00320
00321 clacpy_("All", &m, &n, ©a[1], &lda, &a[1], &lda);
00322 icopy_(&n, &iwork[1], &c__1, &iwork[n + 1], &c__1);
00323
00324
00325
00326 lw = nb * (n + 1);
00327
00328 s_copy(srnamc_1.srnamt, "CGEQP3", (ftnlen)32, (ftnlen)6);
00329 cgeqp3_(&m, &n, &a[1], &lda, &iwork[n + 1], &tau[1], &
00330 work[1], &lw, &rwork[1], &info);
00331
00332
00333
00334 result[0] = cqrt12_(&m, &n, &a[1], &lda, ©s[1], &work[
00335 1], &lwork, &rwork[1]);
00336
00337
00338
00339 result[1] = cqpt01_(&m, &n, &mnmin, ©a[1], &a[1], &
00340 lda, &tau[1], &iwork[n + 1], &work[1], &lwork);
00341
00342
00343
00344 result[2] = cqrt11_(&m, &mnmin, &a[1], &lda, &tau[1], &
00345 work[1], &lwork);
00346
00347
00348
00349
00350 for (k = 1; k <= 3; ++k) {
00351 if (result[k - 1] >= *thresh) {
00352 if (nfail == 0 && nerrs == 0) {
00353 alahd_(nout, path);
00354 }
00355 io___28.ciunit = *nout;
00356 s_wsfe(&io___28);
00357 do_fio(&c__1, "CGEQP3", (ftnlen)6);
00358 do_fio(&c__1, (char *)&m, (ftnlen)sizeof(integer))
00359 ;
00360 do_fio(&c__1, (char *)&n, (ftnlen)sizeof(integer))
00361 ;
00362 do_fio(&c__1, (char *)&nb, (ftnlen)sizeof(integer)
00363 );
00364 do_fio(&c__1, (char *)&imode, (ftnlen)sizeof(
00365 integer));
00366 do_fio(&c__1, (char *)&k, (ftnlen)sizeof(integer))
00367 ;
00368 do_fio(&c__1, (char *)&result[k - 1], (ftnlen)
00369 sizeof(real));
00370 e_wsfe();
00371 ++nfail;
00372 }
00373
00374 }
00375 nrun += 3;
00376
00377
00378 }
00379 L70:
00380 ;
00381 }
00382
00383 }
00384
00385 }
00386
00387
00388
00389 alasum_(path, nout, &nfail, &nrun, &nerrs);
00390
00391
00392
00393
00394 return 0;
00395 }