129 SUBROUTINE clattp( IMAT, UPLO, TRANS, DIAG, ISEED, N, AP, B, WORK,
137 CHARACTER DIAG, TRANS, UPLO
138 INTEGER IMAT, INFO, N
143 COMPLEX AP( * ), B( * ), WORK( * )
150 parameter( one = 1.0e+0, two = 2.0e+0, zero = 0.0e+0 )
154 CHARACTER DIST, PACKIT, TYPE
156 INTEGER I, IY, J, JC, JCNEXT, JCOUNT, JJ, JL, JR, JX,
158 REAL ANORM, BIGNUM, BNORM, BSCAL, C, CNDNUM, REXP,
159 $ sfac, smlnum, t, texp, tleft, tscal, ulp, unfl,
161 COMPLEX CTEMP, PLUS1, PLUS2, RA, RB, S, STAR1
168 EXTERNAL lsame, icamax, slamch, clarnd
175 INTRINSIC abs, cmplx, conjg, max, real, sqrt
179 path( 1: 1 ) =
'Complex 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.7 .AND. imat.LE.10 ) .OR. imat.EQ.18 )
THEN
200 upper = lsame( uplo,
'U' )
202 CALL clatb4( path, imat, n, n,
TYPE, kl, ku, anorm, mode,
206 CALL clatb4( path, -imat, n, n,
TYPE, kl, ku, anorm, mode,
214 CALL clatms( n, n, dist, iseed,
TYPE, rwork, mode, cndnum,
215 $ anorm, kl, ku, packit, ap, n, work, info )
222 ELSE IF( imat.EQ.7 )
THEN
249 ELSE IF( imat.LE.10 )
THEN
328 star1 = 0.25*clarnd( 5, iseed )
330 plus1 = sfac*clarnd( 5, iseed )
332 plus2 = star1 / plus1
338 plus1 = star1 / plus2
339 rexp = real( clarnd( 2, iseed ) )
340 IF( rexp.LT.zero )
THEN
341 star1 = -sfac**( one-rexp )*clarnd( 5, iseed )
343 star1 = sfac**( one+rexp )*clarnd( 5, iseed )
348 x = sqrt( cndnum ) - one / sqrt( cndnum )
350 y = sqrt( two / real( n-2 ) )*x
365 $ ap( jc+j-1 ) = work( j-2 )
367 $ ap( jc+j-2 ) = work( n+j-3 )
386 ap( jc+1 ) = work( j-1 )
388 $ ap( jc+2 ) = work( n+j-1 )
400 ra = ap( jcnext+j-1 )
402 CALL crotg( ra, rb, c, s )
409 ctemp = c*ap( jx+j ) + s*ap( jx+j+1 )
410 ap( jx+j+1 ) = -conjg( s )*ap( jx+j ) +
420 $
CALL crot( j-1, ap( jcnext ), 1, ap( jc ), 1, -c, -s )
424 ap( jcnext+j-1 ) = -ap( jcnext+j-1 )
430 jcnext = jc + n - j + 1
433 CALL crotg( ra, rb, c, s )
439 $
CALL crot( n-j-1, ap( jcnext+1 ), 1, ap( jc+2 ), 1, c,
447 ctemp = -c*ap( jx+j-i ) + s*ap( jx+j-i+1 )
448 ap( jx+j-i+1 ) = -conjg( s )*ap( jx+j-i ) -
457 ap( jc+1 ) = -ap( jc+1 )
466 ELSE IF( imat.EQ.11 )
THEN
475 CALL clarnv( 4, iseed, j-1, ap( jc ) )
476 ap( jc+j-1 ) = clarnd( 5, iseed )*two
483 $
CALL clarnv( 4, iseed, n-j, ap( jc+1 ) )
484 ap( jc ) = clarnd( 5, iseed )*two
491 CALL clarnv( 2, iseed, n, b )
492 iy = icamax( n, b, 1 )
493 bnorm = abs( b( iy ) )
494 bscal = bignum / max( one, bnorm )
495 CALL csscal( n, bscal, b, 1 )
497 ELSE IF( imat.EQ.12 )
THEN
503 CALL clarnv( 2, iseed, n, b )
504 tscal = one / max( one, real( n-1 ) )
508 CALL clarnv( 4, iseed, j-1, ap( jc ) )
509 CALL csscal( j-1, tscal, ap( jc ), 1 )
510 ap( jc+j-1 ) = clarnd( 5, iseed )
513 ap( n*( n+1 ) / 2 ) = smlnum*ap( n*( n+1 ) / 2 )
517 CALL clarnv( 2, iseed, n-j, ap( jc+1 ) )
518 CALL csscal( n-j, tscal, ap( jc+1 ), 1 )
519 ap( jc ) = clarnd( 5, iseed )
522 ap( 1 ) = smlnum*ap( 1 )
525 ELSE IF( imat.EQ.13 )
THEN
531 CALL clarnv( 2, iseed, n, b )
535 CALL clarnv( 4, iseed, j-1, ap( jc ) )
536 ap( jc+j-1 ) = clarnd( 5, iseed )
539 ap( n*( n+1 ) / 2 ) = smlnum*ap( n*( n+1 ) / 2 )
543 CALL clarnv( 4, iseed, n-j, ap( jc+1 ) )
544 ap( jc ) = clarnd( 5, iseed )
547 ap( 1 ) = smlnum*ap( 1 )
550 ELSE IF( imat.EQ.14 )
THEN
558 jc = ( n-1 )*n / 2 + 1
563 IF( jcount.LE.2 )
THEN
564 ap( jc+j-1 ) = smlnum*clarnd( 5, iseed )
566 ap( jc+j-1 ) = clarnd( 5, iseed )
580 IF( jcount.LE.2 )
THEN
581 ap( jc ) = smlnum*clarnd( 5, iseed )
583 ap( jc ) = clarnd( 5, iseed )
598 b( i-1 ) = smlnum*clarnd( 5, iseed )
602 DO 290 i = 1, n - 1, 2
604 b( i+1 ) = smlnum*clarnd( 5, iseed )
608 ELSE IF( imat.EQ.15 )
THEN
614 texp = one / max( one, real( n-1 ) )
616 CALL clarnv( 4, iseed, n, b )
624 $ ap( jc+j-2 ) = cmplx( -one, -one )
625 ap( jc+j-1 ) = tscal*clarnd( 5, iseed )
628 b( n ) = cmplx( one, one )
636 $ ap( jc+1 ) = cmplx( -one, -one )
637 ap( jc ) = tscal*clarnd( 5, iseed )
640 b( 1 ) = cmplx( one, one )
643 ELSE IF( imat.EQ.16 )
THEN
651 CALL clarnv( 4, iseed, j, ap( jc ) )
653 ap( jc+j-1 ) = clarnd( 5, iseed )*two
662 CALL clarnv( 4, iseed, n-j+1, ap( jc ) )
664 ap( jc ) = clarnd( 5, iseed )*two
671 CALL clarnv( 2, iseed, n, b )
672 CALL csscal( n, two, b, 1 )
674 ELSE IF( imat.EQ.17 )
THEN
682 tscal = ( one-ulp ) / tscal
683 DO 360 j = 1, n*( n+1 ) / 2
688 jc = ( n-1 )*n / 2 + 1
690 ap( jc ) = -tscal / real( n+1 )
692 b( j ) = texp*( one-ulp )
694 ap( jc ) = -( tscal / real( n+1 ) ) / real( n+2 )
696 b( j-1 ) = texp*real( n*n+n-1 )
700 b( 1 ) = ( real( n+1 ) / real( n+2 ) )*tscal
703 DO 380 j = 1, n - 1, 2
704 ap( jc+n-j ) = -tscal / real( n+1 )
706 b( j ) = texp*( one-ulp )
708 ap( jc+n-j-1 ) = -( tscal / real( n+1 ) ) / real( n+2 )
710 b( j+1 ) = texp*real( n*n+n-1 )
714 b( n ) = ( real( n+1 ) / real( n+2 ) )*tscal
717 ELSE IF( imat.EQ.18 )
THEN
726 CALL clarnv( 4, iseed, j-1, ap( jc ) )
734 $
CALL clarnv( 4, iseed, n-j, ap( jc+1 ) )
742 CALL clarnv( 2, iseed, n, b )
743 iy = icamax( n, b, 1 )
744 bnorm = abs( b( iy ) )
745 bscal = bignum / max( one, bnorm )
746 CALL csscal( n, bscal, b, 1 )
748 ELSE IF( imat.EQ.19 )
THEN
755 tleft = bignum / max( one, real( n-1 ) )
756 tscal = bignum*( real( n-1 ) / max( one, real( n ) ) )
760 CALL clarnv( 5, iseed, j, ap( jc ) )
761 CALL slarnv( 1, iseed, j, rwork )
763 ap( jc+i-1 ) = ap( jc+i-1 )*( tleft+rwork( i )*tscal )
770 CALL clarnv( 5, iseed, n-j+1, ap( jc ) )
771 CALL slarnv( 1, iseed, n-j+1, rwork )
773 ap( jc+i-j ) = ap( jc+i-j )*
774 $ ( tleft+rwork( i-j+1 )*tscal )
779 CALL clarnv( 2, iseed, n, b )
780 CALL csscal( n, two, b, 1 )
786 IF( .NOT.lsame( trans,
'N' ) )
THEN
793 t = real( ap( jr-i+j ) )
794 ap( jr-i+j ) = ap( jl )
807 t = real( ap( jl+i-j ) )
808 ap( jl+i-j ) = ap( jr )
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 csscal(N, SA, CX, INCX)
CSSCAL
subroutine clattp(IMAT, UPLO, TRANS, DIAG, ISEED, N, AP, B, WORK, RWORK, INFO)
CLATTP
subroutine clatb4(PATH, IMAT, M, N, TYPE, KL, KU, ANORM, MODE, CNDNUM, DIST)
CLATB4
subroutine clatms(M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, KL, KU, PACK, A, LDA, WORK, INFO)
CLATMS
subroutine crot(N, CX, INCX, CY, INCY, C, S)
CROT applies a plane rotation with real cosine and complex sine to a pair of complex vectors.
subroutine clarnv(IDIST, ISEED, N, X)
CLARNV returns a vector of random numbers from a uniform or normal distribution.
subroutine crotg(a, b, c, s)
CROTG generates a Givens rotation with real cosine and complex sine.