176 SUBROUTINE csprfs( UPLO, N, NRHS, AP, AFP, IPIV, B, LDB, X,
178 $ FERR, BERR, WORK, RWORK, INFO )
186 INTEGER INFO, LDB, LDX, N, NRHS
190 REAL BERR( * ), FERR( * ), RWORK( * )
191 COMPLEX AFP( * ), AP( * ), B( LDB, * ), WORK( * ),
199 PARAMETER ( ITMAX = 5 )
201 parameter( zero = 0.0e+0 )
203 parameter( one = ( 1.0e+0, 0.0e+0 ) )
205 parameter( two = 2.0e+0 )
207 parameter( three = 3.0e+0 )
211 INTEGER COUNT, I, IK, J, K, KASE, KK, NZ
212 REAL EPS, LSTRES, S, SAFE1, SAFE2, SAFMIN, XK
223 INTRINSIC abs, aimag, max, real
228 EXTERNAL lsame, slamch
234 cabs1( zdum ) = abs( real( zdum ) ) + abs( aimag( zdum ) )
241 upper = lsame( uplo,
'U' )
242 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
244 ELSE IF( n.LT.0 )
THEN
246 ELSE IF( nrhs.LT.0 )
THEN
248 ELSE IF( ldb.LT.max( 1, n ) )
THEN
250 ELSE IF( ldx.LT.max( 1, n ) )
THEN
254 CALL xerbla(
'CSPRFS', -info )
260 IF( n.EQ.0 .OR. nrhs.EQ.0 )
THEN
271 eps = slamch(
'Epsilon' )
272 safmin = slamch(
'Safe minimum' )
273 safe1 = real( nz )*safmin
288 CALL ccopy( n, b( 1, j ), 1, work, 1 )
289 CALL cspmv( uplo, n, -one, ap, x( 1, j ), 1, one, work, 1 )
301 rwork( i ) = cabs1( b( i, j ) )
310 xk = cabs1( x( k, j ) )
313 rwork( i ) = rwork( i ) + cabs1( ap( ik ) )*xk
314 s = s + cabs1( ap( ik ) )*cabs1( x( i, j ) )
317 rwork( k ) = rwork( k ) + cabs1( ap( kk+k-1 ) )*xk + s
323 xk = cabs1( x( k, j ) )
324 rwork( k ) = rwork( k ) + cabs1( ap( kk ) )*xk
327 rwork( i ) = rwork( i ) + cabs1( ap( ik ) )*xk
328 s = s + cabs1( ap( ik ) )*cabs1( x( i, j ) )
331 rwork( k ) = rwork( k ) + s
337 IF( rwork( i ).GT.safe2 )
THEN
338 s = max( s, cabs1( work( i ) ) / rwork( i ) )
340 s = max( s, ( cabs1( work( i ) )+safe1 ) /
341 $ ( rwork( i )+safe1 ) )
352 IF( berr( j ).GT.eps .AND. two*berr( j ).LE.lstres .AND.
353 $ count.LE.itmax )
THEN
357 CALL csptrs( uplo, n, 1, afp, ipiv, work, n, info )
358 CALL caxpy( n, one, work, 1, x( 1, j ), 1 )
387 IF( rwork( i ).GT.safe2 )
THEN
388 rwork( i ) = cabs1( work( i ) ) + real( nz )*
391 rwork( i ) = cabs1( work( i ) ) + real( nz )*
392 $ eps*rwork( i ) + safe1
398 CALL clacn2( n, work( n+1 ), work, ferr( j ), kase, isave )
404 CALL csptrs( uplo, n, 1, afp, ipiv, work, n, info )
406 work( i ) = rwork( i )*work( i )
408 ELSE IF( kase.EQ.2 )
THEN
413 work( i ) = rwork( i )*work( i )
415 CALL csptrs( uplo, n, 1, afp, ipiv, work, n, info )
424 lstres = max( lstres, cabs1( x( i, j ) ) )
427 $ ferr( j ) = ferr( j ) / lstres
subroutine csprfs(uplo, n, nrhs, ap, afp, ipiv, b, ldb, x, ldx, ferr, berr, work, rwork, info)
CSPRFS