GCC Code Coverage Report


Directory: ./
File: src/sys/slepcutil.c
Date: 2026-09-29 04:16:25
Exec Total Coverage
Lines: 70 76 92.1%
Functions: 7 8 87.5%
Branches: 169 332 50.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
13 /*
14 Internal functions used to register monitors.
15 */
16 78384 PetscErrorCode SlepcMonitorMakeKey_Internal(const char name[],PetscViewerType vtype,PetscViewerFormat format,char key[])
17 {
18
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
78384 PetscFunctionBegin;
19
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.
78384 PetscCall(PetscStrncpy(key,name,PETSC_MAX_PATH_LEN));
20
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.
78384 PetscCall(PetscStrlcat(key,":",PETSC_MAX_PATH_LEN));
21
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.
78384 PetscCall(PetscStrlcat(key,vtype,PETSC_MAX_PATH_LEN));
22
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.
78384 PetscCall(PetscStrlcat(key,":",PETSC_MAX_PATH_LEN));
23
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.
78384 PetscCall(PetscStrlcat(key,PetscViewerFormats[format],PETSC_MAX_PATH_LEN));
24
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.
15145 PetscFunctionReturn(PETSC_SUCCESS);
25 }
26
27 145 PetscErrorCode PetscViewerAndFormatCreate_Internal(PetscViewer viewer,PetscViewerFormat format,void *ctx,PetscViewerAndFormat **vf)
28 {
29
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
145 PetscFunctionBegin;
30
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.
145 PetscCall(PetscViewerAndFormatCreate(viewer,format,vf));
31 145 (*vf)->data = ctx;
32
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.
145 PetscFunctionReturn(PETSC_SUCCESS);
33 }
34
35 /*
36 Given n vectors in V, this function gets references of them into W.
37 If m<0 then some previous non-processed vectors remain in W and must be freed.
38 */
39 4668 PetscErrorCode SlepcBasisReference_Private(PetscInt n,Vec *V,PetscInt *m,Vec **W)
40 {
41 4668 PetscInt i;
42
43
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
4668 PetscFunctionBegin;
44
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
10666 for (i=0;i<n;i++) PetscCall(PetscObjectReference((PetscObject)V[i]));
45
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.
4668 PetscCall(SlepcBasisDestroy_Private(m,W));
46
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
4668 if (n>0) {
47
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.
4628 PetscCall(PetscMalloc1(n,W));
48
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
10626 for (i=0;i<n;i++) (*W)[i] = V[i];
49 4628 *m = -n;
50 }
51
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.
878 PetscFunctionReturn(PETSC_SUCCESS);
52 }
53
54 /*
55 Destroys a set of vectors.
56 A negative value of m indicates that W contains vectors to be destroyed.
57 */
58 40073 PetscErrorCode SlepcBasisDestroy_Private(PetscInt *m,Vec **W)
59 {
60 40073 PetscInt i;
61
62
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
40073 PetscFunctionBegin;
63
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
40073 if (*m<0) {
64
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
10626 for (i=0;i<-(*m);i++) PetscCall(VecDestroy(&(*W)[i]));
65
5/8
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ 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.
4628 PetscCall(PetscFree(*W));
66 }
67 40073 *m = 0;
68
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.
40073 PetscFunctionReturn(PETSC_SUCCESS);
69 }
70
71 /*@
72 SlepcSNPrintfScalar - Prints a `PetscScalar` variable to a string of
73 given length.
74
75 Not Collective
76
77 Input Parameters:
78 + str - the string to print to
79 . len - the length of str
80 . val - scalar value to be printed
81 - exp - to be used within an expression, print leading sign and parentheses
82 in case of nonzero imaginary part
83
84 Level: developer
85
86 .seealso: `PetscSNPrintf()`
87 @*/
88 3252 PetscErrorCode SlepcSNPrintfScalar(char str[],size_t len,PetscScalar val,PetscBool exp)
89 {
90 #if PetscDefined(USE_COMPLEX)
91 1729 PetscReal re,im;
92 #endif
93
94
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
3252 PetscFunctionBegin;
95 #if !PetscDefined(USE_COMPLEX)
96
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
1523 if (exp) PetscCall(PetscSNPrintf(str,len,"%+g",(double)val));
97
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.
777 else PetscCall(PetscSNPrintf(str,len,"%g",(double)val));
98 #else
99 1729 re = PetscRealPart(val);
100 1729 im = PetscImaginaryPart(val);
101
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
1729 if (im!=0.0) {
102
1/8
✗ 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.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
84 if (exp) PetscCall(PetscSNPrintf(str,len,"+(%g%+gi)",(double)re,(double)im));
103
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.
84 else PetscCall(PetscSNPrintf(str,len,"%g%+gi",(double)re,(double)im));
104 } else {
105
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
1645 if (exp) PetscCall(PetscSNPrintf(str,len,"%+g",(double)re));
106
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.
812 else PetscCall(PetscSNPrintf(str,len,"%g",(double)re));
107 }
108 #endif
109
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.
566 PetscFunctionReturn(PETSC_SUCCESS);
110 }
111
112 /*@
113 SlepcHasExternalPackage - Determine whether SLEPc has been configured with the
114 given package.
115
116 Not Collective
117
118 Input Parameter:
119 . pkg - external package name
120
121 Output Parameter:
122 . has - `PETSC_TRUE` if SLEPc is configured with the given package, else `PETSC_FALSE`
123
124 Level: intermediate
125
126 Notes:
127 This is basically an alternative for `SLEPC_HAVE_XXX` whenever a preprocessor macro
128 is not available/desirable, e.g., in Python.
129
130 The external package name pkg is, e.g., `arpack` or `primme`.
131 It should correspond to the name listed in `./configure --help`.
132
133 The lookup is case insensitive, i.e. looking for `ARPACK` or `arpack` is the same.
134
135 .seealso: [](sec:writing-prog), `EPSType`, `SVDType`
136 @*/
137 20 PetscErrorCode SlepcHasExternalPackage(const char pkg[], PetscBool *has)
138 {
139 20 char pkgstr[128],*loc;
140 20 size_t cnt;
141
142
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
20 PetscFunctionBegin;
143
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.
20 PetscCall(PetscSNPrintfCount(pkgstr,sizeof(pkgstr),":%s:",&cnt,pkg));
144
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
20 PetscCheck(cnt<sizeof(pkgstr),PETSC_COMM_SELF,PETSC_ERR_SUP,"Package name is too long: \"%s\"",pkg);
145
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
20 PetscCall(PetscStrtolower(pkgstr));
146 #if defined(SLEPC_HAVE_PACKAGES)
147
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
20 PetscCall(PetscStrstr(SLEPC_HAVE_PACKAGES,pkgstr,&loc));
148 #else
149 #error "SLEPC_HAVE_PACKAGES macro undefined. Please reconfigure"
150 #endif
151 20 *has = loc? PETSC_TRUE: PETSC_FALSE;
152
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.
20 PetscFunctionReturn(PETSC_SUCCESS);
153 }
154
155 #if PetscDefined(USE_DEBUG)
156 /*@
157 SlepcDebugViewMatrix - Print an array as a Matlab matrix, to be used from within a debugger.
158
159 Logically Collective
160
161 Input Parameters:
162 + nrows - number of rows of printed matrix
163 . ncols - number of columns of printed matrix
164 . Xr - real part of array to be printed
165 . Xi - imaginary part of array to be printed (not referenced in complex scalars)
166 . ldx - leading dimension
167 . s - name of Matlab variable
168 - filename - optional name of a file to write the output, can be `NULL`
169
170 Level: developer
171
172 .seealso: `SlepcInitialize()`
173 @*/
174 2 PetscErrorCode SlepcDebugViewMatrix(PetscInt nrows,PetscInt ncols,PetscScalar Xr[],PetscScalar Xi[],PetscInt ldx,const char s[],const char filename[])
175 {
176 2 PetscInt i,j;
177 2 PetscViewer viewer;
178
179
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 PetscFunctionBegin;
180
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
2 if (filename) PetscCall(PetscViewerASCIIOpen(PETSC_COMM_WORLD,filename,&viewer));
181
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2 else PetscCall(PetscViewerASCIIGetStdout(PETSC_COMM_WORLD,&viewer));
182
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2 PetscCall(PetscViewerASCIIPrintf(viewer,"%s = [\n",s));
183
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
6 for (i=0;i<nrows;i++) {
184
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
16 for (j=0;j<ncols;j++) {
185 #if PetscDefined(USE_COMPLEX)
186
3/6
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
6 PetscCall(PetscViewerASCIIPrintf(viewer,"%.18g+%.18gi ",(double)PetscRealPart(Xr[i+j*ldx]),(double)PetscImaginaryPart(Xr[i+j*ldx])));
187 #else
188
4/8
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
6 if (Xi) PetscCall(PetscViewerASCIIPrintf(viewer,"%.18g+%.18gi ",(double)Xr[i+j*ldx],(double)Xi[i+j*ldx]));
189
0/6
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
6 else PetscCall(PetscViewerASCIIPrintf(viewer,"%.18g ",(double)Xr[i+j*ldx]));
190 #endif
191 }
192
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
4 PetscCall(PetscViewerASCIIPrintf(viewer,"\n"));
193 }
194
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2 PetscCall(PetscViewerASCIIPrintf(viewer,"];\n"));
195
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
2 if (filename) PetscCall(PetscViewerDestroy(&viewer));
196
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.
2 PetscFunctionReturn(PETSC_SUCCESS);
197 }
198 #endif
199
200 /*
201 SlepcDebugSetMatlabStdout - sets Matlab format in stdout, to be used from within a debugger.
202 */
203 #if PetscDefined(USE_DEBUG) && !PetscDefined(CLANG_STATIC_ANALYZER)
204 ✗ PETSC_UNUSED PetscErrorCode SlepcDebugSetMatlabStdout(void)
205 {
206 ✗ PetscViewer viewer;
207
208 ✗ PetscFunctionBegin;
209 ✗ PetscCall(PetscViewerASCIIGetStdout(PETSC_COMM_WORLD,&viewer));
210 ✗ PetscCall(PetscViewerPushFormat(viewer,PETSC_VIEWER_ASCII_MATLAB));
211 ✗ PetscFunctionReturn(PETSC_SUCCESS);
212 }
213 #endif
214