LAPACK 3.12.1
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches

◆ claqr4()

subroutine claqr4 ( logical wantt,
logical wantz,
integer n,
integer ilo,
integer ihi,
complex, dimension( ldh, * ) h,
integer ldh,
complex, dimension( * ) w,
integer iloz,
integer ihiz,
complex, dimension( ldz, * ) z,
integer ldz,
complex, dimension( * ) work,
integer lwork,
integer info )

CLAQR4 computes the eigenvalues of a Hessenberg matrix, and optionally the matrices from the Schur decomposition.

Download CLAQR4 + dependencies [TGZ] [ZIP] [TXT]

Purpose:
!>
!>    CLAQR4 implements one level of recursion for CLAQR0.
!>    It is a complete implementation of the small bulge multi-shift
!>    QR algorithm.  It may be called by CLAQR0 and, for large enough
!>    deflation window size, it may be called by CLAQR3.  This
!>    subroutine is identical to CLAQR0 except that it calls CLAQR2
!>    instead of CLAQR3.
!>
!>    CLAQR4 computes the eigenvalues of a Hessenberg matrix H
!>    and, optionally, the matrices T and Z from the Schur decomposition
!>    H = Z T Z**H, where T is an upper triangular matrix (the
!>    Schur form), and Z is the unitary matrix of Schur vectors.
!>
!>    Optionally Z may be postmultiplied into an input unitary
!>    matrix Q so that this routine can give the Schur factorization
!>    of a matrix A which has been reduced to the Hessenberg form H
!>    by the unitary matrix Q:  A = Q*H*Q**H = (QZ)*H*(QZ)**H.
!> 
Parameters
[in]WANTT
!>          WANTT is LOGICAL
!>          = .TRUE. : the full Schur form T is required;
!>          = .FALSE.: only eigenvalues are required.
!> 
[in]WANTZ
!>          WANTZ is LOGICAL
!>          = .TRUE. : the matrix of Schur vectors Z is required;
!>          = .FALSE.: Schur vectors are not required.
!> 
[in]N
!>          N is INTEGER
!>           The order of the matrix H.  N >= 0.
!> 
[in]ILO
!>          ILO is INTEGER
!> 
[in]IHI
!>          IHI is INTEGER
!>           It is assumed that H is already upper triangular in rows
!>           and columns 1:ILO-1 and IHI+1:N and, if ILO > 1,
!>           H(ILO,ILO-1) is zero. ILO and IHI are normally set by a
!>           previous call to CGEBAL, and then passed to CGEHRD when the
!>           matrix output by CGEBAL is reduced to Hessenberg form.
!>           Otherwise, ILO and IHI should be set to 1 and N,
!>           respectively.  If N > 0, then 1 <= ILO <= IHI <= N.
!>           If N = 0, then ILO = 1 and IHI = 0.
!> 
[in,out]H
!>          H is COMPLEX array, dimension (LDH,N)
!>           On entry, the upper Hessenberg matrix H.
!>           On exit, if INFO = 0 and WANTT is .TRUE., then H
!>           contains the upper triangular matrix T from the Schur
!>           decomposition (the Schur form). If INFO = 0 and WANT is
!>           .FALSE., then the contents of H are unspecified on exit.
!>           (The output value of H when INFO > 0 is given under the
!>           description of INFO below.)
!>
!>           This subroutine may explicitly set H(i,j) = 0 for i > j and
!>           j = 1, 2, ... ILO-1 or j = IHI+1, IHI+2, ... N.
!> 
[in]LDH
!>          LDH is INTEGER
!>           The leading dimension of the array H. LDH >= max(1,N).
!> 
[out]W
!>          W is COMPLEX array, dimension (N)
!>           The computed eigenvalues of H(ILO:IHI,ILO:IHI) are stored
!>           in W(ILO:IHI). If WANTT is .TRUE., then the eigenvalues are
!>           stored in the same order as on the diagonal of the Schur
!>           form returned in H, with W(i) = H(i,i).
!> 
[in]ILOZ
!>          ILOZ is INTEGER
!> 
[in]IHIZ
!>          IHIZ is INTEGER
!>           Specify the rows of Z to which transformations must be
!>           applied if WANTZ is .TRUE..
!>           1 <= ILOZ <= ILO; IHI <= IHIZ <= N.
!> 
[in,out]Z
!>          Z is COMPLEX array, dimension (LDZ,IHI)
!>           If WANTZ is .FALSE., then Z is not referenced.
!>           If WANTZ is .TRUE., then Z(ILO:IHI,ILOZ:IHIZ) is
!>           replaced by Z(ILO:IHI,ILOZ:IHIZ)*U where U is the
!>           orthogonal Schur factor of H(ILO:IHI,ILO:IHI).
!>           (The output value of Z when INFO > 0 is given under
!>           the description of INFO below.)
!> 
[in]LDZ
!>          LDZ is INTEGER
!>           The leading dimension of the array Z.  if WANTZ is .TRUE.
!>           then LDZ >= MAX(1,IHIZ).  Otherwise, LDZ >= 1.
!> 
[out]WORK
!>          WORK is COMPLEX array, dimension LWORK
!>           On exit, if LWORK = -1, WORK(1) returns an estimate of
!>           the optimal value for LWORK.
!> 
[in]LWORK
!>          LWORK is INTEGER
!>           The dimension of the array WORK.  LWORK >= max(1,N)
!>           is sufficient, but LWORK typically as large as 6*N may
!>           be required for optimal performance.  A workspace query
!>           to determine the optimal workspace size is recommended.
!>
!>           If LWORK = -1, then CLAQR4 does a workspace query.
!>           In this case, CLAQR4 checks the input parameters and
!>           estimates the optimal workspace size for the given
!>           values of N, ILO and IHI.  The estimate is returned
!>           in WORK(1).  No error message related to LWORK is
!>           issued by XERBLA.  Neither H nor Z are accessed.
!> 
[out]INFO
!>          INFO is INTEGER
!>             = 0:  successful exit
!>             > 0:  if INFO = i, CLAQR4 failed to compute all of
!>                the eigenvalues.  Elements 1:ilo-1 and i+1:n of WR
!>                and WI contain those eigenvalues which have been
!>                successfully computed.  (Failures are rare.)
!>
!>                If INFO > 0 and WANT is .FALSE., then on exit,
!>                the remaining unconverged eigenvalues are the eigen-
!>                values of the upper Hessenberg matrix rows and
!>                columns ILO through INFO of the final, output
!>                value of H.
!>
!>                If INFO > 0 and WANTT is .TRUE., then on exit
!>
!>           (*)  (initial value of H)*U  = U*(final value of H)
!>
!>                where U is a unitary matrix.  The final
!>                value of  H is upper Hessenberg and triangular in
!>                rows and columns INFO+1 through IHI.
!>
!>                If INFO > 0 and WANTZ is .TRUE., then on exit
!>
!>                  (final value of Z(ILO:IHI,ILOZ:IHIZ)
!>                   =  (initial value of Z(ILO:IHI,ILOZ:IHIZ)*U
!>
!>                where U is the unitary matrix in (*) (regard-
!>                less of the value of WANTT.)
!>
!>                If INFO > 0 and WANTZ is .FALSE., then Z is not
!>                accessed.
!> 
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
Contributors:
Karen Braman and Ralph Byers, Department of Mathematics, University of Kansas, USA
References:
  K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
  Algorithm Part I: Maintaining Well Focused Shifts, and Level 3
  Performance, SIAM Journal of Matrix Analysis, volume 23, pages
  929--947, 2002.

K. Braman, R. Byers and R. Mathias, The Multi-Shift QR Algorithm Part II: Aggressive Early Deflation, SIAM Journal of Matrix Analysis, volume 23, pages 948–973, 2002.

Definition at line 244 of file claqr4.f.

246*
247* -- LAPACK auxiliary routine --
248* -- LAPACK is a software package provided by Univ. of Tennessee, --
249* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
250*
251* .. Scalar Arguments ..
252 INTEGER IHI, IHIZ, ILO, ILOZ, INFO, LDH, LDZ, LWORK, N
253 LOGICAL WANTT, WANTZ
254* ..
255* .. Array Arguments ..
256 COMPLEX H( LDH, * ), W( * ), WORK( * ), Z( LDZ, * )
257* ..
258*
259*
260* ================================================================
261*
262* .. Parameters ..
263*
264* ==== Matrices of order NTINY or smaller must be processed by
265* . CLAHQR because of insufficient subdiagonal scratch space.
266* . (This is a hard limit.) ====
267 INTEGER NTINY
268 parameter( ntiny = 15 )
269*
270* ==== Exceptional deflation windows: try to cure rare
271* . slow convergence by varying the size of the
272* . deflation window after KEXNW iterations. ====
273 INTEGER KEXNW
274 parameter( kexnw = 5 )
275*
276* ==== Exceptional shifts: try to cure rare slow convergence
277* . with ad-hoc exceptional shifts every KEXSH iterations.
278* . ====
279 INTEGER KEXSH
280 parameter( kexsh = 6 )
281*
282* ==== The constant WILK1 is used to form the exceptional
283* . shifts. ====
284 REAL WILK1
285 parameter( wilk1 = 0.75e0 )
286 COMPLEX ZERO, ONE
287 parameter( zero = ( 0.0e0, 0.0e0 ),
288 $ one = ( 1.0e0, 0.0e0 ) )
289 REAL TWO
290 parameter( two = 2.0e0 )
291* ..
292* .. Local Scalars ..
293 COMPLEX AA, BB, CC, CDUM, DD, DET, RTDISC, SWAP, TR2
294 REAL S
295 INTEGER I, INF, IT, ITMAX, K, KACC22, KBOT, KDU, KS,
296 $ KT, KTOP, KU, KV, KWH, KWTOP, KWV, LD, LS,
297 $ LWKOPT, NDEC, NDFL, NH, NHO, NIBBLE, NMIN, NS,
298 $ NSMAX, NSR, NVE, NW, NWMAX, NWR, NWUPBD
299 LOGICAL SORTED
300 CHARACTER JBCMPZ*2
301* ..
302* .. External Functions ..
303 INTEGER ILAENV
304 EXTERNAL ilaenv
305* ..
306* .. Local Arrays ..
307 COMPLEX ZDUM( 1, 1 )
308* ..
309* .. External Subroutines ..
310 EXTERNAL clacpy, clahqr, claqr2, claqr5
311* ..
312* .. Intrinsic Functions ..
313 INTRINSIC abs, aimag, cmplx, int, max, min, mod, real,
314 $ sqrt
315* ..
316* .. Statement Functions ..
317 REAL CABS1
318* ..
319* .. Statement Function definitions ..
320 cabs1( cdum ) = abs( real( cdum ) ) + abs( aimag( cdum ) )
321* ..
322* .. Executable Statements ..
323 info = 0
324*
325* ==== Quick return for N = 0: nothing to do. ====
326*
327 IF( n.EQ.0 ) THEN
328 work( 1 ) = one
329 RETURN
330 END IF
331*
332 IF( n.LE.ntiny ) THEN
333*
334* ==== Tiny matrices must use CLAHQR. ====
335*
336 lwkopt = 1
337 IF( lwork.NE.-1 )
338 $ CALL clahqr( wantt, wantz, n, ilo, ihi, h, ldh, w, iloz,
339 $ ihiz, z, ldz, info )
340 ELSE
341*
342* ==== Use small bulge multi-shift QR with aggressive early
343* . deflation on larger-than-tiny matrices. ====
344*
345* ==== Hope for the best. ====
346*
347 info = 0
348*
349* ==== Set up job flags for ILAENV. ====
350*
351 IF( wantt ) THEN
352 jbcmpz( 1: 1 ) = 'S'
353 ELSE
354 jbcmpz( 1: 1 ) = 'E'
355 END IF
356 IF( wantz ) THEN
357 jbcmpz( 2: 2 ) = 'V'
358 ELSE
359 jbcmpz( 2: 2 ) = 'N'
360 END IF
361*
362* ==== NWR = recommended deflation window size. At this
363* . point, N .GT. NTINY = 15, so there is enough
364* . subdiagonal workspace for NWR.GE.2 as required.
365* . (In fact, there is enough subdiagonal space for
366* . NWR.GE.4.) ====
367*
368 nwr = ilaenv( 13, 'CLAQR4', jbcmpz, n, ilo, ihi, lwork )
369 nwr = max( 2, nwr )
370 nwr = min( ihi-ilo+1, ( n-1 ) / 3, nwr )
371*
372* ==== NSR = recommended number of simultaneous shifts.
373* . At this point N .GT. NTINY = 15, so there is at
374* . enough subdiagonal workspace for NSR to be even
375* . and greater than or equal to two as required. ====
376*
377 nsr = ilaenv( 15, 'CLAQR4', jbcmpz, n, ilo, ihi, lwork )
378 nsr = min( nsr, ( n-3 ) / 6, ihi-ilo )
379 nsr = max( 2, nsr-mod( nsr, 2 ) )
380*
381* ==== Estimate optimal workspace ====
382*
383* ==== Workspace query call to CLAQR2 ====
384*
385 CALL claqr2( wantt, wantz, n, ilo, ihi, nwr+1, h, ldh, iloz,
386 $ ihiz, z, ldz, ls, ld, w, h, ldh, n, h, ldh, n, h,
387 $ ldh, work, -1 )
388*
389* ==== Optimal workspace = MAX(CLAQR5, CLAQR2) ====
390*
391 lwkopt = max( 3*nsr / 2, int( work( 1 ) ) )
392*
393* ==== Quick return in case of workspace query. ====
394*
395 IF( lwork.EQ.-1 ) THEN
396 work( 1 ) = cmplx( lwkopt, 0 )
397 RETURN
398 END IF
399*
400* ==== CLAHQR/CLAQR0 crossover point ====
401*
402 nmin = ilaenv( 12, 'CLAQR4', jbcmpz, n, ilo, ihi, lwork )
403 nmin = max( ntiny, nmin )
404*
405* ==== Nibble crossover point ====
406*
407 nibble = ilaenv( 14, 'CLAQR4', jbcmpz, n, ilo, ihi, lwork )
408 nibble = max( 0, nibble )
409*
410* ==== Accumulate reflections during ttswp? Use block
411* . 2-by-2 structure during matrix-matrix multiply? ====
412*
413 kacc22 = ilaenv( 16, 'CLAQR4', jbcmpz, n, ilo, ihi, lwork )
414 kacc22 = max( 0, kacc22 )
415 kacc22 = min( 2, kacc22 )
416*
417* ==== NWMAX = the largest possible deflation window for
418* . which there is sufficient workspace. ====
419*
420 nwmax = min( ( n-1 ) / 3, lwork / 2 )
421 nw = nwmax
422*
423* ==== NSMAX = the Largest number of simultaneous shifts
424* . for which there is sufficient workspace. ====
425*
426 nsmax = min( ( n-3 ) / 6, 2*lwork / 3 )
427 nsmax = nsmax - mod( nsmax, 2 )
428*
429* ==== NDFL: an iteration count restarted at deflation. ====
430*
431 ndfl = 1
432*
433* ==== ITMAX = iteration limit ====
434*
435 itmax = max( 30, 2*kexsh )*max( 10, ( ihi-ilo+1 ) )
436*
437* ==== Last row and column in the active block ====
438*
439 kbot = ihi
440*
441* ==== Main Loop ====
442*
443 DO 70 it = 1, itmax
444*
445* ==== Done when KBOT falls below ILO ====
446*
447 IF( kbot.LT.ilo )
448 $ GO TO 80
449*
450* ==== Locate active block ====
451*
452 DO 10 k = kbot, ilo + 1, -1
453 IF( h( k, k-1 ).EQ.zero )
454 $ GO TO 20
455 10 CONTINUE
456 k = ilo
457 20 CONTINUE
458 ktop = k
459*
460* ==== Select deflation window size:
461* . Typical Case:
462* . If possible and advisable, nibble the entire
463* . active block. If not, use size MIN(NWR,NWMAX)
464* . or MIN(NWR+1,NWMAX) depending upon which has
465* . the smaller corresponding subdiagonal entry
466* . (a heuristic).
467* .
468* . Exceptional Case:
469* . If there have been no deflations in KEXNW or
470* . more iterations, then vary the deflation window
471* . size. At first, because, larger windows are,
472* . in general, more powerful than smaller ones,
473* . rapidly increase the window to the maximum possible.
474* . Then, gradually reduce the window size. ====
475*
476 nh = kbot - ktop + 1
477 nwupbd = min( nh, nwmax )
478 IF( ndfl.LT.kexnw ) THEN
479 nw = min( nwupbd, nwr )
480 ELSE
481 nw = min( nwupbd, 2*nw )
482 END IF
483 IF( nw.LT.nwmax ) THEN
484 IF( nw.GE.nh-1 ) THEN
485 nw = nh
486 ELSE
487 kwtop = kbot - nw + 1
488 IF( cabs1( h( kwtop, kwtop-1 ) ).GT.
489 $ cabs1( h( kwtop-1, kwtop-2 ) ) )nw = nw + 1
490 END IF
491 END IF
492 IF( ndfl.LT.kexnw ) THEN
493 ndec = -1
494 ELSE IF( ndec.GE.0 .OR. nw.GE.nwupbd ) THEN
495 ndec = ndec + 1
496 IF( nw-ndec.LT.2 )
497 $ ndec = 0
498 nw = nw - ndec
499 END IF
500*
501* ==== Aggressive early deflation:
502* . split workspace under the subdiagonal into
503* . - an nw-by-nw work array V in the lower
504* . left-hand-corner,
505* . - an NW-by-at-least-NW-but-more-is-better
506* . (NW-by-NHO) horizontal work array along
507* . the bottom edge,
508* . - an at-least-NW-but-more-is-better (NHV-by-NW)
509* . vertical work array along the left-hand-edge.
510* . ====
511*
512 kv = n - nw + 1
513 kt = nw + 1
514 nho = ( n-nw-1 ) - kt + 1
515 kwv = nw + 2
516 nve = ( n-nw ) - kwv + 1
517*
518* ==== Aggressive early deflation ====
519*
520 CALL claqr2( wantt, wantz, n, ktop, kbot, nw, h, ldh,
521 $ iloz,
522 $ ihiz, z, ldz, ls, ld, w, h( kv, 1 ), ldh, nho,
523 $ h( kv, kt ), ldh, nve, h( kwv, 1 ), ldh, work,
524 $ lwork )
525*
526* ==== Adjust KBOT accounting for new deflations. ====
527*
528 kbot = kbot - ld
529*
530* ==== KS points to the shifts. ====
531*
532 ks = kbot - ls + 1
533*
534* ==== Skip an expensive QR sweep if there is a (partly
535* . heuristic) reason to expect that many eigenvalues
536* . will deflate without it. Here, the QR sweep is
537* . skipped if many eigenvalues have just been deflated
538* . or if the remaining active block is small.
539*
540 IF( ( ld.EQ.0 ) .OR. ( ( 100*ld.LE.nw*nibble ) .AND. ( kbot-
541 $ ktop+1.GT.min( nmin, nwmax ) ) ) ) THEN
542*
543* ==== NS = nominal number of simultaneous shifts.
544* . This may be lowered (slightly) if CLAQR2
545* . did not provide that many shifts. ====
546*
547 ns = min( nsmax, nsr, max( 2, kbot-ktop ) )
548 ns = ns - mod( ns, 2 )
549*
550* ==== If there have been no deflations
551* . in a multiple of KEXSH iterations,
552* . then try exceptional shifts.
553* . Otherwise use shifts provided by
554* . CLAQR2 above or from the eigenvalues
555* . of a trailing principal submatrix. ====
556*
557 IF( mod( ndfl, kexsh ).EQ.0 ) THEN
558 ks = kbot - ns + 1
559 DO 30 i = kbot, ks + 1, -2
560 w( i ) = h( i, i ) + wilk1*cabs1( h( i, i-1 ) )
561 w( i-1 ) = w( i )
562 30 CONTINUE
563 ELSE
564*
565* ==== Got NS/2 or fewer shifts? Use CLAHQR
566* . on a trailing principal submatrix to
567* . get more. (Since NS.LE.NSMAX.LE.(N-3)/6,
568* . there is enough space below the subdiagonal
569* . to fit an NS-by-NS scratch array.) ====
570*
571 IF( kbot-ks+1.LE.ns / 2 ) THEN
572 ks = kbot - ns + 1
573 kt = n - ns + 1
574 CALL clacpy( 'A', ns, ns, h( ks, ks ), ldh,
575 $ h( kt, 1 ), ldh )
576 CALL clahqr( .false., .false., ns, 1, ns,
577 $ h( kt, 1 ), ldh, w( ks ), 1, 1, zdum,
578 $ 1, inf )
579 ks = ks + inf
580*
581* ==== In case of a rare QR failure use
582* . eigenvalues of the trailing 2-by-2
583* . principal submatrix. Scale to avoid
584* . overflows, underflows and subnormals.
585* . (The scale factor S can not be zero,
586* . because H(KBOT,KBOT-1) is nonzero.) ====
587*
588 IF( ks.GE.kbot ) THEN
589 s = cabs1( h( kbot-1, kbot-1 ) ) +
590 $ cabs1( h( kbot, kbot-1 ) ) +
591 $ cabs1( h( kbot-1, kbot ) ) +
592 $ cabs1( h( kbot, kbot ) )
593 aa = h( kbot-1, kbot-1 ) / s
594 cc = h( kbot, kbot-1 ) / s
595 bb = h( kbot-1, kbot ) / s
596 dd = h( kbot, kbot ) / s
597 tr2 = ( aa+dd ) / two
598 det = ( aa-tr2 )*( dd-tr2 ) - bb*cc
599 rtdisc = sqrt( -det )
600 w( kbot-1 ) = ( tr2+rtdisc )*s
601 w( kbot ) = ( tr2-rtdisc )*s
602*
603 ks = kbot - 1
604 END IF
605 END IF
606*
607 IF( kbot-ks+1.GT.ns ) THEN
608*
609* ==== Sort the shifts (Helps a little) ====
610*
611 sorted = .false.
612 DO 50 k = kbot, ks + 1, -1
613 IF( sorted )
614 $ GO TO 60
615 sorted = .true.
616 DO 40 i = ks, k - 1
617 IF( cabs1( w( i ) ).LT.cabs1( w( i+1 ) ) )
618 $ THEN
619 sorted = .false.
620 swap = w( i )
621 w( i ) = w( i+1 )
622 w( i+1 ) = swap
623 END IF
624 40 CONTINUE
625 50 CONTINUE
626 60 CONTINUE
627 END IF
628 END IF
629*
630* ==== If there are only two shifts, then use
631* . only one. ====
632*
633 IF( kbot-ks+1.EQ.2 ) THEN
634 IF( cabs1( w( kbot )-h( kbot, kbot ) ).LT.
635 $ cabs1( w( kbot-1 )-h( kbot, kbot ) ) ) THEN
636 w( kbot-1 ) = w( kbot )
637 ELSE
638 w( kbot ) = w( kbot-1 )
639 END IF
640 END IF
641*
642* ==== Use up to NS of the the smallest magnitude
643* . shifts. If there aren't NS shifts available,
644* . then use them all, possibly dropping one to
645* . make the number of shifts even. ====
646*
647 ns = min( ns, kbot-ks+1 )
648 ns = ns - mod( ns, 2 )
649 ks = kbot - ns + 1
650*
651* ==== Small-bulge multi-shift QR sweep:
652* . split workspace under the subdiagonal into
653* . - a KDU-by-KDU work array U in the lower
654* . left-hand-corner,
655* . - a KDU-by-at-least-KDU-but-more-is-better
656* . (KDU-by-NHo) horizontal work array WH along
657* . the bottom edge,
658* . - and an at-least-KDU-but-more-is-better-by-KDU
659* . (NVE-by-KDU) vertical work WV arrow along
660* . the left-hand-edge. ====
661*
662 kdu = 2*ns
663 ku = n - kdu + 1
664 kwh = kdu + 1
665 nho = ( n-kdu+1-4 ) - ( kdu+1 ) + 1
666 kwv = kdu + 4
667 nve = n - kdu - kwv + 1
668*
669* ==== Small-bulge multi-shift QR sweep ====
670*
671 CALL claqr5( wantt, wantz, kacc22, n, ktop, kbot, ns,
672 $ w( ks ), h, ldh, iloz, ihiz, z, ldz, work,
673 $ 3, h( ku, 1 ), ldh, nve, h( kwv, 1 ), ldh,
674 $ nho, h( ku, kwh ), ldh )
675 END IF
676*
677* ==== Note progress (or the lack of it). ====
678*
679 IF( ld.GT.0 ) THEN
680 ndfl = 1
681 ELSE
682 ndfl = ndfl + 1
683 END IF
684*
685* ==== End of main loop ====
686 70 CONTINUE
687*
688* ==== Iteration limit exceeded. Set INFO to show where
689* . the problem occurred and exit. ====
690*
691 info = kbot
692 80 CONTINUE
693 END IF
694*
695* ==== Return the optimal value of LWORK. ====
696*
697 work( 1 ) = cmplx( lwkopt, 0 )
698*
699* ==== End of CLAQR4 ====
700*
integer function ilaenv(ispec, name, opts, n1, n2, n3, n4)
ILAENV
Definition ilaenv.f:160
subroutine clacpy(uplo, m, n, a, lda, b, ldb)
CLACPY copies all or part of one two-dimensional array to another.
Definition clacpy.f:101
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,...
Definition clahqr.f:193
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...
Definition claqr2.f:268
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.
Definition claqr5.f:256
Here is the call graph for this function:
Here is the caller graph for this function: