2
3
4
5
6
7
8
9 INTEGER IX, INCX, JX, N
10 REAL SCALE, SUMSQ
11
12
13 INTEGER DESCX( * )
14 COMPLEX 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 REAL ZERO
148 parameter( zero = 0.0e+0 )
149
150
151 INTEGER I, ICOFF, ICTXT, IIX, IOFF, IROFF, IXCOL,
152 $ IXROW, JJX, LDX, MYCOL, MYROW, NP, NPCOL,
153 $ NPROW, NQ
154 REAL TEMP1
155
156
157 REAL WORK( 2 )
158
159
161
162
163 INTEGER NUMROC
165
166
167 INTRINSIC abs, aimag, mod, real
168
169
170
171
172
173 ictxt = descx( ctxt_ )
174 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
175
176
177
178 CALL infog2l( ix, jx, descx, nprow, npcol, myrow, mycol, iix, jjx,
179 $ ixrow, ixcol )
180
181 ldx = descx( lld_ )
182 IF( incx.EQ.descx( m_ ) ) THEN
183
184
185
186 IF( myrow.NE.ixrow )
187 $ RETURN
188 icoff = mod( jx, descx( nb_ ) )
189 nq =
numroc( n+icoff, descx( nb_ ), mycol, ixcol, npcol )
190 IF( mycol.EQ.ixcol )
191 $ nq = nq - icoff
192
193
194
195 IF( nq.GT.0 ) THEN
196 ioff = iix + ( jjx - 1 ) * ldx
197 DO 10 i = 1, nq
198 IF( real( x( ioff ) ).NE.zero ) THEN
199 temp1 = abs( real( x( ioff ) ) )
200 IF( scale.LT.temp1 ) THEN
201 sumsq = 1 + sumsq * ( scale / temp1 )**2
202 scale = temp1
203 ELSE
204 sumsq = sumsq + ( temp1 / scale )**2
205 END IF
206 END IF
207 IF( aimag( x( ioff ) ).NE.zero ) THEN
208 temp1 = abs( aimag( x( ioff ) ) )
209 IF( scale.LT.temp1 ) THEN
210 sumsq = 1 + sumsq*( scale / temp1 )**2
211 scale = temp1
212 ELSE
213 sumsq = sumsq + ( temp1 / scale )**2
214 END IF
215 END IF
216 ioff = ioff + ldx
217 10 CONTINUE
218 END IF
219
220
221
222 work( 1 ) = scale
223 work( 2 ) = sumsq
224
225 CALL pstreecomb( ictxt,
'Rowwise', 2, work, -1, ixcol,
227
228 scale = work( 1 )
229 sumsq = work( 2 )
230
231 ELSE IF( incx.EQ.1 ) THEN
232
233
234
235 IF( mycol.NE.ixcol )
236 $ RETURN
237 iroff = mod( ix, descx( mb_ ) )
238 np =
numroc( n+iroff, descx( mb_ ), myrow, ixrow, nprow )
239 IF( myrow.EQ.ixrow )
240 $ np = np - iroff
241
242
243
244 IF( np.GT.0 ) THEN
245 ioff = iix + ( jjx - 1 ) * ldx
246 DO 20 i = 1, np
247 IF( real( x( ioff ) ).NE.zero ) THEN
248 temp1 = abs( real( x( ioff ) ) )
249 IF( scale.LT.temp1 ) THEN
250 sumsq = 1 + sumsq*( scale / temp1 )**2
251 scale = temp1
252 ELSE
253 sumsq = sumsq + ( temp1 / scale )**2
254 END IF
255 END IF
256 IF( aimag( x( ioff ) ).NE.zero ) THEN
257 temp1 = abs( aimag( x( ioff ) ) )
258 IF( scale.LT.temp1 ) THEN
259 sumsq = 1 + sumsq*( scale / temp1 )**2
260 scale = temp1
261 ELSE
262 sumsq = sumsq + ( temp1 / scale )**2
263 END IF
264 END IF
265 ioff = ioff + 1
266 20 CONTINUE
267 END IF
268
269
270
271 work( 1 ) = scale
272 work( 2 ) = sumsq
273
274 CALL pstreecomb( ictxt,
'Columnwise', 2, work, -1, ixcol,
276
277 scale = work( 1 )
278 sumsq = work( 2 )
279
280 END IF
281
282 RETURN
283
284
285
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine pstreecomb(ictxt, scope, n, mine, rdest0, cdest0, subptr)
subroutine scombssq(v1, v2)