159 SUBROUTINE dtpt03( UPLO, TRANS, DIAG, N, NRHS, AP, SCALE, CNORM,
160 $ TSCAL, X, LDX, B, LDB, WORK, RESID )
167 CHARACTER DIAG, TRANS, UPLO
168 INTEGER LDB, LDX, N, NRHS
169 DOUBLE PRECISION RESID, SCALE, TSCAL
172 DOUBLE PRECISION AP( * ), B( LDB, * ), CNORM( * ), WORK( * ),
179 DOUBLE PRECISION ONE, ZERO
180 parameter( one = 1.0d+0, zero = 0.0d+0 )
184 DOUBLE PRECISION BIGNUM, EPS, ERR, SMLNUM, TNORM, XNORM, XSCAL
189 DOUBLE PRECISION DLAMCH
190 EXTERNAL lsame, idamax, dlamch
196 INTRINSIC abs, dble, max
202 IF( n.LE.0 .OR. nrhs.LE.0 )
THEN
206 eps = dlamch(
'Epsilon' )
207 smlnum = dlamch(
'Safe minimum' )
208 bignum = one / smlnum
209 CALL dlabad( smlnum, bignum )
215 IF( lsame( diag,
'N' ) )
THEN
216 IF( lsame( uplo,
'U' ) )
THEN
219 tnorm = max( tnorm, tscal*abs( ap( jj ) )+cnorm( j ) )
225 tnorm = max( tnorm, tscal*abs( ap( jj ) )+cnorm( j ) )
231 tnorm = max( tnorm, tscal+cnorm( j ) )
240 CALL dcopy( n, x( 1, j ), 1, work, 1 )
241 ix = idamax( n, work, 1 )
242 xnorm = max( one, abs( x( ix, j ) ) )
243 xscal = ( one / xnorm ) / dble( n )
244 CALL dscal( n, xscal, work, 1 )
245 CALL dtpmv( uplo, trans, diag, n, ap, work, 1 )
246 CALL daxpy( n, -scale*xscal, b( 1, j ), 1, work, 1 )
247 ix = idamax( n, work, 1 )
248 err = tscal*abs( work( ix ) )
249 ix = idamax( n, x( 1, j ), 1 )
250 xnorm = abs( x( ix, j ) )
251 IF( err*smlnum.LE.xnorm )
THEN
258 IF( err*smlnum.LE.tnorm )
THEN
265 resid = max( resid, err )
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine dcopy(N, DX, INCX, DY, INCY)
DCOPY
subroutine dscal(N, DA, DX, INCX)
DSCAL
subroutine daxpy(N, DA, DX, INCX, DY, INCY)
DAXPY
subroutine dtpmv(UPLO, TRANS, DIAG, N, AP, X, INCX)
DTPMV
subroutine dtpt03(UPLO, TRANS, DIAG, N, NRHS, AP, SCALE, CNORM, TSCAL, X, LDX, B, LDB, WORK, RESID)
DTPT03