248 SUBROUTINE claqr4( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILOZ,
249 $ IHIZ, Z, LDZ, WORK, LWORK, INFO )
257 INTEGER IHI, IHIZ, ILO, ILOZ, INFO, LDH, LDZ, LWORK, N
261 COMPLEX H( ldh, * ), W( * ), WORK( * ), Z( ldz, * )
273 parameter( ntiny = 11 )
279 parameter( kexnw = 5 )
285 parameter( kexsh = 6 )
290 parameter( wilk1 = 0.75e0 )
292 parameter( zero = ( 0.0e0, 0.0e0 ),
293 $ one = ( 1.0e0, 0.0e0 ) )
295 parameter( two = 2.0e0 )
298 COMPLEX AA, BB, CC, CDUM, DD, DET, RTDISC, SWAP, TR2
300 INTEGER I, INF, IT, ITMAX, K, KACC22, KBOT, KDU, KS,
301 $ kt, ktop, ku, kv, kwh, kwtop, kwv, ld, ls,
302 $ lwkopt, ndec, ndfl, nh, nho, nibble, nmin, ns,
303 $ nsmax, nsr, nve, nw, nwmax, nwr, nwupbd
318 INTRINSIC abs, aimag, cmplx, int, max, min, mod,
REAL,
325 cabs1( cdum ) = abs(
REAL( CDUM ) ) + abs( AIMAG( cdum ) )
337 IF( n.LE.ntiny )
THEN 343 $
CALL clahqr( wantt, wantz, n, ilo, ihi, h, ldh, w, iloz,
344 $ ihiz, z, ldz, info )
373 nwr = ilaenv( 13,
'CLAQR4', jbcmpz, n, ilo, ihi, lwork )
375 nwr = min( ihi-ilo+1, ( n-1 ) / 3, nwr )
382 nsr = ilaenv( 15,
'CLAQR4', jbcmpz, n, ilo, ihi, lwork )
383 nsr = min( nsr, ( n+6 ) / 9, ihi-ilo )
384 nsr = max( 2, nsr-mod( nsr, 2 ) )
390 CALL claqr2( wantt, wantz, n, ilo, ihi, nwr+1, h, ldh, iloz,
391 $ ihiz, z, ldz, ls, ld, w, h, ldh, n, h, ldh, n, h,
396 lwkopt = max( 3*nsr / 2, int( work( 1 ) ) )
400 IF( lwork.EQ.-1 )
THEN 401 work( 1 ) = cmplx( lwkopt, 0 )
407 nmin = ilaenv( 12,
'CLAQR4', jbcmpz, n, ilo, ihi, lwork )
408 nmin = max( ntiny, nmin )
412 nibble = ilaenv( 14,
'CLAQR4', jbcmpz, n, ilo, ihi, lwork )
413 nibble = max( 0, nibble )
418 kacc22 = ilaenv( 16,
'CLAQR4', jbcmpz, n, ilo, ihi, lwork )
419 kacc22 = max( 0, kacc22 )
420 kacc22 = min( 2, kacc22 )
425 nwmax = min( ( n-1 ) / 3, lwork / 2 )
431 nsmax = min( ( n+6 ) / 9, 2*lwork / 3 )
432 nsmax = nsmax - mod( nsmax, 2 )
440 itmax = max( 30, 2*kexsh )*max( 10, ( ihi-ilo+1 ) )
457 DO 10 k = kbot, ilo + 1, -1
458 IF( h( k, k-1 ).EQ.zero )
482 nwupbd = min( nh, nwmax )
483 IF( ndfl.LT.kexnw )
THEN 484 nw = min( nwupbd, nwr )
486 nw = min( nwupbd, 2*nw )
488 IF( nw.LT.nwmax )
THEN 489 IF( nw.GE.nh-1 )
THEN 492 kwtop = kbot - nw + 1
493 IF( cabs1( h( kwtop, kwtop-1 ) ).GT.
494 $ cabs1( h( kwtop-1, kwtop-2 ) ) )nw = nw + 1
497 IF( ndfl.LT.kexnw )
THEN 499 ELSE IF( ndec.GE.0 .OR. nw.GE.nwupbd )
THEN 519 nho = ( n-nw-1 ) - kt + 1
521 nve = ( n-nw ) - kwv + 1
525 CALL claqr2( wantt, wantz, n, ktop, kbot, nw, h, ldh, iloz,
526 $ ihiz, z, ldz, ls, ld, w, h( kv, 1 ), ldh, nho,
527 $ h( kv, kt ), ldh, nve, h( kwv, 1 ), ldh, work,
544 IF( ( ld.EQ.0 ) .OR. ( ( 100*ld.LE.nw*nibble ) .AND. ( kbot-
545 $ ktop+1.GT.min( nmin, nwmax ) ) ) )
THEN 551 ns = min( nsmax, nsr, max( 2, kbot-ktop ) )
552 ns = ns - mod( ns, 2 )
561 IF( mod( ndfl, kexsh ).EQ.0 )
THEN 563 DO 30 i = kbot, ks + 1, -2
564 w( i ) = h( i, i ) + wilk1*cabs1( h( i, i-1 ) )
575 IF( kbot-ks+1.LE.ns / 2 )
THEN 578 CALL clacpy(
'A', ns, ns, h( ks, ks ), ldh,
580 CALL clahqr( .false., .false., ns, 1, ns,
581 $ h( kt, 1 ), ldh, w( ks ), 1, 1, zdum,
592 IF( ks.GE.kbot )
THEN 593 s = cabs1( h( kbot-1, kbot-1 ) ) +
594 $ cabs1( h( kbot, kbot-1 ) ) +
595 $ cabs1( h( kbot-1, kbot ) ) +
596 $ cabs1( h( kbot, kbot ) )
597 aa = h( kbot-1, kbot-1 ) / s
598 cc = h( kbot, kbot-1 ) / s
599 bb = h( kbot-1, kbot ) / s
600 dd = h( kbot, kbot ) / s
601 tr2 = ( aa+dd ) / two
602 det = ( aa-tr2 )*( dd-tr2 ) - bb*cc
603 rtdisc = sqrt( -det )
604 w( kbot-1 ) = ( tr2+rtdisc )*s
605 w( kbot ) = ( tr2-rtdisc )*s
611 IF( kbot-ks+1.GT.ns )
THEN 616 DO 50 k = kbot, ks + 1, -1
621 IF( cabs1( w( i ) ).LT.cabs1( w( i+1 ) ) )
637 IF( kbot-ks+1.EQ.2 )
THEN 638 IF( cabs1( w( kbot )-h( kbot, kbot ) ).LT.
639 $ cabs1( w( kbot-1 )-h( kbot, kbot ) ) )
THEN 640 w( kbot-1 ) = w( kbot )
642 w( kbot ) = w( kbot-1 )
651 ns = min( ns, kbot-ks+1 )
652 ns = ns - mod( ns, 2 )
669 nho = ( n-kdu+1-4 ) - ( kdu+1 ) + 1
671 nve = n - kdu - kwv + 1
675 CALL claqr5( wantt, wantz, kacc22, n, ktop, kbot, ns,
676 $ w( ks ), h, ldh, iloz, ihiz, z, ldz, work,
677 $ 3, h( ku, 1 ), ldh, nve, h( kwv, 1 ), ldh,
678 $ nho, h( ku, kwh ), ldh )
701 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, using the double-shift/single-shift QR algorithm.
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.
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 clacpy(UPLO, M, N, A, LDA, B, LDB)
CLACPY copies all or part of one two-dimensional array to another.