199 INTEGER NM, NN, NNB, NNS, NOUT
200 DOUBLE PRECISION THRESH
204 INTEGER MVAL( * ), NBVAL( * ), NSVAL( * ),
205 $ NVAL( * ), NXVAL( * )
206 DOUBLE PRECISION COPYS( * ), S( * )
207 COMPLEX*16 A( * ), B( * ), C( * ), COPYA( * ), COPYB( * )
214 parameter( ntests = 16 )
216 parameter( smlsiz = 25 )
217 DOUBLE PRECISION ONE, ZERO
218 parameter( one = 1.0d+0, zero = 0.0d+0 )
219 COMPLEX*16 CONE, CZERO
220 parameter( cone = ( 1.0d+0, 0.0d+0 ),
221 $ czero = ( 0.0d+0, 0.0d+0 ) )
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, LRWORK,
231 $ LWORK_ZGELS, LWORK_ZGETSLS, LWORK_ZGELSS,
232 $ LWORK_ZGELSY, LWORK_ZGELSD,
233 $ LRWORK_ZGELSY, LRWORK_ZGELSS, LRWORK_ZGELSD
234 DOUBLE PRECISION EPS, NORMA, NORMB, RCOND
237 INTEGER ISEED( 4 ), ISEEDY( 4 ), IWQ( 1 )
238 DOUBLE PRECISION RESULT( NTESTS ), RWQ( 1 )
242 COMPLEX*16,
ALLOCATABLE :: WORK (:)
243 DOUBLE PRECISION,
ALLOCATABLE :: RWORK (:), WORK2 (:)
244 INTEGER,
ALLOCATABLE :: IWORK (:)
247 DOUBLE PRECISION DASUM, DLAMCH, ZQRT12, ZQRT14, ZQRT17
257 INTRINSIC dble, max, min, int, sqrt
262 INTEGER INFOT, IOUNIT
265 COMMON / infoc / infot, iounit, ok, lerr
266 COMMON / srnamc / srnamt
269 DATA iseedy / 1988, 1989, 1990, 1991 /
275 path( 1: 1 ) =
'Zomplex precision'
281 iseed( i ) = iseedy( i )
287 rcond = sqrt( eps ) - ( sqrt( eps )-eps ) / 2
293 $
CALL zerrls( path, nout )
297 IF( ( nm.EQ.0 .OR. nn.EQ.0 ) .AND. thresh.EQ.zero )
298 $
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 ) )
344 mnmin = max(min( m, n ),1)
350 itype = ( irank-1 )*3 + iscale
351 IF( dotype( itype ) )
THEN
352 IF( irank.EQ.1 )
THEN
354 IF( itran.EQ.1 )
THEN
361 CALL zgels( trans, m, n, nrhs, a, lda,
362 $ b, ldb, wq, -1, info )
363 lwork_zgels = int( wq( 1 ) )
365 CALL zgetsls( trans, m, n, nrhs, a, lda,
366 $ b, ldb, wq, -1, info )
367 lwork_zgetsls = int( wq( 1 ) )
371 CALL zgelsy( m, n, nrhs, a, lda, b, ldb, iwq,
372 $ rcond, crank, wq, -1, rwq, info )
373 lwork_zgelsy = int( wq( 1 ) )
376 CALL zgelss( m, n, nrhs, a, lda, b, ldb, s,
377 $ rcond, crank, wq, -1 , rwq,
379 lwork_zgelss = int( wq( 1 ) )
380 lrwork_zgelss = 5*mnmin
382 CALL zgelsd( m, n, nrhs, a, lda, b, ldb, s,
383 $ rcond, crank, wq, -1, rwq, iwq,
385 lwork_zgelsd = int( wq( 1 ) )
386 lrwork_zgelsd = int( rwq( 1 ) )
388 liwork = max( liwork, n, iwq( 1 ) )
390 lrwork = max( lrwork, lrwork_zgelsy,
391 $ lrwork_zgelss, lrwork_zgelsd )
393 lwork = max( lwork, lwork_zgels, lwork_zgetsls,
394 $ lwork_zgelsy, lwork_zgelss,
405 ALLOCATE( work( lwork ) )
406 ALLOCATE( work2( 2 * lwork ) )
407 ALLOCATE( iwork( liwork ) )
408 ALLOCATE( rwork( lrwork ) )
416 mnmin = max(min( m, n ),1)
425 itype = ( irank-1 )*3 + iscale
426 IF( .NOT.dotype( itype ) )
429 IF( irank.EQ.1 )
THEN
435 CALL zqrt13( iscale, m, n, copya, lda, norma,
440 CALL xlaenv( 3, nxval( inb ) )
443 IF( itran.EQ.1 )
THEN
452 ldwork = max( 1, ncols )
456 IF( ncols.GT.0 )
THEN
457 CALL zlarnv( 2, iseed, ncols*nrhs,
460 $ one / dble( ncols ), work,
463 CALL zgemm( trans,
'No transpose', nrows,
464 $ nrhs, ncols, cone, copya, lda,
465 $ work, ldwork, czero, b, ldb )
466 CALL zlacpy(
'Full', nrows, nrhs, b, ldb,
471 IF( m.GT.0 .AND. n.GT.0 )
THEN
472 CALL zlacpy(
'Full', m, n, copya, lda,
474 CALL zlacpy(
'Full', nrows, nrhs,
475 $ copyb, ldb, b, ldb )
478 CALL zgels( trans, m, n, nrhs, a, lda, b,
479 $ ldb, work, lwork, info )
482 $
CALL alaerh( path,
'ZGELS ', info, 0,
483 $ trans, m, n, nrhs, -1, nb,
484 $ itype, nfail, nerrs,
489 ldwork = max( 1, nrows )
490 IF( nrows.GT.0 .AND. nrhs.GT.0 )
491 $
CALL zlacpy(
'Full', nrows, nrhs,
492 $ copyb, ldb, c, ldb )
493 CALL zqrt16( trans, m, n, nrhs, copya,
494 $ lda, b, ldb, c, ldb, rwork,
497 IF( ( itran.EQ.1 .AND. m.GE.n ) .OR.
498 $ ( itran.EQ.2 .AND. m.LT.n ) )
THEN
502 result( 2 ) =
zqrt17( trans, 1, m, n,
503 $ nrhs, copya, lda, b, ldb,
504 $ copyb, ldb, c, work,
510 result( 2 ) =
zqrt14( trans, m, n,
511 $ nrhs, copya, lda, b, ldb,
519 IF( result( k ).GE.thresh )
THEN
520 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
521 $
CALL alahd( nout, path )
522 WRITE( nout, fmt = 9999 )trans, m,
523 $ n, nrhs, nb, itype, k,
537 CALL zqrt13( iscale, m, n, copya, lda, norma,
547 IF( itran.EQ.1 )
THEN
556 ldwork = max( 1, ncols )
560 IF( ncols.GT.0 )
THEN
561 CALL zlarnv( 2, iseed, ncols*nrhs,
563 CALL zscal( ncols*nrhs,
564 $ cone / dble( ncols ), work,
567 CALL zgemm( trans,
'No transpose', nrows,
568 $ nrhs, ncols, cone, copya, lda,
569 $ work, ldwork, czero, b, ldb )
570 CALL zlacpy(
'Full', nrows, nrhs, b, ldb,
575 IF( m.GT.0 .AND. n.GT.0 )
THEN
576 CALL zlacpy(
'Full', m, n, copya, lda,
578 CALL zlacpy(
'Full', nrows, nrhs,
579 $ copyb, ldb, b, ldb )
582 CALL zgetsls( trans, m, n, nrhs, a,
583 $ lda, b, ldb, work, lwork, info )
585 $
CALL alaerh( path,
'ZGETSLS ', info, 0,
586 $ trans, m, n, nrhs, -1, nb,
587 $ itype, nfail, nerrs,
592 ldwork = max( 1, nrows )
593 IF( nrows.GT.0 .AND. nrhs.GT.0 )
594 $
CALL zlacpy(
'Full', nrows, nrhs,
595 $ copyb, ldb, c, ldb )
596 CALL zqrt16( trans, m, n, nrhs, copya,
597 $ lda, b, ldb, c, ldb, work2,
600 IF( ( itran.EQ.1 .AND. m.GE.n ) .OR.
601 $ ( itran.EQ.2 .AND. m.LT.n ) )
THEN
605 result( 16 ) =
zqrt17( trans, 1, m, n,
606 $ nrhs, copya, lda, b, ldb,
607 $ copyb, ldb, c, work,
613 result( 16 ) =
zqrt14( trans, m, n,
614 $ nrhs, copya, lda, b, ldb,
622 IF( result( k ).GE.thresh )
THEN
623 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
624 $
CALL alahd( nout, path )
625 WRITE( nout, fmt = 9997 )trans, m,
626 $ n, nrhs, mb, nb, itype, k,
640 CALL zqrt15( iscale, irank, m, n, nrhs, copya, lda,
641 $ copyb, ldb, copys, rank, norma, normb,
642 $ iseed, work, lwork )
653 CALL xlaenv( 3, nxval( inb ) )
662 CALL zlacpy(
'Full', m, n, copya, lda, a, lda )
663 CALL zlacpy(
'Full', m, nrhs, copyb, ldb, b,
673 CALL zgelsy( m, n, nrhs, a, lda, b, ldb, iwork,
674 $ rcond, crank, work, lwlsy, rwork,
677 $
CALL alaerh( path,
'ZGELSY', info, 0,
' ', m,
678 $ n, nrhs, -1, nb, itype, nfail,
686 result( 3 ) =
zqrt12( crank, crank, a, lda,
687 $ copys, work, lwork, rwork )
692 CALL zlacpy(
'Full', m, nrhs, copyb, ldb, work,
694 CALL zqrt16(
'No transpose', m, n, nrhs, copya,
695 $ lda, b, ldb, work, ldwork, rwork,
703 $ result( 5 ) =
zqrt17(
'No transpose', 1, m,
704 $ n, nrhs, copya, lda, b, ldb,
705 $ copyb, ldb, c, work, lwork )
713 $ result( 6 ) =
zqrt14(
'No transpose', m, n,
714 $ nrhs, copya, lda, b, ldb,
723 CALL zlacpy(
'Full', m, n, copya, lda, a, lda )
724 CALL zlacpy(
'Full', m, nrhs, copyb, ldb, b,
727 CALL zgelss( m, n, nrhs, a, lda, b, ldb, s,
728 $ rcond, crank, work, lwork, rwork,
732 $
CALL alaerh( path,
'ZGELSS', info, 0,
' ', m,
733 $ n, nrhs, -1, nb, itype, nfail,
742 CALL daxpy( mnmin, -one, copys, 1, s, 1 )
743 result( 7 ) =
dasum( mnmin, s, 1 ) /
744 $
dasum( mnmin, copys, 1 ) /
745 $ ( eps*dble( mnmin ) )
752 CALL zlacpy(
'Full', m, nrhs, copyb, ldb, work,
754 CALL zqrt16(
'No transpose', m, n, nrhs, copya,
755 $ lda, b, ldb, work, ldwork, rwork,
762 $ result( 9 ) =
zqrt17(
'No transpose', 1, m,
763 $ n, nrhs, copya, lda, b, ldb,
764 $ copyb, ldb, c, work, lwork )
770 $ result( 10 ) =
zqrt14(
'No transpose', m, n,
771 $ nrhs, copya, lda, b, ldb,
782 CALL zlacpy(
'Full', m, n, copya, lda, a, lda )
783 CALL zlacpy(
'Full', m, nrhs, copyb, ldb, b,
787 CALL zgelsd( m, n, nrhs, a, lda, b, ldb, s,
788 $ rcond, crank, work, lwork, rwork,
791 $
CALL alaerh( path,
'ZGELSD', info, 0,
' ', m,
792 $ n, nrhs, -1, nb, itype, nfail,
798 CALL daxpy( mnmin, -one, copys, 1, s, 1 )
799 result( 11 ) =
dasum( mnmin, s, 1 ) /
800 $
dasum( mnmin, copys, 1 ) /
801 $ ( eps*dble( mnmin ) )
808 CALL zlacpy(
'Full', m, nrhs, copyb, ldb, work,
810 CALL zqrt16(
'No transpose', m, n, nrhs, copya,
811 $ lda, b, ldb, work, ldwork, rwork,
818 $ result( 13 ) =
zqrt17(
'No transpose', 1, m,
819 $ n, nrhs, copya, lda, b, ldb,
820 $ copyb, ldb, c, work, lwork )
826 $ result( 14 ) =
zqrt14(
'No transpose', m, n,
827 $ nrhs, copya, lda, b, ldb,
834 IF( result( k ).GE.thresh )
THEN
835 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
836 $
CALL alahd( nout, path )
837 WRITE( nout, fmt = 9998 )m, n, nrhs, nb,
838 $ itype, k, result( k )
853 CALL alasvm( path, nout, nfail, nrun, nerrs )
855 9999
FORMAT(
' TRANS=''', a1,
''', M=', i5,
', N=', i5,
', NRHS=', i4,
856 $
', NB=', i4,
', type', i2,
', test(', i2,
')=', g12.5 )
857 9998
FORMAT(
' M=', i5,
', N=', i5,
', NRHS=', i4,
', NB=', i4,
858 $
', type', i2,
', test(', i2,
')=', g12.5 )
859 9997
FORMAT(
' TRANS=''', a1,
' M=', i5,
', N=', i5,
', NRHS=', i4,
860 $
', MB=', i4,
', NB=', i4,
', type', i2,
861 $
', test(', i2,
')=', g12.5 )
double precision function dlamch(CMACH)
DLAMCH
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 zdscal(N, DA, ZX, INCX)
ZDSCAL
subroutine zscal(N, ZA, ZX, INCX)
ZSCAL
subroutine zgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
ZGEMM
double precision function zqrt12(M, N, A, LDA, S, WORK, LWORK, RWORK)
ZQRT12
subroutine zqrt16(TRANS, M, N, NRHS, A, LDA, X, LDX, B, LDB, RWORK, RESID)
ZQRT16
subroutine zqrt15(SCALE, RKSEL, M, N, NRHS, A, LDA, B, LDB, S, RANK, NORMA, NORMB, ISEED, WORK, LWORK)
ZQRT15
subroutine zerrls(PATH, NUNIT)
ZERRLS
double precision function zqrt14(TRANS, M, N, NRHS, A, LDA, X, LDX, WORK, LWORK)
ZQRT14
subroutine zqrt13(SCALE, M, N, A, LDA, NORMA, ISEED)
ZQRT13
double precision function zqrt17(TRANS, IRESID, M, N, NRHS, A, LDA, X, LDX, B, LDB, C, WORK, LWORK)
ZQRT17
subroutine zgels(TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK, INFO)
ZGELS solves overdetermined or underdetermined systems for GE matrices
subroutine zgetsls(TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK, INFO)
ZGETSLS
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
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 zlacpy(UPLO, M, N, A, LDA, B, LDB)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine zlarnv(IDIST, ISEED, N, X)
ZLARNV returns a vector of random numbers from a uniform or normal distribution.
double precision function dasum(N, DX, INCX)
DASUM
subroutine daxpy(N, DA, DX, INCX, DY, INCY)
DAXPY