3
4
5
6
7
8
9
10 INTEGER IAX, INCX, IX, JAX, JX, N
11 COMPLEX ALPHA
12
13
14 INTEGER DESCX( * )
15 COMPLEX 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 ALPHI, ALPHR, BETA, RSAFMN, SAFMIN, XNORM, CR,
157 $ CI
158
159
160 EXTERNAL blacs_gridinfo, cgebr2d, cgebs2d, pcscal,
161 $ pcsscal,
infog2l, pscnrm2, sladiv
162
163
164 REAL SLAMCH, SLAPY3
166
167
168 INTRINSIC abs, aimag,
cmplx, real, sign
169
170
171
172
173
174 ictxt = descx( ctxt_ )
175 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
176
177 IF( incx.EQ.descx( m_ ) ) THEN
178
179
180
181 CALL infog2l( ix, jax, descx, nprow, npcol, myrow, mycol,
182 $ iiax, jjax, ixrow, ixcol )
183
184 IF( myrow.NE.ixrow )
185 $ RETURN
186
187
188
189 IF( mycol.EQ.ixcol ) THEN
190 j = iiax+(jjax-1)*descx( lld_ )
191 CALL cgebs2d( ictxt, 'Rowwise', ' ', 1, 1, x( j ), 1 )
192 alpha = x( j )
193 ELSE
194 CALL cgebr2d( ictxt, 'Rowwise', ' ', 1, 1, alpha, 1,
195 $ myrow, ixcol )
196 END IF
197
198 indxtau = iiax
199
200 ELSE
201
202
203
204 CALL infog2l( iax, jx, descx, nprow, npcol, myrow, mycol,
205 $ iiax, jjax, ixrow, ixcol )
206
207 IF( mycol.NE.ixcol )
208 $ RETURN
209
210
211
212 IF( myrow.EQ.ixrow ) THEN
213 j = iiax+(jjax-1)*descx( lld_ )
214 CALL cgebs2d( ictxt, 'Columnwise', ' ', 1, 1, x( j ), 1 )
215 alpha = x( j )
216 ELSE
217 CALL cgebr2d( ictxt, 'Columnwise', ' ', 1, 1, alpha, 1,
218 $ ixrow, mycol )
219 END IF
220
221 indxtau = jjax
222
223 END IF
224
225 IF( n.LE.0 ) THEN
226 tau( indxtau ) = zero
227 RETURN
228 END IF
229
230 CALL pscnrm2( n-1, xnorm, x, ix, jx, descx, incx )
231 alphr = real( alpha )
232 alphi = aimag( alpha )
233
234 IF( xnorm.EQ.zero .AND. alphi.EQ.zero ) THEN
235
236
237
238 tau( indxtau ) = zero
239
240 ELSE
241
242
243
244 beta = -sign( slapy3( alphr, alphi, xnorm ), alphr )
246 rsafmn = one / safmin
247 IF( abs( beta ).LT.safmin ) THEN
248
249
250
251 knt = 0
252 10 CONTINUE
253 knt = knt + 1
254 CALL pcsscal( n-1, rsafmn, x, ix, jx, descx, incx )
255 beta = beta*rsafmn
256 alphi = alphi*rsafmn
257 alphr = alphr*rsafmn
258 IF( abs( beta ).LT.safmin )
259 $ GO TO 10
260
261
262
263 CALL pscnrm2( n-1, xnorm, x, ix, jx, descx, incx )
264 alpha =
cmplx( alphr, alphi )
265 beta = -sign( slapy3( alphr, alphi, xnorm ), alphr )
266 tau( indxtau ) =
cmplx( ( beta-alphr ) / beta,
267 $ -alphi / beta )
268 CALL sladiv( one, zero, real( alpha-beta ),
269 $ aimag( alpha-beta ), cr, ci )
270 alpha =
cmplx( cr, ci )
271 CALL pcscal( n-1, alpha, x, ix, jx, descx, incx )
272
273
274
275 alpha = beta
276 DO 20 j = 1, knt
277 alpha = alpha*safmin
278 20 CONTINUE
279 ELSE
280 tau( indxtau ) =
cmplx( ( beta-alphr ) / beta,
281 $ -alphi / beta )
282 CALL sladiv( one, zero, real( alpha-beta ),
283 $ aimag( alpha-beta ), cr, ci )
284 alpha =
cmplx( cr, ci )
285 CALL pcscal( n-1, alpha, x, ix, jx, descx, incx )
286 alpha = beta
287 END IF
288 END IF
289
290 RETURN
291
292
293
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)