OpenRadioss 2025.1.11
OpenRadioss project
Loading...
Searching...
No Matches
dlagge.f
Go to the documentation of this file.
1*> \brief \b DLAGGE
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 DLAGGE( M, N, KL, KU, D, A, LDA, ISEED, WORK, INFO )
12*
13* .. Scalar Arguments ..
14* INTEGER INFO, KL, KU, LDA, M, N
15* ..
16* .. Array Arguments ..
17* INTEGER ISEED( 4 )
18* DOUBLE PRECISION A( LDA, * ), D( * ), WORK( * )
19* ..
20*
21*
22*> \par Purpose:
23* =============
24*>
25*> \verbatim
26*>
27*> DLAGGE generates a real general m by n matrix A, by pre- and post-
28*> multiplying a real diagonal matrix D with random orthogonal matrices:
29*> A = U*D*V. The lower and upper bandwidths may then be reduced to
30*> kl and ku by additional orthogonal transformations.
31*> \endverbatim
32*
33* Arguments:
34* ==========
35*
36*> \param[in] M
37*> \verbatim
38*> M is INTEGER
39*> The number of rows of the matrix A. M >= 0.
40*> \endverbatim
41*>
42*> \param[in] N
43*> \verbatim
44*> N is INTEGER
45*> The number of columns of the matrix A. N >= 0.
46*> \endverbatim
47*>
48*> \param[in] KL
49*> \verbatim
50*> KL is INTEGER
51*> The number of nonzero subdiagonals within the band of A.
52*> 0 <= KL <= M-1.
53*> \endverbatim
54*>
55*> \param[in] KU
56*> \verbatim
57*> KU is INTEGER
58*> The number of nonzero superdiagonals within the band of A.
59*> 0 <= KU <= N-1.
60*> \endverbatim
61*>
62*> \param[in] D
63*> \verbatim
64*> D is DOUBLE PRECISION array, dimension (min(M,N))
65*> The diagonal elements of the diagonal matrix D.
66*> \endverbatim
67*>
68*> \param[out] A
69*> \verbatim
70*> A is DOUBLE PRECISION array, dimension (LDA,N)
71*> The generated m by n matrix A.
72*> \endverbatim
73*>
74*> \param[in] LDA
75*> \verbatim
76*> LDA is INTEGER
77*> The leading dimension of the array A. LDA >= M.
78*> \endverbatim
79*>
80*> \param[in,out] ISEED
81*> \verbatim
82*> ISEED is INTEGER array, dimension (4)
83*> On entry, the seed of the random number generator; the array
84*> elements must be between 0 and 4095, and ISEED(4) must be
85*> odd.
86*> On exit, the seed is updated.
87*> \endverbatim
88*>
89*> \param[out] WORK
90*> \verbatim
91*> WORK is DOUBLE PRECISION array, dimension (M+N)
92*> \endverbatim
93*>
94*> \param[out] INFO
95*> \verbatim
96*> INFO is INTEGER
97*> = 0: successful exit
98*> < 0: if INFO = -i, the i-th argument had an illegal value
99*> \endverbatim
100*
101* Authors:
102* ========
103*
104*> \author Univ. of Tennessee
105*> \author Univ. of California Berkeley
106*> \author Univ. of Colorado Denver
107*> \author NAG Ltd.
108*
109*> \ingroup double_matgen
110*
111* =====================================================================
112 SUBROUTINE dlagge( M, N, KL, KU, D, A, LDA, ISEED, WORK, INFO )
113*
114* -- LAPACK auxiliary routine --
115* -- LAPACK is a software package provided by Univ. of Tennessee, --
116* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
117*
118* .. Scalar Arguments ..
119 INTEGER INFO, KL, KU, LDA, M, N
120* ..
121* .. Array Arguments ..
122 INTEGER ISEED( 4 )
123 DOUBLE PRECISION A( LDA, * ), D( * ), WORK( * )
124* ..
125*
126* =====================================================================
127*
128* .. Parameters ..
129 DOUBLE PRECISION ZERO, ONE
130 parameter( zero = 0.0d+0, one = 1.0d+0 )
131* ..
132* .. Local Scalars ..
133 INTEGER I, J
134 DOUBLE PRECISION TAU, WA, WB, WN
135* ..
136* .. External Subroutines ..
137 EXTERNAL dgemv, dger, dlarnv, dscal, xerbla
138* ..
139* .. Intrinsic Functions ..
140 INTRINSIC max, min, sign
141* ..
142* .. External Functions ..
143 DOUBLE PRECISION DNRM2
144 EXTERNAL dnrm2
145* ..
146* .. Executable Statements ..
147*
148* Test the input arguments
149*
150 info = 0
151 IF( m.LT.0 ) THEN
152 info = -1
153 ELSE IF( n.LT.0 ) THEN
154 info = -2
155 ELSE IF( kl.LT.0 .OR. kl.GT.m-1 ) THEN
156 info = -3
157 ELSE IF( ku.LT.0 .OR. ku.GT.n-1 ) THEN
158 info = -4
159 ELSE IF( lda.LT.max( 1, m ) ) THEN
160 info = -7
161 END IF
162 IF( info.LT.0 ) THEN
163 CALL xerbla( 'dlagge', -INFO )
164 RETURN
165 END IF
166*
167* initialize A to diagonal matrix
168*
169 DO 20 J = 1, N
170 DO 10 I = 1, M
171 A( I, J ) = ZERO
172 10 CONTINUE
173 20 CONTINUE
174 DO 30 I = 1, MIN( M, N )
175 A( I, I ) = D( I )
176 30 CONTINUE
177*
178* Quick exit if the user wants a diagonal matrix
179*
180.EQ..AND..EQ. IF(( KL 0 )( KU 0)) RETURN
181*
182* pre- and post-multiply A by random orthogonal matrices
183*
184 DO 40 I = MIN( M, N ), 1, -1
185.LT. IF( IM ) THEN
186*
187* generate random reflection
188*
189 CALL DLARNV( 3, ISEED, M-I+1, WORK )
190 WN = DNRM2( M-I+1, WORK, 1 )
191 WA = SIGN( WN, WORK( 1 ) )
192.EQ. IF( WNZERO ) THEN
193 TAU = ZERO
194 ELSE
195 WB = WORK( 1 ) + WA
196 CALL DSCAL( M-I, ONE / WB, WORK( 2 ), 1 )
197 WORK( 1 ) = ONE
198 TAU = WB / WA
199 END IF
200*
201* multiply A(i:m,i:n) by random reflection from the left
202*
203 CALL DGEMV( 'transpose', M-I+1, N-I+1, ONE, A( I, I ), LDA,
204 $ WORK, 1, ZERO, WORK( M+1 ), 1 )
205 CALL DGER( M-I+1, N-I+1, -TAU, WORK, 1, WORK( M+1 ), 1,
206 $ A( I, I ), LDA )
207 END IF
208.LT. IF( IN ) THEN
209*
210* generate random reflection
211*
212 CALL DLARNV( 3, ISEED, N-I+1, WORK )
213 WN = DNRM2( N-I+1, WORK, 1 )
214 WA = SIGN( WN, WORK( 1 ) )
215.EQ. IF( WNZERO ) THEN
216 TAU = ZERO
217 ELSE
218 WB = WORK( 1 ) + WA
219 CALL DSCAL( N-I, ONE / WB, WORK( 2 ), 1 )
220 WORK( 1 ) = ONE
221 TAU = WB / WA
222 END IF
223*
224* multiply A(i:m,i:n) by random reflection from the right
225*
226 CALL DGEMV( 'no transpose', M-I+1, N-I+1, ONE, A( I, I ),
227 $ LDA, WORK, 1, ZERO, WORK( N+1 ), 1 )
228 CALL DGER( M-I+1, N-I+1, -TAU, WORK( N+1 ), 1, WORK, 1,
229 $ A( I, I ), LDA )
230 END IF
231 40 CONTINUE
232*
233* Reduce number of subdiagonals to KL and number of superdiagonals
234* to KU
235*
236 DO 70 I = 1, MAX( M-1-KL, N-1-KU )
237.LE. IF( KLKU ) THEN
238*
239* annihilate subdiagonal elements first (necessary if KL = 0)
240*
241.LE. IF( IMIN( M-1-KL, N ) ) THEN
242*
243* generate reflection to annihilate A(kl+i+1:m,i)
244*
245 WN = DNRM2( M-KL-I+1, A( KL+I, I ), 1 )
246 WA = SIGN( WN, A( KL+I, I ) )
247.EQ. IF( WNZERO ) THEN
248 TAU = ZERO
249 ELSE
250 WB = A( KL+I, I ) + WA
251 CALL DSCAL( M-KL-I, ONE / WB, A( KL+I+1, I ), 1 )
252 A( KL+I, I ) = ONE
253 TAU = WB / WA
254 END IF
255*
256* apply reflection to A(kl+i:m,i+1:n) from the left
257*
258 CALL DGEMV( 'transpose', M-KL-I+1, N-I, ONE,
259 $ A( KL+I, I+1 ), LDA, A( KL+I, I ), 1, ZERO,
260 $ WORK, 1 )
261 CALL DGER( M-KL-I+1, N-I, -TAU, A( KL+I, I ), 1, WORK, 1,
262 $ A( KL+I, I+1 ), LDA )
263 A( KL+I, I ) = -WA
264 END IF
265*
266.LE. IF( IMIN( N-1-KU, M ) ) THEN
267*
268* generate reflection to annihilate A(i,ku+i+1:n)
269*
270 WN = DNRM2( N-KU-I+1, A( I, KU+I ), LDA )
271 WA = SIGN( WN, A( I, KU+I ) )
272.EQ. IF( WNZERO ) THEN
273 TAU = ZERO
274 ELSE
275 WB = A( I, KU+I ) + WA
276 CALL DSCAL( N-KU-I, ONE / WB, A( I, KU+I+1 ), LDA )
277 A( I, KU+I ) = ONE
278 TAU = WB / WA
279 END IF
280*
281* apply reflection to A(i+1:m,ku+i:n) from the right
282*
283 CALL DGEMV( 'no transpose', M-I, N-KU-I+1, ONE,
284 $ A( I+1, KU+I ), LDA, A( I, KU+I ), LDA, ZERO,
285 $ WORK, 1 )
286 CALL DGER( M-I, N-KU-I+1, -TAU, WORK, 1, A( I, KU+I ),
287 $ LDA, A( I+1, KU+I ), LDA )
288 A( I, KU+I ) = -WA
289 END IF
290 ELSE
291*
292* annihilate superdiagonal elements first (necessary if
293* KU = 0)
294*
295.LE. IF( IMIN( N-1-KU, M ) ) THEN
296*
297* generate reflection to annihilate A(i,ku+i+1:n)
298*
299 WN = DNRM2( N-KU-I+1, A( I, KU+I ), LDA )
300 WA = SIGN( WN, A( I, KU+I ) )
301.EQ. IF( WNZERO ) THEN
302 TAU = ZERO
303 ELSE
304 WB = A( I, KU+I ) + WA
305 CALL DSCAL( N-KU-I, ONE / WB, A( I, KU+I+1 ), LDA )
306 A( I, KU+I ) = ONE
307 TAU = WB / WA
308 END IF
309*
310* apply reflection to A(i+1:m,ku+i:n) from the right
311*
312 CALL DGEMV( 'no transpose', M-I, N-KU-I+1, ONE,
313 $ A( I+1, KU+I ), LDA, A( I, KU+I ), LDA, ZERO,
314 $ WORK, 1 )
315 CALL DGER( M-I, N-KU-I+1, -TAU, WORK, 1, A( I, KU+I ),
316 $ LDA, A( I+1, KU+I ), LDA )
317 A( I, KU+I ) = -WA
318 END IF
319*
320.LE. IF( IMIN( M-1-KL, N ) ) THEN
321*
322* generate reflection to annihilate A(kl+i+1:m,i)
323*
324 WN = DNRM2( M-KL-I+1, A( KL+I, I ), 1 )
325 WA = SIGN( WN, A( KL+I, I ) )
326.EQ. IF( WNZERO ) THEN
327 TAU = ZERO
328 ELSE
329 WB = A( KL+I, I ) + WA
330 CALL DSCAL( M-KL-I, ONE / WB, A( KL+I+1, I ), 1 )
331 A( KL+I, I ) = ONE
332 TAU = WB / WA
333 END IF
334*
335* apply reflection to A(kl+i:m,i+1:n) from the left
336*
337 CALL DGEMV( 'transpose', M-KL-I+1, N-I, ONE,
338 $ A( KL+I, I+1 ), LDA, A( KL+I, I ), 1, ZERO,
339 $ WORK, 1 )
340 CALL DGER( M-KL-I+1, N-I, -TAU, A( KL+I, I ), 1, WORK, 1,
341 $ A( KL+I, I+1 ), LDA )
342 A( KL+I, I ) = -WA
343 END IF
344 END IF
345*
346.LE. IF (I N) THEN
347 DO 50 J = KL + I + 1, M
348 A( J, I ) = ZERO
349 50 CONTINUE
350 END IF
351*
352.LE. IF (I M) THEN
353 DO 60 J = KU + I + 1, N
354 A( I, J ) = ZERO
355 60 CONTINUE
356 END IF
357 70 CONTINUE
358 RETURN
359*
360* End of DLAGGE
361*
362 END
subroutine dlarnv(idist, iseed, n, x)
DLARNV returns a vector of random numbers from a uniform or normal distribution.
Definition dlarnv.f:97
subroutine xerbla(srname, info)
XERBLA
Definition xerbla.f:60
subroutine dscal(n, da, dx, incx)
DSCAL
Definition dscal.f:79
subroutine dgemv(trans, m, n, alpha, a, lda, x, incx, beta, y, incy)
DGEMV
Definition dgemv.f:156
subroutine dger(m, n, alpha, x, incx, y, incy, a, lda)
DGER
Definition dger.f:130
subroutine dlagge(m, n, kl, ku, d, a, lda, iseed, work, info)
DLAGGE
Definition dlagge.f:113
#define min(a, b)
Definition macros.h:20
#define max(a, b)
Definition macros.h:21