202 INTEGER nm, nn, nnb, nns, nout
207 INTEGER mval( * ), nbval( * ), nsval( * ),
208 $ nval( * ), nxval( * )
209 REAL copys( * ), s( * )
210 COMPLEX a( * ), b( * ), c( * ), copya( * ), copyb( * )
217 parameter( ntests = 16 )
219 parameter( smlsiz = 25 )
221 parameter( one = 1.0e+0, zero = 0.0e+0 )
223 parameter( cone = ( 1.0e+0, 0.0e+0 ),
224 $ czero = ( 0.0e+0, 0.0e+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_cgels, lwork_cgetsls, lwork_cgelss,
235 $ lwork_cgelsy, lwork_cgelsd,
236 $ lrwork_cgelsy, lrwork_cgelss, lrwork_cgelsd
237 REAL eps, norma, normb, rcond
240 INTEGER iseed( 4 ), iseedy( 4 ), iwq
241 REAL result( ntests ), rwq
245 COMPLEX,
ALLOCATABLE :: work (:)
246 REAL,
ALLOCATABLE :: rwork (:)
247 INTEGER,
ALLOCATABLE :: iwork (:)
260 INTRINSIC max, min, int,
REAL, 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 ) =
'Complex precision' 284 iseed( i ) = iseedy( i )
290 rcond = sqrt( eps ) - ( sqrt( eps )-eps ) / 2
296 $
CALL cerrls( 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 cgels( trans, m, n, nrhs, a, lda,
365 $ b, ldb, wq, -1, info )
366 lwork_cgels = int( wq )
368 CALL cgetsls( trans, m, n, nrhs, a, lda,
369 $ b, ldb, wq, -1, info )
370 lwork_cgetsls = int( wq )
374 CALL cgelsy( m, n, nrhs, a, lda, b, ldb,
375 $ iwq, rcond, crank, wq, -1, rwork,
377 lwork_cgelsy = int( wq )
380 CALL cgelss( m, n, nrhs, a, lda, b, ldb, s,
381 $ rcond, crank, wq, -1, rwork, info )
382 lwork_cgelss = int( wq )
383 lrwork_cgelss = 5*mnmin
385 CALL cgelsd( m, n, nrhs, a, lda, b, ldb, s,
386 $ rcond, crank, wq, -1, rwq, iwq,
388 lwork_cgelsd = int( wq )
389 lrwork_cgelsd = int( rwq )
391 liwork = max( liwork, n, iwq )
393 lrwork = max( lrwork, lrwork_cgelsy,
394 $ lrwork_cgelss, lrwork_cgelsd )
396 lwork = max( lwork, lwork_cgels, lwork_cgetsls,
397 $ lwork_cgelsy, lwork_cgelss,
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 cqrt13( 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 clarnv( 2, iseed, ncols*nrhs,
462 $ one /
REAL( NCOLS ), work,
465 CALL cgemm( trans,
'No transpose', nrows,
466 $ nrhs, ncols, cone, copya, lda,
467 $ work, ldwork, czero, b, ldb )
468 CALL clacpy(
'Full', nrows, nrhs, b, ldb,
473 IF( m.GT.0 .AND. n.GT.0 )
THEN 474 CALL clacpy(
'Full', m, n, copya, lda,
476 CALL clacpy(
'Full', nrows, nrhs,
477 $ copyb, ldb, b, ldb )
480 CALL cgels( trans, m, n, nrhs, a, lda, b,
481 $ ldb, work, lwork, info )
484 $
CALL alaerh( path,
'CGELS ', 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 clacpy(
'Full', nrows, nrhs,
494 $ copyb, ldb, c, ldb )
495 CALL cqrt16( 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 ) =
cqrt17( trans, 1, m, n,
505 $ nrhs, copya, lda, b, ldb,
506 $ copyb, ldb, c, work,
512 result( 2 ) =
cqrt14( 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 cqrt13( 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 clarnv( 2, iseed, ncols*nrhs,
565 CALL cscal( ncols*nrhs,
566 $ one /
REAL( NCOLS ), work,
569 CALL cgemm( trans,
'No transpose', nrows,
570 $ nrhs, ncols, cone, copya, lda,
571 $ work, ldwork, czero, b, ldb )
572 CALL clacpy(
'Full', nrows, nrhs, b, ldb,
577 IF( m.GT.0 .AND. n.GT.0 )
THEN 578 CALL clacpy(
'Full', m, n, copya, lda,
580 CALL clacpy(
'Full', nrows, nrhs,
581 $ copyb, ldb, b, ldb )
584 CALL cgetsls( trans, m, n, nrhs, a,
585 $ lda, b, ldb, work, lwork, info )
587 $
CALL alaerh( path,
'CGETSLS ', 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 clacpy(
'Full', nrows, nrhs,
597 $ copyb, ldb, c, ldb )
598 CALL cqrt16( 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 ) =
cqrt17( trans, 1, m, n,
608 $ nrhs, copya, lda, b, ldb,
609 $ copyb, ldb, c, work,
615 result( 16 ) =
cqrt14( 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 cqrt15( 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 clacpy(
'Full', m, n, copya, lda, a, lda )
665 CALL clacpy(
'Full', m, nrhs, copyb, ldb, b,
675 CALL cgelsy( m, n, nrhs, a, lda, b, ldb, iwork,
676 $ rcond, crank, work, lwlsy, rwork,
679 $
CALL alaerh( path,
'CGELSY', info, 0,
' ', m,
680 $ n, nrhs, -1, nb, itype, nfail,
688 result( 3 ) =
cqrt12( crank, crank, a, lda,
689 $ copys, work, lwork, rwork )
694 CALL clacpy(
'Full', m, nrhs, copyb, ldb, work,
696 CALL cqrt16(
'No transpose', m, n, nrhs, copya,
697 $ lda, b, ldb, work, ldwork, rwork,
705 $ result( 5 ) =
cqrt17(
'No transpose', 1, m,
706 $ n, nrhs, copya, lda, b, ldb,
707 $ copyb, ldb, c, work, lwork )
715 $ result( 6 ) =
cqrt14(
'No transpose', m, n,
716 $ nrhs, copya, lda, b, ldb,
725 CALL clacpy(
'Full', m, n, copya, lda, a, lda )
726 CALL clacpy(
'Full', m, nrhs, copyb, ldb, b,
729 CALL cgelss( m, n, nrhs, a, lda, b, ldb, s,
730 $ rcond, crank, work, lwork, rwork,
734 $
CALL alaerh( path,
'CGELSS', info, 0,
' ', m,
735 $ n, nrhs, -1, nb, itype, nfail,
744 CALL saxpy( mnmin, -one, copys, 1, s, 1 )
745 result( 7 ) =
sasum( mnmin, s, 1 ) /
746 $
sasum( mnmin, copys, 1 ) /
747 $ ( eps*
REAL( MNMIN ) )
754 CALL clacpy(
'Full', m, nrhs, copyb, ldb, work,
756 CALL cqrt16(
'No transpose', m, n, nrhs, copya,
757 $ lda, b, ldb, work, ldwork, rwork,
764 $ result( 9 ) =
cqrt17(
'No transpose', 1, m,
765 $ n, nrhs, copya, lda, b, ldb,
766 $ copyb, ldb, c, work, lwork )
772 $ result( 10 ) =
cqrt14(
'No transpose', m, n,
773 $ nrhs, copya, lda, b, ldb,
784 CALL clacpy(
'Full', m, n, copya, lda, a, lda )
785 CALL clacpy(
'Full', m, nrhs, copyb, ldb, b,
789 CALL cgelsd( m, n, nrhs, a, lda, b, ldb, s,
790 $ rcond, crank, work, lwork, rwork,
793 $
CALL alaerh( path,
'CGELSD', info, 0,
' ', m,
794 $ n, nrhs, -1, nb, itype, nfail,
800 CALL saxpy( mnmin, -one, copys, 1, s, 1 )
801 result( 11 ) =
sasum( mnmin, s, 1 ) /
802 $
sasum( mnmin, copys, 1 ) /
803 $ ( eps*
REAL( MNMIN ) )
810 CALL clacpy(
'Full', m, nrhs, copyb, ldb, work,
812 CALL cqrt16(
'No transpose', m, n, nrhs, copya,
813 $ lda, b, ldb, work, ldwork, rwork,
820 $ result( 13 ) =
cqrt17(
'No transpose', 1, m,
821 $ n, nrhs, copya, lda, b, ldb,
822 $ copyb, ldb, c, work, lwork )
828 $ result( 14 ) =
cqrt14(
'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 )
subroutine alasvm(TYPE, NOUT, NFAIL, NRUN, NERRS)
ALASVM
subroutine alahd(IOUNIT, PATH)
ALAHD
subroutine cgelsy(M, N, NRHS, A, LDA, B, LDB, JPVT, RCOND, RANK, WORK, LWORK, RWORK, INFO)
CGELSY solves overdetermined or underdetermined systems for GE matrices
subroutine cgels(TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK, INFO)
CGELS solves overdetermined or underdetermined systems for GE matrices
real function cqrt14(TRANS, M, N, NRHS, A, LDA, X, LDX, WORK, LWORK)
CQRT14
subroutine alaerh(PATH, SUBNAM, INFO, INFOE, OPTS, M, N, KL, KU, N5, IMAT, NFAIL, NERRS, NOUT)
ALAERH
subroutine cgetsls(TRANS, M, N, NRHS, A, LDA, B, LDB, WORK, LWORK, INFO)
subroutine cqrt13(SCALE, M, N, A, LDA, NORMA, ISEED)
CQRT13
real function cqrt12(M, N, A, LDA, S, WORK, LWORK, RWORK)
CQRT12
subroutine cqrt16(TRANS, M, N, NRHS, A, LDA, X, LDX, B, LDB, RWORK, RESID)
CQRT16
subroutine clarnv(IDIST, ISEED, N, X)
CLARNV returns a vector of random numbers from a uniform or normal distribution.
subroutine cgelss(M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK, WORK, LWORK, RWORK, INFO)
CGELSS solves overdetermined or underdetermined systems for GE matrices
subroutine xlaenv(ISPEC, NVALUE)
XLAENV
subroutine cscal(N, CA, CX, INCX)
CSCAL
real function sasum(N, SX, INCX)
SASUM
subroutine saxpy(N, SA, SX, INCX, SY, INCY)
SAXPY
real function slamch(CMACH)
SLAMCH
subroutine clacpy(UPLO, M, N, A, LDA, B, LDB)
CLACPY copies all or part of one two-dimensional array to another.
subroutine cgelsd(M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK, WORK, LWORK, RWORK, IWORK, INFO)
CGELSD computes the minimum-norm solution to a linear least squares problem for GE matrices ...
subroutine cerrls(PATH, NUNIT)
CERRLS
subroutine cqrt15(SCALE, RKSEL, M, N, NRHS, A, LDA, B, LDB, S, RANK, NORMA, NORMB, ISEED, WORK, LWORK)
CQRT15
subroutine cgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
CGEMM
subroutine csscal(N, SA, CX, INCX)
CSSCAL
real function cqrt17(TRANS, IRESID, M, N, NRHS, A, LDA, X, LDX, B, LDB, C, WORK, LWORK)
CQRT17