152 SUBROUTINE zhbt21( UPLO, N, KA, KS, A, LDA, D, E, U, LDU, WORK,
162 INTEGER KA, KS, LDA, LDU, N
165 DOUBLE PRECISION D( * ), E( * ), RESULT( 2 ), RWORK( * )
166 COMPLEX*16 A( LDA, * ), U( LDU, * ), WORK( * )
172 COMPLEX*16 CZERO, CONE
173 parameter( czero = ( 0.0d+0, 0.0d+0 ),
174 $ cone = ( 1.0d+0, 0.0d+0 ) )
175 DOUBLE PRECISION ZERO, ONE
176 parameter( zero = 0.0d+0, one = 1.0d+0 )
181 INTEGER IKA, J, JC, JR
182 DOUBLE PRECISION ANORM, ULP, UNFL, WNORM
186 DOUBLE PRECISION DLAMCH, ZLANGE, ZLANHB, ZLANHP
187 EXTERNAL lsame, dlamch, zlange, zlanhb, zlanhp
193 INTRINSIC dble, dcmplx, max, min
204 ika = max( 0, min( n-1, ka ) )
206 IF( lsame( uplo,
'U' ) )
THEN
214 unfl = dlamch(
'Safe minimum' )
215 ulp = dlamch(
'Epsilon' )*dlamch(
'Base' )
223 anorm = max( zlanhb(
'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 zhpr( cuplo, n, -d( j ), u( 1, j ), 1, work )
256 IF( n.GT.1 .AND. ks.EQ.1 )
THEN
258 CALL zhpr2( cuplo, n, -dcmplx( e( j ) ), u( 1, j ), 1,
259 $ u( 1, j+1 ), 1, work )
262 wnorm = zlanhp(
'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, dble( n ) ) / ( n*ulp )
278 CALL zgemm(
'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( zlange(
'1', n, n, work, n, rwork ),
286 $ dble( n ) ) / ( n*ulp )