185 SUBROUTINE zpbrfs( 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 DOUBLE PRECISION BERR( * ), FERR( * ), RWORK( * )
198 COMPLEX*16 AB( LDAB, * ), AFB( LDAFB, * ), B( LDB, * ),
199 $ work( * ), x( ldx, * )
206 parameter( itmax = 5 )
207 DOUBLE PRECISION ZERO
208 parameter( zero = 0.0d+0 )
210 parameter( one = ( 1.0d+0, 0.0d+0 ) )
212 parameter( two = 2.0d+0 )
213 DOUBLE PRECISION THREE
214 parameter( three = 3.0d+0 )
218 INTEGER COUNT, I, J, K, KASE, L, NZ
219 DOUBLE PRECISION EPS, LSTRES, S, SAFE1, SAFE2, SAFMIN, XK
230 INTRINSIC abs, dble, dimag, max, min
234 DOUBLE PRECISION DLAMCH
235 EXTERNAL lsame, dlamch
238 DOUBLE PRECISION CABS1
241 cabs1( zdum ) = abs( dble( zdum ) ) + abs( dimag( 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(
'ZPBRFS', -info )
273 IF( n.EQ.0 .OR. nrhs.EQ.0 )
THEN
283 nz = min( n+1, 2*kd+2 )
284 eps = dlamch(
'Epsilon' )
285 safmin = dlamch(
'Safe minimum' )
301 CALL zcopy( n, b( 1, j ), 1, work, 1 )
302 CALL zhbmv( 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( dble( ab( kd+1, k ) ) )*
335 xk = cabs1( x( k, j ) )
336 rwork( k ) = rwork( k ) + abs( dble( 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 zpbtrs( uplo, n, kd, 1, afb, ldafb, work, n, info )
368 CALL zaxpy( n, one, work, 1, x( 1, j ), 1 )
397 IF( rwork( i ).GT.safe2 )
THEN
398 rwork( i ) = cabs1( work( i ) ) + nz*eps*rwork( i )
400 rwork( i ) = cabs1( work( i ) ) + nz*eps*rwork( i ) +
407 CALL zlacn2( n, work( n+1 ), work, ferr( j ), kase, isave )
413 CALL zpbtrs( uplo, n, kd, 1, afb, ldafb, work, n,
416 work( i ) = rwork( i )*work( i )
418 ELSE IF( kase.EQ.2 )
THEN
423 work( i ) = rwork( i )*work( i )
425 CALL zpbtrs( uplo, n, kd, 1, afb, ldafb, work, n,
435 lstres = max( lstres, cabs1( x( i, j ) ) )
438 $ ferr( j ) = ferr( j ) / lstres