GCC Code Coverage Report


Directory: ./
File: src/nep/interface/nepmon.c
Date: 2025-10-04 04:19:13
Exec Total Coverage
Lines: 166 202 82.2%
Functions: 12 15 80.0%
Branches: 427 1042 41.0%

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