411 SUBROUTINE zchkbd( 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,
423 DOUBLE PRECISION THRESH
427 INTEGER ISEED( 4 ), MVAL( * ), NVAL( * )
428 DOUBLE PRECISION BD( * ), BE( * ), RWORK( * ), S1( * ), S2( * )
429 COMPLEX*16 A( LDA, * ), PT( LDPT, * ), Q( LDQ, * ),
430 $ u( ldpt, * ), vt( ldpt, * ), work( * ),
431 $ x( ldx, * ), y( ldx, * ), z( ldx, * )
437 DOUBLE PRECISION ZERO, ONE, TWO, HALF
438 PARAMETER ( ZERO = 0.0d0, one = 1.0d0, two = 2.0d0,
440 COMPLEX*16 CZERO, CONE
441 parameter( czero = ( 0.0d+0, 0.0d+0 ),
442 $ cone = ( 1.0d+0, 0.0d+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 DOUBLE PRECISION 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 DOUBLE PRECISION DUMMA( 1 ), RESULT( 14 )
462 DOUBLE PRECISION DLAMCH, DLARND
463 EXTERNAL DLAMCH, DLARND
471 INTRINSIC abs, exp, int, log, max, min, sqrt
479 COMMON / infoc / infot, nunit, ok, lerr
480 COMMON / srnamc / srnamt
483 DATA ktype / 1, 2, 5*4, 5*6, 3*9, 10 /
484 DATA kmagn / 2*1, 3*1, 2, 3, 3*1, 2, 3, 1, 2, 3, 0 /
485 DATA kmode / 2*0, 4, 3, 1, 4, 4, 4, 3, 1, 4, 4, 0,
501 mmax = max( mmax, mval( j ) )
504 nmax = max( nmax, nval( j ) )
507 mnmax = max( mnmax, min( mval( j ), nval( j ) ) )
508 minwrk = max( minwrk, 3*( mval( j )+nval( j ) ),
509 $ mval( j )*( mval( j )+max( mval( j ), nval( j ),
510 $ nrhs )+1 )+nval( j )*min( nval( j ), mval( j ) ) )
515 IF( nsizes.LT.0 )
THEN
517 ELSE IF( badmm )
THEN
519 ELSE IF( badnn )
THEN
521 ELSE IF( ntypes.LT.0 )
THEN
523 ELSE IF( nrhs.LT.0 )
THEN
525 ELSE IF( lda.LT.mmax )
THEN
527 ELSE IF( ldx.LT.mmax )
THEN
529 ELSE IF( ldq.LT.mmax )
THEN
531 ELSE IF( ldpt.LT.mnmax )
THEN
533 ELSE IF( minwrk.GT.lwork )
THEN
538 CALL xerbla(
'ZCHKBD', -info )
544 path( 1: 1 ) =
'Zomplex precision'
548 unfl = dlamch(
'Safe minimum' )
549 ovfl = dlamch(
'Overflow' )
551 ulp = dlamch(
'Precision' )
553 log2ui = int( log( ulpinv ) / log( two ) )
554 rtunfl = sqrt( unfl )
555 rtovfl = sqrt( ovfl )
560 DO 180 jsize = 1, nsizes
564 amninv = one / max( m, n, 1 )
566 IF( nsizes.NE.1 )
THEN
567 mtypes = min( maxtyp, ntypes )
569 mtypes = min( maxtyp+1, ntypes )
572 DO 170 jtype = 1, mtypes
573 IF( .NOT.dotype( jtype ) )
577 ioldsd( j ) = iseed( j )
602 IF( mtypes.GT.maxtyp )
605 itype = ktype( jtype )
606 imode = kmode( jtype )
610 GO TO ( 40, 50, 60 )kmagn( jtype )
617 anorm = ( rtovfl*ulp )*amninv
621 anorm = rtunfl*max( m, n )*ulpinv
626 CALL zlaset(
'Full', lda, n, czero, czero, a, lda )
631 IF( itype.EQ.1 )
THEN
637 ELSE IF( itype.EQ.2 )
THEN
641 DO 80 jcol = 1, mnmin
642 a( jcol, jcol ) = anorm
645 ELSE IF( itype.EQ.4 )
THEN
649 CALL zlatms( mnmin, mnmin,
'S', iseed,
'N', rwork, imode,
650 $ cond, anorm, 0, 0,
'N', a, lda, work,
653 ELSE IF( itype.EQ.5 )
THEN
657 CALL zlatms( mnmin, mnmin,
'S', iseed,
'S', rwork, imode,
658 $ cond, anorm, m, n,
'N', a, lda, work,
661 ELSE IF( itype.EQ.6 )
THEN
665 CALL zlatms( m, n,
'S', iseed,
'N', rwork, imode, cond,
666 $ anorm, m, n,
'N', a, lda, work, iinfo )
668 ELSE IF( itype.EQ.7 )
THEN
672 CALL zlatmr( mnmin, mnmin,
'S', iseed,
'N', work, 6, one,
673 $ cone,
'T',
'N', work( mnmin+1 ), 1, one,
674 $ work( 2*mnmin+1 ), 1, one,
'N', iwork, 0, 0,
675 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
677 ELSE IF( itype.EQ.8 )
THEN
681 CALL zlatmr( mnmin, mnmin,
'S', iseed,
'S', work, 6, one,
682 $ cone,
'T',
'N', work( mnmin+1 ), 1, one,
683 $ work( m+mnmin+1 ), 1, one,
'N', iwork, m, n,
684 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
686 ELSE IF( itype.EQ.9 )
THEN
690 CALL zlatmr( m, n,
'S', iseed,
'N', work, 6, one, cone,
691 $
'T',
'N', work( mnmin+1 ), 1, one,
692 $ work( m+mnmin+1 ), 1, one,
'N', iwork, m, n,
693 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
695 ELSE IF( itype.EQ.10 )
THEN
699 temp1 = -two*log( ulp )
701 bd( j ) = exp( temp1*dlarnd( 2, iseed ) )
703 $ be( j ) = exp( temp1*dlarnd( 2, iseed ) )
717 IF( iinfo.EQ.0 )
THEN
722 CALL zlatmr( mnmin, nrhs,
'S', iseed,
'N', work, 6,
723 $ one, cone,
'T',
'N', work( mnmin+1 ), 1,
724 $ one, work( 2*mnmin+1 ), 1, one,
'N',
725 $ iwork, mnmin, nrhs, zero, one,
'NO', y,
726 $ ldx, iwork, iinfo )
728 CALL zlatmr( m, nrhs,
'S', iseed,
'N', work, 6, one,
729 $ cone,
'T',
'N', work( m+1 ), 1, one,
730 $ work( 2*m+1 ), 1, one,
'N', iwork, m,
731 $ nrhs, zero, one,
'NO', x, ldx, iwork,
738 IF( iinfo.NE.0 )
THEN
739 WRITE( nout, fmt = 9998 )
'Generator', iinfo, m, n,
749 IF( .NOT.bidiag )
THEN
754 CALL zlacpy(
' ', m, n, a, lda, q, ldq )
755 CALL zgebrd( m, n, q, ldq, bd, be, work, work( mnmin+1 ),
756 $ work( 2*mnmin+1 ), lwork-2*mnmin, iinfo )
760 IF( iinfo.NE.0 )
THEN
761 WRITE( nout, fmt = 9998 )
'ZGEBRD', iinfo, m, n,
767 CALL zlacpy(
' ', m, n, q, ldq, pt, ldpt )
779 CALL zungbr(
'Q', m, mq, n, q, ldq, work,
780 $ work( 2*mnmin+1 ), lwork-2*mnmin, iinfo )
784 IF( iinfo.NE.0 )
THEN
785 WRITE( nout, fmt = 9998 )
'ZUNGBR(Q)', iinfo, m, n,
793 CALL zungbr(
'P', mnmin, n, m, pt, ldpt, work( mnmin+1 ),
794 $ work( 2*mnmin+1 ), lwork-2*mnmin, iinfo )
798 IF( iinfo.NE.0 )
THEN
799 WRITE( nout, fmt = 9998 )
'ZUNGBR(P)', iinfo, m, n,
807 CALL zgemm(
'Conjugate transpose',
'No transpose', m,
808 $ nrhs, m, cone, q, ldq, x, ldx, czero, y,
815 CALL zbdt01( m, n, 1, a, lda, q, ldq, bd, be, pt, ldpt,
816 $ work, rwork, result( 1 ) )
817 CALL zunt01(
'Columns', m, mq, q, ldq, work, lwork,
818 $ rwork, result( 2 ) )
819 CALL zunt01(
'Rows', mnmin, n, pt, ldpt, work, lwork,
820 $ rwork, result( 3 ) )
826 CALL dcopy( mnmin, bd, 1, s1, 1 )
828 $
CALL dcopy( mnmin-1, be, 1, rwork, 1 )
829 CALL zlacpy(
' ', m, nrhs, y, ldx, z, ldx )
830 CALL zlaset(
'Full', mnmin, mnmin, czero, cone, u, ldpt )
831 CALL zlaset(
'Full', mnmin, mnmin, czero, cone, vt, ldpt )
833 CALL zbdsqr( uplo, mnmin, mnmin, mnmin, nrhs, s1, rwork, vt,
834 $ ldpt, u, ldpt, z, ldx, rwork( mnmin+1 ),
839 IF( iinfo.NE.0 )
THEN
840 WRITE( nout, fmt = 9998 )
'ZBDSQR(vects)', iinfo, m, n,
843 IF( iinfo.LT.0 )
THEN
854 CALL dcopy( mnmin, bd, 1, s2, 1 )
856 $
CALL dcopy( mnmin-1, be, 1, rwork, 1 )
858 CALL zbdsqr( uplo, mnmin, 0, 0, 0, s2, rwork, vt, ldpt, u,
859 $ ldpt, z, ldx, rwork( mnmin+1 ), iinfo )
863 IF( iinfo.NE.0 )
THEN
864 WRITE( nout, fmt = 9998 )
'ZBDSQR(values)', iinfo, m, n,
867 IF( iinfo.LT.0 )
THEN
880 CALL zbdt03( uplo, mnmin, 1, bd, be, u, ldpt, s1, vt, ldpt,
881 $ work, result( 4 ) )
882 CALL zbdt02( mnmin, nrhs, y, ldx, z, ldx, u, ldpt, work,
883 $ rwork, result( 5 ) )
884 CALL zunt01(
'Columns', mnmin, mnmin, u, ldpt, work, lwork,
885 $ rwork, result( 6 ) )
886 CALL zunt01(
'Rows', mnmin, mnmin, vt, ldpt, work, lwork,
887 $ rwork, result( 7 ) )
893 DO 110 i = 1, mnmin - 1
894 IF( s1( i ).LT.s1( i+1 ) )
895 $ result( 8 ) = ulpinv
896 IF( s1( i ).LT.zero )
897 $ result( 8 ) = ulpinv
899 IF( mnmin.GE.1 )
THEN
900 IF( s1( mnmin ).LT.zero )
901 $ result( 8 ) = ulpinv
909 temp1 = abs( s1( j )-s2( j ) ) /
910 $ max( sqrt( unfl )*max( s1( 1 ), one ),
911 $ ulp*max( abs( s1( j ) ), abs( s2( j ) ) ) )
912 temp2 = max( temp1, temp2 )
920 temp1 = thresh*( half-ulp )
923 CALL dsvdch( mnmin, bd, be, s1, temp1, iinfo )
935 IF( .NOT.bidiag )
THEN
936 CALL dcopy( mnmin, bd, 1, s2, 1 )
938 $
CALL dcopy( mnmin-1, be, 1, rwork, 1 )
940 CALL zbdsqr( uplo, mnmin, n, m, nrhs, s2, rwork, pt,
941 $ ldpt, q, ldq, y, ldx, rwork( mnmin+1 ),
949 CALL zbdt01( m, n, 0, a, lda, q, ldq, s2, dumma, pt,
950 $ ldpt, work, rwork, result( 11 ) )
951 CALL zbdt02( m, nrhs, x, ldx, y, ldx, q, ldq, work,
952 $ rwork, result( 12 ) )
953 CALL zunt01(
'Columns', m, mq, q, ldq, work, lwork,
954 $ rwork, result( 13 ) )
955 CALL zunt01(
'Rows', mnmin, n, pt, ldpt, work, lwork,
956 $ rwork, result( 14 ) )
963 IF( result( j ).GE.thresh )
THEN
965 $
CALL dlahd2( nout, path )
966 WRITE( nout, fmt = 9999 )m, n, jtype, ioldsd, j,
971 IF( .NOT.bidiag )
THEN
982 CALL alasum( path, nout, nfail, ntest, 0 )
988 9999
FORMAT(
' M=', i5,
', N=', i5,
', type ', i2,
', seed=',
989 $ 4( i4,
',' ),
' test(', i2,
')=', g11.4 )
990 9998
FORMAT(
' ZCHKBD: ', a,
' returned INFO=', i6,
'.', / 9x,
'M=',
991 $ i6,
', N=', i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ),
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine alasum(TYPE, NOUT, NFAIL, NRUN, NERRS)
ALASUM
subroutine zgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
ZGEMM
subroutine zbdt01(M, N, KD, A, LDA, Q, LDQ, D, E, PT, LDPT, WORK, RWORK, RESID)
ZBDT01
subroutine zbdt03(UPLO, N, KD, D, E, U, LDU, S, VT, LDVT, WORK, RESID)
ZBDT03
subroutine zunt01(ROWCOL, M, N, U, LDU, WORK, LWORK, RWORK, RESID)
ZUNT01
subroutine zbdt02(M, N, B, LDB, C, LDC, U, LDU, WORK, RWORK, RESID)
ZBDT02
subroutine zchkbd(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)
ZCHKBD
subroutine zlatms(M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, KL, KU, PACK, A, LDA, WORK, INFO)
ZLATMS
subroutine zlatmr(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)
ZLATMR
subroutine zungbr(VECT, M, N, K, A, LDA, TAU, WORK, LWORK, INFO)
ZUNGBR
subroutine zgebrd(M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK, INFO)
ZGEBRD
subroutine zlacpy(UPLO, M, N, A, LDA, B, LDB)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine zlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine zbdsqr(UPLO, N, NCVT, NRU, NCC, D, E, VT, LDVT, U, LDU, C, LDC, RWORK, INFO)
ZBDSQR
subroutine dcopy(N, DX, INCX, DY, INCY)
DCOPY
subroutine dsvdch(N, S, E, SVD, TOL, INFO)
DSVDCH
subroutine dlahd2(IOUNIT, PATH)
DLAHD2