404 SUBROUTINE ddrgev3( NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH,
405 $ NOUNIT, A, LDA, B, S, T, Q, LDQ, Z, QE, LDQE,
406 $ ALPHAR, ALPHAI, BETA, ALPHR1, ALPHI1, BETA1,
407 $ WORK, LWORK, RESULT, INFO )
414 INTEGER INFO, LDA, LDQ, LDQE, LWORK, NOUNIT, NSIZES,
416 DOUBLE PRECISION THRESH
421DOUBLE PRECISION A( LDA, * ), ALPHAI( * ), ALPHAR( * ),
422 $ alphi1( * ), alphr1( * ), b( lda, * ),
423 $ beta( * ), beta1( * ), q( ldq, * ),
424 $ qe( ldqe, * ), result( * ), s( lda, * ),
425 $ t( lda, * ), work( * ), z( ldq, * )
431 DOUBLE PRECISION , ONE
432 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
434 parameter( maxtyp = 27 )
438 INTEGER I, IADD, IERR, IN, J, JC, JR, JSIZE, JTYPE,
439 $ MAXWRK, MINWRK, MTYPES, N, N1, NERRS, NMATS,
441 DOUBLE PRECISION SAFMAX, SAFMIN, ULP, ULPINV
444 INTEGER IASIGN( MAXTYP ), IBSIGN( MAXTYP ),
445 $ IOLDSD( 4 ), KADD( 6 ), KAMAGN( MAXTYP ),
446 $ KATYPE( MAXTYP ), KAZERO( MAXTYP ),
447 $ kbmagn( maxtyp ), kbtype( maxtyp ),
448 $ kbzero( maxtyp ), kclass( maxtyp ),
449 $ ktrian( maxtyp ), kz1( 6 ), kz2( 6 )
450 DOUBLE PRECISION ( 0: 3 )
454 DOUBLE PRECISION DLAMCH, DLARND
455 EXTERNAL , DLAMCH, DLARND
462 INTRINSIC abs, dble,
max,
min, sign
465 DATA kclass / 15*1, 10*2, 1*3, 1*4 /
466 DATA kz1 / 0, 1, 2, 1, 3, 3 /
467 DATA kz2 / 0, 0, 1, 2, 1, 1 /
468 DATA kadd / 0, 0, 0, 0, 3, 2 /
469 DATA katype / 0, 1, 0
470 $ 4, 4, 2, 4, 5, 8, 7, 9, 4*4, 0, 0 /
471 DATA kbtype / 0, 0, 1, 1, 2, -3, 1, 4, 1, 1, 4, 4,
472 $ 1, 1, -4, 2, -4, 8*8, 0, 0 /
473 DATA kazero / 6*1, 2, 1, 2*2, 2*1, 2*2, 3, 1, 3,
475 DATA kbzero / 6*1, 1, 2, 2*1, 2*2, 2*1, 4, 1, 4,
477 DATA kamagn / 8*1, 2, 3, 2, 3, 2, 3, 7*1, 2, 3, 3,
479 DATA kbmagn / 8*1, 3, 2, 3, 2, 2, 3, 7*1, 3, 2, 3,
481 DATA ktrian / 16*0, 11*1 /
484 DATA ibsign / 7*0, 2, 2*0, 2*2, 2*0, 2, 0, 2, 10*0 /
495 nmax =
max( nmax, nn( j ) )
500 IF( nsizes.LT.0 )
THEN
502 ELSE IF( badnn )
THEN
504 ELSE IF( ntypes.LT.0 )
THEN
506 ELSE IF( thresh.LT.zero )
THEN
508 ELSE IF( lda.LE.1 .OR. lda.LT.nmax )
THEN
510 ELSE IF( ldq.LE.1 .OR. ldq.LT.nmax )
THEN
512 ELSE IF( ldqe.LE.1 .OR. ldqe.LT.nmax )
THEN
524 IF( info.EQ.0 .AND. lwork.GE.1 )
THEN
525 minwrk =
max( 1, 8*nmax, nmax*( nmax+1 ) )
526 maxwrk = 7*nmax + nmax*ilaenv( 1,
'DGEQRF',
' ', nmax, 1, nmax,
528 maxwrk =
max( maxwrk, nmax*( nmax+1 ) )
532 IF( lwork.LT.minwrk )
536 CALL xerbla(
'DDRGEV3', -info )
542 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
545 safmin = dlamch(
'Safe minimum' )
546 ulp = dlamch(
'Epsilon' )*dlamch(
'Base' )
547 safmin = safmin / ulp
548 safmax = one / safmin
549 CALL dlabad( safmin, safmax )
563 DO 220 jsize = 1, nsizes
566 rmagn( 2 ) = safmax*ulp / dble( n1 )
567 rmagn( 3 ) = safmin*ulpinv*n1
569 IF( nsizes.NE.1 )
THEN
570 mtypes =
min( maxtyp, ntypes )
572 mtypes =
min( maxtyp+1, ntypes )
575 DO 210 jtype = 1, mtypes
576 IF( .NOT.dotype( jtype ) )
583 ioldsd( j ) = iseed( j )
610 IF( mtypes.GT.maxtyp )
613 IF( kclass( jtype ).LT.3 )
THEN
617 IF( abs( katype( jtype ) ).EQ.3 )
THEN
618 in = 2*( ( n-1 ) / 2 ) + 1
620 $
CALL dlaset(
'Full', n, n, zero, zero, a, lda )
624 CALL dlatm4( katype( jtype ), in, kz1( kazero( jtype ) ),
625 $ kz2( kazero( jtype ) ), iasign( jtype ),
626 $ rmagn( kamagn( jtype ) ), ulp,
627 $ rmagn( ktrian( jtype )*kamagn( jtype ) ), 2,
629 iadd = kadd( kazero( jtype ) )
630 IF( iadd.GT.0 .AND. iadd.LE.n )
631 $ a( iadd, iadd ) = one
636 in = 2*( ( n-1 ) / 2 ) + 1
642 CALL dlatm4( kbtype( jtype ), in, kz1( kbzero( jtype ) ),
643 $ kz2( kbzero( jtype ) ), ibsign( jtype ),
644 $ rmagn( kbmagn( jtype ) ), one,
645 $ rmagn( ktrian( jtype )*kbmagn
647 iadd = kadd( kbzero( jtype ) )
648 IF( iadd.NE.0 .AND. iadd.LE.n )
649 $ b( iadd, iadd ) = one
651 IF( kclass( jtype ).EQ.2 .AND. n.GT.0 )
THEN
660 q( jr, jc ) = dlarnd( 3, iseed )
661 z( jr, jc ) = dlarnd( 3, iseed )
663 CALL dlarfg( n+1-jc, q( jc, jc ), q( jc+1, jc ), 1,
665 work( 2*n+jc ) = sign( one, q( jc, jc ) )
667 CALL dlarfg( n+1-jc, z( jc, jc ), z( jc+1, jc ), 1,
669 work( 3*n+jc ) = sign( one, z( jc, jc ) )
674 work( 3*n ) = sign( one, dlarnd( 2, iseed ) )
677 work( 4*n ) = sign( one, dlarnd( 2, iseed ) )
683 a( jr, jc ) = work( 2*n+jr )*work( 3*n+jc )*
685 b( jr, jc ) = work( 2*n+jr )*work( 3*n+jc )*
689 CALL dorm2r(
'L',
'N', n, n, n-1, q, ldq, work, a,
690 $ lda, work( 2*n+1 ), ierr )
693 CALL dorm2r(
'R',
'T', n, n, n-1, z, ldq, work( n+1 ),
694 $ a, lda, work( 2*n+1 ), ierr )
697 CALL dorm2r(
'L',
'N', n, n, n-1, q, ldq, work, b,
698 $ lda, work( 2*n+1 ), ierr )
701 CALL dorm2r(
'R',
'T', n, n, n-1, z, ldq, work( n+1 ),
702 $ b, lda, work( 2*n+1 ), ierr )
706 ELSE IF (kclass( jtype ).EQ.3)
THEN
712 a( jr, jc ) = rmagn( kamagn( jtype ) )*
714 b( jr, jc ) = rmagn( kbmagn( jtype ) )*
723 DO 71 jr = 1,
min( jc + 1, n)
724 a( jr, jc ) = rmagn( kamagn( jtype ) )*
733 b( jr, jc ) = rmagn( kamagn( jtype ) )*
749 WRITE( nounit, fmt = 9999 )
'Generator', ierr, n, jtype,
771 CALL dlacpy(
' ', n, n, a, lda, s, lda )
772 CALL dlacpy( '
', N, N, B, LDA, T, LDA )
773 CALL DGGEV3( 'v
', 'v
', N, S, LDA, T, LDA, ALPHAR, ALPHAI,
774 $ BETA, Q, LDQ, Z, LDQ, WORK, LWORK, IERR )
775.NE..AND..NE.
IF( IERR0 IERRN+1 ) THEN
777 WRITE( NOUNIT, FMT = 9999 )'dggev31
', IERR, N, JTYPE,
785 CALL DGET52( .TRUE., N, A, LDA, B, LDA, Q, LDQ, ALPHAR,
786 $ ALPHAI, BETA, WORK, RESULT( 1 ) )
787.GT.
IF( RESULT( 2 )THRESH ) THEN
788 WRITE( NOUNIT, FMT = 9998 )'left
', 'dggev31
',
789 $ RESULT( 2 ), N, JTYPE, IOLDSD
794 CALL DGET52( .FALSE., N, A, LDA, B, LDA, Z, LDQ, ALPHAR,
795 $ ALPHAI, BETA, WORK, RESULT( 3 ) )
796.GT.
IF( RESULT( 4 )THRESH ) THEN
797 WRITE( NOUNIT, FMT = 9998 )'right
', 'dggev31
',
798 $ RESULT( 4 ), N, JTYPE, IOLDSD
803 CALL DLACPY( ' ', N, N, A, LDA, S, LDA )
804 CALL DLACPY( ' ', N, N, B, LDA, T, LDA )
805 CALL DGGEV3( 'n
', 'n
', N, S, LDA, T, LDA, ALPHR1, ALPHI1,
806 $ BETA1, Q, LDQ, Z, LDQ, WORK, LWORK, IERR )
807.NE..AND..NE.
IF( IERR0 IERRN+1 ) THEN
809 WRITE( NOUNIT, FMT = 9999 )'dggev32
', IERR, N, JTYPE,
816.NE..OR..NE.
IF( ALPHAR( J )ALPHR1( J ) ALPHAI( J )
817.OR..NE.
$ ALPHI1( J ) BETA( J )BETA1( J ) )RESULT( 5 )
824 CALL DLACPY( ' ', N, N, A, LDA, S, LDA )
825 CALL DLACPY( ' ', N, N, B, LDA, T, LDA )
826 CALL DGGEV3( 'v
', 'n
', N, S, LDA, T, LDA, ALPHR1, ALPHI1,
827 $ BETA1, QE, LDQE, Z, LDQ, WORK, LWORK, IERR )
828.NE..AND..NE.
IF( IERR0 IERRN+1 ) THEN
830 WRITE( NOUNIT, FMT = 9999 )'dggev33
', IERR, N, JTYPE,
837.NE..OR..NE.
IF( ALPHAR( J )ALPHR1( J ) ALPHAI( J )
838.OR..NE.
$ ALPHI1( J ) BETA( J )BETA1( J ) )RESULT( 6 )
844.NE.
IF( Q( J, JC )QE( J, JC ) )
845 $ RESULT( 6 ) = ULPINV
852 CALL DLACPY( ' ', N, N, A, LDA, S, LDA )
853 CALL DLACPY( ' ', N, N, B, LDA, T, LDA )
854 CALL DGGEV3( 'n
', 'v
', N, S, LDA, T, LDA, ALPHR1, ALPHI1,
855 $ BETA1, Q, LDQ, QE, LDQE, WORK, LWORK, IERR )
856.NE..AND..NE.
IF( IERR0 IERRN+1 ) THEN
858 WRITE( NOUNIT, FMT = 9999 )'dggev34
', IERR, N, JTYPE,
865.NE..OR..NE.
IF( ALPHAR( J )ALPHR1( J ) ALPHAI( J )
866.OR..NE.
$ ALPHI1( J ) BETA( J )BETA1( J ) )RESULT( 7 )
872.NE.
IF( Z( J, JC )QE( J, JC ) )
873 $ RESULT( 7 ) = ULPINV
886.GE.
IF( RESULT( JR )THRESH ) THEN
891.EQ.
IF( NERRS0 ) THEN
892 WRITE( NOUNIT, FMT = 9997 )'dgv
'
896 WRITE( NOUNIT, FMT = 9996 )
897 WRITE( NOUNIT, FMT = 9995 )
898 WRITE( NOUNIT, FMT = 9994 )'orthogonal
'
902 WRITE( NOUNIT, FMT = 9993 )
906.LT.
IF( RESULT( JR )10000.0D0 ) THEN
907 WRITE( NOUNIT, FMT = 9992 )N, JTYPE, IOLDSD, JR,
910 WRITE( NOUNIT, FMT = 9991 )N, JTYPE, IOLDSD, JR,
921 CALL ALASVM( 'dgv
', NOUNIT, NERRS, NTESTT, 0 )
927 9999 FORMAT( ' ddrgev3:
', A, ' returned info=
', I6, '.
', / 3X, 'n=
',
928 $ I6, ', jtype=
', I6, ', iseed=(
', 4( I4, ',
' ), I5, ')
' )
930 9998 FORMAT( ' ddrgev3:
', A, ' eigenvectors from
', A,
931 $ ' incorrectly normalized.
', / ' bits of error=
', 0P, G10.3,
932 $ ',
', 3X, 'n=
', I4, ', jtype=
', I3, ', iseed=(
',
933 $ 4( I4, ',
' ), I5, ')
' )
935 9997 FORMAT( / 1X, A3, ' -- real generalized eigenvalue problem driver
'
938 9996 FORMAT( ' matrix types(see
ddrgev3 for details):
' )
940 9995 FORMAT( ' special matrices:
', 23X,
941 $ '(j
''=transposed jordan block)
',
942 $ / ' 1=(0,0) 2=(i,0) 3=(0,i) 4=(i,i) 5=(j'
',J'') ',
943 $
'6=(diag(J'',I), diag(I,J''))', /
' Diagonal Matrices: ( ',
944 $
'D=diag(0,1,2,...) )', /
' 7=(D,I) 9=(large*D, small*I',
945 $
') 11=(large*I, small*D) 13=(large*D, large*I)', /
946 $
' 8=(I,D) 10=(small*D, large*I) 12=(small*I, large*D) ',
947 $
' 14=(small*D, small*I)', /
' 15=(D, reversed D)' )
948 9994
FORMAT(
' Matrices Rotated by Random ', a,
' Matrices U, V:',
949 $ /
' 16=Transposed Jordan Blocks 19=geometric ',
950 $
'alpha, beta=0,1', /
' 17=arithm. alpha&beta ',
951 $
' 20=arithmetic alpha, beta=0,1', /
' 18=clustered ',
952 $
'alpha, beta=0,1 21=random alpha, beta=0,1',
953 $ /
' Large & Small Matrices:', / ' 22=(large, small)
',
954 $ '23=(small,large) 24=(small,small) 25=(large,large)
',
955 $ / ' 26=random o(1) matrices.
' )
957 9993 FORMAT( / ' tests performed:
',
958 $ / ' 1 =
max | ( b a - a b )
''*l | / const.,
',
959 $ / ' 2 = | |vr(i)| - 1 | / ulp,
',
960 $ / ' 3 =
max | ( b a - a b )*r | / const.
',
961 $ / ' 4 = | |vl(i)| - 1 | / ulp,
',
962 $ / ' 5 = 0
if w same no matter
if r or l computed,
',
963 $ / ' 6 = 0
if l same no matter
if l computed,
',
964 $ / ' 7 = 0
if r same no matter
if r computed,
', / 1X )
965 9992 FORMAT( ' matrix order=
', I5, ', type=
', I2, ',
seed=
',
966 $ 4( I4, ',
' ), ' result
', I2, ' is
', 0P, F8.2 )
967 9991 FORMAT( ' matrix order=
', I5, ', type=
', I2, ',
seed=
',
968 $ 4( I4, ',
' ), ' result
', I2, ' is
', 1P, D10.3 )