GCC Code Coverage Report


Directory: ./
File: src/sys/slepcsc.c
Date: 2026-02-22 03:58:10
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 19202981 PetscErrorCode SlepcSCCompare(SlepcSC sc,PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *res)
41 {
42 19202981 PetscScalar re[2],im[2];
43 19202981 PetscInt cin[2];
44 19202981 PetscBool inside[2];
45
46
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
19202981 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.
19202981 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.
4518664 PetscCheck(sc->comparison,PETSC_COMM_SELF,PETSC_ERR_USER,"Undefined comparison function");
50 #endif
51 19202981 re[0] = ar; re[1] = br;
52 19202981 im[0] = ai; im[1] = bi;
53
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
19202981 if (sc->map) PetscCall((*sc->map)(sc->mapobj,2,re,im));
54
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
19202981 if (sc->rg) {
55
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
729527 PetscCall(RGCheckInside(sc->rg,2,re,im,cin));
56 729527 inside[0] = PetscNot(cin[0]<0);
57 729527 inside[1] = PetscNot(cin[1]<0);
58
4/4
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
729527 if (inside[0] && !inside[1]) *res = -1;
59
4/4
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
654559 else if (!inside[0] && inside[1]) *res = 1;
60
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
645233 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
18473454 } 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.
4518664 PetscFunctionReturn(PETSC_SUCCESS);
63 }
64
65 10611 static PetscErrorCode SlepcSortEigenvalues_Private(SlepcSC sc,PetscInt n,PetscScalar *eigr,PetscScalar *eigi,PetscInt *perm,PetscBool flg)
66 {
67 10611 PetscScalar re,im;
68 10611 PetscInt i,j,result,tmp;
69
70
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
10611 PetscFunctionBegin;
71 /* insertion sort */
72
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
111027 for (i=n-1;i>=0;i--) {
73 100416 re = eigr[perm[i]];
74 100416 im = eigi[perm[i]];
75 100416 j = i+1;
76 #if !defined(PETSC_USE_COMPLEX)
77
4/4
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 4 times.
50014 if (im!=0 && (re!=0 || !flg)) {
78 /* complex eigenvalue */
79 1322 i--;
80 1322 im = eigi[perm[i]];
81 }
82 #endif
83
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
1538137 while (j<n) {
84
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1516707 PetscCall(SlepcSCCompare(sc,re,im,eigr[perm[j]],eigi[perm[j]],&result));
85
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
1516707 if (result<=0) break;
86 #if !defined(PETSC_USE_COMPLEX)
87 /* keep together every complex conjugated eigenpair */
88
3/4
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
845856 if (!im || (!re && flg)) {
89
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
845828 if (eigi[perm[j]] == 0.0 || (flg && eigr[perm[j]] == 0.0)) {
90 #endif
91 1437693 tmp = perm[j-1]; perm[j-1] = perm[j]; perm[j] = tmp;
92 1437693 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 4 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
28 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 28 tmp = perm[j-2]; perm[j-2] = perm[j]; perm[j] = tmp;
104 28 tmp = perm[j-1]; perm[j-1] = perm[j+1]; perm[j+1] = tmp;
105 28 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 10583 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.
10583 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.
10583 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.
10583 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.
10583 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.
10583 PetscAssertPointer(perm,5);
147
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10583 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 28 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.
28 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.
28 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.
28 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.
28 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.
28 PetscAssertPointer(perm,5);
187
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
28 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 15084539 PetscErrorCode SlepcMap_ST(PetscObject obj,PetscInt n,PetscScalar *eigr,PetscScalar *eigi)
195 {
196
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
15084539 PetscFunctionBegin;
197
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
15084539 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.
3819025 PetscFunctionReturn(PETSC_SUCCESS);
199 }
200
201 8468856 PetscErrorCode SlepcCompareLargestMagnitude(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,PetscCtx ctx)
202 {
203 8468856 PetscReal a,b;
204
205
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
8468856 PetscFunctionBegin;
206 8468856 a = SlepcAbsEigenvalue(ar,ai);
207 8468856 b = SlepcAbsEigenvalue(br,bi);
208
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
8468856 if (a<b) *result = 1;
209
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
5961796 else if (a>b) *result = -1;
210 12150 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.
8468856 PetscFunctionReturn(PETSC_SUCCESS);
212 }
213
214 422710 PetscErrorCode SlepcCompareSmallestMagnitude(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,PetscCtx ctx)
215 {
216 422710 PetscReal a,b;
217
218
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
422710 PetscFunctionBegin;
219 422710 a = SlepcAbsEigenvalue(ar,ai);
220 422710 b = SlepcAbsEigenvalue(br,bi);
221
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
422710 if (a>b) *result = 1;
222
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
246996 else if (a<b) *result = -1;
223 335 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.
422710 PetscFunctionReturn(PETSC_SUCCESS);
225 }
226
227 2563562 PetscErrorCode SlepcCompareLargestReal(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,PetscCtx ctx)
228 {
229 2563562 PetscReal a,b;
230
231
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2563562 PetscFunctionBegin;
232 2563562 a = PetscRealPart(ar);
233 2563562 b = PetscRealPart(br);
234
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
2563562 if (a<b) *result = 1;
235
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
2035481 else if (a>b) *result = -1;
236 4917 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.
2563562 PetscFunctionReturn(PETSC_SUCCESS);
238 }
239
240 1600883 PetscErrorCode SlepcCompareSmallestReal(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,PetscCtx ctx)
241 {
242 1600883 PetscReal a,b;
243
244
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1600883 PetscFunctionBegin;
245 1600883 a = PetscRealPart(ar);
246 1600883 b = PetscRealPart(br);
247
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
1600883 if (a>b) *result = 1;
248
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
936076 else if (a<b) *result = -1;
249 475 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.
1600883 PetscFunctionReturn(PETSC_SUCCESS);
251 }
252
253 26760 PetscErrorCode SlepcCompareLargestImaginary(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,PetscCtx ctx)
254 {
255 26760 PetscReal a,b;
256
257
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
26760 PetscFunctionBegin;
258 #if defined(PETSC_USE_COMPLEX)
259 16696 a = PetscImaginaryPart(ar);
260 16696 b = PetscImaginaryPart(br);
261 #else
262 10064 a = PetscAbsReal(ai);
263 10064 b = PetscAbsReal(bi);
264 #endif
265
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
26760 if (a<b) *result = 1;
266
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 4 times.
20751 else if (a>b) *result = -1;
267 else { /* break the tie by checking the magnitude */
268 5928 a = SlepcAbsEigenvalue(ar,ai);
269 5928 b = SlepcAbsEigenvalue(br,bi);
270
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
5928 if (a<b) *result = 1;
271
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
5635 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.
26760 PetscFunctionReturn(PETSC_SUCCESS);
275 }
276
277 20488 PetscErrorCode SlepcCompareSmallestImaginary(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,PetscCtx ctx)
278 {
279 20488 PetscReal a,b;
280
281
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
20488 PetscFunctionBegin;
282 #if defined(PETSC_USE_COMPLEX)
283 17668 a = PetscImaginaryPart(ar);
284 17668 b = PetscImaginaryPart(br);
285 #else
286 2820 a = PetscAbsReal(ai);
287 2820 b = PetscAbsReal(bi);
288 #endif
289
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
20488 if (a>b) *result = 1;
290
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 4 times.
16556 else if (a<b) *result = -1;
291 else { /* break the tie by checking the magnitude */
292 2364 a = SlepcAbsEigenvalue(ar,ai);
293 2364 b = SlepcAbsEigenvalue(br,bi);
294
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
2364 if (a<b) *result = 1;
295
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
976 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.
20488 PetscFunctionReturn(PETSC_SUCCESS);
299 }
300
301 4974238 PetscErrorCode SlepcCompareTargetMagnitude(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,PetscCtx ctx)
302 {
303 4974238 PetscReal a,b;
304 4974238 PetscScalar *target = (PetscScalar*)ctx;
305
306
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
4974238 PetscFunctionBegin;
307 /* complex target only allowed if scalartype=complex */
308 4974238 a = SlepcAbsEigenvalue(ar-(*target),ai);
309 4974238 b = SlepcAbsEigenvalue(br-(*target),bi);
310
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
4974238 if (a>b) *result = 1;
311
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
3854591 else if (a<b) *result = -1;
312 62 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.
4974238 PetscFunctionReturn(PETSC_SUCCESS);
314 }
315
316 20024 PetscErrorCode SlepcCompareTargetReal(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,PetscCtx ctx)
317 {
318 20024 PetscReal a,b;
319 20024 PetscScalar *target = (PetscScalar*)ctx;
320
321
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
20024 PetscFunctionBegin;
322 20024 a = PetscAbsReal(PetscRealPart(ar-(*target)));
323 20024 b = PetscAbsReal(PetscRealPart(br-(*target)));
324
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
20024 if (a>b) *result = 1;
325
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
6239 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.
20024 PetscFunctionReturn(PETSC_SUCCESS);
328 }
329
330 11364 PetscErrorCode SlepcCompareTargetImaginary(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,PetscCtx ctx)
331 {
332 #if defined(PETSC_USE_COMPLEX)
333 11364 PetscReal a,b;
334 11364 PetscScalar *target = (PetscScalar*)ctx;
335 #endif
336
337
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
11364 PetscFunctionBegin;
338 #if defined(PETSC_USE_COMPLEX)
339 11364 a = PetscAbsReal(PetscImaginaryPart(ar-(*target)));
340 11364 b = PetscAbsReal(PetscImaginaryPart(br-(*target)));
341
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
11364 if (a>b) *result = 1;
342
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
8472 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.
11364 PetscFunctionReturn(PETSC_SUCCESS);
348 }
349
350 /*
351 Used in the SVD for computing smallest singular values
352 from the cyclic matrix.
353 */
354 72292 PetscErrorCode SlepcCompareSmallestPosReal(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *result,PetscCtx ctx)
355 {
356 72292 PetscReal a,b;
357 72292 PetscBool aisright,bisright;
358
359
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
72292 PetscFunctionBegin;
360
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
72292 if (PetscRealPart(ar)>0.0) aisright = PETSC_TRUE;
361 11832 else aisright = PETSC_FALSE;
362
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
72292 if (PetscRealPart(br)>0.0) bisright = PETSC_TRUE;
363 52148 else bisright = PETSC_FALSE;
364
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
72292 if (aisright == bisright) { /* same sign */
365 29704 a = SlepcAbsEigenvalue(ar,ai);
366 29704 b = SlepcAbsEigenvalue(br,bi);
367
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
29704 if (a>b) *result = 1;
368
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
7908 else if (a<b) *result = -1;
369 else *result = 0;
370
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
42588 } else if (aisright && !bisright) *result = -1; /* 'a' is on the right */
371 1136 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.
72292 PetscFunctionReturn(PETSC_SUCCESS);
373 }
374