214 SUBROUTINE zhet21( ITYPE, UPLO, N, KBAND, A, LDA, D, E, U, LDU, V,
215 $ LDV, TAU, WORK, RWORK, RESULT )
224 INTEGER ITYPE, KBAND, LDA, LDU, LDV, N
227 DOUBLE PRECISION D( * ), E( * ), RESULT( 2 ), RWORK( * )
228 COMPLEX*16 A( LDA, * ), TAU( * ), U( LDU, * ),
229 $ v( ldv, * ), work( * )
235 DOUBLE PRECISION ZERO, ONE, TEN
236 parameter( zero = 0.0d+0, one = 1.0d+0, ten = 10.0d+0 )
237 COMPLEX*16 CZERO, CONE
238 parameter( czero = ( 0.0d+0, 0.0d+0 ),
239 $ cone = ( 1.0d+0, 0.0d+0 ) )
244 INTEGER IINFO, J, JCOL, JR, JROW
245 DOUBLE PRECISION ANORM, ULP, UNFL, WNORM
250 DOUBLE PRECISION DLAMCH, ZLANGE, ZLANHE
251 EXTERNAL lsame, dlamch, zlange, zlanhe
258 INTRINSIC dble, dcmplx, max, min
268 IF( lsame( uplo,
'U' ) )
THEN
276 unfl = dlamch(
'Safe minimum' )
277 ulp = dlamch(
'Epsilon' )*dlamch(
'Base' )
281 IF( itype.LT.1 .OR. itype.GT.3 )
THEN
282 result( 1 ) = ten / ulp
290 IF( itype.EQ.3 )
THEN
293 anorm = max( zlanhe(
'1', cuplo, n, a, lda, rwork ), unfl )
298 IF( itype.EQ.1 )
THEN
302 CALL zlaset(
'Full', n, n, czero, czero, work, n )
303 CALL zlacpy( cuplo, n, n, a, lda, work, n )
306 CALL zher( cuplo, n, -d( j ), u( 1, j ), 1, work, n )
309 IF( n.GT.1 .AND. kband.EQ.1 )
THEN
311 CALL zher2( cuplo, n, -dcmplx( e( j ) ), u( 1, j ), 1,
312 $ u( 1, j-1 ), 1, work, n )
315 wnorm = zlanhe(
'1', cuplo, n, work, n, rwork )
317 ELSE IF( itype.EQ.2 )
THEN
321 CALL zlaset(
'Full', n, n, czero, czero, work, n )
324 work( n**2 ) = d( n )
325 DO 40 j = n - 1, 1, -1
326 IF( kband.EQ.1 )
THEN
327 work( ( n+1 )*( j-1 )+2 ) = ( cone-tau( j ) )*e( j )
329 work( ( j-1 )*n+jr ) = -tau( j )*e( j )*v( jr, j )
335 CALL zlarfy(
'L', n-j, v( j+1, j ), 1, tau( j ),
336 $ work( ( n+1 )*j+1 ), n, work( n**2+1 ) )
338 work( ( n+1 )*( j-1 )+1 ) = d( j )
343 IF( kband.EQ.1 )
THEN
344 work( ( n+1 )*j ) = ( cone-tau( j ) )*e( j )
346 work( j*n+jr ) = -tau( j )*e( j )*v( jr, j+1 )
352 CALL zlarfy(
'U', j, v( 1, j+1 ), 1, tau( j ), work, n,
355 work( ( n+1 )*j+1 ) = d( j+1 )
362 work( jrow+n*( jcol-1 ) ) = work( jrow+n*( jcol-1 ) )
367 work( jrow+n*( jcol-1 ) ) = work( jrow+n*( jcol-1 ) )
372 wnorm = zlanhe(
'1', cuplo, n, work, n, rwork )
374 ELSE IF( itype.EQ.3 )
THEN
380 CALL zlacpy(
' ', n, n, u, ldu, work, n )
382 CALL zunm2r(
'R',
'C', n, n-1, n-1, v( 2, 1 ), ldv, tau,
383 $ work( n+1 ), n, work( n**2+1 ), iinfo )
385 CALL zunm2l(
'R',
'C', n, n-1, n-1, v( 1, 2 ), ldv, tau,
386 $ work, n, work( n**2+1 ), iinfo )
388 IF( iinfo.NE.0 )
THEN
389 result( 1 ) = ten / ulp
394 work( ( n+1 )*( j-1 )+1 ) = work( ( n+1 )*( j-1 )+1 ) - cone
397 wnorm = zlange(
'1', n, n, work, n, rwork )
400 IF( anorm.GT.wnorm )
THEN
401 result( 1 ) = ( wnorm / anorm ) / ( n*ulp )
403 IF( anorm.LT.one )
THEN
404 result( 1 ) = ( min( wnorm, n*anorm ) / anorm ) / ( n*ulp )
406 result( 1 ) = min( wnorm / anorm, dble( n ) ) / ( n*ulp )
414 IF( itype.EQ.1 )
THEN
415 CALL zgemm(
'N',
'C', n, n, n, cone, u, ldu, u, ldu, czero,
419 work( ( n+1 )*( j-1 )+1 ) = work( ( n+1 )*( j-1 )+1 ) - cone
422 result( 2 ) = min( zlange(
'1', n, n, work, n, rwork ),
423 $ dble( n ) ) / ( n*ulp )