GCC Code Coverage Report


Directory: ./
File: src/eps/interface/epsmon.c
Date: 2025-10-04 04:19:13
Exec Total Coverage
Lines: 175 212 82.5%
Functions: 13 16 81.2%
Branches: 437 1060 41.2%

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