GCC Code Coverage Report


Directory: ./
File: src/mfn/interface/mfnmon.c
Date: 2025-10-03 04:28:47
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 - matrix function context obtained from MFNCreate()
37 . monitor - pointer to function (if this is NULL, it turns off monitoring), see MFNMonitorFn
38 . mctx - [optional] context for private data for the
39 monitor routine (use NULL if no context is desired)
40 - monitordestroy - [optional] routine that frees monitor context (may be NULL),
41 see PetscCtxDestroyFn for the calling sequence
42
43 Options Database Keys:
44 + -mfn_monitor - print the error estimate
45 . -mfn_monitor draw::draw_lg - sets line graph monitor for the error estimate
46 - -mfn_monitor_cancel - cancels all monitors that have been hardwired into
47 a code by calls to MFNMonitorSet(), but does not cancel those set via
48 the options database.
49
50 Notes:
51 The options database option -mfn_monitor and related options are the easiest way
52 to turn on MFN iteration monitoring.
53
54 MFNMonitorRegister() provides a way to associate an options database key with MFN
55 monitor function.
56
57 Several different monitoring routines may be set by calling MFNMonitorSet() multiple
58 times; all will be called in the order in which they were set.
59
60 Level: intermediate
61
62 .seealso: MFNMonitorCancel()
63 @*/
64 46 PetscErrorCode MFNMonitorSet(MFN mfn,MFNMonitorFn *monitor,void *mctx,PetscCtxDestroyFn *monitordestroy)
65 {
66 46 PetscInt i;
67 46 PetscBool identical;
68
69
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
46 PetscFunctionBegin;
70
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);
71
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
46 for (i=0;i<mfn->numbermonitors;i++) {
72
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));
73
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);
74 }
75
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");
76 36 mfn->monitor[mfn->numbermonitors] = monitor;
77 36 mfn->monitorcontext[mfn->numbermonitors] = mctx;
78 36 mfn->monitordestroy[mfn->numbermonitors++] = monitordestroy;
79
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);
80 }
81
82 /*@
83 MFNMonitorCancel - Clears all monitors for an MFN object.
84
85 Logically Collective
86
87 Input Parameters:
88 . mfn - matrix function context obtained from MFNCreate()
89
90 Options Database Key:
91 . -mfn_monitor_cancel - cancels all monitors that have been hardwired
92 into a code by calls to MFNMonitorSet(),
93 but does not cancel those set via the options database.
94
95 Level: intermediate
96
97 .seealso: MFNMonitorSet()
98 @*/
99 313 PetscErrorCode MFNMonitorCancel(MFN mfn)
100 {
101 313 PetscInt i;
102
103
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
313 PetscFunctionBegin;
104
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);
105
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
349 for (i=0; i<mfn->numbermonitors; i++) {
106
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]));
107 }
108 313 mfn->numbermonitors = 0;
109
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);
110 }
111
112 /*@C
113 MFNGetMonitorContext - Gets the monitor context, as set by
114 MFNMonitorSet() for the FIRST monitor only.
115
116 Not Collective
117
118 Input Parameter:
119 . mfn - matrix function context obtained from MFNCreate()
120
121 Output Parameter:
122 . ctx - monitor context
123
124 Level: intermediate
125
126 .seealso: MFNMonitorSet()
127 @*/
128 PetscErrorCode MFNGetMonitorContext(MFN mfn,void *ctx)
129 {
130 PetscFunctionBegin;
131 PetscValidHeaderSpecific(mfn,MFN_CLASSID,1);
132 *(void**)ctx = mfn->monitorcontext[0];
133 PetscFunctionReturn(PETSC_SUCCESS);
134 }
135
136 /*@C
137 MFNMonitorDefault - Print the error estimate of the current approximation at each
138 iteration of the matrix function solver.
139
140 Collective
141
142 Input Parameters:
143 + mfn - matrix function context
144 . its - iteration number
145 . errest - error estimate
146 - vf - viewer and format for monitoring
147
148 Options Database Key:
149 . -mfn_monitor - activates MFNMonitorDefault()
150
151 Level: intermediate
152
153 .seealso: MFNMonitorSet()
154 @*/
155 30 PetscErrorCode MFNMonitorDefault(MFN mfn,PetscInt its,PetscReal errest,PetscViewerAndFormat *vf)
156 {
157 30 PetscViewer viewer = vf->viewer;
158
159
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
30 PetscFunctionBegin;
160
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);
161
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);
162
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));
163
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));
164
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));
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(PetscViewerASCIIPrintf(viewer,"%3" PetscInt_FMT " MFN Error estimate %14.12e\n",its,(double)errest));
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(PetscViewerASCIISubtractTab(viewer,((PetscObject)mfn)->tablevel));
167
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));
168
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);
169 }
170
171 /*@C
172 MFNMonitorDefaultDrawLG - Plots the error estimate of the current approximation at each
173 iteration of the matrix function solver.
174
175 Collective
176
177 Input Parameters:
178 + mfn - matrix function context
179 . its - iteration number
180 . errest - error estimate
181 - vf - viewer and format for monitoring
182
183 Options Database Key:
184 . -mfn_monitor draw::draw_lg - activates MFNMonitorDefaultDrawLG()
185
186 Level: intermediate
187
188 .seealso: MFNMonitorSet()
189 @*/
190 24 PetscErrorCode MFNMonitorDefaultDrawLG(MFN mfn,PetscInt its,PetscReal errest,PetscViewerAndFormat *vf)
191 {
192 24 PetscViewer viewer = vf->viewer;
193 24 PetscDrawLG lg;
194 24 PetscReal x,y;
195
196
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
24 PetscFunctionBegin;
197
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);
198
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);
199
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));
200
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));
201
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
24 if (its==1) {
202
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));
203
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));
204
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));
205 }
206 24 x = (PetscReal)its;
207
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
24 if (errest > 0.0) y = PetscLog10Real(errest);
208 else y = 0.0;
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(PetscDrawLGAddPoint(lg,&x,&y));
210
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) {
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.
24 PetscCall(PetscDrawLGDraw(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.
24 PetscCall(PetscDrawLGSave(lg));
213 }
214
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));
215
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);
216 }
217
218 /*@C
219 MFNMonitorDefaultDrawLGCreate - Creates the plotter for the error estimate.
220
221 Collective
222
223 Input Parameters:
224 + viewer - the viewer
225 . format - the viewer format
226 - ctx - an optional user context
227
228 Output Parameter:
229 . vf - the viewer and format context
230
231 Level: intermediate
232
233 .seealso: MFNMonitorSet()
234 @*/
235 8 PetscErrorCode MFNMonitorDefaultDrawLGCreate(PetscViewer viewer,PetscViewerFormat format,void *ctx,PetscViewerAndFormat **vf)
236 {
237
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
8 PetscFunctionBegin;
238
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));
239 8 (*vf)->data = ctx;
240
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));
241
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);
242 }
243