278      RECURSIVE SUBROUTINE claqz0( WANTS, WANTQ, WANTZ, N, ILO, IHI,
 
  280     $                             LDA, B, LDB, ALPHA, BETA, Q, LDQ, Z,
 
  281     $                             LDZ, WORK, LWORK, RWORK, REC,
 
  286      CHARACTER, 
INTENT( IN ) :: wants, wantq, wantz
 
  287      INTEGER, 
INTENT( IN ) :: n, ilo, ihi, lda, ldb, ldq, ldz, lwork,
 
  289      INTEGER, 
INTENT( OUT ) :: info
 
  290      COMPLEX, 
INTENT( INOUT ) :: a( lda, * ), b( ldb, * ), q( ldq, * ),
 
  291     $   z( ldz, * ), alpha( * ), beta( * ), work( * )
 
  292      REAL, 
INTENT( OUT ) :: rwork( * )
 
  296      parameter( czero = ( 0.0, 0.0 ), cone = ( 1.0, 0.0 ) )
 
  297      REAL :: zero, one, half
 
  298      PARAMETER( zero = 0.0, one = 1.0, half = 0.5 )
 
  301      REAL :: smlnum, ulp, safmin, safmax, c1, tempr, bnorm, btol
 
  302      COMPLEX :: eshift, s1, temp
 
  303      INTEGER :: istart, istop, iiter, maxit, istart2, k, ld, nshifts,
 
  304     $           nblock, nw, nmin, nibble, n_undeflated, n_deflated,
 
  305     $           ns, sweep_info, shiftpos, lworkreq, k2, istartm,
 
  306     $           istopm, iwants, iwantq, iwantz, norm_info, aed_info,
 
  307     $           nwr, nbr, nsr, itemp1, itemp2, rcost
 
  308      LOGICAL :: ilschur, ilq, ilz
 
  309      CHARACTER :: jbcmpz*3
 
  315      LOGICAL, 
EXTERNAL :: 
lsame 
  316      INTEGER, 
EXTERNAL :: 
ilaenv 
  321      IF( 
lsame( wants, 
'E' ) ) 
THEN 
  324      ELSE IF( 
lsame( wants, 
'S' ) ) 
THEN 
  331      IF( 
lsame( wantq, 
'N' ) ) 
THEN 
  334      ELSE IF( 
lsame( wantq, 
'V' ) ) 
THEN 
  337      ELSE IF( 
lsame( wantq, 
'I' ) ) 
THEN 
  344      IF( 
lsame( wantz, 
'N' ) ) 
THEN 
  347      ELSE IF( 
lsame( wantz, 
'V' ) ) 
THEN 
  350      ELSE IF( 
lsame( wantz, 
'I' ) ) 
THEN 
  360      IF( iwants.EQ.0 ) 
THEN 
  362      ELSE IF( iwantq.EQ.0 ) 
THEN 
  364      ELSE IF( iwantz.EQ.0 ) 
THEN 
  366      ELSE IF( n.LT.0 ) 
THEN 
  368      ELSE IF( ilo.LT.1 ) 
THEN 
  370      ELSE IF( ihi.GT.n .OR. ihi.LT.ilo-1 ) 
THEN 
  372      ELSE IF( lda.LT.n ) 
THEN 
  374      ELSE IF( ldb.LT.n ) 
THEN 
  376      ELSE IF( ldq.LT.1 .OR. ( ilq .AND. ldq.LT.n ) ) 
THEN 
  378      ELSE IF( ldz.LT.1 .OR. ( ilz .AND. ldz.LT.n ) ) 
THEN 
  382         CALL xerbla( 
'CLAQZ0', -info )
 
  390         work( 1 ) = real( 1 )
 
  397      jbcmpz( 1:1 ) = wants
 
  398      jbcmpz( 2:2 ) = wantq
 
  399      jbcmpz( 3:3 ) = wantz
 
  401      nmin = 
ilaenv( 12, 
'CLAQZ0', jbcmpz, n, ilo, ihi, lwork )
 
  403      nwr = 
ilaenv( 13, 
'CLAQZ0', jbcmpz, n, ilo, ihi, lwork )
 
  405      nwr = min( ihi-ilo+1, ( n-1 ) / 3, nwr )
 
  407      nibble = 
ilaenv( 14, 
'CLAQZ0', jbcmpz, n, ilo, ihi, lwork )
 
  409      nsr = 
ilaenv( 15, 
'CLAQZ0', jbcmpz, n, ilo, ihi, lwork )
 
  410      nsr = min( nsr, ( n+6 ) / 9, ihi-ilo )
 
  411      nsr = max( 2, nsr-mod( nsr, 2 ) )
 
  413      rcost = 
ilaenv( 17, 
'CLAQZ0', jbcmpz, n, ilo, ihi, lwork )
 
  414      itemp1 = int( real( nsr )/sqrt( 1+2*real( nsr )/
 
  415     $         ( real( rcost )/100*real( n ) ) ) )
 
  416      itemp1 = ( ( itemp1-1 )/4 )*4+4
 
  419      IF( n .LT. nmin .OR. rec .GE. 2 ) 
THEN 
  420         CALL chgeqz( wants, wantq, wantz, n, ilo, ihi, a, lda, b,
 
  422     $                alpha, beta, q, ldq, z, ldz, work, lwork, rwork,
 
  432      nw = max( nwr, nmin )
 
  433      CALL claqz2( ilschur, ilq, ilz, n, ilo, ihi, nw, a, lda, b,
 
  435     $             q, ldq, z, ldz, n_undeflated, n_deflated, alpha,
 
  436     $             beta, work, nw, work, nw, work, -1, rwork, rec,
 
  438      itemp1 = int( work( 1 ) )
 
  440      CALL claqz3( ilschur, ilq, ilz, n, ilo, ihi, nsr, nbr, alpha,
 
  441     $             beta, a, lda, b, ldb, q, ldq, z, ldz, work, nbr,
 
  442     $             work, nbr, work, -1, sweep_info )
 
  443      itemp2 = int( work( 1 ) )
 
  445      lworkreq = max( itemp1+2*nw**2, itemp2+2*nbr**2 )
 
  446      IF ( lwork .EQ.-1 ) 
THEN 
  447         work( 1 ) = real( lworkreq )
 
  449      ELSE IF ( lwork .LT. lworkreq ) 
THEN 
  453         CALL xerbla( 
'CLAQZ0', info )
 
  459      IF( iwantq.EQ.3 ) 
CALL claset( 
'FULL', n, n, czero, cone, q,
 
  461      IF( iwantz.EQ.3 ) 
CALL claset( 
'FULL', n, n, czero, cone, z,
 
  465      safmin = 
slamch( 
'SAFE MINIMUM' )
 
  467      ulp = 
slamch( 
'PRECISION' )
 
  468      smlnum = safmin*( real( n )/ulp )
 
  470      bnorm = 
clanhs( 
'F', ihi-ilo+1, b( ilo, ilo ), ldb, rwork )
 
  471      btol = max( safmin, ulp*bnorm )
 
  475      maxit = 30*( ihi-ilo+1 )
 
  479         IF( iiter .GE. maxit ) 
THEN 
  483         IF ( istart+1 .GE. istop ) 
THEN 
  489         IF ( abs( a( istop, istop-1 ) ) .LE. max( smlnum,
 
  490     $      ulp*( abs( a( istop, istop ) )+abs( a( istop-1,
 
  491     $      istop-1 ) ) ) ) ) 
THEN 
  492            a( istop, istop-1 ) = czero
 
  498         IF ( abs( a( istart+1, istart ) ) .LE. max( smlnum,
 
  499     $      ulp*( abs( a( istart, istart ) )+abs( a( istart+1,
 
  500     $      istart+1 ) ) ) ) ) 
THEN 
  501            a( istart+1, istart ) = czero
 
  507         IF ( istart+1 .GE. istop ) 
THEN 
  513         DO k = istop, istart+1, -1
 
  514            IF ( abs( a( k, k-1 ) ) .LE. max( smlnum, ulp*( abs( a( k,
 
  515     $         k ) )+abs( a( k-1, k-1 ) ) ) ) ) 
THEN 
  534         DO WHILE ( k.GE.istart2 )
 
  536            IF( abs( b( k, k ) ) .LT. btol ) 
THEN 
  540               DO k2 = k, istart2+1, -1
 
  541                  CALL clartg( b( k2-1, k2 ), b( k2-1, k2-1 ), c1,
 
  545                  b( k2-1, k2-1 ) = czero
 
  547                  CALL crot( k2-2-istartm+1, b( istartm, k2 ), 1,
 
  548     $                       b( istartm, k2-1 ), 1, c1, s1 )
 
  549                  CALL crot( min( k2+1, istop )-istartm+1,
 
  551     $                       k2 ), 1, a( istartm, k2-1 ), 1, c1, s1 )
 
  553                     CALL crot( n, z( 1, k2 ), 1, z( 1, k2-1 ), 1,
 
  558                  IF( k2.LT.istop ) 
THEN 
  559                     CALL clartg( a( k2, k2-1 ), a( k2+1, k2-1 ), c1,
 
  562                     a( k2+1, k2-1 ) = czero
 
  564                     CALL crot( istopm-k2+1, a( k2, k2 ), lda,
 
  566     $                          k2 ), lda, c1, s1 )
 
  567                     CALL crot( istopm-k2+1, b( k2, k2 ), ldb,
 
  569     $                          k2 ), ldb, c1, s1 )
 
  571                        CALL crot( n, q( 1, k2 ), 1, q( 1, k2+1 ), 1,
 
  578               IF( istart2.LT.istop )
THEN 
  579                  CALL clartg( a( istart2, istart2 ), a( istart2+1,
 
  580     $                         istart2 ), c1, s1, temp )
 
  581                  a( istart2, istart2 ) = temp
 
  582                  a( istart2+1, istart2 ) = czero
 
  584                  CALL crot( istopm-( istart2+1 )+1, a( istart2,
 
  585     $                       istart2+1 ), lda, a( istart2+1,
 
  586     $                       istart2+1 ), lda, c1, s1 )
 
  587                  CALL crot( istopm-( istart2+1 )+1, b( istart2,
 
  588     $                       istart2+1 ), ldb, b( istart2+1,
 
  589     $                       istart2+1 ), ldb, c1, s1 )
 
  591                     CALL crot( n, q( 1, istart2 ), 1, q( 1,
 
  592     $                          istart2+1 ), 1, c1, conjg( s1 ) )
 
  604         IF ( istart2 .GE. istop ) 
THEN 
  615         IF ( istop-istart2+1 .LT. nmin ) 
THEN 
  619            IF ( istop-istart+1 .LT. nmin ) 
THEN 
  630         CALL claqz2( ilschur, ilq, ilz, n, istart2, istop, nw, a,
 
  632     $                b, ldb, q, ldq, z, ldz, n_undeflated, n_deflated,
 
  633     $                alpha, beta, work, nw, work( nw**2+1 ), nw,
 
  634     $                work( 2*nw**2+1 ), lwork-2*nw**2, rwork, rec,
 
  637         IF ( n_deflated > 0 ) 
THEN 
  638            istop = istop-n_deflated
 
  643         IF ( 100*n_deflated > nibble*( n_deflated+n_undeflated ) .OR.
 
  644     $      istop-istart2+1 .LT. nmin ) 
THEN 
  652         ns = min( nshifts, istop-istart2 )
 
  653         ns = min( ns, n_undeflated )
 
  654         shiftpos = istop-n_undeflated+1
 
  656         IF ( mod( ld, 6 ) .EQ. 0 ) 
THEN 
  660            IF( ( real( maxit )*safmin )*abs( a( istop,
 
  661     $         istop-1 ) ).LT.abs( a( istop-1, istop-1 ) ) ) 
THEN 
  662               eshift = a( istop, istop-1 )/b( istop-1, istop-1 )
 
  664               eshift = eshift+cone/( safmin*real( maxit ) )
 
  666            alpha( shiftpos ) = cone
 
  667            beta( shiftpos ) = eshift
 
  674         CALL claqz3( ilschur, ilq, ilz, n, istart2, istop, ns,
 
  676     $                alpha( shiftpos ), beta( shiftpos ), a, lda, b,
 
  677     $                ldb, q, ldq, z, ldz, work, nblock, work( nblock**
 
  678     $                2+1 ), nblock, work( 2*nblock**2+1 ),
 
  679     $                lwork-2*nblock**2, sweep_info )
 
  689   80 
CALL chgeqz( wants, wantq, wantz, n, ilo, ihi, a, lda, b, ldb,
 
  690     $             alpha, beta, q, ldq, z, ldz, work, lwork, rwork,