131 SUBROUTINE dlattr( IMAT, UPLO, TRANS, DIAG, ISEED, N, A, LDA, B,
139 CHARACTER DIAG, TRANS, UPLO
140 INTEGER IMAT, INFO, LDA, N
144 DOUBLE PRECISION A( LDA, * ), B( * ), WORK( * )
150 DOUBLE PRECISION ONE, TWO, ZERO
151 parameter( one = 1.0d+0, two = 2.0d+0, zero = 0.0d+0 )
157 INTEGER I, IY, J, JCOUNT, KL, KU, MODE
158 DOUBLE PRECISION ANORM, BIGNUM, BNORM, BSCAL, C, CNDNUM, PLUS1,
159 $ plus2, ra, rb, rexp, s, sfac, smlnum, star1,
160 $ texp, tleft, tscal, ulp, unfl, x, y, z
165 DOUBLE PRECISION DLAMCH, DLARND
166 EXTERNAL lsame, idamax, dlamch, dlarnd
173 INTRINSIC abs, dble, max, sign, sqrt
177 path( 1: 1 ) =
'Double precision'
179 unfl = dlamch(
'Safe minimum' )
180 ulp = dlamch(
'Epsilon' )*dlamch(
'Base' )
182 bignum = ( one-ulp ) / smlnum
183 CALL dlabad( smlnum, bignum )
184 IF( ( imat.GE.7 .AND. imat.LE.10 ) .OR. imat.EQ.18 )
THEN
198 upper = lsame( uplo,
'U' )
200 CALL dlatb4( path, imat, n, n,
TYPE, kl, ku, anorm, mode,
203 CALL dlatb4( path, -imat, n, n,
TYPE, kl, ku, anorm, mode,
210 CALL dlatms( n, n, dist, iseed,
TYPE, b, mode, cndnum, anorm,
211 $ kl, ku,
'No packing', a, lda, work, info )
218 ELSE IF( imat.EQ.7 )
THEN
241 ELSE IF( imat.LE.10 )
THEN
320 plus2 = star1 / plus1
326 plus1 = star1 / plus2
327 rexp = dlarnd( 2, iseed )
328 star1 = star1*( sfac**rexp )
329 IF( rexp.LT.zero )
THEN
330 star1 = -sfac**( one-rexp )
332 star1 = sfac**( one+rexp )
337 x = sqrt( cndnum ) - 1 / sqrt( cndnum )
339 y = sqrt( 2.d0 / ( n-2 ) )*x
347 CALL dcopy( n-3, work, 1, a( 2, 3 ), lda+1 )
349 $
CALL dcopy( n-4, work( n+1 ), 1, a( 2, 4 ), lda+1 )
358 CALL dcopy( n-3, work, 1, a( 3, 2 ), lda+1 )
360 $
CALL dcopy( n-4, work( n+1 ), 1, a( 4, 2 ), lda+1 )
375 CALL drotg( ra, rb, c, s )
380 $
CALL drot( n-j-1, a( j, j+2 ), lda, a( j+1, j+2 ),
386 $
CALL drot( j-1, a( 1, j+1 ), 1, a( 1, j ), 1, -c, -s )
390 a( j, j+1 ) = -a( j, j+1 )
396 CALL drotg( ra, rb, c, s )
401 $
CALL drot( n-j-1, a( j+2, j+1 ), 1, a( j+2, j ), 1, c,
407 $
CALL drot( j-1, a( j, 1 ), lda, a( j+1, 1 ), lda, -c,
412 a( j+1, j ) = -a( j+1, j )
420 ELSE IF( imat.EQ.11 )
THEN
428 CALL dlarnv( 2, iseed, j, a( 1, j ) )
429 a( j, j ) = sign( two, a( j, j ) )
433 CALL dlarnv( 2, iseed, n-j+1, a( j, j ) )
434 a( j, j ) = sign( two, a( j, j ) )
440 CALL dlarnv( 2, iseed, n, b )
441 iy = idamax( n, b, 1 )
442 bnorm = abs( b( iy ) )
443 bscal = bignum / max( one, bnorm )
444 CALL dscal( n, bscal, b, 1 )
446 ELSE IF( imat.EQ.12 )
THEN
452 CALL dlarnv( 2, iseed, n, b )
453 tscal = one / max( one, dble( n-1 ) )
456 CALL dlarnv( 2, iseed, j, a( 1, j ) )
457 CALL dscal( j-1, tscal, a( 1, j ), 1 )
458 a( j, j ) = sign( one, a( j, j ) )
460 a( n, n ) = smlnum*a( n, n )
463 CALL dlarnv( 2, iseed, n-j+1, a( j, j ) )
465 $
CALL dscal( n-j, tscal, a( j+1, j ), 1 )
466 a( j, j ) = sign( one, a( j, j ) )
468 a( 1, 1 ) = smlnum*a( 1, 1 )
471 ELSE IF( imat.EQ.13 )
THEN
477 CALL dlarnv( 2, iseed, n, b )
480 CALL dlarnv( 2, iseed, j, a( 1, j ) )
481 a( j, j ) = sign( one, a( j, j ) )
483 a( n, n ) = smlnum*a( n, n )
486 CALL dlarnv( 2, iseed, n-j+1, a( j, j ) )
487 a( j, j ) = sign( one, a( j, j ) )
489 a( 1, 1 ) = smlnum*a( 1, 1 )
492 ELSE IF( imat.EQ.14 )
THEN
504 IF( jcount.LE.2 )
THEN
519 IF( jcount.LE.2 )
THEN
540 DO 250 i = 1, n - 1, 2
546 ELSE IF( imat.EQ.15 )
THEN
552 texp = one / max( one, dble( n-1 ) )
554 CALL dlarnv( 2, iseed, n, b )
577 ELSE IF( imat.EQ.16 )
THEN
584 CALL dlarnv( 2, iseed, j, a( 1, j ) )
586 a( j, j ) = sign( two, a( j, j ) )
593 CALL dlarnv( 2, iseed, n-j+1, a( j, j ) )
595 a( j, j ) = sign( two, a( j, j ) )
601 CALL dlarnv( 2, iseed, n, b )
602 CALL dscal( n, two, b, 1 )
604 ELSE IF( imat.EQ.17 )
THEN
612 tscal = ( one-ulp ) / tscal
621 a( 1, j ) = -tscal / dble( n+1 )
623 b( j ) = texp*( one-ulp )
624 a( 1, j-1 ) = -( tscal / dble( n+1 ) ) / dble( n+2 )
626 b( j-1 ) = texp*dble( n*n+n-1 )
629 b( 1 ) = ( dble( n+1 ) / dble( n+2 ) )*tscal
631 DO 350 j = 1, n - 1, 2
632 a( n, j ) = -tscal / dble( n+1 )
634 b( j ) = texp*( one-ulp )
635 a( n, j+1 ) = -( tscal / dble( n+1 ) ) / dble( n+2 )
637 b( j+1 ) = texp*dble( n*n+n-1 )
640 b( n ) = ( dble( n+1 ) / dble( n+2 ) )*tscal
643 ELSE IF( imat.EQ.18 )
THEN
651 CALL dlarnv( 2, iseed, j-1, a( 1, j ) )
657 $
CALL dlarnv( 2, iseed, n-j, a( j+1, j ) )
664 CALL dlarnv( 2, iseed, n, b )
665 iy = idamax( n, b, 1 )
666 bnorm = abs( b( iy ) )
667 bscal = bignum / max( one, bnorm )
668 CALL dscal( n, bscal, b, 1 )
670 ELSE IF( imat.EQ.19 )
THEN
677 tleft = bignum / max( one, dble( n-1 ) )
678 tscal = bignum*( dble( n-1 ) / max( one, dble( n ) ) )
681 CALL dlarnv( 2, iseed, j, a( 1, j ) )
683 a( i, j ) = sign( tleft, a( i, j ) ) + tscal*a( i, j )
688 CALL dlarnv( 2, iseed, n-j+1, a( j, j ) )
690 a( i, j ) = sign( tleft, a( i, j ) ) + tscal*a( i, j )
694 CALL dlarnv( 2, iseed, n, b )
695 CALL dscal( n, two, b, 1 )
700 IF( .NOT.lsame( trans,
'N' ) )
THEN
703 CALL dswap( n-2*j+1, a( j, j ), lda, a( j+1, n-j+1 ),
708 CALL dswap( n-2*j+1, a( j, j ), 1, a( n-j+1, j+1 ),
subroutine dlabad(SMALL, LARGE)
DLABAD
subroutine dlarnv(IDIST, ISEED, N, X)
DLARNV returns a vector of random numbers from a uniform or normal distribution.
subroutine dcopy(N, DX, INCX, DY, INCY)
DCOPY
subroutine drot(N, DX, INCX, DY, INCY, C, S)
DROT
subroutine dscal(N, DA, DX, INCX)
DSCAL
subroutine dswap(N, DX, INCX, DY, INCY)
DSWAP
subroutine dlattr(IMAT, UPLO, TRANS, DIAG, ISEED, N, A, LDA, B, WORK, INFO)
DLATTR
subroutine dlatb4(PATH, IMAT, M, N, TYPE, KL, KU, ANORM, MODE, CNDNUM, DIST)
DLATB4
subroutine dlatms(M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, KL, KU, PACK, A, LDA, WORK, INFO)
DLATMS
subroutine drotg(a, b, c, s)
DROTG