205 SUBROUTINE dsyt21( 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 DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), RESULT( 2 ),
218 $ tau( * ), u( ldu, * ), v( ldv, * ), work( * )
224 DOUBLE PRECISION ZERO, ONE, TEN
225 parameter( zero = 0.0d0, one = 1.0d0, ten = 10.0d0 )
230 INTEGER IINFO, J, JCOL, JR, JROW
231 DOUBLE PRECISION ANORM, ULP, UNFL, VSAVE, WNORM
235 DOUBLE PRECISION DLAMCH, DLANGE, DLANSY
236 EXTERNAL lsame, dlamch, dlange, dlansy
253 IF( lsame( uplo,
'U' ) )
THEN
261 unfl = dlamch(
'Safe minimum' )
262 ulp = dlamch( 'epsilon
' )*DLAMCH( 'base
' )
266.LT..OR..GT.
IF( ITYPE1 ITYPE3 ) THEN
267 RESULT( 1 ) = TEN / ULP
275.EQ.
IF( ITYPE3 ) THEN
278 ANORM = MAX( DLANSY( '1
', CUPLO, N, A, LDA, WORK ), UNFL )
283.EQ.
IF( ITYPE1 ) THEN
287 CALL DLASET( 'full
', N, N, ZERO, ZERO, WORK, N )
288 CALL DLACPY( CUPLO, N, N, A, LDA, WORK, N )
291 CALL DSYR( CUPLO, N, -D( J ), U( 1, J ), 1, WORK, N )
294.GT..AND..EQ.
IF( N1 KBAND1 ) THEN
296 CALL DSYR2( CUPLO, N, -E( J ), U( 1, J ), 1, U( 1, J+1 ),
300 WNORM = DLANSY( '1
', CUPLO, N, WORK, N, WORK( N**2+1 ) )
302.EQ.
ELSE IF( ITYPE2 ) THEN
306 CALL DLASET( '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 DLARFY( '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 DLARFY( '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 = DLANSY( '1
', CUPLO, N, WORK, N, WORK( N**2+1 ) )
359.EQ.
ELSE IF( ITYPE3 ) THEN
365 CALL DLACPY( ' ', N, N, U, LDU, WORK, N )
367 CALL DORM2R( 'r
', 't
', N, N-1, N-1, V( 2, 1 ), LDV, TAU,
368 $ WORK( N+1 ), N, WORK( N**2+1 ), IINFO )
370 CALL DORM2L( 'r
', 't
', N, N-1, N-1, V( 1, 2 ), LDV, TAU,
371 $ WORK, N, WORK( N**2+1 ), IINFO )
373.NE.
IF( IINFO0 ) THEN
374 RESULT( 1 ) = TEN / ULP
379 WORK( ( N+1 )*( J-1 )+1 ) = WORK( ( N+1 )*( J-1 )+1 ) - ONE
382 WNORM = DLANGE( '1
', N, N, WORK, N, WORK( N**2+1 ) )
385.GT.
IF( ANORMWNORM ) THEN
386 RESULT( 1 ) = ( WNORM / ANORM ) / ( N*ULP )
388.LT.
IF( ANORMONE ) THEN
389 RESULT( 1 ) = ( MIN( WNORM, N*ANORM ) / ANORM ) / ( N*ULP )
391 RESULT( 1 ) = MIN( WNORM / ANORM, DBLE( N ) ) / ( N*ULP )
399.EQ.
IF( ITYPE1 ) THEN
400 CALL DGEMM( '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 ) = MIN( DLANGE( '1
', N, N, WORK, N,
408 $ WORK( N**2+1 ) ), DBLE( N ) ) / ( N*ULP )
subroutine dlacpy(uplo, m, n, a, lda, b, ldb)
DLACPY copies all or part of one two-dimensional array to another.
subroutine dlaset(uplo, m, n, alpha, beta, a, lda)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine dlarfy(uplo, n, v, incv, tau, c, ldc, work)
DLARFY
subroutine dorm2r(side, trans, m, n, k, a, lda, tau, c, ldc, work, info)
DORM2R multiplies a general matrix by the orthogonal matrix from a QR factorization determined by sge...
subroutine dorm2l(side, trans, m, n, k, a, lda, tau, c, ldc, work, info)
DORM2L multiplies a general matrix by the orthogonal matrix from a QL factorization determined by sge...
subroutine dsyr(uplo, n, alpha, x, incx, a, lda)
DSYR
subroutine dsyr2(uplo, n, alpha, x, incx, y, incy, a, lda)
DSYR2
subroutine dgemm(transa, transb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc)
DGEMM
subroutine dsyt21(itype, uplo, n, kband, a, lda, d, e, u, ldu, v, ldv, tau, work, result)
DSYT21