GCC Code Coverage Report


Directory: ./
File: src/sys/slepcutil.c
Date: 2025-10-04 04:19:13
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 74603 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.
74603 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.
74603 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.
74603 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.
74603 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.
74603 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.
74603 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.
14462 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 3663 PetscErrorCode SlepcBasisReference_Private(PetscInt n,Vec *V,PetscInt *m,Vec **W)
40 {
41 3663 PetscInt i;
42
43
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
3663 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.
7652 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.
3663 PetscCall(SlepcBasisDestroy_Private(m,W));
46
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
3663 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.
3633 PetscCall(PetscMalloc1(n,W));
48
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
7622 for (i=0;i<n;i++) (*W)[i] = V[i];
49 3633 *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.
675 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 36295 PetscErrorCode SlepcBasisDestroy_Private(PetscInt *m,Vec **W)
59 {
60 36295 PetscInt i;
61
62
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
36295 PetscFunctionBegin;
63
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
36295 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.
7622 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.
3633 PetscCall(PetscFree(*W));
66 }
67 36295 *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.
36295 PetscFunctionReturn(PETSC_SUCCESS);
69 }
70
71 /*@C
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 3184 PetscErrorCode SlepcSNPrintfScalar(char *str,size_t len,PetscScalar val,PetscBool exp)
89 {
90 #if defined(PETSC_USE_COMPLEX)
91 1687 PetscReal re,im;
92 #endif
93
94
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
3184 PetscFunctionBegin;
95 #if !defined(PETSC_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.
1497 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 1687 re = PetscRealPart(val);
100 1687 im = PetscImaginaryPart(val);
101
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
1687 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.
1603 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.
562 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", "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: 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 /*
156 SlepcDebugViewMatrix - prints an array as a matrix, to be used from within a debugger.
157 Output can be pasted to Matlab.
158
159 nrows, ncols: size of printed matrix
160 Xr, Xi: array to be printed (Xi not referenced in complex scalars)
161 ldx: leading dimension
162 s: name of Matlab variable
163 filename: optionally write output to a file
164 */
165 #if defined(PETSC_USE_DEBUG)
166 2 PetscErrorCode SlepcDebugViewMatrix(PetscInt nrows,PetscInt ncols,PetscScalar *Xr,PetscScalar *Xi,PetscInt ldx,const char *s,const char *filename)
167 {
168 2 PetscInt i,j;
169 2 PetscViewer viewer;
170
171
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 PetscFunctionBegin;
172
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));
173
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));
174
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));
175
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
6 for (i=0;i<nrows;i++) {
176
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
16 for (j=0;j<ncols;j++) {
177 #if defined(PETSC_USE_COMPLEX)
178
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])));
179 #else
180
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]));
181
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]));
182 #endif
183 }
184
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"));
185 }
186
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"));
187
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));
188
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);
189 }
190 #endif
191
192 /*
193 SlepcDebugSetMatlabStdout - sets Matlab format in stdout, to be used from within a debugger.
194 */
195 #if defined(PETSC_USE_DEBUG) && !defined(PETSC_CLANG_STATIC_ANALYZER)
196 PETSC_UNUSED PetscErrorCode SlepcDebugSetMatlabStdout(void)
197 {
198 PetscViewer viewer;
199
200 PetscFunctionBegin;
201 PetscCall(PetscViewerASCIIGetStdout(PETSC_COMM_WORLD,&viewer));
202 PetscCall(PetscViewerPushFormat(viewer,PETSC_VIEWER_ASCII_MATLAB));
203 PetscFunctionReturn(PETSC_SUCCESS);
204 }
205 #endif
206