3
4
5
6
7
8
9
10 INTEGER IA, INFO, JA, M, N
11 REAL AMAX, COLCND, ROWCND
12
13
14 INTEGER DESCA( * )
15 REAL C( * ), R( * )
16 COMPLEX A( * )
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
157
158 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
159 $ LLD_, MB_, M_, NB_, N_, RSRC_
160 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
161 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
162 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
163 REAL ONE, ZERO
164 parameter( one = 1.0e+0, zero = 0.0e+0 )
165
166
167 CHARACTER COLCTOP, ROWCTOP
168 INTEGER I, IACOL, IAROW, ICOFF, ICTXT, IDUMM, IIA,
169 $ IOFFA, IROFF, J, JJA, LDA, MP, MYCOL, MYROW,
170 $ NPCOL, NPROW, NQ
171 REAL BIGNUM, RCMAX, RCMIN, SMLNUM
172 COMPLEX ZDUM
173
174
175 INTEGER DESCC( DLEN_ ), DESCR( DLEN_ )
176
177
180 $ sgamx2d
181
182
183 INTEGER INDXL2G, NUMROC
184 REAL PSLAMCH
186
187
188 INTRINSIC abs, aimag,
max,
min, mod, real
189
190
191 REAL CABS1
192
193
194 cabs1( zdum ) = abs( real( zdum ) ) + abs( aimag( zdum ) )
195
196
197
198
199
200 ictxt = desca( ctxt_ )
201 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
202
203
204
205 info = 0
206 IF( nprow.EQ.-1 ) THEN
207 info = -(600+ctxt_)
208 ELSE
209 CALL chk1mat( m, 1, n, 2, ia, ja, desca, 6, info )
210 CALL pchk1mat( m, 1, n, 2, ia, ja, desca, 6, 0, idumm, idumm,
211 $ info )
212 END IF
213
214 IF( info.NE.0 ) THEN
215 CALL pxerbla( ictxt,
'PCGEEQU', -info )
216 RETURN
217 END IF
218
219
220
221 IF( m.EQ.0 .OR. n.EQ.0 ) THEN
222 rowcnd = one
223 colcnd = one
224 amax = zero
225 RETURN
226 END IF
227
228 CALL pb_topget( ictxt, 'Combine', 'Rowwise', rowctop )
229 CALL pb_topget( ictxt, 'Combine', 'Columnwise', colctop )
230
231
232
234 bignum = one / smlnum
235 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, iia, jja,
236 $ iarow, iacol )
237 iroff = mod( ia-1, desca( mb_ ) )
238 icoff = mod( ja-1, desca( nb_ ) )
239 mp =
numroc( m+iroff, desca( mb_ ), myrow, iarow, nprow )
240 nq =
numroc( n+icoff, desca( nb_ ), mycol, iacol, npcol )
241 IF( myrow.EQ.iarow )
242 $ mp = mp - iroff
243 IF( mycol.EQ.iacol )
244 $ nq = nq - icoff
245 lda = desca( lld_ )
246
247
248
249 CALL descset( descr, m, 1, desca( mb_ ), 1, 0, 0, ictxt,
251 CALL descset( descc, 1, n, 1, desca( nb_ ), 0, 0, ictxt, 1 )
252
253
254
255 DO 10 i = iia, iia+mp-1
256 r( i ) = zero
257 10 CONTINUE
258
259
260
261 ioffa = (jja-1)*lda
262 DO 30 j = jja, jja+nq-1
263 DO 20 i = iia, iia+mp-1
264 r( i ) =
max( r( i ), cabs1( a( ioffa + i ) ) )
265 20 CONTINUE
266 ioffa = ioffa + lda
267 30 CONTINUE
268 CALL sgamx2d( ictxt, 'Rowwise', rowctop, mp, 1, r( iia ),
269 $
max( 1, mp ), idumm, idumm, -1, -1, mycol )
270
271
272
273 rcmin = bignum
274 rcmax = zero
275 DO 40 i = iia, iia+mp-1
276 rcmax =
max( rcmax, r( i ) )
277 rcmin =
min( rcmin, r( i ) )
278 40 CONTINUE
279 CALL sgamx2d( ictxt, 'Columnwise', colctop, 1, 1, rcmax, 1, idumm,
280 $ idumm, -1, -1, mycol )
281 CALL sgamn2d( ictxt, 'Columnwise', colctop, 1, 1, rcmin, 1, idumm,
282 $ idumm, -1, -1, mycol )
283 amax = rcmax
284
285 IF( rcmin.EQ.zero ) THEN
286
287
288
289 DO 50 i = iia, iia+mp-1
290 IF( r( i ).EQ.zero .AND. info.EQ.0 )
291 $ info =
indxl2g( i, desca( mb_ ), myrow, desca( rsrc_ ),
292 $ nprow ) - ia + 1
293 50 CONTINUE
294 CALL igamx2d( ictxt, 'Columnwise', colctop, 1, 1, info, 1,
295 $ idumm, idumm, -1, -1, mycol )
296 IF( info.NE.0 )
297 $ RETURN
298 ELSE
299
300
301
302 DO 60 i = iia, iia+mp-1
303 r( i ) = one /
min(
max( r( i ), smlnum ), bignum )
304 60 CONTINUE
305
306
307
308 rowcnd =
max( rcmin, smlnum ) /
min( rcmax, bignum )
309
310 END IF
311
312
313
314 DO 70 j = jja, jja+nq-1
315 c( j ) = zero
316 70 CONTINUE
317
318
319
320
321 ioffa = (jja-1)*lda
322 DO 90 j = jja, jja+nq-1
323 DO 80 i = iia, iia+mp-1
324 c( j ) =
max( c( j ), cabs1( a( ioffa + i ) )*r( i ) )
325 80 CONTINUE
326 ioffa = ioffa + lda
327 90 CONTINUE
328 CALL sgamx2d( ictxt, 'Columnwise', colctop, 1, nq, c( jja ),
329 $ 1, idumm, idumm, -1, -1, mycol )
330
331
332
333 rcmin = bignum
334 rcmax = zero
335 DO 100 j = jja, jja+nq-1
336 rcmin =
min( rcmin, c( j ) )
337 rcmax =
max( rcmax, c( j ) )
338 100 CONTINUE
339 CALL sgamx2d( ictxt, 'Columnwise', colctop, 1, 1, rcmax, 1, idumm,
340 $ idumm, -1, -1, mycol )
341 CALL sgamn2d( ictxt, 'Columnwise', colctop, 1, 1, rcmin, 1, idumm,
342 $ idumm, -1, -1, mycol )
343
344 IF( rcmin.EQ.zero ) THEN
345
346
347
348 DO 110 j = jja, jja+nq-1
349 IF( c( j ).EQ.zero .AND. info.EQ.0 )
350 $ info = m +
indxl2g( j, desca( nb_ ), mycol,
351 $ desca( csrc_ ), npcol ) - ja + 1
352 110 CONTINUE
353 CALL igamx2d( ictxt, 'Columnwise', colctop, 1, 1, info, 1,
354 $ idumm, idumm, -1, -1, mycol )
355 IF( info.NE.0 )
356 $ RETURN
357 ELSE
358
359
360
361 DO 120 j = jja, jja+nq-1
362 c( j ) = one /
min(
max( c( j ), smlnum ), bignum )
363 120 CONTINUE
364
365
366
367 colcnd =
max( rcmin, smlnum ) /
min( rcmax, bignum )
368
369 END IF
370
371 RETURN
372
373
374
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
subroutine descset(desc, m, n, mb, nb, irsrc, icsrc, ictxt, lld)
integer function indxl2g(indxloc, nb, iproc, isrcproc, nprocs)
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)
subroutine pchk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, nextra, ex, expos, info)
subroutine pxerbla(ictxt, srname, info)