GCC Code Coverage Report


Directory: ./
File: src/sys/slepcsc.c
Date: 2026-05-04 03:58:11
Exec Total Coverage
Lines: 170 180 94.4%
Functions: 15 15 100.0%
Branches: 235 428 54.9%

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 23668191 PetscErrorCode SlepcSCCompare(SlepcSC sc,PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *res)
41 {
42 23668191 PetscScalar re[2],im[2];
43 23668191 PetscInt cin[2];
44 23668191 PetscBool inside[2];
45
46
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
23668191 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.
23668191 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.
4474055 PetscCheck(sc->comparison,PETSC_COMM_SELF,PETSC_ERR_USER,"Undefined comparison function");
50 #endif
51 23668191 re[0] = ar; re[1] = br;
52 23668191 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.
23668191 if (sc->map) PetscCall((*sc->map)(sc->mapobj,2,re,im));
54
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
23668191 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.
900030 PetscCall(RGCheckInside(sc->rg,2,re,im,cin));
56 900030 inside[0] = PetscNot(cin[0]<0);
57 900030 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.
900030 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.
806534 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.
794861 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.
22768161 } 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.
4474055 PetscFunctionReturn(PETSC_SUCCESS);
63 }
64
65 13602 static PetscErrorCode SlepcSortEigenvalues_Private(SlepcSC sc,PetscInt n,PetscScalar *eigr,PetscScalar *eigi,PetscInt *perm,PetscBool flg)
66 {
67 13602 PetscScalar re,im;
68 13602 PetscInt i,j,result,tmp;
69
70
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
13602 PetscFunctionBegin;
71 /* insertion sort */
72
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
140400 for (i=n-1;i>=0;i--) {
73 126798 re = eigr[perm[i]];
74 126798 im = eigi[perm[i]];
75 126798 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.
64913 if (im!=0 && (re!=0 || !flg)) {
78 /* complex eigenvalue */
79 1640 i--;
80 1640 im = eigi[perm[i]];
81 }
82 #endif
83
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1880690 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.
1853951 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.
1853951 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.
1161299 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.
1161264 if (eigi[perm[j]] == 0.0 || (flg && eigr[perm[j]] == 0.0)) {
90 #endif
91 1753857 tmp = perm[j-1]; perm[j-1] = perm[j]; perm[j] = tmp;
92 1753857 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.
2621 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 scalars)
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 13567 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.
13567 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.
13567 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.
13567 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.
13567 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.
13567 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.
13567 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.
2614 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 scalars)
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 18940530 PetscErrorCode SlepcMap_ST(PetscObject obj,PetscInt n,PetscScalar *eigr,PetscScalar *eigi)
195 {
196
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
18940530 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.
18940530 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.
3837636 PetscFunctionReturn(PETSC_SUCCESS);
199 }
200
201 10415037 PetscErrorCode SlepcCompareLargestMagnitude(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,PetscCtx ctx)
202 {
203 10415037 PetscReal a,b;
204
205
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
10415037 PetscFunctionBegin;
206 10415037 a = SlepcAbsEigenvalue(ar,ai);
207 10415037 b = SlepcAbsEigenvalue(br,bi);
208
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
10415037 if (a<b) *result = 1;
209
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
7317157 else if (a>b) *result = -1;
210 14986 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.
10415037 PetscFunctionReturn(PETSC_SUCCESS);
212 }
213
214 632476 PetscErrorCode SlepcCompareSmallestMagnitude(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,PetscCtx ctx)
215 {
216 632476 PetscReal a,b;
217
218
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
632476 PetscFunctionBegin;
219 632476 a = SlepcAbsEigenvalue(ar,ai);
220 632476 b = SlepcAbsEigenvalue(br,bi);
221
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
632476 if (a>b) *result = 1;
222
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
400530 else if (a<b) *result = -1;
223 301 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.
632476 PetscFunctionReturn(PETSC_SUCCESS);
225 }
226
227 2799314 PetscErrorCode SlepcCompareLargestReal(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,PetscCtx ctx)
228 {
229 2799314 PetscReal a,b;
230
231
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2799314 PetscFunctionBegin;
232 2799314 a = PetscRealPart(ar);
233 2799314 b = PetscRealPart(br);
234
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2799314 if (a<b) *result = 1;
235
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2136639 else if (a>b) *result = -1;
236 5041 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.
2799314 PetscFunctionReturn(PETSC_SUCCESS);
238 }
239
240 2112225 PetscErrorCode SlepcCompareSmallestReal(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,PetscCtx ctx)
241 {
242 2112225 PetscReal a,b;
243
244
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2112225 PetscFunctionBegin;
245 2112225 a = PetscRealPart(ar);
246 2112225 b = PetscRealPart(br);
247
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2112225 if (a>b) *result = 1;
248
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1261513 else if (a<b) *result = -1;
249 571 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.
2112225 PetscFunctionReturn(PETSC_SUCCESS);
251 }
252
253 32871 PetscErrorCode SlepcCompareLargestImaginary(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,PetscCtx ctx)
254 {
255 32871 PetscReal a,b;
256
257
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
32871 PetscFunctionBegin;
258 #if defined(PETSC_USE_COMPLEX)
259 20870 a = PetscImaginaryPart(ar);
260 20870 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.
32871 if (a<b) *result = 1;
266
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 times.
25687 else if (a>b) *result = -1;
267 else { /* break the tie by checking the magnitude */
268 7343 a = SlepcAbsEigenvalue(ar,ai);
269 7343 b = SlepcAbsEigenvalue(br,bi);
270
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
7343 if (a<b) *result = 1;
271
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
6977 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.
32871 PetscFunctionReturn(PETSC_SUCCESS);
275 }
276
277 25610 PetscErrorCode SlepcCompareSmallestImaginary(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,PetscCtx 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 6245166 PetscErrorCode SlepcCompareTargetMagnitude(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,PetscCtx ctx)
302 {
303 6245166 PetscReal a,b;
304 6245166 PetscScalar *target = (PetscScalar*)ctx;
305
306
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
6245166 PetscFunctionBegin;
307 /* complex target only allowed if scalartype=complex */
308 6245166 a = SlepcAbsEigenvalue(ar-(*target),ai);
309 6245166 b = SlepcAbsEigenvalue(br-(*target),bi);
310
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6245166 if (a>b) *result = 1;
311
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4838315 else if (a<b) *result = -1;
312 78 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.
6245166 PetscFunctionReturn(PETSC_SUCCESS);
314 }
315
316 25021 PetscErrorCode SlepcCompareTargetReal(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,PetscCtx 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
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
7784 else if (a<b) *result = -1;
326 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,PetscCtx 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,PetscCtx 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