1*bf2c3715SXin Li*> \brief \b ZLARF 2*bf2c3715SXin Li* 3*bf2c3715SXin Li* =========== DOCUMENTATION =========== 4*bf2c3715SXin Li* 5*bf2c3715SXin Li* Online html documentation available at 6*bf2c3715SXin Li* http://www.netlib.org/lapack/explore-html/ 7*bf2c3715SXin Li* 8*bf2c3715SXin Li*> \htmlonly 9*bf2c3715SXin Li*> Download ZLARF + dependencies 10*bf2c3715SXin Li*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zlarf.f"> 11*bf2c3715SXin Li*> [TGZ]</a> 12*bf2c3715SXin Li*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zlarf.f"> 13*bf2c3715SXin Li*> [ZIP]</a> 14*bf2c3715SXin Li*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zlarf.f"> 15*bf2c3715SXin Li*> [TXT]</a> 16*bf2c3715SXin Li*> \endhtmlonly 17*bf2c3715SXin Li* 18*bf2c3715SXin Li* Definition: 19*bf2c3715SXin Li* =========== 20*bf2c3715SXin Li* 21*bf2c3715SXin Li* SUBROUTINE ZLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) 22*bf2c3715SXin Li* 23*bf2c3715SXin Li* .. Scalar Arguments .. 24*bf2c3715SXin Li* CHARACTER SIDE 25*bf2c3715SXin Li* INTEGER INCV, LDC, M, N 26*bf2c3715SXin Li* COMPLEX*16 TAU 27*bf2c3715SXin Li* .. 28*bf2c3715SXin Li* .. Array Arguments .. 29*bf2c3715SXin Li* COMPLEX*16 C( LDC, * ), V( * ), WORK( * ) 30*bf2c3715SXin Li* .. 31*bf2c3715SXin Li* 32*bf2c3715SXin Li* 33*bf2c3715SXin Li*> \par Purpose: 34*bf2c3715SXin Li* ============= 35*bf2c3715SXin Li*> 36*bf2c3715SXin Li*> \verbatim 37*bf2c3715SXin Li*> 38*bf2c3715SXin Li*> ZLARF applies a complex elementary reflector H to a complex M-by-N 39*bf2c3715SXin Li*> matrix C, from either the left or the right. H is represented in the 40*bf2c3715SXin Li*> form 41*bf2c3715SXin Li*> 42*bf2c3715SXin Li*> H = I - tau * v * v**H 43*bf2c3715SXin Li*> 44*bf2c3715SXin Li*> where tau is a complex scalar and v is a complex vector. 45*bf2c3715SXin Li*> 46*bf2c3715SXin Li*> If tau = 0, then H is taken to be the unit matrix. 47*bf2c3715SXin Li*> 48*bf2c3715SXin Li*> To apply H**H, supply conjg(tau) instead 49*bf2c3715SXin Li*> tau. 50*bf2c3715SXin Li*> \endverbatim 51*bf2c3715SXin Li* 52*bf2c3715SXin Li* Arguments: 53*bf2c3715SXin Li* ========== 54*bf2c3715SXin Li* 55*bf2c3715SXin Li*> \param[in] SIDE 56*bf2c3715SXin Li*> \verbatim 57*bf2c3715SXin Li*> SIDE is CHARACTER*1 58*bf2c3715SXin Li*> = 'L': form H * C 59*bf2c3715SXin Li*> = 'R': form C * H 60*bf2c3715SXin Li*> \endverbatim 61*bf2c3715SXin Li*> 62*bf2c3715SXin Li*> \param[in] M 63*bf2c3715SXin Li*> \verbatim 64*bf2c3715SXin Li*> M is INTEGER 65*bf2c3715SXin Li*> The number of rows of the matrix C. 66*bf2c3715SXin Li*> \endverbatim 67*bf2c3715SXin Li*> 68*bf2c3715SXin Li*> \param[in] N 69*bf2c3715SXin Li*> \verbatim 70*bf2c3715SXin Li*> N is INTEGER 71*bf2c3715SXin Li*> The number of columns of the matrix C. 72*bf2c3715SXin Li*> \endverbatim 73*bf2c3715SXin Li*> 74*bf2c3715SXin Li*> \param[in] V 75*bf2c3715SXin Li*> \verbatim 76*bf2c3715SXin Li*> V is COMPLEX*16 array, dimension 77*bf2c3715SXin Li*> (1 + (M-1)*abs(INCV)) if SIDE = 'L' 78*bf2c3715SXin Li*> or (1 + (N-1)*abs(INCV)) if SIDE = 'R' 79*bf2c3715SXin Li*> The vector v in the representation of H. V is not used if 80*bf2c3715SXin Li*> TAU = 0. 81*bf2c3715SXin Li*> \endverbatim 82*bf2c3715SXin Li*> 83*bf2c3715SXin Li*> \param[in] INCV 84*bf2c3715SXin Li*> \verbatim 85*bf2c3715SXin Li*> INCV is INTEGER 86*bf2c3715SXin Li*> The increment between elements of v. INCV <> 0. 87*bf2c3715SXin Li*> \endverbatim 88*bf2c3715SXin Li*> 89*bf2c3715SXin Li*> \param[in] TAU 90*bf2c3715SXin Li*> \verbatim 91*bf2c3715SXin Li*> TAU is COMPLEX*16 92*bf2c3715SXin Li*> The value tau in the representation of H. 93*bf2c3715SXin Li*> \endverbatim 94*bf2c3715SXin Li*> 95*bf2c3715SXin Li*> \param[in,out] C 96*bf2c3715SXin Li*> \verbatim 97*bf2c3715SXin Li*> C is COMPLEX*16 array, dimension (LDC,N) 98*bf2c3715SXin Li*> On entry, the M-by-N matrix C. 99*bf2c3715SXin Li*> On exit, C is overwritten by the matrix H * C if SIDE = 'L', 100*bf2c3715SXin Li*> or C * H if SIDE = 'R'. 101*bf2c3715SXin Li*> \endverbatim 102*bf2c3715SXin Li*> 103*bf2c3715SXin Li*> \param[in] LDC 104*bf2c3715SXin Li*> \verbatim 105*bf2c3715SXin Li*> LDC is INTEGER 106*bf2c3715SXin Li*> The leading dimension of the array C. LDC >= max(1,M). 107*bf2c3715SXin Li*> \endverbatim 108*bf2c3715SXin Li*> 109*bf2c3715SXin Li*> \param[out] WORK 110*bf2c3715SXin Li*> \verbatim 111*bf2c3715SXin Li*> WORK is COMPLEX*16 array, dimension 112*bf2c3715SXin Li*> (N) if SIDE = 'L' 113*bf2c3715SXin Li*> or (M) if SIDE = 'R' 114*bf2c3715SXin Li*> \endverbatim 115*bf2c3715SXin Li* 116*bf2c3715SXin Li* Authors: 117*bf2c3715SXin Li* ======== 118*bf2c3715SXin Li* 119*bf2c3715SXin Li*> \author Univ. of Tennessee 120*bf2c3715SXin Li*> \author Univ. of California Berkeley 121*bf2c3715SXin Li*> \author Univ. of Colorado Denver 122*bf2c3715SXin Li*> \author NAG Ltd. 123*bf2c3715SXin Li* 124*bf2c3715SXin Li*> \date November 2011 125*bf2c3715SXin Li* 126*bf2c3715SXin Li*> \ingroup complex16OTHERauxiliary 127*bf2c3715SXin Li* 128*bf2c3715SXin Li* ===================================================================== 129*bf2c3715SXin Li SUBROUTINE ZLARF( SIDE, M, N, V, INCV, TAU, C, LDC, WORK ) 130*bf2c3715SXin Li* 131*bf2c3715SXin Li* -- LAPACK auxiliary routine (version 3.4.0) -- 132*bf2c3715SXin Li* -- LAPACK is a software package provided by Univ. of Tennessee, -- 133*bf2c3715SXin Li* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 134*bf2c3715SXin Li* November 2011 135*bf2c3715SXin Li* 136*bf2c3715SXin Li* .. Scalar Arguments .. 137*bf2c3715SXin Li CHARACTER SIDE 138*bf2c3715SXin Li INTEGER INCV, LDC, M, N 139*bf2c3715SXin Li COMPLEX*16 TAU 140*bf2c3715SXin Li* .. 141*bf2c3715SXin Li* .. Array Arguments .. 142*bf2c3715SXin Li COMPLEX*16 C( LDC, * ), V( * ), WORK( * ) 143*bf2c3715SXin Li* .. 144*bf2c3715SXin Li* 145*bf2c3715SXin Li* ===================================================================== 146*bf2c3715SXin Li* 147*bf2c3715SXin Li* .. Parameters .. 148*bf2c3715SXin Li COMPLEX*16 ONE, ZERO 149*bf2c3715SXin Li PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ), 150*bf2c3715SXin Li $ ZERO = ( 0.0D+0, 0.0D+0 ) ) 151*bf2c3715SXin Li* .. 152*bf2c3715SXin Li* .. Local Scalars .. 153*bf2c3715SXin Li LOGICAL APPLYLEFT 154*bf2c3715SXin Li INTEGER I, LASTV, LASTC 155*bf2c3715SXin Li* .. 156*bf2c3715SXin Li* .. External Subroutines .. 157*bf2c3715SXin Li EXTERNAL ZGEMV, ZGERC 158*bf2c3715SXin Li* .. 159*bf2c3715SXin Li* .. External Functions .. 160*bf2c3715SXin Li LOGICAL LSAME 161*bf2c3715SXin Li INTEGER ILAZLR, ILAZLC 162*bf2c3715SXin Li EXTERNAL LSAME, ILAZLR, ILAZLC 163*bf2c3715SXin Li* .. 164*bf2c3715SXin Li* .. Executable Statements .. 165*bf2c3715SXin Li* 166*bf2c3715SXin Li APPLYLEFT = LSAME( SIDE, 'L' ) 167*bf2c3715SXin Li LASTV = 0 168*bf2c3715SXin Li LASTC = 0 169*bf2c3715SXin Li IF( TAU.NE.ZERO ) THEN 170*bf2c3715SXin Li* Set up variables for scanning V. LASTV begins pointing to the end 171*bf2c3715SXin Li* of V. 172*bf2c3715SXin Li IF( APPLYLEFT ) THEN 173*bf2c3715SXin Li LASTV = M 174*bf2c3715SXin Li ELSE 175*bf2c3715SXin Li LASTV = N 176*bf2c3715SXin Li END IF 177*bf2c3715SXin Li IF( INCV.GT.0 ) THEN 178*bf2c3715SXin Li I = 1 + (LASTV-1) * INCV 179*bf2c3715SXin Li ELSE 180*bf2c3715SXin Li I = 1 181*bf2c3715SXin Li END IF 182*bf2c3715SXin Li* Look for the last non-zero row in V. 183*bf2c3715SXin Li DO WHILE( LASTV.GT.0 .AND. V( I ).EQ.ZERO ) 184*bf2c3715SXin Li LASTV = LASTV - 1 185*bf2c3715SXin Li I = I - INCV 186*bf2c3715SXin Li END DO 187*bf2c3715SXin Li IF( APPLYLEFT ) THEN 188*bf2c3715SXin Li* Scan for the last non-zero column in C(1:lastv,:). 189*bf2c3715SXin Li LASTC = ILAZLC(LASTV, N, C, LDC) 190*bf2c3715SXin Li ELSE 191*bf2c3715SXin Li* Scan for the last non-zero row in C(:,1:lastv). 192*bf2c3715SXin Li LASTC = ILAZLR(M, LASTV, C, LDC) 193*bf2c3715SXin Li END IF 194*bf2c3715SXin Li END IF 195*bf2c3715SXin Li* Note that lastc.eq.0 renders the BLAS operations null; no special 196*bf2c3715SXin Li* case is needed at this level. 197*bf2c3715SXin Li IF( APPLYLEFT ) THEN 198*bf2c3715SXin Li* 199*bf2c3715SXin Li* Form H * C 200*bf2c3715SXin Li* 201*bf2c3715SXin Li IF( LASTV.GT.0 ) THEN 202*bf2c3715SXin Li* 203*bf2c3715SXin Li* w(1:lastc,1) := C(1:lastv,1:lastc)**H * v(1:lastv,1) 204*bf2c3715SXin Li* 205*bf2c3715SXin Li CALL ZGEMV( 'Conjugate transpose', LASTV, LASTC, ONE, 206*bf2c3715SXin Li $ C, LDC, V, INCV, ZERO, WORK, 1 ) 207*bf2c3715SXin Li* 208*bf2c3715SXin Li* C(1:lastv,1:lastc) := C(...) - v(1:lastv,1) * w(1:lastc,1)**H 209*bf2c3715SXin Li* 210*bf2c3715SXin Li CALL ZGERC( LASTV, LASTC, -TAU, V, INCV, WORK, 1, C, LDC ) 211*bf2c3715SXin Li END IF 212*bf2c3715SXin Li ELSE 213*bf2c3715SXin Li* 214*bf2c3715SXin Li* Form C * H 215*bf2c3715SXin Li* 216*bf2c3715SXin Li IF( LASTV.GT.0 ) THEN 217*bf2c3715SXin Li* 218*bf2c3715SXin Li* w(1:lastc,1) := C(1:lastc,1:lastv) * v(1:lastv,1) 219*bf2c3715SXin Li* 220*bf2c3715SXin Li CALL ZGEMV( 'No transpose', LASTC, LASTV, ONE, C, LDC, 221*bf2c3715SXin Li $ V, INCV, ZERO, WORK, 1 ) 222*bf2c3715SXin Li* 223*bf2c3715SXin Li* C(1:lastc,1:lastv) := C(...) - w(1:lastc,1) * v(1:lastv,1)**H 224*bf2c3715SXin Li* 225*bf2c3715SXin Li CALL ZGERC( LASTC, LASTV, -TAU, WORK, 1, V, INCV, C, LDC ) 226*bf2c3715SXin Li END IF 227*bf2c3715SXin Li END IF 228*bf2c3715SXin Li RETURN 229*bf2c3715SXin Li* 230*bf2c3715SXin Li* End of ZLARF 231*bf2c3715SXin Li* 232*bf2c3715SXin Li END 233