189 SUBROUTINE sdrvls( 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 A( * ), B( * ), C( * ), COPYA( * ), COPYB( * ),
214 PARAMETER ( NTESTS = 16 )
216 parameter( smlsiz = 25 )
218 parameter( one = 1.0e0, two = 2.0e0, zero = 0.0e0 )
223 INTEGER CRANK, I, IM, IMB, IN, INB, INFO, INS, IRANK,
224 $ iscale, itran, itype, j, k, lda, ldb, ldwork,
225 $ lwlsy, lwork, m, mnmin, n, nb, ncols, nerrs,
226 $ nfail, nrhs, nrows, nrun, rank, mb,
227 $ mmax, nmax, nsmax, liwork,
228 $ lwork_sgels, lwork_sgetsls, lwork_sgelss,
229 $ lwork_sgelsy, lwork_sgelsd
230 REAL EPS, NORMA, NORMB, RCOND
233 INTEGER ISEED( 4 ), ISEEDY( 4 ), IWQ( 1 )
234 REAL RESULT( NTESTS ), WQ( 1 )
237 REAL,
ALLOCATABLE :: WORK (:)
238 INTEGER,
ALLOCATABLE :: IWORK (:)
241 REAL SASUM, SLAMCH, SQRT12, SQRT14, SQRT17
242 EXTERNAL SASUM, SLAMCH, SQRT12, SQRT14, SQRT17
251 INTRINSIC int, log, max, min, real, sqrt
256 INTEGER INFOT, IOUNIT
259 COMMON / infoc / infot, iounit, ok, lerr
260 COMMON / srnamc / srnamt
263 DATA iseedy / 1988, 1989, 1990, 1991 /
269 path( 1: 1 ) =
'SINGLE PRECISION'
275 iseed( i ) = iseedy( i )
277 eps = slamch(
'Epsilon' )
281 rcond = sqrt( eps ) - ( sqrt( eps )-eps ) / 2
288 $
CALL serrls( path, nout )
292 IF( ( nm.EQ.0 .OR. nn.EQ.0 ) .AND. thresh.EQ.zero )
293 $
CALL alahd( nout, path )
304 IF ( mval( i ).GT.mmax )
THEN
309 IF ( nval( i ).GT.nmax )
THEN
314 IF ( nsval( i ).GT.nsmax )
THEN
321 mnmin = max( min( m, n ), 1 )
326 lwork = max( 1, ( m+n )*nrhs,
327 $ ( n+nrhs )*( m+2 ), ( m+nrhs )*( n+2 ),
328 $ max( m+mnmin, nrhs*mnmin,2*n+m ),
329 $ max( m*n+4*mnmin+max(m,n), m*n+2*mnmin+4*n ) )
340 mnmin = max(min( m, n ),1)
346 itype = ( irank-1 )*3 + iscale
347 IF( dotype( itype ) )
THEN
348 IF( irank.EQ.1 )
THEN
350 IF( itran.EQ.1 )
THEN
357 CALL sgels( trans, m, n, nrhs, a, lda,
358 $ b, ldb, wq( 1 ), -1, info )
359 lwork_sgels = int( wq( 1 ) )
361 CALL sgetsls( trans, m, n, nrhs, a, lda,
362 $ b, ldb, wq( 1 ), -1, info )
363 lwork_sgetsls = int( wq( 1 ) )
367 CALL sgelsy( m, n, nrhs, a, lda, b, ldb, iwq,
368 $ rcond, crank, wq, -1, info )
369 lwork_sgelsy = int( wq( 1 ) )
371 CALL sgelss( m, n, nrhs, a, lda, b, ldb, s,
372 $ rcond, crank, wq, -1 , info )
373 lwork_sgelss = int( wq( 1 ) )
375 CALL sgelsd( m, n, nrhs, a, lda, b, ldb, s,
376 $ rcond, crank, wq, -1, iwq, info )
377 lwork_sgelsd = int( wq( 1 ) )
379 liwork = max( liwork, n, iwq( 1 ) )
381 lwork = max( lwork, lwork_sgels, lwork_sgetsls,
382 $ lwork_sgelsy, lwork_sgelss,
393 ALLOCATE( work( lwork ) )
394 ALLOCATE( iwork( liwork ) )
402 mnmin = max(min( m, n ),1)
411 itype = ( irank-1 )*3 + iscale
412 IF( .NOT.dotype( itype ) )
415 IF( irank.EQ.1 )
THEN
421 CALL sqrt13( iscale, m, n, copya, lda, norma,
426 CALL xlaenv( 3, nxval( inb ) )
429 IF( itran.EQ.1 )
THEN
438 ldwork = max( 1, ncols )
442 IF( ncols.GT.0 )
THEN
443 CALL slarnv( 2, iseed, ncols*nrhs,
445 CALL sscal( ncols*nrhs,
446 $ one / real( ncols ), work,
449 CALL sgemm( trans,
'No transpose', nrows,
450 $ nrhs, ncols, one, copya, lda,
451 $ work, ldwork, zero, b, ldb )
452 CALL slacpy(
'Full', nrows, nrhs, b, ldb,
457 IF( m.GT.0 .AND. n.GT.0 )
THEN
458 CALL slacpy(
'Full', m, n, copya, lda,
460 CALL slacpy(
'Full', nrows, nrhs,
461 $ copyb, ldb, b, ldb )
464 CALL sgels( trans, m, n, nrhs, a, lda, b,
465 $ ldb, work, lwork, info )
467 $
CALL alaerh( path,
'SGELS ', info, 0,
468 $ trans, m, n, nrhs, -1, nb,
469 $ itype, nfail, nerrs,
474 ldwork = max( 1, nrows )
475 IF( nrows.GT.0 .AND. nrhs.GT.0 )
476 $
CALL slacpy(
'Full', nrows, nrhs,
477 $ copyb, ldb, c, ldb )
478 CALL sqrt16( trans, m, n, nrhs, copya,
479 $ lda, b, ldb, c, ldb, work,
482 IF( ( itran.EQ.1 .AND. m.GE.n ) .OR.
483 $ ( itran.EQ.2 .AND. m.LT.n ) )
THEN
487 result( 2 ) = sqrt17( trans, 1, m, n,
488 $ nrhs, copya, lda, b, ldb,
489 $ copyb, ldb, c, work,
495 result( 2 ) = sqrt14( trans, m, n,
496 $ nrhs, copya, lda, b, ldb,
504 IF( result( k ).GE.thresh )
THEN
505 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
506 $
CALL alahd( nout, path )
507 WRITE( nout, fmt = 9999 )trans, m,
508 $ n, nrhs, nb, itype, k,
522 CALL sqrt13( iscale, m, n, copya, lda, norma,
532 IF( itran.EQ.1 )
THEN
541 ldwork = max( 1, ncols )
545 IF( ncols.GT.0 )
THEN
546 CALL slarnv( 2, iseed, ncols*nrhs,
548 CALL sscal( ncols*nrhs,
549 $ one / real( ncols ), work,
552 CALL sgemm( trans,
'No transpose', nrows,
553 $ nrhs, ncols, one, copya, lda,
554 $ work, ldwork, zero, b, ldb )
555 CALL slacpy(
'Full', nrows, nrhs, b, ldb,
560 IF( m.GT.0 .AND. n.GT.0 )
THEN
561 CALL slacpy(
'Full', m, n, copya, lda,
563 CALL slacpy(
'Full', nrows, nrhs,
564 $ copyb, ldb, b, ldb )
567 CALL sgetsls( trans, m, n, nrhs, a,
568 $ lda, b, ldb, work, lwork, info )
570 $
CALL alaerh( path,
'SGETSLS ', info, 0,
571 $ trans, m, n, nrhs, -1, nb,
572 $ itype, nfail, nerrs,
577 ldwork = max( 1, nrows )
578 IF( nrows.GT.0 .AND. nrhs.GT.0 )
579 $
CALL slacpy(
'Full', nrows, nrhs,
580 $ copyb, ldb, c, ldb )
581 CALL sqrt16( trans, m, n, nrhs, copya,
582 $ lda, b, ldb, c, ldb, work,
585 IF( ( itran.EQ.1 .AND. m.GE.n ) .OR.
586 $ ( itran.EQ.2 .AND. m.LT.n ) )
THEN
590 result( 16 ) = sqrt17( trans, 1, m, n,
591 $ nrhs, copya, lda, b, ldb,
592 $ copyb, ldb, c, work,
598 result( 16 ) = sqrt14( trans, m, n,
599 $ nrhs, copya, lda, b, ldb,
607 IF( result( k ).GE.thresh )
THEN
608 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
609 $
CALL alahd( nout, path )
610 WRITE( nout, fmt = 9997 )trans, m,
611 $ n, nrhs, mb, nb, itype, k,
625 CALL sqrt15( iscale, irank, m, n, nrhs, copya, lda,
626 $ copyb, ldb, copys, rank, norma, normb,
627 $ iseed, work, lwork )
638 CALL xlaenv( 3, nxval( inb ) )
653 CALL slacpy(
'Full', m, n, copya, lda, a, lda )
654 CALL slacpy(
'Full', m, nrhs, copyb, ldb, b,
658 CALL sgelsy( m, n, nrhs, a, lda, b, ldb, iwork,
659 $ rcond, crank, work, lwlsy, info )
661 $
CALL alaerh( path,
'SGELSY', info, 0,
' ', m,
662 $ n, nrhs, -1, nb, itype, nfail,
668 result( 3 ) = sqrt12( crank, crank, a, lda,
669 $ copys, work, lwork )
674 CALL slacpy(
'Full', m, nrhs, copyb, ldb, work,
676 CALL sqrt16(
'No transpose', m, n, nrhs, copya,
677 $ lda, b, ldb, work, ldwork,
678 $ work( m*nrhs+1 ), result( 4 ) )
685 $ result( 5 ) = sqrt17(
'No transpose', 1, m,
686 $ n, nrhs, copya, lda, b, ldb,
687 $ copyb, ldb, c, work, lwork )
695 $ result( 6 ) = sqrt14(
'No transpose', m, n,
696 $ nrhs, copya, lda, b, ldb,
705 CALL slacpy(
'Full', m, n, copya, lda, a, lda )
706 CALL slacpy(
'Full', m, nrhs, copyb, ldb, b,
709 CALL sgelss( m, n, nrhs, a, lda, b, ldb, s,
710 $ rcond, crank, work, lwork, info )
712 $
CALL alaerh( path,
'SGELSS', info, 0,
' ', m,
713 $ n, nrhs, -1, nb, itype, nfail,
722 CALL saxpy( mnmin, -one, copys, 1, s, 1 )
723 result( 7 ) = sasum( mnmin, s, 1 ) /
724 $ sasum( mnmin, copys, 1 ) /
725 $ ( eps*real( mnmin ) )
732 CALL slacpy(
'Full', m, nrhs, copyb, ldb, work,
734 CALL sqrt16(
'No transpose', m, n, nrhs, copya,
735 $ lda, b, ldb, work, ldwork,
736 $ work( m*nrhs+1 ), result( 8 ) )
742 $ result( 9 ) = sqrt17(
'No transpose', 1, m,
743 $ n, nrhs, copya, lda, b, ldb,
744 $ copyb, ldb, c, work, lwork )
750 $ result( 10 ) = sqrt14(
'No transpose', m, n,
751 $ nrhs, copya, lda, b, ldb,
766 CALL slacpy(
'Full', m, n, copya, lda, a, lda )
767 CALL slacpy(
'Full', m, nrhs, copyb, ldb, b,
771 CALL sgelsd( m, n, nrhs, a, lda, b, ldb, s,
772 $ rcond, crank, work, lwork, iwork,
775 $
CALL alaerh( path,
'SGELSD', info, 0,
' ', m,
776 $ n, nrhs, -1, nb, itype, nfail,
782 CALL saxpy( mnmin, -one, copys, 1, s, 1 )
783 result( 11 ) = sasum( mnmin, s, 1 ) /
784 $ sasum( mnmin, copys, 1 ) /
785 $ ( eps*real( mnmin ) )
792 CALL slacpy(
'Full', m, nrhs, copyb, ldb, work,
794 CALL sqrt16(
'No transpose', m, n, nrhs, copya,
795 $ lda, b, ldb, work, ldwork,
796 $ work( m*nrhs+1 ), result( 12 ) )
802 $ result( 13 ) = sqrt17(
'No transpose', 1, m,
803 $ n, nrhs, copya, lda, b, ldb,
804 $ copyb, ldb, c, work, lwork )
810 $ result( 14 ) = sqrt14(
'No transpose', m, n,
811 $ nrhs, copya, lda, b, ldb,
818 IF( result( k ).GE.thresh )
THEN
819 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
820 $
CALL alahd( nout, path )
821 WRITE( nout, fmt = 9998 )m, n, nrhs, nb,
822 $ itype, k, result( k )
837 CALL alasvm( path, nout, nfail, nrun, nerrs )
839 9999
FORMAT(
' TRANS=''', a1,
''', M=', i5,
', N=', i5,
', NRHS=', i4,
840 $
', NB=', i4,
', type', i2,
', test(', i2,
')=', g12.5 )
841 9998
FORMAT(
' M=', i5,
', N=', i5,
', NRHS=', i4,
', NB=', i4,
842 $
', type', i2,
', test(', i2,
')=', g12.5 )
843 9997
FORMAT(
' TRANS=''', a1,
' M=', i5,
', N=', i5,
', NRHS=', i4,
844 $
', MB=', i4,
', NB=', i4,
', type', i2,
845 $
', test(', i2,
')=', g12.5 )
subroutine slarnv(IDIST, ISEED, N, X)
SLARNV returns a vector of random numbers from a uniform or normal distribution.
subroutine slacpy(UPLO, M, N, A, LDA, B, LDB)
SLACPY copies all or part of one two-dimensional array to another.
subroutine alasvm(TYPE, NOUT, NFAIL, NRUN, NERRS)
ALASVM
subroutine xlaenv(ISPEC, NVALUE)
XLAENV
subroutine alahd(IOUNIT, PATH)
ALAHD
subroutine alaerh(PATH, SUBNAM, INFO, INFOE, OPTS, M, N, KL, KU, N5, IMAT, NFAIL, NERRS, NOUT)
ALAERH
subroutine sgels(TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK, INFO)
SGELS solves overdetermined or underdetermined systems for GE matrices
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 sgetsls(TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK, INFO)
SGETSLS
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 sgelsy(M, N, NRHS, A, LDA, B, LDB, JPVT, RCOND, RANK, WORK, LWORK, INFO)
SGELSY solves overdetermined or underdetermined systems for GE matrices
subroutine sscal(N, SA, SX, INCX)
SSCAL
subroutine saxpy(N, SA, SX, INCX, SY, INCY)
SAXPY
subroutine sgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
SGEMM
subroutine serrls(PATH, NUNIT)
SERRLS
subroutine sdrvls(DOTYPE, NM, MVAL, NN, NVAL, NNS, NSVAL, NNB, NBVAL, NXVAL, THRESH, TSTERR, A, COPYA, B, COPYB, C, S, COPYS, NOUT)
SDRVLS
subroutine sqrt13(SCALE, M, N, A, LDA, NORMA, ISEED)
SQRT13
subroutine sqrt15(SCALE, RKSEL, M, N, NRHS, A, LDA, B, LDB, S, RANK, NORMA, NORMB, ISEED, WORK, LWORK)
SQRT15
subroutine sqrt16(TRANS, M, N, NRHS, A, LDA, X, LDX, B, LDB, RWORK, RESID)
SQRT16