407 SUBROUTINE cchkhs( 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
424REAL RESULT( 14 ), RWORK( * )
425 COMPLEX A( LDA, * ), ( LDU, * ),
426 $ evectr( ldu, * ), evectx
427 $ evecty( ldu, * ), h( lda, * ), t1( lda, * ),
429 $ uu( ldu, * ), uz( ldu,
430 $ work( * ), z( ldu, * )
437 PARAMETER ( = 0.0e+0, one = 1.0e+0 )
439 PARAMETER ( CZERO = ( 0.0e+0, 0.0e+0 ),
440 $ cone = ( 1.0e+0, 0.0e+0 ) )
442 parameter( maxtyp = 21 )
446 INTEGER I, IHI, IINFO, ILO, IMODE, IN, ITYPE, J, JCOL,
447 $ , JSIZE, JTYPE, K, MTYPES, N, N1, NERRS,
448 $ NMATS, NMAX, , NTESTT
449 REAL , ANORM, COND, CONDS, OVFL, RTOVFL, RTULP,
450 $ rtulpi, rtunfl, temp1, temp2, ulp, ulpinv, unfl
453 INTEGER IDUMMA( 1 ), IOLDSD( 4 ), ( MAXTYP ),
454 $ ( MAXTYP ), KMODE( MAXTYP ),
470 INTRINSIC abs,
max,
min, real, 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(
'CCHKHS', -info )
520 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
525 unfl = slamch(
'Safe minimum' )
526 ovfl = slamch(
'Overflow' )
528 ulp = slamch(
'Epsilon' )*slamch(
'Base' )
530 rtunfl = sqrt( unfl )
531 rtovfl = sqrt( ovfl )
540 DO 260 jsize = 1, nsizes
545 aninv = one / real( 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 claset(
'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 clatmr( 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 clatms( 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 clatme( 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 clatmr( 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 clatmr( 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 clatmr( 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 clatmr( 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 clacpy(
' ', n, n, a, lda, h, lda )
730 CALL cgehrd( n, ilo, ihi, h, lda, work, work( n+1 ),
733 IF( iinfo.NE.0 )
THEN
735 WRITE( nounit, fmt = 9999 )
'CGEHRD', iinfo, n, jtype,
744 u( i, j ) = h( i, j )
745 uu( i, j ) = h( i, j )
749 CALL ccopy( n-1, work, 1, tau, 1 )
750 CALL cunghr( n, ilo, ihi, u, ldu, work, work( n+1 ),
754 CALL chst01( n, ilo, ihi, a, lda, h, lda, u, ldu, work,
755 $ nwork, rwork, result( 1 ) )
761 CALL clacpy(
' ', n, n, h, lda, t2, lda )
765 CALL chseqr(
'E',
'N', n, ilo, ihi, t2, lda, w3, uz, ldu,
766 $ work, nwork, iinfo )
767 IF( iinfo.NE.0 )
THEN
768 WRITE( nounit
'CHSEQR(E)', iinfo, n, jtype,
770 IF( iinfo.LE.n+2 )
THEN
778 CALL clacpy(
' ', n, n, h, lda, t2, lda )
780 CALL chseqr(
'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 )
'CHSEQR(S)', iinfo, n, jtype,
791 CALL clacpy(
' ', n, n, h, lda, t1, lda )
792 CALL clacpy(
' ', n, n, u, ldu, uz, ldu )
794 CALL chseqr(
'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 )
'CHSEQR(V)', iinfo, n, jtype,
805 CALL cgemm(
'C',
'N', n, n, n, cone, u, ldu, uz, ldu, czero,
812 CALL chst01( n, ilo, ihi, h, lda, t1, lda, z, ldu, work,
813 $ nwork, rwork, result( 3 ) )
818 CALL chst01( n, ilo, ihi, a, lda, t1, lda, uz, ldu, work,
819 $ nwork, rwork, result( 5 ) )
823 CALL cget10( 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 ctrevc(
'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 )
'CTREVC(R,A)', iinfo, n,
863 CALL cget22(
'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
', 'ctrevc',
868 $ DUMMA( 2 ), N, JTYPE, IOLDSD
874 CALL CTREVC( '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 )'ctrevc(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
', 'ctrevc', N, JTYPE,
904 RESULT( 10 ) = ULPINV
905 CALL CTREVC( '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 )'ctrevc(l,a)
', IINFO, N,
916 CALL CGET22( '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
', 'ctrevc', DUMMA( 4 ),
927 CALL CTREVC( '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 )'ctrevc(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
', 'ctrevc', N, JTYPE,
957 RESULT( 11 ) = ULPINV
962 CALL CHSEIN( '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 )'chsein(r)
', IINFO, N, JTYPE,
977 CALL CGET22( '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
', 'chsein',
983 $ DUMMA( 2 ), N, JTYPE, IOLDSD
990 RESULT( 12 ) = ULPINV
995 CALL CHSEIN( '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 )'chsein(l)
', IINFO, N, JTYPE,
1010 CALL CGET22( '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
', 'chsein',
1016 $ DUMMA( 4 ), N, JTYPE, IOLDSD
1023 RESULT( 13 ) = ULPINV
1025 CALL CUNMHR( '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 )'cunmhr(l)
', IINFO, N, JTYPE,
1039 CALL CGET22( '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 CUNMHR( '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 )'cunmhr(l)
', IINFO, N, JTYPE,
1064 CALL CGET22( '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 SLAFTS( 'chs
', N, N, JTYPE, NTEST, RESULT, IOLDSD,
1076 $ THRESH, NOUNIT, NERRS )
1083 CALL SLASUM( 'chs
', NOUNIT, NERRS, NTESTT )
1087 9999 FORMAT( ' cchkhs:
', A, ' returned info=
', I6, '.
', / 9X, 'n=
',
1088 $ I6, ', jtype=
', I6, ', iseed=(
', 3( I5, ',
' ), I5, ')
' )
1089 9998 FORMAT( ' cchkhs:
', 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( ' cchkhs: selected
', A, ' eigenvectors from
', A,
1094 $ ' do not match other eigenvectors
', 9X, 'n=
', I6,
1095 $ ', jtype=
', I6, ', iseed=(
', 3( I5, ',
' ), I5, ')
' )