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