202 INTEGER nm, nn, nnb, nns, nout
203 DOUBLE PRECISION thresh
207 INTEGER mval( * ), nbval( * ), nsval( * ),
208 $ nval( * ), nxval( * )
209 DOUBLE PRECISION a( * ), b( * ), c( * ), copya( * ), copyb( * ),
217 parameter( ntests = 16 )
219 parameter( smlsiz = 25 )
220 DOUBLE PRECISION one, two, zero
221 parameter( one = 1.0d0, two = 2.0d0, zero = 0.0d0 )
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_dgels, lwork_dgetsls, lwork_dgelss,
232 $ lwork_dgelsy, lwork_dgelsd
233 DOUBLE PRECISION eps, norma, normb, rcond
236 INTEGER iseed( 4 ), iseedy( 4 ), iwq
237 DOUBLE PRECISION result( ntests ), wq
240 DOUBLE PRECISION,
ALLOCATABLE :: work (:)
241 INTEGER,
ALLOCATABLE :: iwork (:)
254 INTRINSIC dble, int, log, max, min, 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 ) =
'Double precision' 278 iseed( i ) = iseedy( i )
284 rcond = sqrt( eps ) - ( sqrt( eps )-eps ) / 2
291 $
CALL derrls( 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 dgels( trans, m, n, nrhs, a, lda,
361 $ b, ldb, wq, -1, info )
362 lwork_dgels = int( wq )
364 CALL dgetsls( trans, m, n, nrhs, a, lda,
365 $ b, ldb, wq, -1, info )
366 lwork_dgetsls = int( wq )
370 CALL dgelsy( m, n, nrhs, a, lda, b, ldb, iwq,
371 $ rcond, crank, wq, -1, info )
372 lwork_dgelsy = int( wq )
374 CALL dgelss( m, n, nrhs, a, lda, b, ldb, s,
375 $ rcond, crank, wq, -1 , info )
376 lwork_dgelss = int( wq )
378 CALL dgelsd( m, n, nrhs, a, lda, b, ldb, s,
379 $ rcond, crank, wq, -1, iwq, info )
380 lwork_dgelsd = int( wq )
382 liwork = max( liwork, n, iwq )
384 lwork = max( lwork, lwork_dgels, lwork_dgetsls,
385 $ lwork_dgelsy, lwork_dgelss,
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 dqrt13( 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 dlarnv( 2, iseed, ncols*nrhs,
448 CALL dscal( ncols*nrhs,
449 $ one / dble( ncols ), work,
452 CALL dgemm( trans,
'No transpose', nrows,
453 $ nrhs, ncols, one, copya, lda,
454 $ work, ldwork, zero, b, ldb )
455 CALL dlacpy(
'Full', nrows, nrhs, b, ldb,
460 IF( m.GT.0 .AND. n.GT.0 )
THEN 461 CALL dlacpy(
'Full', m, n, copya, lda,
463 CALL dlacpy(
'Full', nrows, nrhs,
464 $ copyb, ldb, b, ldb )
467 CALL dgels( trans, m, n, nrhs, a, lda, b,
468 $ ldb, work, lwork, info )
470 $
CALL alaerh( path,
'DGELS ', 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 dlacpy(
'Full', nrows, nrhs,
480 $ copyb, ldb, c, ldb )
481 CALL dqrt16( 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 ) =
dqrt17( trans, 1, m, n,
491 $ nrhs, copya, lda, b, ldb,
492 $ copyb, ldb, c, work,
498 result( 2 ) =
dqrt14( 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 dqrt13( 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 dlarnv( 2, iseed, ncols*nrhs,
551 CALL dscal( ncols*nrhs,
552 $ one / dble( ncols ), work,
555 CALL dgemm( trans,
'No transpose', nrows,
556 $ nrhs, ncols, one, copya, lda,
557 $ work, ldwork, zero, b, ldb )
558 CALL dlacpy(
'Full', nrows, nrhs, b, ldb,
563 IF( m.GT.0 .AND. n.GT.0 )
THEN 564 CALL dlacpy(
'Full', m, n, copya, lda,
566 CALL dlacpy(
'Full', nrows, nrhs,
567 $ copyb, ldb, b, ldb )
570 CALL dgetsls( trans, m, n, nrhs, a,
571 $ lda, b, ldb, work, lwork, info )
573 $
CALL alaerh( path,
'DGETSLS ', 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 dlacpy(
'Full', nrows, nrhs,
583 $ copyb, ldb, c, ldb )
584 CALL dqrt16( 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 ) =
dqrt17( trans, 1, m, n,
594 $ nrhs, copya, lda, b, ldb,
595 $ copyb, ldb, c, work,
601 result( 16 ) =
dqrt14( 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 dqrt15( 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 dlacpy(
'Full', m, n, copya, lda, a, lda )
657 CALL dlacpy(
'Full', m, nrhs, copyb, ldb, b,
661 CALL dgelsy( m, n, nrhs, a, lda, b, ldb, iwork,
662 $ rcond, crank, work, lwlsy, info )
664 $
CALL alaerh( path,
'DGELSY', info, 0,
' ', m,
665 $ n, nrhs, -1, nb, itype, nfail,
671 result( 3 ) =
dqrt12( crank, crank, a, lda,
672 $ copys, work, lwork )
677 CALL dlacpy(
'Full', m, nrhs, copyb, ldb, work,
679 CALL dqrt16(
'No transpose', m, n, nrhs, copya,
680 $ lda, b, ldb, work, ldwork,
681 $ work( m*nrhs+1 ), result( 4 ) )
688 $ result( 5 ) =
dqrt17(
'No transpose', 1, m,
689 $ n, nrhs, copya, lda, b, ldb,
690 $ copyb, ldb, c, work, lwork )
698 $ result( 6 ) =
dqrt14(
'No transpose', m, n,
699 $ nrhs, copya, lda, b, ldb,
708 CALL dlacpy(
'Full', m, n, copya, lda, a, lda )
709 CALL dlacpy(
'Full', m, nrhs, copyb, ldb, b,
712 CALL dgelss( m, n, nrhs, a, lda, b, ldb, s,
713 $ rcond, crank, work, lwork, info )
715 $
CALL alaerh( path,
'DGELSS', info, 0,
' ', m,
716 $ n, nrhs, -1, nb, itype, nfail,
725 CALL daxpy( mnmin, -one, copys, 1, s, 1 )
726 result( 7 ) =
dasum( mnmin, s, 1 ) /
727 $
dasum( mnmin, copys, 1 ) /
728 $ ( eps*dble( mnmin ) )
735 CALL dlacpy(
'Full', m, nrhs, copyb, ldb, work,
737 CALL dqrt16(
'No transpose', m, n, nrhs, copya,
738 $ lda, b, ldb, work, ldwork,
739 $ work( m*nrhs+1 ), result( 8 ) )
745 $ result( 9 ) =
dqrt17(
'No transpose', 1, m,
746 $ n, nrhs, copya, lda, b, ldb,
747 $ copyb, ldb, c, work, lwork )
753 $ result( 10 ) =
dqrt14(
'No transpose', m, n,
754 $ nrhs, copya, lda, b, ldb,
769 CALL dlacpy(
'Full', m, n, copya, lda, a, lda )
770 CALL dlacpy(
'Full', m, nrhs, copyb, ldb, b,
774 CALL dgelsd( m, n, nrhs, a, lda, b, ldb, s,
775 $ rcond, crank, work, lwork, iwork,
778 $
CALL alaerh( path,
'DGELSD', info, 0,
' ', m,
779 $ n, nrhs, -1, nb, itype, nfail,
785 CALL daxpy( mnmin, -one, copys, 1, s, 1 )
786 result( 11 ) =
dasum( mnmin, s, 1 ) /
787 $
dasum( mnmin, copys, 1 ) /
788 $ ( eps*dble( mnmin ) )
795 CALL dlacpy(
'Full', m, nrhs, copyb, ldb, work,
797 CALL dqrt16(
'No transpose', m, n, nrhs, copya,
798 $ lda, b, ldb, work, ldwork,
799 $ work( m*nrhs+1 ), result( 12 ) )
805 $ result( 13 ) =
dqrt17(
'No transpose', 1, m,
806 $ n, nrhs, copya, lda, b, ldb,
807 $ copyb, ldb, c, work, lwork )
813 $ result( 14 ) =
dqrt14(
'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 )
subroutine dlacpy(UPLO, M, N, A, LDA, B, LDB)
DLACPY copies all or part of one two-dimensional array to another.
double precision function dlamch(CMACH)
DLAMCH
subroutine alasvm(TYPE, NOUT, NFAIL, NRUN, NERRS)
ALASVM
subroutine alahd(IOUNIT, PATH)
ALAHD
subroutine dqrt16(TRANS, M, N, NRHS, A, LDA, X, LDX, B, LDB, RWORK, RESID)
DQRT16
subroutine derrls(PATH, NUNIT)
DERRLS
subroutine alaerh(PATH, SUBNAM, INFO, INFOE, OPTS, M, N, KL, KU, N5, IMAT, NFAIL, NERRS, NOUT)
ALAERH
double precision function dqrt12(M, N, A, LDA, S, WORK, LWORK)
DQRT12
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 dqrt15(SCALE, RKSEL, M, N, NRHS, A, LDA, B, LDB, S, RANK, NORMA, NORMB, ISEED, WORK, LWORK)
DQRT15
subroutine dlarnv(IDIST, ISEED, N, X)
DLARNV returns a vector of random numbers from a uniform or normal distribution.
subroutine daxpy(N, DA, DX, INCX, DY, INCY)
DAXPY
subroutine dgelss(M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK, WORK, LWORK, INFO)
DGELSS solves overdetermined or underdetermined systems for GE matrices
subroutine dgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
DGEMM
subroutine dgels(TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK, INFO)
DGELS solves overdetermined or underdetermined systems for GE matrices
subroutine xlaenv(ISPEC, NVALUE)
XLAENV
subroutine dgetsls(TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK, INFO)
subroutine dscal(N, DA, DX, INCX)
DSCAL
double precision function dasum(N, DX, INCX)
DASUM
double precision function dqrt17(TRANS, IRESID, M, N, NRHS, A, LDA, X, LDX, B, LDB, C, WORK, LWORK)
DQRT17
subroutine dqrt13(SCALE, M, N, A, LDA, NORMA, ISEED)
DQRT13
subroutine dlasrt(ID, N, D, INFO)
DLASRT sorts numbers in increasing or decreasing order.
double precision function dqrt14(TRANS, M, N, NRHS, A, LDA, X, LDX, WORK, LWORK)
DQRT14
subroutine dgelsy(M, N, NRHS, A, LDA, B, LDB, JPVT, RCOND, RANK, WORK, LWORK, INFO)
DGELSY solves overdetermined or underdetermined systems for GE matrices