123 SUBROUTINE dlattp( IMAT, UPLO, TRANS, DIAG, ISEED, N, A, B, WORK,
131 CHARACTER DIAG, TRANS, UPLO
132 INTEGER IMAT, INFO, N
136 DOUBLE PRECISION A( * ), B( * ), WORK( * )
142 DOUBLE PRECISION ONE, TWO, ZERO
143 parameter( one = 1.0d+0, two = 2.0d+0, zero = 0.0d+0 )
147 CHARACTER DIST, PACKIT, TYPE
149 INTEGER I, IY, J, JC, JCNEXT, JCOUNT, JJ, JL, JR, JX,
151 DOUBLE PRECISION ANORM, BIGNUM, BNORM, BSCAL, C, CNDNUM, PLUS1,
152 $ plus2, ra, rb, rexp, s, sfac, smlnum, star1,
153 $ stemp, t, texp, tleft, tscal, ulp, unfl, x, y,
159 DOUBLE PRECISION DLAMCH, DLARND
160 EXTERNAL lsame, idamax, dlamch, dlarnd
167 INTRINSIC abs, dble, max, sign, sqrt
171 path( 1: 1 ) =
'Double precision'
173 unfl = dlamch(
'Safe minimum' )
174 ulp = dlamch(
'Epsilon' )*dlamch(
'Base' )
176 bignum = ( one-ulp ) / smlnum
177 CALL dlabad( smlnum, bignum )
178 IF( ( imat.GE.7 .AND. imat.LE.10 ) .OR. imat.EQ.18 )
THEN
192 upper = lsame( uplo,
'U' )
194 CALL dlatb4( path, imat, n, n,
TYPE, kl, ku, anorm, mode,
198 CALL dlatb4( path, -imat, n, n,
TYPE, kl, ku, anorm, mode,
206 CALL dlatms( n, n, dist, iseed,
TYPE, b, mode, cndnum, anorm,
207 $ kl, ku, packit, a, n, work, info )
214 ELSE IF( imat.EQ.7 )
THEN
241 ELSE IF( imat.LE.10 )
THEN
324 plus2 = star1 / plus1
330 plus1 = star1 / plus2
331 rexp = dlarnd( 2, iseed )
332 star1 = star1*( sfac**rexp )
333 IF( rexp.LT.zero )
THEN
334 star1 = -sfac**( one-rexp )
336 star1 = sfac**( one+rexp )
341 x = sqrt( cndnum ) - one / sqrt( cndnum )
343 y = sqrt( two / dble( n-2 ) )*x
358 $ a( jc+j-1 ) = work( j-2 )
360 $ a( jc+j-2 ) = work( n+j-3 )
379 a( jc+1 ) = work( j-1 )
381 $ a( jc+2 ) = work( n+j-1 )
395 CALL drotg( ra, rb, c, s )
402 stemp = c*a( jx+j ) + s*a( jx+j+1 )
403 a( jx+j+1 ) = -s*a( jx+j ) + c*a( jx+j+1 )
412 $
CALL drot( j-1, a( jcnext ), 1, a( jc ), 1, -c, -s )
416 a( jcnext+j-1 ) = -a( jcnext+j-1 )
422 jcnext = jc + n - j + 1
425 CALL drotg( ra, rb, c, s )
430 $
CALL drot( n-j-1, a( jcnext+1 ), 1, a( jc+2 ), 1, c,
438 stemp = -c*a( jx+j-i ) + s*a( jx+j-i+1 )
439 a( jx+j-i+1 ) = -s*a( jx+j-i ) - c*a( jx+j-i+1 )
447 a( jc+1 ) = -a( jc+1 )
456 ELSE IF( imat.EQ.11 )
THEN
465 CALL dlarnv( 2, iseed, j, a( jc ) )
466 a( jc+j-1 ) = sign( two, a( jc+j-1 ) )
472 CALL dlarnv( 2, iseed, n-j+1, a( jc ) )
473 a( jc ) = sign( two, a( jc ) )
480 CALL dlarnv( 2, iseed, n, b )
481 iy = idamax( n, b, 1 )
482 bnorm = abs( b( iy ) )
483 bscal = bignum / max( one, bnorm )
484 CALL dscal( n, bscal, b, 1 )
486 ELSE IF( imat.EQ.12 )
THEN
492 CALL dlarnv( 2, iseed, n, b )
493 tscal = one / max( one, dble( n-1 ) )
497 CALL dlarnv( 2, iseed, j-1, a( jc ) )
498 CALL dscal( j-1, tscal, a( jc ), 1 )
499 a( jc+j-1 ) = sign( one, dlarnd( 2, iseed ) )
502 a( n*( n+1 ) / 2 ) = smlnum
506 CALL dlarnv( 2, iseed, n-j, a( jc+1 ) )
507 CALL dscal( n-j, tscal, a( jc+1 ), 1 )
508 a( jc ) = sign( one, dlarnd( 2, iseed ) )
514 ELSE IF( imat.EQ.13 )
THEN
520 CALL dlarnv( 2, iseed, n, b )
524 CALL dlarnv( 2, iseed, j-1, a( jc ) )
525 a( jc+j-1 ) = sign( one, dlarnd( 2, iseed ) )
528 a( n*( n+1 ) / 2 ) = smlnum
532 CALL dlarnv( 2, iseed, n-j, a( jc+1 ) )
533 a( jc ) = sign( one, dlarnd( 2, iseed ) )
539 ELSE IF( imat.EQ.14 )
THEN
547 jc = ( n-1 )*n / 2 + 1
552 IF( jcount.LE.2 )
THEN
569 IF( jcount.LE.2 )
THEN
591 DO 290 i = 1, n - 1, 2
597 ELSE IF( imat.EQ.15 )
THEN
603 texp = one / max( one, dble( n-1 ) )
605 CALL dlarnv( 2, iseed, n, b )
632 ELSE IF( imat.EQ.16 )
THEN
640 CALL dlarnv( 2, iseed, j, a( jc ) )
642 a( jc+j-1 ) = sign( two, a( jc+j-1 ) )
651 CALL dlarnv( 2, iseed, n-j+1, a( jc ) )
653 a( jc ) = sign( two, a( jc ) )
660 CALL dlarnv( 2, iseed, n, b )
661 CALL dscal( n, two, b, 1 )
663 ELSE IF( imat.EQ.17 )
THEN
671 tscal = ( one-ulp ) / tscal
672 DO 360 j = 1, n*( n+1 ) / 2
677 jc = ( n-1 )*n / 2 + 1
679 a( jc ) = -tscal / dble( n+1 )
681 b( j ) = texp*( one-ulp )
683 a( jc ) = -( tscal / dble( n+1 ) ) / dble( n+2 )
685 b( j-1 ) = texp*dble( n*n+n-1 )
689 b( 1 ) = ( dble( n+1 ) / dble( n+2 ) )*tscal
692 DO 380 j = 1, n - 1, 2
693 a( jc+n-j ) = -tscal / dble( n+1 )
695 b( j ) = texp*( one-ulp )
697 a( jc+n-j-1 ) = -( tscal / dble( n+1 ) ) / dble( n+2 )
699 b( j+1 ) = texp*dble( n*n+n-1 )
703 b( n ) = ( dble( n+1 ) / dble( n+2 ) )*tscal
706 ELSE IF( imat.EQ.18 )
THEN
715 CALL dlarnv( 2, iseed, j-1, a( jc ) )
723 $
CALL dlarnv( 2, iseed, n-j, a( jc+1 ) )
731 CALL dlarnv( 2, iseed, n, b )
732 iy = idamax( n, b, 1 )
733 bnorm = abs( b( iy ) )
734 bscal = bignum / max( one, bnorm )
735 CALL dscal( n, bscal, b, 1 )
737 ELSE IF( imat.EQ.19 )
THEN
743 tleft = bignum / max( one, dble( n-1 ) )
744 tscal = bignum*( dble( n-1 ) / max( one, dble( n ) ) )
748 CALL dlarnv( 2, iseed, j, a( jc ) )
750 a( jc+i-1 ) = sign( tleft, a( jc+i-1 ) ) +
758 CALL dlarnv( 2, iseed, n-j+1, a( jc ) )
760 a( jc+i-j ) = sign( tleft, a( jc+i-j ) ) +
766 CALL dlarnv( 2, iseed, n, b )
767 CALL dscal( n, two, b, 1 )
773 IF( .NOT.lsame( trans,
'N' ) )
THEN
781 a( jr-i+j ) = a( jl )
795 a( jl+i-j ) = a( jr )
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 drot(N, DX, INCX, DY, INCY, C, S)
DROT
subroutine dscal(N, DA, DX, INCX)
DSCAL
subroutine dlattp(IMAT, UPLO, TRANS, DIAG, ISEED, N, A, B, WORK, INFO)
DLATTP
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