root / src / lapack / double / dlarfg.f @ 1
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 |