311 SUBROUTINE dppsvx( 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
322 DOUBLE PRECISION RCOND
326 DOUBLE PRECISION AFP( * ), AP( * ), B( ldb, * ), BERR( * ),
327 $ ferr( * ), s( * ), work( * ), x( ldx, * )
333 DOUBLE PRECISION ZERO, ONE
334 parameter( zero = 0.0d+0, one = 1.0d+0 )
337 LOGICAL EQUIL, NOFACT, RCEQU
339 DOUBLE PRECISION AMAX, ANORM, BIGNUM, SCOND, SMAX, SMIN, SMLNUM
343 DOUBLE PRECISION DLAMCH, DLANSP
344 EXTERNAL lsame, dlamch, dlansp
356 nofact = lsame( fact,
'N' )
357 equil = lsame( fact,
'E' )
358 IF( nofact .OR. equil )
THEN 362 rcequ = lsame( equed,
'Y' )
363 smlnum = dlamch(
'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(
'DPPSVX', -info )
416 CALL dppequ( uplo, n, ap, s, scond, amax, infequ )
417 IF( infequ.EQ.0 )
THEN 421 CALL dlaqsp( 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 dcopy( n*( n+1 ) / 2, ap, 1, afp, 1 )
441 CALL dpptrf( uplo, n, afp, info )
453 anorm = dlansp(
'I', uplo, n, ap, work )
457 CALL dppcon( uplo, n, afp, anorm, rcond, work, iwork, info )
461 CALL dlacpy(
'Full', n, nrhs, b, ldb, x, ldx )
462 CALL dpptrs( uplo, n, nrhs, afp, x, ldx, info )
467 CALL dpprfs( 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.dlamch(
'Epsilon' ) )
subroutine dlacpy(UPLO, M, N, A, LDA, B, LDB)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dcopy(N, DX, INCX, DY, INCY)
DCOPY
subroutine dppcon(UPLO, N, AP, ANORM, RCOND, WORK, IWORK, INFO)
DPPCON
subroutine dpptrf(UPLO, N, AP, INFO)
DPPTRF
subroutine dppsvx(FACT, UPLO, N, NRHS, AP, AFP, EQUED, S, B, LDB, X, LDX, RCOND, FERR, BERR, WORK, IWORK, INFO)
DPPSVX computes the solution to system of linear equations A * X = B for OTHER matrices ...
subroutine dlaqsp(UPLO, N, AP, S, SCOND, AMAX, EQUED)
DLAQSP scales a symmetric/Hermitian matrix in packed storage, using scaling factors computed by sppeq...
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dpptrs(UPLO, N, NRHS, AP, B, LDB, INFO)
DPPTRS
subroutine dppequ(UPLO, N, AP, S, SCOND, AMAX, INFO)
DPPEQU
subroutine dpprfs(UPLO, N, NRHS, AP, AFP, B, LDB, X, LDX, FERR, BERR, WORK, IWORK, INFO)
DPPRFS