LAPACK  3.8.0
LAPACK: Linear Algebra PACKage

◆ zungql()

subroutine zungql ( integer  M,
integer  N,
integer  K,
complex*16, dimension( lda, * )  A,
integer  LDA,
complex*16, dimension( * )  TAU,
complex*16, dimension( * )  WORK,
integer  LWORK,
integer  INFO 
)

ZUNGQL

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

Purpose:
 ZUNGQL generates an M-by-N complex matrix Q with orthonormal columns,
 which is defined as the last N columns of a product of K elementary
 reflectors of order M

       Q  =  H(k) . . . H(2) H(1)

 as returned by ZGEQLF.
Parameters
[in]M
          M is INTEGER
          The number of rows of the matrix Q. M >= 0.
[in]N
          N is INTEGER
          The number of columns of the matrix Q. M >= N >= 0.
[in]K
          K is INTEGER
          The number of elementary reflectors whose product defines the
          matrix Q. N >= K >= 0.
[in,out]A
          A is COMPLEX*16 array, dimension (LDA,N)
          On entry, the (n-k+i)-th column must contain the vector which
          defines the elementary reflector H(i), for i = 1,2,...,k, as
          returned by ZGEQLF in the last k columns of its array
          argument A.
          On exit, the M-by-N matrix Q.
[in]LDA
          LDA is INTEGER
          The first dimension of the array A. LDA >= max(1,M).
[in]TAU
          TAU is COMPLEX*16 array, dimension (K)
          TAU(i) must contain the scalar factor of the elementary
          reflector H(i), as returned by ZGEQLF.
