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
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 ), ( 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,
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'
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
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
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.GE.
IF( RESULT( K )THRESH ) THEN
819.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
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 )