LAPACK  3.8.0
LAPACK: Linear Algebra PACKage

◆ zungtr()

subroutine zungtr ( character  UPLO,
integer  N,
complex*16, dimension( lda, * )  A,
integer  LDA,
complex*16, dimension( * )  TAU,
complex*16, dimension( * )  WORK,
integer  LWORK,
integer  INFO 
)

ZUNGTR

Download ZUNGTR + dependencies [TGZ] [ZIP] [TXT]

Purpose:
 ZUNGTR generates a complex unitary matrix Q which is defined as the
 product of n-1 elementary reflectors of order N, as returned by
 ZHETRD:

 if UPLO = 'U', Q = H(n-1) . . . H(2) H(1),

 if UPLO = 'L', Q = H(1) H(2) . . . H(n-1).
Parameters
[in]UPLO
          UPLO is CHARACTER*1
          = 'U': Upper triangle of A contains elementary reflectors
                 from ZHETRD;
          = 'L': Lower triangle of A contains elementary reflectors
                 from ZHETRD.
[in]N
          N is INTEGER
          The order of the matrix Q. N >= 0.
[in,out]A
          A is COMPLEX*16 array, dimension (LDA,N)
          On entry, the vectors which define the elementary reflectors,
          as returned by ZHETRD.
          On exit, the N-by-N unitary matrix Q.
[in]LDA
          LDA is INTEGER
          The leading dimension of the array A. LDA >= N.
[in]TAU
          TAU is COMPLEX*16 array, dimension (N-1)
          TAU(i) must contain the scalar factor of the elementary
          reflector H(i), as returned by ZHETRD.
[out]WORK
          WORK is COMPLEX*16 array, dimension (MAX(1,LWORK))
          On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
[in]LWORK
          LWORK is INTEGER
          The dimension of the array WORK. LWORK >= N-1.
          For optimum performance LWORK >= (N-1)*NB, where NB is
          the optimal blocksize.

          If LWORK = -1, then a workspace query is assumed; the routine
          only calculates the optimal size of the WORK array, returns
          this value as the first entry of the WORK array, and no error
          message related to LWORK is issued by XERBLA.
[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 125 of file zungtr.f.

125 *
126 * -- LAPACK computational routine (version 3.7.0) --
127 * -- LAPACK is a software package provided by Univ. of Tennessee, --
128 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
129 * December 2016
130 *
131 * .. Scalar Arguments ..
132  CHARACTER uplo
133  INTEGER info, lda, lwork, n
134 * ..
135 * .. Array Arguments ..
136  COMPLEX*16 a( lda, * ), tau( * ), work( * )
137 * ..
138 *
139 * =====================================================================
140 *
141 * .. Parameters ..
142  COMPLEX*16 zero, one
143  parameter( zero = ( 0.0d+0, 0.0d+0 ),
144  $ one = ( 1.0d+0, 0.0d+0 ) )
145 * ..
146 * .. Local Scalars ..
147  LOGICAL lquery, upper
148  INTEGER i, iinfo, j, lwkopt, nb
149 * ..
150 * .. External Functions ..
151  LOGICAL lsame
152  INTEGER ilaenv
153  EXTERNAL lsame, ilaenv
154 * ..
155 * .. External Subroutines ..
156  EXTERNAL xerbla, zungql, zungqr
157 * ..
158 * .. Intrinsic Functions ..
159  INTRINSIC max
160 * ..
161 * .. Executable Statements ..
162 *
163 * Test the input arguments
164 *
165  info = 0
166  lquery = ( lwork.EQ.-1 )
167  upper = lsame( uplo, 'U' )
168  IF( .NOT.upper .AND. .NOT.lsame( uplo, 'L' ) ) THEN
169  info = -1
170  ELSE IF( n.LT.0 ) THEN
171  info = -2
172  ELSE IF( lda.LT.max( 1, n ) ) THEN
173  info = -4
174  ELSE IF( lwork.LT.max( 1, n-1 ) .AND. .NOT.lquery ) THEN
175  info = -7
176  END IF
177 *
178  IF( info.EQ.0 ) THEN
179  IF( upper ) THEN
180  nb = ilaenv( 1, 'ZUNGQL', ' ', n-1, n-1, n-1, -1 )
181  ELSE
182  nb = ilaenv( 1, 'ZUNGQR', ' ', n-1, n-1, n-1, -1 )
183  END IF
184  lwkopt = max( 1, n-1 )*nb
185  work( 1 ) = lwkopt
186  END IF
187 *
188  IF( info.NE.0 ) THEN
189  CALL xerbla( 'ZUNGTR', -info )
190  RETURN
191  ELSE IF( lquery ) THEN
192  RETURN
193  END IF
194 *
195 * Quick return if possible
196 *
197  IF( n.EQ.0 ) THEN
198  work( 1 ) = 1
199  RETURN
200  END IF
201 *
202  IF( upper ) THEN
203 *
204 * Q was determined by a call to ZHETRD with UPLO = 'U'
205 *
206 * Shift the vectors which define the elementary reflectors one
207 * column to the left, and set the last row and column of Q to
208 * those of the unit matrix
209 *
210  DO 20 j = 1, n - 1
211  DO 10 i = 1, j - 1
212  a( i, j ) = a( i, j+1 )
213  10 CONTINUE
214  a( n, j ) = zero
215  20 CONTINUE
216  DO 30 i = 1, n - 1
217  a( i, n ) = zero
218  30 CONTINUE
219  a( n, n ) = one
220 *
221 * Generate Q(1:n-1,1:n-1)
222 *
223  CALL zungql( n-1, n-1, n-1, a, lda, tau, work, lwork, iinfo )
224 *
225  ELSE
226 *
227 * Q was determined by a call to ZHETRD with UPLO = 'L'.
228 *
229 * Shift the vectors which define the elementary reflectors one
230 * column to the right, and set the first row and column of Q to
231 * those of the unit matrix
232 *
233  DO 50 j = n, 2, -1
234  a( 1, j ) = zero
235  DO 40 i = j + 1, n
236  a( i, j ) = a( i, j-1 )
237  40 CONTINUE
238  50 CONTINUE
239  a( 1, 1 ) = one
240  DO 60 i = 2, n
241  a( i, 1 ) = zero
242  60 CONTINUE
243  IF( n.GT.1 ) THEN
244 *
245 * Generate Q(2:n,2:n)
246 *
247  CALL zungqr( n-1, n-1, n-1, a( 2, 2 ), lda, tau, work,
248  $ lwork, iinfo )
249  END IF
250  END IF
251  work( 1 ) = lwkopt
252  RETURN
253 *
254 * End of ZUNGTR
255 *
subroutine zungql(M, N, K, A, LDA, TAU, WORK, LWORK, INFO)
ZUNGQL
Definition: zungql.f:130
subroutine zungqr(M, N, K, A, LDA, TAU, WORK, LWORK, INFO)
ZUNGQR
Definition: zungqr.f:130
integer function ilaenv(ISPEC, NAME, OPTS, N1, N2, N3, N4)
ILAENV
Definition: tstiee.f:83
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:62
logical function lsame(CA, CB)
LSAME
Definition: lsame.f:55
Here is the call graph for this function:
Here is the caller graph for this function: