337 SUBROUTINE cpbsvx( FACT, UPLO, N, KD, NRHS, AB, LDAB, AFB,
339 $ EQUED, S, B, LDB, X, LDX, RCOND, FERR, BERR,
340 $ WORK, RWORK, INFO )
347 CHARACTER EQUED, FACT, UPLO
348 INTEGER INFO, KD, LDAB, LDAFB, LDB, LDX, N, NRHS
352 REAL BERR( * ), FERR( * ), RWORK( * ), S( * )
353 COMPLEX AB( LDAB, * ), AFB( LDAFB, * ), B( LDB, * ),
354 $ WORK( * ), X( LDX, * )
361 PARAMETER ( ZERO = 0.0e+0, one = 1.0e+0 )
364 LOGICAL EQUIL, NOFACT, RCEQU, UPPER
365 INTEGER I, INFEQU, J, J1, J2
366 REAL AMAX, ANORM, BIGNUM, SCOND, SMAX, SMIN, SMLNUM
371 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 IF( .NOT.nofact .AND.
400 $ .NOT.lsame( fact,
'F' ) )
403 ELSE IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
405 ELSE IF( n.LT.0 )
THEN
407 ELSE IF( kd.LT.0 )
THEN
409 ELSE IF( nrhs.LT.0 )
THEN
411 ELSE IF( ldab.LT.kd+1 )
THEN
413 ELSE IF( ldafb.LT.kd+1 )
THEN
415 ELSE IF( lsame( fact,
'F' ) .AND. .NOT.
416 $ ( rcequ .OR. lsame( equed,
'N' ) ) )
THEN
423 smin = min( smin, s( j ) )
424 smax = max( smax, s( j ) )
426 IF( smin.LE.zero )
THEN
428 ELSE IF( n.GT.0 )
THEN
429 scond = max( smin, smlnum ) / min( smax, bignum )
435 IF( ldb.LT.max( 1, n ) )
THEN
437 ELSE IF( ldx.LT.max( 1, n ) )
THEN
444 CALL xerbla(
'CPBSVX', -info )
452 CALL cpbequ( uplo, n, kd, ab, ldab, s, scond, amax, infequ )
453 IF( infequ.EQ.0 )
THEN
457 CALL claqhb( uplo, n, kd, ab, ldab, s, scond, amax,
459 rcequ = lsame( equed,
'Y' )
468 b( i, j ) = s( i )*b( i, j )
473 IF( nofact .OR. equil )
THEN
480 CALL ccopy( j-j1+1, ab( kd+1-j+j1, j ), 1,
481 $ afb( kd+1-j+j1, j ), 1 )
486 CALL ccopy( j2-j+1, ab( 1, j ), 1, afb( 1, j ), 1 )
490 CALL cpbtrf( uplo, n, kd, afb, ldafb, info )
502 anorm = clanhb(
'1', uplo, n, kd, ab, ldab, rwork )
506 CALL cpbcon( uplo, n, kd, afb, ldafb, anorm, rcond, work,
512 CALL clacpy(
'Full', n, nrhs, b, ldb, x, ldx )
513 CALL cpbtrs( uplo, n, kd, nrhs, afb, ldafb, x, ldx, info )
518 CALL cpbrfs( uplo, n, kd, nrhs, ab, ldab, afb, ldafb, b, ldb,
520 $ ldx, ferr, berr, work, rwork, info )
528 x( i, j ) = s( i )*x( i, j )
532 ferr( j ) = ferr( j ) / scond
538 IF( rcond.LT.slamch(
'Epsilon' ) )
subroutine cpbrfs(uplo, n, kd, nrhs, ab, ldab, afb, ldafb, b, ldb, x, ldx, ferr, berr, work, rwork, info)
CPBRFS
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