LAPACK  3.8.0
LAPACK: Linear Algebra PACKage

◆ zlaghe()

subroutine zlaghe ( integer  N,
integer  K,
double precision, dimension( * )  D,
complex*16, dimension( lda, * )  A,
integer  LDA,
integer, dimension( 4 )  ISEED,
complex*16, dimension( * )  WORK,
integer  INFO 
)

ZLAGHE

Purpose:
 ZLAGHE generates a complex hermitian matrix A, by pre- and post-
 multiplying a real diagonal matrix D with a random unitary matrix:
 A = U*D*U'. The semi-bandwidth may then be reduced to k by additional
 unitary transformations.
Parameters
[in]N
          N is INTEGER
          The order of the matrix A.  N >= 0.
[in]K
          K is INTEGER
          The number of nonzero subdiagonals within the band of A.
          0 <= K <= N-1.
[in]D
          D is DOUBLE PRECISION array, dimension (N)
          The diagonal elements of the diagonal matrix D.
[out]A
          A is COMPLEX*16 array, dimension (LDA,N)
          The generated n by n hermitian matrix A (the full matrix is
          stored).
[in]LDA
          LDA is INTEGER
          The leading dimension of the array A.  LDA >= N.
[in,out]ISEED
          ISEED is INTEGER array, dimension (4)
          On entry, the seed of the random number generator; the array
          elements must be between 0 and 4095, and ISEED(4) must be
          odd.
          On exit, the seed is updated.
[out]WORK
          WORK is COMPLEX*16 array, dimension (2*N)
[out]INFO
          INFO is INTEGER
          = 0: successful exit
          < 0: if INFO = -i, the i-th argument had an illegal value
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
Date
December 2016

Definition at line 104 of file zlaghe.f.

