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 )
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.LT.
IF( LWORKMINWRK )
531 CALL XERBLA( 'ddrges3', -INFO )
537.EQ..OR..EQ.
IF( NSIZES0 NTYPES0 )
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.NE.
IF( NSIZES1 ) THEN
565 MTYPES = MIN( MAXTYP, NTYPES )
567 MTYPES = MIN( MAXTYP+1, NTYPES )
572 DO 180 JTYPE = 1, MTYPES
573.NOT.
IF( DOTYPE( JTYPE ) )
581 IOLDSD( J ) = ISEED( J )
613.GT.
IF( MTYPESMAXTYP )
616.LT.
IF( KCLASS( JTYPE )3 ) THEN
620.EQ.
IF( ABS( KATYPE( JTYPE ) )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.GT..AND..LE.
IF( IADD0 IADDN )
634 $ A( IADD, IADD ) = ONE
638.EQ.
IF( ABS( KBTYPE( JTYPE ) )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.NE..AND..LE.
IF( IADD0 IADDN )
652 $ B( IADD, IADD ) = ONE
654.EQ..AND..GT.
IF( KCLASS( JTYPE )2 N0 ) 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.NE.
IF( IINFO0 ) THEN
726 WRITE( NOUNIT, FMT = 9999 )'generator
', IINFO, N, JTYPE,
741.EQ.
IF( ISORT0 ) 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 )