1 SUBROUTINE sposvx( FACT, UPLO, N, NRHS, A, LDA, AF, LDAF, EQUED,
2 $ s, b, ldb, x, ldx, rcond, ferr, berr, work,
12 CHARACTER equed, fact,
uplo
13 INTEGER info, lda, ldaf, ldb, ldx, n, nrhs
19 REAL a( lda, * ), af( ldaf, * ), b( ldb, * ),
20 $ berr( * ), ferr( * ), s( * ), work( * ),
217 parameter( zero = 0.0e+0, one = 1.0e+0 )
220 LOGICAL equil, nofact, rcequ
222 REAL amax, anorm, bignum, scond, smax, smin, smlnum
227 EXTERNAL lsame, slamch, slansy
239 nofact = lsame( fact,
'N' )
240 equil = lsame( fact,
'E' )
241 IF( nofact .OR. equil )
THEN
245 rcequ = lsame( equed,
'Y' )
246 smlnum = slamch(
'Safe minimum' )
247 bignum = one / smlnum
252 IF( .NOT.nofact .AND. .NOT.equil .AND. .NOT.lsame( fact,
'F' ) )
255 ELSE IF( .NOT.lsame(
uplo,
'U' ) .AND. .NOT.lsame(
uplo,
'L' ) )
258 ELSE IF( n.LT.0 )
THEN
260 ELSE IF( nrhs.LT.0 )
THEN
262 ELSE IF( lda.LT.
max( 1, n ) )
THEN
264 ELSE IF( ldaf.LT.
max( 1, n ) )
THEN
266 ELSE IF( lsame( fact,
'F' ) .AND. .NOT.
267 $ ( rcequ .OR. lsame( equed,
'N' ) ) )
THEN
274 smin =
min( smin, s( j ) )
275 smax =
max( smax, s( j ) )
277 IF( smin.LE.zero )
THEN
279 ELSE IF( n.GT.0 )
THEN
280 scond =
max( smin, smlnum ) /
min( smax, bignum )
286 IF( ldb.LT.
max( 1, n ) )
THEN
288 ELSE IF( ldx.LT.
max( 1, n ) )
THEN
295 CALL
xerbla(
'SPOSVX', -info )
299 IF( lsame(
uplo,
'U' ) )
THEN
300 plasma_uplo = plasmaupper
302 plasma_uplo = plasmalower
309 CALL
spoequ( n, a, lda, s, scond, amax, infequ )
310 IF( infequ.EQ.0 )
THEN
314 CALL
slaqsy(
uplo, n, a, lda, s, scond, amax, equed )
315 rcequ = lsame( equed,
'Y' )
324 b( i, j ) = s( i )*b( i, j )
329 IF( nofact .OR. equil )
THEN
333 CALL slacpy(
uplo, n, n, a, lda, af, ldaf )
346 anorm = slansy(
'1',
uplo, n, a, lda, work )
350 CALL
spocon(
uplo, n, af, ldaf, anorm, rcond, work, iwork, info )
354 CALL slacpy(
'Full', n, nrhs, b, ldb, x, ldx )
355 CALL
plasma_spotrs( plasma_uplo, n, nrhs, af, ldaf, x, ldx, info )
360 CALL
sporfs(
uplo, n, nrhs, a, lda, af, ldaf, b, ldb, x, ldx,
361 $ ferr, berr, work, iwork, info )
369 x( i, j ) = s( i )*x( i, j )
373 ferr( j ) = ferr( j ) / scond
379 IF( rcond.LT.slamch(
'Epsilon' ) )