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( * )
428 PARAMETER ( ZERO = 0.0e0, one = 1.0e0 )
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( MAXTYP ), KMODE( MAXTYP ),
448 REAL DUM( 1 ), RES( 2 )
451 REAL SLAMCH, SLAPY2, SNRM2
452 EXTERNAL SLAMCH, 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+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 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 ELSE IF( itype.EQ.5 )
THEN
637 CALL slatms( n, n,
'S', iseed,
'S', work, imode, cond,
638 $ anorm, n, n,
'N', a, lda, work( n+1 ),
641 ELSE IF( itype.EQ.6 )
THEN
645 IF( kconds( jtype ).EQ.1 )
THEN
647 ELSE IF( kconds( jtype ).EQ.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 ELSE IF( itype.EQ.7 )
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 ELSE IF( itype.EQ.8 )
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 ELSE IF( itype.EQ.9 )
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 ELSE IF( itype.EQ.10 )
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 IF( iinfo.NE.0 )
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 IF( iinfo.NE.0 )
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 IF( wi( j ).EQ.zero )
THEN
764 tnrm = snrm2( n, vr( 1, j ), 1 )
765 ELSE IF( wi( j ).GT.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 IF( wi( j ).GT.zero )
THEN
775 vtst = slapy2( vr( jj, j ), vr( jj, j+1 ) )
778 IF( vr( jj, j+1 ).EQ.zero .AND.
779 $ abs( vr( jj, j ) ).GT.vrmx )
780 $ vrmx = abs( vr( jj, j ) )
782 IF( vrmx / vmx.LT.one-two*ulp )
783 $ result( 3 ) = ulpinv
791 IF( wi( j ).EQ.zero )
THEN
792 tnrm = snrm2( n, vl( 1, j ), 1 )
793 ELSE IF( wi( j ).GT.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 IF( wi( j ).GT.zero )
THEN
803 vtst = slapy2( vl( jj, j ), vl( jj, j+1 ) )
806 IF( vl( jj, j+1 ).EQ.zero .AND.
807 $ abs( vl( jj, j ) ).GT.vrmx )
808 $ vrmx = abs( vl( jj, j ) )
810 IF( vrmx / vmx.LT.one-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 IF( iinfo.NE.0 )
THEN
822 WRITE( nounit, fmt = 9993 )
'SGEEV2', iinfo, n, jtype,
831 IF( wr( j ).NE.wr1( j ) .OR. wi( j ).NE.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 IF( iinfo.NE.0 )
THEN
842 WRITE( nounit, fmt = 9993 )
'SGEEV3', iinfo, n, jtype,
851 IF( wr( j ).NE.wr1( j ) .OR. wi( j ).NE.wi1( j ) )
852 $ result( 5 ) = ulpinv
859 IF( vr( j, jj ).NE.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 IF( iinfo.NE.0 )
THEN
871 WRITE( nounit, fmt = 9993 )
'SGEEV4', iinfo, n, jtype,
880 IF( wr( j ).NE.wr1( j ) .OR. wi( j ).NE.wi1( j ) )
881 $ result( 5 ) = ulpinv
888 IF( vl( j, jj ).NE.lre( j, jj ) )
889 $ result( 7 ) = ulpinv
900 IF( result( j ).GE.zero )
902 IF( result( j ).GE.thresh )
907 $ ntestf = ntestf + 1
908 IF( ntestf.EQ.1 )
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 IF( result( j ).GE.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 slabad(SMALL, LARGE)
SLABAD
subroutine slaset(UPLO, M, N, ALPHA, BETA, A, LDA)
SLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine slacpy(UPLO, M, N, A, LDA, B, LDB)
SLACPY copies all or part of one two-dimensional array to another.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine slatms(M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, KL, KU, PACK, A, LDA, WORK, INFO)
SLATMS
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 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 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 sget22(TRANSA, TRANSE, TRANSW, N, A, LDA, E, LDE, WR, WI, WORK, RESULT)
SGET22
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
subroutine slasum(TYPE, IOUNIT, IE, NRUN)
SLASUM