2
3
4
5
6
7
8
9 CHARACTER UPLO
10 INTEGER IA, JA, N
11
12
13 INTEGER DESCA( * )
14 DOUBLE PRECISION 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, ZERO
122 parameter( one = 1.0d+0, zero = 0.0d+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 $ pdsyrk, pdtrmm, 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 pdsyrk( '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 pdlacpy(
'All', jb, jb, a, il, j, desca, work, 1, 1,
185 $ descw )
186
187
188
189
190 CALL pdlaset(
'Lower', jb-1, jb, zero, zero, a, il+1, j,
191 $ desca )
192
193
194
195 CALL pdtrmm( '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 pdlacpy(
'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 pdsyrk( 'Upper', 'Transpose', n-jb, jb, one, a, ia, ja+jb,
217 $ desca, one, a, ia+jb, ja+jb, desca )
218
219
220
221 CALL pdlacpy(
'All', jb, jb, a, ia, ja, desca, work, 1, 1,
222 $ descw )
223
224
225
226
227 CALL pdlaset(
'Lower', jb-1, jb, zero, zero, a, ia+1, ja,
228 $ desca )
229
230
231
232 CALL pdtrmm( 'Left', 'Upper', 'Transpose', 'Non-Unit', jb,
233 $ n, one, work, 1, 1, descw, a, ia, ja, desca )
234
235
236
237 CALL pdlacpy(
'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 pdsyrk( '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 pdlacpy(
'All', jb, jb, a, il, j, desca, work, 1, 1,
259 $ descw )
260
261
262
263
264 CALL pdlaset(
'Upper', jb, jb-1, zero, zero, a, il, j+1,
265 $ desca )
266
267
268
269 CALL pdtrmm( '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 pdlacpy(
'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 pdsyrk( '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 pdlacpy(
'All', jb, jb, a, ia, ja, desca, work, 1, 1,
296 $ descw )
297
298
299
300
301 CALL pdlaset(
'Upper', jb, jb-1, zero, zero, a, ia, ja+1,
302 $ desca )
303
304
305
306 CALL pdtrmm( 'Right', 'Lower', 'Transpose', 'Non-Unit', n, jb,
307 $ one, work, 1, 1, descw, a, ia, ja, desca )
308
309
310
311 CALL pdlacpy(
'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 pdlaset(uplo, m, n, alpha, beta, a, ia, ja, desca)
subroutine pdlacpy(uplo, m, n, a, ia, ja, desca, b, ib, jb, descb)