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 |