138 SUBROUTINE dbdt01( M, N, KD, A, LDA, Q, LDQ, D, E, PT, LDPT, WORK,
146 INTEGER KD, LDA, LDPT, LDQ, M, N
147 DOUBLE PRECISION RESID
150 DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), PT( LDPT, * ),
151 $ q( ldq, * ), work( * )
157 DOUBLE PRECISION ZERO, ONE
158 parameter( zero = 0.0d+0, one = 1.0d+0 )
162 DOUBLE PRECISION ANORM, EPS
165 DOUBLE PRECISION DASUM, DLAMCH, DLANGE
166 EXTERNAL dasum, dlamch, dlange
172 INTRINSIC dble, max, min
178 IF( m.LE.0 .OR. n.LE.0 )
THEN
190 IF( kd.NE.0 .AND. m.GE.n )
THEN
195 CALL dcopy( m, a( 1, j ), 1, work, 1 )
197 work( m+i ) = d( i )*pt( i, j ) + e( i )*pt( i+1, j )
199 work( m+n ) = d( n )*pt( n, j )
200 CALL dgemv(
'No transpose', m, n, -one, q, ldq,
201 $ work( m+1 ), 1, one, work, 1 )
202 resid = max( resid, dasum( m, work, 1 ) )
204 ELSE IF( kd.LT.0 )
THEN
209 CALL dcopy( m, a( 1, j ), 1, work, 1 )
211 work( m+i ) = d( i )*pt( i, j ) + e( i )*pt( i+1, j )
213 work( m+m ) = d( m )*pt( m, j )
214 CALL dgemv(
'No transpose', m, m, -one, q, ldq,
215 $ work( m+1 ), 1, one, work, 1 )
216 resid = max( resid, dasum( m, work, 1 ) )
223 CALL dcopy( m, a( 1, j ), 1, work, 1 )
224 work( m+1 ) = d( 1 )*pt( 1, j )
226 work( m+i ) = e( i-1 )*pt( i-1, j ) +
229 CALL dgemv(
'No transpose', m, m, -one, q, ldq,
230 $ work( m+1 ), 1, one, work, 1 )
231 resid = max( resid, dasum( m, work, 1 ) )
240 CALL dcopy( m, a( 1, j ), 1, work, 1 )
242 work( m+i ) = d( i )*pt( i, j )
244 CALL dgemv(
'No transpose', m, n, -one, q, ldq,
245 $ work( m+1 ), 1, one, work, 1 )
246 resid = max( resid, dasum( m, work, 1 ) )
250 CALL dcopy( m, a( 1, j ), 1, work, 1 )
252 work( m+i ) = d( i )*pt( i, j )
254 CALL dgemv(
'No transpose', m, m, -one, q, ldq,
255 $ work( m+1 ), 1, one, work, 1 )
256 resid = max( resid, dasum( m, work, 1 ) )
263 anorm = dlange(
'1', m, n, a, lda, work )
264 eps = dlamch(
'Precision' )
266 IF( anorm.LE.zero )
THEN
270 IF( anorm.GE.resid )
THEN
271 resid = ( resid / anorm ) / ( dble( n )*eps )
273 IF( anorm.LT.one )
THEN
274 resid = ( min( resid, dble( n )*anorm ) / anorm ) /
277 resid = min( resid / anorm, dble( n ) ) /
subroutine dcopy(N, DX, INCX, DY, INCY)
DCOPY
subroutine dgemv(TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
DGEMV
subroutine dbdt01(M, N, KD, A, LDA, Q, LDQ, D, E, PT, LDPT, WORK, RESID)
DBDT01