104 *
105 * -- LAPACK auxiliary routine (version 3.7.0) --
106 * -- LAPACK is a software package provided by Univ. of Tennessee, --
107 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
108 * December 2016
109 *
110 * .. Scalar Arguments ..
111  INTEGER info, k, lda, n
112 * ..
113 * .. Array Arguments ..
114  INTEGER iseed( 4 )
115  DOUBLE PRECISION d( * )
116  COMPLEX*16 a( lda, * ), work( * )
117 * ..
118 *
119 * =====================================================================
120 *
121 * .. Parameters ..
122  COMPLEX*16 zero, one, half
123  parameter( zero = ( 0.0d+0, 0.0d+0 ),
124  $ one = ( 1.0d+0, 0.0d+0 ),
125  $ half = ( 0.5d+0, 0.0d+0 ) )
126 * ..
127 * .. Local Scalars ..
128  INTEGER i, j
129  DOUBLE PRECISION wn
130  COMPLEX*16 alpha, tau, wa, wb
131 * ..
132 * .. External Subroutines ..
133  EXTERNAL xerbla, zaxpy, zgemv, zgerc, zhemv, zher2,
134  $ zlarnv, zscal
135 * ..
136 * .. External Functions ..
137  DOUBLE PRECISION dznrm2
138  COMPLEX*16 zdotc
139  EXTERNAL dznrm2, zdotc
140 * ..
141 * .. Intrinsic Functions ..
142  INTRINSIC abs, dble, dconjg, max
143 * ..
144 * .. Executable Statements ..
145 *
146 * Test the input arguments
147 *
148  info = 0
149  IF( n.LT.0 ) THEN
150  info = -1
151  ELSE IF( k.LT.0 .OR. k.GT.n-1 ) THEN
152  info = -2
153  ELSE IF( lda.LT.max( 1, n ) ) THEN
154  info = -5
155  END IF
156  IF( info.LT.0 ) THEN
157  CALL xerbla( 'ZLAGHE', -info )
158  RETURN
159  END IF
160 *
161 * initialize lower triangle of A to diagonal matrix
162 *
163  DO 20 j = 1, n
164  DO 10 i = j + 1, n
165  a( i, j ) = zero
166  10 CONTINUE
167  20 CONTINUE
168  DO 30 i = 1, n
169  a( i, i ) = d( i )
170  30 CONTINUE
171 *
172 * Generate lower triangle of hermitian matrix
173 *
174  DO 40 i = n - 1, 1, -1
175 *
176 * generate random reflection
177 *
178  CALL zlarnv( 3, iseed, n-i+1, work )
179  wn = dznrm2( n-i+1, work, 1 )
180  wa = ( wn / abs( work( 1 ) ) )*work( 1 )
181  IF( wn.EQ.zero ) THEN
182  tau = zero
183  ELSE
184  wb = work( 1 ) + wa
185  CALL zscal( n-i, one / wb, work( 2 ), 1 )
186  work( 1 ) = one
187  tau = dble( wb / wa )
188  END IF
189 *
190 * apply random reflection to A(i:n,i:n) from the left
191 * and the right
192 *
193 * compute y := tau * A * u
194 *
195  CALL zhemv( 'Lower', n-i+1, tau, a( i, i ), lda, work, 1, zero,
196  $ work( n+1 ), 1 )
197 *
198 * compute v := y - 1/2 * tau * ( y, u ) * u
199 *
200  alpha = -half*tau*zdotc( n-i+1, work( n+1 ), 1, work, 1 )
201  CALL zaxpy( n-i+1, alpha, work, 1, work( n+1 ), 1 )
202 *
203 * apply the transformation as a rank-2 update to A(i:n,i:n)
204 *
205  CALL zher2( 'Lower', n-i+1, -one, work, 1, work( n+1 ), 1,
206  $ a( i, i ), lda )
207  40 CONTINUE
208 *
209 * Reduce number of subdiagonals to K
210 *
211  DO 60 i = 1, n - 1 - k
212 *
213 * generate reflection to annihilate A(k+i+1:n,i)
214 *
215  wn = dznrm2( n-k-i+1, a( k+i, i ), 1 )
216  wa = ( wn / abs( a( k+i, i ) ) )*a( k+i, i )
217  IF( wn.EQ.zero ) THEN
218  tau = zero
219  ELSE
220  wb = a( k+i, i ) + wa
221  CALL zscal( n-k-i, one / wb, a( k+i+1, i ), 1 )
222  a( k+i, i ) = one
223  tau = dble( wb / wa )
224  END IF
225 *
226 * apply reflection to A(k+i:n,i+1:k+i-1) from the left
227 *
228  CALL zgemv( 'Conjugate transpose', n-k-i+1, k-1, one,
229  $ a( k+i, i+1 ), lda, a( k+i, i ), 1, zero, work, 1 )
230  CALL zgerc( n-k-i+1, k-1, -tau, a( k+i, i ), 1, work, 1,
231  $ a( k+i, i+1 ), lda )
232 *
233 * apply reflection to A(k+i:n,k+i:n) from the left and the right
234 *
235 * compute y := tau * A * u
236 *
237  CALL zhemv( 'Lower', n-k-i+1, tau, a( k+i, k+i ), lda,
238  $ a( k+i, i ), 1, zero, work, 1 )
239 *
240 * compute v := y - 1/2 * tau * ( y, u ) * u
241 *
242  alpha = -half*tau*zdotc( n-k-i+1, work, 1, a( k+i, i ), 1 )
243  CALL zaxpy( n-k-i+1, alpha, a( k+i, i ), 1, work, 1 )
244 *
245 * apply hermitian rank-2 update to A(k+i:n,k+i:n)
246 *
247  CALL zher2( 'Lower', n-k-i+1, -one, a( k+i, i ), 1, work, 1,
248  $ a( k+i, k+i ), lda )
249 *
250  a( k+i, i ) = -wa
251  DO 50 j = k + i + 1, n
252  a( j, i ) = zero
253  50 CONTINUE
254  60 CONTINUE
255 *
256 * Store full hermitian matrix
257 *
258  DO 80 j = 1, n
259  DO 70 i = j + 1, n
260  a( j, i ) = dconjg( a( i, j ) )
261  70 CONTINUE
262  80 CONTINUE
263  RETURN
264 *
265 * End of ZLAGHE
266 *
subroutine zgerc(M, N, ALPHA, X, INCX, Y, INCY, A, LDA)
ZGERC
Definition: zgerc.f:132
subroutine zher2(UPLO, N, ALPHA, X, INCX, Y, INCY, A, LDA)
ZHER2
Definition: zher2.f:152
subroutine zaxpy(N, ZA, ZX, INCX, ZY, INCY)
ZAXPY
Definition: zaxpy.f:90
double precision function dznrm2(N, X, INCX)
DZNRM2
Definition: dznrm2.f:77
complex *16 function zdotc(N, ZX, INCX, ZY, INCY)
ZDOTC
Definition: zdotc.f:85
subroutine zscal(N, ZA, ZX, INCX)
ZSCAL
Definition: zscal.f:80
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:62
subroutine zlarnv(IDIST, ISEED, N, X)
ZLARNV returns a vector of random numbers from a uniform or normal distribution.
Definition: zlarnv.f:101
subroutine zgemv(TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
ZGEMV
Definition: zgemv.f:160
subroutine zhemv(UPLO, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
ZHEMV
Definition: zhemv.f:156
Here is the call graph for this function:
Here is the caller graph for this function: