root / src / lapack / double / dlasda.f @ 1
Historique | Voir | Annoter | Télécharger (14,39 ko)
1 | 1 | equemene | SUBROUTINE DLASDA( ICOMPQ, SMLSIZ, N, SQRE, D, E, U, LDU, VT, K, |
---|---|---|---|
2 | 1 | equemene | $ DIFL, DIFR, Z, POLES, GIVPTR, GIVCOL, LDGCOL, |
3 | 1 | equemene | $ PERM, GIVNUM, C, S, WORK, IWORK, INFO ) |
4 | 1 | equemene | * |
5 | 1 | equemene | * -- LAPACK auxiliary routine (version 3.2.2) -- |
6 | 1 | equemene | * -- LAPACK is a software package provided by Univ. of Tennessee, -- |
7 | 1 | equemene | * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
8 | 1 | equemene | * June 2010 |
9 | 1 | equemene | * |
10 | 1 | equemene | * .. Scalar Arguments .. |
11 | 1 | equemene | INTEGER ICOMPQ, INFO, LDGCOL, LDU, N, SMLSIZ, SQRE |
12 | 1 | equemene | * .. |
13 | 1 | equemene | * .. Array Arguments .. |
14 | 1 | equemene | INTEGER GIVCOL( LDGCOL, * ), GIVPTR( * ), IWORK( * ), |
15 | 1 | equemene | $ K( * ), PERM( LDGCOL, * ) |
16 | 1 | equemene | DOUBLE PRECISION C( * ), D( * ), DIFL( LDU, * ), DIFR( LDU, * ), |
17 | 1 | equemene | $ E( * ), GIVNUM( LDU, * ), POLES( LDU, * ), |
18 | 1 | equemene | $ S( * ), U( LDU, * ), VT( LDU, * ), WORK( * ), |
19 | 1 | equemene | $ Z( LDU, * ) |
20 | 1 | equemene | * .. |
21 | 1 | equemene | * |
22 | 1 | equemene | * Purpose |
23 | 1 | equemene | * ======= |
24 | 1 | equemene | * |
25 | 1 | equemene | * Using a divide and conquer approach, DLASDA computes the singular |
26 | 1 | equemene | * value decomposition (SVD) of a real upper bidiagonal N-by-M matrix |
27 | 1 | equemene | * B with diagonal D and offdiagonal E, where M = N + SQRE. The |
28 | 1 | equemene | * algorithm computes the singular values in the SVD B = U * S * VT. |
29 | 1 | equemene | * The orthogonal matrices U and VT are optionally computed in |
30 | 1 | equemene | * compact form. |
31 | 1 | equemene | * |
32 | 1 | equemene | * A related subroutine, DLASD0, computes the singular values and |
33 | 1 | equemene | * the singular vectors in explicit form. |
34 | 1 | equemene | * |
35 | 1 | equemene | * Arguments |
36 | 1 | equemene | * ========= |
37 | 1 | equemene | * |
38 | 1 | equemene | * ICOMPQ (input) INTEGER |
39 | 1 | equemene | * Specifies whether singular vectors are to be computed |
40 | 1 | equemene | * in compact form, as follows |
41 | 1 | equemene | * = 0: Compute singular values only. |
42 | 1 | equemene | * = 1: Compute singular vectors of upper bidiagonal |
43 | 1 | equemene | * matrix in compact form. |
44 | 1 | equemene | * |
45 | 1 | equemene | * SMLSIZ (input) INTEGER |
46 | 1 | equemene | * The maximum size of the subproblems at the bottom of the |
47 | 1 | equemene | * computation tree. |
48 | 1 | equemene | * |
49 | 1 | equemene | * N (input) INTEGER |
50 | 1 | equemene | * The row dimension of the upper bidiagonal matrix. This is |
51 | 1 | equemene | * also the dimension of the main diagonal array D. |
52 | 1 | equemene | * |
53 | 1 | equemene | * SQRE (input) INTEGER |
54 | 1 | equemene | * Specifies the column dimension of the bidiagonal matrix. |
55 | 1 | equemene | * = 0: The bidiagonal matrix has column dimension M = N; |
56 | 1 | equemene | * = 1: The bidiagonal matrix has column dimension M = N + 1. |
57 | 1 | equemene | * |
58 | 1 | equemene | * D (input/output) DOUBLE PRECISION array, dimension ( N ) |
59 | 1 | equemene | * On entry D contains the main diagonal of the bidiagonal |
60 | 1 | equemene | * matrix. On exit D, if INFO = 0, contains its singular values. |
61 | 1 | equemene | * |
62 | 1 | equemene | * E (input) DOUBLE PRECISION array, dimension ( M-1 ) |
63 | 1 | equemene | * Contains the subdiagonal entries of the bidiagonal matrix. |
64 | 1 | equemene | * On exit, E has been destroyed. |
65 | 1 | equemene | * |
66 | 1 | equemene | * U (output) DOUBLE PRECISION array, |
67 | 1 | equemene | * dimension ( LDU, SMLSIZ ) if ICOMPQ = 1, and not referenced |
68 | 1 | equemene | * if ICOMPQ = 0. If ICOMPQ = 1, on exit, U contains the left |
69 | 1 | equemene | * singular vector matrices of all subproblems at the bottom |
70 | 1 | equemene | * level. |
71 | 1 | equemene | * |
72 | 1 | equemene | * LDU (input) INTEGER, LDU = > N. |
73 | 1 | equemene | * The leading dimension of arrays U, VT, DIFL, DIFR, POLES, |
74 | 1 | equemene | * GIVNUM, and Z. |
75 | 1 | equemene | * |
76 | 1 | equemene | * VT (output) DOUBLE PRECISION array, |
77 | 1 | equemene | * dimension ( LDU, SMLSIZ+1 ) if ICOMPQ = 1, and not referenced |
78 | 1 | equemene | * if ICOMPQ = 0. If ICOMPQ = 1, on exit, VT' contains the right |
79 | 1 | equemene | * singular vector matrices of all subproblems at the bottom |
80 | 1 | equemene | * level. |
81 | 1 | equemene | * |
82 | 1 | equemene | * K (output) INTEGER array, |
83 | 1 | equemene | * dimension ( N ) if ICOMPQ = 1 and dimension 1 if ICOMPQ = 0. |
84 | 1 | equemene | * If ICOMPQ = 1, on exit, K(I) is the dimension of the I-th |
85 | 1 | equemene | * secular equation on the computation tree. |
86 | 1 | equemene | * |
87 | 1 | equemene | * DIFL (output) DOUBLE PRECISION array, dimension ( LDU, NLVL ), |
88 | 1 | equemene | * where NLVL = floor(log_2 (N/SMLSIZ))). |
89 | 1 | equemene | * |
90 | 1 | equemene | * DIFR (output) DOUBLE PRECISION array, |
91 | 1 | equemene | * dimension ( LDU, 2 * NLVL ) if ICOMPQ = 1 and |
92 | 1 | equemene | * dimension ( N ) if ICOMPQ = 0. |
93 | 1 | equemene | * If ICOMPQ = 1, on exit, DIFL(1:N, I) and DIFR(1:N, 2 * I - 1) |
94 | 1 | equemene | * record distances between singular values on the I-th |
95 | 1 | equemene | * level and singular values on the (I -1)-th level, and |
96 | 1 | equemene | * DIFR(1:N, 2 * I ) contains the normalizing factors for |
97 | 1 | equemene | * the right singular vector matrix. See DLASD8 for details. |
98 | 1 | equemene | * |
99 | 1 | equemene | * Z (output) DOUBLE PRECISION array, |
100 | 1 | equemene | * dimension ( LDU, NLVL ) if ICOMPQ = 1 and |
101 | 1 | equemene | * dimension ( N ) if ICOMPQ = 0. |
102 | 1 | equemene | * The first K elements of Z(1, I) contain the components of |
103 | 1 | equemene | * the deflation-adjusted updating row vector for subproblems |
104 | 1 | equemene | * on the I-th level. |
105 | 1 | equemene | * |
106 | 1 | equemene | * POLES (output) DOUBLE PRECISION array, |
107 | 1 | equemene | * dimension ( LDU, 2 * NLVL ) if ICOMPQ = 1, and not referenced |
108 | 1 | equemene | * if ICOMPQ = 0. If ICOMPQ = 1, on exit, POLES(1, 2*I - 1) and |
109 | 1 | equemene | * POLES(1, 2*I) contain the new and old singular values |
110 | 1 | equemene | * involved in the secular equations on the I-th level. |
111 | 1 | equemene | * |
112 | 1 | equemene | * GIVPTR (output) INTEGER array, |
113 | 1 | equemene | * dimension ( N ) if ICOMPQ = 1, and not referenced if |
114 | 1 | equemene | * ICOMPQ = 0. If ICOMPQ = 1, on exit, GIVPTR( I ) records |
115 | 1 | equemene | * the number of Givens rotations performed on the I-th |
116 | 1 | equemene | * problem on the computation tree. |
117 | 1 | equemene | * |
118 | 1 | equemene | * GIVCOL (output) INTEGER array, |
119 | 1 | equemene | * dimension ( LDGCOL, 2 * NLVL ) if ICOMPQ = 1, and not |
120 | 1 | equemene | * referenced if ICOMPQ = 0. If ICOMPQ = 1, on exit, for each I, |
121 | 1 | equemene | * GIVCOL(1, 2 *I - 1) and GIVCOL(1, 2 *I) record the locations |
122 | 1 | equemene | * of Givens rotations performed on the I-th level on the |
123 | 1 | equemene | * computation tree. |
124 | 1 | equemene | * |
125 | 1 | equemene | * LDGCOL (input) INTEGER, LDGCOL = > N. |
126 | 1 | equemene | * The leading dimension of arrays GIVCOL and PERM. |
127 | 1 | equemene | * |
128 | 1 | equemene | * PERM (output) INTEGER array, |
129 | 1 | equemene | * dimension ( LDGCOL, NLVL ) if ICOMPQ = 1, and not referenced |
130 | 1 | equemene | * if ICOMPQ = 0. If ICOMPQ = 1, on exit, PERM(1, I) records |
131 | 1 | equemene | * permutations done on the I-th level of the computation tree. |
132 | 1 | equemene | * |
133 | 1 | equemene | * GIVNUM (output) DOUBLE PRECISION array, |
134 | 1 | equemene | * dimension ( LDU, 2 * NLVL ) if ICOMPQ = 1, and not |
135 | 1 | equemene | * referenced if ICOMPQ = 0. If ICOMPQ = 1, on exit, for each I, |
136 | 1 | equemene | * GIVNUM(1, 2 *I - 1) and GIVNUM(1, 2 *I) record the C- and S- |
137 | 1 | equemene | * values of Givens rotations performed on the I-th level on |
138 | 1 | equemene | * the computation tree. |
139 | 1 | equemene | * |
140 | 1 | equemene | * C (output) DOUBLE PRECISION array, |
141 | 1 | equemene | * dimension ( N ) if ICOMPQ = 1, and dimension 1 if ICOMPQ = 0. |
142 | 1 | equemene | * If ICOMPQ = 1 and the I-th subproblem is not square, on exit, |
143 | 1 | equemene | * C( I ) contains the C-value of a Givens rotation related to |
144 | 1 | equemene | * the right null space of the I-th subproblem. |
145 | 1 | equemene | * |
146 | 1 | equemene | * S (output) DOUBLE PRECISION array, dimension ( N ) if |
147 | 1 | equemene | * ICOMPQ = 1, and dimension 1 if ICOMPQ = 0. If ICOMPQ = 1 |
148 | 1 | equemene | * and the I-th subproblem is not square, on exit, S( I ) |
149 | 1 | equemene | * contains the S-value of a Givens rotation related to |
150 | 1 | equemene | * the right null space of the I-th subproblem. |
151 | 1 | equemene | * |
152 | 1 | equemene | * WORK (workspace) DOUBLE PRECISION array, dimension |
153 | 1 | equemene | * (6 * N + (SMLSIZ + 1)*(SMLSIZ + 1)). |
154 | 1 | equemene | * |
155 | 1 | equemene | * IWORK (workspace) INTEGER array. |
156 | 1 | equemene | * Dimension must be at least (7 * N). |
157 | 1 | equemene | * |
158 | 1 | equemene | * INFO (output) INTEGER |
159 | 1 | equemene | * = 0: successful exit. |
160 | 1 | equemene | * < 0: if INFO = -i, the i-th argument had an illegal value. |
161 | 1 | equemene | * > 0: if INFO = 1, a singular value did not converge |
162 | 1 | equemene | * |
163 | 1 | equemene | * Further Details |
164 | 1 | equemene | * =============== |
165 | 1 | equemene | * |
166 | 1 | equemene | * Based on contributions by |
167 | 1 | equemene | * Ming Gu and Huan Ren, Computer Science Division, University of |
168 | 1 | equemene | * California at Berkeley, USA |
169 | 1 | equemene | * |
170 | 1 | equemene | * ===================================================================== |
171 | 1 | equemene | * |
172 | 1 | equemene | * .. Parameters .. |
173 | 1 | equemene | DOUBLE PRECISION ZERO, ONE |
174 | 1 | equemene | PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 ) |
175 | 1 | equemene | * .. |
176 | 1 | equemene | * .. Local Scalars .. |
177 | 1 | equemene | INTEGER I, I1, IC, IDXQ, IDXQI, IM1, INODE, ITEMP, IWK, |
178 | 1 | equemene | $ J, LF, LL, LVL, LVL2, M, NCC, ND, NDB1, NDIML, |
179 | 1 | equemene | $ NDIMR, NL, NLF, NLP1, NLVL, NR, NRF, NRP1, NRU, |
180 | 1 | equemene | $ NWORK1, NWORK2, SMLSZP, SQREI, VF, VFI, VL, VLI |
181 | 1 | equemene | DOUBLE PRECISION ALPHA, BETA |
182 | 1 | equemene | * .. |
183 | 1 | equemene | * .. External Subroutines .. |
184 | 1 | equemene | EXTERNAL DCOPY, DLASD6, DLASDQ, DLASDT, DLASET, XERBLA |
185 | 1 | equemene | * .. |
186 | 1 | equemene | * .. Executable Statements .. |
187 | 1 | equemene | * |
188 | 1 | equemene | * Test the input parameters. |
189 | 1 | equemene | * |
190 | 1 | equemene | INFO = 0 |
191 | 1 | equemene | * |
192 | 1 | equemene | IF( ( ICOMPQ.LT.0 ) .OR. ( ICOMPQ.GT.1 ) ) THEN |
193 | 1 | equemene | INFO = -1 |
194 | 1 | equemene | ELSE IF( SMLSIZ.LT.3 ) THEN |
195 | 1 | equemene | INFO = -2 |
196 | 1 | equemene | ELSE IF( N.LT.0 ) THEN |
197 | 1 | equemene | INFO = -3 |
198 | 1 | equemene | ELSE IF( ( SQRE.LT.0 ) .OR. ( SQRE.GT.1 ) ) THEN |
199 | 1 | equemene | INFO = -4 |
200 | 1 | equemene | ELSE IF( LDU.LT.( N+SQRE ) ) THEN |
201 | 1 | equemene | INFO = -8 |
202 | 1 | equemene | ELSE IF( LDGCOL.LT.N ) THEN |
203 | 1 | equemene | INFO = -17 |
204 | 1 | equemene | END IF |
205 | 1 | equemene | IF( INFO.NE.0 ) THEN |
206 | 1 | equemene | CALL XERBLA( 'DLASDA', -INFO ) |
207 | 1 | equemene | RETURN |
208 | 1 | equemene | END IF |
209 | 1 | equemene | * |
210 | 1 | equemene | M = N + SQRE |
211 | 1 | equemene | * |
212 | 1 | equemene | * If the input matrix is too small, call DLASDQ to find the SVD. |
213 | 1 | equemene | * |
214 | 1 | equemene | IF( N.LE.SMLSIZ ) THEN |
215 | 1 | equemene | IF( ICOMPQ.EQ.0 ) THEN |
216 | 1 | equemene | CALL DLASDQ( 'U', SQRE, N, 0, 0, 0, D, E, VT, LDU, U, LDU, |
217 | 1 | equemene | $ U, LDU, WORK, INFO ) |
218 | 1 | equemene | ELSE |
219 | 1 | equemene | CALL DLASDQ( 'U', SQRE, N, M, N, 0, D, E, VT, LDU, U, LDU, |
220 | 1 | equemene | $ U, LDU, WORK, INFO ) |
221 | 1 | equemene | END IF |
222 | 1 | equemene | RETURN |
223 | 1 | equemene | END IF |
224 | 1 | equemene | * |
225 | 1 | equemene | * Book-keeping and set up the computation tree. |
226 | 1 | equemene | * |
227 | 1 | equemene | INODE = 1 |
228 | 1 | equemene | NDIML = INODE + N |
229 | 1 | equemene | NDIMR = NDIML + N |
230 | 1 | equemene | IDXQ = NDIMR + N |
231 | 1 | equemene | IWK = IDXQ + N |
232 | 1 | equemene | * |
233 | 1 | equemene | NCC = 0 |
234 | 1 | equemene | NRU = 0 |
235 | 1 | equemene | * |
236 | 1 | equemene | SMLSZP = SMLSIZ + 1 |
237 | 1 | equemene | VF = 1 |
238 | 1 | equemene | VL = VF + M |
239 | 1 | equemene | NWORK1 = VL + M |
240 | 1 | equemene | NWORK2 = NWORK1 + SMLSZP*SMLSZP |
241 | 1 | equemene | * |
242 | 1 | equemene | CALL DLASDT( N, NLVL, ND, IWORK( INODE ), IWORK( NDIML ), |
243 | 1 | equemene | $ IWORK( NDIMR ), SMLSIZ ) |
244 | 1 | equemene | * |
245 | 1 | equemene | * for the nodes on bottom level of the tree, solve |
246 | 1 | equemene | * their subproblems by DLASDQ. |
247 | 1 | equemene | * |
248 | 1 | equemene | NDB1 = ( ND+1 ) / 2 |
249 | 1 | equemene | DO 30 I = NDB1, ND |
250 | 1 | equemene | * |
251 | 1 | equemene | * IC : center row of each node |
252 | 1 | equemene | * NL : number of rows of left subproblem |
253 | 1 | equemene | * NR : number of rows of right subproblem |
254 | 1 | equemene | * NLF: starting row of the left subproblem |
255 | 1 | equemene | * NRF: starting row of the right subproblem |
256 | 1 | equemene | * |
257 | 1 | equemene | I1 = I - 1 |
258 | 1 | equemene | IC = IWORK( INODE+I1 ) |
259 | 1 | equemene | NL = IWORK( NDIML+I1 ) |
260 | 1 | equemene | NLP1 = NL + 1 |
261 | 1 | equemene | NR = IWORK( NDIMR+I1 ) |
262 | 1 | equemene | NLF = IC - NL |
263 | 1 | equemene | NRF = IC + 1 |
264 | 1 | equemene | IDXQI = IDXQ + NLF - 2 |
265 | 1 | equemene | VFI = VF + NLF - 1 |
266 | 1 | equemene | VLI = VL + NLF - 1 |
267 | 1 | equemene | SQREI = 1 |
268 | 1 | equemene | IF( ICOMPQ.EQ.0 ) THEN |
269 | 1 | equemene | CALL DLASET( 'A', NLP1, NLP1, ZERO, ONE, WORK( NWORK1 ), |
270 | 1 | equemene | $ SMLSZP ) |
271 | 1 | equemene | CALL DLASDQ( 'U', SQREI, NL, NLP1, NRU, NCC, D( NLF ), |
272 | 1 | equemene | $ E( NLF ), WORK( NWORK1 ), SMLSZP, |
273 | 1 | equemene | $ WORK( NWORK2 ), NL, WORK( NWORK2 ), NL, |
274 | 1 | equemene | $ WORK( NWORK2 ), INFO ) |
275 | 1 | equemene | ITEMP = NWORK1 + NL*SMLSZP |
276 | 1 | equemene | CALL DCOPY( NLP1, WORK( NWORK1 ), 1, WORK( VFI ), 1 ) |
277 | 1 | equemene | CALL DCOPY( NLP1, WORK( ITEMP ), 1, WORK( VLI ), 1 ) |
278 | 1 | equemene | ELSE |
279 | 1 | equemene | CALL DLASET( 'A', NL, NL, ZERO, ONE, U( NLF, 1 ), LDU ) |
280 | 1 | equemene | CALL DLASET( 'A', NLP1, NLP1, ZERO, ONE, VT( NLF, 1 ), LDU ) |
281 | 1 | equemene | CALL DLASDQ( 'U', SQREI, NL, NLP1, NL, NCC, D( NLF ), |
282 | 1 | equemene | $ E( NLF ), VT( NLF, 1 ), LDU, U( NLF, 1 ), LDU, |
283 | 1 | equemene | $ U( NLF, 1 ), LDU, WORK( NWORK1 ), INFO ) |
284 | 1 | equemene | CALL DCOPY( NLP1, VT( NLF, 1 ), 1, WORK( VFI ), 1 ) |
285 | 1 | equemene | CALL DCOPY( NLP1, VT( NLF, NLP1 ), 1, WORK( VLI ), 1 ) |
286 | 1 | equemene | END IF |
287 | 1 | equemene | IF( INFO.NE.0 ) THEN |
288 | 1 | equemene | RETURN |
289 | 1 | equemene | END IF |
290 | 1 | equemene | DO 10 J = 1, NL |
291 | 1 | equemene | IWORK( IDXQI+J ) = J |
292 | 1 | equemene | 10 CONTINUE |
293 | 1 | equemene | IF( ( I.EQ.ND ) .AND. ( SQRE.EQ.0 ) ) THEN |
294 | 1 | equemene | SQREI = 0 |
295 | 1 | equemene | ELSE |
296 | 1 | equemene | SQREI = 1 |
297 | 1 | equemene | END IF |
298 | 1 | equemene | IDXQI = IDXQI + NLP1 |
299 | 1 | equemene | VFI = VFI + NLP1 |
300 | 1 | equemene | VLI = VLI + NLP1 |
301 | 1 | equemene | NRP1 = NR + SQREI |
302 | 1 | equemene | IF( ICOMPQ.EQ.0 ) THEN |
303 | 1 | equemene | CALL DLASET( 'A', NRP1, NRP1, ZERO, ONE, WORK( NWORK1 ), |
304 | 1 | equemene | $ SMLSZP ) |
305 | 1 | equemene | CALL DLASDQ( 'U', SQREI, NR, NRP1, NRU, NCC, D( NRF ), |
306 | 1 | equemene | $ E( NRF ), WORK( NWORK1 ), SMLSZP, |
307 | 1 | equemene | $ WORK( NWORK2 ), NR, WORK( NWORK2 ), NR, |
308 | 1 | equemene | $ WORK( NWORK2 ), INFO ) |
309 | 1 | equemene | ITEMP = NWORK1 + ( NRP1-1 )*SMLSZP |
310 | 1 | equemene | CALL DCOPY( NRP1, WORK( NWORK1 ), 1, WORK( VFI ), 1 ) |
311 | 1 | equemene | CALL DCOPY( NRP1, WORK( ITEMP ), 1, WORK( VLI ), 1 ) |
312 | 1 | equemene | ELSE |
313 | 1 | equemene | CALL DLASET( 'A', NR, NR, ZERO, ONE, U( NRF, 1 ), LDU ) |
314 | 1 | equemene | CALL DLASET( 'A', NRP1, NRP1, ZERO, ONE, VT( NRF, 1 ), LDU ) |
315 | 1 | equemene | CALL DLASDQ( 'U', SQREI, NR, NRP1, NR, NCC, D( NRF ), |
316 | 1 | equemene | $ E( NRF ), VT( NRF, 1 ), LDU, U( NRF, 1 ), LDU, |
317 | 1 | equemene | $ U( NRF, 1 ), LDU, WORK( NWORK1 ), INFO ) |
318 | 1 | equemene | CALL DCOPY( NRP1, VT( NRF, 1 ), 1, WORK( VFI ), 1 ) |
319 | 1 | equemene | CALL DCOPY( NRP1, VT( NRF, NRP1 ), 1, WORK( VLI ), 1 ) |
320 | 1 | equemene | END IF |
321 | 1 | equemene | IF( INFO.NE.0 ) THEN |
322 | 1 | equemene | RETURN |
323 | 1 | equemene | END IF |
324 | 1 | equemene | DO 20 J = 1, NR |
325 | 1 | equemene | IWORK( IDXQI+J ) = J |
326 | 1 | equemene | 20 CONTINUE |
327 | 1 | equemene | 30 CONTINUE |
328 | 1 | equemene | * |
329 | 1 | equemene | * Now conquer each subproblem bottom-up. |
330 | 1 | equemene | * |
331 | 1 | equemene | J = 2**NLVL |
332 | 1 | equemene | DO 50 LVL = NLVL, 1, -1 |
333 | 1 | equemene | LVL2 = LVL*2 - 1 |
334 | 1 | equemene | * |
335 | 1 | equemene | * Find the first node LF and last node LL on |
336 | 1 | equemene | * the current level LVL. |
337 | 1 | equemene | * |
338 | 1 | equemene | IF( LVL.EQ.1 ) THEN |
339 | 1 | equemene | LF = 1 |
340 | 1 | equemene | LL = 1 |
341 | 1 | equemene | ELSE |
342 | 1 | equemene | LF = 2**( LVL-1 ) |
343 | 1 | equemene | LL = 2*LF - 1 |
344 | 1 | equemene | END IF |
345 | 1 | equemene | DO 40 I = LF, LL |
346 | 1 | equemene | IM1 = I - 1 |
347 | 1 | equemene | IC = IWORK( INODE+IM1 ) |
348 | 1 | equemene | NL = IWORK( NDIML+IM1 ) |
349 | 1 | equemene | NR = IWORK( NDIMR+IM1 ) |
350 | 1 | equemene | NLF = IC - NL |
351 | 1 | equemene | NRF = IC + 1 |
352 | 1 | equemene | IF( I.EQ.LL ) THEN |
353 | 1 | equemene | SQREI = SQRE |
354 | 1 | equemene | ELSE |
355 | 1 | equemene | SQREI = 1 |
356 | 1 | equemene | END IF |
357 | 1 | equemene | VFI = VF + NLF - 1 |
358 | 1 | equemene | VLI = VL + NLF - 1 |
359 | 1 | equemene | IDXQI = IDXQ + NLF - 1 |
360 | 1 | equemene | ALPHA = D( IC ) |
361 | 1 | equemene | BETA = E( IC ) |
362 | 1 | equemene | IF( ICOMPQ.EQ.0 ) THEN |
363 | 1 | equemene | CALL DLASD6( ICOMPQ, NL, NR, SQREI, D( NLF ), |
364 | 1 | equemene | $ WORK( VFI ), WORK( VLI ), ALPHA, BETA, |
365 | 1 | equemene | $ IWORK( IDXQI ), PERM, GIVPTR( 1 ), GIVCOL, |
366 | 1 | equemene | $ LDGCOL, GIVNUM, LDU, POLES, DIFL, DIFR, Z, |
367 | 1 | equemene | $ K( 1 ), C( 1 ), S( 1 ), WORK( NWORK1 ), |
368 | 1 | equemene | $ IWORK( IWK ), INFO ) |
369 | 1 | equemene | ELSE |
370 | 1 | equemene | J = J - 1 |
371 | 1 | equemene | CALL DLASD6( ICOMPQ, NL, NR, SQREI, D( NLF ), |
372 | 1 | equemene | $ WORK( VFI ), WORK( VLI ), ALPHA, BETA, |
373 | 1 | equemene | $ IWORK( IDXQI ), PERM( NLF, LVL ), |
374 | 1 | equemene | $ GIVPTR( J ), GIVCOL( NLF, LVL2 ), LDGCOL, |
375 | 1 | equemene | $ GIVNUM( NLF, LVL2 ), LDU, |
376 | 1 | equemene | $ POLES( NLF, LVL2 ), DIFL( NLF, LVL ), |
377 | 1 | equemene | $ DIFR( NLF, LVL2 ), Z( NLF, LVL ), K( J ), |
378 | 1 | equemene | $ C( J ), S( J ), WORK( NWORK1 ), |
379 | 1 | equemene | $ IWORK( IWK ), INFO ) |
380 | 1 | equemene | END IF |
381 | 1 | equemene | IF( INFO.NE.0 ) THEN |
382 | 1 | equemene | RETURN |
383 | 1 | equemene | END IF |
384 | 1 | equemene | 40 CONTINUE |
385 | 1 | equemene | 50 CONTINUE |
386 | 1 | equemene | * |
387 | 1 | equemene | RETURN |
388 | 1 | equemene | * |
389 | 1 | equemene | * End of DLASDA |
390 | 1 | equemene | * |
391 | 1 | equemene | END |