GCC Code Coverage Report


Directory: ./
File: src/nep/interface/nepmon.c
Date: 2026-01-12 03:57:26
Exec Total Coverage
Lines: 158 194 81.4%
Functions: 11 14 78.6%
Branches: 404 992 40.7%

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