2
3
4
5
6
7
8
9 CHARACTER UPLO
10 INTEGER IA, JA, N
11
12
13 INTEGER DESCA( * )
14 COMPLEX*16 A( * ), WORK( * )
15
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 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
117 $ LLD_, MB_, M_, NB_, N_, RSRC_
118 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
119 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
120 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
121 DOUBLE PRECISION ONE
122 parameter( one = 1.0d+0 )
123 COMPLEX*16 CONE, ZERO
124 parameter( cone = ( 1.0d+0, 0.0d+0 ),
125 $ zero = ( 0.0d+0, 0.0d+0 ) )
126
127
128 LOGICAL UPPER
129 CHARACTER COLBTOP, ROWBTOP
130 INTEGER IACOL, IAROW, ICTXT, IL, J, JB, JL, JN, MYCOL,
131 $ MYROW, NPCOL, NPROW
132
133 INTEGER DESCW( DLEN_ )
134
135
136 EXTERNAL blacs_gridinfo,
descset, pb_topget, pb_topset,
138
139
140 LOGICAL LSAME
141 INTEGER ICEIL, INDXG2P
143
144
146
147
148
149
150
151 ictxt = desca( ctxt_ )
152 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
153
154 CALL pb_topget( ictxt, 'Broadcast', 'Rowwise', rowbtop )
155 CALL pb_topget( ictxt, 'Broadcast', 'Columnwise', colbtop )
156
157 upper =
lsame( uplo,
'U' )
158 jn =
min(
iceil( ja, desca( nb_ ) ) * desca( nb_ ), ja+n-1 )
159 jl =
max( ( ( ja+n-2 ) / desca( nb_ ) ) * desca( nb_ ) + 1, ja )
160 il =
max( ( ( ia+n-2 ) / desca( mb_ ) ) * desca( mb_ ) + 1, ia )
161 iarow =
indxg2p( il, desca( mb_ ), myrow, desca( rsrc_ ), nprow )
162 iacol =
indxg2p( jl, desca( nb_ ), mycol, desca( csrc_ ), npcol )
163
164
165
166 CALL descset( descw, desca( mb_ ), desca( nb_ ), desca( mb_ ),
167 $ desca( nb_ ), iarow, iacol, ictxt, desca( mb_ ) )
168
169 IF ( upper ) THEN
170
171
172
173 CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', ' ' )
174 CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', 'S-ring' )
175
176 DO 10 j = jl, jn+1, -desca( nb_ )
177
178 jb =
min( ja+n-j, desca( nb_ ) )
179
180
181
182 CALL pzherk( 'Upper', 'Conjugate Transpose', ja+n-j-jb, jb,
183 $ one, a, il, j+jb, desca, one, a, il+jb, j+jb,
184 $ desca )
185
186
187
188 CALL pzlacpy(
'All', jb, jb, a, il, j, desca, work, 1, 1,
189 $ descw )
190
191
192
193
194 CALL pzlaset(
'Lower', jb-1, jb, zero, zero, a, il+1, j,
195 $ desca )
196
197
198
199 CALL pztrmm( 'Left', 'Upper', 'Conjugate Transpose',
200 $ 'Non-Unit', jb, n-j+ja, cone, work, 1, 1,
201 $ descw, a, il, j, desca )
202
203
204
205 CALL pzlacpy(
'Lower', jb-1, jb, work, 2, 1, descw, a,
206 $ il+1, j, desca )
207
208 il = il - desca( mb_ )
209 descw( rsrc_ ) = mod( descw( rsrc_ ) + nprow - 1, nprow )
210 descw( csrc_ ) = mod( descw( csrc_ ) + npcol - 1, npcol )
211
212 10 CONTINUE
213
214
215
216 jb =
min( jn-ja+1, desca( nb_ ) )
217
218
219
220 CALL pzherk( 'Upper', 'Conjugate Transpose', n-jb, jb, one, a,
221 $ ia, ja+jb, desca, one, a, ia+jb, ja+jb, desca )
222
223
224
225 CALL pzlacpy(
'All', jb, jb, a, ia, ja, desca, work, 1, 1,
226 $ descw )
227
228
229
230
231 CALL pzlaset(
'Lower', jb-1, jb, zero, zero, a, ia+1, ja,
232 $ desca )
233
234
235
236 CALL pztrmm( 'Left', 'Upper', 'Conjugate Transpose', 'Non-Unit',
237 $ jb, n, cone, work, 1, 1, descw, a, ia, ja, desca )
238
239
240
241 CALL pzlacpy(
'Lower', jb-1, jb, work, 2, 1, descw, a, ia+1,
242 $ ja, desca )
243
244 ELSE
245
246
247
248 CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', 'S-ring' )
249 CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', ' ' )
250
251 DO 20 j = jl, jn+1, -desca( nb_ )
252
253 jb =
min( ja+n-j, desca( nb_ ) )
254
255
256
257 CALL pzherk( 'Lower', 'No Transpose', ia+n-il-jb, jb, one, a,
258 $ il+jb, j, desca, one, a, il+jb, j+jb, desca )
259
260
261
262 CALL pzlacpy(
'All', jb, jb, a, il, j, desca, work, 1, 1,
263 $ descw )
264
265
266
267
268 CALL pzlaset(
'Upper', jb, jb-1, zero, zero, a, il, j+1,
269 $ desca )
270
271
272
273 CALL pztrmm( 'Right', 'Lower', 'Conjugate transpose',
274 $ 'Non-Unit', ia+n-il, jb, cone, work, 1, 1,
275 $ descw, a, il, j, desca )
276
277
278
279 CALL pzlacpy(
'Upper', jb, jb-1, work, 1, 2, descw, a,
280 $ il, j+1, desca )
281
282 il = il - desca( mb_ )
283 descw( rsrc_ ) = mod( descw( rsrc_ ) + nprow - 1, nprow )
284 descw( csrc_ ) = mod( descw( csrc_ ) + npcol - 1, npcol )
285
286 20 CONTINUE
287
288
289
290 jb =
min( jn-ja+1, desca( nb_ ) )
291
292
293
294 CALL pzherk( 'Lower', 'No Transpose', n-jb, jb, one, a,
295 $ ia+jb, ja, desca, one, a, ia+jb, ja+jb, desca )
296
297
298
299 CALL pzlacpy(
'All', jb, jb, a, ia, ja, desca, work, 1, 1,
300 $ descw )
301
302
303
304
305 CALL pzlaset(
'Upper', jb, jb-1, zero, zero, a, ia, ja+1,
306 $ desca )
307
308
309
310 CALL pztrmm( 'Right', 'Lower', 'Conjugate transpose',
311 $ 'Non-Unit', n, jb, cone, work, 1, 1, descw, a,
312 $ ia, ja, desca )
313
314
315
316 CALL pzlacpy(
'Upper', jb, jb-1, work, 1, 2, descw, a, ia,
317 $ ja+1, desca )
318
319 END IF
320
321 CALL pb_topset( ictxt, 'Broadcast', 'Rowwise', rowbtop )
322 CALL pb_topset( ictxt, 'Broadcast', 'Columnwise', colbtop )
323
324 RETURN
325
326
327
subroutine descset(desc, m, n, mb, nb, irsrc, icsrc, ictxt, lld)
integer function iceil(inum, idenom)
integer function indxg2p(indxglob, nb, iproc, isrcproc, nprocs)
subroutine pzlaset(uplo, m, n, alpha, beta, a, ia, ja, desca)
subroutine pzlacpy(uplo, m, n, a, ia, ja, desca, b, ib, jb, descb)