378 SUBROUTINE zdrges3( 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, NOUNIT, NSIZES, NTYPES
389 DOUBLE PRECISION THRESH
392 LOGICAL BWORK( * ), DOTYPE( * )
393 INTEGER ISEED( 4 ), NN( * )
394 DOUBLE PRECISION RESULT( 13 ), RWORK( * )
395 COMPLEX*16 A( LDA, * ), ALPHA( * ), B( LDA, * ),
396 $ beta( * ), q( ldq, * ), s( lda, * ),
397 $ t( lda, * ), work( * ), z( ldq, * )
403 DOUBLE PRECISION ZERO, ONE
404 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
405 COMPLEX*16 CZERO, CONE
406 parameter( czero = ( 0.0d+0, 0.0d+0 ),
407 $ cone = ( 1.0d+0, 0.0d+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 DOUBLE PRECISION SAFMAX, SAFMIN, TEMP1, TEMP2, ULP, ULPINV
422 LOGICAL LASIGN( MAXTYP ), LBSIGN( MAXTYP )
423 INTEGER IOLDSD( 4 ), KADD( 6 ), KAMAGN( MAXTYP ),
424 $ KATYPE( MAXTYP ), KAZERO( MAXTYP ),
425 $ kbmagn( maxtyp ), kbtype( maxtyp ),
426 $ kbzero( maxtyp ), kclass( maxtyp ),
427 $ ktrian( maxtyp ), kz1( 6 ), kz2( 6 )
428 DOUBLE PRECISION RMAGN( 0: 3 )
433 DOUBLE PRECISION DLAMCH
435 EXTERNAL zlctes, ilaenv, dlamch, zlarnd
442 INTRINSIC abs, dble, dconjg, dimag,
max,
min, sign
445 DOUBLE PRECISION ABS1
448 abs1( x ) = abs( dble( x ) ) + abs( dimag( 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 /
454 DATA kadd / 0, 0, 0, 0, 3, 2 /
455 DATA katype / 0, 1, 0, 1, 2, 3, 4, 1, 4, 4, 1, 1, 4,
456 $ 4, 4, 2, 4, 5, 8, 7, 9, 4*4, 0 /
457 DATA kbtype / 0, 0, 1, 1, 2, -3, 1, 4, 1, 1, 4, 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,
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,
'ZGEQRF',
' ', nmax, nmax, -1, -1 ),
514 $ ilaenv( 1,
'ZUNMQR',
'LC', nmax, nmax, nmax, -1 ),
515 $ ilaenv( 1,
'ZUNGQR',
' ', nmax, nmax, nmax, -1 ) )
516 maxwrk =
max( nmax+nmax*nb, 3*nmax*nmax )
520 IF( lwork.LT.minwrk )
524 CALL xerbla(
'ZDRGES3', -info )
530 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
533 ulp = dlamch(
'Precision' )
534 safmin = dlamch( 'safe minimum
' )
535 SAFMIN = SAFMIN / ULP
536 SAFMAX = ONE / SAFMIN
537 CALL DLABAD( SAFMIN, SAFMAX )
551 DO 190 JSIZE = 1, NSIZES
554 RMAGN( 2 ) = SAFMAX*ULP / DBLE( N1 )
555 RMAGN( 3 ) = SAFMIN*ULPINV*DBLE( 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 ZLASET( 'full
', N, N, CZERO, CZERO, A, LDA )
618 CALL ZLATM4( 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 ZLASET( 'full
', N, N, CZERO, CZERO, B, LDA )
636 CALL ZLATM4( 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 ) = ZLARND( 3, ISEED )
655 Z( JR, JC ) = ZLARND( 3, ISEED )
657 CALL ZLARFG( N+1-JC, Q( JC, JC ), Q( JC+1, JC ), 1,
659 WORK( 2*N+JC ) = SIGN( ONE, DBLE( Q( JC, JC ) ) )
661 CALL ZLARFG( N+1-JC, Z( JC, JC ), Z( JC+1, JC ), 1,
663 WORK( 3*N+JC ) = SIGN( ONE, DBLE( Z( JC, JC ) ) )
666 CTEMP = ZLARND( 3, ISEED )
669 WORK( 3*N ) = CTEMP / ABS( CTEMP )
670 CTEMP = ZLARND( 3, ISEED )
673 WORK( 4*N ) = CTEMP / ABS( CTEMP )
679 A( JR, JC ) = WORK( 2*N+JR )*
680 $ DCONJG( WORK( 3*N+JC ) )*
682 B( JR, JC ) = WORK( 2*N+JR )*
683 $ DCONJG( WORK( 3*N+JC ) )*
687 CALL ZUNM2R( 'l
', 'n
', N, N, N-1, Q, LDQ, WORK, A,
688 $ LDA, WORK( 2*N+1 ), IINFO )
691 CALL ZUNM2R( 'r
', 'c
', N, N, N-1, Z, LDQ, WORK( N+1 ),
692 $ A, LDA, WORK( 2*N+1 ), IINFO )
695 CALL ZUNM2R( 'l
', 'n
', N, N, N-1, Q, LDQ, WORK, B,
696 $ LDA, WORK( 2*N+1 ), IINFO )
699 CALL ZUNM2R( '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
754 CALL zlacpy(
'Full', n, n, a, lda, s, lda )
755 CALL zlacpy(
'Full', n, n, b, lda, t, lda )
756 ntest = 1 + rsub + isort
757 result( 1+rsub+isort ) = ulpinv
758 CALL zgges3(
'V',
'V', sort, zlctes, n, s, lda, t, lda,
759 $ sdim, alpha, beta, q, ldq, z, ldq, work,
760 $ lwork, rwork, bwork, iinfo )
761 IF( iinfo.NE.0 .AND. iinfo.NE.n+2 )
THEN
762 result( 1+rsub+isort ) = ulpinv
763 WRITE( nounit, fmt = 9999 )
'ZGGES3', iinfo, n, jtype,
773 IF( isort.EQ.0 )
THEN
774 CALL zget51( 1, n, a, lda, s, lda, q, ldq, z, ldq,
775 $ work, rwork, result( 1 ) )
776 CALL zget51( 1, n, b, lda, t, lda, q, ldq, z, ldq,
777 $ work, rwork, result( 2 ) )
779 CALL zget54( n, a, lda, b, lda, s, lda, t, lda, q,
780 $ ldq, z, ldq, work, result( 2+rsub ) )
783 CALL zget51( 3, n, b, lda, t, lda, q, ldq, q, ldq, work,
784 $ rwork, result( 3+rsub ) )
785 CALL zget51( 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 IF( s( j+1, j ).NE.zero )
THEN
806 result( 5+rsub ) = ulpinv
810 IF( s( j, j-1 ).NE.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 IF( isort.GE.1 )
THEN
830 IF( zlctes( alpha( i ), beta( i ) ) )
831 $ knteig = knteig + 1
834 $ result( 13 ) = ulpinv
843 ntestt = ntestt + ntest
848 IF( result( jr ).GE.thresh )
THEN
853 IF( nerrs.EQ.0 )
THEN
854 WRITE( nounit, fmt = 9997 )
'ZGS'
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 IF( result( jr ).LT.10000.0d0 )
THEN
870 WRITE( nounit, fmt = 9992 )n, jtype, ioldsd, jr,
873 WRITE( nounit, fmt = 9991 )n, jtype, ioldsd, jr,
884 CALL alasvm(
'ZGS', nounit, nerrs, ntestt, 0 )
890 9999
FORMAT(
' ZDRGES3: ', a,
' returned INFO=', i6,
'.', / 9x,
'N=',
891 $ i6,
', JTYPE=', i6,
', ISEED=(', 4( i4,
',' ), i5,
')' )
893 9998
FORMAT(
' ZDRGES3: 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 ZDRGES3 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, d10.3 )