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