157 SUBROUTINE dsyt22( ITYPE, UPLO, N, M, KBAND, A, LDA, D, E, U, LDU,
158 $ V, LDV, TAU, WORK, RESULT )
167 INTEGER ITYPE, KBAND, LDA, LDU, LDV, M, N
170 DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), RESULT( 2 ),
171 $ tau( * ), u( ldu, * ), v( ldv, * ), work( * )
177 DOUBLE PRECISION ZERO, ONE
178 parameter( zero = 0.0d0, one = 1.0d0 )
181 INTEGER J, JJ, JJ1, JJ2, NN, NNP1
182 DOUBLE PRECISION ANORM, ULP, UNFL, WNORM
185 DOUBLE PRECISION DLAMCH, DLANSY
186 EXTERNAL dlamch, dlansy
192 INTRINSIC dble, max, min
198 IF( n.LE.0 .OR. m.LE.0 )
201 unfl = dlamch(
'Safe minimum' )
202 ulp = dlamch(
'Precision' )
208 anorm = max( dlansy(
'1', uplo, n, a, lda, work ), unfl )
214 CALL dsymm(
'L', uplo, n, m, one, a, lda, u, ldu, zero, work, n )
217 CALL dgemm(
'T',
'N', m, m, n, one, u, ldu, work, n, zero,
220 jj = nn + ( j-1 )*n + j
221 work( jj ) = work( jj ) - d( j )
223 IF( kband.EQ.1 .AND. n.GT.1 )
THEN
225 jj1 = nn + ( j-1 )*n + j - 1
226 jj2 = nn + ( j-2 )*n + j
227 work( jj1 ) = work( jj1 ) - e( j-1 )
228 work( jj2 ) = work( jj2 ) - e( j-1 )
231 wnorm = dlansy(
'1', uplo, m, work( nnp1 ), n, work( 1 ) )
233 IF( anorm.GT.wnorm )
THEN
234 result( 1 ) = ( wnorm / anorm ) / ( m*ulp )
236 IF( anorm.LT.one )
THEN
237 result( 1 ) = ( min( wnorm, m*anorm ) / anorm ) / ( m*ulp )
239 result( 1 ) = min( wnorm / anorm, dble( m ) ) / ( m*ulp )
248 $
CALL dort01(
'Columns', n, m, u, ldu, work, 2*n*n,