3
4
5
6
7
8
9
10 CHARACTER UPLO
11 INTEGER IA, IW, JA, JW, N, NB
12
13
14 INTEGER DESCA( * ), DESCW( * )
15 DOUBLE PRECISION D( * ), E( * )
16 COMPLEX*16 A( * ), TAU( * ), W( * ), WORK( * )
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
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
223 $ LLD_, MB_, M_, NB_, N_, RSRC_
224 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
225 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
226 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
227 COMPLEX*16 HALF, ONE, ZERO
228 parameter( half = ( 0.5d+0, 0.0d+0 ),
229 $ one = ( 1.0d+0, 0.0d+0 ),
230 $ zero = ( 0.0d+0, 0.0d+0 ) )
231
232
233 INTEGER I, IACOL, IAROW, ICTXT, II, J, JJ, JP, JWK, K,
234 $ KW, MYCOL, MYROW, NPCOL, NPROW, NQ
235 COMPLEX*16 AII, ALPHA, BETA
236
237
238 INTEGER DESCD( DLEN_ ), DESCE( DLEN_ ), DESCWK( DLEN_ )
239
240
241 EXTERNAL blacs_gridinfo,
descset, dgebr2d, dgebs2d,
245
246
247 LOGICAL LSAME
248 INTEGER NUMROC
250
251
252 INTRINSIC dble, dcmplx,
min
253
254
255
256
257
258 IF( n.LE.0 )
259 $ RETURN
260
261 ictxt = desca( ctxt_ )
262 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
263 nq =
max( 1,
numroc( ja+n-1, desca( nb_ ), mycol, desca( csrc_ ),
264 $ npcol ) )
265 CALL descset( descd, 1, ja+n-1, 1, desca( nb_ ), myrow,
266 $ desca( csrc_ ), desca( ctxt_ ), 1 )
267 aii = zero
268 beta = zero
269
270 IF(
lsame( uplo,
'U' ) )
THEN
271
272 CALL infog2l( n+ia-nb, n+ja-nb, desca, nprow, npcol, myrow,
273 $ mycol, ii, jj, iarow, iacol )
274 CALL descset( descwk, 1, descw( nb_ ), 1, descw( nb_ ), iarow,
275 $ iacol, ictxt, 1 )
276 CALL descset( desce, 1, ja+n-1, 1, desca( nb_ ), myrow,
277 $ desca( csrc_ ), desca( ctxt_ ), 1 )
278
279
280
281 DO 10 j = ja+n-1, ja+n-nb, -1
282 i = ia + j - ja
283 k = j - ja + 1
284 kw = mod( k-1, desca( mb_ ) ) + 1
285
286
287
288 CALL pzelget(
'E',
' ', aii, a, i, j, desca )
289 CALL pzelset( a, i, j, desca, dcmplx( dble( aii ) ) )
290 CALL pzlacgv( n-k, w, iw+k-1, jw+kw, descw, descw( m_ ) )
291 CALL pzgemv( 'No transpose', k, n-k, -one, a, ia, j+1,
292 $ desca, w, iw+k-1, jw+kw, descw, descw( m_ ),
293 $ one, a, ia, j, desca, 1 )
294 CALL pzlacgv( n-k, w, iw+k-1, jw+kw, descw, descw( m_ ) )
295 CALL pzlacgv( n-k, a, i, j+1, desca, desca( m_ ) )
296 CALL pzgemv( 'No transpose', k, n-k, -one, w, iw, jw+kw,
297 $ descw, a, i, j+1, desca, desca( m_ ), one, a,
298 $ ia, j, desca, 1 )
299 CALL pzlacgv( n-k, a, i, j+1, desca, desca( m_ ) )
300 CALL pzelget(
'E',
' ', aii, a, i, j, desca )
301 CALL pzelset( a, i, j, desca, dcmplx( dble( aii ) ) )
302 IF( n-k.GT.0 )
303 $
CALL pzelset( a, i, j+1, desca, dcmplx( e( jp ) ) )
304
305
306
307
308 jp =
min( jj+kw-1, nq )
309 CALL pzlarfg( k-1, beta, i-1, j, a, ia, j, desca, 1,
310 $ tau )
311 CALL pdelset( e, 1, j, desce, dble( beta ) )
312 CALL pzelset( a, i-1, j, desca, one )
313
314
315
316 CALL pzhemv( 'Upper', k-1, one, a, ia, ja, desca, a, ia, j,
317 $ desca, 1, zero, w, iw, jw+kw-1, descw, 1 )
318
319 jwk = mod( k-1, descwk( nb_ ) ) + 2
320 CALL pzgemv( 'Conjugate transpose', k-1, n-k, one, w, iw,
321 $ jw+kw, descw, a, ia, j, desca, 1, zero, work,
322 $ 1, jwk, descwk, descwk( m_ ) )
323 CALL pzgemv( 'No transpose', k-1, n-k, -one, a, ia, j+1,
324 $ desca, work, 1, jwk, descwk, descwk( m_ ), one,
325 $ w, iw, jw+kw-1, descw, 1 )
326 CALL pzgemv( 'Conjugate transpose', k-1, n-k, one, a, ia,
327 $ j+1, desca, a, ia, j, desca, 1, zero, work, 1,
328 $ jwk, descwk, descwk( m_ ) )
329 CALL pzgemv( 'No transpose', k-1, n-k, -one, w, iw, jw+kw,
330 $ descw, work, 1, jwk, descwk, descwk( m_ ), one,
331 $ w, iw, jw+kw-1, descw, 1 )
332 CALL pzscal( k-1, tau( jp ), w, iw, jw+kw-1, descw, 1 )
333
334 CALL pzdotc( k-1, alpha, w, iw, jw+kw-1, descw, 1, a, ia, j,
335 $ desca, 1 )
336 IF( mycol.EQ.iacol )
337 $ alpha = -half*tau( jp )*alpha
338 CALL pzaxpy( k-1, alpha, a, ia, j, desca, 1, w, iw, jw+kw-1,
339 $ descw, 1 )
340 CALL pzelget(
'E',
' ', beta, a, i, j, desca )
341 CALL pdelset( d, 1, j, descd, dble( beta ) )
342
343 10 CONTINUE
344
345 ELSE
346
347 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, ii,
348 $ jj, iarow, iacol )
349 CALL descset( descwk, 1, descw( nb_ ), 1, descw( nb_ ), iarow,
350 $ iacol, ictxt, 1 )
351 CALL descset( desce, 1, ja+n-2, 1, desca( nb_ ), myrow,
352 $ desca( csrc_ ), desca( ctxt_ ), 1 )
353
354
355
356 DO 20 j = ja, ja+nb-1
357 i = ia + j - ja
358 k = j - ja + 1
359
360
361
362 CALL pzelget(
'E',
' ', aii, a, i, j, desca )
363 CALL pzelset( a, i, j, desca, dcmplx( dble( aii ) ) )
364 CALL pzlacgv( k-1, w, iw+k-1, jw, descw, descw( m_ ) )
365 CALL pzgemv( 'No transpose', n-k+1, k-1, -one, a, i, ja,
366 $ desca, w, iw+k-1, jw, descw, descw( m_ ), one,
367 $ a, i, j, desca, 1 )
368 CALL pzlacgv( k-1, w, iw+k-1, jw, descw, descw( m_ ) )
369 CALL pzlacgv( k-1, a, i, ja, desca, desca( m_ ) )
370 CALL pzgemv( 'No transpose', n-k+1, k-1, -one, w, iw+k-1,
371 $ jw, descw, a, i, ja, desca, desca( m_ ), one,
372 $ a, i, j, desca, 1 )
373 CALL pzlacgv( k-1, a, i, ja, desca, desca( m_ ) )
374 CALL pzelget(
'E',
' ', aii, a, i, j, desca )
375 CALL pzelset( a, i, j, desca, dcmplx( dble( aii ) ) )
376 IF( k.GT.1 )
377 $
CALL pzelset( a, i, j-1, desca, dcmplx( e( jp ) ) )
378
379
380
381
382
383 jp =
min( jj+k-1, nq )
384 CALL pzlarfg( n-k, beta, i+1, j, a, i+2, j, desca, 1,
385 $ tau )
386 CALL pdelset( e, 1, j, desce, dble( beta ) )
387 CALL pzelset( a, i+1, j, desca, one )
388
389
390
391 CALL pzhemv( 'Lower', n-k, one, a, i+1, j+1, desca, a, i+1,
392 $ j, desca, 1, zero, w, iw+k, jw+k-1, descw, 1 )
393
394 CALL pzgemv( 'Conjugate Transpose', n-k, k-1, one, w, iw+k,
395 $ jw, descw, a, i+1, j, desca, 1, zero, work, 1,
396 $ 1, descwk, descwk( m_ ) )
397 CALL pzgemv( 'No transpose', n-k, k-1, -one, a, i+1, ja,
398 $ desca, work, 1, 1, descwk, descwk( m_ ), one, w,
399 $ iw+k, jw+k-1, descw, 1 )
400 CALL pzgemv( 'Conjugate transpose', n-k, k-1, one, a, i+1,
401 $ ja, desca, a, i+1, j, desca, 1, zero, work, 1,
402 $ 1, descwk, descwk( m_ ) )
403 CALL pzgemv( 'No transpose', n-k, k-1, -one, w, iw+k, jw,
404 $ descw, work, 1, 1, descwk, descwk( m_ ), one, w,
405 $ iw+k, jw+k-1, descw, 1 )
406 CALL pzscal( n-k, tau( jp ), w, iw+k, jw+k-1, descw, 1 )
407 CALL pzdotc( n-k, alpha, w, iw+k, jw+k-1, descw, 1, a, i+1,
408 $ j, desca, 1 )
409 IF( mycol.EQ.iacol )
410 $ alpha = -half*tau( jp )*alpha
411 CALL pzaxpy( n-k, alpha, a, i+1, j, desca, 1, w, iw+k,
412 $ jw+k-1, descw, 1 )
413 CALL pzelget(
'E',
' ', beta, a, i, j, desca )
414 CALL pdelset( d, 1, j, descd, dble( beta ) )
415
416 20 CONTINUE
417
418 END IF
419
420
421
422 IF( mycol.EQ.iacol ) THEN
423 IF( myrow.EQ.iarow ) THEN
424 CALL dgebs2d( ictxt, 'Columnwise', ' ', 1, nb, d( jj ), 1 )
425 ELSE
426 CALL dgebr2d( ictxt, 'Columnwise', ' ', 1, nb, d( jj ), 1,
427 $ iarow, mycol )
428 END IF
429 END IF
430
431 RETURN
432
433
434
subroutine descset(desc, m, n, mb, nb, irsrc, icsrc, ictxt, lld)
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine pdelset(a, ia, ja, desca, alpha)
subroutine pzelget(scope, top, alpha, a, ia, ja, desca)
subroutine pzelset(a, ia, ja, desca, alpha)
subroutine pzlacgv(n, x, ix, jx, descx, incx)
subroutine pzlarfg(n, alpha, iax, jax, x, ix, jx, descx, incx, tau)