LAPACK  3.4.2
LAPACK: Linear Algebra PACKage
 All Files Functions Groups
zgeqp3.f
Go to the documentation of this file.
1 *> \brief \b ZGEQP3
2 *
3 * =========== DOCUMENTATION ===========
4 *
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
7 *
8 *> \htmlonly
9 *> Download ZGEQP3 + dependencies
10 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zgeqp3.f">
11 *> [TGZ]</a>
12 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zgeqp3.f">
13 *> [ZIP]</a>
14 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zgeqp3.f">
15 *> [TXT]</a>
16 *> \endhtmlonly
17 *
18 * Definition:
19 * ===========
20 *
21 * SUBROUTINE ZGEQP3( M, N, A, LDA, JPVT, TAU, WORK, LWORK, RWORK,
22 * INFO )
23 *
24 * .. Scalar Arguments ..
25 * INTEGER INFO, LDA, LWORK, M, N
26 * ..
27 * .. Array Arguments ..
28 * INTEGER JPVT( * )
29 * DOUBLE PRECISION RWORK( * )
30 * COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * )
31 * ..
32 *
33 *
34 *> \par Purpose:
35 * =============
36 *>
37 *> \verbatim
38 *>
39 *> ZGEQP3 computes a QR factorization with column pivoting of a
40 *> matrix A: A*P = Q*R using Level 3 BLAS.
41 *> \endverbatim
42 *
43 * Arguments:
44 * ==========
45 *
46 *> \param[in] M
47 *> \verbatim
48 *> M is INTEGER
49 *> The number of rows of the matrix A. M >= 0.
50 *> \endverbatim
51 *>
52 *> \param[in] N
53 *> \verbatim
54 *> N is INTEGER
55 *> The number of columns of the matrix A. N >= 0.
56 *> \endverbatim
57 *>
58 *> \param[in,out] A
59 *> \verbatim
60 *> A is COMPLEX*16 array, dimension (LDA,N)
61 *> On entry, the M-by-N matrix A.
62 *> On exit, the upper triangle of the array contains the
63 *> min(M,N)-by-N upper trapezoidal matrix R; the elements below
64 *> the diagonal, together with the array TAU, represent the
65 *> unitary matrix Q as a product of min(M,N) elementary
66 *> reflectors.
67 *> \endverbatim
68 *>
69 *> \param[in] LDA
70 *> \verbatim
71 *> LDA is INTEGER
72 *> The leading dimension of the array A. LDA >= max(1,M).
73 *> \endverbatim
74 *>
75 *> \param[in,out] JPVT
76 *> \verbatim
77 *> JPVT is INTEGER array, dimension (N)
78 *> On entry, if JPVT(J).ne.0, the J-th column of A is permuted
79 *> to the front of A*P (a leading column); if JPVT(J)=0,
80 *> the J-th column of A is a free column.
81 *> On exit, if JPVT(J)=K, then the J-th column of A*P was the
82 *> the K-th column of A.
83 *> \endverbatim
84 *>
85 *> \param[out] TAU
86 *> \verbatim
87 *> TAU is COMPLEX*16 array, dimension (min(M,N))
88 *> The scalar factors of the elementary reflectors.
89 *> \endverbatim
90 *>
91 *> \param[out] WORK
92 *> \verbatim
93 *> WORK is COMPLEX*16 array, dimension (MAX(1,LWORK))
94 *> On exit, if INFO=0, WORK(1) returns the optimal LWORK.
95 *> \endverbatim
96 *>
97 *> \param[in] LWORK
98 *> \verbatim
99 *> LWORK is INTEGER
100 *> The dimension of the array WORK. LWORK >= N+1.
101 *> For optimal performance LWORK >= ( N+1 )*NB, where NB
102 *> is the optimal blocksize.
103 *>
104 *> If LWORK = -1, then a workspace query is assumed; the routine
105 *> only calculates the optimal size of the WORK array, returns
106 *> this value as the first entry of the WORK array, and no error
107 *> message related to LWORK is issued by XERBLA.
108 *> \endverbatim
109 *>
110 *> \param[out] RWORK
111 *> \verbatim
112 *> RWORK is DOUBLE PRECISION array, dimension (2*N)
113 *> \endverbatim
114 *>
115 *> \param[out] INFO
116 *> \verbatim
117 *> INFO is INTEGER
118 *> = 0: successful exit.
119 *> < 0: if INFO = -i, the i-th argument had an illegal value.
120 *> \endverbatim
121 *
122 * Authors:
123 * ========
124 *
125 *> \author Univ. of Tennessee
126 *> \author Univ. of California Berkeley
127 *> \author Univ. of Colorado Denver
128 *> \author NAG Ltd.
129 *
130 *> \date September 2012
131 *
132 *> \ingroup complex16GEcomputational
133 *
134 *> \par Further Details:
135 * =====================
136 *>
137 *> \verbatim
138 *>
139 *> The matrix Q is represented as a product of elementary reflectors
140 *>
141 *> Q = H(1) H(2) . . . H(k), where k = min(m,n).
142 *>
143 *> Each H(i) has the form
144 *>
145 *> H(i) = I - tau * v * v**H
146 *>
147 *> where tau is a complex scalar, and v is a real/complex vector
148 *> with v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in
149 *> A(i+1:m,i), and tau in TAU(i).
150 *> \endverbatim
151 *
152 *> \par Contributors:
153 * ==================
154 *>
155 *> G. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain
156 *> X. Sun, Computer Science Dept., Duke University, USA
157 *>
158 * =====================================================================
159  SUBROUTINE zgeqp3( M, N, A, LDA, JPVT, TAU, WORK, LWORK, RWORK,
160  $ info )
161 *
162 * -- LAPACK computational routine (version 3.4.2) --
163 * -- LAPACK is a software package provided by Univ. of Tennessee, --
164 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
165 * September 2012
166 *
167 * .. Scalar Arguments ..
168  INTEGER info, lda, lwork, m, n
169 * ..
170 * .. Array Arguments ..
171  INTEGER jpvt( * )
172  DOUBLE PRECISION rwork( * )
173  COMPLEX*16 a( lda, * ), tau( * ), work( * )
174 * ..
175 *
176 * =====================================================================
177 *
178 * .. Parameters ..
179  INTEGER inb, inbmin, ixover
180  parameter( inb = 1, inbmin = 2, ixover = 3 )
181 * ..
182 * .. Local Scalars ..
183  LOGICAL lquery
184  INTEGER fjb, iws, j, jb, lwkopt, minmn, minws, na, nb,
185  $ nbmin, nfxd, nx, sm, sminmn, sn, topbmn
186 * ..
187 * .. External Subroutines ..
188  EXTERNAL xerbla, zgeqrf, zlaqp2, zlaqps, zswap, zunmqr
189 * ..
190 * .. External Functions ..
191  INTEGER ilaenv
192  DOUBLE PRECISION dznrm2
193  EXTERNAL ilaenv, dznrm2
194 * ..
195 * .. Intrinsic Functions ..
196  INTRINSIC int, max, min
197 * ..
198 * .. Executable Statements ..
199 *
200 * Test input arguments
201 * ====================
202 *
203  info = 0
204  lquery = ( lwork.EQ.-1 )
205  IF( m.LT.0 ) THEN
206  info = -1
207  ELSE IF( n.LT.0 ) THEN
208  info = -2
209  ELSE IF( lda.LT.max( 1, m ) ) THEN
210  info = -4
211  END IF
212 *
213  IF( info.EQ.0 ) THEN
214  minmn = min( m, n )
215  IF( minmn.EQ.0 ) THEN
216  iws = 1
217  lwkopt = 1
218  ELSE
219  iws = n + 1
220  nb = ilaenv( inb, 'ZGEQRF', ' ', m, n, -1, -1 )
221  lwkopt = ( n + 1 )*nb
222  END IF
223  work( 1 ) = lwkopt
224 *
225  IF( ( lwork.LT.iws ) .AND. .NOT.lquery ) THEN
226  info = -8
227  END IF
228  END IF
229 *
230  IF( info.NE.0 ) THEN
231  CALL xerbla( 'ZGEQP3', -info )
232  return
233  ELSE IF( lquery ) THEN
234  return
235  END IF
236 *
237 * Quick return if possible.
238 *
239  IF( minmn.EQ.0 ) THEN
240  return
241  END IF
242 *
243 * Move initial columns up front.
244 *
245  nfxd = 1
246  DO 10 j = 1, n
247  IF( jpvt( j ).NE.0 ) THEN
248  IF( j.NE.nfxd ) THEN
249  CALL zswap( m, a( 1, j ), 1, a( 1, nfxd ), 1 )
250  jpvt( j ) = jpvt( nfxd )
251  jpvt( nfxd ) = j
252  ELSE
253  jpvt( j ) = j
254  END IF
255  nfxd = nfxd + 1
256  ELSE
257  jpvt( j ) = j
258  END IF
259  10 continue
260  nfxd = nfxd - 1
261 *
262 * Factorize fixed columns
263 * =======================
264 *
265 * Compute the QR factorization of fixed columns and update
266 * remaining columns.
267 *
268  IF( nfxd.GT.0 ) THEN
269  na = min( m, nfxd )
270 *CC CALL ZGEQR2( M, NA, A, LDA, TAU, WORK, INFO )
271  CALL zgeqrf( m, na, a, lda, tau, work, lwork, info )
272  iws = max( iws, int( work( 1 ) ) )
273  IF( na.LT.n ) THEN
274 *CC CALL ZUNM2R( 'Left', 'Conjugate Transpose', M, N-NA,
275 *CC $ NA, A, LDA, TAU, A( 1, NA+1 ), LDA, WORK,
276 *CC $ INFO )
277  CALL zunmqr( 'Left', 'Conjugate Transpose', m, n-na, na, a,
278  $ lda, tau, a( 1, na+1 ), lda, work, lwork,
279  $ info )
280  iws = max( iws, int( work( 1 ) ) )
281  END IF
282  END IF
283 *
284 * Factorize free columns
285 * ======================
286 *
287  IF( nfxd.LT.minmn ) THEN
288 *
289  sm = m - nfxd
290  sn = n - nfxd
291  sminmn = minmn - nfxd
292 *
293 * Determine the block size.
294 *
295  nb = ilaenv( inb, 'ZGEQRF', ' ', sm, sn, -1, -1 )
296  nbmin = 2
297  nx = 0
298 *
299  IF( ( nb.GT.1 ) .AND. ( nb.LT.sminmn ) ) THEN
300 *
301 * Determine when to cross over from blocked to unblocked code.
302 *
303  nx = max( 0, ilaenv( ixover, 'ZGEQRF', ' ', sm, sn, -1,
304  $ -1 ) )
305 *
306 *
307  IF( nx.LT.sminmn ) THEN
308 *
309 * Determine if workspace is large enough for blocked code.
310 *
311  minws = ( sn+1 )*nb
312  iws = max( iws, minws )
313  IF( lwork.LT.minws ) THEN
314 *
315 * Not enough workspace to use optimal NB: Reduce NB and
316 * determine the minimum value of NB.
317 *
318  nb = lwork / ( sn+1 )
319  nbmin = max( 2, ilaenv( inbmin, 'ZGEQRF', ' ', sm, sn,
320  $ -1, -1 ) )
321 *
322 *
323  END IF
324  END IF
325  END IF
326 *
327 * Initialize partial column norms. The first N elements of work
328 * store the exact column norms.
329 *
330  DO 20 j = nfxd + 1, n
331  rwork( j ) = dznrm2( sm, a( nfxd+1, j ), 1 )
332  rwork( n+j ) = rwork( j )
333  20 continue
334 *
335  IF( ( nb.GE.nbmin ) .AND. ( nb.LT.sminmn ) .AND.
336  $ ( nx.LT.sminmn ) ) THEN
337 *
338 * Use blocked code initially.
339 *
340  j = nfxd + 1
341 *
342 * Compute factorization: while loop.
343 *
344 *
345  topbmn = minmn - nx
346  30 continue
347  IF( j.LE.topbmn ) THEN
348  jb = min( nb, topbmn-j+1 )
349 *
350 * Factorize JB columns among columns J:N.
351 *
352  CALL zlaqps( m, n-j+1, j-1, jb, fjb, a( 1, j ), lda,
353  $ jpvt( j ), tau( j ), rwork( j ),
354  $ rwork( n+j ), work( 1 ), work( jb+1 ),
355  $ n-j+1 )
356 *
357  j = j + fjb
358  go to 30
359  END IF
360  ELSE
361  j = nfxd + 1
362  END IF
363 *
364 * Use unblocked code to factor the last or only block.
365 *
366 *
367  IF( j.LE.minmn )
368  $ CALL zlaqp2( m, n-j+1, j-1, a( 1, j ), lda, jpvt( j ),
369  $ tau( j ), rwork( j ), rwork( n+j ), work( 1 ) )
370 *
371  END IF
372 *
373  work( 1 ) = iws
374  return
375 *
376 * End of ZGEQP3
377 *
378  END