167 SUBROUTINE dtrt03( UPLO, TRANS, DIAG, N, NRHS, A, LDA, SCALE,
168 $ CNORM, TSCAL, X, LDX, B, LDB, WORK, RESID )
175 CHARACTER DIAG, TRANS, UPLO
176 INTEGER LDA, LDB, LDX, N, NRHS
177 DOUBLE PRECISION RESID, SCALE, TSCAL
180 DOUBLE PRECISION A( LDA, * ), B( LDB, * ), CNORM( * ),
181 $ work( * ), x( ldx, * )
187 DOUBLE PRECISION ONE, ZERO
188 parameter( one = 1.0d+0, zero = 0.0d+0 )
192 DOUBLE PRECISION BIGNUM, EPS, ERR, SMLNUM, TNORM, XNORM, XSCAL
197 DOUBLE PRECISION DLAMCH
198 EXTERNAL lsame, idamax, dlamch
204 INTRINSIC abs, dble, max
210 IF( n.LE.0 .OR. nrhs.LE.0 )
THEN
214 eps = dlamch(
'Epsilon' )
215 smlnum = dlamch(
'Safe minimum' )
216 bignum = one / smlnum
217 CALL dlabad( smlnum, bignum )
223 IF( lsame( diag,
'N' ) )
THEN
225 tnorm = max( tnorm, tscal*abs( a( j, j ) )+cnorm( j ) )
229 tnorm = max( tnorm, tscal+cnorm( j ) )
238 CALL dcopy( n, x( 1, j ), 1, work, 1 )
239 ix = idamax( n, work, 1 )
240 xnorm = max( one, abs( x( ix, j ) ) )
241 xscal = ( one / xnorm ) / dble( n )
242 CALL dscal( n, xscal, work, 1 )
243 CALL dtrmv( uplo, trans, diag, n, a, lda, work, 1 )
244 CALL daxpy( n, -scale*xscal, b( 1, j ), 1, work, 1 )
245 ix = idamax( n, work, 1 )
246 err = tscal*abs( work( ix ) )
247 ix = idamax( n, x( 1, j ), 1 )
248 xnorm = abs( x( ix, j ) )
249 IF( err*smlnum.LE.xnorm )
THEN
256 IF( err*smlnum.LE.tnorm )
THEN
263 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 dtrmv(UPLO, TRANS, DIAG, N, A, LDA, X, INCX)
DTRMV
subroutine dtrt03(UPLO, TRANS, DIAG, N, NRHS, A, LDA, SCALE, CNORM, TSCAL, X, LDX, B, LDB, WORK, RESID)
DTRT03