Skip to content

Commit a066b6a

Browse files
authored
Merge pull request #638 from weslleyspereira/fix-dgeqrf-when-info-minus1
Fix xGEQRF and xGERQF following thanks to @andreasvarga and @VasileSima4
2 parents 5d4180c + 619d927 commit a066b6a

File tree

8 files changed

+69
-40
lines changed

8 files changed

+69
-40
lines changed

SRC/cgeqrf.f

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,8 @@
9595
*> \param[in] LWORK
9696
*> \verbatim
9797
*> LWORK is INTEGER
98-
*> The dimension of the array WORK. LWORK >= max(1,N).
98+
*> The dimension of the array WORK.
99+
*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= N, otherwise.
99100
*> For optimum performance LWORK >= N*NB, where NB is
100101
*> the optimal blocksize.
101102
*>
@@ -175,30 +176,35 @@ SUBROUTINE CGEQRF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
175176
*
176177
* Test the input arguments
177178
*
179+
K = MIN( M, N )
178180
INFO = 0
179181
NB = ILAENV( 1, 'CGEQRF', ' ', M, N, -1, -1 )
180-
LWKOPT = N*NB
181-
WORK( 1 ) = LWKOPT
182182
LQUERY = ( LWORK.EQ.-1 )
183183
IF( M.LT.0 ) THEN
184184
INFO = -1
185185
ELSE IF( N.LT.0 ) THEN
186186
INFO = -2
187187
ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
188188
INFO = -4
189-
ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
190-
INFO = -7
189+
ELSE IF( .NOT.LQUERY ) THEN
190+
IF( LWORK.LE.0 .OR. ( M.GT.0 .AND. LWORK.LT.MAX( 1, N ) ) )
191+
$ INFO = -7
191192
END IF
192193
IF( INFO.NE.0 ) THEN
193194
CALL XERBLA( 'CGEQRF', -INFO )
194195
RETURN
195196
ELSE IF( LQUERY ) THEN
197+
IF( K.EQ.0 ) THEN
198+
LWKOPT = 1
199+
ELSE
200+
LWKOPT = N*NB
201+
END IF
202+
WORK( 1 ) = LWKOPT
196203
RETURN
197204
END IF
198205
*
199206
* Quick return if possible
200207
*
201-
K = MIN( M, N )
202208
IF( K.EQ.0 ) THEN
203209
WORK( 1 ) = 1
204210
RETURN

SRC/cgerqf.f

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@
8888
*> \param[in] LWORK
8989
*> \verbatim
9090
*> LWORK is INTEGER
91-
*> The dimension of the array WORK. LWORK >= max(1,M).
91+
*> The dimension of the array WORK.
92+
*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= M, otherwise.
9293
*> For optimum performance LWORK >= M*NB, where NB is
9394
*> the optimal blocksize.
9495
*>
@@ -188,8 +189,9 @@ SUBROUTINE CGERQF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
188189
END IF
189190
WORK( 1 ) = LWKOPT
190191
*
191-
IF( LWORK.LT.MAX( 1, M ) .AND. .NOT.LQUERY ) THEN
192-
INFO = -7
192+
IF ( .NOT.LQUERY ) THEN
193+
IF( LWORK.LE.0 .OR. ( N.GT.0 .AND. LWORK.LT.MAX( 1, M ) ) )
194+
$ INFO = -7
193195
END IF
194196
END IF
195197
*

