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, , NOUNIT, NSIZES, NTYPES
388 DOUBLE PRECISION THRESH
391 LOGICAL BWORK( * ), DOTYPE( * )
392 INTEGER ISEED( 4 ), NN( * )
393 DOUBLE PRECISION RESULT( 13 ), RWORK( * )
394 COMPLEX*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, mtypes, n, n1,
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( MAXTYP ),
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*
471 $ 2*.true., 2*.false.,
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
', ' ', 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
',
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
', / 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 )