@@ -318,7 +318,8 @@ RECURSIVE SUBROUTINE SLAQZ0( WANTS, WANTQ, WANTZ, N, ILO, IHI, A,
318318 PARAMETER ( ZERO = 0.0 , ONE = 1.0 , HALF = 0.5 )
319319
320320* Local scalars
321- REAL :: SMLNUM, ULP, ESHIFT, SAFMIN, SAFMAX, C1, S1, TEMP, SWAP
321+ REAL :: SMLNUM, ULP, ESHIFT, SAFMIN, SAFMAX, C1, S1, TEMP, SWAP,
322+ $ BNORM, BTOL
322323 INTEGER :: ISTART, ISTOP, IITER, MAXIT, ISTART2, K, LD, NSHIFTS,
323324 $ NBLOCK, NW, NMIN, NIBBLE, N_UNDEFLATED, N_DEFLATED,
324325 $ NS, SWEEP_INFO, SHIFTPOS, LWORKREQ, K2, ISTARTM,
@@ -330,7 +331,7 @@ RECURSIVE SUBROUTINE SLAQZ0( WANTS, WANTQ, WANTZ, N, ILO, IHI, A,
330331* External Functions
331332 EXTERNAL :: XERBLA, SHGEQZ, SLAQZ3, SLAQZ4, SLASET, SLABAD,
332333 $ SLARTG, SROT
333- REAL , EXTERNAL :: SLAMCH
334+ REAL , EXTERNAL :: SLAMCH, SLANHS
334335 LOGICAL , EXTERNAL :: LSAME
335336 INTEGER , EXTERNAL :: ILAENV
336337
@@ -482,6 +483,9 @@ RECURSIVE SUBROUTINE SLAQZ0( WANTS, WANTQ, WANTZ, N, ILO, IHI, A,
482483 ULP = SLAMCH( ' PRECISION' )
483484 SMLNUM = SAFMIN* ( REAL ( N )/ ULP )
484485
486+ BNORM = SLANHS( ' F' , IHI- ILO+1 , B( ILO, ILO ), LDB, WORK )
487+ BTOL = MAX ( SAFMIN, ULP* BNORM )
488+
485489 ISTART = ILO
486490 ISTOP = IHI
487491 MAXIT = 3 * ( IHI- ILO+1 )
@@ -558,15 +562,8 @@ RECURSIVE SUBROUTINE SLAQZ0( WANTS, WANTQ, WANTZ, N, ILO, IHI, A,
558562* slow down the method when many infinite eigenvalues are present
559563 K = ISTOP
560564 DO WHILE ( K.GE. ISTART2 )
561- TEMP = ZERO
562- IF ( K .LT. ISTOP ) THEN
563- TEMP = TEMP+ ABS ( B( K, K+1 ) )
564- END IF
565- IF ( K .GT. ISTART2 ) THEN
566- TEMP = TEMP+ ABS ( B( K-1 , K ) )
567- END IF
568565
569- IF ( ABS ( B( K, K ) ) .LT. MAX ( SMLNUM, ULP * TEMP ) ) THEN
566+ IF ( ABS ( B( K, K ) ) .LT. BTOL ) THEN
570567* A diagonal element of B is negligable, move it
571568* to the top and deflate it
572569
0 commit comments