1*> \brief \b ZUNGR2 generates all or part of the unitary matrix Q from an RQ factorization determined by cgerqf (unblocked algorithm). 2* 3* =========== DOCUMENTATION =========== 4* 5* Online html documentation available at 6* http://www.netlib.org/lapack/explore-html/ 7* 8*> \htmlonly 9*> Download ZUNGR2 + dependencies 10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zungr2.f"> 11*> [TGZ]</a> 12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zungr2.f"> 13*> [ZIP]</a> 14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zungr2.f"> 15*> [TXT]</a> 16*> \endhtmlonly 17* 18* Definition: 19* =========== 20* 21* SUBROUTINE ZUNGR2( M, N, K, A, LDA, TAU, WORK, INFO ) 22* 23* .. Scalar Arguments .. 24* INTEGER INFO, K, LDA, M, N 25* .. 26* .. Array Arguments .. 27* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) 28* .. 29* 30* 31*> \par Purpose: 32* ============= 33*> 34*> \verbatim 35*> 36*> ZUNGR2 generates an m by n complex matrix Q with orthonormal rows, 37*> which is defined as the last m rows of a product of k elementary 38*> reflectors of order n 39*> 40*> Q = H(1)**H H(2)**H . . . H(k)**H 41*> 42*> as returned by ZGERQF. 43*> \endverbatim 44* 45* Arguments: 46* ========== 47* 48*> \param[in] M 49*> \verbatim 50*> M is INTEGER 51*> The number of rows of the matrix Q. M >= 0. 52*> \endverbatim 53*> 54*> \param[in] N 55*> \verbatim 56*> N is INTEGER 57*> The number of columns of the matrix Q. N >= M. 58*> \endverbatim 59*> 60*> \param[in] K 61*> \verbatim 62*> K is INTEGER 63*> The number of elementary reflectors whose product defines the 64*> matrix Q. M >= K >= 0. 65*> \endverbatim 66*> 67*> \param[in,out] A 68*> \verbatim 69*> A is COMPLEX*16 array, dimension (LDA,N) 70*> On entry, the (m-k+i)-th row must contain the vector which 71*> defines the elementary reflector H(i), for i = 1,2,...,k, as 72*> returned by ZGERQF in the last k rows of its array argument 73*> A. 74*> On exit, the m-by-n matrix Q. 75*> \endverbatim 76*> 77*> \param[in] LDA 78*> \verbatim 79*> LDA is INTEGER 80*> The first dimension of the array A. LDA >= max(1,M). 81*> \endverbatim 82*> 83*> \param[in] TAU 84*> \verbatim 85*> TAU is COMPLEX*16 array, dimension (K) 86*> TAU(i) must contain the scalar factor of the elementary 87*> reflector H(i), as returned by ZGERQF. 88*> \endverbatim 89*> 90*> \param[out] WORK 91*> \verbatim 92*> WORK is COMPLEX*16 array, dimension (M) 93*> \endverbatim 94*> 95*> \param[out] INFO 96*> \verbatim 97*> INFO is INTEGER 98*> = 0: successful exit 99*> < 0: if INFO = -i, the i-th argument has an illegal value 100*> \endverbatim 101* 102* Authors: 103* ======== 104* 105*> \author Univ. of Tennessee 106*> \author Univ. of California Berkeley 107*> \author Univ. of Colorado Denver 108*> \author NAG Ltd. 109* 110*> \date September 2012 111* 112*> \ingroup complex16OTHERcomputational 113* 114* ===================================================================== 115 SUBROUTINE ZUNGR2( M, N, K, A, LDA, TAU, WORK, INFO ) 116* 117* -- LAPACK computational routine (version 3.4.2) -- 118* -- LAPACK is a software package provided by Univ. of Tennessee, -- 119* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 120* September 2012 121* 122* .. Scalar Arguments .. 123 INTEGER INFO, K, LDA, M, N 124* .. 125* .. Array Arguments .. 126 COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * ) 127* .. 128* 129* ===================================================================== 130* 131* .. Parameters .. 132 COMPLEX*16 ONE, ZERO 133 PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ), 134 $ ZERO = ( 0.0D+0, 0.0D+0 ) ) 135* .. 136* .. Local Scalars .. 137 INTEGER I, II, J, L 138* .. 139* .. External Subroutines .. 140 EXTERNAL XERBLA, ZLACGV, ZLARF, ZSCAL 141* .. 142* .. Intrinsic Functions .. 143 INTRINSIC DCONJG, MAX 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.M ) THEN 153 INFO = -2 154 ELSE IF( K.LT.0 .OR. K.GT.M ) THEN 155 INFO = -3 156 ELSE IF( LDA.LT.MAX( 1, M ) ) THEN 157 INFO = -5 158 END IF 159 IF( INFO.NE.0 ) THEN 160 CALL XERBLA( 'ZUNGR2', -INFO ) 161 RETURN 162 END IF 163* 164* Quick return if possible 165* 166 IF( M.LE.0 ) 167 $ RETURN 168* 169 IF( K.LT.M ) THEN 170* 171* Initialise rows 1:m-k to rows of the unit matrix 172* 173 DO 20 J = 1, N 174 DO 10 L = 1, M - K 175 A( L, J ) = ZERO 176 10 CONTINUE 177 IF( J.GT.N-M .AND. J.LE.N-K ) 178 $ A( M-N+J, J ) = ONE 179 20 CONTINUE 180 END IF 181* 182 DO 40 I = 1, K 183 II = M - K + I 184* 185* Apply H(i)**H to A(1:m-k+i,1:n-k+i) from the right 186* 187 CALL ZLACGV( N-M+II-1, A( II, 1 ), LDA ) 188 A( II, N-M+II ) = ONE 189 CALL ZLARF( 'Right', II-1, N-M+II, A( II, 1 ), LDA, 190 $ DCONJG( TAU( I ) ), A, LDA, WORK ) 191 CALL ZSCAL( N-M+II-1, -TAU( I ), A( II, 1 ), LDA ) 192 CALL ZLACGV( N-M+II-1, A( II, 1 ), LDA ) 193 A( II, N-M+II ) = ONE - DCONJG( TAU( I ) ) 194* 195* Set A(m-k+i,n-k+i+1:n) to zero 196* 197 DO 30 L = N - M + II + 1, N 198 A( II, L ) = ZERO 199 30 CONTINUE 200 40 CONTINUE 201 RETURN 202* 203* End of ZUNGR2 204* 205 END 206