395 SUBROUTINE cdrgev3( 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,
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(
'CDRGEV3', -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,
746 CALL clacpy(
' ', n, n, a, lda, s, lda )
747 CALL clacpy(
' ', n, n, b, lda, t, lda )
748 CALL cggev3(
'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 )
'CGGEV31', ierr, n, jtype,
760 CALL cget52( .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',
'CGGEV31',
764 $ result( 2 ), n, jtype, ioldsd
769 CALL cget52( .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',
'CGGEV31',
773 $ result( 4 ), n, jtype, ioldsd
778 CALL clacpy(
' ', n, n, a, lda, s, lda )
779 CALL clacpy(
' ', n, n, b, lda, t, lda )
780 CALL cggev3(
'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 )
'CGGEV32', ierr, n, jtype,
791 IF( alpha( j ).NE.alpha1( j ) .OR. beta( j ).NE.
792 $ beta1( j ) ) result( 5 ) = ulpinv
798 CALL clacpy(
' ', n, n, a, lda, s, lda )
799 CALL clacpy(
' ', n, n, b, lda, t, lda )
800 CALL cggev3(
'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 )
'CGGEV33', ierr, n, jtype,
812 IF( alpha( j ).NE.alpha1( j ) .OR.
813 $ beta( j ).NE.beta1( j ) )
THEN
820 IF( q( j, jc ).NE.qe( j, jc ) )
THEN
829 CALL clacpy(
' ', n, n, a, lda, s, lda )
830 CALL clacpy(
' ', n, n, b, lda, t, lda )
831 CALL cggev3(
'N',
'V', n, s, lda, t, lda, alpha1, beta1, q,
832 $ ldq, qe, ldqe, work, lwork, rwork, ierr )
833 IF( ierr.NE.0 .AND. ierr.NE.n+1 )
THEN
835 WRITE( nounit, fmt = 9999 )
'CGGEV34', ierr, n, jtype,
842 IF( alpha( j ).NE.alpha1( j ) .OR. beta( j ).NE.
843 $ beta1( j ) )result( 7 ) = ulpinv
848 IF( z( j, jc ).NE.qe( j, jc ) )
849 $ result( 7 ) = ulpinv
862 IF( result( jr ).GE.thresh )
THEN
867 IF( nerrs.EQ.0 )
THEN
868 WRITE( nounit, fmt = 9997 )
'CGV'
872 WRITE( nounit, fmt = 9996 )
873 WRITE( nounit, fmt = 9995 )
874 WRITE( nounit, fmt = 9994 )
'Orthogonal'
878 WRITE( nounit, fmt = 9993 )
882 IF( result( jr ).LT.10000.0 )
THEN
883 WRITE( nounit, fmt = 9992 )n, jtype, ioldsd, jr,
886 WRITE( nounit, fmt = 9991 )n, jtype, ioldsd, jr,
897 CALL alasvm(
'CGV3', nounit, nerrs, ntestt, 0 )
903 9999
FORMAT(
' CDRGEV3: ', a,
' returned INFO=', i6,
'.', / 3x,
'N=',
904 $ i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ), i5,
')' )
906 9998
FORMAT(
' CDRGEV3: ', a,
' Eigenvectors from ', a,
907 $
' incorrectly normalized.', /
' Bits of error=', 0p, g10.3,
908 $
',', 3x,
'N=', i4,
', JTYPE=', i3,
', ISEED=(',
909 $ 3( i4,
',' ), i5,
')' )
911 9997
FORMAT( / 1x, a3,
' -- Complex Generalized eigenvalue problem ',
914 9996
FORMAT(
' Matrix types (see CDRGEV3 for details): ' )
916 9995
FORMAT(
' Special Matrices:', 23x,
917 $
'(J''=transposed Jordan block)',
918 $ /
' 1=(0,0) 2=(I,0) 3=(0,I) 4=(I,I) 5=(J'',J'') ',
919 $
'6=(diag(J'',I), diag(I,J''))', /
' Diagonal Matrices: ( ',
920 $
'D=diag(0,1,2,...) )', /
' 7=(D,I) 9=(large*D, small*I',
921 $
') 11=(large*I, small*D) 13=(large*D, large*I)', /
922 $
' 8=(I,D) 10=(small*D, large*I) 12=(small*I, large*D) ',
923 $
' 14=(small*D, small*I)', /
' 15=(D, reversed D)' )
924 9994
FORMAT(
' Matrices Rotated by Random ', a,
' Matrices U, V:',
925 $ /
' 16=Transposed Jordan Blocks 19=geometric ',
926 $
'alpha, beta=0,1', /
' 17=arithm. alpha&beta ',
927 $
' 20=arithmetic alpha, beta=0,1', /
' 18=clustered ',
928 $
'alpha, beta=0,1 21=random alpha, beta=0,1',
929 $ /
' Large & Small Matrices:', /
' 22=(large, small) ',
930 $
'23=(small,large) 24=(small,small) 25=(large,large)',
931 $ /
' 26=random O(1) matrices.' )
933 9993
FORMAT( /
' Tests performed: ',
934 $ /
' 1 = max | ( b A - a B )''*l | / const.,',
935 $ /
' 2 = | |VR(i)| - 1 | / ulp,',
936 $ /
' 3 = max | ( b A - a B )*r | / const.',
937 $ /
' 4 = | |VL(i)| - 1 | / ulp,',
938 $ /
' 5 = 0 if W same no matter if r or l computed,',
939 $ /
' 6 = 0 if l same no matter if l computed,',
940 $ /
' 7 = 0 if r same no matter if r computed,', / 1x )
941 9992
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
942 $ 4( i4,
',' ),
' result ', i2,
' is', 0p, f8.2 )
943 9991
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
944 $ 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 xlaenv(ISPEC, NVALUE)
XLAENV
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 cdrgev3(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)
CDRGEV3
subroutine cggev3(JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHA, BETA, VL, LDVL, VR, LDVR, WORK, LWORK, RWORK, INFO)
CGGEV3 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...