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 A( * ), C( * ), R( * )
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
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 REAL ONE, ZERO
163 parameter( one = 1.0e+0, zero = 0.0e+0 )
164
165
166 CHARACTER COLCTOP, ROWCTOP
167 INTEGER I, IACOL, IAROW, ICOFF, ICTXT, IDUMM, IIA,
168 $ IOFFA, IROFF, J, JJA, LDA, MP, MYCOL, MYROW,
169 $ NPCOL, NPROW, NQ
170 REAL BIGNUM, RCMAX, RCMIN, SMLNUM
171
172
173 INTEGER DESCC( DLEN_ ), DESCR( DLEN_ )
174
175
178 $ sgamx2d
179
180
181 INTEGER INDXL2G, NUMROC
182 REAL PSLAMCH
184
185
186 INTRINSIC abs,
max,
min, mod
187
188
189
190
191
192 ictxt = desca( ctxt_ )
193 CALL blacs_gridinfo( ictxt, nprow, npcol, myrow, mycol )
194
195
196
197 info = 0
198 IF( nprow.EQ.-1 ) THEN
199 info = -(600+ctxt_)
200 ELSE
201 CALL chk1mat( m, 1, n, 2, ia, ja, desca, 6, info )
202 CALL pchk1mat( m, 1, n, 2, ia, ja, desca, 6, 0, idumm, idumm,
203 $ info )
204 END IF
205
206 IF( info.NE.0 ) THEN
207 CALL pxerbla( ictxt,
'PSGEEQU', -info )
208 RETURN
209 END IF
210
211
212
213 IF( m.EQ.0 .OR. n.EQ.0 ) THEN
214 rowcnd = one
215 colcnd = one
216 amax = zero
217 RETURN
218 END IF
219
220 CALL pb_topget( ictxt, 'Combine', 'Rowwise', rowctop )
221 CALL pb_topget( ictxt, 'Combine', 'Columnwise', colctop )
222
223
224
226 bignum = one / smlnum
227 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, iia, jja,
228 $ iarow, iacol )
229 iroff = mod( ia-1, desca( mb_ ) )
230 icoff = mod( ja-1, desca( nb_ ) )
231 mp =
numroc( m+iroff, desca( mb_ ), myrow, iarow, nprow )
232 nq =
numroc( n+icoff, desca( nb_ ), mycol, iacol, npcol )
233 IF( myrow.EQ.iarow )
234 $ mp = mp - iroff
235 IF( mycol.EQ.iacol )
236 $ nq = nq - icoff
237 lda = desca( lld_ )
238
239
240
241 CALL descset( descr, m, 1, desca( mb_ ), 1, 0, 0, ictxt,
243 CALL descset( descc, 1, n, 1, desca( nb_ ), 0, 0, ictxt, 1 )
244
245
246
247 DO 10 i = iia, iia+mp-1
248 r( i ) = zero
249 10 CONTINUE
250
251
252
253 ioffa = (jja-1)*lda
254 DO 30 j = jja, jja+nq-1
255 DO 20 i = iia, iia+mp-1
256 r( i ) =
max( r( i ), abs( a( ioffa + i ) ) )
257 20 CONTINUE
258 ioffa = ioffa + lda
259 30 CONTINUE
260 CALL sgamx2d( ictxt, 'Rowwise', rowctop, mp, 1, r( iia ),
261 $
max( 1, mp ), idumm, idumm, -1, -1, mycol )
262
263
264
265 rcmin = bignum
266 rcmax = zero
267 DO 40 i = iia, iia+mp-1
268 rcmax =
max( rcmax, r( i ) )
269 rcmin =
min( rcmin, r( i ) )
270 40 CONTINUE
271 CALL sgamx2d( ictxt, 'Columnwise', colctop, 1, 1, rcmax, 1, idumm,
272 $ idumm, -1, -1, mycol )
273 CALL sgamn2d( ictxt, 'Columnwise', colctop, 1, 1, rcmin, 1, idumm,
274 $ idumm, -1, -1, mycol )
275 amax = rcmax
276
277 IF( rcmin.EQ.zero ) THEN
278
279
280
281 DO 50 i = iia, iia+mp-1
282 IF( r( i ).EQ.zero .AND. info.EQ.0 )
283 $ info =
indxl2g( i, desca( mb_ ), myrow, desca( rsrc_ ),
284 $ nprow ) - ia + 1
285 50 CONTINUE
286 CALL igamx2d( ictxt, 'Columnwise', colctop, 1, 1, info, 1,
287 $ idumm, idumm, -1, -1, mycol )
288 IF( info.NE.0 )
289 $ RETURN
290 ELSE
291
292
293
294 DO 60 i = iia, iia+mp-1
295 r( i ) = one /
min(
max( r( i ), smlnum ), bignum )
296 60 CONTINUE
297
298
299
300 rowcnd =
max( rcmin, smlnum ) /
min( rcmax, bignum )
301
302 END IF
303
304
305
306 DO 70 j = jja, jja+nq-1
307 c( j ) = zero
308 70 CONTINUE
309
310
311
312
313 ioffa = (jja-1)*lda
314 DO 90 j = jja, jja+nq-1
315 DO 80 i = iia, iia+mp-1
316 c( j ) =
max( c( j ), abs( a( ioffa + i ) )*r( i ) )
317 80 CONTINUE
318 ioffa = ioffa + lda
319 90 CONTINUE
320 CALL sgamx2d( ictxt, 'Columnwise', colctop, 1, nq, c( jja ),
321 $ 1, idumm, idumm, -1, -1, mycol )
322
323
324
325 rcmin = bignum
326 rcmax = zero
327 DO 100 j = jja, jja+nq-1
328 rcmin =
min( rcmin, c( j ) )
329 rcmax =
max( rcmax, c( j ) )
330 100 CONTINUE
331 CALL sgamx2d( ictxt, 'Columnwise', colctop, 1, 1, rcmax, 1, idumm,
332 $ idumm, -1, -1, mycol )
333 CALL sgamn2d( ictxt, 'Columnwise', colctop, 1, 1, rcmin, 1, idumm,
334 $ idumm, -1, -1, mycol )
335
336 IF( rcmin.EQ.zero ) THEN
337
338
339
340 DO 110 j = jja, jja+nq-1
341 IF( c( j ).EQ.zero .AND. info.EQ.0 )
342 $ info = m +
indxl2g( j, desca( nb_ ), mycol,
343 $ desca( csrc_ ), npcol ) - ja + 1
344 110 CONTINUE
345 CALL igamx2d( ictxt, 'Columnwise', colctop, 1, 1, info, 1,
346 $ idumm, idumm, -1, -1, mycol )
347 IF( info.NE.0 )
348 $ RETURN
349 ELSE
350
351
352
353 DO 120 j = jja, jja+nq-1
354 c( j ) = one /
min(
max( c( j ), smlnum ), bignum )
355 120 CONTINUE
356
357
358
359 colcnd =
max( rcmin, smlnum ) /
min( rcmax, bignum )
360
361 END IF
362
363 RETURN
364
365
366
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)