375 SUBROUTINE zdrves( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
376 $ NOUNIT, A, LDA, H, HT, W, WT, VS, LDVS, RESULT,
377 $ WORK, NWORK, RWORK, IWORK, BWORK, INFO )
384 INTEGER INFO, LDA, LDVS, NOUNIT, NSIZES, NTYPES, NWORK
385 DOUBLE PRECISION THRESH
388 LOGICAL BWORK( * ), DOTYPE( * )
389 INTEGER ISEED( 4 ), IWORK( * ), NN( * )
390 DOUBLE PRECISION RESULT( 13 ), RWORK( * )
391 COMPLEX*16 A( LDA, * ), H( LDA, * ), HT( LDA, * ),
392 $ vs( ldvs, * ), w( * ), work( * ), wt( * )
399 PARAMETER ( CZERO = ( 0.0d+0, 0.0d+0 ) )
401 parameter( cone = ( 1.0d+0, 0.0d+0 ) )
402 DOUBLE PRECISION ZERO, ONE
403 parameter( zero = 0.0d+0, one = 1.0d+0 )
405 parameter( maxtyp = 21 )
411 INTEGER I, IINFO, IMODE, ISORT, ITYPE, IWK, J, JCOL,
412 $ jsize, jtype, knteig, lwork, mtypes, n, nerrs,
413 $ nfail, nmax, nnwork, ntest, ntestf, ntestt,
415 DOUBLE PRECISION ANORM, COND, CONDS, OVFL, RTULP, RTULPI, ULP,
419 INTEGER IDUMMA( 1 ), IOLDSD( 4 ), KCONDS( MAXTYP ),
420 $ KMAGN( MAXTYP ), KMODE( MAXTYP ),
422 DOUBLE PRECISION RES( 2 )
426 DOUBLE PRECISION SELWI( 20 ), SELWR( 20 )
429 INTEGER SELDIM, SELOPT
432 COMMON / sslct / selopt, seldim, selval, selwr, selwi
436 DOUBLE PRECISION DLAMCH
437 EXTERNAL zslect, dlamch
444 INTRINSIC abs, dcmplx, max, min, sqrt
447 DATA ktype / 1, 2, 3, 5*4, 4*6, 6*6, 3*9 /
448 DATA kmagn / 3*1, 1, 1, 1, 2, 3, 4*1, 1, 1, 1, 1, 2,
450 DATA kmode / 3*0, 4, 3, 1, 4, 4, 4, 3, 1, 5, 4, 3,
451 $ 1, 5, 5, 5, 4, 3, 1 /
452 DATA kconds / 3*0, 5*0, 4*1, 6*2, 3*0 /
456 path( 1: 1 ) =
'Zomplex precision'
471 nmax = max( nmax, nn( j ) )
478 IF( nsizes.LT.0 )
THEN
480 ELSE IF( badnn )
THEN
482 ELSE IF( ntypes.LT.0 )
THEN
484 ELSE IF( thresh.LT.zero )
THEN
486 ELSE IF( nounit.LE.0 )
THEN
488 ELSE IF( lda.LT.1 .OR. lda.LT.nmax )
THEN
490 ELSE IF( ldvs.LT.1 .OR. ldvs.LT.nmax )
THEN
492 ELSE IF( 5*nmax+2*nmax**2.GT.nwork )
THEN
497 CALL xerbla(
'ZDRVES', -info )
503 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
508 unfl = dlamch(
'Safe minimum' )
510 ulp = dlamch(
'Precision' )
519 DO 240 jsize = 1, nsizes
521 IF( nsizes.NE.1 )
THEN
522 mtypes = min( maxtyp, ntypes )
524 mtypes = min( maxtyp+1, ntypes )
527 DO 230 jtype = 1, mtypes
528 IF( .NOT.dotype( jtype ) )
534 ioldsd( j ) = iseed( j )
553 IF( mtypes.GT.maxtyp )
556 itype = ktype( jtype )
557 imode = kmode( jtype )
561 GO TO ( 30, 40, 50 )kmagn( jtype )
577 CALL zlaset(
'Full', lda, n, czero, czero, a, lda )
583 IF( itype.EQ.1 )
THEN
589 ELSE IF( itype.EQ.2 )
THEN
594 a( jcol, jcol ) = dcmplx( anorm )
597 ELSE IF( itype.EQ.3 )
THEN
602 a( jcol, jcol ) = dcmplx( anorm )
604 $ a( jcol, jcol-1 ) = cone
607 ELSE IF( itype.EQ.4 )
THEN
611 CALL zlatms( n, n,
'S', iseed,
'H', rwork, imode, cond,
612 $ anorm, 0, 0,
'N', a, lda, work( n+1 ),
615 ELSE IF( itype.EQ.5 )
THEN
619 CALL zlatms( n, n,
'S', iseed,
'H', rwork, imode, cond,
620 $ anorm, n, n,
'N', a, lda, work( n+1 ),
623 ELSE IF( itype.EQ.6 )
THEN
627 IF( kconds( jtype ).EQ.1 )
THEN
629 ELSE IF( kconds( jtype ).EQ.2 )
THEN
635 CALL zlatme( n,
'D', iseed, work, imode, cond, cone,
636 $
'T',
'T',
'T', rwork, 4, conds, n, n, anorm,
637 $ a, lda, work( 2*n+1 ), iinfo )
639 ELSE IF( itype.EQ.7 )
THEN
643 CALL zlatmr( n, n,
'D', iseed,
'N', work, 6, one, cone,
644 $
'T',
'N', work( n+1 ), 1, one,
645 $ work( 2*n+1 ), 1, one,
'N', idumma, 0, 0,
646 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
648 ELSE IF( itype.EQ.8 )
THEN
652 CALL zlatmr( n, n,
'D', iseed,
'H', work, 6, one, cone,
653 $
'T',
'N', work( n+1 ), 1, one,
654 $ work( 2*n+1 ), 1, one,
'N', idumma, n, n,
655 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
657 ELSE IF( itype.EQ.9 )
THEN
661 CALL zlatmr( n, n,
'D', iseed,
'N', work, 6, one, cone,
662 $
'T',
'N', work( n+1 ), 1, one,
663 $ work( 2*n+1 ), 1, one,
'N', idumma, n, n,
664 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
666 CALL zlaset(
'Full', 2, n, czero, czero, a, lda )
667 CALL zlaset(
'Full', n-3, 1, czero, czero, a( 3, 1 ),
669 CALL zlaset(
'Full', n-3, 2, czero, czero,
671 CALL zlaset(
'Full', 1, n, czero, czero, a( n, 1 ),
675 ELSE IF( itype.EQ.10 )
THEN
679 CALL zlatmr( n, n,
'D', iseed,
'N', work, 6, one, cone,
680 $
'T',
'N', work( n+1 ), 1, one,
681 $ work( 2*n+1 ), 1, one,
'N', idumma, n, 0,
682 $ zero, anorm,
'NO', a, lda, iwork, iinfo )
689 IF( iinfo.NE.0 )
THEN
690 WRITE( nounit, fmt = 9992 )
'Generator', iinfo, n, jtype,
704 nnwork = 5*n + 2*n**2
706 nnwork = max( nnwork, 1 )
717 IF( isort.EQ.0 )
THEN
727 CALL zlacpy(
'F', n, n, a, lda, h, lda )
728 CALL zgees(
'V', sort, zslect, n, h, lda, sdim, w, vs,
729 $ ldvs, work, nnwork, rwork, bwork, iinfo )
730 IF( iinfo.NE.0 )
THEN
731 result( 1+rsub ) = ulpinv
732 WRITE( nounit, fmt = 9992 )
'ZGEES1', iinfo, n,
740 result( 1+rsub ) = zero
743 IF( h( i, j ).NE.zero )
744 $ result( 1+rsub ) = ulpinv
750 lwork = max( 1, 2*n*n )
751 CALL zhst01( n, 1, n, a, lda, h, lda, vs, ldvs, work,
752 $ lwork, rwork, res )
753 result( 2+rsub ) = res( 1 )
754 result( 3+rsub ) = res( 2 )
758 result( 4+rsub ) = zero
760 IF( h( i, i ).NE.w( i ) )
761 $ result( 4+rsub ) = ulpinv
766 CALL zlacpy(
'F', n, n, a, lda, ht, lda )
767 CALL zgees(
'N', sort, zslect, n, ht, lda, sdim, wt,
768 $ vs, ldvs, work, nnwork, rwork, bwork,
770 IF( iinfo.NE.0 )
THEN
771 result( 5+rsub ) = ulpinv
772 WRITE( nounit, fmt = 9992 )
'ZGEES2', iinfo, n,
778 result( 5+rsub ) = zero
781 IF( h( i, j ).NE.ht( i, j ) )
782 $ result( 5+rsub ) = ulpinv
788 result( 6+rsub ) = zero
790 IF( w( i ).NE.wt( i ) )
791 $ result( 6+rsub ) = ulpinv
796 IF( isort.EQ.1 )
THEN
800 IF( zslect( w( i ) ) )
801 $ knteig = knteig + 1
803 IF( zslect( w( i+1 ) ) .AND.
804 $ ( .NOT.zslect( w( i ) ) ) )result( 13 )
809 $ result( 13 ) = ulpinv
821 IF( result( j ).GE.zero )
823 IF( result( j ).GE.thresh )
828 $ ntestf = ntestf + 1
829 IF( ntestf.EQ.1 )
THEN
830 WRITE( nounit, fmt = 9999 )path
831 WRITE( nounit, fmt = 9998 )
832 WRITE( nounit, fmt = 9997 )
833 WRITE( nounit, fmt = 9996 )
834 WRITE( nounit, fmt = 9995 )thresh
835 WRITE( nounit, fmt = 9994 )
840 IF( result( j ).GE.thresh )
THEN
841 WRITE( nounit, fmt = 9993 )n, iwk, ioldsd, jtype,
846 nerrs = nerrs + nfail
847 ntestt = ntestt + ntest
855 CALL dlasum( path, nounit, nerrs, ntestt )
857 9999
FORMAT( / 1x, a3,
' -- Complex Schur Form Decomposition Driver',
858 $ /
' Matrix types (see ZDRVES for details): ' )
860 9998
FORMAT( /
' Special Matrices:', /
' 1=Zero matrix. ',
861 $
' ',
' 5=Diagonal: geometr. spaced entries.',
862 $ /
' 2=Identity matrix. ',
' 6=Diagona',
863 $
'l: clustered entries.', /
' 3=Transposed Jordan block. ',
864 $
' ',
' 7=Diagonal: large, evenly spaced.', /
' ',
865 $
'4=Diagonal: evenly spaced entries. ',
' 8=Diagonal: s',
866 $
'mall, evenly spaced.' )
867 9997
FORMAT(
' Dense, Non-Symmetric Matrices:', /
' 9=Well-cond., ev',
868 $
'enly spaced eigenvals.',
' 14=Ill-cond., geomet. spaced e',
869 $
'igenals.', /
' 10=Well-cond., geom. spaced eigenvals. ',
870 $
' 15=Ill-conditioned, clustered e.vals.', /
' 11=Well-cond',
871 $
'itioned, clustered e.vals. ',
' 16=Ill-cond., random comp',
872 $
'lex ', a6, /
' 12=Well-cond., random complex ', a6,
' ',
873 $
' 17=Ill-cond., large rand. complx ', a4, /
' 13=Ill-condi',
874 $
'tioned, evenly spaced. ',
' 18=Ill-cond., small rand.',
876 9996
FORMAT(
' 19=Matrix with random O(1) entries. ',
' 21=Matrix ',
877 $
'with small random entries.', /
' 20=Matrix with large ran',
878 $
'dom entries. ', / )
879 9995
FORMAT(
' Tests performed with test threshold =', f8.2,
880 $ /
' ( A denotes A on input and T denotes A on output)',
881 $ / /
' 1 = 0 if T in Schur form (no sort), ',
882 $
' 1/ulp otherwise', /
883 $
' 2 = | A - VS T transpose(VS) | / ( n |A| ulp ) (no sort)',
884 $ /
' 3 = | I - VS transpose(VS) | / ( n ulp ) (no sort) ',
885 $ /
' 4 = 0 if W are eigenvalues of T (no sort),',
886 $
' 1/ulp otherwise', /
887 $
' 5 = 0 if T same no matter if VS computed (no sort),',
888 $
' 1/ulp otherwise', /
889 $
' 6 = 0 if W same no matter if VS computed (no sort)',
890 $
', 1/ulp otherwise' )
891 9994
FORMAT(
' 7 = 0 if T in Schur form (sort), ',
' 1/ulp otherwise',
892 $ /
' 8 = | A - VS T transpose(VS) | / ( n |A| ulp ) (sort)',
893 $ /
' 9 = | I - VS transpose(VS) | / ( n ulp ) (sort) ',
894 $ /
' 10 = 0 if W are eigenvalues of T (sort),',
895 $
' 1/ulp otherwise', /
896 $
' 11 = 0 if T same no matter if VS computed (sort),',
897 $
' 1/ulp otherwise', /
898 $
' 12 = 0 if W same no matter if VS computed (sort),',
899 $
' 1/ulp otherwise', /
900 $
' 13 = 0 if sorting successful, 1/ulp otherwise', / )
901 9993
FORMAT(
' N=', i5,
', IWK=', i2,
', seed=', 4( i4,
',' ),
902 $
' type ', i2,
', test(', i2,
')=', g10.3 )
903 9992
FORMAT(
' ZDRVES: ', a,
' returned INFO=', i6,
'.', / 9x,
'N=',
904 $ i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ), i5,
')' )