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 ), 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 /
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 IF( lwork.LT.minwrk )
536 CALL xerbla(
'DDRGEV', -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
562 DO 220 jsize = 1, nsizes
565 rmagn( 2 ) = safmax*ulp / dble( n1 )
566 rmagn( 3 ) = safmin*ulpinv*n1
568 IF( nsizes.NE.1 )
THEN
569 mtypes = min( maxtyp, ntypes )
571 mtypes = min( maxtyp+1, ntypes )
574 DO 210 jtype = 1, mtypes
575 IF( .NOT.dotype( jtype ) )
582 ioldsd( j ) = iseed( j )
608 IF( mtypes.GT.maxtyp )
611 IF( kclass( jtype ).LT.3 )
THEN
615 IF( abs( katype( jtype ) ).EQ.3 )
THEN
616 in = 2*( ( n-1 ) / 2 ) + 1
618 $
CALL dlaset(
'Full', n, n, zero, zero, a, lda )
622 CALL dlatm4( katype( jtype ), in, kz1( kazero( jtype ) ),
623 $ kz2( kazero( jtype ) ), iasign( jtype ),
624 $ rmagn( kamagn( jtype ) ), ulp,
625 $ rmagn( ktrian( jtype )*kamagn( jtype ) ), 2,
627 iadd = kadd( kazero( jtype ) )
628 IF( iadd.GT.0 .AND. iadd.LE.n )
629 $ a( iadd, iadd ) = one
633 IF( abs( kbtype( jtype ) ).EQ.3 )
THEN
634 in = 2*( ( n-1 ) / 2 ) + 1
636 $
CALL dlaset(
'Full', n, n, zero, zero, b, lda )
640 CALL dlatm4( kbtype( jtype ), in, kz1( kbzero( jtype ) ),
641 $ kz2( kbzero( jtype ) ), ibsign( jtype ),
642 $ rmagn( kbmagn( jtype ) ), one,
643 $ rmagn( ktrian( jtype )*kbmagn( jtype ) ), 2,
645 iadd = kadd( kbzero( jtype ) )
646 IF( iadd.NE.0 .AND. iadd.LE.n )
647 $ b( iadd, iadd ) = one
649 IF( kclass( jtype ).EQ.2 .AND. n.GT.0 )
THEN
658 q( jr, jc ) = dlarnd( 3, iseed )
659 z( jr, jc ) = dlarnd( 3, iseed )
661 CALL dlarfg( n+1-jc, q( jc, jc ), q( jc+1, jc ), 1,
663 work( 2*n+jc ) = sign( one, q( jc, jc ) )
665 CALL dlarfg( n+1-jc, z( jc, jc ), z( jc+1, jc ), 1,
667 work( 3*n+jc ) = sign( one, z( jc, jc ) )
672 work( 3*n ) = sign( one, dlarnd( 2, iseed ) )
675 work( 4*n ) = sign( one, dlarnd( 2, iseed ) )
681 a( jr, jc ) = work( 2*n+jr )*work( 3*n+jc )*
683 b( jr, jc ) = work( 2*n+jr )*work( 3*n+jc )*
687 CALL dorm2r(
'L',
'N', n, n, n-1, q, ldq, work, a,
688 $ lda, work( 2*n+1 ), ierr )
691 CALL dorm2r(
'R',
'T', n, n, n-1, z, ldq, work( n+1 ),
692 $ a, lda, work( 2*n+1 ), ierr )
695 CALL dorm2r(
'L',
'N', n, n, n-1, q, ldq, work, b,
696 $ lda, work( 2*n+1 ), ierr )
699 CALL dorm2r(
'R',
'T', n, n, n-1, z, ldq, work( n+1 ),
700 $ b, lda, work( 2*n+1 ), ierr )
710 a( jr, jc ) = rmagn( kamagn( jtype ) )*
712 b( jr, jc ) = rmagn( kbmagn( jtype ) )*
721 WRITE( nounit, fmt = 9999 )
'Generator', ierr, n, jtype,
735 CALL dlacpy(
' ', n, n, a, lda, s, lda )
736 CALL dlacpy(
' ', n, n, b, lda, t, lda )
737 CALL dggev(
'V',
'V', n, s, lda, t, lda, alphar, alphai,
738 $ beta, q, ldq, z, ldq, work, lwork, ierr )
739 IF( ierr.NE.0 .AND. ierr.NE.n+1 )
THEN
741 WRITE( nounit, fmt = 9999 )
'DGGEV1', ierr, n, jtype,
749 CALL dget52( .true., n, a, lda, b, lda, q, ldq, alphar,
750 $ alphai, beta, work, result( 1 ) )
751 IF( result( 2 ).GT.thresh )
THEN
752 WRITE( nounit, fmt = 9998 )
'Left',
'DGGEV1',
753 $ result( 2 ), n, jtype, ioldsd
758 CALL dget52( .false., n, a, lda, b, lda, z, ldq, alphar,
759 $ alphai, beta, work, result( 3 ) )
760 IF( result( 4 ).GT.thresh )
THEN
761 WRITE( nounit, fmt = 9998 )
'Right',
'DGGEV1',
762 $ result( 4 ), n, jtype, ioldsd
767 CALL dlacpy(
' ', n, n, a, lda, s, lda )
768 CALL dlacpy(
' ', n, n, b, lda, t, lda )
769 CALL dggev(
'N',
'N', n, s, lda, t, lda, alphr1, alphi1,
770 $ beta1, q, ldq, z, ldq, work, lwork, ierr )
771 IF( ierr.NE.0 .AND. ierr.NE.n+1 )
THEN
773 WRITE( nounit, fmt = 9999 )
'DGGEV2', ierr, n, jtype,
780 IF( alphar( j ).NE.alphr1( j ) .OR. alphai( j ).NE.
781 $ alphi1( j ) .OR. beta( j ).NE.beta1( j ) )result( 5 )
788 CALL dlacpy(
' ', n, n, a, lda, s, lda )
789 CALL dlacpy(
' ', n, n, b, lda, t, lda )
790 CALL dggev(
'V',
'N', n, s, lda, t, lda, alphr1, alphi1,
791 $ beta1, qe, ldqe, z, ldq, work, lwork, ierr )
792 IF( ierr.NE.0 .AND. ierr.NE.n+1 )
THEN
794 WRITE( nounit, fmt = 9999 )
'DGGEV3', ierr, n, jtype,
801 IF( alphar( j ).NE.alphr1( j ) .OR. alphai( j ).NE.
802 $ alphi1( j ) .OR. beta( j ).NE.beta1( j ) )result( 6 )
808 IF( q( j, jc ).NE.qe( j, jc ) )
809 $ result( 6 ) = ulpinv
816 CALL dlacpy(
' ', n, n, a, lda, s, lda )
817 CALL dlacpy(
' ', n, n, b, lda, t, lda )
818 CALL dggev(
'N',
'V', n, s, lda, t, lda, alphr1, alphi1,
819 $ beta1, q, ldq, qe, ldqe, work, lwork, ierr )
820 IF( ierr.NE.0 .AND. ierr.NE.n+1 )
THEN
822 WRITE( nounit, fmt = 9999 )
'DGGEV4', ierr, n, jtype,
829 IF( alphar( j ).NE.alphr1( j ) .OR. alphai( j ).NE.
830 $ alphi1( j ) .OR. beta( j ).NE.beta1( j ) )result( 7 )
836 IF( z( j, jc ).NE.qe( j, jc ) )
837 $ result( 7 ) = ulpinv
850 IF( result( jr ).GE.thresh )
THEN
855 IF( nerrs.EQ.0 )
THEN
856 WRITE( nounit, fmt = 9997 )
'DGV'
860 WRITE( nounit, fmt = 9996 )
861 WRITE( nounit, fmt = 9995 )
862 WRITE( nounit, fmt = 9994 )
'Orthogonal'
866 WRITE( nounit, fmt = 9993 )
870 IF( result( jr ).LT.10000.0d0 )
THEN
871 WRITE( nounit, fmt = 9992 )n, jtype, ioldsd, jr,
874 WRITE( nounit, fmt = 9991 )n, jtype, ioldsd, jr,
885 CALL alasvm(
'DGV', nounit, nerrs, ntestt, 0 )
891 9999
FORMAT(
' DDRGEV: ', a,
' returned INFO=', i6,
'.', / 3x,
'N=',
892 $ i6,
', JTYPE=', i6,
', ISEED=(', 4( i4,
',' ), i5,
')' )
894 9998
FORMAT(
' DDRGEV: ', a,
' Eigenvectors from ', a,
' incorrectly ',
895 $
'normalized.', /
' Bits of error=', 0p, g10.3,
',', 3x,
896 $
'N=', i4,
', JTYPE=', i3,
', ISEED=(', 4( i4,
',' ), i5,
899 9997
FORMAT( / 1x, a3,
' -- Real Generalized eigenvalue problem driver'
902 9996
FORMAT(
' Matrix types (see DDRGEV for details): ' )
904 9995
FORMAT(
' Special Matrices:', 23x,
905 $
'(J''=transposed Jordan block)',
906 $ /
' 1=(0,0) 2=(I,0) 3=(0,I) 4=(I,I) 5=(J'',J'') ',
907 $
'6=(diag(J'',I), diag(I,J''))', /
' Diagonal Matrices: ( ',
908 $
'D=diag(0,1,2,...) )', /
' 7=(D,I) 9=(large*D, small*I',
909 $
') 11=(large*I, small*D) 13=(large*D, large*I)', /
910 $
' 8=(I,D) 10=(small*D, large*I) 12=(small*I, large*D) ',
911 $
' 14=(small*D, small*I)', /
' 15=(D, reversed D)' )
912 9994
FORMAT(
' Matrices Rotated by Random ', a,
' Matrices U, V:',
913 $ /
' 16=Transposed Jordan Blocks 19=geometric ',
914 $
'alpha, beta=0,1', /
' 17=arithm. alpha&beta ',
915 $
' 20=arithmetic alpha, beta=0,1', /
' 18=clustered ',
916 $
'alpha, beta=0,1 21=random alpha, beta=0,1',
917 $ /
' Large & Small Matrices:', /
' 22=(large, small) ',
918 $
'23=(small,large) 24=(small,small) 25=(large,large)',
919 $ /
' 26=random O(1) matrices.' )
921 9993
FORMAT( /
' Tests performed: ',
922 $ /
' 1 = max | ( b A - a B )''*l | / const.,',
923 $ /
' 2 = | |VR(i)| - 1 | / ulp,',
924 $ /
' 3 = max | ( b A - a B )*r | / const.',
925 $ /
' 4 = | |VL(i)| - 1 | / ulp,',
926 $ /
' 5 = 0 if W same no matter if r or l computed,',
927 $ /
' 6 = 0 if l same no matter if l computed,',
928 $ /
' 7 = 0 if r same no matter if r computed,', / 1x )
929 9992
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
930 $ 4( i4,
',' ),
' result ', i2,
' is', 0p, f8.2 )
931 9991
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
932 $ 4( i4,
',' ),
' result ', i2,
' is', 1p, d10.3 )
subroutine alasvm(type, nout, nfail, nrun, nerrs)
ALASVM
subroutine xerbla(srname, info)
subroutine ddrgev(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)
DDRGEV
subroutine dget52(left, n, a, lda, b, ldb, e, lde, alphar, alphai, beta, work, result)
DGET52
subroutine dlatm4(itype, n, nz1, nz2, isign, amagn, rcond, triang, idist, iseed, a, lda)
DLATM4
subroutine dggev(jobvl, jobvr, n, a, lda, b, ldb, alphar, alphai, beta, vl, ldvl, vr, ldvr, work, lwork, info)
DGGEV computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices
subroutine dlacpy(uplo, m, n, a, lda, b, ldb)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dlarfg(n, alpha, x, incx, tau)
DLARFG generates an elementary reflector (Householder matrix).
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 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...