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( 1 )
237 REAL RESULT( NTESTS ), WQ( 1 )
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 ), -1, info )
362 lwork_sgels = int( wq( 1 ) )
364 CALL sgetsls( trans, m, n, nrhs, a, lda,
365 $ b, ldb, wq( 1 ), -1, info )
366 lwork_sgetsls = int( wq( 1 ) )
370 CALL sgelsy( m, n, nrhs, a, lda, b, ldb, iwq,
371 $ rcond, crank, wq, -1, info )
372 lwork_sgelsy = int( wq( 1 ) )
374 CALL sgelss( m, n, nrhs, a, lda, b, ldb, s,
375 $ rcond, crank, wq, -1 , info )
376 lwork_sgelss = int( wq( 1 ) )
378 CALL sgelsd( m, n, nrhs, a, lda, b, ldb, s,
379 $ rcond, crank, wq, -1, iwq, info )
380 lwork_sgelsd = int( wq( 1 ) )
382 liwork = max( liwork, n, iwq( 1 ) )
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 )