152 SUBROUTINE chbt21( UPLO, N, KA, KS, A, LDA, D, E, U, LDU, WORK,
162 INTEGER KA, KS, LDA, LDU, N
165 REAL D( * ), E( * ), RESULT( 2 ), RWORK( * )
166 COMPLEX A( LDA, * ), U( LDU, * ), WORK( * )
173 parameter( czero = ( 0.0e+0, 0.0e+0 ),
174 $ cone = ( 1.0e+0, 0.0e+0 ) )
176 parameter( zero = 0.0e+0, one = 1.0e+0 )
181 INTEGER IKA, J, JC, JR
182 REAL ANORM, ULP, UNFL, WNORM
186 REAL CLANGE, CLANHB, CLANHP, SLAMCH
187 EXTERNAL lsame, clange, clanhb, clanhp, slamch
193 INTRINSIC cmplx, max, min, real
204 ika = max( 0, min( n-1, ka ) )
206 IF( lsame( uplo,
'U' ) )
THEN
214 unfl = slamch(
'Safe minimum' )
215 ulp = slamch(
'Epsilon' )*slamch(
'Base' )
223 anorm = max( clanhb(
'1', cuplo, n, ika, a, lda, rwork ), unfl )
232 DO 10 jr = 1, min( ika+1, n+1-jc )
234 work( j ) = a( jr, jc )
236 DO 20 jr = ika + 2, n + 1 - jc
241 DO 30 jr = ika + 2, jc
245 DO 40 jr = min( ika, jc-1 ), 0, -1
247 work( j ) = a( ika+1-jr, jc )
253 CALL chpr( cuplo, n, -d( j ), u( 1, j ), 1, work )
256 IF( n.GT.1 .AND. ks.EQ.1 )
THEN
258 CALL chpr2( cuplo, n, -cmplx( e( j ) ), u( 1, j ), 1,
259 $ u( 1, j+1 ), 1, work )
262 wnorm = clanhp(
'1', cuplo, n, work, rwork )
264 IF( anorm.GT.wnorm )
THEN
265 result( 1 ) = ( wnorm / anorm ) / ( n*ulp )
267 IF( anorm.LT.one )
THEN
268 result( 1 ) = ( min( wnorm, n*anorm ) / anorm ) / ( n*ulp )
270 result( 1 ) = min( wnorm / anorm, real( n ) ) / ( n*ulp )
278 CALL cgemm(
'N',
'C', n, n, n, cone, u, ldu, u, ldu, czero, work,
282 work( ( n+1 )*( j-1 )+1 ) = work( ( n+1 )*( j-1 )+1 ) - cone
285 result( 2 ) = min( clange(
'1', n, n, work, n, rwork ),
286 $ real( n ) ) / ( n*ulp )