GCC Code Coverage Report


Directory: ./
File: src/sys/slepcsc.c
Date: 2026-03-16 03:58:17
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 23883499 PetscErrorCode SlepcSCCompare(SlepcSC sc,PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *res)
41 {
42 23883499 PetscScalar re[2],im[2];
43 23883499 PetscInt cin[2];
44 23883499 PetscBool inside[2];
45
46
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
23883499 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.
23883499 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.
4515491 PetscCheck(sc->comparison,PETSC_COMM_SELF,PETSC_ERR_USER,"Undefined comparison function");
50 #endif
51 23883499 re[0] = ar; re[1] = br;
52 23883499 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.
23883499 if (sc->map) PetscCall((*sc->map)(sc->mapobj,2,re,im));
54
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
23883499 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.
908331 PetscCall(RGCheckInside(sc->rg,2,re,im,cin));
56 908331 inside[0] = PetscNot(cin[0]<0);
57 908331 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.
908331 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.
814871 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.
803206 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.
22975168 } 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.
4515491 PetscFunctionReturn(PETSC_SUCCESS);
63 }
64
65 13289 static PetscErrorCode SlepcSortEigenvalues_Private(SlepcSC sc,PetscInt n,PetscScalar *eigr,PetscScalar *eigi,PetscInt *perm,PetscBool flg)
66 {
67 13289 PetscScalar re,im;
68 13289 PetscInt i,j,result,tmp;
69
70
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
13289 PetscFunctionBegin;
71 /* insertion sort */
72
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
137819 for (i=n-1;i>=0;i--) {
73 124530 re = eigr[perm[i]];
74 124530 im = eigi[perm[i]];
75 124530 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.
62646 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.
1880078 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.
1853377 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.
1853377 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.
1162076 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.
1162041 if (eigi[perm[j]] == 0.0 || (flg && eigr[perm[j]] == 0.0)) {
90 #endif
91 1755513 tmp = perm[j-1]; perm[j-1] = perm[j]; perm[j] = tmp;
92 1755513 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.
2568 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 13254 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.
13254 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.
13254 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.
13254 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.
13254 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.
13254 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.
13254 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.
2561 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 18841387 PetscErrorCode SlepcMap_ST(PetscObject obj,PetscInt n,PetscScalar *eigr,PetscScalar *eigi)
195 {
196
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
18841387 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.
18841387 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.
3818743 PetscFunctionReturn(PETSC_SUCCESS);
199 }
200
201 10448512 PetscErrorCode SlepcCompareLargestMagnitude(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,PetscCtx ctx)
202 {
203 10448512 PetscReal a,b;
204
205
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
10448512 PetscFunctionBegin;
206 10448512 a = SlepcAbsEigenvalue(ar,ai);
207 10448512 b = SlepcAbsEigenvalue(br,bi);
208
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
10448512 if (a<b) *result = 1;
209
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
7346512 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.
10448512 PetscFunctionReturn(PETSC_SUCCESS);
212 }
213
214 533850 PetscErrorCode SlepcCompareSmallestMagnitude(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,PetscCtx ctx)
215 {
216 533850 PetscReal a,b;
217
218
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
533850 PetscFunctionBegin;
219 533850 a = SlepcAbsEigenvalue(ar,ai);
220 533850 b = SlepcAbsEigenvalue(br,bi);
221
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
533850 if (a>b) *result = 1;
222
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
313491 else if (a<b) *result = -1;
223 387 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.
533850 PetscFunctionReturn(PETSC_SUCCESS);
225 }
226
227 3110923 PetscErrorCode SlepcCompareLargestReal(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,PetscCtx ctx)
228 {
229 3110923 PetscReal a,b;
230
231
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
3110923 PetscFunctionBegin;
232 3110923 a = PetscRealPart(ar);
233 3110923 b = PetscRealPart(br);
234
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3110923 if (a<b) *result = 1;
235
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2445450 else if (a>b) *result = -1;
236 5038 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.
3110923 PetscFunctionReturn(PETSC_SUCCESS);
238 }
239
240 2078233 PetscErrorCode SlepcCompareSmallestReal(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,PetscCtx ctx)
241 {
242 2078233 PetscReal a,b;
243
244
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2078233 PetscFunctionBegin;
245 2078233 a = PetscRealPart(ar);
246 2078233 b = PetscRealPart(br);
247
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2078233 if (a>b) *result = 1;
248
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1234945 else if (a<b) *result = -1;
249 573 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.
2078233 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 6245686 PetscErrorCode SlepcCompareTargetMagnitude(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,PetscCtx ctx)
302 {
303 6245686 PetscReal a,b;
304 6245686 PetscScalar *target = (PetscScalar*)ctx;
305
306
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
6245686 PetscFunctionBegin;
307 /* complex target only allowed if scalartype=complex */
308 6245686 a = SlepcAbsEigenvalue(ar-(*target),ai);
309 6245686 b = SlepcAbsEigenvalue(br-(*target),bi);
310
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6245686 if (a>b) *result = 1;
311
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4837960 else if (a<b) *result = -1;
312 76 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.
6245686 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.
7787 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