xref: /aosp_15_r20/external/eigen/lapack/zlarfg.f (revision bf2c37156dfe67e5dfebd6d394bad8b2ab5804d4)
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