111 SUBROUTINE dbdt02( M, N, B, LDB, C, LDC, U, LDU, WORK, RESID )
118 INTEGER LDB, LDC, LDU, M, N
119 DOUBLE PRECISION RESID
122 DOUBLE PRECISION B( LDB, * ), C( LDC, * ), U( LDU, * ),
129 DOUBLE PRECISION ZERO, ONE
130 parameter( zero = 0.0d+0, one = 1.0d+0 )
134 DOUBLE PRECISION BNORM, EPS, REALMN
137 DOUBLE PRECISION DASUM, DLAMCH, DLANGE
138 EXTERNAL dasum, dlamch, dlange
144 INTRINSIC dble, max, min
151 IF( m.LE.0 .OR. n.LE.0 )
153 realmn = dble( max( m, n ) )
154 eps = dlamch(
'Precision' )
159 CALL dcopy( m, b( 1, j ), 1, work, 1 )
160 CALL dgemv(
'No transpose', m, m, -one, u, ldu, c( 1, j ), 1,
162 resid = max( resid, dasum( m, work, 1 ) )
167 bnorm = dlange(
'1', m, n, b, ldb, work )
169 IF( bnorm.LE.zero )
THEN
173 IF( bnorm.GE.resid )
THEN
174 resid = ( resid / bnorm ) / ( realmn*eps )
176 IF( bnorm.LT.one )
THEN
177 resid = ( min( resid, realmn*bnorm ) / bnorm ) /
180 resid = min( resid / bnorm, realmn ) / ( realmn*eps )
subroutine dbdt02(m, n, b, ldb, c, ldc, u, ldu, work, resid)
DBDT02
subroutine dcopy(n, dx, incx, dy, incy)
DCOPY
subroutine dgemv(trans, m, n, alpha, a, lda, x, incx, beta, y, incy)
DGEMV