304 SUBROUTINE dposvx( FACT, UPLO, N, NRHS, A, LDA, AF, LDAF, EQUED,
305 $ S, B, LDB, X, LDX, RCOND, FERR, BERR, WORK,
313 CHARACTER EQUED, FACT, UPLO
314 INTEGER INFO, LDA, LDAF, LDB, LDX, N, NRHS
315 DOUBLE PRECISION RCOND
319 DOUBLE PRECISION A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
320 $ berr( * ), ferr( * ), s( * ), work( * ),
327 DOUBLE PRECISION ZERO, ONE
328 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
333DOUBLE PRECISION AMAX, ANORM, BIGNUM, SCOND, SMAX, SMIN, SMLNUM
337 DOUBLE PRECISION DLAMCH, DLANSY
338 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.NOT..AND..NOT..AND..NOT.
IF( NOFACT EQUIL LSAME( FACT, 'f
' ) )
366.NOT.
ELSE IF( LSAME( UPLO, 'u.AND..NOT.
' ) LSAME( UPLO, 'l
' ) )
369.LT.
ELSE IF( N0 ) THEN
371.LT.
ELSE IF( NRHS0 ) THEN
373.LT.
ELSE IF( LDAMAX( 1, N ) ) THEN
375.LT.
ELSE IF( LDAFMAX( 1, N ) ) THEN
377 ELSE IF( LSAME( FACT, 'f.AND..NOT.
' )
378.OR.
$ ( RCEQU LSAME( EQUED, 'n
' ) ) ) THEN
385 SMIN = MIN( SMIN, S( J ) )
386 SMAX = MAX( SMAX, S( J ) )
388.LE.
IF( SMINZERO ) THEN
390.GT.
ELSE IF( N0 ) THEN
391 SCOND = MAX( SMIN, SMLNUM ) / MIN( SMAX, BIGNUM )
397.LT.
IF( LDBMAX( 1, N ) ) THEN
399.LT.
ELSE IF( LDXMAX( 1, N ) ) THEN
406 CALL XERBLA( 'dposvx', -INFO )
414 CALL DPOEQU( N, A, LDA, S, SCOND, AMAX, INFEQU )
415.EQ.
IF( INFEQU0 ) THEN
419 CALL DLAQSY( UPLO, N, A, LDA, S, SCOND, AMAX, EQUED )
420 RCEQU = LSAME( EQUED, 'y
' )
429 B( I, J ) = S( I )*B( I, J )
434.OR.
IF( NOFACT EQUIL ) THEN
438 CALL DLACPY( UPLO, N, N, A, LDA, AF, LDAF )
439 CALL DPOTRF( UPLO, N, AF, LDAF, INFO )
451 ANORM = DLANSY( '1
', UPLO, N, A, LDA, WORK )
455 CALL DPOCON( UPLO, N, AF, LDAF, ANORM, RCOND, WORK, IWORK, INFO )
459 CALL DLACPY( 'full
', N, NRHS, B, LDB, X, LDX )
460 CALL DPOTRS( UPLO, N, NRHS, AF, LDAF, X, LDX, INFO )
465 CALL DPORFS( UPLO, N, NRHS, A, LDA, AF, LDAF, B, LDB, X, LDX,
466 $ FERR, BERR, WORK, IWORK, INFO )
474 X( I, J ) = S( I )*X( I, J )
478 FERR( J ) = FERR( J ) / SCOND
484.LT.
IF( RCONDDLAMCH( 'epsilon
' ) )
subroutine dlacpy(uplo, m, n, a, lda, b, ldb)
DLACPY copies all or part of one two-dimensional array to another.
subroutine xerbla(srname, info)
XERBLA
subroutine dpoequ(n, a, lda, s, scond, amax, info)
DPOEQU
subroutine dpotrs(uplo, n, nrhs, a, lda, b, ldb, info)
DPOTRS
subroutine dpotrf(uplo, n, a, lda, info)
DPOTRF
subroutine dpocon(uplo, n, a, lda, anorm, rcond, work, iwork, info)
DPOCON
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
subroutine dlaqsy(uplo, n, a, lda, s, scond, amax, equed)
DLAQSY scales a symmetric/Hermitian matrix, using scaling factors computed by spoequ.