Now using 2-norm to compute vector norms of row and column for balancing algorithm.
authorjames <james@8a072113-8704-0410-8d35-dd094bca7971>
Thu, 16 May 2013 18:55:48 +0000 (18:55 +0000)
committerjames <james@8a072113-8704-0410-8d35-dd094bca7971>
Thu, 16 May 2013 18:55:48 +0000 (18:55 +0000)
This seems to fix problems with balancing causing very large backward error for certain
Hessenberg matrices, including the often cited example of Watkins.

SRC/cgebal.f
SRC/dgebal.f
SRC/sgebal.f
SRC/zgebal.f

index 4bb5a2f0be22096191e3ccfc87a70d49ce8841b8..47207ea3084d55eda704a9d065e7ae7c73ee6616 100644 (file)
 *     .. 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 )
index 5d7ed035c3465717eecfbd6fc99af40ea9cb47e9..fe4c156bdd182db7d1c9a0229a4ece70cbc20247 100644 (file)
 *     .. 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 )
index 853ff20e27ddacb5603a7a433bf21f3b10aa1d4a..de948488353d023023abc953af394f0d5c9d257a 100644 (file)
 *     .. 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 )
index 9c90f0b4b5f4b2d4f4c26315ab2cafb0d60f6bab..aa4f6d0e7c9fc42bc508589bd25f48af9d76fc9d 100644 (file)
 *     .. 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 )