5
6
7
8
9
10
11
12 INTEGER IZ, JZ, LDZI, LWORK, N
13
14
15 INTEGER DESCZ( * ), KEY( * ), NVS( * )
16 DOUBLE PRECISION WORK( * ), Z( * ), ZIN( LDZI, * )
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, DLEN_, DTYPE_, CTXT_, M_, N_,
134 $ MB_, NB_, RSRC_, CSRC_, LLD_
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 CYCLIC_I, CYCLIC_J, DIST, I, IAM, II, INCII, J,
141 $ MAXI, MAXII, MINI, MINII, MYCOL, MYROW, NB,
142 $ NBUFSIZE, NPCOL, NPROCS, NPROW, PCOL, RECVCOL,
143 $ RECVFROM, RECVROW, SENDCOL, SENDROW, SENDTO
144
145
146 INTEGER INDXG2L, INDXG2P
148
149
150 EXTERNAL blacs_gridinfo, dgerv2d, dgesd2d
151
152
154
155
156
157 IF( block_cyclic_2d*csrc_*ctxt_*dlen_*dtype_*lld_*mb_*m_*nb_*n_*
158 $ rsrc_.LT.0 )RETURN
159 CALL blacs_gridinfo( descz( ctxt_ ), nprow, npcol, myrow, mycol )
160 iam = myrow + mycol*nprow
161 iam = myrow*npcol + mycol
162
163 nb = descz( mb_ )
164
165 nprocs = nprow*npcol
166
167
168
169
170
171
172
173
174 DO 10 j = descz( n_ ), 1, -1
175 key( j ) = key( j-jz+1 ) + ( jz-1 )
176 10 CONTINUE
177
178 DO 110 dist = 0, nprocs - 1
179
180 sendto = mod( iam+dist, nprocs )
181 recvfrom = mod( nprocs+iam-dist, nprocs )
182
183 sendrow = mod( sendto, nprow )
184 sendcol = sendto / nprow
185 recvrow = mod( recvfrom, nprow )
186 recvcol = recvfrom / nprow
187
188 sendrow = sendto / npcol
189 sendcol = mod( sendto, npcol )
190 recvrow = recvfrom / npcol
191 recvcol = mod( recvfrom, npcol )
192
193
194
195 nbufsize = 0
196
197
198
199 DO 40 j = nvs( 1+iam ) + jz, nvs( 1+iam+1 ) + jz - 1
200 pcol =
indxg2p( key( j ), descz( nb_ ), -1, descz( csrc_ ),
201 $ npcol )
202 IF( sendcol.EQ.pcol ) THEN
203 minii = mod( sendrow+descz( rsrc_ ), nprow )*
204 $ descz( mb_ ) + 1
205 maxii = descz( m_ )
206 incii = descz( mb_ )*nprow
207 DO 30 ii = minii, maxii, incii
209 maxi =
min( ii+descz( mb_ )-1, n+iz-1 )
210 DO 20 i = mini, maxi, 1
211 nbufsize = nbufsize + 1
212 work( nbufsize ) = zin( i+1-iz,
213 $ j-nvs( 1+iam )+1-jz )
214 20 CONTINUE
215 30 CONTINUE
216 END IF
217 40 CONTINUE
218
219
220 IF( myrow.NE.sendrow .OR. mycol.NE.sendcol )
221 $ CALL dgesd2d( descz( ctxt_ ), nbufsize, 1, work, nbufsize,
222 $ sendrow, sendcol )
223
224
225
226
227 nbufsize = 0
228 DO 70 j = nvs( 1+recvfrom ) + jz,
229 $ nvs( 1+recvfrom+1 ) + jz - 1, 1
230 pcol =
indxg2p( key( j ), descz( nb_ ), -1, descz( csrc_ ),
231 $ npcol )
232 IF( mycol.EQ.pcol ) THEN
233 minii = mod( myrow+descz( rsrc_ ), nprow )*descz( mb_ ) +
234 $ 1
235 maxii = descz( m_ )
236 incii = descz( mb_ )*nprow
237 DO 60 ii = minii, maxii, incii
239 maxi =
min( ii+nb-1, n+iz-1 )
240 DO 50 i = mini, maxi, 1
241 nbufsize = nbufsize + 1
242 50 CONTINUE
243 60 CONTINUE
244 END IF
245 70 CONTINUE
246
247
248
249 IF( myrow.NE.recvrow .OR. mycol.NE.recvcol )
250 $ CALL dgerv2d( descz( ctxt_ ), 1, nbufsize, work, 1, recvrow,
251 $ recvcol )
252
253 nbufsize = 0
254 DO 100 j = nvs( 1+recvfrom ) + jz,
255 $ nvs( 1+recvfrom+1 ) + jz - 1, 1
256 pcol =
indxg2p( key( j ), descz( nb_ ), -1, descz( csrc_ ),
257 $ npcol )
258 IF( mycol.EQ.pcol ) THEN
259 cyclic_j =
indxg2l( key( j ), descz( mb_ ), -1, -1,
260 $ npcol )
261 cyclic_i = 1
262 minii = mod( myrow+descz( rsrc_ ), nprow )*descz( mb_ ) +
263 $ 1
264 maxii = descz( m_ )
265 incii = descz( mb_ )*nprow
266 DO 90 ii = minii, maxii, incii
268 cyclic_i =
indxg2l( mini, descz( mb_ ), -1, -1,
269 $ nprow )
270 maxi =
min( ii+nb-1, n+iz-1 )
271 DO 80 i = mini, maxi, 1
272 nbufsize = nbufsize + 1
273 z( cyclic_i+( cyclic_j-1 )*descz( lld_ ) )
274 $ = work( nbufsize )
275 cyclic_i = cyclic_i + 1
276 80 CONTINUE
277 90 CONTINUE
278 END IF
279 100 CONTINUE
280
281 110 CONTINUE
282 RETURN
283
284
285
integer function indxg2l(indxglob, nb, iproc, isrcproc, nprocs)
integer function indxg2p(indxglob, nb, iproc, isrcproc, nprocs)