185 SUBROUTINE cpbrfs( UPLO, N, KD, NRHS, AB, LDAB, AFB, LDAFB, B,
186 $ LDB, X, LDX, FERR, BERR, WORK, RWORK, INFO )
194 INTEGER INFO, KD, LDAB, LDAFB, LDB, LDX, N, NRHS
197 REAL BERR( * ), FERR( * ), RWORK( * )
198 COMPLEX AB( LDAB, * ), AFB( LDAFB, * ), B( LDB, * ),
199 $ work( * ), x( ldx, * )
206 parameter( itmax = 5 )
208 parameter( zero = 0.0e+0 )
210 parameter( one = ( 1.0e+0, 0.0e+0 ) )
212 parameter( two = 2.0e+0 )
214 parameter( three = 3.0e+0 )
218 INTEGER COUNT, I, J, K, KASE, L, NZ
219 REAL EPS, LSTRES, S, SAFE1, SAFE2, SAFMIN, XK
230 INTRINSIC abs, aimag, max, min, real
235 EXTERNAL lsame, slamch
241 cabs1( zdum ) = abs( real( zdum ) ) + abs( aimag( zdum ) )
248 upper = lsame( uplo,
'U' )
249 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
251 ELSE IF( n.LT.0 )
THEN
253 ELSE IF( kd.LT.0 )
THEN
255 ELSE IF( nrhs.LT.0 )
THEN
257 ELSE IF( ldab.LT.kd+1 )
THEN
259 ELSE IF( ldafb.LT.kd+1 )
THEN
261 ELSE IF( ldb.LT.max( 1, n ) )
THEN
263 ELSE IF( ldx.LT.max( 1, n ) )
THEN
267 CALL xerbla(
'CPBRFS', -info )
273 IF( n.EQ.0 .OR. nrhs.EQ.0 )
THEN
283 nz = min( n+1, 2*kd+2 )
284 eps = slamch(
'Epsilon' )
285 safmin = slamch(
'Safe minimum' )
286 safe1 = real( nz )*safmin
301 CALL ccopy( n, b( 1, j ), 1, work, 1 )
302 CALL chbmv( uplo, n, kd, -one, ab, ldab, x( 1, j ), 1, one,
315 rwork( i ) = cabs1( b( i, j ) )
323 xk = cabs1( x( k, j ) )
325 DO 40 i = max( 1, k-kd ), k - 1
326 rwork( i ) = rwork( i ) + cabs1( ab( l+i, k ) )*xk
327 s = s + cabs1( ab( l+i, k ) )*cabs1( x( i, j ) )
329 rwork( k ) = rwork( k ) + abs( real( ab( kd+1, k ) ) )*
335 xk = cabs1( x( k, j ) )
336 rwork( k ) = rwork( k ) + abs( real( ab( 1, k ) ) )*xk
338 DO 60 i = k + 1, min( n, k+kd )
339 rwork( i ) = rwork( i ) + cabs1( ab( l+i, k ) )*xk
340 s = s + cabs1( ab( l+i, k ) )*cabs1( x( i, j ) )
342 rwork( k ) = rwork( k ) + s
347 IF( rwork( i ).GT.safe2 )
THEN
348 s = max( s, cabs1( work( i ) ) / rwork( i ) )
350 s = max( s, ( cabs1( work( i ) )+safe1 ) /
351 $ ( rwork( i )+safe1 ) )
362 IF( berr( j ).GT.eps .AND. two*berr( j ).LE.lstres .AND.
363 $ count.LE.itmax )
THEN
367 CALL cpbtrs( uplo, n, kd, 1, afb, ldafb, work, n, info )
368 CALL caxpy( n, one, work, 1, x( 1, j ), 1 )
397 IF( rwork( i ).GT.safe2 )
THEN
398 rwork( i ) = cabs1( work( i ) ) + real( nz )*
401 rwork( i ) = cabs1( work( i ) ) + real( nz )*
402 $ eps*rwork( i ) + safe1
408 CALL clacn2( n, work( n+1 ), work, ferr( j ), kase, isave )
414 CALL cpbtrs( uplo, n, kd, 1, afb, ldafb, work, n,
417 work( i ) = rwork( i )*work( i )
419 ELSE IF( kase.EQ.2 )
THEN
424 work( i ) = rwork( i )*work( i )
426 CALL cpbtrs( uplo, n, kd, 1, afb, ldafb, work, n,
436 lstres = max( lstres, cabs1( x( i, j ) ) )
439 $ ferr( j ) = ferr( j ) / lstres