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