176 SUBROUTINE zhprfs( UPLO, N, NRHS, AP, AFP, IPIV, B, LDB, X,
178 $ FERR, BERR, WORK, RWORK, INFO )
186 INTEGER INFO, LDB, LDX, N, NRHS
190 DOUBLE PRECISION BERR( * ), FERR( * ), RWORK( * )
191 COMPLEX*16 AFP( * ), AP( * ), B( LDB, * ), WORK( * ),
199 PARAMETER ( ITMAX = 5 )
200 DOUBLE PRECISION ZERO
201 parameter( zero = 0.0d+0 )
203 parameter( one = ( 1.0d+0, 0.0d+0 ) )
205 parameter( two = 2.0d+0 )
206 DOUBLE PRECISION THREE
207 parameter( three = 3.0d+0 )
211 INTEGER COUNT, I, IK, J, K, KASE, KK, NZ
212 DOUBLE PRECISION EPS, LSTRES, S, SAFE1, SAFE2, SAFMIN, XK
223 INTRINSIC abs, dble, dimag, max
227 DOUBLE PRECISION DLAMCH
228 EXTERNAL lsame, dlamch
231 DOUBLE PRECISION CABS1
234 cabs1( zdum ) = abs( dble( zdum ) ) + abs( dimag( 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(
'ZHPRFS', -info )
260 IF( n.EQ.0 .OR. nrhs.EQ.0 )
THEN
271 eps = dlamch(
'Epsilon' )
272 safmin = dlamch(
'Safe minimum' )
288 CALL zcopy( n, b( 1, j ), 1, work, 1 )
289 CALL zhpmv( 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 ) + abs( dble( ap( kk+k-1 ) ) )*
324 xk = cabs1( x( k, j ) )
325 rwork( k ) = rwork( k ) + abs( dble( ap( kk ) ) )*xk
328 rwork( i ) = rwork( i ) + cabs1( ap( ik ) )*xk
329 s = s + cabs1( ap( ik ) )*cabs1( x( i, j ) )
332 rwork( k ) = rwork( k ) + s
338 IF( rwork( i ).GT.safe2 )
THEN
339 s = max( s, cabs1( work( i ) ) / rwork( i ) )
341 s = max( s, ( cabs1( work( i ) )+safe1 ) /
342 $ ( rwork( i )+safe1 ) )
353 IF( berr( j ).GT.eps .AND. two*berr( j ).LE.lstres .AND.
354 $ count.LE.itmax )
THEN
358 CALL zhptrs( uplo, n, 1, afp, ipiv, work, n, info )
359 CALL zaxpy( n, one, work, 1, x( 1, j ), 1 )
388 IF( rwork( i ).GT.safe2 )
THEN
389 rwork( i ) = cabs1( work( i ) ) + nz*eps*rwork( i )
391 rwork( i ) = cabs1( work( i ) ) + nz*eps*rwork( i ) +
398 CALL zlacn2( n, work( n+1 ), work, ferr( j ), kase, isave )
404 CALL zhptrs( 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 zhptrs( uplo, n, 1, afp, ipiv, work, n, info )
424 lstres = max( lstres, cabs1( x( i, j ) ) )
427 $ ferr( j ) = ferr( j ) / lstres
subroutine zhprfs(uplo, n, nrhs, ap, afp, ipiv, b, ldb, x, ldx, ferr, berr, work, rwork, info)
ZHPRFS