|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294 |
- *> \brief \b DLATM7
- *
- * =========== DOCUMENTATION ===========
- *
- * Online html documentation available at
- * http://www.netlib.org/lapack/explore-html/
- *
- * Definition:
- * ===========
- *
- * SUBROUTINE DLATM7( MODE, COND, IRSIGN, IDIST, ISEED, D, N,
- * RANK, INFO )
- *
- * .. Scalar Arguments ..
- * DOUBLE PRECISION COND
- * INTEGER IDIST, INFO, IRSIGN, MODE, N, RANK
- * ..
- * .. Array Arguments ..
- * DOUBLE PRECISION D( * )
- * INTEGER ISEED( 4 )
- * ..
- *
- *
- *> \par Purpose:
- * =============
- *>
- *> \verbatim
- *>
- *> DLATM7 computes the entries of D as specified by MODE
- *> COND and IRSIGN. IDIST and ISEED determine the generation
- *> of random numbers. DLATM7 is called by DLATMT to generate
- *> random test matrices.
- *> \endverbatim
- *
- * Arguments:
- * ==========
- *
- *> \verbatim
- *> MODE - INTEGER
- *> On entry describes how D is to be computed:
- *> MODE = 0 means do not change D.
- *>
- *> MODE = 1 sets D(1)=1 and D(2:RANK)=1.0/COND
- *> MODE = 2 sets D(1:RANK-1)=1 and D(RANK)=1.0/COND
- *> MODE = 3 sets D(I)=COND**(-(I-1)/(RANK-1)) I=1:RANK
- *>
- *> MODE = 4 sets D(i)=1 - (i-1)/(N-1)*(1 - 1/COND)
- *> MODE = 5 sets D to random numbers in the range
- *> ( 1/COND , 1 ) such that their logarithms
- *> are uniformly distributed.
- *> MODE = 6 set D to random numbers from same distribution
- *> as the rest of the matrix.
- *> MODE < 0 has the same meaning as ABS(MODE), except that
- *> the order of the elements of D is reversed.
- *> Thus if MODE is positive, D has entries ranging from
- *> 1 to 1/COND, if negative, from 1/COND to 1,
- *> Not modified.
- *>
- *> COND - DOUBLE PRECISION
- *> On entry, used as described under MODE above.
- *> If used, it must be >= 1. Not modified.
- *>
- *> IRSIGN - INTEGER
- *> On entry, if MODE neither -6, 0 nor 6, determines sign of
- *> entries of D
- *> 0 => leave entries of D unchanged
- *> 1 => multiply each entry of D by 1 or -1 with probability .5
- *>
- *> IDIST - CHARACTER*1
- *> On entry, IDIST specifies the type of distribution to be
- *> used to generate a random matrix .
- *> 1 => UNIFORM( 0, 1 )
- *> 2 => UNIFORM( -1, 1 )
- *> 3 => NORMAL( 0, 1 )
- *> Not modified.
- *>
- *> ISEED - INTEGER array, dimension ( 4 )
- *> On entry ISEED specifies the seed of the random number
- *> generator. The random number generator uses a
- *> linear congruential sequence limited to small
- *> integers, and so should produce machine independent
- *> random numbers. The values of ISEED are changed on
- *> exit, and can be used in the next call to DLATM7
- *> to continue the same random number sequence.
- *> Changed on exit.
- *>
- *> D - DOUBLE PRECISION array, dimension ( MIN( M , N ) )
- *> Array to be computed according to MODE, COND and IRSIGN.
- *> May be changed on exit if MODE is nonzero.
- *>
- *> N - INTEGER
- *> Number of entries of D. Not modified.
- *>
- *> RANK - INTEGER
- *> The rank of matrix to be generated for modes 1,2,3 only.
- *> D( RANK+1:N ) = 0.
- *> Not modified.
- *>
- *> INFO - INTEGER
- *> 0 => normal termination
- *> -1 => if MODE not in range -6 to 6
- *> -2 => if MODE neither -6, 0 nor 6, and
- *> IRSIGN neither 0 nor 1
- *> -3 => if MODE neither -6, 0 nor 6 and COND less than 1
- *> -4 => if MODE equals 6 or -6 and IDIST not in range 1 to 3
- *> -7 => if N negative
- *> \endverbatim
- *
- * Authors:
- * ========
- *
- *> \author Univ. of Tennessee
- *> \author Univ. of California Berkeley
- *> \author Univ. of Colorado Denver
- *> \author NAG Ltd.
- *
- *> \ingroup double_matgen
- *
- * =====================================================================
- SUBROUTINE DLATM7( MODE, COND, IRSIGN, IDIST, ISEED, D, N,
- $ RANK, INFO )
- *
- * -- LAPACK computational routine --
- * -- LAPACK is a software package provided by Univ. of Tennessee, --
- * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
- *
- * .. Scalar Arguments ..
- DOUBLE PRECISION COND
- INTEGER IDIST, INFO, IRSIGN, MODE, N, RANK
- * ..
- * .. Array Arguments ..
- DOUBLE PRECISION D( * )
- INTEGER ISEED( 4 )
- * ..
- *
- * =====================================================================
- *
- * .. Parameters ..
- DOUBLE PRECISION ONE
- PARAMETER ( ONE = 1.0D0 )
- DOUBLE PRECISION ZERO
- PARAMETER ( ZERO = 0.0D0 )
- DOUBLE PRECISION HALF
- PARAMETER ( HALF = 0.5D0 )
- * ..
- * .. Local Scalars ..
- DOUBLE PRECISION ALPHA, TEMP
- INTEGER I
- * ..
- * .. External Functions ..
- DOUBLE PRECISION DLARAN
- EXTERNAL DLARAN
- * ..
- * .. External Subroutines ..
- EXTERNAL DLARNV, XERBLA
- * ..
- * .. Intrinsic Functions ..
- INTRINSIC ABS, DBLE, EXP, LOG
- * ..
- * .. Executable Statements ..
- *
- * Decode and Test the input parameters. Initialize flags & seed.
- *
- INFO = 0
- *
- * Quick return if possible
- *
- IF( N.EQ.0 )
- $ RETURN
- *
- * Set INFO if an error
- *
- IF( MODE.LT.-6 .OR. MODE.GT.6 ) THEN
- INFO = -1
- ELSE IF( ( MODE.NE.-6 .AND. MODE.NE.0 .AND. MODE.NE.6 ) .AND.
- $ ( IRSIGN.NE.0 .AND. IRSIGN.NE.1 ) ) THEN
- INFO = -2
- ELSE IF( ( MODE.NE.-6 .AND. MODE.NE.0 .AND. MODE.NE.6 ) .AND.
- $ COND.LT.ONE ) THEN
- INFO = -3
- ELSE IF( ( MODE.EQ.6 .OR. MODE.EQ.-6 ) .AND.
- $ ( IDIST.LT.1 .OR. IDIST.GT.3 ) ) THEN
- INFO = -4
- ELSE IF( N.LT.0 ) THEN
- INFO = -7
- END IF
- *
- IF( INFO.NE.0 ) THEN
- CALL XERBLA( 'DLATM7', -INFO )
- RETURN
- END IF
- *
- * Compute D according to COND and MODE
- *
- IF( MODE.NE.0 ) THEN
- GO TO ( 100, 130, 160, 190, 210, 230 )ABS( MODE )
- *
- * One large D value:
- *
- 100 CONTINUE
- DO 110 I = 2, RANK
- D( I ) = ONE / COND
- 110 CONTINUE
- DO 120 I = RANK + 1, N
- D( I ) = ZERO
- 120 CONTINUE
- D( 1 ) = ONE
- GO TO 240
- *
- * One small D value:
- *
- 130 CONTINUE
- DO 140 I = 1, RANK - 1
- D( I ) = ONE
- 140 CONTINUE
- DO 150 I = RANK + 1, N
- D( I ) = ZERO
- 150 CONTINUE
- D( RANK ) = ONE / COND
- GO TO 240
- *
- * Exponentially distributed D values:
- *
- 160 CONTINUE
- D( 1 ) = ONE
- IF( N.GT.1 .AND. RANK.GT.1 ) THEN
- ALPHA = COND**( -ONE / DBLE( RANK-1 ) )
- DO 170 I = 2, RANK
- D( I ) = ALPHA**( I-1 )
- 170 CONTINUE
- DO 180 I = RANK + 1, N
- D( I ) = ZERO
- 180 CONTINUE
- END IF
- GO TO 240
- *
- * Arithmetically distributed D values:
- *
- 190 CONTINUE
- D( 1 ) = ONE
- IF( N.GT.1 ) THEN
- TEMP = ONE / COND
- ALPHA = ( ONE-TEMP ) / DBLE( N-1 )
- DO 200 I = 2, N
- D( I ) = DBLE( N-I )*ALPHA + TEMP
- 200 CONTINUE
- END IF
- GO TO 240
- *
- * Randomly distributed D values on ( 1/COND , 1):
- *
- 210 CONTINUE
- ALPHA = LOG( ONE / COND )
- DO 220 I = 1, N
- D( I ) = EXP( ALPHA*DLARAN( ISEED ) )
- 220 CONTINUE
- GO TO 240
- *
- * Randomly distributed D values from IDIST
- *
- 230 CONTINUE
- CALL DLARNV( IDIST, ISEED, N, D )
- *
- 240 CONTINUE
- *
- * If MODE neither -6 nor 0 nor 6, and IRSIGN = 1, assign
- * random signs to D
- *
- IF( ( MODE.NE.-6 .AND. MODE.NE.0 .AND. MODE.NE.6 ) .AND.
- $ IRSIGN.EQ.1 ) THEN
- DO 250 I = 1, N
- TEMP = DLARAN( ISEED )
- IF( TEMP.GT.HALF )
- $ D( I ) = -D( I )
- 250 CONTINUE
- END IF
- *
- * Reverse if MODE < 0
- *
- IF( MODE.LT.0 ) THEN
- DO 260 I = 1, N / 2
- TEMP = D( I )
- D( I ) = D( N+1-I )
- D( N+1-I ) = TEMP
- 260 CONTINUE
- END IF
- *
- END IF
- *
- RETURN
- *
- * End of DLATM7
- *
- END
|