413 SUBROUTINE cchkbd( NSIZES, MVAL, NVAL, NTYPES, DOTYPE, NRHS,
414 $ ISEED, THRESH, A, LDA, BD, BE, S1, S2, X, LDX,
415 $ Y, Z, Q, LDQ, PT, LDPT, U, VT, WORK, LWORK,
416 $ RWORK, NOUT, INFO )
424 INTEGER INFO, LDA, LDPT, LDQ, LDX, LWORK, NOUT, NRHS,
430 INTEGER ISEED( 4 ), MVAL( * ), NVAL( * )
431 REAL BD( * ), BE( * ), RWORK( * ), S1( * ), S2( * )
432 COMPLEX A( LDA, * ), PT( LDPT, * ), Q( LDQ, * ),
433 $ u( ldpt, * ), vt( ldpt, * ), work( * ),
434 $ x( ldx, * ), y( ldx, * ), z( ldx, * )
440 REAL ZERO, ONE, TWO, HALF
441 PARAMETER ( ZERO = 0.0e0, one = 1.0e0, two = 2.0e0,
444 parameter( czero = ( 0.0e+0, 0.0e+0 ),
445 $ cone = ( 1.0e+0, 0.0e+0 ) )
447 parameter( maxtyp = 16 )
450 LOGICAL BADMM, BADNN, BIDIAG
453 INTEGER I, IINFO, IMODE, ITYPE, J, JCOL, JSIZE, JTYPE,
454 $ log2ui, m, minwrk, mmax, mnmax, mnmin, mq,
455 $ mtypes, n, nfail, nmax, ntest
456 REAL AMNINV, ANORM, COND, OVFL, RTOVFL, RTUNFL,
457 $ TEMP1, TEMP2, ULP, ULPINV, UNFL
460 INTEGER IOLDSD( 4 ), IWORK( 1 ), KMAGN( MAXTYP ),
461 $ KMODE( MAXTYP ), KTYPE( MAXTYP )
462 REAL DUMMA( 1 ), RESULT( 14 )
466 EXTERNAL SLAMCH, SLARND
475 INTRINSIC abs, exp, int, log, max, min, sqrt
483 COMMON / infoc / infot, nunit, ok, lerr
484 COMMON / srnamc / srnamt
487 DATA ktype / 1, 2, 5*4, 5*6, 3*9, 10 /
488 DATA kmagn / 2*1, 3*1, 2, 3, 3*1, 2, 3, 1, 2, 3, 0 /
489 DATA kmode / 2*0, 4, 3, 1, 4, 4, 4, 3, 1, 4, 4, 0,
505 mmax = max( mmax, mval( j ) )
508 nmax = max( nmax, nval( j ) )
511 mnmax = max( mnmax, min( mval( j ), nval( j ) ) )
512 minwrk = max( minwrk, 3*( mval( j )+nval( j ) ),
513 $ mval( j )*( mval( j )+max( mval( j ), nval( j ),
514 $ nrhs )+1 )+nval( j )*min( nval( j ), mval( j ) ) )
519 IF( nsizes.LT.0 )
THEN
521 ELSE IF( badmm )
THEN
523 ELSE IF( badnn )
THEN
525 ELSE IF( ntypes.LT.0 )
THEN
527 ELSE IF( nrhs.LT.0 )
THEN
529 ELSE IF( lda.LT.mmax )
THEN
531 ELSE IF( ldx.LT.mmax )
THEN
533 ELSE IF( ldq.LT.mmax )
THEN
535 ELSE IF( ldpt.LT.mnmax )
THEN
537 ELSE IF( minwrk.GT.lwork )
THEN
542 CALL xerbla(
'CCHKBD', -info )
548 path( 1: 1 ) =
'Complex precision'
552 unfl = slamch(
'Safe minimum' )
553 ovfl = slamch(
'Overflow' )
555 ulp = slamch(
'Precision' )
557 log2ui = int( log( ulpinv ) / log( two ) )
558 rtunfl = sqrt( unfl )
559 rtovfl = sqrt( ovfl )
564 DO 180 jsize = 1, nsizes
568 amninv = one / max( m, n, 1 )
570 IF( nsizes.NE.1 )
THEN
571 mtypes = min( maxtyp, ntypes )
573 mtypes = min( maxtyp+1, ntypes )
576 DO 170 jtype = 1, mtypes
577 IF( .NOT.dotype( jtype ) )
581 ioldsd( j ) = iseed( j )
606 IF( mtypes.GT.maxtyp )
609 itype = ktype( jtype )
610 imode = kmode( jtype )
614 GO TO ( 40, 50, 60 )kmagn( jtype )
621 anorm = ( rtovfl*ulp )*amninv
625 anorm = rtunfl*max( m, n )*ulpinv
630 CALL claset(
'Full', lda, n, czero, czero, a, lda )
635 IF( itype.EQ.1 )
THEN
641 ELSE IF( itype.EQ.2 )
THEN
645 DO 80 jcol = 1, mnmin
646 a( jcol, jcol ) = anorm
649 ELSE IF( itype.EQ.4 )
THEN
653 CALL clatms( mnmin, mnmin,
'S', iseed,
'N', rwork, imode,
654 $ cond, anorm, 0, 0,
'N', a, lda, work,
657 ELSE IF( itype.EQ.5 )
THEN
661 CALL clatms( mnmin, mnmin,
'S', iseed,
'S', rwork, imode,
662 $ cond, anorm, m, n,
'N', a, lda, work,
665 ELSE IF( itype.EQ.6 )
THEN
669 CALL clatms( m, n,
'S', iseed,
'N', rwork, imode, cond,
670 $ anorm, m, n,
'N', a, lda, work, iinfo )
672 ELSE IF( itype.EQ.7 )
THEN
676 CALL clatmr( mnmin, mnmin,
'S', iseed,
'N', work, 6, one,
677 $ cone,
'T',
'N', work( mnmin+1 ), 1, one,
678 $ work( 2*mnmin+1 ), 1, one,
'N', iwork, 0, 0,
679 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
681 ELSE IF( itype.EQ.8 )
THEN
685 CALL clatmr( mnmin, mnmin,
'S', iseed,
'S', work, 6, one,
686 $ cone,
'T',
'N', work( mnmin+1 ), 1, one,
687 $ work( m+mnmin+1 ), 1, one,
'N', iwork, m, n,
688 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
690 ELSE IF( itype.EQ.9 )
THEN
694 CALL clatmr( m, n,
'S', iseed,
'N', work, 6, one, cone,
695 $
'T',
'N', work( mnmin+1 ), 1, one,
696 $ work( m+mnmin+1 ), 1, one,
'N', iwork, m, n,
697 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
699 ELSE IF( itype.EQ.10 )
THEN
703 temp1 = -two*log( ulp )
705 bd( j ) = exp( temp1*slarnd( 2, iseed ) )
707 $ be( j ) = exp( temp1*slarnd( 2, iseed ) )
721 IF( iinfo.EQ.0 )
THEN
726 CALL clatmr( mnmin, nrhs,
'S', iseed,
'N', work, 6,
727 $ one, cone,
'T',
'N', work( mnmin+1 ), 1,
728 $ one, work( 2*mnmin+1 ), 1, one,
'N',
729 $ iwork, mnmin, nrhs, zero, one,
'NO', y,
730 $ ldx, iwork, iinfo )
732 CALL clatmr( m, nrhs,
'S', iseed,
'N', work, 6, one,
733 $ cone,
'T',
'N', work( m+1 ), 1, one,
734 $ work( 2*m+1 ), 1, one,
'N', iwork, m,
735 $ nrhs, zero, one,
'NO', x, ldx, iwork,
742 IF( iinfo.NE.0 )
THEN
743 WRITE( nout, fmt = 9998 )
'Generator', iinfo, m, n,
753 IF( .NOT.bidiag )
THEN
758 CALL clacpy(
' ', m, n, a, lda, q, ldq )
759 CALL cgebrd( m, n, q, ldq, bd, be, work, work( mnmin+1 ),
760 $ work( 2*mnmin+1 ), lwork-2*mnmin, iinfo )
764 IF( iinfo.NE.0 )
THEN
765 WRITE( nout, fmt = 9998 )
'CGEBRD', iinfo, m, n,
771 CALL clacpy(
' ', m, n, q, ldq, pt, ldpt )
783 CALL cungbr(
'Q', m, mq, n, q, ldq, work,
784 $ work( 2*mnmin+1 ), lwork-2*mnmin, iinfo )
788 IF( iinfo.NE.0 )
THEN
789 WRITE( nout, fmt = 9998 )
'CUNGBR(Q)', iinfo, m, n,
797 CALL cungbr(
'P', mnmin, n, m, pt, ldpt, work( mnmin+1 ),
798 $ work( 2*mnmin+1 ), lwork-2*mnmin, iinfo )
802 IF( iinfo.NE.0 )
THEN
803 WRITE( nout, fmt = 9998 )
'CUNGBR(P)', iinfo, m, n,
811 CALL cgemm(
'Conjugate transpose',
'No transpose', m,
812 $ nrhs, m, cone, q, ldq, x, ldx, czero, y,
819 CALL cbdt01( m, n, 1, a, lda, q, ldq, bd, be, pt, ldpt,
820 $ work, rwork, result( 1 ) )
821 CALL cunt01(
'Columns', m, mq, q, ldq, work, lwork,
822 $ rwork, result( 2 ) )
823 CALL cunt01(
'Rows', mnmin, n, pt, ldpt, work, lwork,
824 $ rwork, result( 3 ) )
830 CALL scopy( mnmin, bd, 1, s1, 1 )
832 $
CALL scopy( mnmin-1, be, 1, rwork, 1 )
833 CALL clacpy(
' ', m, nrhs, y, ldx, z, ldx )
834 CALL claset(
'Full', mnmin, mnmin, czero, cone, u, ldpt )
835 CALL claset(
'Full', mnmin, mnmin, czero, cone, vt, ldpt )
837 CALL cbdsqr( uplo, mnmin, mnmin, mnmin, nrhs, s1, rwork, vt,
838 $ ldpt, u, ldpt, z, ldx, rwork( mnmin+1 ),
843 IF( iinfo.NE.0 )
THEN
844 WRITE( nout, fmt = 9998 )
'CBDSQR(vects)', iinfo, m, n,
847 IF( iinfo.LT.0 )
THEN
858 CALL scopy( mnmin, bd, 1, s2, 1 )
860 $
CALL scopy( mnmin-1, be, 1, rwork, 1 )
862 CALL cbdsqr( uplo, mnmin, 0, 0, 0, s2, rwork, vt, ldpt, u,
863 $ ldpt, z, ldx, rwork( mnmin+1 ), iinfo )
867 IF( iinfo.NE.0 )
THEN
868 WRITE( nout, fmt = 9998 )
'CBDSQR(values)', iinfo, m, n,
871 IF( iinfo.LT.0 )
THEN
884 CALL cbdt03( uplo, mnmin, 1, bd, be, u, ldpt, s1, vt, ldpt,
885 $ work, result( 4 ) )
886 CALL cbdt02( mnmin, nrhs, y, ldx, z, ldx, u, ldpt, work,
887 $ rwork, result( 5 ) )
888 CALL cunt01(
'Columns', mnmin, mnmin, u, ldpt, work, lwork,
889 $ rwork, result( 6 ) )
890 CALL cunt01(
'Rows', mnmin, mnmin, vt, ldpt, work, lwork,
891 $ rwork, result( 7 ) )
897 DO 110 i = 1, mnmin - 1
898 IF( s1( i ).LT.s1( i+1 ) )
899 $ result( 8 ) = ulpinv
900 IF( s1( i ).LT.zero )
901 $ result( 8 ) = ulpinv
903 IF( mnmin.GE.1 )
THEN
904 IF( s1( mnmin ).LT.zero )
905 $ result( 8 ) = ulpinv
913 temp1 = abs( s1( j )-s2( j ) ) /
914 $ max( sqrt( unfl )*max( s1( 1 ), one ),
915 $ ulp*max( abs( s1( j ) ), abs( s2( j ) ) ) )
916 temp2 = max( temp1, temp2 )
924 temp1 = thresh*( half-ulp )
927 CALL ssvdch( mnmin, bd, be, s1, temp1, iinfo )
939 IF( .NOT.bidiag )
THEN
940 CALL scopy( mnmin, bd, 1, s2, 1 )
942 $
CALL scopy( mnmin-1, be, 1, rwork, 1 )
944 CALL cbdsqr( uplo, mnmin, n, m, nrhs, s2, rwork, pt,
945 $ ldpt, q, ldq, y, ldx, rwork( mnmin+1 ),
953 CALL cbdt01( m, n, 0, a, lda, q, ldq, s2, dumma, pt,
954 $ ldpt, work, rwork, result( 11 ) )
955 CALL cbdt02( m, nrhs, x, ldx, y, ldx, q, ldq, work,
956 $ rwork, result( 12 ) )
957 CALL cunt01(
'Columns', m, mq, q, ldq, work, lwork,
958 $ rwork, result( 13 ) )
959 CALL cunt01(
'Rows', mnmin, n, pt, ldpt, work, lwork,
960 $ rwork, result( 14 ) )
967 IF( result( j ).GE.thresh )
THEN
969 $
CALL slahd2( nout, path )
970 WRITE( nout, fmt = 9999 )m, n, jtype, ioldsd, j,
975 IF( .NOT.bidiag )
THEN
986 CALL alasum( path, nout, nfail, ntest, 0 )
992 9999
FORMAT(
' M=', i5,
', N=', i5,
', type ', i2,
', seed=',
993 $ 4( i4,
',' ),
' test(', i2,
')=', g11.4 )
994 9998
FORMAT(
' CCHKBD: ', a,
' returned INFO=', i6,
'.', / 9x,
'M=',
995 $ i6,
', N=', i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ),