3
4
5
6
7
8
9
10
11
12 INTEGER IA, ICWRIT, IRWRIT, JA, M, N
13
14
15 CHARACTER*(*) FILNAM
16 INTEGER DESCA( * )
17 COMPLEX*16 A( * ), WORK( * )
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 INTEGER NOUT
33 parameter( nout = 13 )
34 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DT_,
35 $ LLD_, MB_, M_, NB_, N_, RSRC_
36 parameter( block_cyclic_2d = 1, dlen_ = 9, dt_ = 1,
37 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
38 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
39
40
41 INTEGER H, I, IACOL, IAROW, IB, ICTXT, ICURCOL,
42 $ ICURROW, II, IIA, IN, J, JB, JJ, JJA, JN, K,
43 $ LDA, MYCOL, MYROW, NPCOL, NPROW
44
45
46 EXTERNAL blacs_barrier, blacs_gridinfo,
infog2l,
47 $ zgerv2d, zgesd2d
48
49
50 INTEGER ICEIL
52
53
54 INTRINSIC dble, dimag,
min, mod
55
56
57
58
59
60 ictxt = desca( ctxt_ )
61 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
62
63 IF( myrow.EQ.irwrit .AND. mycol.EQ.icwrit ) THEN
64 OPEN( nout, file=filnam, status='UNKNOWN' )
65 WRITE( nout, fmt = * ) m, n
66 END IF
67
68 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol,
69 $ iia, jja, iarow, iacol )
70 icurrow = iarow
71 icurcol = iacol
72 ii = iia
73 jj = jja
74 lda = desca( lld_ )
75
76
77
78 jn =
min(
iceil( ja, desca( nb_ ) ) * desca( nb_ ), ja+n-1 )
79 jb = jn-ja+1
80 DO 60 h = 0, jb-1
81 in =
min(
iceil( ia, desca( mb_ ) ) * desca( mb_ ), ia+m-1 )
82 ib = in-ia+1
83 IF( icurrow.EQ.irwrit .AND. icurcol.EQ.icwrit ) THEN
84 IF( myrow.EQ.irwrit .AND. mycol.EQ.icwrit ) THEN
85 DO 10 k = 0, ib-1
86 WRITE( nout, fmt = 9999 ) a( ii+k+(jj+h-1)*lda )
87 10 CONTINUE
88 END IF
89 ELSE
90 IF( myrow.EQ.icurrow .AND. mycol.EQ.icurcol ) THEN
91 CALL zgesd2d( ictxt, ib, 1, a( ii+(jj+h-1)*lda ), lda,
92 $ irwrit, icwrit )
93 ELSE IF( myrow.EQ.irwrit .AND. mycol.EQ.icwrit ) THEN
94 CALL zgerv2d( ictxt, ib, 1, work, desca( mb_ ),
95 $ icurrow, icurcol )
96 DO 20 k = 1, ib
97 WRITE( nout, fmt = 9999 ) dble(work( k )),
98 $ dimag(work( k ))
99 20 CONTINUE
100 END IF
101 END IF
102 IF( myrow.EQ.icurrow )
103 $ ii = ii + ib
104 icurrow = mod( icurrow+1, nprow )
105 CALL blacs_barrier( ictxt, 'All' )
106
107
108
109 DO 50 i = in+1, ia+m-1, desca( mb_ )
110 ib =
min( desca( mb_ ), ia+m-i )
111 IF( icurrow.EQ.irwrit .AND. icurcol.EQ.icwrit ) THEN
112 IF( myrow.EQ.irwrit .AND. mycol.EQ.icwrit ) THEN
113 DO 30 k = 0, ib-1
114 WRITE( nout, fmt = 9999 )
115 $ dble(a( ii+k+(jj+h-1)*lda )),
116 $ dimag(a( ii+k+(jj+h-1)*lda ))
117 30 CONTINUE
118 END IF
119 ELSE
120 IF( myrow.EQ.icurrow .AND. mycol.EQ.icurcol ) THEN
121 CALL zgesd2d( ictxt, ib, 1, a( ii+(jj+h-1)*lda ),
122 $ lda, irwrit, icwrit )
123 ELSE IF( myrow.EQ.irwrit .AND. mycol.EQ.icwrit ) THEN
124 CALL zgerv2d( ictxt, ib, 1, work, desca( mb_ ),
125 $ icurrow, icurcol )
126 DO 40 k = 1, ib
127 WRITE( nout, fmt = 9999 ) dble(work( k )),
128 $ dimag(work( k ))
129 40 CONTINUE
130 END IF
131 END IF
132 IF( myrow.EQ.icurrow )
133 $ ii = ii + ib
134 icurrow = mod( icurrow+1, nprow )
135 CALL blacs_barrier( ictxt, 'All' )
136 50 CONTINUE
137
138 ii = iia
139 icurrow = iarow
140 60 CONTINUE
141
142 IF( mycol.EQ.icurcol )
143 $ jj = jj + jb
144 icurcol = mod( icurcol+1, npcol )
145 CALL blacs_barrier( ictxt, 'All' )
146
147
148
149 DO 130 j = jn+1, ja+n-1, desca( nb_ )
150 jb =
min( desca( nb_ ), ja+n-j )
151 DO 120 h = 0, jb-1
152 in =
min(
iceil( ia, desca( mb_ ) ) * desca( mb_ ), ia+m-1 )
153 ib = in-ia+1
154 IF( icurrow.EQ.irwrit .AND. icurcol.EQ.icwrit ) THEN
155 IF( myrow.EQ.irwrit .AND. mycol.EQ.icwrit ) THEN
156 DO 70 k = 0, ib-1
157 WRITE( nout, fmt = 9999 )
158 $ dble(a( ii+k+(jj+h-1)*lda )),
159 $ dimag(a( ii+k+(jj+h-1)*lda ))
160 70 CONTINUE
161 END IF
162 ELSE
163 IF( myrow.EQ.icurrow .AND. mycol.EQ.icurcol ) THEN
164 CALL zgesd2d( ictxt, ib, 1, a( ii+(jj+h-1)*lda ),
165 $ lda, irwrit, icwrit )
166 ELSE IF( myrow.EQ.irwrit .AND. mycol.EQ.icwrit ) THEN
167 CALL zgerv2d( ictxt, ib, 1, work, desca( mb_ ),
168 $ icurrow, icurcol )
169 DO 80 k = 1, ib
170 WRITE( nout, fmt = 9999 ) dble(work( k )),
171 $ dimag(work( k))
172 80 CONTINUE
173 END IF
174 END IF
175 IF( myrow.EQ.icurrow )
176 $ ii = ii + ib
177 icurrow = mod( icurrow+1, nprow )
178 CALL blacs_barrier( ictxt, 'All' )
179
180
181
182 DO 110 i = in+1, ia+m-1, desca( mb_ )
183 ib =
min( desca( mb_ ), ia+m-i )
184 IF( icurrow.EQ.irwrit .AND. icurcol.EQ.icwrit ) THEN
185 IF( myrow.EQ.irwrit .AND. mycol.EQ.icwrit ) THEN
186 DO 90 k = 0, ib-1
187 WRITE( nout, fmt = 9999 )
188 $ dble(a( ii+k+(jj+h-1)*lda )),
189 $ dimag(a( ii+k+(jj+h-1)*lda ))
190 90 CONTINUE
191 END IF
192 ELSE
193 IF( myrow.EQ.icurrow .AND. mycol.EQ.icurcol ) THEN
194 CALL zgesd2d( ictxt, ib, 1, a( ii+(jj+h-1)*lda ),
195 $ lda, irwrit, icwrit )
196 ELSE IF( myrow.EQ.irwrit .AND. mycol.EQ.icwrit ) THEN
197 CALL zgerv2d( ictxt, ib, 1, work, desca( mb_ ),
198 $ icurrow, icurcol )
199 DO 100 k = 1, ib
200 WRITE( nout, fmt = 9999 ) dble(work( k )),
201 $ dimag(work( k ))
202 100 CONTINUE
203 END IF
204 END IF
205 IF( myrow.EQ.icurrow )
206 $ ii = ii + ib
207 icurrow = mod( icurrow+1, nprow )
208 CALL blacs_barrier( ictxt, 'All' )
209 110 CONTINUE
210
211 ii = iia
212 icurrow = iarow
213 120 CONTINUE
214
215 IF( mycol.EQ.icurcol )
216 $ jj = jj + jb
217 icurcol = mod( icurcol+1, npcol )
218 CALL blacs_barrier( ictxt, 'All' )
219
220 130 CONTINUE
221
222 IF( myrow.EQ.irwrit .AND. mycol.EQ.icwrit ) THEN
223 CLOSE( nout )
224 END IF
225
226 9999 FORMAT( e15.8,e15.8 )
227
228 RETURN
229
230
231
integer function iceil(inum, idenom)
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)