214 SUBROUTINE chet21( 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 REAL D( * ), E( * ), RESULT( 2 ), RWORK( * )
228 COMPLEX A( LDA, * ), TAU( * ), U( LDU, * ),
229 $ v( ldv, * ), work( * )
236 parameter( zero = 0.0e+0, one = 1.0e+0, ten = 10.0e+0 )
238 parameter( czero = ( 0.0e+0, 0.0e+0 ),
239 $ cone = ( 1.0e+0, 0.0e+0 ) )
244 INTEGER IINFO, J, JCOL, JR, JROW
245 REAL ANORM, ULP, UNFL, WNORM
250 REAL CLANGE, CLANHE, SLAMCH
251 EXTERNAL lsame, clange, clanhe, slamch
258 INTRINSIC cmplx, max, min, real
268 IF( lsame( uplo,
'U' ) )
THEN
276 unfl = slamch(
'Safe minimum' )
277 ulp = slamch(
'Epsilon' )*slamch(
'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( clanhe(
'1', cuplo, n, a, lda, rwork ), unfl )
298 IF( itype.EQ.1 )
THEN
302 CALL claset(
'Full', n, n, czero, czero, work, n )
303 CALL clacpy( cuplo, n, n, a, lda, work, n )
306 CALL cher( cuplo, n, -d( j ), u( 1, j ), 1, work, n )
309 IF( n.GT.1 .AND. kband.EQ.1 )
THEN
311 CALL cher2( cuplo, n, -cmplx( e( j ) ), u( 1, j ), 1,
312 $ u( 1, j-1 ), 1, work, n )
315 wnorm = clanhe(
'1', cuplo, n, work, n, rwork )
317 ELSE IF( itype.EQ.2 )
THEN
321 CALL claset(
'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 clarfy(
'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 clarfy(
'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 = clanhe(
'1', cuplo, n, work, n, rwork )
374 ELSE IF( itype.EQ.3 )
THEN
380 CALL clacpy(
' ', n, n, u, ldu, work, n )
382 CALL cunm2r(
'R',
'C', n, n-1, n-1, v( 2, 1 ), ldv, tau,
383 $ work( n+1 ), n, work( n**2+1 ), iinfo )
385 CALL cunm2l(
'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 = clange(
'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, real( n ) ) / ( n*ulp )
414 IF( itype.EQ.1 )
THEN
415 CALL cgemm(
'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( clange(
'1', n, n, work, n, rwork ),
423 $ real( n ) ) / ( n*ulp )