136 SUBROUTINE zlattr( IMAT, UPLO, TRANS, DIAG, ISEED, N, A, LDA, B,
137 $ WORK, RWORK, INFO )
144 CHARACTER DIAG, TRANS, UPLO
145 INTEGER IMAT, INFO, LDA, N
149 DOUBLE PRECISION RWORK( * )
150 COMPLEX*16 A( LDA, * ), B( * ), WORK( * )
156 DOUBLE PRECISION ONE, TWO, ZERO
157 parameter( one = 1.0d+0, two = 2.0d+0, zero = 0.0d+0 )
163 INTEGER I, IY, J, JCOUNT, KL, KU, MODE
164 DOUBLE PRECISION ANORM, BIGNUM, BNORM, BSCAL, C, CNDNUM, REXP,
165 $ sfac, smlnum, texp, tleft, tscal, ulp, unfl, x,
167 COMPLEX*16 PLUS1, PLUS2, RA, RB, S, STAR1
172 DOUBLE PRECISION DLAMCH, DLARND
174 EXTERNAL lsame, izamax, dlamch, dlarnd, zlarnd
181 INTRINSIC abs, dble, dcmplx, dconjg, max, sqrt
185 path( 1: 1 ) =
'Zomplex precision'
187 unfl = dlamch(
'Safe minimum' )
188 ulp = dlamch(
'Epsilon' )*dlamch(
'Base' )
190 bignum = ( one-ulp ) / smlnum
191 CALL dlabad( smlnum, bignum )
192 IF( ( imat.GE.7 .AND. imat.LE.10 ) .OR. imat.EQ.18 )
THEN
206 upper = lsame( uplo,
'U' )
208 CALL zlatb4( path, imat, n, n,
TYPE, kl, ku, anorm, mode,
211 CALL zlatb4( path, -imat, n, n,
TYPE, kl, ku, anorm, mode,
218 CALL zlatms( n, n, dist, iseed,
TYPE, rwork, mode, cndnum,
219 $ anorm, kl, ku,
'No packing', a, lda, work, info )
226 ELSE IF( imat.EQ.7 )
THEN
249 ELSE IF( imat.LE.10 )
THEN
324 star1 = 0.25d0*zlarnd( 5, iseed )
326 plus1 = sfac*zlarnd( 5, iseed )
328 plus2 = star1 / plus1
334 plus1 = star1 / plus2
335 rexp = dlarnd( 2, iseed )
336 IF( rexp.LT.zero )
THEN
337 star1 = -sfac**( one-rexp )*zlarnd( 5, iseed )
339 star1 = sfac**( one+rexp )*zlarnd( 5, iseed )
344 x = sqrt( cndnum ) - 1 / sqrt( cndnum )
346 y = sqrt( 2.d0 / ( n-2 ) )*x
354 CALL zcopy( n-3, work, 1, a( 2, 3 ), lda+1 )
356 $
CALL zcopy( n-4, work( n+1 ), 1, a( 2, 4 ), lda+1 )
365 CALL zcopy( n-3, work, 1, a( 3, 2 ), lda+1 )
367 $
CALL zcopy( n-4, work( n+1 ), 1, a( 4, 2 ), lda+1 )
382 CALL zrotg( ra, rb, c, s )
387 $
CALL zrot( n-j-1, a( j, j+2 ), lda, a( j+1, j+2 ),
393 $
CALL zrot( j-1, a( 1, j+1 ), 1, a( 1, j ), 1, -c, -s )
397 a( j, j+1 ) = -a( j, j+1 )
403 CALL zrotg( ra, rb, c, s )
409 $
CALL zrot( n-j-1, a( j+2, j+1 ), 1, a( j+2, j ), 1, c,
415 $
CALL zrot( j-1, a( j, 1 ), lda, a( j+1, 1 ), lda, -c,
420 a( j+1, j ) = -a( j+1, j )
428 ELSE IF( imat.EQ.11 )
THEN
436 CALL zlarnv( 4, iseed, j-1, a( 1, j ) )
437 a( j, j ) = zlarnd( 5, iseed )*two
442 $
CALL zlarnv( 4, iseed, n-j, a( j+1, j ) )
443 a( j, j ) = zlarnd( 5, iseed )*two
449 CALL zlarnv( 2, iseed, n, b )
450 iy = izamax( n, b, 1 )
451 bnorm = abs( b( iy ) )
452 bscal = bignum / max( one, bnorm )
453 CALL zdscal( n, bscal, b, 1 )
455 ELSE IF( imat.EQ.12 )
THEN
461 CALL zlarnv( 2, iseed, n, b )
462 tscal = one / max( one, dble( n-1 ) )
465 CALL zlarnv( 4, iseed, j-1, a( 1, j ) )
466 CALL zdscal( j-1, tscal, a( 1, j ), 1 )
467 a( j, j ) = zlarnd( 5, iseed )
469 a( n, n ) = smlnum*a( n, n )
473 CALL zlarnv( 4, iseed, n-j, a( j+1, j ) )
474 CALL zdscal( n-j, tscal, a( j+1, j ), 1 )
476 a( j, j ) = zlarnd( 5, iseed )
478 a( 1, 1 ) = smlnum*a( 1, 1 )
481 ELSE IF( imat.EQ.13 )
THEN
487 CALL zlarnv( 2, iseed, n, b )
490 CALL zlarnv( 4, iseed, j-1, a( 1, j ) )
491 a( j, j ) = zlarnd( 5, iseed )
493 a( n, n ) = smlnum*a( n, n )
497 $
CALL zlarnv( 4, iseed, n-j, a( j+1, j ) )
498 a( j, j ) = zlarnd( 5, iseed )
500 a( 1, 1 ) = smlnum*a( 1, 1 )
503 ELSE IF( imat.EQ.14 )
THEN
515 IF( jcount.LE.2 )
THEN
516 a( j, j ) = smlnum*zlarnd( 5, iseed )
518 a( j, j ) = zlarnd( 5, iseed )
530 IF( jcount.LE.2 )
THEN
531 a( j, j ) = smlnum*zlarnd( 5, iseed )
533 a( j, j ) = zlarnd( 5, iseed )
547 b( i-1 ) = smlnum*zlarnd( 5, iseed )
551 DO 250 i = 1, n - 1, 2
553 b( i+1 ) = smlnum*zlarnd( 5, iseed )
557 ELSE IF( imat.EQ.15 )
THEN
563 texp = one / max( one, dble( n-1 ) )
565 CALL zlarnv( 4, iseed, n, b )
572 $ a( j-1, j ) = dcmplx( -one, -one )
573 a( j, j ) = tscal*zlarnd( 5, iseed )
575 b( n ) = dcmplx( one, one )
582 $ a( j+1, j ) = dcmplx( -one, -one )
583 a( j, j ) = tscal*zlarnd( 5, iseed )
585 b( 1 ) = dcmplx( one, one )
588 ELSE IF( imat.EQ.16 )
THEN
595 CALL zlarnv( 4, iseed, j-1, a( 1, j ) )
597 a( j, j ) = zlarnd( 5, iseed )*two
605 $
CALL zlarnv( 4, iseed, n-j, a( j+1, j ) )
607 a( j, j ) = zlarnd( 5, iseed )*two
613 CALL zlarnv( 2, iseed, n, b )
614 CALL zdscal( n, two, b, 1 )
616 ELSE IF( imat.EQ.17 )
THEN
624 tscal = ( one-ulp ) / tscal
633 a( 1, j ) = -tscal / dble( n+1 )
635 b( j ) = texp*( one-ulp )
636 a( 1, j-1 ) = -( tscal / dble( n+1 ) ) / dble( n+2 )
638 b( j-1 ) = texp*dble( n*n+n-1 )
641 b( 1 ) = ( dble( n+1 ) / dble( n+2 ) )*tscal
643 DO 350 j = 1, n - 1, 2
644 a( n, j ) = -tscal / dble( n+1 )
646 b( j ) = texp*( one-ulp )
647 a( n, j+1 ) = -( tscal / dble( n+1 ) ) / dble( n+2 )
649 b( j+1 ) = texp*dble( n*n+n-1 )
652 b( n ) = ( dble( n+1 ) / dble( n+2 ) )*tscal
655 ELSE IF( imat.EQ.18 )
THEN
663 CALL zlarnv( 4, iseed, j-1, a( 1, j ) )
669 $
CALL zlarnv( 4, iseed, n-j, a( j+1, j ) )
676 CALL zlarnv( 2, iseed, n, b )
677 iy = izamax( n, b, 1 )
678 bnorm = abs( b( iy ) )
679 bscal = bignum / max( one, bnorm )
680 CALL zdscal( n, bscal, b, 1 )
682 ELSE IF( imat.EQ.19 )
THEN
689 tleft = bignum / max( one, dble( n-1 ) )
690 tscal = bignum*( dble( n-1 ) / max( one, dble( n ) ) )
693 CALL zlarnv( 5, iseed, j, a( 1, j ) )
694 CALL dlarnv( 1, iseed, j, rwork )
696 a( i, j ) = a( i, j )*( tleft+rwork( i )*tscal )
701 CALL zlarnv( 5, iseed, n-j+1, a( j, j ) )
702 CALL dlarnv( 1, iseed, n-j+1, rwork )
704 a( i, j ) = a( i, j )*( tleft+rwork( i-j+1 )*tscal )
708 CALL zlarnv( 2, iseed, n, b )
709 CALL zdscal( n, two, b, 1 )
714 IF( .NOT.lsame( trans,
'N' ) )
THEN
717 CALL zswap( n-2*j+1, a( j, j ), lda, a( j+1, n-j+1 ),
722 CALL zswap( n-2*j+1, a( j, j ), 1, a( n-j+1, j+1 ),
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 zswap(N, ZX, INCX, ZY, INCY)
ZSWAP
subroutine zdscal(N, DA, ZX, INCX)
ZDSCAL
subroutine zcopy(N, ZX, INCX, ZY, INCY)
ZCOPY
subroutine zlatb4(PATH, IMAT, M, N, TYPE, KL, KU, ANORM, MODE, CNDNUM, DIST)
ZLATB4
subroutine zlattr(IMAT, UPLO, TRANS, DIAG, ISEED, N, A, LDA, B, WORK, RWORK, INFO)
ZLATTR
subroutine zlatms(M, N, DIST, ISEED, SYM, D, MODE, COND, DMAX, KL, KU, PACK, A, LDA, WORK, INFO)
ZLATMS
subroutine zrot(N, CX, INCX, CY, INCY, C, S)
ZROT applies a plane rotation with real cosine and complex sine to a pair of complex vectors.
subroutine zlarnv(IDIST, ISEED, N, X)
ZLARNV returns a vector of random numbers from a uniform or normal distribution.
subroutine zrotg(a, b, c, s)
ZROTG