189 SUBROUTINE ddrvls( 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
200 DOUBLE PRECISION THRESH
204 INTEGER MVAL( * ), NBVAL( * ), NSVAL( * ),
205 $ nval( * ), nxval( * )
206 DOUBLE PRECISION A( * ), B( * ), C( * ), COPYA( * ), COPYB( * ),
214 PARAMETER ( NTESTS = 16 )
216 parameter( smlsiz = 25 )
217 DOUBLE PRECISION ONE, TWO, ZERO
218 parameter( one = 1.0d0, two = 2.0d0, zero = 0.0d0 )
223 INTEGER CRANK, I, IM, IMB, IN, INB, , 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_dgels, lwork_dgetsls, lwork_dgelss,
229 $ lwork_dgelsy, lwork_dgelsd
230 DOUBLE PRECISION EPS, NORMA, NORMB, RCOND
233 INTEGER ISEED( 4 ), ISEEDY( 4 ), IWQ( 1 )
234 DOUBLE PRECISION RESULT( NTESTS ), WQ( 1 )
237 DOUBLE PRECISION,
ALLOCATABLE :: (:)
238 INTEGER,
ALLOCATABLE :: IWORK (:)
241 DOUBLE PRECISION DASUM, DLAMCH, DQRT12, DQRT14, DQRT17
242 EXTERNAL DASUM, DLAMCH, DQRT12, DQRT14, DQRT17
251 INTRINSIC dble, int, log,
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 ) =
'Double precision'
275 iseed( i ) = iseedy( i )
277 eps = dlamch(
'Epsilon' )
281 rcond = sqrt( eps ) - ( sqrt( eps )-eps ) / 2
288 $
CALL derrls( 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 dgels( trans, m, n, nrhs, a, lda,
358 $ b, ldb, wq, -1, info )
359 lwork_dgels = int( wq( 1 ) )
361 CALL dgetsls( trans, m, n, nrhs, a, lda,
362 $ b, ldb, wq, -1, info )
363 lwork_dgetsls = int( wq( 1 ) )
367 CALL dgelsy( m, n, nrhs, a, lda, b, ldb, iwq,
368 $ rcond, crank, wq, -1, info )
369 lwork_dgelsy = int( wq( 1 ) )
371 CALL dgelss( m, n, nrhs, a, lda, b, ldb, s,
372 $ rcond, crank, wq, -1 , info )
373 lwork_dgelss = int( wq( 1 ) )
375 CALL dgelsd( m, n, nrhs, a, lda, b, ldb, s,
376 $ rcond, crank, wq, -1, iwq, info )
377 lwork_dgelsd = int( wq( 1 ) )
379 liwork =
max( liwork, n, iwq( 1 ) )
381 lwork =
max( lwork, lwork_dgels, lwork_dgetsls,
382 $ lwork_dgelsy, lwork_dgelss,
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 dqrt13( 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 dlarnv( 2, iseed, ncols*nrhs,
445 CALL dscal( ncols*nrhs,
446 $ one / dble( ncols ), work,
449 CALL dgemm( trans,
'No transpose', nrows,
450 $ nrhs, ncols, one, copya, lda,
451 $ work, ldwork, zero, b, ldb )
452 CALL dlacpy(
'Full', nrows, nrhs, b, ldb,
457 IF( m.GT.0 .AND. n.GT.0 )
THEN
458 CALL dlacpy(
'Full', m, n, copya, lda,
460 CALL dlacpy(
'Full', nrows, nrhs,
461 $ copyb, ldb, b, ldb )
464 CALL DGELS( TRANS, M, N, NRHS, A, LDA, B,
465 $ LDB, WORK, LWORK, INFO )
467 $ CALL ALAERH( PATH, 'dgels ', INFO, 0,
468 $ TRANS, M, N, NRHS, -1, NB,
469 $ ITYPE, NFAIL, NERRS,
474 LDWORK = MAX( 1, NROWS )
475.GT..AND..GT.
IF( NROWS0 NRHS0 )
476 $ CALL DLACPY( 'full
', NROWS, NRHS,
477 $ COPYB, LDB, C, LDB )
478 CALL DQRT16( TRANS, M, N, NRHS, COPYA,
479 $ LDA, B, LDB, C, LDB, WORK,
482.EQ..AND..GE..OR.
IF( ( ITRAN1 MN )
483.EQ..AND..LT.
$ ( ITRAN2 MN ) ) THEN
487 RESULT( 2 ) = DQRT17( TRANS, 1, M, N,
488 $ NRHS, COPYA, LDA, B, LDB,
489 $ COPYB, LDB, C, WORK,
495 RESULT( 2 ) = DQRT14( TRANS, M, N,
496 $ NRHS, COPYA, LDA, B, LDB,
504.GE.
IF( RESULT( K )THRESH ) THEN
505.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
506 $ CALL ALAHD( NOUT, PATH )
507 WRITE( NOUT, FMT = 9999 )TRANS, M,
508 $ N, NRHS, NB, ITYPE, K,
522 CALL DQRT13( ISCALE, M, N, COPYA, LDA, NORMA,
532.EQ.
IF( ITRAN1 ) THEN
541 LDWORK = MAX( 1, NCOLS )
545.GT.
IF( NCOLS0 ) THEN
546 CALL DLARNV( 2, ISEED, NCOLS*NRHS,
548 CALL DSCAL( NCOLS*NRHS,
549 $ ONE / DBLE( NCOLS ), WORK,
552 CALL DGEMM( TRANS, 'no transpose
', NROWS,
553 $ NRHS, NCOLS, ONE, COPYA, LDA,
554 $ WORK, LDWORK, ZERO, B, LDB )
555 CALL DLACPY( 'full
', NROWS, NRHS, B, LDB,
560.GT..AND..GT.
IF( M0 N0 ) THEN
561 CALL DLACPY( 'full
', M, N, COPYA, LDA,
563 CALL DLACPY( 'full
', NROWS, NRHS,
564 $ COPYB, LDB, B, LDB )
567 CALL DGETSLS( TRANS, M, N, NRHS, A,
568 $ LDA, B, LDB, WORK, LWORK, INFO )
570 $ CALL ALAERH( PATH, 'dgetsls ', INFO, 0,
571 $ TRANS, M, N, NRHS, -1, NB,
572 $ ITYPE, NFAIL, NERRS,
577 LDWORK = MAX( 1, NROWS )
578.GT..AND..GT.
IF( NROWS0 NRHS0 )
579 $ CALL DLACPY( 'full
', NROWS, NRHS,
580 $ COPYB, LDB, C, LDB )
581 CALL DQRT16( TRANS, M, N, NRHS, COPYA,
582 $ LDA, B, LDB, C, LDB, WORK,
585.EQ..AND..GE..OR.
IF( ( ITRAN1 MN )
586.EQ..AND..LT.
$ ( ITRAN2 MN ) ) THEN
590 RESULT( 16 ) = DQRT17( TRANS, 1, M, N,
591 $ NRHS, COPYA, LDA, B, LDB,
592 $ COPYB, LDB, C, WORK,
598 RESULT( 16 ) = DQRT14( TRANS, M, N,
599 $ NRHS, COPYA, LDA, B, LDB,
607.GE.
IF( RESULT( K )THRESH ) THEN
608.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
609 $ CALL ALAHD( NOUT, PATH )
610 WRITE( NOUT, FMT = 9997 )TRANS, M,
611 $ N, NRHS, MB, NB, ITYPE, K,
625 CALL DQRT15( 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 DLACPY( 'full
', M, N, COPYA, LDA, A, LDA )
654 CALL DLACPY( 'full
', M, NRHS, COPYB, LDB, B,
658 CALL DGELSY( M, N, NRHS, A, LDA, B, LDB, IWORK,
659 $ RCOND, CRANK, WORK, LWLSY, INFO )
661 $ CALL ALAERH( PATH, 'dgelsy', INFO, 0, ' ', M,
662 $ N, NRHS, -1, NB, ITYPE, NFAIL,
668 RESULT( 3 ) = DQRT12( CRANK, CRANK, A, LDA,
669 $ COPYS, WORK, LWORK )
674 CALL DLACPY( 'full
', M, NRHS, COPYB, LDB, WORK,
676 CALL DQRT16( 'no transpose
', M, N, NRHS, COPYA,
677 $ LDA, B, LDB, WORK, LDWORK,
678 $ WORK( M*NRHS+1 ), RESULT( 4 ) )
685 $ RESULT( 5 ) = DQRT17( 'no transpose
', 1, M,
686 $ N, NRHS, COPYA, LDA, B, LDB,
687 $ COPYB, LDB, C, WORK, LWORK )
695 $ RESULT( 6 ) = DQRT14( 'no transpose
', M, N,
696 $ NRHS, COPYA, LDA, B, LDB,
705 CALL DLACPY( 'full
', M, N, COPYA, LDA, A, LDA )
706 CALL DLACPY( 'full
', M, NRHS, COPYB, LDB, B,
709 CALL DGELSS( M, N, NRHS, A, LDA, B, LDB, S,
710 $ RCOND, CRANK, WORK, LWORK, INFO )
712 $ CALL ALAERH( PATH, 'dgelss', INFO, 0, ' ', M,
713 $ N, NRHS, -1, NB, ITYPE, NFAIL,
722 CALL DAXPY( MNMIN, -ONE, COPYS, 1, S, 1 )
723 RESULT( 7 ) = DASUM( MNMIN, S, 1 ) /
724 $ DASUM( MNMIN, COPYS, 1 ) /
725 $ ( EPS*DBLE( MNMIN ) )
732 CALL DLACPY( 'full
', M, NRHS, COPYB, LDB, WORK,
734 CALL DQRT16( 'no transpose
', M, N, NRHS, COPYA,
735 $ LDA, B, LDB, WORK, LDWORK,
736 $ WORK( M*NRHS+1 ), RESULT( 8 ) )
742 $ RESULT( 9 ) = DQRT17( 'no transpose
', 1, M,
743 $ N, NRHS, COPYA, LDA, B, LDB,
744 $ COPYB, LDB, C, WORK, LWORK )
750 $ RESULT( 10 ) = DQRT14( 'no transpose
', M, N,
751 $ NRHS, COPYA, LDA, B, LDB,
766 CALL DLACPY( 'full
', M, N, COPYA, LDA, A, LDA )
767 CALL DLACPY( 'full
', M, NRHS, COPYB, LDB, B,
771 CALL DGELSD( M, N, NRHS, A, LDA, B, LDB, S,
772 $ RCOND, CRANK, WORK, LWORK, IWORK,
775 $ CALL ALAERH( PATH, 'dgelsd', INFO, 0, ' ', M,
776 $ N, NRHS, -1, NB, ITYPE, NFAIL,
782 CALL DAXPY( MNMIN, -ONE, COPYS, 1, S, 1 )
783 RESULT( 11 ) = DASUM( MNMIN, S, 1 ) /
784 $ DASUM( MNMIN, COPYS, 1 ) /
785 $ ( EPS*DBLE( MNMIN ) )
792 CALL DLACPY( 'full
', M, NRHS, COPYB, LDB, WORK,
794 CALL DQRT16( 'no transpose
', M, N, NRHS, COPYA,
795 $ LDA, B, LDB, WORK, LDWORK,
796 $ WORK( M*NRHS+1 ), RESULT( 12 ) )
802 $ RESULT( 13 ) = DQRT17( 'no transpose
', 1, M,
803 $ N, NRHS, COPYA, LDA, B, LDB,
804 $ COPYB, LDB, C, WORK, LWORK )
810 $ RESULT( 14 ) = DQRT14( '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 )