Correct workspace computation for [s/d]gesvdx.f
authorlangou <langou@users.noreply.github.com>
Sat, 21 Nov 2015 04:55:02 +0000 (04:55 +0000)
committerlangou <langou@users.noreply.github.com>
Sat, 21 Nov 2015 04:55:02 +0000 (04:55 +0000)
See thread: http://icl.cs.utk.edu/lapack-forum/viewtopic.php?t=4850
From Lawrence Mulholland (NAG)
Thanks Lawrence!

SRC/dgesvdx.f
SRC/sgesvdx.f

index dd333451d4f6a5d0b5b63c77cd0f2177c2ccdf31..8b1fea35ff3da204d0b4f790fc19e4a8346fbd34 100644 (file)
 *
 *                 Path 1 (M much larger than N)
 *
-                  MAXWRK = N*(N*2+16) + 
+                  MAXWRK = N + 
      $                     N*ILAENV( 1, 'DGEQRF', ' ', M, N, -1, -1 )
-                  MAXWRK = MAX( MAXWRK, N*(N*2+20) + 2*N*
+                  MAXWRK = MAX( MAXWRK, N*(N+5) + 2*N*
      $                     ILAENV( 1, 'DGEBRD', ' ', N, N, -1, -1 ) )
-                  MINWRK = N*(N*2+21)
+                  IF (WANTU) THEN
+                      MAXWRK = MAX(MAXWRK,N*(N*3+6)+N*
+     $                     ILAENV( 1, 'DORMQR', ' ', N, N, -1, -1 ) )
+                  END IF
+                  IF (WANTVT) THEN
+                      MAXWRK = MAX(MAXWRK,N*(N*3+6)+N*
+     $                     ILAENV( 1, 'DORMLQ', ' ', N, N, -1, -1 ) )
+                  END IF
+                  MINWRK = N*(N*3+20)
                ELSE
 *
 *                 Path 2 (M at least N, but not much larger)
 *
-                  MAXWRK = N*(N*2+19) + ( M+N )*
+                  MAXWRK = 4*N + ( M+N )*
      $                     ILAENV( 1, 'DGEBRD', ' ', M, N, -1, -1 )
-                  MINWRK = N*(N*2+20) + M
+                  IF (WANTU) THEN
+                      MAXWRK = MAX(MAXWRK,N*(N*2+5)+N*
+     $                     ILAENV( 1, 'DORMQR', ' ', N, N, -1, -1 ) )
+                  END IF
+                  IF (WANTVT) THEN
+                      MAXWRK = MAX(MAXWRK,N*(N*2+5)+N*
+     $                     ILAENV( 1, 'DORMLQ', ' ', N, N, -1, -1 ) )
+                  END IF
+                  MINWRK = MAX(N*(N*2+19),4*N+M)
                END IF
             ELSE
                MNTHR = ILAENV( 6, 'DGESVD', JOBU // JOBVT, M, N, 0, 0 )
 *
 *                 Path 1t (N much larger than M)
 *
-                  MAXWRK = M*(M*2+16) + 
+                  MAXWRK = M + 
      $                     M*ILAENV( 1, 'DGELQF', ' ', M, N, -1, -1 )
-                  MAXWRK = MAX( MAXWRK, M*(M*2+20) + 2*M*
+                  MAXWRK = MAX( MAXWRK, M*(M+5) + 2*M*
      $                     ILAENV( 1, 'DGEBRD', ' ', M, M, -1, -1 ) )
-                  MINWRK = M*(M*2+21)
+                  IF (WANTU) THEN
+                      MAXWRK = MAX(MAXWRK,M*(M*3+6)+M*
+     $                     ILAENV( 1, 'DORMQR', ' ', M, M, -1, -1 ) )
+                  END IF
+                  IF (WANTVT) THEN
+                      MAXWRK = MAX(MAXWRK,M*(M*3+6)+M*
+     $                     ILAENV( 1, 'DORMLQ', ' ', M, M, -1, -1 ) )
+                  END IF
+                  MINWRK = M*(M*3+20)
                ELSE
 *
-*                 Path 2t (N greater than M, but not much larger)
+*                 Path 2t (N at least M, but not much larger)
 *
-                  MAXWRK = M*(M*2+19) + ( M+N )*
+                  MAXWRK = 4*M + ( M+N )*
      $                     ILAENV( 1, 'DGEBRD', ' ', M, N, -1, -1 )
-                  MINWRK = M*(M*2+20) + N
+                  IF (WANTU) THEN
+                      MAXWRK = MAX(MAXWRK,M*(M*2+5)+M*
+     $                     ILAENV( 1, 'DORMQR', ' ', M, M, -1, -1 ) )
+                  END IF
+                  IF (WANTVT) THEN
+                      MAXWRK = MAX(MAXWRK,M*(M*2+5)+M*
+     $                     ILAENV( 1, 'DORMLQ', ' ', M, M, -1, -1 ) )
+                  END IF
+                  MINWRK = MAX(M*(M*2+19),4*M+N)
                END IF
             END IF
          END IF
index dcb88115d53720c1c243fa4e8653676084acb225..8e439fff6d2cec3ffd295fbacf924b98437d8871 100644 (file)
 *
 *                 Path 1 (M much larger than N)
 *
-                  MAXWRK = N*(N*2+16) + 
+                  MAXWRK = N + 
      $                     N*ILAENV( 1, 'SGEQRF', ' ', M, N, -1, -1 )
-                  MAXWRK = MAX( MAXWRK, N*(N*2+20) + 2*N*
+                  MAXWRK = MAX( MAXWRK, N*(N+5) + 2*N*
      $                     ILAENV( 1, 'SGEBRD', ' ', N, N, -1, -1 ) )
-                  MINWRK = N*(N*2+21)
+                  IF (WANTU) THEN
+                      MAXWRK = MAX(MAXWRK,N*(N*3+6)+N*
+     $                     ILAENV( 1, 'SORMQR', ' ', N, N, -1, -1 ) )
+                  END IF
+                  IF (WANTVT) THEN
+                      MAXWRK = MAX(MAXWRK,N*(N*3+6)+N*
+     $                     ILAENV( 1, 'SORMLQ', ' ', N, N, -1, -1 ) )
+                  END IF
+                  MINWRK = N*(N*3+20)
                ELSE
 *
 *                 Path 2 (M at least N, but not much larger)
 *
-                  MAXWRK = N*(N*2+19) + ( M+N )*
+                  MAXWRK = 4*N + ( M+N )*
      $                     ILAENV( 1, 'SGEBRD', ' ', M, N, -1, -1 )
-                  MINWRK = N*(N*2+20) + M
+                  IF (WANTU) THEN
+                      MAXWRK = MAX(MAXWRK,N*(N*2+5)+N*
+     $                     ILAENV( 1, 'SORMQR', ' ', N, N, -1, -1 ) )
+                  END IF
+                  IF (WANTVT) THEN
+                      MAXWRK = MAX(MAXWRK,N*(N*2+5)+N*
+     $                     ILAENV( 1, 'SORMLQ', ' ', N, N, -1, -1 ) )
+                  END IF
+                  MINWRK = MAX(N*(N*2+19),4*N+M)
                END IF
             ELSE
                MNTHR = ILAENV( 6, 'SGESVD', JOBU // JOBVT, M, N, 0, 0 )
 *
 *                 Path 1t (N much larger than M)
 *
-                  MAXWRK = M*(M*2+16) + 
+                  MAXWRK = M + 
      $                     M*ILAENV( 1, 'SGELQF', ' ', M, N, -1, -1 )
-                  MAXWRK = MAX( MAXWRK, M*(M*2+20) + 2*M*
+                  MAXWRK = MAX( MAXWRK, M*(M+5) + 2*M*
      $                     ILAENV( 1, 'SGEBRD', ' ', M, M, -1, -1 ) )
-                  MINWRK = M*(M*2+21)
+                  IF (WANTU) THEN
+                      MAXWRK = MAX(MAXWRK,M*(M*3+6)+M*
+     $                     ILAENV( 1, 'SORMQR', ' ', M, M, -1, -1 ) )
+                  END IF
+                  IF (WANTVT) THEN
+                      MAXWRK = MAX(MAXWRK,M*(M*3+6)+M*
+     $                     ILAENV( 1, 'SORMLQ', ' ', M, M, -1, -1 ) )
+                  END IF
+                  MINWRK = M*(M*3+20)
                ELSE
 *
-*                 Path 2t (N greater than M, but not much larger)
+*                 Path 2t (N at least M, but not much larger)
 *
-                  MAXWRK = M*(M*2+19) + ( M+N )*
+                  MAXWRK = 4*M + ( M+N )*
      $                     ILAENV( 1, 'SGEBRD', ' ', M, N, -1, -1 )
-                  MINWRK = M*(M*2+20) + N
+                  IF (WANTU) THEN
+                      MAXWRK = MAX(MAXWRK,M*(M*2+5)+M*
+     $                     ILAENV( 1, 'SORMQR', ' ', M, M, -1, -1 ) )
+                  END IF
+                  IF (WANTVT) THEN
+                      MAXWRK = MAX(MAXWRK,M*(M*2+5)+M*
+     $                     ILAENV( 1, 'SORMLQ', ' ', M, M, -1, -1 ) )
+                  END IF
+                  MINWRK = MAX(M*(M*2+19),4*M+N)
                END IF
             END IF
          END IF