221 SUBROUTINE dspt21( ITYPE, UPLO, N, KBAND, AP, D, E, U, LDU, VP,
222 $ TAU, WORK, RESULT )
231 INTEGER ITYPE, KBAND, LDU, N
234 DOUBLE PRECISION AP( * ), D( * ), E( * ), RESULT( 2 ), TAU( * ),
235 $ u( ldu, * ), vp( * ), work( * )
241 DOUBLE PRECISION ZERO, ONE, TEN
242 parameter( zero = 0.0d0, one = 1.0d0, ten = 10.0d0 )
243 DOUBLE PRECISION HALF
244 parameter( half = 1.0d+0 / 2.0d+0 )
249 INTEGER IINFO, J, JP, JP1, JR, LAP
250 DOUBLE PRECISION ANORM, TEMP, ULP, UNFL, VSAVE, WNORM
254 DOUBLE PRECISION DDOT, DLAMCH, DLANGE, DLANSP
255 EXTERNAL lsame, ddot, dlamch, dlange, dlansp
262 INTRINSIC dble, max, min
274 lap = ( n*( n+1 ) ) / 2
276 IF( lsame( uplo,
'U' ) )
THEN
284 unfl = dlamch(
'Safe minimum' )
285 ulp = dlamch(
'Epsilon' )*dlamch(
'Base' )
289 IF( itype.LT.1 .OR. itype.GT.3 )
THEN
290 result( 1 ) = ten / ulp
298 IF( itype.EQ.3 )
THEN
301 anorm = max( dlansp(
'1', cuplo, n, ap, work ), unfl )
306 IF( itype.EQ.1 )
THEN
310 CALL dlaset(
'Full', n, n, zero, zero, work, n )
311 CALL dcopy( lap, ap, 1, work, 1 )
314 CALL dspr( cuplo, n, -d( j ), u( 1, j ), 1, work )
317 IF( n.GT.1 .AND. kband.EQ.1 )
THEN
319 CALL dspr2( cuplo, n, -e( j ), u( 1, j ), 1, u( 1, j+1 ),
323 wnorm = dlansp(
'1', cuplo, n, work, work( n**2+1 ) )
325 ELSE IF( itype.EQ.2 )
THEN
329 CALL dlaset(
'Full', n, n, zero, zero, work, n )
333 DO 40 j = n - 1, 1, -1
334 jp = ( ( 2*n-j )*( j-1 ) ) / 2
336 IF( kband.EQ.1 )
THEN
337 work( jp+j+1 ) = ( one-tau( j ) )*e( j )
339 work( jp+jr ) = -tau( j )*e( j )*vp( jp+jr )
343 IF( tau( j ).NE.zero )
THEN
346 CALL dspmv(
'L', n-j, one, work( jp1+j+1 ),
347 $ vp( jp+j+1 ), 1, zero, work( lap+1 ), 1 )
348 temp = -half*tau( j )*ddot( n-j, work( lap+1 ), 1,
350 CALL daxpy( n-j, temp, vp( jp+j+1 ), 1, work( lap+1 ),
352 CALL dspr2(
'L', n-j, -tau( j ), vp( jp+j+1 ), 1,
353 $ work( lap+1 ), 1, work( jp1+j+1 ) )
356 work( jp+j ) = d( j )
361 jp = ( j*( j-1 ) ) / 2
363 IF( kband.EQ.1 )
THEN
364 work( jp1+j ) = ( one-tau( j ) )*e( j )
366 work( jp1+jr ) = -tau( j )*e( j )*vp( jp1+jr )
370 IF( tau( j ).NE.zero )
THEN
373 CALL dspmv(
'U', j, one, work, vp( jp1+1 ), 1, zero,
375 temp = -half*tau( j )*ddot( j, work( lap+1 ), 1,
377 CALL daxpy( j, temp, vp( jp1+1 ), 1, work( lap+1 ),
379 CALL dspr2(
'U', j, -tau( j ), vp( jp1+1 ), 1,
380 $ work( lap+1 ), 1, work )
383 work( jp1+j+1 ) = d( j+1 )
388 work( j ) = work( j ) - ap( j )
390 wnorm = dlansp(
'1', cuplo, n, work, work( lap+1 ) )
392 ELSE IF( itype.EQ.3 )
THEN
398 CALL dlacpy(
' ', n, n, u, ldu, work, n )
399 CALL dopmtr(
'R', cuplo,
'T', n, n, vp, tau, work, n,
400 $ work( n**2+1 ), iinfo )
401 IF( iinfo.NE.0 )
THEN
402 result( 1 ) = ten / ulp
407 work( ( n+1 )*( j-1 )+1 ) = work( ( n+1 )*( j-1 )+1 ) - one
410 wnorm = dlange(
'1', n, n, work, n, work( n**2+1 ) )
413 IF( anorm.GT.wnorm )
THEN
414 result( 1 ) = ( wnorm / anorm ) / ( n*ulp )
416 IF( anorm.LT.one )
THEN
417 result( 1 ) = ( min( wnorm, n*anorm ) / anorm ) / ( n*ulp )
419 result( 1 ) = min( wnorm / anorm, dble( n ) ) / ( n*ulp )
427 IF( itype.EQ.1 )
THEN
428 CALL dgemm(
'N',
'C', n, n, n, one, u, ldu, u, ldu, zero, work,
432 work( ( n+1 )*( j-1 )+1 ) = work( ( n+1 )*( j-1 )+1 ) - one
435 result( 2 ) = min( dlange(
'1', n, n, work, n,
436 $ work( n**2+1 ) ), dble( n ) ) / ( n*ulp )