385 SUBROUTINE sdrves( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
386 $ NOUNIT, A, LDA, H, HT, WR, WI, WRT, WIT, VS,
387 $ LDVS, RESULT, WORK, NWORK, IWORK, BWORK, INFO )
394 INTEGER INFO, , LDVS, NOUNIT, NSIZES, NTYPES,
398 LOGICAL BWORK( * ), DOTYPE( * )
399 INTEGER ISEED( 4 ), IWORK( * ), NN( * )
400 REAL A( LDA, * ), H(( LDA, * ),
401 $ result( 13 ), vs( ldvs, * ), wi( * ), wit( * ),
402 $ work( * ), wr( * ), wrt( * )
409 PARAMETER ( ZERO = 0.0e0, one = 1.0e0 )
411 parameter( maxtyp = 21 )
417 INTEGER I, IINFO, IMODE, ISORT, ITYPE, IWK, J, JCOL,
418 $ jsize, jtype, knteig, lwork, mtypes, n,
419 $ nerrs, nfail, nmax, nnwork, ntest, ntestf,
421 REAL ANORM, COND, CONDS, OVFL, RTULP, RTULPI, TMP,
425 CHARACTER ADUMMA( 1 )
426 INTEGER IDUMMA( 1 ), IOLDSD( 4 ), KCONDS( MAXTYP ),
427 $ kmagn( maxtyp ), kmode( maxtyp ),
433 REAL SELWI( 20 ), SELWR( 20 )
436 INTEGER SELDIM, SELOPT
439 COMMON / sslct / selopt, seldim, selval, selwr, selwi
444 EXTERNAL sslect, slamch
451 INTRINSIC abs,
max, sign, sqrt
454 DATA ktype / 1, 2, 3, 5*4, 4*6, 6*6, 3*9 /
455 DATA kmagn / 3*1, 1, 1, 1, 2, 3, 4*1, 1, 1, 1, 1, 2,
457 DATA kmode / 3*0, 4, 3, 1, 4, 4, 4, 3, 1, 5, 4, 3,
458 $ 1, 5, 5, 5, 4, 3, 1 /
459 DATA kconds / 3*0, 5*0, 4*1, 6*2, 3*0 /
463 path( 1: 1 ) =
'Single precision'
478 nmax =
max( nmax, nn( j ) )
485 IF( nsizes.LT.0 )
THEN
487 ELSE IF( badnn )
THEN
489 ELSE IF( ntypes.LT.0 )
THEN
491 ELSE IF( thresh.LT.zero )
THEN
493 ELSE IF( nounit.LE.0 )
THEN
495 ELSE IF( lda.LT.1 .OR. lda.LT.nmax )
THEN
497 ELSE IF( ldvs.LT.1 .OR. ldvs.LT.nmax )
THEN
499 ELSE IF( 5*nmax+2*nmax**2.GT.nwork )
THEN
504 CALL xerbla(
'SDRVES', -info )
510 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
515 unfl = slamch(
'Safe minimum' )
518 ulp = slamch(
'Precision' )
527 DO 270 jsize = 1, nsizes
530 IF( nsizes.EQ.1 .AND. ntypes.EQ.maxtyp+1 )
531 $ mtypes = mtypes + 1
533 DO 260 jtype = 1, mtypes
534 IF( .NOT.dotype( jtype ) )
540 ioldsd( j ) = iseed( j )
559 IF( mtypes.GT.maxtyp )
562 itype = ktype( jtype )
563 imode = kmode( jtype )
567 GO TO ( 30, 40, 50 )kmagn( jtype )
583 CALL slaset(
'Full', lda, n, zero, zero, a, lda )
591 IF( itype.EQ.1 )
THEN
594 ELSE IF( itype.EQ.2 )
THEN
599 a( jcol, jcol ) = anorm
602 ELSE IF( itype.EQ.3 )
THEN
607 a( jcol, jcol ) = anorm
609 $ a( jcol, jcol-1 ) = one
612 ELSE IF( itype.EQ.4 )
THEN
616 CALL slatms( n, n,
'S', iseed,
'S', work, imode, cond,
617 $ anorm, 0, 0,
'N', a, lda, work( n+1 ),
620 ELSE IF( itype.EQ.5 )
THEN
624 CALL slatms( n, n,
'S', iseed,
'S', work, imode, cond,
625 $ anorm, n, n, 'n
', A, LDA, WORK( N+1 ),
628.EQ.
ELSE IF( ITYPE6 ) THEN
632.EQ.
IF( KCONDS( JTYPE )1 ) THEN
634.EQ.
ELSE IF( KCONDS( JTYPE )2 ) THEN
641 CALL SLATME( N, 's
', ISEED, WORK, IMODE, COND, ONE,
642 $ ADUMMA, 't
', 't
', 't
', WORK( N+1 ), 4,
643 $ CONDS, N, N, ANORM, A, LDA, WORK( 2*N+1 ),
646.EQ.
ELSE IF( ITYPE7 ) THEN
650 CALL SLATMR( N, N, 's
', ISEED, 's
', WORK, 6, ONE, ONE,
651 $ 't
', 'n
', WORK( N+1 ), 1, ONE,
652 $ WORK( 2*N+1 ), 1, ONE, 'n
', IDUMMA, 0, 0,
653 $ ZERO, ANORM, 'no
', A, LDA, IWORK, IINFO )
655.EQ.
ELSE IF( ITYPE8 ) THEN
659 CALL SLATMR( N, N, 's
', ISEED, 's
', WORK, 6, ONE, ONE,
660 $ 't
', 'n
', WORK( N+1 ), 1, ONE,
661 $ WORK( 2*N+1 ), 1, ONE, 'n
', IDUMMA, N, N,
662 $ ZERO, ANORM, 'no
', A, LDA, IWORK, IINFO )
664.EQ.
ELSE IF( ITYPE9 ) THEN
668 CALL SLATMR( N, N, 's
', ISEED, 'n
', WORK, 6, ONE, ONE,
669 $ 't
', 'n
', WORK( N+1 ), 1, ONE,
670 $ WORK( 2*N+1 ), 1, ONE, 'n
', IDUMMA, N, N,
671 $ ZERO, ANORM, 'no
', A, LDA, IWORK, IINFO )
673 CALL SLASET( 'full
', 2, N, ZERO, ZERO, A, LDA )
674 CALL SLASET( 'full
', N-3, 1, ZERO, ZERO, A( 3, 1 ),
676 CALL SLASET( 'full
', N-3, 2, ZERO, ZERO, A( 3, N-1 ),
678 CALL SLASET( 'full
', 1, N, ZERO, ZERO, A( N, 1 ),
682.EQ.
ELSE IF( ITYPE10 ) THEN
686 CALL SLATMR( N, N, 's
', ISEED, 'n
', WORK, 6, ONE, ONE,
687 $ 't
', 'n
', WORK( N+1 ), 1, ONE,
688 $ WORK( 2*N+1 ), 1, ONE, 'n
', IDUMMA, N, 0,
689 $ ZERO, ANORM, 'no
', A, LDA, IWORK, IINFO )
696.NE.
IF( IINFO0 ) THEN
697 WRITE( NOUNIT, FMT = 9992 )'generator
', IINFO, N, JTYPE,
711 NNWORK = 5*N + 2*N**2
713 NNWORK = MAX( NNWORK, 1 )
724.EQ.
IF( ISORT0 ) THEN
734 CALL SLACPY( 'f
', N, N, A, LDA, H, LDA )
735 CALL SGEES( 'v
', SORT, SSLECT, N, H, LDA, SDIM, WR,
736 $ WI, VS, LDVS, WORK, NNWORK, BWORK, IINFO )
737.NE..AND..NE.
IF( IINFO0 IINFON+2 ) THEN
738 RESULT( 1+RSUB ) = ULPINV
739 WRITE( NOUNIT, FMT = 9992 )'sgees1
', IINFO, N,
747 RESULT( 1+RSUB ) = ZERO
750.NE.
IF( H( I, J )ZERO )
751 $ RESULT( 1+RSUB ) = ULPINV
755.NE..AND..NE.
IF( H( I+1, I )ZERO H( I+2, I+1 )
756 $ ZERO )RESULT( 1+RSUB ) = ULPINV
759.NE.
IF( H( I+1, I )ZERO ) THEN
760.NE..OR.
IF( H( I, I )H( I+1, I+1 )
761.EQ..OR.
$ H( I, I+1 )ZERO
762.EQ.
$ SIGN( ONE, H( I+1, I ) )
763 $ SIGN( ONE, H( I, I+1 ) ) )RESULT( 1+RSUB )
770 LWORK = MAX( 1, 2*N*N )
771 CALL SHST01( N, 1, N, A, LDA, H, LDA, VS, LDVS, WORK,
773 RESULT( 2+RSUB ) = RES( 1 )
774 RESULT( 3+RSUB ) = RES( 2 )
778 RESULT( 4+RSUB ) = ZERO
780.NE.
IF( H( I, I )WR( I ) )
781 $ RESULT( 4+RSUB ) = ULPINV
784.EQ..AND..NE.
IF( H( 2, 1 )ZERO WI( 1 )ZERO )
785 $ RESULT( 4+RSUB ) = ULPINV
786.EQ..AND..NE.
IF( H( N, N-1 )ZERO WI( N )ZERO )
787 $ RESULT( 4+RSUB ) = ULPINV
790.NE.
IF( H( I+1, I )ZERO ) THEN
791 TMP = SQRT( ABS( H( I+1, I ) ) )*
792 $ SQRT( ABS( H( I, I+1 ) ) )
793 RESULT( 4+RSUB ) = MAX( RESULT( 4+RSUB ),
794 $ ABS( WI( I )-TMP ) /
795 $ MAX( ULP*TMP, UNFL ) )
796 RESULT( 4+RSUB ) = MAX( RESULT( 4+RSUB ),
797 $ ABS( WI( I+1 )+TMP ) /
798 $ MAX( ULP*TMP, UNFL ) )
799.GT.
ELSE IF( I1 ) THEN
800.EQ..AND..EQ.
IF( H( I+1, I )ZERO H( I, I-1 )
801.AND..NE.
$ ZERO WI( I )ZERO )RESULT( 4+RSUB )
808 CALL SLACPY( 'f
', N, N, A, LDA, HT, LDA )
809 CALL SGEES( 'n
', SORT, SSLECT, N, HT, LDA, SDIM, WRT,
810 $ WIT, VS, LDVS, WORK, NNWORK, BWORK,
812.NE..AND..NE.
IF( IINFO0 IINFON+2 ) THEN
813 RESULT( 5+RSUB ) = ULPINV
814 WRITE( NOUNIT, FMT = 9992 )'sgees2
', IINFO, N,
820 RESULT( 5+RSUB ) = ZERO
823.NE.
IF( H( I, J )HT( I, J ) )
824 $ RESULT( 5+RSUB ) = ULPINV
830 RESULT( 6+RSUB ) = ZERO
832.NE..OR..NE.
IF( WR( I )WRT( I ) WI( I )WIT( I ) )
833 $ RESULT( 6+RSUB ) = ULPINV
838.EQ.
IF( ISORT1 ) THEN
842.OR.
IF( SSLECT( WR( I ), WI( I ) )
843 $ SSLECT( WR( I ), -WI( I ) ) )
844 $ KNTEIG = KNTEIG + 1
846 IF( ( SSLECT( WR( I+1 ),
847.OR.
$ WI( I+1 ) ) SSLECT( WR( I+1 ),
848.AND.
$ -WI( I+1 ) ) )
849.NOT.
$ ( ( SSLECT( WR( I ),
850.OR.
$ WI( I ) ) SSLECT( WR( I ),
851.AND..NE.
$ -WI( I ) ) ) ) IINFON+2 )
852 $ RESULT( 13 ) = ULPINV
855.NE.
IF( SDIMKNTEIG ) THEN
856 RESULT( 13 ) = ULPINV
869.GE.
IF( RESULT( J )ZERO )
871.GE.
IF( RESULT( J )THRESH )
876 $ NTESTF = NTESTF + 1
877.EQ.
IF( NTESTF1 ) THEN
878 WRITE( NOUNIT, FMT = 9999 )PATH
879 WRITE( NOUNIT, FMT = 9998 )
880 WRITE( NOUNIT, FMT = 9997 )
881 WRITE( NOUNIT, FMT = 9996 )
882 WRITE( NOUNIT, FMT = 9995 )THRESH
883 WRITE( NOUNIT, FMT = 9994 )
888.GE.
IF( RESULT( J )THRESH ) THEN
889 WRITE( NOUNIT, FMT = 9993 )N, IWK, IOLDSD, JTYPE,
894 NERRS = NERRS + NFAIL
895 NTESTT = NTESTT + NTEST
903 CALL SLASUM( PATH, NOUNIT, NERRS, NTESTT )
905 9999 FORMAT( / 1X, A3, ' -- real schur form decomposition driver
',
906 $ / ' matrix types(see
sdrves for details):
' )
908 9998 FORMAT( / ' special matrices:
', / ' 1=zero matrix.
',
909 $ ' ', ' 5=diagonal: geometr. spaced entries.
',
910 $ / ' 2=identity matrix.
', ' 6=diagona
',
911 $ 'l: clustered entries.
', / ' 3=transposed jordan block.
',
912 $ ' ', ' 7=diagonal: large, evenly spaced.
', / ' ',
913 $ '4=diagonal: evenly spaced entries.
', ' 8=diagonal: s
',
914 $ 'mall, evenly spaced.
' )
915 9997 FORMAT( ' dense, non-symmetric matrices
', / ' 9=well-cond., ev
',
916 $ 'enly spaced eigenvals.
', ' 14=ill-cond., geomet. spaced e
',
917 $ 'igenals.
', / ' 10=well-cond.,
geom. spaced eigenvals.
',
918 $ ' 15=ill-conditioned, clustered e.vals.
', / ' 11=well-cond
',
919 $ 'itioned, clustered e.vals.
', ' 16=ill-cond., random
comp',
920 $ 'lex
', / ' 12=well-cond., random
complex', 6X, '',
921 $ ' 17=ill-cond., large rand. complx
', / ' 13=ill-condi
',
922 $ 'tioned, evenly spaced.
', ' 18=ill-cond., small rand.
',
924 9996
FORMAT(
' 19=Matrix with random O(1) entries. ',
' 21=Matrix ',
925 $
'with small random entries.', /
' 20=Matrix with large ran',
926 $
'dom entries. ', / )
927 9995
FORMAT(
' Tests performed with test threshold =', f8.2,
928 $ /
' ( A denotes A on input and T denotes A on output)',
929 $ / /
' 1 = 0 if T in Schur form (no sort), ',
930 $
' 1/ulp otherwise', /
931 $
' 2 = | A - VS T transpose(VS) | / ( n |A| ulp ) (no sort)',
932 $ /
' 3 = | I - VS transpose(VS) | / ( n ulp ) (no sort) ', /
933 $
' 4 = 0 if WR+sqrt(-1)*WI are eigenvalues of T (no sort),',
934 $
' 1/ulp otherwise', /
935 $
' 5 = 0 if T same no matter if VS computed (no sort),',
936 $
' 1/ulp otherwise', /
937 $
' 6 = 0 if WR, WI same no matter if VS computed (no sort)',
938 $
', 1/ulp otherwise' )
939 9994
FORMAT(
' 7 = 0 if T in Schur form (sort), ',
' 1/ulp otherwise',
940 $ /
' 8 = | A - VS T transpose(VS) | / ( n |A| ulp ) (sort)',
941 $ /
' 9 = | I - VS transpose(VS) | / ( n ulp ) (sort) ',
942 $ /
' 10 = 0 if WR+sqrt(-1)*WI are eigenvalues of T (sort),',
943 $
' 1/ulp otherwise', /
944 $
' 11 = 0 if T same no matter if VS computed (sort),',
945 $
' 1/ulp otherwise', /
946 $
' 12 = 0 if WR, WI same no matter if VS computed (sort),',
947 $
' 1/ulp otherwise', /
948 $
' 13 = 0 if sorting successful, 1/ulp otherwise', / )
949 9993
FORMAT(
' N=', i5,
', IWK=', i2,
', seed=', 4( i4,
',' ),
950 $
' type ', i2,
', test(', i2,
')=', g10.3 )
951 9992
FORMAT(
' SDRVES: ', a,
' returned INFO=', i6,
'.', / 9x,
'N=',
952 $ i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ), i5,
')' )
subroutine sgees(jobvs, sort, select, n, a, lda, sdim, wr, wi, vs, ldvs, work, lwork, bwork, info)
SGEES computes the eigenvalues, the Schur form, and, optionally, the matrix of Schur vectors for GE m...
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 sdrves(nsizes, nn, ntypes, dotype, iseed, thresh, nounit, a, lda, h, ht, wr, wi, wrt, wit, vs, ldvs, result, work, nwork, iwork, bwork, info)
SDRVES