3
4
5
6
7
8
9 CHARACTER UPLO
10 INTEGER IA, IB, JA, JB, M, N
11
12
13 INTEGER DESCA( * ), DESCB( * )
14 REAL A( * ), B( * )
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
144 $ LLD_, MB_, M_, NB_, N_, RSRC_
145 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
146 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
147 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
148
149
150 INTEGER HEIGHT, IACOL, IAROW, IBASE, IBCOL, IBROW,
151 $ ICOFFA, IIA, IIAA, IIB, IIBB, IIBEGA, IIBEGB,
152 $ IIENDA, IINXTA, IINXTB, ILEFT, IRIGHT, IROFFA,
153 $ ITOP, JJA, JJAA, JJB, JJBB, JJBEGA, JJBEGB,
154 $ JJENDA, JJNXTA, JJNXTB, LDA, LDB, MBA, MP,
155 $ MPAA, MYCOL, MYDIST, MYROW, NBA, NPCOL, NPROW,
156 $ NQ, NQAA, WIDE
157
158
159 EXTERNAL blacs_gridinfo,
infog2l, slamov
160
161
162 LOGICAL LSAME
163 INTEGER ICEIL, NUMROC
165
166
168
169
170
171 IF( m.EQ.0 .OR. n.EQ.0 )
172 $ RETURN
173
174
175
176 CALL blacs_gridinfo( desca( ctxt_ ), nprow, npcol, myrow, mycol )
177
178 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, iia, jja,
179 $ iarow, iacol )
180 CALL infog2l( ib, jb, descb, nprow, npcol, myrow, mycol, iib, jjb,
181 $ ibrow, ibcol )
182
183 mba = desca( mb_ )
184 nba = desca( nb_ )
185 lda = desca( lld_ )
186 iroffa = mod( ia-1, mba )
187 icoffa = mod( ja-1, nba )
188 ldb = descb( lld_ )
189
190 IF( n.LE.( nba-icoffa ) ) THEN
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228 IF( mycol.EQ.iacol ) THEN
229
230 mp =
numroc( m+iroffa, mba, myrow, iarow, nprow )
231 IF( mp.LE.0 )
232 $ RETURN
233 IF( myrow.EQ.iarow )
234 $ mp = mp - iroffa
235 mydist = mod( myrow-iarow+nprow, nprow )
236 itop = mydist * mba - iroffa
237
238 IF(
lsame( uplo,
'U' ) )
THEN
239
240 itop =
max( 0, itop )
241 iibega = iia
242 iienda = iia + mp - 1
243 iinxta =
min(
iceil( iibega, mba ) * mba, iienda )
244 iibegb = iib
245 iinxtb = iibegb + iinxta - iibega
246
247 10 CONTINUE
248 IF( ( n-itop ).GT.0 ) THEN
249 CALL slamov( uplo, iinxta-iibega+1, n-itop,
250 $ a( iibega+(jja+itop-1)*lda ), lda,
251 $ b( iibegb+(jjb+itop-1)*ldb ), ldb )
252 mydist = mydist + nprow
253 itop = mydist * mba - iroffa
254 iibega = iinxta + 1
255 iinxta =
min( iinxta+mba, iienda )
256 iibegb = iinxtb + 1
257 iinxtb = iibegb + iinxta - iibega
258 GO TO 10
259 END IF
260
261 ELSE IF(
lsame( uplo,
'L' ) )
THEN
262
263 mpaa = mp
264 iiaa = iia
265 jjaa = jja
266 iibb = iib
267 jjbb = jjb
268 ibase =
min( itop + mba, n )
269 itop =
min(
max( 0, itop ), n )
270
271 20 CONTINUE
272 IF( jjaa.LE.( jja+n-1 ) ) THEN
273 height = ibase - itop
274 CALL slamov( 'All', mpaa, itop-jjaa+jja,
275 $ a( iiaa+(jjaa-1)*lda ), lda,
276 $ b( iibb+(jjbb-1)*ldb ), ldb )
277 CALL slamov( uplo, mpaa, height,
278 $ a( iiaa+(jja+itop-1)*lda ), lda,
279 $ b( iibb+(jjb+itop-1)*ldb ), ldb )
280 mpaa =
max( 0, mpaa - height )
281 iiaa = iiaa + height
282 jjaa = jja + ibase
283 iibb = iibb + height
284 jjbb = jjb + ibase
285 mydist = mydist + nprow
286 itop = mydist * mba - iroffa
287 ibase =
min( itop + mba, n )
288 itop =
min( itop, n )
289 GO TO 20
290 END IF
291
292 ELSE
293
294 CALL slamov( 'All', mp, n, a( iia+(jja-1)*lda ),
295 $ lda, b( iib+(jjb-1)*ldb ), ldb )
296
297 END IF
298
299 END IF
300
301 ELSE IF( m.LE.( mba-iroffa ) ) THEN
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326 IF( myrow.EQ.iarow ) THEN
327
328 nq =
numroc( n+icoffa, nba, mycol, iacol, npcol )
329 IF( nq.LE.0 )
330 $ RETURN
331 IF( mycol.EQ.iacol )
332 $ nq = nq - icoffa
333 mydist = mod( mycol-iacol+npcol, npcol )
334 ileft = mydist * nba - icoffa
335
336 IF(
lsame( uplo,
'L' ) )
THEN
337
338 ileft =
max( 0, ileft )
339 jjbega = jja
340 jjenda = jja + nq - 1
341 jjnxta =
min(
iceil( jjbega, nba ) * nba, jjenda )
342 jjbegb = jjb
343 jjnxtb = jjbegb + jjnxta - jjbega
344
345 30 CONTINUE
346 IF( ( m-ileft ).GT.0 ) THEN
347 CALL slamov( uplo, m-ileft, jjnxta-jjbega+1,
348 $ a( iia+ileft+(jjbega-1)*lda ), lda,
349 $ b( iib+ileft+(jjbegb-1)*ldb ), ldb )
350 mydist = mydist + npcol
351 ileft = mydist * nba - icoffa
352 jjbega = jjnxta +1
353 jjnxta =
min( jjnxta+nba, jjenda )
354 jjbegb = jjnxtb +1
355 jjnxtb = jjbegb + jjnxta - jjbega
356 GO TO 30
357 END IF
358
359 ELSE IF(
lsame( uplo,
'U' ) )
THEN
360
361 nqaa = nq
362 iiaa = iia
363 jjaa = jja
364 iibb = iib
365 jjbb = jjb
366 iright =
min( ileft + nba, m )
367 ileft =
min(
max( 0, ileft ), m )
368
369 40 CONTINUE
370 IF( iiaa.LE.( iia+m-1 ) ) THEN
371 wide = iright - ileft
372 CALL slamov( 'All', ileft-iiaa+iia, nqaa,
373 $ a( iiaa+(jjaa-1)*lda ), lda,
374 $ b( iibb+(jjbb-1)*ldb ), ldb )
375 CALL slamov( uplo, wide, nqaa,
376 $ a( iia+ileft+(jjaa-1)*lda ), lda,
377 $ b( iib+ileft+(jjbb-1)*ldb ), ldb )
378 nqaa =
max( 0, nqaa - wide )
379 iiaa = iia + iright
380 jjaa = jjaa + wide
381 iibb = iib + iright
382 jjbb = jjbb + wide
383 mydist = mydist + npcol
384 ileft = mydist * nba - icoffa
385 iright =
min( ileft + nba, m )
386 ileft =
min( ileft, m )
387 GO TO 40
388 END IF
389
390 ELSE
391
392 CALL slamov( 'All', m, nq, a( iia+(jja-1)*lda ),
393 $ lda, b( iib+(jjb-1)*ldb ), ldb )
394
395 END IF
396
397 END IF
398
399 END IF
400
401 RETURN
402
403
404
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)