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
422 LOGICAL DOTYPE( * ), SELECT( * )
423 INTEGER ISEED( 4 ), IWORK( * ), NN( * )
424 REAL RESULT( 14 ), RWORK( * )
425 COMPLEX 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, * )
437 PARAMETER ( ZERO = 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 $ JJ, JSIZE, JTYPE, K, MTYPES, N, N1, NERRS,
448 $ NMATS, NMAX, NTEST, NTESTT
449 REAL 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 ),
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, fmt = 9999 )
'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 IF( dumma( 2 ).GT.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 IF( iinfo.NE.0 )
THEN
877 WRITE( nounit, fmt = 9999 )
'CTREVC(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',
'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 IF( iinfo.NE.0 )
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 IF( dumma( 4 ).GT.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 IF( iinfo.NE.0 )
THEN
930 WRITE( nounit, fmt = 9999 )
'CTREVC(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',
'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 IF( iinfo.NE.0 )
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 IF( dumma( 1 ).LT.ulpinv )
980 $ result( 11 ) = dumma( 1 )*aninv
981 IF( dumma( 2 ).GT.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 IF( iinfo.NE.0 )
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 IF( dumma( 3 ).LT.ulpinv )
1013 $ result( 12 ) = dumma( 3 )*aninv
1014 IF( dumma( 4 ).GT.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 IF( iinfo.NE.0 )
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 IF( dumma( 1 ).LT.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 IF( iinfo.NE.0 )
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 IF( dumma( 3 ).LT.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,
')' )
subroutine slabad(SMALL, LARGE)
SLABAD
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine ccopy(N, CX, INCX, CY, INCY)
CCOPY
subroutine cgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
CGEMM
subroutine chst01(N, ILO, IHI, A, LDA, H, LDH, Q, LDQ, WORK, LWORK, RWORK, RESULT)
CHST01
subroutine cget10(M, N, A, LDA, B, LDB, WORK, RWORK, RESULT)
CGET10
subroutine cget22(TRANSA, TRANSE, TRANSW, N, A, LDA, E, LDE, W, WORK, RWORK, RESULT)
CGET22
subroutine cchkhs(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)
CCHKHS
subroutine clatms(M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, KL, KU, PACK, A, LDA, WORK, INFO)
CLATMS
subroutine clatme(N, DIST, ISEED, D, MODE, COND, DMAX, RSIGN, UPPER, SIM, DS, MODES, CONDS, KL, KU, ANORM, A, LDA, WORK, INFO)
CLATME
subroutine clatmr(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)
CLATMR
subroutine cgehrd(N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO)
CGEHRD
subroutine claset(UPLO, M, N, ALPHA, BETA, A, LDA)
CLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine clacpy(UPLO, M, N, A, LDA, B, LDB)
CLACPY copies all or part of one two-dimensional array to another.
subroutine cunmhr(SIDE, TRANS, M, N, ILO, IHI, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
CUNMHR
subroutine cunghr(N, ILO, IHI, A, LDA, TAU, WORK, LWORK, INFO)
CUNGHR
subroutine chseqr(JOB, COMPZ, N, ILO, IHI, H, LDH, W, Z, LDZ, WORK, LWORK, INFO)
CHSEQR
subroutine chsein(SIDE, EIGSRC, INITV, SELECT, N, H, LDH, W, VL, LDVL, VR, LDVR, MM, M, WORK, RWORK, IFAILL, IFAILR, INFO)
CHSEIN
subroutine ctrevc(SIDE, HOWMNY, SELECT, N, T, LDT, VL, LDVL, VR, LDVR, MM, M, WORK, RWORK, INFO)
CTREVC
subroutine slafts(TYPE, M, N, IMAT, NTESTS, RESULT, ISEED, THRESH, IOUNIT, IE)
SLAFTS
subroutine slasum(TYPE, IOUNIT, IE, NRUN)
SLASUM