404 SUBROUTINE ddrgev( 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
420 INTEGER ISEED( 4 ), NN( * )
421 DOUBLE 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 ZERO, ONE
432 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
434 parameter( maxtyp = 26 )
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 ), ( 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 RMAGN( 0: 3 )
454 DOUBLE PRECISION DLAMCH, DLARND
455 EXTERNAL ILAENV, DLAMCH, DLARND
462 INTRINSIC abs, dble,
max,
min, sign
465 DATA kclass / 15*1, 10*2, 1*3 /
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, 1, 2, 3, 4, 1, 4, 4, 1, 1, 4,
470 $ 4, 4, 2, 4, 5, 8, 7, 9, 4*4, 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 /
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, 10*1 /
482 DATA iasign / 6*0, 2, 0, 2*2, 2*0, 3*2, 0, 2, 3*0,
484 DATA ibsign / 7*0, 2, 2*0, 2*2, 2*0, 2, 0, 2, 9*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.LT.
IF( LWORKMINWRK )
536 CALL XERBLA( 'ddrgev', -INFO )
542.EQ..OR..EQ.
IF( NSIZES0 NTYPES0 )
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.NE.
IF( NSIZES1 ) THEN
570 MTYPES = MIN( MAXTYP, NTYPES )
572 MTYPES = MIN( MAXTYP+1, NTYPES )
575 DO 210 JTYPE = 1, MTYPES
576.NOT.
IF( DOTYPE( JTYPE ) )
583 IOLDSD( J ) = ISEED( J )
609.GT.
IF( MTYPESMAXTYP )
612.LT.
IF( KCLASS( JTYPE )3 ) THEN
616.EQ.
IF( ABS( KATYPE( JTYPE ) )3 ) THEN
617 IN = 2*( ( N-1 ) / 2 ) + 1
619 $ CALL DLASET( 'full
', N, N, ZERO, ZERO, A, LDA )
623 CALL DLATM4( KATYPE( JTYPE ), IN, KZ1( KAZERO( JTYPE ) ),
624 $ KZ2( KAZERO( JTYPE ) ), IASIGN( JTYPE ),
625 $ RMAGN( KAMAGN( JTYPE ) ), ULP,
626 $ RMAGN( KTRIAN( JTYPE )*KAMAGN( JTYPE ) ), 2,
628 IADD = KADD( KAZERO( JTYPE ) )
629.GT..AND..LE.
IF( IADD0 IADDN )
630 $ A( IADD, IADD ) = ONE
634.EQ.
IF( ABS( KBTYPE( JTYPE ) )3 ) THEN
635 IN = 2*( ( N-1 ) / 2 ) + 1
637 $ CALL DLASET( 'full
', N, N, ZERO, ZERO, B, LDA )
641 CALL DLATM4( KBTYPE( JTYPE ), IN, KZ1( KBZERO( JTYPE ) ),
642 $ KZ2( KBZERO( JTYPE ) ), IBSIGN( JTYPE ),
643 $ RMAGN( KBMAGN( JTYPE ) ), ONE,
644 $ RMAGN( KTRIAN( JTYPE )*KBMAGN( JTYPE ) ), 2,
646 IADD = KADD( KBZERO( JTYPE ) )
647.NE..AND..LE.
IF( IADD0 IADDN )
648 $ B( IADD, IADD ) = ONE
650.EQ..AND..GT.
IF( KCLASS( JTYPE )2 N0 ) THEN
659 Q( JR, JC ) = DLARND( 3, ISEED )
660 Z( JR, JC ) = DLARND( 3, ISEED )
662 CALL DLARFG( N+1-JC, Q( JC, JC ), Q( JC+1, JC ), 1,
664 WORK( 2*N+JC ) = SIGN( ONE, Q( JC, JC ) )
666 CALL DLARFG( N+1-JC, Z( JC, JC ), Z( JC+1, JC ), 1,
668 WORK( 3*N+JC ) = SIGN( ONE, Z( JC, JC ) )
673 WORK( 3*N ) = SIGN( ONE, DLARND( 2, ISEED ) )
676 WORK( 4*N ) = SIGN( ONE, DLARND( 2, ISEED ) )
682 A( JR, JC ) = WORK( 2*N+JR )*WORK( 3*N+JC )*
684 B( JR, JC ) = WORK( 2*N+JR )*WORK( 3*N+JC )*
688 CALL DORM2R( 'l
', 'n
', N, N, N-1, Q, LDQ, WORK, A,
689 $ LDA, WORK( 2*N+1 ), IERR )
692 CALL DORM2R( 'r
', 't
', N, N, N-1, Z, LDQ, WORK( N+1 ),
693 $ A, LDA, WORK( 2*N+1 ), IERR )
696 CALL DORM2R( 'l
', 'n
', N, N, N-1, Q, LDQ, WORK, B,
697 $ LDA, WORK( 2*N+1 ), IERR )
700 CALL DORM2R( 'r
', 't
', N, N, N-1, Z, LDQ, WORK( N+1 ),
701 $ B, LDA, WORK( 2*N+1 ), IERR )
711 A( JR, JC ) = RMAGN( KAMAGN( JTYPE ) )*
713 B( JR, JC ) = RMAGN( KBMAGN( JTYPE ) )*
722 WRITE( NOUNIT, FMT = 9999 )'generator
', IERR, N, JTYPE,
736 CALL DLACPY( ' ', N, N, A, LDA, S, LDA )
737 CALL DLACPY( ' ', N, N, B, LDA, T, LDA )
738 CALL DGGEV( 'v
', 'v
', N, S, LDA, T, LDA, ALPHAR, ALPHAI,
739 $ BETA, Q, LDQ, Z, LDQ, WORK, LWORK, IERR )
740.NE..AND..NE.
IF( IERR0 IERRN+1 ) THEN
742 WRITE( NOUNIT, FMT = 9999 )'dggev1
', IERR, N, JTYPE,
750 CALL DGET52( .TRUE., N, A, LDA, B, LDA, Q, LDQ, ALPHAR,
751 $ ALPHAI, BETA, WORK, RESULT( 1 ) )
752.GT.
IF( RESULT( 2 )THRESH ) THEN
753 WRITE( NOUNIT, FMT = 9998 )'left
', 'dggev1
',
754 $ RESULT( 2 ), N, JTYPE, IOLDSD
759 CALL DGET52( .FALSE., N, A, LDA, B, LDA, Z, LDQ, ALPHAR,
760 $ ALPHAI, BETA, WORK, RESULT( 3 ) )
761.GT.
IF( RESULT( 4 )THRESH ) THEN
762 WRITE( NOUNIT, FMT = 9998 )'right
', 'dggev1
',
763 $ RESULT( 4 ), N, JTYPE, IOLDSD
768 CALL DLACPY( ' ', N, N, A, LDA, S, LDA )
769 CALL DLACPY( ' ', N, N, B, LDA, T, LDA )
770 CALL DGGEV( 'n
', 'n
', N, S, LDA, T, LDA, ALPHR1, ALPHI1,
771 $ BETA1, Q, LDQ, Z, LDQ, WORK, LWORK, IERR )
772.NE..AND..NE.
IF( IERR0 IERRN+1 ) THEN
774 WRITE( NOUNIT, FMT = 9999 )'dggev2
', IERR, N, JTYPE,
781.NE..OR..NE.
IF( ALPHAR( J )ALPHR1( J ) ALPHAI( J )
782.OR..NE.
$ ALPHI1( J ) BETA( J )BETA1( J ) )RESULT( 5 )
789 CALL DLACPY( ' ', N, N, A, LDA, S, LDA )
790 CALL DLACPY( ' ', N, N, B, LDA, T, LDA )
791 CALL DGGEV( 'v
', 'n
', N, S, LDA, T, LDA, ALPHR1, ALPHI1,
792 $ BETA1, QE, LDQE, Z, LDQ, WORK, LWORK, IERR )
793.NE..AND..NE.
IF( IERR0 IERRN+1 ) THEN
795 WRITE( NOUNIT, FMT = 9999 )'dggev3', IERR, N, JTYPE,
802.NE..OR..NE.
IF( ALPHAR( J )ALPHR1( J ) ALPHAI( J )
803.OR..NE.
$ ALPHI1( J ) BETA( J )BETA1( J ) )RESULT( 6 )
809.NE.
IF( Q( J, JC )QE( J, JC ) )
810 $ RESULT( 6 ) = ULPINV
817 CALL DLACPY( ' ', N, N, A, LDA, S, LDA )
818 CALL DLACPY( ' ', N, N, B, LDA, T, LDA )
819 CALL DGGEV( 'n
', 'v
', N, S, LDA, T, LDA, ALPHR1, ALPHI1,
820 $ BETA1, Q, LDQ, QE, LDQE, WORK, LWORK, IERR )
821.NE..AND..NE.
IF( IERR0 IERRN+1 ) THEN
823 WRITE( NOUNIT, FMT = 9999 )'dggev4
', IERR, N, JTYPE,
830.NE..OR..NE.
IF( ALPHAR( J )ALPHR1( J ) ALPHAI( J )
831.OR..NE.
$ ALPHI1( J ) BETA( J )BETA1( J ) )RESULT( 7 )
837.NE.
IF( Z( J, JC )QE( J, JC ) )
838 $ RESULT( 7 ) = ULPINV
851.GE.
IF( RESULT( JR )THRESH ) THEN
856.EQ.
IF( NERRS0 ) THEN
857 WRITE( NOUNIT, FMT = 9997 )'dgv
'
861 WRITE( NOUNIT, FMT = 9996 )
862 WRITE( NOUNIT, FMT = 9995 )
863 WRITE( NOUNIT, FMT = 9994 )'orthogonal
'
867 WRITE( NOUNIT, FMT = 9993 )
871.LT.
IF( RESULT( JR )10000.0D0 ) THEN
872 WRITE( NOUNIT, FMT = 9992 )N, JTYPE, IOLDSD, JR,
875 WRITE( NOUNIT, FMT = 9991 )N, JTYPE, IOLDSD, JR,
886 CALL ALASVM( 'dgv', nounit, nerrs, ntestt, 0 )
892 9999
FORMAT(
' DDRGEV: ', a,
' returned INFO=', i6,
'.', / 3x,
'N='
893 $ i6,
', JTYPE=', i6,
', ISEED=(', 4( i4,
',' ), i5,
')' )
895 9998
FORMAT(
' DDRGEV: ', a,
' Eigenvectors from ', a,
' incorrectly ',
896 $
'normalized.', /
' Bits of error=', 0p, g10.3,
',', 3x,
897 $
'N=', i4,
', JTYPE=', i3,
', ISEED=(', 4( i4,
',' ), i5,
900 9997
FORMAT( / 1x, a3,
' -- Real Generalized eigenvalue problem driver'
903 9996
FORMAT(
' Matrix types (see DDRGEV for details): ' )
905 9995
FORMAT(
' Special Matrices:', 23x,
906 $
'(J''=transposed Jordan block)',
907 $ /
' 1=(0,0) 2=(I,0) 3=(0,I) 4=(I,I) 5=(J'',J'')
',
908 $ '6=(diag(j
'',i), diag(i,j
''))
', / ' diagonal matrices: (
',
909 $ 'd=diag(0,1,2,...) )
', / ' 7=(d,i) 9=(large*d, small*i
',
910 $ ') 11=(large*i, small*d) 13=(large*d, large*i)
', /
911 $ ' 8=(i,d) 10=(small*d, large
',
912 $ ' 14=(small*d, small*i)
', / ' 15=(d, reversed d)
' )
913 9994 FORMAT( ' matrices rotated by random
', A, ' matrices u, v:
',
914 $ / ' 16=transposed jordan blocks 19=geometric
',
915 $ 'alpha, beta=0,1
', / ' 17=arithm.
alpha&beta
',
916 $ ' 20=arithmetic
alpha, beta=0,1
', / ' 18=clustered
',
917 $ 'alpha, beta=0,1 21=random
alpha, beta=0,1
',
918 $ / ' large & small matrices:
', / ' 22=(large, small)
',
919 $ '23=(small,large) 24=(small,small) 25=(large,large)
',
920 $ / ' 26=random o(1) matrices.
' )
922 9993 FORMAT( / ' tests performed:
',
923 $ / ' 1 =
max | ( b a - a b )
''*l | / const.,
',
924 $ / ' 2 = | |vr(i)| - 1 | / ulp,
',
925 $ / ' 3 =
max | ( b a - a b )*r | / const.
',
926 $ / ' 4 = | |vl(i)| - 1 | / ulp,
',
927 $ / ' 5 = 0
if w same no matter
if r or l computed,
',
928 $ / ' 6 = 0
if l same no matter
if l computed,
',
929 $ / ' 7 = 0
if r same no matter
if r computed,
', / 1X )
930 9992 FORMAT( ' matrix order=
', I5, ', type=
', I2, ',
seed=
',
931 $ 4( I4, ',
' ), ' result ', i2,
' is', 0p, f8.2 )
932 9991
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
933 $ 4( i4,
',' ),
' result ', i2,
' is', 1p, d10.3 )