202 INTEGER nm, nn, nnb, nns, nout
203 DOUBLE PRECISION thresh
207 INTEGER mval( * ), nbval( * ), nsval( * ),
208 $ nval( * ), nxval( * )
209 DOUBLE PRECISION copys( * ), s( * )
210 COMPLEX*16 a( * ), b( * ), c( * ), copya( * ), copyb( * )
217 parameter( ntests = 16 )
219 parameter( smlsiz = 25 )
220 DOUBLE PRECISION one, zero
221 parameter( one = 1.0d+0, zero = 0.0d+0 )
222 COMPLEX*16 cone, czero
223 parameter( cone = ( 1.0d+0, 0.0d+0 ),
224 $ czero = ( 0.0d+0, 0.0d+0 ) )
229 INTEGER crank, i, im, imb, in, inb, info, ins, irank,
230 $ iscale, itran, itype, j, k, lda, ldb, ldwork,
231 $ lwlsy, lwork, m, mnmin, n, nb, ncols, nerrs,
232 $ nfail, nrhs, nrows, nrun, rank, mb,
233 $ mmax, nmax, nsmax, liwork, lrwork,
234 $ lwork_zgels, lwork_zgetsls, lwork_zgelss,
235 $ lwork_zgelsy, lwork_zgelsd,
236 $ lrwork_zgelsy, lrwork_zgelss, lrwork_zgelsd
237 DOUBLE PRECISION eps, norma, normb, rcond
240 INTEGER iseed( 4 ), iseedy( 4 ), iwq
241 DOUBLE PRECISION result( ntests ), rwq
245 COMPLEX*16,
ALLOCATABLE :: work (:)
246 DOUBLE PRECISION,
ALLOCATABLE :: rwork (:)
247 INTEGER,
ALLOCATABLE :: iwork (:)
260 INTRINSIC dble, max, min, int, sqrt
265 INTEGER infot, iounit
268 COMMON / infoc / infot, iounit, ok, lerr
269 COMMON / srnamc / srnamt
272 DATA iseedy / 1988, 1989, 1990, 1991 /
278 path( 1: 1 ) =
'Zomplex precision' 284 iseed( i ) = iseedy( i )
290 rcond = sqrt( eps ) - ( sqrt( eps )-eps ) / 2
296 $
CALL zerrls( path, nout )
300 IF( ( nm.EQ.0 .OR. nn.EQ.0 ) .AND. thresh.EQ.zero )
301 $
CALL alahd( nout, path )
310 IF ( mval( i ).GT.mmax )
THEN 315 IF ( nval( i ).GT.nmax )
THEN 320 IF ( nsval( i ).GT.nsmax )
THEN 327 mnmin = max( min( m, n ), 1 )
332 lwork = max( 1, ( m+n )*nrhs,
333 $ ( n+nrhs )*( m+2 ), ( m+nrhs )*( n+2 ),
334 $ max( m+mnmin, nrhs*mnmin,2*n+m ),
335 $ max( m*n+4*mnmin+max(m,n), m*n+2*mnmin+4*n ) )
347 mnmin = max(min( m, n ),1)
353 itype = ( irank-1 )*3 + iscale
354 IF( dotype( itype ) )
THEN 355 IF( irank.EQ.1 )
THEN 357 IF( itran.EQ.1 )
THEN 364 CALL zgels( trans, m, n, nrhs, a, lda,
365 $ b, ldb, wq, -1, info )
366 lwork_zgels = int( wq )
368 CALL zgetsls( trans, m, n, nrhs, a, lda,
369 $ b, ldb, wq, -1, info )
370 lwork_zgetsls = int( wq )
374 CALL zgelsy( m, n, nrhs, a, lda, b, ldb, iwq,
375 $ rcond, crank, wq, -1, rwork, info )
376 lwork_zgelsy = int( wq )
379 CALL zgelss( m, n, nrhs, a, lda, b, ldb, s,
380 $ rcond, crank, wq, -1 , rwork,
382 lwork_zgelss = int( wq )
383 lrwork_zgelss = 5*mnmin
385 CALL zgelsd( m, n, nrhs, a, lda, b, ldb, s,
386 $ rcond, crank, wq, -1, rwq, iwq,
388 lwork_zgelsd = int( wq )
389 lrwork_zgelsd = int( rwq )
391 liwork = max( liwork, n, iwq )
393 lrwork = max( lrwork, lrwork_zgelsy,
394 $ lrwork_zgelss, lrwork_zgelsd )
396 lwork = max( lwork, lwork_zgels, lwork_zgetsls,
397 $ lwork_zgelsy, lwork_zgelss,
408 ALLOCATE( work( lwork ) )
409 ALLOCATE( iwork( liwork ) )
410 ALLOCATE( rwork( lrwork ) )
418 mnmin = max(min( m, n ),1)
427 itype = ( irank-1 )*3 + iscale
428 IF( .NOT.dotype( itype ) )
431 IF( irank.EQ.1 )
THEN 437 CALL zqrt13( iscale, m, n, copya, lda, norma,
442 CALL xlaenv( 3, nxval( inb ) )
445 IF( itran.EQ.1 )
THEN 454 ldwork = max( 1, ncols )
458 IF( ncols.GT.0 )
THEN 459 CALL zlarnv( 2, iseed, ncols*nrhs,
462 $ one / dble( ncols ), work,
465 CALL zgemm( trans,
'No transpose', nrows,
466 $ nrhs, ncols, cone, copya, lda,
467 $ work, ldwork, czero, b, ldb )
468 CALL zlacpy(
'Full', nrows, nrhs, b, ldb,
473 IF( m.GT.0 .AND. n.GT.0 )
THEN 474 CALL zlacpy(
'Full', m, n, copya, lda,
476 CALL zlacpy(
'Full', nrows, nrhs,
477 $ copyb, ldb, b, ldb )
480 CALL zgels( trans, m, n, nrhs, a, lda, b,
481 $ ldb, work, lwork, info )
484 $
CALL alaerh( path,
'ZGELS ', info, 0,
485 $ trans, m, n, nrhs, -1, nb,
486 $ itype, nfail, nerrs,
491 ldwork = max( 1, nrows )
492 IF( nrows.GT.0 .AND. nrhs.GT.0 )
493 $
CALL zlacpy(
'Full', nrows, nrhs,
494 $ copyb, ldb, c, ldb )
495 CALL zqrt16( trans, m, n, nrhs, copya,
496 $ lda, b, ldb, c, ldb, rwork,
499 IF( ( itran.EQ.1 .AND. m.GE.n ) .OR.
500 $ ( itran.EQ.2 .AND. m.LT.n ) )
THEN 504 result( 2 ) =
zqrt17( trans, 1, m, n,
505 $ nrhs, copya, lda, b, ldb,
506 $ copyb, ldb, c, work,
512 result( 2 ) =
zqrt14( trans, m, n,
513 $ nrhs, copya, lda, b, ldb,
521 IF( result( k ).GE.thresh )
THEN 522 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
523 $
CALL alahd( nout, path )
524 WRITE( nout, fmt = 9999 )trans, m,
525 $ n, nrhs, nb, itype, k,
539 CALL zqrt13( iscale, m, n, copya, lda, norma,
549 IF( itran.EQ.1 )
THEN 558 ldwork = max( 1, ncols )
562 IF( ncols.GT.0 )
THEN 563 CALL zlarnv( 2, iseed, ncols*nrhs,
565 CALL zscal( ncols*nrhs,
566 $ one / dble( ncols ), work,
569 CALL zgemm( trans,
'No transpose', nrows,
570 $ nrhs, ncols, cone, copya, lda,
571 $ work, ldwork, czero, b, ldb )
572 CALL zlacpy(
'Full', nrows, nrhs, b, ldb,
577 IF( m.GT.0 .AND. n.GT.0 )
THEN 578 CALL zlacpy(
'Full', m, n, copya, lda,
580 CALL zlacpy(
'Full', nrows, nrhs,
581 $ copyb, ldb, b, ldb )
584 CALL zgetsls( trans, m, n, nrhs, a,
585 $ lda, b, ldb, work, lwork, info )
587 $
CALL alaerh( path,
'ZGETSLS ', info, 0,
588 $ trans, m, n, nrhs, -1, nb,
589 $ itype, nfail, nerrs,
594 ldwork = max( 1, nrows )
595 IF( nrows.GT.0 .AND. nrhs.GT.0 )
596 $
CALL zlacpy(
'Full', nrows, nrhs,
597 $ copyb, ldb, c, ldb )
598 CALL zqrt16( trans, m, n, nrhs, copya,
599 $ lda, b, ldb, c, ldb, work,
602 IF( ( itran.EQ.1 .AND. m.GE.n ) .OR.
603 $ ( itran.EQ.2 .AND. m.LT.n ) )
THEN 607 result( 16 ) =
zqrt17( trans, 1, m, n,
608 $ nrhs, copya, lda, b, ldb,
609 $ copyb, ldb, c, work,
615 result( 16 ) =
zqrt14( trans, m, n,
616 $ nrhs, copya, lda, b, ldb,
624 IF( result( k ).GE.thresh )
THEN 625 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
626 $
CALL alahd( nout, path )
627 WRITE( nout, fmt = 9997 )trans, m,
628 $ n, nrhs, mb, nb, itype, k,
642 CALL zqrt15( iscale, irank, m, n, nrhs, copya, lda,
643 $ copyb, ldb, copys, rank, norma, normb,
644 $ iseed, work, lwork )
655 CALL xlaenv( 3, nxval( inb ) )
664 CALL zlacpy(
'Full', m, n, copya, lda, a, lda )
665 CALL zlacpy(
'Full', m, nrhs, copyb, ldb, b,
675 CALL zgelsy( m, n, nrhs, a, lda, b, ldb, iwork,
676 $ rcond, crank, work, lwlsy, rwork,
679 $
CALL alaerh( path,
'ZGELSY', info, 0,
' ', m,
680 $ n, nrhs, -1, nb, itype, nfail,
688 result( 3 ) =
zqrt12( crank, crank, a, lda,
689 $ copys, work, lwork, rwork )
694 CALL zlacpy(
'Full', m, nrhs, copyb, ldb, work,
696 CALL zqrt16(
'No transpose', m, n, nrhs, copya,
697 $ lda, b, ldb, work, ldwork, rwork,
705 $ result( 5 ) =
zqrt17(
'No transpose', 1, m,
706 $ n, nrhs, copya, lda, b, ldb,
707 $ copyb, ldb, c, work, lwork )
715 $ result( 6 ) =
zqrt14(
'No transpose', m, n,
716 $ nrhs, copya, lda, b, ldb,
725 CALL zlacpy(
'Full', m, n, copya, lda, a, lda )
726 CALL zlacpy(
'Full', m, nrhs, copyb, ldb, b,
729 CALL zgelss( m, n, nrhs, a, lda, b, ldb, s,
730 $ rcond, crank, work, lwork, rwork,
734 $
CALL alaerh( path,
'ZGELSS', info, 0,
' ', m,
735 $ n, nrhs, -1, nb, itype, nfail,
744 CALL daxpy( mnmin, -one, copys, 1, s, 1 )
745 result( 7 ) =
dasum( mnmin, s, 1 ) /
746 $
dasum( mnmin, copys, 1 ) /
747 $ ( eps*dble( mnmin ) )
754 CALL zlacpy(
'Full', m, nrhs, copyb, ldb, work,
756 CALL zqrt16(
'No transpose', m, n, nrhs, copya,
757 $ lda, b, ldb, work, ldwork, rwork,
764 $ result( 9 ) =
zqrt17(
'No transpose', 1, m,
765 $ n, nrhs, copya, lda, b, ldb,
766 $ copyb, ldb, c, work, lwork )
772 $ result( 10 ) =
zqrt14(
'No transpose', m, n,
773 $ nrhs, copya, lda, b, ldb,
784 CALL zlacpy(
'Full', m, n, copya, lda, a, lda )
785 CALL zlacpy(
'Full', m, nrhs, copyb, ldb, b,
789 CALL zgelsd( m, n, nrhs, a, lda, b, ldb, s,
790 $ rcond, crank, work, lwork, rwork,
793 $
CALL alaerh( path,
'ZGELSD', info, 0,
' ', m,
794 $ n, nrhs, -1, nb, itype, nfail,
800 CALL daxpy( mnmin, -one, copys, 1, s, 1 )
801 result( 11 ) =
dasum( mnmin, s, 1 ) /
802 $
dasum( mnmin, copys, 1 ) /
803 $ ( eps*dble( mnmin ) )
810 CALL zlacpy(
'Full', m, nrhs, copyb, ldb, work,
812 CALL zqrt16(
'No transpose', m, n, nrhs, copya,
813 $ lda, b, ldb, work, ldwork, rwork,
820 $ result( 13 ) =
zqrt17(
'No transpose', 1, m,
821 $ n, nrhs, copya, lda, b, ldb,
822 $ copyb, ldb, c, work, lwork )
828 $ result( 14 ) =
zqrt14(
'No transpose', m, n,
829 $ nrhs, copya, lda, b, ldb,
836 IF( result( k ).GE.thresh )
THEN 837 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
838 $
CALL alahd( nout, path )
839 WRITE( nout, fmt = 9998 )m, n, nrhs, nb,
840 $ itype, k, result( k )
855 CALL alasvm( path, nout, nfail, nrun, nerrs )
857 9999
FORMAT(
' TRANS=''', a1,
''', M=', i5,
', N=', i5,
', NRHS=', i4,
858 $
', NB=', i4,
', type', i2,
', test(', i2,
')=', g12.5 )
859 9998
FORMAT(
' M=', i5,
', N=', i5,
', NRHS=', i4,
', NB=', i4,
860 $
', type', i2,
', test(', i2,
')=', g12.5 )
861 9997
FORMAT(
' TRANS=''', a1,
' M=', i5,
', N=', i5,
', NRHS=', i4,
862 $
', MB=', i4,
', NB=', i4,
', type', i2,
863 $
', test(', i2,
')=', g12.5 )
double precision function dlamch(CMACH)
DLAMCH
subroutine alasvm(TYPE, NOUT, NFAIL, NRUN, NERRS)
ALASVM
subroutine alahd(IOUNIT, PATH)
ALAHD
subroutine zqrt15(SCALE, RKSEL, M, N, NRHS, A, LDA, B, LDB, S, RANK, NORMA, NORMB, ISEED, WORK, LWORK)
ZQRT15
subroutine zgels(TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK, INFO)
ZGELS solves overdetermined or underdetermined systems for GE matrices
subroutine alaerh(PATH, SUBNAM, INFO, INFOE, OPTS, M, N, KL, KU, N5, IMAT, NFAIL, NERRS, NOUT)
ALAERH
double precision function zqrt14(TRANS, M, N, NRHS, A, LDA, X, LDX, WORK, LWORK)
ZQRT14
subroutine zlacpy(UPLO, M, N, A, LDA, B, LDB)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine zgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
ZGEMM
subroutine daxpy(N, DA, DX, INCX, DY, INCY)
DAXPY
subroutine zqrt16(TRANS, M, N, NRHS, A, LDA, X, LDX, B, LDB, RWORK, RESID)
ZQRT16
subroutine xlaenv(ISPEC, NVALUE)
XLAENV
double precision function zqrt12(M, N, A, LDA, S, WORK, LWORK, RWORK)
ZQRT12
subroutine zgelsy(M, N, NRHS, A, LDA, B, LDB, JPVT, RCOND, RANK, WORK, LWORK, RWORK, INFO)
ZGELSY solves overdetermined or underdetermined systems for GE matrices
subroutine zgelsd(M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK, WORK, LWORK, RWORK, IWORK, INFO)
ZGELSD computes the minimum-norm solution to a linear least squares problem for GE matrices ...
subroutine zqrt13(SCALE, M, N, A, LDA, NORMA, ISEED)
ZQRT13
double precision function dasum(N, DX, INCX)
DASUM
subroutine zerrls(PATH, NUNIT)
ZERRLS
double precision function zqrt17(TRANS, IRESID, M, N, NRHS, A, LDA, X, LDX, B, LDB, C, WORK, LWORK)
ZQRT17
subroutine dlasrt(ID, N, D, INFO)
DLASRT sorts numbers in increasing or decreasing order.
subroutine zdscal(N, DA, ZX, INCX)
ZDSCAL
subroutine zlarnv(IDIST, ISEED, N, X)
ZLARNV returns a vector of random numbers from a uniform or normal distribution.
subroutine zgetsls(TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK, INFO)
subroutine zscal(N, ZA, ZX, INCX)
ZSCAL
subroutine zgelss(M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK, WORK, LWORK, RWORK, INFO)
ZGELSS solves overdetermined or underdetermined systems for GE matrices