Fix bug0048-Hanging could occur in *gebal if a NaN is in input matrix sent by Alexand...
authorjulie <julielangou@users.noreply.github.com>
Thu, 18 Mar 2010 19:31:57 +0000 (19:31 +0000)
committerjulie <julielangou@users.noreply.github.com>
Thu, 18 Mar 2010 19:31:57 +0000 (19:31 +0000)
SRC/cgebal.f
SRC/dgebal.f
SRC/sgebal.f
SRC/zgebal.f

index 8708638b529fc5c16f4f213a62671f04a333b69d..c8c3e99a77504a63fcbe9c87dfd0488912881d18 100644 (file)
       COMPLEX            CDUM
 *     ..
 *     .. External Functions ..
-      LOGICAL            LSAME
+      LOGICAL            SISNAN, LSAME
       INTEGER            ICAMAX
       REAL               SLAMCH
-      EXTERNAL           LSAME, ICAMAX, SLAMCH
+      EXTERNAL           SISNAN, LSAME, ICAMAX, SLAMCH
 *     ..
 *     .. External Subroutines ..
       EXTERNAL           CSSCAL, CSWAP, XERBLA
   160    CONTINUE
          IF( C.GE.G .OR. MAX( F, C, CA ).GE.SFMAX2 .OR.
      $       MIN( R, G, RA ).LE.SFMIN2 )GO TO 170
+               IF( SISNAN( C+F+CA+R+G+RA ) ) THEN
+*
+*           Exit if NaN to avoid infinite loop
+*
+            INFO = -3
+            CALL XERBLA( 'CGEBAL', -INFO )
+            RETURN
+         END IF
          F = F*SCLFAC
          C = C*SCLFAC
          CA = CA*SCLFAC
index 9056e77839e6d0c87f54ac273389ca13e95526f5..56bc6e9e80a00d20fb4eee91019868882c032ee1 100644 (file)
      $                   SFMIN2
 *     ..
 *     .. External Functions ..
-      LOGICAL            LSAME
+      LOGICAL            DISNAN, LSAME
       INTEGER            IDAMAX
       DOUBLE PRECISION   DLAMCH
-      EXTERNAL           LSAME, IDAMAX, DLAMCH
+      EXTERNAL           DISNAN, LSAME, IDAMAX, DLAMCH
 *     ..
 *     .. External Subroutines ..
       EXTERNAL           DSCAL, DSWAP, XERBLA
   160    CONTINUE
          IF( C.GE.G .OR. MAX( F, C, CA ).GE.SFMAX2 .OR.
      $       MIN( R, G, RA ).LE.SFMIN2 )GO TO 170
+            IF( DISNAN( C+F+CA+R+G+RA ) ) THEN
+*
+*           Exit if NaN to avoid infinite loop
+*
+            INFO = -3
+            CALL XERBLA( 'DGEBAL', -INFO )
+            RETURN
+         END IF
          F = F*SCLFAC
          C = C*SCLFAC
          CA = CA*SCLFAC
index d4df3c672fc93ab5ff3530ba07379f765cf1cdff..b780ae7b705692b70227e638dfaac71f1e9ccacd 100644 (file)
      $                   SFMIN2
 *     ..
 *     .. External Functions ..
-      LOGICAL            LSAME
+      LOGICAL            SISNAN, LSAME
       INTEGER            ISAMAX
       REAL               SLAMCH
-      EXTERNAL           LSAME, ISAMAX, SLAMCH
+      EXTERNAL           SISNAN, LSAME, ISAMAX, SLAMCH
 *     ..
 *     .. External Subroutines ..
       EXTERNAL           SSCAL, SSWAP, XERBLA
   180    CONTINUE
          IF( G.LT.R .OR. MAX( R, RA ).GE.SFMAX2 .OR.
      $       MIN( F, C, G, CA ).LE.SFMIN2 )GO TO 190
+            IF( SISNAN( C+F+CA+R+G+RA ) ) THEN
+*
+*           Exit if NaN to avoid infinite loop
+*
+            INFO = -3
+            CALL XERBLA( 'SGEBAL', -INFO )
+            RETURN
+         END IF
          F = F / SCLFAC
          C = C / SCLFAC
          G = G / SCLFAC
index 305bb5509c1d546c18e0f1cfbba715e4b6067c48..7def8c79fdc1891a5e15153a4ec4db91496dee4f 100644 (file)
       COMPLEX*16         CDUM
 *     ..
 *     .. External Functions ..
-      LOGICAL            LSAME
+      LOGICAL            DISNAN, LSAME
       INTEGER            IZAMAX
       DOUBLE PRECISION   DLAMCH
-      EXTERNAL           LSAME, IZAMAX, DLAMCH
+      EXTERNAL           DISNAN, LSAME, IZAMAX, DLAMCH
 *     ..
 *     .. External Subroutines ..
       EXTERNAL           XERBLA, ZDSCAL, ZSWAP
   160    CONTINUE
          IF( C.GE.G .OR. MAX( F, C, CA ).GE.SFMAX2 .OR.
      $       MIN( R, G, RA ).LE.SFMIN2 )GO TO 170
+            IF( DISNAN( C+F+CA+R+G+RA ) ) THEN
+*
+*           Exit if NaN to avoid infinite loop
+*
+            INFO = -3
+            CALL XERBLA( 'ZGEBAL', -INFO )
+            RETURN
+         END IF
          F = F*SCLFAC
          C = C*SCLFAC
          CA = CA*SCLFAC