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 = 0.0d+0 )
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, anorm, mode,
220 CALL dlatms( n, n, dist, iseed,
TYPE, b, mode, 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( 1, j ) )
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 )
585 b( i+1 ) = texp*dble( ( kd+1 )*( kd+1 )+kd )
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 ),
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 dscal(N, DA, DX, INCX)
DSCAL
subroutine dswap(N, DX, INCX, DY, INCY)
DSWAP
subroutine dlatb4(PATH, IMAT, M, N, TYPE, KL, KU, ANORM, MODE, CNDNUM, DIST)
DLATB4
subroutine dlattb(IMAT, UPLO, TRANS, DIAG, ISEED, N, KD, AB, LDAB, B, WORK, INFO)
DLATTB
subroutine dlatms(M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, KL, KU, PACK, A, LDA, WORK, INFO)
DLATMS