Correct bug0064 :: got a bug in divide and conquer (non convergence)
authorjulie <julielangou@users.noreply.github.com>
Sun, 7 Nov 2010 18:08:29 +0000 (18:08 +0000)
committerjulie <julielangou@users.noreply.github.com>
Sun, 7 Nov 2010 18:08:29 +0000 (18:08 +0000)
    o see http://icl.cs.utk.edu/lapack-forum/viewtopic.php?f=2&t=529 (forum topic 529)
    o Increase MAXIT to 200 (was 20 before)
    o Add some XERBLA calls when INFO is not zero.

SRC/dlasd4.f
SRC/dlasd6.f
SRC/dlasd8.f
SRC/slasd4.f
SRC/slasd6.f
SRC/slasd8.f

index 666e35a..95f1bdc 100644 (file)
@@ -95,7 +95,7 @@
 *
 *     .. Parameters ..
       INTEGER            MAXIT
-      PARAMETER          ( MAXIT = 20 )
+      PARAMETER          ( MAXIT = 200 )
       DOUBLE PRECISION   ZERO, ONE, TWO, THREE, FOUR, EIGHT, TEN
       PARAMETER          ( ZERO = 0.0D+0, ONE = 1.0D+0, TWO = 2.0D+0,
      $                   THREE = 3.0D+0, FOUR = 4.0D+0, EIGHT = 8.0D+0,
index 99b99e1..0dcdb80 100644 (file)
       CALL DLASD8( ICOMPQ, K, D, Z, VF, VL, DIFL, DIFR, LDGNUM,
      $             WORK( ISIGMA ), WORK( IW ), INFO )
 *
+*     Handle error returned
+*
+      IF( INFO.NE.0 ) THEN
+         CALL XERBLA( 'DLASD8', -INFO )
+         RETURN
+      END IF
+*
 *     Save the poles if ICOMPQ = 1.
 *
       IF( ICOMPQ.EQ.1 ) THEN
index 265ebaa..98438f7 100644 (file)
 *        If the root finder fails, the computation is terminated.
 *
          IF( INFO.NE.0 ) THEN
+            CALL XERBLA( 'DLASD4', -INFO )
             RETURN
          END IF
          WORK( IWK3I+J ) = WORK( IWK3I+J )*WORK( J )*WORK( IWK2I+J )
index d976327..d6322c1 100644 (file)
@@ -95,7 +95,7 @@
 *
 *     .. Parameters ..
       INTEGER            MAXIT
-      PARAMETER          ( MAXIT = 20 )
+      PARAMETER          ( MAXIT = 200 )
       REAL               ZERO, ONE, TWO, THREE, FOUR, EIGHT, TEN
       PARAMETER          ( ZERO = 0.0E+0, ONE = 1.0E+0, TWO = 2.0E+0,
      $                   THREE = 3.0E+0, FOUR = 4.0E+0, EIGHT = 8.0E+0,
index aee5285..e63dffe 100644 (file)
       CALL SLASD8( ICOMPQ, K, D, Z, VF, VL, DIFL, DIFR, LDGNUM,
      $             WORK( ISIGMA ), WORK( IW ), INFO )
 *
+*     Handle error returned
+*
+      IF( INFO.NE.0 ) THEN
+         CALL XERBLA( 'SLASD8', -INFO )
+         RETURN
+      END IF
+*
 *     Save the poles if ICOMPQ = 1.
 *
       IF( ICOMPQ.EQ.1 ) THEN
index b337828..ec7774f 100644 (file)
 *        If the root finder fails, the computation is terminated.
 *
          IF( INFO.NE.0 ) THEN
+            CALL XERBLA( 'SLASD4', -INFO )
             RETURN
          END IF
          WORK( IWK3I+J ) = WORK( IWK3I+J )*WORK( J )*WORK( IWK2I+J )