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 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