450 SUBROUTINE ddrvsx( 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, , LDVS, LWORK, NIUNIT, NOUNIT, NSIZES,
462 DOUBLE PRECISION THRESH
465 LOGICAL BWORK( * ), DOTYPE( * )
466 INTEGER ISEED( 4 ), IWORK( * ), NN( * )
467 DOUBLE PRECISION A( LDA, * ), H( LDA, * ), HT( LDA, * ),
469 $ wi( * ), wit( * ), witmp( * ), work( * ),
470 $ wr( * ), wrt( * ), wrtmp( * )
476 DOUBLE PRECISION ZERO,
477 PARAMETER ( ZERO = 0.0d0, one = 1.0d0 )
479 parameter( maxtyp = 21 )
484 INTEGER I, IINFO, IMODE, ITYPE, IWK, J, JCOL, JSIZE,
485 $ jtype, mtypes, n, nerrs, nfail, nmax, nnwork,
486 $ nslct, ntest, ntestf
487 DOUBLE PRECISION ANORM, , CONDS, , 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 DOUBLE PRECISION SELWI( 20 ), SELWR( 20 )
501 INTEGER SELDIM, SELOPT
504 COMMON / sslct / selopt, seldim, selval, selwr, selwi
507 DOUBLE PRECISION DLAMCH
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 ) =
'Double 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(
'DDRVSX', -info )
579 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
584 unfl = dlamch(
'Safe minimum' )
587 ulp = dlamch( 'precision
' )
596 DO 140 JSIZE = 1, NSIZES
598.NE.
IF( NSIZES1 ) THEN
599 MTYPES = MIN( MAXTYP, NTYPES )
601 MTYPES = MIN( MAXTYP+1, NTYPES )
604 DO 130 JTYPE = 1, MTYPES
605.NOT.
IF( DOTYPE( JTYPE ) )
611 IOLDSD( J ) = ISEED( J )
630.GT.
IF( MTYPESMAXTYP )
633 ITYPE = KTYPE( JTYPE )
634 IMODE = KMODE( JTYPE )
638 GO TO ( 30, 40, 50 )KMAGN( JTYPE )
654 CALL DLASET( 'full
', LDA, N, ZERO, ZERO, A, LDA )
662.EQ.
IF( ITYPE1 ) THEN
665.EQ.
ELSE IF( ITYPE2 ) THEN
670 A( JCOL, JCOL ) = ANORM
673.EQ.
ELSE IF( ITYPE3 ) THEN
678 A( JCOL, JCOL ) = ANORM
680 $ A( JCOL, JCOL-1 ) = ONE
683.EQ.
ELSE IF( ITYPE4 ) THEN
687 CALL DLATMS( N, N, 's
', ISEED, 's
', WORK, IMODE, COND,
688 $ ANORM, 0, 0, 'n
', A, LDA, WORK( N+1 ),
691.EQ.
ELSE IF( ITYPE5 ) THEN
695 CALL DLATMS( N, N, 's
', ISEED, 's
', WORK, IMODE, COND,
696 $ ANORM, N, N, 'n
', A, LDA, WORK( N+1 ),
699.EQ.
ELSE IF( ITYPE6 ) THEN
703.EQ.
IF( KCONDS( JTYPE )1 ) THEN
705.EQ.
ELSE IF( KCONDS( JTYPE )2 ) THEN
712 CALL DLATME( 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.EQ.
ELSE IF( ITYPE7 ) THEN
721 CALL DLATMR( 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.EQ.
ELSE IF( ITYPE8 ) THEN
730 CALL DLATMR( 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.EQ.
ELSE IF( ITYPE9 ) THEN
739 CALL DLATMR( 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 DLASET( 'full
', 2, N, ZERO, ZERO, A, LDA )
745 CALL DLASET( 'full
', N-3, 1, ZERO, ZERO, A( 3, 1 ),
747 CALL DLASET( 'full
', N-3, 2, ZERO, ZERO, A( 3, N-1 ),
749 CALL DLASET( 'full
', 1, N, ZERO, ZERO, A( N, 1 ),
753.EQ.
ELSE IF( ITYPE10 ) THEN
757 CALL DLATMR( 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.NE.
IF( IINFO0 ) 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 DGET24( .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 DGET24( .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 DLASUM( PATH, NOUNIT, NERRS, NTESTT )
890 9999 FORMAT( / 1X, A3, ' -- real schur form decomposition expert
',
891 $ 'driver
', / ' matrix types(see
ddrvsx 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
',
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 with large ran
',
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( ' ddrvsx:
', A, ' returned info=
', I6, '.
', / 9X, 'n=
',
945 $ I6, ', jtype=
', I6, ', iseed=(
', 3( I5, ',
' ), I5, ')
' )
subroutine dget24(comp, jtype, thresh, iseed, nounit, n, a, lda, h, ht, wr, wi, wrt, wit, wrtmp, witmp, vs, ldvs, vs1, rcdein, rcdvin, nslct, islct, result, work, lwork, iwork, bwork, info)
DGET24
subroutine ddrvsx(nsizes, nn, ntypes, dotype, iseed, thresh, niunit, nounit, a, lda, h, ht, wr, wi, wrt, wit, wrtmp, witmp, vs, ldvs, vs1, result, work, lwork, iwork, bwork, info)
DDRVSX
subroutine dlatmr(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)
DLATMR
subroutine dlatme(n, dist, iseed, d, mode, cond, dmax, ei, rsign, upper, sim, ds, modes, conds, kl, ku, anorm, a, lda, work, info)
DLATME