201 SUBROUTINE zgbrfs( TRANS, N, KL, KU, NRHS, AB, LDAB, AFB,
203 $ IPIV, B, LDB, X, LDX, FERR, BERR, WORK, RWORK,
212 INTEGER INFO, KL, KU, LDAB, LDAFB, LDB, LDX, N, NRHS
216 DOUBLE PRECISION BERR( * ), FERR( * ), RWORK( * )
217 COMPLEX*16 AB( LDAB, * ), AFB( LDAFB, * ), B( LDB, * ),
218 $ work( * ), x( ldx, * )
225 PARAMETER ( ITMAX = 5 )
226 double precision zero
227 parameter( zero = 0.0d+0 )
229 parameter( cone = ( 1.0d+0, 0.0d+0 ) )
231 parameter( two = 2.0d+0 )
232 DOUBLE PRECISION THREE
233 parameter( three = 3.0d+0 )
237 CHARACTER TRANSN, TRANST
238 INTEGER COUNT, I, J, K, KASE, KK, NZ
239 DOUBLE PRECISION EPS, LSTRES, S, SAFE1, SAFE2, SAFMIN, XK
250 INTRINSIC abs, dble, dimag, max, min
254 DOUBLE PRECISION DLAMCH
255 EXTERNAL LSAME, DLAMCH
258 DOUBLE PRECISION CABS1
261 cabs1( zdum ) = abs( dble( zdum ) ) + abs( dimag( zdum ) )
268 notran = lsame( trans,
'N' )
269 IF( .NOT.notran .AND. .NOT.lsame( trans,
'T' ) .AND. .NOT.
270 $ lsame( trans,
'C' ) )
THEN
272 ELSE IF( n.LT.0 )
THEN
274 ELSE IF( kl.LT.0 )
THEN
276 ELSE IF( ku.LT.0 )
THEN
278 ELSE IF( nrhs.LT.0 )
THEN
280 ELSE IF( ldab.LT.kl+ku+1 )
THEN
282 ELSE IF( ldafb.LT.2*kl+ku+1 )
THEN
284 ELSE IF( ldb.LT.max( 1, n ) )
THEN
286 ELSE IF( ldx.LT.max( 1, n ) )
THEN
290 CALL xerbla(
'ZGBRFS', -info )
296 IF( n.EQ.0 .OR. nrhs.EQ.0 )
THEN
314 nz = min( kl+ku+2, n+1 )
315 eps = dlamch(
'Epsilon' )
316 safmin = dlamch(
'Safe minimum' )
333 CALL zcopy( n, b( 1, j ), 1, work, 1 )
334 CALL zgbmv( trans, n, n, kl, ku, -cone, ab, ldab, x( 1, j ),
348 rwork( i ) = cabs1( b( i, j ) )
356 xk = cabs1( x( k, j ) )
357 DO 40 i = max( 1, k-ku ), min( n, k+kl )
358 rwork( i ) = rwork( i ) + cabs1( ab( kk+i, k ) )*xk
365 DO 60 i = max( 1, k-ku ), min( n, k+kl )
366 s = s + cabs1( ab( kk+i, k ) )*cabs1( x( i, j ) )
368 rwork( k ) = rwork( k ) + s
373 IF( rwork( i ).GT.safe2 )
THEN
374 s = max( s, cabs1( work( i ) ) / rwork( i ) )
376 s = max( s, ( cabs1( work( i ) )+safe1 ) /
377 $ ( rwork( i )+safe1 ) )
388 IF( berr( j ).GT.eps .AND. two*berr( j ).LE.lstres .AND.
389 $ count.LE.itmax )
THEN
393 CALL zgbtrs( trans, n, kl, ku, 1, afb, ldafb, ipiv, work,
396 CALL zaxpy( n, cone, work, 1, x( 1, j ), 1 )
425 IF( rwork( i ).GT.safe2 )
THEN
426 rwork( i ) = cabs1( work( i ) ) + nz*eps*rwork( i )
428 rwork( i ) = cabs1( work( i ) ) + nz*eps*rwork( i ) +
435 CALL zlacn2( n, work( n+1 ), work, ferr( j ), kase, isave )
441 CALL zgbtrs( transt, n, kl, ku, 1, afb, ldafb, ipiv,
444 work( i ) = rwork( i )*work( i )
451 work( i ) = rwork( i )*work( i )
453 CALL zgbtrs( transn, n, kl, ku, 1, afb, ldafb, ipiv,
463 lstres = max( lstres, cabs1( x( i, j ) ) )
466 $ ferr( j ) = ferr( j ) / lstres
subroutine zgbrfs(trans, n, kl, ku, nrhs, ab, ldab, afb, ldafb, ipiv, b, ldb, x, ldx, ferr, berr, work, rwork, info)
ZGBRFS