221 SUBROUTINE sspt21( ITYPE, UPLO, N, KBAND, AP, D, E, U, LDU, VP,
222 $ TAU, WORK, RESULT )
231 INTEGER ITYPE, KBAND, LDU, N
234 REAL AP( * ), D( * ), E( * ), RESULT( 2 ), TAU( * ),
235 $ u( ldu, * ), vp( * ), work( * )
242 parameter( zero = 0.0e0, one = 1.0e0, ten = 10.0e0 )
244 parameter( half = 1.0e+0 / 2.0e+0 )
249 INTEGER IINFO, J, JP, JP1, JR, LAP
250 REAL ANORM, TEMP, ULP, UNFL, VSAVE, WNORM
254 REAL SDOT, SLAMCH, SLANGE, SLANSP
255 EXTERNAL lsame, sdot, slamch, slange, slansp
262 INTRINSIC max, min, real
274 lap = ( n*( n+1 ) ) / 2
276 IF( lsame( uplo,
'U' ) )
THEN
284 unfl = slamch(
'Safe minimum' )
285 ulp = slamch(
'Epsilon' )*slamch(
'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( slansp(
'1', cuplo, n, ap, work ), unfl )
306 IF( itype.EQ.1 )
THEN
310 CALL slaset(
'Full', n, n, zero, zero, work, n )
311 CALL scopy( lap, ap, 1, work, 1 )
314 CALL sspr( cuplo, n, -d( j ), u( 1, j ), 1, work )
317 IF( n.GT.1 .AND. kband.EQ.1 )
THEN
319 CALL sspr2( cuplo, n, -e( j ), u( 1, j ), 1, u( 1, j+1 ),
323 wnorm = slansp(
'1', cuplo, n, work, work( n**2+1 ) )
325 ELSE IF( itype.EQ.2 )
THEN
329 CALL slaset(
'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 sspmv(
'L', n-j, one, work( jp1+j+1 ),
347 $ vp( jp+j+1 ), 1, zero, work( lap+1 ), 1 )
348 temp = -half*tau( j )*sdot( n-j, work( lap+1 ), 1,
350 CALL saxpy( n-j, temp, vp( jp+j+1 ), 1, work( lap+1 ),
352 CALL sspr2(
'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 sspmv(
'U', j, one, work, vp( jp1+1 ), 1, zero,
375 temp = -half*tau( j )*sdot( j, work( lap+1 ), 1,
377 CALL saxpy( j, temp, vp( jp1+1 ), 1, work( lap+1 ),
379 CALL sspr2(
'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 = slansp(
'1', cuplo, n, work, work( lap+1 ) )
392 ELSE IF( itype.EQ.3 )
THEN
398 CALL slacpy(
' ', n, n, u, ldu, work, n )
399 CALL sopmtr(
'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 = slange(
'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, real( n ) ) / ( n*ulp )
427 IF( itype.EQ.1 )
THEN
428 CALL sgemm(
'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( slange(
'1', n, n, work, n,
436 $ work( n**2+1 ) ), real( n ) ) / ( n*ulp )