278      SUBROUTINE zgegv( JOBVL, JOBVR, N, A, LDA, B, LDB, ALPHA, BETA,
 
  279     $                  VL, LDVL, VR, LDVR, WORK, LWORK, RWORK, INFO )
 
  286      CHARACTER          JOBVL, JOBVR
 
  287      INTEGER            INFO, LDA, LDB, LDVL, LDVR, LWORK, N
 
  290      DOUBLE PRECISION   RWORK( * )
 
  291      COMPLEX*16         A( LDA, * ), ALPHA( * ), B( LDB, * ),
 
  292     $                   beta( * ), vl( ldvl, * ), vr( ldvr, * ),
 
  299      DOUBLE PRECISION   ZERO, ONE
 
  300      parameter( zero = 0.0d0, one = 1.0d0 )
 
  301      COMPLEX*16         CZERO, CONE
 
  302      parameter( czero = ( 0.0d0, 0.0d0 ),
 
  303     $                   cone = ( 1.0d0, 0.0d0 ) )
 
  306      LOGICAL            ILIMIT, ILV, ILVL, ILVR, LQUERY
 
  308      INTEGER            ICOLS, IHI, IINFO, IJOBVL, IJOBVR, ILEFT, ILO,
 
  309     $                   in, iright, irows, irwork, itau, iwork, jc, jr,
 
  310     $                   lopt, lwkmin, lwkopt, nb, nb1, nb2, nb3
 
  311      DOUBLE PRECISION   ABSAI, ABSAR, ABSB, ANRM, ANRM1, ANRM2, BNRM,
 
  312     $                   bnrm1, bnrm2, eps, safmax, safmin, salfai,
 
  313     $                   salfar, sbeta, scale, temp
 
  326      DOUBLE PRECISION   DLAMCH, ZLANGE
 
  327      EXTERNAL           lsame, ilaenv, dlamch, zlange
 
  330      INTRINSIC          abs, dble, dcmplx, dimag, int, max
 
  333      DOUBLE PRECISION   ABS1
 
  336      abs1( x ) = abs( dble( x ) ) + abs( dimag( x ) )
 
  342      IF( lsame( jobvl, 
'N' ) ) 
THEN 
  345      ELSE IF( lsame( jobvl, 
'V' ) ) 
THEN 
  353      IF( lsame( jobvr, 
'N' ) ) 
THEN 
  356      ELSE IF( lsame( jobvr, 
'V' ) ) 
THEN 
  367      lwkmin = max( 2*n, 1 )
 
  370      lquery = ( lwork.EQ.-1 )
 
  372      IF( ijobvl.LE.0 ) 
THEN 
  374      ELSE IF( ijobvr.LE.0 ) 
THEN 
  376      ELSE IF( n.LT.0 ) 
THEN 
  378      ELSE IF( lda.LT.max( 1, n ) ) 
THEN 
  380      ELSE IF( ldb.LT.max( 1, n ) ) 
THEN 
  382      ELSE IF( ldvl.LT.1 .OR. ( ilvl .AND. ldvl.LT.n ) ) 
THEN 
  384      ELSE IF( ldvr.LT.1 .OR. ( ilvr .AND. ldvr.LT.n ) ) 
THEN 
  386      ELSE IF( lwork.LT.lwkmin .AND. .NOT.lquery ) 
THEN 
  391         nb1 = ilaenv( 1, 
'ZGEQRF', 
' ', n, n, -1, -1 )
 
  392         nb2 = ilaenv( 1, 
'ZUNMQR', 
' ', n, n, n, -1 )
 
  393         nb3 = ilaenv( 1, 
'ZUNGQR', 
' ', n, n, n, -1 )
 
  394         nb = max( nb1, nb2, nb3 )
 
  395         lopt = max( 2*n, n*( nb+1 ) )
 
  400         CALL xerbla( 
'ZGEGV ', -info )
 
  402      ELSE IF( lquery ) 
THEN 
  413      eps = dlamch( 
'E' )*dlamch( 
'B' )
 
  414      safmin = dlamch( 
'S' )
 
  415      safmin = safmin + safmin
 
  416      safmax = one / safmin
 
  420      anrm = zlange( 
'M', n, n, a, lda, rwork )
 
  423      IF( anrm.LT.one ) 
THEN 
  424         IF( safmax*anrm.LT.one ) 
THEN 
  430      IF( anrm.GT.zero ) 
THEN 
  431         CALL zlascl( 
'G', -1, -1, anrm, one, n, n, a, lda, iinfo )
 
  432         IF( iinfo.NE.0 ) 
THEN 
  440      bnrm = zlange( 
'M', n, n, b, ldb, rwork )
 
  443      IF( bnrm.LT.one ) 
THEN 
  444         IF( safmax*bnrm.LT.one ) 
THEN 
  450      IF( bnrm.GT.zero ) 
THEN 
  451         CALL zlascl( 
'G', -1, -1, bnrm, one, n, n, b, ldb, iinfo )
 
  452         IF( iinfo.NE.0 ) 
THEN 
  464      CALL zggbal( 
'P', n, a, lda, b, ldb, ilo, ihi, rwork( ileft ),
 
  465     $             rwork( iright ), rwork( irwork ), iinfo )
 
  466      IF( iinfo.NE.0 ) 
