3
4
5
6
7
8
9
10 INTEGER CDEST, CSRC, ICTXT, LDVD, LDVS, M, N, NB,
11 $ RDEST, RSRC
12
13
14 INTEGER VD( LDVD, * ), VS( LDVS, * ), 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 INTEGER CBLKSKIP, ICPY, ICDEST, II, IRSRC, ISTART, JB,
98 $ JJ, K, LCM, MP, MQ, MYCOL, MYDIST, MYROW,
99 $ NBLOCKS, NPCOL, NPROW, RBLKSKIP
100
101
102 EXTERNAL blacs_gridinfo, igesd2d, igerv2d,
ilacpy
103
104
105 INTEGER ILCM, NUMROC
107
108
109
110
111
112 icpy = 0
113
114
115
116 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
117
118
119
120
121 IF( nprow.NE.npcol ) THEN
122 lcm =
ilcm( nprow, npcol )
123 rblkskip = lcm / npcol
124 cblkskip = lcm / nprow
125
126
127
128 IF( mycol.EQ.csrc ) THEN
129
130 istart = 1
131
132
133
134
135 mydist = mod( nprow+myrow-rsrc, nprow )
136 mp =
numroc( m, nb, myrow, rsrc, nprow )
137 icdest = mod( cdest+mydist, npcol )
138
139
140
141 DO 20 k = 1, cblkskip
142 jj = 1
143
144
145
146 IF( (mycol.NE.icdest).OR.(myrow.NE.rdest) ) THEN
147
148
149
150 DO 10 ii = istart, mp, nb*cblkskip
151 jb =
min(nb, mp-ii+1)
152 CALL ilacpy(
'G', jb, n, vs(ii,1), ldvs,
153 $ work(jj), jb )
154 jj = jj + nb*n
155 10 CONTINUE
156
157
158
159
160 jj = jj - 1
161 IF( jj.GT.0 )
162 $ CALL igesd2d( ictxt, jj, 1, work, jj, rdest,
163 $ icdest )
164
165 ELSE
166
167
168
169
170 icpy = istart
171 END IF
172
173 istart = istart + nb
174 icdest = mod(icdest+nprow, npcol)
175 20 CONTINUE
176 END IF
177
178
179
180 IF( myrow.EQ.rdest ) THEN
181
182 istart = 1
183
184
185
186
187 mydist = mod( npcol+mycol-cdest, npcol )
188 mq =
numroc( m, nb, mycol, cdest, npcol )
189 irsrc = mod( rsrc+mydist, nprow )
190 DO 50 k = 1, rblkskip
191
192
193
194 IF( (mycol.NE.csrc).OR.(myrow.NE.irsrc) ) THEN
195
196
197
198
199 nblocks = (mq - istart + nb) / nb
200 jj = ((nblocks+rblkskip-1) / rblkskip)*nb
201 IF( jj.GT.0 )
202 $ CALL igerv2d( ictxt, jj, n, work, jj, irsrc, csrc )
203
204
205
206 jj = 1
207 DO 30 ii = istart, mq, nb*rblkskip
208 jb =
min( nb, mq-ii+1 )
209 CALL ilacpy(
'G', jb, n, work(jj), jb,
210 $ vd(ii,1), ldvd )
211 jj = jj + nb*n
212 30 CONTINUE
213
214
215
216 ELSE
217 jj = icpy
218 DO 40 ii = istart, mq, nb*rblkskip
219 jb =
min( nb, mq-ii+1 )
220 CALL ilacpy(
'G', jb, n, vs(jj,1), ldvs,
221 $ vd(ii,1), ldvd )
222 jj = jj + nb*cblkskip
223 40 CONTINUE
224 END IF
225 istart = istart + nb
226 irsrc = mod( irsrc+npcol, nprow )
227 50 CONTINUE
228 END IF
229
230
231
232
233 ELSE
234
235 IF( mycol.EQ.csrc ) THEN
236
237
238
239
240 mydist = mod( nprow+myrow-rsrc, nprow )
241 mp =
numroc( m, nb, myrow, rsrc, nprow )
242 icdest = mod( cdest+mydist, npcol )
243
244 IF( (mycol.NE.icdest).OR.(myrow.NE.rdest) ) THEN
245 CALL igesd2d( ictxt, mp, n, vs, ldvs, rdest, icdest )
246 ELSE
247 CALL ilacpy(
'G', mp, n, vs, ldvs, vd, ldvd )
248 END IF
249 END IF
250
251 IF( myrow.EQ.rdest ) THEN
252
253
254
255
256 mydist = mod( npcol+mycol-cdest, npcol )
257 mq =
numroc( m, nb, mycol, cdest, npcol )
258 irsrc = mod( rsrc+mydist, nprow )
259
260 IF( (myrow.NE.irsrc).OR.(mycol.NE.csrc) )
261 $ CALL igerv2d( ictxt, mq, n, vd, ldvd, irsrc, csrc )
262
263 END IF
264
265 END IF
266
267 RETURN
268
269
270
subroutine ilacpy(uplo, m, n, a, lda, b, ldb)
integer function ilcm(m, n)
integer function numroc(n, nb, iproc, isrcproc, nprocs)