GCC Code Coverage Report


Directory: ./
File: src/svd/interface/svddefault.c
Date: 2026-02-22 03:58:10
Exec Total Coverage
Lines: 67 74 90.5%
Functions: 7 7 100.0%
Branches: 184 390 47.2%

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 Simple default routines for common SVD operations
12 */
13
14 #include <slepc/private/svdimpl.h> /*I "slepcsvd.h" I*/
15
16 /*
17 SVDConvergedAbsolute - Checks convergence absolutely.
18 */
19 9568 PetscErrorCode SVDConvergedAbsolute(SVD svd,PetscReal sigma,PetscReal res,PetscReal *errest,void *ctx)
20 {
21
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
9568 PetscFunctionBegin;
22 9568 *errest = res;
23
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.
9568 PetscFunctionReturn(PETSC_SUCCESS);
24 }
25
26 /*
27 SVDConvergedRelative - Checks convergence relative to the singular value.
28 */
29 24481 PetscErrorCode SVDConvergedRelative(SVD svd,PetscReal sigma,PetscReal res,PetscReal *errest,void *ctx)
30 {
31
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
24481 PetscFunctionBegin;
32
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 6 times.
24481 *errest = (sigma!=0.0)? res/sigma: PETSC_MAX_REAL;
33
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.
24481 PetscFunctionReturn(PETSC_SUCCESS);
34 }
35
36 /*
37 SVDConvergedNorm - Checks convergence relative to the matrix norms.
38 */
39 160 PetscErrorCode SVDConvergedNorm(SVD svd,PetscReal sigma,PetscReal res,PetscReal *errest,void *ctx)
40 {
41
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
160 PetscFunctionBegin;
42
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
160 *errest = res/PetscMax(svd->nrma,svd->nrmb);
43
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.
160 PetscFunctionReturn(PETSC_SUCCESS);
44 }
45
46 /*
47 SVDConvergedMaxIt - Always returns Inf to force reaching the maximum number of iterations.
48 */
49 15 PetscErrorCode SVDConvergedMaxIt(SVD svd,PetscReal sigma,PetscReal res,PetscReal *errest,void *ctx)
50 {
51
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
15 PetscFunctionBegin;
52 15 *errest = PETSC_MAX_REAL;
53
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.
15 PetscFunctionReturn(PETSC_SUCCESS);
54 }
55
56 /*@C
57 SVDStoppingBasic - Default routine to determine whether the outer singular value
58 solver iteration must be stopped.
59
60 Collective
61
62 Input Parameters:
63 + svd - the singular value solver context
64 . its - current number of iterations
65 . max_it - maximum number of iterations
66 . nconv - number of currently converged singular triplets
67 . nsv - number of requested singular triplets
68 - ctx - context (not used here)
69
70 Output Parameter:
71 . reason - result of the stopping test
72
73 Notes:
74 `SVDStoppingBasic()` will stop if all requested singular values are converged, or if
75 the maximum number of iterations has been reached.
76
77 This is the default stopping test.
78 Use `SVDSetStoppingTest()` to provide your own test instead of using this one.
79
80 Level: advanced
81
82 .seealso: [](ch:svd), `SVDSetStoppingTest()`, `SVDStoppingThreshold()`, `SVDConvergedReason`, `SVDGetConvergedReason()`
83 @*/
84 21237 PetscErrorCode SVDStoppingBasic(SVD svd,PetscInt its,PetscInt max_it,PetscInt nconv,PetscInt nsv,SVDConvergedReason *reason,void *ctx)
85 {
86
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
21237 PetscFunctionBegin;
87 21237 *reason = SVD_CONVERGED_ITERATING;
88
4/4
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
21237 if (nconv >= nsv && svd->conv != SVD_CONV_MAXIT) {
89
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.
1044 PetscCall(PetscInfo(svd,"Singular value solver finished successfully: %" PetscInt_FMT " singular triplets converged at iteration %" PetscInt_FMT "\n",nconv,its));
90 1044 *reason = SVD_CONVERGED_TOL;
91
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
20193 } else if (its >= max_it) {
92
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
15 if (svd->conv == SVD_CONV_MAXIT) *reason = SVD_CONVERGED_MAXIT;
93 else {
94 *reason = SVD_DIVERGED_ITS;
95 PetscCall(PetscInfo(svd,"Singular value solver iteration reached maximum number of iterations (%" PetscInt_FMT ")\n",its));
96 }
97 }
98
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.
5222 PetscFunctionReturn(PETSC_SUCCESS);
99 }
100
101 /*@C
102 SVDStoppingThreshold - Routine to determine whether the outer singular value
103 solver iteration must be stopped, according to some threshold for the computed values.
104
105 Collective
106
107 Input Parameters:
108 + svd - the singular value solver context
109 . its - current number of iterations
110 . max_it - maximum number of iterations
111 . nconv - number of currently converged singular triplets (ignored here)
112 . nsv - number of requested singular triplets (ignored here)
113 - ctx - context containing additional data (`SVDStoppingCtx`)
114
115 Output Parameter:
116 . reason - result of the stopping test
117
118 Notes:
119 `SVDStoppingThreshold()` will stop when one of the computed singular values is not
120 above/below the threshold given at `SVDSetThreshold()`. If a number of wanted singular
121 values has been specified via `SVDSetDimensions()` then it is also taken into account,
122 and the solver will stop when one of the two conditions (threshold or number of
123 converged values) is met.
124
125 Use `SVDSetStoppingTest()` to provide your own test instead of using this one.
126
127 Level: advanced
128
129 .seealso: [](ch:svd), `SVDSetStoppingTest()`, `SVDStoppingBasic()`, `SVDSetThreshold()`, `SVDSetDimensions()`, `SVDConvergedReason`, `SVDGetConvergedReason()`
130 @*/
131 1332 PetscErrorCode SVDStoppingThreshold(SVD svd,PetscInt its,PetscInt max_it,PetscInt nconv,PetscInt nsv,SVDConvergedReason *reason,void *ctx)
132 {
133 1332 PetscReal thres,firstsv,lastsv;
134 1332 PetscBool rel;
135 1332 SVDWhich which;
136
137
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1332 PetscFunctionBegin;
138 1332 *reason = SVD_CONVERGED_ITERATING;
139 1332 firstsv = ((SVDStoppingCtx)ctx)->firstsv;
140 1332 lastsv = ((SVDStoppingCtx)ctx)->lastsv;
141 1332 thres = ((SVDStoppingCtx)ctx)->thres;
142 1332 rel = ((SVDStoppingCtx)ctx)->threlative;
143 1332 which = ((SVDStoppingCtx)ctx)->which;
144
11/16
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 6 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 6 times.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 6 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
1332 if (nconv && ((which==SVD_LARGEST && ((rel && lastsv<thres*firstsv) || (!rel && lastsv<thres))) || (which==SVD_SMALLEST && lastsv>thres))) {
145
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 7 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.
56 if (which==SVD_SMALLEST) PetscCall(PetscInfo(svd,"Singular value solver finished successfully: singular value %g is above the threshold %g\n",(double)lastsv,(double)thres));
146
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 7 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.
56 else if (!rel) PetscCall(PetscInfo(svd,"Singular value solver finished successfully: singular value %g is below the threshold %g\n",(double)lastsv,(double)thres));
147
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
56 else PetscCall(PetscInfo(svd,"Singular value solver finished successfully: the ratio %g/%g is below the threshold %g\n",(double)lastsv,(double)firstsv,(double)thres));
148 56 *reason = SVD_CONVERGED_TOL;
149
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
1276 } else if (nsv && nconv >= nsv) {
150 PetscCall(PetscInfo(svd,"Singular value solver finished successfully: %" PetscInt_FMT " singular triplets converged at iteration %" PetscInt_FMT "\n",nconv,its));
151 *reason = SVD_CONVERGED_TOL;
152
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
1276 } else if (its >= max_it) {
153 if (svd->conv == SVD_CONV_MAXIT) *reason = SVD_CONVERGED_MAXIT;
154 else {
155 *reason = SVD_DIVERGED_ITS;
156 PetscCall(PetscInfo(svd,"Singular value solver iteration reached maximum number of iterations (%" PetscInt_FMT ")\n",its));
157 }
158 }
159
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.
351 PetscFunctionReturn(PETSC_SUCCESS);
160 }
161
162 /*@
163 SVDSetWorkVecs - Sets a number of work vectors into an `SVD` object.
164
165 Collective
166
167 Input Parameters:
168 + svd - the singular value solver context
169 . nleft - number of work vectors of dimension equal to left singular vector
170 - nright - number of work vectors of dimension equal to right singular vector
171
172 Developer Note:
173 This is `SLEPC_EXTERN` because it may be required by user plugin `SVD`
174 implementations.
175
176 Level: developer
177
178 .seealso: [](ch:svd), `SVDSetUp()`
179 @*/
180 12679 PetscErrorCode SVDSetWorkVecs(SVD svd,PetscInt nleft,PetscInt nright)
181 {
182 12679 Vec t;
183
184
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
12679 PetscFunctionBegin;
185
3/16
✗ 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.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
12679 PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
186
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
12679 PetscValidLogicalCollectiveInt(svd,nleft,2);
187
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
12679 PetscValidLogicalCollectiveInt(svd,nright,3);
188
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
12679 PetscCheck(nleft>=0,PetscObjectComm((PetscObject)svd),PETSC_ERR_ARG_OUTOFRANGE,"nleft must be >= 0: nleft = %" PetscInt_FMT,nleft);
189
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
12679 PetscCheck(nright>=0,PetscObjectComm((PetscObject)svd),PETSC_ERR_ARG_OUTOFRANGE,"nright must be >= 0: nright = %" PetscInt_FMT,nright);
190
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
12679 PetscCheck(nleft>0 || nright>0,PetscObjectComm((PetscObject)svd),PETSC_ERR_ARG_OUTOFRANGE,"nleft and nright cannot be both zero");
191
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
12679 if (svd->nworkl < nleft) {
192
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.
1988 PetscCall(VecDestroyVecs(svd->nworkl,&svd->workl));
193 1988 svd->nworkl = nleft;
194
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.
1988 if (svd->isgeneralized) PetscCall(SVDCreateLeftTemplate(svd,&t));
195
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.
1310 else PetscCall(MatCreateVecsEmpty(svd->OP,NULL,&t));
196
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.
1988 PetscCall(VecDuplicateVecs(t,nleft,&svd->workl));
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.
1988 PetscCall(VecDestroy(&t));
198 }
199
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
12679 if (svd->nworkr < nright) {
200
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.
2336 PetscCall(VecDestroyVecs(svd->nworkr,&svd->workr));
201 2336 svd->nworkr = nright;
202
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.
2336 PetscCall(MatCreateVecsEmpty(svd->OP,&t,NULL));
203
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.
2336 PetscCall(VecDuplicateVecs(t,nright,&svd->workr));
204
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.
2336 PetscCall(VecDestroy(&t));
205 }
206
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.
3195 PetscFunctionReturn(PETSC_SUCCESS);
207 }
208