207 SUBROUTINE ssyt21( ITYPE, UPLO, N, KBAND, A, LDA, D, E, U, LDU, V,
208 $ LDV, TAU, WORK, RESULT )
217 INTEGER ITYPE, KBAND, LDA, LDU, LDV, N
220 REAL A( LDA, * ), D( * ), E( * ), RESULT( 2 ),
221 $ tau( * ), u( ldu, * ), v( ldv, * ), work( * )
228 parameter( zero = 0.0e0, one = 1.0e0, ten = 10.0e0 )
233 INTEGER IINFO, J, JCOL, JR, JROW
234 REAL ANORM, ULP, UNFL, VSAVE, WNORM
238 REAL SLAMCH, SLANGE, SLANSY
239 EXTERNAL lsame, slamch, slange, slansy
246 INTRINSIC max, min, real
256 IF( lsame( uplo,
'U' ) )
THEN
264 unfl = slamch(
'Safe minimum' )
265 ulp = slamch(
'Epsilon' )*slamch(
'Base' )
269 IF( itype.LT.1 .OR. itype.GT.3 )
THEN
270 result( 1 ) = ten / ulp
278 IF( itype.EQ.3 )
THEN
281 anorm = max( slansy(
'1', cuplo, n, a, lda, work ), unfl )
286 IF( itype.EQ.1 )
THEN
290 CALL slaset(
'Full', n, n, zero, zero, work, n )
291 CALL slacpy( cuplo, n, n, a, lda, work, n )
294 CALL ssyr( cuplo, n, -d( j ), u( 1, j ), 1, work, n )
297 IF( n.GT.1 .AND. kband.EQ.1 )
THEN
299 CALL ssyr2( cuplo, n, -e( j ), u( 1, j ), 1, u( 1, j+1 ),
303 wnorm = slansy(
'1', cuplo, n, work, n, work( n**2+1 ) )
305 ELSE IF( itype.EQ.2 )
THEN
309 CALL slaset(
'Full', n, n, zero, zero, work, n )
312 work( n**2 ) = d( n )
313 DO 40 j = n - 1, 1, -1
314 IF( kband.EQ.1 )
THEN
315 work( ( n+1 )*( j-1 )+2 ) = ( one-tau( j ) )*e( j )
317 work( ( j-1 )*n+jr ) = -tau( j )*e( j )*v( jr, j )
323 CALL slarfy(
'L', n-j, v( j+1, j ), 1, tau( j ),
324 $ work( ( n+1 )*j+1 ), n, work( n**2+1 ) )
326 work( ( n+1 )*( j-1 )+1 ) = d( j )
331 IF( kband.EQ.1 )
THEN
332 work( ( n+1 )*j ) = ( one-tau( j ) )*e( j )
334 work( j*n+jr ) = -tau( j )*e( j )*v( jr, j+1 )
340 CALL slarfy(
'U', j, v( 1, j+1 ), 1, tau( j ), work, n,
343 work( ( n+1 )*j+1 ) = d( j+1 )
350 work( jrow+n*( jcol-1 ) ) = work( jrow+n*( jcol-1 ) )
355 work( jrow+n*( jcol-1 ) ) = work( jrow+n*( jcol-1 ) )
360 wnorm = slansy(
'1', cuplo, n, work, n, work( n**2+1 ) )
362 ELSE IF( itype.EQ.3 )
THEN
368 CALL slacpy(
' ', n, n, u, ldu, work, n )
370 CALL sorm2r(
'R',
'T', n, n-1, n-1, v( 2, 1 ), ldv, tau,
371 $ work( n+1 ), n, work( n**2+1 ), iinfo )
373 CALL sorm2l(
'R',
'T', n, n-1, n-1, v( 1, 2 ), ldv, tau,
374 $ work, n, work( n**2+1 ), iinfo )
376 IF( iinfo.NE.0 )
THEN
377 result( 1 ) = ten / ulp
382 work( ( n+1 )*( j-1 )+1 ) = work( ( n+1 )*( j-1 )+1 ) - one
385 wnorm = slange(
'1', n, n, work, n, work( n**2+1 ) )
388 IF( anorm.GT.wnorm )
THEN
389 result( 1 ) = ( wnorm / anorm ) / ( n*ulp )
391 IF( anorm.LT.one )
THEN
392 result( 1 ) = ( min( wnorm, n*anorm ) / anorm ) / ( n*ulp )
394 result( 1 ) = min( wnorm / anorm, real( n ) ) / ( n*ulp )
402 IF( itype.EQ.1 )
THEN
403 CALL sgemm(
'N',
'C', n, n, n, one, u, ldu, u, ldu, zero, work,
407 work( ( n+1 )*( j-1 )+1 ) = work( ( n+1 )*( j-1 )+1 ) - one
410 result( 2 ) = min( slange(
'1', n, n, work, n,
411 $ work( n**2+1 ) ), real( n ) ) / ( n*ulp )