378 SUBROUTINE zdrges( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
379 $ NOUNIT, A, LDA, B, S, T, Q, LDQ, Z, ALPHA,
380 $ BETA, WORK, LWORK, RWORK, RESULT, BWORK, INFO )
387 INTEGER INFO, LDA, LDQ, LWORK, , NSIZES, NTYPES
388 DOUBLE PRECISION THRESH
391 LOGICAL BWORK( * ), DOTYPE( * )
392 INTEGER ISEED( 4 ), NN( * )
394COMPLEX*16 A( LDA, * ), ALPHA( * ), B( LDA, * ),
395 $ beta( * ), q( ldq, * ), s( lda, * ),
396 $ t( lda, * ), work( * ), z( ldq, * )
402 DOUBLE PRECISION ZERO, ONE
403 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
404 COMPLEX*16 CZERO, CONE
405 parameter( czero = ( 0.0d+0, 0.0d+0 ),
406 $ cone = ( 1.0d+0, 0.0d+0 ) )
408 PARAMETER ( MAXTYP = 26 )
411 LOGICAL BADNN, ILABAD
413 INTEGER I, IADD, IINFO, IN, ISORT, J, JC, JR, JSIZE,
414 $ jtype, knteig, maxwrk, minwrk
415 $ nb, nerrs, nmats, nmax, ntest, ntestt, rsub,
417 DOUBLE PRECISION SAFMAX, SAFMIN, TEMP1, TEMP2, ULP, ULPINV
421 LOGICAL LASIGN( MAXTYP ), LBSIGN( MAXTYP )
422 INTEGER IOLDSD( 4 ), KADD( 6 ), KAMAGN( ),
423 $ katype( maxtyp ), kazero( maxtyp ),
424 $ kbmagn( maxtyp ), kbtype( maxtyp ),
425 $ kbzero( maxtyp ), kclass( maxtyp ),
426 $ ktrian( maxtyp ), kz1( 6 ), kz2( 6 )
427 DOUBLE PRECISION RMAGN( 0: 3 )
432 DOUBLE PRECISION DLAMCH
434 EXTERNAL zlctes, ilaenv, dlamch, zlarnd
441 INTRINSIC abs, dble, dconjg, dimag,
max,
min, sign
444 DOUBLE PRECISION ABS1
447 abs1( x ) = abs( dble( x ) ) + abs( dimag( x ) )
450 DATA kclass / 15*1, 10*2, 1*3 /
451 DATA kz1 / 0, 1, 2, 1, 3, 3 /
452 DATA kz2 / 0, 0, 1, 2, 1, 1 /
453 DATA kadd / 0, 0, 0, 0, 3, 2 /
454 DATA katype / 0, 1, 0, 1, 2, 3, 4, 1, 4, 4, 1, 1, 4,
455 $ 4, 4, 2, 4, 5, 8, 7, 9, 4*4, 0 /
456 DATA kbtype / 0, 0, 1, 1, 2, -3, 1, 4, 1, 1, 4, 4,
457 $ 1, 1, -4, 2, -4, 8*8, 0 /
458 DATA kazero / 6*1, 2, 1, 2*2, 2*1, 2*2, 3, 1, 3,
460 DATA kbzero / 6*1, 1, 2, 2*1, 2*2, 2*1, 4, 1, 4,
462 DATA kamagn / 8*1, 2, 3, 2, 3, 2, 3, 7*1, 2, 3, 3,
464 DATA kbmagn / 8*1, 3, 2, 3, 2, 2, 3, 7*1, 3, 2, 3,
466 DATA ktrian / 16*0, 10*1 /
467 DATA lasign / 6*.false., .true., .false., 2*.true.,
468 $ 2*.false., 3*.true., .false., .true.,
469 $ 3*.false., 5*.true., .false. /
470 DATA lbsign / 7*.false., .true., 2*.false.,
471 $ 2*.true., 2*.false., .true., .false., .true.,
483 nmax =
max( nmax, nn( j ) )
488 IF( nsizes.LT.0 )
THEN
490 ELSE IF( badnn )
THEN
492 ELSE IF( ntypes.LT.0 )
THEN
494 ELSE IF( thresh.LT.zero )
THEN
496 ELSE IF( lda.LE.1 .OR. lda.LT.nmax )
THEN
498 ELSE IF( ldq.LE.1 .OR. ldq.LT.nmax )
THEN
510 IF( info.EQ.0 .AND. lwork.GE.1 )
THEN
512 nb =
max( 1, ilaenv( 1,
'ZGEQRF',
' ', nmax, nmax, -1, -1 ),
513 $ ilaenv( 1,
'ZUNMQR',
'LC', nmax, nmax, nmax, -1 ),
514 $ ilaenv( 1, '
zungqr', ' ', NMAX, NMAX, NMAX, -1 ) )
515 MAXWRK = MAX( NMAX+NMAX*NB, 3*NMAX*NMAX )
519.LT.
IF( LWORKMINWRK )
523 CALL XERBLA( 'zdrges', -INFO )
529.EQ..OR..EQ.
IF( NSIZES0 NTYPES0 )
532 ULP = DLAMCH( 'precision
' )
533 SAFMIN = DLAMCH( 'safe minimum
' )
534 SAFMIN = SAFMIN / ULP
535 SAFMAX = ONE / SAFMIN
536 CALL DLABAD( SAFMIN, SAFMAX )
550 DO 190 JSIZE = 1, NSIZES
553 RMAGN( 2 ) = SAFMAX*ULP / DBLE( N1 )
554 RMAGN( 3 ) = SAFMIN*ULPINV*DBLE( N1 )
556.NE.
IF( NSIZES1 ) THEN
557 MTYPES = MIN( MAXTYP, NTYPES )
559 MTYPES = MIN( MAXTYP+1, NTYPES )
564 DO 180 JTYPE = 1, MTYPES
565.NOT.
IF( DOTYPE( JTYPE ) )
573 IOLDSD( J ) = ISEED( J )
603.GT.
IF( MTYPESMAXTYP )
606.LT.
IF( KCLASS( JTYPE )3 ) THEN
610.EQ.
IF( ABS( KATYPE( JTYPE ) )3 ) THEN
611 IN = 2*( ( N-1 ) / 2 ) + 1
613 $ CALL ZLASET( 'full
', N, N, CZERO, CZERO, A, LDA )
617 CALL ZLATM4( KATYPE( JTYPE ), IN, KZ1( KAZERO( JTYPE ) ),
618 $ KZ2( KAZERO( JTYPE ) ), LASIGN( JTYPE ),
619 $ RMAGN( KAMAGN( JTYPE ) ), ULP,
620 $ RMAGN( KTRIAN( JTYPE )*KAMAGN( JTYPE ) ), 2,
622 IADD = KADD( KAZERO( JTYPE ) )
623.GT..AND..LE.
IF( IADD0 IADDN )
624 $ A( IADD, IADD ) = RMAGN( KAMAGN( JTYPE ) )
628.EQ.
IF( ABS( KBTYPE( JTYPE ) )3 ) THEN
629 IN = 2*( ( N-1 ) / 2 ) + 1
631 $ CALL ZLASET( 'full
', N, N, CZERO, CZERO, B, LDA )
635 CALL ZLATM4( KBTYPE( JTYPE ), IN, KZ1( KBZERO( JTYPE ) ),
636 $ KZ2( KBZERO( JTYPE ) ), LBSIGN( JTYPE ),
637 $ RMAGN( KBMAGN( JTYPE ) ), ONE,
638 $ RMAGN( KTRIAN( JTYPE )*KBMAGN( JTYPE ) ), 2,
640 IADD = KADD( KBZERO( JTYPE ) )
641.NE..AND..LE.
IF( IADD0 IADDN )
642 $ B( IADD, IADD ) = RMAGN( KBMAGN( JTYPE ) )
644.EQ..AND..GT.
IF( KCLASS( JTYPE )2 N0 ) THEN
653 Q( JR, JC ) = ZLARND( 3, ISEED )
654 Z( JR, JC ) = ZLARND( 3, ISEED )
656 CALL ZLARFG( N+1-JC, Q( JC, JC ), Q( JC+1, JC ), 1,
658 WORK( 2*N+JC ) = SIGN( ONE, DBLE( Q( JC, JC ) ) )
660 CALL ZLARFG( N+1-JC, Z( JC, JC ), Z( JC+1, JC ), 1,
662 WORK( 3*N+JC ) = SIGN( ONE, DBLE( Z( JC, JC ) ) )
665 CTEMP = ZLARND( 3, ISEED )
668 WORK( 3*N ) = CTEMP / ABS( CTEMP )
669 CTEMP = ZLARND( 3, ISEED )
672 WORK( 4*N ) = CTEMP / ABS( CTEMP )
678 A( JR, JC ) = WORK( 2*N+JR )*
679 $ DCONJG( WORK( 3*N+JC ) )*
681 B( JR, JC ) = WORK( 2*N+JR )*
682 $ DCONJG( WORK( 3*N+JC ) )*
686 CALL ZUNM2R( 'l
', 'n
', N, N, N-1, Q, LDQ, WORK, A,
687 $ LDA, WORK( 2*N+1 ), IINFO )
690 CALL ZUNM2R( 'r
', 'c
', N, N, N-1, Z, LDQ, WORK( N+1 ),
691 $ A, LDA, WORK( 2*N+1 ), IINFO )
694 CALL ZUNM2R( 'l
', 'n
', N, N, N-1, Q, LDQ, WORK, B,
695 $ LDA, WORK( 2*N+1 ), IINFO )
698 CALL ZUNM2R( 'r
', 'c
', N, N, N-1, Z, LDQ, WORK( N+1 ),
699 $ B, LDA, WORK( 2*N+1 ), IINFO )
709 A( JR, JC ) = RMAGN( KAMAGN( JTYPE ) )*
711 B( JR, JC ) = RMAGN( KBMAGN( JTYPE ) )*
719.NE.
IF( IINFO0 ) THEN
720 WRITE( NOUNIT, FMT = 9999 )'generator
', IINFO, N, JTYPE,
735.EQ.
IF( ISORT0 ) THEN
745 CALL ZLACPY( 'full
', N, N, A, LDA, S, LDA )
746 CALL ZLACPY( 'full
', N, N, B, LDA, T, LDA )
747 NTEST = 1 + RSUB + ISORT
748 RESULT( 1+RSUB+ISORT ) = ULPINV
749 CALL ZGGES( 'v
', 'v
', SORT, ZLCTES, N, S, LDA, T, LDA,
750 $ SDIM, ALPHA, BETA, Q, LDQ, Z, LDQ, WORK,
751 $ LWORK, RWORK, BWORK, IINFO )
752.NE..AND..NE.
IF( IINFO0 IINFON+2 ) THEN
753 RESULT( 1+RSUB+ISORT ) = ULPINV
754 WRITE( NOUNIT, FMT = 9999 )'zgges', IINFO, N, JTYPE,
764.EQ.
IF( ISORT0 ) THEN
765 CALL ZGET51( 1, N, A, LDA, S, LDA, Q, LDQ, Z, LDQ,
766 $ WORK, RWORK, RESULT( 1 ) )
767 CALL ZGET51( 1, N, B, LDA, T, LDA, Q, LDQ, Z, LDQ,
768 $ WORK, RWORK, RESULT( 2 ) )
770 CALL ZGET54( N, A, LDA, B, LDA, S, LDA, T, LDA, Q,
771 $ LDQ, Z, LDQ, WORK, RESULT( 2+RSUB ) )
774 CALL ZGET51( 3, N, B, LDA, T, LDA, Q, LDQ, Q, LDQ, WORK,
775 $ RWORK, RESULT( 3+RSUB ) )
776 CALL ZGET51( 3, N, B, LDA, T, LDA, Z, LDQ, Z, LDQ, WORK,
777 $ RWORK, RESULT( 4+RSUB ) )
788 TEMP2 = ( ABS1( ALPHA( J )-S( J, J ) ) /
789 $ MAX( SAFMIN, ABS1( ALPHA( J ) ), ABS1( S( J,
790 $ J ) ) )+ABS1( BETA( J )-T( J, J ) ) /
791 $ MAX( SAFMIN, ABS1( BETA( J ) ), ABS1( T( J,
795.NE.
IF( S( J+1, J )ZERO ) THEN
797 RESULT( 5+RSUB ) = ULPINV
801.NE.
IF( S( J, J-1 )ZERO ) THEN
803 RESULT( 5+RSUB ) = ULPINV
806 TEMP1 = MAX( TEMP1, TEMP2 )
808 WRITE( NOUNIT, FMT = 9998 )J, N, JTYPE, IOLDSD
811 RESULT( 6+RSUB ) = TEMP1
813.GE.
IF( ISORT1 ) THEN
821 IF( ZLCTES( ALPHA( I ), BETA( I ) ) )
822 $ KNTEIG = KNTEIG + 1
825 $ RESULT( 13 ) = ULPINV
834 NTESTT = NTESTT + NTEST
839.GE.
IF( RESULT( JR )THRESH ) THEN
844.EQ.
IF( NERRS0 ) THEN
845 WRITE( NOUNIT, FMT = 9997 )'zgs
'
849 WRITE( NOUNIT, FMT = 9996 )
850 WRITE( NOUNIT, FMT = 9995 )
851 WRITE( NOUNIT, FMT = 9994 )'unitary
'
855 WRITE( NOUNIT, FMT = 9993 )'unitary
', '''',
856 $ 'transpose
', ( '''', J = 1, 8 )
860.LT.
IF( RESULT( JR )10000.0D0 ) THEN
861 WRITE( NOUNIT, FMT = 9992 )N, JTYPE, IOLDSD, JR,
864 WRITE( NOUNIT, FMT = 9991 )N, JTYPE, IOLDSD, JR,
875 CALL ALASVM( 'zgs
', NOUNIT, NERRS, NTESTT, 0 )
881 9999 FORMAT( ' zdrges:
', A, ' returned info=', i6,
'.', / 9x,
'N=',
882 $ i6,
', JTYPE=', i6,
', ISEED=(', 4( i4,
',' ), i5,
')' )
884 9998
FORMAT(
' ZDRGES: S not in Schur form at eigenvalue ', i6,
'.',
885 $ / 9x,
'N=', i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ),
888 9997
FORMAT( / 1x, a3,
' -- Complex Generalized Schur from problem ',
891 9996
FORMAT(
' Matrix types (see ZDRGES for details): ' )
893 9995
FORMAT(
' Special Matrices:', 23x,
894 $
'(J''=transposed Jordan block)',
895 $ /
' 1=(0,0) 2=(I,0) 3=(0,I) 4=(I,I) 5=(J'',J'') ',
896 $
'6=(diag(J'',I), diag(I,J''))', /
' Diagonal Matrices: ( ',
897 $
'D=diag(0,1,2,...) )', /
' 7=(D,I) 9=(large*D, small*I',
898 $
') 11=(large*I, small*D) 13=(large*D, large*I)', /
899 $
' 8=(I,D) 10=(small*D, large*I) 12=(small*I, large*D) ',
900 $
' 14=(small*D, small*I)', /
' 15=(D, reversed D)' )
901 9994
FORMAT(
' Matrices Rotated by Random ', a,
' Matrices U, V:',
902 $ /
' 16=Transposed Jordan Blocks 19=geometric ',
903 $
'alpha, beta=0,1', /
' 17=arithm. alpha&beta ',
904 $
' 20=arithmetic alpha, beta=0,1', /
' 18=clustered ',
905 $
'alpha, beta=0,1 21=random alpha, beta=0,1',
906 $ /
' Large & Small Matrices:', /
' 22=(large, small) ',
907 $
'23=(small,large) 24=(small,small) 25=(large,large)',
908 $ /
' 26=random O(1) matrices.' )
910 9993
FORMAT( /
' Tests performed: (S is Schur, T is triangular, ',
911 $
'Q and Z are ', a,
',', / 19x,
912 $
'l and r are the appropriate left and right', / 19x,
913 $
'eigenvectors, resp., a is alpha, b is beta, and', / 19x, a,
914 $
' means ', a,
'.)', /
' Without ordering: ',
915 $ /
' 1 = | A - Q S Z', a,
916 $
' | / ( |A| n ulp ) 2 = | B - Q T Z', a,
917 $
' | / ( |B| n ulp )', /
' 3 = | I - QQ', a,
918 $
' | / ( n ulp ) 4 = | I - ZZ', a,
919 $
' | / ( n ulp )', /
' 5 = A is in Schur form S',
920 $ /
' 6 = difference between (alpha,beta)',
921 $
' and diagonals of (S,T)', /
' With ordering: ',
922 $ /
' 7 = | (A,B) - Q (S,T) Z', a,
' | / ( |(A,B)| n ulp )',
923 $ / ' 8 = | i - qq
', A,
924 $ ' | / ( n ulp ) 9 = | i - zz
', A,
925 $ ' | / ( n ulp )
', / ' 10 = a is in schur form s
',
926 $ / ' 11 = difference between(alpha,beta) and diagonals
',
927 $ ' of(s,t)
', / ' 12 = sdim is
the correct number of
',
928 $ 'selected eigenvalues
', / )
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, D10.3 )
subroutine zgges(jobvsl, jobvsr, sort, selctg, n, a, lda, b, ldb, sdim, alpha, beta, vsl, ldvsl, vsr, ldvsr, work, lwork, rwork, bwork, info)
ZGGES computes the eigenvalues, the Schur form, and, optionally, the matrix of Schur vectors for GE m...