378 SUBROUTINE cdrges3( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
379 $ NOUNIT, A, LDA, B, S, T, Q, LDQ, Z, ALPHA,
380 $ BETA, WORK, LWORK, RWORK, RESULT, BWORK,
388 INTEGER INFO, LDA, LDQ, LWORK, , NSIZES, NTYPES
392 LOGICAL BWORK( * ), DOTYPE( * )
393 INTEGER ISEED( 4 ), NN( * )
394 REAL RESULT( 13 ), RWORK( * )
395 COMPLEX A( LDA, * ), ALPHA( * ), B( LDA, * ),
397 $ t( lda, * ), work( * ), z( ldq, * )
404 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0 )
406 parameter( czero = ( 0.0e+0, 0.0e+0 ),
407 $ cone = ( 1.0e+0, 0.0e+0 ) )
409 parameter( maxtyp = 26 )
412 LOGICAL BADNN, ILABAD
414 INTEGER I, IADD, IINFO, IN, ISORT, J, JC, JR, JSIZE,
415 $ jtype, knteig, maxwrk, minwrk, mtypes, n, n1,
416 $ nb, nerrs, nmats, nmax, ntest, ntestt, rsub,
418 REAL SAFMAX, SAFMIN, TEMP1, TEMP2, ULP,
422 LOGICAL LASIGN( MAXTYP ), LBSIGN( )
423 INTEGER IOLDSD( 4 ), ( 6 ), KAMAGN( MAXTYP ),
424 $ KATYPE( MAXTYP ), KAZERO( MAXTYP ),
426 $ kbzero( maxtyp ), kclass( maxtyp ),
427 $ ktrian( maxtyp ), kz1( 6 ), kz2( 6 )
435 EXTERNAL clctes, ilaenv, slamch, clarnd
442 INTRINSIC abs, aimag, conjg,
max,
min, real, sign
448 abs1( x ) = abs( real( x ) ) + abs( aimag( x ) )
451 DATA kclass / 15*1, 10*2, 1*3 /
452 DATA kz1 / 0, 1, 2, 1, 3, 3 /
453 DATA kz2 / 0, 0, 1, 2, 1, 1 /
455 DATA katype / 0, 1, 0, 1, 2, 3, 4, 1, 4, 4, 1, 1, 4,
458 $ 1, 1, -4, 2, -4, 8*8, 0 /
459 DATA kazero / 6*1, 2, 1, 2*2, 2*1, 2*2, 3, 1, 3,
461 DATA kbzero / 6*1, 1, 2, 2*1, 2*2, 2*1, 4, 1, 4,
463 DATA kamagn / 8*1, 2, 3, 2, 3, 2, 3, 7*1, 2, 3, 3,
465 DATA kbmagn / 8*1, 3, 2, 3, 2, 2, 3, 7*1, 3, 2, 3,
467 DATA ktrian / 16*0, 10*1 /
468 DATA lasign / 6*.false., .true., .false., 2*.true.,
469 $ 2*.false., 3*.true., .false., .true.,
470 $ 3*.false., 5*.true., .false. /
471 DATA lbsign / 7*.false., .true., 2*.false.,
472 $ 2*.true., 2*.false., .true., .false., .true.,
484 nmax =
max( nmax, nn( j ) )
489 IF( nsizes.LT.0 )
THEN
491 ELSE IF( badnn )
THEN
493 ELSE IF( ntypes.LT.0 )
THEN
495 ELSE IF( thresh.LT.zero )
THEN
497 ELSE IF( lda.LE.1 .OR. lda.LT.nmax
THEN
499 ELSE IF( ldq.LE.1 .OR. ldq.LT.nmax )
THEN
511 IF( info.EQ.0 .AND. lwork.GE.1 )
THEN
513 nb =
max( 1, ilaenv( 1,
'CGEQRF',
' ', nmax, nmax, -1, -1 ),
514 $ ilaenv( 1,
'CUNMQR',
'LC', nmax, nmax, nmax, -1 ),
515 $ ilaenv( 1, '
cungqr', ' ', NMAX, NMAX, NMAX, -1 ) )
516 MAXWRK = MAX( NMAX+NMAX*NB, 3*NMAX*NMAX)
520.LT.
IF( LWORKMINWRK )
524 CALL XERBLA( 'cdrges3', -INFO )
530.EQ..OR..EQ.
IF( NSIZES0 NTYPES0 )
533 ULP = SLAMCH( 'precision
' )
534 SAFMIN = SLAMCH( 'safe minimum
' )
535 SAFMIN = SAFMIN / ULP
536 SAFMAX = ONE / SAFMIN
537 CALL SLABAD( SAFMIN, SAFMAX )
551 DO 190 JSIZE = 1, NSIZES
554 RMAGN( 2 ) = SAFMAX*ULP / REAL( N1 )
555 RMAGN( 3 ) = SAFMIN*ULPINV*REAL( N1 )
557.NE.
IF( NSIZES1 ) THEN
558 MTYPES = MIN( MAXTYP, NTYPES )
560 MTYPES = MIN( MAXTYP+1, NTYPES )
565 DO 180 JTYPE = 1, MTYPES
566.NOT.
IF( DOTYPE( JTYPE ) )
574 IOLDSD( J ) = ISEED( J )
604.GT.
IF( MTYPESMAXTYP )
607.LT.
IF( KCLASS( JTYPE )3 ) THEN
611.EQ.
IF( ABS( KATYPE( JTYPE ) )3 ) THEN
612 IN = 2*( ( N-1 ) / 2 ) + 1
614 $ CALL CLASET( 'full
', N, N, CZERO, CZERO, A, LDA )
618 CALL CLATM4( KATYPE( JTYPE ), IN, KZ1( KAZERO( JTYPE ) ),
619 $ KZ2( KAZERO( JTYPE ) ), LASIGN( JTYPE ),
620 $ RMAGN( KAMAGN( JTYPE ) ), ULP,
621 $ RMAGN( KTRIAN( JTYPE )*KAMAGN( JTYPE ) ), 2,
623 IADD = KADD( KAZERO( JTYPE ) )
624.GT..AND..LE.
IF( IADD0 IADDN )
625 $ A( IADD, IADD ) = RMAGN( KAMAGN( JTYPE ) )
629.EQ.
IF( ABS( KBTYPE( JTYPE ) )3 ) THEN
630 IN = 2*( ( N-1 ) / 2 ) + 1
632 $ CALL CLASET( 'full
', N, N, CZERO, CZERO, B, LDA )
636 CALL CLATM4( KBTYPE( JTYPE ), IN, KZ1( KBZERO( JTYPE ) ),
637 $ KZ2( KBZERO( JTYPE ) ), LBSIGN( JTYPE ),
638 $ RMAGN( KBMAGN( JTYPE ) ), ONE,
639 $ RMAGN( KTRIAN( JTYPE )*KBMAGN( JTYPE ) ), 2,
641 IADD = KADD( KBZERO( JTYPE ) )
642.NE..AND..LE.
IF( IADD0 IADDN )
643 $ B( IADD, IADD ) = RMAGN( KBMAGN( JTYPE ) )
645.EQ..AND..GT.
IF( KCLASS( JTYPE )2 N0 ) THEN
654 Q( JR, JC ) = CLARND( 3, ISEED )
655 Z( JR, JC ) = CLARND( 3, ISEED )
657 CALL CLARFG( N+1-JC, Q( JC, JC ), Q( JC+1, JC ), 1,
659 WORK( 2*N+JC ) = SIGN( ONE, REAL( Q( JC, JC ) ) )
661 CALL CLARFG( N+1-JC, Z( JC, JC ), Z( JC+1, JC ), 1,
663 WORK( 3*N+JC ) = SIGN( ONE, REAL( Z( JC, JC ) ) )
666 CTEMP = CLARND( 3, ISEED )
669 WORK( 3*N ) = CTEMP / ABS( CTEMP )
670 CTEMP = CLARND( 3, ISEED )
673 WORK( 4*N ) = CTEMP / ABS( CTEMP )
679 A( JR, JC ) = WORK( 2*N+JR )*
680 $ CONJG( WORK( 3*N+JC ) )*
682 B( JR, JC ) = WORK( 2*N+JR )*
683 $ CONJG( WORK( 3*N+JC ) )*
687 CALL CUNM2R( 'l
', 'n
', N, N, N-1, Q, LDQ, WORK, A,
688 $ LDA, WORK( 2*N+1 ), IINFO )
691 CALL CUNM2R( 'r
', 'c
', N, N, N-1, Z, LDQ, WORK( N+1 ),
692 $ A, LDA, WORK( 2*N+1 ), IINFO )
695 CALL CUNM2R( 'l
', 'n
', N, N, N-1, Q, LDQ, WORK, B,
696 $ LDA, WORK( 2*N+1 ), IINFO )
699 CALL CUNM2R( 'r
', 'c
', N, N, N-1, Z, LDQ, WORK( N+1 ),
700 $ B, LDA, WORK( 2*N+1 ), IINFO )
710 A( JR, JC ) = RMAGN( KAMAGN( JTYPE ) )*
712 B( JR, JC ) = RMAGN( KBMAGN( JTYPE ) )*
720.NE.
IF( IINFO0 ) THEN
721 WRITE( NOUNIT, FMT = 9999 )'generator
', IINFO, N, JTYPE,
736.EQ.
IF( ISORT0 ) THEN
746 CALL XLAENV( 12, 10 )
747 CALL XLAENV( 13, 12 )
748 CALL XLAENV( 14, 13 )
750 CALL XLAENV( 17, 10 )
754 CALL CLACPY( 'full
', N, N, A, LDA, S, LDA )
755 CALL CLACPY( 'full
', N, N, B, LDA, T, LDA )
756 NTEST = 1 + RSUB + ISORT
757 RESULT( 1+RSUB+ISORT ) = ULPINV
758 CALL CGGES3( 'v
', 'v
', SORT, CLCTES, N, S, LDA, T, LDA,
759 $ SDIM, ALPHA, BETA, Q, LDQ, Z, LDQ, WORK,
760 $ LWORK, RWORK, BWORK, IINFO )
761.NE..AND..NE.
IF( IINFO0 IINFON+2 ) THEN
762 RESULT( 1+RSUB+ISORT ) = ULPINV
763 WRITE( NOUNIT, FMT = 9999 )'cgges3', IINFO, N, JTYPE,
773.EQ.
IF( ISORT0 ) THEN
774 CALL CGET51( 1, N, A, LDA, S, LDA, Q, LDQ, Z, LDQ,
775 $ WORK, RWORK, RESULT( 1 ) )
776 CALL CGET51( 1, N, B, LDA, T, LDA, Q, LDQ, Z, LDQ,
777 $ WORK, RWORK, RESULT( 2 ) )
779 CALL CGET54( N, A, LDA, B, LDA, S, LDA, T, LDA, Q,
780 $ LDQ, Z, LDQ, WORK, RESULT( 2+RSUB ) )
783 CALL CGET51( 3, N, B, LDA, T, LDA, Q, LDQ, Q, LDQ, WORK,
784 $ RWORK, RESULT( 3+RSUB ) )
785 CALL CGET51( 3, N, B, LDA, T, LDA, Z, LDQ, Z, LDQ, WORK,
786 $ RWORK, RESULT( 4+RSUB ) )
797 TEMP2 = ( ABS1( ALPHA( J )-S( J, J ) ) /
798 $ MAX( SAFMIN, ABS1( ALPHA( J ) ), ABS1( S( J,
799 $ J ) ) )+ABS1( BETA( J )-T( J, J ) ) /
800 $ MAX( SAFMIN, ABS1( BETA( J ) ), ABS1( T( J,
804.NE.
IF( S( J+1, J )ZERO ) THEN
806 RESULT( 5+RSUB ) = ULPINV
810.NE.
IF( S( J, J-1 )ZERO ) THEN
812 RESULT( 5+RSUB ) = ULPINV
815 TEMP1 = MAX( TEMP1, TEMP2 )
817 WRITE( NOUNIT, FMT = 9998 )J, N, JTYPE, IOLDSD
820 RESULT( 6+RSUB ) = TEMP1
822.GE.
IF( ISORT1 ) THEN
830 IF( CLCTES( ALPHA( I ), BETA( I ) ) )
831 $ KNTEIG = KNTEIG + 1
834 $ RESULT( 13 ) = ULPINV
843 NTESTT = NTESTT + NTEST
848.GE.
IF( RESULT( JR )THRESH ) THEN
853.EQ.
IF( NERRS0 ) THEN
854 WRITE( NOUNIT, FMT = 9997 )'cgs
'
858 WRITE( NOUNIT, FMT = 9996 )
859 WRITE( NOUNIT, FMT = 9995 )
860 WRITE( NOUNIT, FMT = 9994 )'unitary
'
864 WRITE( NOUNIT, FMT = 9993 )'unitary
', '''',
865 $ 'transpose
', ( '''', J = 1, 8 )
869.LT.
IF( RESULT( JR )10000.0 ) THEN
870 WRITE( NOUNIT, FMT = 9992 )N, JTYPE, IOLDSD, JR,
873 WRITE( NOUNIT, FMT = 9991 )N, JTYPE, IOLDSD, JR,
884 CALL ALASVM( 'cgs
', NOUNIT, NERRS, NTESTT, 0 )
890 9999 FORMAT( ' cdrges3:
', A, ' returned info=
', I6, '.
', / 9X, 'n=
',
891 $ I6, ', jtype=
', I6, ', iseed=(
', 4( I4, ',
' ), I5, ')
' )
893 9998 FORMAT( ' cdrges3: s not in schur form at eigenvalue
', I6, '.
',
894 $ / 9X, 'n=
', I6, ', jtype=
', I6, ', iseed=(
', 3( I5, ',
' ),
897 9997 FORMAT( / 1X, A3, ' --
Complex Generalized Schur from problem
',
900 9996 FORMAT( ' Matrix types (see CDRGES3 for details):
' )
902 9995 FORMAT( ' Special Matrices:
', 23X,
903 $ '(J'
'=transposed Jordan block)',
904 $ /
' 1=(0,0) 2=(I,0) 3=(0,I) 4=(I,I) 5=(J'',J'') ',
905 $
'6=(diag(J'',I), diag(I,J''))', /
' Diagonal Matrices: ( ',
906 $
'D=diag(0,1,2,...) )', /
' 7=(D,I) 9=(large*D, small*I',
907 $
') 11=(large*I, small*D) 13=(large*D, large*I)', /
908 $
' 8=(I,D) 10=(small*D, large*I) 12=(small*I, large*D) ',
909 $
' 14=(small*D, small*I)', / ' 15=(d, reversed d)
' )
910 9994 FORMAT( ' matrices rotated by random
', A, ' matrices u, v:
',
911 $ / ' 16=transposed jordan blocks 19=geometric
',
912 $ 'alpha, beta=0,1
', / ' 17=arithm. alpha&beta
',
913 $ ' 20=arithmetic alpha, beta=0,1', /
' 18=clustered ',
914 $
'alpha, beta=0,1 21=random alpha, beta=0,1',
915 $ /
' Large & Small Matrices:', /
' 22=(large, small) ',
916 $
'23=(small,large) 24=(small,small) 25=(large,large)',
917 $ /
' 26=random O(1) matrices.' )
919 9993
FORMAT( /
' Tests performed: (S is Schur, T is triangular, ',
920 $
'Q and Z are ', a,
',', / 19x,
921 $
'l and r are the appropriate left and right', / 19x,
922 $
'eigenvectors, resp., a is alpha, b is beta, and', / 19x, a,
923 $
' means ', a,
'.)', /
' Without ordering: ',
924 $ /
' 1 = | A - Q S Z', a,
925 $
' | / ( |A| n ulp ) 2 = | B - Q T Z', a,
926 $
' | / ( |B| n ulp )', /
' 3 = | I - QQ', a,
927 $
' | / ( n ulp ) 4 = | I - ZZ', a,
928 $
' | / ( n ulp )', /
' 5 = A is in Schur form S',
929 $ /
' 6 = difference between (alpha,beta)',
930 $
' and diagonals of (S,T)', /
' With ordering: ',
931 $ /
' 7 = | (A,B) - Q (S,T) Z', a,
' | / ( |(A,B)| n ulp )',
932 $ /
' 8 = | I - QQ', a,
933 $
' | / ( n ulp ) 9 = | I - ZZ', a,
934 $ ' | / ( n ulp )
', / ' 10 = a is in schur form s
',
935 $ / ' 11 = difference between(alpha,beta) and diagonals
',
936 $ ' of(s,t)
', / ' 12 = sdim is
the correct number of
',
937 $ 'selected eigenvalues
', / )
938 9992 FORMAT( ' matrix order=', i5,
', type=', i2,
', seed=',
939 $ 4( i4,
',' ),
' result ', i2,
' is', 0p, f8.2 )
940 9991
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
941 $ 4( i4,
',' ),
' result ', i2,
' is', 1p, e10.3 )
subroutine cgges3(jobvsl, jobvsr, sort, selctg, n, a, lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr, ldvsr, work, lwork, rwork, bwork, info)
CGGES3 computes the eigenvalues, the Schur form, and, optionally, the matrix of Schur vectors for GE ...