159 SUBROUTINE dptrfs( N, NRHS, D, E, DF, EF, B, LDB, X, LDX, FERR,
167 INTEGER INFO, LDB, LDX, N, NRHS
170 DOUBLE PRECISION B( LDB, * ), BERR( * ), D( * ), DF( * ),
171 $ e( * ), ef( * ), ferr( * ), work( * ),
179 parameter( itmax = 5 )
180 DOUBLE PRECISION ZERO
181 parameter( zero = 0.0d+0 )
183 parameter( one = 1.0d+0 )
185 parameter( two = 2.0d+0 )
186 DOUBLE PRECISION THREE
187 parameter( three = 3.0d+0 )
190 INTEGER COUNT, I, IX, J, NZ
191 DOUBLE PRECISION BI, CX, DX, EPS, EX, LSTRES, S, SAFE1, SAFE2,
202 DOUBLE PRECISION DLAMCH
203 EXTERNAL idamax, dlamch
212 ELSE IF( nrhs.LT.0 )
THEN
214 ELSE IF( ldb.LT.max( 1, n ) )
THEN
216 ELSE IF( ldx.LT.max( 1, n ) )
THEN
220 CALL xerbla(
'DPTRFS', -info )
226 IF( n.EQ.0 .OR. nrhs.EQ.0 )
THEN
237 eps = dlamch(
'Epsilon' )
238 safmin = dlamch(
'Safe minimum' )
257 dx = d( 1 )*x( 1, j )
258 work( n+1 ) = bi - dx
259 work( 1 ) = abs( bi ) + abs( dx )
262 dx = d( 1 )*x( 1, j )
263 ex = e( 1 )*x( 2, j )
264 work( n+1 ) = bi - dx - ex
265 work( 1 ) = abs( bi ) + abs( dx ) + abs( ex )
268 cx = e( i-1 )*x( i-1, j )
269 dx = d( i )*x( i, j )
270 ex = e( i )*x( i+1, j )
271 work( n+i ) = bi - cx - dx - ex
272 work( i ) = abs( bi ) + abs( cx ) + abs( dx ) + abs( ex )
275 cx = e( n-1 )*x( n-1, j )
276 dx = d( n )*x( n, j )
277 work( n+n ) = bi - cx - dx
278 work( n ) = abs( bi ) + abs( cx ) + abs( dx )
292 IF( work( i ).GT.safe2 )
THEN
293 s = max( s, abs( work( n+i ) ) / work( i ) )
295 s = max( s, ( abs( work( n+i ) )+safe1 ) /
296 $ ( work( i )+safe1 ) )
307 IF( berr( j ).GT.eps .AND. two*berr( j ).LE.lstres .AND.
308 $ count.LE.itmax )
THEN
312 CALL dpttrs( n, 1, df, ef, work( n+1 ), n, info )
313 CALL daxpy( n, one, work( n+1 ), 1, x( 1, j ), 1 )
338 IF( work( i ).GT.safe2 )
THEN
339 work( i ) = abs( work( n+i ) ) + nz*eps*work( i )
341 work( i ) = abs( work( n+i ) ) + nz*eps*work( i ) + safe1
344 ix = idamax( n, work, 1 )
345 ferr( j ) = work( ix )
360 work( i ) = one + work( i-1 )*abs( ef( i-1 ) )
365 work( n ) = work( n ) / df( n )
366 DO 70 i = n - 1, 1, -1
367 work( i ) = work( i ) / df( i ) + work( i+1 )*abs( ef( i ) )
372 ix = idamax( n, work, 1 )
373 ferr( j ) = ferr( j )*abs( work( ix ) )
379 lstres = max( lstres, abs( x( i, j ) ) )
382 $ ferr( j ) = ferr( j ) / lstres
subroutine dptrfs(n, nrhs, d, e, df, ef, b, ldb, x, ldx, ferr, berr, work, info)
DPTRFS