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 COMPLEX 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 $ cgerv2d, cgesd2d
138
139
140 INTEGER ICEIL
142
143
144 INTRINSIC aimag,
min, real
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,
173 $ real( a(ii+k+(jj+h-1)*lda) ),
174 $ aimag( a(ii+k+(jj+h-1)*lda) )
175 10 CONTINUE
176 END IF
177 ELSE
178 IF( myrow.EQ.icurrow .AND. mycol.EQ.icurcol ) THEN
179 CALL cgesd2d( ictxt, ib, 1, a( ii+(jj+h-1)*lda ), lda,
180 $ irprnt, icprnt )
181 ELSE IF( myrow.EQ.irprnt .AND. mycol.EQ.icprnt ) THEN
182 CALL cgerv2d( ictxt, ib, 1, work, desca( mb_ ),
183 $ icurrow, icurcol )
184 DO 20 k = 1, ib
185 WRITE( nout, fmt = 9999 )
186 $ cmatnm, ia+k-1, ja+h, real( work( k ) ),
187 $ aimag( work( k ) )
188 20 CONTINUE
189 END IF
190 END IF
191 IF( myrow.EQ.icurrow )
192 $ ii = ii + ib
193 icurrow = mod( icurrow+1, nprow )
194 CALL blacs_barrier( ictxt, 'All' )
195
196
197
198 DO 50 i = in+1, ia+m-1, desca( mb_ )
199 ib =
min( desca( mb_ ), ia+m-i )
200 IF( icurrow.EQ.irprnt .AND. icurcol.EQ.icprnt ) THEN
201 IF( myrow.EQ.irprnt .AND. mycol.EQ.icprnt ) THEN
202 DO 30 k = 0, ib-1
203 WRITE( nout, fmt = 9999 )
204 $ cmatnm, i+k, ja+h,
205 $ real( a( ii+k+(jj+h-1)*lda ) ),
206 $ aimag( a( ii+k+(jj+h-1)*lda ) )
207 30 CONTINUE
208 END IF
209 ELSE
210 IF( myrow.EQ.icurrow .AND. mycol.EQ.icurcol ) THEN
211 CALL cgesd2d( ictxt, ib, 1, a( ii+(jj+h-1)*lda ),
212 $ lda, irprnt, icprnt )
213 ELSE IF( myrow.EQ.irprnt .AND. mycol.EQ.icprnt ) THEN
214 CALL cgerv2d( ictxt, ib, 1, work, desca( mb_ ),
215 $ icurrow, icurcol )
216 DO 40 k = 1, ib
217 WRITE( nout, fmt = 9999 )
218 $ cmatnm, i+k-1, ja+h, real( work( k ) ),
219 $ aimag( work( k ) )
220 40 CONTINUE
221 END IF
222 END IF
223 IF( myrow.EQ.icurrow )
224 $ ii = ii + ib
225 icurrow = mod( icurrow+1, nprow )
226 CALL blacs_barrier( ictxt, 'All' )
227 50 CONTINUE
228
229 ii = iia
230 icurrow = iarow
231 60 CONTINUE
232
233 IF( mycol.EQ.icurcol )
234 $ jj = jj + jb
235 icurcol = mod( icurcol+1, npcol )
236 CALL blacs_barrier( ictxt, 'All' )
237
238
239
240 DO 130 j = jn+1, ja+n-1, desca( nb_ )
241 jb =
min( desca( nb_ ), ja+n-j )
242 DO 120 h = 0, jb-1
243 in =
min(
iceil( ia, desca( mb_ ) ) * desca( mb_ ), ia+m-1 )
244 ib = in-ia+1
245 IF( icurrow.EQ.irprnt .AND. icurcol.EQ.icprnt ) THEN
246 IF( myrow.EQ.irprnt .AND. mycol.EQ.icprnt ) THEN
247 DO 70 k = 0, ib-1
248 WRITE( nout, fmt = 9999 )
249 $ cmatnm, ia+k, j+h,
250 $ real( a( ii+k+(jj+h-1)*lda ) ),
251 $ aimag( a( ii+k+(jj+h-1)*lda ) )
252 70 CONTINUE
253 END IF
254 ELSE
255 IF( myrow.EQ.icurrow .AND. mycol.EQ.icurcol ) THEN
256 CALL cgesd2d( ictxt, ib, 1, a( ii+(jj+h-1)*lda ),
257 $ lda, irprnt, icprnt )
258 ELSE IF( myrow.EQ.irprnt .AND. mycol.EQ.icprnt ) THEN
259 CALL cgerv2d( ictxt, ib, 1, work, desca( mb_ ),
260 $ icurrow, icurcol )
261 DO 80 k = 1, ib
262 WRITE( nout, fmt = 9999 )
263 $ cmatnm, ia+k-1, j+h, real( work( k ) ),
264 $ aimag( work( k ) )
265 80 CONTINUE
266 END IF
267 END IF
268 IF( myrow.EQ.icurrow )
269 $ ii = ii + ib
270 icurrow = mod( icurrow+1, nprow )
271 CALL blacs_barrier( ictxt, 'All' )
272
273
274
275 DO 110 i = in+1, ia+m-1, desca( mb_ )
276 ib =
min( desca( mb_ ), ia+m-i )
277 IF( icurrow.EQ.irprnt .AND. icurcol.EQ.icprnt ) THEN
278 IF( myrow.EQ.irprnt .AND. mycol.EQ.icprnt ) THEN
279 DO 90 k = 0, ib-1
280 WRITE( nout, fmt = 9999 )
281 $ cmatnm, i+k, j+h,
282 $ real( a( ii+k+(jj+h-1)*lda ) ),
283 $ aimag( a( ii+k+(jj+h-1)*lda ) )
284 90 CONTINUE
285 END IF
286 ELSE
287 IF( myrow.EQ.icurrow .AND. mycol.EQ.icurcol ) THEN
288 CALL cgesd2d( ictxt, ib, 1, a( ii+(jj+h-1)*lda ),
289 $ lda, irprnt, icprnt )
290 ELSE IF( myrow.EQ.irprnt .AND. mycol.EQ.icprnt ) THEN
291 CALL cgerv2d( ictxt, ib, 1, work, desca( mb_ ),
292 $ icurrow, icurcol )
293 DO 100 k = 1, ib
294 WRITE( nout, fmt = 9999 )
295 $ cmatnm, i+k-1, j+h, real( work( k ) ),
296 $ aimag( work( k ) )
297 100 CONTINUE
298 END IF
299 END IF
300 IF( myrow.EQ.icurrow )
301 $ ii = ii + ib
302 icurrow = mod( icurrow+1, nprow )
303 CALL blacs_barrier( ictxt, 'All' )
304 110 CONTINUE
305
306 ii = iia
307 icurrow = iarow
308 120 CONTINUE
309
310 IF( mycol.EQ.icurcol )
311 $ jj = jj + jb
312 icurcol = mod( icurcol+1, npcol )
313 CALL blacs_barrier( ictxt, 'All' )
314
315 130 CONTINUE
316
317 9999 FORMAT(a,'(',i6,',',i6,')=',e16.8, '+i*(',e16.8, ')')
318
319 RETURN
320
321
322
integer function iceil(inum, idenom)
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)