1 SUBROUTINE pcgecon( NORM, 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( * )
176 INTEGER BLOCK_CYCLIC_2D, , CTXT_, DLEN_, DTYPE_,
177 $ lld_, mb_, m_, nb_, n_, rsrc_
178 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
179 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_
182 parameter( one = 1.0e+0, zero =
186 CHARACTER CBTOP, COLCTOP, NORMIN, ROWCTOP
187 INTEGER IACOL, IAROW, ICOFF, ICTXT, IIA, IPNL, IPNU,
188 $ ipv, ipw, ipx, iroff, iv, ix, ixx
189 $ kase, kase1, lrwmin, lwmin, mycol, myrow, np,
191 REAL AINVNM, SCALE, SL, SMLNUM, SU
195 INTEGER DESCV( DLEN_ ), DESCX( DLEN_ ), IDUM1( 3 ),
206 INTEGER ICEIL, INDXG2P, NUMROC
208 EXTERNAL iceil, indxg2p, lsame, numroc, pslamch
211 INTRINSIC abs, aimag, ichar,
max, mod, real
223 ictxt = desca( ctxt_ )
229 IF( nprow.EQ.-1 )
THEN
230 info = -( 600 + ctxt_ )
232 CALL chk1mat( n, 2, n, 2, ia, ja, desca, 6, info )
234 onenrm = norm.EQ.
'1' .OR. lsame( norm,
'O' )
235 iarow = indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
237 iacol = indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
239 npmod = numroc( n + mod( ia-1, desca( mb_ ) ), desca( mb_ ),
241 nqmod = numroc( n + mod( ja-1, desca( nb_ ) ), desca( nb_ ),
242 $ mycol, iacol, npcol )
244 $
max( 2,
max( desca( nb_ )*
245 $
max( 1, iceil( nprow-1, npcol ) ), nqmod +
247 $
max( 1, iceil( npcol-1, nprow ) ) ) )
248 work( 1 ) = real( lwmin )
249 lrwmin =
max( 1, 2*nqmod )
250 rwork( 1 ) = real( lrwmin )
251 lquery = ( lwork.EQ.-1 .OR. lrwork.EQ.-1 )
253 IF( .NOT.onenrm .AND. .NOT.lsame( norm,
'I' ) )
THEN
255 ELSE IF( anorm.LT.zero )
THEN
257 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
259 ELSE IF( lrwork.LT.lrwmin .AND. .NOT.lquery )
THEN
265 idum1( 1 ) = ichar(
'1' )
267 idum1( 1 ) = ichar(
'I' )
270 IF( lwork.EQ.-1 )
THEN
276 IF( lrwork.EQ.-1 )
THEN
282 CALL pchk1mat( n, 2, n, 2, ia, ja, desca, 6
287 CALL pxerbla( ictxt,
'PCGECON', -info )
289 ELSE IF( lquery )
THEN
299 ELSE IF( anorm.EQ.zero )
THEN
301 ELSE IF( n.EQ.1 )
THEN
306 CALL pb_topget( ictxt,
'Combine',
'Columnwise', colctop )
307 CALL pb_topget( ictxt,
'Combine',
'Rowwise', rowctop )
308 CALL pb_topset( ictxt,
'Combine',
'Columnwise''1-tree'
309 CALL pb_topset( ictxt,
'Combine',
'Rowwise',
'1-tree' )
311 smlnum = pslamch( ictxt,
'Safe minimum' )
312 iroff = mod( ia-1, desca( mb_ ) )
313 icoff = mod( ja-1, desca( nb_ ) )
314 CALL infog2l( ia, ja, desca, nprow, npcol, myrow, mycol, iia, jja,
316 np = numroc( n+iroff, desca( mb_ ), myrow, iarow, nprow )
317 nq = numroc( n+icoff, desca( nb_ ), mycol, iacol, npcol )
329 CALL descset( descv, n+iroff, 1, desca( mb_ ), 1, iarow, mycol,
330 $ ictxt,
max( 1, np ) )
331 CALL descset( descx, n+iroff, 1, desca( mb_ ), 1, iarow, mycol,
332 $ ictxt,
max( 1, np ) )
346 CALL pclacon( n, work( ipv ), iv, jv, descv, work( ipx ), ix, jx,
347 $ descx, ainvnm, kase )
349 IF( kase.EQ.kase1 )
THEN
353 descx( csrc_ ) = iacol
354 CALL pclatrs(
'Lower',
'No transpose',
'Unit', normin,
355 $ n, a, ia, ja, desca, work( ipx ), ix, jx,
356 $ descx, sl, rwork( ipnl ), work( ipw ) )
357 descx( csrc_ ) = mycol
361 descx( csrc_ ) = iacol
362 CALL pclatrs(
'Upper',
'No transpose',
'Non-unit', normin,
363 $ n, a, ia, ja, desca, work( ipx ), ix, jx,
364 $ descx, su, rwork( ipnu ), work( ipw ) )
365 descx( csrc_ ) = mycol
370 descx( csrc_ ) = iacol
371 CALL pclatrs(
'Upper',
'Conjugate transpose', 'non-unit
',
372 $ NORMIN, N, A, IA, JA, DESCA, WORK( IPX ), IX,
373 $ JX, DESCX, SU, RWORK( IPNU ), WORK( IPW ) )
374 DESCX( CSRC_ ) = MYCOL
378 DESCX( CSRC_ ) = IACOL
379 CALL PCLATRS( 'lower
', 'conjugate transpose
', 'unit
',
380 $ NORMIN, N, A, IA, JA, DESCA, WORK( IPX ),
381 $ IX, JX, DESCX, SL, RWORK( IPNL ),
383 DESCX( CSRC_ ) = MYCOL
390.NE.
IF( SCALEONE ) THEN
391 CALL PCAMAX( N, WMAX, IXX, WORK( IPX ), IX, JX, DESCX, 1 )
392.EQ..AND..EQ.
IF( DESCX( M_ )1 N1 ) THEN
393 CALL PB_TOPGET( ICTXT, 'broadcast
', 'columnwise
', CBTOP )
394.EQ.
IF( MYROWIAROW ) THEN
395 CALL CGEBS2D( ICTXT, 'column
', CBTOP, 1, 1, WMAX, 1 )
397 CALL CGEBR2D( ICTXT, 'column
', CBTOP, 1, 1, WMAX, 1,
401.LT..OR..EQ.
IF( SCALECABS1( WMAX )*SMLNUM SCALEZERO )
403 CALL PCSRSCL( N, SCALE, WORK( IPX ), IX, JX, DESCX, 1 )
411 $ RCOND = ( ONE / AINVNM ) / ANORM
415 CALL PB_TOPSET( ICTXT, 'combine
', 'columnwise
', COLCTOP )
416 CALL PB_TOPSET( ICTXT, 'combine
', 'rowwise
', ROWCTOP )