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