GCC Code Coverage Report


Directory: ./
File: src/svd/interface/svdbasic.c
Date: 2026-05-04 03:58:11
Exec Total Coverage
Lines: 181 190 95.3%
Functions: 10 11 90.9%
Branches: 373 872 42.8%

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 Basic SVD routines
12 */
13
14 #include <slepc/private/svdimpl.h> /*I "slepcsvd.h" I*/
15
16 /* Logging support */
17 PetscClassId SVD_CLASSID = 0;
18 PetscLogEvent SVD_SetUp = 0,SVD_Solve = 0;
19
20 /* List of registered SVD routines */
21 PetscFunctionList SVDList = NULL;
22 PetscBool SVDRegisterAllCalled = PETSC_FALSE;
23
24 /* List of registered SVD monitors */
25 PetscFunctionList SVDMonitorList = NULL;
26 PetscFunctionList SVDMonitorCreateList = NULL;
27 PetscFunctionList SVDMonitorDestroyList = NULL;
28 PetscBool SVDMonitorRegisterAllCalled = PETSC_FALSE;
29
30 /*@
31 SVDCreate - Creates the `SVD` context.
32
33 Collective
34
35 Input Parameter:
36 . comm - MPI communicator
37
38 Output Parameter:
39 . outsvd - location to put the `SVD` context
40
41 Note:
42 The default `SVD` type is `SVDCROSS`.
43
44 Level: beginner
45
46 .seealso: [](ch:svd), `SVDSetUp()`, `SVDSolve()`, `SVDDestroy()`, `SVD`
47 @*/
48 2381 PetscErrorCode SVDCreate(MPI_Comm comm,SVD *outsvd)
49 {
50 2381 SVD svd;
51
52
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2381 PetscFunctionBegin;
53
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.
2381 PetscAssertPointer(outsvd,2);
54
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.
2381 PetscCall(SVDInitializePackage());
55
7/12
✓ 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 10 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
2381 PetscCall(SlepcHeaderCreate(svd,SVD_CLASSID,"SVD","Singular Value Decomposition","SVD",comm,SVDDestroy,SVDView));
56
57 2381 svd->OP = NULL;
58 2381 svd->OPb = NULL;
59 2381 svd->omega = NULL;
60 2381 svd->max_it = PETSC_DETERMINE;
61 2381 svd->nsv = 0;
62 2381 svd->ncv = PETSC_DETERMINE;
63 2381 svd->mpd = PETSC_DETERMINE;
64 2381 svd->nini = 0;
65 2381 svd->ninil = 0;
66 2381 svd->tol = PETSC_DETERMINE;
67 2381 svd->thres = 0.0;
68 2381 svd->threlative = PETSC_FALSE;
69 2381 svd->conv = (SVDConv)-1;
70 2381 svd->stop = SVD_STOP_BASIC;
71 2381 svd->which = SVD_LARGEST;
72 2381 svd->problem_type = (SVDProblemType)0;
73 2381 svd->impltrans = PETSC_FALSE;
74 2381 svd->trackall = PETSC_FALSE;
75
76 2381 svd->converged = NULL;
77 2381 svd->convergeduser = NULL;
78 2381 svd->convergeddestroy = NULL;
79 2381 svd->stopping = SVDStoppingBasic;
80 2381 svd->stoppinguser = NULL;
81 2381 svd->stoppingdestroy = NULL;
82 2381 svd->convergedctx = NULL;
83 2381 svd->stoppingctx = NULL;
84 2381 svd->numbermonitors = 0;
85
86 2381 svd->ds = NULL;
87 2381 svd->U = NULL;
88 2381 svd->V = NULL;
89 2381 svd->A = NULL;
90 2381 svd->B = NULL;
91 2381 svd->AT = NULL;
92 2381 svd->BT = NULL;
93 2381 svd->IS = NULL;
94 2381 svd->ISL = NULL;
95 2381 svd->sigma = NULL;
96 2381 svd->errest = NULL;
97 2381 svd->sign = NULL;
98 2381 svd->perm = NULL;
99 2381 svd->nworkl = 0;
100 2381 svd->nworkr = 0;
101 2381 svd->workl = NULL;
102 2381 svd->workr = NULL;
103 2381 svd->data = NULL;
104
105 2381 svd->state = SVD_STATE_INITIAL;
106 2381 svd->nconv = 0;
107 2381 svd->its = 0;
108 2381 svd->leftbasis = PETSC_FALSE;
109 2381 svd->swapped = PETSC_FALSE;
110 2381 svd->expltrans = PETSC_FALSE;
111 2381 svd->nrma = 0.0;
112 2381 svd->nrmb = 0.0;
113 2381 svd->isgeneralized = PETSC_FALSE;
114 2381 svd->reason = SVD_CONVERGED_ITERATING;
115
116
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.
2381 PetscCall(PetscNew(&svd->sc));
117 2381 *outsvd = svd;
118
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.
2381 PetscFunctionReturn(PETSC_SUCCESS);
119 }
120
121 /*@
122 SVDReset - Resets the `SVD` context to the initial state (prior to setup)
123 and destroys any allocated `Vec`s and `Mat`s.
124
125 Collective
126
127 Input Parameter:
128 . svd - the singular value solver context
129
130 Level: advanced
131
132 .seealso: [](ch:svd), `SVDDestroy()`
133 @*/
134 2441 PetscErrorCode SVDReset(SVD svd)
135 {
136
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2441 PetscFunctionBegin;
137
3/14
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
2441 if (svd) PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
138
1/12
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
1977 if (!svd) PetscFunctionReturn(PETSC_SUCCESS);
139
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.
2441 PetscTryTypeMethod(svd,reset);
140
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.
2441 PetscCall(MatDestroy(&svd->OP));
141
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.
2441 PetscCall(MatDestroy(&svd->OPb));
142
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.
2441 PetscCall(VecDestroy(&svd->omega));
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.
2441 PetscCall(MatDestroy(&svd->A));
144
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.
2441 PetscCall(MatDestroy(&svd->B));
145
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.
2441 PetscCall(MatDestroy(&svd->AT));
146
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.
2441 PetscCall(MatDestroy(&svd->BT));
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.
2441 PetscCall(BVDestroy(&svd->U));
148
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.
2441 PetscCall(BVDestroy(&svd->V));
149
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.
2441 PetscCall(VecDestroyVecs(svd->nworkl,&svd->workl));
150 2441 svd->nworkl = 0;
151
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.
2441 PetscCall(VecDestroyVecs(svd->nworkr,&svd->workr));
152 2441 svd->nworkr = 0;
153 2441 svd->swapped = PETSC_FALSE;
154 2441 svd->state = SVD_STATE_INITIAL;
155
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.
2441 PetscFunctionReturn(PETSC_SUCCESS);
156 }
157
158 /*@
159 SVDDestroy - Destroys the `SVD` context.
160
161 Collective
162
163 Input Parameter:
164 . svd - the singular value solver context
165
166 Level: beginner
167
168 .seealso: [](ch:svd), `SVDCreate()`, `SVDSetUp()`, `SVDSolve()`
169 @*/
170 2402 PetscErrorCode SVDDestroy(SVD *svd)
171 {
172
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2402 PetscFunctionBegin;
173
2/14
✓ Branch 0 taken 8 times.
✓ 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.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
2402 if (!*svd) PetscFunctionReturn(PETSC_SUCCESS);
174
2/12
✗ 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 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
2402 PetscValidHeaderSpecific(*svd,SVD_CLASSID,1);
175
2/14
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 10 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.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
2402 if (--((PetscObject)*svd)->refct > 0) { *svd = NULL; PetscFunctionReturn(PETSC_SUCCESS); }
176
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.
2381 PetscCall(SVDReset(*svd));
177
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.
2381 PetscTryTypeMethod(*svd,destroy);
178
6/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 2 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.
2381 if ((*svd)->sigma) PetscCall(PetscFree3((*svd)->sigma,(*svd)->perm,(*svd)->errest));
179
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.
2381 PetscCall(PetscFree((*svd)->sign));
180
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.
2381 PetscCall(DSDestroy(&(*svd)->ds));
181
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.
2381 PetscCall(PetscFree((*svd)->sc));
182 /* just in case the initial vectors have not been used */
183
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.
2381 PetscCall(SlepcBasisDestroy_Private(&(*svd)->nini,&(*svd)->IS));
184
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.
2381 PetscCall(SlepcBasisDestroy_Private(&(*svd)->ninil,&(*svd)->ISL));
185
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 10 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.
2381 if ((*svd)->convergeddestroy) PetscCall((*(*svd)->convergeddestroy)(&(*svd)->convergedctx));
186
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 10 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.
2381 if ((*svd)->stoppingdestroy) PetscCall((*(*svd)->stoppingdestroy)(&(*svd)->stoppingctx));
187
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.
2381 PetscCall(SVDMonitorCancel(*svd));
188
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.
2381 PetscCall(PetscHeaderDestroy(svd));
189
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.
452 PetscFunctionReturn(PETSC_SUCCESS);
190 }
191
192 /*@
193 SVDSetType - Selects the particular solver to be used in the `SVD` object.
194
195 Logically Collective
196
197 Input Parameters:
198 + svd - the singular value solver context
199 - type - a known method
200
201 Options Database Key:
202 . -svd_type type - sets the method; use `-help` for a list of available methods
203
204 Notes:
205 See `SVDType` for available methods. The default is `SVDCROSS`.
206
207 Normally, it is best to use the `SVDSetFromOptions()` command and
208 then set the `SVD` type from the options database rather than by using
209 this routine. Using the options database provides the user with
210 maximum flexibility in evaluating the different available methods.
211 The `SVDSetType()` routine is provided for those situations where it
212 is necessary to set the iterative solver independently of the command
213 line or options database.
214
215 Level: intermediate
216
217 .seealso: [](ch:svd), `SVDType`
218 @*/
219 2312 PetscErrorCode SVDSetType(SVD svd,SVDType type)
220 {
221 2312 PetscErrorCode (*r)(SVD);
222 2312 PetscBool match;
223
224
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2312 PetscFunctionBegin;
225
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.
2312 PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
226
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.
2312 PetscAssertPointer(type,2);
227
228
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.
2312 PetscCall(PetscObjectTypeCompare((PetscObject)svd,type,&match));
229
2/14
✓ Branch 0 taken 8 times.
✓ 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.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
2312 if (match) PetscFunctionReturn(PETSC_SUCCESS);
230
231
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.
2312 PetscCall(PetscFunctionListFind(SVDList,type,&r));
232
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2312 PetscCheck(r,PetscObjectComm((PetscObject)svd),PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown SVD type given: %s",type);
233
234
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.
2312 PetscTryTypeMethod(svd,destroy);
235
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.
2312 PetscCall(PetscMemzero(svd->ops,sizeof(struct _SVDOps)));
236
237 2312 svd->state = SVD_STATE_INITIAL;
238
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.
2312 PetscCall(PetscObjectChangeTypeName((PetscObject)svd,type));
239
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.
2312 PetscCall((*r)(svd));
240
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.
454 PetscFunctionReturn(PETSC_SUCCESS);
241 }
242
243 /*@
244 SVDGetType - Gets the `SVD` type as a string from the `SVD` object.
245
246 Not Collective
247
248 Input Parameter:
249 . svd - the singular value solver context
250
251 Output Parameter:
252 . type - name of `SVD` method
253
254 Level: intermediate
255
256 .seealso: [](ch:svd), `SVDSetType()`
257 @*/
258 571 PetscErrorCode SVDGetType(SVD svd,SVDType *type)
259 {
260
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
571 PetscFunctionBegin;
261
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.
571 PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
262
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.
571 PetscAssertPointer(type,2);
263 571 *type = ((PetscObject)svd)->type_name;
264
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.
571 PetscFunctionReturn(PETSC_SUCCESS);
265 }
266
267 /*@C
268 SVDRegister - Adds a method to the singular value solver package.
269
270 Not Collective
271
272 Input Parameters:
273 + name - name of a new user-defined solver
274 - function - routine to create the solver context
275
276 Note:
277 `SVDRegister()` may be called multiple times to add several user-defined solvers.
278
279 Example Usage:
280 .vb
281 SVDRegister("my_solver",MySolverCreate);
282 .ve
283
284 Then, your solver can be chosen with the procedural interface via
285 .vb
286 SVDSetType(svd,"my_solver")
287 .ve
288 or at runtime via the option `-svd_type my_solver`.
289
290 Level: advanced
291
292 .seealso: [](ch:svd), `SVDRegisterAll()`
293 @*/
294 16848 PetscErrorCode SVDRegister(const char *name,PetscErrorCode (*function)(SVD))
295 {
296
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
16848 PetscFunctionBegin;
297
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.
16848 PetscCall(SVDInitializePackage());
298
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.
16848 PetscCall(PetscFunctionListAdd(&SVDList,name,function));
299
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.
3178 PetscFunctionReturn(PETSC_SUCCESS);
300 }
301
302 /*@C
303 SVDMonitorRegister - Registers an `SVD` monitor routine that may be accessed with
304 `SVDMonitorSetFromOptions()`.
305
306 Not Collective
307
308 Input Parameters:
309 + name - name of a new monitor routine
310 . vtype - a `PetscViewerType` for the output
311 . format - a `PetscViewerFormat` for the output
312 . monitor - monitor routine, see `SVDMonitorRegisterFn`
313 . create - creation routine, or `NULL`
314 - destroy - destruction routine, or `NULL`
315
316 Notes:
317 `SVDMonitorRegister()` may be called multiple times to add several user-defined monitors.
318
319 The calling sequence for the given function matches the calling sequence of `SVDMonitorFn`
320 functions passed to `SVDMonitorSet()` with the additional requirement that its final argument
321 be a `PetscViewerAndFormat`.
322
323 Example Usage:
324 .vb
325 SVDMonitorRegister("my_monitor",PETSCVIEWERASCII,PETSC_VIEWER_ASCII_INFO_DETAIL,MyMonitor,NULL,NULL);
326 .ve
327
328 Then, your monitor can be chosen with the procedural interface via
329 .vb
330 SVDMonitorSetFromOptions(svd,"-svd_monitor_my_monitor","my_monitor",NULL);
331 .ve
332 or at runtime via the option `-svd_monitor_my_monitor`.
333
334 Level: advanced
335
336 .seealso: [](ch:svd), `SVDMonitorSet()`, `SVDMonitorRegisterAll()`, `SVDMonitorSetFromOptions()`
337 @*/
338 16247 PetscErrorCode SVDMonitorRegister(const char name[],PetscViewerType vtype,PetscViewerFormat format,SVDMonitorRegisterFn *monitor,SVDMonitorRegisterCreateFn *create,SVDMonitorRegisterDestroyFn *destroy)
339 {
340 16247 char key[PETSC_MAX_PATH_LEN];
341
342
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
16247 PetscFunctionBegin;
343
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.
16247 PetscCall(SVDInitializePackage());
344
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.
16247 PetscCall(SlepcMonitorMakeKey_Internal(name,vtype,format,key));
345
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.
16247 PetscCall(PetscFunctionListAdd(&SVDMonitorList,key,monitor));
346
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.
16247 if (create) PetscCall(PetscFunctionListAdd(&SVDMonitorCreateList,key,create));
347
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.
16247 if (destroy) PetscCall(PetscFunctionListAdd(&SVDMonitorDestroyList,key,destroy));
348
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.
3178 PetscFunctionReturn(PETSC_SUCCESS);
349 }
350
351 /*@
352 SVDSetBV - Associates basis vectors objects to the singular value solver.
353
354 Collective
355
356 Input Parameters:
357 + svd - the singular value solver context
358 . V - the basis vectors object for right singular vectors
359 - U - the basis vectors object for left singular vectors
360
361 Note:
362 Use `SVDGetBV()` to retrieve the basis vectors contexts (for example,
363 to free them at the end of the computations).
364
365 Level: advanced
366
367 .seealso: [](ch:svd), `SVDGetBV()`
368 @*/
369 30 PetscErrorCode SVDSetBV(SVD svd,BV V,BV U)
370 {
371
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
30 PetscFunctionBegin;
372
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.
30 PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
373
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
30 if (V) {
374
2/12
✗ 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 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
30 PetscValidHeaderSpecific(V,BV_CLASSID,2);
375
13/32
✓ 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 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
30 PetscCheckSameComm(svd,1,V,2);
376
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.
30 PetscCall(PetscObjectReference((PetscObject)V));
377
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.
30 PetscCall(BVDestroy(&svd->V));
378 30 svd->V = V;
379 }
380
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
30 if (U) {
381
2/12
✗ 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 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
30 PetscValidHeaderSpecific(U,BV_CLASSID,3);
382
13/32
✓ 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 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
30 PetscCheckSameComm(svd,1,U,3);
383
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.
30 PetscCall(PetscObjectReference((PetscObject)U));
384
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.
30 PetscCall(BVDestroy(&svd->U));
385 30 svd->U = U;
386 }
387
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.
6 PetscFunctionReturn(PETSC_SUCCESS);
388 }
389
390 /*@
391 SVDGetBV - Obtain the basis vectors objects associated to the singular
392 value solver object.
393
394 Not Collective
395
396 Input Parameter:
397 . svd - the singular value solver context
398
399 Output Parameters:
400 + V - basis vectors context for right singular vectors
401 - U - basis vectors context for left singular vectors
402
403 Level: advanced
404
405 .seealso: [](ch:svd), `SVDSetBV()`
406 @*/
407 4613 PetscErrorCode SVDGetBV(SVD svd,BV *V,BV *U)
408 {
409
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
4613 PetscFunctionBegin;
410
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.
4613 PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
411
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4613 if (V) {
412
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
2320 if (!svd->V) {
413
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.
2320 PetscCall(BVCreate(PetscObjectComm((PetscObject)svd),&svd->V));
414
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.
2320 PetscCall(PetscObjectIncrementTabLevel((PetscObject)svd->V,(PetscObject)svd,0));
415
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.
2320 PetscCall(PetscObjectSetOptions((PetscObject)svd->V,((PetscObject)svd)->options));
416 }
417 2320 *V = svd->V;
418 }
419
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4613 if (U) {
420
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
2300 if (!svd->U) {
421
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.
2300 PetscCall(BVCreate(PetscObjectComm((PetscObject)svd),&svd->U));
422
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.
2300 PetscCall(PetscObjectIncrementTabLevel((PetscObject)svd->U,(PetscObject)svd,0));
423
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.
2300 PetscCall(PetscObjectSetOptions((PetscObject)svd->U,((PetscObject)svd)->options));
424 }
425 2300 *U = svd->U;
426 }
427
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.
912 PetscFunctionReturn(PETSC_SUCCESS);
428 }
429
430 /*@
431 SVDSetDS - Associates a direct solver object to the singular value solver.
432
433 Collective
434
435 Input Parameters:
436 + svd - the singular value solver context
437 - ds - the direct solver object
438
439 Note:
440 Use `SVDGetDS()` to retrieve the direct solver context (for example,
441 to free it at the end of the computations).
442
443 Level: advanced
444
445 .seealso: [](ch:svd), `SVDGetDS()`
446 @*/
447 PetscErrorCode SVDSetDS(SVD svd,DS ds)
448 {
449 PetscFunctionBegin;
450 PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
451 PetscValidHeaderSpecific(ds,DS_CLASSID,2);
452 PetscCheckSameComm(svd,1,ds,2);
453 PetscCall(PetscObjectReference((PetscObject)ds));
454 PetscCall(DSDestroy(&svd->ds));
455 svd->ds = ds;
456 PetscFunctionReturn(PETSC_SUCCESS);
457 }
458
459 /*@
460 SVDGetDS - Obtain the direct solver object associated to the singular value
461 solver object.
462
463 Not Collective
464
465 Input Parameter:
466 . svd - the singular value solver context
467
468 Output Parameter:
469 . ds - direct solver context
470
471 Level: advanced
472
473 .seealso: [](ch:svd), `SVDSetDS()`
474 @*/
475 2290 PetscErrorCode SVDGetDS(SVD svd,DS *ds)
476 {
477
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2290 PetscFunctionBegin;
478
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.
2290 PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
479
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.
2290 PetscAssertPointer(ds,2);
480
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
2290 if (!svd->ds) {
481
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.
2290 PetscCall(DSCreate(PetscObjectComm((PetscObject)svd),&svd->ds));
482
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.
2290 PetscCall(PetscObjectIncrementTabLevel((PetscObject)svd->ds,(PetscObject)svd,0));
483
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.
2290 PetscCall(PetscObjectSetOptions((PetscObject)svd->ds,((PetscObject)svd)->options));
484 }
485 2290 *ds = svd->ds;
486
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.
2290 PetscFunctionReturn(PETSC_SUCCESS);
487 }
488