404 SUBROUTINE sdrgev( 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,
420 INTEGER ISEED( 4 ), NN( * )
421 REAL A( LDA, * ), ALPHAI( * ), ALPHI1( * ),
422 $ alphar( * ), alphr1( * ), b( lda, * ),
423 $ beta( * ), beta1( * ), q( ldq, * ),
424 $ qe( ldqe, * ), result( * ), s( lda, * ),
425 $ t( lda, * ), work( * ), z( ldq, * )
432 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+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 REAL 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 )
455 EXTERNAL ILAENV, SLAMCH, SLARND
462 INTRINSIC abs, max, min, real, 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,
'SGEQRF',
' ', nmax, 1, nmax,
528 maxwrk = max( maxwrk, nmax*( nmax+1 ) )
532 IF( lwork.LT.minwrk )
536 CALL xerbla(
'SDRGEV', -info )
542 IF( nsizes.EQ.0 .OR. ntypes.EQ.0 )
545 safmin = slamch(
'Safe minimum' )
546 ulp = slamch(
'Epsilon' )*slamch(
'Base' )
547 safmin = safmin / ulp
548 safmax = one / safmin
549 CALL slabad( safmin, safmax )
563 DO 220 jsize = 1, nsizes
566 rmagn( 2 ) = safmax*ulp / real( 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 slaset(
'Full', n, n, zero, zero, a, lda )
623 CALL slatm4( 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 slaset(
'Full', n, n, zero, zero, b, lda )
641 CALL slatm4( 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 ) = slarnd( 3, iseed )
660 z( jr, jc ) = slarnd( 3, iseed )
662 CALL slarfg( n+1-jc, q( jc, jc ), q( jc+1, jc ), 1,
664 work( 2*n+jc ) = sign( one, q( jc, jc ) )
666 CALL slarfg( 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, slarnd( 2, iseed ) )
676 work( 4*n ) = sign( one, slarnd( 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 sorm2r(
'L',
'N', n, n, n-1, q, ldq, work, a,
689 $ lda, work( 2*n+1 ), ierr )
692 CALL sorm2r(
'R',
'T', n, n, n-1, z, ldq, work( n+1 ),
693 $ a, lda, work( 2*n+1 ), ierr )
696 CALL sorm2r(
'L',
'N', n, n, n-1, q, ldq, work, b,
697 $ lda, work( 2*n+1 ), ierr )
700 CALL sorm2r(
'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 slacpy(
' ', n, n, a, lda, s, lda )
737 CALL slacpy(
' ', n, n, b, lda, t, lda )
738 CALL sggev(
'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 )
'SGGEV1', ierr, n, jtype,
750 CALL sget52( .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',
'SGGEV1',
754 $ result( 2 ), n, jtype, ioldsd
759 CALL sget52( .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',
'SGGEV1',
763 $ result( 4 ), n, jtype, ioldsd
768 CALL slacpy(
' ', n, n, a, lda, s, lda )
769 CALL slacpy(
' ', n, n, b, lda, t, lda )
770 CALL sggev(
'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 )
'SGGEV2', ierr, n, jtype,
781 IF( alphar( j ).NE.alphr1( j ) .OR. alphai( j ).NE.
782 $ alphi1( j ) .OR. beta( j ).NE.beta1( j ) )
783 $ result( 5 ) = ulpinv
789 CALL slacpy(
' ', n, n, a, lda, s, lda )
790 CALL slacpy(
' ', n, n, b, lda, t, lda )
791 CALL sggev(
'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 )
'SGGEV3', ierr, n, jtype,
802 IF( alphar( j ).NE.alphr1( j ) .OR. alphai( j ).NE.
803 $ alphi1( j ) .OR. beta( j ).NE.beta1( j ) )
804 $ result( 6 ) = ulpinv
809 IF( q( j, jc ).NE.qe( j, jc ) )
810 $ result( 6 ) = ulpinv
817 CALL slacpy(
' ', n, n, a, lda, s, lda )
818 CALL slacpy(
' ', n, n, b, lda, t, lda )
819 CALL sggev(
'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 )
'SGGEV4', ierr, n, jtype,
830 IF( alphar( j ).NE.alphr1( j ) .OR. alphai( j ).NE.
831 $ alphi1( j ) .OR. beta( j ).NE.beta1( j ) )
832 $ result( 7 ) = ulpinv
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 )
'SGV'
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.0 )
THEN
872 WRITE( nounit, fmt = 9992 )n, jtype, ioldsd, jr,
875 WRITE( nounit, fmt = 9991 )n, jtype, ioldsd, jr,
886 CALL alasvm(
'SGV', nounit, nerrs, ntestt, 0 )
892 9999
FORMAT(
' SDRGEV: ', a,
' returned INFO=', i6,
'.', / 3x,
'N=',
893 $ i6,
', JTYPE=', i6,
', ISEED=(', 4( i4,
',' ), i5,
')' )
895 9998
FORMAT(
' SDRGEV: ', 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 SDRGEV 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, e10.3 )
subroutine slabad(SMALL, LARGE)
SLABAD
subroutine slaset(UPLO, M, N, ALPHA, BETA, A, LDA)
SLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine slacpy(UPLO, M, N, A, LDA, B, LDB)
SLACPY copies all or part of one two-dimensional array to another.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine alasvm(TYPE, NOUT, NFAIL, NRUN, NERRS)
ALASVM
subroutine sggev(JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR, ALPHAI, BETA, VL, LDVL, VR, LDVR, WORK, LWORK, INFO)
SGGEV computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices
subroutine slarfg(N, ALPHA, X, INCX, TAU)
SLARFG generates an elementary reflector (Householder matrix).
subroutine sorm2r(SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, INFO)
SORM2R multiplies a general matrix by the orthogonal matrix from a QR factorization determined by sge...
subroutine sget52(LEFT, N, A, LDA, B, LDB, E, LDE, ALPHAR, ALPHAI, BETA, WORK, RESULT)
SGET52
subroutine sdrgev(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)
SDRGEV
subroutine slatm4(ITYPE, N, NZ1, NZ2, ISIGN, AMAGN, RCOND, TRIANG, IDIST, ISEED, A, LDA)
SLATM4