3
4
5
6
7
8
9
10 INTEGER IAX, INCX, IX, JAX, JX, N
11 DOUBLE PRECISION ALPHA
12
13
14 INTEGER DESCX( * )
15 DOUBLE PRECISION 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 DOUBLE PRECISION ONE, ZERO
151 parameter( one = 1.0d+0, zero = 0.0d+0 )
152
153
154 INTEGER ICTXT, IIAX, INDXTAU, IXCOL, IXROW, J, JJAX,
155 $ KNT, MYCOL, MYROW, NPCOL, NPROW
156 DOUBLE PRECISION BETA, RSAFMN, SAFMIN, XNORM
157
158
159 EXTERNAL blacs_gridinfo, dgebr2d, dgebs2d, pdscal,
161
162
163 DOUBLE PRECISION DLAMCH, DLAPY2
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 dgebs2d( ictxt, 'Rowwise', ' ', 1, 1, x( j ), 1 )
191 alpha = x( j )
192 ELSE
193 CALL dgebr2d( 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 dgebs2d( ictxt, 'Columnwise', ' ', 1, 1, x( j ), 1 )
214 alpha = x( j )
215 ELSE
216 CALL dgebr2d( 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 pdnrm2( 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( dlapy2( 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 pdscal( 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 pdnrm2( n-1, xnorm, x, ix, jx, descx, incx )
260 beta = -sign( dlapy2( alpha, xnorm ), alpha )
261 tau( indxtau ) = ( beta-alpha ) / beta
262 CALL pdscal( 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 pdscal( 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)