Skip to content

Commit 79bfdd4

Browse files
Merge pull request #690 from weslleyspereira/master
Fix the left-looking variant of geqrf following #638
2 parents 675d716 + e9c4a7a commit 79bfdd4

File tree

4 files changed

+48
-20
lines changed

4 files changed

+48
-20
lines changed

SRC/VARIANTS/qr/LL/cgeqrf.f

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@
8181
C> LWORK is INTEGER
8282
C> \endverbatim
8383
C> \verbatim
84-
C> The dimension of the array WORK. The dimension can be divided into three parts.
84+
C> The dimension of the array WORK. LWORK >= 1 if MIN(M,N) = 0,
85+
C> otherwise the dimension can be divided into three parts.
8586
C> \endverbatim
8687
C> \verbatim
8788
C> 1) The part for the triangular factor T. If the very last T is not bigger
@@ -212,7 +213,13 @@ SUBROUTINE CGEQRF ( M, N, A, LDA, TAU, WORK, LWORK, INFO )
212213
LLWORK = MAX (MAX((N-M)*K, (N-M)*NB), MAX(K*NB, NB*NB))
213214
LLWORK = SCEIL(REAL(LLWORK)/REAL(NB))
214215

215-
IF ( NT.GT.NB ) THEN
216+
IF( K.EQ.0 ) THEN
217+
218+
LBWORK = 0
219+
LWKOPT = 1
220+
WORK( 1 ) = LWKOPT
221+
222+
ELSE IF ( NT.GT.NB ) THEN
216223

217224
LBWORK = K-NT
218225
*
@@ -239,8 +246,9 @@ SUBROUTINE CGEQRF ( M, N, A, LDA, TAU, WORK, LWORK, INFO )
239246
INFO = -2
240247
ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
241248
INFO = -4
242-
ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
243-
INFO = -7
249+
ELSE IF ( .NOT.LQUERY ) THEN
250+
IF( LWORK.LE.0 .OR. ( M.GT.0 .AND. LWORK.LT.MAX( 1, N ) ) )
251+
$ INFO = -7
244252
END IF
245253
IF( INFO.NE.0 ) THEN
246254
CALL XERBLA( 'CGEQRF', -INFO )
@@ -252,7 +260,6 @@ SUBROUTINE CGEQRF ( M, N, A, LDA, TAU, WORK, LWORK, INFO )
252260
* Quick return if possible
253261
*
254262
IF( K.EQ.0 ) THEN
255-
WORK( 1 ) = 1
256263
RETURN
257264
END IF
258265
*

SRC/VARIANTS/qr/LL/dgeqrf.f

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@
8181
C> LWORK is INTEGER
8282
C> \endverbatim
8383
C> \verbatim
84-
C> The dimension of the array WORK. The dimension can be divided into three parts.
84+
C> The dimension of the array WORK. LWORK >= 1 if MIN(M,N) = 0,
85+
C> otherwise the dimension can be divided into three parts.
8586
C> \endverbatim
8687
C> \verbatim
8788
C> 1) The part for the triangular factor T. If the very last T is not bigger
@@ -212,7 +213,13 @@ SUBROUTINE DGEQRF ( M, N, A, LDA, TAU, WORK, LWORK, INFO )
212213
LLWORK = MAX (MAX((N-M)*K, (N-M)*NB), MAX(K*NB, NB*NB))
213214
LLWORK = SCEIL(REAL(LLWORK)/REAL(NB))
214215

215-
IF ( NT.GT.NB ) THEN
216+
IF( K.EQ.0 ) THEN
217+
218+
LBWORK = 0
219+
LWKOPT = 1
220+
WORK( 1 ) = LWKOPT
221+
222+
ELSE IF ( NT.GT.NB ) THEN
216223

217224
LBWORK = K-NT
218225
*
@@ -239,8 +246,9 @@ SUBROUTINE DGEQRF ( M, N, A, LDA, TAU, WORK, LWORK, INFO )
239246
INFO = -2
240247
ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
241248
INFO = -4
242-
ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
243-
INFO = -7
249+
ELSE IF ( .NOT.LQUERY ) THEN
250+
IF( LWORK.LE.0 .OR. ( M.GT.0 .AND. LWORK.LT.MAX( 1, N ) ) )
251+
$ INFO = -7
244252
END IF
245253
IF( INFO.NE.0 ) THEN
246254
CALL XERBLA( 'DGEQRF', -INFO )
@@ -252,7 +260,6 @@ SUBROUTINE DGEQRF ( M, N, A, LDA, TAU, WORK, LWORK, INFO )
252260
* Quick return if possible
253261
*
254262
IF( K.EQ.0 ) THEN
255-
WORK( 1 ) = 1
256263
RETURN
257264
END IF
258265
*

