root / src / lapack / double / dlarzt.f @ 2
Historique | Voir | Annoter | Télécharger (5,87 ko)
1 | 1 | equemene | SUBROUTINE DLARZT( DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT ) |
---|---|---|---|
2 | 1 | equemene | * |
3 | 1 | equemene | * -- LAPACK 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 | CHARACTER DIRECT, STOREV |
10 | 1 | equemene | INTEGER K, LDT, LDV, N |
11 | 1 | equemene | * .. |
12 | 1 | equemene | * .. Array Arguments .. |
13 | 1 | equemene | DOUBLE PRECISION T( LDT, * ), TAU( * ), V( LDV, * ) |
14 | 1 | equemene | * .. |
15 | 1 | equemene | * |
16 | 1 | equemene | * Purpose |
17 | 1 | equemene | * ======= |
18 | 1 | equemene | * |
19 | 1 | equemene | * DLARZT forms the triangular factor T of a real block reflector |
20 | 1 | equemene | * H of order > n, which is defined as a product of k elementary |
21 | 1 | equemene | * reflectors. |
22 | 1 | equemene | * |
23 | 1 | equemene | * If DIRECT = 'F', H = H(1) H(2) . . . H(k) and T is upper triangular; |
24 | 1 | equemene | * |
25 | 1 | equemene | * If DIRECT = 'B', H = H(k) . . . H(2) H(1) and T is lower triangular. |
26 | 1 | equemene | * |
27 | 1 | equemene | * If STOREV = 'C', the vector which defines the elementary reflector |
28 | 1 | equemene | * H(i) is stored in the i-th column of the array V, and |
29 | 1 | equemene | * |
30 | 1 | equemene | * H = I - V * T * V' |
31 | 1 | equemene | * |
32 | 1 | equemene | * If STOREV = 'R', the vector which defines the elementary reflector |
33 | 1 | equemene | * H(i) is stored in the i-th row of the array V, and |
34 | 1 | equemene | * |
35 | 1 | equemene | * H = I - V' * T * V |
36 | 1 | equemene | * |
37 | 1 | equemene | * Currently, only STOREV = 'R' and DIRECT = 'B' are supported. |
38 | 1 | equemene | * |
39 | 1 | equemene | * Arguments |
40 | 1 | equemene | * ========= |
41 | 1 | equemene | * |
42 | 1 | equemene | * DIRECT (input) CHARACTER*1 |
43 | 1 | equemene | * Specifies the order in which the elementary reflectors are |
44 | 1 | equemene | * multiplied to form the block reflector: |
45 | 1 | equemene | * = 'F': H = H(1) H(2) . . . H(k) (Forward, not supported yet) |
46 | 1 | equemene | * = 'B': H = H(k) . . . H(2) H(1) (Backward) |
47 | 1 | equemene | * |
48 | 1 | equemene | * STOREV (input) CHARACTER*1 |
49 | 1 | equemene | * Specifies how the vectors which define the elementary |
50 | 1 | equemene | * reflectors are stored (see also Further Details): |
51 | 1 | equemene | * = 'C': columnwise (not supported yet) |
52 | 1 | equemene | * = 'R': rowwise |
53 | 1 | equemene | * |
54 | 1 | equemene | * N (input) INTEGER |
55 | 1 | equemene | * The order of the block reflector H. N >= 0. |
56 | 1 | equemene | * |
57 | 1 | equemene | * K (input) INTEGER |
58 | 1 | equemene | * The order of the triangular factor T (= the number of |
59 | 1 | equemene | * elementary reflectors). K >= 1. |
60 | 1 | equemene | * |
61 | 1 | equemene | * V (input/output) DOUBLE PRECISION array, dimension |
62 | 1 | equemene | * (LDV,K) if STOREV = 'C' |
63 | 1 | equemene | * (LDV,N) if STOREV = 'R' |
64 | 1 | equemene | * The matrix V. See further details. |
65 | 1 | equemene | * |
66 | 1 | equemene | * LDV (input) INTEGER |
67 | 1 | equemene | * The leading dimension of the array V. |
68 | 1 | equemene | * If STOREV = 'C', LDV >= max(1,N); if STOREV = 'R', LDV >= K. |
69 | 1 | equemene | * |
70 | 1 | equemene | * TAU (input) DOUBLE PRECISION array, dimension (K) |
71 | 1 | equemene | * TAU(i) must contain the scalar factor of the elementary |
72 | 1 | equemene | * reflector H(i). |
73 | 1 | equemene | * |
74 | 1 | equemene | * T (output) DOUBLE PRECISION array, dimension (LDT,K) |
75 | 1 | equemene | * The k by k triangular factor T of the block reflector. |
76 | 1 | equemene | * If DIRECT = 'F', T is upper triangular; if DIRECT = 'B', T is |
77 | 1 | equemene | * lower triangular. The rest of the array is not used. |
78 | 1 | equemene | * |
79 | 1 | equemene | * LDT (input) INTEGER |
80 | 1 | equemene | * The leading dimension of the array T. LDT >= K. |
81 | 1 | equemene | * |
82 | 1 | equemene | * Further Details |
83 | 1 | equemene | * =============== |
84 | 1 | equemene | * |
85 | 1 | equemene | * Based on contributions by |
86 | 1 | equemene | * A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA |
87 | 1 | equemene | * |
88 | 1 | equemene | * The shape of the matrix V and the storage of the vectors which define |
89 | 1 | equemene | * the H(i) is best illustrated by the following example with n = 5 and |
90 | 1 | equemene | * k = 3. The elements equal to 1 are not stored; the corresponding |
91 | 1 | equemene | * array elements are modified but restored on exit. The rest of the |
92 | 1 | equemene | * array is not used. |
93 | 1 | equemene | * |
94 | 1 | equemene | * DIRECT = 'F' and STOREV = 'C': DIRECT = 'F' and STOREV = 'R': |
95 | 1 | equemene | * |
96 | 1 | equemene | * ______V_____ |
97 | 1 | equemene | * ( v1 v2 v3 ) / \ |
98 | 1 | equemene | * ( v1 v2 v3 ) ( v1 v1 v1 v1 v1 . . . . 1 ) |
99 | 1 | equemene | * V = ( v1 v2 v3 ) ( v2 v2 v2 v2 v2 . . . 1 ) |
100 | 1 | equemene | * ( v1 v2 v3 ) ( v3 v3 v3 v3 v3 . . 1 ) |
101 | 1 | equemene | * ( v1 v2 v3 ) |
102 | 1 | equemene | * . . . |
103 | 1 | equemene | * . . . |
104 | 1 | equemene | * 1 . . |
105 | 1 | equemene | * 1 . |
106 | 1 | equemene | * 1 |
107 | 1 | equemene | * |
108 | 1 | equemene | * DIRECT = 'B' and STOREV = 'C': DIRECT = 'B' and STOREV = 'R': |
109 | 1 | equemene | * |
110 | 1 | equemene | * ______V_____ |
111 | 1 | equemene | * 1 / \ |
112 | 1 | equemene | * . 1 ( 1 . . . . v1 v1 v1 v1 v1 ) |
113 | 1 | equemene | * . . 1 ( . 1 . . . v2 v2 v2 v2 v2 ) |
114 | 1 | equemene | * . . . ( . . 1 . . v3 v3 v3 v3 v3 ) |
115 | 1 | equemene | * . . . |
116 | 1 | equemene | * ( v1 v2 v3 ) |
117 | 1 | equemene | * ( v1 v2 v3 ) |
118 | 1 | equemene | * V = ( v1 v2 v3 ) |
119 | 1 | equemene | * ( v1 v2 v3 ) |
120 | 1 | equemene | * ( v1 v2 v3 ) |
121 | 1 | equemene | * |
122 | 1 | equemene | * ===================================================================== |
123 | 1 | equemene | * |
124 | 1 | equemene | * .. Parameters .. |
125 | 1 | equemene | DOUBLE PRECISION ZERO |
126 | 1 | equemene | PARAMETER ( ZERO = 0.0D+0 ) |
127 | 1 | equemene | * .. |
128 | 1 | equemene | * .. Local Scalars .. |
129 | 1 | equemene | INTEGER I, INFO, J |
130 | 1 | equemene | * .. |
131 | 1 | equemene | * .. External Subroutines .. |
132 | 1 | equemene | EXTERNAL DGEMV, DTRMV, XERBLA |
133 | 1 | equemene | * .. |
134 | 1 | equemene | * .. External Functions .. |
135 | 1 | equemene | LOGICAL LSAME |
136 | 1 | equemene | EXTERNAL LSAME |
137 | 1 | equemene | * .. |
138 | 1 | equemene | * .. Executable Statements .. |
139 | 1 | equemene | * |
140 | 1 | equemene | * Check for currently supported options |
141 | 1 | equemene | * |
142 | 1 | equemene | INFO = 0 |
143 | 1 | equemene | IF( .NOT.LSAME( DIRECT, 'B' ) ) THEN |
144 | 1 | equemene | INFO = -1 |
145 | 1 | equemene | ELSE IF( .NOT.LSAME( STOREV, 'R' ) ) THEN |
146 | 1 | equemene | INFO = -2 |
147 | 1 | equemene | END IF |
148 | 1 | equemene | IF( INFO.NE.0 ) THEN |
149 | 1 | equemene | CALL XERBLA( 'DLARZT', -INFO ) |
150 | 1 | equemene | RETURN |
151 | 1 | equemene | END IF |
152 | 1 | equemene | * |
153 | 1 | equemene | DO 20 I = K, 1, -1 |
154 | 1 | equemene | IF( TAU( I ).EQ.ZERO ) THEN |
155 | 1 | equemene | * |
156 | 1 | equemene | * H(i) = I |
157 | 1 | equemene | * |
158 | 1 | equemene | DO 10 J = I, K |
159 | 1 | equemene | T( J, I ) = ZERO |
160 | 1 | equemene | 10 CONTINUE |
161 | 1 | equemene | ELSE |
162 | 1 | equemene | * |
163 | 1 | equemene | * general case |
164 | 1 | equemene | * |
165 | 1 | equemene | IF( I.LT.K ) THEN |
166 | 1 | equemene | * |
167 | 1 | equemene | * T(i+1:k,i) = - tau(i) * V(i+1:k,1:n) * V(i,1:n)' |
168 | 1 | equemene | * |
169 | 1 | equemene | CALL DGEMV( 'No transpose', K-I, N, -TAU( I ), |
170 | 1 | equemene | $ V( I+1, 1 ), LDV, V( I, 1 ), LDV, ZERO, |
171 | 1 | equemene | $ T( I+1, I ), 1 ) |
172 | 1 | equemene | * |
173 | 1 | equemene | * T(i+1:k,i) = T(i+1:k,i+1:k) * T(i+1:k,i) |
174 | 1 | equemene | * |
175 | 1 | equemene | CALL DTRMV( 'Lower', 'No transpose', 'Non-unit', K-I, |
176 | 1 | equemene | $ T( I+1, I+1 ), LDT, T( I+1, I ), 1 ) |
177 | 1 | equemene | END IF |
178 | 1 | equemene | T( I, I ) = TAU( I ) |
179 | 1 | equemene | END IF |
180 | 1 | equemene | 20 CONTINUE |
181 | 1 | equemene | RETURN |
182 | 1 | equemene | * |
183 | 1 | equemene | * End of DLARZT |
184 | 1 | equemene | * |
185 | 1 | equemene | END |