311 SUBROUTINE sppsvx( FACT, UPLO, N, NRHS, AP, AFP, EQUED, S, B, LDB,
312 $ X, LDX, RCOND, FERR, BERR, WORK, IWORK, INFO )
320 CHARACTER EQUED, FACT, UPLO
321 INTEGER INFO, LDB, LDX, N, NRHS
326 REAL AFP( * ), AP( * ), B( LDB, * ), BERR( * ),
327 $ ferr( * ), s( * ), work( * ), x( ldx, * )
334 parameter( zero = 0.0e+0, one = 1.0e+0 )
337 LOGICAL EQUIL, NOFACT, RCEQU
339 REAL AMAX, ANORM, BIGNUM, SCOND, SMAX, SMIN, SMLNUM
344 EXTERNAL lsame, slamch, slansp
356 nofact = lsame( fact,
'N' )
357 equil = lsame( fact,
'E' )
358 IF( nofact .OR. equil )
THEN
362 rcequ = lsame( equed,
'Y' )
363 smlnum = slamch(
'Safe minimum' )
364 bignum = one / smlnum
369 IF( .NOT.nofact .AND. .NOT.equil .AND. .NOT.lsame( fact,
'F' ) )
372 ELSE IF( .NOT.lsame( uplo,
'U' ) .AND. .NOT.lsame( uplo,
'L' ) )
375 ELSE IF( n.LT.0 )
THEN
377 ELSE IF( nrhs.LT.0 )
THEN
379 ELSE IF( lsame( fact,
'F' ) .AND. .NOT.
380 $ ( rcequ .OR. lsame( equed,
'N' ) ) )
THEN
387 smin = min( smin, s( j ) )
388 smax = max( smax, s( j ) )
390 IF( smin.LE.zero )
THEN
392 ELSE IF( n.GT.0 )
THEN
393 scond = max( smin, smlnum ) / min( smax, bignum )
399 IF( ldb.LT.max( 1, n ) )
THEN
401 ELSE IF( ldx.LT.max( 1, n ) )
THEN
408 CALL xerbla(
'SPPSVX', -info )
416 CALL sppequ( uplo, n, ap, s, scond, amax, infequ )
417 IF( infequ.EQ.0 )
THEN
421 CALL slaqsp( uplo, n, ap, s, scond, amax, equed )
422 rcequ = lsame( equed,
'Y' )
431 b( i, j ) = s( i )*b( i, j )
436 IF( nofact .OR. equil )
THEN
440 CALL scopy( n*( n+1 ) / 2, ap, 1, afp, 1 )
441 CALL spptrf( uplo, n, afp, info )
453 anorm = slansp(
'I', uplo, n, ap, work )
457 CALL sppcon( uplo, n, afp, anorm, rcond, work, iwork, info )
461 CALL slacpy(
'Full', n, nrhs, b, ldb, x, ldx )
462 CALL spptrs( uplo, n, nrhs, afp, x, ldx, info )
467 CALL spprfs( uplo, n, nrhs, ap, afp, b, ldb, x, ldx, ferr, berr,
468 $ work, iwork, info )
476 x( i, j ) = s( i )*x( i, j )
480 ferr( j ) = ferr( j ) / scond
486 IF( rcond.LT.slamch(
'Epsilon' ) )