GCC Code Coverage Report


Directory: ./
File: src/svd/interface/svddefault.c
Date: 2026-10-22 02:08:06
Exec Total Coverage
Lines: 76 89 85.4%
Functions: 7 7 100.0%
Branches: 217 482 45.0%

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 12093 PetscErrorCode SVDConvergedAbsolute(SVD svd,PetscReal sigma,PetscReal res,PetscReal *errest,void *ctx)
20 {
21
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
12093 PetscFunctionBegin;
22 12093 *errest = res;
23
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
12093 PetscFunctionReturn(PETSC_SUCCESS);
24 }
25
26 /*
27 SVDConvergedRelative - Checks convergence relative to the singular value.
28 */
29 29707 PetscErrorCode SVDConvergedRelative(SVD svd,PetscReal sigma,PetscReal res,PetscReal *errest,void *ctx)
30 {
31
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
29707 PetscFunctionBegin;
32
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 9 times.
29707 *errest = (sigma!=0.0)? res/sigma: PETSC_MAX_REAL;
33
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
29707 PetscFunctionReturn(PETSC_SUCCESS);
34 }
35
36 /*
37 SVDConvergedNorm - Checks convergence relative to the matrix norms.
38 */
39 200 PetscErrorCode SVDConvergedNorm(SVD svd,PetscReal sigma,PetscReal res,PetscReal *errest,void *ctx)
40 {
41
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
200 PetscFunctionBegin;
42
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
200 *errest = res/PetscMax(svd->nrma,svd->nrmb);
43
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
200 PetscFunctionReturn(PETSC_SUCCESS);
44 }
45
46 /*
47 SVDConvergedMaxIt - Always returns Inf to force reaching the maximum number of iterations.
48 */
49 18 PetscErrorCode SVDConvergedMaxIt(SVD svd,PetscReal sigma,PetscReal res,PetscReal *errest,void *ctx)
50 {
51
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
18 PetscFunctionBegin;
52 18 *errest = PETSC_MAX_REAL;
53
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
18 PetscFunctionReturn(PETSC_SUCCESS);
54 }
55
56 /*@
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 28269 PetscErrorCode SVDStoppingBasic(SVD svd,PetscInt its,PetscInt max_it,PetscInt nconv,PetscInt nsv,SVDConvergedReason *reason,void *ctx)
85 {
86
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
28269 PetscFunctionBegin;
87 28269 *reason = SVD_CONVERGED_ITERATING;
88
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
28269 if (nconv >= nsv && svd->conv != SVD_CONV_MAXIT) {
89
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.
1310 PetscCall(PetscInfo(svd,"Singular value solver finished successfully: %" PetscInt_FMT " singular triplets converged at iteration %" PetscInt_FMT "\n",nconv,its));
90 1310 *reason = SVD_CONVERGED_TOL;
91
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
26959 } else if (its >= max_it) {
92
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
18 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
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
5238 PetscFunctionReturn(PETSC_SUCCESS);
99 }
100
101 /*@
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 979 PetscErrorCode SVDStoppingThreshold(SVD svd,PetscInt its,PetscInt max_it,PetscInt nconv,PetscInt nsv,SVDConvergedReason *reason,void *ctx)
132 {
133 979 PetscReal thres,firstsv,firstnc,errest;
134 979 PetscBool rel;
135 979 PetscInt napprox;
136 979 SVDWhich which;
137
138
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
979 PetscFunctionBegin;
139 979 *reason = SVD_CONVERGED_ITERATING;
140 979 firstsv = ((SVDStoppingCtx)ctx)->firstsv;
141 979 firstnc = ((SVDStoppingCtx)ctx)->firstnc;
142 979 errest = ((SVDStoppingCtx)ctx)->errest;
143 979 thres = ((SVDStoppingCtx)ctx)->thres;
144 979 rel = ((SVDStoppingCtx)ctx)->threlative;
145 979 napprox = ((SVDStoppingCtx)ctx)->napprox;
146 979 which = ((SVDStoppingCtx)ctx)->which;
147
148
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
979 if (!nconv) { /* no converged singular values yet */
149
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
114 if (its >= max_it) {
150 ✗ if (svd->conv == SVD_CONV_MAXIT) *reason = SVD_CONVERGED_MAXIT;
151 else {
152 ✗ PetscCall(PetscInfo(svd,"Singular value solver iteration reached maximum number of iterations (%" PetscInt_FMT ")\n",its));
153 ✗ *reason = SVD_DIVERGED_ITS;
154 }
155 }
156
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
114 PetscFunctionReturn(PETSC_SUCCESS);
157 }
158
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
865 if (nconv==napprox) { /* all approximations converged, very unusual */
159 ✗ PetscCall(PetscInfo(svd,"Singular value solver finished successfully: all available singular value approximations have converged\n"));
160 ✗ *reason = SVD_CONVERGED_TOL;
161 ✗ PetscFunctionReturn(PETSC_SUCCESS);
162 }
163
9/14
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 6 times.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
865 if ((which==SVD_LARGEST && ((rel && firstnc+errest<thres*firstsv) || (!rel && firstnc+errest<thres))) || (which==SVD_SMALLEST && firstnc-errest>thres)) {
164
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
126 if (its==((SVDStoppingCtx)ctx)->its+1) {
165
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 8 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.
53 if (which==SVD_SMALLEST) PetscCall(PetscInfo(svd,"Singular value solver finished successfully: the approximation %g (minus error estimate %g) is above the threshold %g\n",(double)firstnc,(double)errest,(double)thres));
166
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 8 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.
53 else if (!rel) PetscCall(PetscInfo(svd,"Singular value solver finished successfully: the approximation %g (plus error estimate %g) is below the threshold %g\n",(double)firstnc,(double)errest,(double)thres));
167
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.
53 else PetscCall(PetscInfo(svd,"Singular value solver finished successfully: the ratio %g/%g is below the threshold %g\n",(double)(firstnc+errest),(double)firstsv,(double)thres));
168 53 *reason = SVD_CONVERGED_TOL;
169 73 } else ((SVDStoppingCtx)ctx)->its = its; /* wait until next iteration */
170
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
739 } else if (nsv && nconv >= nsv) {
171 ✗ PetscCall(PetscInfo(svd,"Singular value solver finished successfully: %" PetscInt_FMT " singular triplets converged at iteration %" PetscInt_FMT "\n",nconv,its));
172 ✗ *reason = SVD_CONVERGED_TOL;
173
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
739 } else if (its >= max_it) {
174 ✗ if (svd->conv == SVD_CONV_MAXIT) *reason = SVD_CONVERGED_MAXIT;
175 else {
176 ✗ PetscCall(PetscInfo(svd,"Singular value solver iteration reached maximum number of iterations (%" PetscInt_FMT ")\n",its));
177 ✗ *reason = SVD_DIVERGED_ITS;
178 }
179 }
180
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
184 PetscFunctionReturn(PETSC_SUCCESS);
181 }
182
183 /*@
184 SVDSetWorkVecs - Sets a number of work vectors into an `SVD` object.
185
186 Collective
187
188 Input Parameters:
189 + svd - the singular value solver context
190 . nleft - number of work vectors of dimension equal to left singular vector
191 - nright - number of work vectors of dimension equal to right singular vector
192
193 Developer Note:
194 This is `SLEPC_EXTERN` because it may be required by user plugin `SVD`
195 implementations.
196
197 Level: developer
198
199 .seealso: [](ch:svd), `SVDSetUp()`
200 @*/
201 15006 PetscErrorCode SVDSetWorkVecs(SVD svd,PetscInt nleft,PetscInt nright)
202 {
203 15006 Vec t;
204
205
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
15006 PetscFunctionBegin;
206
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.
15006 PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
207
31/70
✓ 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 not taken.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ 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 not taken.
✓ Branch 35 taken 2 times.
✓ Branch 36 taken 2 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 2 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 2 times.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✓ Branch 47 taken 2 times.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✓ Branch 51 taken 2 times.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✓ Branch 56 taken 2 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 2 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 2 times.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✓ Branch 63 taken 2 times.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 66 not taken.
✓ Branch 67 taken 2 times.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
15006 PetscValidLogicalCollectiveInt(svd,nleft,2);
208
31/70
✓ 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 not taken.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ 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 not taken.
✓ Branch 35 taken 2 times.
✓ Branch 36 taken 2 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 2 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 2 times.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✓ Branch 47 taken 2 times.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✓ Branch 51 taken 2 times.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✓ Branch 56 taken 2 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 2 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 2 times.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✓ Branch 63 taken 2 times.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 66 not taken.
✓ Branch 67 taken 2 times.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
15006 PetscValidLogicalCollectiveInt(svd,nright,3);
209
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
15006 PetscCheck(nleft>=0,PetscObjectComm((PetscObject)svd),PETSC_ERR_ARG_OUTOFRANGE,"nleft must be >= 0: nleft = %" PetscInt_FMT,nleft);
210
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
15006 PetscCheck(nright>=0,PetscObjectComm((PetscObject)svd),PETSC_ERR_ARG_OUTOFRANGE,"nright must be >= 0: nright = %" PetscInt_FMT,nright);
211
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
15006 PetscCheck(nleft>0 || nright>0,PetscObjectComm((PetscObject)svd),PETSC_ERR_ARG_OUTOFRANGE,"nleft and nright cannot be both zero");
212
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
15006 if (svd->nworkl < nleft) {
213
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.
2442 PetscCall(VecDestroyVecs(svd->nworkl,&svd->workl));
214 2442 svd->nworkl = nleft;
215
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.
2442 if (svd->isgeneralized) PetscCall(SVDCreateLeftTemplate(svd,&t));
216
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.
1591 else PetscCall(MatCreateVecsEmpty(svd->OP,NULL,&t));
217
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.
2442 PetscCall(VecDuplicateVecs(t,nleft,&svd->workl));
218
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.
2442 PetscCall(VecDestroy(&t));
219 }
220
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
15006 if (svd->nworkr < nright) {
221
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.
2885 PetscCall(VecDestroyVecs(svd->nworkr,&svd->workr));
222 2885 svd->nworkr = nright;
223
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.
2885 PetscCall(MatCreateVecsEmpty(svd->OP,&t,NULL));
224
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.
2885 PetscCall(VecDuplicateVecs(t,nright,&svd->workr));
225
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.
2885 PetscCall(VecDestroy(&t));
226 }
227
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
3182 PetscFunctionReturn(PETSC_SUCCESS);
228 }
229