491 SUBROUTINE cdrvvx( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
492 $ NIUNIT, NOUNIT, A, LDA, H, W, W1, VL, LDVL, VR,
493 $ LDVR, LRE, LDLRE, RCONDV, RCNDV1, RCDVIN,
494 $ RCONDE, RCNDE1, RCDEIN, SCALE, SCALE1, RESULT,
495 $ WORK, NWORK, RWORK, INFO )
502 INTEGER INFO, LDA, LDLRE, LDVL, LDVR, NIUNIT, NOUNIT,
503 $ NSIZES, NTYPES, NWORK
508 INTEGER ISEED( 4 ), NN( * )
509 REAL RCDEIN( * ), RCDVIN( * ), RCNDE1( * ),
510 $ RCNDV1( * ), RCONDE( * ), RCONDV( * ),
511 $ result( 11 ), rwork( * ), scale( * ),
513 COMPLEX A( LDA, * ), H( LDA, * ), LRE( LDLRE, * ),
514 $ VL( LDVL, * ), VR( LDVR, * ), W( * ), W1( * ),
522 PARAMETER ( CZERO = ( 0.0e+0, 0.0e+0 ) )
524 PARAMETER ( CONE = ( 1.0e+0, 0.0e+0 ) )
526 parameter( zero = 0.0e+0, one = 1.0e+0 )
528 parameter( maxtyp = 21 )
534 INTEGER I, IBAL, IINFO, IMODE, ISRT, ITYPE, IWK, J,
535 $ jcol, jsize, jtype, mtypes, n, nerrs,
536 $ nfail, nmax, nnwork, ntest, ntestf, ntestt
537 REAL ANORM, COND, CONDS, , RTULP, RTULPI, ULP,
538 $ ulpinv, unfl, wi, wr
542 INTEGER IDUMMA( 1 ), IOLDSD( 4 ), KCONDS( MAXTYP ),
543 $ KMAGN( MAXTYP ), KMODE( MAXTYP ),
558 DATA ktype / 1, 2, 3, 5*4, 4*6, 6*6, 3*9 /
559 DATA kmagn / 3*1, 1, 1, 1, 2, 3, 4*1, 1, 1, 1, 1, 2,
561 DATA kmode / 3*0, 4, 3, 1, 4, 4, 4, 3, 1, 5, 4, 3,
562 $ 1, 5, 5, 5, 4, 3, 1 /
563 DATA kconds / 3*0, 5*0, 4*1, 6*2, 3*0 /
564 DATA bal /
'N',
'P',
'S',
'B' /
568 path( 1: 1 ) =
'Complex precision'
586 nmax =
max( nmax, nn( j ) )
593 IF( nsizes.LT.0 )
THEN
595 ELSE IF( badnn )
THEN
597 ELSE IF( ntypes.LT.0 )
THEN
599 ELSE IF( thresh.LT.zero )
THEN
601 ELSE IF( lda.LT.1 .OR. lda.LT.nmax )
THEN
603 ELSE IF( ldvl.LT.1 .OR. ldvl.LT.nmax )
THEN
605 ELSE IF( ldvr.LT.1 .OR. ldvr.LT.nmax )
THEN
607 ELSE IF( ldlre.LT.1 .OR. ldlre.LT.nmax )
THEN
609 ELSE IF( 6*nmax+2*nmax**2.GT.nwork )
THEN
614 CALL xerbla(
'CDRVVX', -info )
620 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
625 unfl = slamch(
'Safe minimum' )
628 ulp = slamch(
'Precision' )
637 DO 150 jsize = 1, nsizes
639 IF( nsizes.NE.1 )
THEN
640 mtypes =
min( maxtyp, ntypes )
642 mtypes =
min( maxtyp+1, ntypes )
645 DO 140 jtype = 1, mtypes
646 IF( .NOT.dotype( jtype ) )
652 ioldsd( j ) = iseed( j )
671 IF( mtypes.GT.maxtyp )
674 itype = ktype( jtype )
675 imode = kmode( jtype )
679 GO TO ( 30, 40, 50 )kmagn( jtype )
695 CALL claset(
'Full', lda, n, czero, czero, a, lda )
703 IF( itype.EQ.1 )
THEN
706 ELSE IF( itype.EQ.2 )
THEN
711 a( jcol, jcol ) = anorm
714 ELSE IF( itype.EQ.3 )
THEN
719 a( jcol, jcol ) = anorm
721 $ a( jcol, jcol-1 ) = one
724 ELSE IF( itype.EQ.4 )
THEN
728 CALL clatms( n, n,
'S', iseed,
'H', rwork, imode, cond,
729 $ anorm, 0, 0,
'N', a, lda, work( n+1 ),
732 ELSE IF( itype.EQ.5 )
THEN
736 CALL clatms( n, n,
'S', iseed,
'H', rwork, imode, cond,
737 $ anorm, n, n,
'N', a, lda, work( n+1 ),
740 ELSE IF( itype.EQ.6 )
THEN
744 IF( kconds( jtype ).EQ.1 )
THEN
746 ELSE IF( kconds( jtype ).EQ.2 )
THEN
752 CALL clatme( n,
'D', iseed, work, imode, cond, cone,
753 $
'T',
'T',
'T', rwork, 4, conds, n, n, anorm,
754 $ a, lda, work( 2*n+1 ), iinfo )
756 ELSE IF( itype.EQ.7 )
THEN
760 CALL clatmr( n, n,
'D', iseed,
'S', work, 6, one, cone,
761 $
'T',
'N', work( n+1 ), 1, one,
762 $ work( 2*n+1 ), 1, one,
'N', idumma, 0, 0,
763 $ zero, anorm, 'no
', A, LDA, IDUMMA, IINFO )
765.EQ.
ELSE IF( ITYPE8 ) THEN
769 CALL CLATMR( N, N, 'd
', ISEED, 'h
', WORK, 6, ONE, CONE,
770 $ 't
', 'n
', WORK( N+1 ), 1, ONE,
771 $ WORK( 2*N+1 ), 1, ONE, 'n
', IDUMMA, N, N,
772 $ ZERO, ANORM, 'no
', A, LDA, IDUMMA, IINFO )
774.EQ.
ELSE IF( ITYPE9 ) THEN
778 CALL CLATMR( N, N, 'd
', ISEED, 'n
', WORK, 6, ONE, CONE,
779 $ 't
', 'n
', WORK( N+1 ), 1, ONE,
780 $ WORK( 2*N+1 ), 1, ONE, 'n
', IDUMMA, N, N,
781 $ ZERO, ANORM, 'no
', A, LDA, IDUMMA, IINFO )
783 CALL CLASET( 'full
', 2, N, CZERO, CZERO, A, LDA )
784 CALL CLASET( 'full
', N-3, 1, CZERO, CZERO, A( 3, 1 ),
786 CALL CLASET( 'full
', N-3, 2, CZERO, CZERO,
788 CALL CLASET( 'full
', 1, N, CZERO, CZERO, A( N, 1 ),
792.EQ.
ELSE IF( ITYPE10 ) THEN
796 CALL CLATMR( N, N, 'd
', ISEED, 'n
', WORK, 6, ONE, CONE,
797 $ 't
', 'n
', WORK( N+1 ), 1, ONE,
798 $ WORK( 2*N+1 ), 1, ONE, 'n
', IDUMMA, N, 0,
799 $ ZERO, ANORM, 'no
', A, LDA, IDUMMA, IINFO )
806.NE.
IF( IINFO0 ) THEN
807 WRITE( NOUNIT, FMT = 9992 )'generator
', IINFO, N, JTYPE,
820.EQ.
ELSE IF( IWK2 ) THEN
823 NNWORK = 6*N + 2*N**2
825 NNWORK = MAX( NNWORK, 1 )
834 CALL CGET23( .FALSE., 0, BALANC, JTYPE, THRESH,
835 $ IOLDSD, NOUNIT, N, A, LDA, H, W, W1, VL,
836 $ LDVL, VR, LDVR, LRE, LDLRE, RCONDV,
837 $ RCNDV1, RCDVIN, RCONDE, RCNDE1, RCDEIN,
838 $ SCALE, SCALE1, RESULT, WORK, NNWORK,
846.GE.
IF( RESULT( J )ZERO )
848.GE.
IF( RESULT( J )THRESH )
853 $ NTESTF = NTESTF + 1
854.EQ.
IF( NTESTF1 ) THEN
855 WRITE( NOUNIT, FMT = 9999 )PATH
856 WRITE( NOUNIT, FMT = 9998 )
857 WRITE( NOUNIT, FMT = 9997 )
858 WRITE( NOUNIT, FMT = 9996 )
859 WRITE( NOUNIT, FMT = 9995 )THRESH
864.GE.
IF( RESULT( J )THRESH ) THEN
865 WRITE( NOUNIT, FMT = 9994 )BALANC, N, IWK,
866 $ IOLDSD, JTYPE, J, RESULT( J )
870 NERRS = NERRS + NFAIL
871 NTESTT = NTESTT + NTEST
886 READ( NIUNIT, FMT = *, END = 220 )N, ISRT
895 READ( NIUNIT, FMT = * )( A( I, J ), J = 1, N )
898 READ( NIUNIT, FMT = * )WR, WI, RCDEIN( I ), RCDVIN( I )
899 W1( I ) = CMPLX( WR, WI )
901 CALL CGET23( .TRUE., ISRT, 'n
', 22, THRESH, ISEED, NOUNIT, N, A,
902 $ LDA, H, W, W1, VL, LDVL, VR, LDVR, LRE, LDLRE,
903 $ RCONDV, RCNDV1, RCDVIN, RCONDE, RCNDE1, RCDEIN,
904 $ SCALE, SCALE1, RESULT, WORK, 6*N+2*N**2, RWORK,
912.GE.
IF( RESULT( J )ZERO )
914.GE.
IF( RESULT( J )THRESH )
919 $ NTESTF = NTESTF + 1
920.EQ.
IF( NTESTF1 ) THEN
921 WRITE( NOUNIT, FMT = 9999 )PATH
922 WRITE( NOUNIT, FMT = 9998 )
923 WRITE( NOUNIT, FMT = 9997 )
924 WRITE( NOUNIT, FMT = 9996 )
925 WRITE( NOUNIT, FMT = 9995 )THRESH
930.GE.
IF( RESULT( J )THRESH ) THEN
931 WRITE( NOUNIT, FMT = 9993 )N, JTYPE, J, RESULT( J )
935 NERRS = NERRS + NFAIL
936 NTESTT = NTESTT + NTEST
942 CALL SLASUM( PATH, NOUNIT, NERRS, NTESTT )
944 9999 FORMAT( / 1X, A3, ' --
Complex Eigenvalue-Eigenvector ',
945 $
'Decomposition Expert Driver',
946 $ /
' Matrix types (see CDRVVX for details): ' )
948 9998
FORMAT( /
' Special Matrices:', /
' 1=Zero matrix. '
949 $
' ',
' 5=Diagonal: geometr. spaced entries.',
950 $ /
' 2=Identity matrix. ',
' 6=Diagona',
951 $
'l: clustered entries.', /
' 3=Transposed Jordan block. ',
952 $
' ',
' 7=Diagonal: large, evenly spaced.', /
' ',
953 $
'4=Diagonal: evenly spaced entries. ',
' 8=Diagonal: s',
954 $
'mall, evenly spaced.' )
955 9997
FORMAT(
' Dense, Non-Symmetric Matrices:', / ' 9=well-cond., ev
',
956 $ 'enly spaced eigenvals.
', ' 14=ill-cond., geomet. spaced e
',
957 $ 'igenals.
', / ' 10=well-cond.,
geom. spaced eigenvals.
',
958 $ ' 15=ill-conditioned, clustered e.vals.
', / ' 11=well-cond
',
959 $ 'itioned, clustered e.vals.
', ' 16=ill-cond., random
comp',
960 $ 'lex
', / ' 12=well-cond., random
complex ', ' ',
961 $ ' 17=ill-cond., large rand. complx
', / ' 13=ill-condi
',
962 $ 'tioned, evenly spaced.
', ' 18=ill-cond., small rand.
',
964 9996 FORMAT( ' 19=matrix with random o(1) entries.
', ' 21=matrix
',
965 $ 'with small random entries.
', / ' 20=matrix with large ran
',
966 $ 'dom entries.
', ' 22=matrix
read from input file
', / )
967 9995 FORMAT( ' tests performed with test threshold =
', F8.2,
968 $ / / ' 1 = | a vr - vr w | / ( n |a| ulp )
',
969 $ / ' 2 = | transpose(a) vl - vl w | / ( n |a| ulp )
',
970 $ / ' 3 = | |vr(i)| - 1 | / ulp
',
971 $ / ' 4 = | |vl(i)| - 1 | / ulp
',
972 $ / ' 5 = 0
if w same no matter
if vr or vl computed,
',
973 $ ' 1/ulp otherwise
', /
974 $ ' 6 = 0
if vr same no matter what
else computed,
',
975 $ ' 1/ulp otherwise
', /
976 $ ' 7 = 0
if vl same no matter what
else computed,
',
977 $ ' 1/ulp otherwise', /
978 $
' 8 = 0 if RCONDV same no matter what else computed,',
979 $
' 1/ulp otherwise', /
980 $
' 9 = 0 if SCALE, ILO, IHI, ABNRM same no matter what else',
981 $
' computed, 1/ulp otherwise',
982 $ /
' 10 = | RCONDV - RCONDV(precomputed) | / cond(RCONDV),',
983 $ /
' 11 = | RCONDE - RCONDE(precomputed) | / cond(RCONDE),' )
984 9994
FORMAT(
' BALANC=''', a1,
''',N=', i4,
',IWK=', i1,
', seed=',
985 $ 4( i4,
',' ),
' type ', i2,
', test(', i2,
')=', g10.3 )
986 9993
FORMAT(
' N=', i5,
', input example =', i3,
', test(', i2,
')=',
988 9992
FORMAT(
' CDRVVX: ', a,
' returned INFO=', i6,
'.', / 9x,
'N=',
989 $ i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ), i5,
')' )
subroutine cget23(comp, isrt, balanc, jtype, thresh, iseed, nounit, n, a, lda, h, w, w1, vl, ldvl, vr, ldvr, lre, ldlre, rcondv, rcndv1, rcdvin, rconde, rcnde1, rcdein, scale, scale1, result, work, lwork, rwork, info)
CGET23
subroutine cdrvvx(nsizes, nn, ntypes, dotype, iseed, thresh, niunit, nounit, a, lda, h, w, w1, vl, ldvl, vr, ldvr, lre, ldlre, rcondv, rcndv1, rcdvin, rconde, rcnde1, rcdein, scale, scale1, result, work, nwork, rwork, info)
CDRVVX
subroutine clatmr(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)
CLATMR