GCC Code Coverage Report


Directory: ./
File: src/eps/interface/epssolve.c
Date: 2026-02-22 03:58:10
Exec Total Coverage
Lines: 370 398 93.0%
Functions: 16 16 100.0%
Branches: 1111 2304 48.2%

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 71543 PetscErrorCode EPSComputeVectors(EPS eps)
19 {
20
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
71543 PetscFunctionBegin;
21
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
71543 EPSCheckSolved(eps,1);
22
8/10
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 6 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
71543 if (eps->state==EPS_STATE_SOLVED) PetscTryTypeMethod(eps,computevectors);
23 71543 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.
71543 PetscFunctionReturn(PETSC_SUCCESS);
25 }
26
27 7843 static PetscErrorCode EPSComputeValues(EPS eps)
28 {
29 7843 PetscBool injective,iscomp,isfilter;
30 7843 PetscInt i,n,aux,nconv0;
31 7843 Mat A,B=NULL,G,Z;
32
33
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
7843 PetscFunctionBegin;
34
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
7843 switch (eps->categ) {
35 6134 case EPS_CATEGORY_KRYLOV:
36 case EPS_CATEGORY_OTHER:
37
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.
6134 PetscCall(STIsInjective(eps->st,&injective));
38
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
6134 if (injective) {
39 /* one-to-one mapping: backtransform eigenvalues */
40
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 6 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
5966 PetscUseTypeMethod(eps,backtransform);
41 } else {
42 /* compute eigenvalues from Rayleigh quotient */
43
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.
168 PetscCall(DSGetDimensions(eps->ds,&n,NULL,NULL,NULL));
44
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 1 times.
168 if (!n) break;
45
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.
168 PetscCall(EPSGetOperators(eps,&A,&B));
46
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.
168 PetscCall(BVSetActiveColumns(eps->V,0,n));
47
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.
168 PetscCall(DSGetCompact(eps->ds,&iscomp));
48
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.
168 PetscCall(DSSetCompact(eps->ds,PETSC_FALSE));
49
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.
168 PetscCall(DSGetMat(eps->ds,DS_MAT_A,&G));
50
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.
168 PetscCall(BVMatProject(eps->V,A,eps->V,G));
51
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.
168 PetscCall(DSRestoreMat(eps->ds,DS_MAT_A,&G));
52
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
168 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
168 PetscCall(DSSolve(eps->ds,eps->eigr,eps->eigi));
58
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.
168 PetscCall(DSSort(eps->ds,eps->eigr,eps->eigi,NULL,NULL,NULL));
59
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.
168 PetscCall(DSSynchronize(eps->ds,eps->eigr,eps->eigi));
60
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.
168 PetscCall(DSSetCompact(eps->ds,iscomp));
61
2/6
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
168 if (eps->ishermitian && (!eps->isgeneralized || eps->ispositive)) { /* V = V * Z */
62
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.
168 PetscCall(DSVectors(eps->ds,DS_MAT_X,NULL,NULL));
63
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.
168 PetscCall(DSGetMat(eps->ds,DS_MAT_X,&Z));
64
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.
168 PetscCall(BVMultInPlace(eps->V,Z,0,n));
65
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.
168 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
168 PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STFILTER,&isfilter));
69
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
168 if (isfilter) {
70 160 nconv0 = eps->nconv;
71
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
1464 for (i=0;i<eps->nconv;i++) {
72
2/4
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
1304 if (PetscRealPart(eps->eigr[eps->perm[i]])<eps->inta || PetscRealPart(eps->eigr[eps->perm[i]])>eps->intb) {
73 eps->nconv--;
74 if (i<eps->nconv) { SlepcSwap(eps->perm[i],eps->perm[eps->nconv],aux); i--; }
75 }
76 }
77
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
160 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.
1892 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 7843 PetscErrorCode EPSSolve(EPS eps)
128 {
129 7843 PetscInt i;
130 7843 PetscBool hasname;
131 7843 STMatMode matmode;
132 7843 Mat A,B;
133
134
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
7843 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.
7843 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
136
2/14
✓ Branch 0 taken 6 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.
7843 if (eps->state>=EPS_STATE_SOLVED) PetscFunctionReturn(PETSC_SUCCESS);
137
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.
7843 PetscCall(PetscLogEventBegin(EPS_Solve,eps,0,0,0));
138
139 /* Call setup */
140
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.
7843 PetscCall(EPSSetUp(eps));
141
142 /* Safeguard for matrices of size 0 */
143
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
7843 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 7843 eps->nconv = 0;
151 7843 eps->its = 0;
152
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
247074 for (i=0;i<eps->ncv;i++) {
153 239231 eps->eigr[i] = 0.0;
154 239231 eps->eigi[i] = 0.0;
155 239231 eps->errest[i] = 0.0;
156 239231 eps->perm[i] = i;
157 }
158
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.
7843 PetscCall(EPSViewFromOptions(eps,NULL,"-eps_view_pre"));
159
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.
7843 PetscCall(RGViewFromOptions(eps->rg,NULL,"-rg_view"));
160
161 /* Call solver */
162
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 6 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
7843 PetscUseTypeMethod(eps,solve);
163
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
7843 PetscCheck(eps->reason,PetscObjectComm((PetscObject)eps),PETSC_ERR_PLIB,"Internal error, solver returned without setting converged reason");
164 7843 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
7843 PetscCall(BVSetActiveColumns(eps->V,0,eps->nconv));
168
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
7843 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
7843 PetscCall(STGetMatMode(eps->st,&matmode));
172
1/10
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
7843 if (matmode == ST_MATMODE_INPLACE && eps->ispositive) PetscCall(EPSComputeVectors(eps));
173
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.
7843 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
7843 PetscCall(EPSComputeValues(eps));
177
178 #if !defined(PETSC_USE_COMPLEX)
179 /* Reorder conjugate eigenvalues (positive imaginary first) */
180
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
44618 for (i=0;i<eps->nconv-1;i++) {
181
6/6
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 4 times.
✓ Branch 5 taken 4 times.
40543 if (eps->eigi[i] != 0 && (eps->problem_type!=EPS_HAMILT || eps->eigr[i]!=0)) {
182 /* conjugate eigenvalues */
183
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
747 if (eps->eigi[i] < 0) {
184 93 eps->eigi[i] = -eps->eigi[i];
185 93 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 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
93 PetscCall(EPSComputeVectors(eps));
188
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
93 PetscCall(BVScaleColumn(eps->V,i+1,-1.0));
189
6/8
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
93 if (eps->W) PetscCall(BVScaleColumn(eps->W,i+1,-1.0));
190 }
191 747 i++;
192 }
193 }
194 #endif
195
196 /* Sort eigenvalues according to eps->which parameter */
197
6/8
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
7843 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
7815 else PetscCall(SlepcSortEigenvalues(eps->sc,eps->nconv,eps->eigr,eps->eigi,eps->perm));
199
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.
7843 PetscCall(PetscLogEventEnd(EPS_Solve,eps,0,0,0));
200
201 /* Various viewers */
202
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.
7843 PetscCall(EPSViewFromOptions(eps,NULL,"-eps_view"));
203
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.
7843 PetscCall(EPSConvergedReasonViewFromOptions(eps));
204
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.
7843 PetscCall(EPSErrorViewFromOptions(eps));
205
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.
7843 PetscCall(EPSValuesViewFromOptions(eps));
206
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.
7843 PetscCall(EPSVectorsViewFromOptions(eps));
207
208
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.
7843 PetscCall(PetscOptionsHasName(((PetscObject)eps)->options,((PetscObject)eps)->prefix,"-eps_view_mat0",&hasname));
209
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
7843 if (hasname) {
210 PetscCall(EPSGetOperators(eps,&A,NULL));
211 PetscCall(MatViewFromOptions(A,(PetscObject)eps,"-eps_view_mat0"));
212 }
213
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
7843 if (eps->isgeneralized) {
214
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.
1654 PetscCall(PetscOptionsHasName(((PetscObject)eps)->options,((PetscObject)eps)->prefix,"-eps_view_mat1",&hasname));
215
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
1654 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 8 times.
✓ Branch 1 taken 8 times.
7843 if (eps->nds) {
223
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.
120 PetscCall(BVSetNumConstraints(eps->V,0));
224 120 eps->nds = 0;
225 }
226 7843 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.
7843 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 1254 PetscErrorCode EPSGetIterationNumber(EPS eps,PetscInt *its)
255 {
256
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1254 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.
1254 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.
1254 PetscAssertPointer(its,2);
259 1254 *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.
1254 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 4670 PetscErrorCode EPSGetConverged(EPS eps,PetscInt *nconv)
285 {
286
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
4670 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.
4670 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.
4670 PetscAssertPointer(nconv,2);
289
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
4670 EPSCheckSolved(eps,1);
290
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.
4670 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.
1139 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 1209 PetscErrorCode EPSGetConvergedReason(EPS eps,EPSConvergedReason *reason)
319 {
320
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1209 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.
1209 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.
1209 PetscAssertPointer(reason,2);
323
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1209 EPSCheckSolved(eps,1);
324 1209 *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.
1209 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 64 PetscErrorCode EPSGetInvariantSubspace(EPS eps,Vec v[])
358 {
359 64 PetscInt i;
360 64 BV V=eps->V;
361 64 Vec w;
362
363
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
64 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.
64 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.
64 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.
64 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.
64 EPSCheckSolved(eps,1);
368
2/6
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
64 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 8 times.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
64 if (eps->balance!=EPS_BALANCE_NONE && eps->D) {
370
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.
8 PetscCall(BVDuplicateResize(eps->V,eps->nconv,&V));
371
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.
8 PetscCall(BVSetActiveColumns(eps->V,0,eps->nconv));
372
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.
8 PetscCall(BVCopy(eps->V,V));
373
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
44 for (i=0;i<eps->nconv;i++) {
374
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.
36 PetscCall(BVGetColumn(V,i,&w));
375
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.
36 PetscCall(VecPointwiseDivide(w,w,eps->D));
376
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.
36 PetscCall(BVRestoreColumn(V,i,&w));
377 }
378
3/6
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
8 PetscCall(BVOrthogonalize(V,NULL));
379 }
380
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
500 for (i=0;i<eps->nconv;i++) PetscCall(BVCopyVec(V,i,v[i]));
381
7/10
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 6 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
64 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 44844 PetscErrorCode EPSGetEigenpair(EPS eps,PetscInt i,PetscScalar *eigr,PetscScalar *eigi,Vec Vr,Vec Vi)
427 {
428 44844 PetscInt nconv;
429
430
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
44844 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.
44844 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.
44844 PetscValidLogicalCollectiveInt(eps,i,2);
433
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
44844 EPSCheckSolved(eps,1);
434
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
44844 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
44844 PetscCall(EPS_GetActualConverged(eps,&nconv));
436
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
44844 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
44844 PetscCall(EPSGetEigenvalue(eps,i,eigr,eigi));
438
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
44844 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.
11193 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 88372 PetscErrorCode EPSGetEigenvalue(EPS eps,PetscInt i,PetscScalar *eigr,PetscScalar *eigi)
469 {
470 88372 PetscInt k,nconv;
471 #if !defined(PETSC_USE_COMPLEX)
472 45556 PetscInt k2, iquad;
473 #endif
474
475
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
88372 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.
88372 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.
88372 EPSCheckSolved(eps,1);
478
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
88372 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
88372 PetscCall(EPS_GetActualConverged(eps,&nconv));
480
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
88372 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 8 times.
✓ Branch 1 taken 8 times.
88372 if (nconv==eps->nconv) {
482 82516 k = eps->perm[i];
483 #if defined(PETSC_USE_COMPLEX)
484
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
39824 if (eigr) *eigr = eps->eigr[k];
485
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
39824 if (eigi) *eigi = 0;
486 #else
487
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
42692 if (eigr) *eigr = eps->eigr[k];
488
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
42692 if (eigi) *eigi = eps->eigi[k];
489 #endif
490 } else {
491
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
5856 PetscCheck(eps->problem_type==EPS_BSE || eps->problem_type==EPS_HAMILT,PetscObjectComm((PetscObject)eps),PETSC_ERR_PLIB,"Problem type should be BSE or Hamiltonian");
492
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 4 times.
5856 if (eps->problem_type==EPS_BSE) {
493 /* BSE problem, even index is +lambda, odd index is -lambda */
494 5440 k = eps->perm[i/2];
495 #if defined(PETSC_USE_COMPLEX)
496
3/4
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 4 times.
2992 if (eigr) *eigr = (i%2)? -eps->eigr[k]: eps->eigr[k];
497
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
2992 if (eigi) *eigi = 0;
498 #else
499
3/4
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 4 times.
2448 if (eigr) *eigr = (i%2)? -eps->eigr[k]: eps->eigr[k];
500
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
2448 if (eigi) *eigi = eps->eigi[k];
501 #endif
502
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
416 } else if (eps->problem_type==EPS_HAMILT) {
503 /* Hamiltonian eigenproblem */
504 416 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 4 times.
416 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 4 times.
✓ Branch 1 taken 4 times.
416 } else if (eps->eigr[k]==0.0) { /* purely imaginary eigenvalue */
513
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
96 if (eigr) *eigr = 0.0;
514
3/4
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 4 times.
96 if (eigi) *eigi = (i%2)? -eps->eigi[k]: eps->eigi[k];
515 } else { /* quadruple eigenvalue (-conj(lambda),-lambda,lambda,conj(lambda)) */
516 320 iquad = i%2; /* index within the 4 values */
517
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
320 if (i>1) {
518 256 k2 = eps->perm[(i-2)/2];
519
3/4
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
256 if (eps->eigr[k]==eps->eigr[k2] && eps->eigi[k]==-eps->eigi[k2]) iquad += 2;
520 }
521
3/4
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 4 times.
320 if (eigr) *eigr = (iquad<2)? -eps->eigr[k]: eps->eigr[k];
522
3/4
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 4 times.
320 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.
22316 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 66229 PetscErrorCode EPSGetEigenvector(EPS eps,PetscInt i,Vec Vr,Vec Vi)
568 {
569 66229 PetscInt nconv;
570
571
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
66229 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.
66229 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.
66229 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.
66229 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.
66229 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.
66229 EPSCheckSolved(eps,1);
577
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
66229 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
66229 PetscCall(EPS_GetActualConverged(eps,&nconv));
579
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
66229 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
66229 PetscCall(EPSComputeVectors(eps));
581
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.
66229 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.
14726 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 4787 PetscErrorCode EPSGetLeftEigenvector(EPS eps,PetscInt i,Vec Wr,Vec Wi)
622 {
623 4787 PetscInt nconv;
624 4787 PetscBool trivial;
625 4787 Mat H;
626 4787 IS is[2];
627 4787 Vec v;
628
629
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
4787 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.
4787 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.
4787 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.
4787 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.
4787 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.
4787 EPSCheckSolved(eps,1);
635
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
4787 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
4787 PetscCall(EPS_GetActualConverged(eps,&nconv));
637
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
4787 PetscCheck(i<nconv,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index can be nconv-1 at most, see EPSGetConverged()");
638
639 4787 trivial = (eps->problem_type==EPS_HEP || eps->problem_type==EPS_GHEP || eps->problem_type==EPS_BSE)? PETSC_TRUE: PETSC_FALSE;
640
3/6
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
4787 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
4787 PetscCall(EPSComputeVectors(eps));
643
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
4787 if (trivial) {
644
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.
4064 PetscCall(EPS_GetEigenvector(eps,eps->V,i,Wr,Wi));
645
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
4064 if (eps->problem_type==EPS_BSE) { /* change sign of bottom part of the vector */
646
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.
4064 PetscCall(STGetMatrix(eps->st,0,&H));
647
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.
4064 PetscCall(MatNestGetISs(H,is,NULL));
648
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
4064 if (Wr) {
649
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.
4064 PetscCall(VecGetSubVector(Wr,is[1],&v));
650
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.
4064 PetscCall(VecScale(v,-1.0));
651
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.
4064 PetscCall(VecRestoreSubVector(Wr,is[1],&v));
652 }
653 #if !defined(PETSC_USE_COMPLEX)
654
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
1984 if (Wi) {
655 PetscCall(VecGetSubVector(Wi,is[1],&v));
656 PetscCall(VecScale(v,-1.0));
657 PetscCall(VecRestoreSubVector(Wi,is[1],&v));
658 }
659 #endif
660 }
661 } else {
662
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.
723 PetscCall(EPS_GetEigenvector(eps,eps->W,i,Wr,Wi));
663 }
664
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.
1091 PetscFunctionReturn(PETSC_SUCCESS);
665 }
666
667 /*@
668 EPSGetErrorEstimate - Returns the error estimate associated to the `i`-th
669 computed eigenpair.
670
671 Not Collective
672
673 Input Parameters:
674 + eps - the linear eigensolver context
675 - i - index of eigenpair
676
677 Output Parameter:
678 . errest - the error estimate
679
680 Note:
681 This is the error estimate used internally by the eigensolver. The actual
682 error bound can be computed with `EPSComputeError()`. See discussion at
683 section [](#sec:errbnd).
684
685 Level: advanced
686
687 .seealso: [](ch:eps), [](#sec:errbnd), `EPSComputeError()`
688 @*/
689 480 PetscErrorCode EPSGetErrorEstimate(EPS eps,PetscInt i,PetscReal *errest)
690 {
691 480 PetscInt nconv;
692
693
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
480 PetscFunctionBegin;
694
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.
480 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
695
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.
480 PetscAssertPointer(errest,3);
696
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
480 EPSCheckSolved(eps,1);
697
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
480 PetscCheck(i>=0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index cannot be negative");
698
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.
480 PetscCall(EPS_GetActualConverged(eps,&nconv));
699
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
480 PetscCheck(i<nconv,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index can be nconv-1 at most, see EPSGetConverged()");
700
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
480 if (nconv==eps->nconv) {
701 480 *errest = eps->errest[eps->perm[i]];
702 } else {
703 PetscCheck(eps->problem_type==EPS_BSE,PetscObjectComm((PetscObject)eps),PETSC_ERR_PLIB,"Problem type should be BSE");
704 /* BSE problem, even index is +lambda, odd index is -lambda, assume both have same error */
705 *errest = eps->errest[eps->perm[i/2]];
706 }
707
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);
708 }
709
710 /*
711 EPSComputeResidualNorm_Private - Computes the norm of the residual vector
712 associated with an eigenpair.
713
714 Input Parameters:
715 trans - whether A' must be used instead of A
716 kr,ki - eigenvalue
717 xr,xi - eigenvector
718 z - three work vectors (the second one not referenced in complex scalars)
719 */
720 36111 PetscErrorCode EPSComputeResidualNorm_Private(EPS eps,PetscBool trans,PetscScalar kr,PetscScalar ki,Vec xr,Vec xi,Vec *z,PetscReal *norm)
721 {
722 36111 PetscInt nmat;
723 36111 Mat A,B;
724 36111 Vec u,w;
725 36111 PetscScalar alpha;
726 #if !defined(PETSC_USE_COMPLEX)
727 18240 Vec v;
728 18240 PetscReal ni,nr;
729 #endif
730
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
36111 PetscErrorCode (*matmult)(Mat,Vec,Vec) = trans? MatMultHermitianTranspose: MatMult;
731
732
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
36111 PetscFunctionBegin;
733 36111 u = z[0]; w = z[2];
734
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.
36111 PetscCall(STGetNumMatrices(eps->st,&nmat));
735
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.
36111 PetscCall(STGetMatrix(eps->st,0,&A));
736
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
36111 if (nmat>1) PetscCall(STGetMatrix(eps->st,1,&B));
737
738 #if !defined(PETSC_USE_COMPLEX)
739 18240 v = z[1];
740
3/4
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
18240 if (ki == 0 || PetscAbsScalar(ki) < PetscAbsScalar(kr*PETSC_MACHINE_EPSILON)) {
741 #endif
742
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.
35169 PetscCall((*matmult)(A,xr,u)); /* u=A*x */
743
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
35169 if (PetscAbsScalar(kr) > PETSC_MACHINE_EPSILON) {
744
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
35169 if (nmat>1) PetscCall((*matmult)(B,xr,w));
745
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.
17879 else PetscCall(VecCopy(xr,w)); /* w=B*x */
746
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
35169 alpha = trans? -PetscConj(kr): -kr;
747
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.
35169 PetscCall(VecAXPY(u,alpha,w)); /* u=A*x-k*B*x */
748 }
749
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.
35169 PetscCall(VecNorm(u,NORM_2,norm));
750 #if !defined(PETSC_USE_COMPLEX)
751 } else {
752
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
942 PetscCall((*matmult)(A,xr,u)); /* u=A*xr */
753
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
942 if (SlepcAbsEigenvalue(kr,ki) > PETSC_MACHINE_EPSILON) {
754
6/8
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
942 if (nmat>1) PetscCall((*matmult)(B,xr,v));
755
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
930 else PetscCall(VecCopy(xr,v)); /* v=B*xr */
756
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
942 PetscCall(VecAXPY(u,-kr,v)); /* u=A*xr-kr*B*xr */
757
6/8
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
942 if (nmat>1) PetscCall((*matmult)(B,xi,w));
758
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
930 else PetscCall(VecCopy(xi,w)); /* w=B*xi */
759
7/8
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
942 PetscCall(VecAXPY(u,trans?-ki:ki,w)); /* u=A*xr-kr*B*xr+ki*B*xi */
760 }
761
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
942 PetscCall(VecNorm(u,NORM_2,&nr));
762
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
942 PetscCall((*matmult)(A,xi,u)); /* u=A*xi */
763
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
942 if (SlepcAbsEigenvalue(kr,ki) > PETSC_MACHINE_EPSILON) {
764
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
942 PetscCall(VecAXPY(u,-kr,w)); /* u=A*xi-kr*B*xi */
765
7/8
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
942 PetscCall(VecAXPY(u,trans?ki:-ki,v)); /* u=A*xi-kr*B*xi-ki*B*xr */
766 }
767
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
942 PetscCall(VecNorm(u,NORM_2,&ni));
768 942 *norm = SlepcAbsEigenvalue(nr,ni);
769 }
770 #endif
771
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.
8933 PetscFunctionReturn(PETSC_SUCCESS);
772 }
773
774 /*@
775 EPSComputeError - Computes the error (based on the residual norm) associated
776 with the `i`-th computed eigenpair.
777
778 Collective
779
780 Input Parameters:
781 + eps - the linear eigensolver context
782 . i - the solution index
783 - type - the type of error to compute, see `EPSErrorType`
784
785 Output Parameter:
786 . error - the error
787
788 Notes:
789 The error can be computed in various ways, all of them based on the residual
790 norm $\|Ax-\lambda Bx\|_2$ where $(\lambda,x)$ is the approximate eigenpair.
791
792 If the computation of left eigenvectors was enabled with `EPSSetTwoSided()`,
793 then the error will be computed using the maximum of the value above and
794 the left residual norm $\|y^*A-\lambda y^*B\|_2$, where $y$ is the approximate left
795 eigenvector.
796
797 Level: beginner
798
799 .seealso: [](ch:eps), `EPSErrorType`, `EPSSolve()`, `EPSGetErrorEstimate()`, `EPSSetTwoSided()`
800 @*/
801 33339 PetscErrorCode EPSComputeError(EPS eps,PetscInt i,EPSErrorType type,PetscReal *error)
802 {
803 33339 Mat A,B;
804 33339 Vec xr,xi,w[3];
805 33339 PetscReal t,vecnorm=1.0,errorl;
806 33339 PetscScalar kr,ki;
807 33339 PetscBool flg;
808
809
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
33339 PetscFunctionBegin;
810
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.
33339 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
811
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.
33339 PetscValidLogicalCollectiveInt(eps,i,2);
812
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.
33339 PetscValidLogicalCollectiveEnum(eps,type,3);
813
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.
33339 PetscAssertPointer(error,4);
814
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
33339 EPSCheckSolved(eps,1);
815
816 /* allocate work vectors */
817 #if defined(PETSC_USE_COMPLEX)
818
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
16439 PetscCall(EPSSetWorkVecs(eps,3));
819 16439 xi = NULL;
820 16439 w[1] = NULL;
821 #else
822
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
16900 PetscCall(EPSSetWorkVecs(eps,5));
823 16900 xi = eps->work[3];
824 16900 w[1] = eps->work[4];
825 #endif
826 33339 xr = eps->work[0];
827 33339 w[0] = eps->work[1];
828 33339 w[2] = eps->work[2];
829
830 /* compute residual norm */
831
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.
33339 PetscCall(EPSGetEigenpair(eps,i,&kr,&ki,xr,xi));
832
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.
33339 PetscCall(EPSComputeResidualNorm_Private(eps,PETSC_FALSE,kr,ki,xr,xi,w,error));
833
834 /* compute 2-norm of eigenvector */
835
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
33339 if (eps->problem_type==EPS_GHEP) PetscCall(VecNorm(xr,NORM_2,&vecnorm));
836
837 /* if two-sided, compute left residual norm and take the maximum */
838
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
33339 if (eps->twosided) {
839
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.
365 PetscCall(EPSGetLeftEigenvector(eps,i,xr,xi));
840
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.
365 PetscCall(EPSComputeResidualNorm_Private(eps,PETSC_TRUE,kr,ki,xr,xi,w,&errorl));
841
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
543 *error = PetscMax(*error,errorl);
842 }
843
844 /* compute error */
845
3/4
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
33339 switch (type) {
846 case EPS_ERROR_ABSOLUTE:
847 break;
848 19487 case EPS_ERROR_RELATIVE:
849 19487 *error /= SlepcAbsEigenvalue(kr,ki)*vecnorm;
850 19487 break;
851 13612 case EPS_ERROR_BACKWARD:
852 /* initialization of matrix norms */
853
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
13612 if (!eps->nrma) {
854
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.
315 PetscCall(STGetMatrix(eps->st,0,&A));
855
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.
315 PetscCall(MatHasOperation(A,MATOP_NORM,&flg));
856
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
315 PetscCheck(flg,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONG,"The computation of backward errors requires a matrix norm operation");
857
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.
315 PetscCall(MatNorm(A,NORM_INFINITY,&eps->nrma));
858 }
859
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
13612 if (eps->isgeneralized) {
860
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
13407 if (!eps->nrmb) {
861
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.
267 PetscCall(STGetMatrix(eps->st,1,&B));
862
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.
267 PetscCall(MatHasOperation(B,MATOP_NORM,&flg));
863
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
267 PetscCheck(flg,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONG,"The computation of backward errors requires a matrix norm operation");
864
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.
267 PetscCall(MatNorm(B,NORM_INFINITY,&eps->nrmb));
865 }
866 205 } else eps->nrmb = 1.0;
867 13612 t = SlepcAbsEigenvalue(kr,ki);
868 13612 *error /= (eps->nrma+t*eps->nrmb)*vecnorm;
869 13612 break;
870 default:
871 SETERRQ(PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"Invalid error type");
872 }
873
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.
8217 PetscFunctionReturn(PETSC_SUCCESS);
874 }
875
876 /*
877 EPSGetStartVector - Generate a suitable vector to be used as the starting vector
878 for the recurrence that builds the right subspace.
879
880 Collective
881
882 Input Parameters:
883 + eps - the linear eigensolver context
884 - i - iteration number
885
886 Output Parameter:
887 . breakdown - flag indicating that a breakdown has occurred
888
889 Notes:
890 The start vector is computed from another vector: for the first step (i=0),
891 the first initial vector is used (see EPSSetInitialSpace()); otherwise a random
892 vector is created. Then this vector is forced to be in the range of OP (only
893 for generalized definite problems) and orthonormalized with respect to all
894 V-vectors up to i-1. The resulting vector is placed in V[i].
895
896 The flag breakdown is set to true if either i=0 and the vector belongs to the
897 deflation space, or i>0 and the vector is linearly dependent with respect
898 to the V-vectors.
899 */
900 5673 PetscErrorCode EPSGetStartVector(EPS eps,PetscInt i,PetscBool *breakdown)
901 {
902 5673 PetscReal norm;
903 5673 PetscBool lindep;
904 5673 Vec w,z;
905
906
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
5673 PetscFunctionBegin;
907
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.
5673 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
908
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.
5673 PetscValidLogicalCollectiveInt(eps,i,2);
909
910 /* For the first step, use the first initial vector, otherwise a random one */
911
8/10
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 6 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
5673 if (i>0 || eps->nini==0) PetscCall(BVSetRandomColumn(eps->V,i));
912
913 /* Force the vector to be in the range of OP for generalized problems with B-inner product */
914
6/6
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 8 times.
✓ Branch 5 taken 8 times.
5673 if (eps->ispositive || (eps->isgeneralized && eps->ishermitian)) {
915
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.
823 PetscCall(BVCreateVec(eps->V,&w));
916
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.
823 PetscCall(BVCopyVec(eps->V,i,w));
917
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.
823 PetscCall(BVGetColumn(eps->V,i,&z));
918
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.
823 PetscCall(STApply(eps->st,w,z));
919
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.
823 PetscCall(BVRestoreColumn(eps->V,i,&z));
920
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.
823 PetscCall(VecDestroy(&w));
921 }
922
923 /* Orthonormalize the vector with respect to previous vectors */
924
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.
5673 PetscCall(BVOrthogonalizeColumn(eps->V,i,NULL,&norm,&lindep));
925
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
5673 if (breakdown) *breakdown = lindep;
926
2/4
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
5385 else if (lindep || norm == 0.0) {
927 PetscCheck(i,PetscObjectComm((PetscObject)eps),PETSC_ERR_PLIB,"Initial vector is zero or belongs to the deflation space");
928 PetscCheck(!i,PetscObjectComm((PetscObject)eps),PETSC_ERR_CONV_FAILED,"Unable to generate more start vectors");
929 }
930
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.
5673 PetscCall(BVScaleColumn(eps->V,i,1.0/norm));
931
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);
932 }
933
934 /*
935 EPSGetLeftStartVector - Generate a suitable vector to be used as the left starting
936 vector for the recurrence that builds the left subspace. See EPSGetStartVector().
937 */
938 205 PetscErrorCode EPSGetLeftStartVector(EPS eps,PetscInt i,PetscBool *breakdown)
939 {
940 205 PetscReal norm;
941 205 PetscBool lindep;
942 205 Vec w,z;
943
944
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
205 PetscFunctionBegin;
945
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.
205 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
946
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.
205 PetscValidLogicalCollectiveInt(eps,i,2);
947
948 /* For the first step, use the first initial vector, otherwise a random one */
949
8/10
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 6 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
205 if (i>0 || eps->ninil==0) PetscCall(BVSetRandomColumn(eps->W,i));
950
951 /* Force the vector to be in the range of OP' for generalized problems with B-inner product */
952
5/6
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 7 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 7 times.
205 if (eps->ispositive || (eps->isgeneralized && eps->ishermitian)) {
953
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
11 PetscCall(BVCreateVec(eps->W,&w));
954
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
11 PetscCall(BVCopyVec(eps->W,i,w));
955
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
11 PetscCall(BVGetColumn(eps->W,i,&z));
956
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
11 PetscCall(STApplyHermitianTranspose(eps->st,w,z));
957
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
11 PetscCall(BVRestoreColumn(eps->W,i,&z));
958
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
11 PetscCall(VecDestroy(&w));
959 }
960
961 /* Orthonormalize the vector with respect to previous vectors */
962
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.
205 PetscCall(BVOrthogonalizeColumn(eps->W,i,NULL,&norm,&lindep));
963
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
205 if (breakdown) *breakdown = lindep;
964
2/4
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
161 else if (lindep || norm == 0.0) {
965 PetscCheck(i,PetscObjectComm((PetscObject)eps),PETSC_ERR_PLIB,"Left initial vector is zero");
966 PetscCheck(!i,PetscObjectComm((PetscObject)eps),PETSC_ERR_CONV_FAILED,"Unable to generate more left start vectors");
967 }
968
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.
205 PetscCall(BVScaleColumn(eps->W,i,1.0/norm));
969
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);
970 }
971