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 |