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, ONE, HALF
300 parameter( zero = 0.0d0, one = 1.0d0, half = 0.5d0 )
303 DOUBLE PRECISION :: SMLNUM, ULP, SAFMIN, SAFMAX, C1, TEMPR,
305 COMPLEX*16 :: ESHIFT, S1, TEMP
306 INTEGER :: ISTART, ISTOP, IITER, MAXIT, ISTART2, K, LD, NSHIFTS,
307 $ nblock, nw, nmin, nibble, n_undeflated, n_deflated,
308 $ ns, sweep_info, shiftpos, lworkreq, k2, istartm,
309 $ istopm, iwants, iwantq, iwantz, norm_info, aed_info,
310 $ nwr, nbr, nsr, itemp1, itemp2, rcost
311 LOGICAL :: ILSCHUR, ILQ, ILZ
312 CHARACTER :: JBCMPZ*3
317 DOUBLE PRECISION,
EXTERNAL :: DLAMCH, ZLANHS
318 LOGICAL,
EXTERNAL :: LSAME
319 INTEGER,
EXTERNAL :: ILAENV
324 IF( lsame( wants,
'E' ) )
THEN 327 ELSE IF( lsame( wants,
'S' ) )
THEN 334 IF( lsame( wantq,
'N' ) )
THEN 337 ELSE IF( lsame( wantq,
'V' ) )
THEN 340 ELSE IF( lsame( wantq,
'I' ) )
THEN 347 IF( lsame( wantz,
'N' ) )
THEN 350 ELSE IF( lsame( wantz,
'V' ) )
THEN 353 ELSE IF( lsame( wantz,
'I' ) )
THEN 363 IF( iwants.EQ.0 )
THEN 365 ELSE IF( iwantq.EQ.0 )
THEN 367 ELSE IF( iwantz.EQ.0 )
THEN 369 ELSE IF( n.LT.0 )
THEN 371 ELSE IF( ilo.LT.1 )
THEN 373 ELSE IF( ihi.GT.n .OR. ihi.LT.ilo-1 )
THEN 375 ELSE IF( lda.LT.n )
THEN 377 ELSE IF( ldb.LT.n )
THEN 379 ELSE IF( ldq.LT.1 .OR. ( ilq .AND. ldq.LT.n ) )
THEN 381 ELSE IF( ldz.LT.1 .OR. ( ilz .AND. ldz.LT.n ) )
THEN 385 CALL xerbla(
'ZLAQZ0', -info )
393 work( 1 ) = dble( 1 )
400 jbcmpz( 1:1 ) = wants
401 jbcmpz( 2:2 ) = wantq
402 jbcmpz( 3:3 ) = wantz
404 nmin = ilaenv( 12,
'ZLAQZ0', jbcmpz, n, ilo, ihi, lwork )
406 nwr = ilaenv( 13,
'ZLAQZ0', jbcmpz, n, ilo, ihi, lwork )
408 nwr = min( ihi-ilo+1, ( n-1 ) / 3, nwr )
410 nibble = ilaenv( 14,
'ZLAQZ0', jbcmpz, n, ilo, ihi, lwork )
412 nsr = ilaenv( 15,
'ZLAQZ0', jbcmpz, n, ilo, ihi, lwork )
413 nsr = min( nsr, ( n+6 ) / 9, ihi-ilo )
414 nsr = max( 2, nsr-mod( nsr, 2 ) )
416 rcost = ilaenv( 17,
'ZLAQZ0', jbcmpz, n, ilo, ihi, lwork )
417 itemp1 = int( nsr/sqrt( 1+2*nsr/( dble( rcost )/100*n ) ) )
418 itemp1 = ( ( itemp1-1 )/4 )*4+4
421 IF( n .LT. nmin .OR. rec .GE. 2 )
THEN 422 CALL zhgeqz( wants, wantq, wantz, n, ilo, ihi, a, lda, b, ldb,
423 $ alpha, beta, q, ldq, z, ldz, work, lwork, rwork,
433 nw = max( nwr, nmin )
434 CALL zlaqz2( ilschur, ilq, ilz, n, ilo, ihi, nw, a, lda, b, ldb,
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 zlaqz3( 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 ) = dble( lworkreq )
449 ELSE IF ( lwork .LT. lworkreq )
THEN 453 CALL xerbla(
'ZLAQZ0', info )
459 IF( iwantq.EQ.3 )
CALL zlaset(
'FULL', n, n, czero, cone, q,
461 IF( iwantz.EQ.3 )
CALL zlaset(
'FULL', n, n, czero, cone, z,
465 safmin = dlamch(
'SAFE MINIMUM' )
467 CALL dlabad( safmin, safmax )
468 ulp = dlamch(
'PRECISION' )
469 smlnum = safmin*( dble( n )/ulp )
471 bnorm = zlanhs(
'F', ihi-ilo+1, b( ilo, ilo ), ldb, rwork )
472 btol = max( safmin, ulp*bnorm )
476 maxit = 30*( ihi-ilo+1 )
480 IF( iiter .GE. maxit )
THEN 484 IF ( istart+1 .GE. istop )
THEN 490 IF ( abs( a( istop, istop-1 ) ) .LE. max( smlnum,
491 $ ulp*( abs( a( istop, istop ) )+abs( a( istop-1,
492 $ istop-1 ) ) ) ) )
THEN 493 a( istop, istop-1 ) = czero
499 IF ( abs( a( istart+1, istart ) ) .LE. max( smlnum,
500 $ ulp*( abs( a( istart, istart ) )+abs( a( istart+1,
501 $ istart+1 ) ) ) ) )
THEN 502 a( istart+1, istart ) = czero
508 IF ( istart+1 .GE. istop )
THEN 514 DO k = istop, istart+1, -1
515 IF ( abs( a( k, k-1 ) ) .LE. max( smlnum, ulp*( abs( a( k,
516 $ k ) )+abs( a( k-1, k-1 ) ) ) ) )
THEN 535 DO WHILE ( k.GE.istart2 )
537 IF( abs( b( k, k ) ) .LT. btol )
THEN 541 DO k2 = k, istart2+1, -1
542 CALL zlartg( b( k2-1, k2 ), b( k2-1, k2-1 ), c1, s1,
545 b( k2-1, k2-1 ) = czero
547 CALL zrot( k2-2-istartm+1, b( istartm, k2 ), 1,
548 $ b( istartm, k2-1 ), 1, c1, s1 )
549 CALL zrot( min( k2+1, istop )-istartm+1, a( istartm,
550 $ k2 ), 1, a( istartm, k2-1 ), 1, c1, s1 )
552 CALL zrot( n, z( 1, k2 ), 1, z( 1, k2-1 ), 1, c1,
556 IF( k2.LT.istop )
THEN 557 CALL zlartg( a( k2, k2-1 ), a( k2+1, k2-1 ), c1,
560 a( k2+1, k2-1 ) = czero
562 CALL zrot( istopm-k2+1, a( k2, k2 ), lda, a( k2+1,
563 $ k2 ), lda, c1, s1 )
564 CALL zrot( istopm-k2+1, b( k2, k2 ), ldb, b( k2+1,
565 $ k2 ), ldb, c1, s1 )
567 CALL zrot( n, q( 1, k2 ), 1, q( 1, k2+1 ), 1,
574 IF( istart2.LT.istop )
THEN 575 CALL zlartg( a( istart2, istart2 ), a( istart2+1,
576 $ istart2 ), c1, s1, temp )
577 a( istart2, istart2 ) = temp
578 a( istart2+1, istart2 ) = czero
580 CALL zrot( istopm-( istart2+1 )+1, a( istart2,
581 $ istart2+1 ), lda, a( istart2+1,
582 $ istart2+1 ), lda, c1, s1 )
583 CALL zrot( istopm-( istart2+1 )+1, b( istart2,
584 $ istart2+1 ), ldb, b( istart2+1,
585 $ istart2+1 ), ldb, c1, s1 )
587 CALL zrot( n, q( 1, istart2 ), 1, q( 1,
588 $ istart2+1 ), 1, c1, dconjg( s1 ) )
600 IF ( istart2 .GE. istop )
THEN 611 IF ( istop-istart2+1 .LT. nmin )
THEN 615 IF ( istop-istart+1 .LT. nmin )
THEN 626 CALL zlaqz2( ilschur, ilq, ilz, n, istart2, istop, nw, a, lda,
627 $ b, ldb, q, ldq, z, ldz, n_undeflated, n_deflated,
628 $ alpha, beta, work, nw, work( nw**2+1 ), nw,
629 $ work( 2*nw**2+1 ), lwork-2*nw**2, rwork, rec,
632 IF ( n_deflated > 0 )
THEN 633 istop = istop-n_deflated
638 IF ( 100*n_deflated > nibble*( n_deflated+n_undeflated ) .OR.
639 $ istop-istart2+1 .LT. nmin )
THEN 647 ns = min( nshifts, istop-istart2 )
648 ns = min( ns, n_undeflated )
649 shiftpos = istop-n_undeflated+1
651 IF ( mod( ld, 6 ) .EQ. 0 )
THEN 655 IF( ( dble( maxit )*safmin )*abs( a( istop,
656 $ istop-1 ) ).LT.abs( a( istop-1, istop-1 ) ) )
THEN 657 eshift = a( istop, istop-1 )/b( istop-1, istop-1 )
659 eshift = eshift+cone/( safmin*dble( maxit ) )
661 alpha( shiftpos ) = cone
662 beta( shiftpos ) = eshift
669 CALL zlaqz3( ilschur, ilq, ilz, n, istart2, istop, ns, nblock,
670 $ alpha( shiftpos ), beta( shiftpos ), a, lda, b,
671 $ ldb, q, ldq, z, ldz, work, nblock, work( nblock**
672 $ 2+1 ), nblock, work( 2*nblock**2+1 ),
673 $ lwork-2*nblock**2, sweep_info )
683 80
CALL zhgeqz( wants, wantq, wantz, n, ilo, ihi, a, lda, b, ldb,
684 $ alpha, beta, q, ldq, z, ldz, work, lwork, rwork,
subroutine zlaqz3(ILSCHUR, ILQ, ILZ, N, ILO, IHI, NSHIFTS, NBLOCK_DESIRED, ALPHA, BETA, A, LDA, B, LDB, Q, LDQ, Z, LDZ, QC, LDQC, ZC, LDZC, WORK, LWORK, INFO)
ZLAQZ3
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine zhgeqz(JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T, LDT, ALPHA, BETA, Q, LDQ, Z, LDZ, WORK, LWORK, RWORK, INFO)
ZHGEQZ
subroutine zlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values...
recursive subroutine zlaqz0(WANTS, WANTQ, WANTZ, N, ILO, IHI, A, LDA, B, LDB, ALPHA, BETA, Q, LDQ, Z, LDZ, WORK, LWORK, RWORK, REC, INFO)
ZLAQZ0
subroutine zrot(N, CX, INCX, CY, INCY, C, S)
ZROT applies a plane rotation with real cosine and complex sine to a pair of complex vectors...
recursive subroutine zlaqz2(ILSCHUR, ILQ, ILZ, N, ILO, IHI, NW, A, LDA, B, LDB, Q, LDQ, Z, LDZ, NS, ND, ALPHA, BETA, QC, LDQC, ZC, LDZC, WORK, LWORK, RWORK, REC, INFO)
ZLAQZ2
subroutine dlabad(SMALL, LARGE)
DLABAD