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 ), ( * )
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,
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
751 CALL XLAENV( 12, 10 )
752 CALL XLAENV( 13, 12 )
753 CALL XLAENV( 14, 13 )
755 CALL XLAENV( 17, 10 )
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.NE..AND..NE.
IF( IINFO0 IINFON+2 ) THEN
767 RESULT( 1+RSUB+ISORT ) = ULPINV
768 WRITE( NOUNIT, FMT = 9999 )'dgges3', IINFO, N, JTYPE,
778.EQ.
IF( ISORT0 ) 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.EQ.
IF( ALPHAI( J )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.NE.
IF( S( J+1, J )ZERO ) THEN
811 RESULT( 5+RSUB ) = ULPINV
815.NE.
IF( S( J, J-1 )ZERO ) THEN
817 RESULT( 5+RSUB ) = ULPINV
822.GT.
IF( ALPHAI( J )ZERO ) THEN
827.LE..OR..GE.
IF( I10 I1N ) THEN
829.LT.
ELSE IF( I1N-1 ) THEN
830.NE.
IF( S( I1+2, I1+1 )ZERO ) THEN
832 RESULT( 5+RSUB ) = ULPINV
834.GT.
ELSE IF( I11 ) THEN
835.NE.
IF( S( I1, I1-1 )ZERO ) THEN
837 RESULT( 5+RSUB ) = ULPINV
840.NOT.
IF( 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.GE.
IF( ISORT1 ) THEN
869 IF( DLCTES( ALPHAR( I ), ALPHAI( I ),
870.OR.
$ BETA( I ) ) DLCTES( ALPHAR( I ),
871 $ -ALPHAI( I ), BETA( I ) ) ) THEN
875 IF( ( DLCTES( ALPHAR( I+1 ), ALPHAI( I+1 ),
876.OR.
$ BETA( I+1 ) ) DLCTES( ALPHAR( I+1 ),
877.AND.
$ -ALPHAI( I+1 ), BETA( I+1 ) ) )
878.NOT.
$ ( ( DLCTES( ALPHAR( I ), ALPHAI( I ),
879.OR.
$ BETA( I ) ) DLCTES( ALPHAR( I ),
880.AND.
$ -ALPHAI( I ), BETA( I ) ) ) )
881.NE.
$ IINFON+2 ) THEN
882 RESULT( 12 ) = ULPINV
886.NE.
IF( SDIMKNTEIG ) THEN
887 RESULT( 12 ) = ULPINV
897 NTESTT = NTESTT + NTEST
902.GE.
IF( RESULT( JR )THRESH ) THEN
907.EQ.
IF( NERRS0 ) 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.LT.
IF( RESULT( JR )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, ')
' )
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 )