301 SUBROUTINE cposvx( 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
316 REAL BERR( * ), FERR( * ), RWORK( * ), S( * )
317 COMPLEX A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
318 $ WORK( * ), X( LDX, * )
325 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0 )
328 LOGICAL EQUIL, NOFACT, RCEQU
330 REAL AMAX, ANORM, BIGNUM, SCOND, SMAX, SMIN, SMLNUM
335 EXTERNAL LSAME, CLANHE, SLAMCH
348 nofact = lsame( fact,
'N' )
349 equil = lsame( fact,
'E' )
350 IF( nofact .OR. equil )
THEN
354 rcequ = lsame( equed,
'Y' )
355 smlnum = slamch(
'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(
'CPOSVX', -info )
415 CALL cpoequ( n, a, lda, s, scond, amax, infequ )
416 IF( infequ.EQ.0 )
THEN
420 CALL claqhe( 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 clacpy( uplo, n, n, a, lda, af, ldaf )
440 CALL cpotrf( uplo, n, af, ldaf, info )
452 anorm = clanhe(
'1', uplo, n, a, lda, rwork )
456 CALL cpocon( uplo, n, af, ldaf, anorm, rcond, work, rwork,
461 CALL clacpy(
'Full', n, nrhs, b, ldb, x, ldx )
462 CALL cpotrs( uplo, n, nrhs, af, ldaf, x, ldx, info )
467 CALL cporfs( 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.slamch(
'Epsilon' ) )
subroutine cporfs(uplo, n, nrhs, a, lda, af, ldaf, b, ldb, x, ldx, ferr, berr, work, rwork, info)
CPORFS
subroutine cposvx(fact, uplo, n, nrhs, a, lda, af, ldaf, equed, s, b, ldb, x, ldx, rcond, ferr, berr, work, rwork, info)
CPOSVX computes the solution to system of linear equations A * X = B for PO matrices