From b073e7b969d2e425483a2225aba8f78f9fef3c0f Mon Sep 17 00:00:00 2001
From: Thijs Steel <thijs.steel@kuleuven.be>
Date: Wed, 16 Sep 2020 12:14:21 +0200
Subject: [PATCH 7/8] fix workspace query in dgelq

---
 SRC/cgelq.f   | 28 ++++++++++++++++++++--------
 SRC/cgetsls.f |  2 +-
 SRC/dgelq.f   | 28 ++++++++++++++++++++--------
 SRC/dgetsls.f |  2 +-
 SRC/sgelq.f   | 28 ++++++++++++++++++++--------
 SRC/sgetsls.f |  2 +-
 SRC/zgelq.f   | 28 ++++++++++++++++++++--------
 SRC/zgetsls.f |  2 +-
 8 files changed, 84 insertions(+), 36 deletions(-)

diff --git a/SRC/cgelq.f b/SRC/cgelq.f
index c3b2238b..0c8a18ed 100644
--- a/SRC/cgelq.f
+++ b/SRC/cgelq.f
@@ -187,7 +187,7 @@
 *     ..
 *     .. Local Scalars ..
       LOGICAL            LQUERY, LMINWS, MINT, MINW
-      INTEGER            MB, NB, MINTSZ, NBLCKS
+      INTEGER            MB, NB, MINTSZ, NBLCKS, LWMIN, LWOPT, LWREQ
 *     ..
 *     .. External Functions ..
       LOGICAL            LSAME
@@ -243,20 +243,32 @@
 *
 *     Determine if the workspace size satisfies minimal size
 *
+      IF( ( N.LE.M ) .OR. ( NB.LE.M ) .OR. ( NB.GE.N ) ) THEN
+         LWMIN = MAX( 1, N )
+         LWOPT = MAX( 1, MB*N )
+      ELSE
+         LWMIN = MAX( 1, M )
+         LWOPT = MAX( 1, MB*M )
+      END IF
       LMINWS = .FALSE.
-      IF( ( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 ) .OR. LWORK.LT.MB*M )
-     $    .AND. ( LWORK.GE.M ) .AND. ( TSIZE.GE.MINTSZ )
+      IF( ( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 ) .OR. LWORK.LT.LWOPT )
+     $    .AND. ( LWORK.GE.LWMIN ) .AND. ( TSIZE.GE.MINTSZ )
      $    .AND. ( .NOT.LQUERY ) ) THEN
         IF( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 ) ) THEN
           LMINWS = .TRUE.
           MB = 1
           NB = N
         END IF
-        IF( LWORK.LT.MB*M ) THEN
+        IF( LWORK.LT.LWOPT ) THEN
           LMINWS = .TRUE.
           MB = 1
         END IF
       END IF
+      IF( ( N.LE.M ) .OR. ( NB.LE.M ) .OR. ( NB.GE.N ) ) THEN
+         LWREQ = MAX( 1, MB*N )
+      ELSE
+         LWREQ = MAX( 1, MB*M )
+      END IF
 *
       IF( M.LT.0 ) THEN
         INFO = -1
@@ -267,7 +279,7 @@
       ELSE IF( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 )
      $   .AND. ( .NOT.LQUERY ) .AND. ( .NOT.LMINWS ) ) THEN
         INFO = -6
-      ELSE IF( ( LWORK.LT.MAX( 1, M*MB ) ) .AND .( .NOT.LQUERY )
+      ELSE IF( ( LWORK.LT.LWREQ ) .AND .( .NOT.LQUERY )
      $   .AND. ( .NOT.LMINWS ) ) THEN
         INFO = -8
       END IF
@@ -281,9 +293,9 @@
         T( 2 ) = MB
         T( 3 ) = NB
         IF( MINW ) THEN
-          WORK( 1 ) = MAX( 1, N )
+          WORK( 1 ) = LWMIN
         ELSE
-          WORK( 1 ) = MAX( 1, MB*M )
+          WORK( 1 ) = LWREQ
         END IF
       END IF
       IF( INFO.NE.0 ) THEN
@@ -308,7 +320,7 @@
      $                LWORK, INFO )
       END IF
 *
-      WORK( 1 ) = MAX( 1, MB*M )
+      WORK( 1 ) = LWREQ
 *
       RETURN
 *
