diff options
author | eugene.chereshnev <echeresh@mandrake.jf.intel.com> | 2016-12-14 09:08:16 -0800 |
---|---|---|
committer | eugene.chereshnev <eugenechereshnev@gmail.com> | 2016-12-14 11:30:34 -0800 |
commit | 3136b938aaeeabd59a1e32fc325ce41d3cbeabee (patch) | |
tree | 127ba6d194b2d2e4c5e689cf644bcab4be7cf3e7 /SRC/dgeqr.f | |
parent | 89703d197f181b2632afd2a93726338fa8bbb26f (diff) |
Fix ?GEQR and ?GEMQR
Diffstat (limited to 'SRC/dgeqr.f')
-rw-r--r-- | SRC/dgeqr.f | 106 |
1 files changed, 54 insertions, 52 deletions
diff --git a/SRC/dgeqr.f b/SRC/dgeqr.f index 93f02bd8..5212c69e 100644 --- a/SRC/dgeqr.f +++ b/SRC/dgeqr.f @@ -3,7 +3,7 @@ * =========== * * SUBROUTINE DGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK, -* INFO) +* INFO ) * * .. Scalar Arguments .. * INTEGER INFO, LDA, M, N, TSIZE, LWORK @@ -146,72 +146,72 @@ *> *> T(2): row block size (MB) *> T(3): column block size (NB) -*> T(4:TSIZE): data structure needed for Q, computed by +*> T(6:TSIZE): data structure needed for Q, computed by *> DLATSQR or DGEQRT *> *> Depending on the matrix dimensions M and N, and row and column -*> block sizes MB and NB returned by ILAENV, GEQR will use either -*> LATSQR (if the matrix is tall-and-skinny) or GEQRT to compute +*> block sizes MB and NB returned by ILAENV, DGEQR will use either +*> DLATSQR (if the matrix is tall-and-skinny) or DGEQRT to compute *> the QR factorization. +*> *> \endverbatim *> * ===================================================================== SUBROUTINE DGEQR( M, N, A, LDA, T, TSIZE, WORK, LWORK, - $ INFO) + $ INFO ) * -* -- LAPACK computational routine (version 3.5.0) -- +* -- LAPACK computational routine (version 3.7.0) -- * -- LAPACK is a software package provided by Univ. of Tennessee, -- * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd. -- -* November 2013 +* November 2016 * * .. Scalar Arguments .. - INTEGER INFO, LDA, M, N, TSIZE, LWORK + INTEGER INFO, LDA, M, N, TSIZE, LWORK * .. * .. Array Arguments .. - DOUBLE PRECISION A( LDA, * ), T( * ), WORK( * ) + DOUBLE PRECISION A( LDA, * ), T( * ), WORK( * ) * .. * * ===================================================================== * * .. * .. Local Scalars .. - LOGICAL LQUERY, LMINWS, MINT, MINW - INTEGER MB, NB, I, II, KK, MINTSZ, NBLCKS + LOGICAL LQUERY, LMINWS, MINT, MINW + INTEGER MB, NB, MINTSZ, NBLCKS * .. -* .. EXTERNAL FUNCTIONS .. +* .. External Functions .. LOGICAL LSAME EXTERNAL LSAME -* .. EXTERNAL SUBROUTINES .. +* .. +* .. External Subroutines .. EXTERNAL DLATSQR, DGEQRT, XERBLA -* .. INTRINSIC FUNCTIONS .. +* .. +* .. Intrinsic Functions .. INTRINSIC MAX, MIN, MOD * .. -* .. EXTERNAL FUNCTIONS .. +* .. External Functions .. INTEGER ILAENV EXTERNAL ILAENV * .. -* .. EXECUTABLE STATEMENTS .. +* .. Executable Statements .. * -* TEST THE INPUT ARGUMENTS +* Test the input arguments * INFO = 0 * - LQUERY = ( TSIZE.EQ.-1 .OR. TSIZE.EQ.-2 .OR. + LQUERY = ( TSIZE.EQ.-1 .OR. TSIZE.EQ.-2 .OR. $ LWORK.EQ.-1 .OR. LWORK.EQ.-2 ) * MINT = .FALSE. - IF ( TSIZE.NE.-1 .AND. ( TSIZE.EQ.-2 .OR. LWORK.EQ.-2 ) ) THEN - MINT = .TRUE. - ENDIF -* MINW = .FALSE. - IF ( LWORK.NE.-1 .AND. ( TSIZE.EQ.-2 .OR. LWORK.EQ.-2 ) ) THEN - MINW = .TRUE. - ENDIF + IF( TSIZE.EQ.-2 .OR. LWORK.EQ.-2 ) THEN + IF( TSIZE.NE.-1 ) MINT = .TRUE. + IF( LWORK.NE.-1 ) MINW = .TRUE. + END IF * * Determine the block size * - IF ( MIN(M,N).GT.0 ) THEN + IF( MIN( M, N ).GT.0 ) THEN MB = ILAENV( 1, 'DGEQR ', ' ', M, N, 1, -1 ) NB = ILAENV( 1, 'DGEQR ', ' ', M, N, 2, -1 ) ELSE @@ -221,7 +221,7 @@ IF( MB.GT.M .OR. MB.LE.N ) MB = M IF( NB.GT.MIN( M, N ) .OR. NB.LT.1 ) NB = 1 MINTSZ = N + 5 - IF ( MB.GT.N .AND. M.GT.N ) THEN + IF( MB.GT.N .AND. M.GT.N ) THEN IF( MOD( M - N, MB - N ).EQ.0 ) THEN NBLCKS = ( M - N ) / ( MB - N ) ELSE @@ -235,16 +235,16 @@ * LMINWS = .FALSE. IF( ( TSIZE.LT.MAX( 1, NB*N*NBLCKS + 5 ) .OR. LWORK.LT.NB*N ) - $ .AND. ( LWORK.GE.N ) .AND. ( TSIZE.GE.N + 5 ) + $ .AND. ( LWORK.GE.N ) .AND. ( TSIZE.GE.MINTSZ ) $ .AND. ( .NOT.LQUERY ) ) THEN - IF ( TSIZE.LT.MAX( 1, NB*N*NBLCKS + 5 ) ) THEN - LMINWS = .TRUE. - NB = 1 - MB = M + IF( TSIZE.LT.MAX( 1, NB*N*NBLCKS + 5 ) ) THEN + LMINWS = .TRUE. + NB = 1 + MB = M END IF - IF ( LWORK.LT.NB*N ) THEN - LMINWS = .TRUE. - NB = 1 + IF( LWORK.LT.NB*N ) THEN + LMINWS = .TRUE. + NB = 1 END IF END IF * @@ -262,42 +262,44 @@ INFO = -8 END IF * - IF( INFO.EQ.0 ) THEN - IF ( MINT ) THEN - T(1) = MINTSZ + IF( INFO.EQ.0 ) THEN + IF( MINT ) THEN + T( 1 ) = MINTSZ ELSE - T(1) = NB*N*NBLCKS + 5 - ENDIF - T(2) = MB - T(3) = NB - IF ( MINW ) THEN - WORK(1) = MAX( 1, N ) + T( 1 ) = NB*N*NBLCKS + 5 + END IF + T( 2 ) = MB + T( 3 ) = NB + IF( MINW ) THEN + WORK( 1 ) = MAX( 1, N ) ELSE - WORK(1) = MAX( 1, NB*N ) - ENDIF + WORK( 1 ) = MAX( 1, NB*N ) + END IF END IF IF( INFO.NE.0 ) THEN CALL XERBLA( 'DGEQR', -INFO ) RETURN - ELSE IF ( LQUERY ) THEN + ELSE IF( LQUERY ) THEN RETURN END IF * * Quick return if possible * - IF( MIN(M,N).EQ.0 ) THEN + IF( MIN( M, N ).EQ.0 ) THEN RETURN END IF * * The QR Decomposition * IF( ( M.LE.N ) .OR. ( MB.LE.N ) .OR. ( MB.GE.M ) ) THEN - CALL DGEQRT( M, N, NB, A, LDA, T(4), NB, WORK, INFO ) + CALL DGEQRT( M, N, NB, A, LDA, T( 6 ), NB, WORK, INFO ) ELSE - CALL DLATSQR( M, N, MB, NB, A, LDA, T(4), NB, WORK, - $ LWORK, INFO ) + CALL DLATSQR( M, N, MB, NB, A, LDA, T( 6 ), NB, WORK, + $ LWORK, INFO ) END IF - WORK(1) = MAX( 1, NB*N ) +* + WORK( 1 ) = MAX( 1, NB*N ) +* RETURN * * End of DGEQR |