2
3
4
5
6
7
8
9 INTEGER IX, INCX, JX, N
10 DOUBLE PRECISION ASUM
11
12
13 INTEGER DESCX( * )
14 COMPLEX*16 X( * )
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
139
140
141
142 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
143 $ LLD_, MB_, M_, NB_, N_, RSRC_
144 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
145 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
146 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
147 DOUBLE PRECISION ZERO
148 parameter( zero = 0.0d+0 )
149
150
151 CHARACTER CCTOP, RCTOP
152 INTEGER ICOFF, ICTXT, IIX, IROFF, IXCOL, IXROW, JJX,
153 $ LDX, MYCOL, MYROW, NP, NPCOL, NPROW, NQ
154
155
156 EXTERNAL blacs_gridinfo, dgsum2d,
infog2l, pb_topget
157
158
159 INTEGER NUMROC
160 DOUBLE PRECISION DZSUM1
162
163
164 INTRINSIC abs, mod
165
166
167
168 ictxt = descx( ctxt_ )
169 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
170
171
172
173 asum = zero
174 IF( n.LE.0 )
175 $ RETURN
176
177 ldx = descx( lld_ )
178 CALL infog2l( ix, jx, descx, nprow, npcol, myrow, mycol, iix, jjx,
179 $ ixrow, ixcol )
180
181 IF( incx.EQ.1 .AND. descx( m_ ).EQ.1 .AND. n.EQ.1 ) THEN
182 IF( myrow.EQ.ixrow .AND. mycol.EQ.ixcol ) THEN
183 asum = abs( x( iix+(jjx-1)*ldx ) )
184 END IF
185 RETURN
186 END IF
187
188 IF( incx.EQ.descx( m_ ) ) THEN
189
190
191
192 IF( myrow.EQ.ixrow ) THEN
193 CALL pb_topget( ictxt, 'Combine', 'Rowwise', rctop )
194 icoff = mod( jx-1, descx( nb_ ) )
195 nq =
numroc( n+icoff, descx( nb_ ), mycol, ixcol, npcol )
196 IF( mycol.EQ.ixcol )
197 $ nq = nq-icoff
198 asum = dzsum1( nq, x( iix+(jjx-1)*ldx ), ldx )
199 CALL dgsum2d( ictxt, 'Rowwise', rctop, 1, 1, asum, 1,
200 $ -1, mycol )
201 END IF
202
203 ELSE
204
205
206
207 IF( mycol.EQ.ixcol ) THEN
208 CALL pb_topget( ictxt, 'Combine', 'Columnwise', cctop )
209 iroff = mod( ix-1, descx( mb_ ) )
210 np =
numroc( n+iroff, descx( mb_ ), myrow, ixrow, nprow )
211 IF( myrow.EQ.ixrow )
212 $ np = np-iroff
213 asum = dzsum1( np, x( iix+(jjx-1)*ldx ), 1 )
214 CALL dgsum2d( ictxt, 'Columnwise', cctop, 1, 1, asum, 1,
215 $ -1, mycol )
216 END IF
217
218 END IF
219
220 RETURN
221
222
223
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
integer function numroc(n, nb, iproc, isrcproc, nprocs)