402 SUBROUTINE sdrvev( 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,
418 INTEGER ISEED( 4 ), IWORK( * ), NN( * )
419 REAL A( LDA, * ), H( LDA, * ), LRE( LDLRE, * ),
420 $ result( 7 ), vl( ldvl, * ), vr( ldvr, * ),
421 $ wi( * ), wi1( * ), work( * ), wr( * ), wr1( * )
430 parameter( two = 2.0e0 )
432 parameter( maxtyp = 21 )
437 INTEGER IINFO, IMODE, ITYPE, IWK, J, JCOL, JJ, JSIZE,
438 $ jtype, mtypes, n, nerrs, nfail, nmax,
439 $ nnwork, ntest, ntestf, ntestt
440 REAL ANORM, COND, CONDS, OVFL, RTULP, RTULPI, TNRM,
441 $ ULP, ULPINV, UNFL, VMX, VRMX, VTST
444 CHARACTER ADUMMA( 1 )
445 INTEGER IDUMMA( 1 ), IOLDSD( 4 ), KCONDS( MAXTYP ),
446 $ KMAGN( ), KMODE( MAXTYP ),
448 REAL DUM( 1 ), RES( 2 )
451 REAL SLAMCH, SLAPY2, SNRM2
452 EXTERNAL , SLAPY2, SNRM2
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 ) =
'Single 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(
'SDRVEV', -info )
521 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
526 unfl = slamch(
'Safe minimum' )
529 ulp = slamch(
'Precision' )
538 DO 270 jsize = 1, nsizes
540 IF( nsizes.NE.1 )
THEN
541 mtypes =
min( maxtyp, ntypes )
543 mtypes =
min( maxtyp+
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 slaset(
'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 slatms( n, n,
'S', iseed,
'S', work, imode, cond,
630 $ anorm, 0, 0, 'n
', A, LDA, WORK( N+1 ),
633.EQ.
ELSE IF( ITYPE5 ) THEN
637 CALL SLATMS( 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 SLATME( 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 SLATMR( 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 SLATMR( 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 SLATMR( 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 SLASET( 'full
', 2, N, ZERO, ZERO, A, LDA )
687 CALL SLASET( 'full
', N-3, 1, ZERO, ZERO, A( 3, 1 ),
689 CALL SLASET( 'full
', N-3, 2, ZERO, ZERO, A( 3, N-1 ),
691 CALL SLASET( 'full
', 1, N, ZERO, ZERO, A( N, 1 ),
695.EQ.
ELSE IF( ITYPE10 ) THEN
699 CALL SLATMR( 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 SLACPY( 'f
', N, N, A, LDA, H, LDA )
737 CALL SGEEV( '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 )'sgeev1
', IINFO, N, JTYPE,
749 CALL SGET22( 'n
', 'n
', 'n
', N, A, LDA, VR, LDVR, WR, WI,
751 RESULT( 1 ) = RES( 1 )
755 CALL SGET22( 't
', 'n
', 't
', N, A, LDA, VL, LDVL, WR, WI,
757 RESULT( 2 ) = RES( 1 )
763.EQ.
IF( WI( J )ZERO ) THEN
764 TNRM = SNRM2( N, VR( 1, J ), 1 )
765.GT.
ELSE IF( WI( J )ZERO ) THEN
766 TNRM = SLAPY2( SNRM2( N, VR( 1, J ), 1 ),
767 $ SNRM2( 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 = SLAPY2( 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 = SNRM2( N, VL( 1, J ), 1 )
793.GT.
ELSE IF( WI( J )ZERO ) THEN
794 TNRM = SLAPY2( SNRM2( N, VL( 1, J ), 1 ),
795 $ SNRM2( 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 = SLAPY2( 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 SLACPY( 'f
', N, N, A, LDA, H, LDA )
818 CALL SGEEV( '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 )'sgeev2
', IINFO, N, JTYPE,
831.NE..OR..NE.
IF( WR( J )WR1( J ) WI( J )WI1( J ) )
832 $ RESULT( 5 ) = ULPINV
837 CALL SLACPY( 'f
', N, N, A, LDA, H, LDA )
838 CALL SGEEV( '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 )'sgeev3
', 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 SLACPY( 'f
', N, N, A, LDA, H, LDA )
867 CALL SGEEV( '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 )'sgeev4
', 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 SLASUM( PATH, NOUNIT, NERRS, NTESTT )
935 9999 FORMAT( / 1X, A3, ' -- real eigenvalue-eigenvector decomposition
',
936 $ ' driver
', / ' matrix types(see
sdrvev 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(
' SDRVEV: ', a,
' returned INFO=', i6,
'.', / 9x,
'N=',
971 $ i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ), i5,
')' )
subroutine sgeev(jobvl, jobvr, n, a, lda, wr, wi, vl, ldvl, vr, ldvr, work, lwork, info)
SGEEV computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices
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 sdrvev(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)
SDRVEV