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
304 COMPLEX*16 :: eshift, s1, temp
305 INTEGER :: istart, istop, iiter, maxit, istart2, k, ld, 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
317 LOGICAL,
EXTERNAL ::
lsame
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 IF( iwants.EQ.0 )
THEN
364 ELSE IF( iwantq.EQ.0 )
THEN
366 ELSE IF( iwantz.EQ.0 )
THEN
368 ELSE IF( n.LT.0 )
THEN
370 ELSE IF( ilo.LT.1 )
THEN
372 ELSE IF( ihi.GT.n .OR. ihi.LT.ilo-1 )
THEN
374 ELSE IF( lda.LT.n )
THEN
376 ELSE IF( ldb.LT.n )
THEN
378 ELSE IF( ldq.LT.1 .OR. ( ilq .AND. ldq.LT.n ) )
THEN
380 ELSE IF( ldz.LT.1 .OR. ( ilz .AND. ldz.LT.n ) )
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 IF( n .LT. nmin .OR. rec .GE. 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 IF ( lwork .EQ.-1 )
THEN
446 work( 1 ) = dble( lworkreq )
448 ELSE IF ( lwork .LT. lworkreq )
THEN
452 CALL xerbla(
'ZLAQZ0', info )
458 IF( iwantq.EQ.3 )
CALL zlaset(
'FULL', n, n, czero, cone, q,
460 IF( iwantz.EQ.3 )
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,
double precision function dlamch(CMACH)
DLAMCH
subroutine zlartg(f, g, c, s, r)
ZLARTG generates a plane rotation with real cosine and complex sine.
subroutine dlabad(SMALL, LARGE)
DLABAD
integer function ilaenv(ISPEC, NAME, OPTS, N1, N2, N3, N4)
ILAENV
subroutine xerbla(SRNAME, INFO)
XERBLA
logical function lsame(CA, CB)
LSAME
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
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 zhgeqz(JOB, COMPQ, COMPZ, N, ILO, IHI, H, LDH, T, LDT, ALPHA, BETA, Q, LDQ, Z, LDZ, WORK, LWORK, RWORK, INFO)
ZHGEQZ
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 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.
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.