LAPACK 3.12.1
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches
dlaqr0.f
Go to the documentation of this file.
1*> \brief \b DLAQR0 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 DLAQR0 + dependencies
9*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlaqr0.f">
10*> [TGZ]</a>
11*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlaqr0.f">
12*> [ZIP]</a>
13*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlaqr0.f">
14*> [TXT]</a>
15*
16* Definition:
17* ===========
18*
19* SUBROUTINE DLAQR0( 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* DOUBLE PRECISION H( LDH, * ), WI( * ), WORK( * ), WR( * ),
28* $ Z( LDZ, * )
29* ..
30*
31*
32*> \par Purpose:
33* =============
34*>
35*> \verbatim
36*>
37*> DLAQR0 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 DGEBAL, and then passed to DGEHRD when the
83*> matrix output by DGEBAL 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 DOUBLE PRECISION 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 DOUBLE PRECISION array, dimension (IHI)
116*> \endverbatim
117*>
118*> \param[out] WI
119*> \verbatim
120*> WI is DOUBLE PRECISION 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 DOUBLE PRECISION 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 DOUBLE PRECISION 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 DLAQR0 does a workspace query.
181*> In this case, DLAQR0 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, DLAQR0 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*> \par Contributors:
224* ==================
225*>
226*> Karen Braman and Ralph Byers, Department of Mathematics,
227*> University of Kansas, USA
228*
229*> \par References:
230* ================
231*>
232*> K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
233*> Algorithm Part I: Maintaining Well Focused Shifts, and Level 3
234*> Performance, SIAM Journal of Matrix Analysis, volume 23, pages
235*> 929--947, 2002.
236*> \n
237*> K. Braman, R. Byers and R. Mathias, The Multi-Shift QR
238*> Algorithm Part II: Aggressive Early Deflation, SIAM Journal
239*> of Matrix Analysis, volume 23, pages 948--973, 2002.
240*
241* Authors:
242* ========
243*
244*> \author Univ. of Tennessee
245*> \author Univ. of California Berkeley
246*> \author Univ. of Colorado Denver
247*> \author NAG Ltd.
248*
249*> \ingroup laqr0
250*
251* =====================================================================
252 SUBROUTINE dlaqr0( 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 DOUBLE PRECISION H( LDH, * ), WI( * ), WORK( * ), WR( * ),
265 $ z( ldz, * )
266* ..
267*
268* ================================================================
269*
270* .. Parameters ..
271*
272* ==== Matrices of order NTINY or smaller must be processed by
273* . DLAHQR because of insufficient subdiagonal scratch space.
274* . (This is a hard limit.) ====
275 INTEGER NTINY
276 parameter( ntiny = 15 )
277*
278* ==== Exceptional deflation windows: try to cure rare
279* . slow convergence by varying the size of the
280* . deflation window after KEXNW iterations. ====
281 INTEGER KEXNW
282 parameter( kexnw = 5 )
283*
284* ==== Exceptional shifts: try to cure rare slow convergence
285* . with ad-hoc exceptional shifts every KEXSH iterations.
286* . ====
287 INTEGER KEXSH
288 parameter( kexsh = 6 )
289*
290* ==== The constants WILK1 and WILK2 are used to form the
291* . exceptional shifts. ====
292 DOUBLE PRECISION WILK1, WILK2
293 parameter( wilk1 = 0.75d0, wilk2 = -0.4375d0 )
294 DOUBLE PRECISION ZERO, ONE
295 parameter( zero = 0.0d0, one = 1.0d0 )
296* ..
297* .. Local Scalars ..
298 DOUBLE PRECISION AA, BB, CC, CS, DD, SN, SS, SWAP
299 INTEGER I, INF, IT, ITMAX, K, KACC22, KBOT, KDU, KS,
300 $ kt, ktop, ku, kv, kwh, kwtop, kwv, ld, ls,
301 $ lwkopt, ndec, ndfl, nh, nho, nibble, nmin, ns,
302 $ nsmax, nsr, nve, nw, nwmax, nwr, nwupbd
303 LOGICAL SORTED
304 CHARACTER JBCMPZ*2
305* ..
306* .. External Functions ..
307 INTEGER ILAENV
308 EXTERNAL ilaenv
309* ..
310* .. Local Arrays ..
311 DOUBLE PRECISION ZDUM( 1, 1 )
312* ..
313* .. External Subroutines ..
314 EXTERNAL dlacpy, dlahqr, dlanv2, dlaqr3, dlaqr4,
315 $ dlaqr5
316* ..
317* .. Intrinsic Functions ..
318 INTRINSIC abs, dble, int, max, min, mod
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 DLAHQR. ====
333*
334 lwkopt = 1
335 IF( lwork.NE.-1 )
336 $ CALL dlahqr( wantt, wantz, n, ilo, ihi, h, ldh, wr, wi,
337 $ iloz, 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, 'DLAQR0', 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, 'DLAQR0', 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 DLAQR3 ====
382*
383 CALL dlaqr3( wantt, wantz, n, ilo, ihi, nwr+1, h, ldh, iloz,
384 $ ihiz, z, ldz, ls, ld, wr, wi, h, ldh, n, h, ldh,
385 $ n, h, ldh, work, -1 )
386*
387* ==== Optimal workspace = MAX(DLAQR5, DLAQR3) ====
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 ) = dble( lwkopt )
395 RETURN
396 END IF
397*
398* ==== DLAHQR/DLAQR0 crossover point ====
399*
400 nmin = ilaenv( 12, 'DLAQR0', jbcmpz, n, ilo, ihi, lwork )
401 nmin = max( ntiny, nmin )
402*
403* ==== Nibble crossover point ====
404*
405 nibble = ilaenv( 14, 'DLAQR0', 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, 'DLAQR0', 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 80 it = 1, itmax
442*
443* ==== Done when KBOT falls below ILO ====
444*
445 IF( kbot.LT.ilo )
446 $ GO TO 90
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( abs( h( kwtop, kwtop-1 ) ).GT.
487 $ abs( 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 dlaqr3( wantt, wantz, n, ktop, kbot, nw, h, ldh,
519 $ iloz,
520 $ ihiz, z, ldz, ls, ld, wr, wi, h( kv, 1 ), ldh,
521 $ nho, h( kv, kt ), ldh, nve, h( kwv, 1 ), ldh,
522 $ work, 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 DLAQR3
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* . DLAQR3 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, max( ks+1, ktop+2 ), -2
558 ss = abs( h( i, i-1 ) ) + abs( h( i-1, i-2 ) )
559 aa = wilk1*ss + h( i, i )
560 bb = ss
561 cc = wilk2*ss
562 dd = aa
563 CALL dlanv2( aa, bb, cc, dd, wr( i-1 ),
564 $ wi( i-1 ),
565 $ wr( i ), wi( i ), cs, sn )
566 30 CONTINUE
567 IF( ks.EQ.ktop ) THEN
568 wr( ks+1 ) = h( ks+1, ks+1 )
569 wi( ks+1 ) = zero
570 wr( ks ) = wr( ks+1 )
571 wi( ks ) = wi( ks+1 )
572 END IF
573 ELSE
574*
575* ==== Got NS/2 or fewer shifts? Use DLAQR4 or
576* . DLAHQR on a trailing principal submatrix to
577* . get more. (Since NS.LE.NSMAX.LE.(N-3)/6,
578* . there is enough space below the subdiagonal
579* . to fit an NS-by-NS scratch array.) ====
580*
581 IF( kbot-ks+1.LE.ns / 2 ) THEN
582 ks = kbot - ns + 1
583 kt = n - ns + 1
584 CALL dlacpy( 'A', ns, ns, h( ks, ks ), ldh,
585 $ h( kt, 1 ), ldh )
586 IF( ns.GT.nmin ) THEN
587 CALL dlaqr4( .false., .false., ns, 1, ns,
588 $ h( kt, 1 ), ldh, wr( ks ),
589 $ wi( ks ), 1, 1, zdum, 1, work,
590 $ lwork, inf )
591 ELSE
592 CALL dlahqr( .false., .false., ns, 1, ns,
593 $ h( kt, 1 ), ldh, wr( ks ),
594 $ wi( ks ), 1, 1, zdum, 1, inf )
595 END IF
596 ks = ks + inf
597*
598* ==== In case of a rare QR failure use
599* . eigenvalues of the trailing 2-by-2
600* . principal submatrix. ====
601*
602 IF( ks.GE.kbot ) THEN
603 aa = h( kbot-1, kbot-1 )
604 cc = h( kbot, kbot-1 )
605 bb = h( kbot-1, kbot )
606 dd = h( kbot, kbot )
607 CALL dlanv2( aa, bb, cc, dd, wr( kbot-1 ),
608 $ wi( kbot-1 ), wr( kbot ),
609 $ wi( kbot ), cs, sn )
610 ks = kbot - 1
611 END IF
612 END IF
613*
614 IF( kbot-ks+1.GT.ns ) THEN
615*
616* ==== Sort the shifts (Helps a little)
617* . Bubble sort keeps complex conjugate
618* . pairs together. ====
619*
620 sorted = .false.
621 DO 50 k = kbot, ks + 1, -1
622 IF( sorted )
623 $ GO TO 60
624 sorted = .true.
625 DO 40 i = ks, k - 1
626 IF( abs( wr( i ) )+abs( wi( i ) ).LT.
627 $ abs( wr( i+1 ) )+abs( wi( i+1 ) ) ) THEN
628 sorted = .false.
629*
630 swap = wr( i )
631 wr( i ) = wr( i+1 )
632 wr( i+1 ) = swap
633*
634 swap = wi( i )
635 wi( i ) = wi( i+1 )
636 wi( i+1 ) = swap
637 END IF
638 40 CONTINUE
639 50 CONTINUE
640 60 CONTINUE
641 END IF
642*
643* ==== Shuffle shifts into pairs of real shifts
644* . and pairs of complex conjugate shifts
645* . assuming complex conjugate shifts are
646* . already adjacent to one another. (Yes,
647* . they are.) ====
648*
649 DO 70 i = kbot, ks + 2, -2
650 IF( wi( i ).NE.-wi( i-1 ) ) THEN
651*
652 swap = wr( i )
653 wr( i ) = wr( i-1 )
654 wr( i-1 ) = wr( i-2 )
655 wr( i-2 ) = swap
656*
657 swap = wi( i )
658 wi( i ) = wi( i-1 )
659 wi( i-1 ) = wi( i-2 )
660 wi( i-2 ) = swap
661 END IF
662 70 CONTINUE
663 END IF
664*
665* ==== If there are only two shifts and both are
666* . real, then use only one. ====
667*
668 IF( kbot-ks+1.EQ.2 ) THEN
669 IF( wi( kbot ).EQ.zero ) THEN
670 IF( abs( wr( kbot )-h( kbot, kbot ) ).LT.
671 $ abs( wr( kbot-1 )-h( kbot, kbot ) ) ) THEN
672 wr( kbot-1 ) = wr( kbot )
673 ELSE
674 wr( kbot ) = wr( kbot-1 )
675 END IF
676 END IF
677 END IF
678*
679* ==== Use up to NS of the the smallest magnitude
680* . shifts. If there aren't NS shifts available,
681* . then use them all, possibly dropping one to
682* . make the number of shifts even. ====
683*
684 ns = min( ns, kbot-ks+1 )
685 ns = ns - mod( ns, 2 )
686 ks = kbot - ns + 1
687*
688* ==== Small-bulge multi-shift QR sweep:
689* . split workspace under the subdiagonal into
690* . - a KDU-by-KDU work array U in the lower
691* . left-hand-corner,
692* . - a KDU-by-at-least-KDU-but-more-is-better
693* . (KDU-by-NHo) horizontal work array WH along
694* . the bottom edge,
695* . - and an at-least-KDU-but-more-is-better-by-KDU
696* . (NVE-by-KDU) vertical work WV arrow along
697* . the left-hand-edge. ====
698*
699 kdu = 2*ns
700 ku = n - kdu + 1
701 kwh = kdu + 1
702 nho = ( n-kdu+1-4 ) - ( kdu+1 ) + 1
703 kwv = kdu + 4
704 nve = n - kdu - kwv + 1
705*
706* ==== Small-bulge multi-shift QR sweep ====
707*
708 CALL dlaqr5( wantt, wantz, kacc22, n, ktop, kbot, ns,
709 $ wr( ks ), wi( ks ), h, ldh, iloz, ihiz, z,
710 $ ldz, work, 3, h( ku, 1 ), ldh, nve,
711 $ h( kwv, 1 ), ldh, nho, h( ku, kwh ), ldh )
712 END IF
713*
714* ==== Note progress (or the lack of it). ====
715*
716 IF( ld.GT.0 ) THEN
717 ndfl = 1
718 ELSE
719 ndfl = ndfl + 1
720 END IF
721*
722* ==== End of main loop ====
723 80 CONTINUE
724*
725* ==== Iteration limit exceeded. Set INFO to show where
726* . the problem occurred and exit. ====
727*
728 info = kbot
729 90 CONTINUE
730 END IF
731*
732* ==== Return the optimal value of LWORK. ====
733*
734 work( 1 ) = dble( lwkopt )
735*
736* ==== End of DLAQR0 ====
737*
738 END
subroutine dlacpy(uplo, m, n, a, lda, b, ldb)
DLACPY copies all or part of one two-dimensional array to another.
Definition dlacpy.f:101
subroutine dlahqr(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, ihiz, z, ldz, info)
DLAHQR computes the eigenvalues and Schur factorization of an upper Hessenberg matrix,...
Definition dlahqr.f:205
subroutine dlanv2(a, b, c, d, rt1r, rt1i, rt2r, rt2i, cs, sn)
DLANV2 computes the Schur factorization of a real 2-by-2 nonsymmetric matrix in standard form.
Definition dlanv2.f:125
subroutine dlaqr0(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, ihiz, z, ldz, work, lwork, info)
DLAQR0 computes the eigenvalues of a Hessenberg matrix, and optionally the matrices from the Schur de...
Definition dlaqr0.f:254
subroutine dlaqr3(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)
DLAQR3 performs the orthogonal similarity transformation of a Hessenberg matrix to detect and deflate...
Definition dlaqr3.f:274
subroutine dlaqr4(wantt, wantz, n, ilo, ihi, h, ldh, wr, wi, iloz, ihiz, z, ldz, work, lwork, info)
DLAQR4 computes the eigenvalues of a Hessenberg matrix, and optionally the matrices from the Schur de...
Definition dlaqr4.f:261
subroutine dlaqr5(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)
DLAQR5 performs a single small-bulge multi-shift QR sweep.
Definition dlaqr5.f:263