301 SUBROUTINE zposvx( FACT, UPLO, N, NRHS, A, LDA, AF, LDAF,
303 $ S, B, LDB, X, LDX, RCOND, FERR, BERR, WORK,
311 CHARACTER EQUED, FACT, UPLO
312 INTEGER INFO, LDA, LDAF, LDB, LDX, N, NRHS
313 DOUBLE PRECISION RCOND
316 DOUBLE PRECISION BERR( * ), FERR( * ), RWORK( * ), S( * )
317 COMPLEX*16 A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
318 $ WORK( * ), X( LDX, * )
324 DOUBLE PRECISION ZERO, ONE
325 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
328 LOGICAL EQUIL, NOFACT, RCEQU
330 DOUBLE PRECISION AMAX, ANORM, BIGNUM, SCOND, SMAX, SMIN, SMLNUM
334 DOUBLE PRECISION DLAMCH, ZLANHE
335 EXTERNAL LSAME, DLAMCH, ZLANHE
348 nofact = lsame( fact,
'N' )
349 equil = lsame( fact,
'E' )
350 IF( nofact .OR. equil )
THEN
354 rcequ = lsame( equed,
'Y' )
355 smlnum = dlamch(
'Safe minimum' )
356 bignum = one / smlnum
361 IF( .NOT.nofact .AND.
363 $ .NOT.lsame( fact,
'F' ) )
366 ELSE IF( .NOT.lsame( uplo,
'U' ) .AND.
367 $ .NOT.lsame( uplo,
'L' ) )
370 ELSE IF( n.LT.0 )
THEN
372 ELSE IF( nrhs.LT.0 )
THEN
374 ELSE IF( lda.LT.max( 1, n ) )
THEN
376 ELSE IF( ldaf.LT.max( 1, n ) )
THEN
378 ELSE IF( lsame( fact,
'F' ) .AND. .NOT.
379 $ ( rcequ .OR. lsame( equed,
'N' ) ) )
THEN
386 smin = min( smin, s( j ) )
387 smax = max( smax, s( j ) )
389 IF( smin.LE.zero )
THEN
391 ELSE IF( n.GT.0 )
THEN
392 scond = max( smin, smlnum ) / min( smax, bignum )
398 IF( ldb.LT.max( 1, n ) )
THEN
400 ELSE IF( ldx.LT.max( 1, n ) )
THEN
407 CALL xerbla(
'ZPOSVX', -info )
415 CALL zpoequ( n, a, lda, s, scond, amax, infequ )
416 IF( infequ.EQ.0 )
THEN
420 CALL zlaqhe( uplo, n, a, lda, s, scond, amax, equed )
421 rcequ = lsame( equed,
'Y' )
430 b( i, j ) = s( i )*b( i, j )
435 IF( nofact .OR. equil )
THEN
439 CALL zlacpy( uplo, n, n, a, lda, af, ldaf )
440 CALL zpotrf( uplo, n, af, ldaf, info )
452 anorm = zlanhe(
'1', uplo, n, a, lda, rwork )
456 CALL zpocon( uplo, n, af, ldaf, anorm, rcond, work, rwork,
461 CALL zlacpy(
'Full', n, nrhs, b, ldb, x, ldx )
462 CALL zpotrs( uplo, n, nrhs, af, ldaf, x, ldx, info )
467 CALL zporfs( uplo, n, nrhs, a, lda, af, ldaf, b, ldb, x, ldx,
468 $ ferr, berr, work, rwork, info )
476 x( i, j ) = s( i )*x( i, j )
480 ferr( j ) = ferr( j ) / scond
486 IF( rcond.LT.dlamch(
'Epsilon' ) )
subroutine zporfs(uplo, n, nrhs, a, lda, af, ldaf, b, ldb, x, ldx, ferr, berr, work, rwork, info)
ZPORFS
subroutine zposvx(fact, uplo, n, nrhs, a, lda, af, ldaf, equed, s, b, ldb, x, ldx, rcond, ferr, berr, work, rwork, info)
ZPOSVX computes the solution to system of linear equations A * X = B for PO matrices