[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 >= max(1,N).
          For optimum performance LWORK >= N*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 has an illegal value
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
Date
December 2016

Definition at line 130 of file zungql.f.

130 *
131 * -- LAPACK computational routine (version 3.7.0) --
132 * -- LAPACK is a software package provided by Univ. of Tennessee, --
133 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
134 * December 2016
135 *
136 * .. Scalar Arguments ..
137  INTEGER info, k, lda, lwork, m, n
138 * ..
139 * .. Array Arguments ..
140  COMPLEX*16 a( lda, * ), tau( * ), work( * )
141 * ..
142 *
143 * =====================================================================
144 *
145 * .. Parameters ..
146  COMPLEX*16 zero
147  parameter( zero = ( 0.0d+0, 0.0d+0 ) )
148 * ..
149 * .. Local Scalars ..
150  LOGICAL lquery
151  INTEGER i, ib, iinfo, iws, j, kk, l, ldwork, lwkopt,
152  $ nb, nbmin, nx
153 * ..
154 * .. External Subroutines ..
155  EXTERNAL xerbla, zlarfb, zlarft, zung2l
156 * ..
157 * .. Intrinsic Functions ..
158  INTRINSIC max, min
159 * ..
160 * .. External Functions ..
161  INTEGER ilaenv
162  EXTERNAL ilaenv
163 * ..
164 * .. Executable Statements ..
165 *
166 * Test the input arguments
167 *
168  info = 0
169  lquery = ( lwork.EQ.-1 )
170  IF( m.LT.0 ) THEN
171  info = -1
172  ELSE IF( n.LT.0 .OR. n.GT.m ) THEN
173  info = -2
174  ELSE IF( k.LT.0 .OR. k.GT.n ) THEN
175  info = -3
176  ELSE IF( lda.LT.max( 1, m ) ) THEN
177  info = -5
178  END IF
179 *
180  IF( info.EQ.0 ) THEN
181  IF( n.EQ.0 ) THEN
182  lwkopt = 1
183  ELSE
184  nb = ilaenv( 1, 'ZUNGQL', ' ', m, n, k, -1 )
185  lwkopt = n*nb
186  END IF
187  work( 1 ) = lwkopt
188 *
189  IF( lwork.LT.max( 1, n ) .AND. .NOT.lquery ) THEN
190  info = -8
191  END IF
192  END IF
193 *
194  IF( info.NE.0 ) THEN
195  CALL xerbla( 'ZUNGQL', -info )
196  RETURN
197  ELSE IF( lquery ) THEN
198  RETURN
199  END IF
200 *
201 * Quick return if possible
202 *
203  IF( n.LE.0 ) THEN
204  RETURN
205  END IF
206 *
207  nbmin = 2
208  nx = 0
209  iws = n
210  IF( nb.GT.1 .AND. nb.LT.k ) THEN
211 *
212 * Determine when to cross over from blocked to unblocked code.
213 *
214  nx = max( 0, ilaenv( 3, 'ZUNGQL', ' ', m, n, k, -1 ) )
215  IF( nx.LT.k ) THEN
216 *
217 * Determine if workspace is large enough for blocked code.
218 *
219  ldwork = n
220  iws = ldwork*nb
221  IF( lwork.LT.iws ) THEN
222 *
223 * Not enough workspace to use optimal NB: reduce NB and
224 * determine the minimum value of NB.
225 *
226  nb = lwork / ldwork
227  nbmin = max( 2, ilaenv( 2, 'ZUNGQL', ' ', m, n, k, -1 ) )
228  END IF
229  END IF
230  END IF
231 *
232  IF( nb.GE.nbmin .AND. nb.LT.k .AND. nx.LT.k ) THEN
233 *
234 * Use blocked code after the first block.
235 * The last kk columns are handled by the block method.
236 *
237  kk = min( k, ( ( k-nx+nb-1 ) / nb )*nb )
238 *
239 * Set A(m-kk+1:m,1:n-kk) to zero.
240 *
241  DO 20 j = 1, n - kk
242  DO 10 i = m - kk + 1, m
243  a( i, j ) = zero
244  10 CONTINUE
245  20 CONTINUE
246  ELSE
247  kk = 0
248  END IF
249 *
250 * Use unblocked code for the first or only block.
251 *
252  CALL zung2l( m-kk, n-kk, k-kk, a, lda, tau, work, iinfo )
253 *
254  IF( kk.GT.0 ) THEN
255 *
256 * Use blocked code
257 *
258  DO 50 i = k - kk + 1, k, nb
259  ib = min( nb, k-i+1 )
260  IF( n-k+i.GT.1 ) THEN
261 *
262 * Form the triangular factor of the block reflector
263 * H = H(i+ib-1) . . . H(i+1) H(i)
264 *
265  CALL zlarft( 'Backward', 'Columnwise', m-k+i+ib-1, ib,
266  $ a( 1, n-k+i ), lda, tau( i ), work, ldwork )
267 *
268 * Apply H to A(1:m-k+i+ib-1,1:n-k+i-1) from the left
269 *
270  CALL zlarfb( 'Left', 'No transpose', 'Backward',
271  $ 'Columnwise', m-k+i+ib-1, n-k+i-1, ib,
272  $ a( 1, n-k+i ), lda, work, ldwork, a, lda,
273  $ work( ib+1 ), ldwork )
274  END IF
275 *
276 * Apply H to rows 1:m-k+i+ib-1 of current block
277 *
278  CALL zung2l( m-k+i+ib-1, ib, ib, a( 1, n-k+i ), lda,
279  $ tau( i ), work, iinfo )
280 *
281 * Set rows m-k+i+ib:m of current block to zero
282 *
283  DO 40 j = n - k + i, n - k + i + ib - 1
284  DO 30 l = m - k + i + ib, m
285  a( l, j ) = zero
286  30 CONTINUE
287  40 CONTINUE
288  50 CONTINUE
289  END IF
290 *
291  work( 1 ) = iws
292  RETURN
293 *
294 * End of ZUNGQL
295 *
subroutine zlarft(DIRECT, STOREV, N, K, V, LDV, TAU, T, LDT)
ZLARFT forms the triangular factor T of a block reflector H = I - vtvH
Definition: zlarft.f:165
integer function ilaenv(ISPEC, NAME, OPTS, N1, N2, N3, N4)
ILAENV
Definition: tstiee.f:83
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:62
subroutine zung2l(M, N, K, A, LDA, TAU, WORK, INFO)
ZUNG2L generates all or part of the unitary matrix Q from a QL factorization determined by cgeqlf (un...
Definition: zung2l.f:116
subroutine zlarfb(SIDE, TRANS, DIRECT, STOREV, M, N, K, V, LDV, T, LDT, C, LDC, WORK, LDWORK)
ZLARFB applies a block reflector or its conjugate-transpose to a general rectangular matrix...
Definition: zlarfb.f:197
Here is the call graph for this function:
Here is the caller graph for this function: