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 |