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
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_deflated-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,
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.
double precision function zlanhs(NORM, N, A, LDA, WORK)
ZLANHS returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute value ...