191 SUBROUTINE zdrvls( DOTYPE, NM, MVAL, NN, NVAL, NNS, NSVAL, NNB,
192 $ nbval, nxval, thresh, tsterr, a, copya, b,
193 $ copyb, c, s, copys, nout )
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 ), IWORKQUERY
241 DOUBLE PRECISION RESULT( ntests ), RWORKQUERY
245 COMPLEX*16,
ALLOCATABLE :: WORK (:)
246 DOUBLE PRECISION,
ALLOCATABLE :: RWORK (:)
247 INTEGER,
ALLOCATABLE :: IWORK (:)
250 DOUBLE PRECISION DASUM, DLAMCH, ZQRT12, ZQRT14, ZQRT17
251 EXTERNAL dasum, dlamch, zqrt12, zqrt14, zqrt17
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 )
286 eps = dlamch(
'Epsilon' )
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
329 mnmin = max( min( m, n ), 1 )
334 lwork = max( ( m+n )*nrhs,
335 $ ( n+nrhs )*( m+2 ), ( m+nrhs )*( n+2 ),
336 $ max( m+mnmin, nrhs*mnmin,2*n+m ),
337 $ max( m*n+4*mnmin+max(m,n), m*n+2*mnmin+4*n ) )
340 CALL zgels(
'N', m, n, nrhs, a, lda, b, ldb,
341 $ workquery, -1, info )
342 lwork_zgels = int( workquery )
344 CALL zgetsls(
'N', m, n, nrhs, a, lda, b, ldb,
345 $ workquery, -1, info )
346 lwork_zgetsls = int( workquery )
348 CALL zgelsy( m, n, nrhs, a, lda, b, ldb, iworkquery,
349 $ rcond, crank, workquery, -1, rwork, info )
350 lwork_zgelsy = int( workquery )
353 CALL zgelss( m, n, nrhs, a, lda, b, ldb, s,
354 $ rcond, crank, workquery, -1 , rwork, info )
355 lwork_zgelss = int( workquery )
356 lrwork_zgelss = 5*mnmin
358 CALL zgelsd( m, n, nrhs, a, lda, b, ldb, s, rcond, crank,
359 $ workquery, -1, rworkquery, iworkquery, info )
360 lwork_zgelsd = int( workquery )
361 lrwork_zgelsd = int( rworkquery )
363 liwork = max( 1, n, iworkquery )
365 lrwork = max( 1, lrwork_zgelsy, lrwork_zgelss, lrwork_zgelsd )
367 lwork = max( 1, lwork, lwork_zgels, lwork_zgetsls, lwork_zgelsy,
368 $ lwork_zgelss, lwork_zgelsd )
371 ALLOCATE( work( lwork ) )
372 ALLOCATE( iwork( liwork ) )
373 ALLOCATE( rwork( lrwork ) )
381 mnmin = max(min( m, n ),1)
390 itype = ( irank-1 )*3 + iscale
391 IF( .NOT.dotype( itype ) )
394 IF( irank.EQ.1 )
THEN
400 CALL zqrt13( iscale, m, n, copya, lda, norma,
405 CALL xlaenv( 3, nxval( inb ) )
408 IF( itran.EQ.1 )
THEN
417 ldwork = max( 1, ncols )
421 IF( ncols.GT.0 )
THEN
422 CALL zlarnv( 2, iseed, ncols*nrhs,
425 $ one / dble( ncols ), work,
428 CALL zgemm( trans,
'No transpose', nrows,
429 $ nrhs, ncols, cone, copya, lda,
430 $ work, ldwork, czero, b, ldb )
431 CALL zlacpy(
'Full', nrows, nrhs, b, ldb,
436 IF( m.GT.0 .AND. n.GT.0 )
THEN
437 CALL zlacpy(
'Full', m, n, copya, lda,
439 CALL zlacpy(
'Full', nrows, nrhs,
440 $ copyb, ldb, b, ldb )
443 CALL zgels( trans, m, n, nrhs, a, lda, b,
444 $ ldb, work, lwork, info )
447 $
CALL alaerh( path,
'ZGELS ', info, 0,
448 $ trans, m, n, nrhs, -1, nb,
449 $ itype, nfail, nerrs,
454 ldwork = max( 1, nrows )
455 IF( nrows.GT.0 .AND. nrhs.GT.0 )
456 $
CALL zlacpy(
'Full', nrows, nrhs,
457 $ copyb, ldb, c, ldb )
458 CALL zqrt16( trans, m, n, nrhs, copya,
459 $ lda, b, ldb, c, ldb, rwork,
462 IF( ( itran.EQ.1 .AND. m.GE.n ) .OR.
463 $ ( itran.EQ.2 .AND. m.LT.n ) )
THEN
467 result( 2 ) = zqrt17( trans, 1, m, n,
468 $ nrhs, copya, lda, b, ldb,
469 $ copyb, ldb, c, work,
475 result( 2 ) = zqrt14( trans, m, n,
476 $ nrhs, copya, lda, b, ldb,
484 IF( result( k ).GE.thresh )
THEN
485 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
486 $
CALL alahd( nout, path )
487 WRITE( nout, fmt = 9999 )trans, m,
488 $ n, nrhs, nb, itype, k,
502 CALL zqrt13( iscale, m, n, copya, lda, norma,
512 IF( itran.EQ.1 )
THEN
521 ldwork = max( 1, ncols )
525 IF( ncols.GT.0 )
THEN
526 CALL zlarnv( 2, iseed, ncols*nrhs,
528 CALL zscal( ncols*nrhs,
529 $ one / dble( ncols ), work,
532 CALL zgemm( trans,
'No transpose', nrows,
533 $ nrhs, ncols, cone, copya, lda,
534 $ work, ldwork, czero, b, ldb )
535 CALL zlacpy(
'Full', nrows, nrhs, b, ldb,
540 IF( m.GT.0 .AND. n.GT.0 )
THEN
541 CALL zlacpy(
'Full', m, n, copya, lda,
543 CALL zlacpy(
'Full', nrows, nrhs,
544 $ copyb, ldb, b, ldb )
547 CALL zgetsls( trans, m, n, nrhs, a,
548 $ lda, b, ldb, work, lwork, info )
550 $
CALL alaerh( path,
'ZGETSLS ', info, 0,
551 $ trans, m, n, nrhs, -1, nb,
552 $ itype, nfail, nerrs,
557 ldwork = max( 1, nrows )
558 IF( nrows.GT.0 .AND. nrhs.GT.0 )
559 $
CALL zlacpy(
'Full', nrows, nrhs,
560 $ copyb, ldb, c, ldb )
561 CALL zqrt16( trans, m, n, nrhs, copya,
562 $ lda, b, ldb, c, ldb, work,
565 IF( ( itran.EQ.1 .AND. m.GE.n ) .OR.
566 $ ( itran.EQ.2 .AND. m.LT.n ) )
THEN
570 result( 16 ) = zqrt17( trans, 1, m, n,
571 $ nrhs, copya, lda, b, ldb,
572 $ copyb, ldb, c, work,
578 result( 16 ) = zqrt14( trans, m, n,
579 $ nrhs, copya, lda, b, ldb,
587 IF( result( k ).GE.thresh )
THEN
588 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
589 $
CALL alahd( nout, path )
590 WRITE( nout, fmt = 9997 )trans, m,
591 $ n, nrhs, mb, nb, itype, k,
605 CALL zqrt15( iscale, irank, m, n, nrhs, copya, lda,
606 $ copyb, ldb, copys, rank, norma, normb,
607 $ iseed, work, lwork )
618 CALL xlaenv( 3, nxval( inb ) )
627 CALL zlacpy(
'Full', m, n, copya, lda, a, lda )
628 CALL zlacpy(
'Full', m, nrhs, copyb, ldb, b,
638 CALL zgelsy( m, n, nrhs, a, lda, b, ldb, iwork,
639 $ rcond, crank, work, lwlsy, rwork,
642 $
CALL alaerh( path,
'ZGELSY', info, 0,
' ', m,
643 $ n, nrhs, -1, nb, itype, nfail,
651 result( 3 ) = zqrt12( crank, crank, a, lda,
652 $ copys, work, lwork, rwork )
657 CALL zlacpy(
'Full', m, nrhs, copyb, ldb, work,
659 CALL zqrt16(
'No transpose', m, n, nrhs, copya,
660 $ lda, b, ldb, work, ldwork, rwork,
668 $ result( 5 ) = zqrt17(
'No transpose', 1, m,
669 $ n, nrhs, copya, lda, b, ldb,
670 $ copyb, ldb, c, work, lwork )
678 $ result( 6 ) = zqrt14(
'No transpose', m, n,
679 $ nrhs, copya, lda, b, ldb,
688 CALL zlacpy(
'Full', m, n, copya, lda, a, lda )
689 CALL zlacpy(
'Full', m, nrhs, copyb, ldb, b,
692 CALL zgelss( m, n, nrhs, a, lda, b, ldb, s,
693 $ rcond, crank, work, lwork, rwork,
697 $
CALL alaerh( path,
'ZGELSS', info, 0,
' ', m,
698 $ n, nrhs, -1, nb, itype, nfail,
707 CALL daxpy( mnmin, -one, copys, 1, s, 1 )
708 result( 7 ) = dasum( mnmin, s, 1 ) /
709 $ dasum( mnmin, copys, 1 ) /
710 $ ( eps*dble( mnmin ) )
717 CALL zlacpy(
'Full', m, nrhs, copyb, ldb, work,
719 CALL zqrt16(
'No transpose', m, n, nrhs, copya,
720 $ lda, b, ldb, work, ldwork, rwork,
727 $ result( 9 ) = zqrt17(
'No transpose', 1, m,
728 $ n, nrhs, copya, lda, b, ldb,
729 $ copyb, ldb, c, work, lwork )
735 $ result( 10 ) = zqrt14(
'No transpose', m, n,
736 $ nrhs, copya, lda, b, ldb,
747 CALL zlacpy(
'Full', m, n, copya, lda, a, lda )
748 CALL zlacpy(
'Full', m, nrhs, copyb, ldb, b,
752 CALL zgelsd( m, n, nrhs, a, lda, b, ldb, s,
753 $ rcond, crank, work, lwork, rwork,
756 $
CALL alaerh( path,
'ZGELSD', info, 0,
' ', m,
757 $ n, nrhs, -1, nb, itype, nfail,
763 CALL daxpy( mnmin, -one, copys, 1, s, 1 )
764 result( 11 ) = dasum( mnmin, s, 1 ) /
765 $ dasum( mnmin, copys, 1 ) /
766 $ ( eps*dble( mnmin ) )
773 CALL zlacpy(
'Full', m, nrhs, copyb, ldb, work,
775 CALL zqrt16(
'No transpose', m, n, nrhs, copya,
776 $ lda, b, ldb, work, ldwork, rwork,
783 $ result( 13 ) = zqrt17(
'No transpose', 1, m,
784 $ n, nrhs, copya, lda, b, ldb,
785 $ copyb, ldb, c, work, lwork )
791 $ result( 14 ) = zqrt14(
'No transpose', m, n,
792 $ nrhs, copya, lda, b, ldb,
799 IF( result( k ).GE.thresh )
THEN
800 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
801 $
CALL alahd( nout, path )
802 WRITE( nout, fmt = 9998 )m, n, nrhs, nb,
803 $ itype, k, result( k )
818 CALL alasvm( path, nout, nfail, nrun, nerrs )
820 9999
FORMAT(
' TRANS=''', a1,
''', M=', i5,
', N=', i5,
', NRHS=', i4,
821 $
', NB=', i4,
', type', i2,
', test(', i2,
')=', g12.5 )
822 9998
FORMAT(
' M=', i5,
', N=', i5,
', NRHS=', i4,
', NB=', i4,
823 $
', type', i2,
', test(', i2,
')=', g12.5 )
824 9997
FORMAT(
' TRANS=''', a1,
' M=', i5,
', N=', i5,
', NRHS=', i4,
825 $
', MB=', i4,
', NB=', i4,
', type', i2,
826 $
', test(', i2,
')=', g12.5 )
subroutine alasvm(TYPE, NOUT, NFAIL, NRUN, NERRS)
ALASVM
subroutine alahd(IOUNIT, PATH)
ALAHD
subroutine zqrt16(TRANS, M, N, NRHS, A, LDA, X, LDX, B, LDB, RWORK, RESID)
ZQRT16
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
subroutine zgetsls(TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK, INFO)
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 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 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 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 zdrvls(DOTYPE, NM, MVAL, NN, NVAL, NNS, NSVAL, NNB, NBVAL, NXVAL, THRESH, TSTERR, A, COPYA, B, COPYB, C, S, COPYS, NOUT)
ZDRVLS
subroutine xlaenv(ISPEC, NVALUE)
XLAENV
subroutine zqrt13(SCALE, M, N, A, LDA, NORMA, ISEED)
ZQRT13
subroutine zerrls(PATH, NUNIT)
ZERRLS
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 zscal(N, ZA, ZX, INCX)
ZSCAL
subroutine zqrt15(SCALE, RKSEL, M, N, NRHS, A, LDA, B, LDB, S, RANK, NORMA, NORMB, ISEED, WORK, LWORK)
ZQRT15