280 RECURSIVE SUBROUTINE zlaqz0( WANTS, WANTQ, WANTZ, N, ILO, IHI, A,
281 $ LDA, B, LDB, ALPHA, BETA, Q, LDQ, Z,
282 $ LDZ, WORK, LWORK, RWORK, REC,
287 CHARACTER,
INTENT( IN ) :: wants, wantq, wantz
288 INTEGER,
INTENT( IN ) :: n, ilo, ihi, lda, ldb, ldq, ldz, lwork,
290 INTEGER,
INTENT( OUT ) :: info
291 COMPLEX*16,
INTENT( INOUT ) :: a( lda, * ), b( ldb, * ), q( ldq,
292 $ * ), z( ldz, * ),
alpha( * ), beta( * ), work( * )
293 DOUBLE PRECISION,
INTENT( OUT ) :: rwork( * )
296 COMPLEX*16 czero, cone
297 PARAMETER ( czero = ( 0.0d+0, 0.0d+0 ), cone = ( 1.0d+0,
299 DOUBLE PRECISION :: zero, , half
300 parameter( zero = 0.0d0, one = 1.0d0, half = 0.5d0 )
303 DOUBLE PRECISION :: smlnum, ulp, safmin, safmax, c1, tempr
304 COMPLEX*16 :: eshift, s1, temp
305 INTEGER :: istart, istop, iiter, maxit, istart2, k, , nshifts,
306 $ nblock, nw, nmin, nibble, n_undeflated, n_deflated,
307 $ ns, sweep_info, shiftpos, lworkreq, k2, istartm,
308 $ istopm, iwants, iwantq, iwantz, norm_info, aed_info,
309 $ nwr, nbr, nsr, itemp1, itemp2, rcost
310 LOGICAL :: ilschur, ilq, ilz
311 CHARACTER :: jbcmpz*3
316 DOUBLE PRECISION,
EXTERNAL ::
dlamch
318 INTEGER,
EXTERNAL ::
ilaenv
323 IF(
lsame( wants,
'E' ) )
THEN
326 ELSE IF(
lsame( wants, 's
' ) ) THEN
333 IF( LSAME( WANTQ, 'n
' ) ) THEN
336 ELSE IF( LSAME( WANTQ, 'v
' ) ) THEN
339 ELSE IF( LSAME( WANTQ, 'i
' ) ) THEN
346 IF( LSAME( WANTZ, 'n
' ) ) THEN
349 ELSE IF( LSAME( WANTZ, 'v
' ) ) THEN
352 ELSE IF( LSAME( WANTZ, 'i
' ) ) THEN
362.EQ.
IF( IWANTS0 ) THEN
364.EQ.
ELSE IF( IWANTQ0 ) THEN
366.EQ.
ELSE IF( IWANTZ0 ) THEN
368.LT.
ELSE IF( N0 ) THEN
370.LT.
ELSE IF( ILO1 ) THEN
372.GT..OR..LT.
ELSE IF( IHIN IHIILO-1 ) THEN
374.LT.
ELSE IF( LDAN ) THEN
376.LT.
ELSE IF( LDBN ) THEN
378.LT..OR..AND..LT.
ELSE IF( LDQ1 ( ILQ LDQN ) ) THEN
380.LT..OR..AND..LT.
ELSE IF( LDZ1 ( ILZ LDZN ) ) THEN
384 CALL XERBLA( 'zlaqz0', -INFO )
392 WORK( 1 ) = DBLE( 1 )
399 JBCMPZ( 1:1 ) = WANTS
400 JBCMPZ( 2:2 ) = WANTQ
401 JBCMPZ( 3:3 ) = WANTZ
403 NMIN = ILAENV( 12, 'zlaqz0', JBCMPZ, N, ILO, IHI, LWORK )
405 NWR = ILAENV( 13, 'zlaqz0', JBCMPZ, N, ILO, IHI, LWORK )
407 NWR = MIN( IHI-ILO+1, ( N-1 ) / 3, NWR )
409 NIBBLE = ILAENV( 14, 'zlaqz0', JBCMPZ, N, ILO, IHI, LWORK )
411 NSR = ILAENV( 15, 'zlaqz0', JBCMPZ, N, ILO, IHI, LWORK )
412 NSR = MIN( NSR, ( N+6 ) / 9, IHI-ILO )
413 NSR = MAX( 2, NSR-MOD( NSR, 2 ) )
415 RCOST = ILAENV( 17, 'zlaqz0', JBCMPZ, N, ILO, IHI, LWORK )
416 ITEMP1 = INT( NSR/SQRT( 1+2*NSR/( DBLE( RCOST )/100*N ) ) )
417 ITEMP1 = ( ( ITEMP1-1 )/4 )*4+4
420.LT..OR..GE.
IF( N NMIN REC 2 ) THEN
421 CALL ZHGEQZ( WANTS, WANTQ, WANTZ, N, ILO, IHI, A, LDA, B, LDB,
422 $ ALPHA, BETA, Q, LDQ, Z, LDZ, WORK, LWORK, RWORK,
432 NW = MAX( NWR, NMIN )
433 CALL ZLAQZ2( ILSCHUR, ILQ, ILZ, N, ILO, IHI, NW, A, LDA, B, LDB,
434 $ Q, LDQ, Z, LDZ, N_UNDEFLATED, N_DEFLATED, ALPHA,
435 $ BETA, WORK, NW, WORK, NW, WORK, -1, RWORK, REC,
437 ITEMP1 = INT( WORK( 1 ) )
439 CALL ZLAQZ3( ILSCHUR, ILQ, ILZ, N, ILO, IHI, NSR, NBR, ALPHA,
440 $ BETA, A, LDA, B, LDB, Q, LDQ, Z, LDZ, WORK, NBR,
441 $ WORK, NBR, WORK, -1, SWEEP_INFO )
442 ITEMP2 = INT( WORK( 1 ) )
444 LWORKREQ = MAX( ITEMP1+2*NW**2, ITEMP2+2*NBR**2 )
445.EQ.
IF ( LWORK -1 ) THEN
446 WORK( 1 ) = DBLE( LWORKREQ )
448.LT.
ELSE IF ( LWORK LWORKREQ ) THEN
452 CALL XERBLA( 'zlaqz0', INFO )
458.EQ.
IF( IWANTQ3 ) CALL ZLASET( 'full
', N, N, CZERO, CONE, Q,
460.EQ.
IF( IWANTZ3 ) CALL ZLASET( 'full', n, n, czero, cone, z,
464 safmin =
dlamch(
'SAFE MINIMUM' )
466 CALL dlabad( safmin, safmax )
467 ulp =
dlamch(
'PRECISION' )
468 smlnum = safmin*( dble( n )/ulp )
472 maxit = 30*( ihi-ilo+1 )
476 IF( iiter .GE. maxit )
THEN
480 IF ( istart+1 .GE. istop )
THEN
486 IF ( abs( a( istop, istop-1 ) ) .LE.
max( smlnum,
487 $ ulp*( abs( a( istop, istop ) )+abs( a( istop-1,
488 $ istop-1 ) ) ) ) )
THEN
489 a( istop, istop-1 ) = czero
495 IF ( abs( a( istart+1, istart ) ) .LE.
max( smlnum,
496 $ ulp*( abs( a( istart, istart ) )+abs( a( istart+1,
497 $ istart+1 ) ) ) ) )
THEN
498 a( istart+1, istart ) = czero
504 IF ( istart+1 .GE. istop )
THEN
510 DO k = istop, istart+1, -1
511 IF ( abs( a( k, k-1 ) ) .LE.
max( smlnum, ulp*( abs( a( k,
512 $ k ) )+abs( a( k-1, k-1 ) ) ) ) )
THEN
531 DO WHILE ( k.GE.istart2 )
533 IF( k .LT. istop )
THEN
534 tempr = tempr+abs( b( k, k+1 ) )
536 IF( k .GT. istart2 )
THEN
537 tempr = tempr+abs( b( k-1, k ) )
540 IF( abs( b( k, k ) ) .LT.
max( smlnum, ulp*tempr ) )
THEN
544 DO k2 = k, istart2+1, -1
545 CALL zlartg( b( k2-1, k2 ), b( k2-1, k2-1 ), c1, s1,
548 b( k2-1, k2-1 ) = czero
550 CALL zrot( k2-2-istartm+1, b( istartm, k2 ), 1,
551 $ b( istartm, k2-1 ), 1, c1, s1 )
552 CALL zrot(
min( k2+1, istop )-istartm+1, a( istartm,
553 $ k2 ), 1, a( istartm, k2-1 ), 1, c1, s1 )
555 CALL zrot( n, z( 1, k2 ), 1, z( 1, k2-1 ), 1, c1,
559 IF( k2.LT.istop )
THEN
560 CALL zlartg( a( k2, k2-1 ), a( k2+1, k2-1 ), c1,
563 a( k2+1, k2-1 ) = czero
565 CALL zrot( istopm-k2+1, a( k2, k2 ), lda, a( k2+1,
566 $ k2 ), lda, c1, s1 )
567 CALL zrot( istopm-k2+1, b( k2, k2 ), ldb, b( k2+1,
568 $ k2 ), ldb, c1, s1 )
570 CALL zrot( n, q( 1, k2 ), 1, q( 1, k2+1 ), 1,
577 IF( istart2.LT.istop )
THEN
578 CALL zlartg( a( istart2, istart2 ), a( istart2+1,
579 $ istart2 ), c1, s1, temp )
580 a( istart2, istart2 ) = temp
581 a( istart2+1, istart2 ) = czero
583 CALL zrot( istopm-( istart2+1 )+1, a( istart2,
584 $ istart2+1 ), lda, a( istart2+1,
585 $ istart2+1 ), lda, c1, s1 )
586 CALL zrot( istopm-( istart2+1 )+1, b( istart2,
587 $ istart2+1 ), ldb, b( istart2+1,
588 $ istart2+1 ), ldb, c1, s1 )
590 CALL zrot( n, q( 1, istart2 ), 1, q( 1,
591 $ istart2+1 ), 1, c1, dconjg( s1 ) )
603 IF ( istart2 .GE. istop )
THEN
614 IF ( istop-istart2+1 .LT. nmin )
THEN
618 IF ( istop-istart+1 .LT. nmin )
THEN
629 CALL zlaqz2( ilschur, ilq, ilz, n, istart2, istop, nw, a, lda,
630 $ b, ldb, q, ldq, z, ldz, n_undeflated, n_deflated,
631 $
alpha, beta, work, nw, work( nw**2+1 ), nw,
632 $ work( 2*nw**2+1 ), lwork-2*nw**2, rwork, rec,
635 IF ( n_deflated > 0 )
THEN
636 istop = istop-n_deflated
641 IF ( 100*n_deflated > nibble*( n_deflated+n_undeflated ) .OR.
642 $ istop-istart2+1 .LT. nmin )
THEN
650 ns =
min( nshifts, istop-istart2 )
651 ns =
min( ns, n_undeflated )
652 shiftpos = istop-n_deflated-n_undeflated+1
654 IF ( mod( ld, 6 ) .EQ. 0 )
THEN
658 IF( ( dble( maxit )*safmin )*abs( a( istop,
659 $ istop-1 ) ).LT.abs( a( istop-1, istop-1 ) ) )
THEN
660 eshift = a( istop, istop-1 )/b( istop-1, istop-1 )
662 eshift = eshift+cone/( safmin*dble( maxit ) )
664 alpha( shiftpos ) = cone
665 beta( shiftpos ) = eshift
672 CALL zlaqz3( ilschur, ilq, ilz, n, istart2, istop, ns, nblock,
673 $
alpha( shiftpos ), beta( shiftpos ), a, lda, b,
674 $ ldb, q, ldq, z, ldz, work, nblock, work( nblock**
675 $ 2+1 ), nblock, work( 2*nblock**2+1 ),
676 $ lwork-2*nblock**2, sweep_info )
686 80
CALL zhgeqz( wants, wantq, wantz, n, ilo, ihi, a, lda, b, ldb,
687 $
alpha, beta, q, ldq, z, ldz, work, lwork, rwork,