201 SUBROUTINE cgbrfs( 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 REAL BERR( * ), FERR( * ), RWORK( * )
217 COMPLEX AB( LDAB, * ), AFB( LDAFB, * ), B( LDB, * ),
218 $ work( * ), x( ldx, * )
225 PARAMETER ( ITMAX = 5 )
227 parameter( zero = 0.0e+0 )
229 parameter( cone = ( 1.0e+0, 0.0e+0 ) )
231 parameter( two = 2.0e+0 )
233 parameter( three = 3.0e+0 )
237 CHARACTER TRANSN, TRANST
238 INTEGER COUNT, I, J, K, KASE, KK, NZ
239 REAL EPS, LSTRES, S, SAFE1, SAFE2, SAFMIN, XK
250 INTRINSIC abs, aimag, max, min, real
255 EXTERNAL LSAME, SLAMCH
261 cabs1( zdum ) = abs( real( zdum ) ) + abs( aimag( 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(
'CGBRFS', -info )
296 IF( n.EQ.0 .OR. nrhs.EQ.0 )
THEN
314 nz = min( kl+ku+2, n+1 )
315 eps = slamch(
'Epsilon' )
316 safmin = slamch(
'Safe minimum' )
317 safe1 = real( nz )*safmin
333 CALL ccopy( n, b( 1, j ), 1, work, 1 )
334 CALL cgbmv( 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 cgbtrs( trans, n, kl, ku, 1, afb, ldafb, ipiv, work,
396 CALL caxpy( n, cone, work, 1, x( 1, j ), 1 )
425 IF( rwork( i ).GT.safe2 )
THEN
426 rwork( i ) = cabs1( work( i ) ) + real( nz )*
429 rwork( i ) = cabs1( work( i ) ) + real( nz )*
430 $ eps*rwork( i ) + safe1
436 CALL clacn2( n, work( n+1 ), work, ferr( j ), kase, isave )
442 CALL cgbtrs( transt, n, kl, ku, 1, afb, ldafb, ipiv,
445 work( i ) = rwork( i )*work( i )
452 work( i ) = rwork( i )*work( i )
454 CALL cgbtrs( transn, n, kl, ku, 1, afb, ldafb, ipiv,
464 lstres = max( lstres, cabs1( x( i, j ) ) )
467 $ ferr( j ) = ferr( j ) / lstres
subroutine cgbrfs(trans, n, kl, ku, nrhs, ab, ldab, afb, ldafb, ipiv, b, ldb, x, ldx, ferr, berr, work, rwork, info)
CGBRFS