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, 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_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 :: WORK (:)
238 INTEGER,
ALLOCATABLE :: IWORK (:)
241 DOUBLE PRECISION DASUM, DLAMCH, DQRT12, DQRT14, DQRT17
242 EXTERNAL DASUM, DLAMCH, DQRT12, DQRT14, DQRT17
251 INTRINSIC dble, int, log,
max,
min, 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 ) =
'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 IF( nrows.GT.0 .AND. nrhs.GT.0 )
476 $
CALL dlacpy(
'Full', nrows, nrhs,
477 $ copyb, ldb, c, ldb )
478 CALL dqrt16( trans, m, n, nrhs, copya,
482 IF( ( itran.EQ.1 .AND. m.GE.n ) .OR.
483 $ ( itran.EQ.2 .AND. m.LT.n ) )
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 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 dqrt13( 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 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 IF( m.GT.0 .AND. n.GT.0 )
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 IF( nrows.GT.0 .AND. nrhs.GT.0 )
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 )