200 SUBROUTINE dgbrfs( TRANS, N, KL, KU, NRHS, AB, LDAB, AFB,
202 $ IPIV, B, LDB, X, LDX, FERR, BERR, WORK, IWORK,
211 INTEGER INFO, KL, KU, LDAB, LDAFB, LDB, LDX, N, NRHS
214 INTEGER IPIV( * ), IWORK( * )
215 DOUBLE PRECISION AB( LDAB, * ), AFB( LDAFB, * ), B( LDB, * ),
216 $ BERR( * ), FERR( * ), WORK( * ), X( LDX, * )
223 PARAMETER ( ITMAX = 5 )
224 double precision zero
225 parameter( zero = 0.0d+0 )
227 parameter( one = 1.0d+0 )
229 parameter( two = 2.0d+0 )
230 DOUBLE PRECISION THREE
231 parameter( three = 3.0d+0 )
236 INTEGER COUNT, I, J, K, KASE, KK, NZ
237 DOUBLE PRECISION EPS, LSTRES, S, SAFE1, SAFE2, SAFMIN, XK
247 INTRINSIC abs, max, min
251 DOUBLE PRECISION DLAMCH
252 EXTERNAL LSAME, DLAMCH
259 notran = lsame( trans,
'N' )
260 IF( .NOT.notran .AND. .NOT.lsame( trans,
'T' ) .AND. .NOT.
261 $ lsame( trans,
'C' ) )
THEN
263 ELSE IF( n.LT.0 )
THEN
265 ELSE IF( kl.LT.0 )
THEN
267 ELSE IF( ku.LT.0 )
THEN
269 ELSE IF( nrhs.LT.0 )
THEN
271 ELSE IF( ldab.LT.kl+ku+1 )
THEN
273 ELSE IF( ldafb.LT.2*kl+ku+1 )
THEN
275 ELSE IF( ldb.LT.max( 1, n ) )
THEN
277 ELSE IF( ldx.LT.max( 1, n ) )
THEN
281 CALL xerbla(
'DGBRFS', -info )
287 IF( n.EQ.0 .OR. nrhs.EQ.0 )
THEN
303 nz = min( kl+ku+2, n+1 )
304 eps = dlamch(
'Epsilon' )
305 safmin = dlamch(
'Safe minimum' )
322 CALL dcopy( n, b( 1, j ), 1, work( n+1 ), 1 )
323 CALL dgbmv( trans, n, n, kl, ku, -one, ab, ldab, x( 1, j ),
325 $ one, work( n+1 ), 1 )
337 work( i ) = abs( b( i, j ) )
345 xk = abs( x( k, j ) )
346 DO 40 i = max( 1, k-ku ), min( n, k+kl )
347 work( i ) = work( i ) + abs( ab( kk+i, k ) )*xk
354 DO 60 i = max( 1, k-ku ), min( n, k+kl )
355 s = s + abs( ab( kk+i, k ) )*abs( x( i, j ) )
357 work( k ) = work( k ) + s
362 IF( work( i ).GT.safe2 )
THEN
363 s = max( s, abs( work( n+i ) ) / work( i ) )
365 s = max( s, ( abs( work( n+i ) )+safe1 ) /
366 $ ( work( i )+safe1 ) )
377 IF( berr( j ).GT.eps .AND. two*berr( j ).LE.lstres .AND.
378 $ count.LE.itmax )
THEN
382 CALL dgbtrs( trans, n, kl, ku, 1, afb, ldafb, ipiv,
383 $ work( n+1 ), n, info )
384 CALL daxpy( n, one, work( n+1 ), 1, x( 1, j ), 1 )
413 IF( work( i ).GT.safe2 )
THEN
414 work( i ) = abs( work( n+i ) ) + nz*eps*work( i )
416 work( i ) = abs( work( n+i ) ) + nz*eps*work( i ) + safe1
422 CALL dlacn2( n, work( 2*n+1 ), work( n+1 ), iwork,
430 CALL dgbtrs( transt, n, kl, ku, 1, afb, ldafb, ipiv,
431 $ work( n+1 ), n, info )
433 work( n+i ) = work( n+i )*work( i )
440 work( n+i ) = work( n+i )*work( i )
442 CALL dgbtrs( trans, n, kl, ku, 1, afb, ldafb, ipiv,
443 $ work( n+1 ), n, info )
452 lstres = max( lstres, abs( x( i, j ) ) )
455 $ ferr( j ) = ferr( j ) / lstres
subroutine dgbrfs(trans, n, kl, ku, nrhs, ab, ldab, afb, ldafb, ipiv, b, ldb, x, ldx, ferr, berr, work, iwork, info)
DGBRFS