416      SUBROUTINE zchkhs( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
 
  417     $                   NOUNIT, A, LDA, H, T1, T2, U, LDU, Z, UZ, W1,
 
  418     $                   W3, EVECTL, EVECTR, EVECTY, EVECTX, UU, TAU,
 
  419     $                   WORK, NWORK, RWORK, IWORK, SELECT, RESULT,
 
  427      INTEGER            INFO, LDA, LDU, NOUNIT, NSIZES, NTYPES, NWORK
 
  428      DOUBLE PRECISION   THRESH
 
  431      LOGICAL            DOTYPE( * ), SELECT( * )
 
  432      INTEGER            ISEED( 4 ), IWORK( * ), NN( * )
 
  433      DOUBLE PRECISION   RESULT( 16 ), RWORK( * )
 
  434      COMPLEX*16         A( LDA, * ), EVECTL( LDU, * ),
 
  435     $                   evectr( ldu, * ), evectx( ldu, * ),
 
  436     $                   evecty( ldu, * ), h( lda, * ), t1( lda, * ),
 
  437     $                   t2( lda, * ), tau( * ), u( ldu, * ),
 
  438     $                   uu( ldu, * ), uz( ldu, * ), w1( * ), w3( * ),
 
  439     $                   work( * ), z( ldu, * )
 
  445      DOUBLE PRECISION   ZERO, ONE
 
  446      PARAMETER          ( ZERO = 0.0d+0, one = 1.0d+0 )
 
  447      COMPLEX*16         CZERO, CONE
 
  448      PARAMETER          ( CZERO = ( 0.0d+0, 0.0d+0 ),
 
  449     $                   cone = ( 1.0d+0, 0.0d+0 ) )
 
  451      parameter( maxtyp = 21 )
 
  455      INTEGER            I, IHI, IINFO, ILO, IMODE, IN, ITYPE, J, JCOL,
 
  456     $                   JJ, JSIZE, JTYPE, K, MTYPES, N, N1, NERRS,
 
  457     $                   NMATS, NMAX, NTEST, NTESTT
 
  458      DOUBLE PRECISION   ANINV, ANORM, COND, CONDS, OVFL, RTOVFL, RTULP,
 
  459     $                   rtulpi, rtunfl, temp1, temp2, ulp, ulpinv, unfl
 
  462      INTEGER            IDUMMA( 1 ), IOLDSD( 4 ), KCONDS( MAXTYP ),
 
  463     $                   KMAGN( MAXTYP ), KMODE( MAXTYP ),
 
  465      DOUBLE PRECISION   DUMMA( 4 )
 
  466      COMPLEX*16         CDUMMA( 4 )
 
  469      DOUBLE PRECISION   DLAMCH
 
  479      INTRINSIC          abs, dble, max, min, sqrt
 
  482      DATA               ktype / 1, 2, 3, 5*4, 4*6, 6*6, 3*9 /
 
  483      DATA               kmagn / 3*1, 1, 1, 1, 2, 3, 4*1, 1, 1, 1, 1, 2,
 
  485      DATA               kmode / 3*0, 4, 3, 1, 4, 4, 4, 3, 1, 5, 4, 3,
 
  486     $                   1, 5, 5, 5, 4, 3, 1 /
 
  487      DATA               kconds / 3*0, 5*0, 4*1, 6*2, 3*0 /
 
  499         nmax = max( nmax, nn( j ) )
 
  506      IF( nsizes.LT.0 ) 
THEN 
  508      ELSE IF( badnn ) 
THEN 
  510      ELSE IF( ntypes.LT.0 ) 
THEN 
  512      ELSE IF( thresh.LT.zero ) 
THEN 
  514      ELSE IF( lda.LE.1 .OR. lda.LT.nmax ) 
THEN 
  516      ELSE IF( ldu.LE.1 .OR. ldu.LT.nmax ) 
THEN 
  518      ELSE IF( 4*nmax*nmax+2.GT.nwork ) 
THEN 
  523         CALL xerbla( 
'ZCHKHS', -info )
 
  529      IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
 
  534      unfl = dlamch( 
'Safe minimum' )
 
  535      ovfl = dlamch( 
'Overflow' )
 
  536      ulp = dlamch( 
'Epsilon' )*dlamch( 
'Base' )
 
  538      rtunfl = sqrt( unfl )
 
  539      rtovfl = sqrt( ovfl )
 
  548      DO 260 jsize = 1, nsizes
 
  553         aninv = one / dble( n1 )
 
  555         IF( nsizes.NE.1 ) 
THEN 
  556            mtypes = min( maxtyp, ntypes )
 
  558            mtypes = min( maxtyp+1, ntypes )
 
  561         DO 250 jtype = 1, mtypes
 
  562            IF( .NOT.dotype( jtype ) )
 
  570               ioldsd( j ) = iseed( j )
 
  595            IF( mtypes.GT.maxtyp )
 
  598            itype = ktype( jtype )
 
  599            imode = kmode( jtype )
 
  603            GO TO ( 40, 50, 60 )kmagn( jtype )
 
  610            anorm = ( rtovfl*ulp )*aninv
 
  614            anorm = rtunfl*n*ulpinv
 
  619            CALL zlaset( 
'Full', lda, n, czero, czero, a, lda )
 
  625            IF( itype.EQ.1 ) 
THEN 
  630            ELSE IF( itype.EQ.2 ) 
THEN 
  635                  a( jcol, jcol ) = anorm
 
  638            ELSE IF( itype.EQ.3 ) 
THEN 
  643                  a( jcol, jcol ) = anorm
 
  645     $               a( jcol, jcol-1 ) = one
 
  648            ELSE IF( itype.EQ.4 ) 
THEN 
  652               CALL zlatmr( n, n, 
'D', iseed, 
'N', work, imode, cond,
 
  653     $                      cone, 
'T', 
'N', work( n+1 ), 1, one,
 
  654     $                      work( 2*n+1 ), 1, one, 
'N', idumma, 0, 0,
 
  655     $                      zero, anorm, 
'NO', a, lda, iwork, iinfo )
 
  657            ELSE IF( itype.EQ.5 ) 
THEN 
  661               CALL zlatms( n, n, 
'D', iseed, 
'H', rwork, imode, cond,
 
  662     $                      anorm, n, n, 
'N', a, lda, work, iinfo )
 
  664            ELSE IF( itype.EQ.6 ) 
THEN 
  668               IF( kconds( jtype ).EQ.1 ) 
THEN 
  670               ELSE IF( kconds( jtype ).EQ.2 ) 
THEN 
  676               CALL zlatme( n, 
'D', iseed, work, imode, cond, cone,
 
  677     $                      
'T', 
'T', 
'T', rwork, 4, conds, n, n, anorm,
 
  678     $                      a, lda, work( n+1 ), iinfo )
 
  680            ELSE IF( itype.EQ.7 ) 
THEN 
  684               CALL zlatmr( n, n, 
'D', iseed, 
'N', work, 6, one, cone,
 
  685     $                      
'T', 
'N', work( n+1 ), 1, one,
 
  686     $                      work( 2*n+1 ), 1, one, 
'N', idumma, 0, 0,
 
  687     $                      zero, anorm, 
'NO', a, lda, iwork, iinfo )
 
  689            ELSE IF( itype.EQ.8 ) 
THEN 
  693               CALL zlatmr( n, n, 
'D', iseed, 
'H', work, 6, one, cone,
 
  694     $                      
'T', 
'N', work( n+1 ), 1, one,
 
  695     $                      work( 2*n+1 ), 1, one, 
'N', idumma, n, n,
 
  696     $                      zero, anorm, 
'NO', a, lda, iwork, iinfo )
 
  698            ELSE IF( itype.EQ.9 ) 
THEN 
  702               CALL zlatmr( n, n, 
'D', iseed, 
'N', work, 6, one, cone,
 
  703     $                      
'T', 
'N', work( n+1 ), 1, one,
 
  704     $                      work( 2*n+1 ), 1, one, 
'N', idumma, n, n,
 
  705     $                      zero, anorm, 
'NO', a, lda, iwork, iinfo )
 
  707            ELSE IF( itype.EQ.10 ) 
THEN 
  711               CALL zlatmr( n, n, 
'D', iseed, 
'N', work, 6, one, cone,
 
  712     $                      
'T', 
'N', work( n+1 ), 1, one,
 
  713     $                      work( 2*n+1 ), 1, one, 
'N', idumma, n, 0,
 
  714     $                      zero, anorm, 
'NO', a, lda, iwork, iinfo )
 
  721            IF( iinfo.NE.0 ) 
THEN 
  722               WRITE( nounit, fmt = 9999 )
'Generator', iinfo, n, jtype,
 
  732            CALL zlacpy( 
' ', n, n, a, lda, h, lda )
 
  738            CALL zgehrd( n, ilo, ihi, h, lda, work, work( n+1 ),
 
  741            IF( iinfo.NE.0 ) 
THEN 
  743               WRITE( nounit, fmt = 9999 )
'ZGEHRD', iinfo, n, jtype,
 
  752                  u( i, j ) = h( i, j )
 
  753                  uu( i, j ) = h( i, j )
 
  757            CALL zcopy( n-1, work, 1, tau, 1 )
 
  758            CALL zunghr( n, ilo, ihi, u, ldu, work, work( n+1 ),
 
  762            CALL zhst01( n, ilo, ihi, a, lda, h, lda, u, ldu, work,
 
  763     $                   nwork, rwork, result( 1 ) )
 
  769            CALL zlacpy( 
' ', n, n, h, lda, t2, lda )
 
  773            CALL zhseqr( 
'E', 
'N', n, ilo, ihi, t2, lda, w3, uz, ldu,
 
  774     $                   work, nwork, iinfo )
 
  775            IF( iinfo.NE.0 ) 
THEN 
  776               WRITE( nounit, fmt = 9999 )
'ZHSEQR(E)', iinfo, n, jtype,
 
  778               IF( iinfo.LE.n+2 ) 
THEN 
  786            CALL zlacpy( 
' ', n, n, h, lda, t2, lda )
 
  788            CALL zhseqr( 
'S', 
'N', n, ilo, ihi, t2, lda, w1, uz, ldu,
 
  789     $                   work, nwork, iinfo )
 
  790            IF( iinfo.NE.0 .AND. iinfo.LE.n+2 ) 
THEN 
  791               WRITE( nounit, fmt = 9999 )
'ZHSEQR(S)', iinfo, n, jtype,
 
  799            CALL zlacpy( 
' ', n, n, h, lda, t1, lda )
 
  800            CALL zlacpy( 
' ', n, n, u, ldu, uz, ldu )
 
  802            CALL zhseqr( 
'S', 
'V', n, ilo, ihi, t1, lda, w1, uz, ldu,
 
  803     $                   work, nwork, iinfo )
 
  804            IF( iinfo.NE.0 .AND. iinfo.LE.n+2 ) 
THEN 
  805               WRITE( nounit, fmt = 9999 )
'ZHSEQR(V)', iinfo, n, jtype,
 
  813            CALL zgemm( 
'C', 
'N', n, n, n, cone, u, ldu, uz, ldu, czero,
 
  820            CALL zhst01( n, ilo, ihi, h, lda, t1, lda, z, ldu, work,
 
  821     $                   nwork, rwork, result( 3 ) )
 
  826            CALL zhst01( n, ilo, ihi, a, lda, t1, lda, uz, ldu, work,
 
  827     $                   nwork, rwork, result( 5 ) )
 
  831            CALL zget10( n, n, t2, lda, t1, lda, work, rwork,
 
  839               temp1 = max( temp1, abs( w1( j ) ), abs( w3( j ) ) )
 
  840               temp2 = max( temp2, abs( w1( j )-w3( j ) ) )
 
  843            result( 8 ) = temp2 / max( unfl, ulp*max( temp1, temp2 ) )
 
  855               SELECT( j ) = .false.
 
  860            CALL ztrevc( 
'Right', 
'All', 
SELECT, n, t1, lda, cdumma,
 
  861     $                   ldu, evectr, ldu, n, in, work, rwork, iinfo )
 
  862            IF( iinfo.NE.0 ) 
THEN 
  863               WRITE( nounit, fmt = 9999 )
'ZTREVC(R,A)', iinfo, n,
 
  871            CALL zget22( 
'N', 
'N', 
'N', n, t1, lda, evectr, ldu, w1,
 
  872     $                   work, rwork, dumma( 1 ) )
 
  873            result( 9 ) = dumma( 1 )
 
  874            IF( dumma( 2 ).GT.thresh ) 
THEN 
  875               WRITE( nounit, fmt = 9998 )
'Right', 
'ZTREVC',
 
  876     $            dumma( 2 ), n, jtype, ioldsd
 
  882            CALL ztrevc( 
'Right', 
'Some', 
SELECT, n, t1, lda, cdumma,
 
  883     $                   ldu, evectl, ldu, n, in, work, rwork, iinfo )
 
  884            IF( iinfo.NE.0 ) 
THEN 
  885               WRITE( nounit, fmt = 9999 )
'ZTREVC(R,S)', iinfo, n,
 
  894               IF( 
SELECT( j ) ) 
THEN 
  896                     IF( evectr( jj, j ).NE.evectl( jj, k ) ) 
THEN 
  906     $         
WRITE( nounit, fmt = 9997 )
'Right', 
'ZTREVC', n, jtype,
 
  912            result( 10 ) = ulpinv
 
  913            CALL ztrevc( 
'Left', 
'All', 
SELECT, n, t1, lda, evectl, ldu,
 
  914     $                   cdumma, ldu, n, in, work, rwork, iinfo )
 
  915            IF( iinfo.NE.0 ) 
THEN 
  916               WRITE( nounit, fmt = 9999 )
'ZTREVC(L,A)', iinfo, n,
 
  924            CALL zget22( 
'C', 
'N', 
'C', n, t1, lda, evectl, ldu, w1,
 
  925     $                   work, rwork, dumma( 3 ) )
 
  926            result( 10 ) = dumma( 3 )
 
  927            IF( dumma( 4 ).GT.thresh ) 
THEN 
  928               WRITE( nounit, fmt = 9998 )
'Left', 
'ZTREVC', dumma( 4 ),
 
  935            CALL ztrevc( 
'Left', 
'Some', 
SELECT, n, t1, lda, evectr,
 
  936     $                   ldu, cdumma, ldu, n, in, work, rwork, iinfo )
 
  937            IF( iinfo.NE.0 ) 
THEN 
  938               WRITE( nounit, fmt = 9999 )
'ZTREVC(L,S)', iinfo, n,
 
  947               IF( 
SELECT( j ) ) 
THEN 
  949                     IF( evectl( jj, j ).NE.evectr( jj, k ) ) 
THEN 
  959     $         
WRITE( nounit, fmt = 9997 )
'Left', 
'ZTREVC', n, jtype,
 
  965            result( 11 ) = ulpinv
 
  970            CALL zhsein( 
'Right', 
'Qr', 
'Ninitv', 
SELECT, n, h, lda, w3,
 
  971     $                   cdumma, ldu, evectx, ldu, n1, in, work, rwork,
 
  972     $                   iwork, iwork, iinfo )
 
  973            IF( iinfo.NE.0 ) 
THEN 
  974               WRITE( nounit, fmt = 9999 )
'ZHSEIN(R)', iinfo, n, jtype,
 
  985               CALL zget22( 
'N', 
'N', 
'N', n, h, lda, evectx, ldu, w3,
 
  986     $                      work, rwork, dumma( 1 ) )
 
  987               IF( dumma( 1 ).LT.ulpinv )
 
  988     $            result( 11 ) = dumma( 1 )*aninv
 
  989               IF( dumma( 2 ).GT.thresh ) 
THEN 
  990                  WRITE( nounit, fmt = 9998 )
'Right', 
'ZHSEIN',
 
  991     $               dumma( 2 ), n, jtype, ioldsd
 
  998            result( 12 ) = ulpinv
 
 1000               SELECT( j ) = .true.
 
 1003            CALL zhsein( 
'Left', 
'Qr', 
'Ninitv', 
SELECT, n, h, lda, w3,
 
 1004     $                   evecty, ldu, cdumma, ldu, n1, in, work, rwork,
 
 1005     $                   iwork, iwork, iinfo )
 
 1006            IF( iinfo.NE.0 ) 
THEN 
 1007               WRITE( nounit, fmt = 9999 )
'ZHSEIN(L)', iinfo, n, jtype,
 
 1018               CALL zget22( 
'C', 
'N', 
'C', n, h, lda, evecty, ldu, w3,
 
 1019     $                      work, rwork, dumma( 3 ) )
 
 1020               IF( dumma( 3 ).LT.ulpinv )
 
 1021     $            result( 12 ) = dumma( 3 )*aninv
 
 1022               IF( dumma( 4 ).GT.thresh ) 
THEN 
 1023                  WRITE( nounit, fmt = 9998 )
'Left', 
'ZHSEIN',
 
 1024     $               dumma( 4 ), n, jtype, ioldsd
 
 1031            result( 13 ) = ulpinv
 
 1033            CALL zunmhr( 
'Left', 
'No transpose', n, n, ilo, ihi, uu,
 
 1034     $                   ldu, tau, evectx, ldu, work, nwork, iinfo )
 
 1035            IF( iinfo.NE.0 ) 
THEN 
 1036               WRITE( nounit, fmt = 9999 )
'ZUNMHR(L)', iinfo, n, jtype,
 
 1047               CALL zget22( 
'N', 
'N', 
'N', n, a, lda, evectx, ldu, w3,
 
 1048     $                      work, rwork, dumma( 1 ) )
 
 1049               IF( dumma( 1 ).LT.ulpinv )
 
 1050     $            result( 13 ) = dumma( 1 )*aninv
 
 1056            result( 14 ) = ulpinv
 
 1058            CALL zunmhr( 
'Left', 
'No transpose', n, n, ilo, ihi, uu,
 
 1059     $                   ldu, tau, evecty, ldu, work, nwork, iinfo )
 
 1060            IF( iinfo.NE.0 ) 
THEN 
 1061               WRITE( nounit, fmt = 9999 )
'ZUNMHR(L)', iinfo, n, jtype,
 
 1072               CALL zget22( 
'C', 
'N', 
'C', n, a, lda, evecty, ldu, w3,
 
 1073     $                      work, rwork, dumma( 3 ) )
 
 1074               IF( dumma( 3 ).LT.ulpinv )
 
 1075     $            result( 14 ) = dumma( 3 )*aninv
 
 1083            result( 15 ) = ulpinv
 
 1085            CALL zlacpy( 
' ', n, n, uz, ldu, evectr, ldu )
 
 1087            CALL ztrevc3( 
'Right', 
'Back', 
SELECT, n, t1, lda, cdumma,
 
 1088     $                    ldu, evectr, ldu, n, in, work, nwork, rwork,
 
 1090            IF( iinfo.NE.0 ) 
THEN 
 1091               WRITE( nounit, fmt = 9999 )
'ZTREVC3(R,B)', iinfo, n,
 
 1101            CALL zget22( 
'N', 
'N', 
'N', n, a, lda, evectr, ldu, w1,
 
 1102     $                   work, rwork, dumma( 1 ) )
 
 1103            result( 15 ) = dumma( 1 )
 
 1104            IF( dumma( 2 ).GT.thresh ) 
THEN 
 1105               WRITE( nounit, fmt = 9998 )
'Right', 
'ZTREVC3',
 
 1106     $            dumma( 2 ), n, jtype, ioldsd
 
 1112            result( 16 ) = ulpinv
 
 1114            CALL zlacpy( 
' ', n, n, uz, ldu, evectl, ldu )
 
 1116            CALL ztrevc3( 
'Left', 
'Back', 
SELECT, n, t1, lda, evectl,
 
 1117     $                    ldu, cdumma, ldu, n, in, work, nwork, rwork,
 
 1119            IF( iinfo.NE.0 ) 
THEN 
 1120               WRITE( nounit, fmt = 9999 )
'ZTREVC3(L,B)', iinfo, n,
 
 1130            CALL zget22( 
'Conj', 
'N', 
'Conj', n, a, lda, evectl, ldu,
 
 1131     $                   w1, work, rwork, dumma( 3 ) )
 
 1132            result( 16 ) = dumma( 3 )
 
 1133            IF( dumma( 4 ).GT.thresh ) 
THEN 
 1134               WRITE( nounit, fmt = 9998 )
'Left', 
'ZTREVC3', dumma( 4 ),
 
 1142            ntestt = ntestt + ntest
 
 1143            CALL dlafts( 
'ZHS', n, n, jtype, ntest, result, ioldsd,
 
 1144     $                   thresh, nounit, nerrs )
 
 1151      CALL dlasum( 
'ZHS', nounit, nerrs, ntestt )
 
 1155 9999 
FORMAT( 
' ZCHKHS: ', a, 
' returned INFO=', i6, 
'.', / 9x, 
'N=',
 
 1156     $      i6, 
', JTYPE=', i6, 
', ISEED=(', 3( i5, 
',' ), i5, 
')' )
 
 1157 9998 
FORMAT( 
' ZCHKHS: ', a, 
' Eigenvectors from ', a, 
' incorrectly ',
 
 1158     $      
'normalized.', / 
' Bits of error=', 0p, g10.3, 
',', 9x,
 
 1159     $      
'N=', i6, 
', JTYPE=', i6, 
', ISEED=(', 3( i5, 
',' ), i5,
 
 1161 9997 
FORMAT( 
' ZCHKHS: Selected ', a, 
' Eigenvectors from ', a,
 
 1162     $      
' do not match other eigenvectors ', 9x, 
'N=', i6,
 
 1163     $      
', JTYPE=', i6, 
', ISEED=(', 3( i5, 
',' ), i5, 
')' )