133 SUBROUTINE slattb( 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 REAL AB( LDAB, * ), B( * ), WORK( * )
153 parameter( one = 1.0e+0, two = 2.0e+0, zero = 0.0e+0 )
157 CHARACTER DIST, PACKIT, TYPE
159 INTEGER I, IOFF, IY, J, JCOUNT, KL, KU, LENJ, MODE
160 REAL ANORM, BIGNUM, BNORM, BSCAL, CNDNUM, PLUS1,
161 $ plus2, rexp, sfac, smlnum, star1, texp, tleft,
162 $ tnorm, tscal, ulp, unfl
168 EXTERNAL lsame, isamax, slamch, slarnd
175 INTRINSIC abs, max, min, real, sign, sqrt
179 path( 1: 1 ) =
'Single precision'
181 unfl = slamch(
'Safe minimum' )
182 ulp = slamch(
'Epsilon' )*slamch(
'Base' )
184 bignum = ( one-ulp ) / smlnum
185 CALL slabad( smlnum, bignum )
186 IF( ( imat.GE.6 .AND. imat.LE.9 ) .OR. imat.EQ.17 )
THEN
200 upper = lsame( uplo,
'U' )
202 CALL slatb4( path, imat, n, n,
TYPE, kl, ku, anorm, mode,
205 ioff = 1 + max( 0, kd-n+1 )
209 CALL slatb4( path, -imat, n, n,
TYPE, kl, ku, anorm, mode,
220 CALL slatms( 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 ) = real( j )
264 DO 70 i = 2, min( kd+1, n-j+1 )
267 ab( 1, j ) = real( j )
276 ab( 1, 2 ) = sign( tnorm, slarnd( 2, iseed ) )
278 CALL slarnv( 2, iseed, lenj, work )
280 ab( 1, 2*( j+1 ) ) = tnorm*work( j )
283 ab( 2, 1 ) = sign( tnorm, slarnd( 2, iseed ) )
285 CALL slarnv( 2, iseed, lenj, work )
287 ab( 2, 2*j+1 ) = tnorm*work( j )
290 ELSE IF( kd.GT.1 )
THEN
308 star1 = sign( tnorm, slarnd( 2, iseed ) )
310 plus1 = sign( sfac, slarnd( 2, iseed ) )
312 plus2 = star1 / plus1
318 plus1 = star1 / plus2
323 rexp = slarnd( 2, iseed )
324 IF( rexp.LT.zero )
THEN
325 star1 = -sfac**( one-rexp )
327 star1 = sfac**( one+rexp )
335 CALL scopy( n-1, work, 1, ab( kd, 2 ), ldab )
336 CALL scopy( n-2, work( n+1 ), 1, ab( kd-1, 3 ), ldab )
338 CALL scopy( n-1, work, 1, ab( 2, 1 ), ldab )
339 CALL scopy( 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 slarnv( 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 slarnv( 2, iseed, lenj, ab( 1, j ) )
364 ab( 1, j ) = sign( two, ab( 1, j ) )
370 CALL slarnv( 2, iseed, n, b )
371 iy = isamax( n, b, 1 )
372 bnorm = abs( b( iy ) )
373 bscal = bignum / max( one, bnorm )
374 CALL sscal( n, bscal, b, 1 )
376 ELSE IF( imat.EQ.11 )
THEN
382 CALL slarnv( 2, iseed, n, b )
383 tscal = one / real( kd+1 )
386 lenj = min( j, kd+1 )
387 CALL slarnv( 2, iseed, lenj, ab( kd+2-lenj, j ) )
388 CALL sscal( 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 slarnv( 2, iseed, lenj, ab( 1, j ) )
397 $
CALL sscal( 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 slarnv( 2, iseed, n, b )
412 lenj = min( j, kd+1 )
413 CALL slarnv( 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 slarnv( 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 / real( kd+1 )
488 CALL slarnv( 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 slarnv( 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 slarnv( 2, iseed, lenj, ab( 1, j ) )
531 ab( 1, j ) = sign( two, ab( 1, j ) )
537 CALL slarnv( 2, iseed, n, b )
538 CALL sscal( 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 / real( 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 / real( kd+2 ) )
565 ab( kd+1, i-1 ) = one
566 b( i-1 ) = texp*real( ( kd+1 )*( kd+1 )+kd )
570 b( max( 1, j-kd+1 ) ) = ( real( kd+2 ) /
571 $ real( 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 / real( 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 $ real( kd+2 ) ) / real( kd+3 )
585 b( i+1 ) = texp*real( ( kd+1 )*( kd+1 )+kd )
589 b( min( n, j+kd-1 ) ) = ( real( kd+2 ) /
590 $ real( kd+3 ) )*tscal
600 ELSE IF( imat.EQ.17 )
THEN
608 lenj = min( j-1, kd )
609 CALL slarnv( 2, iseed, lenj, ab( kd+1-lenj, j ) )
610 ab( kd+1, j ) = real( j )
614 lenj = min( n-j, kd )
616 $
CALL slarnv( 2, iseed, lenj, ab( 2, j ) )
617 ab( 1, j ) = real( j )
623 CALL slarnv( 2, iseed, n, b )
624 iy = isamax( n, b, 1 )
625 bnorm = abs( b( iy ) )
626 bscal = bignum / max( one, bnorm )
627 CALL sscal( n, bscal, b, 1 )
629 ELSE IF( imat.EQ.18 )
THEN
635 tleft = bignum / max( one, real( kd ) )
636 tscal = bignum*( real( kd ) / real( kd+1 ) )
639 lenj = min( j, kd+1 )
640 CALL slarnv( 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 slarnv( 2, iseed, lenj, ab( 1, j ) )
651 ab( i, j ) = sign( tleft, ab( i, j ) ) +
656 CALL slarnv( 2, iseed, n, b )
657 CALL sscal( n, two, b, 1 )
662 IF( .NOT.lsame( trans,
'N' ) )
THEN
665 lenj = min( n-2*j+1, kd+1 )
666 CALL sswap( 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 sswap( lenj, ab( 1, j ), 1, ab( lenj, n-j+2-lenj ),
subroutine slabad(SMALL, LARGE)
SLABAD
subroutine slarnv(IDIST, ISEED, N, X)
SLARNV returns a vector of random numbers from a uniform or normal distribution.
subroutine slatms(M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, KL, KU, PACK, A, LDA, WORK, INFO)
SLATMS
subroutine sswap(N, SX, INCX, SY, INCY)
SSWAP
subroutine scopy(N, SX, INCX, SY, INCY)
SCOPY
subroutine sscal(N, SA, SX, INCX)
SSCAL
subroutine slatb4(PATH, IMAT, M, N, TYPE, KL, KU, ANORM, MODE, CNDNUM, DIST)
SLATB4
subroutine slattb(IMAT, UPLO, TRANS, DIAG, ISEED, N, KD, AB, LDAB, B, WORK, INFO)
SLATTB