297      SUBROUTINE sdrgvx( NSIZE, THRESH, NIN, NOUT, A, LDA, B, AI, BI,
 
  298     $                   ALPHAR, ALPHAI, BETA, VL, VR, ILO, IHI, LSCALE,
 
  299     $                   RSCALE, S, STRU, DIF, DIFTRU, WORK, LWORK,
 
  300     $                   IWORK, LIWORK, RESULT, BWORK, INFO )
 
  307      INTEGER            IHI, ILO, INFO, LDA, LIWORK, LWORK, NIN, NOUT,
 
  314      REAL               A( LDA, * ), AI( LDA, * ), ALPHAI( * ),
 
  315     $                   alphar( * ), b( lda, * ), beta( * ),
 
  316     $                   bi( lda, * ), dif( * ), diftru( * ),
 
  317     $                   lscale( * ), result( 4 ), rscale( * ), s( * ),
 
  318     $                   stru( * ), vl( lda, * ), vr( lda, * ),
 
  325      REAL               ZERO, ONE, TEN, TNTH, HALF
 
  326      PARAMETER          ( ZERO = 0.0e+0, one = 1.0e+0, ten = 1.0e+1,
 
  327     $                   tnth = 1.0e-1, half = 0.5d+0 )
 
  330      INTEGER            I, IPTYPE, IWA, IWB, IWX, IWY, J, LINFO,
 
  331     $                   MAXWRK, MINWRK, N, NERRS, NMAX, NPTKNT, NTESTT
 
  332      REAL               ABNORM, ANORM, BNORM, RATIO1, RATIO2, THRSH2,
 
  341      EXTERNAL           ILAENV, SLAMCH, SLANGE
 
  347      INTRINSIC          abs, max, sqrt
 
  357      IF( nsize.LT.0 ) 
THEN 
  359      ELSE IF( thresh.LT.zero ) 
THEN 
  361      ELSE IF( nin.LE.0 ) 
THEN 
  363      ELSE IF( nout.LE.0 ) 
THEN 
  365      ELSE IF( lda.LT.1 .OR. lda.LT.nmax ) 
THEN 
  367      ELSE IF( liwork.LT.nmax+6 ) 
THEN 
  379      IF( info.EQ.0 .AND. lwork.GE.1 ) 
