117 SUBROUTINE zbdt02( M, N, B, LDB, C, LDC, U, LDU, WORK, RWORK,
125 INTEGER LDB, LDC, LDU, M, N
126 DOUBLE PRECISION RESID
129 DOUBLE PRECISION RWORK( * )
130 COMPLEX*16 B( LDB, * ), C( LDC, * ), U( LDU, * ),
137 DOUBLE PRECISION ZERO, ONE
138 parameter( zero = 0.0d+0, one = 1.0d+0 )
142 DOUBLE PRECISION BNORM, EPS, REALMN
145 DOUBLE PRECISION DLAMCH, DZASUM, ZLANGE
146 EXTERNAL dlamch, dzasum, zlange
152 INTRINSIC dble, dcmplx, max, min
159 IF( m.LE.0 .OR. n.LE.0 )
161 realmn = dble( max( m, n ) )
162 eps = dlamch(
'Precision' )
167 CALL zcopy( m, b( 1, j ), 1, work, 1 )
168 CALL zgemv(
'No transpose', m, m, -dcmplx( one ), u, ldu,
169 $ c( 1, j ), 1, dcmplx( one ), work, 1 )
170 resid = max( resid, dzasum( m, work, 1 ) )
175 bnorm = zlange(
'1', m, n, b, ldb, rwork )
177 IF( bnorm.LE.zero )
THEN
181 IF( bnorm.GE.resid )
THEN
182 resid = ( resid / bnorm ) / ( realmn*eps )
184 IF( bnorm.LT.one )
THEN
185 resid = ( min( resid, realmn*bnorm ) / bnorm ) /
188 resid = min( resid / bnorm, realmn ) / ( realmn*eps )
subroutine zcopy(N, ZX, INCX, ZY, INCY)
ZCOPY
subroutine zgemv(TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
ZGEMV
subroutine zbdt02(M, N, B, LDB, C, LDC, U, LDU, WORK, RWORK, RESID)
ZBDT02