339 SUBROUTINE cpbsvx( FACT, UPLO, N, KD, NRHS, AB, LDAB, AFB, LDAFB,
340 $ EQUED, S, B, LDB, X, LDX, RCOND, FERR, BERR,
341 $ WORK, RWORK, INFO )
348 CHARACTER EQUED, FACT, UPLO
349 INTEGER INFO, KD, LDAB, LDAFB, LDB, LDX, N, NRHS
353 REAL BERR( * ), FERR( * ), RWORK( * ), S( * )
354 COMPLEX AB( LDAB, * ), AFB( LDAFB, * ), B( LDB, * ),
355 $ work( * ), x( ldx, * )
362 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0 )
365 LOGICAL EQUIL, NOFACT, RCEQU, UPPER
366 INTEGER I, INFEQU, J, J1, J2
367 REAL AMAX, ANORM, BIGNUM, SCOND, SMAX, SMIN, SMLNUM
372 EXTERNAL lsame, clanhb, slamch
384 nofact = lsame( fact,
'N' )
385 equil = lsame( fact,
'E' )
386 upper = lsame( uplo,
'U' )
387 IF( nofact .OR. equil )
THEN
391 RCEQU = LSAME( EQUED, 'y
' )
392 SMLNUM = SLAMCH( 'safe minimum
' )
393 BIGNUM = ONE / SMLNUM
398.NOT..AND..NOT..AND..NOT.
IF( NOFACT EQUIL LSAME( FACT, 'f
' ) )
401.NOT..AND..NOT.
ELSE IF( UPPER LSAME( UPLO, 'l
' ) ) THEN
403.LT.
ELSE IF( N0 ) THEN
405.LT.
ELSE IF( KD0 ) THEN
407.LT.
ELSE IF( NRHS0 ) THEN
409.LT.
ELSE IF( LDABKD+1 ) THEN
411.LT.
ELSE IF( LDAFBKD+1 ) THEN
413 ELSE IF( LSAME( FACT, 'f.AND..NOT.
' )
414.OR.
$ ( RCEQU LSAME( EQUED, 'n
' ) ) ) THEN
421 SMIN = MIN( SMIN, S( J ) )
422 SMAX = MAX( SMAX, S( J ) )
424.LE.
IF( SMINZERO ) THEN
426.GT.
ELSE IF( N0 ) THEN
427 SCOND = MAX( SMIN, SMLNUM ) / MIN( SMAX, BIGNUM )
433.LT.
IF( LDBMAX( 1, N ) ) THEN
435.LT.
ELSE IF( LDXMAX( 1, N ) ) THEN
442 CALL XERBLA( 'cpbsvx', -INFO )
450 CALL CPBEQU( UPLO, N, KD, AB, LDAB, S, SCOND, AMAX, INFEQU )
451.EQ.
IF( INFEQU0 ) THEN
455 CALL CLAQHB( UPLO, N, KD, AB, LDAB, S, SCOND, AMAX, EQUED )
456 RCEQU = LSAME( EQUED, 'y
' )
465 B( I, J ) = S( I )*B( I, J )
470.OR.
IF( NOFACT EQUIL ) THEN
477 CALL CCOPY( J-J1+1, AB( KD+1-J+J1, J ), 1,
478 $ AFB( KD+1-J+J1, J ), 1 )
483 CALL CCOPY( J2-J+1, AB( 1, J ), 1, AFB( 1, J ), 1 )
487 CALL CPBTRF( UPLO, N, KD, AFB, LDAFB, INFO )
499 ANORM = CLANHB( '1', uplo, n, kd, ab, ldab, rwork )
503 CALL cpbcon( uplo, n, kd, afb, ldafb, anorm, rcond, work, rwork,
508 CALL clacpy(
'Full', n, nrhs, b, ldb, x, ldx )
509 CALL cpbtrs( uplo, n, kd, nrhs, afb, ldafb, x, ldx, info )
514 CALL cpbrfs( uplo, n, kd, nrhs, ab, ldab, afb, ldafb, b, ldb, x,
515 $ ldx, ferr, berr, work, rwork, info )
523 x( i, j ) = s( i )*x( i, j )
527 ferr( j ) = ferr( j ) / scond
533 IF( rcond.LT.slamch(
'Epsilon' ) )
subroutine clacpy(uplo, m, n, a, lda, b, ldb)
CLACPY copies all or part of one two-dimensional array to another.
subroutine claqhb(uplo, n, kd, ab, ldab, s, scond, amax, equed)
CLAQHB scales a Hermitian band matrix, using scaling factors computed by cpbequ.
subroutine cpbrfs(uplo, n, kd, nrhs, ab, ldab, afb, ldafb, b, ldb, x, ldx, ferr, berr, work, rwork, info)
CPBRFS
subroutine cpbcon(uplo, n, kd, ab, ldab, anorm, rcond, work, rwork, info)
CPBCON
subroutine cpbsvx(fact, uplo, n, kd, nrhs, ab, ldab, afb, ldafb, equed, s, b, ldb, x, ldx, rcond, ferr, berr, work, rwork, info)
CPBSVX computes the solution to system of linear equations A * X = B for OTHER matrices