205 SUBROUTINE ssyt21( ITYPE, UPLO, N, KBAND, A, LDA, D, E, U, LDU, V,
206 $ LDV, TAU, WORK, RESULT )
214 INTEGER ITYPE, KBAND, LDA, LDU, LDV, N
217 REAL A( LDA, * ), D( * ), E( * ), RESULT( 2 ),
218 $ tau( * ), u( ldu, * ), v( ldv, * ), work( * )
225 parameter( zero = 0.0e0, one = 1.0e0, ten = 10.0e0 )
230 INTEGER IINFO, J, JCOL, JR, JROW
231 REAL ANORM, ULP, UNFL, VSAVE, WNORM
235 REAL SLAMCH, SLANGE, SLANSY
236 EXTERNAL lsame, slamch, slange, slansy
253 IF( lsame( uplo,
'U' ) )
THEN
261 unfl = slamch( 'safe minimum
' )
262 ULP = SLAMCH( 'epsilon
' )*SLAMCH( 'base
' )
266.LT..OR..GT.
IF( ITYPE1 ITYPE3 ) THEN
267 RESULT( 1 ) = TEN / ULP
275.EQ.
IF( ITYPE3 ) THEN
278 ANORM = MAX( SLANSY( '1
', CUPLO, N, A, LDA, WORK ), UNFL )
283.EQ.
IF( ITYPE1 ) THEN
287 CALL SLASET( 'full
', N, N, ZERO, ZERO, WORK, N )
288 CALL SLACPY( CUPLO, N, N, A, LDA, WORK, N )
291 CALL SSYR( CUPLO, N, -D( J ), U( 1, J ), 1, WORK, N )
294.GT..AND..EQ.
IF( N1 KBAND1 ) THEN
296 CALL SSYR2( CUPLO, N, -E( J ), U( 1, J ), 1, U( 1, J+1 ),
300 WNORM = SLANSY( '1
', CUPLO, N, WORK, N, WORK( N**2+1 ) )
302.EQ.
ELSE IF( ITYPE2 ) THEN
306 CALL SLASET( 'full
', N, N, ZERO, ZERO, WORK, N )
309 WORK( N**2 ) = D( N )
310 DO 40 J = N - 1, 1, -1
311.EQ.
IF( KBAND1 ) THEN
312 WORK( ( N+1 )*( J-1 )+2 ) = ( ONE-TAU( J ) )*E( J )
314 WORK( ( J-1 )*N+JR ) = -TAU( J )*E( J )*V( JR, J )
320 CALL SLARFY( 'l
', N-J, V( J+1, J ), 1, TAU( J ),
321 $ WORK( ( N+1 )*J+1 ), N, WORK( N**2+1 ) )
323 WORK( ( N+1 )*( J-1 )+1 ) = D( J )
328.EQ.
IF( KBAND1 ) THEN
329 WORK( ( N+1 )*J ) = ( ONE-TAU( J ) )*E( J )
331 WORK( J*N+JR ) = -TAU( J )*E( J )*V( JR, J+1 )
337 CALL SLARFY( 'u
', J, V( 1, J+1 ), 1, TAU( J ), WORK, N,
340 WORK( ( N+1 )*J+1 ) = D( J+1 )
347 WORK( JROW+N*( JCOL-1 ) ) = WORK( JROW+N*( JCOL-1 ) )
352 WORK( JROW+N*( JCOL-1 ) ) = WORK( JROW+N*( JCOL-1 ) )
357 WNORM = SLANSY( '1
', CUPLO, N, WORK, N, WORK( N**2+1 ) )
359.EQ.
ELSE IF( ITYPE3 ) THEN
365 CALL SLACPY( ' ', N, N, U, LDU, WORK, N )
367 CALL SORM2R( 'r
', 't
', N, N-1, N-1, V( 2, 1 ), LDV, TAU,
368 $ WORK( N+1 ), N, WORK( N**2+1 ), IINFO )
370 CALL SORM2L( 'r',
'T', n, n-1, n-1, v( 1, 2 ), ldv, tau,
371 $ work, n, work( n**2+1 ), iinfo
373 IF( iinfo.NE.0 )
THEN
374 result( 1 ) = ten / ulp
379 work( ( n+1 )*( j-1 )+1 ) = work( ( n+1 )*( j-1 )+1 ) - one
382 wnorm = slange(
'1', n, n, work, n, work( n**2+1 ) )
385 IF( anorm.GT.wnorm )
THEN
386 result( 1 ) = ( wnorm / anorm ) / ( n*ulp )
388 IF( anorm.LT.one )
THEN
389 result( 1 ) = (
min( wnorm, n*anorm ) / anorm ) / ( n*ulp )
391 result( 1 ) =
min( wnorm / anorm, real( n ) ) / ( n*ulp )
399 IF( itype.EQ.1 )
THEN
400 CALL sgemm(
'N',
'C', n, n, n, one, u, ldu, u, ldu, zero, work,
404 work( ( n+1 )*( j-1 )+1 ) = work( ( n+1 )*( j-1 )+1 ) - one
407 result( 2
'1', n, n, work, n,
408 $ work( n**2+1 ) ), real( n ) ) / ( n*ulp )
subroutine slaset(uplo, m, n, alpha, beta, a, lda)
SLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine slacpy(uplo, m, n, a, lda, b, ldb)
SLACPY copies all or part of one two-dimensional array to another.
subroutine sorm2l(side, trans, m, n, k, a, lda, tau, c, ldc, work, info)
SORM2L multiplies a general matrix by the orthogonal matrix from a QL factorization determined by sge...
subroutine sorm2r(side, trans, m, n, k, a, lda, tau, c, ldc, work, info)
SORM2R multiplies a general matrix by the orthogonal matrix from a QR factorization determined by sge...
subroutine ssyr2(uplo, n, alpha, x, incx, y, incy, a, lda)
SSYR2
subroutine sgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
SGEMM
subroutine ssyt21(itype, uplo, n, kband, a, lda, d, e, u, ldu, v, ldv, tau, work, result)
SSYT21