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
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 = 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 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, 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, 1, 2, 3, 4, 1, 4, 4, 1, 1, 4,
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 /
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, 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
635 IF( abs( kbtype( jtype ) ).EQ.3 )
THEN
636 in = 2*( ( n-1 ) / 2 ) + 1
638 $
CALL dlaset(
'Full', n, n, zero, zero, b, lda )
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( jtype ) ), 2,
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 IF( ierr.NE.0 .AND. ierr.NE.n+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 IF( result( 2 ).GT.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 IF( result( 4 ).GT.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 IF( ierr.NE.0 .AND. ierr.NE.n+1 )
THEN
809 WRITE( nounit, fmt = 9999 )
'DGGEV32', ierr, n, jtype,
816 IF( alphar( j ).NE.alphr1( j ) .OR. alphai( j ).NE.
817 $ alphi1( j ) .OR. beta( j ).NE.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 IF( ierr.NE.0 .AND. ierr.NE.n+1 )
THEN
830 WRITE( nounit, fmt = 9999 )
'DGGEV33', ierr, n, jtype,
837 IF( alphar( j ).NE.alphr1( j ) .OR. alphai( j ).NE.
838 $ alphi1( j ) .OR. beta( j ).NE.beta1( j ) )result( 6 )
844 IF( q( j, jc ).NE.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 IF( ierr.NE.0 .AND. ierr.NE.n+1 )
THEN
858 WRITE( nounit, fmt = 9999 )
'DGGEV34', ierr, n, jtype,
865 IF( alphar( j ).NE.alphr1( j ) .OR. alphai( j ).NE.
866 $ alphi1( j ) .OR. beta( j ).NE.beta1( j ) )result( 7 )
872 IF( z( j, jc ).NE.qe( j, jc ) )
873 $ result( 7 ) = ulpinv
886 IF( result( jr ).GE.thresh )
THEN
891 IF( nerrs.EQ.0 )
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 IF( result( jr ).LT.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 )
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine dlacpy(UPLO, M, N, A, LDA, B, LDB)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine alasvm(TYPE, NOUT, NFAIL, NRUN, NERRS)
ALASVM
subroutine xlaenv(ISPEC, NVALUE)
XLAENV
subroutine dlatm4(ITYPE, N, NZ1, NZ2, ISIGN, AMAGN, RCOND, TRIANG, IDIST, ISEED, A, LDA)
DLATM4
subroutine dget52(LEFT, N, A, LDA, B, LDB, E, LDE, ALPHAR, ALPHAI, BETA, WORK, RESULT)
DGET52
subroutine ddrgev3(NSIZES, NN, NTYPES, DOTYPE, ISEED, THRESH, NOUNIT, A, LDA, B, S, T, Q, LDQ, Z, QE, LDQE, ALPHAR, ALPHAI, BETA, ALPHR1, ALPHI1, BETA1, WORK, LWORK, RESULT, INFO)
DDRGEV3
subroutine dggev3(JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR, ALPHAI, BETA, VL, LDVL, VR, LDVR, WORK, LWORK, INFO)
DGGEV3 computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices (...
subroutine dlarfg(N, ALPHA, X, INCX, TAU)
DLARFG generates an elementary reflector (Householder matrix).
subroutine dorm2r(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, INFO)
DORM2R multiplies a general matrix by the orthogonal matrix from a QR factorization determined by sge...