3
4
5
6
7
8
9
10 CHARACTER EQUED, UPLO
11 INTEGER IA, JA, N
12 REAL AMAX, SCOND
13
14
15 INTEGER DESCA( * )
16 REAL A( * ), SC( * ), SR( * )
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
146
147
148
149
150
151
152
153
154
155
156 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
157 $ LLD_, MB_, M_, NB_, N_, RSRC_
158 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
159 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
160 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
161 REAL ONE, THRESH
162 parameter( one = 1.0e+0, thresh = 0.1e+0 )
163
164
165 INTEGER IACOL, IAROW, ICTXT, II, IIA, IOFFA, IROFF, J,
166 $ JB, JJ, JJA, JN, KK, LDA, LL, MYCOL, MYROW, NP,
167 $ NPCOL, NPROW
168 REAL CJ, LARGE, SMALL
169
170
171 EXTERNAL blacs_gridinfo,
infog2l
172
173
174 LOGICAL LSAME
175 INTEGER ICEIL, NUMROC
176 REAL PSLAMCH
178
179
181
182
183
184
185
186 IF( n.LE.0 ) THEN
187 equed = 'N'
188 RETURN
189 END IF
190
191
192
193 ictxt = desca( ctxt_ )
194 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
195 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, iia, jja,
196 $ iarow, iacol )
197 lda = desca( lld_ )
198
199
200
201 small =
pslamch( ictxt,
'Safe minimum' ) /
202 $
pslamch( ictxt,
'Precision' )
203 large = one / small
204
205 IF( scond.GE.thresh .AND. amax.GE.small .AND. amax.LE.large ) THEN
206
207
208
209 equed = 'N'
210
211 ELSE
212
213 ii = iia
214 jj = jja
215 jn =
min(
iceil( ja, desca( nb_ ) ) * desca( nb_ ), ja+n-1 )
216 jb = jn-ja+1
217
218
219
220 IF(
lsame( uplo,
'U' ) )
THEN
221
222
223
224
225 ioffa = (jj-1)*lda
226 IF( mycol.EQ.iacol ) THEN
227 IF( myrow.EQ.iarow ) THEN
228 DO 20 ll = jj, jj + jb -1
229 cj = sc( ll )
230 DO 10 kk = iia, ii+ll-jj+1
231 a( ioffa + kk ) = cj*sr( kk )*a( ioffa + kk )
232 10 CONTINUE
233 ioffa = ioffa + lda
234 20 CONTINUE
235 ELSE
236 ioffa = ioffa + jb*lda
237 END IF
238 jj = jj + jb
239 END IF
240
241 IF( myrow.EQ.iarow )
242 $ ii = ii + jb
243 iarow = mod( iarow+1, nprow )
244 iacol = mod( iacol+1, npcol )
245
246
247
248 DO 70 j = jn+1, ja+n-1, desca( nb_ )
249 jb =
min( ja+n-j, desca( nb_ ) )
250
251 IF( mycol.EQ.iacol ) THEN
252 IF( myrow.EQ.iarow ) THEN
253 DO 40 ll = jj, jj + jb -1
254 cj = sc( ll )
255 DO 30 kk = iia, ii+ll-jj+1
256 a( ioffa + kk ) = cj*sr( kk )*a( ioffa + kk )
257 30 CONTINUE
258 ioffa = ioffa + lda
259 40 CONTINUE
260 ELSE
261 DO 60 ll = jj, jj + jb -1
262 cj = sc( ll )
263 DO 50 kk = iia, ii-1
264 a( ioffa + kk ) = cj*sr( kk )*a( ioffa + kk )
265 50 CONTINUE
266 ioffa = ioffa + lda
267 60 CONTINUE
268 END IF
269 jj = jj + jb
270 END IF
271
272 IF( myrow.EQ.iarow )
273 $ ii = ii + jb
274 iarow = mod( iarow+1, nprow )
275 iacol = mod( iacol+1, npcol )
276
277 70 CONTINUE
278
279 ELSE
280
281
282
283
284 iroff = mod( ia-1, desca( mb_ ) )
285 np =
numroc( n+iroff, desca( mb_ ), myrow, iarow, nprow )
286 IF( myrow.EQ.iarow )
287 $ np = np-iroff
288
289 ioffa = (jj-1)*lda
290 IF( mycol.EQ.iacol ) THEN
291 IF( myrow.EQ.iarow ) THEN
292 DO 90 ll = jj, jj + jb -1
293 cj = sc( ll )
294 DO 80 kk = ii+ll-jj, iia+np-1
295 a( ioffa + kk ) = cj*sr( kk )*a( ioffa + kk )
296 80 CONTINUE
297 ioffa = ioffa + lda
298 90 CONTINUE
299 ELSE
300 DO 110 ll = jj, jj + jb -1
301 cj = sc( ll )
302 DO 100 kk = ii, iia+np-1
303 a( ioffa + kk ) = cj*sr( kk )*a( ioffa + kk )
304 100 CONTINUE
305 ioffa = ioffa + lda
306 110 CONTINUE
307 END IF
308 jj = jj + jb
309 END IF
310
311 IF( myrow.EQ.iarow )
312 $ ii = ii + jb
313 iarow = mod( iarow+1, nprow )
314 iacol = mod( iacol+1, npcol )
315
316
317
318 DO 160 j = jn+1, ja+n-1, desca( nb_ )
319 jb =
min( ja+n-j, desca( nb_ ) )
320
321 IF( mycol.EQ.iacol ) THEN
322 IF( myrow.EQ.iarow ) THEN
323 DO 130 ll = jj, jj + jb -1
324 cj = sc( ll )
325 DO 120 kk = ii+ll-jj, iia+np-1
326 a( ioffa + kk ) = cj*sr( kk )*a( ioffa + kk )
327 120 CONTINUE
328 ioffa = ioffa + lda
329 130 CONTINUE
330 ELSE
331 DO 150 ll = jj, jj + jb -1
332 cj = sc( ll )
333 DO 140 kk = ii, iia+np-1
334 a( ioffa + kk ) = cj*sr( kk )*a( ioffa + kk )
335 140 CONTINUE
336 ioffa = ioffa + lda
337 150 CONTINUE
338 END IF
339 jj = jj + jb
340 END IF
341
342 IF( myrow.EQ.iarow )
343 $ ii = ii + jb
344 iarow = mod( iarow+1, nprow )
345 iacol = mod( iacol+1, npcol )
346
347 160 CONTINUE
348
349 END IF
350
351 equed = 'Y'
352
353 END IF
354
355 RETURN
356
357
358
integer function iceil(inum, idenom)
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
integer function numroc(n, nb, iproc, isrcproc, nprocs)
real function pslamch(ictxt, cmach)