144 SUBROUTINE cbdt01( M, N, KD, A, LDA, Q, LDQ, D, E, PT, LDPT, WORK,
152 INTEGER KD, LDA, LDPT, LDQ, M, N
156 REAL D( * ), E( * ), RWORK( * )
157 COMPLEX A( LDA, * ), PT( LDPT, * ), Q( LDQ, * ),
165 parameter( zero = 0.0e+0, one = 1.0e+0 )
172 REAL CLANGE, SCASUM, SLAMCH
173 EXTERNAL clange, scasum, slamch
179 INTRINSIC cmplx, max, min, real
185 IF( m.LE.0 .OR. n.LE.0 )
THEN
197 IF( kd.NE.0 .AND. m.GE.n )
THEN
202 CALL ccopy( 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 cgemv(
'No transpose', m, n, -cmplx( one ), q, ldq,
208 $ work( m+1 ), 1, cmplx( one ), work, 1 )
209 resid = max( resid, scasum( m, work, 1 ) )
211 ELSE IF( kd.LT.0 )
THEN
216 CALL ccopy( 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 cgemv(
'No transpose', m, m, -cmplx( one ), q, ldq,
222 $ work( m+1 ), 1, cmplx( one ), work, 1 )
223 resid = max( resid, scasum( m, work, 1 ) )
230 CALL ccopy( 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 cgemv(
'No transpose', m, m, -cmplx( one ), q, ldq,
237 $ work( m+1 ), 1, cmplx( one ), work, 1 )
238 resid = max( resid, scasum( m, work, 1 ) )
247 CALL ccopy( m, a( 1, j ), 1, work, 1 )
249 work( m+i ) = d( i )*pt( i, j )
251 CALL cgemv(
'No transpose', m, n, -cmplx( one ), q, ldq,
252 $ work( m+1 ), 1, cmplx( one ), work, 1 )
253 resid = max( resid, scasum( m, work, 1 ) )
257 CALL ccopy( m, a( 1, j ), 1, work, 1 )
259 work( m+i ) = d( i )*pt( i, j )
261 CALL cgemv(
'No transpose', m, m, -cmplx( one ), q, ldq,
262 $ work( m+1 ), 1, cmplx( one ), work, 1 )
263 resid = max( resid, scasum( m, work, 1 ) )
270 anorm = clange(
'1', m, n, a, lda, rwork )
271 eps = slamch(
'Precision' )
273 IF( anorm.LE.zero )
THEN
277 IF( anorm.GE.resid )
THEN
278 resid = ( resid / anorm ) / ( real( n )*eps )
280 IF( anorm.LT.one )
THEN
281 resid = ( min( resid, real( n )*anorm ) / anorm ) /
284 resid = min( resid / anorm, real( n ) ) /
subroutine ccopy(N, CX, INCX, CY, INCY)
CCOPY
subroutine cgemv(TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
CGEMV
subroutine cbdt01(M, N, KD, A, LDA, Q, LDQ, D, E, PT, LDPT, WORK, RWORK, RESID)
CBDT01