411 SUBROUTINE cchkbd( NSIZES, MVAL, NVAL, NTYPES, DOTYPE, NRHS,
412 $ ISEED, THRESH, A, LDA, BD, BE, S1, S2, X, LDX,
413 $ Y, Z, Q, LDQ, PT, LDPT, U, VT, WORK, LWORK,
414 $ RWORK, NOUT, INFO )
421 INTEGER INFO, LDA, LDPT, LDQ, , LWORK, NOUT, NRHS,
427 INTEGER ISEED( 4 ), MVAL( * ), NVAL( * )
428 REAL BD( * ), BE( * ), RWORK( * ), S1( * ), S2( * )
429 COMPLEX A( LDA, * ), PT( LDPT, * ), Q( LDQ, * ),
430 $ u( ldpt, * ), vt( ldpt, * ), work( * ),
431 $ x( ldx, * ), y( ldx, * ), z( ldx, * )
437 REAL ZERO, ONE, TWO, HALF
438 PARAMETER ( ZERO = 0.0e0, one = 1.0e0, two = 2.0e0,
441 parameter( czero = ( 0.0e+0, 0.0e+0 ),
442 $ cone = ( 1.0e+0, 0.0e+0 ) )
444 parameter( maxtyp = 16 )
447 LOGICAL BADMM, BADNN, BIDIAG
450 INTEGER I, IINFO, IMODE, ITYPE, J, JCOL, JSIZE, JTYPE,
451 $ log2ui, m, minwrk, mmax, mnmax, mnmin, mq,
452 $ mtypes, n, nfail, nmax, ntest
453 REAL AMNINV, ANORM, COND, OVFL, RTOVFL, RTUNFL
457 INTEGER IOLDSD( 4 ), IWORK( 1 ), KMAGN( MAXTYP ),
458 $ KMODE( MAXTYP ), KTYPE( MAXTYP )
459 REAL DUMMA( 1 ), RESULT( 14 )
463 EXTERNAL SLAMCH, SLARND
472 INTRINSIC abs, exp, int, log,
max,
min, sqrt
480 COMMON / infoc / infot, nunit, ok, lerr
481 COMMON / srnamc / srnamt
484 DATA ktype / 1, 2, 5*4, 5*6, 3*9, 10 /
485 DATA kmagn / 2*1, 3*1, 2, 3, 3*1, 2, 3, 1, 2, 3, 0 /
486 DATA kmode / 2*0, 4, 3, 1, 4, 4, 4, 3, 1, 4, 4, 0,
502 mmax =
max( mmax, mval( j ) )
505 nmax =
max( nmax, nval( j ) )
508 mnmax =
max( mnmax,
min( mval( j ), nval( j ) ) )
509 minwrk =
max( minwrk, 3*( mval( j )+nval( j ) ),
510 $ mval( j )*( mval( j )+
max( mval( j ), nval( j ),
511 $ nrhs )+1 )+nval( j )*
min( nval( j ), mval( j ) ) )
516 IF( nsizes.LT.0 )
THEN
518 ELSE IF( badmm )
THEN
520 ELSE IF( badnn )
THEN
522 ELSE IF( ntypes.LT.0 )
THEN
524 ELSE IF( nrhs.LT.0 )
THEN
526 ELSE IF( lda.LT.mmax )
THEN
528 ELSE IF( ldx.LT.mmax )
THEN
530 ELSE IF( ldq.LT.mmax )
THEN
532 ELSE IF( ldpt.LT.mnmax )
THEN
534 ELSE IF( minwrk.GT.lwork )
THEN
539 CALL xerbla(
'CCHKBD', -info )
545 path( 1: 1 ) =
'Complex precision'
549 unfl = slamch(
'Safe minimum' )
550 ovfl = slamch(
'Overflow' )
552 ulp = slamch(
'Precision' )
554 log2ui = int( log( ulpinv ) / log( two ) )
555 rtunfl = sqrt( unfl )
556 rtovfl = sqrt( ovfl )
561 DO 180 jsize = 1, nsizes
565 amninv = one /
max( m, n, 1 )
567 IF( nsizes.NE.1 )
THEN
568 mtypes =
min( maxtyp, ntypes )
570 mtypes =
min( maxtyp+1, ntypes )
573 DO 170 jtype = 1, mtypes
574 IF( .NOT.dotype( jtype ) )
578 ioldsd( j ) = iseed( j )
603 IF( mtypes.GT.maxtyp )
606 itype = ktype( jtype )
607 imode = kmode( jtype )
611 GO TO ( 40, 50, 60 )kmagn( jtype )
618 anorm = ( rtovfl*ulp )*amninv
622 anorm = rtunfl*
max( m, n )*ulpinv
627 CALL claset(
'Full', lda, n, czero, czero, a, lda )
632 IF( itype.EQ.1 )
THEN
638 ELSE IF( itype.EQ.2 )
THEN
642 DO 80 jcol = 1, mnmin
643 a( jcol, jcol ) = anorm
646 ELSE IF( itype.EQ.4 )
THEN
650 CALL clatms( mnmin, mnmin,
'S', iseed,
'N', rwork, imode,
651 $ cond, anorm, 0, 0,
'N', a, lda, work,
654 ELSE IF( itype.EQ.5 )
THEN
658 CALL clatms( mnmin, mnmin,
'S', iseed,
'S', rwork, imode,
659 $ cond, anorm, m, n,
'N', a, lda, work,
662 ELSE IF( itype.EQ.6 )
THEN
666 CALL clatms( m, n,
'S', iseed,
'N', rwork, imode, cond,
667 $ anorm, m, n,
'N', a, lda, work, iinfo )
669 ELSE IF( itype.EQ.7 )
THEN
673 CALL clatmr( mnmin, mnmin,
'S', iseed,
'N', work, 6, one,
674 $ cone,
'T',
'N', work( mnmin+1 ), 1, one,
675 $ work( 2*mnmin+1 ), 1, one,
'N', iwork, 0, 0,
676 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
678 ELSE IF( itype.EQ.8 )
THEN
682 CALL clatmr( mnmin, mnmin,
'S', iseed,
'S', work, 6, one,
683 $ cone,
'T',
'N', work( mnmin+1 ), 1, one,
684 $ work( m+mnmin+1 ), 1, one,
'N', iwork, m, n,
685 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
687 ELSE IF( itype.EQ.9 )
THEN
691 CALL clatmr( m, n,
'S', iseed, 'n
', WORK, 6, ONE, CONE,
692 $ 't
', 'n
', WORK( MNMIN+1 ), 1, ONE,
693 $ WORK( M+MNMIN+1 ), 1, ONE, 'n
', IWORK, M, N,
694 $ ZERO, ANORM, 'no
', A, LDA, IWORK, IINFO )
696.EQ.
ELSE IF( ITYPE10 ) THEN
700 TEMP1 = -TWO*LOG( ULP )
702 BD( J ) = EXP( TEMP1*SLARND( 2, ISEED ) )
704 $ BE( J ) = EXP( TEMP1*SLARND( 2, ISEED ) )
718.EQ.
IF( IINFO0 ) THEN
723 CALL CLATMR( MNMIN, NRHS, 's
', ISEED, 'n
', WORK, 6,
724 $ ONE, CONE, 't
', 'n', work( mnmin+1 ), 1,
725 $ one, work( 2*mnmin+1 ), 1, one,
'N',
726 $ iwork, mnmin, nrhs, zero, one,
'NO', y,
727 $ ldx, iwork, iinfo )
729 CALL clatmr( m, nrhs,
'S', iseed,
'N', work, 6, one,
730 $ cone,
'T',
'N', work( m+1 ), 1, one,
731 $ work( 2*m+1 ), 1, one,
'N', iwork, m,
732 $ nrhs, zero, one,
'NO', x, ldx, iwork,
739 IF( iinfo.NE.0 )
THEN
740 WRITE( nout, fmt = 9998 )
'Generator', iinfo, m, n,
750 IF( .NOT.bidiag )
THEN
755 CALL clacpy(
' ', m, n, a, lda, q, ldq )
756 CALL cgebrd( m, n, q, ldq, bd, be, work, work( mnmin+1 ),
757 $ work( 2*mnmin+1 ), lwork-2*mnmin, iinfo
761 IF( iinfo.NE.0 )
THEN
762 WRITE( nout, fmt = 9998 )
'CGEBRD', iinfo, m, n,
768 CALL clacpy(
' ', m, n, q, ldq, pt, ldpt )
780 CALL cungbr(
'Q', m, mq, n, q, ldq, work,
781 $ work( 2*mnmin+1 ), lwork-2*mnmin, iinfo )
785 IF( iinfo.NE.0 )
THEN
786 WRITE( nout, fmt = 9998 )
'CUNGBR(Q)', iinfo, m, n,
794 CALL cungbr(
'P', mnmin, n, m, pt, ldpt, work( mnmin+1 ),
795 $ work( 2*mnmin+1 ), lwork-2*mnmin, iinfo )
799 IF( iinfo.NE.0 )
THEN
800 WRITE( nout, fmt = 9998 )
'CUNGBR(P)', iinfo, m, n,
808 CALL cgemm(
'Conjugate transpose',
'No transpose', m,
809 $ nrhs, m, cone, q, ldq, x, ldx, czero, y,
816 CALL cbdt01( m, n, 1, a, lda, q, ldq, bd, be, pt, ldpt,
817 $ work, rwork, result( 1 ) )
818 CALL cunt01(
'Columns', m, mq, q, ldq, work, lwork,
819 $ rwork, result( 2 ) )
820 CALL cunt01(
'Rows', mnmin, n, pt, ldpt, work, lwork,
821 $ rwork, result( 3 ) )
827 CALL scopy( mnmin, bd, 1, s1, 1 )
829 $
CALL scopy( mnmin-1, be, 1, rwork, 1 )
830 CALL clacpy(
' ', m, nrhs, y, ldx, z, ldx )
831 CALL claset(
'Full', mnmin, mnmin, czero, cone, u, ldpt )
832 CALL claset(
'Full', mnmin, mnmin, czero, cone, vt, ldpt )
834 CALL cbdsqr( uplo, mnmin, mnmin, mnmin, nrhs, s1, rwork, vt,
835 $ ldpt, u, ldpt, z, ldx, rwork( mnmin+1 ),
840 IF( iinfo.NE.0 )
THEN
841 WRITE( nout, fmt = 9998 )
'CBDSQR(vects)', iinfo, m, n,
844 IF( iinfo.LT.0 )
THEN
855 CALL scopy( mnmin, bd, 1, s2, 1 )
857 $
CALL scopy( mnmin-1, be, 1, rwork, 1 )
859 CALL cbdsqr( uplo, mnmin, 0, 0, 0, s2, rwork, vt, ldpt, u,
860 $ ldpt, z, ldx, rwork( mnmin+1 ), iinfo )
864 IF( iinfo.NE.0 )
THEN
865 WRITE( nout, fmt = 9998 )
'CBDSQR(values)', iinfo, m, n,
868 IF( iinfo.LT.0 )
THEN
881 CALL cbdt03( uplo, mnmin, 1, bd, be, u, ldpt, s1, vt, ldpt,
882 $ work, result( 4 ) )
883 CALL cbdt02( mnmin, nrhs, y, ldx, z, ldx, u, ldpt, work,
884 $ rwork, result( 5 ) )
885 CALL cunt01(
'Columns', mnmin, mnmin, u, ldpt, work, lwork,
886 $ rwork, result( 6 ) )
887 CALL cunt01(
'Rows', mnmin, mnmin, vt, ldpt, work, lwork,
888 $ rwork, result( 7 ) )
894 DO 110 i = 1, mnmin - 1
895 IF( s1( i ).LT.s1( i+1 ) )
896 $ result( 8 ) = ulpinv
897 IF( s1( i ).LT.zero )
898 $ result( 8 ) = ulpinv
900 IF( mnmin.GE.1 )
THEN
901 IF( s1( mnmin ).LT.zero )
902 $ result( 8 ) = ulpinv
910 temp1 = abs( s1( j )-s2( j ) ) /
911 $
max( sqrt( unfl )*
max( s1( 1 ), one ),
912 $ ulp*
max( abs( s1( j ) ), abs( s2( j ) ) ) )
913 temp2 =
max( temp1, temp2 )
921 temp1 = thresh*( half-ulp )
936 IF( .NOT.bidiag )
THEN
937 CALL scopy( mnmin, bd, 1, s2, 1 )
939 $
CALL scopy( mnmin-1, be, 1, rwork, 1 )
950 CALL cbdt01( m, n, 0, a, lda, q, ldq, s2, dumma, pt,
951 $ ldpt, work, rwork, result( 11 ) )
952 CALL cbdt02( m, nrhs, x, ldx, y, ldx, q, ldq, work,
953 $ rwork, result( 12 ) )
954 CALL cunt01(
'Columns', m, mq, q, ldq, work, lwork
955 $ rwork, result( 13 ) )
956 CALL cunt01(
'Rows', mnmin, n, pt, ldpt, work, lwork,
957 $ rwork, result( 14 ) )
964 IF( result( j ).GE.thresh )
THEN
966 $
CALL slahd2( nout, path )
967 WRITE( nout, fmt = 9999 )m, n, jtype, ioldsd, j,
972 IF( .NOT.bidiag )
THEN
983 CALL alasum( path, nout, nfail, ntest, 0 )
989 9999
FORMAT(
' M=', i5,
', N=', i5,
', type ', i2,
', seed=',
990 $ 4( i4,
',' ),
' test(', i2,
')=', g11.4 )
991 9998
FORMAT(
' CCHKBD: ', a,
' returned INFO=', i6,
'.', / 9x,
'M=',
992 $ i6,
', N=', i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ),