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
161
162
163 DOUBLE PRECISION DLAMCH, DLAPY2
165
166
167 INTRINSIC abs, sign
168
169
170
171
172
173 ictxt = descx( ctxt_ )
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.NE. IF( MYCOLIXCOL )
207 $ RETURN
208
209
210
211.EQ. IF( MYROWIXROW ) 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.LE. IF( N0 ) THEN
225 TAU( INDXTAU ) = ZERO
226 RETURN
227 END IF
228
229 CALL PDNRM2( N-1, XNORM, X, IX, JX, DESCX, INCX )
230
231.EQ. IF( XNORMZERO ) THEN
232
233
234
235 TAU( INDXTAU ) = ZERO
236
237 ELSE
238
239
240
241 BETA = -SIGN( DLAPY2( ALPHA, XNORM ), ALPHA )
242 SAFMIN = DLAMCH( 's' )
243 RSAFMN = ONE / SAFMIN
244.LT. IF( ABS( BETA )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.LT. IF( ABS( BETA )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
double precision function dlapy2(x, y)
DLAPY2 returns sqrt(x2+y2).
double precision function dlamch(cmach)
DLAMCH
subroutine dgebs2d(contxt, scope, top, m, n, a, lda)
subroutine pdnrm2(n, norm2, x, ix, jx, descx, incx)
subroutine pdscal(n, alpha, x, ix, jx, descx, incx)
subroutine dgebr2d(contxt, scope, top, m, n, a, lda)
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
subroutine blacs_gridinfo(cntxt, nprow, npcol, myrow, mycol)