GCC Code Coverage Report


Directory: ./
File: src/svd/interface/svdmon.c
Date: 2026-01-12 03:57:26
Exec Total Coverage
Lines: 165 201 82.1%
Functions: 12 15 80.0%
Branches: 417 1044 39.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 SVD routines related to monitors
12 */
13
14 #include <slepc/private/svdimpl.h> /*I "slepcsvd.h" I*/
15 #include <petscdraw.h>
16
17 /*
18 Runs the user provided monitor routines, if any.
19 */
20 50340 PetscErrorCode SVDMonitor(SVD svd,PetscInt it,PetscInt nconv,PetscReal *sigma,PetscReal *errest,PetscInt nest)
21 {
22 50340 PetscInt i,n = svd->numbermonitors;
23
24
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
50340 PetscFunctionBegin;
25
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.
50565 for (i=0;i<n;i++) PetscCall((*svd->monitor[i])(svd,it,nconv,sigma,errest,nest,svd->monitorcontext[i]));
26
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.
9971 PetscFunctionReturn(PETSC_SUCCESS);
27 }
28
29 /*@C
30 SVDMonitorSet - Sets an ADDITIONAL function to be called at every
31 iteration to monitor the error estimates for each requested singular triplet.
32
33 Logically Collective
34
35 Input Parameters:
36 + svd - the singular value solver context
37 . monitor - pointer to function (if this is `NULL`, it turns off monitoring),
38 see `SVDMonitorFn`
39 . mctx - [optional] context for private data for the monitor routine
40 (use `NULL` if no context is desired)
41 - monitordestroy - [optional] routine that frees monitor context (may be `NULL`),
42 see `PetscCtxDestroyFn` for the calling sequence
43
44 Options Database Keys:
45 + -svd_monitor - print only the first error estimate
46 . -svd_monitor_all - print error estimates at each iteration
47 . -svd_monitor_conv - print the singular value approximations only when
48 convergence has been reached
49 . -svd_monitor_conditioning - print the condition number when available
50 . -svd_monitor draw::draw_lg - sets line graph monitor for the first unconverged
51 approximate singular value
52 . -svd_monitor_all draw::draw_lg - sets line graph monitor for all unconverged
53 approximate singular values
54 . -svd_monitor_conv draw::draw_lg - sets line graph monitor for convergence history
55 - -svd_monitor_cancel - cancels all monitors that have been hardwired into
56 a code by calls to `SVDMonitorSet()`, but does not cancel
57 those set via the options database.
58
59 Notes:
60 The options database option `-svd_monitor` and related options are the easiest way
61 to turn on `SVD` iteration monitoring.
62
63 `SVDMonitorRegister()` provides a way to associate an options database key with `SVD`
64 monitor function.
65
66 Several different monitoring routines may be set by calling `SVDMonitorSet()` multiple
67 times; all will be called in the order in which they were set.
68
69 Fortran Note:
70 Only a single monitor function can be set for each `SVD` object.
71
72 Level: intermediate
73
74 .seealso: [](ch:svd), `SVDMonitorFirst()`, `SVDMonitorAll()`, `SVDMonitorConverged()`, `SVDMonitorConditioning()`, `SVDMonitorFirstDrawLG()`, `SVDMonitorAllDrawLG()`, `SVDMonitorConvergedDrawLG()`, `SVDMonitorCancel()`
75 @*/
76 278 PetscErrorCode SVDMonitorSet(SVD svd,SVDMonitorFn *monitor,void *mctx,PetscCtxDestroyFn *monitordestroy)
77 {
78 278 PetscInt i;
79 278 PetscBool identical;
80
81
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
278 PetscFunctionBegin;
82
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.
278 PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
83
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
337 for (i=0;i<svd->numbermonitors;i++) {
84
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.
59 PetscCall(PetscMonitorCompare((PetscErrorCode(*)(void))(PetscVoidFn*)monitor,mctx,monitordestroy,(PetscErrorCode (*)(void))(PetscVoidFn*)svd->monitor[i],svd->monitorcontext[i],svd->monitordestroy[i],&identical));
85
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.
59 if (identical) PetscFunctionReturn(PETSC_SUCCESS);
86 }
87
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
278 PetscCheck(svd->numbermonitors<MAXSVDMONITORS,PetscObjectComm((PetscObject)svd),PETSC_ERR_ARG_OUTOFRANGE,"Too many SVD monitors set");
88 278 svd->monitor[svd->numbermonitors] = monitor;
89 278 svd->monitorcontext[svd->numbermonitors] = mctx;
90 278 svd->monitordestroy[svd->numbermonitors++] = monitordestroy;
91
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.
278 PetscFunctionReturn(PETSC_SUCCESS);
92 }
93
94 /*@
95 SVDMonitorCancel - Clears all monitors for an `SVD` object.
96
97 Logically Collective
98
99 Input Parameter:
100 . svd - the singular value solver context
101
102 Options Database Key:
103 . -svd_monitor_cancel - cancels all monitors that have been hardwired into a code by calls to
104 `SVDMonitorSet()`, but does not cancel those set via the options database.
105
106 Level: intermediate
107
108 .seealso: [](ch:svd), `SVDMonitorSet()`
109 @*/
110 2551 PetscErrorCode SVDMonitorCancel(SVD svd)
111 {
112 2551 PetscInt i;
113
114
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2551 PetscFunctionBegin;
115
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.
2551 PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
116
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2829 for (i=0; i<svd->numbermonitors; i++) {
117
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.
278 if (svd->monitordestroy[i]) PetscCall((*svd->monitordestroy[i])(&svd->monitorcontext[i]));
118 }
119 2551 svd->numbermonitors = 0;
120
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.
2551 PetscFunctionReturn(PETSC_SUCCESS);
121 }
122
123 /*@C
124 SVDGetMonitorContext - Gets the monitor context, as set by
125 `SVDMonitorSet()` for the FIRST monitor only.
126
127 Not Collective
128
129 Input Parameter:
130 . svd - the singular value solver context
131
132 Output Parameter:
133 . ctx - monitor context
134
135 Level: intermediate
136
137 .seealso: [](ch:svd), `SVDMonitorSet()`
138 @*/
139 PetscErrorCode SVDGetMonitorContext(SVD svd,void *ctx)
140 {
141 PetscFunctionBegin;
142 PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
143 *(void**)ctx = svd->monitorcontext[0];
144 PetscFunctionReturn(PETSC_SUCCESS);
145 }
146
147 /*@C
148 SVDMonitorFirst - Print the first unconverged approximate value and
149 error estimate at each iteration of the singular value solver.
150
151 Collective
152
153 Input Parameters:
154 + svd - the singular value solver context
155 . its - iteration number
156 . nconv - number of converged singular triplets so far
157 . sigma - singular values
158 . errest - error estimates
159 . nest - number of error estimates to display
160 - vf - viewer and format for monitoring
161
162 Options Database Key:
163 . -svd_monitor - activates `SVDMonitorFirst()`
164
165 Note:
166 This is not called directly by users, rather one calls `SVDMonitorSet()`, with this
167 function as an argument, to cause the monitor to be used during the `SVD` solve.
168
169 Level: intermediate
170
171 .seealso: [](ch:svd), `SVDMonitorSet()`, `SVDMonitorAll()`, `SVDMonitorConditioning()`, `SVDMonitorConverged()`
172 @*/
173 70 PetscErrorCode SVDMonitorFirst(SVD svd,PetscInt its,PetscInt nconv,PetscReal sigma[],PetscReal errest[],PetscInt nest,PetscViewerAndFormat *vf)
174 {
175 70 PetscViewer viewer = vf->viewer;
176
177
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
70 PetscFunctionBegin;
178
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.
70 PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
179
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.
70 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,7);
180
7/10
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
70 if (its==1 && ((PetscObject)svd)->prefix) PetscCall(PetscViewerASCIIPrintf(viewer," Singular value approximations and residual norms for %s solve.\n",((PetscObject)svd)->prefix));
181
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
70 if (nconv<nest) {
182
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.
70 PetscCall(PetscViewerPushFormat(viewer,vf->format));
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.
70 PetscCall(PetscViewerASCIIAddTab(viewer,((PetscObject)svd)->tablevel));
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.
70 PetscCall(PetscViewerASCIIPrintf(viewer,"%3" PetscInt_FMT " SVD nconv=%" PetscInt_FMT " first unconverged value (error)",its,nconv));
185
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.
70 PetscCall(PetscViewerASCIIUseTabs(viewer,PETSC_FALSE));
186
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.
70 PetscCall(PetscViewerASCIIPrintf(viewer," %g (%10.8e)\n",(double)sigma[nconv],(double)errest[nconv]));
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.
70 PetscCall(PetscViewerASCIIUseTabs(viewer,PETSC_TRUE));
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.
70 PetscCall(PetscViewerASCIISubtractTab(viewer,((PetscObject)svd)->tablevel));
189
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.
70 PetscCall(PetscViewerPopFormat(viewer));
190 }
191
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.
14 PetscFunctionReturn(PETSC_SUCCESS);
192 }
193
194 /*@C
195 SVDMonitorAll - Print the current approximate values and
196 error estimates at each iteration of the singular value solver.
197
198 Collective
199
200 Input Parameters:
201 + svd - the singular value solver context
202 . its - iteration number
203 . nconv - number of converged singular triplets so far
204 . sigma - singular values
205 . errest - error estimates
206 . nest - number of error estimates to display
207 - vf - viewer and format for monitoring
208
209 Options Database Key:
210 . -svd_monitor_all - activates `SVDMonitorAll()`
211
212 Note:
213 This is not called directly by users, rather one calls `SVDMonitorSet()`, with this
214 function as an argument, to cause the monitor to be used during the `SVD` solve.
215
216 Level: intermediate
217
218 .seealso: [](ch:svd), `SVDMonitorSet()`, `SVDMonitorFirst()`, `SVDMonitorConditioning()`, `SVDMonitorConverged()`
219 @*/
220 20 PetscErrorCode SVDMonitorAll(SVD svd,PetscInt its,PetscInt nconv,PetscReal sigma[],PetscReal errest[],PetscInt nest,PetscViewerAndFormat *vf)
221 {
222 20 PetscInt i;
223 20 PetscViewer viewer = vf->viewer;
224
225
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
20 PetscFunctionBegin;
226
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.
20 PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
227
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.
20 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,7);
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.
20 PetscCall(PetscViewerPushFormat(viewer,vf->format));
229
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(PetscViewerASCIIAddTab(viewer,((PetscObject)svd)->tablevel));
230
2/10
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
20 if (its==1 && ((PetscObject)svd)->prefix) PetscCall(PetscViewerASCIIPrintf(viewer," Singular value approximations and residual norms for %s solve.\n",((PetscObject)svd)->prefix));
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.
20 PetscCall(PetscViewerASCIIPrintf(viewer,"%3" PetscInt_FMT " SVD nconv=%" PetscInt_FMT " Values (Errors)",its,nconv));
232
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(PetscViewerASCIIUseTabs(viewer,PETSC_FALSE));
233
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.
140 for (i=0;i<nest;i++) PetscCall(PetscViewerASCIIPrintf(viewer," %g (%10.8e)",(double)sigma[i],(double)errest[i]));
234
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(PetscViewerASCIIPrintf(viewer,"\n"));
235
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(PetscViewerASCIIUseTabs(viewer,PETSC_TRUE));
236
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(PetscViewerASCIISubtractTab(viewer,((PetscObject)svd)->tablevel));
237
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(PetscViewerPopFormat(viewer));
238
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.
4 PetscFunctionReturn(PETSC_SUCCESS);
239 }
240
241 /*@C
242 SVDMonitorConverged - Print the approximate values and
243 error estimates as they converge.
244
245 Collective
246
247 Input Parameters:
248 + svd - the singular value solver context
249 . its - iteration number
250 . nconv - number of converged singular triplets so far
251 . sigma - singular values
252 . errest - error estimates
253 . nest - number of error estimates to display
254 - vf - viewer and format for monitoring
255
256 Options Database Key:
257 . -svd_monitor_conv - activates `SVDMonitorConverged()`
258
259 Notes:
260 This is not called directly by users, rather one calls `SVDMonitorSet()`, with this
261 function as an argument, to cause the monitor to be used during the `SVD` solve.
262
263 Call `SVDMonitorConvergedCreate()` to create the context used with this monitor.
264
265 Level: intermediate
266
267 .seealso: [](ch:svd), `SVDMonitorSet()`, `SVDMonitorConvergedCreate()`, `SVDMonitorFirst()`, `SVDMonitorConditioning()`, `SVDMonitorAll()`
268 @*/
269 20 PetscErrorCode SVDMonitorConverged(SVD svd,PetscInt its,PetscInt nconv,PetscReal sigma[],PetscReal errest[],PetscInt nest,PetscViewerAndFormat *vf)
270 {
271 20 PetscInt i,*oldnconv;
272 20 PetscViewer viewer = vf->viewer;
273
274
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
20 PetscFunctionBegin;
275
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.
20 PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
276
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.
20 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,7);
277 20 oldnconv = (PetscInt*)vf->data;
278
2/10
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
20 if (its==1 && ((PetscObject)svd)->prefix) PetscCall(PetscViewerASCIIPrintf(viewer," Convergence history for %s solve.\n",((PetscObject)svd)->prefix));
279
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
20 if (its==1) *oldnconv = 0;
280
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
20 if (*oldnconv!=nconv) {
281
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(PetscViewerPushFormat(viewer,vf->format));
282
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(PetscViewerASCIIAddTab(viewer,((PetscObject)svd)->tablevel));
283
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
140 for (i=*oldnconv;i<nconv;i++) {
284
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.
120 PetscCall(PetscViewerASCIIPrintf(viewer,"%3" PetscInt_FMT " SVD converged value (error) #%" PetscInt_FMT,its,i));
285
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.
120 PetscCall(PetscViewerASCIIUseTabs(viewer,PETSC_FALSE));
286
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.
120 PetscCall(PetscViewerASCIIPrintf(viewer," %g (%10.8e)\n",(double)sigma[i],(double)errest[i]));
287
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.
120 PetscCall(PetscViewerASCIIUseTabs(viewer,PETSC_TRUE));
288 }
289
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(PetscViewerASCIISubtractTab(viewer,((PetscObject)svd)->tablevel));
290
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(PetscViewerPopFormat(viewer));
291 20 *oldnconv = nconv;
292 }
293
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.
4 PetscFunctionReturn(PETSC_SUCCESS);
294 }
295
296 /*@C
297 SVDMonitorConvergedCreate - Creates the context for the convergence history monitor.
298
299 Collective
300
301 Input Parameters:
302 + viewer - the viewer
303 . format - the viewer format
304 - ctx - an optional user context
305
306 Output Parameter:
307 . vf - the viewer and format context
308
309 Level: intermediate
310
311 .seealso: [](ch:svd), `SVDMonitorSet()`
312 @*/
313 50 PetscErrorCode SVDMonitorConvergedCreate(PetscViewer viewer,PetscViewerFormat format,void *ctx,PetscViewerAndFormat **vf)
314 {
315 50 PetscInt *oldnconv;
316
317
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
50 PetscFunctionBegin;
318
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.
50 PetscCall(PetscViewerAndFormatCreate(viewer,format,vf));
319
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.
50 PetscCall(PetscNew(&oldnconv));
320 50 (*vf)->data = (void*)oldnconv;
321 50 (*vf)->data_destroy = PetscCtxDestroyDefault;
322
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.
50 PetscFunctionReturn(PETSC_SUCCESS);
323 }
324
325 /*@C
326 SVDMonitorFirstDrawLG - Plots the error estimate of the first unconverged
327 approximation at each iteration of the singular value solver.
328
329 Collective
330
331 Input Parameters:
332 + svd - the singular value solver context
333 . its - iteration number
334 . nconv - number of converged singular triplets so far
335 . sigma - singular values
336 . errest - error estimates
337 . nest - number of error estimates to display
338 - vf - viewer and format for monitoring
339
340 Options Database Key:
341 . -svd_monitor draw::draw_lg - activates `SVDMonitorFirstDrawLG()`
342
343 Notes:
344 This is not called directly by users, rather one calls `SVDMonitorSet()`, with this
345 function as an argument, to cause the monitor to be used during the `SVD` solve.
346
347 Call `SVDMonitorFirstDrawLGCreate()` to create the context used with this monitor.
348
349 Level: intermediate
350
351 .seealso: [](ch:svd), `SVDMonitorSet()`, `SVDMonitorFirstDrawLGCreate()`
352 @*/
353 36 PetscErrorCode SVDMonitorFirstDrawLG(SVD svd,PetscInt its,PetscInt nconv,PetscReal sigma[],PetscReal errest[],PetscInt nest,PetscViewerAndFormat *vf)
354 {
355 36 PetscViewer viewer = vf->viewer;
356 36 PetscDrawLG lg;
357 36 PetscReal x,y;
358
359
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
36 PetscFunctionBegin;
360
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.
36 PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
361
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.
36 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,7);
362
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
36 PetscCall(PetscViewerPushFormat(viewer,vf->format));
363
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
36 PetscCall(PetscViewerDrawGetDrawLG(viewer,0,&lg));
364
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 9 times.
36 if (its==1) {
365
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
18 PetscCall(PetscDrawLGReset(lg));
366
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
18 PetscCall(PetscDrawLGSetDimension(lg,1));
367
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
18 PetscCall(PetscDrawLGSetLimits(lg,1,1,PetscLog10Real(svd->tol)-2,0.0));
368 }
369
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 9 times.
36 if (nconv<nest) {
370 27 x = (PetscReal)its;
371
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
27 if (errest[nconv] > 0.0) y = PetscLog10Real(errest[nconv]);
372 else y = 0.0;
373
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
27 PetscCall(PetscDrawLGAddPoint(lg,&x,&y));
374
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
27 if (its <= 20 || !(its % 5) || svd->reason) {
375
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
27 PetscCall(PetscDrawLGDraw(lg));
376
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
27 PetscCall(PetscDrawLGSave(lg));
377 }
378 }
379
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
36 PetscCall(PetscViewerPopFormat(viewer));
380
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.
8 PetscFunctionReturn(PETSC_SUCCESS);
381 }
382
383 /*@C
384 SVDMonitorFirstDrawLGCreate - Creates the plotter for the first error estimate.
385
386 Collective
387
388 Input Parameters:
389 + viewer - the viewer
390 . format - the viewer format
391 - ctx - an optional user context
392
393 Output Parameter:
394 . vf - the viewer and format context
395
396 Level: intermediate
397
398 .seealso: [](ch:svd), `SVDMonitorSet()`
399 @*/
400 18 PetscErrorCode SVDMonitorFirstDrawLGCreate(PetscViewer viewer,PetscViewerFormat format,void *ctx,PetscViewerAndFormat **vf)
401 {
402
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
18 PetscFunctionBegin;
403
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
18 PetscCall(PetscViewerAndFormatCreate(viewer,format,vf));
404 18 (*vf)->data = ctx;
405
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
18 PetscCall(PetscViewerMonitorLGSetUp(viewer,NULL,"First Error Estimate","Log Error Estimate",1,NULL,PETSC_DECIDE,PETSC_DECIDE,400,300));
406
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.
4 PetscFunctionReturn(PETSC_SUCCESS);
407 }
408
409 /*@C
410 SVDMonitorAllDrawLG - Plots the error estimate of all unconverged
411 approximations at each iteration of the singular value solver.
412
413 Collective
414
415 Input Parameters:
416 + svd - the singular value solver context
417 . its - iteration number
418 . nconv - number of converged singular triplets so far
419 . sigma - singular values
420 . errest - error estimates
421 . nest - number of error estimates to display
422 - vf - viewer and format for monitoring
423
424 Options Database Key:
425 . -svd_monitor_all draw::draw_lg - activates `SVDMonitorAllDrawLG()`
426
427 Notes:
428 This is not called directly by users, rather one calls `SVDMonitorSet()`, with this
429 function as an argument, to cause the monitor to be used during the `SVD` solve.
430
431 Call `SVDMonitorAllDrawLGCreate()` to create the context used with this monitor.
432
433 Level: intermediate
434
435 .seealso: [](ch:svd), `SVDMonitorSet()`, `SVDMonitorAllDrawLGCreate()`
436 @*/
437 9 PetscErrorCode SVDMonitorAllDrawLG(SVD svd,PetscInt its,PetscInt nconv,PetscReal sigma[],PetscReal errest[],PetscInt nest,PetscViewerAndFormat *vf)
438 {
439 9 PetscViewer viewer = vf->viewer;
440 9 PetscDrawLG lg;
441 9 PetscInt i,n = PetscMin(svd->nsv,255);
442 9 PetscReal *x,*y;
443
444
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
9 PetscFunctionBegin;
445
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.
9 PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
446
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.
9 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,7);
447
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9 PetscCall(PetscViewerPushFormat(viewer,vf->format));
448
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9 PetscCall(PetscViewerDrawGetDrawLG(viewer,0,&lg));
449
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
9 if (its==1) {
450
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9 PetscCall(PetscDrawLGReset(lg));
451
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9 PetscCall(PetscDrawLGSetDimension(lg,n));
452
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9 PetscCall(PetscDrawLGSetLimits(lg,1,1,PetscLog10Real(svd->tol)-2,0.0));
453 }
454
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9 PetscCall(PetscMalloc2(n,&x,n,&y));
455
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 9 times.
18 for (i=0;i<n;i++) {
456 9 x[i] = (PetscReal)its;
457
2/4
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 9 times.
9 if (i < nest && errest[i] > 0.0) y[i] = PetscLog10Real(errest[i]);
458 9 else y[i] = 0.0;
459 }
460
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9 PetscCall(PetscDrawLGAddPoint(lg,x,y));
461
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
9 if (its <= 20 || !(its % 5) || svd->reason) {
462
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9 PetscCall(PetscDrawLGDraw(lg));
463
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9 PetscCall(PetscDrawLGSave(lg));
464 }
465
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9 PetscCall(PetscFree2(x,y));
466
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9 PetscCall(PetscViewerPopFormat(viewer));
467
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);
468 }
469
470 /*@C
471 SVDMonitorAllDrawLGCreate - Creates the plotter for all the error estimates.
472
473 Collective
474
475 Input Parameters:
476 + viewer - the viewer
477 . format - the viewer format
478 - ctx - an optional user context
479
480 Output Parameter:
481 . vf - the viewer and format context
482
483 Level: intermediate
484
485 .seealso: [](ch:svd), `SVDMonitorSet()`
486 @*/
487 9 PetscErrorCode SVDMonitorAllDrawLGCreate(PetscViewer viewer,PetscViewerFormat format,void *ctx,PetscViewerAndFormat **vf)
488 {
489
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
9 PetscFunctionBegin;
490
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9 PetscCall(PetscViewerAndFormatCreate(viewer,format,vf));
491 9 (*vf)->data = ctx;
492
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9 PetscCall(PetscViewerMonitorLGSetUp(viewer,NULL,"All Error Estimates","Log Error Estimate",1,NULL,PETSC_DECIDE,PETSC_DECIDE,400,300));
493
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);
494 }
495
496 /*@C
497 SVDMonitorConvergedDrawLG - Plots the number of converged eigenvalues
498 at each iteration of the singular value solver.
499
500 Collective
501
502 Input Parameters:
503 + svd - the singular value solver context
504 . its - iteration number
505 . nconv - number of converged singular triplets so far
506 . sigma - singular values
507 . errest - error estimates
508 . nest - number of error estimates to display
509 - vf - viewer and format for monitoring
510
511 Options Database Key:
512 . -svd_monitor_conv draw::draw_lg - activates `SVDMonitorConvergedDrawLG()`
513
514 Notes:
515 This is not called directly by users, rather one calls `SVDMonitorSet()`, with this
516 function as an argument, to cause the monitor to be used during the `SVD` solve.
517
518 Call `SVDMonitorConvergedDrawLGCreate()` to create the context used with this monitor.
519
520 Level: intermediate
521
522 .seealso: [](ch:svd), `SVDMonitorSet()`, `SVDMonitorConvergedDrawLGCreate()`
523 @*/
524 PetscErrorCode SVDMonitorConvergedDrawLG(SVD svd,PetscInt its,PetscInt nconv,PetscReal sigma[],PetscReal errest[],PetscInt nest,PetscViewerAndFormat *vf)
525 {
526 PetscViewer viewer = vf->viewer;
527 PetscDrawLG lg;
528 PetscReal x,y;
529
530 PetscFunctionBegin;
531 PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
532 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,7);
533 PetscCall(PetscViewerPushFormat(viewer,vf->format));
534 PetscCall(PetscViewerDrawGetDrawLG(viewer,0,&lg));
535 if (its==1) {
536 PetscCall(PetscDrawLGReset(lg));
537 PetscCall(PetscDrawLGSetDimension(lg,1));
538 PetscCall(PetscDrawLGSetLimits(lg,1,1,0,svd->nsv));
539 }
540 x = (PetscReal)its;
541 y = (PetscReal)svd->nconv;
542 PetscCall(PetscDrawLGAddPoint(lg,&x,&y));
543 if (its <= 20 || !(its % 5) || svd->reason) {
544 PetscCall(PetscDrawLGDraw(lg));
545 PetscCall(PetscDrawLGSave(lg));
546 }
547 PetscCall(PetscViewerPopFormat(viewer));
548 PetscFunctionReturn(PETSC_SUCCESS);
549 }
550
551 /*@C
552 SVDMonitorConvergedDrawLGCreate - Creates the plotter for the convergence history.
553
554 Collective
555
556 Input Parameters:
557 + viewer - the viewer
558 . format - the viewer format
559 - ctx - an optional user context
560
561 Output Parameter:
562 . vf - the viewer and format context
563
564 Level: intermediate
565
566 .seealso: [](ch:svd), `SVDMonitorSet()`
567 @*/
568 PetscErrorCode SVDMonitorConvergedDrawLGCreate(PetscViewer viewer,PetscViewerFormat format,void *ctx,PetscViewerAndFormat **vf)
569 {
570 PetscInt *oldnconv;
571
572 PetscFunctionBegin;
573 PetscCall(PetscViewerAndFormatCreate(viewer,format,vf));
574 PetscCall(PetscNew(&oldnconv));
575 (*vf)->data = (void*)oldnconv;
576 (*vf)->data_destroy = PetscCtxDestroyDefault;
577 PetscCall(PetscViewerMonitorLGSetUp(viewer,NULL,"Convergence History","Number Converged",1,NULL,PETSC_DECIDE,PETSC_DECIDE,400,300));
578 PetscFunctionReturn(PETSC_SUCCESS);
579 }
580
581 /*@C
582 SVDMonitorConditioning - Print the condition number at each iteration of the singular
583 value solver.
584
585 Collective
586
587 Input Parameters:
588 + svd - the singular value solver context
589 . its - iteration number
590 . nconv - (unused) number of converged singular triplets so far
591 . sigma - (unused) singular values
592 . errest - (unused) error estimates
593 . nest - (unused) number of error estimates to display
594 - vf - viewer and format for monitoring
595
596 Options Database Key:
597 . -svd_monitor_conditioning - activates `SVDMonitorConditioning()`
598
599 Notes:
600 This is not called directly by users, rather one calls `SVDMonitorSet()`, with this
601 function as an argument, to cause the monitor to be used during the `SVD` solve.
602
603 Works only for solvers that use a `DS` of type `DSGSVD`. The printed information corresponds
604 to the maximum of the condition number of the two generated bidiagonal matrices.
605
606 Level: intermediate
607
608 .seealso: [](ch:svd), `SVDMonitorSet()`, `SVDMonitorAll()`, `SVDMonitorFirst()`, `SVDMonitorConverged()`
609 @*/
610 70 PetscErrorCode SVDMonitorConditioning(SVD svd,PetscInt its,PetscInt nconv,PetscReal sigma[],PetscReal errest[],PetscInt nest,PetscViewerAndFormat *vf)
611 {
612 70 PetscViewer viewer = vf->viewer;
613 70 PetscBool isgsvd;
614 70 PetscReal cond;
615
616
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
70 PetscFunctionBegin;
617
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.
70 PetscValidHeaderSpecific(svd,SVD_CLASSID,1);
618
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.
70 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,7);
619
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.
70 PetscCall(PetscObjectTypeCompare((PetscObject)svd->ds,DSGSVD,&isgsvd));
620
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.
70 if (!isgsvd) PetscFunctionReturn(PETSC_SUCCESS);
621
3/10
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
70 if (its==1 && ((PetscObject)svd)->prefix) PetscCall(PetscViewerASCIIPrintf(viewer," Condition number of bidiagonal matrices for %s solve.\n",((PetscObject)svd)->prefix));
622
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.
70 PetscCall(PetscViewerPushFormat(viewer,vf->format));
623
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.
70 PetscCall(PetscViewerASCIIAddTab(viewer,((PetscObject)svd)->tablevel));
624
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.
70 PetscCall(DSCond(svd->ds,&cond));
625
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.
70 PetscCall(PetscViewerASCIIPrintf(viewer,"%3" PetscInt_FMT " SVD condition number = %g\n",its,(double)cond));
626
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.
70 PetscCall(PetscViewerASCIISubtractTab(viewer,((PetscObject)svd)->tablevel));
627
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.
70 PetscCall(PetscViewerPopFormat(viewer));
628
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.
14 PetscFunctionReturn(PETSC_SUCCESS);
629 }
630