fix bug :: in DGESDD, workspace query gives a value smaller than the minimal value...
authorjulie <julielangou@users.noreply.github.com>
Tue, 17 Mar 2009 19:12:22 +0000 (19:12 +0000)
committerjulie <julielangou@users.noreply.github.com>
Tue, 17 Mar 2009 19:12:22 +0000 (19:12 +0000)
    o reported by  Guy Bencteux on Sat Dec 06 2008
    o see forum topic 846 : https://icl.cs.utk.edu/lapack-forum/viewtopic.php?f=2&t=846

remove a min(M,N) in the minimal workspace formula when JOBZ='O' and  JOBZ = 'S' or 'A'.

Note Julie on minimal value:
Case: M > N

IF( M > N*5.0D0  ) THEN
PATH 1 -> FOR JOBZ=N : MINWORK = 7*N + N
PATH 2 -> FOR JOBZ=O: MINWORK = 5*N*N + 7*N
PATH 3 -> FOR JOBZ=S: MINWORK = 4*N*N + 7*N
PATH 4 -> FOR JOBZ=A:  MINWORK = 4*N*N + 7*N

IF M>N (but not too large)
PATH 5 -> FOR JOBZ=N : MINWORK = MAX(7*N,M) + 3*N
PATH 6 -> FOR JOBZ=O: MINWORK = 3*N + MAX (M,4*N*N + 4*N)
PATH 7 -> FOR JOBZ=S : MINWORK = 3*N + MAX (M,3*N*N + 4*N)
PATH 8 -> FOR JOBZ=A :  MINWORK = 3*N + MAX (M,3*N*N + 4*N)

GENERAL FORMULA FROM THE TWO CASES WHEN M>N
FOR N LWORK >= 3*N + max (M,7*N)
FOR O LWORK >= 3*N + max (M,5*N*N + 4*N) [instead of 3*N*N + max (M,5*N*N + 4*N) ]
FOR S ET A LWORK >= 3*N + max(M,4*N*N + 4*N) [instead of 3*N*N + max(M,4*N*N + 4*N) ]

SRC/dgesdd.f
SRC/sgesdd.f

index 192c143..d2f5f84 100644 (file)
@@ -1,9 +1,9 @@
       SUBROUTINE DGESDD( JOBZ, M, N, A, LDA, S, U, LDU, VT, LDVT, WORK,
      $                   LWORK, IWORK, INFO )
 *
-*  -- LAPACK driver routine (version 3.2) --
+*  -- LAPACK driver routine (version 3.2.1) --
 *     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
+*     March 2009
 *
 *     .. Scalar Arguments ..
       CHARACTER          JOBZ
 *          If JOBZ = 'N',
 *            LWORK >= 3*min(M,N) + max(max(M,N),7*min(M,N)).
 *          If JOBZ = 'O',
-*            LWORK >= 3*min(M,N)*min(M,N) + 
+*            LWORK >= 3*min(M,N) + 
 *                     max(max(M,N),5*min(M,N)*min(M,N)+4*min(M,N)).
 *          If JOBZ = 'S' or 'A'
-*            LWORK >= 3*min(M,N)*min(M,N) +
+*            LWORK >= 3*min(M,N) +
 *                     max(max(M,N),4*min(M,N)*min(M,N)+4*min(M,N)).
 *          For good performance, LWORK should generally be larger.
 *          If LWORK = -1 but other input arguments are legal, WORK(1)
index 994fbb9..ee38b90 100644 (file)
@@ -1,9 +1,9 @@
       SUBROUTINE SGESDD( JOBZ, M, N, A, LDA, S, U, LDU, VT, LDVT, WORK,
      $                   LWORK, IWORK, INFO )
 *
-*  -- LAPACK driver routine (version 3.2) --
+*  -- LAPACK driver routine (version 3.2.1) --
 *     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
-*     November 2006
+*     March 2009
 *
 *     .. Scalar Arguments ..
       CHARACTER          JOBZ
 *          If JOBZ = 'N',
 *            LWORK >= 3*min(M,N) + max(max(M,N),6*min(M,N)).
 *          If JOBZ = 'O',
-*            LWORK >= 3*min(M,N)*min(M,N) + 
+*            LWORK >= 3*min(M,N) + 
 *                     max(max(M,N),5*min(M,N)*min(M,N)+4*min(M,N)).
 *          If JOBZ = 'S' or 'A'
-*            LWORK >= 3*min(M,N)*min(M,N) +
+*            LWORK >= 3*min(M,N) +
 *                     max(max(M,N),4*min(M,N)*min(M,N)+4*min(M,N)).
 *          For good performance, LWORK should generally be larger.
 *          If LWORK = -1 but other input arguments are legal, WORK(1)