338 SUBROUTINE spbsvx( FACT, UPLO, N, KD, NRHS, AB, LDAB, AFB,
340 $ EQUED, S, B, LDB, X, LDX, RCOND, FERR, BERR,
341 $ WORK, IWORK, INFO )
348 CHARACTER EQUED, FACT, UPLO
349 INTEGER INFO, KD, LDAB, LDAFB, LDB, LDX, N, NRHS
354 REAL AB( LDAB, * ), AFB( LDAFB, * ), B( LDB, * ),
355 $ BERR( * ), FERR( * ), S( * ), WORK( * ),
363 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0 )
366 LOGICAL EQUIL, NOFACT, RCEQU, UPPER
367 INTEGER I, INFEQU, J, J1, J2
368 REAL AMAX, ANORM, BIGNUM, SCOND, SMAX, SMIN, SMLNUM
373 EXTERNAL LSAME, SLAMCH, SLANSB
386 nofact = lsame( fact,
'N' )
387 equil = lsame( fact,
'E' )
388 upper = lsame( uplo,
'U' )
389 IF( nofact .OR. equil )
THEN
393 rcequ = lsame( equed,
'Y' )
394 smlnum = slamch(
'Safe minimum' )
395 bignum = one / smlnum
400 IF( .NOT.nofact .AND.
402 $ .NOT.lsame( fact,
'F' ) )
405 ELSE IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
407 ELSE IF( n.LT.0 )
THEN
409 ELSE IF( kd.LT.0 )
THEN
411 ELSE IF( nrhs.LT.0 )
THEN
413 ELSE IF( ldab.LT.kd+1 )
THEN
415 ELSE IF( ldafb.LT.kd+1 )
THEN
417 ELSE IF( lsame( fact,
'F' ) .AND. .NOT.
418 $ ( rcequ .OR. lsame( equed,
'N' ) ) )
THEN
425 smin = min( smin, s( j ) )
426 smax = max( smax, s( j ) )
428 IF( smin.LE.zero )
THEN
430 ELSE IF( n.GT.0 )
THEN
431 scond = max( smin, smlnum ) / min( smax, bignum )
437 IF( ldb.LT.max( 1, n ) )
THEN
439 ELSE IF( ldx.LT.max( 1, n ) )
THEN
446 CALL xerbla(
'SPBSVX', -info )
454 CALL spbequ( uplo, n, kd, ab, ldab, s, scond, amax, infequ )
455 IF( infequ.EQ.0 )
THEN
459 CALL slaqsb( uplo, n, kd, ab, ldab, s, scond, amax,
461 rcequ = lsame( equed,
'Y' )
470 b( i, j ) = s( i )*b( i, j )
475 IF( nofact .OR. equil )
THEN
482 CALL scopy( j-j1+1, ab( kd+1-j+j1, j ), 1,
483 $ afb( kd+1-j+j1, j ), 1 )
488 CALL scopy( j2-j+1, ab( 1, j ), 1, afb( 1, j ), 1 )
492 CALL spbtrf( uplo, n, kd, afb, ldafb, info )
504 anorm = slansb(
'1', uplo, n, kd, ab, ldab, work )
508 CALL spbcon( uplo, n, kd, afb, ldafb, anorm, rcond, work,
514 CALL slacpy(
'Full', n, nrhs, b, ldb, x, ldx )
515 CALL spbtrs( uplo, n, kd, nrhs, afb, ldafb, x, ldx, info )
520 CALL spbrfs( uplo, n, kd, nrhs, ab, ldab, afb, ldafb, b, ldb,
522 $ ldx, ferr, berr, work, iwork, info )
530 x( i, j ) = s( i )*x( i, j )
534 ferr( j ) = ferr( j ) / scond
540 IF( rcond.LT.slamch(
'Epsilon' ) )
subroutine spbrfs(uplo, n, kd, nrhs, ab, ldab, afb, ldafb, b, ldb, x, ldx, ferr, berr, work, iwork, info)
SPBRFS
subroutine spbsvx(fact, uplo, n, kd, nrhs, ab, ldab, afb, ldafb, equed, s, b, ldb, x, ldx, rcond, ferr, berr, work, iwork, info)
SPBSVX computes the solution to system of linear equations A * X = B for OTHER matrices