450 SUBROUTINE sdrvsx( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
451 $ NIUNIT, NOUNIT, A, LDA, H, HT, WR, WI, WRT,
452 $ WIT, WRTMP, WITMP, VS, LDVS, VS1, RESULT, WORK,
453 $ LWORK, IWORK, BWORK, INFO )
460 INTEGER INFO, LDA, LDVS, LWORK, NIUNIT, NOUNIT, NSIZES,
465 LOGICAL BWORK( * ), DOTYPE( * )
466 INTEGER ISEED( 4 ), IWORK( * ), NN( * )
467 REAL A( LDA, * ), H( LDA, * ), HT( LDA, * ),
468 $ result( 17 ), vs( ldvs, * ), vs1( ldvs, * ),
469 $ wi( * ), wit( * ), witmp( * ), work( * ),
470 $ wr( * ), wrt( * ), wrtmp( * )
477 PARAMETER ( ZERO = 0.0e0, one = 1.0e0 )
479 parameter( maxtyp = 21 )
484 INTEGER I, IINFO, IMODE, ITYPE, IWK, J, JCOL, JSIZE,
486 $ nnwork, nslct, ntest, ntestf, ntestt
487 REAL ANORM, COND, CONDS, OVFL, RCDEIN, RCDVIN,
488 $ RTULP, RTULPI, ULP, ULPINV, UNFL
491 CHARACTER ADUMMA( 1 )
492 INTEGER IDUMMA( 1 ), IOLDSD( 4 ), ISLCT( 20 ),
493 $ KCONDS( MAXTYP ), KMAGN( MAXTYP ),
494 $ kmode( maxtyp ), ktype( maxtyp )
498 REAL SELWI( 20 ), SELWR( 20 )
501 INTEGER SELDIM, SELOPT
504 COMMON / sslct / selopt, seldim, selval, selwr, selwi
515 INTRINSIC abs,
max,
min, sqrt
518 DATA ktype / 1, 2, 3, 5*4, 4*6, 6*6, 3*9 /
519 DATA kmagn / 3*1, 1, 1, 1, 2, 3, 4*1, 1, 1, 1, 1, 2,
521 DATA kmode / 3*0, 4, 3, 1, 4, 4, 4, 3, 1, 5, 4, 3,
522 $ 1, 5, 5, 5, 4, 3, 1 /
523 DATA kconds / 3*0, 5*0, 4*1, 6*2, 3*0 /
527 path( 1: 1 ) =
'Single precision'
545 nmax =
max( nmax, nn( j ) )
552 IF( nsizes.LT.0 )
THEN
554 ELSE IF( badnn )
THEN
556 ELSE IF( ntypes.LT.0 )
THEN
558 ELSE IF( thresh.LT.zero )
THEN
560 ELSE IF( niunit.LE.0 )
THEN
562 ELSE IF( nounit.LE.0 )
THEN
564 ELSE IF( lda.LT.1 .OR. lda.LT.nmax )
THEN
566 ELSE IF( ldvs.LT.1 .OR. ldvs.LT.nmax )
THEN
568 ELSE IF(
max( 3*nmax, 2*nmax**2 ).GT.lwork )
THEN
573 CALL xerbla(
'SDRVSX', -info )
579 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
584 unfl = slamch(
'Safe minimum' )
587 ulp = slamch(
'Precision' )
596 DO 140 jsize = 1, nsizes
598 IF( nsizes.NE.1 )
THEN
599 mtypes =
min( maxtyp, ntypes )
601 mtypes =
min( maxtyp+1, ntypes )
604 DO 130 jtype = 1, mtypes
605 IF( .NOT.dotype( jtype ) )
611 ioldsd( j ) = iseed( j )
630 IF( mtypes.GT.maxtyp )
633 itype = ktype( jtype )
634 imode = kmode( jtype )
638 GO TO ( 30, 40, 50 )kmagn( jtype )
654 CALL slaset(
'Full', lda, n, zero, zero, a, lda )
662 IF( itype.EQ.1 )
THEN
665 ELSE IF( itype.EQ.2 )
THEN
670 a( jcol, jcol ) = anorm
673 ELSE IF( itype.EQ.3 )
THEN
678 a( jcol, jcol ) = anorm
680 $ a( jcol, jcol-1 ) = one
683 ELSE IF( itype.EQ.4 )
THEN
687 CALL slatms( n, n,
'S', iseed,
'S', work, imode, cond,
688 $ anorm, 0, 0,
'N', a, lda, work( n+1 ),
691 ELSE IF( itype.EQ.5 )
THEN
695 CALL slatms( n, n,
'S', iseed,
'S', work, imode, cond,
696 $ anorm, n, n,
'N', a, lda, work( n+1 ),
699 ELSE IF( itype.EQ.6 )
THEN
703 IF( kconds( jtype ).EQ.1 )
THEN
705 ELSE IF( kconds( jtype ).EQ.2 )
THEN
712 CALL slatme( n,
'S', iseed, work, imode, cond, one,
713 $ adumma,
'T',
'T',
'T', work( n+1 ), 4,
714 $ conds, n, n, anorm, a, lda, work( 2*n+1 ),
717 ELSE IF( itype.EQ.7 )
THEN
721 CALL slatmr( n, n,
'S', iseed,
'S', work, 6, one, one,
722 $
'T',
'N', work( n+1 ), 1, one,
723 $ work( 2*n+1 ), 1, one,
'N', idumma, 0, 0,
724 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
726 ELSE IF( itype.EQ.8 )
THEN
730 CALL slatmr( n, n,
'S', iseed,
'S', work, 6, one, one,
731 $
'T',
'N', work( n+1 ), 1, one,
732 $ work( 2*n+1 ), 1, one,
'N', idumma, n, n,
733 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
735 ELSE IF( itype.EQ.9 )
THEN
739 CALL slatmr( n, n,
'S', iseed,
'N', work, 6, one, one,
740 $
'T',
'N', work( n+1 ), 1, one,
741 $ work( 2*n+1 ), 1, one,
'N', idumma, n, n,
742 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
744 CALL slaset(
'Full', 2, n, zero, zero, a, lda )
745 CALL slaset(
'Full', n-3, 1, zero, zero, a( 3, 1 ),
747 CALL slaset(
'Full', n-3, 2, zero, zero, a( 3, n-1 ),
749 CALL slaset(
'Full', 1, n, zero, zero, a( n, 1 ),
753 ELSE IF( itype.EQ.10 )
THEN
757 CALL slatmr( n, n,
'S', iseed,
'N', work, 6, one, one,
758 $
'T',
'N', work( n+1 ), 1, one,
759 $ work( 2*n+1 ), 1, one,
'N', idumma, n, 0,
760 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
767 IF( iinfo.NE.0 )
THEN
768 WRITE( nounit, fmt = 9991 )'generator
', IINFO, N, JTYPE,
782 NNWORK = MAX( 3*N, 2*N*N )
784 NNWORK = MAX( NNWORK, 1 )
786 CALL SGET24( .FALSE., JTYPE, THRESH, IOLDSD, NOUNIT, N,
787 $ A, LDA, H, HT, WR, WI, WRT, WIT, WRTMP,
788 $ WITMP, VS, LDVS, VS1, RCDEIN, RCDVIN, NSLCT,
789 $ ISLCT, RESULT, WORK, NNWORK, IWORK, BWORK,
797.GE.
IF( RESULT( J )ZERO )
799.GE.
IF( RESULT( J )THRESH )
804 $ NTESTF = NTESTF + 1
805.EQ.
IF( NTESTF1 ) THEN
806 WRITE( NOUNIT, FMT = 9999 )PATH
807 WRITE( NOUNIT, FMT = 9998 )
808 WRITE( NOUNIT, FMT = 9997 )
809 WRITE( NOUNIT, FMT = 9996 )
810 WRITE( NOUNIT, FMT = 9995 )THRESH
811 WRITE( NOUNIT, FMT = 9994 )
816.GE.
IF( RESULT( J )THRESH ) THEN
817 WRITE( NOUNIT, FMT = 9993 )N, IWK, IOLDSD, JTYPE,
822 NERRS = NERRS + NFAIL
823 NTESTT = NTESTT + NTEST
836 READ( NIUNIT, FMT = *, END = 200 )N, NSLCT
842 $ READ( NIUNIT, FMT = * )( ISLCT( I ), I = 1, NSLCT )
844 READ( NIUNIT, FMT = * )( A( I, J ), J = 1, N )
846 READ( NIUNIT, FMT = * )RCDEIN, RCDVIN
848 CALL SGET24( .TRUE., 22, THRESH, ISEED, NOUNIT, N, A, LDA, H, HT,
849 $ WR, WI, WRT, WIT, WRTMP, WITMP, VS, LDVS, VS1,
850 $ RCDEIN, RCDVIN, NSLCT, ISLCT, RESULT, WORK, LWORK,
851 $ IWORK, BWORK, INFO )
858.GE.
IF( RESULT( J )ZERO )
860.GE.
IF( RESULT( J )THRESH )
865 $ NTESTF = NTESTF + 1
866.EQ.
IF( NTESTF1 ) THEN
867 WRITE( NOUNIT, FMT = 9999 )PATH
868 WRITE( NOUNIT, FMT = 9998 )
869 WRITE( NOUNIT, FMT = 9997 )
870 WRITE( NOUNIT, FMT = 9996 )
871 WRITE( NOUNIT, FMT = 9995 )THRESH
872 WRITE( NOUNIT, FMT = 9994 )
876.GE.
IF( RESULT( J )THRESH ) THEN
877 WRITE( NOUNIT, FMT = 9992 )N, JTYPE, J, RESULT( J )
881 NERRS = NERRS + NFAIL
882 NTESTT = NTESTT + NTEST
888 CALL SLASUM( PATH, NOUNIT, NERRS, NTESTT )
890 9999 FORMAT( / 1X, A3, ' -- real schur form decomposition expert
',
891 $ 'driver
', / ' matrix types(see
sdrvsx for details):
' )
893 9998 FORMAT( / ' special matrices:
', / ' 1=zero matrix.
',
894 $ ' ', ' 5=diagonal: geometr. spaced entries.
',
895 $ / ' 2=identity matrix.
', ' 6=diagona
',
896 $ 'l: clustered entries.
', / ' 3=transposed jordan block.
',
897 $ ' ', ' 7=diagonal: large, evenly spaced.
', / ' ',
898 $ '4=diagonal: evenly spaced entries.
', ' 8=diagonal: s
',
899 $ 'mall, evenly spaced.
' )
900 9997 FORMAT( ' dense, non-symmetric matrices:
', / ' 9=well-cond., ev
',
901 $ 'enly spaced eigenvals.
', ' 14=ill-cond., geomet. spaced e
',
902 $ 'igenals.
', / ' 10=well-cond.,
geom. spaced eigenvals.
',
903 $ ' 15=ill-conditioned, clustered e.vals.
', / ' 11=well-cond
',
904 $ 'itioned, clustered e.vals.
', ' 16=ill-cond., random
comp',
905 $ 'lex
', / ' 12=well-cond., random
complex ', ' ',
906 $ ' 17=ill-cond., large rand. complx
', / ' 13=ill-condi
',
907 $ 'tioned, evenly spaced.
', ' 18=ill-cond., small rand.
',
909 9996 FORMAT( ' 19=matrix with random o(1) entries.
', ' 21=matrix
',
910 $ 'with small random entries.
', / ' 20=matrix
',
911 $ 'dom entries.
', / )
912 9995 FORMAT( ' tests performed with test threshold =
', F8.2,
913 $ / ' ( a denotes a on input and t denotes a on output)
',
914 $ / / ' 1 = 0
if t in schur form(no sort),
',
915 $ ' 1/ulp otherwise
', /
916 $ ' 2 = | a - vs t transpose(vs) | / ( n |a| ulp ) (no sort)
',
917 $ / ' 3 = | i - vs transpose(vs) | / ( n ulp ) (no sort)
', /
918 $ ' 4 = 0
if wr+sqrt(-1)*wi are eigenvalues of t(no sort),
',
919 $ ' 1/ulp otherwise
', /
920 $ ' 5 = 0
if t same no matter
if vs computed(no sort),
',
921 $ ' 1/ulp otherwise
', /
922 $ ' 6 = 0
if wr, wi same no matter
if vs computed(no sort)
',
923 $ ', 1/ulp otherwise
' )
924 9994 FORMAT( ' 7 = 0
if t in schur form(sort),
', ' 1/ulp otherwise
',
925 $ / ' 8 = | a - vs t transpose(vs) | / ( n |a| ulp ) (sort)
',
926 $ / ' 9 = | i - vs transpose(vs) | / ( n ulp ) (sort)
',
927 $ / ' 10 = 0
if wr+sqrt(-1)*wi are eigenvalues of t(sort),
',
928 $ ' 1/ulp otherwise
', /
929 $ ' 11 = 0
if t same no matter what
else computed(sort),
',
930 $ ' 1/ulp otherwise
', /
931 $ ' 12 = 0
if wr, wi same no matter what
else computed
',
932 $ '(sort), 1/ulp otherwise
', /
933 $ ' 13 = 0
if sorting successful, 1/ulp otherwise
',
934 $ / ' 14 = 0
if rconde same no matter what
else computed,
',
935 $ ' 1/ulp otherwise
', /
936 $ ' 15 = 0
if rcondv same no matter what
else computed,
',
937 $ ' 1/ulp otherwise
', /
938 $ ' 16 = | rconde - rconde(precomputed) | / cond(rconde),',
939 $ /
' 17 = | RCONDV - RCONDV(precomputed) | / cond(RCONDV),' )
940 9993
FORMAT(
' N=', i5,
', IWK=', i2,
', seed=', 4( i4,
',' ),
941 $
' type ', i2,
', test(', i2,
')=', g10.3 )
942 9992
FORMAT(
' N=', i5,
', input example =', i3,
', test(', i2,
')=',
944 9991
FORMAT(
' SDRVSX: ', a,
' returned INFO=', i6,
'.', / 9x,
'N=',
945 $ i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ), i5,
')' )