1 SUBROUTINE pzgecon( NORM, N, A, IA, JA, DESCA, ANORM, RCOND, WORK,
2 $ LWORK, RWORK, LRWORK, INFO )
11 INTEGER IA, INFO, JA, LRWORK, LWORK, N
12 DOUBLE PRECISION ANORM, RCOND
16 DOUBLE PRECISION RWORK( * )
17 COMPLEX*16 A( * ), WORK( * )
176 INTEGER BLOCK_CYCLIC_2D, CSRC_, 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_ = 5, nb_ = 6,
180 $ rsrc_ = 7, csrc_ = 8, lld_ = 9 )
181 DOUBLE PRECISION ONE, ZERO
182 parameter( one = 1.0d+0, zero = 0.0d+0 )
186 CHARACTER CBTOP, COLCTOP, NORMIN, ROWCTOP
187 INTEGER IACOL, IAROW, ICOFF, ICTXT, IIA, IPNL, IPNU,
188 $ ipv, ipw, ipx, iroff, iv, ix, ixx, jja, jv, jx,
189 $ kase, kase1, lrwmin, lwmin, mycol, myrow, np,
190 $ npcol, npmod, nprow, nq, nqmod
191 DOUBLE PRECISION AINVNM, SCALE, SL, SMLNUM, SU
192 COMPLEX*16 WMAX, ZDUM
195 INTEGER DESCV( DLEN_ ), DESCX( DLEN_ ), IDUM1( 3 ),
206 INTEGER ICEIL, , NUMROC
207 DOUBLE PRECISION PDLAMCH
208 EXTERNAL iceil,
indxg2p, lsame, numroc, pdlamch
211 INTRINSIC abs, dble, dimag, ichar,
max, mod
214 DOUBLE PRECISION CABS1
217 cabs1( zdum ) = abs( dble( zdum ) ) + abs( dimag( zdum ) )
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' )
237 iacol =
indxg2p( ja, desca( nb_ ), mycol, desca( csrc_ ),
239 npmod = numroc( n + mod( ia-1, desca( mb_ ) ), desca( mb_ ),
240 $ myrow, iarow, nprow )
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 ) = dble( lwmin )
249 lrwmin =
max( 1, 2*nqmod )
250 rwork( 1 ) = dble( lrwmin )
251 lquery = ( lwork.EQ.-1 .OR. lrwork.EQ.-1 )
253 IF( .NOT.onenrm .AND. .NOT.lsame( norm, 'i
' ) ) THEN
255.LT.
ELSE IF( ANORMZERO ) THEN
257.LT..AND..NOT.
ELSE IF( LWORKLWMIN LQUERY ) THEN
259.LT..AND..NOT.
ELSE IF( LRWORKLRWMIN LQUERY ) THEN
265 IDUM1( 1 ) = ICHAR( '1
' )
267 IDUM1( 1 ) = ICHAR( 'i
' )
270.EQ.
IF( LWORK-1 ) THEN
276.EQ.
IF( LRWORK-1 ) THEN
282 CALL PCHK1MAT( N, 2, N, 2, IA, JA, DESCA, 6, 3, IDUM1, IDUM2,
287 CALL PXERBLA( ICTXT, 'pzgecon', -INFO )
289 ELSE IF( LQUERY ) THEN
299.EQ.
ELSE IF( ANORMZERO ) THEN
301.EQ.
ELSE IF( N1 ) 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 = PDLAMCH( 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 PZLACON( N, WORK( IPV ), IV, JV, DESCV, WORK( IPX ), IX, JX,
347 $ DESCX, AINVNM, KASE )
349.EQ.
IF( KASEKASE1 ) THEN
353 DESCX( CSRC_ ) = IACOL
354 CALL PZLATRS( '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 PZLATRS( '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 PZLATRS( '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 PZLATRS( '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 PZAMAX( 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 ZGEBS2D( ICTXT, 'column
', CBTOP, 1, 1, WMAX, 1 )
397 CALL ZGEBR2D( ICTXT, 'column
', CBTOP, 1, 1, WMAX, 1,
401.LT..OR..EQ.
IF( SCALECABS1( WMAX )*SMLNUM SCALEZERO )
403 CALL PZDRSCL( 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 )
subroutine pzlatrs(uplo, trans, diag, normin, n, a, ia, ja, desca, x, ix, jx, descx, scale, cnorm, work)