395 SUBROUTINE cdrgev( 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, RWORK,
405 INTEGER INFO, LDA, LDQ, LDQE, LWORK, NOUNIT, NSIZES,
411 INTEGER ISEED( 4 ), NN( * )
412 REAL RESULT( * ), RWORK( * )
413 COMPLEX A( LDA, * ), ALPHA( * ), ALPHA1( * ),
414 $ b( lda, * ), beta( * ), beta1( * ),
415 $ q( ldq, * ), qe( ldqe, * ), s( lda, * ),
416 $ t( lda, * ), work( * ), z( ldq, * )
423 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0 )
425 parameter( czero = ( 0.0e+0, 0.0e+0 ),
426 $ cone = ( 1.0e+0, 0.0e+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 REAL 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 )
451 EXTERNAL ilaenv, slamch, clarnd
458 INTRINSIC abs, conjg, max, min, real, 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,
'CGEQRF',
' ', nmax, nmax, -1, -1 ),
526 $ ilaenv( 1,
'CUNMQR',
'LC', nmax, nmax, nmax, -1 ),
527 $ ilaenv( 1,
'CUNGQR',
' ', nmax, nmax, nmax, -1 ) )
528 maxwrk = max( 2*nmax, nmax*( nb+1 ), nmax*( nmax+1 ) )
532 IF( lwork.LT.minwrk )
536 CALL xerbla(
'CDRGEV', -info )
542 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
545 ulp = slamch(
'Precision' )
546 safmin = slamch(
'Safe minimum' )
547 safmin = safmin / ulp
548 safmax = one / safmin
549 CALL slabad( safmin, safmax )
563 DO 220 jsize = 1, nsizes
566 rmagn( 2 ) = safmax*ulp / real( 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 claset(
'Full', n, n, czero, czero, a, lda )
621 CALL clatm4( 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 claset(
'Full', n, n, czero, czero, b, lda )
639 CALL clatm4( 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 ) = clarnd( 3, iseed )
658 z( jr, jc ) = clarnd( 3, iseed )
660 CALL clarfg( n+1-jc, q( jc, jc ), q( jc+1, jc ), 1,
662 work( 2*n+jc ) = sign( one, real( q( jc, jc ) ) )
664 CALL clarfg( n+1-jc, z( jc, jc ), z( jc+1, jc ), 1,
666 work( 3*n+jc ) = sign( one, real( z( jc, jc ) ) )
669 ctemp = clarnd( 3, iseed )
672 work( 3*n ) = ctemp / abs( ctemp )
673 ctemp = clarnd( 3, iseed )
676 work( 4*n ) = ctemp / abs( ctemp )
682 a( jr, jc ) = work( 2*n+jr )*
683 $ conjg( work( 3*n+jc ) )*
685 b( jr, jc ) = work( 2*n+jr )*
686 $ conjg( work( 3*n+jc ) )*
690 CALL cunm2r(
'L',
'N', n, n, n-1, q, ldq, work, a,
691 $ lda, work( 2*n+1 ), ierr )
694 CALL cunm2r(
'R',
'C', n, n, n-1, z, ldq, work( n+1 ),
695 $ a, lda, work( 2*n+1 ), ierr )
698 CALL cunm2r(
'L',
'N', n, n, n-1, q, ldq, work, b,
699 $ lda, work( 2*n+1 ), ierr )
702 CALL cunm2r(
'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,
738 CALL clacpy(
' ', n, n, a, lda, s, lda )
739 CALL clacpy(
' ', n, n, b, lda, t, lda )
740 CALL cggev(
'V',
'V', n, s, lda, t, lda, alpha, beta, q,
741 $ ldq, z, ldq, work, lwork, rwork, ierr )
742 IF( ierr.NE.0 .AND. ierr.NE.n+1 )
THEN
744 WRITE( nounit, fmt = 9999 )
'CGGEV1', ierr, n, jtype,
752 CALL cget52( .true., n, a, lda, b, lda, q, ldq, alpha, beta,
753 $ work, rwork, result( 1 ) )
754 IF( result( 2 ).GT.thresh )
THEN
755 WRITE( nounit, fmt = 9998 )
'Left',
'CGGEV1',
756 $ result( 2 ), n, jtype, ioldsd
761 CALL cget52( .false., n, a, lda, b, lda, z, ldq, alpha,
762 $ beta, work, rwork, result( 3 ) )
763 IF( result( 4 ).GT.thresh )
THEN
764 WRITE( nounit, fmt = 9998 )
'Right',
'CGGEV1',
765 $ result( 4 ), n, jtype, ioldsd
770 CALL clacpy(
' ', n, n, a, lda, s, lda )
771 CALL clacpy(
' ', n, n, b, lda, t, lda )
772 CALL cggev(
'N',
'N', n, s, lda, t, lda, alpha1, beta1, q,
773 $ ldq, z, ldq, work, lwork, rwork, ierr )
774 IF( ierr.NE.0 .AND. ierr.NE.n+1 )
THEN
776 WRITE( nounit, fmt = 9999 )
'CGGEV2', ierr, n, jtype,
783 IF( alpha( j ).NE.alpha1( j ) .OR. beta( j ).NE.
784 $ beta1( j ) )result( 5 ) = ulpinv
790 CALL clacpy(
' ', n, n, a, lda, s, lda )
791 CALL clacpy(
' ', n, n, b, lda, t, lda )
792 CALL cggev(
'V',
'N', n, s, lda, t, lda, alpha1, beta1, qe,
793 $ ldqe, z, ldq, work, lwork, rwork, ierr )
794 IF( ierr.NE.0 .AND. ierr.NE.n+1 )
THEN
796 WRITE( nounit, fmt = 9999 )
'CGGEV3', ierr, n, jtype,
803 IF( alpha( j ).NE.alpha1( j ) .OR. beta( j ).NE.
804 $ beta1( j ) )result( 6 ) = ulpinv
809 IF( q( j, jc ).NE.qe( j, jc ) )
810 $ result( 6 ) = ulpinv
817 CALL clacpy(
' ', n, n, a, lda, s, lda )
818 CALL clacpy(
' ', n, n, b, lda, t, lda )
819 CALL cggev(
'N',
'V', n, s, lda, t, lda, alpha1, beta1, q,
820 $ ldq, qe, ldqe, work, lwork, rwork, ierr )
821 IF( ierr.NE.0 .AND. ierr.NE.n+1 )
THEN
823 WRITE( nounit, fmt = 9999 )
'CGGEV4', ierr, n, jtype,
830 IF( alpha( j ).NE.alpha1( j ) .OR. beta( j ).NE.
831 $ beta1( j ) )result( 7 ) = ulpinv
836 IF( z( j, jc ).NE.qe( j, jc ) )
837 $ result( 7 ) = ulpinv
850 IF( result( jr ).GE.thresh )
THEN
855 IF( nerrs.EQ.0 )
THEN
856 WRITE( nounit, fmt = 9997 )
'CGV'
860 WRITE( nounit, fmt = 9996 )
861 WRITE( nounit, fmt = 9995 )
862 WRITE( nounit, fmt = 9994 )
'Orthogonal'
866 WRITE( nounit, fmt = 9993 )
870 IF( result( jr ).LT.10000.0 )
THEN
871 WRITE( nounit, fmt = 9992 )n, jtype, ioldsd, jr,
874 WRITE( nounit, fmt = 9991 )n, jtype, ioldsd, jr,
885 CALL alasvm(
'CGV', nounit, nerrs, ntestt, 0 )
891 9999
FORMAT(
' CDRGEV: ', a,
' returned INFO=', i6,
'.', / 3x,
'N=',
892 $ i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ), i5,
')' )
894 9998
FORMAT(
' CDRGEV: ', a,
' Eigenvectors from ', a,
' incorrectly ',
895 $
'normalized.', /
' Bits of error=', 0p, g10.3,
',', 3x,
896 $
'N=', i4,
', JTYPE=', i3,
', ISEED=(', 3( i4,
',' ), i5,
899 9997
FORMAT( / 1x, a3,
' -- Complex Generalized eigenvalue problem ',
902 9996
FORMAT(
' Matrix types (see CDRGEV for details): ' )
904 9995
FORMAT(
' Special Matrices:', 23x,
905 $
'(J''=transposed Jordan block)',
906 $ /
' 1=(0,0) 2=(I,0) 3=(0,I) 4=(I,I) 5=(J'',J'') ',
907 $
'6=(diag(J'',I), diag(I,J''))', /
' Diagonal Matrices: ( ',
908 $
'D=diag(0,1,2,...) )', /
' 7=(D,I) 9=(large*D, small*I',
909 $
') 11=(large*I, small*D) 13=(large*D, large*I)', /
910 $
' 8=(I,D) 10=(small*D, large*I) 12=(small*I, large*D) ',
911 $
' 14=(small*D, small*I)', /
' 15=(D, reversed D)' )
912 9994
FORMAT(
' Matrices Rotated by Random ', a,
' Matrices U, V:',
913 $ /
' 16=Transposed Jordan Blocks 19=geometric ',
914 $
'alpha, beta=0,1', /
' 17=arithm. alpha&beta ',
915 $
' 20=arithmetic alpha, beta=0,1', /
' 18=clustered ',
916 $
'alpha, beta=0,1 21=random alpha, beta=0,1',
917 $ /
' Large & Small Matrices:', /
' 22=(large, small) ',
918 $
'23=(small,large) 24=(small,small) 25=(large,large)',
919 $ /
' 26=random O(1) matrices.' )
921 9993
FORMAT( /
' Tests performed: ',
922 $ /
' 1 = max | ( b A - a B )''*l | / const.,',
923 $ /
' 2 = | |VR(i)| - 1 | / ulp,',
924 $ /
' 3 = max | ( b A - a B )*r | / const.',
925 $ /
' 4 = | |VL(i)| - 1 | / ulp,',
926 $ /
' 5 = 0 if W same no matter if r or l computed,',
927 $ /
' 6 = 0 if l same no matter if l computed,',
928 $ /
' 7 = 0 if r same no matter if r computed,', / 1x )
929 9992
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
930 $ 4( i4,
',' ),
' result ', i2,
' is', 0p, f8.2 )
931 9991
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
932 $ 4( i4,
',' ),
' result ', i2,
' is', 1p, e10.3 )
subroutine slabad(SMALL, LARGE)
SLABAD
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine alasvm(TYPE, NOUT, NFAIL, NRUN, NERRS)
ALASVM
subroutine clatm4(ITYPE, N, NZ1, NZ2, RSIGN, AMAGN, RCOND, TRIANG, IDIST, ISEED, A, LDA)
CLATM4
subroutine cget52(LEFT, N, A, LDA, B, LDB, E, LDE, ALPHA, BETA, WORK, RWORK, RESULT)
CGET52
subroutine cdrgev(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)
CDRGEV
subroutine cggev(JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHA, BETA, VL, LDVL, VR, LDVR, WORK, LWORK, RWORK, INFO)
CGGEV computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices
subroutine claset(UPLO, M, N, ALPHA, BETA, A, LDA)
CLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine clarfg(N, ALPHA, X, INCX, TAU)
CLARFG generates an elementary reflector (Householder matrix).
subroutine clacpy(UPLO, M, N, A, LDA, B, LDB)
CLACPY copies all or part of one two-dimensional array to another.
subroutine cunm2r(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, INFO)
CUNM2R multiplies a general matrix by the unitary matrix from a QR factorization determined by cgeqrf...