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