LAPACK 3.3.0

slatm7.f

Go to the documentation of this file.
00001       SUBROUTINE SLATM7( MODE, COND, IRSIGN, IDIST, ISEED, D, N,
00002      $                   RANK, INFO )
00003 *
00004 *  -- LAPACK test routine (version 3.1) --
00005 *     Craig Lucas, University of Manchester / NAG Ltd.
00006 *     October, 2008
00007 *
00008 *     .. Scalar Arguments ..
00009       REAL               COND
00010       INTEGER            IDIST, INFO, IRSIGN, MODE, N, RANK
00011 *     ..
00012 *     .. Array Arguments ..
00013       REAL               D( * )
00014       INTEGER            ISEED( 4 )
00015 *     ..
00016 *
00017 *  Purpose
00018 *  =======
00019 *
00020 *     SLATM7 computes the entries of D as specified by MODE
00021 *     COND and IRSIGN. IDIST and ISEED determine the generation
00022 *     of random numbers. SLATM7 is called by SLATMT to generate
00023 *     random test matrices.
00024 *
00025 *  Arguments
00026 *  =========
00027 *
00028 *  MODE   - INTEGER
00029 *           On entry describes how D is to be computed:
00030 *           MODE = 0 means do not change D.
00031 *
00032 *           MODE = 1 sets D(1)=1 and D(2:RANK)=1.0/COND
00033 *           MODE = 2 sets D(1:RANK-1)=1 and D(RANK)=1.0/COND
00034 *           MODE = 3 sets D(I)=COND**(-(I-1)/(RANK-1)) I=1:RANK
00035 *
00036 *           MODE = 4 sets D(i)=1 - (i-1)/(N-1)*(1 - 1/COND)
00037 *           MODE = 5 sets D to random numbers in the range
00038 *                    ( 1/COND , 1 ) such that their logarithms
00039 *                    are uniformly distributed.
00040 *           MODE = 6 set D to random numbers from same distribution
00041 *                    as the rest of the matrix.
00042 *           MODE < 0 has the same meaning as ABS(MODE), except that
00043 *              the order of the elements of D is reversed.
00044 *           Thus if MODE is positive, D has entries ranging from
00045 *              1 to 1/COND, if negative, from 1/COND to 1,
00046 *           Not modified.
00047 *
00048 *  COND   - REAL
00049 *           On entry, used as described under MODE above.
00050 *           If used, it must be >= 1. Not modified.
00051 *
00052 *  IRSIGN - INTEGER
00053 *           On entry, if MODE neither -6, 0 nor 6, determines sign of
00054 *           entries of D
00055 *           0 => leave entries of D unchanged
00056 *           1 => multiply each entry of D by 1 or -1 with probability .5
00057 *
00058 *  IDIST  - CHARACTER*1
00059 *           On entry, IDIST specifies the type of distribution to be
00060 *           used to generate a random matrix .
00061 *           1 => UNIFORM( 0, 1 )
00062 *           2 => UNIFORM( -1, 1 )
00063 *           3 => NORMAL( 0, 1 )
00064 *           Not modified.
00065 *
00066 *  ISEED  - INTEGER array, dimension ( 4 )
00067 *           On entry ISEED specifies the seed of the random number
00068 *           generator. The random number generator uses a
00069 *           linear congruential sequence limited to small
00070 *           integers, and so should produce machine independent
00071 *           random numbers. The values of ISEED are changed on
00072 *           exit, and can be used in the next call to SLATM7
00073 *           to continue the same random number sequence.
00074 *           Changed on exit.
00075 *
00076 *  D      - REAL array, dimension ( MIN( M , N ) )
00077 *           Array to be computed according to MODE, COND and IRSIGN.
00078 *           May be changed on exit if MODE is nonzero.
00079 *
00080 *  N      - INTEGER
00081 *           Number of entries of D. Not modified.
00082 *
00083 *  RANK   - INTEGER
00084 *           The rank of matrix to be generated for modes 1,2,3 only.
00085 *           D( RANK+1:N ) = 0.
00086 *           Not modified.
00087 *
00088 *  INFO   - INTEGER
00089 *            0  => normal termination
00090 *           -1  => if MODE not in range -6 to 6
00091 *           -2  => if MODE neither -6, 0 nor 6, and
00092 *                  IRSIGN neither 0 nor 1
00093 *           -3  => if MODE neither -6, 0 nor 6 and COND less than 1
00094 *           -4  => if MODE equals 6 or -6 and IDIST not in range 1 to 3
00095 *           -7  => if N negative
00096 *
00097 *  =====================================================================
00098 *
00099 *     .. Parameters ..
00100       REAL               ONE
00101       PARAMETER          ( ONE = 1.0E0 )
00102       REAL               ZERO
00103       PARAMETER          ( ZERO = 0.0E0 )
00104       REAL               HALF
00105       PARAMETER          ( HALF = 0.5E0 )
00106 *     ..
00107 *     .. Local Scalars ..
00108       REAL               ALPHA, TEMP
00109       INTEGER            I
00110 *     ..
00111 *     .. External Functions ..
00112       REAL               SLARAN
00113       EXTERNAL           SLARAN
00114 *     ..
00115 *     .. External Subroutines ..
00116       EXTERNAL           SLARNV, XERBLA
00117 *     ..
00118 *     .. Intrinsic Functions ..
00119       INTRINSIC          ABS, EXP, LOG, REAL
00120 *     ..
00121 *     .. Executable Statements ..
00122 *
00123 *     Decode and Test the input parameters. Initialize flags & seed.
00124 *
00125       INFO = 0
00126 *
00127 *     Quick return if possible
00128 *
00129       IF( N.EQ.0 )
00130      $   RETURN
00131 *
00132 *     Set INFO if an error
00133 *
00134       IF( MODE.LT.-6 .OR. MODE.GT.6 ) THEN
00135          INFO = -1
00136       ELSE IF( ( MODE.NE.-6 .AND. MODE.NE.0 .AND. MODE.NE.6 ) .AND.
00137      $         ( IRSIGN.NE.0 .AND. IRSIGN.NE.1 ) ) THEN
00138          INFO = -2
00139       ELSE IF( ( MODE.NE.-6 .AND. MODE.NE.0 .AND. MODE.NE.6 ) .AND.
00140      $         COND.LT.ONE ) THEN
00141          INFO = -3
00142       ELSE IF( ( MODE.EQ.6 .OR. MODE.EQ.-6 ) .AND.
00143      $         ( IDIST.LT.1 .OR. IDIST.GT.3 ) ) THEN
00144          INFO = -4
00145       ELSE IF( N.LT.0 ) THEN
00146          INFO = -7
00147       END IF
00148 *
00149       IF( INFO.NE.0 ) THEN
00150          CALL XERBLA( 'SLATM7', -INFO )
00151          RETURN
00152       END IF
00153 *
00154 *     Compute D according to COND and MODE
00155 *
00156       IF( MODE.NE.0 ) THEN
00157          GO TO ( 100, 130, 160, 190, 210, 230 )ABS( MODE )
00158 *
00159 *        One large D value:
00160 *
00161   100    CONTINUE
00162          DO 110 I = 2, RANK
00163             D( I ) = ONE / COND
00164   110    CONTINUE
00165          DO 120 I = RANK + 1, N
00166             D( I ) = ZERO
00167   120    CONTINUE
00168          D( 1 ) = ONE
00169          GO TO 240
00170 *
00171 *        One small D value:
00172 *
00173   130    CONTINUE
00174          DO 140 I = 1, RANK - 1
00175             D( I ) = ONE
00176   140    CONTINUE
00177          DO 150 I = RANK + 1, N
00178             D( I ) = ZERO
00179   150    CONTINUE
00180          D( RANK ) = ONE / COND
00181          GO TO 240
00182 *
00183 *        Exponentially distributed D values:
00184 *
00185   160    CONTINUE
00186          D( 1 ) = ONE
00187          IF( N.GT.1 ) THEN
00188             ALPHA = COND**( -ONE / REAL( RANK-1 ) )
00189             DO 170 I = 2, RANK
00190                D( I ) = ALPHA**( I-1 )
00191   170       CONTINUE
00192             DO 180 I = RANK + 1, N
00193                D( I ) = ZERO
00194   180       CONTINUE
00195          END IF
00196          GO TO 240
00197 *
00198 *        Arithmetically distributed D values:
00199 *
00200   190    CONTINUE
00201          D( 1 ) = ONE
00202          IF( N.GT.1 ) THEN
00203             TEMP = ONE / COND
00204             ALPHA = ( ONE-TEMP ) / REAL( N-1 )
00205             DO 200 I = 2, N
00206                D( I ) = REAL( N-I )*ALPHA + TEMP
00207   200       CONTINUE
00208          END IF
00209          GO TO 240
00210 *
00211 *        Randomly distributed D values on ( 1/COND , 1):
00212 *
00213   210    CONTINUE
00214          ALPHA = LOG( ONE / COND )
00215          DO 220 I = 1, N
00216             D( I ) = EXP( ALPHA*SLARAN( ISEED ) )
00217   220    CONTINUE
00218          GO TO 240
00219 *
00220 *        Randomly distributed D values from IDIST
00221 *
00222   230    CONTINUE
00223          CALL SLARNV( IDIST, ISEED, N, D )
00224 *
00225   240    CONTINUE
00226 *
00227 *        If MODE neither -6 nor 0 nor 6, and IRSIGN = 1, assign
00228 *        random signs to D
00229 *
00230          IF( ( MODE.NE.-6 .AND. MODE.NE.0 .AND. MODE.NE.6 ) .AND.
00231      $       IRSIGN.EQ.1 ) THEN
00232             DO 250 I = 1, N
00233                TEMP = SLARAN( ISEED )
00234                IF( TEMP.GT.HALF )
00235      $            D( I ) = -D( I )
00236   250       CONTINUE
00237          END IF
00238 *
00239 *        Reverse if MODE < 0
00240 *
00241          IF( MODE.LT.0 ) THEN
00242             DO 260 I = 1, N / 2
00243                TEMP = D( I )
00244                D( I ) = D( N+1-I )
00245                D( N+1-I ) = TEMP
00246   260       CONTINUE
00247          END IF
00248 *
00249       END IF
00250 *
00251       RETURN
00252 *
00253 *     End of SLATM7
00254 *
00255       END
 All Files Functions