root / src / lapack / double / dlaqp2.f @ 2
Historique | Voir | Annoter | Télécharger (5,52 ko)
1 | 1 | equemene | SUBROUTINE DLAQP2( M, N, OFFSET, A, LDA, JPVT, TAU, VN1, VN2, |
---|---|---|---|
2 | 1 | equemene | $ WORK ) |
3 | 1 | equemene | * |
4 | 1 | equemene | * -- LAPACK auxiliary routine (version 3.2.2) -- |
5 | 1 | equemene | * -- LAPACK is a software package provided by Univ. of Tennessee, -- |
6 | 1 | equemene | * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
7 | 1 | equemene | * June 2010 |
8 | 1 | equemene | * |
9 | 1 | equemene | * .. Scalar Arguments .. |
10 | 1 | equemene | INTEGER LDA, M, N, OFFSET |
11 | 1 | equemene | * .. |
12 | 1 | equemene | * .. Array Arguments .. |
13 | 1 | equemene | INTEGER JPVT( * ) |
14 | 1 | equemene | DOUBLE PRECISION A( LDA, * ), TAU( * ), VN1( * ), VN2( * ), |
15 | 1 | equemene | $ WORK( * ) |
16 | 1 | equemene | * .. |
17 | 1 | equemene | * |
18 | 1 | equemene | * Purpose |
19 | 1 | equemene | * ======= |
20 | 1 | equemene | * |
21 | 1 | equemene | * DLAQP2 computes a QR factorization with column pivoting of |
22 | 1 | equemene | * the block A(OFFSET+1:M,1:N). |
23 | 1 | equemene | * The block A(1:OFFSET,1:N) is accordingly pivoted, but not factorized. |
24 | 1 | equemene | * |
25 | 1 | equemene | * Arguments |
26 | 1 | equemene | * ========= |
27 | 1 | equemene | * |
28 | 1 | equemene | * M (input) INTEGER |
29 | 1 | equemene | * The number of rows of the matrix A. M >= 0. |
30 | 1 | equemene | * |
31 | 1 | equemene | * N (input) INTEGER |
32 | 1 | equemene | * The number of columns of the matrix A. N >= 0. |
33 | 1 | equemene | * |
34 | 1 | equemene | * OFFSET (input) INTEGER |
35 | 1 | equemene | * The number of rows of the matrix A that must be pivoted |
36 | 1 | equemene | * but no factorized. OFFSET >= 0. |
37 | 1 | equemene | * |
38 | 1 | equemene | * A (input/output) DOUBLE PRECISION array, dimension (LDA,N) |
39 | 1 | equemene | * On entry, the M-by-N matrix A. |
40 | 1 | equemene | * On exit, the upper triangle of block A(OFFSET+1:M,1:N) is |
41 | 1 | equemene | * the triangular factor obtained; the elements in block |
42 | 1 | equemene | * A(OFFSET+1:M,1:N) below the diagonal, together with the |
43 | 1 | equemene | * array TAU, represent the orthogonal matrix Q as a product of |
44 | 1 | equemene | * elementary reflectors. Block A(1:OFFSET,1:N) has been |
45 | 1 | equemene | * accordingly pivoted, but no factorized. |
46 | 1 | equemene | * |
47 | 1 | equemene | * LDA (input) INTEGER |
48 | 1 | equemene | * The leading dimension of the array A. LDA >= max(1,M). |
49 | 1 | equemene | * |
50 | 1 | equemene | * JPVT (input/output) INTEGER array, dimension (N) |
51 | 1 | equemene | * On entry, if JPVT(i) .ne. 0, the i-th column of A is permuted |
52 | 1 | equemene | * to the front of A*P (a leading column); if JPVT(i) = 0, |
53 | 1 | equemene | * the i-th column of A is a free column. |
54 | 1 | equemene | * On exit, if JPVT(i) = k, then the i-th column of A*P |
55 | 1 | equemene | * was the k-th column of A. |
56 | 1 | equemene | * |
57 | 1 | equemene | * TAU (output) DOUBLE PRECISION array, dimension (min(M,N)) |
58 | 1 | equemene | * The scalar factors of the elementary reflectors. |
59 | 1 | equemene | * |
60 | 1 | equemene | * VN1 (input/output) DOUBLE PRECISION array, dimension (N) |
61 | 1 | equemene | * The vector with the partial column norms. |
62 | 1 | equemene | * |
63 | 1 | equemene | * VN2 (input/output) DOUBLE PRECISION array, dimension (N) |
64 | 1 | equemene | * The vector with the exact column norms. |
65 | 1 | equemene | * |
66 | 1 | equemene | * WORK (workspace) DOUBLE PRECISION array, dimension (N) |
67 | 1 | equemene | * |
68 | 1 | equemene | * Further Details |
69 | 1 | equemene | * =============== |
70 | 1 | equemene | * |
71 | 1 | equemene | * Based on contributions by |
72 | 1 | equemene | * G. Quintana-Orti, Depto. de Informatica, Universidad Jaime I, Spain |
73 | 1 | equemene | * X. Sun, Computer Science Dept., Duke University, USA |
74 | 1 | equemene | * |
75 | 1 | equemene | * Partial column norm updating strategy modified by |
76 | 1 | equemene | * Z. Drmac and Z. Bujanovic, Dept. of Mathematics, |
77 | 1 | equemene | * University of Zagreb, Croatia. |
78 | 1 | equemene | * June 2010 |
79 | 1 | equemene | * For more details see LAPACK Working Note 176. |
80 | 1 | equemene | * ===================================================================== |
81 | 1 | equemene | * |
82 | 1 | equemene | * .. Parameters .. |
83 | 1 | equemene | DOUBLE PRECISION ZERO, ONE |
84 | 1 | equemene | PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 ) |
85 | 1 | equemene | * .. |
86 | 1 | equemene | * .. Local Scalars .. |
87 | 1 | equemene | INTEGER I, ITEMP, J, MN, OFFPI, PVT |
88 | 1 | equemene | DOUBLE PRECISION AII, TEMP, TEMP2, TOL3Z |
89 | 1 | equemene | * .. |
90 | 1 | equemene | * .. External Subroutines .. |
91 | 1 | equemene | EXTERNAL DLARF, DLARFG, DSWAP |
92 | 1 | equemene | * .. |
93 | 1 | equemene | * .. Intrinsic Functions .. |
94 | 1 | equemene | INTRINSIC ABS, MAX, MIN, SQRT |
95 | 1 | equemene | * .. |
96 | 1 | equemene | * .. External Functions .. |
97 | 1 | equemene | INTEGER IDAMAX |
98 | 1 | equemene | DOUBLE PRECISION DLAMCH, DNRM2 |
99 | 1 | equemene | EXTERNAL IDAMAX, DLAMCH, DNRM2 |
100 | 1 | equemene | * .. |
101 | 1 | equemene | * .. Executable Statements .. |
102 | 1 | equemene | * |
103 | 1 | equemene | MN = MIN( M-OFFSET, N ) |
104 | 1 | equemene | TOL3Z = SQRT(DLAMCH('Epsilon')) |
105 | 1 | equemene | * |
106 | 1 | equemene | * Compute factorization. |
107 | 1 | equemene | * |
108 | 1 | equemene | DO 20 I = 1, MN |
109 | 1 | equemene | * |
110 | 1 | equemene | OFFPI = OFFSET + I |
111 | 1 | equemene | * |
112 | 1 | equemene | * Determine ith pivot column and swap if necessary. |
113 | 1 | equemene | * |
114 | 1 | equemene | PVT = ( I-1 ) + IDAMAX( N-I+1, VN1( I ), 1 ) |
115 | 1 | equemene | * |
116 | 1 | equemene | IF( PVT.NE.I ) THEN |
117 | 1 | equemene | CALL DSWAP( M, A( 1, PVT ), 1, A( 1, I ), 1 ) |
118 | 1 | equemene | ITEMP = JPVT( PVT ) |
119 | 1 | equemene | JPVT( PVT ) = JPVT( I ) |
120 | 1 | equemene | JPVT( I ) = ITEMP |
121 | 1 | equemene | VN1( PVT ) = VN1( I ) |
122 | 1 | equemene | VN2( PVT ) = VN2( I ) |
123 | 1 | equemene | END IF |
124 | 1 | equemene | * |
125 | 1 | equemene | * Generate elementary reflector H(i). |
126 | 1 | equemene | * |
127 | 1 | equemene | IF( OFFPI.LT.M ) THEN |
128 | 1 | equemene | CALL DLARFG( M-OFFPI+1, A( OFFPI, I ), A( OFFPI+1, I ), 1, |
129 | 1 | equemene | $ TAU( I ) ) |
130 | 1 | equemene | ELSE |
131 | 1 | equemene | CALL DLARFG( 1, A( M, I ), A( M, I ), 1, TAU( I ) ) |
132 | 1 | equemene | END IF |
133 | 1 | equemene | * |
134 | 1 | equemene | IF( I.LE.N ) THEN |
135 | 1 | equemene | * |
136 | 1 | equemene | * Apply H(i)' to A(offset+i:m,i+1:n) from the left. |
137 | 1 | equemene | * |
138 | 1 | equemene | AII = A( OFFPI, I ) |
139 | 1 | equemene | A( OFFPI, I ) = ONE |
140 | 1 | equemene | CALL DLARF( 'Left', M-OFFPI+1, N-I, A( OFFPI, I ), 1, |
141 | 1 | equemene | $ TAU( I ), A( OFFPI, I+1 ), LDA, WORK( 1 ) ) |
142 | 1 | equemene | A( OFFPI, I ) = AII |
143 | 1 | equemene | END IF |
144 | 1 | equemene | * |
145 | 1 | equemene | * Update partial column norms. |
146 | 1 | equemene | * |
147 | 1 | equemene | DO 10 J = I + 1, N |
148 | 1 | equemene | IF( VN1( J ).NE.ZERO ) THEN |
149 | 1 | equemene | * |
150 | 1 | equemene | * NOTE: The following 4 lines follow from the analysis in |
151 | 1 | equemene | * Lapack Working Note 176. |
152 | 1 | equemene | * |
153 | 1 | equemene | TEMP = ONE - ( ABS( A( OFFPI, J ) ) / VN1( J ) )**2 |
154 | 1 | equemene | TEMP = MAX( TEMP, ZERO ) |
155 | 1 | equemene | TEMP2 = TEMP*( VN1( J ) / VN2( J ) )**2 |
156 | 1 | equemene | IF( TEMP2 .LE. TOL3Z ) THEN |
157 | 1 | equemene | IF( OFFPI.LT.M ) THEN |
158 | 1 | equemene | VN1( J ) = DNRM2( M-OFFPI, A( OFFPI+1, J ), 1 ) |
159 | 1 | equemene | VN2( J ) = VN1( J ) |
160 | 1 | equemene | ELSE |
161 | 1 | equemene | VN1( J ) = ZERO |
162 | 1 | equemene | VN2( J ) = ZERO |
163 | 1 | equemene | END IF |
164 | 1 | equemene | ELSE |
165 | 1 | equemene | VN1( J ) = VN1( J )*SQRT( TEMP ) |
166 | 1 | equemene | END IF |
167 | 1 | equemene | END IF |
168 | 1 | equemene | 10 CONTINUE |
169 | 1 | equemene | * |
170 | 1 | equemene | 20 CONTINUE |
171 | 1 | equemene | * |
172 | 1 | equemene | RETURN |
173 | 1 | equemene | * |
174 | 1 | equemene | * End of DLAQP2 |
175 | 1 | equemene | * |
176 | 1 | equemene | END |