144 SUBROUTINE zbdt01( M, N, KD, A, LDA, Q, LDQ, D, E, PT, LDPT, WORK,
152 INTEGER KD, LDA, LDPT, LDQ, M, N
153 DOUBLE PRECISION RESID
156 DOUBLE PRECISION D( * ), E( * ), RWORK( * )
157 COMPLEX*16 A( LDA, * ), PT( LDPT, * ), Q( LDQ, * ),
164 DOUBLE PRECISION ZERO, ONE
165 parameter( zero = 0.0d+0, one = 1.0d+0 )
169 DOUBLE PRECISION ANORM, EPS
172 DOUBLE PRECISION DLAMCH, DZASUM, ZLANGE
173 EXTERNAL dlamch, dzasum, zlange
179 INTRINSIC dble, dcmplx, max, min
185 IF( m.LE.0 .OR. n.LE.0 )
THEN
197 IF( kd.NE.0 .AND. m.GE.n )
THEN
202 CALL zcopy( m, a( 1, j ), 1, work, 1 )
204 work( m+i ) = d( i )*pt( i, j ) + e( i )*pt( i+1, j )
206 work( m+n ) = d( n )*pt( n, j )
207 CALL zgemv(
'No transpose', m, n, -dcmplx( one ), q, ldq,
208 $ work( m+1 ), 1, dcmplx( one ), work, 1 )
209 resid = max( resid, dzasum( m, work, 1 ) )
211 ELSE IF( kd.LT.0 )
THEN
216 CALL zcopy( m, a( 1, j ), 1, work, 1 )
218 work( m+i ) = d( i )*pt( i, j ) + e( i )*pt( i+1, j )
220 work( m+m ) = d( m )*pt( m, j )
221 CALL zgemv(
'No transpose', m, m, -dcmplx( one ), q, ldq,
222 $ work( m+1 ), 1, dcmplx( one ), work, 1 )
223 resid = max( resid, dzasum( m, work, 1 ) )
230 CALL zcopy( m, a( 1, j ), 1, work, 1 )
231 work( m+1 ) = d( 1 )*pt( 1, j )
233 work( m+i ) = e( i-1 )*pt( i-1, j ) +
236 CALL zgemv(
'No transpose', m, m, -dcmplx( one ), q, ldq,
237 $ work( m+1 ), 1, dcmplx( one ), work, 1 )
238 resid = max( resid, dzasum( m, work, 1 ) )
247 CALL zcopy( m, a( 1, j ), 1, work, 1 )
249 work( m+i ) = d( i )*pt( i, j )
251 CALL zgemv(
'No transpose', m, n, -dcmplx( one ), q, ldq,
252 $ work( m+1 ), 1, dcmplx( one ), work, 1 )
253 resid = max( resid, dzasum( m, work, 1 ) )
257 CALL zcopy( m, a( 1, j ), 1, work, 1 )
259 work( m+i ) = d( i )*pt( i, j )
261 CALL zgemv(
'No transpose', m, m, -dcmplx( one ), q, ldq,
262 $ work( m+1 ), 1, dcmplx( one ), work, 1 )
263 resid = max( resid, dzasum( m, work, 1 ) )
270 anorm = zlange(
'1', m, n, a, lda, rwork )
271 eps = dlamch(
'Precision' )
273 IF( anorm.LE.zero )
THEN
277 IF( anorm.GE.resid )
THEN
278 resid = ( resid / anorm ) / ( dble( n )*eps )
280 IF( anorm.LT.one )
THEN
281 resid = ( min( resid, dble( n )*anorm ) / anorm ) /
284 resid = min( resid / anorm, dble( n ) ) /
subroutine zcopy(N, ZX, INCX, ZY, INCY)
ZCOPY
subroutine zgemv(TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
ZGEMV
subroutine zbdt01(M, N, KD, A, LDA, Q, LDQ, D, E, PT, LDPT, WORK, RWORK, RESID)
ZBDT01