179 SUBROUTINE zptrfs( UPLO, N, NRHS, D, E, DF, EF, B, LDB, X, LDX,
180 $ FERR, BERR, WORK, RWORK, INFO )
188 INTEGER INFO, LDB, LDX, N, NRHS
191 DOUBLE PRECISION BERR( * ), D( * ), DF( * ), FERR( * ),
193 COMPLEX*16 B( LDB, * ), E( * ), EF( * ), WORK( * ),
201 parameter( itmax = 5 )
202 DOUBLE PRECISION ZERO
203 parameter( zero = 0.0d+0 )
205 parameter( one = 1.0d+0 )
207 parameter( two = 2.0d+0 )
208 DOUBLE PRECISION THREE
209 parameter( three = 3.0d+0 )
213 INTEGER COUNT, I, IX, J, NZ
214 DOUBLE PRECISION EPS, LSTRES, S, SAFE1, SAFE2, SAFMIN
215 COMPLEX*16 BI, CX, DX, EX, ZDUM
220 DOUBLE PRECISION DLAMCH
221 EXTERNAL lsame, idamax, dlamch
227 INTRINSIC abs, dble, dcmplx, dconjg, dimag, max
230 DOUBLE PRECISION CABS1
233 cabs1( zdum ) = abs( dble( zdum ) ) + abs( dimag( zdum ) )
240 upper = lsame( uplo,
'U' )
241 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
243 ELSE IF( n.LT.0 )
THEN
245 ELSE IF( nrhs.LT.0 )
THEN
247 ELSE IF( ldb.LT.max( 1, n ) )
THEN
249 ELSE IF( ldx.LT.max( 1, n ) )
THEN
253 CALL xerbla(
'ZPTRFS', -info )
259 IF( n.EQ.0 .OR. nrhs.EQ.0 )
THEN
270 eps = dlamch(
'Epsilon' )
271 safmin = dlamch(
'Safe minimum' )
291 dx = d( 1 )*x( 1, j )
293 rwork( 1 ) = cabs1( bi ) + cabs1( dx )
296 dx = d( 1 )*x( 1, j )
297 ex = e( 1 )*x( 2, j )
298 work( 1 ) = bi - dx - ex
299 rwork( 1 ) = cabs1( bi ) + cabs1( dx ) +
300 $ cabs1( e( 1 ) )*cabs1( x( 2, j ) )
303 cx = dconjg( e( i-1 ) )*x( i-1, j )
304 dx = d( i )*x( i, j )
305 ex = e( i )*x( i+1, j )
306 work( i ) = bi - cx - dx - ex
307 rwork( i ) = cabs1( bi ) +
308 $ cabs1( e( i-1 ) )*cabs1( x( i-1, j ) ) +
309 $ cabs1( dx ) + cabs1( e( i ) )*
310 $ cabs1( x( i+1, j ) )
313 cx = dconjg( e( n-1 ) )*x( n-1, j )
314 dx = d( n )*x( n, j )
315 work( n ) = bi - cx - dx
316 rwork( n ) = cabs1( bi ) + cabs1( e( n-1 ) )*
317 $ cabs1( x( n-1, j ) ) + cabs1( dx )
322 dx = d( 1 )*x( 1, j )
324 rwork( 1 ) = cabs1( bi ) + cabs1( dx )
327 dx = d( 1 )*x( 1, j )
328 ex = dconjg( e( 1 ) )*x( 2, j )
329 work( 1 ) = bi - dx - ex
330 rwork( 1 ) = cabs1( bi ) + cabs1( dx ) +
331 $ cabs1( e( 1 ) )*cabs1( x( 2, j ) )
334 cx = e( i-1 )*x( i-1, j )
335 dx = d( i )*x( i, j )
336 ex = dconjg( e( i ) )*x( i+1, j )
337 work( i ) = bi - cx - dx - ex
338 rwork( i ) = cabs1( bi ) +
339 $ cabs1( e( i-1 ) )*cabs1( x( i-1, j ) ) +
340 $ cabs1( dx ) + cabs1( e( i ) )*
341 $ cabs1( x( i+1, j ) )
344 cx = e( n-1 )*x( n-1, j )
345 dx = d( n )*x( n, j )
346 work( n ) = bi - cx - dx
347 rwork( n ) = cabs1( bi ) + cabs1( e( n-1 ) )*
348 $ cabs1( x( n-1, j ) ) + cabs1( dx )
363 IF( rwork( i ).GT.safe2 )
THEN
364 s = max( s, cabs1( work( i ) ) / rwork( i ) )
366 s = max( s, ( cabs1( work( i ) )+safe1 ) /
367 $ ( rwork( i )+safe1 ) )
378 IF( berr( j ).GT.eps .AND. two*berr( j ).LE.lstres .AND.
379 $ count.LE.itmax )
THEN
383 CALL zpttrs( uplo, n, 1, df, ef, work, n, info )
384 CALL zaxpy( n, dcmplx( one ), work, 1, x( 1, j ), 1 )
409 IF( rwork( i ).GT.safe2 )
THEN
410 rwork( i ) = cabs1( work( i ) ) + nz*eps*rwork( i )
412 rwork( i ) = cabs1( work( i ) ) + nz*eps*rwork( i ) +
416 ix = idamax( n, rwork, 1 )
417 ferr( j ) = rwork( ix )
432 rwork( i ) = one + rwork( i-1 )*abs( ef( i-1 ) )
437 rwork( n ) = rwork( n ) / df( n )
438 DO 80 i = n - 1, 1, -1
439 rwork( i ) = rwork( i ) / df( i ) +
440 $ rwork( i+1 )*abs( ef( i ) )
445 ix = idamax( n, rwork, 1 )
446 ferr( j ) = ferr( j )*abs( rwork( ix ) )
452 lstres = max( lstres, abs( x( i, j ) ) )
455 $ ferr( j ) = ferr( j ) / lstres