191 SUBROUTINE sdrvls( DOTYPE, NM, MVAL, NN, NVAL, NNS, NSVAL, NNB,
192 $ NBVAL, NXVAL, THRESH, TSTERR, A, COPYA, B,
193 $ COPYB, C, S, COPYS, NOUT )
202 INTEGER NM, NN, NNB, NNS, NOUT
207 INTEGER MVAL( * ), NBVAL( * ), NSVAL( * ),
208 $ nval( * ), nxval( * )
209 REAL A( * ), B( * ), C( * ), COPYA( * ), COPYB( * ),
217 parameter( ntests = 16 )
219 parameter( smlsiz = 25 )
221 parameter( one = 1.0e0, two = 2.0e0, zero = 0.0e0 )
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,
231 $ lwork_sgels, lwork_sgetsls, lwork_sgelss,
232 $ lwork_sgelsy, lwork_sgelsd
233 REAL EPS, NORMA, NORMB, RCOND
236 INTEGER ISEED( 4 ), ISEEDY( 4 ), IWQ
237 REAL RESULT( ntests ), WQ
240 REAL,
ALLOCATABLE :: WORK (:)
241 INTEGER,
ALLOCATABLE :: IWORK (:)
244 REAL SASUM, SLAMCH, SQRT12, SQRT14, SQRT17
245 EXTERNAL sasum, slamch, sqrt12, sqrt14, sqrt17
254 INTRINSIC int, log, max, min,
REAL, SQRT
259 INTEGER INFOT, IOUNIT
262 COMMON / infoc / infot, iounit, ok, lerr
263 COMMON / srnamc / srnamt
266 DATA iseedy / 1988, 1989, 1990, 1991 /
272 path( 1: 1 ) =
'SINGLE PRECISION' 278 iseed( i ) = iseedy( i )
280 eps = slamch(
'Epsilon' )
284 rcond = sqrt( eps ) - ( sqrt( eps )-eps ) / 2
291 $
CALL serrls( path, nout )
295 IF( ( nm.EQ.0 .OR. nn.EQ.0 ) .AND. thresh.EQ.zero )
296 $
CALL alahd( nout, path )
307 IF ( mval( i ).GT.mmax )
THEN 312 IF ( nval( i ).GT.nmax )
THEN 317 IF ( nsval( i ).GT.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 ) )
343 mnmin = max(min( m, n ),1)
349 itype = ( irank-1 )*3 + iscale
350 IF( dotype( itype ) )
THEN 351 IF( irank.EQ.1 )
THEN 353 IF( itran.EQ.1 )
THEN 360 CALL sgels( trans, m, n, nrhs, a, lda,
361 $ b, ldb, wq, -1, info )
362 lwork_sgels = int( wq )
364 CALL sgetsls( trans, m, n, nrhs, a, lda,
365 $ b, ldb, wq, -1, info )
366 lwork_sgetsls = int( wq )
370 CALL sgelsy( m, n, nrhs, a, lda, b, ldb, iwq,
371 $ rcond, crank, wq, -1, info )
372 lwork_sgelsy = int( wq )
374 CALL sgelss( m, n, nrhs, a, lda, b, ldb, s,
375 $ rcond, crank, wq, -1 , info )
376 lwork_sgelss = int( wq )
378 CALL sgelsd( m, n, nrhs, a, lda, b, ldb, s,
379 $ rcond, crank, wq, -1, iwq, info )
380 lwork_sgelsd = int( wq )
382 liwork = max( liwork, n, iwq )
384 lwork = max( lwork, lwork_sgels, lwork_sgetsls,
385 $ lwork_sgelsy, lwork_sgelss,
396 ALLOCATE( work( lwork ) )
397 ALLOCATE( iwork( liwork ) )
405 mnmin = max(min( m, n ),1)
414 itype = ( irank-1 )*3 + iscale
415 IF( .NOT.dotype( itype ) )
418 IF( irank.EQ.1 )
THEN 424 CALL sqrt13( iscale, m, n, copya, lda, norma,
429 CALL xlaenv( 3, nxval( inb ) )
432 IF( itran.EQ.1 )
THEN 441 ldwork = max( 1, ncols )
445 IF( ncols.GT.0 )
THEN 446 CALL slarnv( 2, iseed, ncols*nrhs,
448 CALL sscal( ncols*nrhs,
449 $ one /
REAL( NCOLS ), WORK,
452 CALL sgemm( trans,
'No transpose', nrows,
453 $ nrhs, ncols, one, copya, lda,
454 $ work, ldwork, zero, b, ldb )
455 CALL slacpy(
'Full', nrows, nrhs, b, ldb,
460 IF( m.GT.0 .AND. n.GT.0 )
THEN 461 CALL slacpy(
'Full', m, n, copya, lda,
463 CALL slacpy(
'Full', nrows, nrhs,
464 $ copyb, ldb, b, ldb )
467 CALL sgels( trans, m, n, nrhs, a, lda, b,
468 $ ldb, work, lwork, info )
470 $
CALL alaerh( path,
'SGELS ', info, 0,
471 $ trans, m, n, nrhs, -1, nb,
472 $ itype, nfail, nerrs,
477 ldwork = max( 1, nrows )
478 IF( nrows.GT.0 .AND. nrhs.GT.0 )
479 $
CALL slacpy(
'Full', nrows, nrhs,
480 $ copyb, ldb, c, ldb )
481 CALL sqrt16( trans, m, n, nrhs, copya,
482 $ lda, b, ldb, c, ldb, work,
485 IF( ( itran.EQ.1 .AND. m.GE.n ) .OR.
486 $ ( itran.EQ.2 .AND. m.LT.n ) )
THEN 490 result( 2 ) = sqrt17( trans, 1, m, n,
491 $ nrhs, copya, lda, b, ldb,
492 $ copyb, ldb, c, work,
498 result( 2 ) = sqrt14( trans, m, n,
499 $ nrhs, copya, lda, b, ldb,
507 IF( result( k ).GE.thresh )
THEN 508 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
509 $
CALL alahd( nout, path )
510 WRITE( nout, fmt = 9999 )trans, m,
511 $ n, nrhs, nb, itype, k,
525 CALL sqrt13( iscale, m, n, copya, lda, norma,
535 IF( itran.EQ.1 )
THEN 544 ldwork = max( 1, ncols )
548 IF( ncols.GT.0 )
THEN 549 CALL slarnv( 2, iseed, ncols*nrhs,
551 CALL sscal( ncols*nrhs,
552 $ one /
REAL( NCOLS ), WORK,
555 CALL sgemm( trans,
'No transpose', nrows,
556 $ nrhs, ncols, one, copya, lda,
557 $ work, ldwork, zero, b, ldb )
558 CALL slacpy(
'Full', nrows, nrhs, b, ldb,
563 IF( m.GT.0 .AND. n.GT.0 )
THEN 564 CALL slacpy(
'Full', m, n, copya, lda,
566 CALL slacpy(
'Full', nrows, nrhs,
567 $ copyb, ldb, b, ldb )
570 CALL sgetsls( trans, m, n, nrhs, a,
571 $ lda, b, ldb, work, lwork, info )
573 $
CALL alaerh( path,
'SGETSLS ', info, 0,
574 $ trans, m, n, nrhs, -1, nb,
575 $ itype, nfail, nerrs,
580 ldwork = max( 1, nrows )
581 IF( nrows.GT.0 .AND. nrhs.GT.0 )
582 $
CALL slacpy(
'Full', nrows, nrhs,
583 $ copyb, ldb, c, ldb )
584 CALL sqrt16( trans, m, n, nrhs, copya,
585 $ lda, b, ldb, c, ldb, work,
588 IF( ( itran.EQ.1 .AND. m.GE.n ) .OR.
589 $ ( itran.EQ.2 .AND. m.LT.n ) )
THEN 593 result( 16 ) = sqrt17( trans, 1, m, n,
594 $ nrhs, copya, lda, b, ldb,
595 $ copyb, ldb, c, work,
601 result( 16 ) = sqrt14( trans, m, n,
602 $ nrhs, copya, lda, b, ldb,
610 IF( result( k ).GE.thresh )
THEN 611 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
612 $
CALL alahd( nout, path )
613 WRITE( nout, fmt = 9997 )trans, m,
614 $ n, nrhs, mb, nb, itype, k,
628 CALL sqrt15( iscale, irank, m, n, nrhs, copya, lda,
629 $ copyb, ldb, copys, rank, norma, normb,
630 $ iseed, work, lwork )
641 CALL xlaenv( 3, nxval( inb ) )
656 CALL slacpy(
'Full', m, n, copya, lda, a, lda )
657 CALL slacpy(
'Full', m, nrhs, copyb, ldb, b,
661 CALL sgelsy( m, n, nrhs, a, lda, b, ldb, iwork,
662 $ rcond, crank, work, lwlsy, info )
664 $
CALL alaerh( path,
'SGELSY', info, 0,
' ', m,
665 $ n, nrhs, -1, nb, itype, nfail,
671 result( 3 ) = sqrt12( crank, crank, a, lda,
672 $ copys, work, lwork )
677 CALL slacpy(
'Full', m, nrhs, copyb, ldb, work,
679 CALL sqrt16(
'No transpose', m, n, nrhs, copya,
680 $ lda, b, ldb, work, ldwork,
681 $ work( m*nrhs+1 ), result( 4 ) )
688 $ result( 5 ) = sqrt17(
'No transpose', 1, m,
689 $ n, nrhs, copya, lda, b, ldb,
690 $ copyb, ldb, c, work, lwork )
698 $ result( 6 ) = sqrt14(
'No transpose', m, n,
699 $ nrhs, copya, lda, b, ldb,
708 CALL slacpy(
'Full', m, n, copya, lda, a, lda )
709 CALL slacpy(
'Full', m, nrhs, copyb, ldb, b,
712 CALL sgelss( m, n, nrhs, a, lda, b, ldb, s,
713 $ rcond, crank, work, lwork, info )
715 $
CALL alaerh( path,
'SGELSS', info, 0,
' ', m,
716 $ n, nrhs, -1, nb, itype, nfail,
725 CALL saxpy( mnmin, -one, copys, 1, s, 1 )
726 result( 7 ) = sasum( mnmin, s, 1 ) /
727 $ sasum( mnmin, copys, 1 ) /
728 $ ( eps*
REAL( MNMIN ) )
735 CALL slacpy(
'Full', m, nrhs, copyb, ldb, work,
737 CALL sqrt16(
'No transpose', m, n, nrhs, copya,
738 $ lda, b, ldb, work, ldwork,
739 $ work( m*nrhs+1 ), result( 8 ) )
745 $ result( 9 ) = sqrt17(
'No transpose', 1, m,
746 $ n, nrhs, copya, lda, b, ldb,
747 $ copyb, ldb, c, work, lwork )
753 $ result( 10 ) = sqrt14(
'No transpose', m, n,
754 $ nrhs, copya, lda, b, ldb,
769 CALL slacpy(
'Full', m, n, copya, lda, a, lda )
770 CALL slacpy(
'Full', m, nrhs, copyb, ldb, b,
774 CALL sgelsd( m, n, nrhs, a, lda, b, ldb, s,
775 $ rcond, crank, work, lwork, iwork,
778 $
CALL alaerh( path,
'SGELSD', info, 0,
' ', m,
779 $ n, nrhs, -1, nb, itype, nfail,
785 CALL saxpy( mnmin, -one, copys, 1, s, 1 )
786 result( 11 ) = sasum( mnmin, s, 1 ) /
787 $ sasum( mnmin, copys, 1 ) /
788 $ ( eps*
REAL( MNMIN ) )
795 CALL slacpy(
'Full', m, nrhs, copyb, ldb, work,
797 CALL sqrt16(
'No transpose', m, n, nrhs, copya,
798 $ lda, b, ldb, work, ldwork,
799 $ work( m*nrhs+1 ), result( 12 ) )
805 $ result( 13 ) = sqrt17(
'No transpose', 1, m,
806 $ n, nrhs, copya, lda, b, ldb,
807 $ copyb, ldb, c, work, lwork )
813 $ result( 14 ) = sqrt14(
'No transpose', m, n,
814 $ nrhs, copya, lda, b, ldb,
821 IF( result( k ).GE.thresh )
THEN 822 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
823 $
CALL alahd( nout, path )
824 WRITE( nout, fmt = 9998 )m, n, nrhs, nb,
825 $ itype, k, result( k )
840 CALL alasvm( path, nout, nfail, nrun, nerrs )
842 9999
FORMAT(
' TRANS=''', a1,
''', M=', i5,
', N=', i5,
', NRHS=', i4,
843 $
', NB=', i4,
', type', i2,
', test(', i2,
')=', g12.5 )
844 9998
FORMAT(
' M=', i5,
', N=', i5,
', NRHS=', i4,
', NB=', i4,
845 $
', type', i2,
', test(', i2,
')=', g12.5 )
846 9997
FORMAT(
' TRANS=''', a1,
' M=', i5,
', N=', i5,
', NRHS=', i4,
847 $
', MB=', i4,
', NB=', i4,
', type', i2,
848 $
', test(', i2,
')=', g12.5 )
subroutine alasvm(TYPE, NOUT, NFAIL, NRUN, NERRS)
ALASVM
subroutine alahd(IOUNIT, PATH)
ALAHD
subroutine sqrt16(TRANS, M, N, NRHS, A, LDA, X, LDX, B, LDB, RWORK, RESID)
SQRT16
subroutine sgelss(M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK, WORK, LWORK, INFO)
SGELSS solves overdetermined or underdetermined systems for GE matrices
subroutine sgelsd(M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK, WORK, LWORK, IWORK, INFO)
SGELSD computes the minimum-norm solution to a linear least squares problem for GE matrices ...
subroutine alaerh(PATH, SUBNAM, INFO, INFOE, OPTS, M, N, KL, KU, N5, IMAT, NFAIL, NERRS, NOUT)
ALAERH
subroutine sgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
SGEMM
subroutine sgelsy(M, N, NRHS, A, LDA, B, LDB, JPVT, RCOND, RANK, WORK, LWORK, INFO)
SGELSY solves overdetermined or underdetermined systems for GE matrices
subroutine xlaenv(ISPEC, NVALUE)
XLAENV
subroutine sqrt15(SCALE, RKSEL, M, N, NRHS, A, LDA, B, LDB, S, RANK, NORMA, NORMB, ISEED, WORK, LWORK)
SQRT15
subroutine sgels(TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK, INFO)
SGELS solves overdetermined or underdetermined systems for GE matrices
subroutine sqrt13(SCALE, M, N, A, LDA, NORMA, ISEED)
SQRT13
subroutine sdrvls(DOTYPE, NM, MVAL, NN, NVAL, NNS, NSVAL, NNB, NBVAL, NXVAL, THRESH, TSTERR, A, COPYA, B, COPYB, C, S, COPYS, NOUT)
SDRVLS
subroutine saxpy(N, SA, SX, INCX, SY, INCY)
SAXPY
subroutine sgetsls(TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK, INFO)
subroutine slarnv(IDIST, ISEED, N, X)
SLARNV returns a vector of random numbers from a uniform or normal distribution.
subroutine sscal(N, SA, SX, INCX)
SSCAL
subroutine slacpy(UPLO, M, N, A, LDA, B, LDB)
SLACPY copies all or part of one two-dimensional array to another.
subroutine serrls(PATH, NUNIT)
SERRLS