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, 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,
'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 IF( nsizes.NE.1 )
THEN
558 mtypes = min( maxtyp, ntypes )
560 mtypes = min( maxtyp+1, ntypes )
565 DO 180 jtype = 1, mtypes
566 IF( .NOT.dotype( jtype ) )
574 ioldsd( j ) = iseed( j )
604 IF( mtypes.GT.maxtyp )
607 IF( kclass( jtype ).LT.3 )
THEN
611 IF( abs( katype( jtype ) ).EQ.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 IF( iadd.GT.0 .AND. iadd.LE.n )
625 $ a( iadd, iadd ) = rmagn( kamagn( jtype ) )
629 IF( abs( kbtype( jtype ) ).EQ.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 IF( iadd.NE.0 .AND. iadd.LE.n )
643 $ b( iadd, iadd ) = rmagn( kbmagn( jtype ) )
645 IF( kclass( jtype ).EQ.2 .AND. n.GT.0 )
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 IF( iinfo.NE.0 )
THEN
721 WRITE( nounit, fmt = 9999 )
'Generator', iinfo, n, jtype,
736 IF( isort.EQ.0 )
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 )
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine alasvm(TYPE, NOUT, NFAIL, NRUN, NERRS)
ALASVM
subroutine xlaenv(ISPEC, NVALUE)
XLAENV
subroutine zlatm4(ITYPE, N, NZ1, NZ2, RSIGN, AMAGN, RCOND, TRIANG, IDIST, ISEED, A, LDA)
ZLATM4
subroutine zget51(ITYPE, N, A, LDA, B, LDB, U, LDU, V, LDV, WORK, RWORK, RESULT)
ZGET51
subroutine zget54(N, A, LDA, B, LDB, S, LDS, T, LDT, U, LDU, V, LDV, WORK, RESULT)
ZGET54
subroutine zdrges3(NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH, NOUNIT, A, LDA, B, S, T, Q, LDQ, Z, ALPHA, BETA, WORK, LWORK, RWORK, RESULT, BWORK, INFO)
ZDRGES3
subroutine zgges3(JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B, LDB, SDIM, ALPHA, BETA, VSL, LDVSL, VSR, LDVSR, WORK, LWORK, RWORK, BWORK, INFO)
ZGGES3 computes the eigenvalues, the Schur form, and, optionally, the matrix of Schur vectors for GE ...
subroutine zlacpy(UPLO, M, N, A, LDA, B, LDB)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine zlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine zlarfg(N, ALPHA, X, INCX, TAU)
ZLARFG generates an elementary reflector (Householder matrix).
subroutine zunm2r(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, INFO)
ZUNM2R multiplies a general matrix by the unitary matrix from a QR factorization determined by cgeqrf...