402 SUBROUTINE ddrvev( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
403 $ NOUNIT, A, LDA, H, WR, WI, WR1, WI1, VL, LDVL,
404 $ VR, LDVR, LRE, LDLRE, RESULT, WORK, NWORK,
412 INTEGER INFO, LDA, LDLRE, LDVL, LDVR, NOUNIT, NSIZES,
414 DOUBLE PRECISION THRESH
418 INTEGER ISEED( 4 ), IWORK( * ), NN( * )
419 DOUBLE PRECISION A( LDA, * ), H( LDA, * ), LRE( LDLRE, * ),
421 $ wi( * ), wi1( * ), work( * ), wr( * ), wr1( * )
427 DOUBLE PRECISION ZERO, ONE
428 PARAMETER ( ZERO = 0.0d0, one = 1.0d0 )
430 parameter( two = 2.0d0 )
432 parameter( maxtyp = 21 )
437 INTEGER IINFO, IMODE, ITYPE, IWK, J, JCOL, JJ
439 $ ntest, ntestf, ntestt
440 DOUBLE PRECISION ANORM, COND, CONDS, OVFL, RTULP, RTULPI, TNRM,
441 $ ULP, ULPINV, UNFL, VMX, VRMX, VTST
444 CHARACTER ADUMMA( 1 )
445 INTEGER IDUMMA( 1 ), ( 4 ), KCONDS( MAXTYP ),
446 $ KMAGN( MAXTYP ), KMODE( MAXTYP ),
448 DOUBLE PRECISION DUM( 1 ), RES( 2 )
451 DOUBLE PRECISION DLAMCH, DLAPY2, DNRM2
452 EXTERNAL DLAMCH, DLAPY2, DNRM2
459 INTRINSIC abs,
max,
min, sqrt
462 DATA ktype / 1, 2, 3, 5*4, 4*6, 6*6, 3*9 /
463 DATA kmagn / 3*1, 1, 1, 1, 2, 3, 4*1, 1, 1, 1, 1, 2,
465 DATA kmode / 3*0, 4, 3, 1, 4, 4, 4, 3, 1, 5, 4, 3,
466 $ 1, 5, 5, 5, 4, 3, 1 /
467 DATA kconds / 3*0, 5*0, 4*1, 6*2, 3*0 /
471 path( 1: 1 ) =
'Double precision'
485 nmax =
max( nmax, nn( j ) )
492 IF( nsizes.LT.0 )
THEN
494 ELSE IF( badnn )
THEN
496 ELSE IF( ntypes.LT.0 )
THEN
498 ELSE IF( thresh.LT.zero )
THEN
500 ELSE IF( nounit.LE.0 )
THEN
502 ELSE IF( lda.LT.1 .OR. lda.LT.nmax )
THEN
504 ELSE IF( ldvl.LT.1 .OR. ldvl.LT.nmax )
THEN
506 ELSE IF( ldvr.LT.1 .OR. ldvr.LT.nmax )
THEN
508 ELSE IF( ldlre.LT.1 .OR. ldlre.LT.nmax )
THEN
510 ELSE IF( 5*nmax+2*nmax**2.GT.nwork )
THEN
515 CALL xerbla(
'DDRVEV', -info )
521 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
526 unfl = dlamch(
'Safe minimum' )
529 ulp = dlamch(
'Precision' )
538 DO 270 jsize = 1, nsizes
540 IF( nsizes.NE.1 )
THEN
541 mtypes =
min( maxtyp, ntypes )
543 mtypes =
min( maxtyp+1, ntypes )
546 DO 260 jtype = 1, mtypes
547 IF( .NOT.dotype( jtype ) )
553 ioldsd( j ) = iseed( j )
572 IF( mtypes.GT.maxtyp )
575 itype = ktype( jtype )
576 imode = kmode( jtype )
580 GO TO ( 30, 40, 50 )kmagn( jtype )
596 CALL dlaset(
'Full', lda, n, zero, zero, a, lda )
604 IF( itype.EQ.1 )
THEN
607 ELSE IF( itype.EQ.2 )
THEN
612 a( jcol, jcol ) = anorm
615 ELSE IF( itype.EQ.3 )
THEN
620 a( jcol, jcol ) = anorm
622 $ a( jcol, jcol-1 ) = one
625 ELSE IF( itype.EQ.4 )
THEN
629 CALL dlatms( n, n,
'S', iseed,
'S', work, imode, cond,
630 $ anorm, 0, 0,
'N', a, lda, work( n+1 ),
633 ELSE IF( itype.EQ.5 )
THEN
637 CALL dlatms( n, n,
'S', iseed, 's
', WORK, IMODE, COND,
638 $ ANORM, N, N, 'n
', A, LDA, WORK( N+1 ),
641.EQ.
ELSE IF( ITYPE6 ) THEN
645.EQ.
IF( KCONDS( JTYPE )1 ) THEN
647.EQ.
ELSE IF( KCONDS( JTYPE )2 ) THEN
654 CALL DLATME( N, 's
', ISEED, WORK, IMODE, COND, ONE,
655 $ ADUMMA, 't
', 't
', 't
', WORK( N+1 ), 4,
656 $ CONDS, N, N, ANORM, A, LDA, WORK( 2*N+1 ),
659.EQ.
ELSE IF( ITYPE7 ) THEN
663 CALL DLATMR( N, N, 's
', ISEED, 's
', WORK, 6, ONE, ONE,
664 $ 't
', 'n
', WORK( N+1 ), 1, ONE,
665 $ WORK( 2*N+1 ), 1, ONE, 'n
', IDUMMA, 0, 0,
666 $ ZERO, ANORM, 'no
', A, LDA, IWORK, IINFO )
668.EQ.
ELSE IF( ITYPE8 ) THEN
672 CALL DLATMR( N, N, 's
', ISEED, 's
', WORK, 6, ONE, ONE,
673 $ 't
', 'n
', WORK( N+1 ), 1, ONE,
674 $ WORK( 2*N+1 ), 1, ONE, 'n
', IDUMMA, N, N,
675 $ ZERO, ANORM, 'no
', A, LDA, IWORK, IINFO )
677.EQ.
ELSE IF( ITYPE9 ) THEN
681 CALL DLATMR( N, N, 's
', ISEED, 'n
', WORK, 6, ONE, ONE,
682 $ 't
', 'n
', WORK( N+1 ), 1, ONE,
683 $ WORK( 2*N+1 ), 1, ONE, 'n
', IDUMMA, N, N,
684 $ ZERO, ANORM, 'no
', A, LDA, IWORK, IINFO )
686 CALL DLASET( 'full
', 2, N, ZERO, ZERO, A, LDA )
687 CALL DLASET( 'full
', N-3, 1, ZERO, ZERO, A( 3, 1 ),
689 CALL DLASET( 'full
', N-3, 2, ZERO, ZERO, A( 3, N-1 ),
691 CALL DLASET( 'full
', 1, N, ZERO, ZERO, A( N, 1 ),
695.EQ.
ELSE IF( ITYPE10 ) THEN
699 CALL DLATMR( N, N, 's
', ISEED, 'n
', WORK, 6, ONE, ONE,
700 $ 't
', 'n
', WORK( N+1 ), 1, ONE,
701 $ WORK( 2*N+1 ), 1, ONE, 'n
', IDUMMA, N, 0,
702 $ ZERO, ANORM, 'no
', A, LDA, IWORK, IINFO )
709.NE.
IF( IINFO0 ) THEN
710 WRITE( NOUNIT, FMT = 9993 )'generator
', IINFO, N, JTYPE,
724 NNWORK = 5*N + 2*N**2
726 NNWORK = MAX( NNWORK, 1 )
736 CALL DLACPY( 'f
', N, N, A, LDA, H, LDA )
737 CALL DGEEV( 'v
', 'v
', N, H, LDA, WR, WI, VL, LDVL, VR,
738 $ LDVR, WORK, NNWORK, IINFO )
739.NE.
IF( IINFO0 ) THEN
741 WRITE( NOUNIT, FMT = 9993 )'dgeev1
', IINFO, N, JTYPE,
749 CALL DGET22( 'n
', 'n
', 'n
', N, A, LDA, VR, LDVR, WR, WI,
751 RESULT( 1 ) = RES( 1 )
755 CALL DGET22( 't
', 'n
', 't
', N, A, LDA, VL, LDVL, WR, WI,
757 RESULT( 2 ) = RES( 1 )
763.EQ.
IF( WI( J )ZERO ) THEN
764 TNRM = DNRM2( N, VR( 1, J ), 1 )
765.GT.
ELSE IF( WI( J )ZERO ) THEN
766 TNRM = DLAPY2( DNRM2( N, VR( 1, J ), 1 ),
767 $ DNRM2( N, VR( 1, J+1 ), 1 ) )
769 RESULT( 3 ) = MAX( RESULT( 3 ),
770 $ MIN( ULPINV, ABS( TNRM-ONE ) / ULP ) )
771.GT.
IF( WI( J )ZERO ) THEN
775 VTST = DLAPY2( VR( JJ, J ), VR( JJ, J+1 ) )
778.EQ..AND.
IF( VR( JJ, J+1 )ZERO
779.GT.
$ ABS( VR( JJ, J ) )VRMX )
780 $ VRMX = ABS( VR( JJ, J ) )
782.LT.
IF( VRMX / VMXONE-TWO*ULP )
783 $ RESULT( 3 ) = ULPINV
791.EQ.
IF( WI( J )ZERO ) THEN
792 TNRM = DNRM2( N, VL( 1, J ), 1 )
793.GT.
ELSE IF( WI( J )ZERO ) THEN
794 TNRM = DLAPY2( DNRM2( N, VL( 1, J ), 1 ),
795 $ DNRM2( N, VL( 1, J+1 ), 1 ) )
797 RESULT( 4 ) = MAX( RESULT( 4 ),
798 $ MIN( ULPINV, ABS( TNRM-ONE ) / ULP ) )
799.GT.
IF( WI( J )ZERO ) THEN
803 VTST = DLAPY2( VL( JJ, J ), VL( JJ, J+1 ) )
806.EQ..AND.
IF( VL( JJ, J+1 )ZERO
807.GT.
$ ABS( VL( JJ, J ) )VRMX )
808 $ VRMX = ABS( VL( JJ, J ) )
810.LT.
IF( VRMX / VMXONE-TWO*ULP )
811 $ RESULT( 4 ) = ULPINV
817 CALL DLACPY( 'f
', N, N, A, LDA, H, LDA )
818 CALL DGEEV( 'n
', 'n
', N, H, LDA, WR1, WI1, DUM, 1, DUM,
819 $ 1, WORK, NNWORK, IINFO )
820.NE.
IF( IINFO0 ) THEN
822 WRITE( NOUNIT, FMT = 9993 )'dgeev2
', IINFO, N, JTYPE,
831.NE..OR..NE.
IF( WR( J )WR1( J ) WI( J )WI1( J ) )
832 $ RESULT( 5 ) = ULPINV
837 CALL DLACPY( 'f
', N, N, A, LDA, H, LDA )
838 CALL DGEEV( 'n
', 'v
', N, H, LDA, WR1, WI1, DUM, 1, LRE,
839 $ LDLRE, WORK, NNWORK, IINFO )
840.NE.
IF( IINFO0 ) THEN
842 WRITE( NOUNIT, FMT = 9993 )'dgeev3
', IINFO, N, JTYPE,
851.NE..OR..NE.
IF( WR( J )WR1( J ) WI( J )WI1( J ) )
852 $ RESULT( 5 ) = ULPINV
859.NE.
IF( VR( J, JJ )LRE( J, JJ ) )
860 $ RESULT( 6 ) = ULPINV
866 CALL DLACPY( 'f
', N, N, A, LDA, H, LDA )
867 CALL DGEEV( 'v
', 'n
', N, H, LDA, WR1, WI1, LRE, LDLRE,
868 $ DUM, 1, WORK, NNWORK, IINFO )
869.NE.
IF( IINFO0 ) THEN
871 WRITE( NOUNIT, FMT = 9993 )'dgeev4
', IINFO, N, JTYPE,
880.NE..OR..NE.
IF( WR( J )WR1( J ) WI( J )WI1( J ) )
881 $ RESULT( 5 ) = ULPINV
888.NE.
IF( VL( J, JJ )LRE( J, JJ ) )
889 $ RESULT( 7 ) = ULPINV
900.GE.
IF( RESULT( J )ZERO )
902.GE.
IF( RESULT( J )THRESH )
907 $ NTESTF = NTESTF + 1
908.EQ.
IF( NTESTF1 ) THEN
909 WRITE( NOUNIT, FMT = 9999 )PATH
910 WRITE( NOUNIT, FMT = 9998 )
911 WRITE( NOUNIT, FMT = 9997 )
912 WRITE( NOUNIT, FMT = 9996 )
913 WRITE( NOUNIT, FMT = 9995 )THRESH
918.GE.
IF( RESULT( J )THRESH ) THEN
919 WRITE( NOUNIT, FMT = 9994 )N, IWK, IOLDSD, JTYPE,
924 NERRS = NERRS + NFAIL
925 NTESTT = NTESTT + NTEST
933 CALL DLASUM( PATH, NOUNIT, NERRS, NTESTT )
935 9999 FORMAT( / 1X, A3, ' -- real eigenvalue-eigenvector decomposition
',
936 $ ' driver
', / ' matrix types(see
ddrvev for details):
' )
938 9998 FORMAT( / ' special matrices:
', / ' 1=zero matrix.
',
939 $ ' ', ' 5=diagonal: geometr. spaced entries.
',
940 $ / ' 2=identity matrix.
', ' 6=diagona
',
941 $ 'l: clustered entries.
', / ' 3=transposed jordan block.
',
942 $ ' ', ' 7=diagonal: large, evenly spaced.
', / ' ',
943 $ '4=diagonal: evenly spaced entries.
', ' 8=diagonal: s
',
944 $ 'mall, evenly spaced.
' )
945 9997 FORMAT( ' dense, non-symmetric matrices:
', / ' 9=well-cond., ev
',
946 $ 'enly spaced eigenvals.
', ' 14=ill-cond., geomet. spaced e
',
947 $ 'igenals.
', / ' 10=well-cond.,
geom. spaced eigenvals.
',
948 $ ' 15=ill-conditioned, clustered e.vals.
', / ' 11=well-cond
',
949 $ 'itioned, clustered e.vals.
', ' 16=ill-cond., random
comp',
950 $ 'lex
', / ' 12=well-cond., random
complex ', 6X, ' ',
951 $ ' 17=ill-cond., large rand. complx
', / ' 13=ill-condi
',
952 $ 'tioned, evenly spaced.
', ' 18=ill-cond., small rand.
',
954 9996 FORMAT( ' 19=matrix with random o(1) entries.
', ' 21=matrix
',
955 $ 'with small random entries.
', / ' 20=matrix with large ran
',
956 $ 'dom entries.
', / )
957 9995 FORMAT( ' tests performed with test threshold =
', F8.2,
958 $ / / ' 1 = | a vr - vr w | / ( n |a| ulp )
',
959 $ / ' 2 = | transpose(a) vl - vl w | / ( n |a| ulp )
',
960 $ / ' 3 = | |vr(i)| - 1 | / ulp
',
961 $ / ' 4 = | |vl(i)| - 1 | / ulp
',
962 $ / ' 5 = 0
if w same no matter
if vr or vl computed,
',
963 $ ' 1/ulp otherwise
', /
964 $ ' 6 = 0
if vr same no matter
if vl computed,
',
965 $ ' 1/ulp otherwise
', /
966 $ ' 7 = 0
if vl same no matter
if vr computed,
',
967 $ ' 1/ulp otherwise
', / )
968 9994 FORMAT( ' n=
', I5, ', iwk=
', I2, ',
seed=
', 4( I4, ',
' ),
969 $ ' type ', I2, ', test(
', I2, ')=
', G10.3 )
970 9993 FORMAT( ' ddrvev:
', A, ' returned info=
', I6, '.
', / 9X, 'n=
',
971 $ I6, ', jtype=
', I6, ', iseed=(
', 3( I5, ',
' ), I5, ')
' )
subroutine dgeev(jobvl, jobvr, n, a, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info)
DGEEV computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices
subroutine ddrvev(nsizes, nn, ntypes, dotype, iseed, thresh, nounit, a, lda, h, wr, wi, wr1, wi1, vl, ldvl, vr, ldvr, lre, ldlre, result, work, nwork, iwork, info)
DDRVEV
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