189 SUBROUTINE cdrvls( DOTYPE, NM, MVAL, NN, NVAL, NNS, NSVAL, NNB,
190 $ NBVAL, NXVAL, THRESH, TSTERR, A, COPYA, B,
191 $ COPYB, C, S, COPYS, NOUT )
199 INTEGER NM, NN, NNB, NNS, NOUT
204 INTEGER MVAL( * ), NBVAL( * ), NSVAL( * ),
205 $ nval( * ), nxval( * )
206 REAL COPYS( * ), S( * )
207 COMPLEX A( * ), B( * ), C( * ), COPYA( * ), COPYB( * )
214 PARAMETER ( NTESTS = 16 )
216 parameter( smlsiz = 25 )
218 parameter( one = 1.0e+0, zero = 0.0e+0 )
220 parameter( cone = ( 1.0e+0, 0.0e+0 ),
221 $ czero = ( 0.0e+0, 0.0e+0 ) )
226 INTEGER CRANK, I, IM, IMB, IN, INB, INFO, INS, IRANK,
227 $ iscale, itran, itype, j, k, lda, ldb, ldwork,
228 $ lwlsy, lwork, m, mnmin, n, nb, ncols, nerrs,
229 $ nfail, nrhs, nrows, nrun, rank, mb,
230 $ mmax, nmax, nsmax, liwork, lrwork,
231 $ lwork_cgels, lwork_cgetsls, lwork_cgelss,
232 $ lwork_cgelsy, lwork_cgelsd,
233 $ lrwork_cgelsy, lrwork_cgelss, lrwork_cgelsd
234 REAL EPS, NORMA, NORMB, RCOND
237 INTEGER ISEED( 4 ), ISEEDY( 4 ), IWQ( 1 )
238 REAL RESULT( NTESTS ), RWQ( 1 )
242 COMPLEX,
ALLOCATABLE :: WORK (:)
243 REAL,
ALLOCATABLE :: RWORK (:), WORK2 (:)
244 INTEGER,
ALLOCATABLE :: IWORK (:)
247 REAL CQRT12, CQRT14, CQRT17, SASUM, SLAMCH
248 EXTERNAL CQRT12, CQRT14, CQRT17, SASUM, SLAMCH
257 INTRINSIC max,
min, int, real, sqrt
262 INTEGER INFOT, IOUNIT
265 COMMON / infoc / infot, iounit, ok, lerr
266 COMMON / srnamc / srnamt
269 DATA iseedy / 1988, 1989, 1990, 1991 /
275 path( 1: 1 ) =
'Complex precision'
281 iseed( i ) = iseedy( i )
283 eps = slamch( 'epsilon
' )
287 RCOND = SQRT( EPS ) - ( SQRT( EPS )-EPS ) / 2
291 CALL XLAENV( 9, SMLSIZ )
293 $ CALL CERRLS( PATH, NOUT )
297.EQ..OR..EQ..AND..EQ.
IF( ( NM0 NN0 ) THRESHZERO )
298 $ CALL ALAHD( NOUT, PATH )
307.GT.
IF ( MVAL( I )MMAX ) THEN
312.GT.
IF ( NVAL( I )NMAX ) THEN
317.GT.
IF ( NSVAL( I )NSMAX ) THEN
324 MNMIN = MAX( MIN( M, N ), 1 )
329 LWORK = MAX( 1, ( M+N )*NRHS,
330 $ ( N+NRHS )*( M+2 ), ( M+NRHS )*( N+2 ),
331 $ MAX( M+MNMIN, NRHS*MNMIN,2*N+M ),
332 $ MAX( M*N+4*MNMIN+MAX(M,N), M*N+2*MNMIN+4*N ) )
344 MNMIN = MAX(MIN( M, N ),1)
350 ITYPE = ( IRANK-1 )*3 + ISCALE
351 IF( DOTYPE( ITYPE ) ) THEN
352.EQ.
IF( IRANK1 ) THEN
354.EQ.
IF( ITRAN1 ) THEN
361 CALL CGELS( TRANS, M, N, NRHS, A, LDA,
362 $ B, LDB, WQ, -1, INFO )
363 LWORK_CGELS = INT( WQ( 1 ) )
365 CALL CGETSLS( TRANS, M, N, NRHS, A, LDA,
366 $ B, LDB, WQ, -1, INFO )
367 LWORK_CGETSLS = INT( WQ( 1 ) )
371 CALL CGELSY( M, N, NRHS, A, LDA, B, LDB,
372 $ IWQ, RCOND, CRANK, WQ, -1, RWQ,
374 LWORK_CGELSY = INT( WQ( 1 ) )
377 CALL CGELSS( M, N, NRHS, A, LDA, B, LDB, S,
378 $ RCOND, CRANK, WQ, -1, RWQ, INFO )
379 LWORK_CGELSS = INT( WQ( 1 ) )
380 LRWORK_CGELSS = 5*MNMIN
382 CALL CGELSD( M, N, NRHS, A, LDA, B, LDB, S,
383 $ RCOND, CRANK, WQ, -1, RWQ, IWQ,
385 LWORK_CGELSD = INT( WQ( 1 ) )
386 LRWORK_CGELSD = INT( RWQ ( 1 ) )
388 LIWORK = MAX( LIWORK, N, IWQ ( 1 ) )
390 LRWORK = MAX( LRWORK, LRWORK_CGELSY,
391 $ LRWORK_CGELSS, LRWORK_CGELSD )
393 LWORK = MAX( LWORK, LWORK_CGELS, LWORK_CGETSLS,
394 $ LWORK_CGELSY, LWORK_CGELSS,
405 ALLOCATE( WORK( LWORK ) )
406 ALLOCATE( IWORK( LIWORK ) )
407 ALLOCATE( RWORK( LRWORK ) )
408 ALLOCATE( WORK2( 2 * LWORK ) )
416 MNMIN = MAX(MIN( M, N ),1)
425 ITYPE = ( IRANK-1 )*3 + ISCALE
426.NOT.
IF( DOTYPE( ITYPE ) )
429.EQ.
IF( IRANK1 ) THEN
435 CALL CQRT13( ISCALE, M, N, COPYA, LDA, NORMA,
440 CALL XLAENV( 3, NXVAL( INB ) )
443.EQ.
IF( ITRAN1 ) THEN
452 LDWORK = MAX( 1, NCOLS )
456.GT.
IF( NCOLS0 ) THEN
457 CALL CLARNV( 2, ISEED, NCOLS*NRHS,
459 CALL CSSCAL( NCOLS*NRHS,
460 $ ONE / REAL( NCOLS ), WORK,
463 CALL CGEMM( TRANS, 'no transpose
', NROWS,
464 $ NRHS, NCOLS, CONE, COPYA, LDA,
465 $ WORK, LDWORK, CZERO, B, LDB )
466 CALL CLACPY( 'full', nrows, nrhs, b, ldb,
471 IF( m.GT.0 .AND. n.GT.0 )
THEN
472 CALL clacpy(
'Full', m, n, copya, lda,
474 CALL clacpy(
'Full', nrows, nrhs,
475 $ copyb, ldb, b, ldb )
478 CALL cgels( trans, m, n, nrhs, a, lda, b,
479 $ ldb, work, lwork, info )
482 $
CALL alaerh( path,
'CGELS ', info, 0,
483 $ trans, m, n, nrhs, -1, nb,
484 $ itype, nfail, nerrs,
489 ldwork =
max( 1, nrows )
490 IF( nrows.GT.0 .AND. nrhs.GT.0 )
491 $
CALL clacpy( 'full
', NROWS, NRHS,
492 $ COPYB, LDB, C, LDB )
493 CALL CQRT16( TRANS, M, N, NRHS, COPYA,
494 $ LDA, B, LDB, C, LDB, RWORK,
497.EQ..AND..GE..OR.
IF( ( ITRAN1 MN )
498.EQ..AND..LT.
$ ( ITRAN2 MN ) ) THEN
502 RESULT( 2 ) = CQRT17( TRANS, 1, M, N,
503 $ NRHS, COPYA, LDA, B, LDB,
504 $ COPYB, LDB, C, WORK,
510 RESULT( 2 ) = CQRT14( TRANS, M, N,
511 $ NRHS, COPYA, LDA, B, LDB,
519.GE.
IF( RESULT( K )THRESH ) THEN
520.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
521 $ CALL ALAHD( NOUT, PATH )
522 WRITE( NOUT, FMT = 9999 )TRANS, M,
523 $ N, NRHS, NB, ITYPE, K,
537 CALL CQRT13( ISCALE, M, N, COPYA, LDA, NORMA,
547.EQ.
IF( ITRAN1 ) THEN
556 LDWORK = MAX( 1, NCOLS )
560.GT.
IF( NCOLS0 ) THEN
561 CALL CLARNV( 2, ISEED, NCOLS*NRHS,
563 CALL CSCAL( NCOLS*NRHS,
564 $ CONE / REAL( NCOLS ), WORK,
567 CALL CGEMM( TRANS, 'no transpose
', NROWS,
568 $ NRHS, NCOLS, CONE, COPYA, LDA,
569 $ WORK, LDWORK, CZERO, B, LDB )
570 CALL CLACPY( 'full
', NROWS, NRHS, B, LDB,
575.GT..AND..GT.
IF( M0 N0 ) THEN
576 CALL CLACPY( 'full
', M, N, COPYA, LDA,
578 CALL CLACPY( 'full
', NROWS, NRHS,
579 $ COPYB, LDB, B, LDB )
582 CALL CGETSLS( TRANS, M, N, NRHS, A,
583 $ LDA, B, LDB, WORK, LWORK, INFO )
585 $ CALL ALAERH( PATH, 'cgetsls ', INFO, 0,
586 $ TRANS, M, N, NRHS, -1, NB,
587 $ ITYPE, NFAIL, NERRS,
592 LDWORK = MAX( 1, NROWS )
593.GT..AND..GT.
IF( NROWS0 NRHS0 )
594 $ CALL CLACPY( 'full
', NROWS, NRHS,
595 $ COPYB, LDB, C, LDB )
596 CALL CQRT16( TRANS, M, N, NRHS, COPYA,
597 $ LDA, B, LDB, C, LDB, WORK2,
600.EQ..AND..GE..OR.
IF( ( ITRAN1 MN )
601.EQ..AND..LT.
$ ( ITRAN2 MN ) ) THEN
605 RESULT( 16 ) = CQRT17( TRANS, 1, M, N,
606 $ NRHS, COPYA, LDA, B, LDB,
607 $ COPYB, LDB, C, WORK,
613 RESULT( 16 ) = CQRT14( TRANS, M, N,
614 $ NRHS, COPYA, LDA, B, LDB,
622.GE.
IF( RESULT( K )THRESH ) THEN
623.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
624 $ CALL ALAHD( NOUT, PATH )
625 WRITE( NOUT, FMT = 9997 )TRANS, M,
626 $ N, NRHS, MB, NB, ITYPE, K,
640 CALL CQRT15( ISCALE, IRANK, M, N, NRHS, COPYA, LDA,
641 $ COPYB, LDB, COPYS, RANK, NORMA, NORMB,
642 $ ISEED, WORK, LWORK )
653 CALL XLAENV( 3, NXVAL( INB ) )
662 CALL CLACPY( 'full
', M, N, COPYA, LDA, A, LDA )
663 CALL CLACPY( 'full
', M, NRHS, COPYB, LDB, B,
673 CALL CGELSY( M, N, NRHS, A, LDA, B, LDB, IWORK,
674 $ RCOND, CRANK, WORK, LWLSY, RWORK,
677 $ CALL ALAERH( PATH, 'cgelsy', INFO, 0, ' ', M,
678 $ N, NRHS, -1, NB, ITYPE, NFAIL,
686 RESULT( 3 ) = CQRT12( CRANK, CRANK, A, LDA,
687 $ COPYS, WORK, LWORK, RWORK )
692 CALL CLACPY( 'full
', M, NRHS, COPYB, LDB, WORK,
694 CALL CQRT16( 'no transpose
', M, N, NRHS, COPYA,
695 $ LDA, B, LDB, WORK, LDWORK, RWORK,
703 $ RESULT( 5 ) = CQRT17( 'no transpose
', 1, M,
704 $ N, NRHS, COPYA, LDA, B, LDB,
705 $ COPYB, LDB, C, WORK, LWORK )
713 $ RESULT( 6 ) = CQRT14( 'no transpose
', M, N,
714 $ NRHS, COPYA, LDA, B, LDB,
723 CALL CLACPY( 'full
', M, N, COPYA, LDA, A, LDA )
724 CALL CLACPY( 'full
', M, NRHS, COPYB, LDB, B,
727 CALL CGELSS( M, N, NRHS, A, LDA, B, LDB, S,
728 $ RCOND, CRANK, WORK, LWORK, RWORK,
732 $ CALL ALAERH( PATH, 'cgelss', INFO, 0, ' ', M,
733 $ N, NRHS, -1, NB, ITYPE, NFAIL,
742 CALL SAXPY( MNMIN, -ONE, COPYS, 1, S, 1 )
743 RESULT( 7 ) = SASUM( MNMIN, S, 1 ) /
744 $ SASUM( MNMIN, COPYS, 1 ) /
745 $ ( EPS*REAL( MNMIN ) )
752 CALL CLACPY( 'full
', M, NRHS, COPYB, LDB, WORK,
754 CALL CQRT16( 'no transpose
', M, N, NRHS, COPYA,
755 $ LDA, B, LDB, WORK, LDWORK, RWORK,
762 $ RESULT( 9 ) = CQRT17( 'no transpose
', 1, M,
763 $ N, NRHS, COPYA, LDA, B, LDB,
764 $ COPYB, LDB, C, WORK, LWORK )
770 $ RESULT( 10 ) = CQRT14( 'no transpose
', M, N,
771 $ NRHS, COPYA, LDA, B, LDB,
782 CALL CLACPY( 'full
', M, N, COPYA, LDA, A, LDA )
783 CALL CLACPY( 'full
', M, NRHS, COPYB, LDB, B,
787 CALL CGELSD( M, N, NRHS, A, LDA, B, LDB, S,
788 $ RCOND, CRANK, WORK, LWORK, RWORK,
791 $ CALL ALAERH( PATH, 'cgelsd', INFO, 0, ' ', M,
792 $ N, NRHS, -1, NB, ITYPE, NFAIL,
798 CALL SAXPY( MNMIN, -ONE, COPYS, 1, S, 1 )
799 RESULT( 11 ) = SASUM( MNMIN, S, 1 ) /
800 $ SASUM( MNMIN, COPYS, 1 ) /
801 $ ( EPS*REAL( MNMIN ) )
808 CALL CLACPY( 'full
', M, NRHS, COPYB, LDB, WORK,
810 CALL CQRT16( 'no transpose
', M, N, NRHS, COPYA,
811 $ LDA, B, LDB, WORK, LDWORK, RWORK,
818 $ RESULT( 13 ) = CQRT17( 'no transpose
', 1, M,
819 $ N, NRHS, COPYA, LDA, B, LDB,
820 $ COPYB, LDB, C, WORK, LWORK )
826 $ RESULT( 14 ) = CQRT14( 'no transpose
', M, N,
827 $ NRHS, COPYA, LDA, B, LDB,
834.GE.
IF( RESULT( K )THRESH ) THEN
835.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
836 $ CALL ALAHD( NOUT, PATH )
837 WRITE( NOUT, FMT = 9998 )M, N, NRHS, NB,
838 $ ITYPE, K, RESULT( K )
853 CALL ALASVM( PATH, NOUT, NFAIL, NRUN, NERRS )
855 9999 FORMAT( ' trans=
''', A1, ''', m=
', I5, ', n=
', I5, ', nrhs=
', I4,
856 $ ', nb=
', I4, ', type
', I2, ', test(
', I2, ')=
', G12.5 )
857 9998 FORMAT( ' m=
', I5, ', n=
', I5, ', nrhs=', i4, ', nb=', i4,
858 $
', type', i2, ', test(
', I2, ')=
', G12.5 )
859 9997 FORMAT( ' trans=
''', A1,' m=
', I5, ', n=
', I5, ', nrhs=
', I4,
860 $ ', mb=
', I4,', nb=
', I4,', type
', I2,
861 $ ', test(
', I2, ')=
', G12.5 )
subroutine xlaenv(ispec, nvalue)
XLAENV
subroutine alasvm(type, nout, nfail, nrun, nerrs)
ALASVM
subroutine alahd(iounit, path)
ALAHD
subroutine alaerh(path, subnam, info, infoe, opts, m, n, kl, ku, n5, imat, nfail, nerrs, nout)
ALAERH
subroutine cgels(trans, m, n, nrhs, a, lda, b, ldb, work, lwork, info)
CGELS solves overdetermined or underdetermined systems for GE matrices
subroutine cgelsy(m, n, nrhs, a, lda, b, ldb, jpvt, rcond, rank, work, lwork, rwork, info)
CGELSY solves overdetermined or underdetermined systems for GE matrices
subroutine cgetsls(trans, m, n, nrhs, a, lda, b, ldb, work, lwork, info)
CGETSLS
subroutine cgelss(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, lwork, rwork, info)
CGELSS solves overdetermined or underdetermined systems for GE matrices
subroutine cgelsd(m, n, nrhs, a, lda, b, ldb, s, rcond, rank, work, lwork, rwork, iwork, info)
CGELSD computes the minimum-norm solution to a linear least squares problem for GE matrices
subroutine clacpy(uplo, m, n, a, lda, b, ldb)
CLACPY copies all or part of one two-dimensional array to another.
subroutine clarnv(idist, iseed, n, x)
CLARNV returns a vector of random numbers from a uniform or normal distribution.
subroutine csscal(n, sa, cx, incx)
CSSCAL
subroutine cgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
CGEMM
subroutine cqrt13(scale, m, n, a, lda, norma, iseed)
CQRT13
subroutine cqrt16(trans, m, n, nrhs, a, lda, x, ldx, b, ldb, rwork, resid)
CQRT16
subroutine cdrvls(dotype, nm, mval, nn, nval, nns, nsval, nnb, nbval, nxval, thresh, tsterr, a, copya, b, copyb, c, s, copys, nout)
CDRVLS
subroutine cerrls(path, nunit)
CERRLS
subroutine cqrt15(scale, rksel, m, n, nrhs, a, lda, b, ldb, s, rank, norma, normb, iseed, work, lwork)
CQRT15
subroutine saxpy(n, sa, sx, incx, sy, incy)
SAXPY