399 SUBROUTINE ddrges3( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
400 $ NOUNIT, A, LDA, B, S, T, Q, LDQ, Z, ALPHAR,
401 $ ALPHAI, BETA, WORK, LWORK, RESULT, BWORK,
409 INTEGER INFO, LDA, LDQ, LWORK, NOUNIT, NSIZES, NTYPES
410 DOUBLE PRECISION THRESH
413 LOGICAL BWORK( * ), DOTYPE( * )
414 INTEGER ISEED( 4 ), NN( * )
415 DOUBLE PRECISION A( LDA, * ), ALPHAI( * ), ALPHAR( * ),
416 $ b( lda, * ), beta( * ), q( ldq, * ),
417 $ result( 13 ), s( lda, * ), t( lda, * ),
418 $ work( * ), z( ldq, * )
424 DOUBLE PRECISION ZERO, ONE
425 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
427 parameter( maxtyp = 26 )
430 LOGICAL BADNN, ILABAD
432 INTEGER I, I1, IADD, IERR, IINFO, IN, ISORT, J, JC, JR,
433 $ jsize, jtype, knteig, maxwrk, minwrk, mtypes,
434 $ n, n1, nb, nerrs, nmats, nmax, ntest, ntestt,
436 DOUBLE PRECISION SAFMAX, SAFMIN, TEMP1, TEMP2, ULP, ULPINV
439 INTEGER IASIGN( MAXTYP ), IBSIGN( MAXTYP ),
440 $ IOLDSD( 4 ), KADD( 6 ), KAMAGN( MAXTYP ),
441 $ KATYPE( MAXTYP ), KAZERO( MAXTYP ),
442 $ kbmagn( maxtyp ), kbtype( maxtyp ),
443 $ kbzero( maxtyp ), kclass( maxtyp ),
444 $ ktrian( maxtyp ), kz1( 6 ), kz2( 6 )
445 DOUBLE PRECISION RMAGN( 0: 3 )
450 DOUBLE PRECISION DLAMCH, DLARND
451 EXTERNAL dlctes, ilaenv, dlamch, dlarnd
458 INTRINSIC abs, dble, max, min, sign
461 DATA kclass / 15*1, 10*2, 1*3 /
462 DATA kz1 / 0, 1, 2, 1, 3, 3 /
463 DATA kz2 / 0, 0, 1, 2, 1, 1 /
464 DATA kadd / 0, 0, 0, 0, 3, 2 /
465 DATA katype / 0, 1, 0, 1, 2, 3, 4, 1, 4, 4, 1, 1, 4,
466 $ 4, 4, 2, 4, 5, 8, 7, 9, 4*4, 0 /
467 DATA kbtype / 0, 0, 1, 1, 2, -3, 1, 4, 1, 1, 4, 4,
468 $ 1, 1, -4, 2, -4, 8*8, 0 /
469 DATA kazero / 6*1, 2, 1, 2*2, 2*1, 2*2, 3, 1, 3,
471 DATA kbzero / 6*1, 1, 2, 2*1, 2*2, 2*1, 4, 1, 4,
473 DATA kamagn / 8*1, 2, 3, 2, 3, 2, 3, 7*1, 2, 3, 3,
475 DATA kbmagn / 8*1, 3, 2, 3, 2, 2, 3, 7*1, 3, 2, 3,
477 DATA ktrian / 16*0, 10*1 /
478 DATA iasign / 6*0, 2, 0, 2*2, 2*0, 3*2, 0, 2, 3*0,
480 DATA ibsign / 7*0, 2, 2*0, 2*2, 2*0, 2, 0, 2, 9*0 /
491 nmax = max( nmax, nn( j ) )
496 IF( nsizes.LT.0 )
THEN
498 ELSE IF( badnn )
THEN
500 ELSE IF( ntypes.LT.0 )
THEN
502 ELSE IF( thresh.LT.zero )
THEN
504 ELSE IF( lda.LE.1 .OR. lda.LT.nmax )
THEN
506 ELSE IF( ldq.LE.1 .OR. ldq.LT.nmax )
THEN
518 IF( info.EQ.0 .AND. lwork.GE.1 )
THEN
519 minwrk = max( 10*( nmax+1 ), 3*nmax*nmax )
520 nb = max( 1, ilaenv( 1,
'DGEQRF',
' ', nmax, nmax, -1, -1 ),
521 $ ilaenv( 1,
'DORMQR',
'LT', nmax, nmax, nmax, -1 ),
522 $ ilaenv( 1,
'DORGQR',
' ', nmax, nmax, nmax, -1 ) )
523 maxwrk = max( 10*( nmax+1 ), 2*nmax+nmax*nb, 3*nmax*nmax )
527 IF( lwork.LT.minwrk )
531 CALL xerbla(
'DDRGES3', -info )
537 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
540 safmin = dlamch(
'Safe minimum' )
541 ulp = dlamch(
'Epsilon' )*dlamch(
'Base' )
542 safmin = safmin / ulp
543 safmax = one / safmin
544 CALL dlabad( safmin, safmax )
558 DO 190 jsize = 1, nsizes
561 rmagn( 2 ) = safmax*ulp / dble( n1 )
562 rmagn( 3 ) = safmin*ulpinv*dble( n1 )
564 IF( nsizes.NE.1 )
THEN
565 mtypes = min( maxtyp, ntypes )
567 mtypes = min( maxtyp+1, ntypes )
572 DO 180 jtype = 1, mtypes
573 IF( .NOT.dotype( jtype ) )
581 ioldsd( j ) = iseed( j )
613 IF( mtypes.GT.maxtyp )
616 IF( kclass( jtype ).LT.3 )
THEN
620 IF( abs( katype( jtype ) ).EQ.3 )
THEN
621 in = 2*( ( n-1 ) / 2 ) + 1
623 $
CALL dlaset(
'Full', n, n, zero, zero, a, lda )
627 CALL dlatm4( katype( jtype ), in, kz1( kazero( jtype ) ),
628 $ kz2( kazero( jtype ) ), iasign( jtype ),
629 $ rmagn( kamagn( jtype ) ), ulp,
630 $ rmagn( ktrian( jtype )*kamagn( jtype ) ), 2,
632 iadd = kadd( kazero( jtype ) )
633 IF( iadd.GT.0 .AND. iadd.LE.n )
634 $ a( iadd, iadd ) = one
638 IF( abs( kbtype( jtype ) ).EQ.3 )
THEN
639 in = 2*( ( n-1 ) / 2 ) + 1
641 $
CALL dlaset(
'Full', n, n, zero, zero, b, lda )
645 CALL dlatm4( kbtype( jtype ), in, kz1( kbzero( jtype ) ),
646 $ kz2( kbzero( jtype ) ), ibsign( jtype ),
647 $ rmagn( kbmagn( jtype ) ), one,
648 $ rmagn( ktrian( jtype )*kbmagn( jtype ) ), 2,
650 iadd = kadd( kbzero( jtype ) )
651 IF( iadd.NE.0 .AND. iadd.LE.n )
652 $ b( iadd, iadd ) = one
654 IF( kclass( jtype ).EQ.2 .AND. n.GT.0 )
THEN
663 q( jr, jc ) = dlarnd( 3, iseed )
664 z( jr, jc ) = dlarnd( 3, iseed )
666 CALL dlarfg( n+1-jc, q( jc, jc ), q( jc+1, jc ), 1,
668 work( 2*n+jc ) = sign( one, q( jc, jc ) )
670 CALL dlarfg( n+1-jc, z( jc, jc ), z( jc+1, jc ), 1,
672 work( 3*n+jc ) = sign( one, z( jc, jc ) )
677 work( 3*n ) = sign( one, dlarnd( 2, iseed ) )
680 work( 4*n ) = sign( one, dlarnd( 2, iseed ) )
686 a( jr, jc ) = work( 2*n+jr )*work( 3*n+jc )*
688 b( jr, jc ) = work( 2*n+jr )*work( 3*n+jc )*
692 CALL dorm2r(
'L',
'N', n, n, n-1, q, ldq, work, a,
693 $ lda, work( 2*n+1 ), iinfo )
696 CALL dorm2r(
'R',
'T', n, n, n-1, z, ldq, work( n+1 ),
697 $ a, lda, work( 2*n+1 ), iinfo )
700 CALL dorm2r(
'L',
'N', n, n, n-1, q, ldq, work, b,
701 $ lda, work( 2*n+1 ), iinfo )
704 CALL dorm2r(
'R',
'T', n, n, n-1, z, ldq, work( n+1 ),
705 $ b, lda, work( 2*n+1 ), iinfo )
715 a( jr, jc ) = rmagn( kamagn( jtype ) )*
717 b( jr, jc ) = rmagn( kbmagn( jtype ) )*
725 IF( iinfo.NE.0 )
THEN
726 WRITE( nounit, fmt = 9999 )
'Generator', iinfo, n, jtype,
741 IF( isort.EQ.0 )
THEN
759 CALL dlacpy(
'Full', n, n, a, lda, s, lda )
760 CALL dlacpy(
'Full', n, n, b, lda, t, lda )
761 ntest = 1 + rsub + isort
762 result( 1+rsub+isort ) = ulpinv
763 CALL dgges3(
'V',
'V', sort, dlctes, n, s, lda, t, lda,
764 $ sdim, alphar, alphai, beta, q, ldq, z, ldq,
765 $ work, lwork, bwork, iinfo )
766 IF( iinfo.NE.0 .AND. iinfo.NE.n+2 )
THEN
767 result( 1+rsub+isort ) = ulpinv
768 WRITE( nounit, fmt = 9999 )
'DGGES3', iinfo, n, jtype,
778 IF( isort.EQ.0 )
THEN
779 CALL dget51( 1, n, a, lda, s, lda, q, ldq, z, ldq,
780 $ work, result( 1 ) )
781 CALL dget51( 1, n, b, lda, t, lda, q, ldq, z, ldq,
782 $ work, result( 2 ) )
784 CALL dget54( n, a, lda, b, lda, s, lda, t, lda, q,
785 $ ldq, z, ldq, work, result( 7 ) )
787 CALL dget51( 3, n, a, lda, t, lda, q, ldq, q, ldq, work,
789 CALL dget51( 3, n, b, lda, t, lda, z, ldq, z, ldq, work,
801 IF( alphai( j ).EQ.zero )
THEN
802 temp2 = ( abs( alphar( j )-s( j, j ) ) /
803 $ max( safmin, abs( alphar( j ) ), abs( s( j,
804 $ j ) ) )+abs( beta( j )-t( j, j ) ) /
805 $ max( safmin, abs( beta( j ) ), abs( t( j,
809 IF( s( j+1, j ).NE.zero )
THEN
811 result( 5+rsub ) = ulpinv
815 IF( s( j, j-1 ).NE.zero )
THEN
817 result( 5+rsub ) = ulpinv
822 IF( alphai( j ).GT.zero )
THEN
827 IF( i1.LE.0 .OR. i1.GE.n )
THEN
829 ELSE IF( i1.LT.n-1 )
THEN
830 IF( s( i1+2, i1+1 ).NE.zero )
THEN
832 result( 5+rsub ) = ulpinv
834 ELSE IF( i1.GT.1 )
THEN
835 IF( s( i1, i1-1 ).NE.zero )
THEN
837 result( 5+rsub ) = ulpinv
840 IF( .NOT.ilabad )
THEN
841 CALL dget53( s( i1, i1 ), lda, t( i1, i1 ), lda,
842 $ beta( j ), alphar( j ),
843 $ alphai( j ), temp2, ierr )
845 WRITE( nounit, fmt = 9998 )ierr, j, n,
854 temp1 = max( temp1, temp2 )
856 WRITE( nounit, fmt = 9997 )j, n, jtype, ioldsd
859 result( 6+rsub ) = temp1
861 IF( isort.GE.1 )
THEN
869 IF( dlctes( alphar( i ), alphai( i ),
870 $ beta( i ) ) .OR. dlctes( alphar( i ),
871 $ -alphai( i ), beta( i ) ) )
THEN
875 IF( ( dlctes( alphar( i+1 ), alphai( i+1 ),
876 $ beta( i+1 ) ) .OR. dlctes( alphar( i+1 ),
877 $ -alphai( i+1 ), beta( i+1 ) ) ) .AND.
878 $ ( .NOT.( dlctes( alphar( i ), alphai( i ),
879 $ beta( i ) ) .OR. dlctes( alphar( i ),
880 $ -alphai( i ), beta( i ) ) ) ) .AND.
881 $ iinfo.NE.n+2 )
THEN
882 result( 12 ) = ulpinv
886 IF( sdim.NE.knteig )
THEN
887 result( 12 ) = ulpinv
897 ntestt = ntestt + ntest
902 IF( result( jr ).GE.thresh )
THEN
907 IF( nerrs.EQ.0 )
THEN
908 WRITE( nounit, fmt = 9996 )
'DGS'
912 WRITE( nounit, fmt = 9995 )
913 WRITE( nounit, fmt = 9994 )
914 WRITE( nounit, fmt = 9993 )
'Orthogonal'
918 WRITE( nounit, fmt = 9992 )
'orthogonal',
'''',
919 $
'transpose', (
'''', j = 1, 8 )
923 IF( result( jr ).LT.10000.0d0 )
THEN
924 WRITE( nounit, fmt = 9991 )n, jtype, ioldsd, jr,
927 WRITE( nounit, fmt = 9990 )n, jtype, ioldsd, jr,
938 CALL alasvm(
'DGS', nounit, nerrs, ntestt, 0 )
944 9999
FORMAT(
' DDRGES3: ', a,
' returned INFO=', i6,
'.', / 9x,
'N=',
945 $ i6,
', JTYPE=', i6,
', ISEED=(', 4( i4,
',' ), i5,
')' )
947 9998
FORMAT(
' DDRGES3: DGET53 returned INFO=', i1,
' for eigenvalue ',
948 $ i6,
'.', / 9x,
'N=', i6,
', JTYPE=', i6,
', ISEED=(',
949 $ 4( i4,
',' ), i5,
')' )
951 9997
FORMAT(
' DDRGES3: S not in Schur form at eigenvalue ', i6,
'.',
952 $ / 9x,
'N=', i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ),
955 9996
FORMAT( / 1x, a3,
' -- Real Generalized Schur form driver' )
957 9995
FORMAT(
' Matrix types (see DDRGES3 for details): ' )
959 9994
FORMAT(
' Special Matrices:', 23x,
960 $
'(J''=transposed Jordan block)',
961 $ /
' 1=(0,0) 2=(I,0) 3=(0,I) 4=(I,I) 5=(J'',J'') ',
962 $
'6=(diag(J'',I), diag(I,J''))', /
' Diagonal Matrices: ( ',
963 $
'D=diag(0,1,2,...) )', /
' 7=(D,I) 9=(large*D, small*I',
964 $
') 11=(large*I, small*D) 13=(large*D, large*I)', /
965 $
' 8=(I,D) 10=(small*D, large*I) 12=(small*I, large*D) ',
966 $
' 14=(small*D, small*I)', /
' 15=(D, reversed D)' )
967 9993
FORMAT(
' Matrices Rotated by Random ', a,
' Matrices U, V:',
968 $ /
' 16=Transposed Jordan Blocks 19=geometric ',
969 $
'alpha, beta=0,1', /
' 17=arithm. alpha&beta ',
970 $
' 20=arithmetic alpha, beta=0,1', /
' 18=clustered ',
971 $
'alpha, beta=0,1 21=random alpha, beta=0,1',
972 $ /
' Large & Small Matrices:', /
' 22=(large, small) ',
973 $
'23=(small,large) 24=(small,small) 25=(large,large)',
974 $ /
' 26=random O(1) matrices.' )
976 9992
FORMAT( /
' Tests performed: (S is Schur, T is triangular, ',
977 $
'Q and Z are ', a,
',', / 19x,
978 $
'l and r are the appropriate left and right', / 19x,
979 $
'eigenvectors, resp., a is alpha, b is beta, and', / 19x, a,
980 $
' means ', a,
'.)', /
' Without ordering: ',
981 $ /
' 1 = | A - Q S Z', a,
982 $
' | / ( |A| n ulp ) 2 = | B - Q T Z', a,
983 $
' | / ( |B| n ulp )', /
' 3 = | I - QQ', a,
984 $
' | / ( n ulp ) 4 = | I - ZZ', a,
985 $
' | / ( n ulp )', /
' 5 = A is in Schur form S',
986 $ /
' 6 = difference between (alpha,beta)',
987 $
' and diagonals of (S,T)', /
' With ordering: ',
988 $ /
' 7 = | (A,B) - Q (S,T) Z', a,
989 $
' | / ( |(A,B)| n ulp ) ', /
' 8 = | I - QQ', a,
990 $
' | / ( n ulp ) 9 = | I - ZZ', a,
991 $
' | / ( n ulp )', /
' 10 = A is in Schur form S',
992 $ /
' 11 = difference between (alpha,beta) and diagonals',
993 $
' of (S,T)', /
' 12 = SDIM is the correct number of ',
994 $
'selected eigenvalues', / )
995 9991
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
996 $ 4( i4,
',' ),
' result ', i2,
' is', 0p, f8.2 )
997 9990
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
998 $ 4( i4,
',' ),
' result ', i2,
' is', 1p, d10.3 )
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine dlacpy(UPLO, M, N, A, LDA, B, LDB)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine alasvm(TYPE, NOUT, NFAIL, NRUN, NERRS)
ALASVM
subroutine xlaenv(ISPEC, NVALUE)
XLAENV
subroutine dlatm4(ITYPE, N, NZ1, NZ2, ISIGN, AMAGN, RCOND, TRIANG, IDIST, ISEED, A, LDA)
DLATM4
subroutine dget54(N, A, LDA, B, LDB, S, LDS, T, LDT, U, LDU, V, LDV, WORK, RESULT)
DGET54
subroutine dget53(A, LDA, B, LDB, SCALE, WR, WI, RESULT, INFO)
DGET53
subroutine ddrges3(NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH, NOUNIT, A, LDA, B, S, T, Q, LDQ, Z, ALPHAR, ALPHAI, BETA, WORK, LWORK, RESULT, BWORK, INFO)
DDRGES3
subroutine dget51(ITYPE, N, A, LDA, B, LDB, U, LDU, V, LDV, WORK, RESULT)
DGET51
subroutine dgges3(JOBVSL, JOBVSR, SORT, SELCTG, N, A, LDA, B, LDB, SDIM, ALPHAR, ALPHAI, BETA, VSL, LDVSL, VSR, LDVSR, WORK, LWORK, BWORK, INFO)
DGGES3 computes the eigenvalues, the Schur form, and, optionally, the matrix of Schur vectors for GE ...
subroutine dlarfg(N, ALPHA, X, INCX, TAU)
DLARFG generates an elementary reflector (Householder matrix).
subroutine dorm2r(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, INFO)
DORM2R multiplies a general matrix by the orthogonal matrix from a QR factorization determined by sge...