diff --git a/SRC/cgetsls.f b/SRC/cgetsls.f
index 3d783be6..01de3c98 100644
--- a/SRC/cgetsls.f
+++ b/SRC/cgetsls.f
@@ -261,7 +261,7 @@
          TSZM = INT( TQ( 1 ) )
          LWM  = INT( WORKQ( 1 ) )
          CALL CGEMLQ( 'L', TRANS, N, NRHS, M, A, LDA, TQ,
-     $                TSZO, B, LDB, WORKQ, -1, INFO2 )
+     $                TSZM, B, LDB, WORKQ, -1, INFO2 )
          LWM  = MAX( LWM, INT( WORKQ( 1 ) ) )
          WSIZEO = TSZO + LWO
          WSIZEM = TSZM + LWM
diff --git a/SRC/dgelq.f b/SRC/dgelq.f
index fc14d892..cae24cfc 100644
--- a/SRC/dgelq.f
+++ b/SRC/dgelq.f
@@ -187,7 +187,7 @@
 *     ..
 *     .. Local Scalars ..
       LOGICAL            LQUERY, LMINWS, MINT, MINW
-      INTEGER            MB, NB, MINTSZ, NBLCKS
+      INTEGER            MB, NB, MINTSZ, NBLCKS, LWMIN, LWOPT, LWREQ
 *     ..
 *     .. External Functions ..
       LOGICAL            LSAME
@@ -243,20 +243,32 @@
 *
 *     Determine if the workspace size satisfies minimal size
 *
+      IF( ( N.LE.M ) .OR. ( NB.LE.M ) .OR. ( NB.GE.N ) ) THEN
+         LWMIN = MAX( 1, N )
+         LWOPT = MAX( 1, MB*N )
+      ELSE
+         LWMIN = MAX( 1, M )
+         LWOPT = MAX( 1, MB*M )
+      END IF
       LMINWS = .FALSE.
-      IF( ( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 ) .OR. LWORK.LT.MB*M )
-     $    .AND. ( LWORK.GE.M ) .AND. ( TSIZE.GE.MINTSZ )
+      IF( ( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 ) .OR. LWORK.LT.LWOPT )
+     $    .AND. ( LWORK.GE.LWMIN ) .AND. ( TSIZE.GE.MINTSZ )
      $    .AND. ( .NOT.LQUERY ) ) THEN
         IF( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 ) ) THEN
             LMINWS = .TRUE.
             MB = 1
             NB = N
         END IF
-        IF( LWORK.LT.MB*M ) THEN
+        IF( LWORK.LT.LWOPT ) THEN
             LMINWS = .TRUE.
             MB = 1
         END IF
       END IF
+      IF( ( N.LE.M ) .OR. ( NB.LE.M ) .OR. ( NB.GE.N ) ) THEN
+         LWREQ = MAX( 1, MB*N )
+      ELSE
+         LWREQ = MAX( 1, MB*M )
+      END IF
 *
       IF( M.LT.0 ) THEN
         INFO = -1
@@ -267,7 +279,7 @@
       ELSE IF( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 )
      $   .AND. ( .NOT.LQUERY ) .AND. ( .NOT.LMINWS ) ) THEN
         INFO = -6
-      ELSE IF( ( LWORK.LT.MAX( 1, M*MB ) ) .AND .( .NOT.LQUERY )
+      ELSE IF( ( LWORK.LT.LWREQ ) .AND .( .NOT.LQUERY )
      $   .AND. ( .NOT.LMINWS ) ) THEN
         INFO = -8
       END IF
@@ -281,9 +293,9 @@
         T( 2 ) = MB
         T( 3 ) = NB
         IF( MINW ) THEN
-          WORK( 1 ) = MAX( 1, N )
+          WORK( 1 ) = LWMIN
         ELSE
-          WORK( 1 ) = MAX( 1, MB*M )
+          WORK( 1 ) = LWREQ
         END IF
       END IF
       IF( INFO.NE.0 ) THEN
@@ -308,7 +320,7 @@
      $                LWORK, INFO )
       END IF
 *
-      WORK( 1 ) = MAX( 1, MB*M )
+      WORK( 1 ) = LWREQ
 *
       RETURN
 *
