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,
738 CALL clacpy(
' ', n, n, a, lda, s, lda )
739 CALL clacpy(
' ', n, n, b, lda, t, lda )
740 CALL cggev3(
'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 )
'CGGEV31', 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',
'CGGEV31',
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',
'CGGEV31',
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 cggev3(
'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 )
'CGGEV32', 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 cggev3(
'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 )
'CGGEV33', ierr, n, jtype,
804 IF( alpha( j ).NE.alpha1( j ) .OR.
805 $ beta( j ).NE.beta1( j ) )
THEN
812 IF( q( j, jc ).NE.qe( j, jc ) )
THEN
821 CALL clacpy(
' ', n, n, a, lda, s, lda )
822 CALL clacpy(
' ', n, n, b, lda, t, lda )
823 CALL cggev3(
'N',
'V', n, s, lda, t, lda, alpha1, beta1, q,
824 $ ldq, qe, ldqe, work, lwork, rwork, ierr )
825 IF( ierr.NE.0 .AND. ierr.NE.n+1 )
THEN
827 WRITE( nounit, fmt = 9999 )
'CGGEV34', ierr, n, jtype,
834 IF( alpha( j ).NE.alpha1( j ) .OR. beta( j ).NE.
835 $ beta1( j ) )result( 7 ) = ulpinv
840 IF( z( j, jc ).NE.qe( j, jc ) )
841 $ result( 7 ) = ulpinv
854 IF( result( jr ).GE.thresh )
THEN
859 IF( nerrs.EQ.0 )
THEN
860 WRITE( nounit, fmt = 9997 )
'CGV'
864 WRITE( nounit, fmt = 9996 )
865 WRITE( nounit, fmt = 9995 )
866 WRITE( nounit, fmt = 9994 )
'Orthogonal'
870 WRITE( nounit, fmt = 9993 )
874 IF( result( jr ).LT.10000.0 )
THEN
875 WRITE( nounit, fmt = 9992 )n, jtype, ioldsd, jr,
878 WRITE( nounit, fmt = 9991 )n, jtype, ioldsd, jr,
889 CALL alasvm(
'CGV3', nounit, nerrs, ntestt, 0 )
895 9999
FORMAT(
' CDRGEV3: ', a,
' returned INFO=', i6,
'.', / 3x,
'N=',
896 $ i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ), i5,
')' )
898 9998
FORMAT(
' CDRGEV3: ', a,
' Eigenvectors from ', a,
899 $
' incorrectly normalized.', /
' Bits of error=', 0p, g10.3,
900 $
',', 3x,
'N=', i4,
', JTYPE=', i3,
', ISEED=(',
901 $ 3( i4,
',' ), i5,
')' )
903 9997
FORMAT( / 1x, a3,
' -- Complex Generalized eigenvalue problem ',
906 9996
FORMAT(
' Matrix types (see CDRGEV3 for details): ' )
908 9995
FORMAT(
' Special Matrices:', 23x,
909 $
'(J''=transposed Jordan block)',
910 $ /
' 1=(0,0) 2=(I,0) 3=(0,I) 4=(I,I) 5=(J'',J'') ',
911 $
'6=(diag(J'',I), diag(I,J''))', /
' Diagonal Matrices: ( ',
912 $
'D=diag(0,1,2,...) )', /
' 7=(D,I) 9=(large*D, small*I',
913 $
') 11=(large*I, small*D) 13=(large*D, large*I)', /
914 $
' 8=(I,D) 10=(small*D, large*I) 12=(small*I, large*D) ',
915 $
' 14=(small*D, small*I)', /
' 15=(D, reversed D)' )
916 9994
FORMAT(
' Matrices Rotated by Random ', a,
' Matrices U, V:',
917 $ /
' 16=Transposed Jordan Blocks 19=geometric ',
918 $
'alpha, beta=0,1', /
' 17=arithm. alpha&beta ',
919 $
' 20=arithmetic alpha, beta=0,1', /
' 18=clustered ',
920 $
'alpha, beta=0,1 21=random alpha, beta=0,1',
921 $ /
' Large & Small Matrices:', /
' 22=(large, small) ',
922 $
'23=(small,large) 24=(small,small) 25=(large,large)',
923 $ /
' 26=random O(1) matrices.' )
925 9993
FORMAT( /
' Tests performed: ',
926 $ /
' 1 = max | ( b A - a B )''*l | / const.,',
927 $ /
' 2 = | |VR(i)| - 1 | / ulp,',
928 $ /
' 3 = max | ( b A - a B )*r | / const.',
929 $ /
' 4 = | |VL(i)| - 1 | / ulp,',
930 $ /
' 5 = 0 if W same no matter if r or l computed,',
931 $ /
' 6 = 0 if l same no matter if l computed,',
932 $ /
' 7 = 0 if r same no matter if r computed,', / 1x )
933 9992
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
934 $ 4( i4,
',' ),
' result ', i2,
' is', 0p, f8.2 )
935 9991
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
936 $ 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 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...