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
746 CALL zlacpy(
'Full', n, n, a, lda, s, lda )
747 CALL zlacpy(
'Full', n, n, b, lda, t, lda )
748 ntest = 1 + rsub + isort
749 result( 1+rsub+isort ) = ulpinv
750 CALL zgges3(
'V',
'V', sort, zlctes, n, s, lda, t, lda,
751 $ sdim, alpha, beta, q, ldq, z, ldq, work,
752 $ lwork, rwork, bwork, iinfo )
753 IF( iinfo.NE.0 .AND. iinfo.NE.n+2 )
THEN
754 result( 1+rsub+isort ) = ulpinv
755 WRITE( nounit, fmt = 9999 )
'ZGGES3', iinfo, n, jtype,
765 IF( isort.EQ.0 )
THEN
766 CALL zget51( 1, n, a, lda, s, lda, q, ldq, z, ldq,
767 $ work, rwork, result( 1 ) )
768 CALL zget51( 1, n, b, lda, t, lda, q, ldq, z, ldq,
769 $ work, rwork, result( 2 ) )
771 CALL zget54( n, a, lda, b, lda, s, lda, t, lda, q,
772 $ ldq, z, ldq, work, result( 2+rsub ) )
775 CALL zget51( 3, n, b, lda, t, lda, q, ldq, q, ldq, work,
776 $ rwork, result( 3+rsub ) )
777 CALL zget51( 3, n, b, lda, t, lda, z, ldq, z, ldq, work,
778 $ rwork, result( 4+rsub ) )
789 temp2 = ( abs1( alpha( j )-s( j, j ) ) /
790 $ max( safmin, abs1( alpha( j ) ), abs1( s( j,
791 $ j ) ) )+abs1( beta( j )-t( j, j ) ) /
792 $ max( safmin, abs1( beta( j ) ), abs1( t( j,
796 IF( s( j+1, j ).NE.zero )
THEN
798 result( 5+rsub ) = ulpinv
802 IF( s( j, j-1 ).NE.zero )
THEN
804 result( 5+rsub ) = ulpinv
807 temp1 = max( temp1, temp2 )
809 WRITE( nounit, fmt = 9998 )j, n, jtype, ioldsd
812 result( 6+rsub ) = temp1
814 IF( isort.GE.1 )
THEN
822 IF( zlctes( alpha( i ), beta( i ) ) )
823 $ knteig = knteig + 1
826 $ result( 13 ) = ulpinv
835 ntestt = ntestt + ntest
840 IF( result( jr ).GE.thresh )
THEN
845 IF( nerrs.EQ.0 )
THEN
846 WRITE( nounit, fmt = 9997 )
'ZGS'
850 WRITE( nounit, fmt = 9996 )
851 WRITE( nounit, fmt = 9995 )
852 WRITE( nounit, fmt = 9994 )
'Unitary'
856 WRITE( nounit, fmt = 9993 )
'unitary',
'''',
857 $
'transpose', (
'''', j = 1, 8 )
861 IF( result( jr ).LT.10000.0d0 )
THEN
862 WRITE( nounit, fmt = 9992 )n, jtype, ioldsd, jr,
865 WRITE( nounit, fmt = 9991 )n, jtype, ioldsd, jr,
876 CALL alasvm(
'ZGS', nounit, nerrs, ntestt, 0 )
882 9999
FORMAT(
' ZDRGES3: ', a,
' returned INFO=', i6,
'.', / 9x,
'N=',
883 $ i6,
', JTYPE=', i6,
', ISEED=(', 4( i4,
',' ), i5,
')' )
885 9998
FORMAT(
' ZDRGES3: S not in Schur form at eigenvalue ', i6,
'.',
886 $ / 9x,
'N=', i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ),
889 9997
FORMAT( / 1x, a3,
' -- Complex Generalized Schur from problem ',
892 9996
FORMAT(
' Matrix types (see ZDRGES3 for details): ' )
894 9995
FORMAT(
' Special Matrices:', 23x,
895 $
'(J''=transposed Jordan block)',
896 $ /
' 1=(0,0) 2=(I,0) 3=(0,I) 4=(I,I) 5=(J'',J'') ',
897 $
'6=(diag(J'',I), diag(I,J''))', /
' Diagonal Matrices: ( ',
898 $
'D=diag(0,1,2,...) )', /
' 7=(D,I) 9=(large*D, small*I',
899 $
') 11=(large*I, small*D) 13=(large*D, large*I)', /
900 $
' 8=(I,D) 10=(small*D, large*I) 12=(small*I, large*D) ',
901 $
' 14=(small*D, small*I)', /
' 15=(D, reversed D)' )
902 9994
FORMAT(
' Matrices Rotated by Random ', a,
' Matrices U, V:',
903 $ /
' 16=Transposed Jordan Blocks 19=geometric ',
904 $
'alpha, beta=0,1', /
' 17=arithm. alpha&beta ',
905 $
' 20=arithmetic alpha, beta=0,1', /
' 18=clustered ',
906 $
'alpha, beta=0,1 21=random alpha, beta=0,1',
907 $ /
' Large & Small Matrices:', /
' 22=(large, small) ',
908 $
'23=(small,large) 24=(small,small) 25=(large,large)',
909 $ /
' 26=random O(1) matrices.' )
911 9993
FORMAT( /
' Tests performed: (S is Schur, T is triangular, ',
912 $
'Q and Z are ', a,
',', / 19x,
913 $
'l and r are the appropriate left and right', / 19x,
914 $
'eigenvectors, resp., a is alpha, b is beta, and', / 19x, a,
915 $
' means ', a,
'.)', /
' Without ordering: ',
916 $ /
' 1 = | A - Q S Z', a,
917 $
' | / ( |A| n ulp ) 2 = | B - Q T Z', a,
918 $
' | / ( |B| n ulp )', /
' 3 = | I - QQ', a,
919 $
' | / ( n ulp ) 4 = | I - ZZ', a,
920 $
' | / ( n ulp )', /
' 5 = A is in Schur form S',
921 $ /
' 6 = difference between (alpha,beta)',
922 $
' and diagonals of (S,T)', /
' With ordering: ',
923 $ /
' 7 = | (A,B) - Q (S,T) Z', a,
' | / ( |(A,B)| n ulp )',
924 $ /
' 8 = | I - QQ', a,
925 $
' | / ( n ulp ) 9 = | I - ZZ', a,
926 $
' | / ( n ulp )', /
' 10 = A is in Schur form S',
927 $ /
' 11 = difference between (alpha,beta) and diagonals',
928 $
' of (S,T)', /
' 12 = SDIM is the correct number of ',
929 $
'selected eigenvalues', / )
930 9992
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
931 $ 4( i4,
',' ),
' result ', i2,
' is', 0p, f8.2 )
932 9991
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
933 $ 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 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...