246 SUBROUTINE claqr4( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILOZ,
247 $ IHIZ, Z, LDZ, WORK, LWORK, INFO )
254 INTEGER IHI, IHIZ, ILO, ILOZ, INFO, LDH, LDZ, LWORK, N
258 COMPLEX H( LDH, * ), W( * ), WORK( * ), Z( LDZ, * )
270 parameter( ntiny = 15 )
276 parameter( kexnw = 5 )
282 parameter( kexsh = 6 )
287 parameter( wilk1 = 0.75e0 )
289 parameter( zero = ( 0.0e0, 0.0e0 ),
290 $ one = ( 1.0e0, 0.0e0 ) )
292 parameter( two = 2.0e0 )
295 COMPLEX AA, BB, CC, CDUM, DD, DET, RTDISC, SWAP, TR2
297 INTEGER I, INF, IT, ITMAX, K, KACC22, KBOT, KDU, KS,
298 $ kt, ktop, ku, kv, kwh, kwtop, kwv, ld, ls,
299 $ lwkopt, ndec, ndfl, nh, nho, nibble, nmin, ns,
300 $ nsmax, nsr, nve, nw, nwmax, nwr, nwupbd
315 INTRINSIC abs, aimag,
cmplx, int,
max,
min, mod, real,
322 cabs1( cdum ) = abs( real( cdum ) ) + abs( aimag( cdum ) )
334 IF( n.LE.ntiny )
THEN
340 $
CALL clahqr( wantt, wantz, n, ilo, ihi, h, ldh, w, iloz,
341 $ ihiz, z, ldz, info )
370 nwr = ilaenv( 13,
'CLAQR4', jbcmpz, n, ilo, ihi, lwork )
372 nwr =
min( ihi-ilo+1, ( n-1 ) / 3, nwr )
379 nsr = ilaenv( 15,
'CLAQR4', jbcmpz, n, ilo, ihi, lwork )
380 nsr =
min( nsr, ( n-3 ) / 6, ihi-ilo )
381 nsr =
max( 2, nsr-mod( nsr, 2 ) )
387 CALL claqr2( wantt, wantz, n, ilo, ihi, nwr+1, h, ldh, iloz,
388 $ ihiz, z, ldz, ls, ld, w, h, ldh, n, h, ldh, n, h,
393 lwkopt =
max( 3*nsr / 2, int( work( 1 ) ) )
397 IF( lwork.EQ.-1 )
THEN
398 work( 1 ) =
cmplx( lwkopt, 0 )
404 nmin = ilaenv( 12, '
claqr4', JBCMPZ, N, ILO, IHI, LWORK )
405 NMIN = MAX( NTINY, NMIN )
409 NIBBLE = ILAENV( 14, 'claqr4', JBCMPZ, N, ILO, IHI, LWORK )
410 NIBBLE = MAX( 0, NIBBLE )
415 KACC22 = ILAENV( 16, 'claqr4', JBCMPZ, N, ILO, IHI, LWORK )
416 KACC22 = MAX( 0, KACC22 )
417 KACC22 = MIN( 2, KACC22 )
422 NWMAX = MIN( ( N-1 ) / 3, LWORK / 2 )
428 NSMAX = MIN( ( N-3 ) / 6, 2*LWORK / 3 )
429 NSMAX = NSMAX - MOD( NSMAX, 2 )
437 ITMAX = MAX( 30, 2*KEXSH )*MAX( 10, ( IHI-ILO+1 ) )
454 DO 10 K = KBOT, ILO + 1, -1
455.EQ.
IF( H( K, K-1 )ZERO )
479 NWUPBD = MIN( NH, NWMAX )
480.LT.
IF( NDFLKEXNW ) THEN
481 NW = MIN( NWUPBD, NWR )
483 NW = MIN( NWUPBD, 2*NW )
485.LT.
IF( NWNWMAX ) THEN
486.GE.
IF( NWNH-1 ) THEN
489 KWTOP = KBOT - NW + 1
490.GT.
IF( CABS1( H( KWTOP, KWTOP-1 ) )
491 $ CABS1( H( KWTOP-1, KWTOP-2 ) ) )NW = NW + 1
494.LT.
IF( NDFLKEXNW ) THEN
496.GE..OR..GE.
ELSE IF( NDEC0 NWNWUPBD ) THEN
516 NHO = ( N-NW-1 ) - KT + 1
518 NVE = ( N-NW ) - KWV + 1
522 CALL CLAQR2( WANTT, WANTZ, N, KTOP, KBOT, NW, H, LDH, ILOZ,
523 $ IHIZ, Z, LDZ, LS, LD, W, H( KV, 1 ), LDH, NHO,
524 $ H( KV, KT ), LDH, NVE, H( KWV, 1 ), LDH, WORK,
541.EQ..OR..LE..AND.
IF( ( LD0 ) ( ( 100*LDNW*NIBBLE ) ( KBOT-
542.GT.
$ KTOP+1MIN( NMIN, NWMAX ) ) ) ) THEN
548 NS = MIN( NSMAX, NSR, MAX( 2, KBOT-KTOP ) )
549 NS = NS - MOD( NS, 2 )
558.EQ.
IF( MOD( NDFL, KEXSH )0 ) THEN
560 DO 30 I = KBOT, KS + 1, -2
561 W( I ) = H( I, I ) + WILK1*CABS1( H( I, I-1 ) )
572.LE.
IF( KBOT-KS+1NS / 2 ) THEN
575 CALL CLACPY( 'a
', NS, NS, H( KS, KS ), LDH,
577 CALL CLAHQR( .false., .false., NS, 1, NS,
578 $ H( KT, 1 ), LDH, W( KS ), 1, 1, ZDUM,
589.GE.
IF( KSKBOT ) THEN
590 S = CABS1( H( KBOT-1, KBOT-1 ) ) +
591 $ CABS1( H( KBOT, KBOT-1 ) ) +
592 $ CABS1( H( KBOT-1, KBOT ) ) +
593 $ CABS1( H( KBOT, KBOT ) )
594 AA = H( KBOT-1, KBOT-1 ) / S
595 CC = H( KBOT, KBOT-1 ) / S
596 BB = H( KBOT-1, KBOT ) / S
597 DD = H( KBOT, KBOT ) / S
598 TR2 = ( AA+DD ) / TWO
599 DET = ( AA-TR2 )*( DD-TR2 ) - BB*CC
600 RTDISC = SQRT( -DET )
601 W( KBOT-1 ) = ( TR2+RTDISC )*S
602 W( KBOT ) = ( TR2-RTDISC )*S
608.GT.
IF( KBOT-KS+1NS ) THEN
613 DO 50 K = KBOT, KS + 1, -1
618.LT.
IF( CABS1( W( I ) )CABS1( W( I+1 ) ) )
634.EQ.
IF( KBOT-KS+12 ) THEN
635.LT.
IF( CABS1( W( KBOT )-H( KBOT, KBOT ) )
636 $ CABS1( W( KBOT-1 )-H( KBOT, KBOT ) ) ) THEN
637 W( KBOT-1 ) = W( KBOT )
639 W( KBOT ) = W( KBOT-1 )
648 NS = MIN( NS, KBOT-KS+1 )
649 NS = NS - MOD( NS, 2 )
666 NHO = ( N-KDU+1-4 ) - ( KDU+1 ) + 1
668 NVE = N - KDU - KWV + 1
672 CALL CLAQR5( WANTT, WANTZ, KACC22, N, KTOP, KBOT, NS,
673 $ W( KS ), H, LDH, ILOZ, IHIZ, Z, LDZ, WORK,
674 $ 3, H( KU, 1 ), LDH, NVE, H( KWV, 1 ), LDH,
675 $ NHO, H( KU, KWH ), LDH )
698 WORK( 1 ) = CMPLX( LWKOPT, 0 )
subroutine clahqr(wantt, wantz, n, ilo, ihi, h, ldh, w, iloz, ihiz, z, ldz, info)
CLAHQR computes the eigenvalues and Schur factorization of an upper Hessenberg matrix,...
subroutine claqr4(wantt, wantz, n, ilo, ihi, h, ldh, w, iloz, ihiz, z, ldz, work, lwork, info)
CLAQR4 computes the eigenvalues of a Hessenberg matrix, and optionally the matrices from the Schur de...
subroutine claqr2(wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz, ihiz, z, ldz, ns, nd, sh, v, ldv, nh, t, ldt, nv, wv, ldwv, work, lwork)
CLAQR2 performs the unitary similarity transformation of a Hessenberg matrix to detect and deflate fu...
subroutine claqr5(wantt, wantz, kacc22, n, ktop, kbot, nshfts, s, h, ldh, iloz, ihiz, z, ldz, v, ldv, u, ldu, nv, wv, ldwv, nh, wh, ldwh)
CLAQR5 performs a single small-bulge multi-shift QR sweep.