LAPACK 3.12.1
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches
claqr4.f
Go to the documentation of this file.
1*> \brief \b CLAQR4 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 CLAQR4 + dependencies
9*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/claqr4.f">
10*> [TGZ]</a>
11*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/claqr4.f">
12*> [ZIP]</a>
13*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/claqr4.f">
14*> [TXT]</a>
15*
16* Definition:
17* ===========
18*
19* SUBROUTINE CLAQR4( 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 H( LDH, * ), W( * ), WORK( * ), Z( LDZ, * )
28* ..
29*
30*
31*
32*> \par Purpose:
33* =============
34*>
35*> \verbatim
36*>
37*> CLAQR4 implements one level of recursion for CLAQR0.
38*> It is a complete implementation of the small bulge multi-shift
39*> QR algorithm. It may be called by CLAQR0 and, for large enough
40*> deflation window size, it may be called by CLAQR3. This
41*> subroutine is identical to CLAQR0 except that it calls CLAQR2
42*> instead of CLAQR3.
43*>
44*> CLAQR4 computes the eigenvalues of a Hessenberg matrix H
45*> and, optionally, the matrices T and Z from the Schur decomposition
46*> H = Z T Z**H, where T is an upper triangular matrix (the
47*> Schur form), and Z is the unitary matrix of Schur vectors.
48*>
49*> Optionally Z may be postmultiplied into an input unitary
50*> matrix Q so that this routine can give the Schur factorization
51*> of a matrix A which has been reduced to the Hessenberg form H
52*> by the unitary matrix Q: A = Q*H*Q**H = (QZ)*H*(QZ)**H.
53*> \endverbatim
54*
55* Arguments:
56* ==========
57*
58*> \param[in] WANTT
59*> \verbatim
60*> WANTT is LOGICAL
61*> = .TRUE. : the full Schur form T is required;
62*> = .FALSE.: only eigenvalues are required.
63*> \endverbatim
64*>
65*> \param[in] WANTZ
66*> \verbatim
67*> WANTZ is LOGICAL
68*> = .TRUE. : the matrix of Schur vectors Z is required;
69*> = .FALSE.: Schur vectors are not required.
70*> \endverbatim
71*>
72*> \param[in] N
73*> \verbatim
74*> N is INTEGER
75*> The order of the matrix H. N >= 0.
76*> \endverbatim
77*>
78*> \param[in] ILO
79*> \verbatim
80*> ILO is INTEGER
81*> \endverbatim
82*>
83*> \param[in] IHI
84*> \verbatim
85*> IHI is INTEGER
86*> It is assumed that H is already upper triangular in rows
87*> and columns 1:ILO-1 and IHI+1:N and, if ILO > 1,
88*> H(ILO,ILO-1) is zero. ILO and IHI are normally set by a
89*> previous call to CGEBAL, and then passed to CGEHRD when the
90*> matrix output by CGEBAL is reduced to Hessenberg form.
91*> Otherwise, ILO and IHI should be set to 1 and N,
92*> respectively. If N > 0, then 1 <= ILO <= IHI <= N.
93*> If N = 0, then ILO = 1 and IHI = 0.
94*> \endverbatim
95*>
96*> \param[in,out] H
97*> \verbatim
98*> H is COMPLEX array, dimension (LDH,N)
99*> On entry, the upper Hessenberg matrix H.
100*> On exit, if INFO = 0 and WANTT is .TRUE., then H
101*> contains the upper triangular matrix T from the Schur
102*> decomposition (the Schur form). If INFO = 0 and WANT is
103*> .FALSE., then the contents of H are unspecified on exit.
104*> (The output value of H when INFO > 0 is given under the
105*> description of INFO below.)
106*>
107*> This subroutine may explicitly set H(i,j) = 0 for i > j and
108*> j = 1, 2, ... ILO-1 or j = IHI+1, IHI+2, ... N.
109*> \endverbatim
110*>
111*> \param[in] LDH
112*> \verbatim
113*> LDH is INTEGER
114*> The leading dimension of the array H. LDH >= max(1,N).
115*> \endverbatim
116*>
117*> \param[out] W
118*> \verbatim
119*> W is COMPLEX array, dimension (N)
120*> The computed eigenvalues of H(ILO:IHI,ILO:IHI) are stored
121*> in W(ILO:IHI). If WANTT is .TRUE., then the eigenvalues are
122*> stored in the same order as on the diagonal of the Schur
123*> form returned in H, with W(i) = H(i,i).
124*> \endverbatim
125*>
126*> \param[in] ILOZ
127*> \verbatim
128*> ILOZ is INTEGER
129*> \endverbatim
130*>
131*> \param[in] IHIZ
132*> \verbatim
133*> IHIZ is INTEGER
134*> Specify the rows of Z to which transformations must be
135*> applied if WANTZ is .TRUE..
136*> 1 <= ILOZ <= ILO; IHI <= IHIZ <= N.
137*> \endverbatim
138*>
139*> \param[in,out] Z
140*> \verbatim
141*> Z is COMPLEX array, dimension (LDZ,IHI)
142*> If WANTZ is .FALSE., then Z is not referenced.
143*> If WANTZ is .TRUE., then Z(ILO:IHI,ILOZ:IHIZ) is
144*> replaced by Z(ILO:IHI,ILOZ:IHIZ)*U where U is the
145*> orthogonal Schur factor of H(ILO:IHI,ILO:IHI).
146*> (The output value of Z when INFO > 0 is given under
147*> the description of INFO below.)
148*> \endverbatim
149*>
150*> \param[in] LDZ
151*> \verbatim
152*> LDZ is INTEGER
153*> The leading dimension of the array Z. if WANTZ is .TRUE.
154*> then LDZ >= MAX(1,IHIZ). Otherwise, LDZ >= 1.
155*> \endverbatim
156*>
157*> \param[out] WORK
158*> \verbatim
159*> WORK is COMPLEX array, dimension LWORK
160*> On exit, if LWORK = -1, WORK(1) returns an estimate of
161*> the optimal value for LWORK.
162*> \endverbatim
163*>
164*> \param[in] LWORK
165*> \verbatim
166*> LWORK is INTEGER
167*> The dimension of the array WORK. LWORK >= max(1,N)
168*> is sufficient, but LWORK typically as large as 6*N may
169*> be required for optimal performance. A workspace query
170*> to determine the optimal workspace size is recommended.
171*>
172*> If LWORK = -1, then CLAQR4 does a workspace query.
173*> In this case, CLAQR4 checks the input parameters and
174*> estimates the optimal workspace size for the given
175*> values of N, ILO and IHI. The estimate is returned
176*> in WORK(1). No error message related to LWORK is
177*> issued by XERBLA. Neither H nor Z are accessed.
178*> \endverbatim
179*>
180*> \param[out] INFO
181*> \verbatim
182*> INFO is INTEGER
183*> = 0: successful exit
184*> > 0: if INFO = i, CLAQR4 failed to compute all of
185*> the eigenvalues. Elements 1:ilo-1 and i+1:n of WR
186*> and WI contain those eigenvalues which have been
187*> successfully computed. (Failures are rare.)
188*>
189*> If INFO > 0 and WANT is .FALSE., then on exit,
190*> the remaining unconverged eigenvalues are the eigen-
191*> values of the upper Hessenberg matrix rows and
192*> columns ILO through INFO of the final, output
193*> value of H.
194*>
195*> If INFO > 0 and WANTT is .TRUE., then on exit
196*>
197*> (*) (initial value of H)*U = U*(final value of H)
198*>
199*> where U is a unitary matrix. The final
200*> value of H is upper Hessenberg and triangular in
201*> rows and columns INFO+1 through IHI.
202*>
203*> If INFO > 0 and WANTZ is .TRUE., then on exit
204*>
205*> (final value of Z(ILO:IHI,ILOZ:IHIZ)
206*> = (initial value of Z(ILO:IHI,ILOZ:IHIZ)*U
207*>
208*> where U is the unitary matrix in (*) (regard-
209*> less of the value of WANTT.)
210*>
211*> If INFO > 0 and WANTZ is .FALSE., then Z is not
212*> accessed.
213*> \endverbatim
214*
215* Authors:
216* ========
217*
218*> \author Univ. of Tennessee
219*> \author Univ. of California Berkeley
220*> \author Univ. of Colorado Denver
221*> \author NAG Ltd.
222*
223*> \ingroup laqr4
224*
225*> \par Contributors:
226* ==================
227*>
228*> Karen Braman and Ralph Byers, Department of Mathematics,
229*> University of Kansas, USA
230*
231*> \par References:
232* ================
233*>
234*> K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
235*> Algorithm Part I: Maintaining Well Focused Shifts, and Level 3
236*> Performance, SIAM Journal of Matrix Analysis, volume 23, pages
237*> 929--947, 2002.
238*> \n
239*> K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
240*> Algorithm Part II: Aggressive Early Deflation, SIAM Journal
241*> of Matrix Analysis, volume 23, pages 948--973, 2002.
242*>
243* =====================================================================
244 SUBROUTINE claqr4( WANTT, WANTZ, N, ILO, IHI, H, LDH, W, ILOZ,
245 $ IHIZ, Z, LDZ, WORK, LWORK, INFO )
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*
701 END
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 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...
Definition claqr4.f:246
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