182 SUBROUTINE cgerfs( TRANS, N, NRHS, A, LDA, AF, LDAF, IPIV, B,
184 $ X, LDX, FERR, BERR, WORK, RWORK, INFO )
192 INTEGER INFO, LDA, LDAF, LDB, LDX, N, NRHS
196 REAL BERR( * ), FERR( * ), RWORK( * )
197 COMPLEX A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
198 $ work( * ), x( ldx, * )
205 PARAMETER ( ITMAX = 5 )
207 parameter( zero = 0.0e+0 )
209 parameter( one = ( 1.0e+0, 0.0e+0 ) )
211 parameter( two = 2.0e+0 )
213 parameter( three = 3.0e+0 )
217 CHARACTER TRANSN, TRANST
218 INTEGER COUNT, I, J, K, KASE, NZ
219 REAL EPS, LSTRES, S, SAFE1, SAFE2, SAFMIN, XK
228 EXTERNAL lsame, slamch
235 INTRINSIC abs, aimag, max, real
241 cabs1( zdum ) = abs( real( zdum ) ) + abs( aimag( zdum ) )
248 notran = lsame( trans,
'N' )
249 IF( .NOT.notran .AND. .NOT.lsame( trans,
'T' ) .AND. .NOT.
250 $ lsame( trans,
'C' ) )
THEN
252 ELSE IF( n.LT.0 )
THEN
254 ELSE IF( nrhs.LT.0 )
THEN
256 ELSE IF( lda.LT.max( 1, n ) )
THEN
258 ELSE IF( ldaf.LT.max( 1, n ) )
THEN
260 ELSE IF( ldb.LT.max( 1, n ) )
THEN
262 ELSE IF( ldx.LT.max( 1, n ) )
THEN
266 CALL xerbla(
'CGERFS', -info )
272 IF( n.EQ.0 .OR. nrhs.EQ.0 )
THEN
291 eps = slamch(
'Epsilon' )
292 safmin = slamch(
'Safe minimum' )
293 safe1 = real( nz )*safmin
309 CALL ccopy( n, b( 1, j ), 1, work, 1 )
310 CALL cgemv( trans, n, n, -one, a, lda, x( 1, j ), 1, one,
324 rwork( i ) = cabs1( b( i, j ) )
331 xk = cabs1( x( k, j ) )
333 rwork( i ) = rwork( i ) + cabs1( a( i, k ) )*xk
340 s = s + cabs1( a( 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 cgetrs( trans, n, 1, af, ldaf, ipiv, 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 cgetrs( transt, n, 1, af, ldaf, ipiv, work, n,
417 work( i ) = rwork( i )*work( i )
424 work( i ) = rwork( i )*work( i )
426 CALL cgetrs( transn, n, 1, af, ldaf, ipiv, work, n,
436 lstres = max( lstres, cabs1( x( i, j ) ) )
439 $ ferr( j ) = ferr( j ) / lstres
subroutine cgerfs(trans, n, nrhs, a, lda, af, ldaf, ipiv, b, ldb, x, ldx, ferr, berr, work, rwork, info)
CGERFS