3
4
5
6
7
8
9
10 INTEGER IAX, INCX, IX, JAX, JX, N
11 REAL ALPHA
12
13
14 INTEGER DESCX( * )
15 REAL TAU( * ), X( * )
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
143
144
145 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
146 $ LLD_, MB_, M_, NB_, N_, RSRC_
147 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
148 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
149 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
150 REAL ONE, ZERO
151 parameter( one = 1.0e+0, zero = 0.0e+0 )
152
153
154 INTEGER ICTXT, IIAX, INDXTAU, IXCOL, IXROW, J, JJAX,
155 $ KNT, MYCOL, MYROW, NPCOL, NPROW
156 REAL BETA, RSAFMN, SAFMIN, XNORM
157
158
159 EXTERNAL blacs_gridinfo,
infog2l, psnrm2, sgebr2d,
160 $ sgebs2d, psscal
161
162
163 REAL SLAMCH, SLAPY2
165
166
167 INTRINSIC abs, sign
168
169
170
171
172
173 ictxt = descx( ctxt_ )
174 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
175
176 IF( incx.EQ.descx( m_ ) ) THEN
177
178
179
180 CALL infog2l( ix, jax, descx, nprow, npcol, myrow, mycol,
181 $ iiax, jjax, ixrow, ixcol )
182
183 IF( myrow.NE.ixrow )
184 $ RETURN
185
186
187
188 IF( mycol.EQ.ixcol ) THEN
189 j = iiax+(jjax-1)*descx( lld_ )
190 CALL sgebs2d( ictxt, 'Rowwise', ' ', 1, 1, x( j ), 1 )
191 alpha = x( j )
192 ELSE
193 CALL sgebr2d( ictxt, 'Rowwise', ' ', 1, 1, alpha, 1,
194 $ myrow, ixcol )
195 END IF
196
197 indxtau = iiax
198
199 ELSE
200
201
202
203 CALL infog2l( iax, jx, descx, nprow, npcol, myrow, mycol,
204 $ iiax, jjax, ixrow, ixcol )
205
206 IF( mycol.NE.ixcol )
207 $ RETURN
208
209
210
211 IF( myrow.EQ.ixrow ) THEN
212 j = iiax+(jjax-1)*descx( lld_ )
213 CALL sgebs2d( ictxt, 'Columnwise', ' ', 1, 1, x( j ), 1 )
214 alpha = x( j )
215 ELSE
216 CALL sgebr2d( ictxt, 'Columnwise', ' ', 1, 1, alpha, 1,
217 $ ixrow, mycol )
218 END IF
219
220 indxtau = jjax
221
222 END IF
223
224 IF( n.LE.0 ) THEN
225 tau( indxtau ) = zero
226 RETURN
227 END IF
228
229 CALL psnrm2( n-1, xnorm, x, ix, jx, descx, incx )
230
231 IF( xnorm.EQ.zero ) THEN
232
233
234
235 tau( indxtau ) = zero
236
237 ELSE
238
239
240
241 beta = -sign( slapy2( alpha, xnorm ), alpha )
243 rsafmn = one / safmin
244 IF( abs( beta ).LT.safmin ) THEN
245
246
247
248 knt = 0
249 10 CONTINUE
250 knt = knt + 1
251 CALL psscal( n-1, rsafmn, x, ix, jx, descx, incx )
252 beta = beta*rsafmn
253 alpha = alpha*rsafmn
254 IF( abs( beta ).LT.safmin )
255 $ GO TO 10
256
257
258
259 CALL psnrm2( n-1, xnorm, x, ix, jx, descx, incx )
260 beta = -sign( slapy2( alpha, xnorm ), alpha )
261 tau( indxtau ) = ( beta-alpha ) / beta
262 CALL psscal( n-1, one/(alpha-beta), x, ix, jx, descx, incx )
263
264
265
266 alpha = beta
267 DO 20 j = 1, knt
268 alpha = alpha*safmin
269 20 CONTINUE
270 ELSE
271 tau( indxtau ) = ( beta-alpha ) / beta
272 CALL psscal( n-1, one/(alpha-beta), x, ix, jx, descx, incx )
273 alpha = beta
274 END IF
275 END IF
276
277 RETURN
278
279
280
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)