280 RECURSIVE SUBROUTINE claqz0( 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, , ihi, lda, ldb, ldq, ldz, lwork,
290 INTEGER,
INTENT( OUT ) :: info
291 COMPLEX,
INTENT( INOUT ) :: a( lda, * ), b( ldb, * ), q( ldq, * ),
292 $ z( ldz, * ),
alpha( * ), beta( * ), work( * )
293 REAL,
INTENT( OUT ) :: rwork( * )
297 PARAMETER ( czero = ( 0.0, 0.0 ), cone = ( 1.0, 0.0 ) )
298 REAL :: zero, one, half
299 parameter( zero = 0.0, one = 1.0, half = 0.5 )
302 REAL :: smlnum, ulp, safmin, safmax, c1,
303 COMPLEX :: eshift, s1, temp
304 INTEGER :: istart, istop, iiter, maxit, , k, ld, nshifts,
305 $ nblock, nw, nmin, nibble, n_undeflated, n_deflated,
306 $ ns, sweep_info, shiftpos, lworkreq, k2, istartm,
307 $ istopm, iwants, iwantq, iwantz, norm_info, aed_info,
308 $ nwr, nbr, nsr, itemp1, itemp2, rcost
309 LOGICAL :: ilschur, ilq, ilz
310 CHARACTER :: jbcmpz*3
316 LOGICAL,
EXTERNAL ::
lsame
317 INTEGER,
EXTERNAL ::
ilaenv
322 IF(
lsame( wants,
'E' ) )
THEN
325 ELSE IF(
lsame( wants, 's
' ) ) THEN
332 IF( LSAME( WANTQ, 'n
' ) ) THEN
335 ELSE IF( LSAME( WANTQ, 'v
' ) ) THEN
338 ELSE IF( LSAME( WANTQ, 'i
' ) ) THEN
345 IF( LSAME( WANTZ, 'n
' ) ) THEN
348 ELSE IF( LSAME( WANTZ, 'v
' ) ) THEN
351 ELSE IF( LSAME( WANTZ, 'i
' ) ) THEN
361.EQ.
IF( IWANTS0 ) THEN
363.EQ.
ELSE IF( IWANTQ0 ) THEN
365.EQ.
ELSE IF( IWANTZ0 ) THEN
367.LT.
ELSE IF( N0 ) THEN
369.LT.
ELSE IF( ILO1 ) THEN
371.GT..OR..LT.
ELSE IF( IHIN IHIILO-1 ) THEN
373.LT.
ELSE IF( LDAN ) THEN
375.LT.
ELSE IF( LDBN ) THEN
377.LT..OR..AND..LT.
ELSE IF( LDQ1 ( ILQ LDQN ) ) THEN
379.LT..OR..AND..LT.
ELSE IF( LDZ1 ( ILZ LDZN ) ) THEN
383 CALL XERBLA( 'claqz0', -INFO )
391 WORK( 1 ) = REAL( 1 )
398 JBCMPZ( 1:1 ) = WANTS
399 JBCMPZ( 2:2 ) = WANTQ
400 JBCMPZ( 3:3 ) = WANTZ
402 NMIN = ILAENV( 12, 'claqz0', JBCMPZ, N, ILO, IHI, LWORK )
404 NWR = ILAENV( 13, 'claqz0', JBCMPZ, N, ILO, IHI, LWORK )
406 NWR = MIN( IHI-ILO+1, ( N-1 ) / 3, NWR )
408 NIBBLE = ILAENV( 14, 'claqz0', JBCMPZ, N, ILO, IHI, LWORK )
410 NSR = ILAENV( 15, 'claqz0', JBCMPZ, N, ILO, IHI, LWORK )
411 NSR = MIN( NSR, ( N+6 ) / 9, IHI-ILO )
412 NSR = MAX( 2, NSR-MOD( NSR, 2 ) )
414 RCOST = ILAENV( 17, 'claqz0', JBCMPZ, N, ILO, IHI, LWORK )
415 ITEMP1 = INT( NSR/SQRT( 1+2*NSR/( REAL( RCOST )/100*N ) ) )
416 ITEMP1 = ( ( ITEMP1-1 )/4 )*4+4
419.LT..OR..GE.
IF( N NMIN REC 2 ) THEN
420 CALL CHGEQZ( WANTS, WANTQ, WANTZ, N, ILO, IHI, A, LDA, B, LDB,
421 $ ALPHA, BETA, Q, LDQ, Z, LDZ, WORK, LWORK, RWORK,
431 NW = MAX( NWR, NMIN )
432 CALL CLAQZ2( ILSCHUR, ILQ, ILZ, N, ILO, IHI, NW, A, LDA, B, LDB,
433 $ Q, LDQ, Z, LDZ, N_UNDEFLATED, N_DEFLATED, ALPHA,
434 $ BETA, WORK, NW, WORK, NW, WORK, -1, RWORK, REC,
436 ITEMP1 = INT( WORK( 1 ) )
438 CALL CLAQZ3( ILSCHUR, ILQ, ILZ, N, ILO, IHI, NSR, NBR, ALPHA,
439 $ BETA, A, LDA, B, LDB, Q, LDQ, Z, LDZ, WORK, NBR,
440 $ WORK, NBR, WORK, -1, SWEEP_INFO )
441 ITEMP2 = INT( WORK( 1 ) )
443 LWORKREQ = MAX( ITEMP1+2*NW**2, ITEMP2+2*NBR**2 )
444.EQ.
IF ( LWORK -1 ) THEN
445 WORK( 1 ) = REAL( LWORKREQ )
447.LT.
ELSE IF ( LWORK LWORKREQ ) THEN
451 CALL XERBLA( 'claqz0', INFO )
457.EQ.
IF( IWANTQ3 ) CALL CLASET( 'full
', N, N, CZERO, CONE, Q,
459.EQ.
IF( IWANTZ3 ) CALL CLASET( 'full
', N, N, CZERO, CONE, Z,
463 SAFMIN = SLAMCH( 'safe minimum
' )
465 CALL SLABAD( SAFMIN, SAFMAX )
466 ULP = SLAMCH( 'precision
' )
467 SMLNUM = SAFMIN*( REAL( N )/ULP )
471 MAXIT = 30*( IHI-ILO+1 )
475.GE.
IF( IITER MAXIT ) THEN
479.GE.
IF ( ISTART+1 ISTOP ) THEN
485.LE.
IF ( ABS( A( ISTOP, ISTOP-1 ) ) MAX( SMLNUM,
486 $ ULP*( ABS( A( ISTOP, ISTOP ) )+ABS( A( ISTOP-1,
487 $ ISTOP-1 ) ) ) ) ) THEN
488 A( ISTOP, ISTOP-1 ) = CZERO
494.LE.
IF ( ABS( A( ISTART+1, ISTART ) ) MAX( SMLNUM,
495 $ ULP*( ABS( A( ISTART, ISTART ) )+ABS( A( ISTART+1,
496 $ ISTART+1 ) ) ) ) ) THEN
497 A( ISTART+1, ISTART ) = CZERO
503.GE.
IF ( ISTART+1 ISTOP ) THEN
509 DO K = ISTOP, ISTART+1, -1
510.LE.
IF ( ABS( A( K, K-1 ) ) MAX( SMLNUM, ULP*( ABS( A( K,
511 $ K ) )+ABS( A( K-1, K-1 ) ) ) ) ) THEN
530.GE.
DO WHILE ( KISTART2 )
532.LT.
IF( K ISTOP ) THEN
533 TEMPR = TEMPR+ABS( B( K, K+1 ) )
535.GT.
IF( K ISTART2 ) THEN
536 TEMPR = TEMPR+ABS( B( K-1, K ) )
539.LT.
IF( ABS( B( K, K ) ) MAX( SMLNUM, ULP*TEMPR ) ) THEN
543 DO K2 = K, ISTART2+1, -1
544 CALL CLARTG( B( K2-1, K2 ), B( K2-1, K2-1 ), C1, S1,
547 B( K2-1, K2-1 ) = CZERO
549 CALL CROT( K2-2-ISTARTM+1, B( ISTARTM, K2 ), 1,
550 $ B( ISTARTM, K2-1 ), 1, C1, S1 )
551 CALL CROT( MIN( K2+1, ISTOP )-ISTARTM+1, A( ISTARTM,
552 $ K2 ), 1, A( ISTARTM, K2-1 ), 1, C1, S1 )
554 CALL CROT( N, Z( 1, K2 ), 1, Z( 1, K2-1 ), 1, C1,
558.LT.
IF( K2ISTOP ) THEN
559 CALL CLARTG( A( K2, K2-1 ), A( K2+1, K2-1 ), C1,
562 A( K2+1, K2-1 ) = CZERO
564 CALL CROT( ISTOPM-K2+1, A( K2, K2 ), LDA, A( K2+1,
565 $ K2 ), LDA, C1, S1 )
566 CALL CROT( ISTOPM-K2+1, B( K2, K2 ), LDB, B( K2+1,
567 $ K2 ), LDB, C1, S1 )
569 CALL CROT( N, Q( 1, K2 ), 1, Q( 1, K2+1 ), 1,
576.LT.
IF( ISTART2ISTOP )THEN
577 CALL CLARTG( A( ISTART2, ISTART2 ), A( ISTART2+1,
578 $ ISTART2 ), C1, S1, TEMP )
579 A( ISTART2, ISTART2 ) = TEMP
580 A( ISTART2+1, ISTART2 ) = CZERO
582 CALL CROT( ISTOPM-( ISTART2+1 )+1, A( ISTART2,
583 $ ISTART2+1 ), LDA, A( ISTART2+1,
584 $ ISTART2+1 ), LDA, C1, S1 )
585 CALL CROT( ISTOPM-( ISTART2+1 )+1, B( ISTART2,
586 $ ISTART2+1 ), LDB, B( ISTART2+1,
587 $ ISTART2+1 ), LDB, C1, S1 )
589 CALL CROT( N, Q( 1, ISTART2 ), 1, Q( 1,
590 $ ISTART2+1 ), 1, C1, CONJG( S1 ) )
602.GE.
IF ( ISTART2 ISTOP ) THEN
613.LT.
IF ( ISTOP-ISTART2+1 NMIN ) THEN
617.LT.
IF ( ISTOP-ISTART+1 NMIN ) THEN
628 CALL CLAQZ2( ILSCHUR, ILQ, ILZ, N, ISTART2, ISTOP, NW, A, LDA,
629 $ B, LDB, Q, LDQ, Z, LDZ, N_UNDEFLATED, N_DEFLATED,
630 $ ALPHA, BETA, WORK, NW, WORK( NW**2+1 ), NW,
631 $ WORK( 2*NW**2+1 ), LWORK-2*NW**2, RWORK, REC,
634 IF ( N_DEFLATED > 0 ) THEN
635 ISTOP = ISTOP-N_DEFLATED
640.OR.
IF ( 100*N_DEFLATED > NIBBLE*( N_DEFLATED+N_UNDEFLATED )
641.LT.
$ ISTOP-ISTART2+1 NMIN ) THEN
649 NS = MIN( NSHIFTS, ISTOP-ISTART2 )
650 NS = MIN( NS, N_UNDEFLATED )
651 SHIFTPOS = ISTOP-N_DEFLATED-N_UNDEFLATED+1
653.EQ.
IF ( MOD( LD, 6 ) 0 ) THEN
657 IF( ( REAL( MAXIT )*SAFMIN )*ABS( A( ISTOP,
658.LT.
$ ISTOP-1 ) )ABS( A( ISTOP-1, ISTOP-1 ) ) ) THEN
659 ESHIFT = A( ISTOP, ISTOP-1 )/B( ISTOP-1, ISTOP-1 )
661 ESHIFT = ESHIFT+CONE/( SAFMIN*REAL( MAXIT ) )
663 ALPHA( SHIFTPOS ) = CONE
664 BETA( SHIFTPOS ) = ESHIFT
671 CALL CLAQZ3( ILSCHUR, ILQ, ILZ, N, ISTART2, ISTOP, NS, NBLOCK,
672 $ ALPHA( SHIFTPOS ), BETA( SHIFTPOS ), A, LDA, B,
673 $ LDB, Q, LDQ, Z, LDZ, WORK, NBLOCK, WORK( NBLOCK**
674 $ 2+1 ), NBLOCK, WORK( 2*NBLOCK**2+1 ),
675 $ LWORK-2*NBLOCK**2, SWEEP_INFO )
685 80 CALL CHGEQZ( WANTS, WANTQ, WANTZ, N, ILO, IHI, A, LDA, B, LDB,
686 $ ALPHA, BETA, Q, LDQ, Z, LDZ, WORK, LWORK, RWORK,
subroutine clartg(f, g, c, s, r)
CLARTG generates a plane rotation with real cosine and complex sine.
subroutine slabad(small, large)
SLABAD
integer function ilaenv(ispec, name, opts, n1, n2, n3, n4)
ILAENV
subroutine xerbla(srname, info)
XERBLA
logical function lsame(ca, cb)
LSAME
recursive subroutine claqz2(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)
CLAQZ2
subroutine claqz3(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)
CLAQZ3
subroutine chgeqz(job, compq, compz, n, ilo, ihi, h, ldh, t, ldt, alpha, beta, q, ldq, z, ldz, work, lwork, rwork, info)
CHGEQZ
recursive subroutine claqz0(wants, wantq, wantz, n, ilo, ihi, a, lda, b, ldb, alpha, beta, q, ldq, z, ldz, work, lwork, rwork, rec, info)
CLAQZ0
subroutine crot(n, cx, incx, cy, incy, c, s)
CROT applies a plane rotation with real cosine and complex sine to a pair of complex vectors.
subroutine claset(uplo, m, n, alpha, beta, a, lda)
CLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
real function slamch(cmach)
SLAMCH