395 SUBROUTINE zdrgev3( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
396 $ NOUNIT, A, LDA, B, S, T, Q, LDQ, Z, QE, LDQE,
397 $ ALPHA, BETA, ALPHA1, BETA1, WORK, LWORK,
398 $ RWORK, RESULT, INFO )
405 INTEGER INFO, LDA, LDQ, LDQE, LWORK, NOUNIT, NSIZES,
407 DOUBLE PRECISION THRESH
411 INTEGER ISEED( 4 ), NN( * )
412 DOUBLE PRECISION RESULT( * ), RWORK( * )
413 COMPLEX*16 A( LDA, * ), ALPHA( * ), ALPHA1( * ),
414 $ b( lda, * ), beta( * ), beta1( * ),
415 $ q( ldq, * ), qe( ldqe, * ), s( lda, * ),
416 $ t( lda, * ), work( * ), z( ldq, * )
422 DOUBLE PRECISION ZERO, ONE
423 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
424 COMPLEX*16 CZERO, CONE
425 parameter( czero = ( 0.0d+0, 0.0d+0 ),
426 $ cone = ( 1.0d+0, 0.0d+0 ) )
428 parameter( maxtyp = 26 )
432 INTEGER I, IADD, IERR, IN, J, JC, JR, JSIZE, JTYPE,
433 $ MAXWRK, MINWRK, MTYPES, N, N1, NB, NERRS,
434 $ nmats, nmax, ntestt
435 DOUBLE PRECISION SAFMAX, SAFMIN, ULP, ULPINV
439 LOGICAL LASIGN( MAXTYP ), LBSIGN( MAXTYP )
440 INTEGER IOLDSD( 4 ), KADD( 6 ), KAMAGN( MAXTYP ),
441 $ KATYPE( MAXTYP ), KAZERO( MAXTYP ),
442 $ kbmagn( maxtyp ), kbtype( maxtyp ),
443 $ kbzero( maxtyp ), kclass( maxtyp ),
444 $ ktrian( maxtyp ), kz1( 6 ), kz2( 6 )
445 DOUBLE PRECISION RMAGN( 0: 3 )
449 DOUBLE PRECISION DLAMCH
451 EXTERNAL ilaenv, dlamch, zlarnd
458 INTRINSIC abs, dble, dconjg, max, min, sign
461 DATA kclass / 15*1, 10*2, 1*3 /
462 DATA kz1 / 0, 1, 2, 1, 3, 3 /
463 DATA kz2 / 0, 0, 1, 2, 1, 1 /
464 DATA kadd / 0, 0, 0, 0, 3, 2 /
465 DATA katype / 0, 1, 0, 1, 2, 3, 4, 1, 4, 4, 1, 1, 4,
466 $ 4, 4, 2, 4, 5, 8, 7, 9, 4*4, 0 /
467 DATA kbtype / 0, 0, 1, 1, 2, -3, 1, 4, 1, 1, 4, 4,
468 $ 1, 1, -4, 2, -4, 8*8, 0 /
469 DATA kazero / 6*1, 2, 1, 2*2, 2*1, 2*2, 3, 1, 3,
471 DATA kbzero / 6*1, 1, 2, 2*1, 2*2, 2*1, 4, 1, 4,
473 DATA kamagn / 8*1, 2, 3, 2, 3, 2, 3, 7*1, 2, 3, 3,
475 DATA kbmagn / 8*1, 3, 2, 3, 2, 2, 3, 7*1, 3, 2, 3,
477 DATA ktrian / 16*0, 10*1 /
478 DATA lasign / 6*.false., .true., .false., 2*.true.,
479 $ 2*.false., 3*.true., .false., .true.,
480 $ 3*.false., 5*.true., .false. /
481 DATA lbsign / 7*.false., .true., 2*.false.,
482 $ 2*.true., 2*.false., .true., .false., .true.,
494 nmax = max( nmax, nn( j ) )
499 IF( nsizes.LT.0 )
THEN
501 ELSE IF( badnn )
THEN
503 ELSE IF( ntypes.LT.0 )
THEN
505 ELSE IF( thresh.LT.zero )
THEN
507 ELSE IF( lda.LE.1 .OR. lda.LT.nmax )
THEN
509 ELSE IF( ldq.LE.1 .OR. ldq.LT.nmax )
THEN
511 ELSE IF( ldqe.LE.1 .OR. ldqe.LT.nmax )
THEN
523 IF( info.EQ.0 .AND. lwork.GE.1 )
THEN
524 minwrk = nmax*( nmax+1 )
525 nb = max( 1, ilaenv( 1,
'ZGEQRF',
' ', nmax, nmax, -1, -1 ),
526 $ ilaenv( 1,
'ZUNMQR',
'LC', nmax, nmax, nmax, -1 ),
527 $ ilaenv( 1,
'ZUNGQR',
' ', nmax, nmax, nmax, -1 ) )
528 maxwrk = max( 2*nmax, nmax*( nb+1 ), nmax*( nmax+1 ) )
532 IF( lwork.LT.minwrk )
536 CALL xerbla(
'ZDRGEV3', -info )
542 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
545 ulp = dlamch(
'Precision' )
546 safmin = dlamch(
'Safe minimum' )
547 safmin = safmin / ulp
548 safmax = one / safmin
549 CALL dlabad( safmin, safmax )
563 DO 220 jsize = 1, nsizes
566 rmagn( 2 ) = safmax*ulp / dble( n1 )
567 rmagn( 3 ) = safmin*ulpinv*n1
569 IF( nsizes.NE.1 )
THEN
570 mtypes = min( maxtyp, ntypes )
572 mtypes = min( maxtyp+1, ntypes )
575 DO 210 jtype = 1, mtypes
576 IF( .NOT.dotype( jtype ) )
583 ioldsd( j ) = iseed( j )
607 IF( mtypes.GT.maxtyp )
610 IF( kclass( jtype ).LT.3 )
THEN
614 IF( abs( katype( jtype ) ).EQ.3 )
THEN
615 in = 2*( ( n-1 ) / 2 ) + 1
617 $
CALL zlaset(
'Full', n, n, czero, czero, a, lda )
621 CALL zlatm4( katype( jtype ), in, kz1( kazero( jtype ) ),
622 $ kz2( kazero( jtype ) ), lasign( jtype ),
623 $ rmagn( kamagn( jtype ) ), ulp,
624 $ rmagn( ktrian( jtype )*kamagn( jtype ) ), 2,
626 iadd = kadd( kazero( jtype ) )
627 IF( iadd.GT.0 .AND. iadd.LE.n )
628 $ a( iadd, iadd ) = rmagn( kamagn( jtype ) )
632 IF( abs( kbtype( jtype ) ).EQ.3 )
THEN
633 in = 2*( ( n-1 ) / 2 ) + 1
635 $
CALL zlaset(
'Full', n, n, czero, czero, b, lda )
639 CALL zlatm4( kbtype( jtype ), in, kz1( kbzero( jtype ) ),
640 $ kz2( kbzero( jtype ) ), lbsign( jtype ),
641 $ rmagn( kbmagn( jtype ) ), one,
642 $ rmagn( ktrian( jtype )*kbmagn( jtype ) ), 2,
644 iadd = kadd( kbzero( jtype ) )
645 IF( iadd.NE.0 .AND. iadd.LE.n )
646 $ b( iadd, iadd ) = rmagn( kbmagn( jtype ) )
648 IF( kclass( jtype ).EQ.2 .AND. n.GT.0 )
THEN
657 q( jr, jc ) = zlarnd( 3, iseed )
658 z( jr, jc ) = zlarnd( 3, iseed )
660 CALL zlarfg( n+1-jc, q( jc, jc ), q( jc+1, jc ), 1,
662 work( 2*n+jc ) = sign( one, dble( q( jc, jc ) ) )
664 CALL zlarfg( n+1-jc, z( jc, jc ), z( jc+1, jc ), 1,
666 work( 3*n+jc ) = sign( one, dble( z( jc, jc ) ) )
669 ctemp = zlarnd( 3, iseed )
672 work( 3*n ) = ctemp / abs( ctemp )
673 ctemp = zlarnd( 3, iseed )
676 work( 4*n ) = ctemp / abs( ctemp )
682 a( jr, jc ) = work( 2*n+jr )*
683 $ dconjg( work( 3*n+jc ) )*
685 b( jr, jc ) = work( 2*n+jr )*
686 $ dconjg( work( 3*n+jc ) )*
690 CALL zunm2r(
'L',
'N', n, n, n-1, q, ldq, work, a,
691 $ lda, work( 2*n+1 ), ierr )
694 CALL zunm2r(
'R',
'C', n, n, n-1, z, ldq, work( n+1 ),
695 $ a, lda, work( 2*n+1 ), ierr )
698 CALL zunm2r(
'L',
'N', n, n, n-1, q, ldq, work, b,
699 $ lda, work( 2*n+1 ), ierr )
702 CALL zunm2r(
'R',
'C', n, n, n-1, z, ldq, work( n+1 ),
703 $ b, lda, work( 2*n+1 ), ierr )
713 a( jr, jc ) = rmagn( kamagn( jtype ) )*
715 b( jr, jc ) = rmagn( kbmagn( jtype ) )*
724 WRITE( nounit, fmt = 9999 )
'Generator', ierr, n, jtype,
746 CALL zlacpy(
' ', n, n, a, lda, s, lda )
747 CALL zlacpy(
' ', n, n, b, lda, t, lda )
748 CALL zggev3(
'V',
'V', n, s, lda, t, lda, alpha, beta, q,
749 $ ldq, z, ldq, work, lwork, rwork, ierr )
750 IF( ierr.NE.0 .AND. ierr.NE.n+1 )
THEN
752 WRITE( nounit, fmt = 9999 )
'ZGGEV31', ierr, n, jtype,
760 CALL zget52( .true., n, a, lda, b, lda, q, ldq, alpha, beta,
761 $ work, rwork, result( 1 ) )
762 IF( result( 2 ).GT.thresh )
THEN
763 WRITE( nounit, fmt = 9998 )
'Left',
'ZGGEV31',
764 $ result( 2 ), n, jtype, ioldsd
769 CALL zget52( .false., n, a, lda, b, lda, z, ldq, alpha,
770 $ beta, work, rwork, result( 3 ) )
771 IF( result( 4 ).GT.thresh )
THEN
772 WRITE( nounit, fmt = 9998 )
'Right',
'ZGGEV31',
773 $ result( 4 ), n, jtype, ioldsd
778 CALL zlacpy(
' ', n, n, a, lda, s, lda )
779 CALL zlacpy(
' ', n, n, b, lda, t, lda )
780 CALL zggev3(
'N',
'N', n, s, lda, t, lda, alpha1, beta1, q,
781 $ ldq, z, ldq, work, lwork, rwork, ierr )
782 IF( ierr.NE.0 .AND. ierr.NE.n+1 )
THEN
784 WRITE( nounit, fmt = 9999 )
'ZGGEV32', ierr, n, jtype,
791 IF( alpha( j ).NE.alpha1( j ) .OR. beta( j ).NE.
792 $ beta1( j ) )result( 5 ) = ulpinv
798 CALL zlacpy(
' ', n, n, a, lda, s, lda )
799 CALL zlacpy(
' ', n, n, b, lda, t, lda )
800 CALL zggev3(
'V',
'N', n, s, lda, t, lda, alpha1, beta1, qe,
801 $ ldqe, z, ldq, work, lwork, rwork, ierr )
802 IF( ierr.NE.0 .AND. ierr.NE.n+1 )
THEN
804 WRITE( nounit, fmt = 9999 )
'ZGGEV33', ierr, n, jtype,
811 IF( alpha( j ).NE.alpha1( j ) .OR. beta( j ).NE.
812 $ beta1( j ) )result( 6 ) = ulpinv
817 IF( q( j, jc ).NE.qe( j, jc ) )
818 $ result( 6 ) = ulpinv
825 CALL zlacpy(
' ', n, n, a, lda, s, lda )
826 CALL zlacpy(
' ', n, n, b, lda, t, lda )
827 CALL zggev3(
'N',
'V', n, s, lda, t, lda, alpha1, beta1, q,
828 $ ldq, qe, ldqe, work, lwork, rwork, ierr )
829 IF( ierr.NE.0 .AND. ierr.NE.n+1 )
THEN
831 WRITE( nounit, fmt = 9999 )
'ZGGEV34', ierr, n, jtype,
838 IF( alpha( j ).NE.alpha1( j ) .OR. beta( j ).NE.
839 $ beta1( j ) )result( 7 ) = ulpinv
844 IF( z( j, jc ).NE.qe( j, jc ) )
845 $ result( 7 ) = ulpinv
858 IF( result( jr ).GE.thresh )
THEN
863 IF( nerrs.EQ.0 )
THEN
864 WRITE( nounit, fmt = 9997 )
'ZGV'
868 WRITE( nounit, fmt = 9996 )
869 WRITE( nounit, fmt = 9995 )
870 WRITE( nounit, fmt = 9994 )
'Orthogonal'
874 WRITE( nounit, fmt = 9993 )
878 IF( result( jr ).LT.10000.0d0 )
THEN
879 WRITE( nounit, fmt = 9992 )n, jtype, ioldsd, jr,
882 WRITE( nounit, fmt = 9991 )n, jtype, ioldsd, jr,
893 CALL alasvm(
'ZGV3', nounit, nerrs, ntestt, 0 )
899 9999
FORMAT(
' ZDRGEV3: ', a,
' returned INFO=', i6,
'.', / 3x,
'N=',
900 $ i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ), i5,
')' )
902 9998
FORMAT(
' ZDRGEV3: ', a,
' Eigenvectors from ', a,
903 $
' incorrectly normalized.', /
' Bits of error=', 0p, g10.3,
904 $
',', 3x,
'N=', i4,
', JTYPE=', i3,
', ISEED=(',
905 $ 3( i4,
',' ), i5,
')' )
907 9997
FORMAT( / 1x, a3,
' -- Complex Generalized eigenvalue problem ',
910 9996
FORMAT(
' Matrix types (see ZDRGEV3 for details): ' )
912 9995
FORMAT(
' Special Matrices:', 23x,
913 $
'(J''=transposed Jordan block)',
914 $ /
' 1=(0,0) 2=(I,0) 3=(0,I) 4=(I,I) 5=(J'',J'') ',
915 $
'6=(diag(J'',I), diag(I,J''))', /
' Diagonal Matrices: ( ',
916 $
'D=diag(0,1,2,...) )', /
' 7=(D,I) 9=(large*D, small*I',
917 $
') 11=(large*I, small*D) 13=(large*D, large*I)', /
918 $
' 8=(I,D) 10=(small*D, large*I) 12=(small*I, large*D) ',
919 $
' 14=(small*D, small*I)', /
' 15=(D, reversed D)' )
920 9994
FORMAT(
' Matrices Rotated by Random ', a,
' Matrices U, V:',
921 $ /
' 16=Transposed Jordan Blocks 19=geometric ',
922 $
'alpha, beta=0,1', /
' 17=arithm. alpha&beta ',
923 $
' 20=arithmetic alpha, beta=0,1', /
' 18=clustered ',
924 $
'alpha, beta=0,1 21=random alpha, beta=0,1',
925 $ /
' Large & Small Matrices:', /
' 22=(large, small) ',
926 $
'23=(small,large) 24=(small,small) 25=(large,large)',
927 $ /
' 26=random O(1) matrices.' )
929 9993
FORMAT( /
' Tests performed: ',
930 $ /
' 1 = max | ( b A - a B )''*l | / const.,',
931 $ /
' 2 = | |VR(i)| - 1 | / ulp,',
932 $ /
' 3 = max | ( b A - a B )*r | / const.',
933 $ /
' 4 = | |VL(i)| - 1 | / ulp,',
934 $ /
' 5 = 0 if W same no matter if r or l computed,',
935 $ /
' 6 = 0 if l same no matter if l computed,',
936 $ /
' 7 = 0 if r same no matter if r computed,', / 1x )
937 9992
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
938 $ 4( i4,
',' ),
' result ', i2,
' is', 0p, f8.2 )
939 9991
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
940 $ 4( i4,
',' ),
' result ', i2,
' is', 1p, d10.3 )
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine alasvm(TYPE, NOUT, NFAIL, NRUN, NERRS)
ALASVM
subroutine xlaenv(ISPEC, NVALUE)
XLAENV
subroutine zget52(LEFT, N, A, LDA, B, LDB, E, LDE, ALPHA, BETA, WORK, RWORK, RESULT)
ZGET52
subroutine zlatm4(ITYPE, N, NZ1, NZ2, RSIGN, AMAGN, RCOND, TRIANG, IDIST, ISEED, A, LDA)
ZLATM4
subroutine zdrgev3(NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH, NOUNIT, A, LDA, B, S, T, Q, LDQ, Z, QE, LDQE, ALPHA, BETA, ALPHA1, BETA1, WORK, LWORK, RWORK, RESULT, INFO)
ZDRGEV3
subroutine zggev3(JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHA, BETA, VL, LDVL, VR, LDVR, WORK, LWORK, RWORK, INFO)
ZGGEV3 computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices (...
subroutine zlacpy(UPLO, M, N, A, LDA, B, LDB)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine zlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine zlarfg(N, ALPHA, X, INCX, TAU)
ZLARFG generates an elementary reflector (Householder matrix).
subroutine zunm2r(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, INFO)
ZUNM2R multiplies a general matrix by the unitary matrix from a QR factorization determined by cgeqrf...