1*bf2c3715SXin Li*> \brief \b ZLARFG 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 ZLARFG + dependencies 10*bf2c3715SXin Li*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zlarfg.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/zlarfg.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/zlarfg.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 ZLARFG( N, ALPHA, X, INCX, TAU ) 22*bf2c3715SXin Li* 23*bf2c3715SXin Li* .. Scalar Arguments .. 24*bf2c3715SXin Li* INTEGER INCX, N 25*bf2c3715SXin Li* COMPLEX*16 ALPHA, TAU 26*bf2c3715SXin Li* .. 27*bf2c3715SXin Li* .. Array Arguments .. 28*bf2c3715SXin Li* COMPLEX*16 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*> ZLARFG generates a complex elementary reflector H of order n, such 38*bf2c3715SXin Li*> that 39*bf2c3715SXin Li*> 40*bf2c3715SXin Li*> H**H * ( alpha ) = ( beta ), H**H * H = I. 41*bf2c3715SXin Li*> ( x ) ( 0 ) 42*bf2c3715SXin Li*> 43*bf2c3715SXin Li*> where alpha and beta are scalars, with beta real, and x is an 44*bf2c3715SXin Li*> (n-1)-element complex vector. H is represented in the form 45*bf2c3715SXin Li*> 46*bf2c3715SXin Li*> H = I - tau * ( 1 ) * ( 1 v**H ) , 47*bf2c3715SXin Li*> ( v ) 48*bf2c3715SXin Li*> 49*bf2c3715SXin Li*> where tau is a complex scalar and v is a complex (n-1)-element 50*bf2c3715SXin Li*> vector. Note that H is not hermitian. 51*bf2c3715SXin Li*> 52*bf2c3715SXin Li*> If the elements of x are all zero and alpha is real, then tau = 0 53*bf2c3715SXin Li*> and H is taken to be the unit matrix. 54*bf2c3715SXin Li*> 55*bf2c3715SXin Li*> Otherwise 1 <= real(tau) <= 2 and abs(tau-1) <= 1 . 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 COMPLEX*16 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 COMPLEX*16 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 COMPLEX*16 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 complex16OTHERauxiliary 105*bf2c3715SXin Li* 106*bf2c3715SXin Li* ===================================================================== 107*bf2c3715SXin Li SUBROUTINE ZLARFG( 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 COMPLEX*16 ALPHA, TAU 117*bf2c3715SXin Li* .. 118*bf2c3715SXin Li* .. Array Arguments .. 119*bf2c3715SXin Li COMPLEX*16 X( * ) 120*bf2c3715SXin Li* .. 121*bf2c3715SXin Li* 122*bf2c3715SXin Li* ===================================================================== 123*bf2c3715SXin Li* 124*bf2c3715SXin Li* .. Parameters .. 125*bf2c3715SXin Li DOUBLE PRECISION ONE, ZERO 126*bf2c3715SXin Li PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 ) 127*bf2c3715SXin Li* .. 128*bf2c3715SXin Li* .. Local Scalars .. 129*bf2c3715SXin Li INTEGER J, KNT 130*bf2c3715SXin Li DOUBLE PRECISION ALPHI, ALPHR, BETA, RSAFMN, SAFMIN, XNORM 131*bf2c3715SXin Li* .. 132*bf2c3715SXin Li* .. External Functions .. 133*bf2c3715SXin Li DOUBLE PRECISION DLAMCH, DLAPY3, DZNRM2 134*bf2c3715SXin Li COMPLEX*16 ZLADIV 135*bf2c3715SXin Li EXTERNAL DLAMCH, DLAPY3, DZNRM2, ZLADIV 136*bf2c3715SXin Li* .. 137*bf2c3715SXin Li* .. Intrinsic Functions .. 138*bf2c3715SXin Li INTRINSIC ABS, DBLE, DCMPLX, DIMAG, SIGN 139*bf2c3715SXin Li* .. 140*bf2c3715SXin Li* .. External Subroutines .. 141*bf2c3715SXin Li EXTERNAL ZDSCAL, ZSCAL 142*bf2c3715SXin Li* .. 143*bf2c3715SXin Li* .. Executable Statements .. 144*bf2c3715SXin Li* 145*bf2c3715SXin Li IF( N.LE.0 ) THEN 146*bf2c3715SXin Li TAU = ZERO 147*bf2c3715SXin Li RETURN 148*bf2c3715SXin Li END IF 149*bf2c3715SXin Li* 150*bf2c3715SXin Li XNORM = DZNRM2( N-1, X, INCX ) 151*bf2c3715SXin Li ALPHR = DBLE( ALPHA ) 152*bf2c3715SXin Li ALPHI = DIMAG( ALPHA ) 153*bf2c3715SXin Li* 154*bf2c3715SXin Li IF( XNORM.EQ.ZERO .AND. ALPHI.EQ.ZERO ) THEN 155*bf2c3715SXin Li* 156*bf2c3715SXin Li* H = I 157*bf2c3715SXin Li* 158*bf2c3715SXin Li TAU = ZERO 159*bf2c3715SXin Li ELSE 160*bf2c3715SXin Li* 161*bf2c3715SXin Li* general case 162*bf2c3715SXin Li* 163*bf2c3715SXin Li BETA = -SIGN( DLAPY3( ALPHR, ALPHI, XNORM ), ALPHR ) 164*bf2c3715SXin Li SAFMIN = DLAMCH( 'S' ) / DLAMCH( 'E' ) 165*bf2c3715SXin Li RSAFMN = ONE / SAFMIN 166*bf2c3715SXin Li* 167*bf2c3715SXin Li KNT = 0 168*bf2c3715SXin Li IF( ABS( BETA ).LT.SAFMIN ) THEN 169*bf2c3715SXin Li* 170*bf2c3715SXin Li* XNORM, BETA may be inaccurate; scale X and recompute them 171*bf2c3715SXin Li* 172*bf2c3715SXin Li 10 CONTINUE 173*bf2c3715SXin Li KNT = KNT + 1 174*bf2c3715SXin Li CALL ZDSCAL( N-1, RSAFMN, X, INCX ) 175*bf2c3715SXin Li BETA = BETA*RSAFMN 176*bf2c3715SXin Li ALPHI = ALPHI*RSAFMN 177*bf2c3715SXin Li ALPHR = ALPHR*RSAFMN 178*bf2c3715SXin Li IF( ABS( BETA ).LT.SAFMIN ) 179*bf2c3715SXin Li $ GO TO 10 180*bf2c3715SXin Li* 181*bf2c3715SXin Li* New BETA is at most 1, at least SAFMIN 182*bf2c3715SXin Li* 183*bf2c3715SXin Li XNORM = DZNRM2( N-1, X, INCX ) 184*bf2c3715SXin Li ALPHA = DCMPLX( ALPHR, ALPHI ) 185*bf2c3715SXin Li BETA = -SIGN( DLAPY3( ALPHR, ALPHI, XNORM ), ALPHR ) 186*bf2c3715SXin Li END IF 187*bf2c3715SXin Li TAU = DCMPLX( ( BETA-ALPHR ) / BETA, -ALPHI / BETA ) 188*bf2c3715SXin Li ALPHA = ZLADIV( DCMPLX( ONE ), ALPHA-BETA ) 189*bf2c3715SXin Li CALL ZSCAL( N-1, ALPHA, X, INCX ) 190*bf2c3715SXin Li* 191*bf2c3715SXin Li* If ALPHA is subnormal, it may lose relative accuracy 192*bf2c3715SXin Li* 193*bf2c3715SXin Li DO 20 J = 1, KNT 194*bf2c3715SXin Li BETA = BETA*SAFMIN 195*bf2c3715SXin Li 20 CONTINUE 196*bf2c3715SXin Li ALPHA = BETA 197*bf2c3715SXin Li END IF 198*bf2c3715SXin Li* 199*bf2c3715SXin Li RETURN 200*bf2c3715SXin Li* 201*bf2c3715SXin Li* End of ZLARFG 202*bf2c3715SXin Li* 203*bf2c3715SXin Li END 204