146 SUBROUTINE cbdt01( M, N, KD, A, LDA, Q, LDQ, D, E, PT, LDPT, WORK,
155 INTEGER KD, LDA, LDPT, LDQ, M, N
159 REAL D( * ), E( * ), RWORK( * )
160 COMPLEX A( lda, * ), PT( ldpt, * ), Q( ldq, * ),
168 parameter( zero = 0.0e+0, one = 1.0e+0 )
175 REAL CLANGE, SCASUM, SLAMCH
176 EXTERNAL clange, scasum, slamch
182 INTRINSIC cmplx, max, min, real
188 IF( m.LE.0 .OR. n.LE.0 )
THEN 200 IF( kd.NE.0 .AND. m.GE.n )
THEN 205 CALL ccopy( m, a( 1, j ), 1, work, 1 )
207 work( m+i ) = d( i )*pt( i, j ) + e( i )*pt( i+1, j )
209 work( m+n ) = d( n )*pt( n, j )
210 CALL cgemv(
'No transpose', m, n, -cmplx( one ), q, ldq,
211 $ work( m+1 ), 1, cmplx( one ), work, 1 )
212 resid = max( resid, scasum( m, work, 1 ) )
214 ELSE IF( kd.LT.0 )
THEN 219 CALL ccopy( m, a( 1, j ), 1, work, 1 )
221 work( m+i ) = d( i )*pt( i, j ) + e( i )*pt( i+1, j )
223 work( m+m ) = d( m )*pt( m, j )
224 CALL cgemv(
'No transpose', m, m, -cmplx( one ), q, ldq,
225 $ work( m+1 ), 1, cmplx( one ), work, 1 )
226 resid = max( resid, scasum( m, work, 1 ) )
233 CALL ccopy( m, a( 1, j ), 1, work, 1 )
234 work( m+1 ) = d( 1 )*pt( 1, j )
236 work( m+i ) = e( i-1 )*pt( i-1, j ) +
239 CALL cgemv(
'No transpose', m, m, -cmplx( one ), q, ldq,
240 $ work( m+1 ), 1, cmplx( one ), work, 1 )
241 resid = max( resid, scasum( m, work, 1 ) )
250 CALL ccopy( m, a( 1, j ), 1, work, 1 )
252 work( m+i ) = d( i )*pt( i, j )
254 CALL cgemv(
'No transpose', m, n, -cmplx( one ), q, ldq,
255 $ work( m+1 ), 1, cmplx( one ), work, 1 )
256 resid = max( resid, scasum( m, work, 1 ) )
260 CALL ccopy( m, a( 1, j ), 1, work, 1 )
262 work( m+i ) = d( i )*pt( i, j )
264 CALL cgemv(
'No transpose', m, m, -cmplx( one ), q, ldq,
265 $ work( m+1 ), 1, cmplx( one ), work, 1 )
266 resid = max( resid, scasum( m, work, 1 ) )
273 anorm = clange(
'1', m, n, a, lda, rwork )
274 eps = slamch(
'Precision' )
276 IF( anorm.LE.zero )
THEN 280 IF( anorm.GE.resid )
THEN 281 resid = ( resid / anorm ) / (
REAL( n )*EPS )
283 IF( anorm.LT.one )
THEN 284 resid = ( min( resid,
REAL( n )*ANORM ) / anorm ) /
287 resid = min( resid / anorm,
REAL( N ) ) /
subroutine cbdt01(M, N, KD, A, LDA, Q, LDQ, D, E, PT, LDPT, WORK, RWORK, RESID)
CBDT01
subroutine cgemv(TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
CGEMV
subroutine ccopy(N, CX, INCX, CY, INCY)
CCOPY