228 RECURSIVE SUBROUTINE zlaqz2( ILSCHUR, ILQ, ILZ, N, ILO, IHI,
230 $ A, LDA, B, LDB, Q, LDQ, Z, LDZ, NS,
231 $ ND, ALPHA, BETA, QC, LDQC, ZC, LDZC,
232 $ WORK, LWORK, RWORK, REC, INFO )
236 LOGICAL,
INTENT( IN ) :: ilschur, ilq, ilz
237 INTEGER,
INTENT( IN ) :: n, ilo, ihi, nw, lda, ldb, ldq, ldz,
238 $ ldqc, ldzc, lwork, rec
240 COMPLEX*16,
INTENT( INOUT ) :: a( lda, * ), b( ldb, * ), q( ldq,
241 $ * ), z( ldz, * ), alpha( * ), beta( * )
242 INTEGER,
INTENT( OUT ) :: ns, nd, info
243 COMPLEX*16 :: qc( ldqc, * ), zc( ldzc, * ), work( * )
244 DOUBLE PRECISION :: rwork( * )
247 COMPLEX*16 czero, cone
248 parameter( czero = ( 0.0d+0, 0.0d+0 ), cone = ( 1.0d+0,
250 DOUBLE PRECISION :: zero, one, half
251 parameter( zero = 0.0d0, one = 1.0d0, half = 0.5d0 )
254 INTEGER :: jw, kwtop, kwbot, istopm, istartm, k, k2, ztgexc_info,
255 $ ifst, ilst, lworkreq, qz_small_info
256 DOUBLE PRECISION ::smlnum, ulp, safmin, safmax, c1, tempr
257 COMPLEX*16 :: s, s1, temp
262 DOUBLE PRECISION,
EXTERNAL ::
dlamch
267 jw = min( nw, ihi-ilo+1 )
269 IF ( kwtop .EQ. ilo )
THEN
272 s = a( kwtop, kwtop-1 )
278 CALL zlaqz0(
'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
287 ELSE IF ( lwork .LT. lworkreq )
THEN
292 CALL xerbla(
'ZLAQZ2', -info )
297 safmin =
dlamch(
'SAFE MINIMUM' )
299 ulp =
dlamch(
'PRECISION' )
300 smlnum = safmin*( dble( 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 zlacpy(
'ALL', jw, jw, a( kwtop, kwtop ), lda, work, jw )
321 CALL zlacpy(
'ALL', jw, jw, b( kwtop, kwtop ), ldb,
326 CALL zlaset(
'FULL', jw, jw, czero, cone, qc, ldqc )
327 CALL zlaset(
'FULL', jw, jw, czero, cone, zc, ldzc )
328 CALL zlaqz0(
'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 zlacpy(
'ALL', jw, jw, work, jw, a( kwtop, kwtop ),
339 CALL zlacpy(
'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 ztgexc( .true., .true., jw, a( kwtop, kwtop ),
366 $ lda, b( kwtop, kwtop ), ldb, qc, ldqc,
367 $ zc, ldzc, ifst, ilst, ztgexc_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 ) *dconjg( qc( 1,
389 DO k = kwbot-1, kwtop, -1
390 CALL zlartg( 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 zrot( ihi-k2+1, a( k, k2 ), lda, a( k+1, k2 ), lda,
398 CALL zrot( ihi-( k-1 )+1, b( k, k-1 ), ldb, b( k+1,
401 CALL zrot( jw, qc( 1, k-kwtop+1 ), 1, qc( 1,
403 $ 1, c1, dconjg( s1 ) )
410 DO WHILE ( k .GE. kwtop )
414 CALL zlaqz1( .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 zgemm(
'C',
'N', jw, istopm-ihi, jw, cone, qc, ldqc,
435 $ a( kwtop, ihi+1 ), lda, czero, work, jw )
436 CALL zlacpy(
'ALL', jw, istopm-ihi, work, jw, a( kwtop,
438 CALL zgemm(
'C',
'N', jw, istopm-ihi, jw, cone, qc, ldqc,
439 $ b( kwtop, ihi+1 ), ldb, czero, work, jw )
440 CALL zlacpy(
'ALL', jw, istopm-ihi, work, jw, b( kwtop,
444 CALL zgemm(
'N',
'N', n, jw, jw, cone, q( 1, kwtop ), ldq,
446 $ ldqc, czero, work, n )
447 CALL zlacpy(
'ALL', n, jw, work, n, q( 1, kwtop ), ldq )
450 IF ( kwtop-1-istartm+1 > 0 )
THEN
451 CALL zgemm(
'N',
'N', kwtop-istartm, jw, jw, cone,
453 $ kwtop ), lda, zc, ldzc, czero, work,
455 CALL zlacpy(
'ALL', kwtop-istartm, jw, work, kwtop-istartm,
456 $ a( istartm, kwtop ), lda )
457 CALL zgemm(
'N',
'N', kwtop-istartm, jw, jw, cone,
459 $ kwtop ), ldb, zc, ldzc, czero, work,
461 CALL zlacpy(
'ALL', kwtop-istartm, jw, work, kwtop-istartm,
462 $ b( istartm, kwtop ), ldb )
465 CALL zgemm(
'N',
'N', n, jw, jw, cone, z( 1, kwtop ), ldz,
467 $ ldzc, czero, work, n )
468 CALL zlacpy(
'ALL', n, jw, work, n, z( 1, kwtop ), ldz )