@@ -187,7 +187,7 @@ SUBROUTINE CGELQ( M, N, A, LDA, T, TSIZE, WORK, LWORK,
187187* ..
188188* .. Local Scalars ..
189189 LOGICAL LQUERY, LMINWS, MINT, MINW
190- INTEGER MB, NB, MINTSZ, NBLCKS
190+ INTEGER MB, NB, MINTSZ, NBLCKS, LWMIN, LWOPT, LWREQ
191191* ..
192192* .. External Functions ..
193193 LOGICAL LSAME
@@ -243,20 +243,32 @@ SUBROUTINE CGELQ( M, N, A, LDA, T, TSIZE, WORK, LWORK,
243243*
244244* Determine if the workspace size satisfies minimal size
245245*
246+ IF ( ( N.LE. M ) .OR. ( NB.LE. M ) .OR. ( NB.GE. N ) ) THEN
247+ LWMIN = MAX ( 1 , N )
248+ LWOPT = MAX ( 1 , MB* N )
249+ ELSE
250+ LWMIN = MAX ( 1 , M )
251+ LWOPT = MAX ( 1 , MB* M )
252+ END IF
246253 LMINWS = .FALSE.
247- IF ( ( TSIZE.LT. MAX ( 1 , MB* M* NBLCKS + 5 ) .OR. LWORK.LT. MB * M )
248- $ .AND. ( LWORK.GE. M ) .AND. ( TSIZE.GE. MINTSZ )
254+ IF ( ( TSIZE.LT. MAX ( 1 , MB* M* NBLCKS + 5 ) .OR. LWORK.LT. LWOPT )
255+ $ .AND. ( LWORK.GE. LWMIN ) .AND. ( TSIZE.GE. MINTSZ )
249256 $ .AND. ( .NOT. LQUERY ) ) THEN
250257 IF ( TSIZE.LT. MAX ( 1 , MB* M* NBLCKS + 5 ) ) THEN
251258 LMINWS = .TRUE.
252259 MB = 1
253260 NB = N
254261 END IF
255- IF ( LWORK.LT. MB * M ) THEN
262+ IF ( LWORK.LT. LWOPT ) THEN
256263 LMINWS = .TRUE.
257264 MB = 1
258265 END IF
259266 END IF
267+ IF ( ( N.LE. M ) .OR. ( NB.LE. M ) .OR. ( NB.GE. N ) ) THEN
268+ LWREQ = MAX ( 1 , MB* N )
269+ ELSE
270+ LWREQ = MAX ( 1 , MB* M )
271+ END IF
260272*
261273 IF ( M.LT. 0 ) THEN
262274 INFO = - 1
@@ -267,7 +279,7 @@ SUBROUTINE CGELQ( M, N, A, LDA, T, TSIZE, WORK, LWORK,
267279 ELSE IF ( TSIZE.LT. MAX ( 1 , MB* M* NBLCKS + 5 )
268280 $ .AND. ( .NOT. LQUERY ) .AND. ( .NOT. LMINWS ) ) THEN
269281 INFO = - 6
270- ELSE IF ( ( LWORK.LT. MAX ( 1 , M * MB ) ) .AND .( .NOT. LQUERY )
282+ ELSE IF ( ( LWORK.LT. LWREQ ) .AND .( .NOT. LQUERY )
271283 $ .AND. ( .NOT. LMINWS ) ) THEN
272284 INFO = - 8
273285 END IF
@@ -281,9 +293,9 @@ SUBROUTINE CGELQ( M, N, A, LDA, T, TSIZE, WORK, LWORK,
281293 T( 2 ) = MB
282294 T( 3 ) = NB
283295 IF ( MINW ) THEN
284- WORK( 1 ) = MAX ( 1 , N )
296+ WORK( 1 ) = LWMIN
285297 ELSE
286- WORK( 1 ) = MAX ( 1 , MB * M )
298+ WORK( 1 ) = LWREQ
287299 END IF
288300 END IF
289301 IF ( INFO.NE. 0 ) THEN
@@ -308,7 +320,7 @@ SUBROUTINE CGELQ( M, N, A, LDA, T, TSIZE, WORK, LWORK,
308320 $ LWORK, INFO )
309321 END IF
310322*
311- WORK( 1 ) = MAX ( 1 , MB * M )
323+ WORK( 1 ) = LWREQ
312324*
313325 RETURN
314326*
0 commit comments