2
3
4
5
6
7
8
9 INTEGER I, II, JJ, LDB, M, REV
10
11
12 INTEGER DESCA( * )
13 COMPLEX*16 A( * ), B( LDB, * )
14
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
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
135
136
137
138 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
139 $ LLD_, MB_, M_, NB_, N_, RSRC_
140 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
141 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
142 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
143 COMPLEX*16 ZERO
144 parameter( zero = ( 0.0d+0, 0.0d+0 ) )
145
146
147 INTEGER COL, CONTXT, HBL, ICOL1, ICOL2, IDI, IDJ, IFIN,
148 $ III, IROW1, IROW2, ISTOP, ISTOPI, ISTOPJ, ITMP,
149 $ JJJ, LDA, MYCOL, MYROW, NPCOL, NPROW, ROW
150
151
152 INTEGER NUMROC
154
155
156 EXTERNAL blacs_gridinfo,
infog1l, zgebr2d, zgebs2d,
157 $ zgerv2d, zgesd2d
158
159
161
162
163
164 IF( m.LE.0 )
165 $ RETURN
166
167 hbl = desca( mb_ )
168 contxt = desca( ctxt_ )
169 lda = desca( lld_ )
170
171 CALL blacs_gridinfo( contxt, nprow, npcol, myrow, mycol )
172
173 IF( rev.EQ.0 ) THEN
174 DO 20 idi = 1, m
175 DO 10 idj = 1, m
176 b( idi, idj ) = zero
177 10 CONTINUE
178 20 CONTINUE
179 END IF
180
181 ifin = i + m - 1
182
183 IF( mod( i+hbl, hbl ).NE.0 ) THEN
184 istop =
min( i+hbl-mod( i+hbl, hbl ), ifin )
185 ELSE
186 istop = i
187 END IF
188 idj = i
189 istopj = istop
190 IF( idj.LE.ifin ) THEN
191 30 CONTINUE
192 idi = i
193 istopi = istop
194 IF( idi.LE.ifin ) THEN
195 40 CONTINUE
196 row = mod( ( idi-1 ) / hbl, nprow )
197 col = mod( ( idj-1 ) / hbl, npcol )
198 CALL infog1l( idi, hbl, nprow, row, 0, irow1, itmp )
199 irow2 =
numroc( istopi, hbl, row, 0, nprow )
200 CALL infog1l( idj, hbl, npcol, col, 0, icol1, itmp )
201 icol2 =
numroc( istopj, hbl, col, 0, npcol )
202 IF( ( myrow.EQ.row ) .AND. ( mycol.EQ.col ) ) THEN
203 IF( ( ii.EQ.-1 ) .AND. ( jj.EQ.-1 ) ) THEN
204
205
206
207 IF( rev.EQ.0 ) THEN
208 CALL zgebs2d( contxt, 'All', ' ', irow2-irow1+1,
209 $ icol2-icol1+1, a( ( icol1-1 )*lda+
210 $ irow1 ), lda )
211 END IF
212 END IF
213 IF( ( ii.EQ.-1 ) .AND. ( jj.NE.-1 ) ) THEN
214
215
216
217 IF( rev.EQ.0 ) THEN
218 CALL zgebs2d( contxt, 'Col', ' ', irow2-irow1+1,
219 $ icol2-icol1+1, a( ( icol1-1 )*lda+
220 $ irow1 ), lda )
221 END IF
222 END IF
223 IF( ( ii.NE.-1 ) .AND. ( jj.EQ.-1 ) ) THEN
224
225
226
227 IF( rev.EQ.0 ) THEN
228 CALL zgebs2d( contxt, 'Row', ' ', irow2-irow1+1,
229 $ icol2-icol1+1, a( ( icol1-1 )*lda+
230 $ irow1 ), lda )
231 END IF
232 END IF
233 IF( ( ii.NE.-1 ) .AND. ( jj.NE.-1 ) .AND.
234 $ ( ( myrow.NE.ii ) .OR. ( mycol.NE.jj ) ) ) THEN
235
236
237
238 IF( rev.EQ.0 ) THEN
239 CALL zgesd2d( contxt, irow2-irow1+1, icol2-icol1+1,
240 $ a( ( icol1-1 )*lda+irow1 ), lda, ii,
241 $ jj )
242 ELSE
243 CALL zgerv2d( contxt, irow2-irow1+1, icol2-icol1+1,
244 $ b( idi-i+1, idj-i+1 ), ldb, ii, jj )
245 END IF
246 END IF
247 IF( rev.EQ.0 ) THEN
248 DO 60 jjj = icol1, icol2
249 DO 50 iii = irow1, irow2
250 b( idi+iii-irow1+1-i, idj+jjj-icol1+1-i )
251 $ = a( ( jjj-1 )*lda+iii )
252 50 CONTINUE
253 60 CONTINUE
254 ELSE
255 DO 80 jjj = icol1, icol2
256 DO 70 iii = irow1, irow2
257 a( ( jjj-1 )*lda+iii ) = b( idi+iii-irow1+1-i,
258 $ idj+jjj-icol1+1-i )
259 70 CONTINUE
260 80 CONTINUE
261 END IF
262 ELSE
263 IF( ( ii.EQ.-1 ) .AND. ( jj.EQ.-1 ) ) THEN
264 IF( rev.EQ.0 ) THEN
265 CALL zgebr2d( contxt, 'All', ' ', irow2-irow1+1,
266 $ icol2-icol1+1, b( idi-i+1, idj-i+1 ),
267 $ ldb, row, col )
268 END IF
269 END IF
270 IF( ( ii.EQ.-1 ) .AND. ( jj.EQ.mycol ) ) THEN
271 IF( rev.EQ.0 ) THEN
272 CALL zgebr2d( contxt, 'Col', ' ', irow2-irow1+1,
273 $ icol2-icol1+1, b( idi-i+1, idj-i+1 ),
274 $ ldb, row, col )
275 END IF
276 END IF
277 IF( ( ii.EQ.myrow ) .AND. ( jj.EQ.-1 ) ) THEN
278 IF( rev.EQ.0 ) THEN
279 CALL zgebr2d( contxt, 'Row', ' ', irow2-irow1+1,
280 $ icol2-icol1+1, b( idi-i+1, idj-i+1 ),
281 $ ldb, row, col )
282 END IF
283 END IF
284 IF( ( ii.EQ.myrow ) .AND. ( jj.EQ.mycol ) ) THEN
285 IF( rev.EQ.0 ) THEN
286 CALL zgerv2d( contxt, irow2-irow1+1, icol2-icol1+1,
287 $ b( idi-i+1, idj-i+1 ), ldb, row,
288 $ col )
289 ELSE
290 CALL zgesd2d( contxt, irow2-irow1+1, icol2-icol1+1,
291 $ b( idi-i+1, idj-i+1 ), ldb, row,
292 $ col )
293
294
295 END IF
296 END IF
297 END IF
298 idi = istopi + 1
299 istopi =
min( istopi+hbl, ifin )
300 IF( idi.LE.ifin )
301 $ GO TO 40
302 END IF
303 idj = istopj + 1
304 istopj =
min( istopj+hbl, ifin )
305 IF( idj.LE.ifin )
306 $ GO TO 30
307 END IF
308 RETURN
309
310
311
subroutine infog1l(gindx, nb, nprocs, myroc, isrcproc, lindx, rocsrc)
integer function numroc(n, nb, iproc, isrcproc, nprocs)