1*> \brief \b CGELQT 2* 3* Definition: 4* =========== 5* 6* SUBROUTINE CGELQT( M, N, MB, A, LDA, T, LDT, WORK, INFO ) 7* 8* .. Scalar Arguments .. 9* INTEGER INFO, LDA, LDT, M, N, MB 10* .. 11* .. Array Arguments .. 12* COMPLEX A( LDA, * ), T( LDT, * ), WORK( * ) 13* .. 14* 15* 16*> \par Purpose: 17* ============= 18*> 19*> \verbatim 20*> 21*> CGELQT computes a blocked LQ factorization of a complex M-by-N matrix A 22*> using the compact WY representation of Q. 23*> \endverbatim 24* 25* Arguments: 26* ========== 27* 28*> \param[in] M 29*> \verbatim 30*> M is INTEGER 31*> The number of rows of the matrix A. M >= 0. 32*> \endverbatim 33*> 34*> \param[in] N 35*> \verbatim 36*> N is INTEGER 37*> The number of columns of the matrix A. N >= 0. 38*> \endverbatim 39*> 40*> \param[in] MB 41*> \verbatim 42*> MB is INTEGER 43*> The block size to be used in the blocked QR. MIN(M,N) >= MB >= 1. 44*> \endverbatim 45*> 46*> \param[in,out] A 47*> \verbatim 48*> A is COMPLEX array, dimension (LDA,N) 49*> On entry, the M-by-N matrix A. 50*> On exit, the elements on and below the diagonal of the array 51*> contain the M-by-MIN(M,N) lower trapezoidal matrix L (L is 52*> lower triangular if M <= N); the elements above the diagonal 53*> are the rows of V. 54*> \endverbatim 55*> 56*> \param[in] LDA 57*> \verbatim 58*> LDA is INTEGER 59*> The leading dimension of the array A. LDA >= max(1,M). 60*> \endverbatim 61*> 62*> \param[out] T 63*> \verbatim 64*> T is COMPLEX array, dimension (LDT,MIN(M,N)) 65*> The upper triangular block reflectors stored in compact form 66*> as a sequence of upper triangular blocks. See below 67*> for further details. 68*> \endverbatim 69*> 70*> \param[in] LDT 71*> \verbatim 72*> LDT is INTEGER 73*> The leading dimension of the array T. LDT >= MB. 74*> \endverbatim 75*> 76*> \param[out] WORK 77*> \verbatim 78*> WORK is COMPLEX array, dimension (MB*N) 79*> \endverbatim 80*> 81*> \param[out] INFO 82*> \verbatim 83*> INFO is INTEGER 84*> = 0: successful exit 85*> < 0: if INFO = -i, the i-th argument had an illegal value 86*> \endverbatim 87* 88* Authors: 89* ======== 90* 91*> \author Univ. of Tennessee 92*> \author Univ. of California Berkeley 93*> \author Univ. of Colorado Denver 94*> \author NAG Ltd. 95* 96*> \ingroup doubleGEcomputational 97* 98*> \par Further Details: 99* ===================== 100*> 101*> \verbatim 102*> 103*> The matrix V stores the elementary reflectors H(i) in the i-th row 104*> above the diagonal. For example, if M=5 and N=3, the matrix V is 105*> 106*> V = ( 1 v1 v1 v1 v1 ) 107*> ( 1 v2 v2 v2 ) 108*> ( 1 v3 v3 ) 109*> 110*> 111*> where the vi's represent the vectors which define H(i), which are returned 112*> in the matrix A. The 1's along the diagonal of V are not stored in A. 113*> Let K=MIN(M,N). The number of blocks is B = ceiling(K/MB), where each 114*> block is of order MB except for the last block, which is of order 115*> IB = K - (B-1)*MB. For each of the B blocks, a upper triangular block 116*> reflector factor is computed: T1, T2, ..., TB. The MB-by-MB (and IB-by-IB 117*> for the last block) T's are stored in the MB-by-K matrix T as 118*> 119*> T = (T1 T2 ... TB). 120*> \endverbatim 121*> 122* ===================================================================== 123 SUBROUTINE CGELQT( M, N, MB, A, LDA, T, LDT, WORK, INFO ) 124* 125* -- LAPACK computational routine -- 126* -- LAPACK is a software package provided by Univ. of Tennessee, -- 127* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 128* 129* .. Scalar Arguments .. 130 INTEGER INFO, LDA, LDT, M, N, MB 131* .. 132* .. Array Arguments .. 133 COMPLEX A( LDA, * ), T( LDT, * ), WORK( * ) 134* .. 135* 136* ===================================================================== 137* 138* .. 139* .. Local Scalars .. 140 INTEGER I, IB, IINFO, K 141* .. 142* .. External Subroutines .. 143 EXTERNAL CGELQT3, CLARFB, XERBLA 144* .. 145* .. Executable Statements .. 146* 147* Test the input arguments 148* 149 INFO = 0 150 IF( M.LT.0 ) THEN 151 INFO = -1 152 ELSE IF( N.LT.0 ) THEN 153 INFO = -2 154 ELSE IF( MB.LT.1 .OR. (MB.GT.MIN(M,N) .AND. MIN(M,N).GT.0 ))THEN 155 INFO = -3 156 ELSE IF( LDA.LT.MAX( 1, M ) ) THEN 157 INFO = -5 158 ELSE IF( LDT.LT.MB ) THEN 159 INFO = -7 160 END IF 161 IF( INFO.NE.0 ) THEN 162 CALL XERBLA( 'CGELQT', -INFO ) 163 RETURN 164 END IF 165* 166* Quick return if possible 167* 168 K = MIN( M, N ) 169 IF( K.EQ.0 ) RETURN 170* 171* Blocked loop of length K 172* 173 DO I = 1, K, MB 174 IB = MIN( K-I+1, MB ) 175* 176* Compute the LQ factorization of the current block A(I:M,I:I+IB-1) 177* 178 CALL CGELQT3( IB, N-I+1, A(I,I), LDA, T(1,I), LDT, IINFO ) 179 IF( I+IB.LE.M ) THEN 180* 181* Update by applying H**T to A(I:M,I+IB:N) from the right 182* 183 CALL CLARFB( 'R', 'N', 'F', 'R', M-I-IB+1, N-I+1, IB, 184 $ A( I, I ), LDA, T( 1, I ), LDT, 185 $ A( I+IB, I ), LDA, WORK , M-I-IB+1 ) 186 END IF 187 END DO 188 RETURN 189* 190* End of CGELQT 191* 192 END 193