aboutsummaryrefslogtreecommitdiff
path: root/SRC/dgeqr.f
diff options
context:
space:
mode:
authoreugene.chereshnev <echeresh@mandrake.jf.intel.com>2016-12-14 09:08:16 -0800
committereugene.chereshnev <eugenechereshnev@gmail.com>2016-12-14 11:30:34 -0800
commit3136b938aaeeabd59a1e32fc325ce41d3cbeabee (patch)
tree127ba6d194b2d2e4c5e689cf644bcab4be7cf3e7 /SRC/dgeqr.f
parent89703d197f181b2632afd2a93726338fa8bbb26f (diff)
Fix ?GEQR and ?GEMQR
Diffstat (limited to 'SRC/dgeqr.f')
-rw-r--r--SRC/dgeqr.f106
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