188 SUBROUTINE csyrfs( UPLO, N, NRHS, A, LDA, AF, LDAF, IPIV, B,
190 $ X, LDX, FERR, BERR, WORK, RWORK, INFO )
198 INTEGER INFO, LDA, LDAF, LDB, LDX, N, NRHS
202 REAL BERR( * ), FERR( * ), RWORK( * )
203 COMPLEX A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
204 $ work( * ), x( ldx, * )
211 PARAMETER ( ITMAX = 5 )
213 parameter( zero = 0.0e+0 )
215 parameter( one = ( 1.0e+0, 0.0e+0 ) )
217 parameter( two = 2.0e+0 )
219 parameter( three = 3.0e+0 )
223 INTEGER COUNT, I, J, K, KASE, NZ
224 REAL EPS, LSTRES, S, SAFE1, SAFE2, SAFMIN, XK
235 INTRINSIC abs, aimag, max, real
240 EXTERNAL lsame, slamch
246 cabs1( zdum ) = abs( real( zdum ) ) + abs( aimag( zdum ) )
253 upper = lsame( uplo,
'U' )
254 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
256 ELSE IF( n.LT.0 )
THEN
258 ELSE IF( nrhs.LT.0 )
THEN
260 ELSE IF( lda.LT.max( 1, n ) )
THEN
262 ELSE IF( ldaf.LT.max( 1, n ) )
THEN
264 ELSE IF( ldb.LT.max( 1, n ) )
THEN
266 ELSE IF( ldx.LT.max( 1, n ) )
THEN
270 CALL xerbla(
'CSYRFS', -info )
276 IF( n.EQ.0 .OR. nrhs.EQ.0 )
THEN
287 eps = slamch(
'Epsilon' )
288 safmin = slamch(
'Safe minimum' )
289 safe1 = real( nz )*safmin
304 CALL ccopy( n, b( 1, j ), 1, work, 1 )
305 CALL csymv( uplo, n, -one, a, lda, x( 1, j ), 1, one, work,
318 rwork( i ) = cabs1( b( i, j ) )
326 xk = cabs1( x( k, j ) )
328 rwork( i ) = rwork( i ) + cabs1( a( i, k ) )*xk
329 s = s + cabs1( a( i, k ) )*cabs1( x( i, j ) )
331 rwork( k ) = rwork( k ) + cabs1( a( k, k ) )*xk + s
336 xk = cabs1( x( k, j ) )
337 rwork( k ) = rwork( k ) + cabs1( a( k, k ) )*xk
339 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 csytrs( uplo, 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 csytrs( uplo, n, 1, af, ldaf, ipiv, work, n,
417 work( i ) = rwork( i )*work( i )
419 ELSE IF( kase.EQ.2 )
THEN
424 work( i ) = rwork( i )*work( i )
426 CALL csytrs( uplo, n, 1, af, ldaf, ipiv, work, n,
436 lstres = max( lstres, cabs1( x( i, j ) ) )
439 $ ferr( j ) = ferr( j ) / lstres
subroutine csyrfs(uplo, n, nrhs, a, lda, af, ldaf, ipiv, b, ldb, x, ldx, ferr, berr, work, rwork, info)
CSYRFS