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_
144
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
157
158
159 INTEGER NUMROC
160 DOUBLE PRECISION DZSUM1
162
163
164 INTRINSIC abs, mod
165
166
167
168 ictxt = descx
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
double precision function dzsum1(n, cx, incx)
DZSUM1 forms the 1-norm of the complex vector using the true absolute value.
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
subroutine blacs_gridinfo(cntxt, nprow, npcol, myrow, mycol)
integer function numroc(n, nb, iproc, isrcproc, nprocs)