302 SUBROUTINE dposvx( 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
314 DOUBLE PRECISION RCOND
318 DOUBLE PRECISION A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
319 $ BERR( * ), FERR( * ), S( * ), WORK( * ),
326 DOUBLE PRECISION ZERO, ONE
327 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
330 LOGICAL EQUIL, NOFACT, RCEQU
332 DOUBLE PRECISION AMAX, ANORM, BIGNUM, SCOND, SMAX, SMIN, SMLNUM
336 DOUBLE PRECISION DLAMCH, DLANSY
337 EXTERNAL LSAME, DLAMCH, DLANSY
350 nofact = lsame( fact,
'N' )
351 equil = lsame( fact,
'E' )
352 IF( nofact .OR. equil )
THEN
356 rcequ = lsame( equed,
'Y' )
357 smlnum = dlamch(
'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(
'DPOSVX', -info )
417 CALL dpoequ( n, a, lda, s, scond, amax, infequ )
418 IF( infequ.EQ.0 )
THEN
422 CALL dlaqsy( 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 dlacpy( uplo, n, n, a, lda, af, ldaf )
442 CALL dpotrf( uplo, n, af, ldaf, info )
454 anorm = dlansy(
'1', uplo, n, a, lda, work )
458 CALL dpocon( uplo, n, af, ldaf, anorm, rcond, work, iwork,
463 CALL dlacpy(
'Full', n, nrhs, b, ldb, x, ldx )
464 CALL dpotrs( uplo, n, nrhs, af, ldaf, x, ldx, info )
469 CALL dporfs( 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.dlamch(
'Epsilon' ) )
subroutine dporfs(uplo, n, nrhs, a, lda, af, ldaf, b, ldb, x, ldx, ferr, berr, work, iwork, info)
DPORFS
subroutine dposvx(fact, uplo, n, nrhs, a, lda, af, ldaf, equed, s, b, ldb, x, ldx, rcond, ferr, berr, work, iwork, info)
DPOSVX computes the solution to system of linear equations A * X = B for PO matrices