GCC Code Coverage Report


Directory: ./
File: src/eps/interface/epssolve.c
Date: 2026-05-04 03:58:11
Exec Total Coverage
Lines: 389 414 94.0%
Functions: 16 16 100.0%
Branches: 1191 2406 49.5%

Line Branch Exec Source
1 /*
2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3 SLEPc - Scalable Library for Eigenvalue Problem Computations
4 Copyright (c) 2002-, Universitat Politecnica de Valencia, Spain
5
6 This file is part of SLEPc.
7 SLEPc is distributed under a 2-clause BSD license (see LICENSE).
8 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
9 */
10 /*
11 EPS routines related to the solution process
12 */
13
14 #include <slepc/private/epsimpl.h> /*I "slepceps.h" I*/
15 #include <slepc/private/bvimpl.h>
16 #include <petscdraw.h>
17
18 99358 PetscErrorCode EPSComputeVectors(EPS eps)
19 {
20
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
99358 PetscFunctionBegin;
21
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
99358 EPSCheckSolved(eps,1);
22
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.
99358 if (eps->state==EPS_STATE_SOLVED) PetscTryTypeMethod(eps,computevectors);
23 99358 eps->state = EPS_STATE_EIGENVECTORS;
24
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.
99358 PetscFunctionReturn(PETSC_SUCCESS);
25 }
26
27 10121 static PetscErrorCode EPSComputeValues(EPS eps)
28 {
29 10121 PetscBool injective,iscomp,isfilter;
30 10121 PetscInt i,n,aux,nconv0;
31 10121 Mat A,B=NULL,G,Z;
32
33
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
10121 PetscFunctionBegin;
34
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
10121 switch (eps->categ) {
35 8001 case EPS_CATEGORY_KRYLOV:
36 case EPS_CATEGORY_OTHER:
37
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.
8001 PetscCall(STIsInjective(eps->st,&injective));
38
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
8001 if (injective) {
39 /* one-to-one mapping: backtransform eigenvalues */
40
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.
7785 PetscUseTypeMethod(eps,backtransform);
41 } else {
42 /* compute eigenvalues from Rayleigh quotient */
43
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.
216 PetscCall(DSGetDimensions(eps->ds,&n,NULL,NULL,NULL));
44
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 1 times.
216 if (!n) break;
45
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.
216 PetscCall(EPSGetOperators(eps,&A,&B));
46
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.
216 PetscCall(BVSetActiveColumns(eps->V,0,n));
47
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.
216 PetscCall(DSGetCompact(eps->ds,&iscomp));
48
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.
216 PetscCall(DSSetCompact(eps->ds,PETSC_FALSE));
49
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.
216 PetscCall(DSGetMat(eps->ds,DS_MAT_A,&G));
50
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.
216 PetscCall(BVMatProject(eps->V,A,eps->V,G));
51
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.
216 PetscCall(DSRestoreMat(eps->ds,DS_MAT_A,&G));
52
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
216 if (B) {
53 PetscCall(DSGetMat(eps->ds,DS_MAT_B,&G));
54 PetscCall(BVMatProject(eps->V,B,eps->V,G));
55 PetscCall(DSRestoreMat(eps->ds,DS_MAT_B,&G));
56 }
57
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.
216 PetscCall(DSSolve(eps->ds,eps->eigr,eps->eigi));
58
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.
216 PetscCall(DSSort(eps->ds,eps->eigr,eps->eigi,NULL,NULL,NULL));
59
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.
216 PetscCall(DSSynchronize(eps->ds,eps->eigr,eps->eigi));
60
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.
216 PetscCall(DSSetCompact(eps->ds,iscomp));
61
2/6
✓ 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.
216 if (eps->ishermitian && (!eps->isgeneralized || eps->ispositive)) { /* V = V * Z */
62
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.
216 PetscCall(DSVectors(eps->ds,DS_MAT_X,NULL,NULL));
63
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.
216 PetscCall(DSGetMat(eps->ds,DS_MAT_X,&Z));
64
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.
216 PetscCall(BVMultInPlace(eps->V,Z,0,n));
65
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.
216 PetscCall(DSRestoreMat(eps->ds,DS_MAT_X,&Z));
66 }
67 /* in case of STFILTER discard computed eigenvalues that lie outside the wanted interval */
68
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.
216 PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STFILTER,&isfilter));
69
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
216 if (isfilter) {
70 206 nconv0 = eps->nconv;
71
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2308 for (i=0;i<eps->nconv;i++) {
72
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
2102 if (PetscRealPart(eps->eigr[eps->perm[i]])<eps->inta || PetscRealPart(eps->eigr[eps->perm[i]])>eps->intb) {
73 412 eps->nconv--;
74
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
412 if (i<eps->nconv) { SlepcSwap(eps->perm[i],eps->perm[eps->nconv],aux); i--; }
75 }
76 }
77
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.
206 if (nconv0>eps->nconv) PetscCall(PetscInfo(eps,"Discarded %" PetscInt_FMT " computed eigenvalues lying outside the interval\n",nconv0-eps->nconv));
78 }
79 }
80 break;
81 case EPS_CATEGORY_PRECOND:
82 case EPS_CATEGORY_CONTOUR:
83 /* eigenvalues already available as an output of the solver */
84 break;
85 }
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.
1945 PetscFunctionReturn(PETSC_SUCCESS);
87 }
88
89 /*@
90 EPSSolve - Solves the eigensystem.
91
92 Collective
93
94 Input Parameter:
95 . eps - the linear eigensolver context
96
97 Options Database Keys:
98 + -eps_view - print information about the solver once the solve is complete
99 . -eps_view_pre - print information about the solver before the solve starts
100 . -eps_view_mat0 - view the first matrix ($A$)
101 . -eps_view_mat1 - view the second matrix ($B$)
102 . -eps_view_vectors - view the computed eigenvectors
103 . -eps_view_values - view the computed eigenvalues
104 . -eps_converged_reason - print reason for convergence/divergence, and number of iterations
105 . -eps_error_absolute - print absolute errors of each eigenpair
106 . -eps_error_relative - print relative errors of each eigenpair
107 - -eps_error_backward - print backward errors of each eigenpair
108
109 Notes:
110 The problem matrices are specified with `EPSSetOperators()`.
111
112 `EPSSolve()` will return without generating an error regardless of whether
113 all requested solutions were computed or not. Call `EPSGetConverged()` to get the
114 actual number of computed solutions, and `EPSGetConvergedReason()` to determine if
115 the solver converged or failed and why.
116
117 All the command-line options listed above admit an optional argument specifying
118 the viewer type and options. For instance, use `-eps_view_mat0 binary:amatrix.bin`
119 to save the $A$ matrix to a binary file, `-eps_view_values draw` to draw the computed
120 eigenvalues graphically, or `-eps_error_relative :myerr.m:ascii_matlab` to save
121 the errors in a file that can be executed in Matlab.
122 See `PetscObjectViewFromOptions()` for more details.
123
124 Level: beginner
125
126 .seealso: [](ch:eps), `EPSCreate()`, `EPSSetUp()`, `EPSDestroy()`, `EPSSetOperators()`, `EPSGetConverged()`, `EPSGetConvergedReason()`
127 @*/
128 10121 PetscErrorCode EPSSolve(EPS eps)
129 {
130 10121 PetscInt i;
131 10121 PetscBool hasname;
132 10121 STMatMode matmode;
133 10121 Mat A,B;
134
135
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
10121 PetscFunctionBegin;
136
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.
10121 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
137
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.
10121 if (eps->state>=EPS_STATE_SOLVED) PetscFunctionReturn(PETSC_SUCCESS);
138
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.
10121 PetscCall(PetscLogEventBegin(EPS_Solve,eps,0,0,0));
139
140 /* Call setup */
141
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.
10121 PetscCall(EPSSetUp(eps));
142
143 /* Safeguard for matrices of size 0 */
144
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10121 if (eps->n == 0) {
145 eps->nconv = 0;
146 eps->reason = EPS_CONVERGED_TOL;
147 eps->state = EPS_STATE_SOLVED;
148 PetscFunctionReturn(PETSC_SUCCESS);
149 }
150
151 10121 eps->nconv = 0;
152 10121 eps->its = 0;
153
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
304535 for (i=0;i<eps->ncv;i++) {
154 294414 eps->eigr[i] = 0.0;
155 294414 eps->eigi[i] = 0.0;
156 294414 eps->errest[i] = 0.0;
157 294414 eps->perm[i] = i;
158 }
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.
10121 PetscCall(EPSViewFromOptions(eps,NULL,"-eps_view_pre"));
160
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.
10121 PetscCall(RGViewFromOptions(eps->rg,NULL,"-rg_view"));
161
162 /* Call solver */
163
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.
10121 PetscUseTypeMethod(eps,solve);
164
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
10121 PetscCheck(eps->reason,PetscObjectComm((PetscObject)eps),PETSC_ERR_PLIB,"Internal error, solver returned without setting converged reason");
165 10121 eps->state = EPS_STATE_SOLVED;
166
167 /* Only the first nconv columns contain useful information (except in CISS) */
168
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.
10121 PetscCall(BVSetActiveColumns(eps->V,0,eps->nconv));
169
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.
10121 if (eps->twosided) PetscCall(BVSetActiveColumns(eps->W,0,eps->nconv));
170
171 /* If inplace, purify eigenvectors before reverting operator */
172
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.
10121 PetscCall(STGetMatMode(eps->st,&matmode));
173
1/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
10121 if (matmode == ST_MATMODE_INPLACE && eps->ispositive) PetscCall(EPSComputeVectors(eps));
174
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.
10121 PetscCall(STPostSolve(eps->st));
175
176 /* Map eigenvalues back to the original problem if appropriate */
177
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10121 PetscCall(EPSComputeValues(eps));
178
179 #if !defined(PETSC_USE_COMPLEX)
180 /* Reorder conjugate eigenvalues (positive imaginary first) */
181
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
58106 for (i=0;i<eps->nconv-1;i++) {
182
6/6
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 5 times.
✓ Branch 5 taken 5 times.
52720 if (eps->eigi[i] != 0 && (eps->problem_type!=EPS_HAMILT || eps->eigr[i]!=0)) {
183 /* conjugate eigenvalues */
184
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
925 if (eps->eigi[i] < 0) {
185 116 eps->eigi[i] = -eps->eigi[i];
186 116 eps->eigi[i+1] = -eps->eigi[i+1];
187 /* the next correction only works with eigenvectors */
188
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.
116 PetscCall(EPSComputeVectors(eps));
189
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.
116 PetscCall(BVScaleColumn(eps->V,i+1,-1.0));
190
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ 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.
116 if (eps->W) PetscCall(BVScaleColumn(eps->W,i+1,-1.0));
191 }
192 925 i++;
193 }
194 }
195 #endif
196
197 /* Sort eigenvalues according to eps->which parameter */
198
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
✓ 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.
10121 if (eps->problem_type==EPS_HAMILT) PetscCall(SlepcSortEigenvaluesSpecial(eps->sc,eps->nconv,eps->eigr,eps->eigi,eps->perm));
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.
10086 else PetscCall(SlepcSortEigenvalues(eps->sc,eps->nconv,eps->eigr,eps->eigi,eps->perm));
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.
10121 PetscCall(PetscLogEventEnd(EPS_Solve,eps,0,0,0));
201
202 /* Various viewers */
203
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.
10121 PetscCall(EPSViewFromOptions(eps,NULL,"-eps_view"));
204
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.
10121 PetscCall(EPSConvergedReasonViewFromOptions(eps));
205
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.
10121 PetscCall(EPSErrorViewFromOptions(eps));
206
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.
10121 PetscCall(EPSValuesViewFromOptions(eps));
207
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.
10121 PetscCall(EPSVectorsViewFromOptions(eps));
208
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.
10121 PetscCall(PetscOptionsHasName(((PetscObject)eps)->options,((PetscObject)eps)->prefix,"-eps_view_mat0",&hasname));
210
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10121 if (hasname) {
211 PetscCall(EPSGetOperators(eps,&A,NULL));
212 PetscCall(MatViewFromOptions(A,(PetscObject)eps,"-eps_view_mat0"));
213 }
214
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
10121 if (eps->isgeneralized) {
215
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.
2080 PetscCall(PetscOptionsHasName(((PetscObject)eps)->options,((PetscObject)eps)->prefix,"-eps_view_mat1",&hasname));
216
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
2080 if (hasname) {
217 PetscCall(EPSGetOperators(eps,NULL,&B));
218 PetscCall(MatViewFromOptions(B,(PetscObject)eps,"-eps_view_mat1"));
219 }
220 }
221
222 /* Remove deflation and initial subspaces */
223
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
10121 if (eps->nds) {
224
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
153 PetscCall(BVSetNumConstraints(eps->V,0));
225 153 eps->nds = 0;
226 }
227 10121 eps->nini = 0;
228
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.
10121 PetscFunctionReturn(PETSC_SUCCESS);
229 }
230
231 /*@
232 EPSGetIterationNumber - Gets the current iteration number. If the
233 call to `EPSSolve()` is complete, then it returns the number of iterations
234 carried out by the solution method.
235
236 Not Collective
237
238 Input Parameter:
239 . eps - the linear eigensolver context
240
241 Output Parameter:
242 . its - number of iterations
243
244 Note:
245 During the $i$-th iteration this call returns $i-1$. If `EPSSolve()` is
246 complete, then parameter `its` contains either the iteration number at
247 which convergence was successfully reached, or failure was detected.
248 Call `EPSGetConvergedReason()` to determine if the solver converged or
249 failed and why.
250
251 Level: intermediate
252
253 .seealso: [](ch:eps), `EPSGetConvergedReason()`, `EPSSetTolerances()`
254 @*/
255 1564 PetscErrorCode EPSGetIterationNumber(EPS eps,PetscInt *its)
256 {
257
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1564 PetscFunctionBegin;
258
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.
1564 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
259
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.
1564 PetscAssertPointer(its,2);
260 1564 *its = eps->its;
261
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.
1564 PetscFunctionReturn(PETSC_SUCCESS);
262 }
263
264 /*@
265 EPSGetConverged - Gets the number of converged eigenpairs.
266
267 Not Collective
268
269 Input Parameter:
270 . eps - the linear eigensolver context
271
272 Output Parameter:
273 . nconv - number of converged eigenpairs
274
275 Notes:
276 This function should be called after `EPSSolve()` has finished.
277
278 The value `nconv` may be different from the number of requested solutions
279 `nev`, but not larger than `ncv`, see `EPSSetDimensions()`.
280
281 Level: beginner
282
283 .seealso: [](ch:eps), `EPSSetDimensions()`, `EPSSolve()`, `EPSGetEigenpair()`
284 @*/
285 6220 PetscErrorCode EPSGetConverged(EPS eps,PetscInt *nconv)
286 {
287
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
6220 PetscFunctionBegin;
288
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
6220 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
289
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.
6220 PetscAssertPointer(nconv,2);
290
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6220 EPSCheckSolved(eps,1);
291
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.
6220 PetscCall(EPS_GetActualConverged(eps,nconv));
292
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.
1191 PetscFunctionReturn(PETSC_SUCCESS);
293 }
294
295 /*@
296 EPSGetConvergedReason - Gets the reason why the `EPSSolve()` iteration was
297 stopped.
298
299 Not Collective
300
301 Input Parameter:
302 . eps - the linear eigensolver context
303
304 Output Parameter:
305 . reason - negative value indicates diverged, positive value converged, see
306 `EPSConvergedReason` for the possible values
307
308 Options Database Key:
309 . -eps_converged_reason - print reason for convergence/divergence, and number of iterations
310
311 Note:
312 If this routine is called before or doing the `EPSSolve()` the value of
313 `EPS_CONVERGED_ITERATING` is returned.
314
315 Level: intermediate
316
317 .seealso: [](ch:eps), `EPSSetTolerances()`, `EPSSolve()`, `EPSConvergedReason`
318 @*/
319 1513 PetscErrorCode EPSGetConvergedReason(EPS eps,EPSConvergedReason *reason)
320 {
321
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1513 PetscFunctionBegin;
322
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.
1513 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
323
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.
1513 PetscAssertPointer(reason,2);
324
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1513 EPSCheckSolved(eps,1);
325 1513 *reason = eps->reason;
326
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.
1513 PetscFunctionReturn(PETSC_SUCCESS);
327 }
328
329 /*@
330 EPSGetInvariantSubspace - Gets an orthonormal basis of the computed invariant
331 subspace.
332
333 Collective
334
335 Input Parameter:
336 . eps - the linear eigensolver context
337
338 Output Parameter:
339 . v - an array of vectors
340
341 Notes:
342 This function should be called after `EPSSolve()` has finished.
343
344 The user should provide in `v` an array of `nconv` vectors, where `nconv`
345 is the value returned by `EPSGetConverged()`.
346
347 The first $k$ vectors returned in `v` span an invariant subspace associated
348 with the first $k$ computed eigenvalues (note that this is not true if the
349 $k$-th eigenvalue is complex and matrix $A$ is real; in this case the first
350 $k+1$ vectors should be used). An invariant subspace $X$ of $A$ satisfies
351 $Ax\in X, \forall x\in X$ (a similar definition applies for generalized
352 eigenproblems).
353
354 Level: intermediate
355
356 .seealso: [](ch:eps), `EPSGetEigenpair()`, `EPSGetConverged()`, `EPSSolve()`
357 @*/
358 80 PetscErrorCode EPSGetInvariantSubspace(EPS eps,Vec v[])
359 {
360 80 PetscInt i;
361 80 BV V=eps->V;
362 80 Vec w;
363
364
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
80 PetscFunctionBegin;
365
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.
80 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
366
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.
80 PetscAssertPointer(v,2);
367
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.
80 PetscValidHeaderSpecific(*v,VEC_CLASSID,2);
368
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
80 EPSCheckSolved(eps,1);
369
2/6
✓ 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.
80 PetscCheck(eps->ishermitian || eps->state!=EPS_STATE_EIGENVECTORS,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONGSTATE,"EPSGetInvariantSubspace must be called before EPSGetEigenpair,EPSGetEigenvector or EPSComputeError");
370
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
80 if (eps->balance!=EPS_BALANCE_NONE && eps->D) {
371
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(BVDuplicateResize(eps->V,eps->nconv,&V));
372
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(BVSetActiveColumns(eps->V,0,eps->nconv));
373
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(BVCopy(eps->V,V));
374
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
55 for (i=0;i<eps->nconv;i++) {
375
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.
45 PetscCall(BVGetColumn(V,i,&w));
376
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.
45 PetscCall(VecPointwiseDivide(w,w,eps->D));
377
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.
45 PetscCall(BVRestoreColumn(V,i,&w));
378 }
379
3/6
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
10 PetscCall(BVOrthogonalize(V,NULL));
380 }
381
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.
625 for (i=0;i<eps->nconv;i++) PetscCall(BVCopyVec(V,i,v[i]));
382
7/10
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
80 if (eps->balance!=EPS_BALANCE_NONE && eps->D) PetscCall(BVDestroy(&V));
383
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);
384 }
385
386 /*@
387 EPSGetEigenpair - Gets the `i`-th solution of the eigenproblem as computed by
388 `EPSSolve()`. The solution consists in both the eigenvalue and the eigenvector.
389
390 Collective
391
392 Input Parameters:
393 + eps - the linear eigensolver context
394 - i - index of the solution
395
396 Output Parameters:
397 + eigr - real part of eigenvalue
398 . eigi - imaginary part of eigenvalue
399 . Vr - real part of eigenvector
400 - Vi - imaginary part of eigenvector
401
402 Notes:
403 It is allowed to pass `NULL` for `Vr` and `Vi`, if the eigenvector is not
404 required. Otherwise, the caller must provide valid `Vec` objects, i.e.,
405 they must be created by the calling program with e.g. `MatCreateVecs()`.
406
407 If the eigenvalue is real, then `eigi` and `Vi` are set to zero. If PETSc is
408 configured with complex scalars the eigenvalue is stored
409 directly in `eigr` (`eigi` is set to zero) and the eigenvector in `Vr` (`Vi` is
410 set to zero). In both cases, the user can pass `NULL` in `eigi` and `Vi`.
411
412 The index `i` should be a value between 0 and `nconv`-1 (see `EPSGetConverged()`).
413 Eigenpairs are indexed according to the ordering criterion established
414 with `EPSSetWhichEigenpairs()`.
415
416 The 2-norm of the eigenvector is one unless the problem is generalized
417 Hermitian. In this case the eigenvector is normalized with respect to the
418 norm defined by the $B$ matrix.
419
420 In case of structured eigenproblems such as `EPS_BSE`, see the discussion about
421 [](#sec:structured-vectors).
422
423 Level: beginner
424
425 .seealso: [](ch:eps), `EPSGetEigenvalue()`, `EPSGetEigenvector()`, `EPSGetLeftEigenvector()`, `EPSSolve()`, `EPSGetConverged()`, `EPSSetWhichEigenpairs()`, `EPSGetInvariantSubspace()`
426 @*/
427 56993 PetscErrorCode EPSGetEigenpair(EPS eps,PetscInt i,PetscScalar *eigr,PetscScalar *eigi,Vec Vr,Vec Vi)
428 {
429 56993 PetscInt nconv;
430
431
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
56993 PetscFunctionBegin;
432
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.
56993 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
433
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.
56993 PetscValidLogicalCollectiveInt(eps,i,2);
434
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
56993 EPSCheckSolved(eps,1);
435
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
56993 PetscCheck(i>=0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index cannot be negative");
436
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.
56993 PetscCall(EPS_GetActualConverged(eps,&nconv));
437
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
56993 PetscCheck(i<nconv,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index can be nconv-1 at most, see EPSGetConverged()");
438
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.
56993 PetscCall(EPSGetEigenvalue(eps,i,eigr,eigi));
439
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.
56993 if (Vr || Vi) PetscCall(EPSGetEigenvector(eps,i,Vr,Vi));
440
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.
11399 PetscFunctionReturn(PETSC_SUCCESS);
441 }
442
443 /*@
444 EPSGetEigenvalue - Gets the `i`-th eigenvalue as computed by `EPSSolve()`.
445
446 Not Collective
447
448 Input Parameters:
449 + eps - the linear eigensolver context
450 - i - index of the solution
451
452 Output Parameters:
453 + eigr - real part of eigenvalue
454 - eigi - imaginary part of eigenvalue
455
456 Notes:
457 If the eigenvalue is real, then `eigi` is set to zero. If PETSc is
458 configured with complex scalars the eigenvalue is stored
459 directly in `eigr` (`eigi` is set to zero).
460
461 The index `i` should be a value between 0 and `nconv`-1 (see `EPSGetConverged()`).
462 Eigenpairs are indexed according to the ordering criterion established
463 with `EPSSetWhichEigenpairs()`.
464
465 Level: beginner
466
467 .seealso: [](ch:eps), `EPSSolve()`, `EPSGetConverged()`, `EPSSetWhichEigenpairs()`, `EPSGetEigenpair()`
468 @*/
469 111838 PetscErrorCode EPSGetEigenvalue(EPS eps,PetscInt i,PetscScalar *eigr,PetscScalar *eigi)
470 {
471 111838 PetscInt k,nconv;
472 #if !defined(PETSC_USE_COMPLEX)
473 59001 PetscInt k2, iquad;
474 #endif
475
476
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
111838 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.
111838 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
478
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
111838 EPSCheckSolved(eps,1);
479
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
111838 PetscCheck(i>=0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index cannot be negative");
480
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.
111838 PetscCall(EPS_GetActualConverged(eps,&nconv));
481
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
111838 PetscCheck(i<nconv,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index can be nconv-1 at most, see EPSGetConverged()");
482
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
111838 if (nconv==eps->nconv) {
483 101630 k = eps->perm[i];
484 #if defined(PETSC_USE_COMPLEX)
485
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
49109 if (eigr) *eigr = eps->eigr[k];
486
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
49109 if (eigi) *eigi = 0;
487 #else
488
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
52521 if (eigr) *eigr = eps->eigr[k];
489
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
52521 if (eigi) *eigi = eps->eigi[k];
490 #endif
491 } else {
492
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
10208 PetscCheck(eps->problem_type==EPS_BSE || eps->problem_type==EPS_HAMILT || eps->problem_type==EPS_LREP,PetscObjectComm((PetscObject)eps),PETSC_ERR_PLIB,"Problem type should be BSE, Hamiltonian, or LREP");
493
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 times.
10208 if (eps->problem_type==EPS_BSE || eps->problem_type==EPS_LREP) {
494 /* BSE problem, even index is +lambda, odd index is -lambda */
495 9688 k = eps->perm[i/2];
496 #if defined(PETSC_USE_COMPLEX)
497
3/4
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
3728 if (eigr) *eigr = (i%2)? -eps->eigr[k]: eps->eigr[k];
498
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
3728 if (eigi) *eigi = 0;
499 #else
500
3/4
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
5960 if (eigr) *eigr = (i%2)? -eps->eigr[k]: eps->eigr[k];
501
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
5960 if (eigi) *eigi = eps->eigi[k];
502 #endif
503
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
520 } else if (eps->problem_type==EPS_HAMILT) {
504 /* Hamiltonian eigenproblem */
505 520 k = eps->perm[i/2];
506 #if defined(PETSC_USE_COMPLEX)
507 if (eigr) *eigr = (i%2)? -eps->eigr[k]: eps->eigr[k];
508 if (eigi) *eigi = 0;
509 #else
510
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
520 if (eps->eigi[k]==0.0) { /* real eigenvalue */
511 if (eigr) *eigr = (i%2)? -eps->eigr[k]: eps->eigr[k];
512 if (eigi) *eigi = 0.0;
513
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
520 } else if (eps->eigr[k]==0.0) { /* purely imaginary eigenvalue */
514
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
120 if (eigr) *eigr = 0.0;
515
3/4
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
120 if (eigi) *eigi = (i%2)? -eps->eigi[k]: eps->eigi[k];
516 } else { /* quadruple eigenvalue (-conj(lambda),-lambda,lambda,conj(lambda)) */
517 400 iquad = i%2; /* index within the 4 values */
518
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
400 if (i>1) {
519 320 k2 = eps->perm[(i-2)/2];
520
3/4
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
320 if (eps->eigr[k]==eps->eigr[k2] && eps->eigi[k]==-eps->eigi[k2]) iquad += 2;
521 }
522
3/4
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
400 if (eigr) *eigr = (iquad<2)? -eps->eigr[k]: eps->eigr[k];
523
3/4
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
400 if (eigi) *eigi = (iquad%3)? -eps->eigi[k]: eps->eigi[k];
524 }
525 #endif
526 }
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.
22733 PetscFunctionReturn(PETSC_SUCCESS);
529 }
530
531 /*@
532 EPSGetEigenvector - Gets the `i`-th right eigenvector as computed by `EPSSolve()`.
533
534 Collective
535
536 Input Parameters:
537 + eps - the linear eigensolver context
538 - i - index of the solution
539
540 Output Parameters:
541 + Vr - real part of eigenvector
542 - Vi - imaginary part of eigenvector
543
544 Notes:
545 The caller must provide valid `Vec` objects, i.e., they must be created
546 by the calling program with e.g. `MatCreateVecs()`.
547
548 If the corresponding eigenvalue is real, then `Vi` is set to zero. If PETSc is
549 configured with complex scalars the eigenvector is stored
550 directly in `Vr` (`Vi` is set to zero). In any case, the user can pass `NULL` in `Vr`
551 or `Vi` if one of them is not required.
552
553 The index `i` should be a value between 0 and `nconv`-1 (see `EPSGetConverged()`).
554 Eigenpairs are indexed according to the ordering criterion established
555 with `EPSSetWhichEigenpairs()`.
556
557 The 2-norm of the eigenvector is one unless the problem is generalized
558 Hermitian. In this case the eigenvector is normalized with respect to the
559 norm defined by the $B$ matrix.
560
561 In case of structured eigenproblems such as `EPS_BSE`, see the discussion about
562 [](#sec:structured-vectors).
563
564 Level: beginner
565
566 .seealso: [](ch:eps), `EPSSolve()`, `EPSGetConverged()`, `EPSSetWhichEigenpairs()`, `EPSGetEigenpair()`, `EPSGetLeftEigenvector()`
567 @*/
568 88065 PetscErrorCode EPSGetEigenvector(EPS eps,PetscInt i,Vec Vr,Vec Vi)
569 {
570 88065 PetscInt nconv;
571
572
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
88065 PetscFunctionBegin;
573
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.
88065 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
574
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.
88065 PetscValidLogicalCollectiveInt(eps,i,2);
575
16/46
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ 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.
88065 if (Vr) { PetscValidHeaderSpecific(Vr,VEC_CLASSID,3); PetscCheckSameComm(eps,1,Vr,3); }
576
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.
88065 if (Vi) { PetscValidHeaderSpecific(Vi,VEC_CLASSID,4); PetscCheckSameComm(eps,1,Vi,4); }
577
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
88065 EPSCheckSolved(eps,1);
578
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
88065 PetscCheck(i>=0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index cannot be negative");
579
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.
88065 PetscCall(EPS_GetActualConverged(eps,&nconv));
580
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
88065 PetscCheck(i<nconv,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index can be nconv-1 at most, see EPSGetConverged()");
581
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.
88065 PetscCall(EPSComputeVectors(eps));
582
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.
88065 PetscCall(EPS_GetEigenvector(eps,eps->V,i,Vr,Vi));
583
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.
15677 PetscFunctionReturn(PETSC_SUCCESS);
584 }
585
586 /*@
587 EPSGetLeftEigenvector - Gets the `i`-th left eigenvector as computed by `EPSSolve()`.
588
589 Collective
590
591 Input Parameters:
592 + eps - the linear eigensolver context
593 - i - index of the solution
594
595 Output Parameters:
596 + Wr - real part of left eigenvector
597 - Wi - imaginary part of left eigenvector
598
599 Notes:
600 The caller must provide valid `Vec` objects, i.e., they must be created
601 by the calling program with e.g. `MatCreateVecs()`.
602
603 If the corresponding eigenvalue is real, then `Wi` is set to zero. If PETSc is
604 configured with complex scalars the eigenvector is stored directly in `Wr`
605 (`Wi` is set to zero). In any case, the user can pass `NULL` in `Wr` or `Wi` if
606 one of them is not required.
607
608 The index `i` should be a value between 0 and `nconv`-1 (see `EPSGetConverged()`).
609 Eigensolutions are indexed according to the ordering criterion established
610 with `EPSSetWhichEigenpairs()`.
611
612 Left eigenvectors are available only if the `twosided` flag was set, see
613 `EPSSetTwoSided()`.
614
615 In case of structured eigenproblems such as `EPS_BSE`, see the discussion about
616 [](#sec:structured-vectors).
617
618 Level: intermediate
619
620 .seealso: [](ch:eps), `EPSGetEigenvector()`, `EPSGetConverged()`, `EPSSetWhichEigenpairs()`, `EPSSetTwoSided()`
621 @*/
622 10665 PetscErrorCode EPSGetLeftEigenvector(EPS eps,PetscInt i,Vec Wr,Vec Wi)
623 {
624 10665 PetscInt nconv;
625 10665 PetscBool trivial,lrepreduced=PETSC_FALSE;
626 10665 Mat H;
627 10665 IS is[2];
628 10665 Vec v0,v1,z,z0,z1;
629
630
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
10665 PetscFunctionBegin;
631
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.
10665 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
632
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.
10665 PetscValidLogicalCollectiveInt(eps,i,2);
633
16/46
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ 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.
10665 if (Wr) { PetscValidHeaderSpecific(Wr,VEC_CLASSID,3); PetscCheckSameComm(eps,1,Wr,3); }
634
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.
10665 if (Wi) { PetscValidHeaderSpecific(Wi,VEC_CLASSID,4); PetscCheckSameComm(eps,1,Wi,4); }
635
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
10665 EPSCheckSolved(eps,1);
636
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
10665 PetscCheck(i>=0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index cannot be negative");
637
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.
10665 PetscCall(EPS_GetActualConverged(eps,&nconv));
638
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
10665 PetscCheck(i<nconv,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index can be nconv-1 at most, see EPSGetConverged()");
639
640
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 1 times.
10665 trivial = (eps->problem_type==EPS_HEP || eps->problem_type==EPS_GHEP || eps->problem_type==EPS_BSE || eps->problem_type==EPS_LREP)? PETSC_TRUE: PETSC_FALSE;
641
3/6
✓ 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.
10665 if (!trivial) PetscCheck(eps->twosided,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONGSTATE,"Must request left vectors with EPSSetTwoSided");
642
643
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.
10665 PetscCall(EPSComputeVectors(eps));
644
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
10665 if (trivial) {
645
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.
9772 PetscCall(EPS_GetEigenvector(eps,eps->V,i,Wr,Wi));
646
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.
9772 PetscCall(STGetMatrix(eps->st,0,&H));
647
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
✓ 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.
9772 if (eps->problem_type==EPS_LREP) PetscCall(SlepcCheckMatLREPReduced(H,&lrepreduced));
648
4/4
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
9772 if (eps->problem_type==EPS_BSE || !lrepreduced) { /* change sign of bottom part of the vector */
649
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.
7524 PetscCall(MatNestGetISs(H,is,NULL));
650
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
7524 if (Wr) {
651
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.
7524 PetscCall(VecGetSubVector(Wr,is[1],&v1));
652
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.
7524 PetscCall(VecScale(v1,-1.0));
653
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.
7524 PetscCall(VecRestoreSubVector(Wr,is[1],&v1));
654 }
655 #if !defined(PETSC_USE_COMPLEX)
656
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
4864 if (Wi) {
657 PetscCall(VecGetSubVector(Wi,is[1],&v1));
658 PetscCall(VecScale(v1,-1.0));
659 PetscCall(VecRestoreSubVector(Wi,is[1],&v1));
660 }
661 #endif
662
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
2248 } else if (eps->problem_type==EPS_LREP) { /* swap the two parts of the vector */
663
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
2248 if (Wr) {
664
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.
2248 PetscCall(VecDuplicate(Wr,&z));
665
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.
2248 PetscCall(VecCopy(Wr,z));
666
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.
2248 PetscCall(MatNestGetISs(H,is,NULL));
667
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.
2248 PetscCall(VecGetSubVector(Wr,is[0],&v0));
668
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.
2248 PetscCall(VecGetSubVector(Wr,is[1],&v1));
669
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.
2248 PetscCall(VecGetSubVector(z,is[0],&z0));
670
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.
2248 PetscCall(VecGetSubVector(z,is[1],&z1));
671
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.
2248 PetscCall(VecCopy(z0,v1));
672
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.
2248 PetscCall(VecCopy(z1,v0));
673
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.
2248 PetscCall(VecRestoreSubVector(Wr,is[0],&v0));
674
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.
2248 PetscCall(VecRestoreSubVector(Wr,is[1],&v1));
675
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.
2248 PetscCall(VecRestoreSubVector(z,is[0],&z0));
676
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.
2248 PetscCall(VecRestoreSubVector(z,is[1],&z1));
677
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.
2248 PetscCall(VecDestroy(&z));
678 }
679 }
680 } else {
681
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.
893 PetscCall(EPS_GetEigenvector(eps,eps->W,i,Wr,Wi));
682 }
683
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.
1831 PetscFunctionReturn(PETSC_SUCCESS);
684 }
685
686 /*@
687 EPSGetErrorEstimate - Returns the error estimate associated to the `i`-th
688 computed eigenpair.
689
690 Not Collective
691
692 Input Parameters:
693 + eps - the linear eigensolver context
694 - i - index of eigenpair
695
696 Output Parameter:
697 . errest - the error estimate
698
699 Note:
700 This is the error estimate used internally by the eigensolver. The actual
701 error bound can be computed with `EPSComputeError()`. See discussion at
702 section [](#sec:errbnd).
703
704 Level: advanced
705
706 .seealso: [](ch:eps), [](#sec:errbnd), `EPSComputeError()`
707 @*/
708 612 PetscErrorCode EPSGetErrorEstimate(EPS eps,PetscInt i,PetscReal *errest)
709 {
710 612 PetscInt nconv;
711
712
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
612 PetscFunctionBegin;
713
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.
612 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
714
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.
612 PetscAssertPointer(errest,3);
715
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
612 EPSCheckSolved(eps,1);
716
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
612 PetscCheck(i>=0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index cannot be negative");
717
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.
612 PetscCall(EPS_GetActualConverged(eps,&nconv));
718
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
612 PetscCheck(i<nconv,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index can be nconv-1 at most, see EPSGetConverged()");
719
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
612 if (nconv==eps->nconv) {
720 612 *errest = eps->errest[eps->perm[i]];
721 } else {
722 PetscCheck(eps->problem_type==EPS_BSE || eps->problem_type==EPS_LREP || eps->problem_type==EPS_HAMILT,PetscObjectComm((PetscObject)eps),PETSC_ERR_PLIB,"Wrong problem type");
723 /* even index is +lambda, odd index is -lambda, assume both have same error */
724 *errest = eps->errest[eps->perm[i/2]];
725 }
726
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.
116 PetscFunctionReturn(PETSC_SUCCESS);
727 }
728
729 /*
730 EPSComputeResidualNorm_Private - Computes the norm of the residual vector
731 associated with an eigenpair.
732
733 Input Parameters:
734 trans - whether A' must be used instead of A
735 kr,ki - eigenvalue
736 xr,xi - eigenvector
737 z - three work vectors (the second one not referenced in complex scalars)
738 */
739 46347 PetscErrorCode EPSComputeResidualNorm_Private(EPS eps,PetscBool trans,PetscScalar kr,PetscScalar ki,Vec xr,Vec xi,Vec *z,PetscReal *norm)
740 {
741 46347 PetscInt nmat;
742 46347 Mat A,B;
743 46347 Vec u,w;
744 46347 PetscScalar alpha;
745 #if !defined(PETSC_USE_COMPLEX)
746 24152 Vec v;
747 24152 PetscReal ni,nr;
748 #endif
749
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
46347 PetscErrorCode (*matmult)(Mat,Vec,Vec) = trans? MatMultHermitianTranspose: MatMult;
750
751
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
46347 PetscFunctionBegin;
752 46347 u = z[0]; w = z[2];
753
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.
46347 PetscCall(STGetNumMatrices(eps->st,&nmat));
754
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.
46347 PetscCall(STGetMatrix(eps->st,0,&A));
755
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.
46347 if (nmat>1) PetscCall(STGetMatrix(eps->st,1,&B));
756
757 #if !defined(PETSC_USE_COMPLEX)
758 24152 v = z[1];
759
3/4
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
24152 if (ki == 0 || PetscAbsScalar(ki) < PetscAbsScalar(kr*PETSC_MACHINE_EPSILON)) {
760 #endif
761
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.
45177 PetscCall((*matmult)(A,xr,u)); /* u=A*x */
762
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
45177 if (PetscAbsScalar(kr) > PETSC_MACHINE_EPSILON) {
763
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.
45177 if (nmat>1) PetscCall((*matmult)(B,xr,w));
764
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.
23406 else PetscCall(VecCopy(xr,w)); /* w=B*x */
765
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
45177 alpha = trans? -PetscConj(kr): -kr;
766
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.
45177 PetscCall(VecAXPY(u,alpha,w)); /* u=A*x-k*B*x */
767 }
768
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.
45177 PetscCall(VecNorm(u,NORM_2,norm));
769 #if !defined(PETSC_USE_COMPLEX)
770 } else {
771
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.
1170 PetscCall((*matmult)(A,xr,u)); /* u=A*xr */
772
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
1170 if (SlepcAbsEigenvalue(kr,ki) > PETSC_MACHINE_EPSILON) {
773
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ 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.
1170 if (nmat>1) PetscCall((*matmult)(B,xr,v));
774
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.
1156 else PetscCall(VecCopy(xr,v)); /* v=B*xr */
775
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.
1170 PetscCall(VecAXPY(u,-kr,v)); /* u=A*xr-kr*B*xr */
776
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ 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.
1170 if (nmat>1) PetscCall((*matmult)(B,xi,w));
777
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.
1156 else PetscCall(VecCopy(xi,w)); /* w=B*xi */
778
7/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
1170 PetscCall(VecAXPY(u,trans?-ki:ki,w)); /* u=A*xr-kr*B*xr+ki*B*xi */
779 }
780
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.
1170 PetscCall(VecNorm(u,NORM_2,&nr));
781
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.
1170 PetscCall((*matmult)(A,xi,u)); /* u=A*xi */
782
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
1170 if (SlepcAbsEigenvalue(kr,ki) > PETSC_MACHINE_EPSILON) {
783
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.
1170 PetscCall(VecAXPY(u,-kr,w)); /* u=A*xi-kr*B*xi */
784
7/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
1170 PetscCall(VecAXPY(u,trans?ki:-ki,v)); /* u=A*xi-kr*B*xi-ki*B*xr */
785 }
786
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.
1170 PetscCall(VecNorm(u,NORM_2,&ni));
787 1170 *norm = SlepcAbsEigenvalue(nr,ni);
788 }
789 #endif
790
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.
9139 PetscFunctionReturn(PETSC_SUCCESS);
791 }
792
793 /*@
794 EPSComputeError - Computes the error (based on the residual norm) associated
795 with the `i`-th computed eigenpair.
796
797 Collective
798
799 Input Parameters:
800 + eps - the linear eigensolver context
801 . i - the solution index
802 - type - the type of error to compute, see `EPSErrorType`
803
804 Output Parameter:
805 . error - the error
806
807 Notes:
808 The error can be computed in various ways, all of them based on the residual
809 norm $\|Ax-\lambda Bx\|_2$ where $(\lambda,x)$ is the approximate eigenpair.
810
811 If the computation of left eigenvectors was enabled with `EPSSetTwoSided()`,
812 then the error will be computed using the maximum of the value above and
813 the left residual norm $\|y^*A-\lambda y^*B\|_2$, where $y$ is the approximate left
814 eigenvector.
815
816 Level: beginner
817
818 .seealso: [](ch:eps), `EPSErrorType`, `EPSSolve()`, `EPSGetErrorEstimate()`, `EPSSetTwoSided()`
819 @*/
820 42962 PetscErrorCode EPSComputeError(EPS eps,PetscInt i,EPSErrorType type,PetscReal *error)
821 {
822 42962 Mat A,B;
823 42962 Vec xr,xi,w[3];
824 42962 PetscReal t,vecnorm=1.0,errorl;
825 42962 PetscScalar kr,ki;
826 42962 PetscBool flg;
827
828
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
42962 PetscFunctionBegin;
829
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.
42962 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
830
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.
42962 PetscValidLogicalCollectiveInt(eps,i,2);
831
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.
42962 PetscValidLogicalCollectiveEnum(eps,type,3);
832
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.
42962 PetscAssertPointer(error,4);
833
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
42962 EPSCheckSolved(eps,1);
834
835 /* allocate work vectors */
836 #if defined(PETSC_USE_COMPLEX)
837
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.
20440 PetscCall(EPSSetWorkVecs(eps,3));
838 20440 xi = NULL;
839 20440 w[1] = NULL;
840 #else
841
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.
22522 PetscCall(EPSSetWorkVecs(eps,5));
842 22522 xi = eps->work[3];
843 22522 w[1] = eps->work[4];
844 #endif
845 42962 xr = eps->work[0];
846 42962 w[0] = eps->work[1];
847 42962 w[2] = eps->work[2];
848
849 /* compute residual norm */
850
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.
42962 PetscCall(EPSGetEigenpair(eps,i,&kr,&ki,xr,xi));
851
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.
42962 PetscCall(EPSComputeResidualNorm_Private(eps,PETSC_FALSE,kr,ki,xr,xi,w,error));
852
853 /* compute 2-norm of eigenvector */
854
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.
42962 if (eps->problem_type==EPS_GHEP) PetscCall(VecNorm(xr,NORM_2,&vecnorm));
855
856 /* if two-sided, compute left residual norm and take the maximum */
857
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
42962 if (eps->twosided) {
858
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.
450 PetscCall(EPSGetLeftEigenvector(eps,i,xr,xi));
859
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.
450 PetscCall(EPSComputeResidualNorm_Private(eps,PETSC_TRUE,kr,ki,xr,xi,w,&errorl));
860
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
667 *error = PetscMax(*error,errorl);
861 }
862
863 /* compute error */
864
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
42962 switch (type) {
865 case EPS_ERROR_ABSOLUTE:
866 break;
867 25512 case EPS_ERROR_RELATIVE:
868 25512 *error /= SlepcAbsEigenvalue(kr,ki)*vecnorm;
869 25512 break;
870 17198 case EPS_ERROR_BACKWARD:
871 /* initialization of matrix norms */
872
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
17198 if (!eps->nrma) {
873
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.
395 PetscCall(STGetMatrix(eps->st,0,&A));
874
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.
395 PetscCall(MatHasOperation(A,MATOP_NORM,&flg));
875
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
395 PetscCheck(flg,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONG,"The computation of backward errors requires a matrix norm operation");
876
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.
395 PetscCall(MatNorm(A,NORM_INFINITY,&eps->nrma));
877 }
878
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
17198 if (eps->isgeneralized) {
879
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
16945 if (!eps->nrmb) {
880
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.
336 PetscCall(STGetMatrix(eps->st,1,&B));
881
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.
336 PetscCall(MatHasOperation(B,MATOP_NORM,&flg));
882
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
336 PetscCheck(flg,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONG,"The computation of backward errors requires a matrix norm operation");
883
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.
336 PetscCall(MatNorm(B,NORM_INFINITY,&eps->nrmb));
884 }
885 253 } else eps->nrmb = 1.0;
886 17198 t = SlepcAbsEigenvalue(kr,ki);
887 17198 *error /= (eps->nrma+t*eps->nrmb)*vecnorm;
888 17198 break;
889 default:
890 SETERRQ(PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"Invalid error type");
891 }
892
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.
8423 PetscFunctionReturn(PETSC_SUCCESS);
893 }
894
895 /*
896 EPSGetStartVector - Generate a suitable vector to be used as the starting vector
897 for the recurrence that builds the right subspace.
898
899 Collective
900
901 Input Parameters:
902 + eps - the linear eigensolver context
903 - i - iteration number
904
905 Output Parameter:
906 . breakdown - flag indicating that a breakdown has occurred
907
908 Notes:
909 The start vector is computed from another vector: for the first step (i=0),
910 the first initial vector is used (see EPSSetInitialSpace()); otherwise a random
911 vector is created. Then this vector is forced to be in the range of OP (only
912 for generalized definite problems) and orthonormalized with respect to all
913 V-vectors up to i-1. The resulting vector is placed in V[i].
914
915 The flag breakdown is set to true if either i=0 and the vector belongs to the
916 deflation space, or i>0 and the vector is linearly dependent with respect
917 to the V-vectors.
918 */
919 7084 PetscErrorCode EPSGetStartVector(EPS eps,PetscInt i,PetscBool *breakdown)
920 {
921 7084 PetscReal norm;
922 7084 PetscBool lindep;
923 7084 Vec w,z;
924
925
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
7084 PetscFunctionBegin;
926
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.
7084 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
927
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.
7084 PetscValidLogicalCollectiveInt(eps,i,2);
928
929 /* For the first step, use the first initial vector, otherwise a random one */
930
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.
7084 if (i>0 || eps->nini==0) PetscCall(BVSetRandomColumn(eps->V,i));
931
932 /* Force the vector to be in the range of OP for generalized problems with B-inner product */
933
6/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
7084 if (eps->ispositive || (eps->isgeneralized && eps->ishermitian)) {
934
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.
1033 PetscCall(BVCreateVec(eps->V,&w));
935
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.
1033 PetscCall(BVCopyVec(eps->V,i,w));
936
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.
1033 PetscCall(BVGetColumn(eps->V,i,&z));
937
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.
1033 PetscCall(STApply(eps->st,w,z));
938
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.
1033 PetscCall(BVRestoreColumn(eps->V,i,&z));
939
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.
1033 PetscCall(VecDestroy(&w));
940 }
941
942 /* Orthonormalize the vector with respect to previous vectors */
943
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.
7084 PetscCall(BVOrthogonalizeColumn(eps->V,i,NULL,&norm,&lindep));
944
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
7084 if (breakdown) *breakdown = lindep;
945
2/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
6727 else if (lindep || norm == 0.0) {
946 PetscCheck(i,PetscObjectComm((PetscObject)eps),PETSC_ERR_PLIB,"Initial vector is zero or belongs to the deflation space");
947 PetscCheck(!i,PetscObjectComm((PetscObject)eps),PETSC_ERR_CONV_FAILED,"Unable to generate more start vectors");
948 }
949
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.
7084 PetscCall(BVScaleColumn(eps->V,i,1.0/norm));
950
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.
1369 PetscFunctionReturn(PETSC_SUCCESS);
951 }
952
953 /*
954 EPSGetLeftStartVector - Generate a suitable vector to be used as the left starting
955 vector for the recurrence that builds the left subspace. See EPSGetStartVector().
956 */
957 254 PetscErrorCode EPSGetLeftStartVector(EPS eps,PetscInt i,PetscBool *breakdown)
958 {
959 254 PetscReal norm;
960 254 PetscBool lindep;
961 254 Vec w,z;
962
963
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
254 PetscFunctionBegin;
964
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.
254 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
965
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.
254 PetscValidLogicalCollectiveInt(eps,i,2);
966
967 /* For the first step, use the first initial vector, otherwise a random one */
968
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.
254 if (i>0 || eps->ninil==0) PetscCall(BVSetRandomColumn(eps->W,i));
969
970 /* Force the vector to be in the range of OP' for generalized problems with B-inner product */
971
5/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
254 if (eps->ispositive || (eps->isgeneralized && eps->ishermitian)) {
972
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13 PetscCall(BVCreateVec(eps->W,&w));
973
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13 PetscCall(BVCopyVec(eps->W,i,w));
974
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13 PetscCall(BVGetColumn(eps->W,i,&z));
975
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13 PetscCall(STApplyHermitianTranspose(eps->st,w,z));
976
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13 PetscCall(BVRestoreColumn(eps->W,i,&z));
977
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13 PetscCall(VecDestroy(&w));
978 }
979
980 /* Orthonormalize the vector with respect to previous vectors */
981
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.
254 PetscCall(BVOrthogonalizeColumn(eps->W,i,NULL,&norm,&lindep));
982
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
254 if (breakdown) *breakdown = lindep;
983
2/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
199 else if (lindep || norm == 0.0) {
984 PetscCheck(i,PetscObjectComm((PetscObject)eps),PETSC_ERR_PLIB,"Left initial vector is zero");
985 PetscCheck(!i,PetscObjectComm((PetscObject)eps),PETSC_ERR_CONV_FAILED,"Unable to generate more left start vectors");
986 }
987
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.
254 PetscCall(BVScaleColumn(eps->W,i,1.0/norm));
988
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.
50 PetscFunctionReturn(PETSC_SUCCESS);
989 }
990