diff --git a/SRC/clamtsqr.f b/SRC/clamtsqr.f index d4bc2448ee..5677420ac9 100644 --- a/SRC/clamtsqr.f +++ b/SRC/clamtsqr.f @@ -25,7 +25,7 @@ *> SIDE = 'L' SIDE = 'R' *> TRANS = 'N': Q * C C * Q *> TRANS = 'C': Q**H * C C * Q**H -*> where Q is a real orthogonal matrix defined as the product +*> where Q is a complex unitary matrix defined as the product *> of blocked elementary reflectors computed by tall skinny *> QR factorization (CLATSQR) *> \endverbatim @@ -56,15 +56,14 @@ *> \param[in] N *> \verbatim *> N is INTEGER -*> The number of columns of the matrix C. M >= N >= 0. +*> The number of columns of the matrix C. N >= 0. *> \endverbatim *> *> \param[in] K *> \verbatim *> K is INTEGER *> The number of elementary reflectors whose product defines -*> the matrix Q. -*> N >= K >= 0; +*> the matrix Q. M >= K >= 0; *> *> \endverbatim *> @@ -164,8 +163,8 @@ * ===================== *> *> \verbatim -*> Tall-Skinny QR (TSQR) performs QR by a sequence of orthogonal transformations, -*> representing Q as a product of other orthogonal matrices +*> Tall-Skinny QR (TSQR) performs QR by a sequence of unitary transformations, +*> representing Q as a product of other unitary matrices *> Q = Q(1) * Q(2) * . . . * Q(k) *> where each Q(i) zeros out subdiagonal entries of a block of MB rows of A: *> Q(1) zeros out the subdiagonal entries of rows 1:MB of A @@ -244,12 +243,12 @@ SUBROUTINE CLAMTSQR( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T, INFO = -1 ELSE IF( .NOT.TRAN .AND. .NOT.NOTRAN ) THEN INFO = -2 + ELSE IF( M.LT.K ) THEN + INFO = -3 + ELSE IF( N.LT.0 ) THEN + INFO = -4 ELSE IF( K.LT.0 ) THEN INFO = -5 - ELSE IF( N.LT.K ) THEN - INFO = -4 - ELSE IF( M.LT.N ) THEN - INFO = -3 ELSE IF( K.LT.NB .OR. NB.LT.1 ) THEN INFO = -7 ELSE IF( LDA.LT.MAX( 1, Q ) ) THEN diff --git a/SRC/clatsqr.f b/SRC/clatsqr.f index 2b80ba71bd..7a0b85487d 100644 --- a/SRC/clatsqr.f +++ b/SRC/clatsqr.f @@ -202,12 +202,12 @@ SUBROUTINE CLATSQR( M, N, MB, NB, A, LDA, T, LDT, WORK, INFO = -1 ELSE IF( N.LT.0 .OR. M.LT.N ) THEN INFO = -2 - ELSE IF( MB.LE.N ) THEN + ELSE IF( MB.LT.1 ) THEN INFO = -3 ELSE IF( NB.LT.1 .OR. ( NB.GT.N .AND. N.GT.0 )) THEN INFO = -4 ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = -5 + INFO = -6 ELSE IF( LDT.LT.NB ) THEN INFO = -8 ELSE IF( LWORK.LT.(N*NB) .AND. (.NOT.LQUERY) ) THEN diff --git a/SRC/dlamtsqr.f b/SRC/dlamtsqr.f index 4fdd778cc9..962a314763 100644 --- a/SRC/dlamtsqr.f +++ b/SRC/dlamtsqr.f @@ -56,15 +56,14 @@ *> \param[in] N *> \verbatim *> N is INTEGER -*> The number of columns of the matrix C. M >= N >= 0. +*> The number of columns of the matrix C. N >= 0. *> \endverbatim *> *> \param[in] K *> \verbatim *> K is INTEGER *> The number of elementary reflectors whose product defines -*> the matrix Q. -*> N >= K >= 0; +*> the matrix Q. M >= K >= 0; *> *> \endverbatim *> @@ -244,12 +243,12 @@ SUBROUTINE DLAMTSQR( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T, INFO = -1 ELSE IF( .NOT.TRAN .AND. .NOT.NOTRAN ) THEN INFO = -2 + ELSE IF( M.LT.K ) THEN + INFO = -3 + ELSE IF( N.LT.0 ) THEN + INFO = -4 ELSE IF( K.LT.0 ) THEN INFO = -5 - ELSE IF( N.LT.K ) THEN - INFO = -4 - ELSE IF( M.LT.N ) THEN - INFO = -3 ELSE IF( K.LT.NB .OR. NB.LT.1 ) THEN INFO = -7 ELSE IF( LDA.LT.MAX( 1, Q ) ) THEN diff --git a/SRC/dlatsqr.f b/SRC/dlatsqr.f index a7e8f8fe8e..f5cbb76bb0 100644 --- a/SRC/dlatsqr.f +++ b/SRC/dlatsqr.f @@ -57,7 +57,7 @@ *> \verbatim *> MB is INTEGER *> The row block size to be used in the blocked QR. -*> MB > N. +*> MB > 0. *> \endverbatim *> *> \param[in] NB @@ -202,12 +202,12 @@ SUBROUTINE DLATSQR( M, N, MB, NB, A, LDA, T, LDT, WORK, INFO = -1 ELSE IF( N.LT.0 .OR. M.LT.N ) THEN INFO = -2 - ELSE IF( MB.LE.N ) THEN + ELSE IF( MB.LT.1 ) THEN INFO = -3 ELSE IF( NB.LT.1 .OR. ( NB.GT.N .AND. N.GT.0 )) THEN INFO = -4 ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = -5 + INFO = -6 ELSE IF( LDT.LT.NB ) THEN INFO = -8 ELSE IF( LWORK.LT.(N*NB) .AND. (.NOT.LQUERY) ) THEN diff --git a/SRC/slamtsqr.f b/SRC/slamtsqr.f index 8f50a31488..960b794de8 100644 --- a/SRC/slamtsqr.f +++ b/SRC/slamtsqr.f @@ -56,15 +56,14 @@ *> \param[in] N *> \verbatim *> N is INTEGER -*> The number of columns of the matrix C. M >= N >= 0. +*> The number of columns of the matrix C. N >= 0. *> \endverbatim *> *> \param[in] K *> \verbatim *> K is INTEGER *> The number of elementary reflectors whose product defines -*> the matrix Q. -*> N >= K >= 0; +*> the matrix Q. M >= K >= 0; *> *> \endverbatim *> @@ -244,12 +243,12 @@ SUBROUTINE SLAMTSQR( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T, INFO = -1 ELSE IF( .NOT.TRAN .AND. .NOT.NOTRAN ) THEN INFO = -2 + ELSE IF( M.LT.K ) THEN + INFO = -3 + ELSE IF( N.LT.0 ) THEN + INFO = -4 ELSE IF( K.LT.0 ) THEN INFO = -5 - ELSE IF( N.LT.K ) THEN - INFO = -4 - ELSE IF( M.LT.N ) THEN - INFO = -3 ELSE IF( K.LT.NB .OR. NB.LT.1 ) THEN INFO = -7 ELSE IF( LDA.LT.MAX( 1, Q ) ) THEN diff --git a/SRC/slatsqr.f b/SRC/slatsqr.f index 161ab33258..33966c01f1 100644 --- a/SRC/slatsqr.f +++ b/SRC/slatsqr.f @@ -202,12 +202,12 @@ SUBROUTINE SLATSQR( M, N, MB, NB, A, LDA, T, LDT, WORK, INFO = -1 ELSE IF( N.LT.0 .OR. M.LT.N ) THEN INFO = -2 - ELSE IF( MB.LE.N ) THEN + ELSE IF( MB.LT.1 ) THEN INFO = -3 ELSE IF( NB.LT.1 .OR. ( NB.GT.N .AND. N.GT.0 )) THEN INFO = -4 ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = -5 + INFO = -6 ELSE IF( LDT.LT.NB ) THEN INFO = -8 ELSE IF( LWORK.LT.(N*NB) .AND. (.NOT.LQUERY) ) THEN diff --git a/SRC/zlamtsqr.f b/SRC/zlamtsqr.f index ae0b1833ab..5030cb75fd 100644 --- a/SRC/zlamtsqr.f +++ b/SRC/zlamtsqr.f @@ -25,7 +25,7 @@ *> SIDE = 'L' SIDE = 'R' *> TRANS = 'N': Q * C C * Q *> TRANS = 'C': Q**H * C C * Q**H -*> where Q is a real orthogonal matrix defined as the product +*> where Q is a complex unitary matrix defined as the product *> of blocked elementary reflectors computed by tall skinny *> QR factorization (ZLATSQR) *> \endverbatim @@ -56,15 +56,14 @@ *> \param[in] N *> \verbatim *> N is INTEGER -*> The number of columns of the matrix C. M >= N >= 0. +*> The number of columns of the matrix C. N >= 0. *> \endverbatim *> *> \param[in] K *> \verbatim *> K is INTEGER *> The number of elementary reflectors whose product defines -*> the matrix Q. -*> N >= K >= 0; +*> the matrix Q. M >= K >= 0; *> *> \endverbatim *> @@ -164,8 +163,8 @@ * ===================== *> *> \verbatim -*> Tall-Skinny QR (TSQR) performs QR by a sequence of orthogonal transformations, -*> representing Q as a product of other orthogonal matrices +*> Tall-Skinny QR (TSQR) performs QR by a sequence of unitary transformations, +*> representing Q as a product of other unitary matrices *> Q = Q(1) * Q(2) * . . . * Q(k) *> where each Q(i) zeros out subdiagonal entries of a block of MB rows of A: *> Q(1) zeros out the subdiagonal entries of rows 1:MB of A @@ -244,12 +243,12 @@ SUBROUTINE ZLAMTSQR( SIDE, TRANS, M, N, K, MB, NB, A, LDA, T, INFO = -1 ELSE IF( .NOT.TRAN .AND. .NOT.NOTRAN ) THEN INFO = -2 + ELSE IF( M.LT.K ) THEN + INFO = -3 + ELSE IF( N.LT.0 ) THEN + INFO = -4 ELSE IF( K.LT.0 ) THEN INFO = -5 - ELSE IF( N.LT.K ) THEN - INFO = -4 - ELSE IF( M.LT.N ) THEN - INFO = -3 ELSE IF( K.LT.NB .OR. NB.LT.1 ) THEN INFO = -7 ELSE IF( LDA.LT.MAX( 1, Q ) ) THEN diff --git a/SRC/zlatsqr.f b/SRC/zlatsqr.f index 7069a47d28..ffdbc68c0c 100644 --- a/SRC/zlatsqr.f +++ b/SRC/zlatsqr.f @@ -202,12 +202,12 @@ SUBROUTINE ZLATSQR( M, N, MB, NB, A, LDA, T, LDT, WORK, INFO = -1 ELSE IF( N.LT.0 .OR. M.LT.N ) THEN INFO = -2 - ELSE IF( MB.LE.N ) THEN + ELSE IF( MB.LT.1 ) THEN INFO = -3 ELSE IF( NB.LT.1 .OR. ( NB.GT.N .AND. N.GT.0 )) THEN INFO = -4 ELSE IF( LDA.LT.MAX( 1, M ) ) THEN - INFO = -5 + INFO = -6 ELSE IF( LDT.LT.NB ) THEN INFO = -8 ELSE IF( LWORK.LT.(N*NB) .AND. (.NOT.LQUERY) ) THEN diff --git a/TESTING/LIN/cerrtsqr.f b/TESTING/LIN/cerrtsqr.f index 173e2e527e..5afc61e91b 100644 --- a/TESTING/LIN/cerrtsqr.f +++ b/TESTING/LIN/cerrtsqr.f @@ -70,7 +70,7 @@ SUBROUTINE CERRTSQR( PATH, NUNIT ) PARAMETER ( NMAX = 2 ) * .. * .. Local Scalars .. - INTEGER I, INFO, J, NB + INTEGER I, INFO, J, MB, NB * .. * .. Local Arrays .. COMPLEX A( NMAX, NMAX ), T( NMAX, NMAX ), W( NMAX ), @@ -130,6 +130,35 @@ SUBROUTINE CERRTSQR( PATH, NUNIT ) CALL CGEQR( 3, 2, A, 3, TAU, 8, W, 0, INFO ) CALL CHKXER( 'CGEQR', INFOT, NOUT, LERR, OK ) * +* CLATSQR +* + MB = 1 + NB = 1 + SRNAMT = 'CLATSQR' + INFOT = 1 + CALL CLATSQR( -1, 0, MB, NB, A, 1, TAU, 1, W, 1, INFO ) + CALL CHKXER( 'CLATSQR', INFOT, NOUT, LERR, OK ) + INFOT = 2 + CALL CLATSQR( 1, 2, MB, NB, A, 1, TAU, 1, W, 1, INFO ) + CALL CHKXER( 'CLATSQR', INFOT, NOUT, LERR, OK ) + CALL CLATSQR( 0, -1, MB, NB, A, 1, TAU, 1, W, 1, INFO ) + CALL CHKXER( 'CLATSQR', INFOT, NOUT, LERR, OK ) + INFOT = 3 + CALL CLATSQR( 2, 1, -1, NB, A, 2, TAU, 1, W, 1, INFO ) + CALL CHKXER( 'CLATSQR', INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL CLATSQR( 2, 1, MB, 2, A, 2, TAU, 1, W, 1, INFO ) + CALL CHKXER( 'CLATSQR', INFOT, NOUT, LERR, OK ) + INFOT = 6 + CALL CLATSQR( 2, 1, MB, NB, A, 1, TAU, 1, W, 1, INFO ) + CALL CHKXER( 'CLATSQR', INFOT, NOUT, LERR, OK ) + INFOT = 8 + CALL CLATSQR( 2, 1, MB, NB, A, 2, TAU, 0, W, 1, INFO ) + CALL CHKXER( 'CLATSQR', INFOT, NOUT, LERR, OK ) + INFOT = 10 + CALL CLATSQR( 2, 1, MB, NB, A, 2, TAU, 2, W, 0, INFO ) + CALL CHKXER( 'CLATSQR', INFOT, NOUT, LERR, OK ) +* * CGEMQR * TAU(1)=1 diff --git a/TESTING/LIN/derrtsqr.f b/TESTING/LIN/derrtsqr.f index 110f904d79..60da20b9f7 100644 --- a/TESTING/LIN/derrtsqr.f +++ b/TESTING/LIN/derrtsqr.f @@ -70,7 +70,7 @@ SUBROUTINE DERRTSQR( PATH, NUNIT ) PARAMETER ( NMAX = 2 ) * .. * .. Local Scalars .. - INTEGER I, INFO, J, NB + INTEGER I, INFO, J, MB, NB * .. * .. Local Arrays .. DOUBLE PRECISION A( NMAX, NMAX ), T( NMAX, NMAX ), W( NMAX ), @@ -130,6 +130,35 @@ SUBROUTINE DERRTSQR( PATH, NUNIT ) CALL DGEQR( 3, 2, A, 3, TAU, 7, W, 0, INFO ) CALL CHKXER( 'DGEQR', INFOT, NOUT, LERR, OK ) * +* DLATSQR +* + MB = 1 + NB = 1 + SRNAMT = 'DLATSQR' + INFOT = 1 + CALL DLATSQR( -1, 0, MB, NB, A, 1, TAU, 1, W, 1, INFO ) + CALL CHKXER( 'DLATSQR', INFOT, NOUT, LERR, OK ) + INFOT = 2 + CALL DLATSQR( 1, 2, MB, NB, A, 1, TAU, 1, W, 1, INFO ) + CALL CHKXER( 'DLATSQR', INFOT, NOUT, LERR, OK ) + CALL DLATSQR( 0, -1, MB, NB, A, 1, TAU, 1, W, 1, INFO ) + CALL CHKXER( 'DLATSQR', INFOT, NOUT, LERR, OK ) + INFOT = 3 + CALL DLATSQR( 2, 1, -1, NB, A, 2, TAU, 1, W, 1, INFO ) + CALL CHKXER( 'DLATSQR', INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL DLATSQR( 2, 1, MB, 2, A, 2, TAU, 1, W, 1, INFO ) + CALL CHKXER( 'DLATSQR', INFOT, NOUT, LERR, OK ) + INFOT = 6 + CALL DLATSQR( 2, 1, MB, NB, A, 1, TAU, 1, W, 1, INFO ) + CALL CHKXER( 'DLATSQR', INFOT, NOUT, LERR, OK ) + INFOT = 8 + CALL DLATSQR( 2, 1, MB, NB, A, 2, TAU, 0, W, 1, INFO ) + CALL CHKXER( 'DLATSQR', INFOT, NOUT, LERR, OK ) + INFOT = 10 + CALL DLATSQR( 2, 1, MB, NB, A, 2, TAU, 2, W, 0, INFO ) + CALL CHKXER( 'DLATSQR', INFOT, NOUT, LERR, OK ) +* * DGEMQR * TAU(1)=1 diff --git a/TESTING/LIN/serrtsqr.f b/TESTING/LIN/serrtsqr.f index 78dd0c57dd..f9bbca0cbf 100644 --- a/TESTING/LIN/serrtsqr.f +++ b/TESTING/LIN/serrtsqr.f @@ -70,7 +70,7 @@ SUBROUTINE SERRTSQR( PATH, NUNIT ) PARAMETER ( NMAX = 2 ) * .. * .. Local Scalars .. - INTEGER I, INFO, J, NB + INTEGER I, INFO, J, MB, NB * .. * .. Local Arrays .. REAL A( NMAX, NMAX ), T( NMAX, NMAX ), W( NMAX ), @@ -130,6 +130,35 @@ SUBROUTINE SERRTSQR( PATH, NUNIT ) CALL SGEQR( 3, 2, A, 3, TAU, 7, W, 0, INFO ) CALL CHKXER( 'SGEQR', INFOT, NOUT, LERR, OK ) * +* SLATSQR +* + MB = 1 + NB = 1 + SRNAMT = 'SLATSQR' + INFOT = 1 + CALL SLATSQR( -1, 0, MB, NB, A, 1, TAU, 1, W, 1, INFO ) + CALL CHKXER( 'SLATSQR', INFOT, NOUT, LERR, OK ) + INFOT = 2 + CALL SLATSQR( 1, 2, MB, NB, A, 1, TAU, 1, W, 1, INFO ) + CALL CHKXER( 'SLATSQR', INFOT, NOUT, LERR, OK ) + CALL SLATSQR( 0, -1, MB, NB, A, 1, TAU, 1, W, 1, INFO ) + CALL CHKXER( 'SLATSQR', INFOT, NOUT, LERR, OK ) + INFOT = 3 + CALL SLATSQR( 2, 1, -1, NB, A, 2, TAU, 1, W, 1, INFO ) + CALL CHKXER( 'SLATSQR', INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL SLATSQR( 2, 1, MB, 2, A, 2, TAU, 1, W, 1, INFO ) + CALL CHKXER( 'SLATSQR', INFOT, NOUT, LERR, OK ) + INFOT = 6 + CALL SLATSQR( 2, 1, MB, NB, A, 1, TAU, 1, W, 1, INFO ) + CALL CHKXER( 'SLATSQR', INFOT, NOUT, LERR, OK ) + INFOT = 8 + CALL SLATSQR( 2, 1, MB, NB, A, 2, TAU, 0, W, 1, INFO ) + CALL CHKXER( 'SLATSQR', INFOT, NOUT, LERR, OK ) + INFOT = 10 + CALL SLATSQR( 2, 1, MB, NB, A, 2, TAU, 2, W, 0, INFO ) + CALL CHKXER( 'SLATSQR', INFOT, NOUT, LERR, OK ) +* * SGEMQR * TAU(1)=1 diff --git a/TESTING/LIN/zerrtsqr.f b/TESTING/LIN/zerrtsqr.f index d874ae8392..6f18c12f7c 100644 --- a/TESTING/LIN/zerrtsqr.f +++ b/TESTING/LIN/zerrtsqr.f @@ -70,7 +70,7 @@ SUBROUTINE ZERRTSQR( PATH, NUNIT ) PARAMETER ( NMAX = 2 ) * .. * .. Local Scalars .. - INTEGER I, INFO, J, NB + INTEGER I, INFO, J, MB, NB * .. * .. Local Arrays .. COMPLEX*16 A( NMAX, NMAX ), T( NMAX, NMAX ), W( NMAX ), @@ -130,6 +130,35 @@ SUBROUTINE ZERRTSQR( PATH, NUNIT ) CALL ZGEQR( 3, 2, A, 3, TAU, 8, W, 0, INFO ) CALL CHKXER( 'ZGEQR', INFOT, NOUT, LERR, OK ) * +* ZLATSQR +* + MB = 1 + NB = 1 + SRNAMT = 'ZLATSQR' + INFOT = 1 + CALL ZLATSQR( -1, 0, MB, NB, A, 1, TAU, 1, W, 1, INFO ) + CALL CHKXER( 'ZLATSQR', INFOT, NOUT, LERR, OK ) + INFOT = 2 + CALL ZLATSQR( 1, 2, MB, NB, A, 1, TAU, 1, W, 1, INFO ) + CALL CHKXER( 'ZLATSQR', INFOT, NOUT, LERR, OK ) + CALL ZLATSQR( 0, -1, MB, NB, A, 1, TAU, 1, W, 1, INFO ) + CALL CHKXER( 'ZLATSQR', INFOT, NOUT, LERR, OK ) + INFOT = 3 + CALL ZLATSQR( 2, 1, -1, NB, A, 2, TAU, 1, W, 1, INFO ) + CALL CHKXER( 'ZLATSQR', INFOT, NOUT, LERR, OK ) + INFOT = 4 + CALL ZLATSQR( 2, 1, MB, 2, A, 2, TAU, 1, W, 1, INFO ) + CALL CHKXER( 'ZLATSQR', INFOT, NOUT, LERR, OK ) + INFOT = 6 + CALL ZLATSQR( 2, 1, MB, NB, A, 1, TAU, 1, W, 1, INFO ) + CALL CHKXER( 'ZLATSQR', INFOT, NOUT, LERR, OK ) + INFOT = 8 + CALL ZLATSQR( 2, 1, MB, NB, A, 2, TAU, 0, W, 1, INFO ) + CALL CHKXER( 'ZLATSQR', INFOT, NOUT, LERR, OK ) + INFOT = 10 + CALL ZLATSQR( 2, 1, MB, NB, A, 2, TAU, 2, W, 0, INFO ) + CALL CHKXER( 'ZLATSQR', INFOT, NOUT, LERR, OK ) +* * ZGEMQR * TAU(1)=1