228 SUBROUTINE chpt21( ITYPE, UPLO, N, KBAND, AP, D, E, U, LDU, VP,
229 $ TAU, WORK, RWORK, RESULT )
238 INTEGER ITYPE, KBAND, LDU, N
241 REAL D( * ), E( * ), RESULT( 2 ), RWORK( * )
242 COMPLEX AP( * ), TAU( * ), U( LDU, * ), VP( * ),
250 parameter( zero = 0.0e+0, one = 1.0e+0, ten = 10.0e+0 )
252 parameter( half = 1.0e+0 / 2.0e+0 )
254 parameter( czero = ( 0.0e+0, 0.0e+0 ),
255 $ cone = ( 1.0e+0, 0.0e+0 ) )
260 INTEGER IINFO, J, JP, JP1, JR, LAP
261 REAL ANORM, ULP, UNFL, WNORM
266 REAL CLANGE, CLANHP, SLAMCH
268 EXTERNAL lsame, clange, clanhp, slamch, cdotc
275 INTRINSIC cmplx, max, min, real
287 lap = ( n*( n+1 ) ) / 2
289 IF( lsame( uplo,
'U' ) )
THEN
297 unfl = slamch(
'Safe minimum' )
298 ulp = slamch(
'Epsilon' )*slamch(
'Base' )
302 IF( itype.LT.1 .OR. itype.GT.3 )
THEN
303 result( 1 ) = ten / ulp
311 IF( itype.EQ.3 )
THEN
314 anorm = max( clanhp(
'1', cuplo, n, ap, rwork ), unfl )
319 IF( itype.EQ.1 )
THEN
323 CALL claset(
'Full', n, n, czero, czero, work, n )
324 CALL ccopy( lap, ap, 1, work, 1 )
327 CALL chpr( cuplo, n, -d( j ), u( 1, j ), 1, work )
330 IF( n.GT.1 .AND. kband.EQ.1 )
THEN
332 CALL chpr2( cuplo, n, -cmplx( e( j ) ), u( 1, j ), 1,
333 $ u( 1, j-1 ), 1, work )
336 wnorm = clanhp(
'1', cuplo, n, work, rwork )
338 ELSE IF( itype.EQ.2 )
THEN
342 CALL claset(
'Full', n, n, czero, czero, work, n )
346 DO 40 j = n - 1, 1, -1
347 jp = ( ( 2*n-j )*( j-1 ) ) / 2
349 IF( kband.EQ.1 )
THEN
350 work( jp+j+1 ) = ( cone-tau( j ) )*e( j )
352 work( jp+jr ) = -tau( j )*e( j )*vp( jp+jr )
356 IF( tau( j ).NE.czero )
THEN
359 CALL chpmv(
'L', n-j, cone, work( jp1+j+1 ),
360 $ vp( jp+j+1 ), 1, czero, work( lap+1 ), 1 )
361 temp = -half*tau( j )*cdotc( n-j, work( lap+1 ), 1,
363 CALL caxpy( n-j, temp, vp( jp+j+1 ), 1, work( lap+1 ),
365 CALL chpr2(
'L', n-j, -tau( j ), vp( jp+j+1 ), 1,
366 $ work( lap+1 ), 1, work( jp1+j+1 ) )
370 work( jp+j ) = d( j )
375 jp = ( j*( j-1 ) ) / 2
377 IF( kband.EQ.1 )
THEN
378 work( jp1+j ) = ( cone-tau( j ) )*e( j )
380 work( jp1+jr ) = -tau( j )*e( j )*vp( jp1+jr )
384 IF( tau( j ).NE.czero )
THEN
387 CALL chpmv(
'U', j, cone, work, vp( jp1+1 ), 1, czero,
389 temp = -half*tau( j )*cdotc( j, work( lap+1 ), 1,
391 CALL caxpy( j, temp, vp( jp1+1 ), 1, work( lap+1 ),
393 CALL chpr2(
'U', j, -tau( j ), vp( jp1+1 ), 1,
394 $ work( lap+1 ), 1, work )
397 work( jp1+j+1 ) = d( j+1 )
402 work( j ) = work( j ) - ap( j )
404 wnorm = clanhp(
'1', cuplo, n, work, rwork )
406 ELSE IF( itype.EQ.3 )
THEN
412 CALL clacpy(
' ', n, n, u, ldu, work, n )
413 CALL cupmtr(
'R', cuplo,
'C', n, n, vp, tau, work, n,
414 $ work( n**2+1 ), iinfo )
415 IF( iinfo.NE.0 )
THEN
416 result( 1 ) = ten / ulp
421 work( ( n+1 )*( j-1 )+1 ) = work( ( n+1 )*( j-1 )+1 ) - cone
424 wnorm = clange(
'1', n, n, work, n, rwork )
427 IF( anorm.GT.wnorm )
THEN
428 result( 1 ) = ( wnorm / anorm ) / ( n*ulp )
430 IF( anorm.LT.one )
THEN
431 result( 1 ) = ( min( wnorm, n*anorm ) / anorm ) / ( n*ulp )
433 result( 1 ) = min( wnorm / anorm, real( n ) ) / ( n*ulp )
441 IF( itype.EQ.1 )
THEN
442 CALL cgemm(
'N',
'C', n, n, n, cone, u, ldu, u, ldu, czero,
446 work( ( n+1 )*( j-1 )+1 ) = work( ( n+1 )*( j-1 )+1 ) - cone
449 result( 2 ) = min( clange(
'1', n, n, work, n, rwork ),
450 $ real( n ) ) / ( n*ulp )