THEN 
  380         minwrk = 2*nmax*nmax + 12*nmax + 16
 
  381         maxwrk = 6*nmax + nmax*ilaenv( 1, 
'SGEQRF', 
' ', nmax, 1, nmax,
 
  383         maxwrk = max( maxwrk, 2*nmax*nmax+12*nmax+16 )
 
  387      IF( lwork.LT.minwrk )
 
  391         CALL xerbla( 
'SDRGVX', -info )
 
  411      weight( 4 ) = one / weight( 2 )
 
  412      weight( 5 ) = one / weight( 1 )
 
  422                     CALL slatm6( iptype, 5, a, lda, b, vr, lda, vl,
 
  423     $                            lda, weight( iwa ), weight( iwb ),
 
  424     $                            weight( iwx ), weight( iwy ), stru,
 
  431                     CALL slacpy( 
'F', n, n, a, lda, ai, lda )
 
  432                     CALL slacpy( 
'F', n, n, b, lda, bi, lda )
 
  434                     CALL sggevx( 
'N', 
'V', 
'V', 
'B', n, ai, lda, bi,
 
  435     $                            lda, alphar, alphai, beta, vl, lda,
 
  436     $                            vr, lda, ilo, ihi, lscale, rscale,
 
  437     $                            anorm, bnorm, s, dif, work, lwork,
 
  438     $                            iwork, bwork, linfo )
 
  439                     IF( linfo.NE.0 ) 
THEN 
  441                        WRITE( nout, fmt = 9999 )
'SGGEVX', linfo, n,
 
  448                     CALL slacpy( 
'Full', n, n, ai, lda, work, n )
 
  449                     CALL slacpy( 
'Full', n, n, bi, lda, work( n*n+1 ),
 
  451                     abnorm = slange( 
'Fro', n, 2*n, work, n, work )
 
  456                     CALL sget52( .true., n, a, lda, b, lda, vl, lda,
 
  457     $                            alphar, alphai, beta, work,
 
  459                     IF( result( 2 ).GT.thresh ) 
THEN 
  460                        WRITE( nout, fmt = 9998 )
'Left', 
'SGGEVX',
 
  461     $                     result( 2 ), n, iptype, iwa, iwb, iwx, iwy
 
  465                     CALL sget52( .false., n, a, lda, b, lda, vr, lda,
 
  466     $                            alphar, alphai, beta, work,
 
  468                     IF( result( 3 ).GT.thresh ) 
THEN 
  469                        WRITE( nout, fmt = 9998 )
'Right', 
'SGGEVX',
 
  470     $                     result( 3 ), n, iptype, iwa, iwb, iwx, iwy
 
  477                        IF( s( i ).EQ.zero ) 
THEN 
  478                           IF( stru( i ).GT.abnorm*ulp )
 
  479     $                        result( 3 ) = ulpinv
 
  480                        ELSE IF( stru( i ).EQ.zero ) 
THEN 
  481                           IF( s( i ).GT.abnorm*ulp )
 
  482     $                        result( 3 ) = ulpinv
 
  484                           work( i ) = max( abs( stru( i ) / s( i ) ),
 
  485     $                                 abs( s( i ) / stru( i ) ) )
 
  486                           result( 3 ) = max( result( 3 ), work( i ) )
 
  493                     IF( dif( 1 ).EQ.zero ) 
THEN 
  494                        IF( diftru( 1 ).GT.abnorm*ulp )
 
  495     $                     result( 4 ) = ulpinv
 
  496                     ELSE IF( diftru( 1 ).EQ.zero ) 
THEN 
  497                        IF( dif( 1 ).GT.abnorm*ulp )
 
  498     $                     result( 4 ) = ulpinv
 
  499                     ELSE IF( dif( 5 ).EQ.zero ) 
THEN 
  500                        IF( diftru( 5 ).GT.abnorm*ulp )
 
  501     $                     result( 4 ) = ulpinv
 
  502                     ELSE IF( diftru( 5 ).EQ.zero ) 
THEN 
  503                        IF( dif( 5 ).GT.abnorm*ulp )
 
  504     $                     result( 4 ) = ulpinv
 
  506                        ratio1 = max( abs( diftru( 1 ) / dif( 1 ) ),
 
  507     $                           abs( dif( 1 ) / diftru( 1 ) ) )
 
  508                        ratio2 = max( abs( diftru( 5 ) / dif( 5 ) ),
 
  509     $                           abs( dif( 5 ) / diftru( 5 ) ) )
 
  510                        result( 4 ) = max( ratio1, ratio2 )
 
  518                        IF( ( result( j ).GE.thrsh2 .AND. j.GE.4 ) .OR.
 
  519     $                      ( result( j ).GE.thresh .AND. j.LE.3 ) )
 
  525                           IF( nerrs.EQ.0 ) 
THEN 
  526                              WRITE( nout, fmt = 9997 )
'SXV' 
  532                              WRITE( nout, fmt = 9995 )
 
  533                              WRITE( nout, fmt = 9994 )
 
  534                              WRITE( nout, fmt = 9993 )
 
  538                              WRITE( nout, fmt = 9992 )
'''',
 
  543                           IF( result( j ).LT.10000.0 ) 
THEN 
  544                              WRITE( nout, fmt = 9991 )iptype, iwa,
 
  545     $                           iwb, iwx, iwy, j, result( j )
 
  547                              WRITE( nout, fmt = 9990 )iptype, iwa,
 
  548     $                           iwb, iwx, iwy, j, result( j )
 
  568      READ( nin, fmt = *, 
END = 150 )n
 
  572         READ( nin, fmt = * )( a( i, j ), j = 1, n )
 
  575         READ( nin, fmt = * )( b( i, j ), j = 1, n )
 
  577      READ( nin, fmt = * )( stru( i ), i = 1, n )
 
  578      READ( nin, fmt = * )( diftru( i ), i = 1, n )
 
  586      CALL slacpy( 
'F', n, n, a, lda, ai, lda )
 
  587      CALL slacpy( 
'F', n, n, b, lda, bi, lda )
 
  589      CALL sggevx( 
'N', 
'V', 
'V', 
'B', n, ai, lda, bi, lda, alphar,
 
  590     $             alphai, beta, vl, lda, vr, lda, ilo, ihi, lscale,
 
  591     $             rscale, anorm, bnorm, s, dif, work, lwork, iwork,
 
  594      IF( linfo.NE.0 ) 
THEN 
  596         WRITE( nout, fmt = 9987 )
'SGGEVX', linfo, n, nptknt
 
  602      CALL slacpy( 
'Full', n, n, ai, lda, work, n )
 
  603      CALL slacpy( 
'Full', n, n, bi, lda, work( n*n+1 ), n )
 
  604      abnorm = 
slange( 
'Fro', n, 2*n, work, n, work )
 
  609      CALL sget52( .true., n, a, lda, b, lda, vl, lda, alphar, alphai,
 
  610     $             beta, work, result( 1 ) )
 
  611      IF( result( 2 ).GT.thresh ) 
THEN 
  612         WRITE( nout, fmt = 9986 )
'Left', 
'SGGEVX', result( 2 ), n,
 
  617      CALL sget52( .false., n, a, lda, b, lda, vr, lda, alphar, alphai,
 
  618     $             beta, work, result( 2 ) )
 
  619      IF( result( 3 ).GT.thresh ) 
THEN 
  620         WRITE( nout, fmt = 9986 )
'Right', 
'SGGEVX', result( 3 ), n,
 
  628         IF( s( i ).EQ.zero ) 
THEN 
  629            IF( stru( i ).GT.abnorm*ulp )
 
  630     $         result( 3 ) = ulpinv
 
  631         ELSE IF( stru( i ).EQ.zero ) 
THEN 
  632            IF( s( i ).GT.abnorm*ulp )
 
  633     $         result( 3 ) = ulpinv
 
  635            work( i ) = max( abs( stru( i ) / s( i ) ),
 
  636     $                  abs( s( i ) / stru( i ) ) )
 
  637            result( 3 ) = max( result( 3 ), work( i ) )
 
  644      IF( dif( 1 ).EQ.zero ) 
THEN 
  645         IF( diftru( 1 ).GT.abnorm*ulp )
 
  646     $      result( 4 ) = ulpinv
 
  647      ELSE IF( diftru( 1 ).EQ.zero ) 
THEN 
  648         IF( dif( 1 ).GT.abnorm*ulp )
 
  649     $      result( 4 ) = ulpinv
 
  650      ELSE IF( dif( 5 ).EQ.zero ) 
THEN 
  651         IF( diftru( 5 ).GT.abnorm*ulp )
 
  652     $      result( 4 ) = ulpinv
 
  653      ELSE IF( diftru( 5 ).EQ.zero ) 
THEN 
  654         IF( dif( 5 ).GT.abnorm*ulp )
 
  655     $      result( 4 ) = ulpinv
 
  657         ratio1 = max( abs( diftru( 1 ) / dif( 1 ) ),
 
  658     $            abs( dif( 1 ) / diftru( 1 ) ) )
 
  659         ratio2 = max( abs( diftru( 5 ) / dif( 5 ) ),
 
  660     $            abs( dif( 5 ) / diftru( 5 ) ) )
 
  661         result( 4 ) = max( ratio1, ratio2 )
 
  669         IF( result( j ).GE.thrsh2 ) 
THEN 
  674            IF( nerrs.EQ.0 ) 
THEN 
  675               WRITE( nout, fmt = 9997 )
'SXV' 
  681               WRITE( nout, fmt = 9996 )
 
  685               WRITE( nout, fmt = 9992 )
'''', 
'transpose', 
'''' 
  689            IF( result( j ).LT.10000.0 ) 
THEN 
  690               WRITE( nout, fmt = 9989 )nptknt, n, j, result( j )
 
  692               WRITE( nout, fmt = 9988 )nptknt, n, j, result( j )
 
  704      CALL alasvm( 
'SXV', nout, nerrs, ntestt, 0 )
 
  710 9999 
FORMAT( 
' SDRGVX: ', a, 
' returned INFO=', i6, 
'.', / 9x, 
'N=',
 
  711     $      i6, 
', JTYPE=', i6, 
')' )
 
  713 9998 
FORMAT( 
' SDRGVX: ', a, 
' Eigenvectors from ', a, 
' incorrectly ',
 
  714     $      
'normalized.', / 
' Bits of error=', 0p, g10.3, 
',', 9x,
 
  715     $      
'N=', i6, 
', JTYPE=', i6, 
', IWA=', i5, 
', IWB=', i5,
 
  716     $      
', IWX=', i5, 
', IWY=', i5 )
 
  718 9997 
FORMAT( / 1x, a3, 
' -- Real Expert Eigenvalue/vector',
 
  719     $      
' problem driver' )
 
  721 9996 
FORMAT( 
' Input Example' )
 
  723 9995 
FORMAT( 
' Matrix types: ', / )
 
  725 9994 
FORMAT( 
' TYPE 1: Da is diagonal, Db is identity, ',
 
  726     $      / 
'     A = Y^(-H) Da X^(-1), B = Y^(-H) Db X^(-1) ',
 
  727     $      / 
'     YH and X are left and right eigenvectors. ', / )
 
  729 9993 
FORMAT( 
' TYPE 2: Da is quasi-diagonal, Db is identity, ',
 
  730     $      / 
'     A = Y^(-H) Da X^(-1), B = Y^(-H) Db X^(-1) ',
 
  731     $      / 
'     YH and X are left and right eigenvectors. ', / )
 
  733 9992 
FORMAT( / 
' Tests performed:  ', / 4x,
 
  734     $      
' a is alpha, b is beta, l is a left eigenvector, ', / 4x,
 
  735     $      
' r is a right eigenvector and ', a, 
' means ', a, 
'.',
 
  736     $      / 
' 1 = max | ( b A - a B )', a, 
' l | / const.',
 
  737     $      / 
' 2 = max | ( b A - a B ) r | / const.',
 
  738     $      / 
' 3 = max ( Sest/Stru, Stru/Sest ) ',
 
  739     $      
' over all eigenvalues', /
 
  740     $      
' 4 = max( DIFest/DIFtru, DIFtru/DIFest ) ',
 
  741     $      
' over the 1st and 5th eigenvectors', / )
 
  743 9991 
FORMAT( 
' Type=', i2, 
',', 
' IWA=', i2, 
', IWB=', i2, 
', IWX=',
 
  744     $      i2, 
', IWY=', i2, 
', result ', i2, 
' is', 0p, f8.2 )
 
  745 9990 
FORMAT( 
' Type=', i2, 
',', 
' IWA=', i2, 
', IWB=', i2, 
', IWX=',
 
  746     $      i2, 
', IWY=', i2, 
', result ', i2, 
' is', 1p, e10.3 )
 
  747 9989 
FORMAT( 
' Input example #', i2, 
', matrix order=', i4, 
',',
 
  748     $      
' result ', i2, 
' is', 0p, f8.2 )
 
  749 9988 
FORMAT( 
' Input example #', i2, 
', matrix order=', i4, 
',',
 
  750     $      
' result ', i2, 
' is', 1p, e10.3 )
 
  751 9987 
FORMAT( 
' SDRGVX: ', a, 
' returned INFO=', i6, 
'.', / 9x, 
'N=',
 
  752     $      i6, 
', Input example #', i2, 
')' )
 
  754 9986 
FORMAT( 
' SDRGVX: ', a, 
' Eigenvectors from ', a, 
' incorrectly ',
 
  755     $      
'normalized.', / 
' Bits of error=', 0p, g10.3, 
',', 9x,
 
  756     $      
'N=', i6, 
', Input Example #', i2, 
')' )