207 SUBROUTINE dsyt21( 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 DOUBLE PRECISION A( LDA, * ), D( * ), E( * ), RESULT( 2 ),
221 $ tau( * ), u( ldu, * ), v( ldv, * ), work( * )
227 DOUBLE PRECISION ZERO, ONE, TEN
228 parameter( zero = 0.0d0, one = 1.0d0, ten = 10.0d0 )
233 INTEGER IINFO, J, JCOL, JR, JROW
234 DOUBLE PRECISION ANORM, ULP, UNFL, VSAVE, WNORM
238 DOUBLE PRECISION DLAMCH, DLANGE, DLANSY
239 EXTERNAL lsame, dlamch, dlange, dlansy
246 INTRINSIC dble, max, min
256 IF( lsame( uplo,
'U' ) )
THEN
264 unfl = dlamch(
'Safe minimum' )
265 ulp = dlamch(
'Epsilon' )*dlamch(
'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( dlansy(
'1', cuplo, n, a, lda, work ), unfl )
286 IF( itype.EQ.1 )
THEN
290 CALL dlaset(
'Full', n, n, zero, zero, work, n )
291 CALL dlacpy( cuplo, n, n, a, lda, work, n )
294 CALL dsyr( cuplo, n, -d( j ), u( 1, j ), 1, work, n )
297 IF( n.GT.1 .AND. kband.EQ.1 )
THEN
299 CALL dsyr2( cuplo, n, -e( j ), u( 1, j ), 1, u( 1, j+1 ),
303 wnorm = dlansy(
'1', cuplo, n, work, n, work( n**2+1 ) )
305 ELSE IF( itype.EQ.2 )
THEN
309 CALL dlaset(
'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 dlarfy(
'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 dlarfy(
'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 = dlansy(
'1', cuplo, n, work, n, work( n**2+1 ) )
362 ELSE IF( itype.EQ.3 )
THEN
368 CALL dlacpy(
' ', n, n, u, ldu, work, n )
370 CALL dorm2r(
'R',
'T', n, n-1, n-1, v( 2, 1 ), ldv, tau,
371 $ work( n+1 ), n, work( n**2+1 ), iinfo )
373 CALL dorm2l(
'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 = dlange(
'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, dble( n ) ) / ( n*ulp )
402 IF( itype.EQ.1 )
THEN
403 CALL dgemm(
'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( dlange(
'1', n, n, work, n,
411 $ work( n**2+1 ) ), dble( n ) ) / ( n*ulp )