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, , 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-
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 )