3
4
5
6
7
8
9
10 CHARACTER DIRECT, STOREV
11 INTEGER IV, JV, K, N
12
13
14 INTEGER DESCV( * )
15 COMPLEX*16 TAU( * ), T( * ), V( * ), WORK( * )
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
187 $ LLD_, MB_, M_, NB_, N_, RSRC_
188 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
189 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
190 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
191 COMPLEX*16 ZERO
192 parameter( zero = ( 0.0d+0, 0.0d+0 ) )
193
194
195 INTEGER ICOFF, ICTXT, II, IIV, INFO, IVCOL, IVROW,
196 $ ITMP0, ITMP1, IW, JJV, LDV, MYCOL, MYROW,
197 $ NPCOL, NPROW, NQ
198
199
201 $ zcopy, zgemv, zgsum2d, zlacgv,
202 $ zlaset, ztrmv
203
204
205 LOGICAL LSAME
206 INTEGER NUMROC
208
209
210 INTRINSIC mod
211
212
213
214
215
216 ictxt = descv( ctxt_ )
217 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
218
219
220
221 info = 0
222 IF( .NOT.
lsame( direct,
'B' ) )
THEN
223 info = -1
224 ELSE IF( .NOT.
lsame( storev,
'R' ) )
THEN
225 info = -2
226 END IF
227 IF( info.NE.0 ) THEN
228 CALL pxerbla( ictxt,
'PZLARZT', -info )
229 CALL blacs_abort( ictxt, 1 )
230 RETURN
231 END IF
232
233 CALL infog2l( iv, jv, descv, nprow, npcol, myrow, mycol,
234 $ iiv, jjv, ivrow, ivcol )
235
236 IF( myrow.EQ.ivrow ) THEN
237 iw = 1
238 itmp0 = 0
239 ldv = descv( lld_ )
240 icoff = mod( jv-1, descv( nb_ ) )
241 nq =
numroc( n+icoff, descv( nb_ ), mycol, ivcol, npcol )
242 IF( mycol.EQ.ivcol )
243 $ nq = nq - icoff
244
245 DO 10 ii = iiv+k-2, iiv, -1
246
247
248
249
250 itmp0 = itmp0 + 1
251 IF( nq.GT.0 ) THEN
252 CALL zlacgv( nq, v( ii+(jjv-1)*ldv ), ldv )
253 CALL zgemv( 'No transpose', itmp0, nq, -tau( ii ),
254 $ v( ii+1+(jjv-1)*ldv ), ldv,
255 $ v( ii+(jjv-1)*ldv ), ldv, zero, work( iw ),
256 $ 1 )
257 CALL zlacgv( nq, v( ii+(jjv-1)*ldv ), ldv )
258 ELSE
259 CALL zlaset( 'All', itmp0, 1, zero, zero, work( iw ),
260 $ itmp0 )
261 END IF
262 iw = iw + itmp0
263
264 10 CONTINUE
265
266 CALL zgsum2d( ictxt, 'Rowwise', ' ', iw-1, 1, work, iw-1,
267 $ myrow, ivcol )
268
269 IF( mycol.EQ.ivcol ) THEN
270
271 iw = 1
272 itmp0 = 0
273 itmp1 = k + 1 + (k-1) * descv( mb_ )
274
275 t( itmp1-1 ) = tau( iiv+k-1 )
276
277 DO 20 ii = iiv+k-2, iiv, -1
278
279
280
281 itmp0 = itmp0 + 1
282 itmp1 = itmp1 - descv( mb_ ) - 1
283 CALL zcopy( itmp0, work( iw ), 1, t( itmp1 ), 1 )
284 iw = iw + itmp0
285
286 CALL ztrmv( 'Lower', 'No transpose', 'Non-unit', itmp0,
287 $ t( itmp1+descv( mb_ ) ), descv( mb_ ),
288 $ t( itmp1 ), 1 )
289 t( itmp1-1 ) = tau( ii )
290
291 20 CONTINUE
292
293 END IF
294
295 END IF
296
297 RETURN
298
299
300
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine pxerbla(ictxt, srname, info)