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