root / src / lapack / double / dlarzb.f @ 2
Historique | Voir | Annoter | Télécharger (6,53 ko)
1 | 1 | equemene | SUBROUTINE DLARZB( SIDE, TRANS, DIRECT, STOREV, M, N, K, L, V, |
---|---|---|---|
2 | 1 | equemene | $ LDV, T, LDT, C, LDC, WORK, LDWORK ) |
3 | 1 | equemene | * |
4 | 1 | equemene | * -- LAPACK routine (version 3.2) -- |
5 | 1 | equemene | * -- LAPACK is a software package provided by Univ. of Tennessee, -- |
6 | 1 | equemene | * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
7 | 1 | equemene | * November 2006 |
8 | 1 | equemene | * |
9 | 1 | equemene | * .. Scalar Arguments .. |
10 | 1 | equemene | CHARACTER DIRECT, SIDE, STOREV, TRANS |
11 | 1 | equemene | INTEGER K, L, LDC, LDT, LDV, LDWORK, M, N |
12 | 1 | equemene | * .. |
13 | 1 | equemene | * .. Array Arguments .. |
14 | 1 | equemene | DOUBLE PRECISION C( LDC, * ), T( LDT, * ), V( LDV, * ), |
15 | 1 | equemene | $ WORK( LDWORK, * ) |
16 | 1 | equemene | * .. |
17 | 1 | equemene | * |
18 | 1 | equemene | * Purpose |
19 | 1 | equemene | * ======= |
20 | 1 | equemene | * |
21 | 1 | equemene | * DLARZB applies a real block reflector H or its transpose H**T to |
22 | 1 | equemene | * a real distributed M-by-N C from the left or the right. |
23 | 1 | equemene | * |
24 | 1 | equemene | * Currently, only STOREV = 'R' and DIRECT = 'B' are supported. |
25 | 1 | equemene | * |
26 | 1 | equemene | * Arguments |
27 | 1 | equemene | * ========= |
28 | 1 | equemene | * |
29 | 1 | equemene | * SIDE (input) CHARACTER*1 |
30 | 1 | equemene | * = 'L': apply H or H' from the Left |
31 | 1 | equemene | * = 'R': apply H or H' from the Right |
32 | 1 | equemene | * |
33 | 1 | equemene | * TRANS (input) CHARACTER*1 |
34 | 1 | equemene | * = 'N': apply H (No transpose) |
35 | 1 | equemene | * = 'C': apply H' (Transpose) |
36 | 1 | equemene | * |
37 | 1 | equemene | * DIRECT (input) CHARACTER*1 |
38 | 1 | equemene | * Indicates how H is formed from a product of elementary |
39 | 1 | equemene | * reflectors |
40 | 1 | equemene | * = 'F': H = H(1) H(2) . . . H(k) (Forward, not supported yet) |
41 | 1 | equemene | * = 'B': H = H(k) . . . H(2) H(1) (Backward) |
42 | 1 | equemene | * |
43 | 1 | equemene | * STOREV (input) CHARACTER*1 |
44 | 1 | equemene | * Indicates how the vectors which define the elementary |
45 | 1 | equemene | * reflectors are stored: |
46 | 1 | equemene | * = 'C': Columnwise (not supported yet) |
47 | 1 | equemene | * = 'R': Rowwise |
48 | 1 | equemene | * |
49 | 1 | equemene | * M (input) INTEGER |
50 | 1 | equemene | * The number of rows of the matrix C. |
51 | 1 | equemene | * |
52 | 1 | equemene | * N (input) INTEGER |
53 | 1 | equemene | * The number of columns of the matrix C. |
54 | 1 | equemene | * |
55 | 1 | equemene | * K (input) INTEGER |
56 | 1 | equemene | * The order of the matrix T (= the number of elementary |
57 | 1 | equemene | * reflectors whose product defines the block reflector). |
58 | 1 | equemene | * |
59 | 1 | equemene | * L (input) INTEGER |
60 | 1 | equemene | * The number of columns of the matrix V containing the |
61 | 1 | equemene | * meaningful part of the Householder reflectors. |
62 | 1 | equemene | * If SIDE = 'L', M >= L >= 0, if SIDE = 'R', N >= L >= 0. |
63 | 1 | equemene | * |
64 | 1 | equemene | * V (input) DOUBLE PRECISION array, dimension (LDV,NV). |
65 | 1 | equemene | * If STOREV = 'C', NV = K; if STOREV = 'R', NV = L. |
66 | 1 | equemene | * |
67 | 1 | equemene | * LDV (input) INTEGER |
68 | 1 | equemene | * The leading dimension of the array V. |
69 | 1 | equemene | * If STOREV = 'C', LDV >= L; if STOREV = 'R', LDV >= K. |
70 | 1 | equemene | * |
71 | 1 | equemene | * T (input) DOUBLE PRECISION array, dimension (LDT,K) |
72 | 1 | equemene | * The triangular K-by-K matrix T in the representation of the |
73 | 1 | equemene | * block reflector. |
74 | 1 | equemene | * |
75 | 1 | equemene | * LDT (input) INTEGER |
76 | 1 | equemene | * The leading dimension of the array T. LDT >= K. |
77 | 1 | equemene | * |
78 | 1 | equemene | * C (input/output) DOUBLE PRECISION array, dimension (LDC,N) |
79 | 1 | equemene | * On entry, the M-by-N matrix C. |
80 | 1 | equemene | * On exit, C is overwritten by H*C or H'*C or C*H or C*H'. |
81 | 1 | equemene | * |
82 | 1 | equemene | * LDC (input) INTEGER |
83 | 1 | equemene | * The leading dimension of the array C. LDC >= max(1,M). |
84 | 1 | equemene | * |
85 | 1 | equemene | * WORK (workspace) DOUBLE PRECISION array, dimension (LDWORK,K) |
86 | 1 | equemene | * |
87 | 1 | equemene | * LDWORK (input) INTEGER |
88 | 1 | equemene | * The leading dimension of the array WORK. |
89 | 1 | equemene | * If SIDE = 'L', LDWORK >= max(1,N); |
90 | 1 | equemene | * if SIDE = 'R', LDWORK >= max(1,M). |
91 | 1 | equemene | * |
92 | 1 | equemene | * Further Details |
93 | 1 | equemene | * =============== |
94 | 1 | equemene | * |
95 | 1 | equemene | * Based on contributions by |
96 | 1 | equemene | * A. Petitet, Computer Science Dept., Univ. of Tenn., Knoxville, USA |
97 | 1 | equemene | * |
98 | 1 | equemene | * ===================================================================== |
99 | 1 | equemene | * |
100 | 1 | equemene | * .. Parameters .. |
101 | 1 | equemene | DOUBLE PRECISION ONE |
102 | 1 | equemene | PARAMETER ( ONE = 1.0D+0 ) |
103 | 1 | equemene | * .. |
104 | 1 | equemene | * .. Local Scalars .. |
105 | 1 | equemene | CHARACTER TRANST |
106 | 1 | equemene | INTEGER I, INFO, J |
107 | 1 | equemene | * .. |
108 | 1 | equemene | * .. External Functions .. |
109 | 1 | equemene | LOGICAL LSAME |
110 | 1 | equemene | EXTERNAL LSAME |
111 | 1 | equemene | * .. |
112 | 1 | equemene | * .. External Subroutines .. |
113 | 1 | equemene | EXTERNAL DCOPY, DGEMM, DTRMM, XERBLA |
114 | 1 | equemene | * .. |
115 | 1 | equemene | * .. Executable Statements .. |
116 | 1 | equemene | * |
117 | 1 | equemene | * Quick return if possible |
118 | 1 | equemene | * |
119 | 1 | equemene | IF( M.LE.0 .OR. N.LE.0 ) |
120 | 1 | equemene | $ RETURN |
121 | 1 | equemene | * |
122 | 1 | equemene | * Check for currently supported options |
123 | 1 | equemene | * |
124 | 1 | equemene | INFO = 0 |
125 | 1 | equemene | IF( .NOT.LSAME( DIRECT, 'B' ) ) THEN |
126 | 1 | equemene | INFO = -3 |
127 | 1 | equemene | ELSE IF( .NOT.LSAME( STOREV, 'R' ) ) THEN |
128 | 1 | equemene | INFO = -4 |
129 | 1 | equemene | END IF |
130 | 1 | equemene | IF( INFO.NE.0 ) THEN |
131 | 1 | equemene | CALL XERBLA( 'DLARZB', -INFO ) |
132 | 1 | equemene | RETURN |
133 | 1 | equemene | END IF |
134 | 1 | equemene | * |
135 | 1 | equemene | IF( LSAME( TRANS, 'N' ) ) THEN |
136 | 1 | equemene | TRANST = 'T' |
137 | 1 | equemene | ELSE |
138 | 1 | equemene | TRANST = 'N' |
139 | 1 | equemene | END IF |
140 | 1 | equemene | * |
141 | 1 | equemene | IF( LSAME( SIDE, 'L' ) ) THEN |
142 | 1 | equemene | * |
143 | 1 | equemene | * Form H * C or H' * C |
144 | 1 | equemene | * |
145 | 1 | equemene | * W( 1:n, 1:k ) = C( 1:k, 1:n )' |
146 | 1 | equemene | * |
147 | 1 | equemene | DO 10 J = 1, K |
148 | 1 | equemene | CALL DCOPY( N, C( J, 1 ), LDC, WORK( 1, J ), 1 ) |
149 | 1 | equemene | 10 CONTINUE |
150 | 1 | equemene | * |
151 | 1 | equemene | * W( 1:n, 1:k ) = W( 1:n, 1:k ) + ... |
152 | 1 | equemene | * C( m-l+1:m, 1:n )' * V( 1:k, 1:l )' |
153 | 1 | equemene | * |
154 | 1 | equemene | IF( L.GT.0 ) |
155 | 1 | equemene | $ CALL DGEMM( 'Transpose', 'Transpose', N, K, L, ONE, |
156 | 1 | equemene | $ C( M-L+1, 1 ), LDC, V, LDV, ONE, WORK, LDWORK ) |
157 | 1 | equemene | * |
158 | 1 | equemene | * W( 1:n, 1:k ) = W( 1:n, 1:k ) * T' or W( 1:m, 1:k ) * T |
159 | 1 | equemene | * |
160 | 1 | equemene | CALL DTRMM( 'Right', 'Lower', TRANST, 'Non-unit', N, K, ONE, T, |
161 | 1 | equemene | $ LDT, WORK, LDWORK ) |
162 | 1 | equemene | * |
163 | 1 | equemene | * C( 1:k, 1:n ) = C( 1:k, 1:n ) - W( 1:n, 1:k )' |
164 | 1 | equemene | * |
165 | 1 | equemene | DO 30 J = 1, N |
166 | 1 | equemene | DO 20 I = 1, K |
167 | 1 | equemene | C( I, J ) = C( I, J ) - WORK( J, I ) |
168 | 1 | equemene | 20 CONTINUE |
169 | 1 | equemene | 30 CONTINUE |
170 | 1 | equemene | * |
171 | 1 | equemene | * C( m-l+1:m, 1:n ) = C( m-l+1:m, 1:n ) - ... |
172 | 1 | equemene | * V( 1:k, 1:l )' * W( 1:n, 1:k )' |
173 | 1 | equemene | * |
174 | 1 | equemene | IF( L.GT.0 ) |
175 | 1 | equemene | $ CALL DGEMM( 'Transpose', 'Transpose', L, N, K, -ONE, V, LDV, |
176 | 1 | equemene | $ WORK, LDWORK, ONE, C( M-L+1, 1 ), LDC ) |
177 | 1 | equemene | * |
178 | 1 | equemene | ELSE IF( LSAME( SIDE, 'R' ) ) THEN |
179 | 1 | equemene | * |
180 | 1 | equemene | * Form C * H or C * H' |
181 | 1 | equemene | * |
182 | 1 | equemene | * W( 1:m, 1:k ) = C( 1:m, 1:k ) |
183 | 1 | equemene | * |
184 | 1 | equemene | DO 40 J = 1, K |
185 | 1 | equemene | CALL DCOPY( M, C( 1, J ), 1, WORK( 1, J ), 1 ) |
186 | 1 | equemene | 40 CONTINUE |
187 | 1 | equemene | * |
188 | 1 | equemene | * W( 1:m, 1:k ) = W( 1:m, 1:k ) + ... |
189 | 1 | equemene | * C( 1:m, n-l+1:n ) * V( 1:k, 1:l )' |
190 | 1 | equemene | * |
191 | 1 | equemene | IF( L.GT.0 ) |
192 | 1 | equemene | $ CALL DGEMM( 'No transpose', 'Transpose', M, K, L, ONE, |
193 | 1 | equemene | $ C( 1, N-L+1 ), LDC, V, LDV, ONE, WORK, LDWORK ) |
194 | 1 | equemene | * |
195 | 1 | equemene | * W( 1:m, 1:k ) = W( 1:m, 1:k ) * T or W( 1:m, 1:k ) * T' |
196 | 1 | equemene | * |
197 | 1 | equemene | CALL DTRMM( 'Right', 'Lower', TRANS, 'Non-unit', M, K, ONE, T, |
198 | 1 | equemene | $ LDT, WORK, LDWORK ) |
199 | 1 | equemene | * |
200 | 1 | equemene | * C( 1:m, 1:k ) = C( 1:m, 1:k ) - W( 1:m, 1:k ) |
201 | 1 | equemene | * |
202 | 1 | equemene | DO 60 J = 1, K |
203 | 1 | equemene | DO 50 I = 1, M |
204 | 1 | equemene | C( I, J ) = C( I, J ) - WORK( I, J ) |
205 | 1 | equemene | 50 CONTINUE |
206 | 1 | equemene | 60 CONTINUE |
207 | 1 | equemene | * |
208 | 1 | equemene | * C( 1:m, n-l+1:n ) = C( 1:m, n-l+1:n ) - ... |
209 | 1 | equemene | * W( 1:m, 1:k ) * V( 1:k, 1:l ) |
210 | 1 | equemene | * |
211 | 1 | equemene | IF( L.GT.0 ) |
212 | 1 | equemene | $ CALL DGEMM( 'No transpose', 'No transpose', M, L, K, -ONE, |
213 | 1 | equemene | $ WORK, LDWORK, V, LDV, ONE, C( 1, N-L+1 ), LDC ) |
214 | 1 | equemene | * |
215 | 1 | equemene | END IF |
216 | 1 | equemene | * |
217 | 1 | equemene | RETURN |
218 | 1 | equemene | * |
219 | 1 | equemene | * End of DLARZB |
220 | 1 | equemene | * |
221 | 1 | equemene | END |