407 SUBROUTINE zchkhs( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
408 $ NOUNIT, A, LDA, H, T1, T2, U, LDU, Z, UZ, W1,
409 $ W3, EVECTL, EVECTR, EVECTY, EVECTX, UU, TAU,
410 $ WORK, NWORK, RWORK, IWORK, SELECT, RESULT,
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 RESULT( 14 ), RWORK( * )
425 COMPLEX*16 A( LDA, * ), EVECTL( LDU, * ),
426 $ evectr( ldu, * ), evectx( ldu, * ),
427 $ evecty( ldu, * ), h( lda, * ), t1( lda
428 $ t2( lda, * ), tau( * ), u( ldu, * ),
429 $ uu( ldu, * ), uz( ldu, * ), w1( * ), w3( * ),
430 $ work( * ), z( ldu, * )
436 DOUBLE PRECISION ZERO, ONE
437 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
438 COMPLEX*16 CZERO, CONE
439 PARAMETER ( CZERO = ( 0.0d+0, 0.0d+0 ),
440 $ cone = ( 1.0d+0, 0.0d+0 ) )
442 parameter( maxtyp = 21 )
446 INTEGER I, IHI, IINFO, ILO, IMODE, IN, ITYPE, J, ,
447 $ JJ, JSIZE, JTYPE, K, MTYPES, N, N1, NERRS,
448 $ NMATS, NMAX, NTEST, NTESTT
449 DOUBLE PRECISION ANINV, ANORM, COND, CONDS, OVFL, RTOVFL, RTULP,
450 $ rtulpi, rtunfl, temp1, temp2, ulp, ulpinv, unfl
453 INTEGER IDUMMA( 1 ), IOLDSD( 4 ), KCONDS( MAXTYP ),
454 $ KMAGN( MAXTYP ), KMODE( MAXTYP ),
456 DOUBLE PRECISION DUMMA( 4 )
457 COMPLEX*16 CDUMMA( 4 )
460 DOUBLE PRECISION DLAMCH
470 INTRINSIC abs, dble,
max,
min, sqrt
473 DATA ktype / 1, 2, 3, 5*4, 4*6, 6*6, 3*9 /
474 DATA kmagn / 3*1, 1, 1, 1, 2, 3, 4*1, 1, 1, 1, 1, 2,
476 DATA kmode / 3*0, 4, 3, 1, 4, 4, 4, 3, 1, 5, 4, 3,
477 $ 1, 5, 5, 5, 4, 3, 1 /
478 DATA kconds / 3*0, 5*0, 4*1, 6*2, 3*0 /
490 nmax =
max( nmax, nn( j ) )
497 IF( nsizes.LT.0 )
THEN
499 ELSE IF( badnn )
THEN
501 ELSE IF( ntypes.LT.0 )
THEN
503 ELSE IF( thresh.LT.zero )
THEN
505 ELSE IF( lda.LE.1 .OR. lda.LT.nmax )
THEN
507 ELSE IF( ldu.LE.1 .OR. ldu.LT.nmax )
THEN
509 ELSE IF( 4*nmax*nmax+2.GT.nwork )
THEN
514 CALL xerbla(
'ZCHKHS', -info )
520 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
525 unfl = dlamch(
'Safe minimum' )
526 ovfl = dlamch(
'Overflow' )
528 ulp = dlamch(
'Epsilon' )*dlamch(
'Base' )
530 rtunfl = sqrt( unfl )
531 rtovfl = sqrt( ovfl )
540 DO 260 jsize = 1, nsizes
545 aninv = one / dble( n1 )
547 IF( nsizes.NE.1 )
THEN
548 mtypes =
min( maxtyp, ntypes )
550 mtypes =
min( maxtyp+1, ntypes )
553 DO 250 jtype = 1, mtypes
554 IF( .NOT.dotype( jtype ) )
562 ioldsd( j ) = iseed( j )
587 IF( mtypes.GT.maxtyp )
590 itype = ktype( jtype )
591 imode = kmode( jtype )
595 GO TO ( 40, 50, 60 )kmagn( jtype )
602 anorm = ( rtovfl*ulp )*aninv
606 anorm = rtunfl*n*ulpinv
611 CALL zlaset(
'Full', lda, n, czero, czero, a, lda )
617 IF( itype.EQ.1 )
THEN
622 ELSE IF( itype.EQ.2 )
THEN
627 a( jcol, jcol ) = anorm
630 ELSE IF( itype.EQ.3 )
THEN
635 a( jcol, jcol ) = anorm
637 $ a( jcol, jcol-1 ) = one
640 ELSE IF( itype.EQ.4 )
THEN
644 CALL zlatmr( n, n,
'D', iseed,
'N', work, imode, cond,
645 $ cone,
'T',
'N', work( n+1 ), 1, one,
646 $ work( 2*n+1 ), 1, one,
'N', idumma, 0, 0,
647 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
649 ELSE IF( itype.EQ.5 )
THEN
653 CALL zlatms( n, n,
'D', iseed,
'H', rwork, imode, cond,
654 $ anorm, n, n,
'N', a, lda, work, iinfo )
656 ELSE IF( itype.EQ.6 )
THEN
660 IF( kconds( jtype ).EQ.1 )
THEN
662 ELSE IF( kconds( jtype ).EQ.2 )
THEN
668 CALL zlatme( n,
'D', iseed, work, imode, cond, cone
669 $
'T',
'T',
'T', rwork, 4, conds, n, n, anorm,
670 $ a, lda, work( n+1 ), iinfo )
672 ELSE IF( itype.EQ.7 )
THEN
676 CALL zlatmr( n, n,
'D', iseed,
'N', work, 6, one, cone,
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 zlatmr( n, n,
'D', iseed,
'H', work, 6, one, cone,
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 zlatmr( n, n,
'D', iseed,
'N', work, 6, one, cone,
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 zlatmr( n, n,
'D', iseed,
'N', work, 6, one, cone,
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 zlacpy(
' ', n, n, a, lda, h, lda )
730 CALL zgehrd( n, ilo, ihi, h, lda, work, work( n+1 ),
733 IF( iinfo.NE.0 )
THEN
735 WRITE'ZGEHRD', iinfo, n, jtype,
744 u( i, j ) = h( i, j )
745 uu( i, j ) = h( i, j )
749 CALL zcopy( n-1, work, 1, tau, 1 )
750 CALL zunghr( n, ilo, ihi, u
754 CALL zhst01( n, ilo, ihi, a, lda, h, lda, u, ldu, work,
755 $ nwork, rwork, result( 1 ) )
761 CALL zlacpy(
' ', n, n, h, lda, t2, lda )
765 CALL zhseqr(
'E',
'N', n, ilo, ihi, t2, lda, w3, uz, ldu,
766 $ work, nwork, iinfo )
767 IF( iinfo.NE.0 )
THEN
768 WRITE( nounit, fmt = 9999 )
'ZHSEQR(E)', iinfo, n, jtype,
770 IF( iinfo.LE.n+2 )
THEN
778 CALL zlacpy(
' ', n, n, h, lda, t2, lda )
780 CALL zhseqr(
'S', 'n
', N, ILO, IHI, T2, LDA, W1, UZ, LDU,
781 $ WORK, NWORK, IINFO )
782.NE..AND..LE.
IF( IINFO0 IINFON+2 ) THEN
783 WRITE( NOUNIT, FMT = 9999 )'zhseqr(s)
', IINFO, N, JTYPE,
791 CALL ZLACPY( ' ', N, N, H, LDA, T1, LDA )
792 CALL ZLACPY( ' ', N, N, U, LDU, UZ, LDU )
794 CALL ZHSEQR( 's
', 'v
', N, ILO, IHI, T1, LDA, W1, UZ, LDU,
795 $ WORK, NWORK, IINFO )
796.NE..AND..LE.
IF( IINFO0 IINFON+2 ) THEN
797 WRITE( NOUNIT, FMT = 9999 )'zhseqr(v)
', IINFO, N, JTYPE,
805 CALL ZGEMM( 'c
', 'n
', N, N, N, CONE, U, LDU, UZ, LDU, CZERO,
812 CALL ZHST01( N, ILO, IHI, H, LDA, T1, LDA, Z, LDU, WORK,
813 $ NWORK, RWORK, RESULT( 3 ) )
818 CALL ZHST01( N, ILO, IHI, A, LDA, T1, LDA, UZ, LDU, WORK,
819 $ NWORK, RWORK, RESULT( 5 ) )
823 CALL ZGET10( N, N, T2, LDA, T1, LDA, WORK, RWORK,
831 TEMP1 = MAX( TEMP1, ABS( W1( J ) ), ABS( W3( J ) ) )
832 TEMP2 = MAX( TEMP2, ABS( W1( J )-W3( J ) ) )
835 RESULT( 8 ) = TEMP2 / MAX( UNFL, ULP*MAX( TEMP1, TEMP2 ) )
847 SELECT( J ) = .FALSE.
852 CALL ZTREVC( 'right
', 'all
', SELECT, N, T1, LDA, CDUMMA,
853 $ LDU, EVECTR, LDU, N, IN, WORK, RWORK, IINFO )
854.NE.
IF( IINFO0 ) THEN
855 WRITE( NOUNIT, FMT = 9999 )'ztrevc(r,a)
', IINFO, N,
863 CALL ZGET22( 'n
', 'n
', 'n
', N, T1, LDA, EVECTR, LDU, W1,
864 $ WORK, RWORK, DUMMA( 1 ) )
865 RESULT( 9 ) = DUMMA( 1 )
866.GT.
IF( DUMMA( 2 )THRESH ) THEN
867 WRITE( NOUNIT, FMT = 9998 )'right
', 'ztrevc',
868 $ DUMMA( 2 ), N, JTYPE, IOLDSD
874 CALL ZTREVC( 'right
', 'some
', SELECT, N, T1, LDA, CDUMMA,
875 $ LDU, EVECTL, LDU, N, IN, WORK, RWORK, IINFO )
876.NE.
IF( IINFO0 ) THEN
877 WRITE( NOUNIT, FMT = 9999 )'ztrevc(r,s)
', IINFO, N,
886 IF( SELECT( J ) ) THEN
888.NE.
IF( EVECTR( JJ, J )EVECTL( JJ, K ) ) THEN
898 $ WRITE( NOUNIT, FMT = 9997 )'right
', 'ztrevc', N, JTYPE,
904 RESULT( 10 ) = ULPINV
905 CALL ZTREVC( 'left
', 'all
', SELECT, N, T1, LDA, EVECTL, LDU,
906 $ CDUMMA, LDU, N, IN, WORK, RWORK, IINFO )
907.NE.
IF( IINFO0 ) THEN
908 WRITE( NOUNIT, FMT = 9999 )'ztrevc(l,a)
', IINFO, N,
916 CALL ZGET22( 'c
', 'n
', 'c
', N, T1, LDA, EVECTL, LDU, W1,
917 $ WORK, RWORK, DUMMA( 3 ) )
918 RESULT( 10 ) = DUMMA( 3 )
919.GT.
IF( DUMMA( 4 )THRESH ) THEN
920 WRITE( NOUNIT, FMT = 9998 )'left
', 'ztrevc', DUMMA( 4 ),
927 CALL ZTREVC( 'left
', 'some
', SELECT, N, T1, LDA, EVECTR,
928 $ LDU, CDUMMA, LDU, N, IN, WORK, RWORK, IINFO )
929.NE.
IF( IINFO0 ) THEN
930 WRITE( NOUNIT, FMT = 9999 )'ztrevc(l,s)
', IINFO, N,
939 IF( SELECT( J ) ) THEN
941.NE.
IF( EVECTL( JJ, J )EVECTR( JJ, K ) ) THEN
951 $ WRITE( NOUNIT, FMT = 9997 )'left
', 'ztrevc', N, JTYPE,
957 RESULT( 11 ) = ULPINV
962 CALL ZHSEIN( 'right
', 'qr
', 'ninitv
', SELECT, N, H, LDA, W3,
963 $ CDUMMA, LDU, EVECTX, LDU, N1, IN, WORK, RWORK,
964 $ IWORK, IWORK, IINFO )
965.NE.
IF( IINFO0 ) THEN
966 WRITE( NOUNIT, FMT = 9999 )'zhsein(r)
', IINFO, N, JTYPE,
977 CALL ZGET22( 'n
', 'n
', 'n
', N, H, LDA, EVECTX, LDU, W3,
978 $ WORK, RWORK, DUMMA( 1 ) )
979.LT.
IF( DUMMA( 1 )ULPINV )
980 $ RESULT( 11 ) = DUMMA( 1 )*ANINV
981.GT.
IF( DUMMA( 2 )THRESH ) THEN
982 WRITE( NOUNIT, FMT = 9998 )'right
', 'zhsein',
983 $ DUMMA( 2 ), N, JTYPE, IOLDSD
990 RESULT( 12 ) = ULPINV
995 CALL ZHSEIN( 'left
', 'qr
', 'ninitv
', SELECT, N, H, LDA, W3,
996 $ EVECTY, LDU, CDUMMA, LDU, N1, IN, WORK, RWORK,
997 $ IWORK, IWORK, IINFO )
998.NE.
IF( IINFO0 ) THEN
999 WRITE( NOUNIT, FMT = 9999 )'zhsein(l)
', IINFO, N, JTYPE,
1010 CALL ZGET22( 'c
', 'n
', 'c
', N, H, LDA, EVECTY, LDU, W3,
1011 $ WORK, RWORK, DUMMA( 3 ) )
1012.LT.
IF( DUMMA( 3 )ULPINV )
1013 $ RESULT( 12 ) = DUMMA( 3 )*ANINV
1014.GT.
IF( DUMMA( 4 )THRESH ) THEN
1015 WRITE( NOUNIT, FMT = 9998 )'left
', 'zhsein',
1016 $ DUMMA( 4 ), N, JTYPE, IOLDSD
1023 RESULT( 13 ) = ULPINV
1025 CALL ZUNMHR( 'left
', 'no transpose
', N, N, ILO, IHI, UU,
1026 $ LDU, TAU, EVECTX, LDU, WORK, NWORK, IINFO )
1027.NE.
IF( IINFO0 ) THEN
1028 WRITE( NOUNIT, FMT = 9999 )'zunmhr(l)
', IINFO, N, JTYPE,
1039 CALL ZGET22( 'n
', 'n
', 'n
', N, A, LDA, EVECTX, LDU, W3,
1040 $ WORK, RWORK, DUMMA( 1 ) )
1041.LT.
IF( DUMMA( 1 )ULPINV )
1042 $ RESULT( 13 ) = DUMMA( 1 )*ANINV
1048 RESULT( 14 ) = ULPINV
1050 CALL ZUNMHR( 'left
', 'no transpose
', N, N, ILO, IHI, UU,
1051 $ LDU, TAU, EVECTY, LDU, WORK, NWORK, IINFO )
1052.NE.
IF( IINFO0 ) THEN
1053 WRITE( NOUNIT, FMT = 9999 )'zunmhr(l)
', IINFO, N, JTYPE,
1064 CALL ZGET22( 'c
', 'n
', 'c
', N, A, LDA, EVECTY, LDU, W3,
1065 $ WORK, RWORK, DUMMA( 3 ) )
1066.LT.
IF( DUMMA( 3 )ULPINV )
1067 $ RESULT( 14 ) = DUMMA( 3 )*ANINV
1074 NTESTT = NTESTT + NTEST
1075 CALL DLAFTS( 'zhs
', N, N, JTYPE, NTEST, RESULT, IOLDSD,
1076 $ THRESH, NOUNIT, NERRS )
1083 CALL DLASUM( 'zhs
', NOUNIT, NERRS, NTESTT )
1087 9999 FORMAT( ' zchkhs:
', A, ' returned info=
', I6, '.
', / 9X, 'n=
',
1088 $ I6, ', jtype=
', I6, ', iseed=(
', 3( I5, ',
' ), I5, ')
' )
1089 9998 FORMAT( ' zchkhs:
', A, ' eigenvectors from
', A, ' incorrectly
',
1090 $ 'normalized.
', / ' bits of error=
', 0P, G10.3, ',
', 9X,
1091 $ 'n=
', I6, ', jtype=
', I6, ', iseed=(
', 3( I5, ',
' ), I5,
1093 9997 FORMAT( ' zchkhs: selected
', A, ' eigenvectors from
', A,
1094 $ ' do not match other eigenvectors
', 9X, 'n=
', I6,
1095 $ ', jtype=
', I6, ', iseed=(
', 3( I5, ',
' ), I5, ')
' )
subroutine zchkhs(nsizes, nn, ntypes, dotype, iseed, thresh, nounit, a, lda, h, t1, t2, u, ldu, z, uz, w1, w3, evectl, evectr, evecty, evectx, uu, tau, work, nwork, rwork, iwork, select, result, info)
ZCHKHS
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