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