diff --git a/SRC/VARIANTS/qr/LL/cgeqrf.f b/SRC/VARIANTS/qr/LL/cgeqrf.f index 369ed19833..46eaf33b99 100644 --- a/SRC/VARIANTS/qr/LL/cgeqrf.f +++ b/SRC/VARIANTS/qr/LL/cgeqrf.f @@ -81,7 +81,8 @@ C> LWORK is INTEGER C> \endverbatim C> \verbatim -C> The dimension of the array WORK. The dimension can be divided into three parts. +C> The dimension of the array WORK. LWORK >= 1 if MIN(M,N) = 0, +C> otherwise the dimension can be divided into three parts. C> \endverbatim C> \verbatim 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 ) LLWORK = MAX (MAX((N-M)*K, (N-M)*NB), MAX(K*NB, NB*NB)) LLWORK = SCEIL(REAL(LLWORK)/REAL(NB)) - IF ( NT.GT.NB ) THEN + IF( K.EQ.0 ) THEN + + LBWORK = 0 + LWKOPT = 1 + WORK( 1 ) = LWKOPT + + ELSE IF ( NT.GT.NB ) THEN LBWORK = K-NT * @@ -239,8 +246,9 @@ SUBROUTINE CGEQRF ( M, N, A, LDA, TAU, WORK, LWORK, INFO ) INFO = -2 ELSE IF( LDA.LT.MAX( 1, M ) ) THEN INFO = -4 - ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN - INFO = -7 + ELSE IF ( .NOT.LQUERY ) THEN + IF( LWORK.LE.0 .OR. ( M.GT.0 .AND. LWORK.LT.MAX( 1, N ) ) ) + $ INFO = -7 END IF IF( INFO.NE.0 ) THEN CALL XERBLA( 'CGEQRF', -INFO ) @@ -252,7 +260,6 @@ SUBROUTINE CGEQRF ( M, N, A, LDA, TAU, WORK, LWORK, INFO ) * Quick return if possible * IF( K.EQ.0 ) THEN - WORK( 1 ) = 1 RETURN END IF * diff --git a/SRC/VARIANTS/qr/LL/dgeqrf.f b/SRC/VARIANTS/qr/LL/dgeqrf.f index be5720f4f6..55cab8b238 100644 --- a/SRC/VARIANTS/qr/LL/dgeqrf.f +++ b/SRC/VARIANTS/qr/LL/dgeqrf.f @@ -81,7 +81,8 @@ C> LWORK is INTEGER C> \endverbatim C> \verbatim -C> The dimension of the array WORK. The dimension can be divided into three parts. +C> The dimension of the array WORK. LWORK >= 1 if MIN(M,N) = 0, +C> otherwise the dimension can be divided into three parts. C> \endverbatim C> \verbatim 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 ) LLWORK = MAX (MAX((N-M)*K, (N-M)*NB), MAX(K*NB, NB*NB)) LLWORK = SCEIL(REAL(LLWORK)/REAL(NB)) - IF ( NT.GT.NB ) THEN + IF( K.EQ.0 ) THEN + + LBWORK = 0 + LWKOPT = 1 + WORK( 1 ) = LWKOPT + + ELSE IF ( NT.GT.NB ) THEN LBWORK = K-NT * @@ -239,8 +246,9 @@ SUBROUTINE DGEQRF ( M, N, A, LDA, TAU, WORK, LWORK, INFO ) INFO = -2 ELSE IF( LDA.LT.MAX( 1, M ) ) THEN INFO = -4 - ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN - INFO = -7 + ELSE IF ( .NOT.LQUERY ) THEN + IF( LWORK.LE.0 .OR. ( M.GT.0 .AND. LWORK.LT.MAX( 1, N ) ) ) + $ INFO = -7 END IF IF( INFO.NE.0 ) THEN CALL XERBLA( 'DGEQRF', -INFO ) @@ -252,7 +260,6 @@ SUBROUTINE DGEQRF ( M, N, A, LDA, TAU, WORK, LWORK, INFO ) * Quick return if possible * IF( K.EQ.0 ) THEN - WORK( 1 ) = 1 RETURN END IF * diff --git a/SRC/VARIANTS/qr/LL/sgeqrf.f b/SRC/VARIANTS/qr/LL/sgeqrf.f index bff9732144..d2ad13ced1 100644 --- a/SRC/VARIANTS/qr/LL/sgeqrf.f +++ b/SRC/VARIANTS/qr/LL/sgeqrf.f @@ -81,7 +81,8 @@ C> LWORK is INTEGER C> \endverbatim C> \verbatim -C> The dimension of the array WORK. The dimension can be divided into three parts. +C> The dimension of the array WORK. LWORK >= 1 if MIN(M,N) = 0, +C> otherwise the dimension can be divided into three parts. C> \endverbatim C> \verbatim 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 ) LLWORK = MAX (MAX((N-M)*K, (N-M)*NB), MAX(K*NB, NB*NB)) LLWORK = SCEIL(REAL(LLWORK)/REAL(NB)) - IF ( NT.GT.NB ) THEN + IF( K.EQ.0 ) THEN + + LBWORK = 0 + LWKOPT = 1 + WORK( 1 ) = LWKOPT + + ELSE IF ( NT.GT.NB ) THEN LBWORK = K-NT * @@ -239,8 +246,9 @@ SUBROUTINE SGEQRF ( M, N, A, LDA, TAU, WORK, LWORK, INFO ) INFO = -2 ELSE IF( LDA.LT.MAX( 1, M ) ) THEN INFO = -4 - ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN - INFO = -7 + ELSE IF ( .NOT.LQUERY ) THEN + IF( LWORK.LE.0 .OR. ( M.GT.0 .AND. LWORK.LT.MAX( 1, N ) ) ) + $ INFO = -7 END IF IF( INFO.NE.0 ) THEN CALL XERBLA( 'SGEQRF', -INFO ) @@ -252,7 +260,6 @@ SUBROUTINE SGEQRF ( M, N, A, LDA, TAU, WORK, LWORK, INFO ) * Quick return if possible * IF( K.EQ.0 ) THEN - WORK( 1 ) = 1 RETURN END IF * diff --git a/SRC/VARIANTS/qr/LL/zgeqrf.f b/SRC/VARIANTS/qr/LL/zgeqrf.f index 79e86b41bb..623b88a8a7 100644 --- a/SRC/VARIANTS/qr/LL/zgeqrf.f +++ b/SRC/VARIANTS/qr/LL/zgeqrf.f @@ -81,7 +81,8 @@ C> LWORK is INTEGER C> \endverbatim C> \verbatim -C> The dimension of the array WORK. The dimension can be divided into three parts. +C> The dimension of the array WORK. LWORK >= 1 if MIN(M,N) = 0, +C> otherwise the dimension can be divided into three parts. C> \endverbatim C> \verbatim 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 ) LLWORK = MAX (MAX((N-M)*K, (N-M)*NB), MAX(K*NB, NB*NB)) LLWORK = SCEIL(REAL(LLWORK)/REAL(NB)) - IF ( NT.GT.NB ) THEN + IF( K.EQ.0 ) THEN + + LBWORK = 0 + LWKOPT = 1 + WORK( 1 ) = LWKOPT + + ELSE IF ( NT.GT.NB ) THEN LBWORK = K-NT * @@ -239,8 +246,9 @@ SUBROUTINE ZGEQRF ( M, N, A, LDA, TAU, WORK, LWORK, INFO ) INFO = -2 ELSE IF( LDA.LT.MAX( 1, M ) ) THEN INFO = -4 - ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN - INFO = -7 + ELSE IF ( .NOT.LQUERY ) THEN + IF( LWORK.LE.0 .OR. ( M.GT.0 .AND. LWORK.LT.MAX( 1, N ) ) ) + $ INFO = -7 END IF IF( INFO.NE.0 ) THEN CALL XERBLA( 'ZGEQRF', -INFO ) @@ -252,7 +260,6 @@ SUBROUTINE ZGEQRF ( M, N, A, LDA, TAU, WORK, LWORK, INFO ) * Quick return if possible * IF( K.EQ.0 ) THEN - WORK( 1 ) = 1 RETURN END IF *