GCC Code Coverage Report


Directory: ./
File: src/eps/interface/epssolve.c
Date: 2026-04-06 03:57:41
Exec Total Coverage
Lines: 389 415 93.7%
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 94330 PetscErrorCode EPSComputeVectors(EPS eps)
19 {
20
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
94330 PetscFunctionBegin;
21
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
94330 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.
94330 if (eps->state==EPS_STATE_SOLVED) PetscTryTypeMethod(eps,computevectors);
23 94330 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.
94330 PetscFunctionReturn(PETSC_SUCCESS);
25 }
26
27 9972 static PetscErrorCode EPSComputeValues(EPS eps)
28 {
29 9972 PetscBool injective,iscomp,isfilter;
30 9972 PetscInt i,n,aux,nconv0;
31 9972 Mat A,B=NULL,G,Z;
32
33
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
9972 PetscFunctionBegin;
34
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9972 switch (eps->categ) {
35 7852 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.
7852 PetscCall(STIsInjective(eps->st,&injective));
38
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
7852 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.
7636 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.
1920 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
123 Level: beginner
124
125 .seealso: [](ch:eps), `EPSCreate()`, `EPSSetUp()`, `EPSDestroy()`, `EPSSetOperators()`, `EPSGetConverged()`, `EPSGetConvergedReason()`
126 @*/
127 9972 PetscErrorCode EPSSolve(EPS eps)
128 {
129 9972 PetscInt i;
130 9972 PetscBool hasname;
131 9972 STMatMode matmode;
132 9972 Mat A,B;
133
134
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
9972 PetscFunctionBegin;
135
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.
9972 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
136
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.
9972 if (eps->state>=EPS_STATE_SOLVED) PetscFunctionReturn(PETSC_SUCCESS);
137
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.
9972 PetscCall(PetscLogEventBegin(EPS_Solve,eps,0,0,0));
138
139 /* Call setup */
140
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.
9972 PetscCall(EPSSetUp(eps));
141
142 /* Safeguard for matrices of size 0 */
143
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
9972 if (eps->n == 0) {
144 eps->nconv = 0;
145 eps->reason = EPS_CONVERGED_TOL;
146 eps->state = EPS_STATE_SOLVED;
147 PetscFunctionReturn(PETSC_SUCCESS);
148 }
149
150 9972 eps->nconv = 0;
151 9972 eps->its = 0;
152
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
302172 for (i=0;i<eps->ncv;i++) {
153 292200 eps->eigr[i] = 0.0;
154 292200 eps->eigi[i] = 0.0;
155 292200 eps->errest[i] = 0.0;
156 292200 eps->perm[i] = i;
157 }
158
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9972 PetscCall(EPSViewFromOptions(eps,NULL,"-eps_view_pre"));
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.
9972 PetscCall(RGViewFromOptions(eps->rg,NULL,"-rg_view"));
160
161 /* Call solver */
162
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.
9972 PetscUseTypeMethod(eps,solve);
163
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
9972 PetscCheck(eps->reason,PetscObjectComm((PetscObject)eps),PETSC_ERR_PLIB,"Internal error, solver returned without setting converged reason");
164 9972 eps->state = EPS_STATE_SOLVED;
165
166 /* Only the first nconv columns contain useful information (except in CISS) */
167
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.
9972 PetscCall(BVSetActiveColumns(eps->V,0,eps->nconv));
168
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.
9972 if (eps->twosided) PetscCall(BVSetActiveColumns(eps->W,0,eps->nconv));
169
170 /* If inplace, purify eigenvectors before reverting operator */
171
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.
9972 PetscCall(STGetMatMode(eps->st,&matmode));
172
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.
9972 if (matmode == ST_MATMODE_INPLACE && eps->ispositive) PetscCall(EPSComputeVectors(eps));
173
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.
9972 PetscCall(STPostSolve(eps->st));
174
175 /* Map eigenvalues back to the original problem if appropriate */
176
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9972 PetscCall(EPSComputeValues(eps));
177
178 #if !defined(PETSC_USE_COMPLEX)
179 /* Reorder conjugate eigenvalues (positive imaginary first) */
180
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
56949 for (i=0;i<eps->nconv-1;i++) {
181
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.
51717 if (eps->eigi[i] != 0 && (eps->problem_type!=EPS_HAMILT || eps->eigr[i]!=0)) {
182 /* conjugate eigenvalues */
183
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
925 if (eps->eigi[i] < 0) {
184 116 eps->eigi[i] = -eps->eigi[i];
185 116 eps->eigi[i+1] = -eps->eigi[i+1];
186 /* the next correction only works with eigenvectors */
187
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));
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(BVScaleColumn(eps->V,i+1,-1.0));
189
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));
190 }
191 925 i++;
192 }
193 }
194 #endif
195
196 /* Sort eigenvalues according to eps->which parameter */
197
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.
9972 if (eps->problem_type==EPS_HAMILT) PetscCall(SlepcSortEigenvaluesSpecial(eps->sc,eps->nconv,eps->eigr,eps->eigi,eps->perm));
198
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9937 else PetscCall(SlepcSortEigenvalues(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.
9972 PetscCall(PetscLogEventEnd(EPS_Solve,eps,0,0,0));
200
201 /* Various viewers */
202
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9972 PetscCall(EPSViewFromOptions(eps,NULL,"-eps_view"));
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.
9972 PetscCall(EPSConvergedReasonViewFromOptions(eps));
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.
9972 PetscCall(EPSErrorViewFromOptions(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.
9972 PetscCall(EPSValuesViewFromOptions(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.
9972 PetscCall(EPSVectorsViewFromOptions(eps));
207
208
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.
9972 PetscCall(PetscOptionsHasName(((PetscObject)eps)->options,((PetscObject)eps)->prefix,"-eps_view_mat0",&hasname));
209
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
9972 if (hasname) {
210 PetscCall(EPSGetOperators(eps,&A,NULL));
211 PetscCall(MatViewFromOptions(A,(PetscObject)eps,"-eps_view_mat0"));
212 }
213
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9972 if (eps->isgeneralized) {
214
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));
215
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
2080 if (hasname) {
216 PetscCall(EPSGetOperators(eps,NULL,&B));
217 PetscCall(MatViewFromOptions(B,(PetscObject)eps,"-eps_view_mat1"));
218 }
219 }
220
221 /* Remove deflation and initial subspaces */
222
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9972 if (eps->nds) {
223
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));
224 153 eps->nds = 0;
225 }
226 9972 eps->nini = 0;
227
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.
9972 PetscFunctionReturn(PETSC_SUCCESS);
228 }
229
230 /*@
231 EPSGetIterationNumber - Gets the current iteration number. If the
232 call to `EPSSolve()` is complete, then it returns the number of iterations
233 carried out by the solution method.
234
235 Not Collective
236
237 Input Parameter:
238 . eps - the linear eigensolver context
239
240 Output Parameter:
241 . its - number of iterations
242
243 Note:
244 During the $i$-th iteration this call returns $i-1$. If `EPSSolve()` is
245 complete, then parameter `its` contains either the iteration number at
246 which convergence was successfully reached, or failure was detected.
247 Call `EPSGetConvergedReason()` to determine if the solver converged or
248 failed and why.
249
250 Level: intermediate
251
252 .seealso: [](ch:eps), `EPSGetConvergedReason()`, `EPSSetTolerances()`
253 @*/
254 1564 PetscErrorCode EPSGetIterationNumber(EPS eps,PetscInt *its)
255 {
256
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1564 PetscFunctionBegin;
257
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);
258
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);
259 1564 *its = eps->its;
260
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);
261 }
262
263 /*@
264 EPSGetConverged - Gets the number of converged eigenpairs.
265
266 Not Collective
267
268 Input Parameter:
269 . eps - the linear eigensolver context
270
271 Output Parameter:
272 . nconv - number of converged eigenpairs
273
274 Notes:
275 This function should be called after `EPSSolve()` has finished.
276
277 The value `nconv` may be different from the number of requested solutions
278 `nev`, but not larger than `ncv`, see `EPSSetDimensions()`.
279
280 Level: beginner
281
282 .seealso: [](ch:eps), `EPSSetDimensions()`, `EPSSolve()`, `EPSGetEigenpair()`
283 @*/
284 6066 PetscErrorCode EPSGetConverged(EPS eps,PetscInt *nconv)
285 {
286
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
6066 PetscFunctionBegin;
287
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.
6066 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
288
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.
6066 PetscAssertPointer(nconv,2);
289
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6066 EPSCheckSolved(eps,1);
290
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.
6066 PetscCall(EPS_GetActualConverged(eps,nconv));
291
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.
1165 PetscFunctionReturn(PETSC_SUCCESS);
292 }
293
294 /*@
295 EPSGetConvergedReason - Gets the reason why the `EPSSolve()` iteration was
296 stopped.
297
298 Not Collective
299
300 Input Parameter:
301 . eps - the linear eigensolver context
302
303 Output Parameter:
304 . reason - negative value indicates diverged, positive value converged, see
305 `EPSConvergedReason` for the possible values
306
307 Options Database Key:
308 . -eps_converged_reason - print reason for convergence/divergence, and number of iterations
309
310 Note:
311 If this routine is called before or doing the `EPSSolve()` the value of
312 `EPS_CONVERGED_ITERATING` is returned.
313
314 Level: intermediate
315
316 .seealso: [](ch:eps), `EPSSetTolerances()`, `EPSSolve()`, `EPSConvergedReason`
317 @*/
318 1513 PetscErrorCode EPSGetConvergedReason(EPS eps,EPSConvergedReason *reason)
319 {
320
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1513 PetscFunctionBegin;
321
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);
322
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);
323
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1513 EPSCheckSolved(eps,1);
324 1513 *reason = eps->reason;
325
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);
326 }
327
328 /*@
329 EPSGetInvariantSubspace - Gets an orthonormal basis of the computed invariant
330 subspace.
331
332 Collective
333
334 Input Parameter:
335 . eps - the linear eigensolver context
336
337 Output Parameter:
338 . v - an array of vectors
339
340 Notes:
341 This function should be called after `EPSSolve()` has finished.
342
343 The user should provide in `v` an array of `nconv` vectors, where `nconv`
344 is the value returned by `EPSGetConverged()`.
345
346 The first $k$ vectors returned in `v` span an invariant subspace associated
347 with the first $k$ computed eigenvalues (note that this is not true if the
348 $k$-th eigenvalue is complex and matrix $A$ is real; in this case the first
349 $k+1$ vectors should be used). An invariant subspace $X$ of $A$ satisfies
350 $Ax\in X, \forall x\in X$ (a similar definition applies for generalized
351 eigenproblems).
352
353 Level: intermediate
354
355 .seealso: [](ch:eps), `EPSGetEigenpair()`, `EPSGetConverged()`, `EPSSolve()`
356 @*/
357 80 PetscErrorCode EPSGetInvariantSubspace(EPS eps,Vec v[])
358 {
359 80 PetscInt i;
360 80 BV V=eps->V;
361 80 Vec w;
362
363
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
80 PetscFunctionBegin;
364
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);
365
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);
366
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);
367
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
80 EPSCheckSolved(eps,1);
368
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");
369
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) {
370
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));
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(BVSetActiveColumns(eps->V,0,eps->nconv));
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(BVCopy(eps->V,V));
373
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
55 for (i=0;i<eps->nconv;i++) {
374
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));
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(VecPointwiseDivide(w,w,eps->D));
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(BVRestoreColumn(V,i,&w));
377 }
378
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));
379 }
380
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]));
381
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));
382
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);
383 }
384
385 /*@
386 EPSGetEigenpair - Gets the `i`-th solution of the eigenproblem as computed by
387 `EPSSolve()`. The solution consists in both the eigenvalue and the eigenvector.
388
389 Collective
390
391 Input Parameters:
392 + eps - the linear eigensolver context
393 - i - index of the solution
394
395 Output Parameters:
396 + eigr - real part of eigenvalue
397 . eigi - imaginary part of eigenvalue
398 . Vr - real part of eigenvector
399 - Vi - imaginary part of eigenvector
400
401 Notes:
402 It is allowed to pass `NULL` for `Vr` and `Vi`, if the eigenvector is not
403 required. Otherwise, the caller must provide valid `Vec` objects, i.e.,
404 they must be created by the calling program with e.g. `MatCreateVecs()`.
405
406 If the eigenvalue is real, then `eigi` and `Vi` are set to zero. If PETSc is
407 configured with complex scalars the eigenvalue is stored
408 directly in `eigr` (`eigi` is set to zero) and the eigenvector in `Vr` (`Vi` is
409 set to zero). In both cases, the user can pass `NULL` in `eigi` and `Vi`.
410
411 The index `i` should be a value between 0 and `nconv`-1 (see `EPSGetConverged()`).
412 Eigenpairs are indexed according to the ordering criterion established
413 with `EPSSetWhichEigenpairs()`.
414
415 The 2-norm of the eigenvector is one unless the problem is generalized
416 Hermitian. In this case the eigenvector is normalized with respect to the
417 norm defined by the $B$ matrix.
418
419 In case of structured eigenproblems such as `EPS_BSE`, see the discussion about
420 [](#sec:structured-vectors).
421
422 Level: beginner
423
424 .seealso: [](ch:eps), `EPSGetEigenvalue()`, `EPSGetEigenvector()`, `EPSGetLeftEigenvector()`, `EPSSolve()`, `EPSGetConverged()`, `EPSSetWhichEigenpairs()`, `EPSGetInvariantSubspace()`
425 @*/
426 56416 PetscErrorCode EPSGetEigenpair(EPS eps,PetscInt i,PetscScalar *eigr,PetscScalar *eigi,Vec Vr,Vec Vi)
427 {
428 56416 PetscInt nconv;
429
430
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
56416 PetscFunctionBegin;
431
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.
56416 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
432
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.
56416 PetscValidLogicalCollectiveInt(eps,i,2);
433
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
56416 EPSCheckSolved(eps,1);
434
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
56416 PetscCheck(i>=0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index cannot be negative");
435
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.
56416 PetscCall(EPS_GetActualConverged(eps,&nconv));
436
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
56416 PetscCheck(i<nconv,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index can be nconv-1 at most, see EPSGetConverged()");
437
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.
56416 PetscCall(EPSGetEigenvalue(eps,i,eigr,eigi));
438
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.
56416 if (Vr || Vi) PetscCall(EPSGetEigenvector(eps,i,Vr,Vi));
439
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.
11301 PetscFunctionReturn(PETSC_SUCCESS);
440 }
441
442 /*@
443 EPSGetEigenvalue - Gets the `i`-th eigenvalue as computed by `EPSSolve()`.
444
445 Not Collective
446
447 Input Parameters:
448 + eps - the linear eigensolver context
449 - i - index of the solution
450
451 Output Parameters:
452 + eigr - real part of eigenvalue
453 - eigi - imaginary part of eigenvalue
454
455 Notes:
456 If the eigenvalue is real, then `eigi` is set to zero. If PETSc is
457 configured with complex scalars the eigenvalue is stored
458 directly in `eigr` (`eigi` is set to zero).
459
460 The index `i` should be a value between 0 and `nconv`-1 (see `EPSGetConverged()`).
461 Eigenpairs are indexed according to the ordering criterion established
462 with `EPSSetWhichEigenpairs()`.
463
464 Level: beginner
465
466 .seealso: [](ch:eps), `EPSSolve()`, `EPSGetConverged()`, `EPSSetWhichEigenpairs()`, `EPSGetEigenpair()`
467 @*/
468 110657 PetscErrorCode EPSGetEigenvalue(EPS eps,PetscInt i,PetscScalar *eigr,PetscScalar *eigi)
469 {
470 110657 PetscInt k,nconv;
471 #if !defined(PETSC_USE_COMPLEX)
472 57704 PetscInt k2, iquad;
473 #endif
474
475
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
110657 PetscFunctionBegin;
476
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.
110657 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
477
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
110657 EPSCheckSolved(eps,1);
478
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
110657 PetscCheck(i>=0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index cannot be negative");
479
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.
110657 PetscCall(EPS_GetActualConverged(eps,&nconv));
480
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
110657 PetscCheck(i<nconv,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index can be nconv-1 at most, see EPSGetConverged()");
481
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
110657 if (nconv==eps->nconv) {
482 101625 k = eps->perm[i];
483 #if defined(PETSC_USE_COMPLEX)
484
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
49129 if (eigr) *eigr = eps->eigr[k];
485
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
49129 if (eigi) *eigi = 0;
486 #else
487
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
52496 if (eigr) *eigr = eps->eigr[k];
488
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
52496 if (eigi) *eigi = eps->eigi[k];
489 #endif
490 } else {
491
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
9032 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");
492
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 times.
9032 if (eps->problem_type==EPS_BSE || eps->problem_type==EPS_LREP) {
493 /* BSE problem, even index is +lambda, odd index is -lambda */
494 8512 k = eps->perm[i/2];
495 #if defined(PETSC_USE_COMPLEX)
496
3/4
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
3824 if (eigr) *eigr = (i%2)? -eps->eigr[k]: eps->eigr[k];
497
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
3824 if (eigi) *eigi = 0;
498 #else
499
3/4
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
4688 if (eigr) *eigr = (i%2)? -eps->eigr[k]: eps->eigr[k];
500
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
4688 if (eigi) *eigi = eps->eigi[k];
501 #endif
502
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
520 } else if (eps->problem_type==EPS_HAMILT) {
503 /* Hamiltonian eigenproblem */
504 520 k = eps->perm[i/2];
505 #if defined(PETSC_USE_COMPLEX)
506 if (eigr) *eigr = (i%2)? -eps->eigr[k]: eps->eigr[k];
507 if (eigi) *eigi = 0;
508 #else
509
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
520 if (eps->eigi[k]==0.0) { /* real eigenvalue */
510 if (eigr) *eigr = (i%2)? -eps->eigr[k]: eps->eigr[k];
511 if (eigi) *eigi = 0.0;
512
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
520 } else if (eps->eigr[k]==0.0) { /* purely imaginary eigenvalue */
513
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
120 if (eigr) *eigr = 0.0;
514
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];
515 } else { /* quadruple eigenvalue (-conj(lambda),-lambda,lambda,conj(lambda)) */
516 400 iquad = i%2; /* index within the 4 values */
517
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
400 if (i>1) {
518 320 k2 = eps->perm[(i-2)/2];
519
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;
520 }
521
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];
522
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];
523 }
524 #endif
525 }
526 }
527
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.
22530 PetscFunctionReturn(PETSC_SUCCESS);
528 }
529
530 /*@
531 EPSGetEigenvector - Gets the `i`-th right eigenvector as computed by `EPSSolve()`.
532
533 Collective
534
535 Input Parameters:
536 + eps - the linear eigensolver context
537 - i - index of the solution
538
539 Output Parameters:
540 + Vr - real part of eigenvector
541 - Vi - imaginary part of eigenvector
542
543 Notes:
544 The caller must provide valid `Vec` objects, i.e., they must be created
545 by the calling program with e.g. `MatCreateVecs()`.
546
547 If the corresponding eigenvalue is real, then `Vi` is set to zero. If PETSc is
548 configured with complex scalars the eigenvector is stored
549 directly in `Vr` (`Vi` is set to zero). In any case, the user can pass `NULL` in `Vr`
550 or `Vi` if one of them is not required.
551
552 The index `i` should be a value between 0 and `nconv`-1 (see `EPSGetConverged()`).
553 Eigenpairs are indexed according to the ordering criterion established
554 with `EPSSetWhichEigenpairs()`.
555
556 The 2-norm of the eigenvector is one unless the problem is generalized
557 Hermitian. In this case the eigenvector is normalized with respect to the
558 norm defined by the $B$ matrix.
559
560 In case of structured eigenproblems such as `EPS_BSE`, see the discussion about
561 [](#sec:structured-vectors).
562
563 Level: beginner
564
565 .seealso: [](ch:eps), `EPSSolve()`, `EPSGetConverged()`, `EPSSetWhichEigenpairs()`, `EPSGetEigenpair()`, `EPSGetLeftEigenvector()`
566 @*/
567 85249 PetscErrorCode EPSGetEigenvector(EPS eps,PetscInt i,Vec Vr,Vec Vi)
568 {
569 85249 PetscInt nconv;
570
571
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
85249 PetscFunctionBegin;
572
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.
85249 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
573
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.
85249 PetscValidLogicalCollectiveInt(eps,i,2);
574
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.
85249 if (Vr) { PetscValidHeaderSpecific(Vr,VEC_CLASSID,3); PetscCheckSameComm(eps,1,Vr,3); }
575
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.
85249 if (Vi) { PetscValidHeaderSpecific(Vi,VEC_CLASSID,4); PetscCheckSameComm(eps,1,Vi,4); }
576
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
85249 EPSCheckSolved(eps,1);
577
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
85249 PetscCheck(i>=0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index cannot be negative");
578
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.
85249 PetscCall(EPS_GetActualConverged(eps,&nconv));
579
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
85249 PetscCheck(i<nconv,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index can be nconv-1 at most, see EPSGetConverged()");
580
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.
85249 PetscCall(EPSComputeVectors(eps));
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.
85249 PetscCall(EPS_GetEigenvector(eps,eps->V,i,Vr,Vi));
582
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.
15200 PetscFunctionReturn(PETSC_SUCCESS);
583 }
584
585 /*@
586 EPSGetLeftEigenvector - Gets the `i`-th left eigenvector as computed by `EPSSolve()`.
587
588 Collective
589
590 Input Parameters:
591 + eps - the linear eigensolver context
592 - i - index of the solution
593
594 Output Parameters:
595 + Wr - real part of left eigenvector
596 - Wi - imaginary part of left eigenvector
597
598 Notes:
599 The caller must provide valid `Vec` objects, i.e., they must be created
600 by the calling program with e.g. `MatCreateVecs()`.
601
602 If the corresponding eigenvalue is real, then `Wi` is set to zero. If PETSc is
603 configured with complex scalars the eigenvector is stored directly in `Wr`
604 (`Wi` is set to zero). In any case, the user can pass `NULL` in `Wr` or `Wi` if
605 one of them is not required.
606
607 The index `i` should be a value between 0 and `nconv`-1 (see `EPSGetConverged()`).
608 Eigensolutions are indexed according to the ordering criterion established
609 with `EPSSetWhichEigenpairs()`.
610
611 Left eigenvectors are available only if the `twosided` flag was set, see
612 `EPSSetTwoSided()`.
613
614 In case of structured eigenproblems such as `EPS_BSE`, see the discussion about
615 [](#sec:structured-vectors).
616
617 Level: intermediate
618
619 .seealso: [](ch:eps), `EPSGetEigenvector()`, `EPSGetConverged()`, `EPSSetWhichEigenpairs()`, `EPSSetTwoSided()`
620 @*/
621 8453 PetscErrorCode EPSGetLeftEigenvector(EPS eps,PetscInt i,Vec Wr,Vec Wi)
622 {
623 8453 PetscInt nconv;
624 8453 PetscBool trivial,lrepreduced=PETSC_FALSE;
625 8453 Mat H;
626 8453 IS is[2];
627 8453 Vec v0,v1,z,z0,z1;
628
629
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
8453 PetscFunctionBegin;
630
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.
8453 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
631
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.
8453 PetscValidLogicalCollectiveInt(eps,i,2);
632
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.
8453 if (Wr) { PetscValidHeaderSpecific(Wr,VEC_CLASSID,3); PetscCheckSameComm(eps,1,Wr,3); }
633
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.
8453 if (Wi) { PetscValidHeaderSpecific(Wi,VEC_CLASSID,4); PetscCheckSameComm(eps,1,Wi,4); }
634
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
8453 EPSCheckSolved(eps,1);
635
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
8453 PetscCheck(i>=0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index cannot be negative");
636
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.
8453 PetscCall(EPS_GetActualConverged(eps,&nconv));
637
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
8453 PetscCheck(i<nconv,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index can be nconv-1 at most, see EPSGetConverged()");
638
639
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 1 times.
8453 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;
640
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.
8453 if (!trivial) PetscCheck(eps->twosided,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONGSTATE,"Must request left vectors with EPSSetTwoSided");
641
642
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.
8453 PetscCall(EPSComputeVectors(eps));
643
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
8453 if (trivial) {
644
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.
7560 PetscCall(EPS_GetEigenvector(eps,eps->V,i,Wr,Wi));
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.
7560 PetscCall(STGetMatrix(eps->st,0,&H));
646
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.
7560 if (eps->problem_type==EPS_LREP) PetscCall(SlepcCheckMatLREPReduced(H,&lrepreduced));
647
4/4
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
7560 if (eps->problem_type==EPS_BSE || !lrepreduced) { /* change sign of bottom part of the vector */
648
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.
6472 PetscCall(MatNestGetISs(H,is,NULL));
649
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
6472 if (Wr) {
650
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.
6472 PetscCall(VecGetSubVector(Wr,is[1],&v1));
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.
6472 PetscCall(VecScale(v1,-1.0));
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.
6472 PetscCall(VecRestoreSubVector(Wr,is[1],&v1));
653 }
654 #if !defined(PETSC_USE_COMPLEX)
655
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
3764 if (Wi) {
656 PetscCall(VecGetSubVector(Wi,is[1],&v1));
657 PetscCall(VecScale(v1,-1.0));
658 PetscCall(VecRestoreSubVector(Wi,is[1],&v1));
659 }
660 #endif
661
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
1088 } else if (eps->problem_type==EPS_LREP) { /* swap the two parts of the vector */
662
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
1088 if (Wr) {
663
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.
1088 PetscCall(VecDuplicate(Wr,&z));
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.
1088 PetscCall(VecCopy(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.
1088 PetscCall(MatNestGetISs(H,is,NULL));
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.
1088 PetscCall(VecGetSubVector(Wr,is[0],&v0));
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.
1088 PetscCall(VecGetSubVector(Wr,is[1],&v1));
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.
1088 PetscCall(VecGetSubVector(z,is[0],&z0));
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.
1088 PetscCall(VecGetSubVector(z,is[1],&z1));
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.
1088 PetscCall(VecCopy(z0,v1));
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.
1088 PetscCall(VecCopy(z1,v0));
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.
1088 PetscCall(VecRestoreSubVector(Wr,is[0],&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.
1088 PetscCall(VecRestoreSubVector(Wr,is[1],&v1));
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.
1088 PetscCall(VecRestoreSubVector(z,is[0],&z0));
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.
1088 PetscCall(VecRestoreSubVector(z,is[1],&z1));
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.
1088 PetscCall(VecDestroy(&z));
677 }
678 }
679 } else {
680
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));
681 }
682
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.
1459 PetscFunctionReturn(PETSC_SUCCESS);
683 }
684
685 /*@
686 EPSGetErrorEstimate - Returns the error estimate associated to the `i`-th
687 computed eigenpair.
688
689 Not Collective
690
691 Input Parameters:
692 + eps - the linear eigensolver context
693 - i - index of eigenpair
694
695 Output Parameter:
696 . errest - the error estimate
697
698 Note:
699 This is the error estimate used internally by the eigensolver. The actual
700 error bound can be computed with `EPSComputeError()`. See discussion at
701 section [](#sec:errbnd).
702
703 Level: advanced
704
705 .seealso: [](ch:eps), [](#sec:errbnd), `EPSComputeError()`
706 @*/
707 612 PetscErrorCode EPSGetErrorEstimate(EPS eps,PetscInt i,PetscReal *errest)
708 {
709 612 PetscInt nconv;
710
711
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
612 PetscFunctionBegin;
712
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);
713
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);
714
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
612 EPSCheckSolved(eps,1);
715
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");
716
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));
717
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()");
718
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
612 if (nconv==eps->nconv) {
719 612 *errest = eps->errest[eps->perm[i]];
720 } else {
721 PetscCheck(eps->problem_type==EPS_BSE,PetscObjectComm((PetscObject)eps),PETSC_ERR_PLIB,"Problem type should be BSE");
722 /* BSE problem, even index is +lambda, odd index is -lambda, assume both have same error */
723 *errest = eps->errest[eps->perm[i/2]];
724 }
725
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);
726 }
727
728 /*
729 EPSComputeResidualNorm_Private - Computes the norm of the residual vector
730 associated with an eigenpair.
731
732 Input Parameters:
733 trans - whether A' must be used instead of A
734 kr,ki - eigenvalue
735 xr,xi - eigenvector
736 z - three work vectors (the second one not referenced in complex scalars)
737 */
738 45769 PetscErrorCode EPSComputeResidualNorm_Private(EPS eps,PetscBool trans,PetscScalar kr,PetscScalar ki,Vec xr,Vec xi,Vec *z,PetscReal *norm)
739 {
740 45769 PetscInt nmat;
741 45769 Mat A,B;
742 45769 Vec u,w;
743 45769 PetscScalar alpha;
744 #if !defined(PETSC_USE_COMPLEX)
745 23516 Vec v;
746 23516 PetscReal ni,nr;
747 #endif
748
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
45769 PetscErrorCode (*matmult)(Mat,Vec,Vec) = trans? MatMultHermitianTranspose: MatMult;
749
750
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
45769 PetscFunctionBegin;
751 45769 u = z[0]; w = z[2];
752
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.
45769 PetscCall(STGetNumMatrices(eps->st,&nmat));
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.
45769 PetscCall(STGetMatrix(eps->st,0,&A));
754
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.
45769 if (nmat>1) PetscCall(STGetMatrix(eps->st,1,&B));
755
756 #if !defined(PETSC_USE_COMPLEX)
757 23516 v = z[1];
758
3/4
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
23516 if (ki == 0 || PetscAbsScalar(ki) < PetscAbsScalar(kr*PETSC_MACHINE_EPSILON)) {
759 #endif
760
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.
44599 PetscCall((*matmult)(A,xr,u)); /* u=A*x */
761
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
44599 if (PetscAbsScalar(kr) > PETSC_MACHINE_EPSILON) {
762
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.
44599 if (nmat>1) PetscCall((*matmult)(B,xr,w));
763
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.
22828 else PetscCall(VecCopy(xr,w)); /* w=B*x */
764
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
44599 alpha = trans? -PetscConj(kr): -kr;
765
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.
44599 PetscCall(VecAXPY(u,alpha,w)); /* u=A*x-k*B*x */
766 }
767
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.
44599 PetscCall(VecNorm(u,NORM_2,norm));
768 #if !defined(PETSC_USE_COMPLEX)
769 } else {
770
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 */
771
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
1170 if (SlepcAbsEigenvalue(kr,ki) > PETSC_MACHINE_EPSILON) {
772
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));
773
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 */
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.
1170 PetscCall(VecAXPY(u,-kr,v)); /* u=A*xr-kr*B*xr */
775
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));
776
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 */
777
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 */
778 }
779
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));
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((*matmult)(A,xi,u)); /* u=A*xi */
781
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
1170 if (SlepcAbsEigenvalue(kr,ki) > PETSC_MACHINE_EPSILON) {
782
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 */
783
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 */
784 }
785
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));
786 1170 *norm = SlepcAbsEigenvalue(nr,ni);
787 }
788 #endif
789
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.
9041 PetscFunctionReturn(PETSC_SUCCESS);
790 }
791
792 /*@
793 EPSComputeError - Computes the error (based on the residual norm) associated
794 with the `i`-th computed eigenpair.
795
796 Collective
797
798 Input Parameters:
799 + eps - the linear eigensolver context
800 . i - the solution index
801 - type - the type of error to compute, see `EPSErrorType`
802
803 Output Parameter:
804 . error - the error
805
806 Notes:
807 The error can be computed in various ways, all of them based on the residual
808 norm $\|Ax-\lambda Bx\|_2$ where $(\lambda,x)$ is the approximate eigenpair.
809
810 If the computation of left eigenvectors was enabled with `EPSSetTwoSided()`,
811 then the error will be computed using the maximum of the value above and
812 the left residual norm $\|y^*A-\lambda y^*B\|_2$, where $y$ is the approximate left
813 eigenvector.
814
815 Level: beginner
816
817 .seealso: [](ch:eps), `EPSErrorType`, `EPSSolve()`, `EPSGetErrorEstimate()`, `EPSSetTwoSided()`
818 @*/
819 42384 PetscErrorCode EPSComputeError(EPS eps,PetscInt i,EPSErrorType type,PetscReal *error)
820 {
821 42384 Mat A,B;
822 42384 Vec xr,xi,w[3];
823 42384 PetscReal t,vecnorm=1.0,errorl;
824 42384 PetscScalar kr,ki;
825 42384 PetscBool flg;
826
827
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
42384 PetscFunctionBegin;
828
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.
42384 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
829
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.
42384 PetscValidLogicalCollectiveInt(eps,i,2);
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.
42384 PetscValidLogicalCollectiveEnum(eps,type,3);
831
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.
42384 PetscAssertPointer(error,4);
832
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
42384 EPSCheckSolved(eps,1);
833
834 /* allocate work vectors */
835 #if defined(PETSC_USE_COMPLEX)
836
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.
20498 PetscCall(EPSSetWorkVecs(eps,3));
837 20498 xi = NULL;
838 20498 w[1] = NULL;
839 #else
840
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.
21886 PetscCall(EPSSetWorkVecs(eps,5));
841 21886 xi = eps->work[3];
842 21886 w[1] = eps->work[4];
843 #endif
844 42384 xr = eps->work[0];
845 42384 w[0] = eps->work[1];
846 42384 w[2] = eps->work[2];
847
848 /* compute residual norm */
849
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.
42384 PetscCall(EPSGetEigenpair(eps,i,&kr,&ki,xr,xi));
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.
42384 PetscCall(EPSComputeResidualNorm_Private(eps,PETSC_FALSE,kr,ki,xr,xi,w,error));
851
852 /* compute 2-norm of eigenvector */
853
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.
42384 if (eps->problem_type==EPS_GHEP) PetscCall(VecNorm(xr,NORM_2,&vecnorm));
854
855 /* if two-sided, compute left residual norm and take the maximum */
856
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
42384 if (eps->twosided) {
857
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));
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(EPSComputeResidualNorm_Private(eps,PETSC_TRUE,kr,ki,xr,xi,w,&errorl));
859
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
667 *error = PetscMax(*error,errorl);
860 }
861
862 /* compute error */
863
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
42384 switch (type) {
864 case EPS_ERROR_ABSOLUTE:
865 break;
866 24934 case EPS_ERROR_RELATIVE:
867 24934 *error /= SlepcAbsEigenvalue(kr,ki)*vecnorm;
868 24934 break;
869 17198 case EPS_ERROR_BACKWARD:
870 /* initialization of matrix norms */
871
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
17198 if (!eps->nrma) {
872
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));
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(MatHasOperation(A,MATOP_NORM,&flg));
874
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");
875
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));
876 }
877
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
17198 if (eps->isgeneralized) {
878
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
16945 if (!eps->nrmb) {
879
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));
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(MatHasOperation(B,MATOP_NORM,&flg));
881
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");
882
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));
883 }
884 253 } else eps->nrmb = 1.0;
885 17198 t = SlepcAbsEigenvalue(kr,ki);
886 17198 *error /= (eps->nrma+t*eps->nrmb)*vecnorm;
887 17198 break;
888 default:
889 SETERRQ(PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"Invalid error type");
890 }
891
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.
8325 PetscFunctionReturn(PETSC_SUCCESS);
892 }
893
894 /*
895 EPSGetStartVector - Generate a suitable vector to be used as the starting vector
896 for the recurrence that builds the right subspace.
897
898 Collective
899
900 Input Parameters:
901 + eps - the linear eigensolver context
902 - i - iteration number
903
904 Output Parameter:
905 . breakdown - flag indicating that a breakdown has occurred
906
907 Notes:
908 The start vector is computed from another vector: for the first step (i=0),
909 the first initial vector is used (see EPSSetInitialSpace()); otherwise a random
910 vector is created. Then this vector is forced to be in the range of OP (only
911 for generalized definite problems) and orthonormalized with respect to all
912 V-vectors up to i-1. The resulting vector is placed in V[i].
913
914 The flag breakdown is set to true if either i=0 and the vector belongs to the
915 deflation space, or i>0 and the vector is linearly dependent with respect
916 to the V-vectors.
917 */
918 7089 PetscErrorCode EPSGetStartVector(EPS eps,PetscInt i,PetscBool *breakdown)
919 {
920 7089 PetscReal norm;
921 7089 PetscBool lindep;
922 7089 Vec w,z;
923
924
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
7089 PetscFunctionBegin;
925
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.
7089 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
926
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.
7089 PetscValidLogicalCollectiveInt(eps,i,2);
927
928 /* For the first step, use the first initial vector, otherwise a random one */
929
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.
7089 if (i>0 || eps->nini==0) PetscCall(BVSetRandomColumn(eps->V,i));
930
931 /* Force the vector to be in the range of OP for generalized problems with B-inner product */
932
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.
7089 if (eps->ispositive || (eps->isgeneralized && eps->ishermitian)) {
933
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));
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(BVCopyVec(eps->V,i,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(BVGetColumn(eps->V,i,&z));
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(STApply(eps->st,w,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(BVRestoreColumn(eps->V,i,&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(VecDestroy(&w));
939 }
940
941 /* Orthonormalize the vector with respect to previous vectors */
942
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.
7089 PetscCall(BVOrthogonalizeColumn(eps->V,i,NULL,&norm,&lindep));
943
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
7089 if (breakdown) *breakdown = lindep;
944
2/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
6732 else if (lindep || norm == 0.0) {
945 PetscCheck(i,PetscObjectComm((PetscObject)eps),PETSC_ERR_PLIB,"Initial vector is zero or belongs to the deflation space");
946 PetscCheck(!i,PetscObjectComm((PetscObject)eps),PETSC_ERR_CONV_FAILED,"Unable to generate more start vectors");
947 }
948
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.
7089 PetscCall(BVScaleColumn(eps->V,i,1.0/norm));
949
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.
1370 PetscFunctionReturn(PETSC_SUCCESS);
950 }
951
952 /*
953 EPSGetLeftStartVector - Generate a suitable vector to be used as the left starting
954 vector for the recurrence that builds the left subspace. See EPSGetStartVector().
955 */
956 254 PetscErrorCode EPSGetLeftStartVector(EPS eps,PetscInt i,PetscBool *breakdown)
957 {
958 254 PetscReal norm;
959 254 PetscBool lindep;
960 254 Vec w,z;
961
962
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
254 PetscFunctionBegin;
963
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);
964
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);
965
966 /* For the first step, use the first initial vector, otherwise a random one */
967
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));
968
969 /* Force the vector to be in the range of OP' for generalized problems with B-inner product */
970
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)) {
971
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));
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(BVCopyVec(eps->W,i,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(BVGetColumn(eps->W,i,&z));
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(STApplyHermitianTranspose(eps->st,w,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(BVRestoreColumn(eps->W,i,&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(VecDestroy(&w));
977 }
978
979 /* Orthonormalize the vector with respect to previous vectors */
980
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));
981
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
254 if (breakdown) *breakdown = lindep;
982
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) {
983 PetscCheck(i,PetscObjectComm((PetscObject)eps),PETSC_ERR_PLIB,"Left initial vector is zero");
984 PetscCheck(!i,PetscObjectComm((PetscObject)eps),PETSC_ERR_CONV_FAILED,"Unable to generate more left start vectors");
985 }
986
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));
987
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);
988 }
989