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,
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 ) = 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 IF( ( itran.EQ.1 .AND. m.GE.n ) .OR.
586 $ ( itran.EQ.2 .AND. m.LT.n ) )
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 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 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 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 dlarnv(IDIST, ISEED, N, X)
DLARNV returns a vector of random numbers from a uniform or normal distribution.
subroutine dlacpy(UPLO, M, N, A, LDA, B, LDB)
DLACPY 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 dlasrt(ID, N, D, INFO)
DLASRT sorts numbers in increasing or decreasing order.
subroutine dscal(N, DA, DX, INCX)
DSCAL
subroutine daxpy(N, DA, DX, INCX, DY, INCY)
DAXPY
subroutine dgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
DGEMM
subroutine derrls(PATH, NUNIT)
DERRLS
subroutine dqrt15(SCALE, RKSEL, M, N, NRHS, A, LDA, B, LDB, S, RANK, NORMA, NORMB, ISEED, WORK, LWORK)
DQRT15
subroutine ddrvls(DOTYPE, NM, MVAL, NN, NVAL, NNS, NSVAL, NNB, NBVAL, NXVAL, THRESH, TSTERR, A, COPYA, B, COPYB, C, S, COPYS, NOUT)
DDRVLS
subroutine dqrt13(SCALE, M, N, A, LDA, NORMA, ISEED)
DQRT13
subroutine dqrt16(TRANS, M, N, NRHS, A, LDA, X, LDX, B, LDB, RWORK, RESID)
DQRT16
subroutine dgels(TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK, INFO)
DGELS solves overdetermined or underdetermined systems for GE matrices
subroutine dgetsls(TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK, INFO)
DGETSLS
subroutine dgelsy(M, N, NRHS, A, LDA, B, LDB, JPVT, RCOND, RANK, WORK, LWORK, INFO)
DGELSY solves overdetermined or underdetermined systems for GE matrices
subroutine dgelsd(M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK, WORK, LWORK, IWORK, INFO)
DGELSD computes the minimum-norm solution to a linear least squares problem for GE matrices
subroutine dgelss(M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK, WORK, LWORK, INFO)
DGELSS solves overdetermined or underdetermined systems for GE matrices