1*> \brief \b ZUNMR3 multiplies a general matrix by the unitary matrix from a RZ factorization determined by ctzrzf (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 ZUNMR3 + dependencies 10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zunmr3.f"> 11*> [TGZ]</a> 12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zunmr3.f"> 13*> [ZIP]</a> 14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zunmr3.f"> 15*> [TXT]</a> 16*> \endhtmlonly 17* 18* Definition: 19* =========== 20* 21* SUBROUTINE ZUNMR3( SIDE, TRANS, M, N, K, L, A, LDA, TAU, C, LDC, 22* WORK, INFO ) 23* 24* .. Scalar Arguments .. 25* CHARACTER SIDE, TRANS 26* INTEGER INFO, K, L, LDA, LDC, M, N 27* .. 28* .. Array Arguments .. 29* COMPLEX*16 A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) 30* .. 31* 32* 33*> \par Purpose: 34* ============= 35*> 36*> \verbatim 37*> 38*> ZUNMR3 overwrites the general complex m by n matrix C with 39*> 40*> Q * C if SIDE = 'L' and TRANS = 'N', or 41*> 42*> Q**H* C if SIDE = 'L' and TRANS = 'C', or 43*> 44*> C * Q if SIDE = 'R' and TRANS = 'N', or 45*> 46*> C * Q**H if SIDE = 'R' and TRANS = 'C', 47*> 48*> where Q is a complex unitary matrix defined as the product of k 49*> elementary reflectors 50*> 51*> Q = H(1) H(2) . . . H(k) 52*> 53*> as returned by ZTZRZF. Q is of order m if SIDE = 'L' and of order n 54*> if SIDE = 'R'. 55*> \endverbatim 56* 57* Arguments: 58* ========== 59* 60*> \param[in] SIDE 61*> \verbatim 62*> SIDE is CHARACTER*1 63*> = 'L': apply Q or Q**H from the Left 64*> = 'R': apply Q or Q**H from the Right 65*> \endverbatim 66*> 67*> \param[in] TRANS 68*> \verbatim 69*> TRANS is CHARACTER*1 70*> = 'N': apply Q (No transpose) 71*> = 'C': apply Q**H (Conjugate transpose) 72*> \endverbatim 73*> 74*> \param[in] M 75*> \verbatim 76*> M is INTEGER 77*> The number of rows of the matrix C. M >= 0. 78*> \endverbatim 79*> 80*> \param[in] N 81*> \verbatim 82*> N is INTEGER 83*> The number of columns of the matrix C. N >= 0. 84*> \endverbatim 85*> 86*> \param[in] K 87*> \verbatim 88*> K is INTEGER 89*> The number of elementary reflectors whose product defines 90*> the matrix Q. 91*> If SIDE = 'L', M >= K >= 0; 92*> if SIDE = 'R', N >= K >= 0. 93*> \endverbatim 94*> 95*> \param[in] L 96*> \verbatim 97*> L is INTEGER 98*> The number of columns of the matrix A containing 99*> the meaningful part of the Householder reflectors. 100*> If SIDE = 'L', M >= L >= 0, if SIDE = 'R', N >= L >= 0. 101*> \endverbatim 102*> 103*> \param[in] A 104*> \verbatim 105*> A is COMPLEX*16 array, dimension 106*> (LDA,M) if SIDE = 'L', 107*> (LDA,N) if SIDE = 'R' 108*> The i-th row must contain the vector which defines the 109*> elementary reflector H(i), for i = 1,2,...,k, as returned by 110*> ZTZRZF in the last k rows of its array argument A. 111*> A is modified by the routine but restored on exit. 112*> \endverbatim 113*> 114*> \param[in] LDA 115*> \verbatim 116*> LDA is INTEGER 117*> The leading dimension of the array A. LDA >= max(1,K). 118*> \endverbatim 119*> 120*> \param[in] TAU 121*> \verbatim 122*> TAU is COMPLEX*16 array, dimension (K) 123*> TAU(i) must contain the scalar factor of the elementary 124*> reflector H(i), as returned by ZTZRZF. 125*> \endverbatim 126*> 127*> \param[in,out] C 128*> \verbatim 129*> C is COMPLEX*16 array, dimension (LDC,N) 130*> On entry, the m-by-n matrix C. 131*> On exit, C is overwritten by Q*C or Q**H*C or C*Q**H or C*Q. 132*> \endverbatim 133*> 134*> \param[in] LDC 135*> \verbatim 136*> LDC is INTEGER 137*> The leading dimension of the array C. LDC >= max(1,M). 138*> \endverbatim 139*> 140*> \param[out] WORK 141*> \verbatim 142*> WORK is COMPLEX*16 array, dimension 143*> (N) if SIDE = 'L', 144*> (M) if SIDE = 'R' 145*> \endverbatim 146*> 147*> \param[out] INFO 148*> \verbatim 149*> INFO is INTEGER 150*> = 0: successful exit 151*> < 0: if INFO = -i, the i-th argument had an illegal value 152*> \endverbatim 153* 154* Authors: 155* ======== 156* 157*> \author Univ. of Tennessee 158*> \author Univ. of California Berkeley 159*> \author Univ. of Colorado Denver 160*> \author NAG Ltd. 161* 162*> \date September 2012 163* 164*> \ingroup complex16OTHERcomputational 165* 166*> \par Contributors: 167* ================== 168*> 169*> A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA 170* 171*> \par Further Details: 172* ===================== 173*> 174*> \verbatim 175*> \endverbatim 176*> 177* ===================================================================== 178 SUBROUTINE ZUNMR3( SIDE, TRANS, M, N, K, L, A, LDA, TAU, C, LDC, 179 $ WORK, INFO ) 180* 181* -- LAPACK computational routine (version 3.4.2) -- 182* -- LAPACK is a software package provided by Univ. of Tennessee, -- 183* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 184* September 2012 185* 186* .. Scalar Arguments .. 187 CHARACTER SIDE, TRANS 188 INTEGER INFO, K, L, LDA, LDC, M, N 189* .. 190* .. Array Arguments .. 191 COMPLEX*16 A( LDA, * ), C( LDC, * ), TAU( * ), WORK( * ) 192* .. 193* 194* ===================================================================== 195* 196* .. Local Scalars .. 197 LOGICAL LEFT, NOTRAN 198 INTEGER I, I1, I2, I3, IC, JA, JC, MI, NI, NQ 199 COMPLEX*16 TAUI 200* .. 201* .. External Functions .. 202 LOGICAL LSAME 203 EXTERNAL LSAME 204* .. 205* .. External Subroutines .. 206 EXTERNAL XERBLA, ZLARZ 207* .. 208* .. Intrinsic Functions .. 209 INTRINSIC DCONJG, MAX 210* .. 211* .. Executable Statements .. 212* 213* Test the input arguments 214* 215 INFO = 0 216 LEFT = LSAME( SIDE, 'L' ) 217 NOTRAN = LSAME( TRANS, 'N' ) 218* 219* NQ is the order of Q 220* 221 IF( LEFT ) THEN 222 NQ = M 223 ELSE 224 NQ = N 225 END IF 226 IF( .NOT.LEFT .AND. .NOT.LSAME( SIDE, 'R' ) ) THEN 227 INFO = -1 228 ELSE IF( .NOT.NOTRAN .AND. .NOT.LSAME( TRANS, 'C' ) ) THEN 229 INFO = -2 230 ELSE IF( M.LT.0 ) THEN 231 INFO = -3 232 ELSE IF( N.LT.0 ) THEN 233 INFO = -4 234 ELSE IF( K.LT.0 .OR. K.GT.NQ ) THEN 235 INFO = -5 236 ELSE IF( L.LT.0 .OR. ( LEFT .AND. ( L.GT.M ) ) .OR. 237 $ ( .NOT.LEFT .AND. ( L.GT.N ) ) ) THEN 238 INFO = -6 239 ELSE IF( LDA.LT.MAX( 1, K ) ) THEN 240 INFO = -8 241 ELSE IF( LDC.LT.MAX( 1, M ) ) THEN 242 INFO = -11 243 END IF 244 IF( INFO.NE.0 ) THEN 245 CALL XERBLA( 'ZUNMR3', -INFO ) 246 RETURN 247 END IF 248* 249* Quick return if possible 250* 251 IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 ) 252 $ RETURN 253* 254 IF( ( LEFT .AND. .NOT.NOTRAN .OR. .NOT.LEFT .AND. NOTRAN ) ) THEN 255 I1 = 1 256 I2 = K 257 I3 = 1 258 ELSE 259 I1 = K 260 I2 = 1 261 I3 = -1 262 END IF 263* 264 IF( LEFT ) THEN 265 NI = N 266 JA = M - L + 1 267 JC = 1 268 ELSE 269 MI = M 270 JA = N - L + 1 271 IC = 1 272 END IF 273* 274 DO 10 I = I1, I2, I3 275 IF( LEFT ) THEN 276* 277* H(i) or H(i)**H is applied to C(i:m,1:n) 278* 279 MI = M - I + 1 280 IC = I 281 ELSE 282* 283* H(i) or H(i)**H is applied to C(1:m,i:n) 284* 285 NI = N - I + 1 286 JC = I 287 END IF 288* 289* Apply H(i) or H(i)**H 290* 291 IF( NOTRAN ) THEN 292 TAUI = TAU( I ) 293 ELSE 294 TAUI = DCONJG( TAU( I ) ) 295 END IF 296 CALL ZLARZ( SIDE, MI, NI, L, A( I, JA ), LDA, TAUI, 297 $ C( IC, JC ), LDC, WORK ) 298* 299 10 CONTINUE 300* 301 RETURN 302* 303* End of ZUNMR3 304* 305 END 306