302 SUBROUTINE sposvx( FACT, UPLO, N, NRHS, A, LDA, AF, LDAF,
304 $ S, B, LDB, X, LDX, RCOND, FERR, BERR, WORK,
312 CHARACTER EQUED, FACT, UPLO
313 INTEGER INFO, LDA, LDAF, LDB, LDX, N, NRHS
318 REAL A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
319 $ BERR( * ), FERR( * ), S( * ), WORK( * ),
327 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0 )
330 LOGICAL EQUIL, NOFACT, RCEQU
332 REAL AMAX, ANORM, BIGNUM, SCOND, SMAX, SMIN, SMLNUM
337 EXTERNAL LSAME, SLAMCH, SLANSY
350 nofact = lsame( fact,
'N' )
351 equil = lsame( fact,
'E' )
352 IF( nofact .OR. equil )
THEN
356 rcequ = lsame( equed,
'Y' )
357 smlnum = slamch(
'Safe minimum' )
358 bignum = one / smlnum
363 IF( .NOT.nofact .AND.
365 $ .NOT.lsame( fact,
'F' ) )
368 ELSE IF( .NOT.lsame( uplo,
'U' ) .AND.
369 $ .NOT.lsame( uplo,
'L' ) )
372 ELSE IF( n.LT.0 )
THEN
374 ELSE IF( nrhs.LT.0 )
THEN
376 ELSE IF( lda.LT.max( 1, n ) )
THEN
378 ELSE IF( ldaf.LT.max( 1, n ) )
THEN
380 ELSE IF( lsame( fact,
'F' ) .AND. .NOT.
381 $ ( rcequ .OR. lsame( equed,
'N' ) ) )
THEN
388 smin = min( smin, s( j ) )
389 smax = max( smax, s( j ) )
391 IF( smin.LE.zero )
THEN
393 ELSE IF( n.GT.0 )
THEN
394 scond = max( smin, smlnum ) / min( smax, bignum )
400 IF( ldb.LT.max( 1, n ) )
THEN
402 ELSE IF( ldx.LT.max( 1, n ) )
THEN
409 CALL xerbla(
'SPOSVX', -info )
417 CALL spoequ( n, a, lda, s, scond, amax, infequ )
418 IF( infequ.EQ.0 )
THEN
422 CALL slaqsy( uplo, n, a, lda, s, scond, amax, equed )
423 rcequ = lsame( equed,
'Y' )
432 b( i, j ) = s( i )*b( i, j )
437 IF( nofact .OR. equil )
THEN
441 CALL slacpy( uplo, n, n, a, lda, af, ldaf )
442 CALL spotrf( uplo, n, af, ldaf, info )
454 anorm = slansy(
'1', uplo, n, a, lda, work )
458 CALL spocon( uplo, n, af, ldaf, anorm, rcond, work, iwork,
463 CALL slacpy(
'Full', n, nrhs, b, ldb, x, ldx )
464 CALL spotrs( uplo, n, nrhs, af, ldaf, x, ldx, info )
469 CALL sporfs( uplo, n, nrhs, a, lda, af, ldaf, b, ldb, x, ldx,
470 $ ferr, berr, work, iwork, info )
478 x( i, j ) = s( i )*x( i, j )
482 ferr( j ) = ferr( j ) / scond
488 IF( rcond.LT.slamch(
'Epsilon' ) )
subroutine sporfs(uplo, n, nrhs, a, lda, af, ldaf, b, ldb, x, ldx, ferr, berr, work, iwork, info)
SPORFS
subroutine sposvx(fact, uplo, n, nrhs, a, lda, af, ldaf, equed, s, b, ldb, x, ldx, rcond, ferr, berr, work, iwork, info)
SPOSVX computes the solution to system of linear equations A * X = B for PO matrices