206206* =====================================================================
207207 SUBROUTINE SLAHQR ( WANTT , WANTZ , N , ILO , IHI , H , LDH , WR , WI ,
208208 $ ILOZ , IHIZ , Z , LDZ , INFO )
209+ IMPLICIT NONE
209210*
210211* -- LAPACK auxiliary routine (version 3.7.0) --
211212* -- LAPACK is a software package provided by Univ. of Tennessee, --
@@ -227,13 +228,16 @@ SUBROUTINE SLAHQR( WANTT, WANTZ, N, ILO, IHI, H, LDH, WR, WI,
227228 PARAMETER ( ZERO = 0.0e0 , ONE = 1.0e0 , TWO = 2.0e0 )
228229 REAL DAT1, DAT2
229230 PARAMETER ( DAT1 = 3.0e0 / 4.0e0 , DAT2 = - 0.4375e0 )
231+ INTEGER KEXSH
232+ PARAMETER ( KEXSH = 6 )
230233* ..
231234* .. Local Scalars ..
232235 REAL AA, AB, BA, BB, CS, DET, H11, H12, H21, H21S,
233236 $ H22, RT1I, RT1R, RT2I, RT2R, RTDISC, S, SAFMAX,
234237 $ SAFMIN, SMLNUM, SN, SUM, T1, T2, T3, TR, TST,
235238 $ ULP, V2, V3
236- INTEGER I, I1, I2, ITS, ITMAX, J, K, L, M, NH, NR, NZ
239+ INTEGER I, I1, I2, ITS, ITMAX, J, K, L, M, NH, NR, NZ,
240+ $ KDEFL
237241* ..
238242* .. Local Arrays ..
239243 REAL V( 3 )
@@ -294,6 +298,10 @@ SUBROUTINE SLAHQR( WANTT, WANTZ, N, ILO, IHI, H, LDH, WR, WI,
294298*
295299 ITMAX = 30 * MAX ( 10 , NH )
296300*
301+ * KDEFL counts the number of iterations since a deflation
302+ *
303+ KDEFL = - 2
304+ *
297305* The main loop begins here. I is the loop index and decreases from
298306* IHI to ILO in steps of 1 or 2. Each iteration of the loop works
299307* with the active submatrix in rows and columns L to I.
@@ -353,6 +361,7 @@ SUBROUTINE SLAHQR( WANTT, WANTZ, N, ILO, IHI, H, LDH, WR, WI,
353361*
354362 IF ( L.GE. I-1 )
355363 $ GO TO 150
364+ KDEFL = KDEFL + 1
356365*
357366* Now the active submatrix is in rows and columns L to I. If
358367* eigenvalues only are being computed, only the active submatrix
@@ -363,25 +372,24 @@ SUBROUTINE SLAHQR( WANTT, WANTZ, N, ILO, IHI, H, LDH, WR, WI,
363372 I2 = I
364373 END IF
365374*
366- IF ( ITS .EQ. 10 ) THEN
375+ IF ( MOD (KDEFL, 2 * KEXSH) .EQ. 0 ) THEN
367376*
368377* Exceptional shift.
369378*
370- S = ABS ( H( L +1 , L ) ) + ABS ( H( L +2 , L +1 ) )
371- H11 = DAT1* S + H( L, L )
379+ S = ABS ( H( I, I -1 ) ) + ABS ( H( I -1 , I -2 ) )
380+ H11 = DAT1* S + H( I, I )
372381 H12 = DAT2* S
373382 H21 = S
374383 H22 = H11
375- ELSE IF ( ITS .EQ. 20 ) THEN
384+ ELSE IF ( MOD (KDEFL,KEXSH) .EQ. 0 ) THEN
376385*
377386* Exceptional shift.
378387*
379- S = ABS ( H( I, I -1 ) ) + ABS ( H( I -1 , I -2 ) )
380- H11 = DAT1* S + H( I, I )
388+ S = ABS ( H( L +1 , L ) ) + ABS ( H( L +2 , L +1 ) )
389+ H11 = DAT1* S + H( L, L )
381390 H12 = DAT2* S
382391 H21 = S
383392 H22 = H11
384- ELSE
385393*
386394* Prepare to use Francis' double shift
387395* (i.e. 2nd degree generalized Rayleigh quotient)
@@ -599,6 +607,8 @@ SUBROUTINE SLAHQR( WANTT, WANTZ, N, ILO, IHI, H, LDH, WR, WI,
599607 CALL SROT( NZ, Z( ILOZ, I-1 ), 1 , Z( ILOZ, I ), 1 , CS, SN )
600608 END IF
601609 END IF
610+ * reset deflation counter
611+ KDEFL = 0
602612*
603613* return to start of the main loop with new value of I.
604614*
0 commit comments