276 SUBROUTINE dspsvx( FACT, UPLO, N, NRHS, AP, AFP, IPIV, B, LDB, X,
277 $ LDX, RCOND, FERR, BERR, WORK, IWORK, INFO )
286 INTEGER INFO, LDB, LDX, N, NRHS
287 DOUBLE PRECISION RCOND
290 INTEGER IPIV( * ), IWORK( * )
291 DOUBLE PRECISION AFP( * ), AP( * ), B( LDB, * ), BERR( * ),
292 $ ferr( * ), work( * ), x( ldx, * )
298 DOUBLE PRECISION ZERO
299 parameter( zero = 0.0d+0 )
303 DOUBLE PRECISION ANORM
307 DOUBLE PRECISION DLAMCH, DLANSP
308 EXTERNAL lsame, dlamch, dlansp
322 nofact = lsame( fact,
'N' )
323 IF( .NOT.nofact .AND. .NOT.lsame( fact,
'F' ) )
THEN
325 ELSE IF( .NOT.lsame( uplo,
'U' ) .AND. .NOT.lsame( uplo,
'L' ) )
328 ELSE IF( n.LT.0 )
THEN
330 ELSE IF( nrhs.LT.0 )
THEN
332 ELSE IF( ldb.LT.max( 1, n ) )
THEN
334 ELSE IF( ldx.LT.max( 1, n ) )
THEN
338 CALL xerbla(
'DSPSVX', -info )
346 CALL dcopy( n*( n+1 ) / 2, ap, 1, afp, 1 )
347 CALL dsptrf( uplo, n, afp, ipiv, info )
359 anorm = dlansp(
'I', uplo, n, ap, work )
363 CALL dspcon( uplo, n, afp, ipiv, anorm, rcond, work, iwork, info )
367 CALL dlacpy(
'Full', n, nrhs, b, ldb, x, ldx )
368 CALL dsptrs( uplo, n, nrhs, afp, ipiv, x, ldx, info )
373 CALL dsprfs( uplo, n, nrhs, ap, afp, ipiv, b, ldb, x, ldx, ferr,
374 $ berr, work, iwork, info )
378 IF( rcond.LT.dlamch(
'Epsilon' ) )