399 SUBROUTINE ddrges( 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 , LDA, LDQ, , 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.
427 parameter( maxtyp = 26 )
430 LOGICAL BADNN, ILABAD
432INTEGER , 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 ),
443 $ kbzero( maxtyp ), kclass( maxtyp ),
444 $ ktrian( maxtyp ), kz1( 6 ), kz2
445 DOUBLE PRECISION RMAGN( 0: 3 )
450 DOUBLE PRECISION DLAMCH, DLARND
451 EXTERNAL dlctes, ilaenv, dlamch, dlarnd
458 INTRINSIC abs, dble,
max,
min, sign
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,
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
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(
'DDRGES', -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 ) ),
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
751 CALL dlacpy(
'Full', n, n, a, lda, s, lda )
752 CALL dlacpy(
'Full', n, n, b, lda, t, lda )
753 ntest = 1 + rsub + isort
754 result( 1+rsub+isort ) = ulpinv
755 CALL dgges(
'V',
'V', sort, dlctes, n, s, lda, t, lda,
756 $ sdim, alphar, alphai, beta, q, ldq, z, ldq,
757 $ work, lwork, bwork, iinfo )
758 IF( iinfo.NE.0 .AND. iinfo.NE.n+2 )
THEN
759 result( 1+rsub+isort ) = ulpinv
760 WRITE( nounit, fmt = 9999 )
'DGGES', iinfo, n, jtype,
770 IF( isort.EQ.0 )
THEN
771 CALL dget51( 1, n, a, lda, s, lda, q, ldq, z, ldq,
772 $ work, result( 1 ) )
773 CALL dget51( 1, n, b, lda, t, lda, q, ldq, z, ldq,
774 $ work, result( 2 ) )
776 CALL dget54( n, a, lda, b, lda, s, lda, t, lda, q,
777 $ ldq, z, ldq, work, result( 7 ) )
779 CALL dget51( 3, n, a, lda, t, lda, q, ldq, q, ldq, work,
793 IF( alphai( j ).EQ.zero )
THEN
794 temp2 = ( abs( alphar( j )-s( j, j ) ) /
795 $
max( safmin, abs( alphar( j ) ), abs( s( j,
796 $ j ) ) )+abs( beta( j )-t( j, j ) ) /
797 $
max( safmin, abs( beta( j ) ), abs( t( j,
801 IF( s( j+1, j ).NE.zero )
THEN
803 result( 5+rsub ) = ulpinv
807 IF( s( j, j-1 ).NE.zero )
THEN
809 result( 5+rsub ) = ulpinv
814 IF( alphai( j ).GT.zero )
THEN
819 IF( i1.LE.0 .OR. i1.GE.n )
THEN
821 ELSE IF( i1.LT.n-1 )
THEN
822 IF( s( i1+2, i1+1 ).NE.zero )
THEN
824 result( 5+rsub ) = ulpinv
826 ELSE IF( i1.GT.1 )
THEN
827 IF( s( i1, i1-1 ).NE.zero )
THEN
829 result( 5+rsub ) = ulpinv
832 IF( .NOT.ilabad )
THEN
833 CALL dget53( s( i1, i1 ), lda, t( i1, i1 ), lda,
834 $ beta( j ), alphar( j ),
835 $ alphai( j ), temp2, ierr )
837 WRITE( nounit, fmt = 9998 )ierr, j, n,
846 temp1 =
max( temp1, temp2 )
848 WRITE( nounit, fmt = 9997 )j, n, jtype, ioldsd
851 result( 6+rsub ) = temp1
853 IF( isort.GE.1 )
THEN
861 IF( dlctes( alphar( i ), alphai( i ),
862 $ beta( i ) ) .OR. dlctes( alphar( i ),
863 $ -alphai( i ), beta( i ) ) )
THEN
867 IF( ( dlctes( alphar( i+1 ), alphai( i+1 ),
868 $ beta( i+1 ) ) .OR. dlctes( alphar( i+1 ),
869 $ -alphai( i+1 ), beta( i+1 ) ) ) .AND.
870 $ ( .NOT.( dlctes( alphar( i ), alphai( i ),
871 $ beta( i ) ) .OR. dlctes( alphar( i ),
872 $ -alphai( i ), beta( i ) ) ) ) .AND.
873 $ iinfo.NE.n+2 )
THEN
874 result( 12 ) = ulpinv
878 IF( sdim.NE.knteig )
THEN
879 result( 12 ) = ulpinv
889 ntestt = ntestt + ntest
894 IF( result( jr ).GE.thresh )
THEN
899 IF( nerrs.EQ.0 )
THEN
900 WRITE( nounit, fmt = 9996 )
'DGS'
904 WRITE( nounit, fmt = 9995 )
905 WRITE( nounit, fmt = 9994 )
906 WRITE( nounit, fmt = 9993 )
'Orthogonal'
910 WRITE( nounit, fmt = 9992 )
'orthogonal',
'''',
911 $
'transpose', (
'''', j = 1, 8 )
915 IF( result( jr ).LT.10000.0d0 )
THEN
916 WRITE( nounit, fmt = 9991 )n, jtype, ioldsd, jr,
919 WRITE( nounit, fmt = 9990 )n, jtype, ioldsd, jr,
930 CALL alasvm(
'DGS', nounit, nerrs, ntestt, 0 )
936 9999
FORMAT(
' DDRGES: ', a,
' returned INFO=', i6,
'.', / 9x,
'N=',
937 $ i6,
', JTYPE=', i6,
', ISEED=(', 4( i4,
',' ), i5,
')' )
939 9998
FORMAT(
' DDRGES: DGET53 returned INFO=', i1,
' for eigenvalue ',
940 $ i6,
'.', / 9x,
'N=', i6,
', JTYPE=', i6,
', ISEED=(',
941 $ 4( i4,
',' ), i5,
')' )
943 9997
FORMAT(
' DDRGES: S not in Schur form at eigenvalue ', i6,
'.',
944 $ / 9x,
'N=', i6,
', JTYPE=', i6,
', ISEED=(', 3( i5,
',' ),
947 9996
FORMAT( / 1x, a3,
' -- Real Generalized Schur form driver' )
949 9995
FORMAT(
' Matrix types (see DDRGES for details): ' )
951 9994
FORMAT(
' Special Matrices:', 23x,
952 $
'(J''=transposed Jordan block)',
953 $ /
' 1=(0,0) 2=(I,0) 3=(0,I) 4=(I,I) 5=(J'',J'') ',
954 $
'6=(diag(J'',I), diag(I,J''))', /
' Diagonal Matrices: ( ',
955 $
'D=diag(0,1,2,...) )', /
' 7=(D,I) 9=(large*D, small*I',
956 $
') 11=(large*I, small*D) 13=(large*D, large*I)', /
957 $
' 8=(I,D) 10=(small*D, large*I) 12=(small*I, large*D) ',
958 $
' 14=(small*D, small*I)', /
' 15=(D, reversed D)' )
959 9993
FORMAT(
' Matrices Rotated by Random ', a,
' Matrices U, V:',
960 $ / ' 16=transposed jordan blocks 19=geometric
',
961 $ 'alpha, beta=0,1
', / ' 17=arithm.
alpha&beta
',
962 $ ' 20=arithmetic
alpha, beta=0,1
', / ' 18=clustered
',
963 $ 'alpha, beta=0,1 21=random
alpha, beta=0,1
',
964 $ / ' large & small matrices:
', / ' 22=(large, small)
',
965 $ '23=(small,large) 24=(small,small) 25=(large,large)
',
966 $ / ' 26=random o(1) matrices.
' )
968 9992 FORMAT( / ' tests performed: (s is schur, t is triangular,
',
969 $ 'q and z are
', A, ',', / 19x,
970 $
'l and r are the appropriate left and right', / 19x,
971 $
'eigenvectors, resp., a is alpha, b is beta, and', / 19x, a,
972 $
' means ', a,
'.)', /
' Without ordering: ',
973 $ /
' 1 = | A - Q S Z', a,
974 $
' | / ( |A| n ulp ) 2 = | B - Q T Z', a,
975 $
' | / ( |B| n ulp )', /
' 3 = | I - QQ', a,
976 $
' | / ( n ulp ) 4 = | I - ZZ', a,
977 $
' | / ( n ulp )', /
' 5 = A is in Schur form S',
978 $ /
' 6 = difference between (alpha,beta)',
979 $
' and diagonals of (S,T)', /
' With ordering: ',
980 $ /
' 7 = | (A,B) - Q (S,T) Z', a,
981 $
' | / ( |(A,B)| n ulp ) ', /
' 8 = | I - QQ', a,
982 $
' | / ( n ulp ) 9 = | I - ZZ', a,
983 $
' | / ( n ulp )', /
' 10 = A is in Schur form S',
984 $ /
' 11 = difference between (alpha,beta) and diagonals',
985 $
' of (S,T)', /
' 12 = SDIM is the correct number of ',
986 $
'selected eigenvalues', / )
987 9991
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
988 $ 4( i4,
',' ), ' result
', I2, ' is
', 0P, F8.2 )
989 9990 FORMAT( ' matrix order=
', I5, ', type=
', I2, ',
seed=
',
990 $ 4( I4, ',
' ), ' result
', I2, ' is
', 1P, D10.3 )