3
4
5
6
7
8
9
10 CHARACTER DIRECT, STOREV
11 INTEGER IV, JV, K, N
12
13
14 INTEGER DESCV( * )
15 DOUBLE PRECISION 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 DOUBLE PRECISION ZERO
192 parameter( zero = 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
200 EXTERNAL blacs_abort, blacs_gridinfo, dcopy, dgemv,
201 $ dgsum2d, dlaset, dtrmv,
infog2l,
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,
'PDLARZT', -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 dgemv( 'No transpose', itmp0, nq, -tau( ii ),
253 $ v( ii+1+(jjv-1)*ldv ), ldv,
254 $ v( ii+(jjv-1)*ldv ), ldv, zero, work( iw ),
255 $ 1 )
256 ELSE
257 CALL dlaset( 'All', itmp0, 1, zero, zero, work( iw ),
258 $ itmp0 )
259 END IF
260 iw = iw + itmp0
261
262 10 CONTINUE
263
264 CALL dgsum2d( ictxt, 'Rowwise', ' ', iw-1, 1, work, iw-1,
265 $ myrow, ivcol )
266
267 IF( mycol.EQ.ivcol ) THEN
268
269 iw = 1
270 itmp0 = 0
271 itmp1 = k + 1 + (k-1) * descv( mb_ )
272
273 t( itmp1-1 ) = tau( iiv+k-1 )
274
275 DO 20 ii = iiv+k-2, iiv, -1
276
277
278
279 itmp0 = itmp0 + 1
280 itmp1 = itmp1 - descv( mb_ ) - 1
281 CALL dcopy( itmp0, work( iw ), 1, t( itmp1 ), 1 )
282 iw = iw + itmp0
283
284 CALL dtrmv( 'Lower', 'No transpose', 'Non-unit', itmp0,
285 $ t( itmp1+descv( mb_ ) ), descv( mb_ ),
286 $ t( itmp1 ), 1 )
287 t( itmp1-1 ) = tau( ii )
288
289 20 CONTINUE
290
291 END IF
292
293 END IF
294
295 RETURN
296
297
298
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)