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, LDX, 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,
454 $ TEMP1, TEMP2, ULP, ULPINV, UNFL
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 ELSE IF( itype.EQ.10 )
THEN
700 temp1 = -two*log( ulp )
702 bd( j ) = exp( temp1*slarnd( 2, iseed ) )
704 $ be( j ) = exp( temp1*slarnd( 2, iseed ) )
718 IF( iinfo.EQ.0 )
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 )
924 CALL ssvdch( mnmin, bd, be, s1, temp1, iinfo )
936 IF( .NOT.bidiag )
THEN
937 CALL scopy( mnmin, bd, 1, s2, 1 )
939 $
CALL scopy( mnmin-1, be, 1, rwork, 1 )
941 CALL cbdsqr( uplo, mnmin, n, m, nrhs, s2, rwork, pt,
942 $ ldpt, q, ldq, y, ldx, rwork( mnmin+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,
',' ),
subroutine slabad(SMALL, LARGE)
SLABAD
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine alasum(TYPE, NOUT, NFAIL, NRUN, NERRS)
ALASUM
subroutine cgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
CGEMM
subroutine cchkbd(NSIZES, MVAL, NVAL, NTYPES, DOTYPE, NRHS, ISEED, THRESH, A, LDA, BD, BE, S1, S2, X, LDX, Y, Z, Q, LDQ, PT, LDPT, U, VT, WORK, LWORK, RWORK, NOUT, INFO)
CCHKBD
subroutine cbdt02(M, N, B, LDB, C, LDC, U, LDU, WORK, RWORK, RESID)
CBDT02
subroutine cbdt01(M, N, KD, A, LDA, Q, LDQ, D, E, PT, LDPT, WORK, RWORK, RESID)
CBDT01
subroutine cunt01(ROWCOL, M, N, U, LDU, WORK, LWORK, RWORK, RESID)
CUNT01
subroutine cbdt03(UPLO, N, KD, D, E, U, LDU, S, VT, LDVT, WORK, RESID)
CBDT03
subroutine clatms(M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, KL, KU, PACK, A, LDA, WORK, INFO)
CLATMS
subroutine clatmr(M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, RSIGN, GRADE, DL, MODEL, CONDL, DR, MODER, CONDR, PIVTNG, IPIVOT, KL, KU, SPARSE, ANORM, PACK, A, LDA, IWORK, INFO)
CLATMR
subroutine cungbr(VECT, M, N, K, A, LDA, TAU, WORK, LWORK, INFO)
CUNGBR
subroutine cgebrd(M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK, INFO)
CGEBRD
subroutine claset(UPLO, M, N, ALPHA, BETA, A, LDA)
CLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine clacpy(UPLO, M, N, A, LDA, B, LDB)
CLACPY copies all or part of one two-dimensional array to another.
subroutine cbdsqr(UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U, LDU, C, LDC, RWORK, INFO)
CBDSQR
subroutine scopy(N, SX, INCX, SY, INCY)
SCOPY
subroutine ssvdch(N, S, E, SVD, TOL, INFO)
SSVDCH
subroutine slahd2(IOUNIT, PATH)
SLAHD2