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, , 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 , 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
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(
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.EQ.
ELSE IF( ITYPE5 ) THEN
657 CALL ZLATMS( MNMIN, MNMIN, 's
', ISEED, 's
', RWORK, IMODE,
658 $ COND, ANORM, M, N, 'n
', A, LDA, WORK,
661.EQ.
ELSE IF( ITYPE6 ) THEN
665 CALL ZLATMS( M, N, 's
', ISEED, 'n
', RWORK, IMODE, COND,
666 $ ANORM, M, N, 'n
', A, LDA, WORK, IINFO )
668.EQ.
ELSE IF( ITYPE7 ) 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.EQ.
ELSE IF( ITYPE8 ) 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
894IF( 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,
',' ),