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 )
439 PARAMETER ( CZERO = ( 0.0d+0, 0.0d+0 ),
440 $ cone = ( 1.0d+0, 0.0d+0 ) )
442 parameter( maxtyp = 21 )
446 INTEGER , IHI, IINFO, ILO, IMODE, IN, ITYPE, J, JCOL,
447 $ JJ, JSIZE, JTYPE, K, MTYPES, N, N1, NERRS,
448 $ NMATS, NMAX, NTEST, NTESTT
449 DOUBLE PRECISION ANINV, ANORM, COND, CONDS, , 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.NE.
IF( NSIZES1 ) THEN
548 MTYPES = MIN( MAXTYP, NTYPES )
550 MTYPES = MIN( MAXTYP+1, NTYPES )
553 DO 250 JTYPE = 1, MTYPES
554.NOT.
IF( DOTYPE( JTYPE ) )
562 IOLDSD( J ) = ISEED( J )
587.GT.
IF( MTYPESMAXTYP )
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.EQ.
IF( ITYPE1 ) THEN
622.EQ.
ELSE IF( ITYPE2 ) THEN
627 A( JCOL, JCOL ) = ANORM
630.EQ.
ELSE IF( ITYPE3 ) THEN
635 A( JCOL, JCOL ) = ANORM
637 $ A( JCOL, JCOL-1 ) = ONE
640.EQ.
ELSE IF( ITYPE4 ) 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.EQ.
ELSE IF( ITYPE5 ) THEN
653 CALL ZLATMS( N, N, 'd
', ISEED, 'h
', RWORK, IMODE, COND,
654 $ ANORM, N, N, 'n
', A, LDA, WORK, IINFO )
656.EQ.
ELSE IF( ITYPE6 ) THEN
660.EQ.
IF( KCONDS( JTYPE )1 ) THEN
662.EQ.
ELSE IF( KCONDS( JTYPE )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.EQ.
ELSE IF( ITYPE7 ) 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.EQ.
ELSE IF( ITYPE8 ) 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.EQ.
ELSE IF( ITYPE9 ) 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.EQ.
ELSE IF( ITYPE10 ) 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.NE.
IF( IINFO0 ) 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.NE.
IF( IINFO0 ) THEN
735 WRITE( NOUNIT, FMT = 9999 )'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, LDU, WORK, WORK( N+1 ),
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.NE.
IF( IINFO0 ) THEN
768 WRITE( NOUNIT, FMT = 9999 )'zhseqr(e)
', IINFO, N, JTYPE,
770.LE.
IF( IINFON+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 IF( iinfo.NE.0 )
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 IF( dumma( 2 ).GT.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 )
877 WRITE( nounit, fmt = 9999
'ZTREVC(R,S)', iinfo, n,
886 IF(
SELECT( j ) )
THEN
888 IF( evectr( jj, j ).NE.evectl( jj, k ) )
THEN
898 $
WRITE( nounit, fmt = 9997 )
'Right',
'ZTREVC', n, jtype,
905 CALL ztrevc(
'Left',
'All',
SELECT, n, t1, lda, evectl, ldu,
906 $ cdumma, ldu, n, in, work, rwork, iinfo )
907 IF( iinfo.NE.0 )
THEN
908 WRITE( nounit, fmt
'ZTREVC(L,A)', iinfo, n,
916 CALL zget22(
'C',
'N',
'C', n, t1, lda, evectl, ldu, w1,
918 result( 10 ) = dumma( 3 )
919 IF( dumma( 4 ).GT.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 IF( iinfo.NE.0 )
THEN
930 WRITE( nounit, fmt = 9999 )
'ZTREVC(L,S)', iinfo, n,
941 IF( evectl( jj, j ).NE.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 IF( iinfo.NE.0 )
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