SRC/dgeqrf.f

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,8 @@
9595
*> \param[in] LWORK
9696
*> \verbatim
9797
*> LWORK is INTEGER
98-
*> The dimension of the array WORK. LWORK >= max(1,N).
98+
*> The dimension of the array WORK.
99+
*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= N, otherwise.
99100
*> For optimum performance LWORK >= N*NB, where NB is
100101
*> the optimal blocksize.
101102
*>
@@ -175,30 +176,35 @@ SUBROUTINE DGEQRF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
175176
*
176177
* Test the input arguments
177178
*
179+
K = MIN( M, N )
178180
INFO = 0
179181
NB = ILAENV( 1, 'DGEQRF', ' ', M, N, -1, -1 )
180-
LWKOPT = N*NB
181-
WORK( 1 ) = LWKOPT
182182
LQUERY = ( LWORK.EQ.-1 )
183183
IF( M.LT.0 ) THEN
184184
INFO = -1
185185
ELSE IF( N.LT.0 ) THEN
186186
INFO = -2
187187
ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
188188
INFO = -4
189-
ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
190-
INFO = -7
189+
ELSE IF( .NOT.LQUERY ) THEN
190+
IF( LWORK.LE.0 .OR. ( M.GT.0 .AND. LWORK.LT.MAX( 1, N ) ) )
191+
$ INFO = -7
191192
END IF
192193
IF( INFO.NE.0 ) THEN
193194
CALL XERBLA( 'DGEQRF', -INFO )
194195
RETURN
195196
ELSE IF( LQUERY ) THEN
197+
IF( K.EQ.0 ) THEN
198+
LWKOPT = 1
199+
ELSE
200+
LWKOPT = N*NB
201+
END IF
202+
WORK( 1 ) = LWKOPT
196203
RETURN
197204
END IF
198205
*
199206
* Quick return if possible
200207
*
201-
K = MIN( M, N )
202208
IF( K.EQ.0 ) THEN
203209
WORK( 1 ) = 1
204210
RETURN

SRC/dgerqf.f

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@
8888
*> \param[in] LWORK
8989
*> \verbatim
9090
*> LWORK is INTEGER
91-
*> The dimension of the array WORK. LWORK >= max(1,M).
91+
*> The dimension of the array WORK.
92+
*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= M, otherwise.
9293
*> For optimum performance LWORK >= M*NB, where NB is
9394
*> the optimal blocksize.
9495
*>
@@ -188,8 +189,9 @@ SUBROUTINE DGERQF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
188189
END IF
189190
WORK( 1 ) = LWKOPT
190191
*
191-
IF( LWORK.LT.MAX( 1, M ) .AND. .NOT.LQUERY ) THEN
192-
INFO = -7
192+
IF ( .NOT.LQUERY ) THEN
193+
IF( LWORK.LE.0 .OR. ( N.GT.0 .AND. LWORK.LT.MAX( 1, M ) ) )
194+
$ INFO = -7
193195
END IF
194196
END IF
195197
*

SRC/sgeqrf.f

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,8 @@
9595
*> \param[in] LWORK
9696
*> \verbatim
9797
*> LWORK is INTEGER
98-
*> The dimension of the array WORK. LWORK >= max(1,N).
98+
*> The dimension of the array WORK.
99+
*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= N, otherwise.
99100
*> For optimum performance LWORK >= N*NB, where NB is
100101
*> the optimal blocksize.
101102
*>
@@ -175,30 +176,35 @@ SUBROUTINE SGEQRF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
175176
*
176177
* Test the input arguments
177178
*
179+
K = MIN( M, N )
178180
INFO = 0
179181
NB = ILAENV( 1, 'SGEQRF', ' ', M, N, -1, -1 )
180-
LWKOPT = N*NB
181-
WORK( 1 ) = LWKOPT
182182
LQUERY = ( LWORK.EQ.-1 )
183183
IF( M.LT.0 ) THEN
184184
INFO = -1
185185
ELSE IF( N.LT.0 ) THEN
186186
INFO = -2
187187
ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
188188
INFO = -4
189-
ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
190-
INFO = -7
189+
ELSE IF( .NOT.LQUERY ) THEN
190+
IF( LWORK.LE.0 .OR. ( M.GT.0 .AND. LWORK.LT.MAX( 1, N ) ) )
191+
$ INFO = -7
191192
END IF
192193
IF( INFO.NE.0 ) THEN
193194
CALL XERBLA( 'SGEQRF', -INFO )
194195
RETURN
195196
ELSE IF( LQUERY ) THEN
197+
IF( K.EQ.0 ) THEN
198+
LWKOPT = 1
199+
ELSE
200+
LWKOPT = N*NB
201+
END IF
202+
WORK( 1 ) = LWKOPT
196203
RETURN
197204
END IF
198205
*
199206
* Quick return if possible
200-
*
201-
K = MIN( M, N )
207+
*
202208
IF( K.EQ.0 ) THEN
203209
WORK( 1 ) = 1
204210
RETURN

