1*> \brief \b SLATM7
2*
3*  =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6*            http://www.netlib.org/lapack/explore-html/
7*
8*  Definition:
9*  ===========
10*
11*       SUBROUTINE SLATM7( MODE, COND, IRSIGN, IDIST, ISEED, D, N,
12*                          RANK, INFO )
13*
14*       .. Scalar Arguments ..
15*       REAL               COND
16*       INTEGER            IDIST, INFO, IRSIGN, MODE, N, RANK
17*       ..
18*       .. Array Arguments ..
19*       REAL               D( * )
20*       INTEGER            ISEED( 4 )
21*       ..
22*
23*
24*> \par Purpose:
25*  =============
26*>
27*> \verbatim
28*>
29*>    SLATM7 computes the entries of D as specified by MODE
30*>    COND and IRSIGN. IDIST and ISEED determine the generation
31*>    of random numbers. SLATM7 is called by SLATMT to generate
32*>    random test matrices.
33*> \endverbatim
34*
35*  Arguments:
36*  ==========
37*
38*> \verbatim
39*>  MODE   - INTEGER
40*>           On entry describes how D is to be computed:
41*>           MODE = 0 means do not change D.
42*>
43*>           MODE = 1 sets D(1)=1 and D(2:RANK)=1.0/COND
44*>           MODE = 2 sets D(1:RANK-1)=1 and D(RANK)=1.0/COND
45*>           MODE = 3 sets D(I)=COND**(-(I-1)/(RANK-1)) I=1:RANK
46*>
47*>           MODE = 4 sets D(i)=1 - (i-1)/(N-1)*(1 - 1/COND)
48*>           MODE = 5 sets D to random numbers in the range
49*>                    ( 1/COND , 1 ) such that their logarithms
50*>                    are uniformly distributed.
51*>           MODE = 6 set D to random numbers from same distribution
52*>                    as the rest of the matrix.
53*>           MODE < 0 has the same meaning as ABS(MODE), except that
54*>              the order of the elements of D is reversed.
55*>           Thus if MODE is positive, D has entries ranging from
56*>              1 to 1/COND, if negative, from 1/COND to 1,
57*>           Not modified.
58*>
59*>  COND   - REAL
60*>           On entry, used as described under MODE above.
61*>           If used, it must be >= 1. Not modified.
62*>
63*>  IRSIGN - INTEGER
64*>           On entry, if MODE neither -6, 0 nor 6, determines sign of
65*>           entries of D
66*>           0 => leave entries of D unchanged
67*>           1 => multiply each entry of D by 1 or -1 with probability .5
68*>
69*>  IDIST  - CHARACTER*1
70*>           On entry, IDIST specifies the type of distribution to be
71*>           used to generate a random matrix .
72*>           1 => UNIFORM( 0, 1 )
73*>           2 => UNIFORM( -1, 1 )
74*>           3 => NORMAL( 0, 1 )
75*>           Not modified.
76*>
77*>  ISEED  - INTEGER array, dimension ( 4 )
78*>           On entry ISEED specifies the seed of the random number
79*>           generator. The random number generator uses a
80*>           linear congruential sequence limited to small
81*>           integers, and so should produce machine independent
82*>           random numbers. The values of ISEED are changed on
83*>           exit, and can be used in the next call to SLATM7
84*>           to continue the same random number sequence.
85*>           Changed on exit.
86*>
87*>  D      - REAL array, dimension ( MIN( M , N ) )
88*>           Array to be computed according to MODE, COND and IRSIGN.
89*>           May be changed on exit if MODE is nonzero.
90*>
91*>  N      - INTEGER
92*>           Number of entries of D. Not modified.
93*>
94*>  RANK   - INTEGER
95*>           The rank of matrix to be generated for modes 1,2,3 only.
96*>           D( RANK+1:N ) = 0.
97*>           Not modified.
98*>
99*>  INFO   - INTEGER
100*>            0  => normal termination
101*>           -1  => if MODE not in range -6 to 6
102*>           -2  => if MODE neither -6, 0 nor 6, and
103*>                  IRSIGN neither 0 nor 1
104*>           -3  => if MODE neither -6, 0 nor 6 and COND less than 1
105*>           -4  => if MODE equals 6 or -6 and IDIST not in range 1 to 3
106*>           -7  => if N negative
107*> \endverbatim
108*
109*  Authors:
110*  ========
111*
112*> \author Univ. of Tennessee
113*> \author Univ. of California Berkeley
114*> \author Univ. of Colorado Denver
115*> \author NAG Ltd.
116*
117*> \ingroup real_matgen
118*
119*  =====================================================================
120      SUBROUTINE SLATM7( MODE, COND, IRSIGN, IDIST, ISEED, D, N,
121     $                   RANK, INFO )
122*
123*  -- LAPACK computational routine --
124*  -- LAPACK is a software package provided by Univ. of Tennessee,    --
125*  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
126*
127*     .. Scalar Arguments ..
128      REAL               COND
129      INTEGER            IDIST, INFO, IRSIGN, MODE, N, RANK
130*     ..
131*     .. Array Arguments ..
132      REAL               D( * )
133      INTEGER            ISEED( 4 )
134*     ..
135*
136*  =====================================================================
137*
138*     .. Parameters ..
139      REAL               ONE
140      PARAMETER          ( ONE = 1.0E0 )
141      REAL               ZERO
142      PARAMETER          ( ZERO = 0.0E0 )
143      REAL               HALF
144      PARAMETER          ( HALF = 0.5E0 )
145*     ..
146*     .. Local Scalars ..
147      REAL               ALPHA, TEMP
148      INTEGER            I
149*     ..
150*     .. External Functions ..
151      REAL               SLARAN
152      EXTERNAL           SLARAN
153*     ..
154*     .. External Subroutines ..
155      EXTERNAL           SLARNV, XERBLA
156*     ..
157*     .. Intrinsic Functions ..
158      INTRINSIC          ABS, EXP, LOG, REAL
159*     ..
160*     .. Executable Statements ..
161*
162*     Decode and Test the input parameters. Initialize flags & seed.
163*
164      INFO = 0
165*
166*     Quick return if possible
167*
168      IF( N.EQ.0 )
169     $   RETURN
170*
171*     Set INFO if an error
172*
173      IF( MODE.LT.-6 .OR. MODE.GT.6 ) THEN
174         INFO = -1
175      ELSE IF( ( MODE.NE.-6 .AND. MODE.NE.0 .AND. MODE.NE.6 ) .AND.
176     $         ( IRSIGN.NE.0 .AND. IRSIGN.NE.1 ) ) THEN
177         INFO = -2
178      ELSE IF( ( MODE.NE.-6 .AND. MODE.NE.0 .AND. MODE.NE.6 ) .AND.
179     $         COND.LT.ONE ) THEN
180         INFO = -3
181      ELSE IF( ( MODE.EQ.6 .OR. MODE.EQ.-6 ) .AND.
182     $         ( IDIST.LT.1 .OR. IDIST.GT.3 ) ) THEN
183         INFO = -4
184      ELSE IF( N.LT.0 ) THEN
185         INFO = -7
186      END IF
187*
188      IF( INFO.NE.0 ) THEN
189         CALL XERBLA( 'SLATM7', -INFO )
190         RETURN
191      END IF
192*
193*     Compute D according to COND and MODE
194*
195      IF( MODE.NE.0 ) THEN
196         GO TO ( 100, 130, 160, 190, 210, 230 )ABS( MODE )
197*
198*        One large D value:
199*
200  100    CONTINUE
201         DO 110 I = 2, RANK
202            D( I ) = ONE / COND
203  110    CONTINUE
204         DO 120 I = RANK + 1, N
205            D( I ) = ZERO
206  120    CONTINUE
207         D( 1 ) = ONE
208         GO TO 240
209*
210*        One small D value:
211*
212  130    CONTINUE
213         DO 140 I = 1, RANK - 1
214            D( I ) = ONE
215  140    CONTINUE
216         DO 150 I = RANK + 1, N
217            D( I ) = ZERO
218  150    CONTINUE
219         D( RANK ) = ONE / COND
220         GO TO 240
221*
222*        Exponentially distributed D values:
223*
224  160    CONTINUE
225         D( 1 ) = ONE
226         IF( N.GT.1  .AND. RANK.GT.1 ) THEN
227            ALPHA = COND**( -ONE / REAL( RANK-1 ) )
228            DO 170 I = 2, RANK
229               D( I ) = ALPHA**( I-1 )
230  170       CONTINUE
231            DO 180 I = RANK + 1, N
232               D( I ) = ZERO
233  180       CONTINUE
234         END IF
235         GO TO 240
236*
237*        Arithmetically distributed D values:
238*
239  190    CONTINUE
240         D( 1 ) = ONE
241         IF( N.GT.1 ) THEN
242            TEMP = ONE / COND
243            ALPHA = ( ONE-TEMP ) / REAL( N-1 )
244            DO 200 I = 2, N
245               D( I ) = REAL( N-I )*ALPHA + TEMP
246  200       CONTINUE
247         END IF
248         GO TO 240
249*
250*        Randomly distributed D values on ( 1/COND , 1):
251*
252  210    CONTINUE
253         ALPHA = LOG( ONE / COND )
254         DO 220 I = 1, N
255            D( I ) = EXP( ALPHA*SLARAN( ISEED ) )
256  220    CONTINUE
257         GO TO 240
258*
259*        Randomly distributed D values from IDIST
260*
261  230    CONTINUE
262         CALL SLARNV( IDIST, ISEED, N, D )
263*
264  240    CONTINUE
265*
266*        If MODE neither -6 nor 0 nor 6, and IRSIGN = 1, assign
267*        random signs to D
268*
269         IF( ( MODE.NE.-6 .AND. MODE.NE.0 .AND. MODE.NE.6 ) .AND.
270     $       IRSIGN.EQ.1 ) THEN
271            DO 250 I = 1, N
272               TEMP = SLARAN( ISEED )
273               IF( TEMP.GT.HALF )
274     $            D( I ) = -D( I )
275  250       CONTINUE
276         END IF
277*
278*        Reverse if MODE < 0
279*
280         IF( MODE.LT.0 ) THEN
281            DO 260 I = 1, N / 2
282               TEMP = D( I )
283               D( I ) = D( N+1-I )
284               D( N+1-I ) = TEMP
285  260       CONTINUE
286         END IF
287*
288      END IF
289*
290      RETURN
291*
292*     End of SLATM7
293*
294      END
295