SRC/VARIANTS/qr/LL/sgeqrf.f

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@
8181
C> LWORK is INTEGER
8282
C> \endverbatim
8383
C> \verbatim
84-
C> The dimension of the array WORK. The dimension can be divided into three parts.
84+
C> The dimension of the array WORK. LWORK >= 1 if MIN(M,N) = 0,
85+
C> otherwise the dimension can be divided into three parts.
8586
C> \endverbatim
8687
C> \verbatim
8788
C> 1) The part for the triangular factor T. If the very last T is not bigger
@@ -212,7 +213,13 @@ SUBROUTINE SGEQRF ( M, N, A, LDA, TAU, WORK, LWORK, INFO )
212213
LLWORK = MAX (MAX((N-M)*K, (N-M)*NB), MAX(K*NB, NB*NB))
213214
LLWORK = SCEIL(REAL(LLWORK)/REAL(NB))
214215

215-
IF ( NT.GT.NB ) THEN
216+
IF( K.EQ.0 ) THEN
217+
218+
LBWORK = 0
219+
LWKOPT = 1
220+
WORK( 1 ) = LWKOPT
221+
222+
ELSE IF ( NT.GT.NB ) THEN
216223

217224
LBWORK = K-NT
218225
*
@@ -239,8 +246,9 @@ SUBROUTINE SGEQRF ( M, N, A, LDA, TAU, WORK, LWORK, INFO )
239246
INFO = -2
240247
ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
241248
INFO = -4
242-
ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
243-
INFO = -7
249+
ELSE IF ( .NOT.LQUERY ) THEN
250+
IF( LWORK.LE.0 .OR. ( M.GT.0 .AND. LWORK.LT.MAX( 1, N ) ) )
251+
$ INFO = -7
244252
END IF
245253
IF( INFO.NE.0 ) THEN
246254
CALL XERBLA( 'SGEQRF', -INFO )
@@ -252,7 +260,6 @@ SUBROUTINE SGEQRF ( M, N, A, LDA, TAU, WORK, LWORK, INFO )
252260
* Quick return if possible
253261
*
254262
IF( K.EQ.0 ) THEN
255-
WORK( 1 ) = 1
256263
RETURN
257264
END IF
258265
*

SRC/VARIANTS/qr/LL/zgeqrf.f

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@
8181
C> LWORK is INTEGER
8282
C> \endverbatim
8383
C> \verbatim
84-
C> The dimension of the array WORK. The dimension can be divided into three parts.
84+
C> The dimension of the array WORK. LWORK >= 1 if MIN(M,N) = 0,
85+
C> otherwise the dimension can be divided into three parts.
8586
C> \endverbatim
8687
C> \verbatim
8788
C> 1) The part for the triangular factor T. If the very last T is not bigger
@@ -212,7 +213,13 @@ SUBROUTINE ZGEQRF ( M, N, A, LDA, TAU, WORK, LWORK, INFO )
212213
LLWORK = MAX (MAX((N-M)*K, (N-M)*NB), MAX(K*NB, NB*NB))
213214
LLWORK = SCEIL(REAL(LLWORK)/REAL(NB))
214215

215-
IF ( NT.GT.NB ) THEN
216+
IF( K.EQ.0 ) THEN
217+
218+
LBWORK = 0
219+
LWKOPT = 1
220+
WORK( 1 ) = LWKOPT
221+
222+
ELSE IF ( NT.GT.NB ) THEN
216223

217224
LBWORK = K-NT
218225
*
@@ -239,8 +246,9 @@ SUBROUTINE ZGEQRF ( M, N, A, LDA, TAU, WORK, LWORK, INFO )
239246
INFO = -2
240247
ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
241248
INFO = -4
242-
ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
243-
INFO = -7
249+
ELSE IF ( .NOT.LQUERY ) THEN
250+
IF( LWORK.LE.0 .OR. ( M.GT.0 .AND. LWORK.LT.MAX( 1, N ) ) )
251+
$ INFO = -7
244252
END IF
245253
IF( INFO.NE.0 ) THEN
246254
CALL XERBLA( 'ZGEQRF', -INFO )
@@ -252,7 +260,6 @@ SUBROUTINE ZGEQRF ( M, N, A, LDA, TAU, WORK, LWORK, INFO )
252260
* Quick return if possible
253261
*
254262
IF( K.EQ.0 ) THEN
255-
WORK( 1 ) = 1
256263
RETURN
257264
END IF
258265
*

0 commit comments

Comments
 (0)