2
3
4
5
6
7
8
9 INTEGER IX, INCX, JX, N
10 DOUBLE PRECISION SCALE, SUMSQ
11
12
13 INTEGER DESCX( * )
14 DOUBLE PRECISION 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 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
138 $ LLD_, MB_, M_, NB_, N_, RSRC_
139 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
140 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
141 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
142 DOUBLE PRECISION ZERO
143 parameter( zero = 0.0d+0 )
144
145
146 INTEGER I, ICOFF, ICTXT, IIX, IOFF, IROFF, IXCOL,
147 $ IXROW, JJX, LDX, MYCOL, MYROW, NP, NPCOL,
148 $ NPROW, NQ
149 DOUBLE PRECISION TEMP1
150
151
152 DOUBLE PRECISION WORK( 2 )
153
154
156
157
158 INTEGER NUMROC
160
161
162 INTRINSIC abs, mod
163
164
165
166
167
168 ictxt = descx( ctxt_ )
169 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
170
171
172
173 CALL infog2l( ix, jx, descx, nprow, npcol, myrow, mycol, iix, jjx,
174 $ ixrow, ixcol )
175
176 ldx = descx( lld_ )
177 IF( incx.EQ.descx( m_ ) ) THEN
178
179
180
181 IF( myrow.NE.ixrow )
182 $ RETURN
183 icoff = mod( jx, descx( nb_ ) )
184 nq =
numroc( n+icoff, descx( nb_ ), mycol, ixcol, npcol )
185 IF( mycol.EQ.ixcol )
186 $ nq = nq - icoff
187
188
189
190 IF( nq.GT.0 ) THEN
191 ioff = iix + ( jjx - 1 ) * ldx
192 DO 10 i = 1, nq
193 IF( x( ioff ).NE.zero ) THEN
194 temp1 = abs( x( ioff ) )
195 IF( scale.LT.temp1 ) THEN
196 sumsq = 1 + sumsq * ( scale / temp1 )**2
197 scale = temp1
198 ELSE
199 sumsq = sumsq + ( temp1 / scale )**2
200 END IF
201 END IF
202 ioff = ioff + ldx
203 10 CONTINUE
204 END IF
205
206
207
208 work( 1 ) = scale
209 work( 2 ) = sumsq
210
211 CALL pdtreecomb( ictxt,
'Rowwise', 2, work, -1, ixcol,
213
214 scale = work( 1 )
215 sumsq = work( 2 )
216
217 ELSE IF( incx.EQ.1 ) THEN
218
219
220
221 IF( mycol.NE.ixcol )
222 $ RETURN
223 iroff = mod( ix, descx( mb_ ) )
224 np =
numroc( n+iroff, descx( mb_ ), myrow, ixrow, nprow )
225 IF( myrow.EQ.ixrow )
226 $ np = np - iroff
227
228
229
230 IF( np.GT.0 ) THEN
231 ioff = iix + ( jjx - 1 ) * ldx
232 DO 20 i = 1, np
233 IF( x( ioff ).NE.zero ) THEN
234 temp1 = abs( x( ioff ) )
235 IF( scale.LT.temp1 ) THEN
236 sumsq = 1 + sumsq*( scale / temp1 )**2
237 scale = temp1
238 ELSE
239 sumsq = sumsq + ( temp1 / scale )**2
240 END IF
241 END IF
242 ioff = ioff + 1
243 20 CONTINUE
244 END IF
245
246
247
248 work( 1 ) = scale
249 work( 2 ) = sumsq
250
251 CALL pdtreecomb( ictxt,
'Columnwise', 2, work, -1, ixcol,
253
254 scale = work( 1 )
255 sumsq = work( 2 )
256
257 END IF
258
259 RETURN
260
261
262
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
subroutine dcombssq(v1, v2)
subroutine pdtreecomb(ictxt, scope, n, mine, rdest0, cdest0, subptr)