189 SUBROUTINE cdrvls( 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, , NNS, NOUT
204 INTEGER ( * ), NBVAL( * ), NSVAL( * ),
205 $ nval( * ), nxval( * )
206 REAL COPYS( * ), S( * )
207 COMPLEX A( * ), B( * ), C( * ), COPYA( * ), COPYB( * )
214 PARAMETER ( NTESTS = 16 )
216 parameter( smlsiz = 25 )
218 parameter( one = 1.0e+0, zero = 0.0e+0 )
220 parameter( cone = ( 1.0e+0, 0.0e+0 ),
221 $ czero = ( 0.0e+0, 0.0e+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_cgels, lwork_cgetsls, lwork_cgelss,
232 $ lwork_cgelsy, lwork_cgelsd,
233 $ lrwork_cgelsy, lrwork_cgelss, lrwork_cgelsd
234 REAL EPS, NORMA, NORMB, RCOND
237 INTEGER ISEED( 4 ), ISEEDY( 4 ), IWQ( 1 )
238 REAL RESULT( NTESTS ), RWQ( 1 )
242 COMPLEX,
ALLOCATABLE :: WORK (:)
243 REAL,
ALLOCATABLE :: RWORK (:), WORK2 (:)
244 INTEGER,
ALLOCATABLE :: IWORK (:)
247 REAL CQRT12, CQRT14, CQRT17, SASUM, SLAMCH
248 EXTERNAL CQRT12, CQRT14, CQRT17, SASUM, SLAMCH
257 INTRINSIC max,
min, int, real, 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 ) =
'Complex precision'
281 iseed( i ) = iseedy( i )
283 eps = slamch(
'Epsilon' )
287 rcond = sqrt( eps ) - ( sqrt( eps )-eps ) / 2
293 $
CALL cerrls( 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 cgels( trans, m, n, nrhs, a, lda,
362 $ b, ldb, wq, -1, info )
363 lwork_cgels = int( wq( 1 ) )
365 CALL cgetsls( trans, m, n, nrhs, a, lda,
366 $ b, ldb, wq, -1, info )
367 lwork_cgetsls = int( wq( 1 ) )
371 CALL cgelsy( m, n, nrhs, a, lda, b, ldb,
374 lwork_cgelsy = int( wq( 1 ) )
377 CALL cgelss( m, n, nrhs, a, lda, b, ldb, s,
378 $ rcond, crank, wq, -1, rwq, info )
379 lwork_cgelss = int( wq( 1 ) )
380 lrwork_cgelss = 5*mnmin
382 CALL cgelsd( m, n, nrhs, a, lda, b, ldb, s,
383 $ rcond, crank, wq, -1, rwq, iwq,
385 lwork_cgelsd = int( wq( 1 ) )
386 lrwork_cgelsd = int( rwq( 1 ) )
388 liwork =
max( liwork, n, iwq( 1 ) )
390 lrwork =
max( lrwork, lrwork_cgelsy,
391 $ lrwork_cgelss, lrwork_cgelsd )
393 lwork =
max( lwork, lwork_cgels, lwork_cgetsls,
394 $ lwork_cgelsy, lwork_cgelss,
405 ALLOCATE( work( lwork ) )
406 ALLOCATE( iwork( liwork ) )
407 ALLOCATE( rwork( lrwork ) )
408 ALLOCATE( work2( 2 * lwork ) )
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 cqrt13( 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 clarnv( 2, iseed, ncols*nrhs,
460 $ one / real( ncols ), work,
463 CALL cgemm( trans,
'No transpose', nrows,
464 $ nrhs, ncols, cone, copya, lda,
465 $ work, ldwork, czero, b, ldb )
466 CALL clacpy(
'Full', nrows, nrhs, b, ldb,
471 IF( m.GT.0 .AND. n.GT.0 )
THEN
472 CALL clacpy(
'Full', m, n, copya, lda,
474 CALL clacpy(
'Full', nrows, nrhs,
478 CALL cgels( trans, m, n, nrhs, a, lda, b,
479 $ ldb, work, lwork, info )
482 $
CALL alaerh( path,
'CGELS ', 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 clacpy(
'Full', nrows, nrhs,
492 $ copyb, ldb, c, ldb )
493 CALL cqrt16( 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 ) = cqrt17( trans, 1, m, n,
503 $ nrhs, copya, lda, b, ldb,
504 $ copyb, ldb, c, work,
510 result( 2 ) = cqrt14( 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 cqrt13( iscale, m, n, copya, lda, norma,
547 IF( itran.EQ.1 )
THEN
556 LDWORK = MAX( 1, NCOLS )
560.GT.
IF( NCOLS0 ) THEN
561 CALL CLARNV( 2, ISEED, NCOLS*NRHS,
563 CALL CSCAL( NCOLS*NRHS,
564 $ CONE / REAL( NCOLS ), WORK,
567 CALL CGEMM( TRANS, 'no transpose
', NROWS,
568 $ NRHS, NCOLS, CONE, COPYA, LDA,
569 $ WORK, LDWORK, CZERO, B, LDB )
570 CALL CLACPY( 'full
', NROWS, NRHS, B, LDB,
575.GT..AND..GT.
IF( M0 N0 ) THEN
576 CALL CLACPY( 'full
', M, N, COPYA, LDA,
578 CALL CLACPY( 'full
', NROWS, NRHS,
579 $ COPYB, LDB, B, LDB )
582 CALL CGETSLS( TRANS, M, N, NRHS, A,
583 $ LDA, B, LDB, WORK, LWORK, INFO )
585 $ CALL ALAERH( PATH, 'cgetsls ', INFO, 0,
586 $ TRANS, M, N, NRHS, -1, NB,
587 $ ITYPE, NFAIL, NERRS,
592 LDWORK = MAX( 1, NROWS )
593.GT..AND..GT.
IF( NROWS0 NRHS0 )
594 $ CALL CLACPY( 'full
', NROWS, NRHS,
595 $ COPYB, LDB, C, LDB )
596 CALL CQRT16( TRANS, M, N, NRHS, COPYA,
597 $ LDA, B, LDB, C, LDB, WORK2,
600.EQ..AND..GE..OR.
IF( ( ITRAN1 MN )
601.EQ..AND..LT.
$ ( ITRAN2 MN ) ) THEN
605 RESULT( 16 ) = CQRT17( TRANS, 1, M, N,
606 $ NRHS, COPYA, LDA, B, LDB,
607 $ COPYB, LDB, C, WORK,
613 RESULT( 16 ) = CQRT14( TRANS, M, N,
614 $ NRHS, COPYA, LDA, B, LDB,
622.GE.
IF( RESULT( K )THRESH ) THEN
623.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
624 $ CALL ALAHD( NOUT, PATH )
625 WRITE( NOUT, FMT = 9997 )TRANS, M,
626 $ N, NRHS, MB, NB, ITYPE, K,
640 CALL CQRT15( 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 CLACPY( 'full
', M, N, COPYA, LDA, A, LDA )
663 CALL CLACPY( 'full
', M, NRHS, COPYB, LDB, B,
673 CALL CGELSY( M, N, NRHS, A, LDA, B, LDB, IWORK,
674 $ RCOND, CRANK, WORK, LWLSY, RWORK,
677 $ CALL ALAERH( PATH, 'cgelsy', INFO, 0, ' ', M,
678 $ N, NRHS, -1, NB, ITYPE, NFAIL,
686 RESULT( 3 ) = CQRT12( CRANK, CRANK, A, LDA,
687 $ COPYS, WORK, LWORK, RWORK )
692 CALL CLACPY( 'full
', M, NRHS, COPYB, LDB, WORK,
694 CALL CQRT16( 'no transpose
', M, N, NRHS, COPYA,
695 $ LDA, B, LDB, WORK, LDWORK, RWORK,
703 $ RESULT( 5 ) = CQRT17( 'no transpose
', 1, M,
704 $ N, NRHS, COPYA, LDA, B, LDB,
705 $ COPYB, LDB, C, WORK, LWORK )
713 $ RESULT( 6 ) = CQRT14( 'no transpose
', M, N,
714 $ NRHS, COPYA, LDA, B, LDB,
723 CALL CLACPY( 'full
', M, N, COPYA, LDA, A, LDA )
724 CALL CLACPY( 'full
', M, NRHS, COPYB, LDB, B,
727 CALL CGELSS( M, N, NRHS, A, LDA, B, LDB, S,
728 $ RCOND, CRANK, WORK, LWORK, RWORK,
732 $ CALL ALAERH( PATH, 'cgelss', INFO, 0, ' ', M,
733 $ N, NRHS, -1, NB, ITYPE, NFAIL,
742 CALL SAXPY( MNMIN, -ONE, COPYS, 1, S, 1 )
743 RESULT( 7 ) = SASUM( MNMIN, S, 1 ) /
744 $ SASUM( MNMIN, COPYS, 1 ) /
745 $ ( EPS*REAL( MNMIN ) )
752 CALL CLACPY( 'full
', M, NRHS, COPYB, LDB, WORK,
754 CALL CQRT16( 'no transpose
', M, N, NRHS, COPYA,
755 $ LDA, B, LDB, WORK, LDWORK, RWORK,
762 $ RESULT( 9 ) = CQRT17( 'no transpose
', 1, M,
763 $ N, NRHS, COPYA, LDA, B, LDB,
764 $ COPYB, LDB, C, WORK, LWORK )
770 $ RESULT( 10 ) = CQRT14( 'no transpose
', M, N,
771 $ NRHS, COPYA, LDA, B, LDB,
782 CALL CLACPY( 'full
', M, N, COPYA, LDA, A, LDA )
783 CALL CLACPY( 'full
', M, NRHS, COPYB, LDB, B,
787 CALL CGELSD( M, N, NRHS, A, LDA, B, LDB, S,
788 $ RCOND, CRANK, WORK, LWORK, RWORK,
791 $ CALL ALAERH( PATH, 'cgelsd', INFO, 0, ' ', M,
792 $ N, NRHS, -1, NB, ITYPE, NFAIL,
798 CALL SAXPY( MNMIN, -ONE, COPYS, 1, S, 1 )
799 RESULT( 11 ) = SASUM( MNMIN, S, 1 ) /
800 $ SASUM( MNMIN, COPYS, 1 ) /
801 $ ( EPS*REAL( MNMIN ) )
808 CALL CLACPY( 'full
', M, NRHS, COPYB, LDB, WORK,
810 CALL CQRT16( 'no transpose
', M, N, NRHS, COPYA,
811 $ LDA, B, LDB, WORK, LDWORK, RWORK,
818 $ RESULT( 13 ) = CQRT17( 'no transpose
', 1, M,
819 $ N, NRHS, COPYA, LDA, B, LDB,
820 $ COPYB, LDB, C, WORK, LWORK )
826 $ RESULT( 14 ) = CQRT14( 'no transpose
', M, N,
827 $ NRHS, COPYA, LDA, B, LDB,
834.GE.
IF( RESULT( K )THRESH ) THEN
835.EQ..AND..EQ.
IF( NFAIL0 NERRS0 )
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 )