Skip to content

Commit

Permalink
Fix mixed up column count of rhs (n) and original matrix (k)
Browse files Browse the repository at this point in the history
* add input parameter tests
* revert check of n when it denotes the column of the matrix to be updated
  and correct the docs
* relax constraint on mb and update docs - special cases outside of the docs
  are handled by a call to GEQRT
  • Loading branch information
angsch committed Apr 3, 2022
1 parent 2f132ee commit 11d3fa9
Show file tree
Hide file tree
Showing 12 changed files with 159 additions and 47 deletions.
19 changes: 9 additions & 10 deletions SRC/clamtsqr.f
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
*>
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions SRC/clatsqr.f
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
13 changes: 6 additions & 7 deletions SRC/dlamtsqr.f
Original file line number Diff line number Diff line change
Expand Up @@ -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
*>
Expand Down Expand Up @@ -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
Expand Down
6 changes: 3 additions & 3 deletions SRC/dlatsqr.f
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
13 changes: 6 additions & 7 deletions SRC/slamtsqr.f
Original file line number Diff line number Diff line change
Expand Up @@ -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
*>
Expand Down Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions SRC/slatsqr.f
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
19 changes: 9 additions & 10 deletions SRC/zlamtsqr.f
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
*>
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions SRC/zlatsqr.f
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
31 changes: 30 additions & 1 deletion TESTING/LIN/cerrtsqr.f
Original file line number Diff line number Diff line change
Expand Up @@ -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 ),
Expand Down Expand Up @@ -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
Expand Down
31 changes: 30 additions & 1 deletion TESTING/LIN/derrtsqr.f
Original file line number Diff line number Diff line change
Expand Up @@ -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 ),
Expand Down Expand Up @@ -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
Expand Down
31 changes: 30 additions & 1 deletion TESTING/LIN/serrtsqr.f
Original file line number Diff line number Diff line change
Expand Up @@ -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 ),
Expand Down Expand Up @@ -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
Expand Down
Loading

0 comments on commit 11d3fa9

Please sign in to comment.