diff options
Diffstat (limited to 'SRC/dgelq.f')
-rw-r--r-- | SRC/dgelq.f | 97 |
1 files changed, 49 insertions, 48 deletions
diff --git a/SRC/dgelq.f b/SRC/dgelq.f index 59d9fa91..a9af9006 100644 --- a/SRC/dgelq.f +++ b/SRC/dgelq.f @@ -3,7 +3,7 @@ * =========== * * SUBROUTINE DGELQ( M, N, A, LDA, T, TSIZE, WORK, LWORK, -* INFO) +* INFO ) * * .. Scalar Arguments .. * INTEGER INFO, LDA, M, N, TSIZE, LWORK @@ -120,7 +120,7 @@ *> *> The goal of the interface is to give maximum freedom to the developers for *> creating any LQ factorization algorithm they wish. The triangular -*> (trapezoidal) R has to be stored in the upper part of A. The upper part of A +*> (trapezoidal) L has to be stored in the lower part of A. The lower part of A *> and the array T can be used to store any relevant information for applying or *> constructing the Q factor. The WORK array can safely be discarded after exit. *> @@ -146,72 +146,71 @@ *> *> 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 *> DLASWLQ or DGELQT *> *> Depending on the matrix dimensions M and N, and row and column -*> block sizes MB and NB returned by ILAENV, GELQ will use either -*> LASWLQ (if the matrix is short-and-wide) or GELQT to compute +*> block sizes MB and NB returned by ILAENV, DGELQ will use either +*> DLASWLQ (if the matrix is short-and-wide) or DGELQT to compute *> the LQ factorization. *> \endverbatim *> * ===================================================================== SUBROUTINE DGELQ( 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 DGELQT, DLASWLQ, 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, 'DGELQ ', ' ', M, N, 1, -1 ) NB = ILAENV( 1, 'DGELQ ', ' ', M, N, 2, -1 ) ELSE @@ -235,14 +234,14 @@ * LMINWS = .FALSE. IF( ( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 ) .OR. LWORK.LT.MB*M ) - $ .AND. ( LWORK.GE.M ) .AND. ( TSIZE.GE.M + 5 ) - $ .AND. ( .NOT.LQUERY) ) THEN - IF ( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 ) ) THEN + $ .AND. ( LWORK.GE.M ) .AND. ( TSIZE.GE.MINTSZ ) + $ .AND. ( .NOT.LQUERY ) ) THEN + IF( TSIZE.LT.MAX( 1, MB*M*NBLCKS + 5 ) ) THEN LMINWS = .TRUE. MB = 1 NB = N END IF - IF ( LWORK.LT.MB*M ) THEN + IF( LWORK.LT.MB*M ) THEN LMINWS = .TRUE. MB = 1 END IF @@ -262,42 +261,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) = MB*M*NBLCKS + 5 - ENDIF - T(2) = MB - T(3) = NB - IF ( MINW ) THEN - WORK(1) = MAX( 1, N ) + T( 1 ) = MB*M*NBLCKS + 5 + END IF + T( 2 ) = MB + T( 3 ) = NB + IF( MINW ) THEN + WORK( 1 ) = MAX( 1, N ) ELSE - WORK(1) = MAX( 1, MB*M ) - ENDIF + WORK( 1 ) = MAX( 1, MB*M ) + END IF END IF IF( INFO.NE.0 ) THEN CALL XERBLA( 'DGELQ', -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 LQ Decomposition * IF( ( N.LE.M ) .OR. ( NB.LE.M ) .OR. ( NB.GE.N ) ) THEN - CALL DGELQT( M, N, MB, A, LDA, T(4), MB, WORK, INFO) + CALL DGELQT( M, N, MB, A, LDA, T( 6 ), MB, WORK, INFO ) ELSE - CALL DLASWLQ( M, N, MB, NB, A, LDA, T(4), MB, WORK, - $ LWORK, INFO) + CALL DLASWLQ( M, N, MB, NB, A, LDA, T( 6 ), MB, WORK, + $ LWORK, INFO ) END IF - WORK(1) = MAX( 1, MB*M ) +* + WORK( 1 ) = MAX( 1, MB*M ) +* RETURN * * End of DGELQ |