LAPACK 3.12.1
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches
zlaqr4.f
Go to the documentation of this file.
1*> \brief \b ZLAQR4 computes the eigenvalues of a Hessenberg matrix, and optionally the matrices from the Schur decomposition.
2*
3* =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6* http://www.netlib.org/lapack/explore-html/
7*
8*> Download ZLAQR4 + dependencies
9*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zlaqr4.f">
10*> [TGZ]</a>
11*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zlaqr4.f">
12*> [ZIP]</a>
13*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zlaqr4.f">
14*> [TXT]</a>
15*
16* Definition:
17* ===========
18*
19* SUBROUTINE ZLAQR4( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILOZ,
20* IHIZ, Z, LDZ, WORK, LWORK, INFO )
21*
22* .. Scalar Arguments ..
23* INTEGER IHI, IHIZ, ILO, ILOZ, INFO, LDH, LDZ, LWORK, N
24* LOGICAL WANTT, WANTZ
25* ..
26* .. Array Arguments ..
27* COMPLEX*16 H( LDH, * ), W( * ), WORK( * ), Z( LDZ, * )
28* ..
29*
30*
31*> \par Purpose:
32* =============
33*>
34*> \verbatim
35*>
36*> ZLAQR4 implements one level of recursion for ZLAQR0.
37*> It is a complete implementation of the small bulge multi-shift
38*> QR algorithm. It may be called by ZLAQR0 and, for large enough
39*> deflation window size, it may be called by ZLAQR3. This
40*> subroutine is identical to ZLAQR0 except that it calls ZLAQR2
41*> instead of ZLAQR3.
42*>
43*> ZLAQR4 computes the eigenvalues of a Hessenberg matrix H
44*> and, optionally, the matrices T and Z from the Schur decomposition
45*> H = Z T Z**H, where T is an upper triangular matrix (the
46*> Schur form), and Z is the unitary matrix of Schur vectors.
47*>
48*> Optionally Z may be postmultiplied into an input unitary
49*> matrix Q so that this routine can give the Schur factorization
50*> of a matrix A which has been reduced to the Hessenberg form H
51*> by the unitary matrix Q: A = Q*H*Q**H = (QZ)*H*(QZ)**H.
52*> \endverbatim
53*
54* Arguments:
55* ==========
56*
57*> \param[in] WANTT
58*> \verbatim
59*> WANTT is LOGICAL
60*> = .TRUE. : the full Schur form T is required;
61*> = .FALSE.: only eigenvalues are required.
62*> \endverbatim
63*>
64*> \param[in] WANTZ
65*> \verbatim
66*> WANTZ is LOGICAL
67*> = .TRUE. : the matrix of Schur vectors Z is required;
68*> = .FALSE.: Schur vectors are not required.
69*> \endverbatim
70*>
71*> \param[in] N
72*> \verbatim
73*> N is INTEGER
74*> The order of the matrix H. N >= 0.
75*> \endverbatim
76*>
77*> \param[in] ILO
78*> \verbatim
79*> ILO is INTEGER
80*> \endverbatim
81*>
82*> \param[in] IHI
83*> \verbatim
84*> IHI is INTEGER
85*> It is assumed that H is already upper triangular in rows
86*> and columns 1:ILO-1 and IHI+1:N and, if ILO > 1,
87*> H(ILO,ILO-1) is zero. ILO and IHI are normally set by a
88*> previous call to ZGEBAL, and then passed to ZGEHRD when the
89*> matrix output by ZGEBAL is reduced to Hessenberg form.
90*> Otherwise, ILO and IHI should be set to 1 and N,
91*> respectively. If N > 0, then 1 <= ILO <= IHI <= N.
92*> If N = 0, then ILO = 1 and IHI = 0.
93*> \endverbatim
94*>
95*> \param[in,out] H
96*> \verbatim
97*> H is COMPLEX*16 array, dimension (LDH,N)
98*> On entry, the upper Hessenberg matrix H.
99*> On exit, if INFO = 0 and WANTT is .TRUE., then H
100*> contains the upper triangular matrix T from the Schur
101*> decomposition (the Schur form). If INFO = 0 and WANT is
102*> .FALSE., then the contents of H are unspecified on exit.
103*> (The output value of H when INFO > 0 is given under the
104*> description of INFO below.)
105*>
106*> This subroutine may explicitly set H(i,j) = 0 for i > j and
107*> j = 1, 2, ... ILO-1 or j = IHI+1, IHI+2, ... N.
108*> \endverbatim
109*>
110*> \param[in] LDH
111*> \verbatim
112*> LDH is INTEGER
113*> The leading dimension of the array H. LDH >= max(1,N).
114*> \endverbatim
115*>
116*> \param[out] W
117*> \verbatim
118*> W is COMPLEX*16 array, dimension (N)
119*> The computed eigenvalues of H(ILO:IHI,ILO:IHI) are stored
120*> in W(ILO:IHI). If WANTT is .TRUE., then the eigenvalues are
121*> stored in the same order as on the diagonal of the Schur
122*> form returned in H, with W(i) = H(i,i).
123*> \endverbatim
124*>
125*> \param[in] ILOZ
126*> \verbatim
127*> ILOZ is INTEGER
128*> \endverbatim
129*>
130*> \param[in] IHIZ
131*> \verbatim
132*> IHIZ is INTEGER
133*> Specify the rows of Z to which transformations must be
134*> applied if WANTZ is .TRUE..
135*> 1 <= ILOZ <= ILO; IHI <= IHIZ <= N.
136*> \endverbatim
137*>
138*> \param[in,out] Z
139*> \verbatim
140*> Z is COMPLEX*16 array, dimension (LDZ,IHI)
141*> If WANTZ is .FALSE., then Z is not referenced.
142*> If WANTZ is .TRUE., then Z(ILO:IHI,ILOZ:IHIZ) is
143*> replaced by Z(ILO:IHI,ILOZ:IHIZ)*U where U is the
144*> orthogonal Schur factor of H(ILO:IHI,ILO:IHI).
145*> (The output value of Z when INFO > 0 is given under
146*> the description of INFO below.)
147*> \endverbatim
148*>
149*> \param[in] LDZ
150*> \verbatim
151*> LDZ is INTEGER
152*> The leading dimension of the array Z. if WANTZ is .TRUE.
153*> then LDZ >= MAX(1,IHIZ). Otherwise, LDZ >= 1.
154*> \endverbatim
155*>
156*> \param[out] WORK
157*> \verbatim
158*> WORK is COMPLEX*16 array, dimension LWORK
159*> On exit, if LWORK = -1, WORK(1) returns an estimate of
160*> the optimal value for LWORK.
161*> \endverbatim
162*>
163*> \param[in] LWORK
164*> \verbatim
165*> LWORK is INTEGER
166*> The dimension of the array WORK. LWORK >= max(1,N)
167*> is sufficient, but LWORK typically as large as 6*N may
168*> be required for optimal performance. A workspace query
169*> to determine the optimal workspace size is recommended.
170*>
171*> If LWORK = -1, then ZLAQR4 does a workspace query.
172*> In this case, ZLAQR4 checks the input parameters and
173*> estimates the optimal workspace size for the given
174*> values of N, ILO and IHI. The estimate is returned
175*> in WORK(1). No error message related to LWORK is
176*> issued by XERBLA. Neither H nor Z are accessed.
177*> \endverbatim
178*>
179*> \param[out] INFO
180*> \verbatim
181*> INFO is INTEGER
182*> = 0: successful exit
183*> > 0: if INFO = i, ZLAQR4 failed to compute all of
184*> the eigenvalues. Elements 1:ilo-1 and i+1:n of WR
185*> and WI contain those eigenvalues which have been
186*> successfully computed. (Failures are rare.)
187*>
188*> If INFO > 0 and WANT is .FALSE., then on exit,
189*> the remaining unconverged eigenvalues are the eigen-
190*> values of the upper Hessenberg matrix rows and
191*> columns ILO through INFO of the final, output
192*> value of H.
193*>
194*> If INFO > 0 and WANTT is .TRUE., then on exit
195*>
196*> (*) (initial value of H)*U = U*(final value of H)
197*>
198*> where U is a unitary matrix. The final
199*> value of H is upper Hessenberg and triangular in
200*> rows and columns INFO+1 through IHI.
201*>
202*> If INFO > 0 and WANTZ is .TRUE., then on exit
203*>
204*> (final value of Z(ILO:IHI,ILOZ:IHIZ)
205*> = (initial value of Z(ILO:IHI,ILOZ:IHIZ)*U
206*>
207*> where U is the unitary matrix in (*) (regard-
208*> less of the value of WANTT.)
209*>
210*> If INFO > 0 and WANTZ is .FALSE., then Z is not
211*> accessed.
212*> \endverbatim
213*
214* Authors:
215* ========
216*
217*> \author Univ. of Tennessee
218*> \author Univ. of California Berkeley
219*> \author Univ. of Colorado Denver
220*> \author NAG Ltd.
221*
222*> \ingroup laqr4
223*
224*> \par Contributors:
225* ==================
226*>
227*> Karen Braman and Ralph Byers, Department of Mathematics,
228*> University of Kansas, USA
229*
230*> \par References:
231* ================
232*>
233*> K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
234*> Algorithm Part I: Maintaining Well Focused Shifts, and Level 3
235*> Performance, SIAM Journal of Matrix Analysis, volume 23, pages
236*> 929--947, 2002.
237*> \n
238*> K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
239*> Algorithm Part II: Aggressive Early Deflation, SIAM Journal
240*> of Matrix Analysis, volume 23, pages 948--973, 2002.
241*>
242* =====================================================================
243 SUBROUTINE zlaqr4( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILOZ,
244 $ IHIZ, Z, LDZ, WORK, LWORK, INFO )
245*
246* -- LAPACK auxiliary routine --
247* -- LAPACK is a software package provided by Univ. of Tennessee, --
248* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
249*
250* .. Scalar Arguments ..
251 INTEGER IHI, IHIZ, ILO, ILOZ, INFO, LDH, LDZ, LWORK, N
252 LOGICAL WANTT, WANTZ
253* ..
254* .. Array Arguments ..
255 COMPLEX*16 H( LDH, * ), W( * ), WORK( * ), Z( LDZ, * )
256* ..
257*
258* ================================================================
259*
260* .. Parameters ..
261*
262* ==== Matrices of order NTINY or smaller must be processed by
263* . ZLAHQR because of insufficient subdiagonal scratch space.
264* . (This is a hard limit.) ====
265 INTEGER NTINY
266 parameter( ntiny = 15 )
267*
268* ==== Exceptional deflation windows: try to cure rare
269* . slow convergence by varying the size of the
270* . deflation window after KEXNW iterations. ====
271 INTEGER KEXNW
272 parameter( kexnw = 5 )
273*
274* ==== Exceptional shifts: try to cure rare slow convergence
275* . with ad-hoc exceptional shifts every KEXSH iterations.
276* . ====
277 INTEGER KEXSH
278 parameter( kexsh = 6 )
279*
280* ==== The constant WILK1 is used to form the exceptional
281* . shifts. ====
282 DOUBLE PRECISION WILK1
283 parameter( wilk1 = 0.75d0 )
284 COMPLEX*16 ZERO, ONE
285 parameter( zero = ( 0.0d0, 0.0d0 ),
286 $ one = ( 1.0d0, 0.0d0 ) )
287 DOUBLE PRECISION TWO
288 parameter( two = 2.0d0 )
289* ..
290* .. Local Scalars ..
291 COMPLEX*16 AA, BB, CC, CDUM, DD, DET, RTDISC, SWAP, TR2
292 DOUBLE PRECISION S
293 INTEGER I, INF, IT, ITMAX, K, KACC22, KBOT, KDU, KS,
294 $ kt, ktop, ku, kv, kwh, kwtop, kwv, ld, ls,
295 $ lwkopt, ndec, ndfl, nh, nho, nibble, nmin, ns,
296 $ nsmax, nsr, nve, nw, nwmax, nwr, nwupbd
297 LOGICAL SORTED
298 CHARACTER JBCMPZ*2
299* ..
300* .. External Functions ..
301 INTEGER ILAENV
302 EXTERNAL ilaenv
303* ..
304* .. Local Arrays ..
305 COMPLEX*16 ZDUM( 1, 1 )
306* ..
307* .. External Subroutines ..
308 EXTERNAL zlacpy, zlahqr, zlaqr2, zlaqr5
309* ..
310* .. Intrinsic Functions ..
311 INTRINSIC abs, dble, dcmplx, dimag, int, max, min, mod,
312 $ sqrt
313* ..
314* .. Statement Functions ..
315 DOUBLE PRECISION CABS1
316* ..
317* .. Statement Function definitions ..
318 cabs1( cdum ) = abs( dble( cdum ) ) + abs( dimag( cdum ) )
319* ..
320* .. Executable Statements ..
321 info = 0
322*
323* ==== Quick return for N = 0: nothing to do. ====
324*
325 IF( n.EQ.0 ) THEN
326 work( 1 ) = one
327 RETURN
328 END IF
329*
330 IF( n.LE.ntiny ) THEN
331*
332* ==== Tiny matrices must use ZLAHQR. ====
333*
334 lwkopt = 1
335 IF( lwork.NE.-1 )
336 $ CALL zlahqr( wantt, wantz, n, ilo, ihi, h, ldh, w, iloz,
337 $ ihiz, z, ldz, info )
338 ELSE
339*
340* ==== Use small bulge multi-shift QR with aggressive early
341* . deflation on larger-than-tiny matrices. ====
342*
343* ==== Hope for the best. ====
344*
345 info = 0
346*
347* ==== Set up job flags for ILAENV. ====
348*
349 IF( wantt ) THEN
350 jbcmpz( 1: 1 ) = 'S'
351 ELSE
352 jbcmpz( 1: 1 ) = 'E'
353 END IF
354 IF( wantz ) THEN
355 jbcmpz( 2: 2 ) = 'V'
356 ELSE
357 jbcmpz( 2: 2 ) = 'N'
358 END IF
359*
360* ==== NWR = recommended deflation window size. At this
361* . point, N .GT. NTINY = 15, so there is enough
362* . subdiagonal workspace for NWR.GE.2 as required.
363* . (In fact, there is enough subdiagonal space for
364* . NWR.GE.4.) ====
365*
366 nwr = ilaenv( 13, 'ZLAQR4', jbcmpz, n, ilo, ihi, lwork )
367 nwr = max( 2, nwr )
368 nwr = min( ihi-ilo+1, ( n-1 ) / 3, nwr )
369*
370* ==== NSR = recommended number of simultaneous shifts.
371* . At this point N .GT. NTINY = 15, so there is at
372* . enough subdiagonal workspace for NSR to be even
373* . and greater than or equal to two as required. ====
374*
375 nsr = ilaenv( 15, 'ZLAQR4', jbcmpz, n, ilo, ihi, lwork )
376 nsr = min( nsr, ( n-3 ) / 6, ihi-ilo )
377 nsr = max( 2, nsr-mod( nsr, 2 ) )
378*
379* ==== Estimate optimal workspace ====
380*
381* ==== Workspace query call to ZLAQR2 ====
382*
383 CALL zlaqr2( wantt, wantz, n, ilo, ihi, nwr+1, h, ldh, iloz,
384 $ ihiz, z, ldz, ls, ld, w, h, ldh, n, h, ldh, n, h,
385 $ ldh, work, -1 )
386*
387* ==== Optimal workspace = MAX(ZLAQR5, ZLAQR2) ====
388*
389 lwkopt = max( 3*nsr / 2, int( work( 1 ) ) )
390*
391* ==== Quick return in case of workspace query. ====
392*
393 IF( lwork.EQ.-1 ) THEN
394 work( 1 ) = dcmplx( lwkopt, 0 )
395 RETURN
396 END IF
397*
398* ==== ZLAHQR/ZLAQR0 crossover point ====
399*
400 nmin = ilaenv( 12, 'ZLAQR4', jbcmpz, n, ilo, ihi, lwork )
401 nmin = max( ntiny, nmin )
402*
403* ==== Nibble crossover point ====
404*
405 nibble = ilaenv( 14, 'ZLAQR4', jbcmpz, n, ilo, ihi, lwork )
406 nibble = max( 0, nibble )
407*
408* ==== Accumulate reflections during ttswp? Use block
409* . 2-by-2 structure during matrix-matrix multiply? ====
410*
411 kacc22 = ilaenv( 16, 'ZLAQR4', jbcmpz, n, ilo, ihi, lwork )
412 kacc22 = max( 0, kacc22 )
413 kacc22 = min( 2, kacc22 )
414*
415* ==== NWMAX = the largest possible deflation window for
416* . which there is sufficient workspace. ====
417*
418 nwmax = min( ( n-1 ) / 3, lwork / 2 )
419 nw = nwmax
420*
421* ==== NSMAX = the Largest number of simultaneous shifts
422* . for which there is sufficient workspace. ====
423*
424 nsmax = min( ( n-3 ) / 6, 2*lwork / 3 )
425 nsmax = nsmax - mod( nsmax, 2 )
426*
427* ==== NDFL: an iteration count restarted at deflation. ====
428*
429 ndfl = 1
430*
431* ==== ITMAX = iteration limit ====
432*
433 itmax = max( 30, 2*kexsh )*max( 10, ( ihi-ilo+1 ) )
434*
435* ==== Last row and column in the active block ====
436*
437 kbot = ihi
438*
439* ==== Main Loop ====
440*
441 DO 70 it = 1, itmax
442*
443* ==== Done when KBOT falls below ILO ====
444*
445 IF( kbot.LT.ilo )
446 $ GO TO 80
447*
448* ==== Locate active block ====
449*
450 DO 10 k = kbot, ilo + 1, -1
451 IF( h( k, k-1 ).EQ.zero )
452 $ GO TO 20
453 10 CONTINUE
454 k = ilo
455 20 CONTINUE
456 ktop = k
457*
458* ==== Select deflation window size:
459* . Typical Case:
460* . If possible and advisable, nibble the entire
461* . active block. If not, use size MIN(NWR,NWMAX)
462* . or MIN(NWR+1,NWMAX) depending upon which has
463* . the smaller corresponding subdiagonal entry
464* . (a heuristic).
465* .
466* . Exceptional Case:
467* . If there have been no deflations in KEXNW or
468* . more iterations, then vary the deflation window
469* . size. At first, because, larger windows are,
470* . in general, more powerful than smaller ones,
471* . rapidly increase the window to the maximum possible.
472* . Then, gradually reduce the window size. ====
473*
474 nh = kbot - ktop + 1
475 nwupbd = min( nh, nwmax )
476 IF( ndfl.LT.kexnw ) THEN
477 nw = min( nwupbd, nwr )
478 ELSE
479 nw = min( nwupbd, 2*nw )
480 END IF
481 IF( nw.LT.nwmax ) THEN
482 IF( nw.GE.nh-1 ) THEN
483 nw = nh
484 ELSE
485 kwtop = kbot - nw + 1
486 IF( cabs1( h( kwtop, kwtop-1 ) ).GT.
487 $ cabs1( h( kwtop-1, kwtop-2 ) ) )nw = nw + 1
488 END IF
489 END IF
490 IF( ndfl.LT.kexnw ) THEN
491 ndec = -1
492 ELSE IF( ndec.GE.0 .OR. nw.GE.nwupbd ) THEN
493 ndec = ndec + 1
494 IF( nw-ndec.LT.2 )
495 $ ndec = 0
496 nw = nw - ndec
497 END IF
498*
499* ==== Aggressive early deflation:
500* . split workspace under the subdiagonal into
501* . - an nw-by-nw work array V in the lower
502* . left-hand-corner,
503* . - an NW-by-at-least-NW-but-more-is-better
504* . (NW-by-NHO) horizontal work array along
505* . the bottom edge,
506* . - an at-least-NW-but-more-is-better (NHV-by-NW)
507* . vertical work array along the left-hand-edge.
508* . ====
509*
510 kv = n - nw + 1
511 kt = nw + 1
512 nho = ( n-nw-1 ) - kt + 1
513 kwv = nw + 2
514 nve = ( n-nw ) - kwv + 1
515*
516* ==== Aggressive early deflation ====
517*
518 CALL zlaqr2( wantt, wantz, n, ktop, kbot, nw, h, ldh,
519 $ iloz,
520 $ ihiz, z, ldz, ls, ld, w, h( kv, 1 ), ldh, nho,
521 $ h( kv, kt ), ldh, nve, h( kwv, 1 ), ldh, work,
522 $ lwork )
523*
524* ==== Adjust KBOT accounting for new deflations. ====
525*
526 kbot = kbot - ld
527*
528* ==== KS points to the shifts. ====
529*
530 ks = kbot - ls + 1
531*
532* ==== Skip an expensive QR sweep if there is a (partly
533* . heuristic) reason to expect that many eigenvalues
534* . will deflate without it. Here, the QR sweep is
535* . skipped if many eigenvalues have just been deflated
536* . or if the remaining active block is small.
537*
538 IF( ( ld.EQ.0 ) .OR. ( ( 100*ld.LE.nw*nibble ) .AND. ( kbot-
539 $ ktop+1.GT.min( nmin, nwmax ) ) ) ) THEN
540*
541* ==== NS = nominal number of simultaneous shifts.
542* . This may be lowered (slightly) if ZLAQR2
543* . did not provide that many shifts. ====
544*
545 ns = min( nsmax, nsr, max( 2, kbot-ktop ) )
546 ns = ns - mod( ns, 2 )
547*
548* ==== If there have been no deflations
549* . in a multiple of KEXSH iterations,
550* . then try exceptional shifts.
551* . Otherwise use shifts provided by
552* . ZLAQR2 above or from the eigenvalues
553* . of a trailing principal submatrix. ====
554*
555 IF( mod( ndfl, kexsh ).EQ.0 ) THEN
556 ks = kbot - ns + 1
557 DO 30 i = kbot, ks + 1, -2
558 w( i ) = h( i, i ) + wilk1*cabs1( h( i, i-1 ) )
559 w( i-1 ) = w( i )
560 30 CONTINUE
561 ELSE
562*
563* ==== Got NS/2 or fewer shifts? Use ZLAHQR
564* . on a trailing principal submatrix to
565* . get more. (Since NS.LE.NSMAX.LE.(N-3)/6,
566* . there is enough space below the subdiagonal
567* . to fit an NS-by-NS scratch array.) ====
568*
569 IF( kbot-ks+1.LE.ns / 2 ) THEN
570 ks = kbot - ns + 1
571 kt = n - ns + 1
572 CALL zlacpy( 'A', ns, ns, h( ks, ks ), ldh,
573 $ h( kt, 1 ), ldh )
574 CALL zlahqr( .false., .false., ns, 1, ns,
575 $ h( kt, 1 ), ldh, w( ks ), 1, 1, zdum,
576 $ 1, inf )
577 ks = ks + inf
578*
579* ==== In case of a rare QR failure use
580* . eigenvalues of the trailing 2-by-2
581* . principal submatrix. Scale to avoid
582* . overflows, underflows and subnormals.
583* . (The scale factor S can not be zero,
584* . because H(KBOT,KBOT-1) is nonzero.) ====
585*
586 IF( ks.GE.kbot ) THEN
587 s = cabs1( h( kbot-1, kbot-1 ) ) +
588 $ cabs1( h( kbot, kbot-1 ) ) +
589 $ cabs1( h( kbot-1, kbot ) ) +
590 $ cabs1( h( kbot, kbot ) )
591 aa = h( kbot-1, kbot-1 ) / s
592 cc = h( kbot, kbot-1 ) / s
593 bb = h( kbot-1, kbot ) / s
594 dd = h( kbot, kbot ) / s
595 tr2 = ( aa+dd ) / two
596 det = ( aa-tr2 )*( dd-tr2 ) - bb*cc
597 rtdisc = sqrt( -det )
598 w( kbot-1 ) = ( tr2+rtdisc )*s
599 w( kbot ) = ( tr2-rtdisc )*s
600*
601 ks = kbot - 1
602 END IF
603 END IF
604*
605 IF( kbot-ks+1.GT.ns ) THEN
606*
607* ==== Sort the shifts (Helps a little) ====
608*
609 sorted = .false.
610 DO 50 k = kbot, ks + 1, -1
611 IF( sorted )
612 $ GO TO 60
613 sorted = .true.
614 DO 40 i = ks, k - 1
615 IF( cabs1( w( i ) ).LT.cabs1( w( i+1 ) ) )
616 $ THEN
617 sorted = .false.
618 swap = w( i )
619 w( i ) = w( i+1 )
620 w( i+1 ) = swap
621 END IF
622 40 CONTINUE
623 50 CONTINUE
624 60 CONTINUE
625 END IF
626 END IF
627*
628* ==== If there are only two shifts, then use
629* . only one. ====
630*
631 IF( kbot-ks+1.EQ.2 ) THEN
632 IF( cabs1( w( kbot )-h( kbot, kbot ) ).LT.
633 $ cabs1( w( kbot-1 )-h( kbot, kbot ) ) ) THEN
634 w( kbot-1 ) = w( kbot )
635 ELSE
636 w( kbot ) = w( kbot-1 )
637 END IF
638 END IF
639*
640* ==== Use up to NS of the the smallest magnitude
641* . shifts. If there aren't NS shifts available,
642* . then use them all, possibly dropping one to
643* . make the number of shifts even. ====
644*
645 ns = min( ns, kbot-ks+1 )
646 ns = ns - mod( ns, 2 )
647 ks = kbot - ns + 1
648*
649* ==== Small-bulge multi-shift QR sweep:
650* . split workspace under the subdiagonal into
651* . - a KDU-by-KDU work array U in the lower
652* . left-hand-corner,
653* . - a KDU-by-at-least-KDU-but-more-is-better
654* . (KDU-by-NHo) horizontal work array WH along
655* . the bottom edge,
656* . - and an at-least-KDU-but-more-is-better-by-KDU
657* . (NVE-by-KDU) vertical work WV arrow along
658* . the left-hand-edge. ====
659*
660 kdu = 2*ns
661 ku = n - kdu + 1
662 kwh = kdu + 1
663 nho = ( n-kdu+1-4 ) - ( kdu+1 ) + 1
664 kwv = kdu + 4
665 nve = n - kdu - kwv + 1
666*
667* ==== Small-bulge multi-shift QR sweep ====
668*
669 CALL zlaqr5( wantt, wantz, kacc22, n, ktop, kbot, ns,
670 $ w( ks ), h, ldh, iloz, ihiz, z, ldz, work,
671 $ 3, h( ku, 1 ), ldh, nve, h( kwv, 1 ), ldh,
672 $ nho, h( ku, kwh ), ldh )
673 END IF
674*
675* ==== Note progress (or the lack of it). ====
676*
677 IF( ld.GT.0 ) THEN
678 ndfl = 1
679 ELSE
680 ndfl = ndfl + 1
681 END IF
682*
683* ==== End of main loop ====
684 70 CONTINUE
685*
686* ==== Iteration limit exceeded. Set INFO to show where
687* . the problem occurred and exit. ====
688*
689 info = kbot
690 80 CONTINUE
691 END IF
692*
693* ==== Return the optimal value of LWORK. ====
694*
695 work( 1 ) = dcmplx( lwkopt, 0 )
696*
697* ==== End of ZLAQR4 ====
698*
699 END
subroutine zlacpy(uplo, m, n, a, lda, b, ldb)
ZLACPY copies all or part of one two-dimensional array to another.
Definition zlacpy.f:101
subroutine zlahqr(wantt, wantz, n, ilo, ihi, h, ldh, w, iloz, ihiz, z, ldz, info)
ZLAHQR computes the eigenvalues and Schur factorization of an upper Hessenberg matrix,...
Definition zlahqr.f:193
subroutine zlaqr2(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)
ZLAQR2 performs the unitary similarity transformation of a Hessenberg matrix to detect and deflate fu...
Definition zlaqr2.f:269
subroutine zlaqr4(wantt, wantz, n, ilo, ihi, h, ldh, w, iloz, ihiz, z, ldz, work, lwork, info)
ZLAQR4 computes the eigenvalues of a Hessenberg matrix, and optionally the matrices from the Schur de...
Definition zlaqr4.f:245
subroutine zlaqr5(wantt, wantz, kacc22, n, ktop, kbot, nshfts, s, h, ldh, iloz, ihiz, z, ldz, v, ldv, u, ldu, nv, wv, ldwv, nh, wh, ldwh)
ZLAQR5 performs a single small-bulge multi-shift QR sweep.
Definition zlaqr5.f:256