Statistiques
| Révision :

root / src / lapack / double / dlarfg.f @ 2

Historique | Voir | Annoter | Télécharger (3,38 ko)

1 1 equemene
      SUBROUTINE DLARFG( N, ALPHA, X, INCX, TAU )
2 1 equemene
*
3 1 equemene
*  -- LAPACK auxiliary routine (version 3.2) --
4 1 equemene
*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
5 1 equemene
*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
6 1 equemene
*     November 2006
7 1 equemene
*
8 1 equemene
*     .. Scalar Arguments ..
9 1 equemene
      INTEGER            INCX, N
10 1 equemene
      DOUBLE PRECISION   ALPHA, TAU
11 1 equemene
*     ..
12 1 equemene
*     .. Array Arguments ..
13 1 equemene
      DOUBLE PRECISION   X( * )
14 1 equemene
*     ..
15 1 equemene
*
16 1 equemene
*  Purpose
17 1 equemene
*  =======
18 1 equemene
*
19 1 equemene
*  DLARFG generates a real elementary reflector H of order n, such
20 1 equemene
*  that
21 1 equemene
*
22 1 equemene
*        H * ( alpha ) = ( beta ),   H' * H = I.
23 1 equemene
*            (   x   )   (   0  )
24 1 equemene
*
25 1 equemene
*  where alpha and beta are scalars, and x is an (n-1)-element real
26 1 equemene
*  vector. H is represented in the form
27 1 equemene
*
28 1 equemene
*        H = I - tau * ( 1 ) * ( 1 v' ) ,
29 1 equemene
*                      ( v )
30 1 equemene
*
31 1 equemene
*  where tau is a real scalar and v is a real (n-1)-element
32 1 equemene
*  vector.
33 1 equemene
*
34 1 equemene
*  If the elements of x are all zero, then tau = 0 and H is taken to be
35 1 equemene
*  the unit matrix.
36 1 equemene
*
37 1 equemene
*  Otherwise  1 <= tau <= 2.
38 1 equemene
*
39 1 equemene
*  Arguments
40 1 equemene
*  =========
41 1 equemene
*
42 1 equemene
*  N       (input) INTEGER
43 1 equemene
*          The order of the elementary reflector.
44 1 equemene
*
45 1 equemene
*  ALPHA   (input/output) DOUBLE PRECISION
46 1 equemene
*          On entry, the value alpha.
47 1 equemene
*          On exit, it is overwritten with the value beta.
48 1 equemene
*
49 1 equemene
*  X       (input/output) DOUBLE PRECISION array, dimension
50 1 equemene
*                         (1+(N-2)*abs(INCX))
51 1 equemene
*          On entry, the vector x.
52 1 equemene
*          On exit, it is overwritten with the vector v.
53 1 equemene
*
54 1 equemene
*  INCX    (input) INTEGER
55 1 equemene
*          The increment between elements of X. INCX > 0.
56 1 equemene
*
57 1 equemene
*  TAU     (output) DOUBLE PRECISION
58 1 equemene
*          The value tau.
59 1 equemene
*
60 1 equemene
*  =====================================================================
61 1 equemene
*
62 1 equemene
*     .. Parameters ..
63 1 equemene
      DOUBLE PRECISION   ONE, ZERO
64 1 equemene
      PARAMETER          ( ONE = 1.0D+0, ZERO = 0.0D+0 )
65 1 equemene
*     ..
66 1 equemene
*     .. Local Scalars ..
67 1 equemene
      INTEGER            J, KNT
68 1 equemene
      DOUBLE PRECISION   BETA, RSAFMN, SAFMIN, XNORM
69 1 equemene
*     ..
70 1 equemene
*     .. External Functions ..
71 1 equemene
      DOUBLE PRECISION   DLAMCH, DLAPY2, DNRM2
72 1 equemene
      EXTERNAL           DLAMCH, DLAPY2, DNRM2
73 1 equemene
*     ..
74 1 equemene
*     .. Intrinsic Functions ..
75 1 equemene
      INTRINSIC          ABS, SIGN
76 1 equemene
*     ..
77 1 equemene
*     .. External Subroutines ..
78 1 equemene
      EXTERNAL           DSCAL
79 1 equemene
*     ..
80 1 equemene
*     .. Executable Statements ..
81 1 equemene
*
82 1 equemene
      IF( N.LE.1 ) THEN
83 1 equemene
         TAU = ZERO
84 1 equemene
         RETURN
85 1 equemene
      END IF
86 1 equemene
*
87 1 equemene
      XNORM = DNRM2( N-1, X, INCX )
88 1 equemene
*
89 1 equemene
      IF( XNORM.EQ.ZERO ) THEN
90 1 equemene
*
91 1 equemene
*        H  =  I
92 1 equemene
*
93 1 equemene
         TAU = ZERO
94 1 equemene
      ELSE
95 1 equemene
*
96 1 equemene
*        general case
97 1 equemene
*
98 1 equemene
         BETA = -SIGN( DLAPY2( ALPHA, XNORM ), ALPHA )
99 1 equemene
         SAFMIN = DLAMCH( 'S' ) / DLAMCH( 'E' )
100 1 equemene
         KNT = 0
101 1 equemene
         IF( ABS( BETA ).LT.SAFMIN ) THEN
102 1 equemene
*
103 1 equemene
*           XNORM, BETA may be inaccurate; scale X and recompute them
104 1 equemene
*
105 1 equemene
            RSAFMN = ONE / SAFMIN
106 1 equemene
   10       CONTINUE
107 1 equemene
            KNT = KNT + 1
108 1 equemene
            CALL DSCAL( N-1, RSAFMN, X, INCX )
109 1 equemene
            BETA = BETA*RSAFMN
110 1 equemene
            ALPHA = ALPHA*RSAFMN
111 1 equemene
            IF( ABS( BETA ).LT.SAFMIN )
112 1 equemene
     $         GO TO 10
113 1 equemene
*
114 1 equemene
*           New BETA is at most 1, at least SAFMIN
115 1 equemene
*
116 1 equemene
            XNORM = DNRM2( N-1, X, INCX )
117 1 equemene
            BETA = -SIGN( DLAPY2( ALPHA, XNORM ), ALPHA )
118 1 equemene
         END IF
119 1 equemene
         TAU = ( BETA-ALPHA ) / BETA
120 1 equemene
         CALL DSCAL( N-1, ONE / ( ALPHA-BETA ), X, INCX )
121 1 equemene
*
122 1 equemene
*        If ALPHA is subnormal, it may lose relative accuracy
123 1 equemene
*
124 1 equemene
         DO 20 J = 1, KNT
125 1 equemene
            BETA = BETA*SAFMIN
126 1 equemene
 20      CONTINUE
127 1 equemene
         ALPHA = BETA
128 1 equemene
      END IF
129 1 equemene
*
130 1 equemene
      RETURN
131 1 equemene
*
132 1 equemene
*     End of DLARFG
133 1 equemene
*
134 1 equemene
      END