1*> \brief \b ZGERQS
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 ZGERQS( 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*16         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 RQ factorization
31*>     A = R*Q
32*> computed by ZGERQF.
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*16 array, dimension (LDA,N)
59*>          Details of the RQ factorization of the original matrix A as
60*>          returned by ZGERQF.
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*16 array, dimension (M)
72*>          Details of the orthogonal matrix Q.
73*> \endverbatim
74*>
75*> \param[in,out] B
76*> \verbatim
77*>          B is COMPLEX*16 array, dimension (LDB,NRHS)
78*>          On entry, the right hand side vectors for the linear system.
79*>          On exit, the solution vectors X.  Each solution vector
80*>          is contained in rows 1:N of a column of B.
81*> \endverbatim
82*>
83*> \param[in] LDB
84*> \verbatim
85*>          LDB is INTEGER
86*>          The leading dimension of the array B. LDB >= max(1,N).
87*> \endverbatim
88*>
89*> \param[out] WORK
90*> \verbatim
91*>          WORK is COMPLEX*16 array, dimension (LWORK)
92*> \endverbatim
93*>
94*> \param[in] LWORK
95*> \verbatim
96*>          LWORK is INTEGER
97*>          The length of the array WORK.  LWORK must be at least NRHS,
98*>          and should be at least NRHS*NB, where NB is the block size
99*>          for this environment.
100*> \endverbatim
101*>
102*> \param[out] INFO
103*> \verbatim
104*>          INFO is INTEGER
105*>          = 0: successful exit
106*>          < 0: if INFO = -i, the i-th argument had an illegal value
107*> \endverbatim
108*
109*  Authors:
110*  ========
111*
112*> \author Univ. of Tennessee
113*> \author Univ. of California Berkeley
114*> \author Univ. of Colorado Denver
115*> \author NAG Ltd.
116*
117*> \date November 2011
118*
119*> \ingroup complex16_lin
120*
121*  =====================================================================
122      SUBROUTINE ZGERQS( M, N, NRHS, A, LDA, TAU, B, LDB, WORK, LWORK,
123     $                   INFO )
124*
125*  -- LAPACK test routine (version 3.4.0) --
126*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
127*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
128*     November 2011
129*
130*     .. Scalar Arguments ..
131      INTEGER            INFO, LDA, LDB, LWORK, M, N, NRHS
132*     ..
133*     .. Array Arguments ..
134      COMPLEX*16         A( LDA, * ), B( LDB, * ), TAU( * ),
135     $                   WORK( LWORK )
136*     ..
137*
138*  =====================================================================
139*
140*     .. Parameters ..
141      COMPLEX*16         CZERO, CONE
142      PARAMETER          ( CZERO = ( 0.0D+0, 0.0D+0 ),
143     $                   CONE = ( 1.0D+0, 0.0D+0 ) )
144*     ..
145*     .. External Subroutines ..
146      EXTERNAL           XERBLA, ZLASET, ZTRSM, ZUNMRQ
147*     ..
148*     .. Intrinsic Functions ..
149      INTRINSIC          MAX
150*     ..
151*     .. Executable Statements ..
152*
153*     Test the input parameters.
154*
155      INFO = 0
156      IF( M.LT.0 ) THEN
157         INFO = -1
158      ELSE IF( N.LT.0 .OR. M.GT.N ) THEN
159         INFO = -2
160      ELSE IF( NRHS.LT.0 ) THEN
161         INFO = -3
162      ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
163         INFO = -5
164      ELSE IF( LDB.LT.MAX( 1, N ) ) THEN
165         INFO = -8
166      ELSE IF( LWORK.LT.1 .OR. LWORK.LT.NRHS .AND. M.GT.0 .AND. N.GT.0 )
167     $          THEN
168         INFO = -10
169      END IF
170      IF( INFO.NE.0 ) THEN
171         CALL XERBLA( 'ZGERQS', -INFO )
172         RETURN
173      END IF
174*
175*     Quick return if possible
176*
177      IF( N.EQ.0 .OR. NRHS.EQ.0 .OR. M.EQ.0 )
178     $   RETURN
179*
180*     Solve R*X = B(n-m+1:n,:)
181*
182      CALL ZTRSM( 'Left', 'Upper', 'No transpose', 'Non-unit', M, NRHS,
183     $            CONE, A( 1, N-M+1 ), LDA, B( N-M+1, 1 ), LDB )
184*
185*     Set B(1:n-m,:) to zero
186*
187      CALL ZLASET( 'Full', N-M, NRHS, CZERO, CZERO, B, LDB )
188*
189*     B := Q' * B
190*
191      CALL ZUNMRQ( 'Left', 'Conjugate transpose', N, NRHS, M, A, LDA,
192     $             TAU, B, LDB, WORK, LWORK, INFO )
193*
194      RETURN
195*
196*     End of ZGERQS
197*
198      END
199