diff --git a/SRC/dgetsls.f b/SRC/dgetsls.f
index dfc72c8b..c2ba5e2b 100644
--- a/SRC/dgetsls.f
+++ b/SRC/dgetsls.f
@@ -258,7 +258,7 @@
          TSZM = INT( TQ( 1 ) )
          LWM  = INT( WORKQ( 1 ) )
          CALL DGEMLQ( 'L', TRANS, N, NRHS, M, A, LDA, TQ,
-     $                TSZO, B, LDB, WORKQ, -1, INFO2 )
+     $                TSZM, B, LDB, WORKQ, -1, INFO2 )
          LWM  = MAX( LWM, INT( WORKQ( 1 ) ) )
          WSIZEO = TSZO + LWO
          WSIZEM = TSZM + LWM
diff --git a/SRC/sgelq.f b/SRC/sgelq.f
index 96c4097e..aadf1412 100644
--- a/SRC/sgelq.f
+++ b/SRC/sgelq.f
@@ -187,7 +187,7 @@
 *     ..
 *     .. Local Scalars ..
       LOGICAL            LQUERY, LMINWS, MINT, MINW
-      INTEGER            MB, NB, MINTSZ, NBLCKS
+      INTEGER            MB, NB, MINTSZ, NBLCKS, LWMIN, LWOPT, LWREQ
 *     ..
 *     .. External Functions ..
       LOGICAL            LSAME
@@ -243,20 +243,32 @@
 *
 *     Determine if the workspace size satisfies minimal size
 *
+      IF( ( N.LE.M ) .OR. ( NB.LE.M ) .OR. ( NB.GE.N ) ) THEN
+         LWMIN = MAX( 1, N )
+         LWOPT = MAX( 1, MB*N )
+      ELSE
+         LWMIN = MAX( 1, M )
+         LWOPT = MAX( 1, MB*M )
+      END IF
       LMINWS = .FALSE.
-      IF( ( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 ) .OR. LWORK.LT.MB*M )
-     $    .AND. ( LWORK.GE.M ) .AND. ( TSIZE.GE.MINTSZ )
+      IF( ( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 ) .OR. LWORK.LT.LWOPT )
+     $    .AND. ( LWORK.GE.LWMIN ) .AND. ( TSIZE.GE.MINTSZ )
      $    .AND. ( .NOT.LQUERY ) ) THEN
         IF( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 ) ) THEN
           LMINWS = .TRUE.
           MB = 1
           NB = N
         END IF
-        IF( LWORK.LT.MB*M ) THEN
+        IF( LWORK.LT.LWOPT ) THEN
           LMINWS = .TRUE.
           MB = 1
         END IF
       END IF
+      IF( ( N.LE.M ) .OR. ( NB.LE.M ) .OR. ( NB.GE.N ) ) THEN
+         LWREQ = MAX( 1, MB*N )
+      ELSE
+         LWREQ = MAX( 1, MB*M )
+      END IF
 *
       IF( M.LT.0 ) THEN
         INFO = -1
@@ -267,7 +279,7 @@
       ELSE IF( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 )
      $   .AND. ( .NOT.LQUERY ) .AND. ( .NOT.LMINWS ) ) THEN
         INFO = -6
-      ELSE IF( ( LWORK.LT.MAX( 1, M*MB ) ) .AND .( .NOT.LQUERY )
+      ELSE IF( ( LWORK.LT.LWREQ ) .AND .( .NOT.LQUERY )
      $   .AND. ( .NOT.LMINWS ) ) THEN
         INFO = -8
       END IF
@@ -281,9 +293,9 @@
         T( 2 ) = MB
         T( 3 ) = NB
         IF( MINW ) THEN
-          WORK( 1 ) = MAX( 1, N )
+          WORK( 1 ) = LWMIN
         ELSE
-          WORK( 1 ) = MAX( 1, MB*M )
+          WORK( 1 ) = LWREQ
         END IF
       END IF
       IF( INFO.NE.0 ) THEN
@@ -308,7 +320,7 @@
      $                LWORK, INFO )
       END IF
 *
-      WORK( 1 ) = MAX( 1, MB*M )
+      WORK( 1 ) = LWREQ
       RETURN
 *
 *     End of SGELQ
diff --git a/SRC/sgetsls.f b/SRC/sgetsls.f
index 53d2f943..3bf08451 100644
--- a/SRC/sgetsls.f
+++ b/SRC/sgetsls.f
@@ -258,7 +258,7 @@
          TSZM = INT( TQ( 1 ) )
          LWM  = INT( WORKQ( 1 ) )
          CALL SGEMLQ( 'L', TRANS, N, NRHS, M, A, LDA, TQ,
-     $                TSZO, B, LDB, WORKQ, -1, INFO2 )
+     $                TSZM, B, LDB, WORKQ, -1, INFO2 )
          LWM  = MAX( LWM, INT( WORKQ( 1 ) ) )
          WSIZEO = TSZO + LWO
          WSIZEM = TSZM + LWM
