147 SUBROUTINE ssbt21( UPLO, N, KA, KS, A, LDA, D, E, U, LDU, WORK,
157 INTEGER KA, KS, LDA, LDU, N
160 REAL A( LDA, * ), D( * ), E( * ), RESULT( 2 ),
161 $ u( ldu, * ), work( * )
168 parameter( zero = 0.0e0, one = 1.0e0 )
173 INTEGER IKA, J, JC, JR, LW
174 REAL ANORM, ULP, UNFL, WNORM
178 REAL SLAMCH, SLANGE, SLANSB, SLANSP
179 EXTERNAL lsame, slamch, slange, slansb, slansp
185 INTRINSIC max, min, real
196 ika = max( 0, min( n-1, ka ) )
197 lw = ( n*( n+1 ) ) / 2
199 IF( lsame( uplo,
'U' ) )
THEN
207 unfl = slamch(
'Safe minimum' )
208 ulp = slamch(
'Epsilon' )*slamch(
'Base' )
216 anorm = max( slansb(
'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 sspr( cuplo, n, -d( j ), u( 1, j ), 1, work )
249 IF( n.GT.1 .AND. ks.EQ.1 )
THEN
251 CALL sspr2( cuplo, n, -e( j ), u( 1, j ), 1, u( 1, j+1 ), 1,
255 wnorm = slansp(
'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, real( n ) ) / ( n*ulp )
271 CALL sgemm(
'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( slange(
'1', n, n, work, n, work( n**2+1 ) ),
279 $ real( n ) ) / ( n*ulp )