2
3
4
5
6
7
8
9 CHARACTER UPLO
10 INTEGER IA, JA, N
11
12
13 INTEGER DESCA( * )
14 COMPLEX 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 REAL ONE
122 parameter( one = 1.0e+0 )
123 COMPLEX CONE, ZERO
124 parameter( cone = ( 1.0e+0, 0.0e+0 ),
125 $ zero = ( 0.0e+0, 0.0e+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
137 $ pcherk, pctrmm, 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 pcherk( '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 pclacpy(
'All', jb, jb, a, il, j, desca, work, 1, 1,
189 $ descw )
190
191
192
193
194 CALL pclaset(
'Lower', jb-1, jb, zero, zero, a, il+1, j,
195 $ desca )
196
197
198
199 CALL pctrmm( '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 pclacpy(
'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 pcherk( '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 pclacpy(
'All', jb, jb, a, ia, ja, desca, work, 1, 1,
226 $ descw )
227
228
229
230
231 CALL pclaset(
'Lower', jb-1, jb, zero, zero, a, ia+1, ja,
232 $ desca )
233
234
235
236 CALL pctrmm( 'Left', 'Upper', 'Conjugate Transpose', 'Non-Unit',
237 $ jb, n, cone, work, 1, 1, descw, a, ia, ja, desca )
238
239
240
241 CALL pclacpy(
'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 pcherk( '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 pclacpy(
'All', jb, jb, a, il, j, desca, work, 1, 1,
263 $ descw )
264
265
266
267
268 CALL pclaset(
'Upper', jb, jb-1, zero, zero, a, il, j+1,
269 $ desca )
270
271
272
273 CALL pctrmm( '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 pclacpy(
'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 pcherk( '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 pclacpy(
'All', jb, jb, a, ia, ja, desca, work, 1, 1,
300 $ descw )
301
302
303
304
305 CALL pclaset(
'Upper', jb, jb-1, zero, zero, a, ia, ja+1,
306 $ desca )
307
308
309
310 CALL pctrmm( 'Right', 'Lower', 'Conjugate transpose',
311 $ 'Non-Unit', n, jb, cone, work, 1, 1, descw, a,
312 $ ia, ja, desca )
313
314
315
316 CALL pclacpy(
'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 pclaset(uplo, m, n, alpha, beta, a, ia, ja, desca)
subroutine pclacpy(uplo, m, n, a, ia, ja, desca, b, ib, jb, descb)