From 1d4ed33a5cfc65afcd46a0babb74979dfbed73f3 Mon Sep 17 00:00:00 2001 From: julie Date: Tue, 17 Mar 2009 19:12:22 +0000 Subject: [PATCH] fix bug :: in DGESDD, workspace query gives a value smaller than the minimal value given in the header to run the routine 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 | 8 ++++---- SRC/sgesdd.f | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/SRC/dgesdd.f b/SRC/dgesdd.f index 192c143..d2f5f84 100644 --- a/SRC/dgesdd.f +++ b/SRC/dgesdd.f @@ -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 @@ -117,10 +117,10 @@ * 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) diff --git a/SRC/sgesdd.f b/SRC/sgesdd.f index 994fbb9..ee38b90 100644 --- a/SRC/sgesdd.f +++ b/SRC/sgesdd.f @@ -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 @@ -117,10 +117,10 @@ * 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) -- 2.7.4