147 SUBROUTINE dsbt21( UPLO, N, KA, KS, A, LDA, D, E, U, LDU, WORK,
157 INTEGER KA, KS, LDA, LDU, N
160 DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), RESULT( 2 ),
161 $ u( ldu, * ), work( * )
167 DOUBLE PRECISION ZERO, ONE
168 parameter( zero = 0.0d0, one = 1.0d0 )
173 INTEGER IKA, J, JC, JR, LW
174 DOUBLE PRECISION ANORM, ULP, UNFL, WNORM
178 DOUBLE PRECISION DLAMCH, DLANGE, DLANSB, DLANSP
179 EXTERNAL lsame, dlamch, dlange, dlansb, dlansp
185 INTRINSIC dble, max, min
196 ika = max( 0, min( n-1, ka ) )
197 lw = ( n*( n+1 ) ) / 2
199 IF( lsame( uplo,
'U' ) )
THEN
207 unfl = dlamch(
'Safe minimum' )
208 ulp = dlamch(
'Epsilon' )*dlamch(
'Base' )
216 anorm = max( dlansb(
'1', cuplo, n, ika, a, lda, work ), unfl )
225 DO 10 jr = 1, min( ika+1, n+1-jc )
227 work( j ) = a( jr, jc )
229 DO 20 jr = ika + 2, n + 1 - jc
234 DO 30 jr = ika + 2, jc
238 DO 40 jr = min( ika, jc-1 ), 0, -1
240 work( j ) = a( ika+1-jr, jc )
246 CALL dspr( cuplo, n, -d( j ), u( 1, j ), 1, work )
249 IF( n.GT.1 .AND. ks.EQ.1 )
THEN
251 CALL dspr2( cuplo, n, -e( j ), u( 1, j ), 1, u( 1, j+1 ), 1,
255 wnorm = dlansp(
'1', cuplo, n, work, work( lw+1 ) )
257 IF( anorm.GT.wnorm )
THEN
258 result( 1 ) = ( wnorm / anorm ) / ( n*ulp )
260 IF( anorm.LT.one )
THEN
261 result( 1 ) = ( min( wnorm, n*anorm ) / anorm ) / ( n*ulp )
263 result( 1 ) = min( wnorm / anorm, dble( n ) ) / ( n*ulp )
271 CALL dgemm(
'N',
'C', n, n, n, one, u, ldu, u, ldu, zero, work,
275 work( ( n+1 )*( j-1 )+1 ) = work( ( n+1 )*( j-1 )+1 ) - one
278 result( 2 ) = min( dlange(
'1', n, n, work, n, work( n**2+1 ) ),
279 $ dble( n ) ) / ( n*ulp )