LAPACK 3.12.0
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches
cungtr.f
Go to the documentation of this file.
1*> \brief \b CUNGTR
2*
3* =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6* http://www.netlib.org/lapack/explore-html/
7*
8*> \htmlonly
9*> Download CUNGTR + dependencies
10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/cungtr.f">
11*> [TGZ]</a>
12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/cungtr.f">
13*> [ZIP]</a>
14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/cungtr.f">
15*> [TXT]</a>
16*> \endhtmlonly
17*
18* Definition:
19* ===========
20*
21* SUBROUTINE CUNGTR( UPLO, N, A, LDA, TAU, WORK, LWORK, INFO )
22*
23* .. Scalar Arguments ..
24* CHARACTER UPLO
25* INTEGER INFO, LDA, LWORK, N
26* ..
27* .. Array Arguments ..
28* COMPLEX A( LDA, * ), TAU( * ), WORK( * )
29* ..
30*
31*
32*> \par Purpose:
33* =============
34*>
35*> \verbatim
36*>
37*> CUNGTR generates a complex unitary matrix Q which is defined as the
38*> product of n-1 elementary reflectors of order N, as returned by
39*> CHETRD:
40*>
41*> if UPLO = 'U', Q = H(n-1) . . . H(2) H(1),
42*>
43*> if UPLO = 'L', Q = H(1) H(2) . . . H(n-1).
44*> \endverbatim
45*
46* Arguments:
47* ==========
48*
49*> \param[in] UPLO
50*> \verbatim
51*> UPLO is CHARACTER*1
52*> = 'U': Upper triangle of A contains elementary reflectors
53*> from CHETRD;
54*> = 'L': Lower triangle of A contains elementary reflectors
55*> from CHETRD.
56*> \endverbatim
57*>
58*> \param[in] N
59*> \verbatim
60*> N is INTEGER
61*> The order of the matrix Q. N >= 0.
62*> \endverbatim
63*>
64*> \param[in,out] A
65*> \verbatim
66*> A is COMPLEX array, dimension (LDA,N)
67*> On entry, the vectors which define the elementary reflectors,
68*> as returned by CHETRD.
69*> On exit, the N-by-N unitary matrix Q.
70*> \endverbatim
71*>
72*> \param[in] LDA
73*> \verbatim
74*> LDA is INTEGER
75*> The leading dimension of the array A. LDA >= N.
76*> \endverbatim
77*>
78*> \param[in] TAU
79*> \verbatim
80*> TAU is COMPLEX array, dimension (N-1)
81*> TAU(i) must contain the scalar factor of the elementary
82*> reflector H(i), as returned by CHETRD.
83*> \endverbatim
84*>
85*> \param[out] WORK
86*> \verbatim
87*> WORK is COMPLEX array, dimension (MAX(1,LWORK))
88*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
89*> \endverbatim
90*>
91*> \param[in] LWORK
92*> \verbatim
93*> LWORK is INTEGER
94*> The dimension of the array WORK. LWORK >= N-1.
95*> For optimum performance LWORK >= (N-1)*NB, where NB is
96*> the optimal blocksize.
97*>
98*> If LWORK = -1, then a workspace query is assumed; the routine
99*> only calculates the optimal size of the WORK array, returns
100*> this value as the first entry of the WORK array, and no error
101*> message related to LWORK is issued by XERBLA.
102*> \endverbatim
103*>
104*> \param[out] INFO
105*> \verbatim
106*> INFO is INTEGER
107*> = 0: successful exit
108*> < 0: if INFO = -i, the i-th argument had an illegal value
109*> \endverbatim
110*
111* Authors:
112* ========
113*
114*> \author Univ. of Tennessee
115*> \author Univ. of California Berkeley
116*> \author Univ. of Colorado Denver
117*> \author NAG Ltd.
118*
119*> \ingroup ungtr
120*
121* =====================================================================
122 SUBROUTINE cungtr( UPLO, N, A, LDA, TAU, WORK, LWORK, INFO )
123*
124* -- LAPACK computational routine --
125* -- LAPACK is a software package provided by Univ. of Tennessee, --
126* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
127*
128* .. Scalar Arguments ..
129 CHARACTER UPLO
130 INTEGER INFO, LDA, LWORK, N
131* ..
132* .. Array Arguments ..
133 COMPLEX A( LDA, * ), TAU( * ), WORK( * )
134* ..
135*
136* =====================================================================
137*
138* .. Parameters ..
139 COMPLEX ZERO, ONE
140 parameter( zero = ( 0.0e+0, 0.0e+0 ),
141 $ one = ( 1.0e+0, 0.0e+0 ) )
142* ..
143* .. Local Scalars ..
144 LOGICAL LQUERY, UPPER
145 INTEGER I, IINFO, J, LWKOPT, NB
146* ..
147* .. External Functions ..
148 LOGICAL LSAME
149 INTEGER ILAENV
150 REAL SROUNDUP_LWORK
151 EXTERNAL ilaenv, lsame, sroundup_lwork
152* ..
153* .. External Subroutines ..
154 EXTERNAL cungql, cungqr, xerbla
155* ..
156* .. Intrinsic Functions ..
157 INTRINSIC max
158* ..
159* .. Executable Statements ..
160*
161* Test the input arguments
162*
163 info = 0
164 lquery = ( lwork.EQ.-1 )
165 upper = lsame( uplo, 'U' )
166 IF( .NOT.upper .AND. .NOT.lsame( uplo, 'L' ) ) THEN
167 info = -1
168 ELSE IF( n.LT.0 ) THEN
169 info = -2
170 ELSE IF( lda.LT.max( 1, n ) ) THEN
171 info = -4
172 ELSE IF( lwork.LT.max( 1, n-1 ) .AND. .NOT.lquery ) THEN
173 info = -7
174 END IF
175*
176 IF( info.EQ.0 ) THEN
177 IF ( upper ) THEN
178 nb = ilaenv( 1, 'CUNGQL', ' ', n-1, n-1, n-1, -1 )
179 ELSE
180 nb = ilaenv( 1, 'CUNGQR', ' ', n-1, n-1, n-1, -1 )
181 END IF
182 lwkopt = max( 1, n-1 )*nb
183 work( 1 ) = sroundup_lwork(lwkopt)
184 END IF
185*
186 IF( info.NE.0 ) THEN
187 CALL xerbla( 'CUNGTR', -info )
188 RETURN
189 ELSE IF( lquery ) THEN
190 RETURN
191 END IF
192*
193* Quick return if possible
194*
195 IF( n.EQ.0 ) THEN
196 work( 1 ) = 1
197 RETURN
198 END IF
199*
200 IF( upper ) THEN
201*
202* Q was determined by a call to CHETRD with UPLO = 'U'
203*
204* Shift the vectors which define the elementary reflectors one
205* column to the left, and set the last row and column of Q to
206* those of the unit matrix
207*
208 DO 20 j = 1, n - 1
209 DO 10 i = 1, j - 1
210 a( i, j ) = a( i, j+1 )
211 10 CONTINUE
212 a( n, j ) = zero
213 20 CONTINUE
214 DO 30 i = 1, n - 1
215 a( i, n ) = zero
216 30 CONTINUE
217 a( n, n ) = one
218*
219* Generate Q(1:n-1,1:n-1)
220*
221 CALL cungql( n-1, n-1, n-1, a, lda, tau, work, lwork, iinfo )
222*
223 ELSE
224*
225* Q was determined by a call to CHETRD with UPLO = 'L'.
226*
227* Shift the vectors which define the elementary reflectors one
228* column to the right, and set the first row and column of Q to
229* those of the unit matrix
230*
231 DO 50 j = n, 2, -1
232 a( 1, j ) = zero
233 DO 40 i = j + 1, n
234 a( i, j ) = a( i, j-1 )
235 40 CONTINUE
236 50 CONTINUE
237 a( 1, 1 ) = one
238 DO 60 i = 2, n
239 a( i, 1 ) = zero
240 60 CONTINUE
241 IF( n.GT.1 ) THEN
242*
243* Generate Q(2:n,2:n)
244*
245 CALL cungqr( n-1, n-1, n-1, a( 2, 2 ), lda, tau, work,
246 $ lwork, iinfo )
247 END IF
248 END IF
249 work( 1 ) = sroundup_lwork(lwkopt)
250 RETURN
251*
252* End of CUNGTR
253*
254 END
subroutine xerbla(srname, info)
Definition cblat2.f:3285
subroutine cungql(m, n, k, a, lda, tau, work, lwork, info)
CUNGQL
Definition cungql.f:128
subroutine cungqr(m, n, k, a, lda, tau, work, lwork, info)
CUNGQR
Definition cungqr.f:128
subroutine cungtr(uplo, n, a, lda, tau, work, lwork, info)
CUNGTR
Definition cungtr.f:123