229 RECURSIVE SUBROUTINE claqz2( ILSCHUR, ILQ, ILZ, N, ILO, IHI,
231 $ A, LDA, B, LDB, Q, LDQ, Z, LDZ, NS,
232 $ ND, ALPHA, BETA, QC, LDQC, ZC, LDZC,
233 $ WORK, LWORK, RWORK, REC, INFO )
237 LOGICAL,
INTENT( IN ) :: ilschur, ilq, ilz
238 INTEGER,
INTENT( IN ) :: n, ilo, ihi, nw, lda, ldb, ldq, ldz,
239 $ ldqc, ldzc, lwork, rec
241 COMPLEX,
INTENT( INOUT ) :: a( lda, * ), b( ldb, * ), q( ldq, * ),
242 $ z( ldz, * ), alpha( * ), beta( * )
243 INTEGER,
INTENT( OUT ) :: ns, nd, info
244 COMPLEX :: qc( ldqc, * ), zc( ldzc, * ), work( * )
249 parameter( czero = ( 0.0, 0.0 ), cone = ( 1.0, 0.0 ) )
250 REAL :: zero, one, half
251 PARAMETER( zero = 0.0, one = 1.0, half = 0.5 )
254 INTEGER :: jw, kwtop, kwbot, istopm, istartm, k, k2, ctgexc_info,
255 $ ifst, ilst, lworkreq, qz_small_info
256 REAL :: smlnum, ulp, safmin, safmax, c1, tempr
257 COMPLEX :: s, s1, temp
267 jw = min( nw, ihi-ilo+1 )
269 IF ( kwtop .EQ. ilo )
THEN
272 s = a( kwtop, kwtop-1 )
278 CALL claqz0(
'S',
'V',
'V', jw, 1, jw, a( kwtop, kwtop ), lda,
279 $ b( kwtop, kwtop ), ldb, alpha, beta, qc, ldqc, zc,
280 $ ldzc, work, -1, rwork, rec+1, qz_small_info )
281 lworkreq = int( work( 1 ) )+2*jw**2
282 lworkreq = max( lworkreq, n*nw, 2*nw**2+n )
283 IF ( lwork .EQ.-1 )
THEN
285 work( 1 ) = cmplx( lworkreq )
287 ELSE IF ( lwork .LT. lworkreq )
THEN
292 CALL xerbla(
'CLAQZ2', -info )
297 safmin =
slamch(
'SAFE MINIMUM' )
299 ulp =
slamch(
'PRECISION' )
300 smlnum = safmin*( real( n )/ulp )
302 IF ( ihi .EQ. kwtop )
THEN
304 alpha( kwtop ) = a( kwtop, kwtop )
305 beta( kwtop ) = b( kwtop, kwtop )
308 IF ( abs( s ) .LE. max( smlnum, ulp*abs( a( kwtop,
312 IF ( kwtop .GT. ilo )
THEN
313 a( kwtop, kwtop-1 ) = czero
320 CALL clacpy(
'ALL', jw, jw, a( kwtop, kwtop ), lda, work, jw )
321 CALL clacpy(
'ALL', jw, jw, b( kwtop, kwtop ), ldb,
326 CALL claset(
'FULL', jw, jw, czero, cone, qc, ldqc )
327 CALL claset(
'FULL', jw, jw, czero, cone, zc, ldzc )
328 CALL claqz0(
'S',
'V',
'V', jw, 1, jw, a( kwtop, kwtop ), lda,
329 $ b( kwtop, kwtop ), ldb, alpha, beta, qc, ldqc, zc,
330 $ ldzc, work( 2*jw**2+1 ), lwork-2*jw**2, rwork,
331 $ rec+1, qz_small_info )
333 IF( qz_small_info .NE. 0 )
THEN
336 ns = jw-qz_small_info
337 CALL clacpy(
'ALL', jw, jw, work, jw, a( kwtop, kwtop ),
339 CALL clacpy(
'ALL', jw, jw, work( jw**2+1 ), jw, b( kwtop,
345 IF ( kwtop .EQ. ilo .OR. s .EQ. czero )
THEN
351 DO WHILE ( k .LE. jw )
353 tempr = abs( a( kwbot, kwbot ) )
354 IF( tempr .EQ. zero )
THEN
357 IF ( ( abs( s*qc( 1, kwbot-kwtop+1 ) ) ) .LE. max( ulp*
358 $ tempr, smlnum ) )
THEN
365 CALL ctgexc( .true., .true., jw, a( kwtop, kwtop ),
366 $ lda, b( kwtop, kwtop ), ldb, qc, ldqc,
367 $ zc, ldzc, ifst, ilst, ctgexc_info )
379 DO WHILE ( k .LE. ihi )
380 alpha( k ) = a( k, k )
381 beta( k ) = b( k, k )
385 IF ( kwtop .NE. ilo .AND. s .NE. czero )
THEN
387 a( kwtop:kwbot, kwtop-1 ) = a( kwtop, kwtop-1 ) *conjg( qc( 1,
389 DO k = kwbot-1, kwtop, -1
390 CALL clartg( a( k, kwtop-1 ), a( k+1, kwtop-1 ), c1, s1,
392 a( k, kwtop-1 ) = temp
393 a( k+1, kwtop-1 ) = czero
394 k2 = max( kwtop, k-1 )
395 CALL crot( ihi-k2+1, a( k, k2 ), lda, a( k+1, k2 ), lda,
398 CALL crot( ihi-( k-1 )+1, b( k, k-1 ), ldb, b( k+1,
401 CALL crot( jw, qc( 1, k-kwtop+1 ), 1, qc( 1,
403 $ 1, c1, conjg( s1 ) )
410 DO WHILE ( k .GE. kwtop )
414 CALL claqz1( .true., .true., k2, kwtop, kwtop+jw-1,
415 $ kwbot, a, lda, b, ldb, jw, kwtop, qc, ldqc,
416 $ jw, kwtop, zc, ldzc )
433 IF ( istopm-ihi > 0 )
THEN
434 CALL cgemm(
'C',
'N', jw, istopm-ihi, jw, cone, qc, ldqc,
435 $ a( kwtop, ihi+1 ), lda, czero, work, jw )
436 CALL clacpy(
'ALL', jw, istopm-ihi, work, jw, a( kwtop,
438 CALL cgemm(
'C',
'N', jw, istopm-ihi, jw, cone, qc, ldqc,
439 $ b( kwtop, ihi+1 ), ldb, czero, work, jw )
440 CALL clacpy(
'ALL', jw, istopm-ihi, work, jw, b( kwtop,
444 CALL cgemm(
'N',
'N', n, jw, jw, cone, q( 1, kwtop ), ldq,
446 $ ldqc, czero, work, n )
447 CALL clacpy(
'ALL', n, jw, work, n, q( 1, kwtop ), ldq )
450 IF ( kwtop-1-istartm+1 > 0 )
THEN
451 CALL cgemm(
'N',
'N', kwtop-istartm, jw, jw, cone,
453 $ kwtop ), lda, zc, ldzc, czero, work,
455 CALL clacpy(
'ALL', kwtop-istartm, jw, work, kwtop-istartm,
456 $ a( istartm, kwtop ), lda )
457 CALL cgemm(
'N',
'N', kwtop-istartm, jw, jw, cone,
459 $ kwtop ), ldb, zc, ldzc, czero, work,
461 CALL clacpy(
'ALL', kwtop-istartm, jw, work, kwtop-istartm,
462 $ b( istartm, kwtop ), ldb )
465 CALL cgemm(
'N',
'N', n, jw, jw, cone, z( 1, kwtop ), ldz,
467 $ ldzc, czero, work, n )
468 CALL clacpy(
'ALL', n, jw, work, n, z( 1, kwtop ), ldz )