3
4
5
6
7
8
9
10 INTEGER IA, ICPRNT, IRPRNT, JA, M, N, NOUT
11
12
13 CHARACTER*(*) CMATNM
14 INTEGER DESCA( * )
15 DOUBLE PRECISION A( * ), WORK( * )
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 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
125 $ LLD_, MB_, M_, NB_, N_, RSRC_
126 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
127 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
128 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
129
130
131 INTEGER H, I, IACOL, IAROW, IB, ICTXT, ICURCOL,
132 $ ICURROW, II, IIA, IN, J, JB, JJ, JJA, JN, K,
133 $ LDA, MYCOL, MYROW, NPCOL, NPROW
134
135
136 EXTERNAL blacs_barrier, blacs_gridinfo,
infog2l,
137 $ dgerv2d, dgesd2d
138
139
140 INTEGER ICEIL
142
143
145
146
147
148
149
150 ictxt = desca( ctxt_ )
151 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
152
153 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol,
154 $ iia, jja, iarow, iacol )
155 icurrow = iarow
156 icurcol = iacol
157 ii = iia
158 jj = jja
159 lda = desca( lld_ )
160
161
162
163 jn =
min(
iceil( ja, desca( nb_ ) ) * desca( nb_ ), ja+n-1 )
164 jb = jn-ja+1
165 DO 60 h = 0, jb-1
166 in =
min(
iceil( ia, desca( mb_ ) ) * desca( mb_ ), ia+m-1 )
167 ib = in-ia+1
168 IF( icurrow.EQ.irprnt .AND. icurcol.EQ.icprnt ) THEN
169 IF( myrow.EQ.irprnt .AND. mycol.EQ.icprnt ) THEN
170 DO 10 k = 0, ib-1
171 WRITE( nout, fmt = 9999 )
172 $ cmatnm, ia+k, ja+h, a( ii+k+(jj+h-1)*lda )
173 10 CONTINUE
174 END IF
175 ELSE
176 IF( myrow.EQ.icurrow .AND. mycol.EQ.icurcol ) THEN
177 CALL dgesd2d( ictxt, ib, 1, a( ii+(jj+h-1)*lda ), lda,
178 $ irprnt, icprnt )
179 ELSE IF( myrow.EQ.irprnt .AND. mycol.EQ.icprnt ) THEN
180 CALL dgerv2d( ictxt, ib, 1, work, desca( mb_ ),
181 $ icurrow, icurcol )
182 DO 20 k = 1, ib
183 WRITE( nout, fmt = 9999 )
184 $ cmatnm, ia+k-1, ja+h, work( k )
185 20 CONTINUE
186 END IF
187 END IF
188 IF( myrow.EQ.icurrow )
189 $ ii = ii + ib
190 icurrow = mod( icurrow+1, nprow )
191 CALL blacs_barrier( ictxt, 'All' )
192
193
194
195 DO 50 i = in+1, ia+m-1, desca( mb_ )
196 ib =
min( desca( mb_ ), ia+m-i )
197 IF( icurrow.EQ.irprnt .AND. icurcol.EQ.icprnt ) THEN
198 IF( myrow.EQ.irprnt .AND. mycol.EQ.icprnt ) THEN
199 DO 30 k = 0, ib-1
200 WRITE( nout, fmt = 9999 )
201 $ cmatnm, i+k, ja+h, a( ii+k+(jj+h-1)*lda )
202 30 CONTINUE
203 END IF
204 ELSE
205 IF( myrow.EQ.icurrow .AND. mycol.EQ.icurcol ) THEN
206 CALL dgesd2d( ictxt, ib, 1, a( ii+(jj+h-1)*lda ),
207 $ lda, irprnt, icprnt )
208 ELSE IF( myrow.EQ.irprnt .AND. mycol.EQ.icprnt ) THEN
209 CALL dgerv2d( ictxt, ib, 1, work, desca( mb_ ),
210 $ icurrow, icurcol )
211 DO 40 k = 1, ib
212 WRITE( nout, fmt = 9999 )
213 $ cmatnm, i+k-1, ja+h, work( k )
214 40 CONTINUE
215 END IF
216 END IF
217 IF( myrow.EQ.icurrow )
218 $ ii = ii + ib
219 icurrow = mod( icurrow+1, nprow )
220 CALL blacs_barrier( ictxt, 'All' )
221 50 CONTINUE
222
223 ii = iia
224 icurrow = iarow
225 60 CONTINUE
226
227 IF( mycol.EQ.icurcol )
228 $ jj = jj + jb
229 icurcol = mod( icurcol+1, npcol )
230 CALL blacs_barrier( ictxt, 'All' )
231
232
233
234 DO 130 j = jn+1, ja+n-1, desca( nb_ )
235 jb =
min( desca( nb_ ), ja+n-j )
236 DO 120 h = 0, jb-1
237 in =
min(
iceil( ia, desca( mb_ ) ) * desca( mb_ ), ia+m-1 )
238 ib = in-ia+1
239 IF( icurrow.EQ.irprnt .AND. icurcol.EQ.icprnt ) THEN
240 IF( myrow.EQ.irprnt .AND. mycol.EQ.icprnt ) THEN
241 DO 70 k = 0, ib-1
242 WRITE( nout, fmt = 9999 )
243 $ cmatnm, ia+k, j+h, a( ii+k+(jj+h-1)*lda )
244 70 CONTINUE
245 END IF
246 ELSE
247 IF( myrow.EQ.icurrow .AND. mycol.EQ.icurcol ) THEN
248 CALL dgesd2d( ictxt, ib, 1, a( ii+(jj+h-1)*lda ),
249 $ lda, irprnt, icprnt )
250 ELSE IF( myrow.EQ.irprnt .AND. mycol.EQ.icprnt ) THEN
251 CALL dgerv2d( ictxt, ib, 1, work, desca( mb_ ),
252 $ icurrow, icurcol )
253 DO 80 k = 1, ib
254 WRITE( nout, fmt = 9999 )
255 $ cmatnm, ia+k-1, j+h, work( k )
256 80 CONTINUE
257 END IF
258 END IF
259 IF( myrow.EQ.icurrow )
260 $ ii = ii + ib
261 icurrow = mod( icurrow+1, nprow )
262 CALL blacs_barrier( ictxt, 'All' )
263
264
265
266 DO 110 i = in+1, ia+m-1, desca( mb_ )
267 ib =
min( desca( mb_ ), ia+m-i )
268 IF( icurrow.EQ.irprnt .AND. icurcol.EQ.icprnt ) THEN
269 IF( myrow.EQ.irprnt .AND. mycol.EQ.icprnt ) THEN
270 DO 90 k = 0, ib-1
271 WRITE( nout, fmt = 9999 )
272 $ cmatnm, i+k, j+h, a( ii+k+(jj+h-1)*lda )
273 90 CONTINUE
274 END IF
275 ELSE
276 IF( myrow.EQ.icurrow .AND. mycol.EQ.icurcol ) THEN
277 CALL dgesd2d( ictxt, ib, 1, a( ii+(jj+h-1)*lda ),
278 $ lda, irprnt, icprnt )
279 ELSE IF( myrow.EQ.irprnt .AND. mycol.EQ.icprnt ) THEN
280 CALL dgerv2d( ictxt, ib, 1, work, desca( mb_ ),
281 $ icurrow, icurcol )
282 DO 100 k = 1, ib
283 WRITE( nout, fmt = 9999 )
284 $ cmatnm, i+k-1, j+h, work( k )
285 100 CONTINUE
286 END IF
287 END IF
288 IF( myrow.EQ.icurrow )
289 $ ii = ii + ib
290 icurrow = mod( icurrow+1, nprow )
291 CALL blacs_barrier( ictxt, 'All' )
292 110 CONTINUE
293
294 ii = iia
295 icurrow = iarow
296 120 CONTINUE
297
298 IF( mycol.EQ.icurcol )
299 $ jj = jj + jb
300 icurcol = mod( icurcol+1, npcol )
301 CALL blacs_barrier( ictxt, 'All' )
302
303 130 CONTINUE
304
305 9999 FORMAT(a,'(',i6,',',i6,')=',d30.18)
306
307 RETURN
308
309
310
integer function iceil(inum, idenom)
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)