5 * SUBROUTINE DLATSQR( M, N, MB, NB, A, LDA, T, LDT, WORK,
8 * .. Scalar Arguments ..
9 * INTEGER INFO, LDA, M, N, MB, NB, LDT, LWORK
11 * .. Array Arguments ..
12 * DOUBLE PRECISION A( LDA, * ), T( LDT, * ), WORK( * )
21 *> DLATSQR computes a blocked Tall-Skinny QR factorization of
22 *> an M-by-N matrix A, where M >= N:
32 *> The number of rows of the matrix A. M >= 0.
38 *> The number of columns of the matrix A. M >= N >= 0.
44 *> The row block size to be used in the blocked QR.
51 *> The column block size to be used in the blocked QR.
57 *> A is DOUBLE PRECISION array, dimension (LDA,N)
58 *> On entry, the M-by-N matrix A.
59 *> On exit, the elements on and above the diagonal
60 *> of the array contain the N-by-N upper triangular matrix R;
61 *> the elements below the diagonal represent Q by the columns
62 *> of blocked V (see Further Details).
68 *> The leading dimension of the array A. LDA >= max(1,M).
73 *> T is DOUBLE PRECISION array,
74 *> dimension (LDT, N * Number_of_row_blocks)
75 *> where Number_of_row_blocks = CEIL((M-N)/(MB-N))
76 *> The blocked upper triangular block reflectors stored in compact form
77 *> as a sequence of upper triangular blocks.
78 *> See Further Details below.
84 *> The leading dimension of the array T. LDT >= NB.
89 *> (workspace) DOUBLE PRECISION array, dimension (MAX(1,LWORK))
94 *> The dimension of the array WORK. LWORK >= NB*N.
95 *> If LWORK = -1, then a workspace query is assumed; the routine
96 *> only calculates the optimal size of the WORK array, returns
97 *> this value as the first entry of the WORK array, and no error
98 *> message related to LWORK is issued by XERBLA.
104 *> = 0: successful exit
105 *> < 0: if INFO = -i, the i-th argument had an illegal value
111 *> \author Univ. of Tennessee
112 *> \author Univ. of California Berkeley
113 *> \author Univ. of Colorado Denver
116 *> \par Further Details:
117 * =====================
120 *> Tall-Skinny QR (TSQR) performs QR by a sequence of orthogonal transformations,
121 *> representing Q as a product of other orthogonal matrices
122 *> Q = Q(1) * Q(2) * . . . * Q(k)
123 *> where each Q(i) zeros out subdiagonal entries of a block of MB rows of A:
124 *> Q(1) zeros out the subdiagonal entries of rows 1:MB of A
125 *> Q(2) zeros out the bottom MB-N rows of rows [1:N,MB+1:2*MB-N] of A
126 *> Q(3) zeros out the bottom MB-N rows of rows [1:N,2*MB-N+1:3*MB-2*N] of A
129 *> Q(1) is computed by GEQRT, which represents Q(1) by Householder vectors
130 *> stored under the diagonal of rows 1:MB of A, and by upper triangular
131 *> block reflectors, stored in array T(1:LDT,1:N).
132 *> For more information see Further Details in GEQRT.
134 *> Q(i) for i>1 is computed by TPQRT, which represents Q(i) by Householder vectors
135 *> stored in rows [(i-1)*(MB-N)+N+1:i*(MB-N)+N] of A, and by upper triangular
136 *> block reflectors, stored in array T(1:LDT,(i-1)*N+1:i*N).
137 *> The last Q(k) may use fewer rows.
138 *> For more information see Further Details in TPQRT.
140 *> For more details of the overall algorithm, see the description of
141 *> Sequential TSQR in Section 2.2 of [1].
143 *> [1] “Communication-Optimal Parallel and Sequential QR and LU Factorizations,”
144 *> J. Demmel, L. Grigori, M. Hoemmen, J. Langou,
145 *> SIAM J. Sci. Comput, vol. 34, no. 1, 2012
148 * =====================================================================
149 SUBROUTINE DLATSQR( M, N, MB, NB, A, LDA, T, LDT, WORK,
152 * -- LAPACK computational routine (version 3.5.0) --
153 * -- LAPACK is a software package provided by Univ. of Tennessee, --
154 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd. --
157 * .. Scalar Arguments ..
158 INTEGER INFO, LDA, M, N, MB, NB, LDT, LWORK
160 * .. Array Arguments ..
161 DOUBLE PRECISION A( LDA, * ), WORK( * ), T(LDT, *)
164 * =====================================================================
167 * .. Local Scalars ..
169 INTEGER I, II, KK, CTR
171 * .. EXTERNAL FUNCTIONS ..
174 * .. EXTERNAL SUBROUTINES ..
175 EXTERNAL DGEQRT, DTPQRT, XERBLA
176 * .. INTRINSIC FUNCTIONS ..
177 INTRINSIC MAX, MIN, MOD
179 * .. EXECUTABLE STATEMENTS ..
181 * TEST THE INPUT ARGUMENTS
185 LQUERY = ( LWORK.EQ.-1 )
189 ELSE IF( N.LT.0 .OR. M.LT.N ) THEN
191 ELSE IF( MB.LE.N ) THEN
193 ELSE IF( NB.LT.1 .OR. ( NB.GT.N .AND. N.GT.0 )) THEN
195 ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
197 ELSE IF( LDT.LT.NB ) THEN
199 ELSE IF( LWORK.LT.(N*NB) .AND. (.NOT.LQUERY) ) THEN
206 CALL XERBLA( 'DLATSQR', -INFO )
208 ELSE IF (LQUERY) THEN
212 * Quick return if possible
214 IF( MIN(M,N).EQ.0 ) THEN
218 * The QR Decomposition
220 IF ((MB.LE.N).OR.(MB.GE.M)) THEN
221 CALL DGEQRT( M, N, NB, A, LDA, T, LDT, WORK, INFO)
225 KK = MOD((M-N),(MB-N))
228 * Compute the QR factorization of the first block A(1:MB,1:N)
230 CALL DGEQRT( MB, N, NB, A(1,1), LDA, T, LDT, WORK, INFO )
233 DO I = MB+1, II-MB+N , (MB-N)
235 * Compute the QR factorization of the current block A(I:I+MB-N,1:N)
237 CALL DTPQRT( MB-N, N, 0, NB, A(1,1), LDA, A( I, 1 ), LDA,
243 * Compute the QR factorization of the last block A(II:M,1:N)
246 CALL DTPQRT( KK, N, 0, NB, A(1,1), LDA, A( II, 1 ), LDA,
247 $ T(1, CTR * N + 1), LDT,