1 C> \brief \b CGEQRF VARIANT: left-looking Level 3 BLAS version of the algorithm.
3 * =========== DOCUMENTATION ===========
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
11 * SUBROUTINE CGEQRF ( M, N, A, LDA, TAU, WORK, LWORK, INFO )
13 * .. Scalar Arguments ..
14 * INTEGER INFO, LDA, LWORK, M, N
16 * .. Array Arguments ..
17 * COMPLEX A( LDA, * ), TAU( * ), WORK( * )
23 C>\details \b Purpose:
26 C> CGEQRF computes a QR factorization of a real M-by-N matrix A:
29 C> This is the left-looking Level 3 BLAS version of the algorithm.
39 C> The number of rows of the matrix A. M >= 0.
45 C> The number of columns of the matrix A. N >= 0.
50 C> A is COMPLEX array, dimension (LDA,N)
51 C> On entry, the M-by-N matrix A.
52 C> On exit, the elements on and above the diagonal of the array
53 C> contain the min(M,N)-by-N upper trapezoidal matrix R (R is
54 C> upper triangular if m >= n); the elements below the diagonal,
55 C> with the array TAU, represent the orthogonal matrix Q as a
56 C> product of min(m,n) elementary reflectors (see Further
63 C> The leading dimension of the array A. LDA >= max(1,M).
68 C> TAU is COMPLEX array, dimension (min(M,N))
69 C> The scalar factors of the elementary reflectors (see Further
75 C> WORK is COMPLEX array, dimension (MAX(1,LWORK))
76 C> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
84 C> The dimension of the array WORK. The dimension can be divided into three parts.
87 C> 1) The part for the triangular factor T. If the very last T is not bigger
88 C> than any of the rest, then this part is NB x ceiling(K/NB), otherwise,
89 C> NB x (K-NT), where K = min(M,N) and NT is the dimension of the very last T
92 C> 2) The part for the very last T when T is bigger than any of the rest T.
93 C> The size of this part is NT x NT, where NT = K - ceiling ((K-NX)/NB) x NB,
94 C> where K = min(M,N), NX is calculated by
95 C> NX = MAX( 0, ILAENV( 3, 'CGEQRF', ' ', M, N, -1, -1 ) )
98 C> 3) The part for dlarfb is of size max((N-M)*K, (N-M)*NB, K*NB, NB*NB)
101 C> So LWORK = part1 + part2 + part3
104 C> If LWORK = -1, then a workspace query is assumed; the routine
105 C> only calculates the optimal size of the WORK array, returns
106 C> this value as the first entry of the WORK array, and no error
107 C> message related to LWORK is issued by XERBLA.
113 C> = 0: successful exit
114 C> < 0: if INFO = -i, the i-th argument had an illegal value
121 C> \author Univ. of Tennessee
122 C> \author Univ. of California Berkeley
123 C> \author Univ. of Colorado Denver
126 C> \date November 2011
128 C> \ingroup variantsGEcomputational
132 C>\details \b Further \b Details
135 C> The matrix Q is represented as a product of elementary reflectors
137 C> Q = H(1) H(2) . . . H(k), where k = min(m,n).
139 C> Each H(i) has the form
141 C> H(i) = I - tau * v * v'
143 C> where tau is a real scalar, and v is a real vector with
144 C> v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in A(i+1:m,i),
145 C> and tau in TAU(i).
149 * =====================================================================
150 SUBROUTINE CGEQRF ( M, N, A, LDA, TAU, WORK, LWORK, INFO )
152 * -- LAPACK computational routine (version 3.1) --
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, LWORK, M, N
160 * .. Array Arguments ..
161 COMPLEX A( LDA, * ), TAU( * ), WORK( * )
164 * =====================================================================
166 * .. Local Scalars ..
168 INTEGER I, IB, IINFO, IWS, J, K, LWKOPT, NB,
169 $ NBMIN, NX, LBWORK, NT, LLWORK
171 * .. External Subroutines ..
172 EXTERNAL CGEQR2, CLARFB, CLARFT, XERBLA
174 * .. Intrinsic Functions ..
177 * .. External Functions ..
180 EXTERNAL ILAENV, SCEIL
182 * .. Executable Statements ..
189 NB = ILAENV( 1, 'CGEQRF', ' ', M, N, -1, -1 )
191 IF( NB.GT.1 .AND. NB.LT.K ) THEN
193 * Determine when to cross over from blocked to unblocked code.
195 NX = MAX( 0, ILAENV( 3, 'CGEQRF', ' ', M, N, -1, -1 ) )
198 * Get NT, the size of the very last T, which is the left-over from in-between K-NX and K to K, eg.:
202 * 1--2--3--4--5--6--7--8--9--10
206 * So here 4 x 4 is the last T stored in the workspace
208 NT = K-SCEIL(REAL(K-NX)/REAL(NB))*NB
211 * optimal workspace = space for dlarfb + space for normal T's + space for the last T
213 LLWORK = MAX (MAX((N-M)*K, (N-M)*NB), MAX(K*NB, NB*NB))
214 LLWORK = SCEIL(REAL(LLWORK)/REAL(NB))
220 * Optimal workspace for dlarfb = MAX(1,N)*NT
222 LWKOPT = (LBWORK+LLWORK)*NB
223 WORK( 1 ) = (LWKOPT+NT*NT)
227 LBWORK = SCEIL(REAL(K)/REAL(NB))*NB
228 LWKOPT = (LBWORK+LLWORK-NB)*NB
234 * Test the input arguments
236 LQUERY = ( LWORK.EQ.-1 )
239 ELSE IF( N.LT.0 ) THEN
241 ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
243 ELSE IF( LWORK.LT.MAX( 1, N ) .AND. .NOT.LQUERY ) THEN
247 CALL XERBLA( 'CGEQRF', -INFO )
249 ELSE IF( LQUERY ) THEN
253 * Quick return if possible
260 IF( NB.GT.1 .AND. NB.LT.K ) THEN
264 * Determine if workspace is large enough for blocked code.
267 IWS = (LBWORK+LLWORK-NB)*NB
269 IWS = (LBWORK+LLWORK)*NB+NT*NT
272 IF( LWORK.LT.IWS ) THEN
274 * Not enough workspace to use optimal NB: reduce NB and
275 * determine the minimum value of NB.
278 NB = LWORK / (LLWORK+(LBWORK-NB))
280 NB = (LWORK-NT*NT)/(LBWORK+LLWORK)
283 NBMIN = MAX( 2, ILAENV( 2, 'CGEQRF', ' ', M, N, -1,
289 IF( NB.GE.NBMIN .AND. NB.LT.K .AND. NX.LT.K ) THEN
291 * Use blocked code initially
293 DO 10 I = 1, K - NX, NB
294 IB = MIN( K-I+1, NB )
296 * Update the current column using old T's
298 DO 20 J = 1, I - NB, NB
300 * Apply H' to A(J:M,I:I+IB-1) from the left
302 CALL CLARFB( 'Left', 'Transpose', 'Forward',
303 $ 'Columnwise', M-J+1, IB, NB,
304 $ A( J, J ), LDA, WORK(J), LBWORK,
305 $ A( J, I ), LDA, WORK(LBWORK*NB+NT*NT+1),
310 * Compute the QR factorization of the current block
313 CALL CGEQR2( M-I+1, IB, A( I, I ), LDA, TAU( I ),
314 $ WORK(LBWORK*NB+NT*NT+1), IINFO )
318 * Form the triangular factor of the block reflector
319 * H = H(i) H(i+1) . . . H(i+ib-1)
321 CALL CLARFT( 'Forward', 'Columnwise', M-I+1, IB,
322 $ A( I, I ), LDA, TAU( I ),
331 * Use unblocked code to factor the last or only block.
337 DO 30 J = 1, I - NB, NB
339 * Apply H' to A(J:M,I:K) from the left
341 CALL CLARFB( 'Left', 'Transpose', 'Forward',
342 $ 'Columnwise', M-J+1, K-I+1, NB,
343 $ A( J, J ), LDA, WORK(J), LBWORK,
344 $ A( J, I ), LDA, WORK(LBWORK*NB+NT*NT+1),
348 CALL CGEQR2( M-I+1, K-I+1, A( I, I ), LDA, TAU( I ),
349 $ WORK(LBWORK*NB+NT*NT+1),IINFO )
353 * Use unblocked code to factor the last or only block.
355 CALL CGEQR2( M-I+1, N-I+1, A( I, I ), LDA, TAU( I ),
363 * Apply update to the column M+1:N when N > M
365 IF ( M.LT.N .AND. I.NE.1) THEN
367 * Form the last triangular factor of the block reflector
368 * H = H(i) H(i+1) . . . H(i+ib-1)
370 IF ( NT .LE. NB ) THEN
371 CALL CLARFT( 'Forward', 'Columnwise', M-I+1, K-I+1,
372 $ A( I, I ), LDA, TAU( I ), WORK(I), LBWORK )
374 CALL CLARFT( 'Forward', 'Columnwise', M-I+1, K-I+1,
375 $ A( I, I ), LDA, TAU( I ),
376 $ WORK(LBWORK*NB+1), NT )
380 * Apply H' to A(1:M,M+1:N) from the left
382 DO 40 J = 1, K-NX, NB
384 IB = MIN( K-J+1, NB )
386 CALL CLARFB( 'Left', 'Transpose', 'Forward',
387 $ 'Columnwise', M-J+1, N-M, IB,
388 $ A( J, J ), LDA, WORK(J), LBWORK,
389 $ A( J, M+1 ), LDA, WORK(LBWORK*NB+NT*NT+1),
395 CALL CLARFB( 'Left', 'Transpose', 'Forward',
396 $ 'Columnwise', M-J+1, N-M, K-J+1,
397 $ A( J, J ), LDA, WORK(J), LBWORK,
398 $ A( J, M+1 ), LDA, WORK(LBWORK*NB+NT*NT+1),
401 CALL CLARFB( 'Left', 'Transpose', 'Forward',
402 $ 'Columnwise', M-J+1, N-M, K-J+1,
405 $ NT, A( J, M+1 ), LDA, WORK(LBWORK*NB+NT*NT+1),