GCC Code Coverage Report


Directory: ./
File: src/eps/interface/epsmon.c
Date: 2026-01-12 03:57:26
Exec Total Coverage
Lines: 167 204 81.9%
Functions: 12 15 80.0%
Branches: 414 1010 41.0%

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