189 SUBROUTINE zdrvls( 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,
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( * )
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 ( 4 ), ISEEDY( 4 ), IWQ( 1 )
238 DOUBLE PRECISION RESULT( NTESTS ), RWQ( 1 )
242 COMPLEX*16,
ALLOCATABLE :: WORK (:)
243 DOUBLE PRECISION,
ALLOCATABLE :: RWORK (:), (:)
244 INTEGER,
ALLOCATABLE :: IWORK (:)
247 DOUBLE PRECISION DASUM, DLAMCH, ZQRT12, ZQRT14, ZQRT17
248 EXTERNAL DASUM, DLAMCH, ZQRT12, ZQRT14, ZQRT17
257 INTRINSIC dble,
max,
min, int, sqrt
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 )
283 EPS = DLAMCH( 'epsilon
' )
287 RCOND = SQRT( EPS ) - ( SQRT( EPS )-EPS ) / 2
291 CALL XLAENV( 9, SMLSIZ )
293 $ CALL ZERRLS( PATH, NOUT )
297.EQ..OR..EQ..AND..EQ.
IF( ( NM0 NN0 ) THRESHZERO )
298 $ CALL ALAHD( NOUT, PATH )
307.GT.
IF ( MVAL( I )MMAX ) THEN
312.GT.
IF ( NVAL( I )NMAX ) THEN
317.GT.
IF ( NSVAL( I )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.EQ.
IF( IRANK1 ) THEN
354.EQ.
IF( ITRAN1 ) 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.NOT.
IF( DOTYPE( ITYPE ) )
429.EQ.
IF( IRANK1 ) THEN
435 CALL ZQRT13( ISCALE, M, N, COPYA, LDA, NORMA,
440 CALL XLAENV( 3, NXVAL( INB ) )
443.EQ.
IF( ITRAN1 ) THEN
452 LDWORK = MAX( 1, NCOLS )
456.GT.
IF( NCOLS0 ) THEN
457 CALL ZLARNV( 2, ISEED, NCOLS*NRHS,
459 CALL ZDSCAL( 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.GT..AND..GT.
IF( M0 N0 ) 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 )
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 )
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
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.
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 )