Corrected a bug in SBDSDC and DBDSDC.
authorlangou <langou@users.noreply.github.com>
Tue, 22 Jun 2010 22:08:36 +0000 (22:08 +0000)
committerlangou <langou@users.noreply.github.com>
Tue, 22 Jun 2010 22:08:36 +0000 (22:08 +0000)
The routine was returning with INFO = 0 while a failure of convergence should
have been reported with INFO > 0.

The bug has been around for quite a while and has been difficult to reproduce.

More information:

(*) bug0025 :: serious problem in DGESDD: DGESDD returns negative singular values with INFO = 0

    o reported by Guy Bencteux on Sat Dec 06 2008
    o see forum topic 847
    o Julie : CANNOT REPRODUCE THE PROBLEM

    o on Sat Jun 19 2010, Bruno Pinçon from ESIAL, reported another matrix with the same problems
    o see forum topic 1868
    o we can reproduce the problem with on MacOS with gfortran reference LAPACK
      and vecLib BLAS, we can not reproduce the problem with reference LAPACK and reference BLAS.
    o A patch has been proposed by Julien Langou. (See forum topic 1868.)
    o Under review by other lapackers.
    o Note: there is strong evidence that the bug of Guy Bencteux and this one
      are the same, although we were never able to reproduce Guy's problem. So
      we assume Guy's problem gone! (And send an email to Guy to inform him.)

SRC/dbdsdc.f
SRC/sbdsdc.f

index 4018526864776b028751f026fb0a8fefc6366c26..0af80cbdaa19261de3246c7289c08e33f7691f8a 100644 (file)
      $                      Q( START+( IC+QSTART-2 )*N ),
      $                      Q( START+( IS+QSTART-2 )*N ),
      $                      WORK( WSTART ), IWORK, INFO )
-               IF( INFO.NE.0 ) THEN
-                  RETURN
-               END IF
+            END IF
+            IF( INFO.NE.0 ) THEN
+               RETURN
             END IF
             START = I + 1
          END IF
index 31c51a4fc230b04c4a0358345e5b9ea8fc4ac49b..58f08f591a55d78a1cda03bc8f1a629aaf51fb9b 100644 (file)
      $                      Q( START+( IC+QSTART-2 )*N ),
      $                      Q( START+( IS+QSTART-2 )*N ),
      $                      WORK( WSTART ), IWORK, INFO )
-               IF( INFO.NE.0 ) THEN
-                  RETURN
-               END IF
+            END IF
+            IF( INFO.NE.0 ) THEN
+               RETURN
             END IF
             START = I + 1
          END IF