340 SUBROUTINE dpbsvx( FACT, UPLO, N, KD, NRHS, AB, LDAB, AFB, LDAFB,
341 $ EQUED, S, B, LDB, X, LDX, RCOND, FERR, BERR,
342 $ WORK, IWORK, INFO )
349 CHARACTER EQUED, FACT, UPLO
350 INTEGER INFO, KD, LDAB, LDAFB, LDB, LDX, N,
355 DOUBLE PRECISION AB( LDAB, * ), AFB( LDAFB, * ), B( LDB, * ),
356 $ berr( * ), ferr( * ), s( * ), work( * ),
363 DOUBLE PRECISION ZERO, ONE
364 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
367 LOGICAL EQUIL, NOFACT, RCEQU, UPPER
368 INTEGER I, INFEQU, J, J1, J2
369 DOUBLE PRECISION AMAX, ANORM, BIGNUM, SCOND, SMAX, SMIN, SMLNUM
373 DOUBLE PRECISION DLAMCH, DLANSB
374 EXTERNAL lsame, dlamch, dlansb
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 = dlamch(
'Safe minimum' )
395 bignum = one / smlnum
400 IF( .NOT.nofact .AND. .NOT.equil .AND. .NOT.lsame( fact,
'F' ) )
403 ELSE IF( .NOT.upper .AND. .NOT.lsame( uplo, 'l
' ) ) THEN
405.LT.
ELSE IF( N0 ) THEN
407.LT.
ELSE IF( KD0 ) THEN
409.LT.
ELSE IF( NRHS0 ) THEN
411.LT.
ELSE IF( LDABKD+1 ) THEN
413.LT.
ELSE IF( LDAFBKD+1 ) THEN
415 ELSE IF( LSAME( FACT, 'f.AND..NOT.
' )
416.OR.
$ ( RCEQU LSAME( EQUED, 'n
' ) ) ) THEN
423 SMIN = MIN( SMIN, S( J ) )
424 SMAX = MAX( SMAX, S( J ) )
426.LE.
IF( SMINZERO ) THEN
428.GT.
ELSE IF( N0 ) THEN
429 SCOND = MAX( SMIN, SMLNUM ) / MIN( SMAX, BIGNUM )
435.LT.
IF( LDBMAX( 1, N ) ) THEN
437.LT.
ELSE IF( LDXMAX( 1, N ) ) THEN
444 CALL XERBLA( 'dpbsvx', -INFO )
452 CALL DPBEQU( UPLO, N, KD, AB, LDAB, S, SCOND, AMAX, INFEQU )
453.EQ.
IF( INFEQU0 ) THEN
457 CALL DLAQSB( UPLO, N, KD, AB, LDAB, S, SCOND, AMAX, EQUED )
458 RCEQU = LSAME( EQUED, 'y
' )
467 B( I, J ) = S( I )*B( I, J )
472.OR.
IF( NOFACT EQUIL ) THEN
479 CALL DCOPY( J-J1+1, AB( KD+1-J+J1, J ), 1,
480 $ AFB( KD+1-J+J1, J ), 1 )
485 CALL DCOPY( J2-J+1, AB( 1, J ), 1, AFB( 1, J ), 1 )
489 CALL DPBTRF( UPLO, N, KD, AFB, LDAFB, INFO )
501 ANORM = DLANSB( '1
', UPLO, N, KD, AB, LDAB, WORK )
505 CALL DPBCON( UPLO, N, KD, AFB, LDAFB, ANORM, RCOND, WORK, IWORK,
510 CALL DLACPY( 'full
', N, NRHS, B, LDB, X, LDX )
511 CALL DPBTRS( UPLO, N, KD, NRHS, AFB, LDAFB, X, LDX, INFO )
516 CALL DPBRFS( UPLO, N, KD, NRHS, AB, LDAB, AFB, LDAFB, B, LDB, X,
517 $ LDX, FERR, BERR, WORK, IWORK, INFO )
525 X( I, J ) = S( I )*X( I, J )
529 FERR( J ) = FERR( J ) / SCOND
535.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 dlaqsb(uplo, n, kd, ab, ldab, s, scond, amax, equed)
DLAQSB scales a symmetric/Hermitian band matrix, using scaling factors computed by spbequ.
subroutine dpbtrs(uplo, n, kd, nrhs, ab, ldab, b, ldb, info)
DPBTRS
subroutine dpbequ(uplo, n, kd, ab, ldab, s, scond, amax, info)
DPBEQU
subroutine dpbcon(uplo, n, kd, ab, ldab, anorm, rcond, work, iwork, info)
DPBCON
subroutine dpbrfs(uplo, n, kd, nrhs, ab, ldab, afb, ldafb, b, ldb, x, ldx, ferr, berr, work, iwork, info)
DPBRFS
subroutine dpbtrf(uplo, n, kd, ab, ldab, info)
DPBTRF
subroutine dpbsvx(fact, uplo, n, kd, nrhs, ab, ldab, afb, ldafb, equed, s, b, ldb, x, ldx, rcond, ferr, berr, work, iwork, info)
DPBSVX computes the solution to system of linear equations A * X = B for OTHER matrices
subroutine dcopy(n, dx, incx, dy, incy)
DCOPY