GCC Code Coverage Report


Directory: ./
File: src/sys/slepcsc.c
Date: 2025-10-03 04:28:47
Exec Total Coverage
Lines: 171 180 95.0%
Functions: 15 15 100.0%
Branches: 236 428 55.1%

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 #include <slepc/private/slepcimpl.h> /*I "slepcsys.h" I*/
12 #include <slepcrg.h>
13 #include <slepcst.h>
14
15 /*@
16 SlepcSCCompare - Compares two (possibly complex) values according
17 to a certain criterion.
18
19 Not Collective
20
21 Input Parameters:
22 + sc - the sorting criterion context
23 . ar - real part of the 1st value
24 . ai - imaginary part of the 1st value
25 . br - real part of the 2nd value
26 - bi - imaginary part of the 2nd value
27
28 Output Parameter:
29 . res - result of comparison
30
31 Notes:
32 Returns an integer less than, equal to, or greater than zero if the first
33 value is considered to be respectively less than, equal to, or greater
34 than the second one.
35
36 Level: developer
37
38 .seealso: SlepcSortEigenvalues(), SlepcSC
39 @*/
40 23619766 PetscErrorCode SlepcSCCompare(SlepcSC sc,PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *res)
41 {
42 23619766 PetscScalar re[2],im[2];
43 23619766 PetscInt cin[2];
44 23619766 PetscBool inside[2];
45
46
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
23619766 PetscFunctionBegin;
47
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
23619766 PetscAssertPointer(res,6);
48 #if defined(PETSC_USE_DEBUG)
49
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
4399766 PetscCheck(sc->comparison,PETSC_COMM_SELF,PETSC_ERR_USER,"Undefined comparison function");
50 #endif
51 23619766 re[0] = ar; re[1] = br;
52 23619766 im[0] = ai; im[1] = bi;
53
6/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
23619766 if (sc->map) PetscCall((*sc->map)(sc->mapobj,2,re,im));
54
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
23619766 if (sc->rg) {
55
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
907706 PetscCall(RGCheckInside(sc->rg,2,re,im,cin));
56 907706 inside[0] = PetscNot(cin[0]<0);
57 907706 inside[1] = PetscNot(cin[1]<0);
58
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
907706 if (inside[0] && !inside[1]) *res = -1;
59
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
814773 else if (!inside[0] && inside[1]) *res = 1;
60
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
803134 else PetscCall((*sc->comparison)(re[0],im[0],re[1],im[1],res,sc->comparisonctx));
61
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
22712060 } else PetscCall((*sc->comparison)(re[0],im[0],re[1],im[1],res,sc->comparisonctx));
62
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
4399766 PetscFunctionReturn(PETSC_SUCCESS);
63 }
64
65 12986 static PetscErrorCode SlepcSortEigenvalues_Private(SlepcSC sc,PetscInt n,PetscScalar *eigr,PetscScalar *eigi,PetscInt *perm,PetscBool flg)
66 {
67 12986 PetscScalar re,im;
68 12986 PetscInt i,j,result,tmp;
69
70
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
12986 PetscFunctionBegin;
71 /* insertion sort */
72
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
136199 for (i=n-1;i>=0;i--) {
73 123213 re = eigr[perm[i]];
74 123213 im = eigi[perm[i]];
75 123213 j = i+1;
76 #if !defined(PETSC_USE_COMPLEX)
77
4/4
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
62004 if (im!=0 && (re!=0 || !flg)) {
78 /* complex eigenvalue */
79 1630 i--;
80 1630 im = eigi[perm[i]];
81 }
82 #endif
83
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1878767 while (j<n) {
84
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1852357 PetscCall(SlepcSCCompare(sc,re,im,eigr[perm[j]],eigi[perm[j]],&result));
85
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1852357 if (result<=0) break;
86 #if !defined(PETSC_USE_COMPLEX)
87 /* keep together every complex conjugated eigenpair */
88
3/4
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
1162063 if (!im || (!re && flg)) {
89
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1162028 if (eigi[perm[j]] == 0.0 || (flg && eigr[perm[j]] == 0.0)) {
90 #endif
91 1755519 tmp = perm[j-1]; perm[j-1] = perm[j]; perm[j] = tmp;
92 1755519 j++;
93 #if !defined(PETSC_USE_COMPLEX)
94 } else {
95 tmp = perm[j-1]; perm[j-1] = perm[j]; perm[j] = perm[j+1]; perm[j+1] = tmp;
96 j+=2;
97 }
98 } else {
99
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.
35 if (eigi[perm[j]] == 0.0 || (flg && eigr[perm[j]] == 0.0)) {
100 tmp = perm[j-2]; perm[j-2] = perm[j]; perm[j] = perm[j-1]; perm[j-1] = tmp;
101 j++;
102 } else {
103 35 tmp = perm[j-2]; perm[j-2] = perm[j]; perm[j] = tmp;
104 35 tmp = perm[j-1]; perm[j-1] = perm[j+1]; perm[j+1] = tmp;
105 35 j+=2;
106 }
107 }
108 #endif
109 }
110 }
111
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
2505 PetscFunctionReturn(PETSC_SUCCESS);
112 }
113 /*@
114 SlepcSortEigenvalues - Sorts a list of eigenvalues according to the
115 sorting criterion specified in a SlepcSC context.
116
117 Not Collective
118
119 Input Parameters:
120 + sc - the sorting criterion context
121 . n - number of eigenvalues in the list
122 . eigr - pointer to the array containing the eigenvalues
123 - eigi - imaginary part of the eigenvalues (only when using real numbers)
124
125 Output Parameter:
126 . perm - permutation array. Must be initialized to 0:n-1 on input.
127
128 Notes:
129 The result is a list of indices in the original eigenvalue array
130 corresponding to the first n eigenvalues sorted in the specified
131 criterion.
132
133 In real scalars, this functions assumes that complex values come in
134 conjugate pairs that are consecutive (including purely imaginary ones).
135
136 Level: developer
137
138 .seealso: SlepcSCCompare(), SlepcSC
139 @*/
140 12951 PetscErrorCode SlepcSortEigenvalues(SlepcSC sc,PetscInt n,PetscScalar *eigr,PetscScalar *eigi,PetscInt *perm)
141 {
142
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
12951 PetscFunctionBegin;
143
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
12951 PetscAssertPointer(sc,1);
144
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
12951 PetscAssertPointer(eigr,3);
145
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
12951 PetscAssertPointer(eigi,4);
146
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
12951 PetscAssertPointer(perm,5);
147
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
12951 PetscCall(SlepcSortEigenvalues_Private(sc,n,eigr,eigi,perm,PETSC_FALSE));
148
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
2498 PetscFunctionReturn(PETSC_SUCCESS);
149 }
150
151 /*@
152 SlepcSortEigenvaluesSpecial - Sorts a list of eigenvalues according to the
153 sorting criterion specified in a SlepcSC context, with a special assumption
154 on the input values.
155
156 Not Collective
157
158 Input Parameters:
159 + sc - the sorting criterion context
160 . n - number of eigenvalues in the list
161 . eigr - pointer to the array containing the eigenvalues
162 - eigi - imaginary part of the eigenvalues (only when using real numbers)
163
164 Output Parameter:
165 . perm - permutation array. Must be initialized to 0:n-1 on input.
166
167 Notes:
168 The result is a list of indices in the original eigenvalue array
169 corresponding to the first n eigenvalues sorted in the specified
170 criterion.
171
172 In real scalars, this functions assumes that complex values come in
173 conjugate pairs that are consecutive, but not purely imaginary ones in which
174 case only the one with positive imaginary part appears.
175
176 Level: developer
177
178 .seealso: SlepcSCCompare(), SlepcSC
179 @*/
180 35 PetscErrorCode SlepcSortEigenvaluesSpecial(SlepcSC sc,PetscInt n,PetscScalar *eigr,PetscScalar *eigi,PetscInt *perm)
181 {
182
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
35 PetscFunctionBegin;
183
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
35 PetscAssertPointer(sc,1);
184
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
35 PetscAssertPointer(eigr,3);
185
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
35 PetscAssertPointer(eigi,4);
186
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
35 PetscAssertPointer(perm,5);
187
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
35 PetscCall(SlepcSortEigenvalues_Private(sc,n,eigr,eigi,perm,PETSC_TRUE));
188
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.
7 PetscFunctionReturn(PETSC_SUCCESS);
189 }
190
191 /*
192 SlepcMap_ST - Gateway function to call STBackTransform from outside ST.
193 */
194 18650870 PetscErrorCode SlepcMap_ST(PetscObject obj,PetscInt n,PetscScalar* eigr,PetscScalar* eigi)
195 {
196
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
18650870 PetscFunctionBegin;
197
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
18650870 PetscCall(STBackTransform((ST)obj,n,eigr,eigi));
198
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
3730839 PetscFunctionReturn(PETSC_SUCCESS);
199 }
200
201 10390080 PetscErrorCode SlepcCompareLargestMagnitude(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,void *ctx)
202 {
203 10390080 PetscReal a,b;
204
205
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
10390080 PetscFunctionBegin;
206 10390080 a = SlepcAbsEigenvalue(ar,ai);
207 10390080 b = SlepcAbsEigenvalue(br,bi);
208
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
10390080 if (a<b) *result = 1;
209
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
7300981 else if (a>b) *result = -1;
210 14941 else *result = 0;
211
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
10390080 PetscFunctionReturn(PETSC_SUCCESS);
212 }
213
214 412982 PetscErrorCode SlepcCompareSmallestMagnitude(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,void *ctx)
215 {
216 412982 PetscReal a,b;
217
218
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
412982 PetscFunctionBegin;
219 412982 a = SlepcAbsEigenvalue(ar,ai);
220 412982 b = SlepcAbsEigenvalue(br,bi);
221
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
412982 if (a>b) *result = 1;
222
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 6 times.
256995 else if (a<b) *result = -1;
223 93 else *result = 0;
224
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
412982 PetscFunctionReturn(PETSC_SUCCESS);
225 }
226
227 3109456 PetscErrorCode SlepcCompareLargestReal(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,void *ctx)
228 {
229 3109456 PetscReal a,b;
230
231
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
3109456 PetscFunctionBegin;
232 3109456 a = PetscRealPart(ar);
233 3109456 b = PetscRealPart(br);
234
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3109456 if (a<b) *result = 1;
235
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2445029 else if (a>b) *result = -1;
236 5033 else *result = 0;
237
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
3109456 PetscFunctionReturn(PETSC_SUCCESS);
238 }
239
240 2008406 PetscErrorCode SlepcCompareSmallestReal(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,void *ctx)
241 {
242 2008406 PetscReal a,b;
243
244
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2008406 PetscFunctionBegin;
245 2008406 a = PetscRealPart(ar);
246 2008406 b = PetscRealPart(br);
247
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2008406 if (a>b) *result = 1;
248
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1175994 else if (a<b) *result = -1;
249 557 else *result = 0;
250
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
2008406 PetscFunctionReturn(PETSC_SUCCESS);
251 }
252
253 32915 PetscErrorCode SlepcCompareLargestImaginary(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,void *ctx)
254 {
255 32915 PetscReal a,b;
256
257
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
32915 PetscFunctionBegin;
258 #if defined(PETSC_USE_COMPLEX)
259 20914 a = PetscImaginaryPart(ar);
260 20914 b = PetscImaginaryPart(br);
261 #else
262 12001 a = PetscAbsReal(ai);
263 12001 b = PetscAbsReal(bi);
264 #endif
265
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
32915 if (a<b) *result = 1;
266
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 times.
25740 else if (a>b) *result = -1;
267 else { /* break the tie by checking the magnitude */
268 7346 a = SlepcAbsEigenvalue(ar,ai);
269 7346 b = SlepcAbsEigenvalue(br,bi);
270
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
7346 if (a<b) *result = 1;
271
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
6981 else if (a>b) *result = -1;
272 else *result = 0;
273 }
274
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
32915 PetscFunctionReturn(PETSC_SUCCESS);
275 }
276
277 25610 PetscErrorCode SlepcCompareSmallestImaginary(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,void *ctx)
278 {
279 25610 PetscReal a,b;
280
281
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
25610 PetscFunctionBegin;
282 #if defined(PETSC_USE_COMPLEX)
283 22085 a = PetscImaginaryPart(ar);
284 22085 b = PetscImaginaryPart(br);
285 #else
286 3525 a = PetscAbsReal(ai);
287 3525 b = PetscAbsReal(bi);
288 #endif
289
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
25610 if (a>b) *result = 1;
290
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 times.
20695 else if (a<b) *result = -1;
291 else { /* break the tie by checking the magnitude */
292 2955 a = SlepcAbsEigenvalue(ar,ai);
293 2955 b = SlepcAbsEigenvalue(br,bi);
294
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
2955 if (a<b) *result = 1;
295
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
1220 else if (a>b) *result = -1;
296 else *result = 0;
297 }
298
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
25610 PetscFunctionReturn(PETSC_SUCCESS);
299 }
300
301 6232483 PetscErrorCode SlepcCompareTargetMagnitude(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,void *ctx)
302 {
303 6232483 PetscReal a,b;
304 6232483 PetscScalar *target = (PetscScalar*)ctx;
305
306
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
6232483 PetscFunctionBegin;
307 /* complex target only allowed if scalartype=complex */
308 6232483 a = SlepcAbsEigenvalue(ar-(*target),ai);
309 6232483 b = SlepcAbsEigenvalue(br-(*target),bi);
310
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6232483 if (a>b) *result = 1;
311
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4825919 else if (a<b) *result = -1;
312 73 else *result = 0;
313
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
6232483 PetscFunctionReturn(PETSC_SUCCESS);
314 }
315
316 25021 PetscErrorCode SlepcCompareTargetReal(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,void *ctx)
317 {
318 25021 PetscReal a,b;
319 25021 PetscScalar *target = (PetscScalar*)ctx;
320
321
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
25021 PetscFunctionBegin;
322 25021 a = PetscAbsReal(PetscRealPart(ar-(*target)));
323 25021 b = PetscAbsReal(PetscRealPart(br-(*target)));
324
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
25021 if (a>b) *result = 1;
325
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 1 times.
7791 else if (a<b) *result = -1;
326 2 else *result = 0;
327
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
25021 PetscFunctionReturn(PETSC_SUCCESS);
328 }
329
330 14205 PetscErrorCode SlepcCompareTargetImaginary(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,void *ctx)
331 {
332 #if defined(PETSC_USE_COMPLEX)
333 14205 PetscReal a,b;
334 14205 PetscScalar *target = (PetscScalar*)ctx;
335 #endif
336
337
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
14205 PetscFunctionBegin;
338 #if defined(PETSC_USE_COMPLEX)
339 14205 a = PetscAbsReal(PetscImaginaryPart(ar-(*target)));
340 14205 b = PetscAbsReal(PetscImaginaryPart(br-(*target)));
341
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
14205 if (a>b) *result = 1;
342
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
10590 else if (a<b) *result = -1;
343 else *result = 0;
344 #else
345 *result = 0;
346 #endif
347
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.
14205 PetscFunctionReturn(PETSC_SUCCESS);
348 }
349
350 /*
351 Used in the SVD for computing smallest singular values
352 from the cyclic matrix.
353 */
354 90365 PetscErrorCode SlepcCompareSmallestPosReal(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,void *ctx)
355 {
356 90365 PetscReal a,b;
357 90365 PetscBool aisright,bisright;
358
359
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
90365 PetscFunctionBegin;
360
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
90365 if (PetscRealPart(ar)>0.0) aisright = PETSC_TRUE;
361 14790 else aisright = PETSC_FALSE;
362
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
90365 if (PetscRealPart(br)>0.0) bisright = PETSC_TRUE;
363 65185 else bisright = PETSC_FALSE;
364
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
90365 if (aisright == bisright) { /* same sign */
365 37130 a = SlepcAbsEigenvalue(ar,ai);
366 37130 b = SlepcAbsEigenvalue(br,bi);
367
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
37130 if (a>b) *result = 1;
368
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
9885 else if (a<b) *result = -1;
369 else *result = 0;
370
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
53235 } else if (aisright && !bisright) *result = -1; /* 'a' is on the right */
371 1420 else *result = 1; /* 'b' is on the right */
372
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
90365 PetscFunctionReturn(PETSC_SUCCESS);
373 }
374