1 SUBROUTINE pztrcon( NORM, UPLO, DIAG, N, A, IA, JA, DESCA, RCOND,
2 $ WORK, LWORK, RWORK, LRWORK, INFO )
11 CHARACTER DIAG, NORM, UPLO
12 INTEGER IA, JA, INFO, LRWORK, LWORK, N
13 DOUBLE PRECISION RCOND
17 DOUBLE PRECISION RWORK( * )
18 COMPLEX*16 A( * ), WORK( * )
182 INTEGER BLOCK_CYCLIC_2D, CSRC_, CTXT_, DLEN_, DTYPE_,
183 $ lld_, mb_, m_, nb_, n_, rsrc_
184 parameter( block_cyclic_2d = 1, dlen_ = 9, dtype_ = 1,
185 $ ctxt_ = 2, m_ = 3, n_ = 4, mb_ = 5, nb_ = 6,
186 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
187 DOUBLE PRECISION ONE, ZERO
188 parameter( one = 1.0d+0, zero = 0.0d+0 )
191 LOGICAL LQUERY, NOUNIT, ONENRM, UPPER
192 CHARACTER CBTOP, COLCTOP, NORMIN, ROWCTOP
193 INTEGER IACOL, IAROW, , ICTXT, IIA, IPN, IPV, IPW,
194 $ ipx, iroff, iv, ix, ixx, jja, jv, jx, kase,
195 $ kase1, lrwmin, lwmin, mycol, myrow, np, npcol,
196 $ npmod, nprow, nqmod
197 DOUBLE PRECISION AINVNM, ANORM, SCALE, SMLNUM
198 COMPLEX*16 WMAX, ZDUM
201 INTEGER DESCV( DLEN_ ), DESCX( DLEN_ ), ( 5 ),
212 INTEGER , INDXG2P, NUMROC
213 DOUBLE PRECISION PDLAMCH, PZLANTR
214 EXTERNAL iceil, indxg2p, lsame, numroc, pdlamch,
218 INTRINSIC abs, dble, dimag, ichar,
max, mod
221 DOUBLE PRECISION CABS1
224 cabs1( zdum ) = abs( dble( zdum ) ) + abs( dimag( zdum ) )
230 ictxt = desca( ctxt_ )
236 IF( nprow.EQ.-1 )
THEN
237 info = -( 800 + ctxt_ )
239 CALL chk1mat( n, 4, n, 4, ia, ja, desca, 8, info )
241 upper = lsame( uplo,
'U' )
242 onenrm = norm.EQ.
'1' .OR. lsame( norm,
'O' )
243 nounit = lsame( diag,
'N' )
244 iarow = indxg2p( ia, desca( mb_ ), myrow, desca( rsrc_ ),
246 iacol = indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
248 npmod = numroc( n + mod( ia-1, desca( mb_ ) ), desca( mb_ ),
249 $ myrow, iarow, nprow )
250 nqmod = numroc( n + mod( ja-1, desca( nb_ ) ), desca( nb_ ),
251 $ mycol, iacol, npcol )
253 $
max( 2,
max( desca( nb_ )*
254 $
max( 1,
iceil( nprow-1, npcol ) ), nqmod +
256 $
max( 1,
iceil( npcol-1, nprow ) ) ) )
257 work( 1 ) = dble( lwmin )
259 rwork( 1 ) = dble( lrwmin )
260 lquery = ( lwork.EQ.-1 .OR. lrwork.EQ.-1 )
262 IF( .NOT.onenrm .AND. .NOT.lsame( norm,
'I' ) )
THEN
264 ELSE IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
266 ELSE IF( .NOT.nounit .AND. .NOT.lsame( diag,
'U' ) )
THEN
268 ELSE IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
270 ELSE IF( lrwork.LT.lrwmin .AND. .NOT.lquery )
THEN
276 idum1( 1 ) = ichar(
'1' )
278 idum1( 1 ) = ichar( 'i
' )
282 IDUM1( 2 ) = ICHAR( 'u
' )
284 IDUM1( 2 ) = ICHAR( 'l
' )
288 IDUM1( 3 ) = ICHAR( 'n
' )
290 IDUM1( 3 ) = ICHAR( 'u
' )
293.EQ.
IF( LWORK-1 ) THEN
299.EQ.
IF( LRWORK-1 ) THEN
305 CALL PCHK1MAT( N, 4, N, 4, IA, JA, DESCA, 8, 5, IDUM1, IDUM2,
310 CALL PXERBLA( ICTXT, 'pztrcon', -INFO )
312 ELSE IF( LQUERY ) THEN
323 CALL PB_TOPGET( ICTXT, 'combine
', 'columnwise
', COLCTOP )
324 CALL PB_TOPGET( ICTXT, 'combine
', 'rowwise
', ROWCTOP )
325 CALL PB_TOPSET( ICTXT, 'combine
', 'columnwise
', '1-tree
' )
326 CALL PB_TOPSET( ICTXT, 'combine
', 'rowwise
', '1-tree
' )
329 SMLNUM = PDLAMCH( ICTXT, 'safe minimum
' )*DBLE( MAX( 1, N ) )
330 CALL INFOG2L( IA, JA, DESCA, NPROW, NPCOL, MYROW, MYCOL, IIA, JJA,
332 IROFF = MOD( IA-1, DESCA( MB_ ) )
333 ICOFF = MOD( JA-1, DESCA( NB_ ) )
334 NP = NUMROC( N+IROFF, DESCA( MB_ ), MYROW, IAROW, NPROW )
345 CALL DESCSET( DESCV, N+IROFF, 1, DESCA( MB_ ), 1, IAROW, MYCOL,
346 $ ICTXT, MAX( 1, NP ) )
347 CALL DESCSET( DESCX, N+IROFF, 1, DESCA( MB_ ), 1, IAROW, MYCOL,
348 $ ICTXT, MAX( 1, NP ) )
352 ANORM = PZLANTR( NORM, UPLO, DIAG, N, N, A, IA, JA, DESCA, RWORK )
356.GT.
IF( ANORMZERO ) THEN
369 CALL PZLACON( N, WORK( IPV ), IV, JV, DESCV, WORK( IPX ),
370 $ IX, JX, DESCX, AINVNM, KASE )
372.EQ.
IF( KASEKASE1 ) THEN
376 DESCX( CSRC_ ) = IACOL
377 CALL PZLATRS( UPLO, 'no transpose
', DIAG, NORMIN,
378 $ N, A, IA, JA, DESCA, WORK( IPX ), IX, JX,
379 $ DESCX, SCALE, RWORK( IPN ), WORK( IPW ) )
380 DESCX( CSRC_ ) = MYCOL
385 DESCX( CSRC_ ) = IACOL
386 CALL PZLATRS( UPLO, 'conjugate transpose
', DIAG, NORMIN,
387 $ N, A, IA, JA, DESCA, WORK( IPX ), IX, JX,
388 $ DESCX, SCALE, RWORK( IPN ), WORK( IPW ) )
389 DESCX( CSRC_ ) = MYCOL
395.NE.
IF( SCALEONE ) THEN
396 CALL PZAMAX( N, WMAX, IXX, WORK( IPX ), IX, JX,
398.EQ..AND..EQ.
IF( DESCX( M_ )1 N1 ) THEN
399 CALL PB_TOPGET( ICTXT, 'broadcast
', 'columnwise
',
401.EQ.
IF( MYROWIAROW ) THEN
402 CALL ZGEBS2D( ICTXT, 'column
', CBTOP, 1, 1, WMAX,
405 CALL ZGEBR2D( ICTXT, 'column
', CBTOP, 1, 1, WMAX,
409.LT..OR..EQ.
IF( SCALECABS1( WMAX )*SMLNUM SCALEZERO )
411 CALL PZDRSCL( N, SCALE, WORK( IPX ), IX, JX, DESCX, 1 )
419 $ RCOND = ( ONE / ANORM ) / AINVNM
424 CALL PB_TOPSET( ICTXT, 'combine
', 'columnwise
', COLCTOP )
425 CALL PB_TOPSET( ICTXT, 'combine
', 'rowwise
', ROWCTOP )
subroutine pzlatrs(uplo, trans, diag, normin, n, a, ia, ja, desca, x, ix, jx, descx, scale, cnorm, work)