diff --git a/SRC/zgelq.f b/SRC/zgelq.f
index 4e7e7e38..e0e7512a 100644
--- a/SRC/zgelq.f
+++ b/SRC/zgelq.f
@@ -187,7 +187,7 @@
 *     ..
 *     .. Local Scalars ..
       LOGICAL            LQUERY, LMINWS, MINT, MINW
-      INTEGER            MB, NB, MINTSZ, NBLCKS
+      INTEGER            MB, NB, MINTSZ, NBLCKS, LWMIN, LWOPT, LWREQ
 *     ..
 *     .. External Functions ..
       LOGICAL            LSAME
@@ -243,20 +243,32 @@
 *
 *     Determine if the workspace size satisfies minimal size
 *
+      IF( ( N.LE.M ) .OR. ( NB.LE.M ) .OR. ( NB.GE.N ) ) THEN
+         LWMIN = MAX( 1, N )
+         LWOPT = MAX( 1, MB*N )
+      ELSE
+         LWMIN = MAX( 1, M )
+         LWOPT = MAX( 1, MB*M )
+      END IF
       LMINWS = .FALSE.
-      IF( ( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 ) .OR. LWORK.LT.MB*M )
-     $    .AND. ( LWORK.GE.M ) .AND. ( TSIZE.GE.MINTSZ )
+      IF( ( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 ) .OR. LWORK.LT.LWOPT )
+     $    .AND. ( LWORK.GE.LWMIN ) .AND. ( TSIZE.GE.MINTSZ )
      $    .AND. ( .NOT.LQUERY ) ) THEN
         IF( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 ) ) THEN
             LMINWS = .TRUE.
             MB = 1
             NB = N
         END IF
-        IF( LWORK.LT.MB*M ) THEN
+        IF( LWORK.LT.LWOPT ) THEN
             LMINWS = .TRUE.
             MB = 1
         END IF
       END IF
+      IF( ( N.LE.M ) .OR. ( NB.LE.M ) .OR. ( NB.GE.N ) ) THEN
+         LWREQ = MAX( 1, MB*N )
+      ELSE
+         LWREQ = MAX( 1, MB*M )
+      END IF
 *
       IF( M.LT.0 ) THEN
         INFO = -1
@@ -267,7 +279,7 @@
       ELSE IF( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 )
      $   .AND. ( .NOT.LQUERY ) .AND. ( .NOT.LMINWS ) ) THEN
         INFO = -6
-      ELSE IF( ( LWORK.LT.MAX( 1, M*MB ) ) .AND .( .NOT.LQUERY )
+      ELSE IF( ( LWORK.LT.LWREQ ) .AND .( .NOT.LQUERY )
      $   .AND. ( .NOT.LMINWS ) ) THEN
         INFO = -8
       END IF
@@ -281,9 +293,9 @@
         T( 2 ) = MB
         T( 3 ) = NB
         IF( MINW ) THEN
-          WORK( 1 ) = MAX( 1, N )
+          WORK( 1 ) = LWMIN
         ELSE
-          WORK( 1 ) = MAX( 1, MB*M )
+          WORK( 1 ) = LWREQ
         END IF
       END IF
       IF( INFO.NE.0 ) THEN
@@ -308,7 +320,7 @@
      $                LWORK, INFO )
       END IF
 *
-      WORK( 1 ) = MAX( 1, MB*M )
+      WORK( 1 ) = LWREQ
 *
       RETURN
 *
diff --git a/SRC/zgetsls.f b/SRC/zgetsls.f
index 1aab3c66..11233785 100644
--- a/SRC/zgetsls.f
+++ b/SRC/zgetsls.f
@@ -261,7 +261,7 @@
          TSZM = INT( TQ( 1 ) )
          LWM  = INT( WORKQ( 1 ) )
          CALL ZGEMLQ( 'L', TRANS, N, NRHS, M, A, LDA, TQ,
-     $                TSZO, B, LDB, WORKQ, -1, INFO2 )
+     $                TSZM, B, LDB, WORKQ, -1, INFO2 )
          LWM  = MAX( LWM, INT( WORKQ( 1 ) ) )
          WSIZEO = TSZO + LWO
          WSIZEM = TSZM + LWM
-- 
2.26.2.windows.1

