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