SCALAPACK 2.2.2
LAPACK: Linear Algebra PACKage
All Classes Files Functions Variables Typedefs Macros
zlagsy.f
Go to the documentation of this file.
1 SUBROUTINE zlagsy( N, K, D, A, LDA, ISEED, WORK, INFO )
2*
3* -- LAPACK auxiliary test routine (version 3.1) --
4* Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
5* November 2006
6*
7* .. Scalar Arguments ..
8 INTEGER INFO, K, LDA, N
9* ..
10* .. Array Arguments ..
11 INTEGER ISEED( 4 )
12 DOUBLE PRECISION D( * )
13 COMPLEX*16 A( LDA, * ), WORK( * )
14* ..
15*
16* Purpose
17* =======
18*
19* ZLAGSY generates a complex symmetric matrix A, by pre- and post-
20* multiplying a real diagonal matrix D with a random unitary matrix:
21* A = U*D*U**T. The semi-bandwidth may then be reduced to k by
22* additional unitary transformations.
23*
24* Arguments
25* =========
26*
27* N (input) INTEGER
28* The order of the matrix A. N >= 0.
29*
30* K (input) INTEGER
31* The number of nonzero subdiagonals within the band of A.
32* 0 <= K <= N-1.
33*
34* D (input) DOUBLE PRECISION array, dimension (N)
35* The diagonal elements of the diagonal matrix D.
36*
37* A (output) COMPLEX*16 array, dimension (LDA,N)
38* The generated n by n symmetric matrix A (the full matrix is
39* stored).
40*
41* LDA (input) INTEGER
42* The leading dimension of the array A. LDA >= N.
43*
44* ISEED (input/output) INTEGER array, dimension (4)
45* On entry, the seed of the random number generator; the array
46* elements must be between 0 and 4095, and ISEED(4) must be
47* odd.
48* On exit, the seed is updated.
49*
50* WORK (workspace) COMPLEX*16 array, dimension (2*N)
51*
52* INFO (output) INTEGER
53* = 0: successful exit
54* < 0: if INFO = -i, the i-th argument had an illegal value
55*
56* =====================================================================
57*
58* .. Parameters ..
59 COMPLEX*16 ZERO, ONE, HALF
60 parameter( zero = ( 0.0d+0, 0.0d+0 ),
61 $ one = ( 1.0d+0, 0.0d+0 ),
62 $ half = ( 0.5d+0, 0.0d+0 ) )
63* ..
64* .. Local Scalars ..
65 INTEGER I, II, J, JJ
66 DOUBLE PRECISION WN
67 COMPLEX*16 ALPHA, TAU, WA, WB, DOTC
68* ..
69* .. External Subroutines ..
70 EXTERNAL xerbla, zaxpy, zgemv, zgerc, zlacgv, zlarnv,
71 $ zscal, zsymv, zzdotc
72* ..
73* .. External Functions ..
74 DOUBLE PRECISION DZNRM2
75 EXTERNAL dznrm2
76* ..
77* .. Intrinsic Functions ..
78 INTRINSIC abs, dble, max
79* ..
80* .. Executable Statements ..
81*
82* Test the input arguments
83*
84 info = 0
85 IF( n.LT.0 ) THEN
86 info = -1
87 ELSE IF( k.LT.0 .OR. k.GT.n-1 ) THEN
88 info = -2
89 ELSE IF( lda.LT.max( 1, n ) ) THEN
90 info = -5
91 END IF
92 IF( info.LT.0 ) THEN
93 CALL xerbla( 'ZLAGSY', -info )
94 RETURN
95 END IF
96*
97* initialize lower triangle of A to diagonal matrix
98*
99 DO 20 j = 1, n
100 DO 10 i = j + 1, n
101 a( i, j ) = zero
102 10 CONTINUE
103 20 CONTINUE
104 DO 30 i = 1, n
105 a( i, i ) = d( i )
106 30 CONTINUE
107*
108* Generate lower triangle of symmetric matrix
109*
110 DO 60 i = n - 1, 1, -1
111*
112* generate random reflection
113*
114 CALL zlarnv( 3, iseed, n-i+1, work )
115 wn = dznrm2( n-i+1, work, 1 )
116 wa = ( wn / abs( work( 1 ) ) )*work( 1 )
117 IF( wn.EQ.zero ) THEN
118 tau = zero
119 ELSE
120 wb = work( 1 ) + wa
121 CALL zscal( n-i, one / wb, work( 2 ), 1 )
122 work( 1 ) = one
123 tau = dble( wb / wa )
124 END IF
125*
126* apply random reflection to A(i:n,i:n) from the left
127* and the right
128*
129* compute y := tau * A * conjg(u)
130*
131 CALL zlacgv( n-i+1, work, 1 )
132 CALL zsymv( 'Lower', n-i+1, tau, a( i, i ), lda, work, 1, zero,
133 $ work( n+1 ), 1 )
134 CALL zlacgv( n-i+1, work, 1 )
135*
136* compute v := y - 1/2 * tau * ( u, y ) * u
137*
138 CALL zzdotc( n-i+1, dotc, work, 1, work( n+1 ), 1 )
139 alpha = -half*tau*dotc
140 CALL zaxpy( n-i+1, alpha, work, 1, work( n+1 ), 1 )
141*
142* apply the transformation as a rank-2 update to A(i:n,i:n)
143*
144* CALL ZSYR2( 'Lower', N-I+1, -ONE, WORK, 1, WORK( N+1 ), 1,
145* $ A( I, I ), LDA )
146*
147 DO 50 jj = i, n
148 DO 40 ii = jj, n
149 a( ii, jj ) = a( ii, jj ) -
150 $ work( ii-i+1 )*work( n+jj-i+1 ) -
151 $ work( n+ii-i+1 )*work( jj-i+1 )
152 40 CONTINUE
153 50 CONTINUE
154 60 CONTINUE
155*
156* Reduce number of subdiagonals to K
157*
158 DO 100 i = 1, n - 1 - k
159*
160* generate reflection to annihilate A(k+i+1:n,i)
161*
162 wn = dznrm2( n-k-i+1, a( k+i, i ), 1 )
163 wa = ( wn / abs( a( k+i, i ) ) )*a( k+i, i )
164 IF( wn.EQ.zero ) THEN
165 tau = zero
166 ELSE
167 wb = a( k+i, i ) + wa
168 CALL zscal( n-k-i, one / wb, a( k+i+1, i ), 1 )
169 a( k+i, i ) = one
170 tau = dble( wb / wa )
171 END IF
172*
173* apply reflection to A(k+i:n,i+1:k+i-1) from the left
174*
175 CALL zgemv( 'Conjugate transpose', n-k-i+1, k-1, one,
176 $ a( k+i, i+1 ), lda, a( k+i, i ), 1, zero, work, 1 )
177 CALL zgerc( n-k-i+1, k-1, -tau, a( k+i, i ), 1, work, 1,
178 $ a( k+i, i+1 ), lda )
179*
180* apply reflection to A(k+i:n,k+i:n) from the left and the right
181*
182* compute y := tau * A * conjg(u)
183*
184 CALL zlacgv( n-k-i+1, a( k+i, i ), 1 )
185 CALL zsymv( 'Lower', n-k-i+1, tau, a( k+i, k+i ), lda,
186 $ a( k+i, i ), 1, zero, work, 1 )
187 CALL zlacgv( n-k-i+1, a( k+i, i ), 1 )
188*
189* compute v := y - 1/2 * tau * ( u, y ) * u
190*
191 CALL zzdotc( n-k-i+1, dotc, a( k+i, i ), 1, work, 1 )
192 alpha = -half*tau*dotc
193 CALL zaxpy( n-k-i+1, alpha, a( k+i, i ), 1, work, 1 )
194*
195* apply symmetric rank-2 update to A(k+i:n,k+i:n)
196*
197* CALL ZSYR2( 'Lower', N-K-I+1, -ONE, A( K+I, I ), 1, WORK, 1,
198* $ A( K+I, K+I ), LDA )
199*
200 DO 80 jj = k + i, n
201 DO 70 ii = jj, n
202 a( ii, jj ) = a( ii, jj ) - a( ii, i )*work( jj-k-i+1 ) -
203 $ work( ii-k-i+1 )*a( jj, i )
204 70 CONTINUE
205 80 CONTINUE
206*
207 a( k+i, i ) = -wa
208 DO 90 j = k + i + 1, n
209 a( j, i ) = zero
210 90 CONTINUE
211 100 CONTINUE
212*
213* Store full symmetric matrix
214*
215 DO 120 j = 1, n
216 DO 110 i = j + 1, n
217 a( j, i ) = a( i, j )
218 110 CONTINUE
219 120 CONTINUE
220 RETURN
221*
222* End of ZLAGSY
223*
224 END
#define max(A, B)
Definition pcgemr.c:180
subroutine zlagsy(n, k, d, a, lda, iseed, work, info)
Definition zlagsy.f:2
subroutine zlarnv(idist, iseed, n, x)
Definition zlarnv.f:2
subroutine zsymv(uplo, n, alpha, a, lda, x, incx, beta, y, incy)
Definition zsymv.f:2
subroutine zzdotc(n, dotc, x, incx, y, incy)
Definition zzdotc.f:2