Line | Branch | Exec | Source |
---|---|---|---|
1 | /* | ||
2 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
3 | SLEPc - Scalable Library for Eigenvalue Problem Computations | ||
4 | Copyright (c) 2002-, Universitat Politecnica de Valencia, Spain | ||
5 | |||
6 | This file is part of SLEPc. | ||
7 | SLEPc is distributed under a 2-clause BSD license (see LICENSE). | ||
8 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
9 | */ | ||
10 | /* | ||
11 | BDC - Block-divide and conquer (see description in README file) | ||
12 | */ | ||
13 | |||
14 | #include <slepc/private/dsimpl.h> | ||
15 | #include <slepcblaslapack.h> | ||
16 | |||
17 | 105 | PetscErrorCode BDC_dlaed3m_(const char *jobz,const char *defl,PetscBLASInt k,PetscBLASInt n, | |
18 | PetscBLASInt n1,PetscReal *d,PetscReal *q,PetscBLASInt ldq, | ||
19 | PetscReal rho,PetscReal *dlamda,PetscReal *q2,PetscBLASInt *indx, | ||
20 | PetscBLASInt *ctot,PetscReal *w,PetscReal *s,PetscBLASInt *info, | ||
21 | PetscBLASInt jobz_len,PetscBLASInt defl_len) | ||
22 | { | ||
23 | /* -- Routine written in LAPACK version 3.0 style -- */ | ||
24 | /* *************************************************** */ | ||
25 | /* Written by */ | ||
26 | /* Michael Moldaschl and Wilfried Gansterer */ | ||
27 | /* University of Vienna */ | ||
28 | /* last modification: March 16, 2014 */ | ||
29 | |||
30 | /* Small adaptations of original code written by */ | ||
31 | /* Wilfried Gansterer and Bob Ward, */ | ||
32 | /* Department of Computer Science, University of Tennessee */ | ||
33 | /* see https://doi.org/10.1137/S1064827501399432 */ | ||
34 | /* *************************************************** */ | ||
35 | |||
36 | /* Purpose */ | ||
37 | /* ======= */ | ||
38 | |||
39 | /* DLAED3M finds the roots of the secular equation, as defined by the */ | ||
40 | /* values in D, W, and RHO, between 1 and K. It makes the */ | ||
41 | /* appropriate calls to DLAED4 and then updates the eigenvectors by */ | ||
42 | /* multiplying the matrix of eigenvectors of the pair of eigensystems */ | ||
43 | /* being combined by the matrix of eigenvectors of the K-by-K system */ | ||
44 | /* which is solved here. */ | ||
45 | |||
46 | /* This code makes very mild assumptions about floating point */ | ||
47 | /* arithmetic. It will work on machines with a guard digit in */ | ||
48 | /* add/subtract, or on those binary machines without guard digits */ | ||
49 | /* which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or Cray-2. */ | ||
50 | /* It could conceivably fail on hexadecimal or decimal machines */ | ||
51 | /* without guard digits, but we know of none. */ | ||
52 | |||
53 | /* Arguments */ | ||
54 | /* ========= */ | ||
55 | |||
56 | /* JOBZ (input) CHARACTER*1 */ | ||
57 | /* = 'N': Do not accumulate eigenvectors (not implemented); */ | ||
58 | /* = 'D': Do accumulate eigenvectors in the divide-and-conquer */ | ||
59 | /* process. */ | ||
60 | |||
61 | /* DEFL (input) CHARACTER*1 */ | ||
62 | /* = '0': No deflation happened in DSRTDF */ | ||
63 | /* = '1': Some deflation happened in DSRTDF (and therefore some */ | ||
64 | /* Givens rotations need to be applied to the computed */ | ||
65 | /* eigenvector matrix Q) */ | ||
66 | |||
67 | /* K (input) INTEGER */ | ||
68 | /* The number of terms in the rational function to be solved by */ | ||
69 | /* DLAED4. 0 <= K <= N. */ | ||
70 | |||
71 | /* N (input) INTEGER */ | ||
72 | /* The number of rows and columns in the Q matrix. */ | ||
73 | /* N >= K (deflation may result in N>K). */ | ||
74 | |||
75 | /* N1 (input) INTEGER */ | ||
76 | /* The location of the last eigenvalue in the leading submatrix. */ | ||
77 | /* min(1,N) <= N1 <= max(1,N-1). */ | ||
78 | |||
79 | /* D (output) DOUBLE PRECISION array, dimension (N) */ | ||
80 | /* D(I) contains the updated eigenvalues for */ | ||
81 | /* 1 <= I <= K. */ | ||
82 | |||
83 | /* Q (output) DOUBLE PRECISION array, dimension (LDQ,N) */ | ||
84 | /* Initially the first K columns are used as workspace. */ | ||
85 | /* On output the columns 1 to K contain */ | ||
86 | /* the updated eigenvectors. */ | ||
87 | |||
88 | /* LDQ (input) INTEGER */ | ||
89 | /* The leading dimension of the array Q. LDQ >= max(1,N). */ | ||
90 | |||
91 | /* RHO (input) DOUBLE PRECISION */ | ||
92 | /* The value of the parameter in the rank one update equation. */ | ||
93 | /* RHO >= 0 required. */ | ||
94 | |||
95 | /* DLAMDA (input/output) DOUBLE PRECISION array, dimension (K) */ | ||
96 | /* The first K elements of this array contain the old roots */ | ||
97 | /* of the deflated updating problem. These are the poles */ | ||
98 | /* of the secular equation. May be changed on output by */ | ||
99 | /* having lowest order bit set to zero on Cray X-MP, Cray Y-MP, */ | ||
100 | /* Cray-2, or Cray C-90, as described above. */ | ||
101 | |||
102 | /* Q2 (input) DOUBLE PRECISION array, dimension (LDQ2, N) */ | ||
103 | /* The first K columns of this matrix contain the non-deflated */ | ||
104 | /* eigenvectors for the split problem. */ | ||
105 | |||
106 | /* INDX (input) INTEGER array, dimension (N) */ | ||
107 | /* The permutation used to arrange the columns of the deflated */ | ||
108 | /* Q matrix into three groups (see DLAED2). */ | ||
109 | /* The rows of the eigenvectors found by DLAED4 must be likewise */ | ||
110 | /* permuted before the matrix multiply can take place. */ | ||
111 | |||
112 | /* CTOT (input) INTEGER array, dimension (4) */ | ||
113 | /* A count of the total number of the various types of columns */ | ||
114 | /* in Q, as described in INDX. The fourth column type is any */ | ||
115 | /* column which has been deflated. */ | ||
116 | |||
117 | /* W (input/output) DOUBLE PRECISION array, dimension (K) */ | ||
118 | /* The first K elements of this array contain the components */ | ||
119 | /* of the deflation-adjusted updating vector. Destroyed on */ | ||
120 | /* output. */ | ||
121 | |||
122 | /* S (workspace) DOUBLE PRECISION array, dimension */ | ||
123 | /* (MAX(CTOT(1)+CTOT(2),CTOT(2)+CTOT(3)) + 1)*K */ | ||
124 | /* Will contain parts of the eigenvectors of the repaired matrix */ | ||
125 | /* which will be multiplied by the previously accumulated */ | ||
126 | /* eigenvectors to update the system. This array is a major */ | ||
127 | /* source of workspace requirements ! */ | ||
128 | |||
129 | /* INFO (output) INTEGER */ | ||
130 | /* = 0: successful exit. */ | ||
131 | /* < 0: if INFO = -i, the i-th argument had an illegal value. */ | ||
132 | /* > 0: if INFO = i, eigenpair i was not computed successfully */ | ||
133 | |||
134 | /* Further Details */ | ||
135 | /* =============== */ | ||
136 | |||
137 | /* Based on code written by */ | ||
138 | /* Wilfried Gansterer and Bob Ward, */ | ||
139 | /* Department of Computer Science, University of Tennessee */ | ||
140 | /* Based on the design of the LAPACK code DLAED3 with small modifications */ | ||
141 | /* (Note that in contrast to the original DLAED3, this routine */ | ||
142 | /* DOES NOT require that N1 <= N/2) */ | ||
143 | |||
144 | /* Based on contributions by */ | ||
145 | /* Jeff Rutter, Computer Science Division, University of California */ | ||
146 | /* at Berkeley, USA */ | ||
147 | /* Modified by Francoise Tisseur, University of Tennessee. */ | ||
148 | |||
149 | /* ===================================================================== */ | ||
150 | |||
151 | 105 | PetscReal temp, done = 1.0, dzero = 0.0; | |
152 | 105 | PetscBLASInt i, j, n2, n12, ii, n23, iq2, i1, one=1; | |
153 | |||
154 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
105 | PetscFunctionBegin; |
155 | 105 | *info = 0; | |
156 | |||
157 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
|
105 | if (k < 0) *info = -3; |
158 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
|
105 | else if (n < k) *info = -4; |
159 |
2/4✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
|
105 | else if (n1 < PetscMin(1,n) || n1 > PetscMax(1,n)) *info = -5; |
160 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
|
105 | else if (ldq < PetscMax(1,n)) *info = -8; |
161 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
|
105 | else if (rho < 0.) *info = -9; |
162 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
105 | PetscCheck(!*info,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Wrong argument %" PetscBLASInt_FMT " in DLAED3M",-(*info)); |
163 | |||
164 | /* Quick return if possible */ | ||
165 | |||
166 |
2/14✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
105 | if (k == 0) PetscFunctionReturn(PETSC_SUCCESS); |
167 | |||
168 | /* Modify values DLAMDA(i) to make sure all DLAMDA(i)-DLAMDA(j) can */ | ||
169 | /* be computed with high relative accuracy (barring over/underflow). */ | ||
170 | /* This is a problem on machines without a guard digit in */ | ||
171 | /* add/subtract (Cray XMP, Cray YMP, Cray C 90 and Cray 2). */ | ||
172 | /* The following code replaces DLAMDA(I) by 2*DLAMDA(I)-DLAMDA(I), */ | ||
173 | /* which on any of these machines zeros out the bottommost */ | ||
174 | /* bit of DLAMDA(I) if it is 1; this makes the subsequent */ | ||
175 | /* subtractions DLAMDA(I)-DLAMDA(J) unproblematic when cancellation */ | ||
176 | /* occurs. On binary machines with a guard digit (almost all */ | ||
177 | /* machines) it does not change DLAMDA(I) at all. On hexadecimal */ | ||
178 | /* and decimal machines with a guard digit, it slightly */ | ||
179 | /* changes the bottommost bits of DLAMDA(I). It does not account */ | ||
180 | /* for hexadecimal or decimal machines without guard digits */ | ||
181 | /* (we know of none). We use a subroutine call to compute */ | ||
182 | /* 2*DLAMBDA(I) to prevent optimizing compilers from eliminating */ | ||
183 | /* this code. */ | ||
184 | |||
185 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
905 | for (i = 0; i < k; ++i) { |
186 | 800 | dlamda[i] = LAPACKlamc3_(&dlamda[i], &dlamda[i]) - dlamda[i]; | |
187 | } | ||
188 | |||
189 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
905 | for (j = 1; j <= k; ++j) { |
190 | |||
191 | /* ....calling DLAED4 for eigenpair J.... */ | ||
192 | |||
193 |
10/20✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
800 | PetscCallBLAS("LAPACKlaed4",LAPACKlaed4_(&k, &j, dlamda, w, &q[(j-1)*ldq], &rho, &d[j-1], info)); |
194 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
800 | SlepcCheckLapackInfo("laed4",*info); |
195 | |||
196 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
800 | if (j < k) { |
197 | |||
198 | /* If the zero finder terminated properly, but the computed */ | ||
199 | /* eigenvalues are not ordered, issue an error statement */ | ||
200 | /* but continue computation. */ | ||
201 | |||
202 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
695 | PetscCheck(dlamda[j-1]<dlamda[j],PETSC_COMM_SELF,PETSC_ERR_FP,"DLAMDA(%" PetscBLASInt_FMT ") is greater or equal than DLAMDA(%" PetscBLASInt_FMT ")", j, j+1); |
203 |
2/6✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
800 | PetscCheck(d[j-1]>=dlamda[j-1] && d[j-1]<=dlamda[j],PETSC_COMM_SELF,PETSC_ERR_FP,"DLAMDA(%" PetscBLASInt_FMT ") = %g D(%" PetscBLASInt_FMT ") = %g DLAMDA(%" PetscBLASInt_FMT ") = %g", j, (double)dlamda[j-1], j, (double)d[j-1], j+1, (double)dlamda[j]); |
204 | } | ||
205 | } | ||
206 | |||
207 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
|
105 | if (k == 1) goto L110; |
208 | |||
209 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
105 | if (k == 2) { |
210 | |||
211 | /* permute the components of Q(:,J) (the information returned by DLAED4 */ | ||
212 | /* necessary to construct the eigenvectors) according to the permutation */ | ||
213 | /* stored in INDX, resulting from deflation */ | ||
214 | |||
215 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
30 | for (j = 0; j < k; ++j) { |
216 | 20 | w[0] = q[0+j*ldq]; | |
217 | 20 | w[1] = q[1+j*ldq]; | |
218 | 20 | ii = indx[0]; | |
219 | 20 | q[0+j*ldq] = w[ii-1]; | |
220 | 20 | ii = indx[1]; | |
221 | 20 | q[1+j*ldq] = w[ii-1]; | |
222 | } | ||
223 | 10 | goto L110; | |
224 | } | ||
225 | |||
226 | /* ....K.GE.3.... */ | ||
227 | /* Compute updated W (used for computing the eigenvectors corresponding */ | ||
228 | /* to the previously computed eigenvalues). */ | ||
229 | |||
230 |
10/20✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
95 | PetscCallBLAS("BLAScopy",BLAScopy_(&k, w, &one, s, &one)); |
231 | |||
232 | /* Initialize W(I) = Q(I,I) */ | ||
233 | |||
234 | 95 | i1 = ldq + 1; | |
235 |
10/20✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
95 | PetscCallBLAS("BLAScopy",BLAScopy_(&k, q, &i1, w, &one)); |
236 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
875 | for (j = 0; j < k; ++j) { |
237 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
4260 | for (i = 0; i < j; ++i) { |
238 | 3480 | w[i] *= q[i+j*ldq] / (dlamda[i] - dlamda[j]); | |
239 | } | ||
240 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
4260 | for (i = j + 1; i < k; ++i) { |
241 | 3480 | w[i] *= q[i+j*ldq] / (dlamda[i] - dlamda[j]); | |
242 | } | ||
243 | } | ||
244 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
875 | for (i = 0; i < k; ++i) { |
245 | 780 | temp = PetscSqrtReal(-w[i]); | |
246 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
|
780 | if (temp<0) temp = -temp; |
247 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
780 | w[i] = (s[i] >= 0) ? temp : -temp; |
248 | } | ||
249 | |||
250 | /* Compute eigenvectors of the modified rank-1 modification (using the */ | ||
251 | /* vector W). */ | ||
252 | |||
253 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
875 | for (j = 0; j < k; ++j) { |
254 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
8520 | for (i = 0; i < k; ++i) { |
255 | 7740 | s[i] = w[i] / q[i+j*ldq]; | |
256 | } | ||
257 | 780 | temp = BLASnrm2_(&k, s, &one); | |
258 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
9300 | for (i = 0; i < k; ++i) { |
259 | |||
260 | /* apply the permutation resulting from deflation as stored */ | ||
261 | /* in INDX */ | ||
262 | |||
263 | 7740 | ii = indx[i]; | |
264 | 7740 | q[i+j*ldq] = s[ii-1] / temp; | |
265 | } | ||
266 | } | ||
267 | |||
268 | /* ************************************************************************** */ | ||
269 | |||
270 | /* ....updating the eigenvectors.... */ | ||
271 | |||
272 | 95 | L110: | |
273 | |||
274 | 105 | n2 = n - n1; | |
275 | 105 | n12 = ctot[0] + ctot[1]; | |
276 | 105 | n23 = ctot[1] + ctot[2]; | |
277 |
1/2✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
|
105 | if (*(unsigned char *)jobz == 'D') { |
278 | |||
279 | /* Compute the updated eigenvectors. (NOTE that every call of */ | ||
280 | /* DGEMM requires three DISTINCT arrays) */ | ||
281 | |||
282 | /* copy Q(CTOT(1)+1:K,1:K) to S */ | ||
283 | |||
284 |
4/4✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
|
2615 | for (j=0;j<k;j++) for (i=0;i<n23;i++) s[i+j*n23] = q[ctot[0]+i+j*ldq]; |
285 | 105 | iq2 = n1 * n12 + 1; | |
286 | |||
287 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
105 | if (n23 != 0) { |
288 | |||
289 | /* multiply the second part of Q2 (the eigenvectors of the */ | ||
290 | /* lower block) with S and write the result into the lower part of */ | ||
291 | /* Q, i.e., Q(N1+1:N,1:K) */ | ||
292 | |||
293 |
10/20✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
35 | PetscCallBLAS("BLASgemm",BLASgemm_("N", "N", &n2, &k, &n23, &done, |
294 | &q2[iq2-1], &n2, s, &n23, &dzero, &q[n1], &ldq)); | ||
295 | } else { | ||
296 |
3/4✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
|
600 | for (j=0;j<k;j++) for (i=0;i<n2;i++) q[n1+i+j*ldq] = 0.0; |
297 | } | ||
298 | |||
299 | /* copy Q(1:CTOT(1)+CTOT(2),1:K) to S */ | ||
300 | |||
301 |
4/4✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
|
7785 | for (j=0;j<k;j++) for (i=0;i<n12;i++) s[i+j*n12] = q[i+j*ldq]; |
302 | |||
303 |
1/2✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
|
105 | if (n12 != 0) { |
304 | |||
305 | /* multiply the first part of Q2 (the eigenvectors of the */ | ||
306 | /* upper block) with S and write the result into the upper part of */ | ||
307 | /* Q, i.e., Q(1:N1,1:K) */ | ||
308 | |||
309 |
10/20✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
105 | PetscCallBLAS("BLASgemm",BLASgemm_("N", "N", &n1, &k, &n12, &done, |
310 | q2, &n1, s, &n12, &dzero, q, &ldq)); | ||
311 | } else { | ||
312 | ✗ | for (j=0;j<k;j++) for (i=0;i<n1;i++) q[i+j*ldq] = 0.0; | |
313 | } | ||
314 | } | ||
315 |
6/12✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
21 | PetscFunctionReturn(PETSC_SUCCESS); |
316 | } | ||
317 |