133 SUBROUTINE dlattb( IMAT, UPLO, TRANS, DIAG, ISEED, N, KD, AB,
134 $ LDAB, B, WORK, INFO )
141 CHARACTER DIAG, TRANS, UPLO
142 INTEGER IMAT, INFO, KD, LDAB, N
146 DOUBLE PRECISION AB( LDAB, * ), B( * ), WORK( * )
152 DOUBLE PRECISION ONE, TWO, ZERO
153 parameter( one = 1.0d+0, two = 2.0d+0, zero
157 CHARACTER DIST, PACKIT, TYPE
159 INTEGER I, IOFF, IY, J, JCOUNT, KL, KU, LENJ, MODE
160 DOUBLE PRECISION ANORM, BIGNUM, BNORM, BSCAL, CNDNUM, PLUS1,
161 $ plus2, rexp, sfac, smlnum, star1, texp, tleft,
162 $ tnorm, tscal, ulp, unfl
167 DOUBLE PRECISION DLAMCH, DLARND
168 EXTERNAL lsame, idamax, dlamch, dlarnd
175 INTRINSIC abs, dble,
max,
min, sign, sqrt
179 path( 1: 1 ) =
'Double precision'
181 unfl = dlamch(
'Safe minimum' )
182 ulp = dlamch(
'Epsilon' )*dlamch(
'Base' )
184 bignum = ( one-ulp ) / smlnum
185 CALL dlabad( smlnum, bignum )
186 IF( ( imat.GE.6 .AND. imat.LE.9 ) .OR. imat.EQ.17 )
THEN
200 upper = lsame( uplo,
'U' )
202 CALL dlatb4( path, imat, n, n,
TYPE, kl, ku, anorm, mode,
205 ioff = 1 +
max( 0, kd-n+1 )
209 CALL dlatb4( path, -imat, n, n,
TYPE, kl, ku, , mode,
220 CALL dlatms( n, n, dist, iseed,
TYPE, b, , cndnum, anorm,
221 $ kl, ku, packit, ab( ioff, 1 ), ldab, work, info )
228 ELSE IF( imat.EQ.6 )
THEN
231 DO 10 i =
max( 1, kd+2-j ), kd
239 DO 30 i = 2,
min( kd+1, n-j+1 )
250 ELSE IF( imat.LE.9 )
THEN
251 tnorm = sqrt( cndnum )
257 DO 50 i =
max( 1, kd+2-j ), kd
260 ab( kd+1, j ) = dble( j )
264 DO 70 i = 2,
min( kd+1, n-j+1 )
267 ab( 1, j ) = dble( j )
276 ab( 1, 2 ) = sign( tnorm, dlarnd( 2, iseed ) )
278 CALL dlarnv( 2, iseed, lenj, work )
280 ab( 1, 2*( j+1 ) ) = tnorm*work( j )
283 ab( 2, 1 ) = sign( tnorm, dlarnd( 2, iseed ) )
285 CALL dlarnv( 2, iseed, lenj, work )
287 ab( 2, 2*j+1 ) = tnorm*work( j )
290 ELSE IF( kd.GT.1 )
THEN
308 star1 = sign( tnorm, dlarnd( 2, iseed ) )
310 plus1 = sign( sfac, dlarnd( 2, iseed ) )
312 plus2 = star1 / plus1
318 plus1 = star1 / plus2
323 rexp = dlarnd( 2, iseed )
324 IF( rexp.LT.zero )
THEN
325 star1 = -sfac**( one-rexp )
327 star1 = sfac**( one+rexp )
335 CALL dcopy( n-1, work, 1, ab( kd, 2 ), ldab )
336 CALL dcopy( n-2, work( n+1 ), 1, ab( kd-1, 3 ), ldab )
338 CALL dcopy( n-1, work, 1, ab( 2, 1 ), ldab )
339 CALL dcopy( n-2, work( n+1 ), 1, ab( 3, 1 ), ldab )
347 ELSE IF( imat.EQ.10 )
THEN
355 lenj =
min( j, kd+1 )
356 CALL dlarnv( 2, iseed, lenj, ab( kd+2-lenj, j ) )
357 ab( kd+1, j ) = sign( two, ab( kd+1, j ) )
361 lenj =
min( n-j+1, kd+1 )
363 $
CALL dlarnv( 2, iseed, lenj, ab( 1, j ) )
364 ab( 1, j ) = sign( two, ab( 1, j ) )
370 CALL dlarnv( 2, iseed, n, b )
371 iy = idamax( n, b, 1 )
372 bnorm = abs( b( iy ) )
373 bscal = bignum /
max( one, bnorm )
374 CALL dscal( n, bscal, b, 1 )
376 ELSE IF( imat.EQ.11 )
THEN
382 CALL dlarnv( 2, iseed, n, b )
383 tscal = one / dble( kd+1 )
386 lenj =
min( j, kd+1 )
387 CALL dlarnv( 2, iseed, lenj, ab( kd+2-lenj, j ) )
388 CALL dscal( lenj-1, tscal, ab( kd+2-lenj, j ), 1 )
389 ab( kd+1, j ) = sign( one, ab( kd+1, j ) )
391 ab( kd+1, n ) = smlnum*ab( kd+1, n )
394 lenj =
min( n-j+1, kd+1 )
395 CALL dlarnv( 2, iseed, lenj, ab( 1, j ) )
397 $
CALL dscal( lenj-1, tscal, ab( 2, j ), 1 )
398 ab( 1, j ) = sign( one, ab( 1, j ) )
400 ab( 1, 1 ) = smlnum*ab( 1, 1 )
403 ELSE IF( imat.EQ.12 )
THEN
409 CALL dlarnv( 2, iseed, n, b )
412 lenj =
min( j, kd+1 )
413 CALL dlarnv( 2, iseed, lenj, ab( kd+2-lenj, j ) )
414 ab( kd+1, j ) = sign( one, ab( kd+1, j ) )
416 ab( kd+1, n ) = smlnum*ab( kd+1, n )
419 lenj =
min( n-j+1, kd+1 )
420 CALL dlarnv( 2, iseed, lenj, ab
421 ab( 1, j ) = sign( one, ab( 1, j ) )
423 ab( 1, 1 ) = smlnum*ab( 1, 1 )
426 ELSE IF( imat.EQ.13 )
THEN
435 DO 180 i =
max( 1, kd+1-( j-1 ) ), kd
438 IF( jcount.LE.2 )
THEN
439 ab( kd+1, j ) = smlnum
450 DO 200 i = 2,
min( n-j+1, kd+1 )
453 IF( jcount.LE.2 )
THEN
474 DO 230 i = 1, n - 1, 2
480 ELSE IF( imat.EQ.14 )
THEN
486 texp = one / dble( kd+1 )
488 CALL dlarnv( 2, iseed, n, b )
491 DO 240 i =
max( 1, kd+2-j ), kd
494 IF( j.GT.1 .AND. kd.GT.0 )
496 ab( kd+1, j ) = tscal
501 DO 260 i = 3,
min( n-j+1, kd+1 )
504 IF( j.LT.n .AND. kd.GT.0 )
511 ELSE IF( imat.EQ.15 )
THEN
518 lenj =
min( j, kd+1 )
519 CALL dlarnv( 2, iseed, lenj, ab( kd+2-lenj, j ) )
521 ab( kd+1, j ) = sign( two, ab( kd+1, j ) )
528 lenj =
min( n-j+1, kd+1 )
529 CALL dlarnv( 2, iseed, lenj, ab( 1, j ) )
531 ab( 1, j ) = sign( two, ab( 1, j ) )
537 CALL dlarnv( 2, iseed, n, b )
538 CALL dscal( n, two, b, 1 )
540 ELSE IF( imat.EQ.16 )
THEN
548 tscal = ( one-ulp ) / tscal
558 DO 320 i = j,
max( 1, j-kd+1 ), -2
559 ab( 1+( j-i ), i ) = -tscal / dble( kd+2 )
561 b( i ) = texp*( one-ulp )
562 IF( i.GT.
max( 1, j-kd+1 ) )
THEN
563 ab( 2+( j-i ), i-1 ) = -( tscal / dble( kd+2 ) )
565 ab( kd+1, i-1 ) = one
566 b( i-1 ) = texp*dble( ( kd+1 )*( kd+1 )+kd )
570 b(
max( 1, j-kd+1 ) ) = ( dble( kd+2 ) /
571 $ dble( kd+3 ) )*tscal
576 lenj =
min( kd+1, n-j+1 )
577 DO 340 i = j,
min( n, j+kd-1 ), 2
578 ab( lenj-( i-j ), j ) = -tscal / dble( kd+2 )
580 b( j ) = texp*( one-ulp )
581 IF( i.LT.
min( n, j+kd-1 ) )
THEN
582 ab( lenj-( i-j+1 ), i+1 ) = -( tscal /
583 $ dble( kd+2 ) ) / dble( kd+3 )
589 b(
min( n, j+kd-1 ) ) = ( dble( kd+2 ) /
590 $ dble( kd+3 ) )*tscal
600 ELSE IF( imat.EQ.17 )
THEN
608 lenj =
min( j-1, kd )
609 CALL dlarnv( 2, iseed, lenj, ab( kd+1-lenj, j ) )
610 ab( kd+1, j ) = dble( j )
614 lenj =
min( n-j, kd )
616 $
CALL dlarnv( 2, iseed, lenj, ab( 2, j ) )
617 ab( 1, j ) = dble( j )
623 CALL dlarnv( 2, iseed, n, b )
624 iy = idamax( n, b, 1 )
625 bnorm = abs( b( iy ) )
626 bscal = bignum /
max( one, bnorm )
627 CALL dscal( n, bscal, b, 1 )
629 ELSE IF( imat.EQ.18 )
THEN
635 tleft = bignum /
max( one, dble( kd ) )
636 tscal = bignum*( dble( kd ) / dble( kd+1 ) )
639 lenj =
min( j, kd+1 )
640 CALL dlarnv( 2, iseed, lenj, ab( kd+2-lenj, j ) )
641 DO 390 i = kd + 2 - lenj, kd + 1
642 ab( i, j ) = sign( tleft, ab( i, j ) ) +
648 lenj =
min( n-j+1, kd+1 )
649 CALL dlarnv( 2, iseed, lenj, ab( 1, j ) )
651 ab( i, j ) = sign( tleft, ab( i, j ) ) +
656 CALL dlarnv( 2, iseed, n, b )
657 CALL dscal( n, two, b, 1 )
662 IF( .NOT.lsame( trans,
'N' ) )
THEN
665 lenj =
min( n-2*j+1, kd+1 )
666 CALL dswap( lenj, ab( kd+1, j ), ldab-1,
667 $ ab( kd+2-lenj, n-j+1 ), -1 )
671 lenj =
min( n-2*j+1, kd+1 )
672 CALL dswap( lenj, ab( 1, j ), 1, ab( lenj, n-j+2-lenj ),