1*> \brief \b CGELQS
2*
3*  =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6*            http://www.netlib.org/lapack/explore-html/
7*
8*  Definition:
9*  ===========
10*
11*       SUBROUTINE CGELQS( M, N, NRHS, A, LDA, TAU, B, LDB, WORK, LWORK,
12*                          INFO )
13*
14*       .. Scalar Arguments ..
15*       INTEGER            INFO, LDA, LDB, LWORK, M, N, NRHS
16*       ..
17*       .. Array Arguments ..
18*       COMPLEX            A( LDA, * ), B( LDB, * ), TAU( * ),
19*      $                   WORK( LWORK )
20*       ..
21*
22*
23*> \par Purpose:
24*  =============
25*>
26*> \verbatim
27*>
28*> Compute a minimum-norm solution
29*>     min || A*X - B ||
30*> using the LQ factorization
31*>     A = L*Q
32*> computed by CGELQF.
33*> \endverbatim
34*
35*  Arguments:
36*  ==========
37*
38*> \param[in] M
39*> \verbatim
40*>          M is INTEGER
41*>          The number of rows of the matrix A.  M >= 0.
42*> \endverbatim
43*>
44*> \param[in] N
45*> \verbatim
46*>          N is INTEGER
47*>          The number of columns of the matrix A.  N >= M >= 0.
48*> \endverbatim
49*>
50*> \param[in] NRHS
51*> \verbatim
52*>          NRHS is INTEGER
53*>          The number of columns of B.  NRHS >= 0.
54*> \endverbatim
55*>
56*> \param[in] A
57*> \verbatim
58*>          A is COMPLEX array, dimension (LDA,N)
59*>          Details of the LQ factorization of the original matrix A as
60*>          returned by CGELQF.
61*> \endverbatim
62*>
63*> \param[in] LDA
64*> \verbatim
65*>          LDA is INTEGER
66*>          The leading dimension of the array A.  LDA >= M.
67*> \endverbatim
68*>
69*> \param[in] TAU
70*> \verbatim
71*>          TAU is COMPLEX array, dimension (M)
72*>          Details of the orthogonal matrix Q.
73*> \endverbatim
74*>
75*> \param[in,out] B
76*> \verbatim
77*>          B is COMPLEX array, dimension (LDB,NRHS)
78*>          On entry, the m-by-nrhs right hand side matrix B.
79*>          On exit, the n-by-nrhs solution matrix X.
80*> \endverbatim
81*>
82*> \param[in] LDB
83*> \verbatim
84*>          LDB is INTEGER
85*>          The leading dimension of the array B. LDB >= N.
86*> \endverbatim
87*>
88*> \param[out] WORK
89*> \verbatim
90*>          WORK is COMPLEX array, dimension (LWORK)
91*> \endverbatim
92*>
93*> \param[in] LWORK
94*> \verbatim
95*>          LWORK is INTEGER
96*>          The length of the array WORK.  LWORK must be at least NRHS,
97*>          and should be at least NRHS*NB, where NB is the block size
98*>          for this environment.
99*> \endverbatim
100*>
101*> \param[out] INFO
102*> \verbatim
103*>          INFO is INTEGER
104*>          = 0: successful exit
105*>          < 0: if INFO = -i, the i-th argument had an illegal value
106*> \endverbatim
107*
108*  Authors:
109*  ========
110*
111*> \author Univ. of Tennessee
112*> \author Univ. of California Berkeley
113*> \author Univ. of Colorado Denver
114*> \author NAG Ltd.
115*
116*> \date November 2011
117*
118*> \ingroup complex_lin
119*
120*  =====================================================================
121      SUBROUTINE CGELQS( M, N, NRHS, A, LDA, TAU, B, LDB, WORK, LWORK,
122     $                   INFO )
123*
124*  -- LAPACK test routine (version 3.4.0) --
125*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
126*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
127*     November 2011
128*
129*     .. Scalar Arguments ..
130      INTEGER            INFO, LDA, LDB, LWORK, M, N, NRHS
131*     ..
132*     .. Array Arguments ..
133      COMPLEX            A( LDA, * ), B( LDB, * ), TAU( * ),
134     $                   WORK( LWORK )
135*     ..
136*
137*  =====================================================================
138*
139*     .. Parameters ..
140      COMPLEX            CZERO, CONE
141      PARAMETER          ( CZERO = ( 0.0E+0, 0.0E+0 ),
142     $                   CONE = ( 1.0E+0, 0.0E+0 ) )
143*     ..
144*     .. External Subroutines ..
145      EXTERNAL           CLASET, CTRSM, CUNMLQ, XERBLA
146*     ..
147*     .. Intrinsic Functions ..
148      INTRINSIC          MAX
149*     ..
150*     .. Executable Statements ..
151*
152*     Test the input parameters.
153*
154      INFO = 0
155      IF( M.LT.0 ) THEN
156         INFO = -1
157      ELSE IF( N.LT.0 .OR. M.GT.N ) THEN
158         INFO = -2
159      ELSE IF( NRHS.LT.0 ) THEN
160         INFO = -3
161      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
162         INFO = -5
163      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
164         INFO = -8
165      ELSE IF( LWORK.LT.1 .OR. LWORK.LT.NRHS .AND. M.GT.0 .AND. N.GT.0 )
166     $          THEN
167         INFO = -10
168      END IF
169      IF( INFO.NE.0 ) THEN
170         CALL XERBLA( 'CGELQS', -INFO )
171         RETURN
172      END IF
173*
174*     Quick return if possible
175*
176      IF( N.EQ.0 .OR. NRHS.EQ.0 .OR. M.EQ.0 )
177     $   RETURN
178*
179*     Solve L*X = B(1:m,:)
180*
181      CALL CTRSM( 'Left', 'Lower', 'No transpose', 'Non-unit', M, NRHS,
182     $            CONE, A, LDA, B, LDB )
183*
184*     Set B(m+1:n,:) to zero
185*
186      IF( M.LT.N )
187     $   CALL CLASET( 'Full', N-M, NRHS, CZERO, CZERO, B( M+1, 1 ),
188     $                LDB )
189*
190*     B := Q' * B
191*
192      CALL CUNMLQ( 'Left', 'Conjugate transpose', N, NRHS, M, A, LDA,
193     $             TAU, B, LDB, WORK, LWORK, INFO )
194*
195      RETURN
196*
197*     End of CGELQS
198*
199      END
200