1 SUBROUTINE pcpoequ( N, A, IA, JA, DESCA, SR, SC, SCOND, AMAX,
10 INTEGER IA, INFO, JA, N
150 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
151 $ lld_, mb_, m_, nb_, n_, rsrc_
152 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
153 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
154 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
156 parameter( zero = 0.0e+0, one = 1.0e+0 )
159 CHARACTER ALLCTOP, COLCTOP, ROWCTOP
160 INTEGER IACOL, IAROW, ICOFF, ICTXT, ICURCOL, ICURROW,
161 $ idumm, ii, iia, ioffa, ioffd, iroff, j, jb, jj,
162 $ jja, jn, lda, ll, mycol, myrow, np, npcol,
167 INTEGER DESCSC( DLEN_ ), DESCSR( DLEN_ )
172 $ sgamn2d, sgamx2d, sgsum2d
175 INTEGER ICEIL, NUMROC
177 EXTERNAL iceil, numroc, pslamch
180 INTRINSIC max,
min, mod, real, sqrt
186 ictxt = desca( ctxt_ )
192 IF( nprow.EQ.-1 )
THEN
195 CALL chk1mat( n, 1, n, 1, ia, ja, desca, 5, info )
196 CALL pchk1mat( n, 1, n, 1, ia, ja, desca, 5, 0, idumm, idumm,
213 CALL PB_TOPGET( ICTXT, 'combine
', 'all
', ALLCTOP )
214 CALL PB_TOPGET( ICTXT, 'combine
', 'rowwise
', ROWCTOP )
215 CALL PB_TOPGET( ICTXT, 'combine
', 'columnwise
', COLCTOP )
219 CALL INFOG2L( IA, JA, DESCA, NPROW, NPCOL, MYROW, MYCOL, IIA, JJA,
221 IROFF = MOD( IA-1, DESCA( MB_ ) )
222 ICOFF = MOD( JA-1, DESCA( NB_ ) )
223 NP = NUMROC( N+IROFF, DESCA( MB_ ), MYROW, IAROW, NPROW )
224 NQ = NUMROC( N+ICOFF, DESCA( NB_ ), MYCOL, IACOL, NPCOL )
229 JN = MIN( ICEIL( JA, DESCA( NB_ ) ) * DESCA( NB_ ), JA+N-1 )
234 CALL DESCSET( DESCSR, N, 1, DESCA( MB_ ), 1, 0, 0, ICTXT,
236 CALL DESCSET( DESCSC, 1, N, 1, DESCA( NB_ ), 0, 0, ICTXT, 1 )
240 DO 10 II = IIA, IIA+NP-1
244 DO 20 JJ = JJA, JJA+NQ-1
254 SMIN = ONE / PSLAMCH( ICTXT, 's
' )
257 IOFFA = II+(JJ-1)*LDA
258.EQ..AND..EQ.
IF( MYROWIAROW MYCOLIACOL ) THEN
261 AII = REAL( A( IOFFD ) )
264 SMIN = MIN( SMIN, AII )
265 AMAX = MAX( AMAX, AII )
266.LE..AND..EQ.
IF( AIIZERO INFO0 )
268 IOFFD = IOFFD + LDA + 1
272.EQ.
IF( MYROWIAROW ) THEN
276.EQ.
IF( MYCOLIACOL ) THEN
278 IOFFA = IOFFA + JB*LDA
280 ICURROW = MOD( IAROW+1, NPROW )
281 ICURCOL = MOD( IACOL+1, NPCOL )
285 DO 50 J = JN+1, JA+N-1, DESCA( NB_ )
286 JB = MIN( N-J+JA, DESCA( NB_ ) )
288.EQ..AND..EQ.
IF( MYROWICURROW MYCOLICURCOL ) THEN
291 AII = REAL( A( IOFFD ) )
294 SMIN = MIN( SMIN, AII )
295 AMAX = MAX( AMAX, AII )
296.LE..AND..EQ.
IF( AIIZERO INFO0 )
297 $ INFO = J + LL - JA + 1
298 IOFFD = IOFFD + LDA + 1
302.EQ.
IF( MYROWICURROW ) THEN
306.EQ.
IF( MYCOLICURCOL ) THEN
308 IOFFA = IOFFA + JB*LDA
310 ICURROW = MOD( ICURROW+1, NPROW )
311 ICURCOL = MOD( ICURCOL+1, NPCOL )
317 CALL SGSUM2D( ICTXT, 'columnwise
', COLCTOP, 1, NQ, SC( JJA ),
319 CALL SGSUM2D( ICTXT, 'rowwise
', ROWCTOP, NP, 1, SR( IIA ),
320 $ MAX( 1, NP ), -1, MYCOL )
322 CALL SGAMX2D( ICTXT, 'all
', ALLCTOP, 1, 1, AMAX, 1, IDUMM, IDUMM,
324 CALL SGAMN2D( ICTXT, 'all
', ALLCTOP, 1, 1, SMIN, 1, IDUMM, IDUMM,
327.LE.
IF( SMINZERO ) THEN
331 CALL IGAMN2D( ICTXT, 'all
', ALLCTOP, 1, 1, INFO, 1, II, JJ, -1,
340 DO 60 II = IIA, IIA+NP-1
341 SR( II ) = ONE / SQRT( SR( II ) )
344 DO 70 JJ = JJA, JJA+NQ-1
345 SC( JJ ) = ONE / SQRT( SC( JJ ) )
350 SCOND = SQRT( SMIN ) / SQRT( AMAX )
subroutine chk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, info)
subroutine descset(desc, m, n, mb, nb, irsrc, icsrc, ictxt, lld)
subroutine infog2l(grindx, gcindx, desc, nprow, npcol, myrow, mycol, lrindx, lcindx, rsrc, csrc)
subroutine pchk1mat(ma, mapos0, na, napos0, ia, ja, desca, descapos0, nextra, ex, expos, info)
subroutine pcpoequ(n, a, ia, ja, desca, sr, sc, scond, amax, info)