1*bf2c3715SXin Li*> \brief \b SLARFG 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 SLARFG + dependencies 10*bf2c3715SXin Li*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/slarfg.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/slarfg.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/slarfg.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 SLARFG( N, ALPHA, X, INCX, TAU ) 22*bf2c3715SXin Li* 23*bf2c3715SXin Li* .. Scalar Arguments .. 24*bf2c3715SXin Li* INTEGER INCX, N 25*bf2c3715SXin Li* REAL ALPHA, TAU 26*bf2c3715SXin Li* .. 27*bf2c3715SXin Li* .. Array Arguments .. 28*bf2c3715SXin Li* REAL X( * ) 29*bf2c3715SXin Li* .. 30*bf2c3715SXin Li* 31*bf2c3715SXin Li* 32*bf2c3715SXin Li*> \par Purpose: 33*bf2c3715SXin Li* ============= 34*bf2c3715SXin Li*> 35*bf2c3715SXin Li*> \verbatim 36*bf2c3715SXin Li*> 37*bf2c3715SXin Li*> SLARFG generates a real elementary reflector H of order n, such 38*bf2c3715SXin Li*> that 39*bf2c3715SXin Li*> 40*bf2c3715SXin Li*> H * ( alpha ) = ( beta ), H**T * H = I. 41*bf2c3715SXin Li*> ( x ) ( 0 ) 42*bf2c3715SXin Li*> 43*bf2c3715SXin Li*> where alpha and beta are scalars, and x is an (n-1)-element real 44*bf2c3715SXin Li*> vector. H is represented in the form 45*bf2c3715SXin Li*> 46*bf2c3715SXin Li*> H = I - tau * ( 1 ) * ( 1 v**T ) , 47*bf2c3715SXin Li*> ( v ) 48*bf2c3715SXin Li*> 49*bf2c3715SXin Li*> where tau is a real scalar and v is a real (n-1)-element 50*bf2c3715SXin Li*> vector. 51*bf2c3715SXin Li*> 52*bf2c3715SXin Li*> If the elements of x are all zero, then tau = 0 and H is taken to be 53*bf2c3715SXin Li*> the unit matrix. 54*bf2c3715SXin Li*> 55*bf2c3715SXin Li*> Otherwise 1 <= tau <= 2. 56*bf2c3715SXin Li*> \endverbatim 57*bf2c3715SXin Li* 58*bf2c3715SXin Li* Arguments: 59*bf2c3715SXin Li* ========== 60*bf2c3715SXin Li* 61*bf2c3715SXin Li*> \param[in] N 62*bf2c3715SXin Li*> \verbatim 63*bf2c3715SXin Li*> N is INTEGER 64*bf2c3715SXin Li*> The order of the elementary reflector. 65*bf2c3715SXin Li*> \endverbatim 66*bf2c3715SXin Li*> 67*bf2c3715SXin Li*> \param[in,out] ALPHA 68*bf2c3715SXin Li*> \verbatim 69*bf2c3715SXin Li*> ALPHA is REAL 70*bf2c3715SXin Li*> On entry, the value alpha. 71*bf2c3715SXin Li*> On exit, it is overwritten with the value beta. 72*bf2c3715SXin Li*> \endverbatim 73*bf2c3715SXin Li*> 74*bf2c3715SXin Li*> \param[in,out] X 75*bf2c3715SXin Li*> \verbatim 76*bf2c3715SXin Li*> X is REAL array, dimension 77*bf2c3715SXin Li*> (1+(N-2)*abs(INCX)) 78*bf2c3715SXin Li*> On entry, the vector x. 79*bf2c3715SXin Li*> On exit, it is overwritten with the vector v. 80*bf2c3715SXin Li*> \endverbatim 81*bf2c3715SXin Li*> 82*bf2c3715SXin Li*> \param[in] INCX 83*bf2c3715SXin Li*> \verbatim 84*bf2c3715SXin Li*> INCX is INTEGER 85*bf2c3715SXin Li*> The increment between elements of X. INCX > 0. 86*bf2c3715SXin Li*> \endverbatim 87*bf2c3715SXin Li*> 88*bf2c3715SXin Li*> \param[out] TAU 89*bf2c3715SXin Li*> \verbatim 90*bf2c3715SXin Li*> TAU is REAL 91*bf2c3715SXin Li*> The value tau. 92*bf2c3715SXin Li*> \endverbatim 93*bf2c3715SXin Li* 94*bf2c3715SXin Li* Authors: 95*bf2c3715SXin Li* ======== 96*bf2c3715SXin Li* 97*bf2c3715SXin Li*> \author Univ. of Tennessee 98*bf2c3715SXin Li*> \author Univ. of California Berkeley 99*bf2c3715SXin Li*> \author Univ. of Colorado Denver 100*bf2c3715SXin Li*> \author NAG Ltd. 101*bf2c3715SXin Li* 102*bf2c3715SXin Li*> \date November 2011 103*bf2c3715SXin Li* 104*bf2c3715SXin Li*> \ingroup realOTHERauxiliary 105*bf2c3715SXin Li* 106*bf2c3715SXin Li* ===================================================================== 107*bf2c3715SXin Li SUBROUTINE SLARFG( N, ALPHA, X, INCX, TAU ) 108*bf2c3715SXin Li* 109*bf2c3715SXin Li* -- LAPACK auxiliary routine (version 3.4.0) -- 110*bf2c3715SXin Li* -- LAPACK is a software package provided by Univ. of Tennessee, -- 111*bf2c3715SXin Li* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 112*bf2c3715SXin Li* November 2011 113*bf2c3715SXin Li* 114*bf2c3715SXin Li* .. Scalar Arguments .. 115*bf2c3715SXin Li INTEGER INCX, N 116*bf2c3715SXin Li REAL ALPHA, TAU 117*bf2c3715SXin Li* .. 118*bf2c3715SXin Li* .. Array Arguments .. 119*bf2c3715SXin Li REAL X( * ) 120*bf2c3715SXin Li* .. 121*bf2c3715SXin Li* 122*bf2c3715SXin Li* ===================================================================== 123*bf2c3715SXin Li* 124*bf2c3715SXin Li* .. Parameters .. 125*bf2c3715SXin Li REAL ONE, ZERO 126*bf2c3715SXin Li PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 ) 127*bf2c3715SXin Li* .. 128*bf2c3715SXin Li* .. Local Scalars .. 129*bf2c3715SXin Li INTEGER J, KNT 130*bf2c3715SXin Li REAL BETA, RSAFMN, SAFMIN, XNORM 131*bf2c3715SXin Li* .. 132*bf2c3715SXin Li* .. External Functions .. 133*bf2c3715SXin Li REAL SLAMCH, SLAPY2, SNRM2 134*bf2c3715SXin Li EXTERNAL SLAMCH, SLAPY2, SNRM2 135*bf2c3715SXin Li* .. 136*bf2c3715SXin Li* .. Intrinsic Functions .. 137*bf2c3715SXin Li INTRINSIC ABS, SIGN 138*bf2c3715SXin Li* .. 139*bf2c3715SXin Li* .. External Subroutines .. 140*bf2c3715SXin Li EXTERNAL SSCAL 141*bf2c3715SXin Li* .. 142*bf2c3715SXin Li* .. Executable Statements .. 143*bf2c3715SXin Li* 144*bf2c3715SXin Li IF( N.LE.1 ) THEN 145*bf2c3715SXin Li TAU = ZERO 146*bf2c3715SXin Li RETURN 147*bf2c3715SXin Li END IF 148*bf2c3715SXin Li* 149*bf2c3715SXin Li XNORM = SNRM2( N-1, X, INCX ) 150*bf2c3715SXin Li* 151*bf2c3715SXin Li IF( XNORM.EQ.ZERO ) THEN 152*bf2c3715SXin Li* 153*bf2c3715SXin Li* H = I 154*bf2c3715SXin Li* 155*bf2c3715SXin Li TAU = ZERO 156*bf2c3715SXin Li ELSE 157*bf2c3715SXin Li* 158*bf2c3715SXin Li* general case 159*bf2c3715SXin Li* 160*bf2c3715SXin Li BETA = -SIGN( SLAPY2( ALPHA, XNORM ), ALPHA ) 161*bf2c3715SXin Li SAFMIN = SLAMCH( 'S' ) / SLAMCH( 'E' ) 162*bf2c3715SXin Li KNT = 0 163*bf2c3715SXin Li IF( ABS( BETA ).LT.SAFMIN ) THEN 164*bf2c3715SXin Li* 165*bf2c3715SXin Li* XNORM, BETA may be inaccurate; scale X and recompute them 166*bf2c3715SXin Li* 167*bf2c3715SXin Li RSAFMN = ONE / SAFMIN 168*bf2c3715SXin Li 10 CONTINUE 169*bf2c3715SXin Li KNT = KNT + 1 170*bf2c3715SXin Li CALL SSCAL( N-1, RSAFMN, X, INCX ) 171*bf2c3715SXin Li BETA = BETA*RSAFMN 172*bf2c3715SXin Li ALPHA = ALPHA*RSAFMN 173*bf2c3715SXin Li IF( ABS( BETA ).LT.SAFMIN ) 174*bf2c3715SXin Li $ GO TO 10 175*bf2c3715SXin Li* 176*bf2c3715SXin Li* New BETA is at most 1, at least SAFMIN 177*bf2c3715SXin Li* 178*bf2c3715SXin Li XNORM = SNRM2( N-1, X, INCX ) 179*bf2c3715SXin Li BETA = -SIGN( SLAPY2( ALPHA, XNORM ), ALPHA ) 180*bf2c3715SXin Li END IF 181*bf2c3715SXin Li TAU = ( BETA-ALPHA ) / BETA 182*bf2c3715SXin Li CALL SSCAL( N-1, ONE / ( ALPHA-BETA ), X, INCX ) 183*bf2c3715SXin Li* 184*bf2c3715SXin Li* If ALPHA is subnormal, it may lose relative accuracy 185*bf2c3715SXin Li* 186*bf2c3715SXin Li DO 20 J = 1, KNT 187*bf2c3715SXin Li BETA = BETA*SAFMIN 188*bf2c3715SXin Li 20 CONTINUE 189*bf2c3715SXin Li ALPHA = BETA 190*bf2c3715SXin Li END IF 191*bf2c3715SXin Li* 192*bf2c3715SXin Li RETURN 193*bf2c3715SXin Li* 194*bf2c3715SXin Li* End of SLARFG 195*bf2c3715SXin Li* 196*bf2c3715SXin Li END 197