SRC/sgerqf.f

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@
8888
*> \param[in] LWORK
8989
*> \verbatim
9090
*> LWORK is INTEGER
91-
*> The dimension of the array WORK. LWORK >= max(1,M).
91+
*> The dimension of the array WORK.
92+
*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= M, otherwise.
9293
*> For optimum performance LWORK >= M*NB, where NB is
9394
*> the optimal blocksize.
9495
*>
@@ -176,8 +177,6 @@ SUBROUTINE SGERQF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
176177
INFO = -2
177178
ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
178179
INFO = -4
179-
ELSE IF( LWORK.LT.MAX( 1, M ) .AND. .NOT.LQUERY ) THEN
180-
INFO = -7
181180
END IF
182181
*
183182
IF( INFO.EQ.0 ) THEN
@@ -187,12 +186,12 @@ SUBROUTINE SGERQF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
187186
ELSE
188187
NB = ILAENV( 1, 'SGERQF', ' ', M, N, -1, -1 )
189188
LWKOPT = M*NB
190-
WORK( 1 ) = LWKOPT
191189
END IF
192190
WORK( 1 ) = LWKOPT
193191
*
194-
IF( LWORK.LT.MAX( 1, M ) .AND. .NOT.LQUERY ) THEN
195-
INFO = -7
192+
IF ( .NOT.LQUERY ) THEN
193+
IF( LWORK.LE.0 .OR. ( N.GT.0 .AND. LWORK.LT.MAX( 1, M ) ) )
194+
$ INFO = -7
196195
END IF
197196
END IF
198197
*

SRC/zgeqrf.f

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,8 @@
9595
*> \param[in] LWORK
9696
*> \verbatim
9797
*> LWORK is INTEGER
98-
*> The dimension of the array WORK. LWORK >= max(1,N).
98+
*> The dimension of the array WORK.
99+
*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= N, otherwise.
99100
*> For optimum performance LWORK >= N*NB, where NB is
100101
*> the optimal blocksize.
101102
*>
@@ -175,30 +176,35 @@ SUBROUTINE ZGEQRF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
175176
*
176177
* Test the input arguments
177178
*
179+
K = MIN( M, N )
178180
INFO = 0
179181
NB = ILAENV( 1, 'ZGEQRF', ' ', M, N, -1, -1 )
180-
LWKOPT = N*NB
181-
WORK( 1 ) = LWKOPT
182182
LQUERY = ( LWORK.EQ.-1 )
183183
IF( M.LT.0 ) THEN
184184
INFO = -1
185185
ELSE IF( N.LT.0 ) THEN
186186
INFO = -2
187187
ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
188188
INFO = -4
189-
ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
190-
INFO = -7
189+
ELSE IF( .NOT.LQUERY ) THEN
190+
IF( LWORK.LE.0 .OR. ( M.GT.0 .AND. LWORK.LT.MAX( 1, N ) ) )
191+
$ INFO = -7
191192
END IF
192193
IF( INFO.NE.0 ) THEN
193194
CALL XERBLA( 'ZGEQRF', -INFO )
194195
RETURN
195196
ELSE IF( LQUERY ) THEN
197+
IF( K.EQ.0 ) THEN
198+
LWKOPT = 1
199+
ELSE
200+
LWKOPT = N*NB
201+
END IF
202+
WORK( 1 ) = LWKOPT
196203
RETURN
197204
END IF
198205
*
199206
* Quick return if possible
200207
*
201-
K = MIN( M, N )
202208
IF( K.EQ.0 ) THEN
203209
WORK( 1 ) = 1
204210
RETURN

SRC/zgerqf.f

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@
8888
*> \param[in] LWORK
8989
*> \verbatim
9090
*> LWORK is INTEGER
91-
*> The dimension of the array WORK. LWORK >= max(1,M).
91+
*> The dimension of the array WORK.
92+
*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= M, otherwise.
9293
*> For optimum performance LWORK >= M*NB, where NB is
9394
*> the optimal blocksize.
9495
*>
@@ -188,8 +189,9 @@ SUBROUTINE ZGERQF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
188189
END IF
189190
WORK( 1 ) = LWKOPT
190191
*
191-
IF( LWORK.LT.MAX( 1, M ) .AND. .NOT.LQUERY ) THEN
192-
INFO = -7
192+
IF ( .NOT.LQUERY ) THEN
193+
IF( LWORK.LE.0 .OR. ( N.GT.0 .AND. LWORK.LT.MAX( 1, M ) ) )
194+
$ INFO = -7
193195
END IF
194196
END IF
195197
*

0 commit comments

Comments
 (0)