LAPACK 3.12.0
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches
zlaqp2rk.f
Go to the documentation of this file.
1*> \brief \b ZLAQP2RK computes truncated QR factorization with column pivoting of a complex matrix block using Level 2 BLAS and overwrites a complex m-by-nrhs matrix B with Q**H * B.
2*
3* =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6* http://www.netlib.org/lapack/explore-html/
7*
8*> \htmlonly
9*> Download ZLAQP2RK + dependencies
10*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zlaqp2rk.f">
11*> [TGZ]</a>
12*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zlaqp2rk.f">
13*> [ZIP]</a>
14*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zlaqp2rk.f">
15*> [TXT]</a>
16*> \endhtmlonly
17*
18* Definition:
19* ===========
20*
21* SUBROUTINE ZLAQP2RK( M, N, NRHS, IOFFSET, KMAX, ABSTOL, RELTOL,
22* $ KP1, MAXC2NRM, A, LDA, K, MAXC2NRMK,
23* $ RELMAXC2NRMK, JPIV, TAU, VN1, VN2, WORK,
24* $ INFO )
25* IMPLICIT NONE
26*
27* .. Scalar Arguments ..
28* INTEGER INFO, IOFFSET, KP1, K, KMAX, LDA, M, N, NRHS
29* DOUBLE PRECISION ABSTOL, MAXC2NRM, MAXC2NRMK, RELMAXC2NRMK,
30* $ RELTOL
31* ..
32* .. Array Arguments ..
33* INTEGER JPIV( * )
34* DOUBLE PRECISION VN1( * ), VN2( * )
35* COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * )
36* $
37* ..
38*
39*
40*> \par Purpose:
41* =============
42*>
43*> \verbatim
44*>
45*> ZLAQP2RK computes a truncated (rank K) or full rank Householder QR
46*> factorization with column pivoting of the complex matrix
47*> block A(IOFFSET+1:M,1:N) as
48*>
49*> A * P(K) = Q(K) * R(K).
50*>
51*> The routine uses Level 2 BLAS. The block A(1:IOFFSET,1:N)
52*> is accordingly pivoted, but not factorized.
53*>
54*> The routine also overwrites the right-hand-sides matrix block B
55*> stored in A(IOFFSET+1:M,N+1:N+NRHS) with Q(K)**H * B.
56*> \endverbatim
57*
58* Arguments:
59* ==========
60*
61*> \param[in] M
62*> \verbatim
63*> M is INTEGER
64*> The number of rows of the matrix A. M >= 0.
65*> \endverbatim
66*>
67*> \param[in] N
68*> \verbatim
69*> N is INTEGER
70*> The number of columns of the matrix A. N >= 0.
71*> \endverbatim
72*>
73*> \param[in] NRHS
74*> \verbatim
75*> NRHS is INTEGER
76*> The number of right hand sides, i.e., the number of
77*> columns of the matrix B. NRHS >= 0.
78*> \endverbatim
79*>
80*> \param[in] IOFFSET
81*> \verbatim
82*> IOFFSET is INTEGER
83*> The number of rows of the matrix A that must be pivoted
84*> but not factorized. IOFFSET >= 0.
85*>
86*> IOFFSET also represents the number of columns of the whole
87*> original matrix A_orig that have been factorized
88*> in the previous steps.
89*> \endverbatim
90*>
91*> \param[in] KMAX
92*> \verbatim
93*> KMAX is INTEGER
94*>
95*> The first factorization stopping criterion. KMAX >= 0.
96*>
97*> The maximum number of columns of the matrix A to factorize,
98*> i.e. the maximum factorization rank.
99*>
100*> a) If KMAX >= min(M-IOFFSET,N), then this stopping
101*> criterion is not used, factorize columns
102*> depending on ABSTOL and RELTOL.
103*>
104*> b) If KMAX = 0, then this stopping criterion is
105*> satisfied on input and the routine exits immediately.
106*> This means that the factorization is not performed,
107*> the matrices A and B and the arrays TAU, IPIV
108*> are not modified.
109*> \endverbatim
110*>
111*> \param[in] ABSTOL
112*> \verbatim
113*> ABSTOL is DOUBLE PRECISION, cannot be NaN.
114*>
115*> The second factorization stopping criterion.
116*>
117*> The absolute tolerance (stopping threshold) for
118*> maximum column 2-norm of the residual matrix.
119*> The algorithm converges (stops the factorization) when
120*> the maximum column 2-norm of the residual matrix
121*> is less than or equal to ABSTOL.
122*>
123*> a) If ABSTOL < 0.0, then this stopping criterion is not
124*> used, the routine factorizes columns depending
125*> on KMAX and RELTOL.
126*> This includes the case ABSTOL = -Inf.
127*>
128*> b) If 0.0 <= ABSTOL then the input value
129*> of ABSTOL is used.
130*> \endverbatim
131*>
132*> \param[in] RELTOL
133*> \verbatim
134*> RELTOL is DOUBLE PRECISION, cannot be NaN.
135*>
136*> The third factorization stopping criterion.
137*>
138*> The tolerance (stopping threshold) for the ratio of the
139*> maximum column 2-norm of the residual matrix to the maximum
140*> column 2-norm of the original matrix A_orig. The algorithm
141*> converges (stops the factorization), when this ratio is
142*> less than or equal to RELTOL.
143*>
144*> a) If RELTOL < 0.0, then this stopping criterion is not
145*> used, the routine factorizes columns depending
146*> on KMAX and ABSTOL.
147*> This includes the case RELTOL = -Inf.
148*>
149*> d) If 0.0 <= RELTOL then the input value of RELTOL
150*> is used.
151*> \endverbatim
152*>
153*> \param[in] KP1
154*> \verbatim
155*> KP1 is INTEGER
156*> The index of the column with the maximum 2-norm in
157*> the whole original matrix A_orig determined in the
158*> main routine ZGEQP3RK. 1 <= KP1 <= N_orig_mat.
159*> \endverbatim
160*>
161*> \param[in] MAXC2NRM
162*> \verbatim
163*> MAXC2NRM is DOUBLE PRECISION
164*> The maximum column 2-norm of the whole original
165*> matrix A_orig computed in the main routine ZGEQP3RK.
166*> MAXC2NRM >= 0.
167*> \endverbatim
168*>
169*> \param[in,out] A
170*> \verbatim
171*> A is COMPLEX*16 array, dimension (LDA,N+NRHS)
172*> On entry:
173*> the M-by-N matrix A and M-by-NRHS matrix B, as in
174*>
175*> N NRHS
176*> array_A = M [ mat_A, mat_B ]
177*>
178*> On exit:
179*> 1. The elements in block A(IOFFSET+1:M,1:K) below
180*> the diagonal together with the array TAU represent
181*> the unitary matrix Q(K) as a product of elementary
182*> reflectors.
183*> 2. The upper triangular block of the matrix A stored
184*> in A(IOFFSET+1:M,1:K) is the triangular factor obtained.
185*> 3. The block of the matrix A stored in A(1:IOFFSET,1:N)
186*> has been accordingly pivoted, but not factorized.
187*> 4. The rest of the array A, block A(IOFFSET+1:M,K+1:N+NRHS).
188*> The left part A(IOFFSET+1:M,K+1:N) of this block
189*> contains the residual of the matrix A, and,
190*> if NRHS > 0, the right part of the block
191*> A(IOFFSET+1:M,N+1:N+NRHS) contains the block of
192*> the right-hand-side matrix B. Both these blocks have been
193*> updated by multiplication from the left by Q(K)**H.
194*> \endverbatim
195*>
196*> \param[in] LDA
197*> \verbatim
198*> LDA is INTEGER
199*> The leading dimension of the array A. LDA >= max(1,M).
200*> \endverbatim
201*>
202*> \param[out] K
203*> \verbatim
204*> K is INTEGER
205*> Factorization rank of the matrix A, i.e. the rank of
206*> the factor R, which is the same as the number of non-zero
207*> rows of the factor R. 0 <= K <= min(M-IOFFSET,KMAX,N).
208*>
209*> K also represents the number of non-zero Householder
210*> vectors.
211*> \endverbatim
212*>
213*> \param[out] MAXC2NRMK
214*> \verbatim
215*> MAXC2NRMK is DOUBLE PRECISION
216*> The maximum column 2-norm of the residual matrix,
217*> when the factorization stopped at rank K. MAXC2NRMK >= 0.
218*> \endverbatim
219*>
220*> \param[out] RELMAXC2NRMK
221*> \verbatim
222*> RELMAXC2NRMK is DOUBLE PRECISION
223*> The ratio MAXC2NRMK / MAXC2NRM of the maximum column
224*> 2-norm of the residual matrix (when the factorization
225*> stopped at rank K) to the maximum column 2-norm of the
226*> whole original matrix A. RELMAXC2NRMK >= 0.
227*> \endverbatim
228*>
229*> \param[out] JPIV
230*> \verbatim
231*> JPIV is INTEGER array, dimension (N)
232*> Column pivot indices, for 1 <= j <= N, column j
233*> of the matrix A was interchanged with column JPIV(j).
234*> \endverbatim
235*>
236*> \param[out] TAU
237*> \verbatim
238*> TAU is COMPLEX*16 array, dimension (min(M-IOFFSET,N))
239*> The scalar factors of the elementary reflectors.
240*> \endverbatim
241*>
242*> \param[in,out] VN1
243*> \verbatim
244*> VN1 is DOUBLE PRECISION array, dimension (N)
245*> The vector with the partial column norms.
246*> \endverbatim
247*>
248*> \param[in,out] VN2
249*> \verbatim
250*> VN2 is DOUBLE PRECISION array, dimension (N)
251*> The vector with the exact column norms.
252*> \endverbatim
253*>
254*> \param[out] WORK
255*> \verbatim
256*> WORK is COMPLEX*16 array, dimension (N-1)
257*> Used in ZLARF subroutine to apply an elementary
258*> reflector from the left.
259*> \endverbatim
260*>
261*> \param[out] INFO
262*> \verbatim
263*> INFO is INTEGER
264*> 1) INFO = 0: successful exit.
265*> 2) If INFO = j_1, where 1 <= j_1 <= N, then NaN was
266*> detected and the routine stops the computation.
267*> The j_1-th column of the matrix A or the j_1-th
268*> element of array TAU contains the first occurrence
269*> of NaN in the factorization step K+1 ( when K columns
270*> have been factorized ).
271*>
272*> On exit:
273*> K is set to the number of
274*> factorized columns without
275*> exception.
276*> MAXC2NRMK is set to NaN.
277*> RELMAXC2NRMK is set to NaN.
278*> TAU(K+1:min(M,N)) is not set and contains undefined
279*> elements. If j_1=K+1, TAU(K+1)
280*> may contain NaN.
281*> 3) If INFO = j_2, where N+1 <= j_2 <= 2*N, then no NaN
282*> was detected, but +Inf (or -Inf) was detected and
283*> the routine continues the computation until completion.
284*> The (j_2-N)-th column of the matrix A contains the first
285*> occurrence of +Inf (or -Inf) in the factorization
286*> step K+1 ( when K columns have been factorized ).
287*> \endverbatim
288*
289* Authors:
290* ========
291*
292*> \author Univ. of Tennessee
293*> \author Univ. of California Berkeley
294*> \author Univ. of Colorado Denver
295*> \author NAG Ltd.
296*
297*> \ingroup laqp2rk
298*
299*> \par References:
300* ================
301*> [1] A Level 3 BLAS QR factorization algorithm with column pivoting developed in 1996.
302*> G. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain.
303*> X. Sun, Computer Science Dept., Duke University, USA.
304*> C. H. Bischof, Math. and Comp. Sci. Div., Argonne National Lab, USA.
305*> A BLAS-3 version of the QR factorization with column pivoting.
306*> LAPACK Working Note 114
307*> \htmlonly
308*> <a href="https://www.netlib.org/lapack/lawnspdf/lawn114.pdf">https://www.netlib.org/lapack/lawnspdf/lawn114.pdf</a>
309*> \endhtmlonly
310*> and in
311*> SIAM J. Sci. Comput., 19(5):1486-1494, Sept. 1998.
312*> \htmlonly
313*> <a href="https://doi.org/10.1137/S1064827595296732">https://doi.org/10.1137/S1064827595296732</a>
314*> \endhtmlonly
315*>
316*> [2] A partial column norm updating strategy developed in 2006.
317*> Z. Drmac and Z. Bujanovic, Dept. of Math., University of Zagreb, Croatia.
318*> On the failure of rank revealing QR factorization software – a case study.
319*> LAPACK Working Note 176.
320*> \htmlonly
321*> <a href="http://www.netlib.org/lapack/lawnspdf/lawn176.pdf">http://www.netlib.org/lapack/lawnspdf/lawn176.pdf</a>
322*> \endhtmlonly
323*> and in
324*> ACM Trans. Math. Softw. 35, 2, Article 12 (July 2008), 28 pages.
325*> \htmlonly
326*> <a href="https://doi.org/10.1145/1377612.1377616">https://doi.org/10.1145/1377612.1377616</a>
327*> \endhtmlonly
328*
329*> \par Contributors:
330* ==================
331*>
332*> \verbatim
333*>
334*> November 2023, Igor Kozachenko, James Demmel,
335*> EECS Department,
336*> University of California, Berkeley, USA.
337*>
338*> \endverbatim
339*
340* =====================================================================
341 SUBROUTINE zlaqp2rk( M, N, NRHS, IOFFSET, KMAX, ABSTOL, RELTOL,
342 $ KP1, MAXC2NRM, A, LDA, K, MAXC2NRMK,
343 $ RELMAXC2NRMK, JPIV, TAU, VN1, VN2, WORK,
344 $ INFO )
345 IMPLICIT NONE
346*
347* -- LAPACK auxiliary routine --
348* -- LAPACK is a software package provided by Univ. of Tennessee, --
349* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
350*
351* .. Scalar Arguments ..
352 INTEGER INFO, IOFFSET, KP1, K, KMAX, LDA, M, N, NRHS
353 DOUBLE PRECISION ABSTOL, MAXC2NRM, MAXC2NRMK, RELMAXC2NRMK,
354 $ RELTOL
355* ..
356* .. Array Arguments ..
357 INTEGER JPIV( * )
358 DOUBLE PRECISION VN1( * ), VN2( * )
359 COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * )
360* ..
361*
362* =====================================================================
363*
364* .. Parameters ..
365 DOUBLE PRECISION ZERO, ONE
366 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
367 COMPLEX*16 CZERO, CONE
368 parameter( czero = ( 0.0d+0, 0.0d+0 ),
369 $ cone = ( 1.0d+0, 0.0d+0 ) )
370* ..
371* .. Local Scalars ..
372 INTEGER I, ITEMP, J, JMAXC2NRM, KK, KP, MINMNFACT,
373 $ MINMNUPDT
374 DOUBLE PRECISION HUGEVAL, TAUNAN, TEMP, TEMP2, TOL3Z
375 COMPLEX*16 AIKK
376* ..
377* .. External Subroutines ..
378 EXTERNAL zlarf, zlarfg, zswap
379* ..
380* .. Intrinsic Functions ..
381 INTRINSIC abs, dble, dconjg, dimag, max, min, sqrt
382* ..
383* .. External Functions ..
384 LOGICAL DISNAN
385 INTEGER IDAMAX
386 DOUBLE PRECISION DLAMCH, DZNRM2
387 EXTERNAL disnan, dlamch, idamax, dznrm2
388* ..
389* .. Executable Statements ..
390*
391* Initialize INFO
392*
393 info = 0
394*
395* MINMNFACT in the smallest dimension of the submatrix
396* A(IOFFSET+1:M,1:N) to be factorized.
397*
398* MINMNUPDT is the smallest dimension
399* of the subarray A(IOFFSET+1:M,1:N+NRHS) to be udated, which
400* contains the submatrices A(IOFFSET+1:M,1:N) and
401* B(IOFFSET+1:M,1:NRHS) as column blocks.
402*
403 minmnfact = min( m-ioffset, n )
404 minmnupdt = min( m-ioffset, n+nrhs )
405 kmax = min( kmax, minmnfact )
406 tol3z = sqrt( dlamch( 'Epsilon' ) )
407 hugeval = dlamch( 'Overflow' )
408*
409* Compute the factorization, KK is the lomn loop index.
410*
411 DO kk = 1, kmax
412*
413 i = ioffset + kk
414*
415 IF( i.EQ.1 ) THEN
416*
417* ============================================================
418*
419* We are at the first column of the original whole matrix A,
420* therefore we use the computed KP1 and MAXC2NRM from the
421* main routine.
422*
423 kp = kp1
424*
425* ============================================================
426*
427 ELSE
428*
429* ============================================================
430*
431* Determine the pivot column in KK-th step, i.e. the index
432* of the column with the maximum 2-norm in the
433* submatrix A(I:M,K:N).
434*
435 kp = ( kk-1 ) + idamax( n-kk+1, vn1( kk ), 1 )
436*
437* Determine the maximum column 2-norm and the relative maximum
438* column 2-norm of the submatrix A(I:M,KK:N) in step KK.
439* RELMAXC2NRMK will be computed later, after somecondition
440* checks on MAXC2NRMK.
441*
442 maxc2nrmk = vn1( kp )
443*
444* ============================================================
445*
446* Check if the submatrix A(I:M,KK:N) contains NaN, and set
447* INFO parameter to the column number, where the first NaN
448* is found and return from the routine.
449* We need to check the condition only if the
450* column index (same as row index) of the original whole
451* matrix is larger than 1, since the condition for whole
452* original matrix is checked in the main routine.
453*
454 IF( disnan( maxc2nrmk ) ) THEN
455*
456* Set K, the number of factorized columns.
457* that are not zero.
458*
459 k = kk - 1
460 info = k + kp
461*
462* Set RELMAXC2NRMK to NaN.
463*
464 relmaxc2nrmk = maxc2nrmk
465*
466* Array TAU(K+1:MINMNFACT) is not set and contains
467* undefined elements.
468*
469 RETURN
470 END IF
471*
472* ============================================================
473*
474* Quick return, if the submatrix A(I:M,KK:N) is
475* a zero matrix.
476* We need to check the condition only if the
477* column index (same as row index) of the original whole
478* matrix is larger than 1, since the condition for whole
479* original matrix is checked in the main routine.
480*
481 IF( maxc2nrmk.EQ.zero ) THEN
482*
483* Set K, the number of factorized columns.
484* that are not zero.
485*
486 k = kk - 1
487 relmaxc2nrmk = zero
488*
489* Set TAUs corresponding to the columns that were not
490* factorized to ZERO, i.e. set TAU(KK:MINMNFACT) to CZERO.
491*
492 DO j = kk, minmnfact
493 tau( j ) = czero
494 END DO
495*
496* Return from the routine.
497*
498 RETURN
499*
500 END IF
501*
502* ============================================================
503*
504* Check if the submatrix A(I:M,KK:N) contains Inf,
505* set INFO parameter to the column number, where
506* the first Inf is found plus N, and continue
507* the computation.
508* We need to check the condition only if the
509* column index (same as row index) of the original whole
510* matrix is larger than 1, since the condition for whole
511* original matrix is checked in the main routine.
512*
513 IF( info.EQ.0 .AND. maxc2nrmk.GT.hugeval ) THEN
514 info = n + kk - 1 + kp
515 END IF
516*
517* ============================================================
518*
519* Test for the second and third stopping criteria.
520* NOTE: There is no need to test for ABSTOL >= ZERO, since
521* MAXC2NRMK is non-negative. Similarly, there is no need
522* to test for RELTOL >= ZERO, since RELMAXC2NRMK is
523* non-negative.
524* We need to check the condition only if the
525* column index (same as row index) of the original whole
526* matrix is larger than 1, since the condition for whole
527* original matrix is checked in the main routine.
528
529 relmaxc2nrmk = maxc2nrmk / maxc2nrm
530*
531 IF( maxc2nrmk.LE.abstol .OR. relmaxc2nrmk.LE.reltol ) THEN
532*
533* Set K, the number of factorized columns.
534*
535 k = kk - 1
536*
537* Set TAUs corresponding to the columns that were not
538* factorized to ZERO, i.e. set TAU(KK:MINMNFACT) to CZERO.
539*
540 DO j = kk, minmnfact
541 tau( j ) = czero
542 END DO
543*
544* Return from the routine.
545*
546 RETURN
547*
548 END IF
549*
550* ============================================================
551*
552* End ELSE of IF(I.EQ.1)
553*
554 END IF
555*
556* ===============================================================
557*
558* If the pivot column is not the first column of the
559* subblock A(1:M,KK:N):
560* 1) swap the KK-th column and the KP-th pivot column
561* in A(1:M,1:N);
562* 2) copy the KK-th element into the KP-th element of the partial
563* and exact 2-norm vectors VN1 and VN2. ( Swap is not needed
564* for VN1 and VN2 since we use the element with the index
565* larger than KK in the next loop step.)
566* 3) Save the pivot interchange with the indices relative to the
567* the original matrix A, not the block A(1:M,1:N).
568*
569 IF( kp.NE.kk ) THEN
570 CALL zswap( m, a( 1, kp ), 1, a( 1, kk ), 1 )
571 vn1( kp ) = vn1( kk )
572 vn2( kp ) = vn2( kk )
573 itemp = jpiv( kp )
574 jpiv( kp ) = jpiv( kk )
575 jpiv( kk ) = itemp
576 END IF
577*
578* Generate elementary reflector H(KK) using the column A(I:M,KK),
579* if the column has more than one element, otherwise
580* the elementary reflector would be an identity matrix,
581* and TAU(KK) = CZERO.
582*
583 IF( i.LT.m ) THEN
584 CALL zlarfg( m-i+1, a( i, kk ), a( i+1, kk ), 1,
585 $ tau( kk ) )
586 ELSE
587 tau( kk ) = czero
588 END IF
589*
590* Check if TAU(KK) contains NaN, set INFO parameter
591* to the column number where NaN is found and return from
592* the routine.
593* NOTE: There is no need to check TAU(KK) for Inf,
594* since ZLARFG cannot produce TAU(KK) or Householder vector
595* below the diagonal containing Inf. Only BETA on the diagonal,
596* returned by ZLARFG can contain Inf, which requires
597* TAU(KK) to contain NaN. Therefore, this case of generating Inf
598* by ZLARFG is covered by checking TAU(KK) for NaN.
599*
600 IF( disnan( dble( tau(kk) ) ) ) THEN
601 taunan = dble( tau(kk) )
602 ELSE IF( disnan( dimag( tau(kk) ) ) ) THEN
603 taunan = dimag( tau(kk) )
604 ELSE
605 taunan = zero
606 END IF
607*
608 IF( disnan( taunan ) ) THEN
609 k = kk - 1
610 info = kk
611*
612* Set MAXC2NRMK and RELMAXC2NRMK to NaN.
613*
614 maxc2nrmk = taunan
615 relmaxc2nrmk = taunan
616*
617* Array TAU(KK:MINMNFACT) is not set and contains
618* undefined elements, except the first element TAU(KK) = NaN.
619*
620 RETURN
621 END IF
622*
623* Apply H(KK)**H to A(I:M,KK+1:N+NRHS) from the left.
624* ( If M >= N, then at KK = N there is no residual matrix,
625* i.e. no columns of A to update, only columns of B.
626* If M < N, then at KK = M-IOFFSET, I = M and we have a
627* one-row residual matrix in A and the elementary
628* reflector is a unit matrix, TAU(KK) = CZERO, i.e. no update
629* is needed for the residual matrix in A and the
630* right-hand-side-matrix in B.
631* Therefore, we update only if
632* KK < MINMNUPDT = min(M-IOFFSET, N+NRHS)
633* condition is satisfied, not only KK < N+NRHS )
634*
635 IF( kk.LT.minmnupdt ) THEN
636 aikk = a( i, kk )
637 a( i, kk ) = cone
638 CALL zlarf( 'Left', m-i+1, n+nrhs-kk, a( i, kk ), 1,
639 $ dconjg( tau( kk ) ), a( i, kk+1 ), lda,
640 $ work( 1 ) )
641 a( i, kk ) = aikk
642 END IF
643*
644 IF( kk.LT.minmnfact ) THEN
645*
646* Update the partial column 2-norms for the residual matrix,
647* only if the residual matrix A(I+1:M,KK+1:N) exists, i.e.
648* when KK < min(M-IOFFSET, N).
649*
650 DO j = kk + 1, n
651 IF( vn1( j ).NE.zero ) THEN
652*
653* NOTE: The following lines follow from the analysis in
654* Lapack Working Note 176.
655*
656 temp = one - ( abs( a( i, j ) ) / vn1( j ) )**2
657 temp = max( temp, zero )
658 temp2 = temp*( vn1( j ) / vn2( j ) )**2
659 IF( temp2 .LE. tol3z ) THEN
660*
661* Compute the column 2-norm for the partial
662* column A(I+1:M,J) by explicitly computing it,
663* and store it in both partial 2-norm vector VN1
664* and exact column 2-norm vector VN2.
665*
666 vn1( j ) = dznrm2( m-i, a( i+1, j ), 1 )
667 vn2( j ) = vn1( j )
668*
669 ELSE
670*
671* Update the column 2-norm for the partial
672* column A(I+1:M,J) by removing one
673* element A(I,J) and store it in partial
674* 2-norm vector VN1.
675*
676 vn1( j ) = vn1( j )*sqrt( temp )
677*
678 END IF
679 END IF
680 END DO
681*
682 END IF
683*
684* End factorization loop
685*
686 END DO
687*
688* If we reached this point, all colunms have been factorized,
689* i.e. no condition was triggered to exit the routine.
690* Set the number of factorized columns.
691*
692 k = kmax
693*
694* We reached the end of the loop, i.e. all KMAX columns were
695* factorized, we need to set MAXC2NRMK and RELMAXC2NRMK before
696* we return.
697*
698 IF( k.LT.minmnfact ) THEN
699*
700 jmaxc2nrm = k + idamax( n-k, vn1( k+1 ), 1 )
701 maxc2nrmk = vn1( jmaxc2nrm )
702*
703 IF( k.EQ.0 ) THEN
704 relmaxc2nrmk = one
705 ELSE
706 relmaxc2nrmk = maxc2nrmk / maxc2nrm
707 END IF
708*
709 ELSE
710 maxc2nrmk = zero
711 relmaxc2nrmk = zero
712 END IF
713*
714* We reached the end of the loop, i.e. all KMAX columns were
715* factorized, set TAUs corresponding to the columns that were
716* not factorized to ZERO, i.e. TAU(K+1:MINMNFACT) set to CZERO.
717*
718 DO j = k + 1, minmnfact
719 tau( j ) = czero
720 END DO
721*
722 RETURN
723*
724* End of ZLAQP2RK
725*
726 END
subroutine zlarf(side, m, n, v, incv, tau, c, ldc, work)
ZLARF applies an elementary reflector to a general rectangular matrix.
Definition zlarf.f:128
subroutine zlarfg(n, alpha, x, incx, tau)
ZLARFG generates an elementary reflector (Householder matrix).
Definition zlarfg.f:106
subroutine zswap(n, zx, incx, zy, incy)
ZSWAP
Definition zswap.f:81
subroutine zlaqp2rk(m, n, nrhs, ioffset, kmax, abstol, reltol, kp1, maxc2nrm, a, lda, k, maxc2nrmk, relmaxc2nrmk, jpiv, tau, vn1, vn2, work, info)
ZLAQP2RK computes truncated QR factorization with column pivoting of a complex matrix block using Lev...
Definition zlaqp2rk.f:345