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, , JTYPE,
451 $ log2ui, m, minwrk, mmax, mnmax, mnmin, mq,
452 $ mtypes, n, nfail, nmax, ntest
453 REAL AMNINV, , COND, OVFL, RTOVFL, RTUNFL,
454 $ TEMP1, TEMP2, ULP, ULPINV,
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.EQ.
ELSE IF( ITYPE7 ) 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.EQ.
ELSE IF( ITYPE8 ) 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.EQ.
ELSE IF( ITYPE9 ) 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.NE.
IF( IINFO0 ) THEN
740 WRITE( NOUT, FMT = 9998 )'generator
', IINFO, M, N,
750.NOT.
IF( 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.NE.
IF( IINFO0 ) 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.NE.
IF( IINFO0 ) 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.NE.
IF( IINFO0 ) 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.NE.
IF( IINFO0 ) THEN
841 WRITE( NOUT, FMT = 9998 )'cbdsqr(vects)
', IINFO, M, N,
844.LT.
IF( IINFO0 ) 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.NE.
IF( IINFO0 ) THEN
865 WRITE( NOUT, FMT = 9998 )'cbdsqr(values)
', IINFO, M, N,
868.LT.
IF( IINFO0 ) 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.LT.
IF( S1( I )S1( I+1 ) )
896 $ RESULT( 8 ) = ULPINV
897.LT.
IF( S1( I )ZERO )
898 $ RESULT( 8 ) = ULPINV
900.GE.
IF( MNMIN1 ) THEN
901.LT.
IF( S1( MNMIN )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.NOT.
IF( 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.GE.
IF( RESULT( J )THRESH ) THEN
966 $ CALL SLAHD2( NOUT, PATH )
967 WRITE( NOUT, FMT = 9999 )M, N, JTYPE, IOLDSD, J,
972.NOT.
IF( 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 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 clacpy(uplo, m, n, a, lda, b, ldb)
CLACPY copies all or part of one two-dimensional array to another.
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 cbdsqr(uplo, n, ncvt, nru, ncc, d, e, vt, ldvt, u, ldu, c, ldc, rwork, info)
CBDSQR
subroutine cgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
CGEMM
subroutine cbdt03(uplo, n, kd, d, e, u, ldu, s, vt, ldvt, work, resid)
CBDT03
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 cbdt02(m, n, b, ldb, c, ldc, u, ldu, work, rwork, resid)
CBDT02
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 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 scopy(n, sx, incx, sy, incy)
SCOPY
subroutine ssvdch(n, s, e, svd, tol, info)
SSVDCH
subroutine slahd2(iounit, path)
SLAHD2