THEN 
  473      irows = ihi + 1 - ilo
 
  481      CALL zgeqrf( irows, icols, b( ilo, ilo ), ldb, work( itau ),
 
  482     $             work( iwork ), lwork+1-iwork, iinfo )
 
  484     $   lwkopt = max( lwkopt, int( work( iwork ) )+iwork-1 )
 
  485      IF( iinfo.NE.0 ) 
THEN 
  490      CALL zunmqr( 
'L', 
'C', irows, icols, irows, b( ilo, ilo ), ldb,
 
  491     $             work( itau ), a( ilo, ilo ), lda, work( iwork ),
 
  492     $             lwork+1-iwork, iinfo )
 
  494     $   lwkopt = max( lwkopt, int( work( iwork ) )+iwork-1 )
 
  495      IF( iinfo.NE.0 ) 
THEN 
  501         CALL zlaset( 
'Full', n, n, czero, cone, vl, ldvl )
 
  502         CALL zlacpy( 
'L', irows-1, irows-1, b( ilo+1, ilo ), ldb,
 
  503     $                vl( ilo+1, ilo ), ldvl )
 
  504         CALL zungqr( irows, irows, irows, vl( ilo, ilo ), ldvl,
 
  505     $                work( itau ), work( iwork ), lwork+1-iwork,
 
  508     $      lwkopt = max( lwkopt, int( work( iwork ) )+iwork-1 )
 
  509         IF( iinfo.NE.0 ) 
THEN 
  516     $   
CALL zlaset( 
'Full', n, n, czero, cone, vr, ldvr )
 
  524         CALL zgghrd( jobvl, jobvr, n, ilo, ihi, a, lda, b, ldb, vl,
 
  525     $                ldvl, vr, ldvr, iinfo )
 
  527         CALL zgghrd( 
'N', 
'N', irows, 1, irows, a( ilo, ilo ), lda,
 
  528     $                b( ilo, ilo ), ldb, vl, ldvl, vr, ldvr, iinfo )
 
  530      IF( iinfo.NE.0 ) 
THEN 
  543      CALL zhgeqz( chtemp, jobvl, jobvr, n, ilo, ihi, a, lda, b, ldb,
 
  544     $             alpha, beta, vl, ldvl, vr, ldvr, work( iwork ),
 
  545     $             lwork+1-iwork, rwork( irwork ), iinfo )
 
  547     $   lwkopt = max( lwkopt, int( work( iwork ) )+iwork-1 )
 
  548      IF( iinfo.NE.0 ) 
THEN 
  549         IF( iinfo.GT.0 .AND. iinfo.LE.n ) 
THEN 
  551         ELSE IF( iinfo.GT.n .AND. iinfo.LE.2*n ) 
THEN 
  573         CALL ztgevc( chtemp, 
'B', ldumma, n, a, lda, b, ldb, vl, ldvl,
 
  574     $                vr, ldvr, n, in, work( iwork ), rwork( irwork ),
 
  576         IF( iinfo.NE.0 ) 
THEN 
  584            CALL zggbak( 
'P', 
'L', n, ilo, ihi, rwork( ileft ),
 
  585     $                   rwork( iright ), n, vl, ldvl, iinfo )
 
  586            IF( iinfo.NE.0 ) 
THEN 
  593                  temp = max( temp, abs1( vl( jr, jc ) ) )
 
  599                  vl( jr, jc ) = vl( jr, jc )*temp
 
  604            CALL zggbak( 
'P', 
'R', n, ilo, ihi, rwork( ileft ),
 
  605     $                   rwork( iright ), n, vr, ldvr, iinfo )
 
  606            IF( iinfo.NE.0 ) 
THEN 
  613                  temp = max( temp, abs1( vr( jr, jc ) ) )
 
  619                  vr( jr, jc ) = vr( jr, jc )*temp
 
  637         absar = abs( dble( alpha( jc ) ) )
 
  638         absai = abs( dimag( alpha( jc ) ) )
 
  639         absb = abs( dble( beta( jc ) ) )
 
  640         salfar = anrm*dble( alpha( jc ) )
 
  641         salfai = anrm*dimag( alpha( jc ) )
 
  642         sbeta = bnrm*dble( beta( jc ) )
 
  648         IF( abs( salfai ).LT.safmin .AND. absai.GE.
 
  649     $       max( safmin, eps*absar, eps*absb ) ) 
THEN 
  651            scale = ( safmin / anrm1 ) / max( safmin, anrm2*absai )
 
  656         IF( abs( salfar ).LT.safmin .AND. absar.GE.
 
  657     $       max( safmin, eps*absai, eps*absb ) ) 
THEN 
  659            scale = max( scale, ( safmin / anrm1 ) /
 
  660     $              max( safmin, anrm2*absar ) )
 
  665         IF( abs( sbeta ).LT.safmin .AND. absb.GE.
 
  666     $       max( safmin, eps*absar, eps*absai ) ) 
THEN 
  668            scale = max( scale, ( safmin / bnrm1 ) /
 
  669     $              max( safmin, bnrm2*absb ) )
 
  675            temp = ( scale*safmin )*max( abs( salfar ), abs( salfai ),
 
  678     $         scale = scale / temp
 
  686            salfar = ( scale*dble( alpha( jc ) ) )*anrm
 
  687            salfai = ( scale*dimag( alpha( jc ) ) )*anrm
 
  688            sbeta = ( scale*beta( jc ) )*bnrm
 
  690         alpha( jc ) = dcmplx( salfar, salfai )