298      RECURSIVE SUBROUTINE slaqz0( WANTS, WANTQ, WANTZ, N, ILO, IHI,
 
  300     $                             LDA, B, LDB, ALPHAR, ALPHAI, BETA,
 
  301     $                             Q, LDQ, Z, LDZ, WORK, LWORK, REC,
 
  306      CHARACTER, 
INTENT( IN ) :: wants, wantq, wantz
 
  307      INTEGER, 
INTENT( IN ) :: n, ilo, ihi, lda, ldb, ldq, ldz, lwork,
 
  310      INTEGER, 
INTENT( OUT ) :: info
 
  312      REAL, 
INTENT( INOUT ) :: a( lda, * ), b( ldb, * ), q( ldq, * ),
 
  313     $   z( ldz, * ), alphar( * ), alphai( * ), beta( * ), work( * )
 
  316      REAL :: zero, one, half
 
  317      PARAMETER( zero = 0.0, one = 1.0, half = 0.5 )
 
  320      REAL :: smlnum, ulp, eshift, safmin, safmax, c1, s1, temp, swap,
 
  322      INTEGER :: istart, istop, iiter, maxit, istart2, k, ld, nshifts,
 
  323     $           nblock, nw, nmin, nibble, n_undeflated, n_deflated,
 
  324     $           ns, sweep_info, shiftpos, lworkreq, k2, istartm,
 
  325     $           istopm, iwants, iwantq, iwantz, norm_info, aed_info,
 
  326     $           nwr, nbr, nsr, itemp1, itemp2, rcost, i
 
  327      LOGICAL :: ilschur, ilq, ilz
 
  328      CHARACTER :: jbcmpz*3
 
  334      LOGICAL, 
EXTERNAL :: 
lsame 
  335      INTEGER, 
EXTERNAL :: 
ilaenv 
  340      IF( 
lsame( wants, 
'E' ) ) 
THEN 
  343      ELSE IF( 
lsame( wants, 
'S' ) ) 
THEN 
  350      IF( 
lsame( wantq, 
'N' ) ) 
THEN 
  353      ELSE IF( 
lsame( wantq, 
'V' ) ) 
THEN 
  356      ELSE IF( 
lsame( wantq, 
'I' ) ) 
THEN 
  363      IF( 
lsame( wantz, 
'N' ) ) 
THEN 
  366      ELSE IF( 
lsame( wantz, 
'V' ) ) 
THEN 
  369      ELSE IF( 
lsame( wantz, 
'I' ) ) 
THEN 
  379      IF( iwants.EQ.0 ) 
THEN 
  381      ELSE IF( iwantq.EQ.0 ) 
THEN 
  383      ELSE IF( iwantz.EQ.0 ) 
THEN 
  385      ELSE IF( n.LT.0 ) 
THEN 
  387      ELSE IF( ilo.LT.1 ) 
THEN 
  389      ELSE IF( ihi.GT.n .OR. ihi.LT.ilo-1 ) 
THEN 
  391      ELSE IF( lda.LT.n ) 
THEN 
  393      ELSE IF( ldb.LT.n ) 
THEN 
  395      ELSE IF( ldq.LT.1 .OR. ( ilq .AND. ldq.LT.n ) ) 
THEN 
  397      ELSE IF( ldz.LT.1 .OR. ( ilz .AND. ldz.LT.n ) ) 
THEN 
  401         CALL xerbla( 
'SLAQZ0', -info )
 
  409         work( 1 ) = real( 1 )
 
  416      jbcmpz( 1:1 ) = wants
 
  417      jbcmpz( 2:2 ) = wantq
 
  418      jbcmpz( 3:3 ) = wantz
 
  420      nmin = 
ilaenv( 12, 
'SLAQZ0', jbcmpz, n, ilo, ihi, lwork )
 
  422      nwr = 
ilaenv( 13, 
'SLAQZ0', jbcmpz, n, ilo, ihi, lwork )
 
  424      nwr = min( ihi-ilo+1, ( n-1 ) / 3, nwr )
 
  426      nibble = 
ilaenv( 14, 
'SLAQZ0', jbcmpz, n, ilo, ihi, lwork )
 
  428      nsr = 
ilaenv( 15, 
'SLAQZ0', jbcmpz, n, ilo, ihi, lwork )
 
  429      nsr = min( nsr, ( n+6 ) / 9, ihi-ilo )
 
  430      nsr = max( 2, nsr-mod( nsr, 2 ) )
 
  432      rcost = 
ilaenv( 17, 
'SLAQZ0', jbcmpz, n, ilo, ihi, lwork )
 
  433      itemp1 = int( real( nsr )/sqrt( 1+2*real( nsr )/
 
  434     $         ( real( rcost )/100*real( n ) ) ) )
 
  435      itemp1 = ( ( itemp1-1 )/4 )*4+4
 
  438      IF( n .LT. nmin .OR. rec .GE. 2 ) 
THEN 
  439         CALL shgeqz( wants, wantq, wantz, n, ilo, ihi, a, lda, b,
 
  441     $                alphar, alphai, beta, q, ldq, z, ldz, work,
 
  451      nw = max( nwr, nmin )
 
  452      CALL slaqz3( ilschur, ilq, ilz, n, ilo, ihi, nw, a, lda, b,
 
  454     $             q, ldq, z, ldz, n_undeflated, n_deflated, alphar,
 
  455     $             alphai, beta, work, nw, work, nw, work, -1, rec,
 
  457      itemp1 = int( work( 1 ) )
 
  459      CALL slaqz4( ilschur, ilq, ilz, n, ilo, ihi, nsr, nbr, alphar,
 
  460     $             alphai, beta, a, lda, b, ldb, q, ldq, z, ldz, work,
 
  461     $             nbr, work, nbr, work, -1, sweep_info )
 
  462      itemp2 = int( work( 1 ) )
 
  464      lworkreq = max( itemp1+2*nw**2, itemp2+2*nbr**2 )
 
  465      IF ( lwork .EQ.-1 ) 
THEN 
  468      ELSE IF ( lwork .LT. lworkreq ) 
THEN 
  472         CALL xerbla( 
'SLAQZ0', info )
 
  478      IF( iwantq.EQ.3 ) 
CALL slaset( 
'FULL', n, n, zero, one, q,
 
  480      IF( iwantz.EQ.3 ) 
CALL slaset( 
'FULL', n, n, zero, one, z,
 
  484      safmin = 
slamch( 
'SAFE MINIMUM' )
 
  486      ulp = 
slamch( 
'PRECISION' )
 
  487      smlnum = safmin*( real( n )/ulp )
 
  489      bnorm = 
slanhs( 
'F', ihi-ilo+1, b( ilo, ilo ), ldb, work )
 
  490      btol = max( safmin, ulp*bnorm )
 
  494      maxit = 3*( ihi-ilo+1 )
 
  498         IF( iiter .GE. maxit ) 
THEN 
  502         IF ( istart+1 .GE. istop ) 
THEN 
  508         IF ( abs( a( istop-1, istop-2 ) ) .LE. max( smlnum,
 
  509     $      ulp*( abs( a( istop-1, istop-1 ) )+abs( a( istop-2,
 
  510     $      istop-2 ) ) ) ) ) 
THEN 
  511            a( istop-1, istop-2 ) = zero
 
  515         ELSE IF ( abs( a( istop, istop-1 ) ) .LE. max( smlnum,
 
  516     $      ulp*( abs( a( istop, istop ) )+abs( a( istop-1,
 
  517     $      istop-1 ) ) ) ) ) 
THEN 
  518            a( istop, istop-1 ) = zero
 
  524         IF ( abs( a( istart+2, istart+1 ) ) .LE. max( smlnum,
 
  525     $      ulp*( abs( a( istart+1, istart+1 ) )+abs( a( istart+2,
 
  526     $      istart+2 ) ) ) ) ) 
THEN 
  527            a( istart+2, istart+1 ) = zero
 
  531         ELSE IF ( abs( a( istart+1, istart ) ) .LE. max( smlnum,
 
  532     $      ulp*( abs( a( istart, istart ) )+abs( a( istart+1,
 
  533     $      istart+1 ) ) ) ) ) 
THEN 
  534            a( istart+1, istart ) = zero
 
  540         IF ( istart+1 .GE. istop ) 
THEN 
  546         DO k = istop, istart+1, -1
 
  547            IF ( abs( a( k, k-1 ) ) .LE. max( smlnum, ulp*( abs( a( k,
 
  548     $         k ) )+abs( a( k-1, k-1 ) ) ) ) ) 
THEN 
  567         DO WHILE ( k.GE.istart2 )
 
  569            IF( abs( b( k, k ) ) .LT. btol ) 
THEN 
  573               DO k2 = k, istart2+1, -1
 
  574                  CALL slartg( b( k2-1, k2 ), b( k2-1, k2-1 ), c1,
 
  578                  b( k2-1, k2-1 ) = zero
 
  580                  CALL srot( k2-2-istartm+1, b( istartm, k2 ), 1,
 
  581     $                       b( istartm, k2-1 ), 1, c1, s1 )
 
  582                  CALL srot( min( k2+1, istop )-istartm+1,
 
  584     $                       k2 ), 1, a( istartm, k2-1 ), 1, c1, s1 )
 
  586                     CALL srot( n, z( 1, k2 ), 1, z( 1, k2-1 ), 1,
 
  591                  IF( k2.LT.istop ) 
THEN 
  592                     CALL slartg( a( k2, k2-1 ), a( k2+1, k2-1 ), c1,
 
  595                     a( k2+1, k2-1 ) = zero
 
  597                     CALL srot( istopm-k2+1, a( k2, k2 ), lda,
 
  599     $                          k2 ), lda, c1, s1 )
 
  600                     CALL srot( istopm-k2+1, b( k2, k2 ), ldb,
 
  602     $                          k2 ), ldb, c1, s1 )
 
  604                        CALL srot( n, q( 1, k2 ), 1, q( 1, k2+1 ), 1,
 
  611               IF( istart2.LT.istop )
THEN 
  612                  CALL slartg( a( istart2, istart2 ), a( istart2+1,
 
  613     $                         istart2 ), c1, s1, temp )
 
  614                  a( istart2, istart2 ) = temp
 
  615                  a( istart2+1, istart2 ) = zero
 
  617                  CALL srot( istopm-( istart2+1 )+1, a( istart2,
 
  618     $                       istart2+1 ), lda, a( istart2+1,
 
  619     $                       istart2+1 ), lda, c1, s1 )
 
  620                  CALL srot( istopm-( istart2+1 )+1, b( istart2,
 
  621     $                       istart2+1 ), ldb, b( istart2+1,
 
  622     $                       istart2+1 ), ldb, c1, s1 )
 
  624                     CALL srot( n, q( 1, istart2 ), 1, q( 1,
 
  625     $                          istart2+1 ), 1, c1, s1 )
 
  637         IF ( istart2 .GE. istop ) 
THEN 
  648         IF ( istop-istart2+1 .LT. nmin ) 
THEN 
  652            IF ( istop-istart+1 .LT. nmin ) 
THEN 
  663         CALL slaqz3( ilschur, ilq, ilz, n, istart2, istop, nw, a,
 
  665     $                b, ldb, q, ldq, z, ldz, n_undeflated, n_deflated,
 
  666     $                alphar, alphai, beta, work, nw, work( nw**2+1 ),
 
  667     $                nw, work( 2*nw**2+1 ), lwork-2*nw**2, rec,
 
  670         IF ( n_deflated > 0 ) 
THEN 
  671            istop = istop-n_deflated
 
  676         IF ( 100*n_deflated > nibble*( n_deflated+n_undeflated ) .OR.
 
  677     $      istop-istart2+1 .LT. nmin ) 
THEN 
  685         ns = min( nshifts, istop-istart2 )
 
  686         ns = min( ns, n_undeflated )
 
  687         shiftpos = istop-n_undeflated+1
 
  692         DO i = shiftpos, shiftpos+n_undeflated-1, 2
 
  693            IF( alphai( i ).NE.-alphai( i+1 ) ) 
THEN 
  696               alphar( i ) = alphar( i+1 )
 
  697               alphar( i+1 ) = alphar( i+2 )
 
  701               alphai( i ) = alphai( i+1 )
 
  702               alphai( i+1 ) = alphai( i+2 )
 
  706               beta( i ) = beta( i+1 )
 
  707               beta( i+1 ) = beta( i+2 )
 
  712         IF ( mod( ld, 6 ) .EQ. 0 ) 
THEN 
  716            IF( ( real( maxit )*safmin )*abs( a( istop,
 
  717     $         istop-1 ) ).LT.abs( a( istop-1, istop-1 ) ) ) 
THEN 
  718               eshift = a( istop, istop-1 )/b( istop-1, istop-1 )
 
  720               eshift = eshift+one/( safmin*real( maxit ) )
 
  722            alphar( shiftpos ) = one
 
  723            alphar( shiftpos+1 ) = zero
 
  724            alphai( shiftpos ) = zero
 
  725            alphai( shiftpos+1 ) = zero
 
  726            beta( shiftpos ) = eshift
 
  727            beta( shiftpos+1 ) = eshift
 
  734         CALL slaqz4( ilschur, ilq, ilz, n, istart2, istop, ns,
 
  736     $                alphar( shiftpos ), alphai( shiftpos ),
 
  737     $                beta( shiftpos ), a, lda, b, ldb, q, ldq, z, ldz,
 
  738     $                work, nblock, work( nblock**2+1 ), nblock,
 
  739     $                work( 2*nblock**2+1 ), lwork-2*nblock**2,
 
  750   80 
CALL shgeqz( wants, wantq, wantz, n, ilo, ihi, a, lda, b, ldb,
 
  751     $             alphar, alphai, beta, q, ldq, z, ldz, work, lwork,