407 SUBROUTINE dchkhs( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
408 $ NOUNIT, A, LDA, H, T1, T2, U, LDU, Z, UZ, WR1,
409 $ WI1, WR2, WI2, WR3, WI3, EVECTL, EVECTR,
410 $ EVECTY, EVECTX, UU, TAU, WORK, NWORK, IWORK,
411 $ SELECT, RESULT, INFO )
418 INTEGER INFO, LDA, LDU, NOUNIT, NSIZES, NTYPES, NWORK
419 DOUBLE PRECISION THRESH
422 LOGICAL DOTYPE( * ), SELECT( * )
423 INTEGER ISEED( 4 ), IWORK( * ), NN( * )
424 DOUBLE PRECISION A( LDA, * ), EVECTL( LDU, * ),
425 $ EVECTR( LDU, * ), EVECTX( LDU, * ),
426 $ evecty( ldu, * ), h( lda, * ), result( 14 ),
427 $ t1( lda, * ), t2( lda, * ), tau( * ),
428 $ u( ldu, * ), uu( ldu, * ), uz( ldu, * ),
429 $ wi1( * ), wi2( * ), wi3( * ), work( * ),
430 $ wr1( * ), wr2( * ), wr3( * ), z( ldu, * )
436 DOUBLE PRECISION ZERO, ONE
437 PARAMETER ( ZERO = 0.0d0, one = 1.0d0 )
439 PARAMETER ( MAXTYP = 21 )
443 INTEGER I, IHI, IINFO, ILO, IMODE, IN, ITYPE, J, JCOL,
444 $ JJ, JSIZE, JTYPE, K, MTYPES, N, N1, NERRS,
445 $ NMATS, NMAX, NSELC, NSELR, NTEST, NTESTT
446 DOUBLE PRECISION ANINV, ANORM, COND, CONDS, OVFL, RTOVFL, RTULP
450 CHARACTER ADUMMA( 1 )
451 INTEGER IDUMMA( 1 ), IOLDSD( 4 ), KCONDS( MAXTYP ),
452 $ KMAGN( MAXTYP ), KMODE( MAXTYP ),
454 DOUBLE PRECISION DUMMA( 6 )
457 DOUBLE PRECISION DLAMCH
467 INTRINSIC abs, dble,
max,
min, sqrt
470 DATA ktype / 1, 2, 3, 5*4, 4*6, 6*6, 3*9 /
471 DATA kmagn / 3*1, 1, 1, 1, 2, 3, 4*1, 1, 1, 1, 1, 2,
473 DATA kmode / 3*0, 4, 3, 1, 4, 4, 4, 3, 1, 5, 4, 3,
474 $ 1, 5, 5, 5, 4, 3, 1 /
475 DATA kconds / 3*0, 5*0, 4*1, 6*2, 3*0 /
487 nmax =
max( nmax, nn( j ) )
494 IF( nsizes.LT.0 )
THEN
496 ELSE IF( badnn )
THEN
498 ELSE IF( ntypes.LT.0 )
THEN
500 ELSE IF( thresh.LT.zero )
THEN
502 ELSE IF( lda.LE.1 .OR. lda.LT.nmax )
THEN
504 ELSE IF( ldu.LE.1 .OR. ldu.LT.nmax )
THEN
506 ELSE IF( 4*nmax*nmax+2.GT.nwork )
THEN
511 CALL xerbla(
'DCHKHS', -info )
517 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
522 unfl = dlamch(
'Safe minimum' )
523 ovfl = dlamch(
'Overflow' )
525 ulp = dlamch(
'Epsilon' )*dlamch(
'Base' )
527 rtunfl = sqrt( unfl )
528 rtovfl = sqrt( ovfl )
537 DO 270 jsize = 1, nsizes
542 aninv = one / dble( n1 )
544 IF( nsizes.NE.1 )
THEN
545 mtypes =
min( maxtyp, ntypes )
547 mtypes =
min( maxtyp+1, ntypes )
550 DO 260 jtype = 1, mtypes
551 IF( .NOT.dotype( jtype ) )
559 ioldsd( j ) = iseed( j )
584 IF( mtypes.GT.maxtyp )
587 itype = ktype( jtype )
588 imode = kmode( jtype )
592 GO TO ( 40, 50, 60 )kmagn( jtype )
599 anorm = ( rtovfl*ulp )*aninv
603 anorm = rtunfl*n*ulpinv
608 CALL dlaset(
'Full', lda, n, zero, zero, a, lda )
614 IF( itype.EQ.1 )
THEN
620 ELSE IF( itype.EQ.2 )
THEN
625 a( jcol, jcol ) = anorm
628 ELSE IF( itype.EQ.3 )
THEN
633 a( jcol, jcol ) = anorm
635 $ a( jcol, jcol-1 ) = one
638 ELSE IF( itype.EQ.4 )
THEN
642 CALL dlatms( n, n,
'S', iseed,
'S', work, imode, cond,
643 $ anorm, 0, 0,
'N', a, lda, work( n+1 ),
646 ELSE IF( itype.EQ.5 )
THEN
650 CALL dlatms( n, n,
'S', iseed,
'S', work, imode, cond,
651 $ anorm, n, n,
'N', a, lda, work( n+1 ),
654 ELSE IF( itype.EQ.6 )
THEN
658 IF( kconds( jtype ).EQ.1 )
THEN
660 ELSE IF( kconds( jtype ).EQ.2 )
THEN
667 CALL dlatme( n,
'S', iseed, work, imode, cond, one,
668 $ adumma,
'T',
'T',
'T', work( n+1 ), 4,
669 $ conds, n, n, anorm, a, lda, work( 2*n+1 ),
672 ELSE IF( itype.EQ.7 )
THEN
676 CALL dlatmr( n, n,
'S', iseed,
'S', work, 6, one, one,
677 $
'T',
'N', work( n+1 ), 1, one,
678 $ work( 2*n+1 ), 1, one,
'N', idumma, 0, 0,
679 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
681 ELSE IF( itype.EQ.8 )
THEN
685 CALL dlatmr( n, n,
'S', iseed,
'S', work, 6, one, one,
686 $
'T',
'N', work( n+1 ), 1, one,
687 $ work( 2*n+1 ), 1, one,
'N', idumma, n, n,
688 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
690 ELSE IF( itype.EQ.9 )
THEN
694 CALL dlatmr( n, n,
'S', iseed,
'N', work, 6, one, one,
695 $
'T',
'N', work( n+1 ), 1, one,
696 $ work( 2*n+1 ), 1, one,
'N', idumma, n, n,
697 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
699 ELSE IF( itype.EQ.10 )
THEN
703 CALL dlatmr( n, n,
'S', iseed,
'N', work, 6, one, one,
704 $
'T',
'N', work( n+1 ), 1, one,
705 $ work( 2*n+1 ), 1, one,
'N', idumma, n, 0,
706 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
713 IF( iinfo.NE.0 )
THEN
714 WRITE( nounit, fmt = 9999 )
'Generator', iinfo, n, jtype,
724 CALL dlacpy(
' ', n, n, a, lda, h, lda )
731 CALL dgehrd( n, ilo, ihi, h, lda, work, work( n+1 ),
734 IF( iinfo.NE.0 )
THEN
736 WRITE( nounit, fmt = 9999 )
'DGEHRD', iinfo, n, jtype,
745 u( i, j ) = h( i, j )
746 uu( i, j ) = h( i, j )
750 CALL dcopy( n-1, work, 1, tau, 1 )
751 CALL dorghr( n, ilo, ihi, u, ldu, work, work( n+1 ),
755 CALL dhst01( n, ilo, ihi, a, lda, h, lda, u, ldu, work,
756 $ nwork, result( 1 ) )
762 CALL dlacpy(
' ', n, n, h, lda, t2, lda )
766 CALL dhseqr(
'E',
'N', n, ilo, ihi, t2, lda, wr3, wi3, uz,
767 $ ldu, work, nwork, iinfo )
768 IF( iinfo.NE.0 )
THEN
769 WRITE( nounit, fmt = 9999 )
'DHSEQR(E)', iinfo, n, jtype,
771 IF( iinfo.LE.n+2 )
THEN
779 CALL dlacpy(
' ', n, n, h, lda, t2, lda )
781 CALL dhseqr(
'S',
'N', n, ilo, ihi, t2, lda, wr2, wi2, uz,
782 $ ldu, work, nwork, iinfo )
783 IF( iinfo.NE.0 .AND. iinfo.LE.n+2 )
THEN
784 WRITE( nounit, fmt = 9999 )
'DHSEQR(S)', iinfo, n, jtype,
793 CALL dlacpy( '
', N, N, H, LDA, T1, LDA )
794 CALL DLACPY( ' ', N, N, U, LDU, UZ, LDU )
796 CALL DHSEQR( 's
', 'v
', N, ILO, IHI, T1, LDA, WR1, WI1, UZ,
797 $ LDU, WORK, NWORK, IINFO )
798.NE..AND..LE.
IF( IINFO0 IINFON+2 ) THEN
799 WRITE( NOUNIT, FMT = 9999 )'dhseqr(v)
', IINFO, N, JTYPE,
807 CALL DGEMM( 't
', 'n
', N, N, N, ONE, U, LDU, UZ, LDU, ZERO,
814 CALL DHST01( N, ILO, IHI, H, LDA, T1, LDA, Z, LDU, WORK,
815 $ NWORK, RESULT( 3 ) )
820 CALL DHST01( N, ILO, IHI, A, LDA, T1, LDA, UZ, LDU, WORK,
821 $ NWORK, RESULT( 5 ) )
825 CALL DGET10( N, N, T2, LDA, T1, LDA, WORK, RESULT( 7 ) )
832 TEMP1 = MAX( TEMP1, ABS( WR1( J ) )+ABS( WI1( J ) ),
833 $ ABS( WR2( J ) )+ABS( WI2( J ) ) )
834 TEMP2 = MAX( TEMP2, ABS( WR1( J )-WR2( J ) )+
835 & ABS( WI1( J )-WI2( J ) ) )
838 RESULT( 8 ) = TEMP2 / MAX( UNFL, ULP*MAX( TEMP1, TEMP2 ) )
853.EQ.
IF( WI1( J )ZERO ) THEN
854.LT.
IF( NSELRMAX( N / 4, 1 ) ) THEN
858 SELECT( J ) = .FALSE.
862.LT.
IF( NSELCMAX( N / 4, 1 ) ) THEN
865 SELECT( J-1 ) = .FALSE.
867 SELECT( J ) = .FALSE.
868 SELECT( J-1 ) = .FALSE.
875 CALL DTREVC( 'right
', 'all
', SELECT, N, T1, LDA, DUMMA, LDU,
876 $ EVECTR, LDU, N, IN, WORK, IINFO )
877.NE.
IF( IINFO0 ) THEN
878 WRITE( NOUNIT, FMT = 9999 )'dtrevc(r,a)
', IINFO, N,
886 CALL DGET22( 'n
', 'n
', 'n
', N, T1, LDA, EVECTR, LDU, WR1,
887 $ WI1, WORK, DUMMA( 1 ) )
888 RESULT( 9 ) = DUMMA( 1 )
889.GT.
IF( DUMMA( 2 )THRESH ) THEN
890 WRITE( NOUNIT, FMT = 9998 )'right
', 'dtrevc',
891 $ DUMMA( 2 ), N, JTYPE, IOLDSD
897 CALL DTREVC( 'right
', 'some
', SELECT, N, T1, LDA, DUMMA,
898 $ LDU, EVECTL, LDU, N, IN, WORK, IINFO )
899.NE.
IF( IINFO0 ) THEN
900 WRITE( NOUNIT, FMT = 9999 )'dtrevc(r,s)
', IINFO, N,
909.AND..EQ.
IF( SELECT( J ) WI1( J )ZERO ) THEN
911.NE.
IF( EVECTR( JJ, J )EVECTL( JJ, K ) ) THEN
917.AND..NE.
ELSE IF( SELECT( J ) WI1( J )ZERO ) THEN
919.NE..OR.
IF( EVECTR( JJ, J )EVECTL( JJ, K )
920.NE.
$ EVECTR( JJ, J+1 )EVECTL( JJ, K+1 ) ) THEN
930 $ WRITE( NOUNIT, FMT = 9997 )'right
', 'dtrevc', N, JTYPE,
936 RESULT( 10 ) = ULPINV
937 CALL DTREVC( 'left
', 'all
', SELECT, N, T1, LDA, EVECTL, LDU,
938 $ DUMMA, LDU, N, IN, WORK, IINFO )
939.NE.
IF( IINFO0 ) THEN
940 WRITE( NOUNIT, FMT = 9999 )'dtrevc(l,a)
', IINFO, N,
948 CALL DGET22( 'trans
', 'n',
'Conj', n, t1, lda, evectl, ldu,
949 $ wr1, wi1, work, dumma( 3 ) )
950 result( 10 ) = dumma( 3 )
951 IF( dumma( 4 ).GT.thresh )
THEN
952 WRITE( nounit, fmt = 9998 )
'Left',
'DTREVC', dumma( 4 ),
959 CALL dtrevc(
'Left',
'Some',
SELECT, n, t1, lda, evectr,
960 $ ldu, dumma, ldu, n, in, work, iinfo )
961 IF( iinfo.NE.0 )
THEN
962 WRITE( nounit, fmt = 9999 )
'DTREVC(L,S)', iinfo, n,
971 IF(
SELECT( j ) .AND. wi1( j ).EQ.zero )
THEN
973 IF( evectl( jj, j ).NE.evectr
THEN
979 ELSE IF(
SELECT( j ) .AND. wi1( j ).NE.zero )
THEN
981 IF( evectl( jj, j ).NE.evectr( jj, k ) .OR.
982 $ evectl( jj, j+1 ).NE.evectr( jj, k+1 ) )
THEN
992 $
WRITE( nounit, fmt = 9997 )
'Left',
'DTREVC', n, jtype,
998 result( 11 ) = ulpinv
1000 SELECT( j ) = .true.
1003 CALL dhsein(
'Right',
'Qr', 'ninitv
', SELECT, N, H, LDA,
1004 $ WR3, WI3, DUMMA, LDU, EVECTX, LDU, N1, IN,
1005 $ WORK, IWORK, IWORK, IINFO )
1006.NE.
IF( IINFO0 ) THEN
1007 WRITE( NOUNIT, FMT = 9999 )'dhsein(r)
', IINFO, N, JTYPE,
1018 CALL DGET22( 'n
', 'n
', 'n
', N, H, LDA, EVECTX, LDU, WR3,
1019 $ WI3, WORK, DUMMA( 1 ) )
1020.LT.
IF( DUMMA( 1 )ULPINV )
1021 $ RESULT( 11 ) = DUMMA( 1 )*ANINV
1022.GT.
IF( DUMMA( 2 )THRESH ) THEN
1023 WRITE( NOUNIT, FMT = 9998 )'right
', 'dhsein',
1024 $ DUMMA( 2 ), N, JTYPE, IOLDSD
1031 RESULT( 12 ) = ULPINV
1033 SELECT( J ) = .TRUE.
1036 CALL DHSEIN( 'left
', 'qr
', 'ninitv
', SELECT, N, H, LDA, WR3,
1037 $ WI3, EVECTY, LDU, DUMMA, LDU, N1, IN, WORK,
1038 $ IWORK, IWORK, IINFO )
1039.NE.
IF( IINFO0 ) THEN
1040 WRITE( NOUNIT, FMT = 9999 )'dhsein(l)
', IINFO, N, JTYPE,
1051 CALL DGET22( 'c
', 'n
', 'c
', N, H, LDA, EVECTY, LDU, WR3,
1052 $ WI3, WORK, DUMMA( 3 ) )
1053.LT.
IF( DUMMA( 3 )ULPINV )
1054 $ RESULT( 12 ) = DUMMA( 3 )*ANINV
1055.GT.
IF( DUMMA( 4 )THRESH ) THEN
1056 WRITE( NOUNIT, FMT = 9998 )'left
', 'dhsein',
1057 $ DUMMA( 4 ), N, JTYPE, IOLDSD
1064 RESULT( 13 ) = ULPINV
1066 CALL DORMHR( 'left
', 'no transpose
', N, N, ILO, IHI, UU,
1067 $ LDU, TAU, EVECTX, LDU, WORK, NWORK, IINFO )
1068.NE.
IF( IINFO0 ) THEN
1069 WRITE( NOUNIT, FMT = 9999 )'dormhr(r)
', IINFO, N, JTYPE,
1080 CALL DGET22( 'n
', 'n
', 'n
', N, A, LDA, EVECTX, LDU, WR3,
1081 $ WI3, WORK, DUMMA( 1 ) )
1082.LT.
IF( DUMMA( 1 )ULPINV )
1083 $ RESULT( 13 ) = DUMMA( 1 )*ANINV
1089 RESULT( 14 ) = ULPINV
1091 CALL DORMHR( 'left
', 'no transpose
', N, N, ILO, IHI, UU,
1092 $ LDU, TAU, EVECTY, LDU, WORK, NWORK, IINFO )
1093.NE.
IF( IINFO0 ) THEN
1094 WRITE( NOUNIT, FMT = 9999 )'dormhr(l)
', IINFO, N, JTYPE,
1105 CALL DGET22( 'c
', 'n
', 'c
', N, A, LDA, EVECTY, LDU, WR3,
1106 $ WI3, WORK, DUMMA( 3 ) )
1107.LT.
IF( DUMMA( 3 )ULPINV )
1108 $ RESULT( 14 ) = DUMMA( 3 )*ANINV
1115 NTESTT = NTESTT + NTEST
1116 CALL DLAFTS( 'dhs
', N, N, JTYPE, NTEST, RESULT, IOLDSD,
1117 $ THRESH, NOUNIT, NERRS )
1124 CALL DLASUM( 'dhs
', NOUNIT, NERRS, NTESTT )
1128 9999 FORMAT( ' dchkhs:
', A, ' returned info=
', I6, '.
', / 9X, 'n=
',
1129 $ I6, ', jtype=
', I6, ', iseed=(
', 3( I5, ',
' ), I5, ')
' )
1130 9998 FORMAT( ' dchkhs:
', A, ' eigenvectors from
', A, ' incorrectly
',
1131 $ 'normalized.
', / ' bits of error=
', 0P, G10.3, ',
', 9X,
1132 $ 'n=
', I6, ', jtype=
', I6, ', iseed=(
', 3( I5, ',
' ), I5,
1134 9997 FORMAT( ' dchkhs: selected
', A, ' eigenvectors from
', A,
1135 $ ' do not match other eigenvectors ', 9x,
'N=', i6,
1136 $
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ), i5,
')' )
subroutine dchkhs(nsizes, nn, ntypes, dotype, iseed, thresh, nounit, a, lda, h, t1, t2, u, ldu, z, uz, wr1, wi1, wr2, wi2, wr3, wi3, evectl, evectr, evecty, evectx, uu, tau, work, nwork, iwork, select, result, info)
DCHKHS