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