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