GCC Code Coverage Report


Directory: ./
File: src/mfn/interface/mfnmon.c
Date: 2025-12-10 04:20:18
Exec Total Coverage
Lines: 65 71 91.5%
Functions: 6 7 85.7%
Branches: 164 370 44.3%

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 MFN routines related to monitors
12 */
13
14 #include <slepc/private/mfnimpl.h> /*I "slepcmfn.h" I*/
15 #include <petscdraw.h>
16
17 /*
18 Runs the user provided monitor routines, if any.
19 */
20 2392 PetscErrorCode MFNMonitor(MFN mfn,PetscInt it,PetscReal errest)
21 {
22 2392 PetscInt i,n = mfn->numbermonitors;
23
24
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2392 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.
2446 for (i=0;i<n;i++) PetscCall((*mfn->monitor[i])(mfn,it,errest,mfn->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.
467 PetscFunctionReturn(PETSC_SUCCESS);
27 }
28
29 /*@C
30 MFNMonitorSet - Sets an ADDITIONAL function to be called at every
31 iteration to monitor convergence.
32
33 Logically Collective
34
35 Input Parameters:
36 + mfn - the matrix function solver context
37 . monitor - pointer to function (if this is `NULL`, it turns off monitoring),
38 see `MFNMonitorFn`
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 + -mfn_monitor - print the error estimate
46 . -mfn_monitor draw::draw_lg - sets line graph monitor for the error estimate
47 - -mfn_monitor_cancel - cancels all monitors that have been hardwired into
48 a code by calls to `MFNMonitorSet()`, but does not cancel
49 those set via the options database.
50
51 Notes:
52 The options database option `-mfn_monitor` and related options are the easiest way
53 to turn on `MFN` iteration monitoring.
54
55 `MFNMonitorRegister()` provides a way to associate an options database key with `MFN`
56 monitor function.
57
58 Several different monitoring routines may be set by calling `MFNMonitorSet()` multiple
59 times; all will be called in the order in which they were set.
60
61 Fortran Note:
62 Only a single monitor function can be set for each `LME` object.
63
64 Level: intermediate
65
66 .seealso: [](ch:mfn), `MFNMonitorDefault()`, `MFNMonitorDefaultDrawLG()`, `MFNMonitorCancel()`
67 @*/
68 46 PetscErrorCode MFNMonitorSet(MFN mfn,MFNMonitorFn *monitor,void *mctx,PetscCtxDestroyFn *monitordestroy)
69 {
70 46 PetscInt i;
71 46 PetscBool identical;
72
73
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
46 PetscFunctionBegin;
74
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.
46 PetscValidHeaderSpecific(mfn,MFN_CLASSID,1);
75
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
46 for (i=0;i<mfn->numbermonitors;i++) {
76
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.
10 PetscCall(PetscMonitorCompare((PetscErrorCode(*)(void))(PetscVoidFn*)monitor,mctx,monitordestroy,(PetscErrorCode (*)(void))(PetscVoidFn*)mfn->monitor[i],mfn->monitorcontext[i],mfn->monitordestroy[i],&identical));
77
8/14
✓ 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.
✓ 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.
10 if (identical) PetscFunctionReturn(PETSC_SUCCESS);
78 }
79
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
36 PetscCheck(mfn->numbermonitors<MAXMFNMONITORS,PetscObjectComm((PetscObject)mfn),PETSC_ERR_ARG_OUTOFRANGE,"Too many MFN monitors set");
80 36 mfn->monitor[mfn->numbermonitors] = monitor;
81 36 mfn->monitorcontext[mfn->numbermonitors] = mctx;
82 36 mfn->monitordestroy[mfn->numbermonitors++] = monitordestroy;
83
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.
36 PetscFunctionReturn(PETSC_SUCCESS);
84 }
85
86 /*@
87 MFNMonitorCancel - Clears all monitors for an `MFN` object.
88
89 Logically Collective
90
91 Input Parameter:
92 . mfn - the matrix function solver context
93
94 Options Database Key:
95 . -mfn_monitor_cancel - cancels all monitors that have been hardwired into a code by calls to
96 `MFNMonitorSet()`, but does not cancel those set via the options database.
97
98 Level: intermediate
99
100 .seealso: [](ch:mfn), `MFNMonitorSet()`
101 @*/
102 313 PetscErrorCode MFNMonitorCancel(MFN mfn)
103 {
104 313 PetscInt i;
105
106
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
313 PetscFunctionBegin;
107
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.
313 PetscValidHeaderSpecific(mfn,MFN_CLASSID,1);
108
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
349 for (i=0; i<mfn->numbermonitors; i++) {
109
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.
36 if (mfn->monitordestroy[i]) PetscCall((*mfn->monitordestroy[i])(&mfn->monitorcontext[i]));
110 }
111 313 mfn->numbermonitors = 0;
112
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.
313 PetscFunctionReturn(PETSC_SUCCESS);
113 }
114
115 /*@C
116 MFNGetMonitorContext - Gets the monitor context, as set by
117 `MFNMonitorSet()` for the FIRST monitor only.
118
119 Not Collective
120
121 Input Parameter:
122 . mfn - the matrix function solver context
123
124 Output Parameter:
125 . ctx - monitor context
126
127 Level: intermediate
128
129 .seealso: [](ch:mfn), `MFNMonitorSet()`
130 @*/
131 PetscErrorCode MFNGetMonitorContext(MFN mfn,void *ctx)
132 {
133 PetscFunctionBegin;
134 PetscValidHeaderSpecific(mfn,MFN_CLASSID,1);
135 *(void**)ctx = mfn->monitorcontext[0];
136 PetscFunctionReturn(PETSC_SUCCESS);
137 }
138
139 /*@C
140 MFNMonitorDefault - Print the error estimate of the current approximation at each
141 iteration of the matrix function solver.
142
143 Collective
144
145 Input Parameters:
146 + mfn - the matrix function solver context
147 . its - iteration number
148 . errest - error estimate
149 - vf - viewer and format for monitoring
150
151 Options Database Key:
152 . -mfn_monitor - activates `MFNMonitorDefault()`
153
154 Level: intermediate
155
156 .seealso: [](ch:mfn), `MFNMonitorSet()`
157 @*/
158 30 PetscErrorCode MFNMonitorDefault(MFN mfn,PetscInt its,PetscReal errest,PetscViewerAndFormat *vf)
159 {
160 30 PetscViewer viewer = vf->viewer;
161
162
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
30 PetscFunctionBegin;
163
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(mfn,MFN_CLASSID,1);
164
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(viewer,PETSC_VIEWER_CLASSID,4);
165
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(PetscViewerPushFormat(viewer,vf->format));
166
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(PetscViewerASCIIAddTab(viewer,((PetscObject)mfn)->tablevel));
167
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.
30 if (its == 1 && ((PetscObject)mfn)->prefix) PetscCall(PetscViewerASCIIPrintf(viewer," Error estimates for %s solve.\n",((PetscObject)mfn)->prefix));
168
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(PetscViewerASCIIPrintf(viewer,"%3" PetscInt_FMT " MFN Error estimate %14.12e\n",its,(double)errest));
169
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(PetscViewerASCIISubtractTab(viewer,((PetscObject)mfn)->tablevel));
170
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(PetscViewerPopFormat(viewer));
171
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);
172 }
173
174 /*@C
175 MFNMonitorDefaultDrawLG - Plots the error estimate of the current approximation at each
176 iteration of the matrix function solver.
177
178 Collective
179
180 Input Parameters:
181 + mfn - the matrix function solver context
182 . its - iteration number
183 . errest - error estimate
184 - vf - viewer and format for monitoring
185
186 Options Database Key:
187 . -mfn_monitor draw::draw_lg - activates `MFNMonitorDefaultDrawLG()`
188
189 Notes:
190 This is not called directly by users, rather one calls `MFNMonitorSet()`, with this
191 function as an argument, to cause the monitor to be used during the `MFN` solve.
192
193 Call `MFNMonitorDefaultDrawLGCreate()` to create the context used with this monitor.
194
195 Level: intermediate
196
197 .seealso: [](ch:mfn), `MFNMonitorSet()`, `MFNMonitorDefaultDrawLGCreate()`
198 @*/
199 24 PetscErrorCode MFNMonitorDefaultDrawLG(MFN mfn,PetscInt its,PetscReal errest,PetscViewerAndFormat *vf)
200 {
201 24 PetscViewer viewer = vf->viewer;
202 24 PetscDrawLG lg;
203 24 PetscReal x,y;
204
205
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
24 PetscFunctionBegin;
206
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 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.
24 PetscValidHeaderSpecific(mfn,MFN_CLASSID,1);
207
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 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.
24 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,4);
208
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
24 PetscCall(PetscViewerPushFormat(viewer,vf->format));
209
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
24 PetscCall(PetscViewerDrawGetDrawLG(viewer,0,&lg));
210
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
24 if (its==1) {
211
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
8 PetscCall(PetscDrawLGReset(lg));
212
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
8 PetscCall(PetscDrawLGSetDimension(lg,1));
213
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
8 PetscCall(PetscDrawLGSetLimits(lg,1,1.0,PetscLog10Real(mfn->tol)-2,0.0));
214 }
215 24 x = (PetscReal)its;
216
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
24 if (errest > 0.0) y = PetscLog10Real(errest);
217 else y = 0.0;
218
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
24 PetscCall(PetscDrawLGAddPoint(lg,&x,&y));
219
1/6
✗ 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.
24 if (its <= 20 || !(its % 5) || mfn->reason) {
220
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
24 PetscCall(PetscDrawLGDraw(lg));
221
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
24 PetscCall(PetscDrawLGSave(lg));
222 }
223
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
24 PetscCall(PetscViewerPopFormat(viewer));
224
6/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
3 PetscFunctionReturn(PETSC_SUCCESS);
225 }
226
227 /*@C
228 MFNMonitorDefaultDrawLGCreate - Creates the plotter for the error estimate.
229
230 Collective
231
232 Input Parameters:
233 + viewer - the viewer
234 . format - the viewer format
235 - ctx - an optional user context
236
237 Output Parameter:
238 . vf - the viewer and format context
239
240 Level: intermediate
241
242 .seealso: [](ch:mfn), `MFNMonitorSet()`
243 @*/
244 8 PetscErrorCode MFNMonitorDefaultDrawLGCreate(PetscViewer viewer,PetscViewerFormat format,void *ctx,PetscViewerAndFormat **vf)
245 {
246
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
8 PetscFunctionBegin;
247
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
8 PetscCall(PetscViewerAndFormatCreate(viewer,format,vf));
248 8 (*vf)->data = ctx;
249
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
8 PetscCall(PetscViewerMonitorLGSetUp(viewer,NULL,"Error Estimate","Log Error Estimate",1,NULL,PETSC_DECIDE,PETSC_DECIDE,400,300));
250
6/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
1 PetscFunctionReturn(PETSC_SUCCESS);
251 }
252