GCC Code Coverage Report


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