404 SUBROUTINE sdrgev3( 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(
'SDRGEV3', -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,
744 CALL slacpy(
' ', n, n, a, lda, s, lda )
745 CALL slacpy(
' ', n, n, b, lda, t, lda )
746 CALL sggev3(
'V',
'V', n, s, lda, t, lda, alphar, alphai,
747 $ beta, q, ldq, z, ldq, work, lwork, ierr )
748 IF( ierr.NE.0 .AND. ierr.NE.n+1 )
THEN
750 WRITE( nounit, fmt = 9999 )
'SGGEV31', ierr, n, jtype,
758 CALL sget52( .true., n, a, lda, b, lda, q, ldq, alphar,
759 $ alphai, beta, work, result( 1 ) )
760 IF( result( 2 ).GT.thresh )
THEN
761 WRITE( nounit, fmt = 9998 )
'Left',
'SGGEV31',
762 $ result( 2 ), n, jtype, ioldsd
767 CALL sget52( .false., n, a, lda, b, lda, z, ldq, alphar,
768 $ alphai, beta, work, result( 3 ) )
769 IF( result( 4 ).GT.thresh )
THEN
770 WRITE( nounit, fmt = 9998 )
'Right',
'SGGEV31',
771 $ result( 4 ), n, jtype, ioldsd
776 CALL slacpy(
' ', n, n, a, lda, s, lda )
777 CALL slacpy(
' ', n, n, b, lda, t, lda )
778 CALL sggev3(
'N',
'N', n, s, lda, t, lda, alphr1, alphi1,
779 $ beta1, q, ldq, z, ldq, work, lwork, ierr )
780 IF( ierr.NE.0 .AND. ierr.NE.n+1 )
THEN
782 WRITE( nounit, fmt = 9999 )
'SGGEV32', ierr, n, jtype,
789 IF( alphar( j ).NE.alphr1( j ) .OR.
790 $ beta( j ).NE. beta1( j ) )
THEN
798 CALL slacpy(
' ', n, n, a, lda, s, lda )
799 CALL slacpy(
' ', n, n, b, lda, t, lda )
800 CALL sggev3(
'V',
'N', n, s, lda, t, lda, alphr1, alphi1,
801 $ beta1, qe, ldqe, z, ldq, work, lwork, ierr )
802 IF( ierr.NE.0 .AND. ierr.NE.n+1 )
THEN
804 WRITE( nounit, fmt = 9999 )
'SGGEV33', ierr, n, jtype,
811 IF( alphar( j ).NE.alphr1( j ) .OR. alphai( j ).NE.
812 $ alphi1( j ) .OR. beta( j ).NE.beta1( j ) )
813 $ result( 6 ) = ulpinv
818 IF( q( j, jc ).NE.qe( j, jc ) )
819 $ result( 6 ) = ulpinv
826 CALL slacpy(
' ', n, n, a, lda, s, lda )
827 CALL slacpy(
' ', n, n, b, lda, t, lda )
828 CALL sggev3(
'N',
'V', n, s, lda, t, lda, alphr1, alphi1,
829 $ beta1, q, ldq, qe, ldqe, work, lwork, ierr )
830 IF( ierr.NE.0 .AND. ierr.NE.n+1 )
THEN
832 WRITE( nounit, fmt = 9999 )
'SGGEV34', ierr, n, jtype,
839 IF( alphar( j ).NE.alphr1( j ) .OR. alphai( j ).NE.
840 $ alphi1( j ) .OR. beta( j ).NE.beta1( j ) )
841 $ result( 7 ) = ulpinv
846 IF( z( j, jc ).NE.qe( j, jc ) )
847 $ result( 7 ) = ulpinv
860 IF( result( jr ).GE.thresh )
THEN
865 IF( nerrs.EQ.0 )
THEN
866 WRITE( nounit, fmt = 9997 )
'SGV'
870 WRITE( nounit, fmt = 9996 )
871 WRITE( nounit, fmt = 9995 )
872 WRITE( nounit, fmt = 9994 )
'Orthogonal'
876 WRITE( nounit, fmt = 9993 )
880 IF( result( jr ).LT.10000.0 )
THEN
881 WRITE( nounit, fmt = 9992 )n, jtype, ioldsd, jr,
884 WRITE( nounit, fmt = 9991 )n, jtype, ioldsd, jr,
895 CALL alasvm(
'SGV', nounit, nerrs, ntestt, 0 )
901 9999
FORMAT(
' SDRGEV3: ', a,
' returned INFO=', i6,
'.', / 3x,
'N=',
902 $ i6,
', JTYPE=', i6,
', ISEED=(', 4( i4,
',' ), i5,
')' )
904 9998
FORMAT(
' SDRGEV3: ', a,
' Eigenvectors from ', a,
905 $
' incorrectly normalized.', /
' Bits of error=', 0p, g10.3,
906 $
',', 3x,
'N=', i4,
', JTYPE=', i3,
', ISEED=(',
907 $ 4( i4,
',' ), i5,
')' )
909 9997
FORMAT( / 1x, a3,
' -- Real Generalized eigenvalue problem driver'
912 9996
FORMAT(
' Matrix types (see SDRGEV3 for details): ' )
914 9995
FORMAT(
' Special Matrices:', 23x,
915 $
'(J''=transposed Jordan block)',
916 $ /
' 1=(0,0) 2=(I,0) 3=(0,I) 4=(I,I) 5=(J'',J'') ',
917 $
'6=(diag(J'',I), diag(I,J''))', /
' Diagonal Matrices: ( ',
918 $
'D=diag(0,1,2,...) )', /
' 7=(D,I) 9=(large*D, small*I',
919 $
') 11=(large*I, small*D) 13=(large*D, large*I)', /
920 $
' 8=(I,D) 10=(small*D, large*I) 12=(small*I, large*D) ',
921 $
' 14=(small*D, small*I)', /
' 15=(D, reversed D)' )
922 9994
FORMAT(
' Matrices Rotated by Random ', a,
' Matrices U, V:',
923 $ /
' 16=Transposed Jordan Blocks 19=geometric ',
924 $
'alpha, beta=0,1', /
' 17=arithm. alpha&beta ',
925 $
' 20=arithmetic alpha, beta=0,1', /
' 18=clustered ',
926 $
'alpha, beta=0,1 21=random alpha, beta=0,1',
927 $ /
' Large & Small Matrices:', /
' 22=(large, small) ',
928 $
'23=(small,large) 24=(small,small) 25=(large,large)',
929 $ /
' 26=random O(1) matrices.' )
931 9993
FORMAT( /
' Tests performed: ',
932 $ /
' 1 = max | ( b A - a B )''*l | / const.,',
933 $ /
' 2 = | |VR(i)| - 1 | / ulp,',
934 $ /
' 3 = max | ( b A - a B )*r | / const.',
935 $ /
' 4 = | |VL(i)| - 1 | / ulp,',
936 $ /
' 5 = 0 if W same no matter if r or l computed,',
937 $ /
' 6 = 0 if l same no matter if l computed,',
938 $ /
' 7 = 0 if r same no matter if r computed,', / 1x )
939 9992
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
940 $ 4( i4,
',' ),
' result ', i2,
' is', 0p, f8.2 )
941 9991
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
942 $ 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 xlaenv(ISPEC, NVALUE)
XLAENV
subroutine sggev3(JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHAR, ALPHAI, BETA, VL, LDVL, VR, LDVR, WORK, LWORK, INFO)
SGGEV3 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 sdrgev3(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)
SDRGEV3
subroutine sget52(LEFT, N, A, LDA, B, LDB, E, LDE, ALPHAR, ALPHAI, BETA, WORK, RESULT)
SGET52
subroutine slatm4(ITYPE, N, NZ1, NZ2, ISIGN, AMAGN, RCOND, TRIANG, IDIST, ISEED, A, LDA)
SLATM4