/* Subroutine */ int dchkqp_(logical *dotype, integer *nm, integer *mval, integer *nn, integer *nval, doublereal *thresh, logical *tsterr, doublereal *a, doublereal *copya, doublereal *s, doublereal *copys, doublereal *tau, doublereal *work, integer *iwork, integer *nout) { /* Initialized data */ static integer iseedy[4] = { 1988,1989,1990,1991 }; /* Format strings */ static char fmt_9999[] = "(\002 M =\002,i5,\002, N =\002,i5,\002, type" " \002,i2,\002, test \002,i2,\002, ratio =\002,g12.5)"; /* System generated locals */ integer i__1, i__2, i__3, i__4; doublereal d__1; /* Local variables */ integer i__, k, m, n, im, in, lda; doublereal eps; integer mode, info; char path[3]; integer ilow, nrun; integer ihigh, nfail, iseed[4], imode; integer mnmin, istep, nerrs, lwork; doublereal result[3]; /* Fortran I/O blocks */ static cilist io___24 = { 0, 0, 0, fmt_9999, 0 }; /* -- LAPACK test routine (version 3.1.1) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* January 2007 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DCHKQP tests DGEQPF. */ /* Arguments */ /* ========= */ /* DOTYPE (input) LOGICAL array, dimension (NTYPES) */ /* The matrix types to be used for testing. Matrices of type j */ /* (for 1 <= j <= NTYPES) are used for testing if DOTYPE(j) = */ /* .TRUE.; if DOTYPE(j) = .FALSE., then type j is not used. */ /* NM (input) INTEGER */ /* The number of values of M contained in the vector MVAL. */ /* MVAL (input) INTEGER array, dimension (NM) */ /* The values of the matrix row dimension M. */ /* NN (input) INTEGER */ /* The number of values of N contained in the vector NVAL. */ /* NVAL (input) INTEGER array, dimension (NN) */ /* The values of the matrix column dimension N. */ /* THRESH (input) DOUBLE PRECISION */ /* The threshold value for the test ratios. A result is */ /* included in the output file if RESULT >= THRESH. To have */ /* every test ratio printed, use THRESH = 0. */ /* TSTERR (input) LOGICAL */ /* Flag that indicates whether error exits are to be tested. */ /* A (workspace) DOUBLE PRECISION array, dimension (MMAX*NMAX) */ /* where MMAX is the maximum value of M in MVAL and NMAX is the */ /* maximum value of N in NVAL. */ /* COPYA (workspace) DOUBLE PRECISION array, dimension (MMAX*NMAX) */ /* S (workspace) DOUBLE PRECISION array, dimension */ /* (min(MMAX,NMAX)) */ /* COPYS (workspace) DOUBLE PRECISION array, dimension */ /* (min(MMAX,NMAX)) */ /* TAU (workspace) DOUBLE PRECISION array, dimension (MMAX) */ /* WORK (workspace) DOUBLE PRECISION array, dimension */ /* (MMAX*NMAX + 4*NMAX + MMAX) */ /* IWORK (workspace) INTEGER array, dimension (NMAX) */ /* NOUT (input) INTEGER */ /* The unit number for output. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Scalars in Common .. */ /* .. */ /* .. Common blocks .. */ /* .. */ /* .. Data statements .. */ /* Parameter adjustments */ --iwork; --work; --tau; --copys; --s; --copya; --a; --nval; --mval; --dotype; /* Function Body */ /* .. */ /* .. Executable Statements .. */ /* Initialize constants and the random number seed. */ s_copy(path, "Double precision", (ftnlen)1, (ftnlen)16); s_copy(path + 1, "QP", (ftnlen)2, (ftnlen)2); nrun = 0; nfail = 0; nerrs = 0; for (i__ = 1; i__ <= 4; ++i__) { iseed[i__ - 1] = iseedy[i__ - 1]; /* L10: */ } eps = dlamch_("Epsilon"); /* Test the error exits */ if (*tsterr) { derrqp_(path, nout); } infoc_1.infot = 0; i__1 = *nm; for (im = 1; im <= i__1; ++im) { /* Do for each value of M in MVAL. */ m = mval[im]; lda = max(1,m); i__2 = *nn; for (in = 1; in <= i__2; ++in) { /* Do for each value of N in NVAL. */ n = nval[in]; mnmin = min(m,n); /* Computing MAX */ i__3 = 1, i__4 = m * max(m,n) + (mnmin << 2) + max(m,n), i__3 = max(i__3,i__4), i__4 = m * n + (mnmin << 1) + (n << 2); lwork = max(i__3,i__4); for (imode = 1; imode <= 6; ++imode) { if (! dotype[imode]) { goto L60; } /* Do for each type of matrix */ /* 1: zero matrix */ /* 2: one small singular value */ /* 3: geometric distribution of singular values */ /* 4: first n/2 columns fixed */ /* 5: last n/2 columns fixed */ /* 6: every second column fixed */ mode = imode; if (imode > 3) { mode = 1; } /* Generate test matrix of size m by n using */ /* singular value distribution indicated by `mode'. */ i__3 = n; for (i__ = 1; i__ <= i__3; ++i__) { iwork[i__] = 0; /* L20: */ } if (imode == 1) { dlaset_("Full", &m, &n, &c_b11, &c_b11, ©a[1], &lda); i__3 = mnmin; for (i__ = 1; i__ <= i__3; ++i__) { copys[i__] = 0.; /* L30: */ } } else { d__1 = 1. / eps; dlatms_(&m, &n, "Uniform", iseed, "Nonsymm", ©s[1], & mode, &d__1, &c_b16, &m, &n, "No packing", ©a[ 1], &lda, &work[1], &info); if (imode >= 4) { if (imode == 4) { ilow = 1; istep = 1; /* Computing MAX */ i__3 = 1, i__4 = n / 2; ihigh = max(i__3,i__4); } else if (imode == 5) { /* Computing MAX */ i__3 = 1, i__4 = n / 2; ilow = max(i__3,i__4); istep = 1; ihigh = n; } else if (imode == 6) { ilow = 1; istep = 2; ihigh = n; } i__3 = ihigh; i__4 = istep; for (i__ = ilow; i__4 < 0 ? i__ >= i__3 : i__ <= i__3; i__ += i__4) { iwork[i__] = 1; /* L40: */ } } dlaord_("Decreasing", &mnmin, ©s[1], &c__1); } /* Save A and its singular values */ dlacpy_("All", &m, &n, ©a[1], &lda, &a[1], &lda); /* Compute the QR factorization with pivoting of A */ s_copy(srnamc_1.srnamt, "DGEQPF", (ftnlen)32, (ftnlen)6); dgeqpf_(&m, &n, &a[1], &lda, &iwork[1], &tau[1], &work[1], & info); /* Compute norm(svd(a) - svd(r)) */ result[0] = dqrt12_(&m, &n, &a[1], &lda, ©s[1], &work[1], &lwork); /* Compute norm( A*P - Q*R ) */ result[1] = dqpt01_(&m, &n, &mnmin, ©a[1], &a[1], &lda, & tau[1], &iwork[1], &work[1], &lwork); /* Compute Q'*Q */ result[2] = dqrt11_(&m, &mnmin, &a[1], &lda, &tau[1], &work[1] , &lwork); /* Print information about the tests that did not pass */ /* the threshold. */ for (k = 1; k <= 3; ++k) { if (result[k - 1] >= *thresh) { if (nfail == 0 && nerrs == 0) { alahd_(nout, path); } io___24.ciunit = *nout; s_wsfe(&io___24); do_fio(&c__1, (char *)&m, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&n, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&imode, (ftnlen)sizeof(integer)) ; do_fio(&c__1, (char *)&k, (ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&result[k - 1], (ftnlen)sizeof( doublereal)); e_wsfe(); ++nfail; } /* L50: */ } nrun += 3; L60: ; } /* L70: */ } /* L80: */ } /* Print a summary of the results. */ alasum_(path, nout, &nfail, &nrun, &nerrs); /* End of DCHKQP */ return 0; } /* dchkqp_ */
/* Subroutine */ int dchkq3_(logical *dotype, integer *nm, integer *mval, integer *nn, integer *nval, integer *nnb, integer *nbval, integer * nxval, doublereal *thresh, doublereal *a, doublereal *copya, doublereal *s, doublereal *copys, doublereal *tau, doublereal *work, integer *iwork, integer *nout) { /* Initialized data */ static integer iseedy[4] = { 1988,1989,1990,1991 }; /* Format strings */ static char fmt_9999[] = "(1x,a6,\002 M =\002,i5,\002, N =\002,i5,\002, " "NB =\002,i4,\002, type \002,i2,\002, test \002,i2,\002, ratio " "=\002,g12.5)"; /* System generated locals */ integer i__1, i__2, i__3, i__4, i__5; doublereal d__1; /* Builtin functions Subroutine */ int s_copy(char *, char *, ftnlen, ftnlen); integer s_wsfe(cilist *), do_fio(integer *, char *, ftnlen), e_wsfe(void); /* Local variables */ static integer mode, info; static char path[3]; static integer ilow, nrun, i__; extern /* Subroutine */ int alahd_(integer *, char *); static integer k, m, n, ihigh, nfail, iseed[4], imode; extern doublereal dqpt01_(integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), dqrt11_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), dqrt12_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); static integer mnmin; extern /* Subroutine */ int icopy_(integer *, integer *, integer *, integer *, integer *); static integer istep, nerrs, lwork; extern /* Subroutine */ int dgeqp3_(integer *, integer *, doublereal *, integer *, integer *, doublereal *, doublereal *, integer *, integer *); static integer nb, im, in; extern doublereal dlamch_(char *); static integer lw; extern /* Subroutine */ int dlaord_(char *, integer *, doublereal *, integer *); static integer nx; extern /* Subroutine */ int dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), alasum_(char *, integer *, integer *, integer *, integer *), dlatms_(integer *, integer *, char *, integer *, char *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *, char *, doublereal *, integer *, doublereal *, integer *), xlaenv_(integer *, integer *); static doublereal result[3]; static integer lda, inb; static doublereal eps; /* Fortran I/O blocks */ static cilist io___28 = { 0, 0, 0, fmt_9999, 0 }; /* -- LAPACK test routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University June 30, 1999 Purpose ======= DCHKQ3 tests DGEQP3. Arguments ========= DOTYPE (input) LOGICAL array, dimension (NTYPES) The matrix types to be used for testing. Matrices of type j (for 1 <= j <= NTYPES) are used for testing if DOTYPE(j) = .TRUE.; if DOTYPE(j) = .FALSE., then type j is not used. NM (input) INTEGER The number of values of M contained in the vector MVAL. MVAL (input) INTEGER array, dimension (NM) The values of the matrix row dimension M. NN (input) INTEGER The number of values of N contained in the vector NVAL. NVAL (input) INTEGER array, dimension (NN) The values of the matrix column dimension N. NNB (input) INTEGER The number of values of NB and NX contained in the vectors NBVAL and NXVAL. The blocking parameters are used in pairs (NB,NX). NBVAL (input) INTEGER array, dimension (NNB) The values of the blocksize NB. NXVAL (input) INTEGER array, dimension (NNB) The values of the crossover point NX. THRESH (input) DOUBLE PRECISION The threshold value for the test ratios. A result is included in the output file if RESULT >= THRESH. To have every test ratio printed, use THRESH = 0. A (workspace) DOUBLE PRECISION array, dimension (MMAX*NMAX) where MMAX is the maximum value of M in MVAL and NMAX is the maximum value of N in NVAL. COPYA (workspace) DOUBLE PRECISION array, dimension (MMAX*NMAX) S (workspace) DOUBLE PRECISION array, dimension (min(MMAX,NMAX)) COPYS (workspace) DOUBLE PRECISION array, dimension (min(MMAX,NMAX)) TAU (workspace) DOUBLE PRECISION array, dimension (MMAX) WORK (workspace) DOUBLE PRECISION array, dimension (MMAX*NMAX + 4*NMAX + MMAX) IWORK (workspace) INTEGER array, dimension (2*NMAX) NOUT (input) INTEGER The unit number for output. ===================================================================== Parameter adjustments */ --iwork; --work; --tau; --copys; --s; --copya; --a; --nxval; --nbval; --nval; --mval; --dotype; /* Function Body Initialize constants and the random number seed. */ s_copy(path, "Double precision", (ftnlen)1, (ftnlen)16); s_copy(path + 1, "Q3", (ftnlen)2, (ftnlen)2); nrun = 0; nfail = 0; nerrs = 0; for (i__ = 1; i__ <= 4; ++i__) { iseed[i__ - 1] = iseedy[i__ - 1]; /* L10: */ } eps = dlamch_("Epsilon"); infoc_1.infot = 0; i__1 = *nm; for (im = 1; im <= i__1; ++im) { /* Do for each value of M in MVAL. */ m = mval[im]; lda = max(1,m); i__2 = *nn; for (in = 1; in <= i__2; ++in) { /* Do for each value of N in NVAL. */ n = nval[in]; mnmin = min(m,n); /* Computing MAX */ i__3 = 1, i__4 = m * max(m,n) + (mnmin << 2) + max(m,n); lwork = max(i__3,i__4); for (imode = 1; imode <= 6; ++imode) { if (! dotype[imode]) { goto L70; } /* Do for each type of matrix 1: zero matrix 2: one small singular value 3: geometric distribution of singular values 4: first n/2 columns fixed 5: last n/2 columns fixed 6: every second column fixed */ mode = imode; if (imode > 3) { mode = 1; } /* Generate test matrix of size m by n using singular value distribution indicated by `mode'. */ i__3 = n; for (i__ = 1; i__ <= i__3; ++i__) { iwork[i__] = 0; /* L20: */ } if (imode == 1) { dlaset_("Full", &m, &n, &c_b11, &c_b11, ©a[1], &lda); i__3 = mnmin; for (i__ = 1; i__ <= i__3; ++i__) { copys[i__] = 0.; /* L30: */ } } else { d__1 = 1. / eps; dlatms_(&m, &n, "Uniform", iseed, "Nonsymm", ©s[1], & mode, &d__1, &c_b16, &m, &n, "No packing", ©a[ 1], &lda, &work[1], &info); if (imode >= 4) { if (imode == 4) { ilow = 1; istep = 1; /* Computing MAX */ i__3 = 1, i__4 = n / 2; ihigh = max(i__3,i__4); } else if (imode == 5) { /* Computing MAX */ i__3 = 1, i__4 = n / 2; ilow = max(i__3,i__4); istep = 1; ihigh = n; } else if (imode == 6) { ilow = 1; istep = 2; ihigh = n; } i__3 = ihigh; i__4 = istep; for (i__ = ilow; i__4 < 0 ? i__ >= i__3 : i__ <= i__3; i__ += i__4) { iwork[i__] = 1; /* L40: */ } } dlaord_("Decreasing", &mnmin, ©s[1], &c__1); } i__4 = *nnb; for (inb = 1; inb <= i__4; ++inb) { /* Do for each pair of values (NB,NX) in NBVAL and NXVAL. */ nb = nbval[inb]; xlaenv_(&c__1, &nb); nx = nxval[inb]; xlaenv_(&c__3, &nx); /* Get a working copy of COPYA into A and a copy of vector IWORK. */ dlacpy_("All", &m, &n, ©a[1], &lda, &a[1], &lda); icopy_(&n, &iwork[1], &c__1, &iwork[n + 1], &c__1); /* Compute the QR factorization with pivoting of A Computing MAX */ i__3 = 1, i__5 = (n << 1) + nb * (n + 1); lw = max(i__3,i__5); /* Compute the QP3 factorization of A */ s_copy(srnamc_1.srnamt, "DGEQP3", (ftnlen)6, (ftnlen)6); dgeqp3_(&m, &n, &a[1], &lda, &iwork[n + 1], &tau[1], & work[1], &lw, &info); /* Compute norm(svd(a) - svd(r)) */ result[0] = dqrt12_(&m, &n, &a[1], &lda, ©s[1], &work[ 1], &lwork); /* Compute norm( A*P - Q*R ) */ result[1] = dqpt01_(&m, &n, &mnmin, ©a[1], &a[1], & lda, &tau[1], &iwork[n + 1], &work[1], &lwork); /* Compute Q'*Q */ result[2] = dqrt11_(&m, &mnmin, &a[1], &lda, &tau[1], & work[1], &lwork); /* Print information about the tests that did not pass the threshold. */ for (k = 1; k <= 3; ++k) { if (result[k - 1] >= *thresh) { if (nfail == 0 && nerrs == 0) { alahd_(nout, path); } io___28.ciunit = *nout; s_wsfe(&io___28); do_fio(&c__1, "DGEQP3", (ftnlen)6); do_fio(&c__1, (char *)&m, (ftnlen)sizeof(integer)) ; do_fio(&c__1, (char *)&n, (ftnlen)sizeof(integer)) ; do_fio(&c__1, (char *)&nb, (ftnlen)sizeof(integer) ); do_fio(&c__1, (char *)&imode, (ftnlen)sizeof( integer)); do_fio(&c__1, (char *)&k, (ftnlen)sizeof(integer)) ; do_fio(&c__1, (char *)&result[k - 1], (ftnlen) sizeof(doublereal)); e_wsfe(); ++nfail; } /* L50: */ } nrun += 3; /* L60: */ } L70: ; } /* L80: */ } /* L90: */ } /* Print a summary of the results. */ alasum_(path, nout, &nfail, &nrun, &nerrs); /* End of DCHKQ3 */ return 0; } /* dchkq3_ */
/* Subroutine */ int dchktz_(logical *dotype, integer *nm, integer *mval, integer *nn, integer *nval, doublereal *thresh, logical *tsterr, doublereal *a, doublereal *copya, doublereal *s, doublereal *copys, doublereal *tau, doublereal *work, integer *nout) { /* Initialized data */ static integer iseedy[4] = { 1988,1989,1990,1991 }; /* Format strings */ static char fmt_9999[] = "(\002 M =\002,i5,\002, N =\002,i5,\002, type" " \002,i2,\002, test \002,i2,\002, ratio =\002,g12.5)"; /* System generated locals */ integer i__1, i__2, i__3, i__4; doublereal d__1; /* Builtin functions */ /* Subroutine */ int s_copy(char *, char *, ftnlen, ftnlen); integer s_wsfe(cilist *), do_fio(integer *, char *, ftnlen), e_wsfe(void); /* Local variables */ integer i__, k, m, n, im, in, lda; doublereal eps; integer mode, info; char path[3]; integer nrun; extern /* Subroutine */ int alahd_(integer *, char *); integer nfail, iseed[4], imode; extern doublereal dqrt12_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); integer mnmin; extern doublereal drzt01_(integer *, integer *, doublereal *, doublereal * , integer *, doublereal *, doublereal *, integer *), drzt02_( integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), dtzt01_(integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, doublereal *, integer *), dtzt02_(integer *, integer *, doublereal *, integer * , doublereal *, doublereal *, integer *); integer nerrs, lwork; extern /* Subroutine */ int dgeqr2_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); extern doublereal dlamch_(char *); extern /* Subroutine */ int dlaord_(char *, integer *, doublereal *, integer *), dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), dlaset_(char *, integer *, integer *, doublereal *, doublereal *, doublereal *, integer *), alasum_(char *, integer *, integer *, integer *, integer *), dlatms_(integer *, integer *, char *, integer *, char *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *, char *, doublereal *, integer *, doublereal *, integer *), derrtz_(char *, integer *), dtzrqf_(integer *, integer *, doublereal *, integer *, doublereal *, integer *); doublereal result[6]; extern /* Subroutine */ int dtzrzf_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, integer *); /* Fortran I/O blocks */ static cilist io___21 = { 0, 0, 0, fmt_9999, 0 }; /* -- LAPACK test routine (version 3.1.1) -- */ /* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd.. */ /* January 2007 */ /* .. Scalar Arguments .. */ /* .. */ /* .. Array Arguments .. */ /* .. */ /* Purpose */ /* ======= */ /* DCHKTZ tests DTZRQF and STZRZF. */ /* Arguments */ /* ========= */ /* DOTYPE (input) LOGICAL array, dimension (NTYPES) */ /* The matrix types to be used for testing. Matrices of type j */ /* (for 1 <= j <= NTYPES) are used for testing if DOTYPE(j) = */ /* .TRUE.; if DOTYPE(j) = .FALSE., then type j is not used. */ /* NM (input) INTEGER */ /* The number of values of M contained in the vector MVAL. */ /* MVAL (input) INTEGER array, dimension (NM) */ /* The values of the matrix row dimension M. */ /* NN (input) INTEGER */ /* The number of values of N contained in the vector NVAL. */ /* NVAL (input) INTEGER array, dimension (NN) */ /* The values of the matrix column dimension N. */ /* THRESH (input) DOUBLE PRECISION */ /* The threshold value for the test ratios. A result is */ /* included in the output file if RESULT >= THRESH. To have */ /* every test ratio printed, use THRESH = 0. */ /* TSTERR (input) LOGICAL */ /* Flag that indicates whether error exits are to be tested. */ /* A (workspace) DOUBLE PRECISION array, dimension (MMAX*NMAX) */ /* where MMAX is the maximum value of M in MVAL and NMAX is the */ /* maximum value of N in NVAL. */ /* COPYA (workspace) DOUBLE PRECISION array, dimension (MMAX*NMAX) */ /* S (workspace) DOUBLE PRECISION array, dimension */ /* (min(MMAX,NMAX)) */ /* COPYS (workspace) DOUBLE PRECISION array, dimension */ /* (min(MMAX,NMAX)) */ /* TAU (workspace) DOUBLE PRECISION array, dimension (MMAX) */ /* WORK (workspace) DOUBLE PRECISION array, dimension */ /* (MMAX*NMAX + 4*NMAX + MMAX) */ /* NOUT (input) INTEGER */ /* The unit number for output. */ /* ===================================================================== */ /* .. Parameters .. */ /* .. */ /* .. Local Scalars .. */ /* .. */ /* .. Local Arrays .. */ /* .. */ /* .. External Functions .. */ /* .. */ /* .. External Subroutines .. */ /* .. */ /* .. Intrinsic Functions .. */ /* .. */ /* .. Scalars in Common .. */ /* .. */ /* .. Common blocks .. */ /* .. */ /* .. Data statements .. */ /* Parameter adjustments */ --work; --tau; --copys; --s; --copya; --a; --nval; --mval; --dotype; /* Function Body */ /* .. */ /* .. Executable Statements .. */ /* Initialize constants and the random number seed. */ s_copy(path, "Double precision", (ftnlen)1, (ftnlen)16); s_copy(path + 1, "TZ", (ftnlen)2, (ftnlen)2); nrun = 0; nfail = 0; nerrs = 0; for (i__ = 1; i__ <= 4; ++i__) { iseed[i__ - 1] = iseedy[i__ - 1]; /* L10: */ } eps = dlamch_("Epsilon"); /* Test the error exits */ if (*tsterr) { derrtz_(path, nout); } infoc_1.infot = 0; i__1 = *nm; for (im = 1; im <= i__1; ++im) { /* Do for each value of M in MVAL. */ m = mval[im]; lda = max(1,m); i__2 = *nn; for (in = 1; in <= i__2; ++in) { /* Do for each value of N in NVAL for which M .LE. N. */ n = nval[in]; mnmin = min(m,n); /* Computing MAX */ i__3 = 1, i__4 = n * n + (m << 2) + n, i__3 = max(i__3,i__4), i__4 = m * n + (mnmin << 1) + (n << 2); lwork = max(i__3,i__4); if (m <= n) { for (imode = 1; imode <= 3; ++imode) { if (! dotype[imode]) { goto L50; } /* Do for each type of singular value distribution. */ /* 0: zero matrix */ /* 1: one small singular value */ /* 2: exponential distribution */ mode = imode - 1; /* Test DTZRQF */ /* Generate test matrix of size m by n using */ /* singular value distribution indicated by `mode'. */ if (mode == 0) { dlaset_("Full", &m, &n, &c_b10, &c_b10, &a[1], &lda); i__3 = mnmin; for (i__ = 1; i__ <= i__3; ++i__) { copys[i__] = 0.; /* L20: */ } } else { d__1 = 1. / eps; dlatms_(&m, &n, "Uniform", iseed, "Nonsymmetric", & copys[1], &imode, &d__1, &c_b15, &m, &n, "No packing", &a[1], &lda, &work[1], &info); dgeqr2_(&m, &n, &a[1], &lda, &work[1], &work[mnmin + 1], &info); i__3 = m - 1; dlaset_("Lower", &i__3, &n, &c_b10, &c_b10, &a[2], & lda); dlaord_("Decreasing", &mnmin, ©s[1], &c__1); } /* Save A and its singular values */ dlacpy_("All", &m, &n, &a[1], &lda, ©a[1], &lda); /* Call DTZRQF to reduce the upper trapezoidal matrix to */ /* upper triangular form. */ s_copy(srnamc_1.srnamt, "DTZRQF", (ftnlen)32, (ftnlen)6); dtzrqf_(&m, &n, &a[1], &lda, &tau[1], &info); /* Compute norm(svd(a) - svd(r)) */ result[0] = dqrt12_(&m, &m, &a[1], &lda, ©s[1], &work[ 1], &lwork); /* Compute norm( A - R*Q ) */ result[1] = dtzt01_(&m, &n, ©a[1], &a[1], &lda, &tau[ 1], &work[1], &lwork); /* Compute norm(Q'*Q - I). */ result[2] = dtzt02_(&m, &n, &a[1], &lda, &tau[1], &work[1] , &lwork); /* Test DTZRZF */ /* Generate test matrix of size m by n using */ /* singular value distribution indicated by `mode'. */ if (mode == 0) { dlaset_("Full", &m, &n, &c_b10, &c_b10, &a[1], &lda); i__3 = mnmin; for (i__ = 1; i__ <= i__3; ++i__) { copys[i__] = 0.; /* L30: */ } } else { d__1 = 1. / eps; dlatms_(&m, &n, "Uniform", iseed, "Nonsymmetric", & copys[1], &imode, &d__1, &c_b15, &m, &n, "No packing", &a[1], &lda, &work[1], &info); dgeqr2_(&m, &n, &a[1], &lda, &work[1], &work[mnmin + 1], &info); i__3 = m - 1; dlaset_("Lower", &i__3, &n, &c_b10, &c_b10, &a[2], & lda); dlaord_("Decreasing", &mnmin, ©s[1], &c__1); } /* Save A and its singular values */ dlacpy_("All", &m, &n, &a[1], &lda, ©a[1], &lda); /* Call DTZRZF to reduce the upper trapezoidal matrix to */ /* upper triangular form. */ s_copy(srnamc_1.srnamt, "DTZRZF", (ftnlen)32, (ftnlen)6); dtzrzf_(&m, &n, &a[1], &lda, &tau[1], &work[1], &lwork, & info); /* Compute norm(svd(a) - svd(r)) */ result[3] = dqrt12_(&m, &m, &a[1], &lda, ©s[1], &work[ 1], &lwork); /* Compute norm( A - R*Q ) */ result[4] = drzt01_(&m, &n, ©a[1], &a[1], &lda, &tau[ 1], &work[1], &lwork); /* Compute norm(Q'*Q - I). */ result[5] = drzt02_(&m, &n, &a[1], &lda, &tau[1], &work[1] , &lwork); /* Print information about the tests that did not pass */ /* the threshold. */ for (k = 1; k <= 6; ++k) { if (result[k - 1] >= *thresh) { if (nfail == 0 && nerrs == 0) { alahd_(nout, path); } io___21.ciunit = *nout; s_wsfe(&io___21); do_fio(&c__1, (char *)&m, (ftnlen)sizeof(integer)) ; do_fio(&c__1, (char *)&n, (ftnlen)sizeof(integer)) ; do_fio(&c__1, (char *)&imode, (ftnlen)sizeof( integer)); do_fio(&c__1, (char *)&k, (ftnlen)sizeof(integer)) ; do_fio(&c__1, (char *)&result[k - 1], (ftnlen) sizeof(doublereal)); e_wsfe(); ++nfail; } /* L40: */ } nrun += 6; L50: ; } } /* L60: */ } /* L70: */ } /* Print a summary of the results. */ alasum_(path, nout, &nfail, &nrun, &nerrs); /* End if DCHKTZ */ return 0; } /* dchktz_ */
/* Subroutine */ int ddrvls_(logical *dotype, integer *nm, integer *mval, integer *nn, integer *nval, integer *nns, integer *nsval, integer * nnb, integer *nbval, integer *nxval, doublereal *thresh, logical * tsterr, doublereal *a, doublereal *copya, doublereal *b, doublereal * copyb, doublereal *c__, doublereal *s, doublereal *copys, doublereal * work, integer *iwork, integer *nout) { /* Initialized data */ static integer iseedy[4] = { 1988,1989,1990,1991 }; /* Format strings */ static char fmt_9999[] = "(\002 TRANS='\002,a1,\002', M=\002,i5,\002, N" "=\002,i5,\002, NRHS=\002,i4,\002, NB=\002,i4,\002, type\002,i2" ",\002, test(\002,i2,\002)=\002,g12.5)"; static char fmt_9998[] = "(\002 M=\002,i5,\002, N=\002,i5,\002, NRHS=" "\002,i4,\002, NB=\002,i4,\002, type\002,i2,\002, test(\002,i2" ",\002)=\002,g12.5)"; /* System generated locals */ integer i__1, i__2, i__3, i__4, i__5, i__6; doublereal d__1, d__2; /* Builtin functions Subroutine */ int s_copy(char *, char *, ftnlen, ftnlen); double sqrt(doublereal), log(doublereal); integer s_wsfe(cilist *), do_fio(integer *, char *, ftnlen), e_wsfe(void); /* Local variables */ static integer info; static char path[3]; static integer rank, nrhs, nlvl, nrun, i__, j, k; extern /* Subroutine */ int alahd_(integer *, char *); static integer m, n; extern /* Subroutine */ int dscal_(integer *, doublereal *, doublereal *, integer *); static integer nfail, iseed[4]; extern /* Subroutine */ int dgemm_(char *, char *, integer *, integer *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); static integer crank; extern /* Subroutine */ int dgels_(char *, integer *, integer *, integer * , doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, integer *); static integer irank; static doublereal rcond; extern doublereal dasum_(integer *, doublereal *, integer *); static integer itran, mnmin, ncols; static doublereal norma, normb; extern doublereal dqrt12_(integer *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *), dqrt14_(char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *), dqrt17_(char *, integer *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *); extern /* Subroutine */ int daxpy_(integer *, doublereal *, doublereal *, integer *, doublereal *, integer *); static char trans[1]; static integer nerrs, itype; extern /* Subroutine */ int dqrt13_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *); static integer lwork; extern /* Subroutine */ int dqrt15_(integer *, integer *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *), dqrt16_(char *, integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *); static integer nrows, lwlsy, nb, im, in; extern doublereal dlamch_(char *); extern /* Subroutine */ int alaerh_(char *, char *, integer *, integer *, char *, integer *, integer *, integer *, integer *, integer *, integer *, integer *, integer *, integer *); static integer iscale; extern /* Subroutine */ int dgelsd_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *, integer *), dlacpy_(char *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), dgelss_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, doublereal *, doublereal *, integer *, doublereal *, integer *, integer *), alasvm_(char *, integer *, integer *, integer *, integer *), dgelsx_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, doublereal *, integer *), dgelsy_(integer *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *, doublereal *, integer *, doublereal *, integer *, integer *), dlarnv_(integer *, integer *, integer *, doublereal *), derrls_(char *, integer *), xlaenv_(integer *, integer *); static integer ldwork; static doublereal result[18]; static integer lda, ldb, inb; static doublereal eps; static integer ins; /* Fortran I/O blocks */ static cilist io___35 = { 0, 0, 0, fmt_9999, 0 }; static cilist io___40 = { 0, 0, 0, fmt_9998, 0 }; static cilist io___42 = { 0, 0, 0, fmt_9998, 0 }; /* -- LAPACK test routine (version 3.0) -- Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd., Courant Institute, Argonne National Lab, and Rice University January 3, 2000 Purpose ======= DDRVLS tests the least squares driver routines DGELS, DGELSS, DGELSX, DGELSY and DGELSD. Arguments ========= DOTYPE (input) LOGICAL array, dimension (NTYPES) The matrix types to be used for testing. Matrices of type j (for 1 <= j <= NTYPES) are used for testing if DOTYPE(j) = .TRUE.; if DOTYPE(j) = .FALSE., then type j is not used. The matrix of type j is generated as follows: j=1: A = U*D*V where U and V are random orthogonal matrices and D has random entries (> 0.1) taken from a uniform distribution (0,1). A is full rank. j=2: The same of 1, but A is scaled up. j=3: The same of 1, but A is scaled down. j=4: A = U*D*V where U and V are random orthogonal matrices and D has 3*min(M,N)/4 random entries (> 0.1) taken from a uniform distribution (0,1) and the remaining entries set to 0. A is rank-deficient. j=5: The same of 4, but A is scaled up. j=6: The same of 5, but A is scaled down. NM (input) INTEGER The number of values of M contained in the vector MVAL. MVAL (input) INTEGER array, dimension (NM) The values of the matrix row dimension M. NN (input) INTEGER The number of values of N contained in the vector NVAL. NVAL (input) INTEGER array, dimension (NN) The values of the matrix column dimension N. NNS (input) INTEGER The number of values of NRHS contained in the vector NSVAL. NSVAL (input) INTEGER array, dimension (NNS) The values of the number of right hand sides NRHS. NNB (input) INTEGER The number of values of NB and NX contained in the vectors NBVAL and NXVAL. The blocking parameters are used in pairs (NB,NX). NBVAL (input) INTEGER array, dimension (NNB) The values of the blocksize NB. NXVAL (input) INTEGER array, dimension (NNB) The values of the crossover point NX. THRESH (input) DOUBLE PRECISION The threshold value for the test ratios. A result is included in the output file if RESULT >= THRESH. To have every test ratio printed, use THRESH = 0. TSTERR (input) LOGICAL Flag that indicates whether error exits are to be tested. A (workspace) DOUBLE PRECISION array, dimension (MMAX*NMAX) where MMAX is the maximum value of M in MVAL and NMAX is the maximum value of N in NVAL. COPYA (workspace) DOUBLE PRECISION array, dimension (MMAX*NMAX) B (workspace) DOUBLE PRECISION array, dimension (MMAX*NSMAX) where MMAX is the maximum value of M in MVAL and NSMAX is the maximum value of NRHS in NSVAL. COPYB (workspace) DOUBLE PRECISION array, dimension (MMAX*NSMAX) C (workspace) DOUBLE PRECISION array, dimension (MMAX*NSMAX) S (workspace) DOUBLE PRECISION array, dimension (min(MMAX,NMAX)) COPYS (workspace) DOUBLE PRECISION array, dimension (min(MMAX,NMAX)) WORK (workspace) DOUBLE PRECISION array, dimension (MMAX*NMAX + 4*NMAX + MMAX). IWORK (workspace) INTEGER array, dimension (15*NMAX) NOUT (input) INTEGER The unit number for output. ===================================================================== Parameter adjustments */ --iwork; --work; --copys; --s; --c__; --copyb; --b; --copya; --a; --nxval; --nbval; --nsval; --nval; --mval; --dotype; /* Function Body Initialize constants and the random number seed. */ s_copy(path, "Double precision", (ftnlen)1, (ftnlen)16); s_copy(path + 1, "LS", (ftnlen)2, (ftnlen)2); nrun = 0; nfail = 0; nerrs = 0; for (i__ = 1; i__ <= 4; ++i__) { iseed[i__ - 1] = iseedy[i__ - 1]; /* L10: */ } eps = dlamch_("Epsilon"); /* Threshold for rank estimation */ rcond = sqrt(eps) - (sqrt(eps) - eps) / 2; /* Test the error exits */ if (*tsterr) { derrls_(path, nout); } /* Print the header if NM = 0 or NN = 0 and THRESH = 0. */ if ((*nm == 0 || *nn == 0) && *thresh == 0.) { alahd_(nout, path); } infoc_1.infot = 0; xlaenv_(&c__2, &c__2); xlaenv_(&c__9, &c__25); i__1 = *nm; for (im = 1; im <= i__1; ++im) { m = mval[im]; lda = max(1,m); i__2 = *nn; for (in = 1; in <= i__2; ++in) { n = nval[in]; mnmin = min(m,n); /* Computing MAX */ i__3 = max(1,m); ldb = max(i__3,n); i__3 = *nns; for (ins = 1; ins <= i__3; ++ins) { nrhs = nsval[ins]; /* Computing MAX Computing MAX */ d__1 = 1., d__2 = (doublereal) mnmin; i__4 = (integer) (log(max(d__1,d__2) / 26.) / log(2.)) + 1; nlvl = max(i__4,0); /* Computing MAX */ i__4 = 1, i__5 = (m + nrhs) * (n + 2), i__4 = max(i__4,i__5), i__5 = (n + nrhs) * (m + 2), i__4 = max(i__4,i__5), i__5 = m * n + (mnmin << 2) + max(m,n), i__4 = max( i__4,i__5), i__5 = mnmin * 12 + mnmin * 50 + (mnmin << 3) * nlvl + mnmin * nrhs + 676; lwork = max(i__4,i__5); for (irank = 1; irank <= 2; ++irank) { for (iscale = 1; iscale <= 3; ++iscale) { itype = (irank - 1) * 3 + iscale; if (! dotype[itype]) { goto L110; } if (irank == 1) { /* Test DGELS Generate a matrix of scaling type ISCALE */ dqrt13_(&iscale, &m, &n, ©a[1], &lda, &norma, iseed); i__4 = *nnb; for (inb = 1; inb <= i__4; ++inb) { nb = nbval[inb]; xlaenv_(&c__1, &nb); xlaenv_(&c__3, &nxval[inb]); for (itran = 1; itran <= 2; ++itran) { if (itran == 1) { *(unsigned char *)trans = 'N'; nrows = m; ncols = n; } else { *(unsigned char *)trans = 'T'; nrows = n; ncols = m; } ldwork = max(1,ncols); /* Set up a consistent rhs */ if (ncols > 0) { i__5 = ncols * nrhs; dlarnv_(&c__2, iseed, &i__5, &work[1]) ; i__5 = ncols * nrhs; d__1 = 1. / (doublereal) ncols; dscal_(&i__5, &d__1, &work[1], &c__1); } dgemm_(trans, "No transpose", &nrows, & nrhs, &ncols, &c_b24, ©a[1], & lda, &work[1], &ldwork, &c_b25, & b[1], &ldb) ; dlacpy_("Full", &nrows, &nrhs, &b[1], & ldb, ©b[1], &ldb); /* Solve LS or overdetermined system */ if (m > 0 && n > 0) { dlacpy_("Full", &m, &n, ©a[1], & lda, &a[1], &lda); dlacpy_("Full", &nrows, &nrhs, ©b[ 1], &ldb, &b[1], &ldb); } s_copy(srnamc_1.srnamt, "DGELS ", (ftnlen) 6, (ftnlen)6); dgels_(trans, &m, &n, &nrhs, &a[1], &lda, &b[1], &ldb, &work[1], &lwork, & info); if (info != 0) { alaerh_(path, "DGELS ", &info, &c__0, trans, &m, &n, &nrhs, &c_n1, & nb, &itype, &nfail, &nerrs, nout); } /* Check correctness of results */ ldwork = max(1,nrows); if (nrows > 0 && nrhs > 0) { dlacpy_("Full", &nrows, &nrhs, ©b[ 1], &ldb, &c__[1], &ldb); } dqrt16_(trans, &m, &n, &nrhs, ©a[1], & lda, &b[1], &ldb, &c__[1], &ldb, & work[1], result); if (itran == 1 && m >= n || itran == 2 && m < n) { /* Solving LS system */ result[1] = dqrt17_(trans, &c__1, &m, &n, &nrhs, ©a[1], &lda, & b[1], &ldb, ©b[1], &ldb, & c__[1], &work[1], &lwork); } else { /* Solving overdetermined system */ result[1] = dqrt14_(trans, &m, &n, & nrhs, ©a[1], &lda, &b[1], &ldb, &work[1], &lwork); } /* Print information about the tests that did not pass the threshold. */ for (k = 1; k <= 2; ++k) { if (result[k - 1] >= *thresh) { if (nfail == 0 && nerrs == 0) { alahd_(nout, path); } io___35.ciunit = *nout; s_wsfe(&io___35); do_fio(&c__1, trans, (ftnlen)1); do_fio(&c__1, (char *)&m, (ftnlen) sizeof(integer)); do_fio(&c__1, (char *)&n, (ftnlen) sizeof(integer)); do_fio(&c__1, (char *)&nrhs, ( ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&nb, ( ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&itype, ( ftnlen)sizeof(integer)); do_fio(&c__1, (char *)&k, (ftnlen) sizeof(integer)); do_fio(&c__1, (char *)&result[k - 1], (ftnlen)sizeof( doublereal)); e_wsfe(); ++nfail; } /* L20: */ } nrun += 2; /* L30: */ } /* L40: */ } } /* Generate a matrix of scaling type ISCALE and rank type IRANK. */ dqrt15_(&iscale, &irank, &m, &n, &nrhs, ©a[1], & lda, ©b[1], &ldb, ©s[1], &rank, & norma, &normb, iseed, &work[1], &lwork); /* workspace used: MAX(M+MIN(M,N),NRHS*MIN(M,N),2*N+M) Initialize vector IWORK. */ i__4 = n; for (j = 1; j <= i__4; ++j) { iwork[j] = 0; /* L50: */ } ldwork = max(1,m); /* Test DGELSX DGELSX: Compute the minimum-norm solution X to min( norm( A * X - B ) ) using a complete orthogonal factorization. */ dlacpy_("Full", &m, &n, ©a[1], &lda, &a[1], &lda); dlacpy_("Full", &m, &nrhs, ©b[1], &ldb, &b[1], & ldb); s_copy(srnamc_1.srnamt, "DGELSX", (ftnlen)6, (ftnlen) 6); dgelsx_(&m, &n, &nrhs, &a[1], &lda, &b[1], &ldb, & iwork[1], &rcond, &crank, &work[1], &info); if (info != 0) { alaerh_(path, "DGELSX", &info, &c__0, " ", &m, &n, &nrhs, &c_n1, &nb, &itype, &nfail, & nerrs, nout); } /* workspace used: MAX( MNMIN+3*N, 2*MNMIN+NRHS ) Test 3: Compute relative error in svd workspace: M*N + 4*MIN(M,N) + MAX(M,N) */ result[2] = dqrt12_(&crank, &crank, &a[1], &lda, & copys[1], &work[1], &lwork); /* Test 4: Compute error in solution workspace: M*NRHS + M */ dlacpy_("Full", &m, &nrhs, ©b[1], &ldb, &work[1], &ldwork); dqrt16_("No transpose", &m, &n, &nrhs, ©a[1], & lda, &b[1], &ldb, &work[1], &ldwork, &work[m * nrhs + 1], &result[3]); /* Test 5: Check norm of r'*A workspace: NRHS*(M+N) */ result[4] = 0.; if (m > crank) { result[4] = dqrt17_("No transpose", &c__1, &m, &n, &nrhs, ©a[1], &lda, &b[1], &ldb, & copyb[1], &ldb, &c__[1], &work[1], &lwork); } /* Test 6: Check if x is in the rowspace of A workspace: (M+NRHS)*(N+2) */ result[5] = 0.; if (n > crank) { result[5] = dqrt14_("No transpose", &m, &n, &nrhs, ©a[1], &lda, &b[1], &ldb, &work[1], & lwork); } /* Print information about the tests that did not pass the threshold. */ for (k = 3; k <= 6; ++k) { if (result[k - 1] >= *thresh) { if (nfail == 0 && nerrs == 0) { alahd_(nout, path); } io___40.ciunit = *nout; s_wsfe(&io___40); do_fio(&c__1, (char *)&m, (ftnlen)sizeof( integer)); do_fio(&c__1, (char *)&n, (ftnlen)sizeof( integer)); do_fio(&c__1, (char *)&nrhs, (ftnlen)sizeof( integer)); do_fio(&c__1, (char *)&nb, (ftnlen)sizeof( integer)); do_fio(&c__1, (char *)&itype, (ftnlen)sizeof( integer)); do_fio(&c__1, (char *)&k, (ftnlen)sizeof( integer)); do_fio(&c__1, (char *)&result[k - 1], (ftnlen) sizeof(doublereal)); e_wsfe(); ++nfail; } /* L60: */ } nrun += 4; /* Loop for testing different block sizes. */ i__4 = *nnb; for (inb = 1; inb <= i__4; ++inb) { nb = nbval[inb]; xlaenv_(&c__1, &nb); xlaenv_(&c__3, &nxval[inb]); /* Test DGELSY DGELSY: Compute the minimum-norm solution X to min( norm( A * X - B ) ) using the rank-revealing orthogonal factorization. Initialize vector IWORK. */ i__5 = n; for (j = 1; j <= i__5; ++j) { iwork[j] = 0; /* L70: */ } /* Set LWLSY to the adequate value. Computing MAX */ i__5 = 1, i__6 = mnmin + (n << 1) + nb * (n + 1), i__5 = max(i__5,i__6), i__6 = (mnmin << 1) + nb * nrhs; lwlsy = max(i__5,i__6); dlacpy_("Full", &m, &n, ©a[1], &lda, &a[1], & lda); dlacpy_("Full", &m, &nrhs, ©b[1], &ldb, &b[1], &ldb); s_copy(srnamc_1.srnamt, "DGELSY", (ftnlen)6, ( ftnlen)6); dgelsy_(&m, &n, &nrhs, &a[1], &lda, &b[1], &ldb, & iwork[1], &rcond, &crank, &work[1], & lwlsy, &info); if (info != 0) { alaerh_(path, "DGELSY", &info, &c__0, " ", &m, &n, &nrhs, &c_n1, &nb, &itype, & nfail, &nerrs, nout); } /* Test 7: Compute relative error in svd workspace: M*N + 4*MIN(M,N) + MAX(M,N) */ result[6] = dqrt12_(&crank, &crank, &a[1], &lda, & copys[1], &work[1], &lwork); /* Test 8: Compute error in solution workspace: M*NRHS + M */ dlacpy_("Full", &m, &nrhs, ©b[1], &ldb, &work[ 1], &ldwork); dqrt16_("No transpose", &m, &n, &nrhs, ©a[1], &lda, &b[1], &ldb, &work[1], &ldwork, & work[m * nrhs + 1], &result[7]); /* Test 9: Check norm of r'*A workspace: NRHS*(M+N) */ result[8] = 0.; if (m > crank) { result[8] = dqrt17_("No transpose", &c__1, &m, &n, &nrhs, ©a[1], &lda, &b[1], & ldb, ©b[1], &ldb, &c__[1], &work[ 1], &lwork); } /* Test 10: Check if x is in the rowspace of A workspace: (M+NRHS)*(N+2) */ result[9] = 0.; if (n > crank) { result[9] = dqrt14_("No transpose", &m, &n, & nrhs, ©a[1], &lda, &b[1], &ldb, & work[1], &lwork); } /* Test DGELSS DGELSS: Compute the minimum-norm solution X to min( norm( A * X - B ) ) using the SVD. */ dlacpy_("Full", &m, &n, ©a[1], &lda, &a[1], & lda); dlacpy_("Full", &m, &nrhs, ©b[1], &ldb, &b[1], &ldb); s_copy(srnamc_1.srnamt, "DGELSS", (ftnlen)6, ( ftnlen)6); dgelss_(&m, &n, &nrhs, &a[1], &lda, &b[1], &ldb, & s[1], &rcond, &crank, &work[1], &lwork, & info); if (info != 0) { alaerh_(path, "DGELSS", &info, &c__0, " ", &m, &n, &nrhs, &c_n1, &nb, &itype, & nfail, &nerrs, nout); } /* workspace used: 3*min(m,n) + max(2*min(m,n),nrhs,max(m,n)) Test 11: Compute relative error in svd */ if (rank > 0) { daxpy_(&mnmin, &c_b92, ©s[1], &c__1, &s[1] , &c__1); result[10] = dasum_(&mnmin, &s[1], &c__1) / dasum_(&mnmin, ©s[1], &c__1) / ( eps * (doublereal) mnmin); } else { result[10] = 0.; } /* Test 12: Compute error in solution */ dlacpy_("Full", &m, &nrhs, ©b[1], &ldb, &work[ 1], &ldwork); dqrt16_("No transpose", &m, &n, &nrhs, ©a[1], &lda, &b[1], &ldb, &work[1], &ldwork, & work[m * nrhs + 1], &result[11]); /* Test 13: Check norm of r'*A */ result[12] = 0.; if (m > crank) { result[12] = dqrt17_("No transpose", &c__1, & m, &n, &nrhs, ©a[1], &lda, &b[1], &ldb, ©b[1], &ldb, &c__[1], &work[ 1], &lwork); } /* Test 14: Check if x is in the rowspace of A */ result[13] = 0.; if (n > crank) { result[13] = dqrt14_("No transpose", &m, &n, & nrhs, ©a[1], &lda, &b[1], &ldb, & work[1], &lwork); } /* Test DGELSD DGELSD: Compute the minimum-norm solution X to min( norm( A * X - B ) ) using a divide and conquer SVD. Initialize vector IWORK. */ i__5 = n; for (j = 1; j <= i__5; ++j) { iwork[j] = 0; /* L80: */ } dlacpy_("Full", &m, &n, ©a[1], &lda, &a[1], & lda); dlacpy_("Full", &m, &nrhs, ©b[1], &ldb, &b[1], &ldb); s_copy(srnamc_1.srnamt, "DGELSD", (ftnlen)6, ( ftnlen)6); dgelsd_(&m, &n, &nrhs, &a[1], &lda, &b[1], &ldb, & s[1], &rcond, &crank, &work[1], &lwork, & iwork[1], &info); if (info != 0) { alaerh_(path, "DGELSD", &info, &c__0, " ", &m, &n, &nrhs, &c_n1, &nb, &itype, & nfail, &nerrs, nout); } /* Test 15: Compute relative error in svd */ if (rank > 0) { daxpy_(&mnmin, &c_b92, ©s[1], &c__1, &s[1] , &c__1); result[14] = dasum_(&mnmin, &s[1], &c__1) / dasum_(&mnmin, ©s[1], &c__1) / ( eps * (doublereal) mnmin); } else { result[14] = 0.; } /* Test 16: Compute error in solution */ dlacpy_("Full", &m, &nrhs, ©b[1], &ldb, &work[ 1], &ldwork); dqrt16_("No transpose", &m, &n, &nrhs, ©a[1], &lda, &b[1], &ldb, &work[1], &ldwork, & work[m * nrhs + 1], &result[15]); /* Test 17: Check norm of r'*A */ result[16] = 0.; if (m > crank) { result[16] = dqrt17_("No transpose", &c__1, & m, &n, &nrhs, ©a[1], &lda, &b[1], &ldb, ©b[1], &ldb, &c__[1], &work[ 1], &lwork); } /* Test 18: Check if x is in the rowspace of A */ result[17] = 0.; if (n > crank) { result[17] = dqrt14_("No transpose", &m, &n, & nrhs, ©a[1], &lda, &b[1], &ldb, & work[1], &lwork); } /* Print information about the tests that did not pass the threshold. */ for (k = 7; k <= 18; ++k) { if (result[k - 1] >= *thresh) { if (nfail == 0 && nerrs == 0) { alahd_(nout, path); } io___42.ciunit = *nout; s_wsfe(&io___42); do_fio(&c__1, (char *)&m, (ftnlen)sizeof( integer)); do_fio(&c__1, (char *)&n, (ftnlen)sizeof( integer)); do_fio(&c__1, (char *)&nrhs, (ftnlen) sizeof(integer)); do_fio(&c__1, (char *)&nb, (ftnlen)sizeof( integer)); do_fio(&c__1, (char *)&itype, (ftnlen) sizeof(integer)); do_fio(&c__1, (char *)&k, (ftnlen)sizeof( integer)); do_fio(&c__1, (char *)&result[k - 1], ( ftnlen)sizeof(doublereal)); e_wsfe(); ++nfail; } /* L90: */ } nrun += 12; /* L100: */ } L110: ; } /* L120: */ } /* L130: */ } /* L140: */ } /* L150: */ } /* Print a summary of the results. */ alasvm_(path, nout, &nfail, &nrun, &nerrs); return 0; /* End of DDRVLS */ } /* ddrvls_ */