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 = 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(
'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 )
609 IF( mtypes.GT.maxtyp )
612 IF( kclass( jtype ).LT.3 )
THEN
616 IF( abs( katype( jtype ) ).EQ.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 IF( iadd.GT.0 .AND. iadd.LE.n )
630 $ a( iadd, iadd ) = one
634 IF( abs( kbtype( jtype ) ).EQ.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 IF( iadd.NE.0 .AND. iadd.LE.n )
648 $ b( iadd, iadd ) = one
650 IF( kclass( jtype ).EQ.2 .AND. n.GT.0 )
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 dggev3(
'V',
'V', n, s, lda, t, lda, alphar, alphai,
739 $ beta, q, ldq, z, ldq, work, lwork, ierr )
740 IF( ierr.NE.0 .AND. ierr.NE.n+1 )
THEN
742 WRITE( nounit, fmt = 9999 )
'DGGEV31', ierr, n, jtype,
750 CALL dget52( .true., n, a, lda, b, lda, q, ldq, alphar,
751 $ alphai, beta, work, result( 1 ) )
752 IF( result( 2 ).GT.thresh )
THEN
753 WRITE( nounit, fmt = 9998 )
'Left',
'DGGEV31',
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 IF( result( 4 ).GT.thresh )
THEN
762 WRITE( nounit, fmt = 9998 )
'Right',
'DGGEV31',
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 dggev3(
'N',
'N', n, s, lda, t, lda, alphr1, alphi1,
771 $ beta1, q, ldq, z, ldq, work, lwork, ierr )
772 IF( ierr.NE.0 .AND. ierr.NE.n+1 )
THEN
774 WRITE( nounit, fmt = 9999 )
'DGGEV32', ierr, n, jtype,
781 IF( alphar( j ).NE.alphr1( j ) .OR. alphai( j ).NE.
782 $ alphi1( j ) .OR. beta( j ).NE.beta1( j ) )result( 5 )
789 CALL dlacpy(
' ', n, n, a, lda, s, lda )
790 CALL dlacpy(
' ', n, n, b, lda, t, lda )
791 CALL dggev3(
'V',
'N', n, s, lda, t, lda, alphr1, alphi1,
792 $ beta1, qe, ldqe, z, ldq, work, lwork, ierr )
793 IF( ierr.NE.0 .AND. ierr.NE.n+1 )
THEN
795 WRITE( nounit, fmt = 9999 )
'DGGEV33', ierr, n, jtype,
802 IF( alphar( j ).NE.alphr1( j ) .OR. alphai( j ).NE.
803 $ alphi1( j ) .OR. beta( j ).NE.beta1( j ) )result( 6 )
809 IF( q( j, jc ).NE.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 dggev3(
'N',
'V', n, s, lda, t, lda, alphr1, alphi1,
820 $ beta1, q, ldq, qe, ldqe, work, lwork, ierr )
821 IF( ierr.NE.0 .AND. ierr.NE.n+1 )
THEN
823 WRITE( nounit, fmt = 9999 )
'DGGEV34', ierr, n, jtype,
830 IF( alphar( j ).NE.alphr1( j ) .OR. alphai( j ).NE.
831 $ alphi1( j ) .OR. beta( j ).NE.beta1( j ) )result( 7 )
837 IF( z( j, jc ).NE.qe( j, jc ) )
838 $ result( 7 ) = ulpinv
851 IF( result( jr ).GE.thresh )
THEN
856 IF( nerrs.EQ.0 )
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 IF( result( jr ).LT.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(
' DDRGEV3: ', a,
' returned INFO=', i6,
'.', / 3x,
'N=',
893 $ i6,
', JTYPE=', i6,
', ISEED=(', 4( i4,
',' ), i5,
')' )
895 9998
FORMAT(
' DDRGEV3: ', a,
' Eigenvectors from ', a,
896 $
' incorrectly normalized.', /
' Bits of error=', 0p, g10.3,
897 $
',', 3x,
'N=', i4,
', JTYPE=', i3,
', ISEED=(',
898 $ 4( i4,
',' ), i5,
')' )
900 9997
FORMAT( / 1x, a3,
' -- Real Generalized eigenvalue problem driver'
903 9996
FORMAT(
' Matrix types (see DDRGEV3 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*I) 12=(small*I, large*D) ',
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 )
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 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...