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, JCOL,
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( 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 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 IF( iinfo.NE.0 .AND. iinfo.LE.n+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 IF( iinfo.NE.0 .AND. iinfo.LE.n+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 )
876 IF( iinfo.NE.0 )
THEN
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,
904 result( 10 ) = ulpinv
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 = 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 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,
939 IF(
SELECT( j ) )
THEN
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 IF( dumma( 1 ).LT.ulpinv )
980 $ result( 11 ) = dumma( 1 )*aninv
981 IF( dumma( 2 ).GT.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 IF( iinfo.NE.0 )
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 IF( dumma( 3 ).LT.ulpinv )
1013 $ result( 12 ) = dumma( 3 )*aninv
1014 IF( dumma( 4 ).GT.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 IF( iinfo.NE.0 )
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 IF( dumma( 1 ).LT.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 IF( iinfo.NE.0 )
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 IF( dumma( 3 ).LT.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 dlabad(SMALL, LARGE)
DLABAD
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine zcopy(N, ZX, INCX, ZY, INCY)
ZCOPY
subroutine zgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
ZGEMM
subroutine zhst01(N, ILO, IHI, A, LDA, H, LDH, Q, LDQ, WORK, LWORK, RWORK, RESULT)
ZHST01
subroutine zget22(TRANSA, TRANSE, TRANSW, N, A, LDA, E, LDE, W, WORK, RWORK, RESULT)
ZGET22
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 zget10(M, N, A, LDA, B, LDB, WORK, RWORK, RESULT)
ZGET10
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 zlatme(N, DIST, ISEED, D, MODE, COND, DMAX, RSIGN, UPPER, SIM, DS, MODES, CONDS, KL, KU, ANORM, A, LDA, WORK, INFO)
ZLATME
subroutine zgehrd(N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO)
ZGEHRD
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 zunmhr(SIDE, TRANS, M, N, ILO, IHI, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
ZUNMHR
subroutine zhseqr(JOB, COMPZ, N, ILO, IHI, H, LDH, W, Z, LDZ, WORK, LWORK, INFO)
ZHSEQR
subroutine ztrevc(SIDE, HOWMNY, SELECT, N, T, LDT, VL, LDVL, VR, LDVR, MM, M, WORK, RWORK, INFO)
ZTREVC
subroutine zhsein(SIDE, EIGSRC, INITV, SELECT, N, H, LDH, W, VL, LDVL, VR, LDVR, MM, M, WORK, RWORK, IFAILL, IFAILR, INFO)
ZHSEIN
subroutine zunghr(N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO)
ZUNGHR
subroutine dlasum(TYPE, IOUNIT, IE, NRUN)
DLASUM
subroutine dlafts(TYPE, M, N, IMAT, NTESTS, RESULT, ISEED, THRESH, IOUNIT, IE)
DLAFTS