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