110 SUBROUTINE dbdt02( M, N, B, LDB, C, LDC, U, LDU, WORK, RESID )
117 INTEGER LDB, LDC, LDU, M, N
118 DOUBLE PRECISION RESID
121 DOUBLE PRECISION B( LDB, * ), C( LDC, * ), U( LDU, * ),
128 DOUBLE PRECISION ZERO, ONE
129 parameter( zero = 0.0d+0, one = 1.0d+0 )
133 DOUBLE PRECISION BNORM, EPS, REALMN
136 DOUBLE PRECISION DASUM, DLAMCH, DLANGE
137 EXTERNAL dasum, dlamch, dlange
143 INTRINSIC dble, max, min
150 IF( m.LE.0 .OR. n.LE.0 )
152 realmn = dble( max( m, n ) )
153 eps = dlamch(
'Precision' )
158 CALL dcopy( m, b( 1, j ), 1, work, 1 )
159 CALL dgemv(
'No transpose', m, m, -one, u, ldu, c( 1, j ), 1,
161 resid = max( resid, dasum( m, work, 1 ) )
166 bnorm = dlange(
'1', m, n, b, ldb, work )
168 IF( bnorm.LE.zero )
THEN
172 IF( bnorm.GE.resid )
THEN
173 resid = ( resid / bnorm ) / ( realmn*eps )
175 IF( bnorm.LT.one )
THEN
176 resid = ( min( resid, realmn*bnorm ) / bnorm ) /
179 resid = min( resid / bnorm, realmn ) / ( realmn*eps )
subroutine dcopy(N, DX, INCX, DY, INCY)
DCOPY
subroutine dgemv(TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
DGEMV
subroutine dbdt02(M, N, B, LDB, C, LDC, U, LDU, WORK, RESID)
DBDT02