GCC Code Coverage Report


Directory: ./
File: src/eps/interface/epssolve.c
Date: 2025-11-19 04:19:03
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 85048 PetscErrorCode EPSComputeVectors(EPS eps)
19 {
20
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
85048 PetscFunctionBegin;
21
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
85048 EPSCheckSolved(eps,1);
22
8/10
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
85048 if (eps->state==EPS_STATE_SOLVED) PetscTryTypeMethod(eps,computevectors);
23 85048 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.
85048 PetscFunctionReturn(PETSC_SUCCESS);
25 }
26
27 9545 static PetscErrorCode EPSComputeValues(EPS eps)
28 {
29 9545 PetscBool injective,iscomp,isfilter;
30 9545 PetscInt i,n,aux,nconv0;
31 9545 Mat A,B=NULL,G,Z;
32
33
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
9545 PetscFunctionBegin;
34
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9545 switch (eps->categ) {
35 7425 case EPS_CATEGORY_KRYLOV:
36 case EPS_CATEGORY_OTHER:
37
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
7425 PetscCall(STIsInjective(eps->st,&injective));
38
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
7425 if (injective) {
39 /* one-to-one mapping: backtransform eigenvalues */
40
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
7209 PetscUseTypeMethod(eps,backtransform);
41 } else {
42 /* compute eigenvalues from Rayleigh quotient */
43
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(DSGetDimensions(eps->ds,&n,NULL,NULL,NULL));
44
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 1 times.
216 if (!n) break;
45
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(EPSGetOperators(eps,&A,&B));
46
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(BVSetActiveColumns(eps->V,0,n));
47
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(DSGetCompact(eps->ds,&iscomp));
48
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(DSSetCompact(eps->ds,PETSC_FALSE));
49
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(DSGetMat(eps->ds,DS_MAT_A,&G));
50
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(BVMatProject(eps->V,A,eps->V,G));
51
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(DSRestoreMat(eps->ds,DS_MAT_A,&G));
52
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
216 if (B) {
53 PetscCall(DSGetMat(eps->ds,DS_MAT_B,&G));
54 PetscCall(BVMatProject(eps->V,B,eps->V,G));
55 PetscCall(DSRestoreMat(eps->ds,DS_MAT_B,&G));
56 }
57
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(DSSolve(eps->ds,eps->eigr,eps->eigi));
58
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(DSSort(eps->ds,eps->eigr,eps->eigi,NULL,NULL,NULL));
59
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(DSSynchronize(eps->ds,eps->eigr,eps->eigi));
60
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(DSSetCompact(eps->ds,iscomp));
61
2/6
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
216 if (eps->ishermitian && (!eps->isgeneralized || eps->ispositive)) { /* V = V * Z */
62
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(DSVectors(eps->ds,DS_MAT_X,NULL,NULL));
63
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(DSGetMat(eps->ds,DS_MAT_X,&Z));
64
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(BVMultInPlace(eps->V,Z,0,n));
65
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(DSRestoreMat(eps->ds,DS_MAT_X,&Z));
66 }
67 /* in case of STFILTER discard computed eigenvalues that lie outside the wanted interval */
68
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
216 PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STFILTER,&isfilter));
69
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
216 if (isfilter) {
70 206 nconv0 = eps->nconv;
71
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1896 for (i=0;i<eps->nconv;i++) {
72
2/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
1690 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 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
206 if (nconv0>eps->nconv) PetscCall(PetscInfo(eps,"Discarded %" PetscInt_FMT " computed eigenvalues lying outside the interval\n",nconv0-eps->nconv));
78 }
79 }
80 break;
81 case EPS_CATEGORY_PRECOND:
82 case EPS_CATEGORY_CONTOUR:
83 /* eigenvalues already available as an output of the solver */
84 break;
85 }
86
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
1840 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 9545 PetscErrorCode EPSSolve(EPS eps)
128 {
129 9545 PetscInt i;
130 9545 PetscBool hasname;
131 9545 STMatMode matmode;
132 9545 Mat A,B;
133
134
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
9545 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.
9545 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
136
2/14
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
9545 if (eps->state>=EPS_STATE_SOLVED) PetscFunctionReturn(PETSC_SUCCESS);
137
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9545 PetscCall(PetscLogEventBegin(EPS_Solve,eps,0,0,0));
138
139 /* Call setup */
140
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9545 PetscCall(EPSSetUp(eps));
141
142 /* Safeguard for matrices of size 0 */
143
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
9545 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 9545 eps->nconv = 0;
151 9545 eps->its = 0;
152
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
302334 for (i=0;i<eps->ncv;i++) {
153 292789 eps->eigr[i] = 0.0;
154 292789 eps->eigi[i] = 0.0;
155 292789 eps->errest[i] = 0.0;
156 292789 eps->perm[i] = i;
157 }
158
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9545 PetscCall(EPSViewFromOptions(eps,NULL,"-eps_view_pre"));
159
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9545 PetscCall(RGViewFromOptions(eps->rg,NULL,"-rg_view"));
160
161 /* Call solver */
162
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
9545 PetscUseTypeMethod(eps,solve);
163
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
9545 PetscCheck(eps->reason,PetscObjectComm((PetscObject)eps),PETSC_ERR_PLIB,"Internal error, solver returned without setting converged reason");
164 9545 eps->state = EPS_STATE_SOLVED;
165
166 /* Only the first nconv columns contain useful information (except in CISS) */
167
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9545 PetscCall(BVSetActiveColumns(eps->V,0,eps->nconv));
168
6/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
9545 if (eps->twosided) PetscCall(BVSetActiveColumns(eps->W,0,eps->nconv));
169
170 /* If inplace, purify eigenvectors before reverting operator */
171
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9545 PetscCall(STGetMatMode(eps->st,&matmode));
172
1/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
9545 if (matmode == ST_MATMODE_INPLACE && eps->ispositive) PetscCall(EPSComputeVectors(eps));
173
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9545 PetscCall(STPostSolve(eps->st));
174
175 /* Map eigenvalues back to the original problem if appropriate */
176
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9545 PetscCall(EPSComputeValues(eps));
177
178 #if !defined(PETSC_USE_COMPLEX)
179 /* Reorder conjugate eigenvalues (positive imaginary first) */
180
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
55317 for (i=0;i<eps->nconv-1;i++) {
181
6/6
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 5 times.
✓ Branch 5 taken 5 times.
50349 if (eps->eigi[i] != 0 && (eps->problem_type!=EPS_HAMILT || eps->eigr[i]!=0)) {
182 /* conjugate eigenvalues */
183
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
926 if (eps->eigi[i] < 0) {
184 116 eps->eigi[i] = -eps->eigi[i];
185 116 eps->eigi[i+1] = -eps->eigi[i+1];
186 /* the next correction only works with eigenvectors */
187
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
116 PetscCall(EPSComputeVectors(eps));
188
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
116 PetscCall(BVScaleColumn(eps->V,i+1,-1.0));
189
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
116 if (eps->W) PetscCall(BVScaleColumn(eps->W,i+1,-1.0));
190 }
191 926 i++;
192 }
193 }
194 #endif
195
196 /* Sort eigenvalues according to eps->which parameter */
197
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
9545 if (eps->problem_type==EPS_HAMILT) PetscCall(SlepcSortEigenvaluesSpecial(eps->sc,eps->nconv,eps->eigr,eps->eigi,eps->perm));
198
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9510 else PetscCall(SlepcSortEigenvalues(eps->sc,eps->nconv,eps->eigr,eps->eigi,eps->perm));
199
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9545 PetscCall(PetscLogEventEnd(EPS_Solve,eps,0,0,0));
200
201 /* Various viewers */
202
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9545 PetscCall(EPSViewFromOptions(eps,NULL,"-eps_view"));
203
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9545 PetscCall(EPSConvergedReasonViewFromOptions(eps));
204
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9545 PetscCall(EPSErrorViewFromOptions(eps));
205
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9545 PetscCall(EPSValuesViewFromOptions(eps));
206
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9545 PetscCall(EPSVectorsViewFromOptions(eps));
207
208
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9545 PetscCall(PetscOptionsHasName(((PetscObject)eps)->options,((PetscObject)eps)->prefix,"-eps_view_mat0",&hasname));
209
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
9545 if (hasname) {
210 PetscCall(EPSGetOperators(eps,&A,NULL));
211 PetscCall(MatViewFromOptions(A,(PetscObject)eps,"-eps_view_mat0"));
212 }
213
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9545 if (eps->isgeneralized) {
214
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2080 PetscCall(PetscOptionsHasName(((PetscObject)eps)->options,((PetscObject)eps)->prefix,"-eps_view_mat1",&hasname));
215
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
2080 if (hasname) {
216 PetscCall(EPSGetOperators(eps,NULL,&B));
217 PetscCall(MatViewFromOptions(B,(PetscObject)eps,"-eps_view_mat1"));
218 }
219 }
220
221 /* Remove deflation and initial subspaces */
222
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9545 if (eps->nds) {
223
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
148 PetscCall(BVSetNumConstraints(eps->V,0));
224 148 eps->nds = 0;
225 }
226 9545 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.
9545 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 1550 PetscErrorCode EPSGetIterationNumber(EPS eps,PetscInt *its)
255 {
256
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1550 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.
1550 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.
1550 PetscAssertPointer(its,2);
259 1550 *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.
1550 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 5635 PetscErrorCode EPSGetConverged(EPS eps,PetscInt *nconv)
285 {
286
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
5635 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.
5635 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.
5635 PetscAssertPointer(nconv,2);
289
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
5635 EPSCheckSolved(eps,1);
290
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5635 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.
1083 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 1509 PetscErrorCode EPSGetConvergedReason(EPS eps,EPSConvergedReason *reason)
319 {
320
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1509 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.
1509 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.
1509 PetscAssertPointer(reason,2);
323
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1509 EPSCheckSolved(eps,1);
324 1509 *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.
1509 PetscFunctionReturn(PETSC_SUCCESS);
326 }
327
328 /*@
329 EPSGetInvariantSubspace - Gets an orthonormal basis of the computed invariant
330 subspace.
331
332 Collective
333
334 Input Parameter:
335 . eps - the linear eigensolver context
336
337 Output Parameter:
338 . v - an array of vectors
339
340 Notes:
341 This function should be called after `EPSSolve()` has finished.
342
343 The user should provide in `v` an array of `nconv` vectors, where `nconv`
344 is the value returned by `EPSGetConverged()`.
345
346 The first $k$ vectors returned in `v` span an invariant subspace associated
347 with the first $k$ computed eigenvalues (note that this is not true if the
348 $k$-th eigenvalue is complex and matrix $A$ is real; in this case the first
349 $k+1$ vectors should be used). An invariant subspace $X$ of $A$ satisfies
350 $Ax\in X, \forall x\in X$ (a similar definition applies for generalized
351 eigenproblems).
352
353 Level: intermediate
354
355 .seealso: [](ch:eps), `EPSGetEigenpair()`, `EPSGetConverged()`, `EPSSolve()`
356 @*/
357 80 PetscErrorCode EPSGetInvariantSubspace(EPS eps,Vec v[])
358 {
359 80 PetscInt i;
360 80 BV V=eps->V;
361 80 Vec w;
362
363
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
80 PetscFunctionBegin;
364
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
80 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
365
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
80 PetscAssertPointer(v,2);
366
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
80 PetscValidHeaderSpecific(*v,VEC_CLASSID,2);
367
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
80 EPSCheckSolved(eps,1);
368
2/6
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
80 PetscCheck(eps->ishermitian || eps->state!=EPS_STATE_EIGENVECTORS,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONGSTATE,"EPSGetInvariantSubspace must be called before EPSGetEigenpair,EPSGetEigenvector or EPSComputeError");
369
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
80 if (eps->balance!=EPS_BALANCE_NONE && eps->D) {
370
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(BVDuplicateResize(eps->V,eps->nconv,&V));
371
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(BVSetActiveColumns(eps->V,0,eps->nconv));
372
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(BVCopy(eps->V,V));
373
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
55 for (i=0;i<eps->nconv;i++) {
374
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
45 PetscCall(BVGetColumn(V,i,&w));
375
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
45 PetscCall(VecPointwiseDivide(w,w,eps->D));
376
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
45 PetscCall(BVRestoreColumn(V,i,&w));
377 }
378
3/6
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
10 PetscCall(BVOrthogonalize(V,NULL));
379 }
380
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
625 for (i=0;i<eps->nconv;i++) PetscCall(BVCopyVec(V,i,v[i]));
381
7/10
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
80 if (eps->balance!=EPS_BALANCE_NONE && eps->D) PetscCall(BVDestroy(&V));
382
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
16 PetscFunctionReturn(PETSC_SUCCESS);
383 }
384
385 /*@
386 EPSGetEigenpair - Gets the `i`-th solution of the eigenproblem as computed by
387 `EPSSolve()`. The solution consists in both the eigenvalue and the eigenvector.
388
389 Collective
390
391 Input Parameters:
392 + eps - the linear eigensolver context
393 - i - index of the solution
394
395 Output Parameters:
396 + eigr - real part of eigenvalue
397 . eigi - imaginary part of eigenvalue
398 . Vr - real part of eigenvector
399 - Vi - imaginary part of eigenvector
400
401 Notes:
402 It is allowed to pass `NULL` for `Vr` and `Vi`, if the eigenvector is not
403 required. Otherwise, the caller must provide valid `Vec` objects, i.e.,
404 they must be created by the calling program with e.g. `MatCreateVecs()`.
405
406 If the eigenvalue is real, then `eigi` and `Vi` are set to zero. If PETSc is
407 configured with complex scalars the eigenvalue is stored
408 directly in `eigr` (`eigi` is set to zero) and the eigenvector in `Vr` (`Vi` is
409 set to zero). In both cases, the user can pass `NULL` in `eigi` and `Vi`.
410
411 The index `i` should be a value between 0 and `nconv`-1 (see `EPSGetConverged()`).
412 Eigenpairs are indexed according to the ordering criterion established
413 with `EPSSetWhichEigenpairs()`.
414
415 The 2-norm of the eigenvector is one unless the problem is generalized
416 Hermitian. In this case the eigenvector is normalized with respect to the
417 norm defined by the $B$ matrix.
418
419 Level: beginner
420
421 .seealso: [](ch:eps), `EPSGetEigenvalue()`, `EPSGetEigenvector()`, `EPSGetLeftEigenvector()`, `EPSSolve()`, `EPSGetConverged()`, `EPSSetWhichEigenpairs()`, `EPSGetInvariantSubspace()`
422 @*/
423 55066 PetscErrorCode EPSGetEigenpair(EPS eps,PetscInt i,PetscScalar *eigr,PetscScalar *eigi,Vec Vr,Vec Vi)
424 {
425 55066 PetscInt nconv;
426
427
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
55066 PetscFunctionBegin;
428
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.
55066 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
429
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.
55066 PetscValidLogicalCollectiveInt(eps,i,2);
430
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
55066 EPSCheckSolved(eps,1);
431
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
55066 PetscCheck(i>=0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index cannot be negative");
432
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
55066 PetscCall(EPS_GetActualConverged(eps,&nconv));
433
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
55066 PetscCheck(i<nconv,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index can be nconv-1 at most, see EPSGetConverged()");
434
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
55066 PetscCall(EPSGetEigenvalue(eps,i,eigr,eigi));
435
6/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
55066 if (Vr || Vi) PetscCall(EPSGetEigenvector(eps,i,Vr,Vi));
436
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.
11090 PetscFunctionReturn(PETSC_SUCCESS);
437 }
438
439 /*@
440 EPSGetEigenvalue - Gets the `i`-th eigenvalue as computed by `EPSSolve()`.
441
442 Not Collective
443
444 Input Parameters:
445 + eps - the linear eigensolver context
446 - i - index of the solution
447
448 Output Parameters:
449 + eigr - real part of eigenvalue
450 - eigi - imaginary part of eigenvalue
451
452 Notes:
453 If the eigenvalue is real, then `eigi` is set to zero. If PETSc is
454 configured with complex scalars the eigenvalue is stored
455 directly in `eigr` (`eigi` is set to zero).
456
457 The index `i` should be a value between 0 and `nconv`-1 (see `EPSGetConverged()`).
458 Eigenpairs are indexed according to the ordering criterion established
459 with `EPSSetWhichEigenpairs()`.
460
461 Level: beginner
462
463 .seealso: [](ch:eps), `EPSSolve()`, `EPSGetConverged()`, `EPSSetWhichEigenpairs()`, `EPSGetEigenpair()`
464 @*/
465 107963 PetscErrorCode EPSGetEigenvalue(EPS eps,PetscInt i,PetscScalar *eigr,PetscScalar *eigi)
466 {
467 107963 PetscInt k,nconv;
468 #if !defined(PETSC_USE_COMPLEX)
469 55729 PetscInt k2, iquad;
470 #endif
471
472
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
107963 PetscFunctionBegin;
473
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.
107963 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
474
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
107963 EPSCheckSolved(eps,1);
475
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
107963 PetscCheck(i>=0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index cannot be negative");
476
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
107963 PetscCall(EPS_GetActualConverged(eps,&nconv));
477
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
107963 PetscCheck(i<nconv,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index can be nconv-1 at most, see EPSGetConverged()");
478
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
107963 if (nconv==eps->nconv) {
479 101771 k = eps->perm[i];
480 #if defined(PETSC_USE_COMPLEX)
481
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
49274 if (eigr) *eigr = eps->eigr[k];
482
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
49274 if (eigi) *eigi = 0;
483 #else
484
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
52497 if (eigr) *eigr = eps->eigr[k];
485
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
52497 if (eigi) *eigi = eps->eigi[k];
486 #endif
487 } else {
488
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6192 PetscCheck(eps->problem_type==EPS_BSE || eps->problem_type==EPS_HAMILT,PetscObjectComm((PetscObject)eps),PETSC_ERR_PLIB,"Problem type should be BSE or Hamiltonian");
489
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 times.
6192 if (eps->problem_type==EPS_BSE) {
490 /* BSE problem, even index is +lambda, odd index is -lambda */
491 5672 k = eps->perm[i/2];
492 #if defined(PETSC_USE_COMPLEX)
493
3/4
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
2960 if (eigr) *eigr = (i%2)? -eps->eigr[k]: eps->eigr[k];
494
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
2960 if (eigi) *eigi = 0;
495 #else
496
3/4
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
2712 if (eigr) *eigr = (i%2)? -eps->eigr[k]: eps->eigr[k];
497
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
2712 if (eigi) *eigi = eps->eigi[k];
498 #endif
499
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
520 } else if (eps->problem_type==EPS_HAMILT) {
500 /* Hamiltonian eigenproblem */
501 520 k = eps->perm[i/2];
502 #if defined(PETSC_USE_COMPLEX)
503 if (eigr) *eigr = (i%2)? -eps->eigr[k]: eps->eigr[k];
504 if (eigi) *eigi = 0;
505 #else
506
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
520 if (eps->eigi[k]==0.0) { /* real eigenvalue */
507 if (eigr) *eigr = (i%2)? -eps->eigr[k]: eps->eigr[k];
508 if (eigi) *eigi = 0.0;
509
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
520 } else if (eps->eigr[k]==0.0) { /* purely imaginary eigenvalue */
510
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
120 if (eigr) *eigr = 0.0;
511
3/4
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
120 if (eigi) *eigi = (i%2)? -eps->eigi[k]: eps->eigi[k];
512 } else { /* quadruple eigenvalue (-conj(lambda),-lambda,lambda,conj(lambda)) */
513 400 iquad = i%2; /* index within the 4 values */
514
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
400 if (i>1) {
515 320 k2 = eps->perm[(i-2)/2];
516
3/4
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
320 if (eps->eigr[k]==eps->eigr[k2] && eps->eigi[k]==-eps->eigi[k2]) iquad += 2;
517 }
518
3/4
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
400 if (eigr) *eigr = (iquad<2)? -eps->eigr[k]: eps->eigr[k];
519
3/4
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
400 if (eigi) *eigi = (iquad%3)? -eps->eigi[k]: eps->eigi[k];
520 }
521 #endif
522 }
523 }
524
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.
22063 PetscFunctionReturn(PETSC_SUCCESS);
525 }
526
527 /*@
528 EPSGetEigenvector - Gets the `i`-th right eigenvector as computed by `EPSSolve()`.
529
530 Collective
531
532 Input Parameters:
533 + eps - the linear eigensolver context
534 - i - index of the solution
535
536 Output Parameters:
537 + Vr - real part of eigenvector
538 - Vi - imaginary part of eigenvector
539
540 Notes:
541 The caller must provide valid `Vec` objects, i.e., they must be created
542 by the calling program with e.g. `MatCreateVecs()`.
543
544 If the corresponding eigenvalue is real, then `Vi` is set to zero. If PETSc is
545 configured with complex scalars the eigenvector is stored
546 directly in `Vr` (`Vi` is set to zero). In any case, the user can pass `NULL` in `Vr`
547 or `Vi` if one of them is not required.
548
549 The index `i` should be a value between 0 and `nconv`-1 (see `EPSGetConverged()`).
550 Eigenpairs are indexed according to the ordering criterion established
551 with `EPSSetWhichEigenpairs()`.
552
553 The 2-norm of the eigenvector is one unless the problem is generalized
554 Hermitian. In this case the eigenvector is normalized with respect to the
555 norm defined by the $B$ matrix.
556
557 Level: beginner
558
559 .seealso: [](ch:eps), `EPSSolve()`, `EPSGetConverged()`, `EPSSetWhichEigenpairs()`, `EPSGetEigenpair()`, `EPSGetLeftEigenvector()`
560 @*/
561 79915 PetscErrorCode EPSGetEigenvector(EPS eps,PetscInt i,Vec Vr,Vec Vi)
562 {
563 79915 PetscInt nconv;
564
565
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
79915 PetscFunctionBegin;
566
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.
79915 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
567
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.
79915 PetscValidLogicalCollectiveInt(eps,i,2);
568
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.
79915 if (Vr) { PetscValidHeaderSpecific(Vr,VEC_CLASSID,3); PetscCheckSameComm(eps,1,Vr,3); }
569
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.
79915 if (Vi) { PetscValidHeaderSpecific(Vi,VEC_CLASSID,4); PetscCheckSameComm(eps,1,Vi,4); }
570
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
79915 EPSCheckSolved(eps,1);
571
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
79915 PetscCheck(i>=0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index cannot be negative");
572
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
79915 PetscCall(EPS_GetActualConverged(eps,&nconv));
573
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
79915 PetscCheck(i<nconv,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index can be nconv-1 at most, see EPSGetConverged()");
574
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
79915 PetscCall(EPSComputeVectors(eps));
575
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
79915 PetscCall(EPS_GetEigenvector(eps,eps->V,i,Vr,Vi));
576
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.
14325 PetscFunctionReturn(PETSC_SUCCESS);
577 }
578
579 /*@
580 EPSGetLeftEigenvector - Gets the `i`-th left eigenvector as computed by `EPSSolve()`.
581
582 Collective
583
584 Input Parameters:
585 + eps - the linear eigensolver context
586 - i - index of the solution
587
588 Output Parameters:
589 + Wr - real part of left eigenvector
590 - Wi - imaginary part of left eigenvector
591
592 Notes:
593 The caller must provide valid `Vec` objects, i.e., they must be created
594 by the calling program with e.g. `MatCreateVecs()`.
595
596 If the corresponding eigenvalue is real, then `Wi` is set to zero. If PETSc is
597 configured with complex scalars the eigenvector is stored directly in `Wr`
598 (`Wi` is set to zero). In any case, the user can pass `NULL` in `Wr` or `Wi` if
599 one of them is not required.
600
601 The index `i` should be a value between 0 and `nconv`-1 (see `EPSGetConverged()`).
602 Eigensolutions are indexed according to the ordering criterion established
603 with `EPSSetWhichEigenpairs()`.
604
605 Left eigenvectors are available only if the `twosided` flag was set, see
606 `EPSSetTwoSided()`.
607
608 Level: intermediate
609
610 .seealso: [](ch:eps), `EPSGetEigenvector()`, `EPSGetConverged()`, `EPSSetWhichEigenpairs()`, `EPSSetTwoSided()`
611 @*/
612 4505 PetscErrorCode EPSGetLeftEigenvector(EPS eps,PetscInt i,Vec Wr,Vec Wi)
613 {
614 4505 PetscInt nconv;
615 4505 PetscBool trivial;
616 4505 Mat H;
617 4505 IS is[2];
618 4505 Vec v;
619
620
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
4505 PetscFunctionBegin;
621
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.
4505 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
622
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.
4505 PetscValidLogicalCollectiveInt(eps,i,2);
623
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.
4505 if (Wr) { PetscValidHeaderSpecific(Wr,VEC_CLASSID,3); PetscCheckSameComm(eps,1,Wr,3); }
624
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.
4505 if (Wi) { PetscValidHeaderSpecific(Wi,VEC_CLASSID,4); PetscCheckSameComm(eps,1,Wi,4); }
625
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
4505 EPSCheckSolved(eps,1);
626
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
4505 PetscCheck(i>=0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index cannot be negative");
627
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
4505 PetscCall(EPS_GetActualConverged(eps,&nconv));
628
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
4505 PetscCheck(i<nconv,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index can be nconv-1 at most, see EPSGetConverged()");
629
630 4505 trivial = (eps->problem_type==EPS_HEP || eps->problem_type==EPS_GHEP || eps->problem_type==EPS_BSE)? PETSC_TRUE: PETSC_FALSE;
631
3/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
4505 if (!trivial) PetscCheck(eps->twosided,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONGSTATE,"Must request left vectors with EPSSetTwoSided");
632
633
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
4505 PetscCall(EPSComputeVectors(eps));
634
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4505 if (trivial) {
635
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3612 PetscCall(EPS_GetEigenvector(eps,eps->V,i,Wr,Wi));
636
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
3612 if (eps->problem_type==EPS_BSE) { /* change sign of bottom part of the vector */
637
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3612 PetscCall(STGetMatrix(eps->st,0,&H));
638
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3612 PetscCall(MatNestGetISs(H,is,NULL));
639
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
3612 if (Wr) {
640
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3612 PetscCall(VecGetSubVector(Wr,is[1],&v));
641
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3612 PetscCall(VecScale(v,-1.0));
642
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3612 PetscCall(VecRestoreSubVector(Wr,is[1],&v));
643 }
644 #if !defined(PETSC_USE_COMPLEX)
645
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
1768 if (Wi) {
646 PetscCall(VecGetSubVector(Wi,is[1],&v));
647 PetscCall(VecScale(v,-1.0));
648 PetscCall(VecRestoreSubVector(Wi,is[1],&v));
649 }
650 #endif
651 }
652 } else {
653
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
893 PetscCall(EPS_GetEigenvector(eps,eps->W,i,Wr,Wi));
654 }
655
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.
817 PetscFunctionReturn(PETSC_SUCCESS);
656 }
657
658 /*@
659 EPSGetErrorEstimate - Returns the error estimate associated to the `i`-th
660 computed eigenpair.
661
662 Not Collective
663
664 Input Parameters:
665 + eps - the linear eigensolver context
666 - i - index of eigenpair
667
668 Output Parameter:
669 . errest - the error estimate
670
671 Note:
672 This is the error estimate used internally by the eigensolver. The actual
673 error bound can be computed with `EPSComputeError()`. See discussion at
674 section [](#sec:errbnd).
675
676 Level: advanced
677
678 .seealso: [](ch:eps), [](#sec:errbnd), `EPSComputeError()`
679 @*/
680 612 PetscErrorCode EPSGetErrorEstimate(EPS eps,PetscInt i,PetscReal *errest)
681 {
682 612 PetscInt nconv;
683
684
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
612 PetscFunctionBegin;
685
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
612 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
686
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
612 PetscAssertPointer(errest,3);
687
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
612 EPSCheckSolved(eps,1);
688
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
612 PetscCheck(i>=0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index cannot be negative");
689
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
612 PetscCall(EPS_GetActualConverged(eps,&nconv));
690
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
612 PetscCheck(i<nconv,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"The index can be nconv-1 at most, see EPSGetConverged()");
691
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
612 if (nconv==eps->nconv) {
692 612 *errest = eps->errest[eps->perm[i]];
693 } else {
694 PetscCheck(eps->problem_type==EPS_BSE,PetscObjectComm((PetscObject)eps),PETSC_ERR_PLIB,"Problem type should be BSE");
695 /* BSE problem, even index is +lambda, odd index is -lambda, assume both have same error */
696 *errest = eps->errest[eps->perm[i/2]];
697 }
698
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);
699 }
700
701 /*
702 EPSComputeResidualNorm_Private - Computes the norm of the residual vector
703 associated with an eigenpair.
704
705 Input Parameters:
706 trans - whether A' must be used instead of A
707 kr,ki - eigenvalue
708 xr,xi - eigenvector
709 z - three work vectors (the second one not referenced in complex scalars)
710 */
711 44419 PetscErrorCode EPSComputeResidualNorm_Private(EPS eps,PetscBool trans,PetscScalar kr,PetscScalar ki,Vec xr,Vec xi,Vec *z,PetscReal *norm)
712 {
713 44419 PetscInt nmat;
714 44419 Mat A,B;
715 44419 Vec u,w;
716 44419 PetscScalar alpha;
717 #if !defined(PETSC_USE_COMPLEX)
718 22558 Vec v;
719 22558 PetscReal ni,nr;
720 #endif
721
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
44419 PetscErrorCode (*matmult)(Mat,Vec,Vec) = trans? MatMultHermitianTranspose: MatMult;
722
723
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
44419 PetscFunctionBegin;
724 44419 u = z[0]; w = z[2];
725
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
44419 PetscCall(STGetNumMatrices(eps->st,&nmat));
726
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
44419 PetscCall(STGetMatrix(eps->st,0,&A));
727
6/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
44419 if (nmat>1) PetscCall(STGetMatrix(eps->st,1,&B));
728
729 #if !defined(PETSC_USE_COMPLEX)
730 22558 v = z[1];
731
3/4
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
22558 if (ki == 0 || PetscAbsScalar(ki) < PetscAbsScalar(kr*PETSC_MACHINE_EPSILON)) {
732 #endif
733
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
43247 PetscCall((*matmult)(A,xr,u)); /* u=A*x */
734
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
43247 if (PetscAbsScalar(kr) > PETSC_MACHINE_EPSILON) {
735
6/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
43247 if (nmat>1) PetscCall((*matmult)(B,xr,w));
736
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
21478 else PetscCall(VecCopy(xr,w)); /* w=B*x */
737
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
43247 alpha = trans? -PetscConj(kr): -kr;
738
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
43247 PetscCall(VecAXPY(u,alpha,w)); /* u=A*x-k*B*x */
739 }
740
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
43247 PetscCall(VecNorm(u,NORM_2,norm));
741 #if !defined(PETSC_USE_COMPLEX)
742 } else {
743
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
1172 PetscCall((*matmult)(A,xr,u)); /* u=A*xr */
744
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
1172 if (SlepcAbsEigenvalue(kr,ki) > PETSC_MACHINE_EPSILON) {
745
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
1172 if (nmat>1) PetscCall((*matmult)(B,xr,v));
746
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
1156 else PetscCall(VecCopy(xr,v)); /* v=B*xr */
747
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
1172 PetscCall(VecAXPY(u,-kr,v)); /* u=A*xr-kr*B*xr */
748
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
1172 if (nmat>1) PetscCall((*matmult)(B,xi,w));
749
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
1156 else PetscCall(VecCopy(xi,w)); /* w=B*xi */
750
7/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
1172 PetscCall(VecAXPY(u,trans?-ki:ki,w)); /* u=A*xr-kr*B*xr+ki*B*xi */
751 }
752
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
1172 PetscCall(VecNorm(u,NORM_2,&nr));
753
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
1172 PetscCall((*matmult)(A,xi,u)); /* u=A*xi */
754
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
1172 if (SlepcAbsEigenvalue(kr,ki) > PETSC_MACHINE_EPSILON) {
755
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
1172 PetscCall(VecAXPY(u,-kr,w)); /* u=A*xi-kr*B*xi */
756
7/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
1172 PetscCall(VecAXPY(u,trans?ki:-ki,v)); /* u=A*xi-kr*B*xi-ki*B*xr */
757 }
758
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
1172 PetscCall(VecNorm(u,NORM_2,&ni));
759 1172 *norm = SlepcAbsEigenvalue(nr,ni);
760 }
761 #endif
762
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.
8816 PetscFunctionReturn(PETSC_SUCCESS);
763 }
764
765 /*@
766 EPSComputeError - Computes the error (based on the residual norm) associated
767 with the `i`-th computed eigenpair.
768
769 Collective
770
771 Input Parameters:
772 + eps - the linear eigensolver context
773 . i - the solution index
774 - type - the type of error to compute, see `EPSErrorType`
775
776 Output Parameter:
777 . error - the error
778
779 Notes:
780 The error can be computed in various ways, all of them based on the residual
781 norm $\|Ax-\lambda Bx\|_2$ where $(\lambda,x)$ is the approximate eigenpair.
782
783 If the computation of left eigenvectors was enabled with `EPSSetTwoSided()`,
784 then the error will be computed using the maximum of the value above and
785 the left residual norm $\|y^*A-\lambda y^*B\|_2$, where $y$ is the approximate left
786 eigenvector.
787
788 Level: beginner
789
790 .seealso: [](ch:eps), `EPSErrorType`, `EPSSolve()`, `EPSGetErrorEstimate()`, `EPSSetTwoSided()`
791 @*/
792 41034 PetscErrorCode EPSComputeError(EPS eps,PetscInt i,EPSErrorType type,PetscReal *error)
793 {
794 41034 Mat A,B;
795 41034 Vec xr,xi,w[3];
796 41034 PetscReal t,vecnorm=1.0,errorl;
797 41034 PetscScalar kr,ki;
798 41034 PetscBool flg;
799
800
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
41034 PetscFunctionBegin;
801
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.
41034 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
802
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.
41034 PetscValidLogicalCollectiveInt(eps,i,2);
803
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.
41034 PetscValidLogicalCollectiveEnum(eps,type,3);
804
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.
41034 PetscAssertPointer(error,4);
805
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
41034 EPSCheckSolved(eps,1);
806
807 /* allocate work vectors */
808 #if defined(PETSC_USE_COMPLEX)
809
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
20106 PetscCall(EPSSetWorkVecs(eps,3));
810 20106 xi = NULL;
811 20106 w[1] = NULL;
812 #else
813
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
20928 PetscCall(EPSSetWorkVecs(eps,5));
814 20928 xi = eps->work[3];
815 20928 w[1] = eps->work[4];
816 #endif
817 41034 xr = eps->work[0];
818 41034 w[0] = eps->work[1];
819 41034 w[2] = eps->work[2];
820
821 /* compute residual norm */
822
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
41034 PetscCall(EPSGetEigenpair(eps,i,&kr,&ki,xr,xi));
823
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
41034 PetscCall(EPSComputeResidualNorm_Private(eps,PETSC_FALSE,kr,ki,xr,xi,w,error));
824
825 /* compute 2-norm of eigenvector */
826
6/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
41034 if (eps->problem_type==EPS_GHEP) PetscCall(VecNorm(xr,NORM_2,&vecnorm));
827
828 /* if two-sided, compute left residual norm and take the maximum */
829
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
41034 if (eps->twosided) {
830
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
450 PetscCall(EPSGetLeftEigenvector(eps,i,xr,xi));
831
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
450 PetscCall(EPSComputeResidualNorm_Private(eps,PETSC_TRUE,kr,ki,xr,xi,w,&errorl));
832
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
673 *error = PetscMax(*error,errorl);
833 }
834
835 /* compute error */
836
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
41034 switch (type) {
837 case EPS_ERROR_ABSOLUTE:
838 break;
839 23584 case EPS_ERROR_RELATIVE:
840 23584 *error /= SlepcAbsEigenvalue(kr,ki)*vecnorm;
841 23584 break;
842 17198 case EPS_ERROR_BACKWARD:
843 /* initialization of matrix norms */
844
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
17198 if (!eps->nrma) {
845
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
395 PetscCall(STGetMatrix(eps->st,0,&A));
846
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
395 PetscCall(MatHasOperation(A,MATOP_NORM,&flg));
847
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
395 PetscCheck(flg,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONG,"The computation of backward errors requires a matrix norm operation");
848
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
395 PetscCall(MatNorm(A,NORM_INFINITY,&eps->nrma));
849 }
850
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
17198 if (eps->isgeneralized) {
851
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
16945 if (!eps->nrmb) {
852
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
336 PetscCall(STGetMatrix(eps->st,1,&B));
853
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
336 PetscCall(MatHasOperation(B,MATOP_NORM,&flg));
854
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
336 PetscCheck(flg,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONG,"The computation of backward errors requires a matrix norm operation");
855
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
336 PetscCall(MatNorm(B,NORM_INFINITY,&eps->nrmb));
856 }
857 253 } else eps->nrmb = 1.0;
858 17198 t = SlepcAbsEigenvalue(kr,ki);
859 17198 *error /= (eps->nrma+t*eps->nrmb)*vecnorm;
860 17198 break;
861 default:
862 SETERRQ(PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"Invalid error type");
863 }
864
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.
8100 PetscFunctionReturn(PETSC_SUCCESS);
865 }
866
867 /*
868 EPSGetStartVector - Generate a suitable vector to be used as the starting vector
869 for the recurrence that builds the right subspace.
870
871 Collective
872
873 Input Parameters:
874 + eps - the linear eigensolver context
875 - i - iteration number
876
877 Output Parameter:
878 . breakdown - flag indicating that a breakdown has occurred
879
880 Notes:
881 The start vector is computed from another vector: for the first step (i=0),
882 the first initial vector is used (see EPSSetInitialSpace()); otherwise a random
883 vector is created. Then this vector is forced to be in the range of OP (only
884 for generalized definite problems) and orthonormalized with respect to all
885 V-vectors up to i-1. The resulting vector is placed in V[i].
886
887 The flag breakdown is set to true if either i=0 and the vector belongs to the
888 deflation space, or i>0 and the vector is linearly dependent with respect
889 to the V-vectors.
890 */
891 7002 PetscErrorCode EPSGetStartVector(EPS eps,PetscInt i,PetscBool *breakdown)
892 {
893 7002 PetscReal norm;
894 7002 PetscBool lindep;
895 7002 Vec w,z;
896
897
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
7002 PetscFunctionBegin;
898
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.
7002 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
899
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.
7002 PetscValidLogicalCollectiveInt(eps,i,2);
900
901 /* For the first step, use the first initial vector, otherwise a random one */
902
8/10
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
7002 if (i>0 || eps->nini==0) PetscCall(BVSetRandomColumn(eps->V,i));
903
904 /* Force the vector to be in the range of OP for generalized problems with B-inner product */
905
6/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
7002 if (eps->ispositive || (eps->isgeneralized && eps->ishermitian)) {
906
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1033 PetscCall(BVCreateVec(eps->V,&w));
907
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1033 PetscCall(BVCopyVec(eps->V,i,w));
908
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1033 PetscCall(BVGetColumn(eps->V,i,&z));
909
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1033 PetscCall(STApply(eps->st,w,z));
910
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1033 PetscCall(BVRestoreColumn(eps->V,i,&z));
911
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1033 PetscCall(VecDestroy(&w));
912 }
913
914 /* Orthonormalize the vector with respect to previous vectors */
915
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
7002 PetscCall(BVOrthogonalizeColumn(eps->V,i,NULL,&norm,&lindep));
916
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
7002 if (breakdown) *breakdown = lindep;
917
2/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
6645 else if (lindep || norm == 0.0) {
918 PetscCheck(i,PetscObjectComm((PetscObject)eps),PETSC_ERR_PLIB,"Initial vector is zero or belongs to the deflation space");
919 PetscCheck(!i,PetscObjectComm((PetscObject)eps),PETSC_ERR_CONV_FAILED,"Unable to generate more start vectors");
920 }
921
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
7002 PetscCall(BVScaleColumn(eps->V,i,1.0/norm));
922
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.
1346 PetscFunctionReturn(PETSC_SUCCESS);
923 }
924
925 /*
926 EPSGetLeftStartVector - Generate a suitable vector to be used as the left starting
927 vector for the recurrence that builds the left subspace. See EPSGetStartVector().
928 */
929 254 PetscErrorCode EPSGetLeftStartVector(EPS eps,PetscInt i,PetscBool *breakdown)
930 {
931 254 PetscReal norm;
932 254 PetscBool lindep;
933 254 Vec w,z;
934
935
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
254 PetscFunctionBegin;
936
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
254 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
937
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
254 PetscValidLogicalCollectiveInt(eps,i,2);
938
939 /* For the first step, use the first initial vector, otherwise a random one */
940
8/10
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
254 if (i>0 || eps->ninil==0) PetscCall(BVSetRandomColumn(eps->W,i));
941
942 /* Force the vector to be in the range of OP' for generalized problems with B-inner product */
943
5/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
254 if (eps->ispositive || (eps->isgeneralized && eps->ishermitian)) {
944
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13 PetscCall(BVCreateVec(eps->W,&w));
945
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13 PetscCall(BVCopyVec(eps->W,i,w));
946
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13 PetscCall(BVGetColumn(eps->W,i,&z));
947
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13 PetscCall(STApplyHermitianTranspose(eps->st,w,z));
948
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13 PetscCall(BVRestoreColumn(eps->W,i,&z));
949
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13 PetscCall(VecDestroy(&w));
950 }
951
952 /* Orthonormalize the vector with respect to previous vectors */
953
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
254 PetscCall(BVOrthogonalizeColumn(eps->W,i,NULL,&norm,&lindep));
954
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
254 if (breakdown) *breakdown = lindep;
955
2/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
199 else if (lindep || norm == 0.0) {
956 PetscCheck(i,PetscObjectComm((PetscObject)eps),PETSC_ERR_PLIB,"Left initial vector is zero");
957 PetscCheck(!i,PetscObjectComm((PetscObject)eps),PETSC_ERR_CONV_FAILED,"Unable to generate more left start vectors");
958 }
959
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
254 PetscCall(BVScaleColumn(eps->W,i,1.0/norm));
960
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);
961 }
962