201      SUBROUTINE claqz3( ILSCHUR, ILQ, ILZ, N, ILO, IHI, NSHIFTS,
 
  202     $                   NBLOCK_DESIRED, ALPHA, BETA, A, LDA, B, LDB,
 
  203     $                   Q, LDQ, Z, LDZ, QC, LDQC, ZC, LDZC, WORK,
 
  208      LOGICAL, 
INTENT( IN ) :: ILSCHUR, ILQ, ILZ
 
  209      INTEGER, 
INTENT( IN ) :: N, ILO, IHI, LDA, LDB, LDQ, LDZ, LWORK,
 
  210     $         NSHIFTS, NBLOCK_DESIRED, LDQC, LDZC
 
  212      COMPLEX, 
INTENT( INOUT ) :: A( LDA, * ), B( LDB, * ), Q( LDQ, * ),
 
  213     $   Z( LDZ, * ), QC( LDQC, * ), ZC( LDZC, * ), WORK( * ),
 
  214     $   ALPHA( * ), BETA( * )
 
  216      INTEGER, 
INTENT( OUT ) :: INFO
 
  220      PARAMETER          ( CZERO = ( 0.0, 0.0 ), cone = ( 1.0, 0.0 ) )
 
  221      REAL :: ZERO, ONE, HALF
 
  222      parameter( zero = 0.0, one = 1.0, half = 0.5 )
 
  225      INTEGER :: I, J, NS, ISTARTM, ISTOPM, SHEIGHT, SWIDTH, K, NP,
 
  226     $           ISTARTB, ISTOPB, ISHIFT, NBLOCK, NPOS
 
  227      REAL :: SAFMIN, SAFMAX, C, SCALE
 
  228      COMPLEX :: TEMP, TEMP2, TEMP3, S
 
  233      REAL, 
EXTERNAL :: SLAMCH
 
  236      IF ( nblock_desired .LT. nshifts+1 ) 
THEN 
  239      IF ( lwork .EQ.-1 ) 
THEN 
  241         work( 1 ) = cmplx( n*nblock_desired )
 
  243      ELSE IF ( lwork .LT. n*nblock_desired ) 
THEN 
  248         CALL xerbla( 
'CLAQZ3', -info )
 
  257      safmin = slamch( 
'SAFE MINIMUM' )
 
  260      IF ( ilo .GE. ihi ) 
THEN 
  273      npos = max( nblock_desired-ns, 1 )
 
  281      CALL claset( 
'FULL', ns+1, ns+1, czero, cone, qc, ldqc )
 
  282      CALL claset( 
'FULL', ns, ns, czero, cone, zc, ldzc )
 
  286         scale = sqrt( abs( alpha( i ) ) ) * sqrt( abs( beta( i ) ) )
 
  287         IF( scale .GE. safmin .AND. scale .LE. safmax ) 
THEN 
  288            alpha( i ) = alpha( i )/scale
 
  289            beta( i ) = beta( i )/scale
 
  292         temp2 = beta( i )*a( ilo, ilo )-alpha( i )*b( ilo, ilo )
 
  293         temp3 = beta( i )*a( ilo+1, ilo )
 
  295         IF ( abs( temp2 ) .GT. safmax .OR.
 
  296     $      abs( temp3 ) .GT. safmax ) 
THEN 
  301         CALL clartg( temp2, temp3, c, s, temp )
 
  302         CALL crot( ns, a( ilo, ilo ), lda, a( ilo+1, ilo ), lda,
 
  304         CALL crot( ns, b( ilo, ilo ), ldb, b( ilo+1, ilo ), ldb,
 
  306         CALL crot( ns+1, qc( 1, 1 ), 1, qc( 1, 2 ), 1, c,
 
  312            CALL claqz1( .true., .true., j, 1, ns, ihi-ilo+1, a( ilo,
 
  313     $                   ilo ), lda, b( ilo, ilo ), ldb, ns+1, 1, qc,
 
  314     $                   ldqc, ns, 1, zc, ldzc )
 
  325      swidth = istopm-( ilo+ns )+1
 
  326      IF ( swidth > 0 ) 
THEN 
  327         CALL cgemm( 
'C', 
'N', sheight, swidth, sheight, cone, qc,
 
  329     $               a( ilo, ilo+ns ), lda, czero, work, sheight )
 
  330         CALL clacpy( 
'ALL', sheight, swidth, work, sheight, a( ilo,
 
  332         CALL cgemm( 
'C', 
'N', sheight, swidth, sheight, cone, qc,
 
  334     $               b( ilo, ilo+ns ), ldb, czero, work, sheight )
 
  335         CALL clacpy( 
'ALL', sheight, swidth, work, sheight, b( ilo,
 
  339        CALL cgemm( 
'N', 
'N', n, sheight, sheight, cone, q( 1, ilo ),
 
  340     $              ldq, qc, ldqc, czero, work, n )
 
  341         CALL clacpy( 
'ALL', n, sheight, work, n, q( 1, ilo ), ldq )
 
  346      sheight = ilo-1-istartm+1
 
  348      IF ( sheight > 0 ) 
THEN 
  349         CALL cgemm( 
'N', 
'N', sheight, swidth, swidth, cone,
 
  350     $               a( istartm, ilo ), lda, zc, ldzc, czero, work,
 
  352         CALL clacpy( 
'ALL', sheight, swidth, work, sheight,
 
  355         CALL cgemm( 
'N', 
'N', sheight, swidth, swidth, cone,
 
  356     $               b( istartm, ilo ), ldb, zc, ldzc, czero, work,
 
  358         CALL clacpy( 
'ALL', sheight, swidth, work, sheight,
 
  363         CALL cgemm( 
'N', 
'N', n, swidth, swidth, cone, z( 1, ilo ),
 
  364     $               ldz, zc, ldzc, czero, work, n )
 
  365         CALL clacpy( 
'ALL', n, swidth, work, n, z( 1, ilo ), ldz )
 
  373      DO WHILE ( k < ihi-ns )
 
  374         np = min( ihi-ns-k, npos )
 
  382         CALL claset( 
'FULL', ns+np, ns+np, czero, cone, qc, ldqc )
 
  383         CALL claset( 
'FULL', ns+np, ns+np, czero, cone, zc, ldzc )
 
  391               CALL claqz1( .true., .true., k+i+j, istartb, istopb,
 
  393     $                      a, lda, b, ldb, nblock, k+1, qc, ldqc,
 
  394     $                      nblock, k, zc, ldzc )
 
  404         swidth = istopm-( k+ns+np )+1
 
  405         IF ( swidth > 0 ) 
THEN 
  406            CALL cgemm( 
'C', 
'N', sheight, swidth, sheight, cone, qc,
 
  407     $                  ldqc, a( k+1, k+ns+np ), lda, czero, work,
 
  409            CALL clacpy( 
'ALL', sheight, swidth, work, sheight,
 
  412            CALL cgemm( 
'C', 
'N', sheight, swidth, sheight, cone, qc,
 
  413     $                  ldqc, b( k+1, k+ns+np ), ldb, czero, work,
 
  415            CALL clacpy( 
'ALL', sheight, swidth, work, sheight,
 
  420            CALL cgemm( 
'N', 
'N', n, nblock, nblock, cone, q( 1,
 
  422     $                  ldq, qc, ldqc, czero, work, n )
 
  423            CALL clacpy( 
'ALL', n, nblock, work, n, q( 1, k+1 ),
 
  429         sheight = k-istartm+1
 
  431         IF ( sheight > 0 ) 
THEN 
  432            CALL cgemm( 
'N', 
'N', sheight, swidth, swidth, cone,
 
  433     $                  a( istartm, k ), lda, zc, ldzc, czero, work,
 
  435            CALL clacpy( 
'ALL', sheight, swidth, work, sheight,
 
  436     $                   a( istartm, k ), lda )
 
  437            CALL cgemm( 
'N', 
'N', sheight, swidth, swidth, cone,
 
  438     $                  b( istartm, k ), ldb, zc, ldzc, czero, work,
 
  440            CALL clacpy( 
'ALL', sheight, swidth, work, sheight,
 
  441     $                   b( istartm, k ), ldb )
 
  444            CALL cgemm( 
'N', 
'N', n, nblock, nblock, cone, z( 1, k ),
 
  445     $                  ldz, zc, ldzc, czero, work, n )
 
  446            CALL clacpy( 
'ALL', n, nblock, work, n, z( 1, k ), ldz )
 
  456      CALL claset( 
'FULL', ns, ns, czero, cone, qc, ldqc )
 
  457      CALL claset( 
'FULL', ns+1, ns+1, czero, cone, zc, ldzc )
 
  466         DO ishift = ihi-i, ihi-1
 
  467            CALL claqz1( .true., .true., ishift, istartb, istopb,
 
  469     $                   a, lda, b, ldb, ns, ihi-ns+1, qc, ldqc, ns+1,
 
  480      swidth = istopm-( ihi+1 )+1
 
  481      IF ( swidth > 0 ) 
THEN 
  482         CALL cgemm( 
'C', 
'N', sheight, swidth, sheight, cone, qc,
 
  484     $               a( ihi-ns+1, ihi+1 ), lda, czero, work, sheight )
 
  485         CALL clacpy( 
'ALL', sheight, swidth, work, sheight,
 
  486     $                a( ihi-ns+1, ihi+1 ), lda )
 
  487         CALL cgemm( 
'C', 
'N', sheight, swidth, sheight, cone, qc,
 
  489     $               b( ihi-ns+1, ihi+1 ), ldb, czero, work, sheight )
 
  490         CALL clacpy( 
'ALL', sheight, swidth, work, sheight,
 
  491     $                b( ihi-ns+1, ihi+1 ), ldb )
 
  494         CALL cgemm( 
'N', 
'N', n, ns, ns, cone, q( 1, ihi-ns+1 ),
 
  496     $               qc, ldqc, czero, work, n )
 
  497         CALL clacpy( 
'ALL', n, ns, work, n, q( 1, ihi-ns+1 ), ldq )
 
  502      sheight = ihi-ns-istartm+1
 
  504      IF ( sheight > 0 ) 
THEN 
  505         CALL cgemm( 
'N', 
'N', sheight, swidth, swidth, cone,
 
  506     $               a( istartm, ihi-ns ), lda, zc, ldzc, czero, work,
 
  508         CALL clacpy( 
'ALL', sheight, swidth, work, sheight,
 
  511         CALL cgemm( 
'N', 
'N', sheight, swidth, swidth, cone,
 
  512     $               b( istartm, ihi-ns ), ldb, zc, ldzc, czero, work,
 
  514         CALL clacpy( 
'ALL', sheight, swidth, work, sheight,
 
  519         CALL cgemm( 
'N', 
'N', n, ns+1, ns+1, cone, z( 1, ihi-ns ),
 
  521     $               zc, ldzc, czero, work, n )
 
  522         CALL clacpy( 
'ALL', n, ns+1, work, n, z( 1, ihi-ns ), ldz )