root / src / lapack / double / dlasd7.f @ 1
Historique | Voir | Annoter | Télécharger (13,96 ko)
1 | 1 | equemene | SUBROUTINE DLASD7( ICOMPQ, NL, NR, SQRE, K, D, Z, ZW, VF, VFW, VL, |
---|---|---|---|
2 | 1 | equemene | $ VLW, ALPHA, BETA, DSIGMA, IDX, IDXP, IDXQ, |
3 | 1 | equemene | $ PERM, GIVPTR, GIVCOL, LDGCOL, GIVNUM, LDGNUM, |
4 | 1 | equemene | $ C, S, INFO ) |
5 | 1 | equemene | * |
6 | 1 | equemene | * -- LAPACK auxiliary routine (version 3.2) -- |
7 | 1 | equemene | * -- LAPACK is a software package provided by Univ. of Tennessee, -- |
8 | 1 | equemene | * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
9 | 1 | equemene | * November 2006 |
10 | 1 | equemene | * |
11 | 1 | equemene | * .. Scalar Arguments .. |
12 | 1 | equemene | INTEGER GIVPTR, ICOMPQ, INFO, K, LDGCOL, LDGNUM, NL, |
13 | 1 | equemene | $ NR, SQRE |
14 | 1 | equemene | DOUBLE PRECISION ALPHA, BETA, C, S |
15 | 1 | equemene | * .. |
16 | 1 | equemene | * .. Array Arguments .. |
17 | 1 | equemene | INTEGER GIVCOL( LDGCOL, * ), IDX( * ), IDXP( * ), |
18 | 1 | equemene | $ IDXQ( * ), PERM( * ) |
19 | 1 | equemene | DOUBLE PRECISION D( * ), DSIGMA( * ), GIVNUM( LDGNUM, * ), |
20 | 1 | equemene | $ VF( * ), VFW( * ), VL( * ), VLW( * ), Z( * ), |
21 | 1 | equemene | $ ZW( * ) |
22 | 1 | equemene | * .. |
23 | 1 | equemene | * |
24 | 1 | equemene | * Purpose |
25 | 1 | equemene | * ======= |
26 | 1 | equemene | * |
27 | 1 | equemene | * DLASD7 merges the two sets of singular values together into a single |
28 | 1 | equemene | * sorted set. Then it tries to deflate the size of the problem. There |
29 | 1 | equemene | * are two ways in which deflation can occur: when two or more singular |
30 | 1 | equemene | * values are close together or if there is a tiny entry in the Z |
31 | 1 | equemene | * vector. For each such occurrence the order of the related |
32 | 1 | equemene | * secular equation problem is reduced by one. |
33 | 1 | equemene | * |
34 | 1 | equemene | * DLASD7 is called from DLASD6. |
35 | 1 | equemene | * |
36 | 1 | equemene | * Arguments |
37 | 1 | equemene | * ========= |
38 | 1 | equemene | * |
39 | 1 | equemene | * ICOMPQ (input) INTEGER |
40 | 1 | equemene | * Specifies whether singular vectors are to be computed |
41 | 1 | equemene | * in compact form, as follows: |
42 | 1 | equemene | * = 0: Compute singular values only. |
43 | 1 | equemene | * = 1: Compute singular vectors of upper |
44 | 1 | equemene | * bidiagonal matrix in compact form. |
45 | 1 | equemene | * |
46 | 1 | equemene | * NL (input) INTEGER |
47 | 1 | equemene | * The row dimension of the upper block. NL >= 1. |
48 | 1 | equemene | * |
49 | 1 | equemene | * NR (input) INTEGER |
50 | 1 | equemene | * The row dimension of the lower block. NR >= 1. |
51 | 1 | equemene | * |
52 | 1 | equemene | * SQRE (input) INTEGER |
53 | 1 | equemene | * = 0: the lower block is an NR-by-NR square matrix. |
54 | 1 | equemene | * = 1: the lower block is an NR-by-(NR+1) rectangular matrix. |
55 | 1 | equemene | * |
56 | 1 | equemene | * The bidiagonal matrix has |
57 | 1 | equemene | * N = NL + NR + 1 rows and |
58 | 1 | equemene | * M = N + SQRE >= N columns. |
59 | 1 | equemene | * |
60 | 1 | equemene | * K (output) INTEGER |
61 | 1 | equemene | * Contains the dimension of the non-deflated matrix, this is |
62 | 1 | equemene | * the order of the related secular equation. 1 <= K <=N. |
63 | 1 | equemene | * |
64 | 1 | equemene | * D (input/output) DOUBLE PRECISION array, dimension ( N ) |
65 | 1 | equemene | * On entry D contains the singular values of the two submatrices |
66 | 1 | equemene | * to be combined. On exit D contains the trailing (N-K) updated |
67 | 1 | equemene | * singular values (those which were deflated) sorted into |
68 | 1 | equemene | * increasing order. |
69 | 1 | equemene | * |
70 | 1 | equemene | * Z (output) DOUBLE PRECISION array, dimension ( M ) |
71 | 1 | equemene | * On exit Z contains the updating row vector in the secular |
72 | 1 | equemene | * equation. |
73 | 1 | equemene | * |
74 | 1 | equemene | * ZW (workspace) DOUBLE PRECISION array, dimension ( M ) |
75 | 1 | equemene | * Workspace for Z. |
76 | 1 | equemene | * |
77 | 1 | equemene | * VF (input/output) DOUBLE PRECISION array, dimension ( M ) |
78 | 1 | equemene | * On entry, VF(1:NL+1) contains the first components of all |
79 | 1 | equemene | * right singular vectors of the upper block; and VF(NL+2:M) |
80 | 1 | equemene | * contains the first components of all right singular vectors |
81 | 1 | equemene | * of the lower block. On exit, VF contains the first components |
82 | 1 | equemene | * of all right singular vectors of the bidiagonal matrix. |
83 | 1 | equemene | * |
84 | 1 | equemene | * VFW (workspace) DOUBLE PRECISION array, dimension ( M ) |
85 | 1 | equemene | * Workspace for VF. |
86 | 1 | equemene | * |
87 | 1 | equemene | * VL (input/output) DOUBLE PRECISION array, dimension ( M ) |
88 | 1 | equemene | * On entry, VL(1:NL+1) contains the last components of all |
89 | 1 | equemene | * right singular vectors of the upper block; and VL(NL+2:M) |
90 | 1 | equemene | * contains the last components of all right singular vectors |
91 | 1 | equemene | * of the lower block. On exit, VL contains the last components |
92 | 1 | equemene | * of all right singular vectors of the bidiagonal matrix. |
93 | 1 | equemene | * |
94 | 1 | equemene | * VLW (workspace) DOUBLE PRECISION array, dimension ( M ) |
95 | 1 | equemene | * Workspace for VL. |
96 | 1 | equemene | * |
97 | 1 | equemene | * ALPHA (input) DOUBLE PRECISION |
98 | 1 | equemene | * Contains the diagonal element associated with the added row. |
99 | 1 | equemene | * |
100 | 1 | equemene | * BETA (input) DOUBLE PRECISION |
101 | 1 | equemene | * Contains the off-diagonal element associated with the added |
102 | 1 | equemene | * row. |
103 | 1 | equemene | * |
104 | 1 | equemene | * DSIGMA (output) DOUBLE PRECISION array, dimension ( N ) |
105 | 1 | equemene | * Contains a copy of the diagonal elements (K-1 singular values |
106 | 1 | equemene | * and one zero) in the secular equation. |
107 | 1 | equemene | * |
108 | 1 | equemene | * IDX (workspace) INTEGER array, dimension ( N ) |
109 | 1 | equemene | * This will contain the permutation used to sort the contents of |
110 | 1 | equemene | * D into ascending order. |
111 | 1 | equemene | * |
112 | 1 | equemene | * IDXP (workspace) INTEGER array, dimension ( N ) |
113 | 1 | equemene | * This will contain the permutation used to place deflated |
114 | 1 | equemene | * values of D at the end of the array. On output IDXP(2:K) |
115 | 1 | equemene | * points to the nondeflated D-values and IDXP(K+1:N) |
116 | 1 | equemene | * points to the deflated singular values. |
117 | 1 | equemene | * |
118 | 1 | equemene | * IDXQ (input) INTEGER array, dimension ( N ) |
119 | 1 | equemene | * This contains the permutation which separately sorts the two |
120 | 1 | equemene | * sub-problems in D into ascending order. Note that entries in |
121 | 1 | equemene | * the first half of this permutation must first be moved one |
122 | 1 | equemene | * position backward; and entries in the second half |
123 | 1 | equemene | * must first have NL+1 added to their values. |
124 | 1 | equemene | * |
125 | 1 | equemene | * PERM (output) INTEGER array, dimension ( N ) |
126 | 1 | equemene | * The permutations (from deflation and sorting) to be applied |
127 | 1 | equemene | * to each singular block. Not referenced if ICOMPQ = 0. |
128 | 1 | equemene | * |
129 | 1 | equemene | * GIVPTR (output) INTEGER |
130 | 1 | equemene | * The number of Givens rotations which took place in this |
131 | 1 | equemene | * subproblem. Not referenced if ICOMPQ = 0. |
132 | 1 | equemene | * |
133 | 1 | equemene | * GIVCOL (output) INTEGER array, dimension ( LDGCOL, 2 ) |
134 | 1 | equemene | * Each pair of numbers indicates a pair of columns to take place |
135 | 1 | equemene | * in a Givens rotation. Not referenced if ICOMPQ = 0. |
136 | 1 | equemene | * |
137 | 1 | equemene | * LDGCOL (input) INTEGER |
138 | 1 | equemene | * The leading dimension of GIVCOL, must be at least N. |
139 | 1 | equemene | * |
140 | 1 | equemene | * GIVNUM (output) DOUBLE PRECISION array, dimension ( LDGNUM, 2 ) |
141 | 1 | equemene | * Each number indicates the C or S value to be used in the |
142 | 1 | equemene | * corresponding Givens rotation. Not referenced if ICOMPQ = 0. |
143 | 1 | equemene | * |
144 | 1 | equemene | * LDGNUM (input) INTEGER |
145 | 1 | equemene | * The leading dimension of GIVNUM, must be at least N. |
146 | 1 | equemene | * |
147 | 1 | equemene | * C (output) DOUBLE PRECISION |
148 | 1 | equemene | * C contains garbage if SQRE =0 and the C-value of a Givens |
149 | 1 | equemene | * rotation related to the right null space if SQRE = 1. |
150 | 1 | equemene | * |
151 | 1 | equemene | * S (output) DOUBLE PRECISION |
152 | 1 | equemene | * S contains garbage if SQRE =0 and the S-value of a Givens |
153 | 1 | equemene | * rotation related to the right null space if SQRE = 1. |
154 | 1 | equemene | * |
155 | 1 | equemene | * INFO (output) INTEGER |
156 | 1 | equemene | * = 0: successful exit. |
157 | 1 | equemene | * < 0: if INFO = -i, the i-th argument had an illegal value. |
158 | 1 | equemene | * |
159 | 1 | equemene | * Further Details |
160 | 1 | equemene | * =============== |
161 | 1 | equemene | * |
162 | 1 | equemene | * Based on contributions by |
163 | 1 | equemene | * Ming Gu and Huan Ren, Computer Science Division, University of |
164 | 1 | equemene | * California at Berkeley, USA |
165 | 1 | equemene | * |
166 | 1 | equemene | * ===================================================================== |
167 | 1 | equemene | * |
168 | 1 | equemene | * .. Parameters .. |
169 | 1 | equemene | DOUBLE PRECISION ZERO, ONE, TWO, EIGHT |
170 | 1 | equemene | PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0, TWO = 2.0D+0, |
171 | 1 | equemene | $ EIGHT = 8.0D+0 ) |
172 | 1 | equemene | * .. |
173 | 1 | equemene | * .. Local Scalars .. |
174 | 1 | equemene | * |
175 | 1 | equemene | INTEGER I, IDXI, IDXJ, IDXJP, J, JP, JPREV, K2, M, N, |
176 | 1 | equemene | $ NLP1, NLP2 |
177 | 1 | equemene | DOUBLE PRECISION EPS, HLFTOL, TAU, TOL, Z1 |
178 | 1 | equemene | * .. |
179 | 1 | equemene | * .. External Subroutines .. |
180 | 1 | equemene | EXTERNAL DCOPY, DLAMRG, DROT, XERBLA |
181 | 1 | equemene | * .. |
182 | 1 | equemene | * .. External Functions .. |
183 | 1 | equemene | DOUBLE PRECISION DLAMCH, DLAPY2 |
184 | 1 | equemene | EXTERNAL DLAMCH, DLAPY2 |
185 | 1 | equemene | * .. |
186 | 1 | equemene | * .. Intrinsic Functions .. |
187 | 1 | equemene | INTRINSIC ABS, MAX |
188 | 1 | equemene | * .. |
189 | 1 | equemene | * .. Executable Statements .. |
190 | 1 | equemene | * |
191 | 1 | equemene | * Test the input parameters. |
192 | 1 | equemene | * |
193 | 1 | equemene | INFO = 0 |
194 | 1 | equemene | N = NL + NR + 1 |
195 | 1 | equemene | M = N + SQRE |
196 | 1 | equemene | * |
197 | 1 | equemene | IF( ( ICOMPQ.LT.0 ) .OR. ( ICOMPQ.GT.1 ) ) THEN |
198 | 1 | equemene | INFO = -1 |
199 | 1 | equemene | ELSE IF( NL.LT.1 ) THEN |
200 | 1 | equemene | INFO = -2 |
201 | 1 | equemene | ELSE IF( NR.LT.1 ) THEN |
202 | 1 | equemene | INFO = -3 |
203 | 1 | equemene | ELSE IF( ( SQRE.LT.0 ) .OR. ( SQRE.GT.1 ) ) THEN |
204 | 1 | equemene | INFO = -4 |
205 | 1 | equemene | ELSE IF( LDGCOL.LT.N ) THEN |
206 | 1 | equemene | INFO = -22 |
207 | 1 | equemene | ELSE IF( LDGNUM.LT.N ) THEN |
208 | 1 | equemene | INFO = -24 |
209 | 1 | equemene | END IF |
210 | 1 | equemene | IF( INFO.NE.0 ) THEN |
211 | 1 | equemene | CALL XERBLA( 'DLASD7', -INFO ) |
212 | 1 | equemene | RETURN |
213 | 1 | equemene | END IF |
214 | 1 | equemene | * |
215 | 1 | equemene | NLP1 = NL + 1 |
216 | 1 | equemene | NLP2 = NL + 2 |
217 | 1 | equemene | IF( ICOMPQ.EQ.1 ) THEN |
218 | 1 | equemene | GIVPTR = 0 |
219 | 1 | equemene | END IF |
220 | 1 | equemene | * |
221 | 1 | equemene | * Generate the first part of the vector Z and move the singular |
222 | 1 | equemene | * values in the first part of D one position backward. |
223 | 1 | equemene | * |
224 | 1 | equemene | Z1 = ALPHA*VL( NLP1 ) |
225 | 1 | equemene | VL( NLP1 ) = ZERO |
226 | 1 | equemene | TAU = VF( NLP1 ) |
227 | 1 | equemene | DO 10 I = NL, 1, -1 |
228 | 1 | equemene | Z( I+1 ) = ALPHA*VL( I ) |
229 | 1 | equemene | VL( I ) = ZERO |
230 | 1 | equemene | VF( I+1 ) = VF( I ) |
231 | 1 | equemene | D( I+1 ) = D( I ) |
232 | 1 | equemene | IDXQ( I+1 ) = IDXQ( I ) + 1 |
233 | 1 | equemene | 10 CONTINUE |
234 | 1 | equemene | VF( 1 ) = TAU |
235 | 1 | equemene | * |
236 | 1 | equemene | * Generate the second part of the vector Z. |
237 | 1 | equemene | * |
238 | 1 | equemene | DO 20 I = NLP2, M |
239 | 1 | equemene | Z( I ) = BETA*VF( I ) |
240 | 1 | equemene | VF( I ) = ZERO |
241 | 1 | equemene | 20 CONTINUE |
242 | 1 | equemene | * |
243 | 1 | equemene | * Sort the singular values into increasing order |
244 | 1 | equemene | * |
245 | 1 | equemene | DO 30 I = NLP2, N |
246 | 1 | equemene | IDXQ( I ) = IDXQ( I ) + NLP1 |
247 | 1 | equemene | 30 CONTINUE |
248 | 1 | equemene | * |
249 | 1 | equemene | * DSIGMA, IDXC, IDXC, and ZW are used as storage space. |
250 | 1 | equemene | * |
251 | 1 | equemene | DO 40 I = 2, N |
252 | 1 | equemene | DSIGMA( I ) = D( IDXQ( I ) ) |
253 | 1 | equemene | ZW( I ) = Z( IDXQ( I ) ) |
254 | 1 | equemene | VFW( I ) = VF( IDXQ( I ) ) |
255 | 1 | equemene | VLW( I ) = VL( IDXQ( I ) ) |
256 | 1 | equemene | 40 CONTINUE |
257 | 1 | equemene | * |
258 | 1 | equemene | CALL DLAMRG( NL, NR, DSIGMA( 2 ), 1, 1, IDX( 2 ) ) |
259 | 1 | equemene | * |
260 | 1 | equemene | DO 50 I = 2, N |
261 | 1 | equemene | IDXI = 1 + IDX( I ) |
262 | 1 | equemene | D( I ) = DSIGMA( IDXI ) |
263 | 1 | equemene | Z( I ) = ZW( IDXI ) |
264 | 1 | equemene | VF( I ) = VFW( IDXI ) |
265 | 1 | equemene | VL( I ) = VLW( IDXI ) |
266 | 1 | equemene | 50 CONTINUE |
267 | 1 | equemene | * |
268 | 1 | equemene | * Calculate the allowable deflation tolerence |
269 | 1 | equemene | * |
270 | 1 | equemene | EPS = DLAMCH( 'Epsilon' ) |
271 | 1 | equemene | TOL = MAX( ABS( ALPHA ), ABS( BETA ) ) |
272 | 1 | equemene | TOL = EIGHT*EIGHT*EPS*MAX( ABS( D( N ) ), TOL ) |
273 | 1 | equemene | * |
274 | 1 | equemene | * There are 2 kinds of deflation -- first a value in the z-vector |
275 | 1 | equemene | * is small, second two (or more) singular values are very close |
276 | 1 | equemene | * together (their difference is small). |
277 | 1 | equemene | * |
278 | 1 | equemene | * If the value in the z-vector is small, we simply permute the |
279 | 1 | equemene | * array so that the corresponding singular value is moved to the |
280 | 1 | equemene | * end. |
281 | 1 | equemene | * |
282 | 1 | equemene | * If two values in the D-vector are close, we perform a two-sided |
283 | 1 | equemene | * rotation designed to make one of the corresponding z-vector |
284 | 1 | equemene | * entries zero, and then permute the array so that the deflated |
285 | 1 | equemene | * singular value is moved to the end. |
286 | 1 | equemene | * |
287 | 1 | equemene | * If there are multiple singular values then the problem deflates. |
288 | 1 | equemene | * Here the number of equal singular values are found. As each equal |
289 | 1 | equemene | * singular value is found, an elementary reflector is computed to |
290 | 1 | equemene | * rotate the corresponding singular subspace so that the |
291 | 1 | equemene | * corresponding components of Z are zero in this new basis. |
292 | 1 | equemene | * |
293 | 1 | equemene | K = 1 |
294 | 1 | equemene | K2 = N + 1 |
295 | 1 | equemene | DO 60 J = 2, N |
296 | 1 | equemene | IF( ABS( Z( J ) ).LE.TOL ) THEN |
297 | 1 | equemene | * |
298 | 1 | equemene | * Deflate due to small z component. |
299 | 1 | equemene | * |
300 | 1 | equemene | K2 = K2 - 1 |
301 | 1 | equemene | IDXP( K2 ) = J |
302 | 1 | equemene | IF( J.EQ.N ) |
303 | 1 | equemene | $ GO TO 100 |
304 | 1 | equemene | ELSE |
305 | 1 | equemene | JPREV = J |
306 | 1 | equemene | GO TO 70 |
307 | 1 | equemene | END IF |
308 | 1 | equemene | 60 CONTINUE |
309 | 1 | equemene | 70 CONTINUE |
310 | 1 | equemene | J = JPREV |
311 | 1 | equemene | 80 CONTINUE |
312 | 1 | equemene | J = J + 1 |
313 | 1 | equemene | IF( J.GT.N ) |
314 | 1 | equemene | $ GO TO 90 |
315 | 1 | equemene | IF( ABS( Z( J ) ).LE.TOL ) THEN |
316 | 1 | equemene | * |
317 | 1 | equemene | * Deflate due to small z component. |
318 | 1 | equemene | * |
319 | 1 | equemene | K2 = K2 - 1 |
320 | 1 | equemene | IDXP( K2 ) = J |
321 | 1 | equemene | ELSE |
322 | 1 | equemene | * |
323 | 1 | equemene | * Check if singular values are close enough to allow deflation. |
324 | 1 | equemene | * |
325 | 1 | equemene | IF( ABS( D( J )-D( JPREV ) ).LE.TOL ) THEN |
326 | 1 | equemene | * |
327 | 1 | equemene | * Deflation is possible. |
328 | 1 | equemene | * |
329 | 1 | equemene | S = Z( JPREV ) |
330 | 1 | equemene | C = Z( J ) |
331 | 1 | equemene | * |
332 | 1 | equemene | * Find sqrt(a**2+b**2) without overflow or |
333 | 1 | equemene | * destructive underflow. |
334 | 1 | equemene | * |
335 | 1 | equemene | TAU = DLAPY2( C, S ) |
336 | 1 | equemene | Z( J ) = TAU |
337 | 1 | equemene | Z( JPREV ) = ZERO |
338 | 1 | equemene | C = C / TAU |
339 | 1 | equemene | S = -S / TAU |
340 | 1 | equemene | * |
341 | 1 | equemene | * Record the appropriate Givens rotation |
342 | 1 | equemene | * |
343 | 1 | equemene | IF( ICOMPQ.EQ.1 ) THEN |
344 | 1 | equemene | GIVPTR = GIVPTR + 1 |
345 | 1 | equemene | IDXJP = IDXQ( IDX( JPREV )+1 ) |
346 | 1 | equemene | IDXJ = IDXQ( IDX( J )+1 ) |
347 | 1 | equemene | IF( IDXJP.LE.NLP1 ) THEN |
348 | 1 | equemene | IDXJP = IDXJP - 1 |
349 | 1 | equemene | END IF |
350 | 1 | equemene | IF( IDXJ.LE.NLP1 ) THEN |
351 | 1 | equemene | IDXJ = IDXJ - 1 |
352 | 1 | equemene | END IF |
353 | 1 | equemene | GIVCOL( GIVPTR, 2 ) = IDXJP |
354 | 1 | equemene | GIVCOL( GIVPTR, 1 ) = IDXJ |
355 | 1 | equemene | GIVNUM( GIVPTR, 2 ) = C |
356 | 1 | equemene | GIVNUM( GIVPTR, 1 ) = S |
357 | 1 | equemene | END IF |
358 | 1 | equemene | CALL DROT( 1, VF( JPREV ), 1, VF( J ), 1, C, S ) |
359 | 1 | equemene | CALL DROT( 1, VL( JPREV ), 1, VL( J ), 1, C, S ) |
360 | 1 | equemene | K2 = K2 - 1 |
361 | 1 | equemene | IDXP( K2 ) = JPREV |
362 | 1 | equemene | JPREV = J |
363 | 1 | equemene | ELSE |
364 | 1 | equemene | K = K + 1 |
365 | 1 | equemene | ZW( K ) = Z( JPREV ) |
366 | 1 | equemene | DSIGMA( K ) = D( JPREV ) |
367 | 1 | equemene | IDXP( K ) = JPREV |
368 | 1 | equemene | JPREV = J |
369 | 1 | equemene | END IF |
370 | 1 | equemene | END IF |
371 | 1 | equemene | GO TO 80 |
372 | 1 | equemene | 90 CONTINUE |
373 | 1 | equemene | * |
374 | 1 | equemene | * Record the last singular value. |
375 | 1 | equemene | * |
376 | 1 | equemene | K = K + 1 |
377 | 1 | equemene | ZW( K ) = Z( JPREV ) |
378 | 1 | equemene | DSIGMA( K ) = D( JPREV ) |
379 | 1 | equemene | IDXP( K ) = JPREV |
380 | 1 | equemene | * |
381 | 1 | equemene | 100 CONTINUE |
382 | 1 | equemene | * |
383 | 1 | equemene | * Sort the singular values into DSIGMA. The singular values which |
384 | 1 | equemene | * were not deflated go into the first K slots of DSIGMA, except |
385 | 1 | equemene | * that DSIGMA(1) is treated separately. |
386 | 1 | equemene | * |
387 | 1 | equemene | DO 110 J = 2, N |
388 | 1 | equemene | JP = IDXP( J ) |
389 | 1 | equemene | DSIGMA( J ) = D( JP ) |
390 | 1 | equemene | VFW( J ) = VF( JP ) |
391 | 1 | equemene | VLW( J ) = VL( JP ) |
392 | 1 | equemene | 110 CONTINUE |
393 | 1 | equemene | IF( ICOMPQ.EQ.1 ) THEN |
394 | 1 | equemene | DO 120 J = 2, N |
395 | 1 | equemene | JP = IDXP( J ) |
396 | 1 | equemene | PERM( J ) = IDXQ( IDX( JP )+1 ) |
397 | 1 | equemene | IF( PERM( J ).LE.NLP1 ) THEN |
398 | 1 | equemene | PERM( J ) = PERM( J ) - 1 |
399 | 1 | equemene | END IF |
400 | 1 | equemene | 120 CONTINUE |
401 | 1 | equemene | END IF |
402 | 1 | equemene | * |
403 | 1 | equemene | * The deflated singular values go back into the last N - K slots of |
404 | 1 | equemene | * D. |
405 | 1 | equemene | * |
406 | 1 | equemene | CALL DCOPY( N-K, DSIGMA( K+1 ), 1, D( K+1 ), 1 ) |
407 | 1 | equemene | * |
408 | 1 | equemene | * Determine DSIGMA(1), DSIGMA(2), Z(1), VF(1), VL(1), VF(M), and |
409 | 1 | equemene | * VL(M). |
410 | 1 | equemene | * |
411 | 1 | equemene | DSIGMA( 1 ) = ZERO |
412 | 1 | equemene | HLFTOL = TOL / TWO |
413 | 1 | equemene | IF( ABS( DSIGMA( 2 ) ).LE.HLFTOL ) |
414 | 1 | equemene | $ DSIGMA( 2 ) = HLFTOL |
415 | 1 | equemene | IF( M.GT.N ) THEN |
416 | 1 | equemene | Z( 1 ) = DLAPY2( Z1, Z( M ) ) |
417 | 1 | equemene | IF( Z( 1 ).LE.TOL ) THEN |
418 | 1 | equemene | C = ONE |
419 | 1 | equemene | S = ZERO |
420 | 1 | equemene | Z( 1 ) = TOL |
421 | 1 | equemene | ELSE |
422 | 1 | equemene | C = Z1 / Z( 1 ) |
423 | 1 | equemene | S = -Z( M ) / Z( 1 ) |
424 | 1 | equemene | END IF |
425 | 1 | equemene | CALL DROT( 1, VF( M ), 1, VF( 1 ), 1, C, S ) |
426 | 1 | equemene | CALL DROT( 1, VL( M ), 1, VL( 1 ), 1, C, S ) |
427 | 1 | equemene | ELSE |
428 | 1 | equemene | IF( ABS( Z1 ).LE.TOL ) THEN |
429 | 1 | equemene | Z( 1 ) = TOL |
430 | 1 | equemene | ELSE |
431 | 1 | equemene | Z( 1 ) = Z1 |
432 | 1 | equemene | END IF |
433 | 1 | equemene | END IF |
434 | 1 | equemene | * |
435 | 1 | equemene | * Restore Z, VF, and VL. |
436 | 1 | equemene | * |
437 | 1 | equemene | CALL DCOPY( K-1, ZW( 2 ), 1, Z( 2 ), 1 ) |
438 | 1 | equemene | CALL DCOPY( N-1, VFW( 2 ), 1, VF( 2 ), 1 ) |
439 | 1 | equemene | CALL DCOPY( N-1, VLW( 2 ), 1, VL( 2 ), 1 ) |
440 | 1 | equemene | * |
441 | 1 | equemene | RETURN |
442 | 1 | equemene | * |
443 | 1 | equemene | * End of DLASD7 |
444 | 1 | equemene | * |
445 | 1 | equemene | END |