GCC Code Coverage Report


Directory: ./
File: src/pep/interface/pepmon.c
Date: 2025-10-04 04:19:13
Exec Total Coverage
Lines: 184 222 82.9%
Functions: 13 16 81.2%
Branches: 451 1098 41.1%

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