2
3
4
5
6
7
8
9 CHARACTER UPLO
10 INTEGER IA, JA, M, N
11 DOUBLE PRECISION ALPHA, BETA
12
13
14 INTEGER DESCA( * )
15 DOUBLE PRECISION A( * )
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
134 $ LLD_, MB_, M_, NB_, N_, RSRC_
135 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
136 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
137 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
138
139
140 INTEGER HEIGHT, IACOL, IAROW, IBASE, ICOFFA, II, IIA,
141 $ IIBEG, IIEND, IINXT, ILEFT, IRIGHT, IROFFA,
142 $ ITOP, JJ, JJA, JJBEG, JJEND, JJNXT, LDA, MBA,
143 $ MP, MPA, MYCOL, MYDIST, MYROW, NBA, NPCOL,
144 $ NPROW, NQ, NQA, WIDE
145
146
147 EXTERNAL blacs_gridinfo, dlaset,
infog2l
148
149
150 LOGICAL LSAME
151 INTEGER ICEIL, NUMROC
153
154
156
157
158
159 IF( m.EQ.0 .OR. n.EQ.0 )
160 $ RETURN
161
162
163
164 CALL blacs_gridinfo( desca( ctxt_ ), nprow, npcol, myrow, mycol )
165
166 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, iia, jja,
167 $ iarow, iacol )
168 mba = desca( mb_ )
169 nba = desca( nb_ )
170 lda = desca( lld_ )
171 iroffa = mod( ia-1, mba )
172 icoffa = mod( ja-1, nba )
173
174 IF( n.LE.( nba-icoffa ) ) THEN
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 IF( mycol.EQ.iacol ) THEN
213
214 mpa =
numroc( m+iroffa, mba, myrow, iarow, nprow )
215 IF( mpa.LE.0 )
216 $ RETURN
217 IF( myrow.EQ.iarow )
218 $ mpa = mpa - iroffa
219 mydist = mod( myrow-iarow+nprow, nprow )
220 itop = mydist * mba - iroffa
221
222 IF(
lsame( uplo,
'U' ) )
THEN
223
224 itop =
max( 0, itop )
225 iibeg = iia
226 iiend = iia + mpa - 1
227 iinxt =
min(
iceil( iibeg, mba ) * mba, iiend )
228
229 10 CONTINUE
230 IF( ( n-itop ).GT.0 ) THEN
231 CALL dlaset( uplo, iinxt-iibeg+1, n-itop, alpha, beta,
232 $ a( iibeg+(jja+itop-1)*lda ), lda )
233 mydist = mydist + nprow
234 itop = mydist * mba - iroffa
235 iibeg = iinxt +1
236 iinxt =
min( iinxt+mba, iiend )
237 GO TO 10
238 END IF
239
240 ELSE IF(
lsame( uplo,
'L' ) )
THEN
241
242 ii = iia
243 jj = jja
244 mp = mpa
245 ibase =
min( itop+mba, n )
246 itop =
min(
max( 0, itop ), n )
247
248 20 CONTINUE
249 IF( jj.LE.( jja+n-1 ) ) THEN
250 height = ibase - itop
251 CALL dlaset( 'All', mp, itop-jj+jja, alpha, alpha,
252 $ a( ii+(jj-1)*lda ), lda )
253 CALL dlaset( uplo, mp, height, alpha, beta,
254 $ a( ii+(jja+itop-1)*lda ), lda )
255 mp =
max( 0, mp - height )
256 ii = ii + height
257 jj = jja + ibase
258 mydist = mydist + nprow
259 itop = mydist * mba - iroffa
260 ibase =
min( itop + mba, n )
261 itop =
min( itop, n )
262 GO TO 20
263 END IF
264
265 ELSE
266
267 ii = iia
268 jj = jja
269 mp = mpa
270 ibase =
min( itop+mba, n )
271 itop =
min(
max( 0, itop ), n )
272
273 30 CONTINUE
274 IF( jj.LE.( jja+n-1 ) ) THEN
275 height = ibase - itop
276 CALL dlaset( 'All', mpa, itop-jj+jja, alpha, alpha,
277 $ a( iia+(jj-1)*lda ), lda )
278 CALL dlaset( 'All', mpa-mp, height, alpha, alpha,
279 $ a( iia+(jja+itop-1)*lda ), lda )
280 CALL dlaset( 'All', mp, height, alpha, beta,
281 $ a( ii+(jja+itop-1)*lda ), lda )
282 mp =
max( 0, mp - height )
283 ii = ii + height
284 jj = jja + ibase
285 mydist = mydist + nprow
286 itop = mydist * mba - iroffa
287 ibase =
min( itop + mba, n )
288 itop =
min( itop, n )
289 GO TO 30
290 END IF
291
292 END IF
293
294 END IF
295
296 ELSE IF( m.LE.( mba-iroffa ) ) THEN
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321 IF( myrow.EQ.iarow ) THEN
322
323 nqa =
numroc( n+icoffa, nba, mycol, iacol, npcol )
324 IF( nqa.LE.0 )
325 $ RETURN
326 IF( mycol.EQ.iacol )
327 $ nqa = nqa - icoffa
328 mydist = mod( mycol-iacol+npcol, npcol )
329 ileft = mydist * nba - icoffa
330
331 IF(
lsame( uplo,
'L' ) )
THEN
332
333 ileft =
max( 0, ileft )
334 jjbeg = jja
335 jjend = jja + nqa - 1
336 jjnxt =
min(
iceil( jjbeg, nba ) * nba, jjend )
337
338 40 CONTINUE
339 IF( ( m-ileft ).GT.0 ) THEN
340 CALL dlaset( uplo, m-ileft, jjnxt-jjbeg+1, alpha,
341 $ beta, a( iia+ileft+(jjbeg-1)*lda ), lda )
342 mydist = mydist + npcol
343 ileft = mydist * nba - icoffa
344 jjbeg = jjnxt +1
345 jjnxt =
min( jjnxt+nba, jjend )
346 GO TO 40
347 END IF
348
349 ELSE IF(
lsame( uplo,
'U' ) )
THEN
350
351 ii = iia
352 jj = jja
353 nq = nqa
354 iright =
min( ileft+nba, m )
355 ileft =
min(
max( 0, ileft ), m )
356
357 50 CONTINUE
358 IF( ii.LE.( iia+m-1 ) ) THEN
359 wide = iright - ileft
360 CALL dlaset( 'All', ileft-ii+iia, nq, alpha, alpha,
361 $ a( ii+(jj-1)*lda ), lda )
362 CALL dlaset( uplo, wide, nq, alpha, beta,
363 $ a( iia+ileft+(jj-1)*lda ), lda )
364 nq =
max( 0, nq - wide )
365 ii = iia + iright
366 jj = jj + wide
367 mydist = mydist + npcol
368 ileft = mydist * nba - icoffa
369 iright =
min( ileft + nba, m )
370 ileft =
min( ileft, m )
371 GO TO 50
372 END IF
373
374 ELSE
375
376 ii = iia
377 jj = jja
378 nq = nqa
379 iright =
min( ileft+nba, m )
380 ileft =
min(
max( 0, ileft ), m )
381
382 60 CONTINUE
383 IF( ii.LE.( iia+m-1 ) ) THEN
384 wide = iright - ileft
385 CALL dlaset( 'All', ileft-ii+iia, nqa, alpha, alpha,
386 $ a( ii+(jja-1)*lda ), lda )
387 CALL dlaset( 'All', wide, nqa-nq, alpha, alpha,
388 $ a( iia+ileft+(jja-1)*lda ), lda )
389 CALL dlaset( 'All', wide, nq, alpha, beta,
390 $ a( iia+ileft+(jj-1)*lda ), lda )
391 nq =
max( 0, nq - wide )
392 ii = iia + iright
393 jj = jj + wide
394 mydist = mydist + npcol
395 ileft = mydist * nba - icoffa
396 iright =
min( ileft + nba, m )
397 ileft =
min( ileft, m )
398 GO TO 60
399 END IF
400
401 END IF
402
403 END IF
404
405 END IF
406
407 RETURN
408
409
410
integer function iceil(inum, idenom)
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
integer function numroc(n, nb, iproc, isrcproc, nprocs)