516 SUBROUTINE ddrvvx( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
517 $ NIUNIT, NOUNIT, A, LDA, H, WR, WI, WR1, WI1,
518 $ VL, LDVL, VR, LDVR, LRE, LDLRE, RCONDV, RCNDV1,
519 $ RCDVIN, RCONDE, RCNDE1, RCDEIN, SCALE, SCALE1,
520 $ RESULT, WORK, NWORK, IWORK, INFO )
527 INTEGER INFO, LDA, LDLRE, LDVL, LDVR, NIUNIT, NOUNIT,
528 $ NSIZES, NTYPES, NWORK
529 DOUBLE PRECISION THRESH
533 INTEGER ISEED( 4 ), IWORK( * ), NN( * )
534 DOUBLE PRECISION A( LDA, * )
537 $ result( 11 ), scale( * ), scale1( * ),
538 $ vl( ldvl, * ), vr( ldvr, * ), wi( * ),
539 $ wi1( * ), work( * ), wr( * ), wr1( * )
545 DOUBLE PRECISION ZERO, ONE
546 PARAMETER ( = 0.0d0, one = 1.0d0 )
548 PARAMETER ( MAXTYP = 21 )
554 INTEGER I, IBAL, IINFO, IMODE, ITYPE, IWK
556 $ nnwork, ntest, ntestf, ntestt
557 DOUBLE PRECISION ANORM, COND, CONDS, OVFL, RTULP, RTULPI, ULP,
561 CHARACTER ADUMMA( 1 ), BAL( 4 )
562 INTEGER IDUMMA( 1 ), IOLDSD( 4 ), KCONDS( MAXTYP ),
563 $ KMAGN( MAXTYP ), KMODE( MAXTYP ),
567 DOUBLE PRECISION DLAMCH
575 INTRINSIC abs,
max,
min, sqrt
578 DATA ktype / 1, 2, 3, 5*4, 4*6, 6*6, 3*9 /
579 DATA kmagn / 3*1, 1, 1, 1, 2, 3, 4*1, 1, 1, 1, 1, 2,
581 DATA kmode / 3*0, 4, 3, 1, 4, 4, 4, 3, 1, 5, 4, 3,
582 $ 1, 5, 5, 5, 4, 3, 1 /
583 DATA kconds / 3*0, 5*0, 4*1, 6*2, 3*0 /
584 DATA bal /
'N',
'P',
'S',
'B' /
588 path( 1: 1 ) =
'Double precision'
606 nmax =
max( nmax, nn( j ) )
613 IF( nsizes.LT.0 )
THEN
615 ELSE IF( badnn )
THEN
617 ELSE IF( ntypes.LT.0 )
THEN
619 ELSE IF( thresh.LT.zero )
THEN
621 ELSE IF( lda.LT.1 .OR. lda.LT.nmax )
THEN
623 ELSE IF( ldvl.LT.1 .OR. ldvl.LT.nmax )
THEN
625 ELSE IF( ldvr.LT.1 .OR. ldvr.LT.nmax )
THEN
627 ELSE IF( ldlre.LT.1 .OR. ldlre.LT.nmax )
THEN
629 ELSE IF( 6*nmax+2*nmax**2.GT.nwork )
THEN
634 CALL xerbla(
'DDRVVX', -info )
640 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
645 unfl = dlamch(
'Safe minimum' )
648 ulp = dlamch(
'Precision' )
657 DO 150 jsize = 1, nsizes
659 IF( nsizes.NE.1 )
THEN
660 mtypes =
min( maxtyp, ntypes )
662 mtypes =
min( maxtyp+1, ntypes )
665 DO 140 jtype = 1, mtypes
666 IF( .NOT.dotype( jtype ) )
672 ioldsd( j ) = iseed( j )
691 IF( mtypes.GT.maxtyp )
694 itype = ktype( jtype )
695 imode = kmode( jtype )
699 GO TO ( 30, 40, 50 )kmagn( jtype )
715 CALL dlaset(
'Full', lda, n, zero, zero, a, lda )
723 IF( itype.EQ.1 )
THEN
726 ELSE IF( itype.EQ.2 )
THEN
731 a( jcol, jcol ) = anorm
734 ELSE IF( itype.EQ.3 )
THEN
739 a( jcol, jcol ) = anorm
741 $ a( jcol, jcol-1 ) = one
744 ELSE IF( itype.EQ.4 )
THEN
748 CALL dlatms( n, n,
'S', iseed,
'S', work, imode, cond,
749 $ anorm, 0, 0,
'N', a, lda, work( n+1 ),
752 ELSE IF( itype.EQ.5 )
THEN
756 CALL dlatms( n, n,
'S', iseed,
'S', work, imode, cond,
757 $ anorm, n, n,
'N', a, lda, work( n
760 ELSE IF( itype.EQ.6 )
THEN
764 IF( kconds( jtype ).EQ.1 )
THEN
766 ELSE IF( kconds( jtype ).EQ.2 )
THEN
773 CALL dlatme( n,
'S', iseed, work, imode, cond, one,
774 $ adumma,
'T',
'T',
'T', work( n+1 ), 4,
775 $ conds, n, n, anorm, a, lda, work( 2*n+1 ),
778 ELSE IF( itype.EQ.7 )
THEN
782 CALL dlatmr( n, n,
'S', iseed,
'S', work, 6, one, one,
783 $
'T',
'N', work( n+1 ), 1, one,
784 $ work( 2*n+1 ), 1, one,
'N', idumma, 0, 0,
785 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
787 ELSE IF( itype.EQ.8 )
THEN
791 CALL dlatmr( n, n,
'S', iseed,
'S', work, 6, one, one,
792 $
'T',
'N', work( n+1 ), 1, one,
793 $ work( 2*n+1 ), 1, one, 'n
', IDUMMA, N, N,
794 $ ZERO, ANORM, 'no
', A, LDA, IWORK, IINFO )
796.EQ.
ELSE IF( ITYPE9 ) THEN
800 CALL DLATMR( N, N, 's
', ISEED, 'n
', WORK, 6, ONE, ONE,
801 $ 't
', 'n
', WORK( N+1 ), 1, ONE,
802 $ WORK( 2*N+1 ), 1, ONE, 'n
', IDUMMA, N, N,
803 $ ZERO, ANORM, 'no
', A, LDA, IWORK, IINFO )
805 CALL DLASET( 'full
', 2, N, ZERO, ZERO, A, LDA )
806 CALL DLASET( 'full
', N-3, 1, ZERO, ZERO, A( 3, 1 ),
808 CALL DLASET( 'full
', N-3, 2, ZERO, ZERO, A( 3, N-1 ),
810 CALL DLASET( 'full
', 1, N, ZERO, ZERO, A( N, 1 ),
814.EQ.
ELSE IF( ITYPE10 ) THEN
818 CALL DLATMR( N, N, 's
', ISEED, 'n
', WORK, 6, ONE, ONE,
819 $ 't
', 'n
', WORK( N+1 ), 1, ONE,
820 $ WORK( 2*N+1 ), 1, ONE, 'n
', IDUMMA, N, 0,
821 $ ZERO, ANORM, 'no
', A, LDA, IWORK, IINFO )
828.NE.
IF( IINFO0 ) THEN
829 WRITE( NOUNIT, FMT = 9992 )'generator
', IINFO, N, JTYPE,
842.EQ.
ELSE IF( IWK2 ) THEN
845 NNWORK = 6*N + 2*N**2
847 NNWORK = MAX( NNWORK, 1 )
856 CALL DGET23( .FALSE., BALANC, JTYPE, THRESH, IOLDSD,
857 $ NOUNIT, N, A, LDA, H, WR, WI, WR1, WI1,
858 $ VL, LDVL, VR, LDVR, LRE, LDLRE, RCONDV,
859 $ RCNDV1, RCDVIN, RCONDE, RCNDE1, RCDEIN,
860 $ SCALE, SCALE1, RESULT, WORK, NNWORK,
868.GE.
IF( RESULT( J )ZERO )
870.GE.
IF( RESULT( J )THRESH )
875 $ NTESTF = NTESTF + 1
876.EQ.
IF( NTESTF1 ) THEN
877 WRITE( NOUNIT, FMT = 9999 )PATH
878 WRITE( NOUNIT, FMT = 9998 )
879 WRITE( NOUNIT, FMT = 9997 )
880 WRITE( NOUNIT, FMT = 9996 )
881 WRITE( NOUNIT, FMT = 9995 )THRESH
886.GE.
IF( RESULT( J )THRESH ) THEN
887 WRITE( NOUNIT, FMT = 9994 )BALANC, N, IWK,
888 $ IOLDSD, JTYPE, J, RESULT( J )
892 NERRS = NERRS + NFAIL
893 NTESTT = NTESTT + NTEST
908 READ( NIUNIT, FMT = *, END = 220 )N
917 READ( NIUNIT, FMT = * )( A( I, J ), J = 1, N )
920 READ( NIUNIT, FMT = * )WR1( I ), WI1( I ), RCDEIN( I ),
923 CALL DGET23( .TRUE., 'n
', 22, THRESH, ISEED, NOUNIT, N, A, LDA, H,
924 $ WR, WI, WR1, WI1, VL, LDVL, VR, LDVR, LRE, LDLRE,
925 $ RCONDV, RCNDV1, RCDVIN, RCONDE, RCNDE1, RCDEIN,
926 $ SCALE, SCALE1, RESULT, WORK, 6*N+2*N**2, IWORK,
934.GE.
IF( RESULT( J )ZERO )
936.GE.
IF( RESULT( J )THRESH )
941 $ NTESTF = NTESTF + 1
942.EQ.
IF( NTESTF1 ) THEN
943 WRITE( NOUNIT, FMT = 9999 )PATH
944 WRITE( NOUNIT, FMT = 9998 )
945 WRITE( NOUNIT, FMT = 9997 )
946 WRITE( NOUNIT, FMT = 9996 )
947 WRITE( NOUNIT, FMT = 9995 )THRESH
952.GE.
IF( RESULT( J )THRESH ) THEN
953 WRITE( NOUNIT, FMT = 9993 )N, JTYPE, J, RESULT( J )
957 NERRS = NERRS + NFAIL
958 NTESTT = NTESTT + NTEST
964 CALL DLASUM( PATH, NOUNIT, NERRS, NTESTT )
966 9999 FORMAT( / 1X, A3, ' -- real eigenvalue-eigenvector decomposition
',
967 $ ' expert driver
', /
968 $ ' matrix types (see
ddrvvx for details):
' )
970 9998 FORMAT( / ' special matrices:
', / ' 1=zero matrix.
',
971 $ ' ', ' 5=diagonal: geometr. spaced entries.
',
972 $ / ' 2=identity matrix.
', ' 6=diagona
',
973 $ 'l: clustered entries.
', / ' 3=transposed jordan block.
',
974 $ ' ', ' 7=diagonal: large, evenly spaced.
', / ' ',
975 $ '4=diagonal: evenly spaced entries.
', ' 8=diagonal: s
',
976 $ 'mall, evenly spaced.
' )
977 9997 FORMAT( ' dense, non-symmetric matrices:
', / ' 9=well-cond., ev
',
978 $ 'enly spaced eigenvals.
', ' 14=ill-cond., geomet. spaced e
',
979 $ 'igenals.
', / ' 10=well-cond.,
geom. spaced eigenvals. ',
980 $
' 15=Ill-conditioned, clustered e.vals.', /
' 11=Well-cond',
981 $
'itioned, clustered e.vals. ',
' 16=Ill-cond., random comp',
982 $
'lex ', /
' 12=Well-cond., random complex ',
' ',
983 $
' 17=Ill-cond., large rand. complx ', /
' 13=Ill-condi',
984 $
'tioned, evenly spaced. ',
' 18=Ill-cond., small rand.',
986 9996
FORMAT(
' 19=Matrix with random O(1) entries. ',
' 21=Matrix ',
987 $
'with small random entries.', /
' 20=Matrix with large ran',
988 $
'dom entries. ',
' 22=Matrix read from input file', / )
989FORMAT' Tests performed with test threshold =', f8.2,
990 $ / /
' 1 = | A VR - VR W | / ( n |A| ulp ) ',
991 $ /
' 2 = | transpose(A) VL - VL W | / ( n |A| ulp ) ',
992 $ /
' 3 = | |VR(i)| - 1 | / ulp ',
993 $ /
' 4 = | |VL(i)| - 1 | / ulp ',
994 $ /
' 5 = 0 if W same no matter if VR or VL computed,',
995 $
' 1/ulp otherwise', /
996 $
' 6 = 0 if VR same no matter what else computed,',
997 $
' 1/ulp otherwise', /
998 $
' 7 = 0 if VL same no matter what else computed,',
999 $
' 1/ulp otherwise', /
1000 $
' 8 = 0 if RCONDV same no matter what else computed,',
1001 $
' 1/ulp otherwise', /
1002 $
' 9 = 0 if SCALE, ILO, IHI, ABNRM same no matter what else',
1003 $
' computed, 1/ulp otherwise',
1004 $ /
' 10 = | RCONDV - RCONDV(precomputed) | / cond(RCONDV),',
1005 $ /
' 11 = | RCONDE - RCONDE(precomputed) | / cond(RCONDE),' )
1006 9994
FORMAT(
' BALANC=''', a1,
''',N=', i4,
',IWK=', i1,
', seed=',
1007 $ 4( i4,
',' ),
' type ', i2,
', test(', i2,
')=', g10.3 )
1008 9993
FORMAT(
' N=', i5,
', input example =', i3,
', test(', i2,
')=',
1010 9992
FORMAT(
' DDRVVX: ', a,
' returned INFO=', i6,
'.', / 9x,
'N=',
1011 $ i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ), i5,
')' )
subroutine ddrvvx(nsizes, nn, ntypes, dotype, iseed, thresh, niunit, nounit, a, lda, h, wr, wi, wr1, wi1, vl, ldvl, vr, ldvr, lre, ldlre, rcondv, rcndv1, rcdvin, rconde, rcnde1, rcdein, scale, scale1, result, work, nwork, iwork, info)
DDRVVX
subroutine dget23(comp, balanc, jtype, thresh, iseed, nounit, n, a, lda, h, wr, wi, wr1, wi1, vl, ldvl, vr, ldvr, lre, ldlre, rcondv, rcndv1, rcdvin, rconde, rcnde1, rcdein, scale, scale1, result, work, lwork, iwork, info)
DGET23
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