1*> \brief \b ZGEMLQT 2* 3* =========== DOCUMENTATION =========== 4* 5* Online html documentation available at 6* http://www.netlib.org/lapack/explore-html/ 7* 8*> \htmlonly 9*> Download ZGEMLQT + dependencies 10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zgemlqt.f"> 11*> [TGZ]</a> 12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zgemlqt.f"> 13*> [ZIP]</a> 14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zgemlqt.f"> 15*> [TXT]</a> 16*> \endhtmlonly 17* 18* Definition: 19* =========== 20* 21* SUBROUTINE ZGEMLQT( SIDE, TRANS, M, N, K, MB, V, LDV, T, LDT, 22* C, LDC, WORK, INFO ) 23* 24* .. Scalar Arguments .. 25* CHARACTER SIDE, TRANS 26* INTEGER INFO, K, LDV, LDC, M, N, MB, LDT 27* .. 28* .. Array Arguments .. 29* DOUBLE PRECISION V( LDV, * ), C( LDC, * ), T( LDT, * ), WORK( * ) 30* .. 31* 32* 33*> \par Purpose: 34* ============= 35*> 36*> \verbatim 37*> 38*> ZGEMLQT overwrites the general real M-by-N matrix C with 39*> 40*> SIDE = 'L' SIDE = 'R' 41*> TRANS = 'N': Q C C Q 42*> TRANS = 'C': Q**H C C Q**H 43*> 44*> where Q is a complex orthogonal matrix defined as the product of K 45*> elementary reflectors: 46*> 47*> Q = H(1) H(2) . . . H(K) = I - V T V**H 48*> 49*> generated using the compact WY representation as returned by ZGELQT. 50*> 51*> Q is of order M if SIDE = 'L' and of order N if SIDE = 'R'. 52*> \endverbatim 53* 54* Arguments: 55* ========== 56* 57*> \param[in] SIDE 58*> \verbatim 59*> SIDE is CHARACTER*1 60*> = 'L': apply Q or Q**H from the Left; 61*> = 'R': apply Q or Q**H from the Right. 62*> \endverbatim 63*> 64*> \param[in] TRANS 65*> \verbatim 66*> TRANS is CHARACTER*1 67*> = 'N': No transpose, apply Q; 68*> = 'C': Conjugate transpose, apply Q**H. 69*> \endverbatim 70*> 71*> \param[in] M 72*> \verbatim 73*> M is INTEGER 74*> The number of rows of the matrix C. M >= 0. 75*> \endverbatim 76*> 77*> \param[in] N 78*> \verbatim 79*> N is INTEGER 80*> The number of columns of the matrix C. N >= 0. 81*> \endverbatim 82*> 83*> \param[in] K 84*> \verbatim 85*> K is INTEGER 86*> The number of elementary reflectors whose product defines 87*> the matrix Q. 88*> If SIDE = 'L', M >= K >= 0; 89*> if SIDE = 'R', N >= K >= 0. 90*> \endverbatim 91*> 92*> \param[in] MB 93*> \verbatim 94*> MB is INTEGER 95*> The block size used for the storage of T. K >= MB >= 1. 96*> This must be the same value of MB used to generate T 97*> in ZGELQT. 98*> \endverbatim 99*> 100*> \param[in] V 101*> \verbatim 102*> V is COMPLEX*16 array, dimension 103*> (LDV,M) if SIDE = 'L', 104*> (LDV,N) if SIDE = 'R' 105*> The i-th row must contain the vector which defines the 106*> elementary reflector H(i), for i = 1,2,...,k, as returned by 107*> ZGELQT in the first K rows of its array argument A. 108*> \endverbatim 109*> 110*> \param[in] LDV 111*> \verbatim 112*> LDV is INTEGER 113*> The leading dimension of the array V. LDV >= max(1,K). 114*> \endverbatim 115*> 116*> \param[in] T 117*> \verbatim 118*> T is COMPLEX*16 array, dimension (LDT,K) 119*> The upper triangular factors of the block reflectors 120*> as returned by ZGELQT, stored as a MB-by-K matrix. 121*> \endverbatim 122*> 123*> \param[in] LDT 124*> \verbatim 125*> LDT is INTEGER 126*> The leading dimension of the array T. LDT >= MB. 127*> \endverbatim 128*> 129*> \param[in,out] C 130*> \verbatim 131*> C is COMPLEX*16 array, dimension (LDC,N) 132*> On entry, the M-by-N matrix C. 133*> On exit, C is overwritten by Q C, Q**H C, C Q**H or C Q. 134*> \endverbatim 135*> 136*> \param[in] LDC 137*> \verbatim 138*> LDC is INTEGER 139*> The leading dimension of the array C. LDC >= max(1,M). 140*> \endverbatim 141*> 142*> \param[out] WORK 143*> \verbatim 144*> WORK is COMPLEX*16 array. The dimension of 145*> WORK is N*MB if SIDE = 'L', or M*MB if SIDE = 'R'. 146*> \endverbatim 147*> 148*> \param[out] INFO 149*> \verbatim 150*> INFO is INTEGER 151*> = 0: successful exit 152*> < 0: if INFO = -i, the i-th argument had an illegal value 153*> \endverbatim 154* 155* Authors: 156* ======== 157* 158*> \author Univ. of Tennessee 159*> \author Univ. of California Berkeley 160*> \author Univ. of Colorado Denver 161*> \author NAG Ltd. 162* 163*> \ingroup doubleGEcomputational 164* 165* ===================================================================== 166 SUBROUTINE ZGEMLQT( SIDE, TRANS, M, N, K, MB, V, LDV, T, LDT, 167 $ C, LDC, WORK, INFO ) 168* 169* -- LAPACK computational routine -- 170* -- LAPACK is a software package provided by Univ. of Tennessee, -- 171* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 172* 173* .. Scalar Arguments .. 174 CHARACTER SIDE, TRANS 175 INTEGER INFO, K, LDV, LDC, M, N, MB, LDT 176* .. 177* .. Array Arguments .. 178 COMPLEX*16 V( LDV, * ), C( LDC, * ), T( LDT, * ), WORK( * ) 179* .. 180* 181* ===================================================================== 182* 183* .. 184* .. Local Scalars .. 185 LOGICAL LEFT, RIGHT, TRAN, NOTRAN 186 INTEGER I, IB, LDWORK, KF 187* .. 188* .. External Functions .. 189 LOGICAL LSAME 190 EXTERNAL LSAME 191* .. 192* .. External Subroutines .. 193 EXTERNAL XERBLA, ZLARFB 194* .. 195* .. Intrinsic Functions .. 196 INTRINSIC MAX, MIN 197* .. 198* .. Executable Statements .. 199* 200* .. Test the input arguments .. 201* 202 INFO = 0 203 LEFT = LSAME( SIDE, 'L' ) 204 RIGHT = LSAME( SIDE, 'R' ) 205 TRAN = LSAME( TRANS, 'C' ) 206 NOTRAN = LSAME( TRANS, 'N' ) 207* 208 IF( LEFT ) THEN 209 LDWORK = MAX( 1, N ) 210 ELSE IF ( RIGHT ) THEN 211 LDWORK = MAX( 1, M ) 212 END IF 213 IF( .NOT.LEFT .AND. .NOT.RIGHT ) THEN 214 INFO = -1 215 ELSE IF( .NOT.TRAN .AND. .NOT.NOTRAN ) THEN 216 INFO = -2 217 ELSE IF( M.LT.0 ) THEN 218 INFO = -3 219 ELSE IF( N.LT.0 ) THEN 220 INFO = -4 221 ELSE IF( K.LT.0) THEN 222 INFO = -5 223 ELSE IF( MB.LT.1 .OR. (MB.GT.K .AND. K.GT.0)) THEN 224 INFO = -6 225 ELSE IF( LDV.LT.MAX( 1, K ) ) THEN 226 INFO = -8 227 ELSE IF( LDT.LT.MB ) THEN 228 INFO = -10 229 ELSE IF( LDC.LT.MAX( 1, M ) ) THEN 230 INFO = -12 231 END IF 232* 233 IF( INFO.NE.0 ) THEN 234 CALL XERBLA( 'ZGEMLQT', -INFO ) 235 RETURN 236 END IF 237* 238* .. Quick return if possible .. 239* 240 IF( M.EQ.0 .OR. N.EQ.0 .OR. K.EQ.0 ) RETURN 241* 242 IF( LEFT .AND. NOTRAN ) THEN 243* 244 DO I = 1, K, MB 245 IB = MIN( MB, K-I+1 ) 246 CALL ZLARFB( 'L', 'C', 'F', 'R', M-I+1, N, IB, 247 $ V( I, I ), LDV, T( 1, I ), LDT, 248 $ C( I, 1 ), LDC, WORK, LDWORK ) 249 END DO 250* 251 ELSE IF( RIGHT .AND. TRAN ) THEN 252* 253 DO I = 1, K, MB 254 IB = MIN( MB, K-I+1 ) 255 CALL ZLARFB( 'R', 'N', 'F', 'R', M, N-I+1, IB, 256 $ V( I, I ), LDV, T( 1, I ), LDT, 257 $ C( 1, I ), LDC, WORK, LDWORK ) 258 END DO 259* 260 ELSE IF( LEFT .AND. TRAN ) THEN 261* 262 KF = ((K-1)/MB)*MB+1 263 DO I = KF, 1, -MB 264 IB = MIN( MB, K-I+1 ) 265 CALL ZLARFB( 'L', 'N', 'F', 'R', M-I+1, N, IB, 266 $ V( I, I ), LDV, T( 1, I ), LDT, 267 $ C( I, 1 ), LDC, WORK, LDWORK ) 268 END DO 269* 270 ELSE IF( RIGHT .AND. NOTRAN ) THEN 271* 272 KF = ((K-1)/MB)*MB+1 273 DO I = KF, 1, -MB 274 IB = MIN( MB, K-I+1 ) 275 CALL ZLARFB( 'R', 'C', 'F', 'R', M, N-I+1, IB, 276 $ V( I, I ), LDV, T( 1, I ), LDT, 277 $ C( 1, I ), LDC, WORK, LDWORK ) 278 END DO 279* 280 END IF 281* 282 RETURN 283* 284* End of ZGEMLQT 285* 286 END 287