This seems to fix problems with balancing causing very large backward error for certain
Hessenberg matrices, including the often cited example of Watkins.
* .. External Functions ..
LOGICAL SISNAN, LSAME
INTEGER ICAMAX
- REAL SLAMCH
- EXTERNAL SISNAN, LSAME, ICAMAX, SLAMCH
+ REAL SLAMCH, SCNRM2
+ EXTERNAL SISNAN, LSAME, ICAMAX, SLAMCH, SCNRM2
* ..
* .. External Subroutines ..
EXTERNAL CSSCAL, CSWAP, XERBLA
NOCONV = .FALSE.
*
DO 200 I = K, L
- C = ZERO
- R = ZERO
-*
- DO 150 J = K, L
- IF( J.EQ.I )
- $ GO TO 150
- C = C + CABS1( A( J, I ) )
- R = R + CABS1( A( I, J ) )
- 150 CONTINUE
+*
+ C = SCNRM2( L-K+1, A( K, I ), 1 )
+ R = SCNRM2( L-K+1, A( I , K ), LDA )
ICA = ICAMAX( L, A( 1, I ), 1 )
CA = ABS( A( ICA, I ) )
IRA = ICAMAX( N-K+1, A( I, K ), LDA )
* .. External Functions ..
LOGICAL DISNAN, LSAME
INTEGER IDAMAX
- DOUBLE PRECISION DLAMCH
- EXTERNAL DISNAN, LSAME, IDAMAX, DLAMCH
+ DOUBLE PRECISION DLAMCH, DNRM2
+ EXTERNAL DISNAN, LSAME, IDAMAX, DLAMCH, DNRM2
* ..
* .. External Subroutines ..
EXTERNAL DSCAL, DSWAP, XERBLA
SFMAX1 = ONE / SFMIN1
SFMIN2 = SFMIN1*SCLFAC
SFMAX2 = ONE / SFMIN2
+*
140 CONTINUE
NOCONV = .FALSE.
*
DO 200 I = K, L
- C = ZERO
- R = ZERO
-*
- DO 150 J = K, L
- IF( J.EQ.I )
- $ GO TO 150
- C = C + ABS( A( J, I ) )
- R = R + ABS( A( I, J ) )
- 150 CONTINUE
+*
+ C = DNRM2( L-K+1, A( K, I ), 1 )
+ R = DNRM2( L-K+1, A( I, K ), LDA )
ICA = IDAMAX( L, A( 1, I ), 1 )
CA = ABS( A( ICA, I ) )
IRA = IDAMAX( N-K+1, A( I, K ), LDA )
* .. External Functions ..
LOGICAL SISNAN, LSAME
INTEGER ISAMAX
- REAL SLAMCH
- EXTERNAL SISNAN, LSAME, ISAMAX, SLAMCH
+ REAL SLAMCH, SNRM2
+ EXTERNAL SISNAN, LSAME, ISAMAX, SLAMCH, SNRM2
* ..
* .. External Subroutines ..
EXTERNAL SSCAL, SSWAP, XERBLA
NOCONV = .FALSE.
*
DO 200 I = K, L
- C = ZERO
- R = ZERO
-*
- DO 150 J = K, L
- IF( J.EQ.I )
- $ GO TO 150
- C = C + ABS( A( J, I ) )
- R = R + ABS( A( I, J ) )
- 150 CONTINUE
+*
+ C = SNRM2( L-K+1, A( K, I ), 1 )
+ R = SNRM2( L-K+1, A( I, K ), LDA )
ICA = ISAMAX( L, A( 1, I ), 1 )
CA = ABS( A( ICA, I ) )
IRA = ISAMAX( N-K+1, A( I, K ), LDA )
* .. External Functions ..
LOGICAL DISNAN, LSAME
INTEGER IZAMAX
- DOUBLE PRECISION DLAMCH
- EXTERNAL DISNAN, LSAME, IZAMAX, DLAMCH
+ DOUBLE PRECISION DLAMCH, DZNRM2
+ EXTERNAL DISNAN, LSAME, IZAMAX, DLAMCH, DZNRM2
* ..
* .. External Subroutines ..
EXTERNAL XERBLA, ZDSCAL, ZSWAP
NOCONV = .FALSE.
*
DO 200 I = K, L
- C = ZERO
- R = ZERO
-*
- DO 150 J = K, L
- IF( J.EQ.I )
- $ GO TO 150
- C = C + CABS1( A( J, I ) )
- R = R + CABS1( A( I, J ) )
- 150 CONTINUE
+*
+ C = DZNRM2( L-K+1, A( K, I ), 1 )
+ R = DZNRM2( L-K+1, A( I, K ), LDA )
ICA = IZAMAX( L, A( 1, I ), 1 )
CA = ABS( A( ICA, I ) )
IRA = IZAMAX( N-K+1, A( I, K ), LDA )