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,
736 CALL slacpy(
' ', n, n, a, lda, s, lda )
737 CALL slacpy(
' ', n, n, b, lda, t, lda )
738 CALL sggev3(
'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 )
'SGGEV31', 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',
'SGGEV31',
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',
'SGGEV31',
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 sggev3(
'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 )
'SGGEV32', ierr, n, jtype,
781 IF( alphar( j ).NE.alphr1( j ) .OR.
782 $ beta( j ).NE. beta1( j ) )
THEN
790 CALL slacpy(
' ', n, n, a, lda, s, lda )
791 CALL slacpy(
' ', n, n, b, lda, t, lda )
792 CALL sggev3(
'V',
'N', n, s, lda, t, lda, alphr1, alphi1,
793 $ beta1, qe, ldqe, z, ldq, work, lwork, ierr )
794 IF( ierr.NE.0 .AND. ierr.NE.n+1 )
THEN
796 WRITE( nounit, fmt = 9999 )
'SGGEV33', ierr, n, jtype,
803 IF( alphar( j ).NE.alphr1( j ) .OR. alphai( j ).NE.
804 $ alphi1( j ) .OR. beta( j ).NE.beta1( j ) )
805 $ result( 6 ) = ulpinv
810 IF( q( j, jc ).NE.qe( j, jc ) )
811 $ result( 6 ) = ulpinv
818 CALL slacpy(
' ', n, n, a, lda, s, lda )
819 CALL slacpy(
' ', n, n, b, lda, t, lda )
820 CALL sggev3(
'N',
'V', n, s, lda, t, lda, alphr1, alphi1,
821 $ beta1, q, ldq, qe, ldqe, work, lwork, ierr )
822 IF( ierr.NE.0 .AND. ierr.NE.n+1 )
THEN
824 WRITE( nounit, fmt = 9999 )
'SGGEV34', ierr, n, jtype,
831 IF( alphar( j ).NE.alphr1( j ) .OR. alphai( j ).NE.
832 $ alphi1( j ) .OR. beta( j ).NE.beta1( j ) )
833 $ result( 7 ) = ulpinv
838 IF( z( j, jc ).NE.qe( j, jc ) )
839 $ result( 7 ) = ulpinv
852 IF( result( jr ).GE.thresh )
THEN
857 IF( nerrs.EQ.0 )
THEN
858 WRITE( nounit, fmt = 9997 )
'SGV'
862 WRITE( nounit, fmt = 9996 )
863 WRITE( nounit, fmt = 9995 )
864 WRITE( nounit, fmt = 9994 )
'Orthogonal'
868 WRITE( nounit, fmt = 9993 )
872 IF( result( jr ).LT.10000.0 )
THEN
873 WRITE( nounit, fmt = 9992 )n, jtype, ioldsd, jr,
876 WRITE( nounit, fmt = 9991 )n, jtype, ioldsd, jr,
887 CALL alasvm(
'SGV', nounit, nerrs, ntestt, 0 )
893 9999
FORMAT(
' SDRGEV3: ', a,
' returned INFO=', i6,
'.', / 3x,
'N=',
894 $ i6,
', JTYPE=', i6,
', ISEED=(', 4( i4,
',' ), i5,
')' )
896 9998
FORMAT(
' SDRGEV3: ', a,
' Eigenvectors from ', a,
897 $
' incorrectly normalized.', /
' Bits of error=', 0p, g10.3,
898 $
',', 3x,
'N=', i4,
', JTYPE=', i3,
', ISEED=(',
899 $ 4( i4,
',' ), i5,
')' )
901 9997
FORMAT( / 1x, a3,
' -- Real Generalized eigenvalue problem driver'
904 9996
FORMAT(
' Matrix types (see SDRGEV3 for details): ' )
906 9995
FORMAT(
' Special Matrices:', 23x,
907 $
'(J''=transposed Jordan block)',
908 $ /
' 1=(0,0) 2=(I,0) 3=(0,I) 4=(I,I) 5=(J'',J'') ',
909 $
'6=(diag(J'',I), diag(I,J''))', /
' Diagonal Matrices: ( ',
910 $
'D=diag(0,1,2,...) )', /
' 7=(D,I) 9=(large*D, small*I',
911 $
') 11=(large*I, small*D) 13=(large*D, large*I)', /
912 $
' 8=(I,D) 10=(small*D, large*I) 12=(small*I, large*D) ',
913 $
' 14=(small*D, small*I)', /
' 15=(D, reversed D)' )
914 9994
FORMAT(
' Matrices Rotated by Random ', a,
' Matrices U, V:',
915 $ /
' 16=Transposed Jordan Blocks 19=geometric ',
916 $
'alpha, beta=0,1', /
' 17=arithm. alpha&beta ',
917 $
' 20=arithmetic alpha, beta=0,1', /
' 18=clustered ',
918 $
'alpha, beta=0,1 21=random alpha, beta=0,1',
919 $ /
' Large & Small Matrices:', /
' 22=(large, small) ',
920 $
'23=(small,large) 24=(small,small) 25=(large,large)',
921 $ /
' 26=random O(1) matrices.' )
923 9993
FORMAT( /
' Tests performed: ',
924 $ /
' 1 = max | ( b A - a B )''*l | / const.,',
925 $ /
' 2 = | |VR(i)| - 1 | / ulp,',
926 $ /
' 3 = max | ( b A - a B )*r | / const.',
927 $ /
' 4 = | |VL(i)| - 1 | / ulp,',
928 $ /
' 5 = 0 if W same no matter if r or l computed,',
929 $ /
' 6 = 0 if l same no matter if l computed,',
930 $ /
' 7 = 0 if r same no matter if r computed,', / 1x )
931 9992
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
932 $ 4( i4,
',' ),
' result ', i2,
' is', 0p, f8.2 )
933 9991
FORMAT(
' Matrix order=', i5,
', type=', i2,
', seed=',
934 $ 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 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