1 SUBROUTINE pcpocon( UPLO, N, A, IA, JA, DESCA, ANORM, RCOND, WORK,
2 $ LWORK, RWORK, LRWORK, INFO )
11 INTEGER IA, INFO, JA, LRWORK, LWORK, N
17 COMPLEX A( * ), WORK( * )
170 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
171 $ lld_, mb_, m_, nb_, n_, rsrc_
172 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
173 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
174 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
176 parameter( one = 1.0e+0, zero = 0.0e+0 )
179 LOGICAL LQUERY, UPPER
180 CHARACTER CBTOP, COLCTOP, NORMIN, ROWCTOP
181 INTEGER IACOL, IAROW, ICOFF, ICTXT, IIA, IPNL, IPNU,
182 $ ipv, ipw, ipx, iroff, iv, ix, ixx, jja, jv,
183 $ jx, kase, lrwmin, lwmin, mycol, myrow, np,
184 $ npcol, nprow, npmod, nq, nqmod
185 REAL AINVNM, SCALE, SL, SU, SMLNUM
189 INTEGER DESCV( DLEN_ ), DESCX( DLEN_ ), IDUM1( 3 ),
200 INTEGER ICEIL, INDXG2P, NUMROC
202 EXTERNAL iceil, indxg2p, lsame, numroc, pslamch
205 INTRINSIC abs, aimag, ichar,
max, mod, real
211 cabs1( zdum ) = abs( real( zdum ) ) + abs( aimag( zdum ) )
217 ictxt = desca( ctxt_ )
223 IF( nprow.EQ.-1 )
THEN
226 CALL chk1mat( n, 2, n, 2, ia, ja, desca, 6, info )
228 upper = lsame( uplo,
'U' )
229 iarow = indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
231 iacol = indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
233 npmod = numroc( n + mod( ia-1, desca( mb_ ) ), desca( mb_ ),
234 $ myrow, iarow, nprow )
235 nqmod = numroc( n + mod( ja-1, desca( nb_ ) ), desca( nb_ ),
236 $ mycol, iacol, npcol )
238 $
max( 2,
max( desca( nb_ )*
239 $
max( 1, iceil( nprow-1, npcol ) ), nqmod +
241 $
max( 1, iceil( npcol-1, nprow ) ) ) )
242 work( 1 ) = real( lwmin )
244 rwork( 1 ) = real( lrwmin )
245 lquery = ( lwork.EQ.-1 .OR. lrwork.EQ.-1 )
247 IF( .NOT.upper .AND. .NOT.lsame( uplo, 'l
' ) ) THEN
249.LT.
ELSE IF( ANORMZERO ) THEN
251.LT..AND..NOT.
ELSE IF( LWORKLWMIN LQUERY ) THEN
253.LT..AND..NOT.
ELSE IF( LRWORKLRWMIN LQUERY ) THEN
259 IDUM1( 1 ) = ICHAR( 'u
' )
261 IDUM1( 1 ) = ICHAR( 'l
' )
264.EQ.
IF( LWORK-1 ) THEN
270.EQ.
IF( LRWORK-1 ) THEN
276 CALL PCHK1MAT( N, 2, N, 2, IA, JA, DESCA, 6, 3, IDUM1, IDUM2,
281 CALL PXERBLA( ICTXT, 'pcpocon', -INFO )
283 ELSE IF( LQUERY ) THEN
293.EQ.
ELSE IF( ANORMZERO ) THEN
295.EQ.
ELSE IF( N1 ) THEN
300 CALL PB_TOPGET( ICTXT, 'combine
', 'columnwise
', COLCTOP )
301 CALL PB_TOPGET( ICTXT, 'combine
', 'rowwise
', ROWCTOP )
302 CALL PB_TOPSET( ICTXT, 'combine
', 'columnwise
', '1-tree
' )
303 CALL PB_TOPSET( ICTXT, 'combine
', 'rowwise
', '1-tree
' )
305 SMLNUM = PSLAMCH( ICTXT, 'safe minimum
' )
306 IROFF = MOD( IA-1, DESCA( MB_ ) )
307 ICOFF = MOD( JA-1, DESCA( NB_ ) )
308 CALL INFOG2L( IA, JA, DESCA, NPROW, NPCOL, MYROW, MYCOL, IIA, JJA,
310 NP = NUMROC( N+IROFF, DESCA( MB_ ), MYROW, IAROW, NPROW )
311 NQ = NUMROC( N+ICOFF, DESCA( NB_ ), MYCOL, IACOL, NPCOL )
323 CALL DESCSET( DESCV, N+IROFF, 1, DESCA( MB_ ), 1, IAROW, MYCOL,
324 $ ICTXT, MAX( 1, NP ) )
325 CALL DESCSET( DESCX, N+IROFF, 1, DESCA( MB_ ), 1, IAROW, MYCOL,
326 $ ICTXT, MAX( 1, NP ) )
335 CALL PCLACON( N, WORK( IPV ), IV, JV, DESCV, WORK( IPX ), IX, JX,
336 $ DESCX, AINVNM, KASE )
342 DESCX( CSRC_ ) = IACOL
343 CALL PCLATRS( 'upper
', 'conjugate transpose
', 'non-unit
',
344 $ NORMIN, N, A, IA, JA, DESCA, WORK( IPX ),
345 $ IX, JX, DESCX, SL, RWORK( IPNL ),
347 DESCX( CSRC_ ) = MYCOL
352 DESCX( CSRC_ ) = IACOL
353 CALL PCLATRS( 'upper
', 'no transpose
', 'non-unit
', NORMIN,
354 $ N, A, IA, JA, DESCA, WORK( IPX ), IX, JX,
355 $ DESCX, SU, RWORK( IPNU ), WORK( IPW ) )
356 DESCX( CSRC_ ) = MYCOL
361 DESCX( CSRC_ ) = IACOL
362 CALL PCLATRS( 'lower
', 'no transpose
', 'non-unit
', NORMIN,
363 $ N, A, IA, JA, DESCA, WORK( IPX ), IX, JX,
364 $ DESCX, SL, RWORK( IPNL ), WORK( IPW ) )
365 DESCX( CSRC_ ) = MYCOL
370 DESCX( CSRC_ ) = IACOL
371 CALL PCLATRS( 'lower
', 'conjugate transpose
', 'non-unit
',
372 $ NORMIN, N, A, IA, JA, DESCA, WORK( IPX ),
373 $ IX, JX, DESCX, SU, RWORK( IPNU ),
375 DESCX( CSRC_ ) = MYCOL
381.NE.
IF( SCALEONE ) THEN
382 CALL PCAMAX( N, WMAX, IXX, WORK( IPX ), IX, JX, DESCX, 1 )
383.EQ..AND..EQ.
IF( DESCX( M_ )1 N1 ) THEN
384 CALL PB_TOPGET( ICTXT, 'broadcast
', 'columnwise
', CBTOP )
385.EQ.
IF( MYROWIAROW ) THEN
386 CALL CGEBS2D( ICTXT, 'column
', CBTOP, 1, 1, WMAX, 1 )
388 CALL CGEBR2D( ICTXT, 'column
', CBTOP, 1, 1, WMAX, 1,
392.LT..OR..EQ.
IF( SCALECABS1( WMAX )*SMLNUM SCALEZERO )
394 CALL PCSRSCL( N, SCALE, WORK( IPX ), IX, JX, DESCX, 1 )
402 $ RCOND = ( ONE / AINVNM ) / ANORM
406 CALL PB_TOPSET( ICTXT, 'combine
', 'columnwise
', COLCTOP )
407 CALL PB_TOPSET( ICTXT, 'combine',
'Rowwise', rowctop )
subroutine pclatrs(uplo, trans, diag, normin, n, a, ia, ja, desca, x, ix, jx, descx, scale, cnorm, work)