GCC Code Coverage Report


Directory: ./
File: src/pep/interface/pepsolve.c
Date: 2025-10-04 04:19:13
Exec Total Coverage
Lines: 188 194 96.9%
Functions: 10 10 100.0%
Branches: 480 1024 46.9%

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 the solution process
12
13 References:
14
15 [1] C. Campos and J.E. Roman, "Parallel iterative refinement in
16 polynomial eigenvalue problems", Numer. Linear Algebra Appl.
17 23(4):730-745, 2016.
18 */
19
20 #include <slepc/private/pepimpl.h> /*I "slepcpep.h" I*/
21 #include <slepc/private/bvimpl.h>
22 #include <petscdraw.h>
23
24 static PetscBool cited = PETSC_FALSE;
25 static const char citation[] =
26 "@Article{slepc-pep-refine,\n"
27 " author = \"C. Campos and J. E. Roman\",\n"
28 " title = \"Parallel iterative refinement in polynomial eigenvalue problems\",\n"
29 " journal = \"Numer. Linear Algebra Appl.\",\n"
30 " volume = \"23\",\n"
31 " number = \"4\",\n"
32 " pages = \"730--745\",\n"
33 " year = \"2016,\"\n"
34 " doi = \"https://doi.org/10.1002/nla.2052\"\n"
35 "}\n";
36
37 16727 PetscErrorCode PEPComputeVectors(PEP pep)
38 {
39
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
16727 PetscFunctionBegin;
40
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
16727 PEPCheckSolved(pep,1);
41
8/10
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ 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.
16727 if (pep->state==PEP_STATE_SOLVED) PetscTryTypeMethod(pep,computevectors);
42 16727 pep->state = PEP_STATE_EIGENVECTORS;
43
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.
16727 PetscFunctionReturn(PETSC_SUCCESS);
44 }
45
46 1756 PetscErrorCode PEPExtractVectors(PEP pep)
47 {
48
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1756 PetscFunctionBegin;
49
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1756 PEPCheckSolved(pep,1);
50
7/10
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ 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.
1756 if (pep->state==PEP_STATE_SOLVED) PetscTryTypeMethod(pep,extractvectors);
51
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.
342 PetscFunctionReturn(PETSC_SUCCESS);
52 }
53
54 /*@
55 PEPSolve - Solves the polynomial eigensystem.
56
57 Collective
58
59 Input Parameter:
60 . pep - eigensolver context obtained from PEPCreate()
61
62 Options Database Keys:
63 + -pep_view - print information about the solver used
64 . -pep_view_matk - view the coefficient matrix Ak (replace k by an integer from 0 to nmat-1)
65 . -pep_view_vectors - view the computed eigenvectors
66 . -pep_view_values - view the computed eigenvalues
67 . -pep_converged_reason - print reason for convergence, and number of iterations
68 . -pep_error_absolute - print absolute errors of each eigenpair
69 . -pep_error_relative - print relative errors of each eigenpair
70 - -pep_error_backward - print backward errors of each eigenpair
71
72 Notes:
73 All the command-line options listed above admit an optional argument specifying
74 the viewer type and options. For instance, use '-pep_view_mat0 binary:amatrix.bin'
75 to save the A matrix to a binary file, '-pep_view_values draw' to draw the computed
76 eigenvalues graphically, or '-pep_error_relative :myerr.m:ascii_matlab' to save
77 the errors in a file that can be executed in Matlab.
78
79 Level: beginner
80
81 .seealso: PEPCreate(), PEPSetUp(), PEPDestroy(), PEPSetTolerances()
82 @*/
83 1956 PetscErrorCode PEPSolve(PEP pep)
84 {
85 1956 PetscInt i,k;
86 1956 PetscBool flg,islinear;
87 1956 char str[16];
88
89
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1956 PetscFunctionBegin;
90
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.
1956 PetscValidHeaderSpecific(pep,PEP_CLASSID,1);
91
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.
1956 if (pep->state>=PEP_STATE_SOLVED) PetscFunctionReturn(PETSC_SUCCESS);
92
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.
1956 PetscCall(PetscLogEventBegin(PEP_Solve,pep,0,0,0));
93
94 /* call setup */
95
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.
1956 PetscCall(PEPSetUp(pep));
96 1956 pep->nconv = 0;
97 1956 pep->its = 0;
98
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1956 k = pep->lineariz? pep->ncv: pep->ncv*(pep->nmat-1);
99
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
133657 for (i=0;i<k;i++) {
100 131701 pep->eigr[i] = 0.0;
101 131701 pep->eigi[i] = 0.0;
102 131701 pep->errest[i] = 0.0;
103 131701 pep->perm[i] = i;
104 }
105
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.
1956 PetscCall(PEPViewFromOptions(pep,NULL,"-pep_view_pre"));
106
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.
1956 PetscCall(RGViewFromOptions(pep->rg,NULL,"-rg_view"));
107
108 /* Call solver */
109
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ 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.
1956 PetscUseTypeMethod(pep,solve);
110
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1956 PetscCheck(pep->reason,PetscObjectComm((PetscObject)pep),PETSC_ERR_PLIB,"Internal error, solver returned without setting converged reason");
111 1956 pep->state = PEP_STATE_SOLVED;
112
113 /* Only the first nconv columns contain useful information */
114
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.
1956 PetscCall(BVSetActiveColumns(pep->V,0,pep->nconv));
115
116
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.
1956 PetscCall(PetscObjectTypeCompare((PetscObject)pep,PEPLINEAR,&islinear));
117
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1956 if (!islinear) {
118
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.
1543 PetscCall(STPostSolve(pep->st));
119 /* Map eigenvalues back to the original problem */
120
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.
1543 PetscCall(STGetTransform(pep->st,&flg));
121
9/10
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 6 times.
✓ Branch 5 taken 4 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✓ Branch 9 taken 1 times.
1543 if (flg) PetscTryTypeMethod(pep,backtransform);
122 }
123
124 #if !defined(PETSC_USE_COMPLEX)
125 /* reorder conjugate eigenvalues (positive imaginary first) */
126
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
5606 for (i=0;i<pep->nconv-1;i++) {
127
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
4664 if (pep->eigi[i] != 0) {
128
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
704 if (pep->eigi[i] < 0) {
129 175 pep->eigi[i] = -pep->eigi[i];
130 175 pep->eigi[i+1] = -pep->eigi[i+1];
131 /* the next correction only works with eigenvectors */
132
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.
175 PetscCall(PEPComputeVectors(pep));
133
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.
175 PetscCall(BVScaleColumn(pep->V,i+1,-1.0));
134 }
135 704 i++;
136 }
137 }
138 #endif
139
140
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.
1956 if (pep->refine!=PEP_REFINE_NONE) PetscCall(PetscCitationsRegister(citation,&cited));
141
142
4/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
1956 if (pep->refine==PEP_REFINE_SIMPLE && pep->rits>0 && pep->nconv>0) {
143
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.
156 PetscCall(PEPComputeVectors(pep));
144
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.
156 PetscCall(PEPNewtonRefinementSimple(pep,&pep->rits,pep->rtol,pep->nconv));
145 }
146
147 /* sort eigenvalues according to pep->which parameter */
148
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.
1956 PetscCall(SlepcSortEigenvalues(pep->sc,pep->nconv,pep->eigr,pep->eigi,pep->perm));
149
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.
1956 PetscCall(PetscLogEventEnd(PEP_Solve,pep,0,0,0));
150
151 /* various viewers */
152
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.
1956 PetscCall(PEPViewFromOptions(pep,NULL,"-pep_view"));
153
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.
1956 PetscCall(PEPConvergedReasonViewFromOptions(pep));
154
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.
1956 PetscCall(PEPErrorViewFromOptions(pep));
155
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.
1956 PetscCall(PEPValuesViewFromOptions(pep));
156
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.
1956 PetscCall(PEPVectorsViewFromOptions(pep));
157
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9302 for (i=0;i<pep->nmat;i++) {
158
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.
7346 PetscCall(PetscSNPrintf(str,sizeof(str),"-pep_view_mat%" PetscInt_FMT,i));
159
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.
7346 PetscCall(MatViewFromOptions(pep->A[i],(PetscObject)pep,str));
160 }
161
162 /* Remove the initial subspace */
163 1956 pep->nini = 0;
164
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.
1956 PetscFunctionReturn(PETSC_SUCCESS);
165 }
166
167 /*@
168 PEPGetIterationNumber - Gets the current iteration number. If the
169 call to PEPSolve() is complete, then it returns the number of iterations
170 carried out by the solution method.
171
172 Not Collective
173
174 Input Parameter:
175 . pep - the polynomial eigensolver context
176
177 Output Parameter:
178 . its - number of iterations
179
180 Note:
181 During the i-th iteration this call returns i-1. If PEPSolve() is
182 complete, then parameter "its" contains either the iteration number at
183 which convergence was successfully reached, or failure was detected.
184 Call PEPGetConvergedReason() to determine if the solver converged or
185 failed and why.
186
187 Level: intermediate
188
189 .seealso: PEPGetConvergedReason(), PEPSetTolerances()
190 @*/
191 310 PetscErrorCode PEPGetIterationNumber(PEP pep,PetscInt *its)
192 {
193
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
310 PetscFunctionBegin;
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.
310 PetscValidHeaderSpecific(pep,PEP_CLASSID,1);
195
2/8
✗ 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.
310 PetscAssertPointer(its,2);
196 310 *its = pep->its;
197
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
310 PetscFunctionReturn(PETSC_SUCCESS);
198 }
199
200 /*@
201 PEPGetConverged - Gets the number of converged eigenpairs.
202
203 Not Collective
204
205 Input Parameter:
206 . pep - the polynomial eigensolver context
207
208 Output Parameter:
209 . nconv - number of converged eigenpairs
210
211 Note:
212 This function should be called after PEPSolve() has finished.
213
214 Level: beginner
215
216 .seealso: PEPSetDimensions(), PEPSolve(), PEPGetEigenpair()
217 @*/
218 924 PetscErrorCode PEPGetConverged(PEP pep,PetscInt *nconv)
219 {
220
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
924 PetscFunctionBegin;
221
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.
924 PetscValidHeaderSpecific(pep,PEP_CLASSID,1);
222
2/8
✗ 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.
924 PetscAssertPointer(nconv,2);
223
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
924 PEPCheckSolved(pep,1);
224 924 *nconv = pep->nconv;
225
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.
924 PetscFunctionReturn(PETSC_SUCCESS);
226 }
227
228 /*@
229 PEPGetConvergedReason - Gets the reason why the PEPSolve() iteration was
230 stopped.
231
232 Not Collective
233
234 Input Parameter:
235 . pep - the polynomial eigensolver context
236
237 Output Parameter:
238 . reason - negative value indicates diverged, positive value converged
239
240 Options Database Key:
241 . -pep_converged_reason - print the reason to a viewer
242
243 Notes:
244 Possible values for reason are
245 + PEP_CONVERGED_TOL - converged up to tolerance
246 . PEP_CONVERGED_USER - converged due to a user-defined condition
247 . PEP_DIVERGED_ITS - required more than max_it iterations to reach convergence
248 . PEP_DIVERGED_BREAKDOWN - generic breakdown in method
249 - PEP_DIVERGED_SYMMETRY_LOST - pseudo-Lanczos was not able to keep symmetry
250
251 Can only be called after the call to PEPSolve() is complete.
252
253 Level: intermediate
254
255 .seealso: PEPSetTolerances(), PEPSolve(), PEPConvergedReason
256 @*/
257 266 PetscErrorCode PEPGetConvergedReason(PEP pep,PEPConvergedReason *reason)
258 {
259
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
266 PetscFunctionBegin;
260
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.
266 PetscValidHeaderSpecific(pep,PEP_CLASSID,1);
261
2/8
✗ 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.
266 PetscAssertPointer(reason,2);
262
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
266 PEPCheckSolved(pep,1);
263 266 *reason = pep->reason;
264
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.
266 PetscFunctionReturn(PETSC_SUCCESS);
265 }
266
267 /*@
268 PEPGetEigenpair - Gets the i-th solution of the eigenproblem as computed by
269 PEPSolve(). The solution consists in both the eigenvalue and the eigenvector.
270
271 Collective
272
273 Input Parameters:
274 + pep - polynomial eigensolver context
275 - i - index of the solution
276
277 Output Parameters:
278 + eigr - real part of eigenvalue
279 . eigi - imaginary part of eigenvalue
280 . Vr - real part of eigenvector
281 - Vi - imaginary part of eigenvector
282
283 Notes:
284 It is allowed to pass NULL for Vr and Vi, if the eigenvector is not
285 required. Otherwise, the caller must provide valid Vec objects, i.e.,
286 they must be created by the calling program with e.g. MatCreateVecs().
287
288 If the eigenvalue is real, then eigi and Vi are set to zero. If PETSc is
289 configured with complex scalars the eigenvalue is stored
290 directly in eigr (eigi is set to zero) and the eigenvector in Vr (Vi is
291 set to zero). In any case, the user can pass NULL in Vr or Vi if one of
292 them is not required.
293
294 The index i should be a value between 0 and nconv-1 (see PEPGetConverged()).
295 Eigenpairs are indexed according to the ordering criterion established
296 with PEPSetWhichEigenpairs().
297
298 Level: beginner
299
300 .seealso: PEPSolve(), PEPGetConverged(), PEPSetWhichEigenpairs()
301 @*/
302 16386 PetscErrorCode PEPGetEigenpair(PEP pep,PetscInt i,PetscScalar *eigr,PetscScalar *eigi,Vec Vr,Vec Vi)
303 {
304 16386 PetscInt k;
305
306
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
16386 PetscFunctionBegin;
307
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.
16386 PetscValidHeaderSpecific(pep,PEP_CLASSID,1);
308
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
16386 PetscValidLogicalCollectiveInt(pep,i,2);
309
17/46
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✓ Branch 26 taken 2 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✓ Branch 30 taken 2 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✓ Branch 35 taken 2 times.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✓ Branch 39 taken 2 times.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
16386 if (Vr) { PetscValidHeaderSpecific(Vr,VEC_CLASSID,5); PetscCheckSameComm(pep,1,Vr,5); }
310
17/46
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✓ Branch 26 taken 2 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✓ Branch 30 taken 2 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✓ Branch 35 taken 2 times.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✓ Branch 39 taken 2 times.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
16386 if (Vi) { PetscValidHeaderSpecific(Vi,VEC_CLASSID,6); PetscCheckSameComm(pep,1,Vi,6); }
311
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
16386 PEPCheckSolved(pep,1);
312
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
16386 PetscCheck(i>=0,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_OUTOFRANGE,"The index cannot be negative");
313
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
16386 PetscCheck(i<pep->nconv,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_OUTOFRANGE,"The index can be nconv-1 at most, see PEPGetConverged()");
314
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.
16386 PetscCall(PEPComputeVectors(pep));
316 16386 k = pep->perm[i];
317
318 /* eigenvalue */
319 #if defined(PETSC_USE_COMPLEX)
320
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
8320 if (eigr) *eigr = pep->eigr[k];
321
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
8320 if (eigi) *eigi = 0;
322 #else
323
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
8066 if (eigr) *eigr = pep->eigr[k];
324
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
8066 if (eigi) *eigi = pep->eigi[k];
325 #endif
326
327 /* eigenvector */
328
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
16386 PetscCall(BV_GetEigenvector(pep->V,k,pep->eigi[k],Vr,Vi));
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.
3198 PetscFunctionReturn(PETSC_SUCCESS);
330 }
331
332 /*@
333 PEPGetErrorEstimate - Returns the error estimate associated to the i-th
334 computed eigenpair.
335
336 Not Collective
337
338 Input Parameters:
339 + pep - polynomial eigensolver context
340 - i - index of eigenpair
341
342 Output Parameter:
343 . errest - the error estimate
344
345 Notes:
346 This is the error estimate used internally by the eigensolver. The actual
347 error bound can be computed with PEPComputeError(). See also the users
348 manual for details.
349
350 Level: advanced
351
352 .seealso: PEPComputeError()
353 @*/
354 43 PetscErrorCode PEPGetErrorEstimate(PEP pep,PetscInt i,PetscReal *errest)
355 {
356
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
43 PetscFunctionBegin;
357
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.
43 PetscValidHeaderSpecific(pep,PEP_CLASSID,1);
358
2/8
✗ 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.
43 PetscAssertPointer(errest,3);
359
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
43 PEPCheckSolved(pep,1);
360
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
43 PetscCheck(i>=0,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_OUTOFRANGE,"The index cannot be negative");
361
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
43 PetscCheck(i<pep->nconv,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_OUTOFRANGE,"The index can be nconv-1 at most, see PEPGetConverged()");
362 43 *errest = pep->errest[pep->perm[i]];
363
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.
43 PetscFunctionReturn(PETSC_SUCCESS);
364 }
365
366 /*
367 PEPComputeResidualNorm_Private - Computes the norm of the residual vector
368 associated with an eigenpair.
369
370 Input Parameters:
371 kr,ki - eigenvalue
372 xr,xi - eigenvector
373 z - array of 4 work vectors (z[2],z[3] not referenced in complex scalars)
374 */
375 11837 PetscErrorCode PEPComputeResidualNorm_Private(PEP pep,PetscScalar kr,PetscScalar ki,Vec xr,Vec xi,Vec *z,PetscReal *norm)
376 {
377 11837 Mat *A=pep->A;
378 11837 PetscInt i,nmat=pep->nmat;
379 11837 PetscScalar t[20],*vals=t,*ivals=NULL;
380 11837 Vec u,w;
381 #if !defined(PETSC_USE_COMPLEX)
382 5437 Vec ui,wi;
383 5437 PetscReal ni;
384 5437 PetscBool imag;
385 5437 PetscScalar it[20];
386 #endif
387
388
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
11837 PetscFunctionBegin;
389 11837 u = z[0]; w = z[1];
390
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.
11837 PetscCall(VecSet(u,0.0));
391 #if !defined(PETSC_USE_COMPLEX)
392 5437 ui = z[2]; wi = z[3];
393 5437 ivals = it;
394 #endif
395
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
11837 if (nmat>20) {
396 PetscCall(PetscMalloc1(nmat,&vals));
397 #if !defined(PETSC_USE_COMPLEX)
398 PetscCall(PetscMalloc1(nmat,&ivals));
399 #endif
400 }
401
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.
11837 PetscCall(PEPEvaluateBasis(pep,kr,ki,vals,ivals));
402 #if !defined(PETSC_USE_COMPLEX)
403
3/4
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
5437 if (ki == 0 || PetscAbsScalar(ki) < PetscAbsScalar(kr*PETSC_MACHINE_EPSILON))
404 imag = PETSC_FALSE;
405 else {
406 1139 imag = PETSC_TRUE;
407
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.
1139 PetscCall(VecSet(ui,0.0));
408 }
409 #endif
410
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
49718 for (i=0;i<nmat;i++) {
411
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
37881 if (vals[i]!=0.0) {
412
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.
37881 PetscCall(MatMult(A[i],xr,w));
413
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.
37881 PetscCall(VecAXPY(u,vals[i],w));
414 }
415 #if !defined(PETSC_USE_COMPLEX)
416
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
16636 if (imag) {
417
3/4
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
3697 if (ivals[i]!=0 || vals[i]!=0) {
418
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.
3697 PetscCall(MatMult(A[i],xi,wi));
419
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.
3697 if (vals[i]==0) PetscCall(MatMult(A[i],xr,w));
420 }
421
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
3697 if (ivals[i]!=0) {
422
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.
2558 PetscCall(VecAXPY(u,-ivals[i],wi));
423
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.
2558 PetscCall(VecAXPY(ui,ivals[i],w));
424 }
425
5/8
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
16636 if (vals[i]!=0) PetscCall(VecAXPY(ui,vals[i],wi));
426 }
427 #endif
428 }
429
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.
11837 PetscCall(VecNorm(u,NORM_2,norm));
430 #if !defined(PETSC_USE_COMPLEX)
431
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
5437 if (imag) {
432
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.
1139 PetscCall(VecNorm(ui,NORM_2,&ni));
433 1139 *norm = SlepcAbsEigenvalue(*norm,ni);
434 }
435 #endif
436
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
11837 if (nmat>20) {
437 PetscCall(PetscFree(vals));
438 #if !defined(PETSC_USE_COMPLEX)
439 PetscCall(PetscFree(ivals));
440 #endif
441 }
442
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.
2326 PetscFunctionReturn(PETSC_SUCCESS);
443 }
444
445 /*@
446 PEPComputeError - Computes the error (based on the residual norm) associated
447 with the i-th computed eigenpair.
448
449 Collective
450
451 Input Parameters:
452 + pep - the polynomial eigensolver context
453 . i - the solution index
454 - type - the type of error to compute
455
456 Output Parameter:
457 . error - the error
458
459 Notes:
460 The error can be computed in various ways, all of them based on the residual
461 norm ||P(l)x||_2 where l is the eigenvalue and x is the eigenvector.
462 See the users guide for additional details.
463
464 Level: beginner
465
466 .seealso: PEPErrorType, PEPSolve(), PEPGetErrorEstimate()
467 @*/
468 10572 PetscErrorCode PEPComputeError(PEP pep,PetscInt i,PEPErrorType type,PetscReal *error)
469 {
470 10572 Vec xr,xi,w[4];
471 10572 PetscScalar kr,ki;
472 10572 PetscReal t,z=0.0;
473 10572 PetscInt j;
474 10572 PetscBool flg;
475
476
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
10572 PetscFunctionBegin;
477
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.
10572 PetscValidHeaderSpecific(pep,PEP_CLASSID,1);
478
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
10572 PetscValidLogicalCollectiveInt(pep,i,2);
479
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
10572 PetscValidLogicalCollectiveEnum(pep,type,3);
480
2/8
✗ 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.
10572 PetscAssertPointer(error,4);
481
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
10572 PEPCheckSolved(pep,1);
482
483 /* allocate work vectors */
484 #if defined(PETSC_USE_COMPLEX)
485
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.
5510 PetscCall(PEPSetWorkVecs(pep,3));
486 5510 xi = NULL;
487 5510 w[2] = NULL;
488 5510 w[3] = NULL;
489 #else
490
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.
5062 PetscCall(PEPSetWorkVecs(pep,6));
491 5062 xi = pep->work[3];
492 5062 w[2] = pep->work[4];
493 5062 w[3] = pep->work[5];
494 #endif
495 10572 xr = pep->work[0];
496 10572 w[0] = pep->work[1];
497 10572 w[1] = pep->work[2];
498
499 /* compute residual norms */
500
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.
10572 PetscCall(PEPGetEigenpair(pep,i,&kr,&ki,xr,xi));
501
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.
10572 PetscCall(PEPComputeResidualNorm_Private(pep,kr,ki,xr,xi,w,error));
502
503 /* compute error */
504
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
10572 switch (type) {
505 case PEP_ERROR_ABSOLUTE:
506 break;
507 327 case PEP_ERROR_RELATIVE:
508 327 *error /= SlepcAbsEigenvalue(kr,ki);
509 327 break;
510 10125 case PEP_ERROR_BACKWARD:
511 /* initialization of matrix norms */
512
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
10125 if (!pep->nrma[pep->nmat-1]) {
513
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6432 for (j=0;j<pep->nmat;j++) {
514
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.
4879 PetscCall(MatHasOperation(pep->A[j],MATOP_NORM,&flg));
515
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
4879 PetscCheck(flg,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_WRONG,"The computation of backward errors requires a matrix norm operation");
516
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.
4879 PetscCall(MatNorm(pep->A[j],NORM_INFINITY,&pep->nrma[j]));
517 }
518 }
519 10125 t = SlepcAbsEigenvalue(kr,ki);
520
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
41920 for (j=pep->nmat-1;j>=0;j--) {
521 31795 z = z*t+pep->nrma[j];
522 }
523 10125 *error /= z;
524 10125 break;
525 default:
526 SETERRQ(PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_OUTOFRANGE,"Invalid error type");
527 }
528
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.
2073 PetscFunctionReturn(PETSC_SUCCESS);
529 }
530