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