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( 1 )
241 REAL RESULT( NTESTS ), RWQ( 1 )
245 COMPLEX,
ALLOCATABLE :: WORK (:)
246 REAL,
ALLOCATABLE :: RWORK (:), WORK2 (:)
247 INTEGER,
ALLOCATABLE :: IWORK (:)
250 REAL CQRT12, CQRT14, CQRT17, SASUM, SLAMCH
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( 1 ) )
368 CALL cgetsls( trans, m, n, nrhs, a, lda,
369 $ b, ldb, wq, -1, info )
370 lwork_cgetsls = int( wq( 1 ) )
374 CALL cgelsy( m, n, nrhs, a, lda, b, ldb,
375 $ iwq, rcond, crank, wq, -1, rwork,
377 lwork_cgelsy = int( wq( 1 ) )
380 CALL cgelss( m, n, nrhs, a, lda, b, ldb, s,
381 $ rcond, crank, wq, -1, rwork, info )
382 lwork_cgelss = int( wq( 1 ) )
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( 1 ) )
389 lrwork_cgelsd = int( rwq( 1 ) )
391 liwork = max( liwork, n, iwq( 1 ) )
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 ) )
411 ALLOCATE( work2( 2 * lwork ) )
419 mnmin = max(min( m, n ),1)
428 itype = ( irank-1 )*3 + iscale
429 IF( .NOT.dotype( itype ) )
432 IF( irank.EQ.1 )
THEN
438 CALL cqrt13( iscale, m, n, copya, lda, norma,
443 CALL xlaenv( 3, nxval( inb ) )
446 IF( itran.EQ.1 )
THEN
455 ldwork = max( 1, ncols )
459 IF( ncols.GT.0 )
THEN
460 CALL clarnv( 2, iseed, ncols*nrhs,
463 $ one / real( ncols ), work,
466 CALL cgemm( trans,
'No transpose', nrows,
467 $ nrhs, ncols, cone, copya, lda,
468 $ work, ldwork, czero, b, ldb )
469 CALL clacpy(
'Full', nrows, nrhs, b, ldb,
474 IF( m.GT.0 .AND. n.GT.0 )
THEN
475 CALL clacpy(
'Full', m, n, copya, lda,
477 CALL clacpy(
'Full', nrows, nrhs,
478 $ copyb, ldb, b, ldb )
481 CALL cgels( trans, m, n, nrhs, a, lda, b,
482 $ ldb, work, lwork, info )
485 $
CALL alaerh( path,
'CGELS ', info, 0,
486 $ trans, m, n, nrhs, -1, nb,
487 $ itype, nfail, nerrs,
492 ldwork = max( 1, nrows )
493 IF( nrows.GT.0 .AND. nrhs.GT.0 )
494 $
CALL clacpy(
'Full', nrows, nrhs,
495 $ copyb, ldb, c, ldb )
496 CALL cqrt16( trans, m, n, nrhs, copya,
497 $ lda, b, ldb, c, ldb, rwork,
500 IF( ( itran.EQ.1 .AND. m.GE.n ) .OR.
501 $ ( itran.EQ.2 .AND. m.LT.n ) )
THEN
505 result( 2 ) =
cqrt17( trans, 1, m, n,
506 $ nrhs, copya, lda, b, ldb,
507 $ copyb, ldb, c, work,
513 result( 2 ) =
cqrt14( trans, m, n,
514 $ nrhs, copya, lda, b, ldb,
522 IF( result( k ).GE.thresh )
THEN
523 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
524 $
CALL alahd( nout, path )
525 WRITE( nout, fmt = 9999 )trans, m,
526 $ n, nrhs, nb, itype, k,
540 CALL cqrt13( iscale, m, n, copya, lda, norma,
550 IF( itran.EQ.1 )
THEN
559 ldwork = max( 1, ncols )
563 IF( ncols.GT.0 )
THEN
564 CALL clarnv( 2, iseed, ncols*nrhs,
566 CALL cscal( ncols*nrhs,
567 $ one / real( ncols ), work,
570 CALL cgemm( trans,
'No transpose', nrows,
571 $ nrhs, ncols, cone, copya, lda,
572 $ work, ldwork, czero, b, ldb )
573 CALL clacpy(
'Full', nrows, nrhs, b, ldb,
578 IF( m.GT.0 .AND. n.GT.0 )
THEN
579 CALL clacpy(
'Full', m, n, copya, lda,
581 CALL clacpy(
'Full', nrows, nrhs,
582 $ copyb, ldb, b, ldb )
585 CALL cgetsls( trans, m, n, nrhs, a,
586 $ lda, b, ldb, work, lwork, info )
588 $
CALL alaerh( path,
'CGETSLS ', info, 0,
589 $ trans, m, n, nrhs, -1, nb,
590 $ itype, nfail, nerrs,
595 ldwork = max( 1, nrows )
596 IF( nrows.GT.0 .AND. nrhs.GT.0 )
597 $
CALL clacpy(
'Full', nrows, nrhs,
598 $ copyb, ldb, c, ldb )
599 CALL cqrt16( trans, m, n, nrhs, copya,
600 $ lda, b, ldb, c, ldb, work2,
603 IF( ( itran.EQ.1 .AND. m.GE.n ) .OR.
604 $ ( itran.EQ.2 .AND. m.LT.n ) )
THEN
608 result( 16 ) =
cqrt17( trans, 1, m, n,
609 $ nrhs, copya, lda, b, ldb,
610 $ copyb, ldb, c, work,
616 result( 16 ) =
cqrt14( trans, m, n,
617 $ nrhs, copya, lda, b, ldb,
625 IF( result( k ).GE.thresh )
THEN
626 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
627 $
CALL alahd( nout, path )
628 WRITE( nout, fmt = 9997 )trans, m,
629 $ n, nrhs, mb, nb, itype, k,
643 CALL cqrt15( iscale, irank, m, n, nrhs, copya, lda,
644 $ copyb, ldb, copys, rank, norma, normb,
645 $ iseed, work, lwork )
656 CALL xlaenv( 3, nxval( inb ) )
665 CALL clacpy(
'Full', m, n, copya, lda, a, lda )
666 CALL clacpy(
'Full', m, nrhs, copyb, ldb, b,
676 CALL cgelsy( m, n, nrhs, a, lda, b, ldb, iwork,
677 $ rcond, crank, work, lwlsy, rwork,
680 $
CALL alaerh( path,
'CGELSY', info, 0,
' ', m,
681 $ n, nrhs, -1, nb, itype, nfail,
689 result( 3 ) =
cqrt12( crank, crank, a, lda,
690 $ copys, work, lwork, rwork )
695 CALL clacpy(
'Full', m, nrhs, copyb, ldb, work,
697 CALL cqrt16(
'No transpose', m, n, nrhs, copya,
698 $ lda, b, ldb, work, ldwork, rwork,
706 $ result( 5 ) =
cqrt17(
'No transpose', 1, m,
707 $ n, nrhs, copya, lda, b, ldb,
708 $ copyb, ldb, c, work, lwork )
716 $ result( 6 ) =
cqrt14(
'No transpose', m, n,
717 $ nrhs, copya, lda, b, ldb,
726 CALL clacpy(
'Full', m, n, copya, lda, a, lda )
727 CALL clacpy(
'Full', m, nrhs, copyb, ldb, b,
730 CALL cgelss( m, n, nrhs, a, lda, b, ldb, s,
731 $ rcond, crank, work, lwork, rwork,
735 $
CALL alaerh( path,
'CGELSS', info, 0,
' ', m,
736 $ n, nrhs, -1, nb, itype, nfail,
745 CALL saxpy( mnmin, -one, copys, 1, s, 1 )
746 result( 7 ) =
sasum( mnmin, s, 1 ) /
747 $
sasum( mnmin, copys, 1 ) /
748 $ ( eps*real( mnmin ) )
755 CALL clacpy(
'Full', m, nrhs, copyb, ldb, work,
757 CALL cqrt16(
'No transpose', m, n, nrhs, copya,
758 $ lda, b, ldb, work, ldwork, rwork,
765 $ result( 9 ) =
cqrt17(
'No transpose', 1, m,
766 $ n, nrhs, copya, lda, b, ldb,
767 $ copyb, ldb, c, work, lwork )
773 $ result( 10 ) =
cqrt14(
'No transpose', m, n,
774 $ nrhs, copya, lda, b, ldb,
785 CALL clacpy(
'Full', m, n, copya, lda, a, lda )
786 CALL clacpy(
'Full', m, nrhs, copyb, ldb, b,
790 CALL cgelsd( m, n, nrhs, a, lda, b, ldb, s,
791 $ rcond, crank, work, lwork, rwork,
794 $
CALL alaerh( path,
'CGELSD', info, 0,
' ', m,
795 $ n, nrhs, -1, nb, itype, nfail,
801 CALL saxpy( mnmin, -one, copys, 1, s, 1 )
802 result( 11 ) =
sasum( mnmin, s, 1 ) /
803 $
sasum( mnmin, copys, 1 ) /
804 $ ( eps*real( mnmin ) )
811 CALL clacpy(
'Full', m, nrhs, copyb, ldb, work,
813 CALL cqrt16(
'No transpose', m, n, nrhs, copya,
814 $ lda, b, ldb, work, ldwork, rwork,
821 $ result( 13 ) =
cqrt17(
'No transpose', 1, m,
822 $ n, nrhs, copya, lda, b, ldb,
823 $ copyb, ldb, c, work, lwork )
829 $ result( 14 ) =
cqrt14(
'No transpose', m, n,
830 $ nrhs, copya, lda, b, ldb,
837 IF( result( k ).GE.thresh )
THEN
838 IF( nfail.EQ.0 .AND. nerrs.EQ.0 )
839 $
CALL alahd( nout, path )
840 WRITE( nout, fmt = 9998 )m, n, nrhs, nb,
841 $ itype, k, result( k )
856 CALL alasvm( path, nout, nfail, nrun, nerrs )
858 9999
FORMAT(
' TRANS=''', a1,
''', M=', i5,
', N=', i5,
', NRHS=', i4,
859 $
', NB=', i4,
', type', i2,
', test(', i2,
')=', g12.5 )
860 9998
FORMAT(
' M=', i5,
', N=', i5,
', NRHS=', i4,
', NB=', i4,
861 $
', type', i2,
', test(', i2,
')=', g12.5 )
862 9997
FORMAT(
' TRANS=''', a1,
' M=', i5,
', N=', i5,
', NRHS=', i4,
863 $
', MB=', i4,
', NB=', i4,
', type', i2,
864 $
', test(', i2,
')=', g12.5 )