407 SUBROUTINE schkhs( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
408 $ NOUNIT, A, LDA, H, T1, T2, U, LDU, Z, UZ, WR1,
409 $ WI1, WR2, WI2, WR3, WI3, EVECTL, EVECTR,
410 $ EVECTY, EVECTX, UU, TAU, WORK, NWORK, IWORK,
411 $ SELECT, RESULT, INFO )
418 INTEGER INFO, LDA, LDU, NOUNIT, NSIZES, NTYPES, NWORK
422 LOGICAL DOTYPE( * ), SELECT( * )
423 INTEGER ISEED( 4 ), ( * ), NN( * )
427 $ t1( lda, * ), t2( lda, * ), tau( * ),
428 $ u( ldu, * ), uu( ldu, * ), uz( ldu, * ),
430 $ wr1( * ), wr2( * ), wr3( * ), z
437 PARAMETER ( ZERO = 0.0, one = 1.0 )
439 PARAMETER ( MAXTYP = 21 )
443 INTEGER I, IHI, IINFO, ILO, IN, ITYPE, J,
444, JSIZE, , K, , N, N1, NERRS,
445 $ NMATS, NMAX, NSELC, NSELR, NTEST, NTESTT
446 REAL ANINV, ANORM, , CONDS, OVFL, RTOVFL, ,
467 INTRINSIC abs,
max,
min, real, sqrt
470 DATA ktype / 1, 2, 3, 5*4, 4*6, 6*6, 3*9 /
471 DATA kmagn / 3*1, 1, 1, 1, 2, 3, 4*1, 1, 1, 1, 1, 2,
473 DATA kmode / 3*0, 4, 3, 1, 4, 4, 4, 3
474 $ 1, 5, 5, 5, 4, 3, 1 /
475 DATA kconds / 3*0, 5*0, 4*1, 6*2, 3*0 /
487 nmax =
max( nmax, nn( j ) )
494 IF( nsizes.LT.0 )
THEN
496 ELSE IF( badnn )
THEN
498 ELSE IF( ntypes.LT.0 )
THEN
500 ELSE IF( thresh.LT.zero )
THEN
502 ELSE IF( lda.LE.1 .OR. lda.LT.nmax )
THEN
504 ELSE IF( ldu.LE.1 .OR. ldu.LT.nmax )
THEN
506 ELSE IF( 4*nmax*nmax+2.GT.nwork )
THEN
511 CALL xerbla(
'SCHKHS', -info )
517 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
522 unfl = slamch(
'Safe minimum' )
523 ovfl = slamch(
'Overflow' )
525 ulp = slamch(
'Epsilon' )*slamch(
'Base' )
527 rtunfl = sqrt( unfl )
528 rtovfl = sqrt( ovfl )
537 DO 270 jsize = 1, nsizes
542 aninv = one / real( n1 )
544 IF( nsizes.NE.1 )
THEN
545 mtypes =
min( maxtyp, ntypes )
547 mtypes =
min( maxtyp+1, ntypes )
550 DO 260 jtype = 1, mtypes
551 IF( .NOT.dotype( jtype ) )
559 ioldsd( j ) = iseed( j )
584 IF( mtypes.GT.maxtyp )
587 itype = ktype( jtype )
588 imode = kmode( jtype )
592 GO TO ( 40, 50, 60 )kmagn( jtype )
599 anorm = ( rtovfl*ulp )*aninv
603 anorm = rtunfl*n*ulpinv
608 CALL slaset(
'Full', lda, n, zero, zero, a, lda )
614 IF( itype.EQ.1 )
THEN
620 ELSE IF( itype.EQ.2 )
THEN
628 ELSE IF( itype.EQ.3 )
THEN
633 a( jcol, jcol ) = anorm
635 $ a( jcol, jcol-1 ) = one
638 ELSE IF( itype.EQ.4 )
THEN
642 CALL slatms( n, n,
'S', iseed,
'S', work, imode, cond,
643 $ anorm, 0, 0,
'N', a, lda, work( n+1 ),
646 ELSE IF( itype.EQ.5 )
THEN
650 CALL slatms( n, n,
'S', iseed,
'S', work, imode, cond,
651 $ anorm, n, n,
'N', a, lda, work( n+1 ),
654 ELSE IF( itype.EQ.6 )
THEN
658 IF( kconds( jtype ).EQ.1 )
THEN
660 ELSE IF( kconds( jtype ).EQ.2 )
THEN
667 CALL slatme( n,
'S', iseed, work, imode, cond, one,
668 $ adumma,
'T',
'T',
'T', work( n+1 ), 4,
669 $ conds, n, n, anorm, a, lda, work( 2*n+1 ),
672 ELSE IF( itype.EQ.7 )
THEN
676 CALL slatmr( n, n,
'S', iseed,
'S', work, 6, one, one,
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 slatmr( n, n,
'S', iseed,
'S', work, 6, one, one,
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 slatmr( n, n,
'S', iseed,
'N', work, 6, one, one,
695 $
'T',
'N', work( n+1 ), 1, one,
696 $ work( 2*n+1 ), 1, one,
'N', idumma, n, n,
697 $ zero, anorm,
'NO', a
699 ELSE IF( itype.EQ.10 )
THEN
703 CALL slatmr( n, n,
'S', iseed,
'N', work, 6, one, one,
704 $
'T',
'N', work( n+1 ), 1, one,
705 $ work( 2*n+1 ), 1, one,
'N', idumma, n, 0,
706 $
', A, LDA, IWORK, IINFO )
713.NE.
IF( IINFO0 ) THEN
714 WRITE( NOUNIT, FMT = 9999 )'generator
', IINFO, N, JTYPE,
724 CALL SLACPY( ' ', N, N, A, LDA, H, LDA )
731 CALL SGEHRD( N, ILO, IHI, H, LDA, WORK, WORK( N+1 ),
734.NE.
IF( IINFO0 ) THEN
736 WRITE( NOUNIT, FMT = 9999 )'sgehrd', IINFO, N, JTYPE,
745 U( I, J ) = H( I, J )
746 UU( I, J ) = H( I, J )
750 CALL SCOPY( N-1, WORK, 1, TAU, 1 )
751 CALL SORGHR( N, ILO, IHI, U, LDU, WORK, WORK( N+1 ),
755 CALL SHST01( N, ILO, IHI, A, LDA, H, LDA, U, LDU, WORK,
756 $ NWORK, RESULT( 1 ) )
762 CALL SLACPY( ' ', N, N, H, LDA, T2, LDA )
766 CALL SHSEQR( 'e
', 'n
', N, ILO, IHI, T2, LDA, WR3, WI3, UZ,
767 $ LDU, WORK, NWORK, IINFO )
768.NE.
IF( IINFO0 ) THEN
769 WRITE( NOUNIT, FMT = 9999 )'shseqr(e)
', IINFO, N, JTYPE,
771.LE.
IF( IINFON+2 ) THEN
779 CALL SLACPY( ' ', N, N, H, LDA, T2, LDA )
781 CALL SHSEQR( 's
', 'n
', N, ILO, IHI, T2, LDA, WR2, WI2, UZ,
782 $ LDU, WORK, NWORK, IINFO )
783.NE..AND..LE.
IF( IINFO0 IINFON+2 ) THEN
784 WRITE( NOUNIT, FMT = 9999 )'shseqr(s)
', IINFO, N, JTYPE,
793 CALL SLACPY( ' ', N, N, H, LDA, T1, LDA )
794 CALL SLACPY( ' ', N, N, U, LDU, UZ, LDU )
796 CALL SHSEQR( 's
', 'v
', N, ILO, IHI, T1, LDA, WR1, WI1, UZ,
797 $ LDU, WORK, NWORK, IINFO )
798.NE..AND..LE.
IF( IINFO0 IINFON+2 ) THEN
799 WRITE( NOUNIT, FMT = 9999 )'shseqr(v)
', IINFO, N, JTYPE,
807 CALL SGEMM( 't
', 'n
', N, N, N, ONE, U, LDU, UZ, LDU, ZERO,
814 CALL SHST01( N, ILO, IHI, H, LDA, T1, LDA, Z, LDU, WORK,
815 $ NWORK, RESULT( 3 ) )
820 CALL SHST01( N, ILO, IHI, A, LDA, T1, LDA, UZ, LDU, WORK,
821 $ NWORK, RESULT( 5 ) )
825 CALL SGET10( N, N, T2, LDA, T1, LDA, WORK, RESULT( 7 ) )
832 TEMP1 = MAX( TEMP1, ABS( WR1( J ) )+ABS( WI1( J ) ),
833 $ ABS( WR2( J ) )+ABS( WI2( J ) ) )
834 TEMP2 = MAX( TEMP2, ABS( WR1( J )-WR2( J ) )+
835 $ ABS( WI1( J )-WI2( J ) ) )
838 RESULT( 8 ) = TEMP2 / MAX( UNFL, ULP*MAX( TEMP1, TEMP2 ) )
853.EQ.
IF( WI1( J )ZERO ) THEN
854.LT.
IF( NSELRMAX( N / 4, 1 ) ) THEN
858 SELECT( J ) = .FALSE.
862.LT.
IF( NSELCMAX( N / 4, 1 ) ) THEN
865 SELECT( J-1 ) = .FALSE.
867 SELECT( J ) = .FALSE.
868 SELECT( J-1 ) = .FALSE.
875 CALL STREVC( 'right
', 'all
', SELECT, N, T1, LDA, DUMMA, LDU,
876 $ EVECTR, LDU, N, IN, WORK, IINFO )
877.NE.
IF( IINFO0 ) THEN
878 WRITE( NOUNIT, FMT = 9999 )'strevc(r,a)
', IINFO, N,
886 CALL SGET22( 'n
', 'n
', 'n
', N, T1, LDA, EVECTR, LDU, WR1,
887 $ WI1, WORK, DUMMA( 1 ) )
888 RESULT( 9 ) = DUMMA( 1 )
889.GT.
IF( DUMMA( 2 )THRESH ) THEN
890 WRITE( NOUNIT, FMT = 9998 )'right
', 'strevc',
891 $ DUMMA( 2 ), N, JTYPE, IOLDSD
897 CALL STREVC( 'right
', 'some
', SELECT, N, T1, LDA, DUMMA,
898 $ LDU, EVECTL, LDU, N, IN, WORK, IINFO )
899.NE.
IF( IINFO0 ) THEN
900 WRITE( NOUNIT, FMT = 9999 )'strevc(r,s)
', IINFO, N,
909.AND..EQ.
IF( SELECT( J ) WI1( J )ZERO ) THEN
911.NE.
IF( EVECTR( JJ, J )EVECTL( JJ, K ) ) THEN
917.AND..NE.
ELSE IF( SELECT( J ) WI1( J )ZERO ) THEN
919.NE..OR.
IF( EVECTR( JJ, J )EVECTL( JJ, K )
920.NE.
$ EVECTR( JJ, J+1 )EVECTL( JJ, K+1 ) ) THEN
930 $ WRITE( NOUNIT, FMT = 9997 )'right
', 'strevc', N, JTYPE,
936 RESULT( 10 ) = ULPINV
937 CALL STREVC( 'left
', 'all
', SELECT, N, T1, LDA, EVECTL, LDU,
938 $ DUMMA, LDU, N, IN, WORK, IINFO )
939.NE.
IF( IINFO0 ) THEN
940 WRITE( NOUNIT, FMT = 9999 )'strevc(l,a)
', IINFO, N,
948 CALL SGET22( 'trans
', 'n
', 'conj
', N, T1, LDA, EVECTL, LDU,
949 $ WR1, WI1, WORK, DUMMA( 3 ) )
950 RESULT( 10 ) = DUMMA( 3 )
951.GT.
IF( DUMMA( 4 )THRESH ) THEN
952 WRITE( NOUNIT, FMT = 9998 )'left
', 'strevc', DUMMA( 4 ),
959 CALL STREVC( 'left
', 'some
', SELECT, N, T1, LDA, EVECTR,
960 $ LDU, DUMMA, LDU, N, IN, WORK, IINFO )
961.NE.
IF( IINFO0 ) THEN
962 WRITE( NOUNIT, FMT = 9999 )'strevc(l,s)
', IINFO, N,
971.AND..EQ.
IF( SELECT( J ) WI1( J )ZERO ) THEN
973.NE.
IF( EVECTL( JJ, J )EVECTR( JJ, K ) ) THEN
979.AND..NE.
ELSE IF( SELECT( J ) WI1( J )ZERO ) THEN
981.NE..OR.
IF( EVECTL( JJ, J )EVECTR( JJ, K )
982.NE.
$ EVECTL( JJ, J+1 )EVECTR( JJ, K+1 ) ) THEN
992 $ WRITE( NOUNIT, FMT = 9997 )'left
', 'strevc', N, JTYPE,
998 RESULT( 11 ) = ULPINV
1000 SELECT( J ) = .TRUE.
1003 CALL SHSEIN( 'right
', 'qr
', 'ninitv
', SELECT, N, H, LDA,
1004 $ WR3, WI3, DUMMA, LDU, EVECTX, LDU, N1, IN,
1005 $ WORK, IWORK, IWORK, IINFO )
1006.NE.
IF( IINFO0 ) THEN
1007 WRITE( NOUNIT, FMT = 9999 )'shsein(r)
', IINFO, N, JTYPE,
1018 CALL SGET22( 'n
', 'n
', 'n
', N, H, LDA, EVECTX, LDU, WR3,
1019 $ WI3, WORK, DUMMA( 1 ) )
1020.LT.
IF( DUMMA( 1 )ULPINV )
1021 $ RESULT( 11 ) = DUMMA( 1 )*ANINV
1022.GT.
IF( DUMMA( 2 )THRESH ) THEN
1023 WRITE( NOUNIT, FMT = 9998 )'right
', 'shsein',
1024 $ DUMMA( 2 ), N, JTYPE, IOLDSD
1031 RESULT( 12 ) = ULPINV
1033 SELECT( J ) = .TRUE.
1036 CALL SHSEIN( 'left
', 'qr',
'Ninitv',
SELECT, n, h, lda, wr3,
1037 $ wi3, evecty, ldu, dumma, ldu, n1, in, work,
1038 $ iwork, iwork, iinfo )
1039 IF( iinfo.NE.0 )
THEN
1040 WRITE( nounit, fmt = 9999 )
'SHSEIN(L)', iinfo, n, jtype,
1051 CALL sget22(
'C',
'N',
'C', n, h, lda, evecty, ldu, wr3,
1052 $ wi3, work, dumma( 3 ) )
1053 IF( dumma( 3 ).LT.ulpinv )
1054 $ result( 12 ) = dumma( 3 )*aninv
1055 IF( dumma( 4 ).GT.thresh )
THEN
1056 WRITE( nounit, fmt = 9998 )
'Left',
'SHSEIN',
1057 $ dumma( 4 ), n, jtype, ioldsd
1064 result( 13 ) = ulpinv
1066 CALL sormhr(
'Left',
'No transpose', n, n, ilo, ihi, uu,
1067 $ ldu, tau, evectx, ldu, work, nwork, iinfo )
1068 IF( iinfo.NE.0 )
THEN
1069 WRITE( nounit, fmt = 9999 )'
sormhr(r)
', IINFO, N, JTYPE,
1080 CALL SGET22( 'n
', 'n
', 'n
', N, A, LDA, EVECTX, LDU, WR3,
1081 $ WI3, WORK, DUMMA( 1 ) )
1082.LT.
IF( DUMMA( 1 )ULPINV )
1083 $ RESULT( 13 ) = DUMMA( 1 )*ANINV
1089 RESULT( 14 ) = ULPINV
1091 CALL SORMHR( 'left
', 'no transpose
', N, N, ILO, IHI, UU,
1092 $ LDU, TAU, EVECTY, LDU, WORK, NWORK, IINFO )
1093.NE.
IF( IINFO0 ) THEN
1094 WRITE( NOUNIT, FMT = 9999 )'sormhr(l)
', IINFO, N, JTYPE,
1105 CALL SGET22( 'c
', 'n
', 'c
', N, A, LDA, EVECTY, LDU, WR3,
1106 $ WI3, WORK, DUMMA( 3 ) )
1107.LT.
IF( DUMMA( 3 )ULPINV )
1108 $ RESULT( 14 ) = DUMMA( 3 )*ANINV
1115 NTESTT = NTESTT + NTEST
1116 CALL SLAFTS( 'shs
', N, N, JTYPE, NTEST, RESULT, IOLDSD,
1117 $ THRESH, NOUNIT, NERRS )
1124 CALL SLASUM( 'shs
', NOUNIT, NERRS, NTESTT )
1128 9999 FORMAT( ' schkhs:
', A, ' returned info=
', I6, '.
', / 9X, 'n=
',
1129 $ I6, ', jtype=
', I6, ', iseed=(
', 3( I5, ',
' ), I5, ')
' )
1130 9998 FORMAT( ' schkhs:
', A, ' eigenvectors from
', A, ' incorrectly
',
1131 $ 'normalized.
', / ' bits of error=
', 0P, G10.3, ',
', 9X,
1132 $ 'n=
', I6, ', jtype=
', I6, ', iseed=(
', 3( I5, ',
' ), I5,
1134 9997 FORMAT( ' schkhs: selected
', A, ' eigenvectors from
', A,
1135 $ ' do not match other eigenvectors
', 9X, 'n=', i6,
1136 $
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ), i5,
')' )
subroutine slabad(small, large)
SLABAD
subroutine slaset(uplo, m, n, alpha, beta, a, lda)
SLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine slacpy(uplo, m, n, a, lda, b, ldb)
SLACPY copies all or part of one two-dimensional array to another.
subroutine xerbla(srname, info)
XERBLA
subroutine sgehrd(n, ilo, ihi, a, lda, tau, work, lwork, info)
SGEHRD
subroutine shseqr(job, compz, n, ilo, ihi, h, ldh, wr, wi, z, ldz, work, lwork, info)
SHSEQR
subroutine sormhr(side, trans, m, n, ilo, ihi, a, lda, tau, c, ldc, work, lwork, info)
SORMHR
subroutine sorghr(n, ilo, ihi, a, lda, tau, work, lwork, info)
SORGHR
subroutine strevc(side, howmny, select, n, t, ldt, vl, ldvl, vr, ldvr, mm, m, work, info)
STREVC
subroutine shsein(side, eigsrc, initv, select, n, h, ldh, wr, wi, vl, ldvl, vr, ldvr, mm, m, work, ifaill, ifailr, info)
SHSEIN
subroutine slatmr(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)
SLATMR
subroutine slatme(n, dist, iseed, d, mode, cond, dmax, ei, rsign, upper, sim, ds, modes, conds, kl, ku, anorm, a, lda, work, info)
SLATME
subroutine slatms(m, n, dist, iseed, sym, d, mode, cond, dmax, kl, ku, pack, a, lda, work, info)
SLATMS
subroutine scopy(n, sx, incx, sy, incy)
SCOPY
subroutine sgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
SGEMM
subroutine schkhs(nsizes, nn, ntypes, dotype, iseed, thresh, nounit, a, lda, h, t1, t2, u, ldu, z, uz, wr1, wi1, wr2, wi2, wr3, wi3, evectl, evectr, evecty, evectx, uu, tau, work, nwork, iwork, select, result, info)
SCHKHS
subroutine sget22(transa, transe, transw, n, a, lda, e, lde, wr, wi, work, result)
SGET22
subroutine sget10(m, n, a, lda, b, ldb, work, result)
SGET10
subroutine shst01(n, ilo, ihi, a, lda, h, ldh, q, ldq, work, lwork, result)
SHST01
subroutine slafts(type, m, n, imat, ntests, result, iseed, thresh, iounit, ie)
SLAFTS
subroutine slasum(type, iounit, ie, nrun)
SLASUM