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