GCC Code Coverage Report


Directory: ./
File: src/eps/interface/epsdefault.c
Date: 2026-02-22 03:58:10
Exec Total Coverage
Lines: 224 235 95.3%
Functions: 14 14 100.0%
Branches: 630 1066 59.1%

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 This file contains some simple default routines for common operations
12 */
13
14 #include <slepc/private/epsimpl.h> /*I "slepceps.h" I*/
15 #include <slepcvec.h>
16
17 5766 PetscErrorCode EPSBackTransform_Default(EPS eps)
18 {
19
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
5766 PetscFunctionBegin;
20
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.
5766 PetscCall(STBackTransform(eps->st,eps->nconv,eps->eigr,eps->eigi));
21
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.
1368 PetscFunctionReturn(PETSC_SUCCESS);
22 }
23
24 /*
25 EPSComputeVectors_Hermitian - Copies the Lanczos vectors as eigenvectors
26 using purification for generalized eigenproblems.
27 */
28 2375 PetscErrorCode EPSComputeVectors_Hermitian(EPS eps)
29 {
30 2375 PetscBool iscayley,indef;
31 2375 Mat B,C;
32
33
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2375 PetscFunctionBegin;
34
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
2375 if (eps->purify) {
35
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.
507 PetscCall(EPS_Purify(eps,eps->nconv));
36
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.
507 PetscCall(BVNormalize(eps->V,NULL));
37 } else {
38 /* In the case of Cayley transform, eigenvectors need to be B-normalized */
39
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.
1868 PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STCAYLEY,&iscayley));
40
3/4
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
1868 if (iscayley && eps->isgeneralized) {
41
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(STGetMatrix(eps->st,1,&B));
42
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(BVGetMatrix(eps->V,&C,&indef));
43
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
8 PetscCheck(!indef,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONGSTATE,"The inner product should not be indefinite");
44
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(BVSetMatrix(eps->V,B,PETSC_FALSE));
45
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(BVNormalize(eps->V,NULL));
46
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(BVSetMatrix(eps->V,C,PETSC_FALSE)); /* restore original matrix */
47 }
48 }
49
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.
583 PetscFunctionReturn(PETSC_SUCCESS);
50 }
51
52 /*
53 EPSComputeVectors_Indefinite - similar to the Schur version but
54 for indefinite problems
55 */
56 104 PetscErrorCode EPSComputeVectors_Indefinite(EPS eps)
57 {
58 104 PetscInt n;
59 104 Mat X;
60
61
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
104 PetscFunctionBegin;
62
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(DSGetDimensions(eps->ds,&n,NULL,NULL,NULL));
63
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(DSVectors(eps->ds,DS_MAT_X,NULL,NULL));
64
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(DSGetMat(eps->ds,DS_MAT_X,&X));
65
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
104 PetscCall(BVMultInPlace(eps->V,X,0,n));
66
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.
104 PetscCall(DSRestoreMat(eps->ds,DS_MAT_X,&X));
67
68 /* purification */
69
5/8
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
104 if (eps->purify) PetscCall(EPS_Purify(eps,eps->nconv));
70
71 /* normalization */
72
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.
104 PetscCall(BVNormalize(eps->V,eps->eigi));
73
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.
29 PetscFunctionReturn(PETSC_SUCCESS);
74 }
75
76 /*
77 EPSComputeVectors_Twosided - Adjust left eigenvectors in generalized problems: y = B^-* y.
78 */
79 161 PetscErrorCode EPSComputeVectors_Twosided(EPS eps)
80 {
81 161 PetscInt i;
82 161 Vec w,y;
83
84
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
161 PetscFunctionBegin;
85
9/16
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 7 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
161 if (!eps->twosided || !eps->isgeneralized) PetscFunctionReturn(PETSC_SUCCESS);
86
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
34 PetscCall(EPSSetWorkVecs(eps,1));
87 34 w = eps->work[0];
88
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 7 times.
204 for (i=0;i<eps->nconv;i++) {
89
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
170 PetscCall(BVCopyVec(eps->W,i,w));
90
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
170 PetscCall(BVGetColumn(eps->W,i,&y));
91
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
170 PetscCall(STMatSolveHermitianTranspose(eps->st,w,y));
92
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
170 PetscCall(BVRestoreColumn(eps->W,i,&y));
93 }
94
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.
9 PetscFunctionReturn(PETSC_SUCCESS);
95 }
96
97 /*
98 EPSComputeVectors_Schur - Compute eigenvectors from the vectors
99 provided by the eigensolver. This version is intended for solvers
100 that provide Schur vectors. Given the partial Schur decomposition
101 OP*V=V*T, the following steps are performed:
102 1) compute eigenvectors of T: T*Z=Z*D
103 2) compute eigenvectors of OP: X=V*Z
104 */
105 2896 PetscErrorCode EPSComputeVectors_Schur(EPS eps)
106 {
107 2896 PetscInt i;
108 2896 Mat Z;
109 2896 Vec z;
110
111
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2896 PetscFunctionBegin;
112
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
2896 if (eps->ishermitian) {
113
3/10
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
431 if (eps->isgeneralized && !eps->ispositive) PetscCall(EPSComputeVectors_Indefinite(eps));
114
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.
431 else PetscCall(EPSComputeVectors_Hermitian(eps));
115
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.
431 PetscFunctionReturn(PETSC_SUCCESS);
116 }
117
118 /* right eigenvectors */
119
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.
2465 PetscCall(DSVectors(eps->ds,DS_MAT_X,NULL,NULL));
120
121 /* V = V * Z */
122
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.
2465 PetscCall(DSGetMat(eps->ds,DS_MAT_X,&Z));
123
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.
2465 PetscCall(BVMultInPlace(eps->V,Z,0,eps->nconv));
124
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.
2465 PetscCall(DSRestoreMat(eps->ds,DS_MAT_X,&Z));
125
126 /* Purify eigenvectors */
127
6/8
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
2465 if (eps->purify) PetscCall(EPS_Purify(eps,eps->nconv));
128
129 /* Fix eigenvectors if balancing was used */
130
3/4
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
2465 if (eps->balance!=EPS_BALANCE_NONE && eps->D) {
131
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
592 for (i=0;i<eps->nconv;i++) {
132
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.
496 PetscCall(BVGetColumn(eps->V,i,&z));
133
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.
496 PetscCall(VecPointwiseDivide(z,z,eps->D));
134
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.
496 PetscCall(BVRestoreColumn(eps->V,i,&z));
135 }
136 }
137
138 /* normalize eigenvectors (when using purification or balancing) */
139
9/12
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 6 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
2465 if (eps->purify || (eps->balance!=EPS_BALANCE_NONE && eps->D)) PetscCall(BVNormalize(eps->V,eps->eigi));
140
141 /* left eigenvectors */
142
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
2465 if (eps->twosided) {
143
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.
129 PetscCall(DSVectors(eps->ds,DS_MAT_Y,NULL,NULL));
144 /* W = W * Z */
145
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.
129 PetscCall(DSGetMat(eps->ds,DS_MAT_Y,&Z));
146
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.
129 PetscCall(BVMultInPlace(eps->W,Z,0,eps->nconv));
147
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.
129 PetscCall(DSRestoreMat(eps->ds,DS_MAT_Y,&Z));
148 /* Fix left eigenvectors if balancing was used */
149
3/4
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
129 if (eps->balance!=EPS_BALANCE_NONE && eps->D) {
150
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
80 for (i=0;i<eps->nconv;i++) {
151
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.
64 PetscCall(BVGetColumn(eps->W,i,&z));
152
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.
64 PetscCall(VecPointwiseMult(z,z,eps->D));
153
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.
64 PetscCall(BVRestoreColumn(eps->W,i,&z));
154 }
155 }
156
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.
129 PetscCall(EPSComputeVectors_Twosided(eps));
157 /* normalize */
158
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
129 PetscCall(BVNormalize(eps->W,eps->eigi));
159 #if !defined(PETSC_USE_COMPLEX)
160
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
364 for (i=0;i<eps->nconv-1;i++) {
161
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
292 if (eps->eigi[i] != 0.0) {
162
5/8
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
20 if (eps->eigi[i] > 0.0) PetscCall(BVScaleColumn(eps->W,i+1,-1.0));
163 20 i++;
164 }
165 }
166 #endif
167 }
168
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.
580 PetscFunctionReturn(PETSC_SUCCESS);
169 }
170
171 /*@
172 EPSSetWorkVecs - Sets a number of work vectors into an `EPS` object.
173
174 Collective
175
176 Input Parameters:
177 + eps - the linear eigensolver context
178 - nw - number of work vectors to allocate
179
180 Developer Note:
181 This is `SLEPC_EXTERN` because it may be required by user plugin `EPS`
182 implementations.
183
184 Level: developer
185
186 .seealso: [](ch:eps), `EPSSetUp()`
187 @*/
188 36246 PetscErrorCode EPSSetWorkVecs(EPS eps,PetscInt nw)
189 {
190 36246 Vec t;
191
192
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
36246 PetscFunctionBegin;
193
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.
36246 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
194
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.
36246 PetscValidLogicalCollectiveInt(eps,nw,2);
195
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
36246 PetscCheck(nw>0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"nw must be > 0: nw = %" PetscInt_FMT,nw);
196
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
36246 if (eps->nwork < nw) {
197
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.
6083 PetscCall(VecDestroyVecs(eps->nwork,&eps->work));
198 6083 eps->nwork = nw;
199
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6083 PetscCall(BVGetColumn(eps->V,0,&t));
200
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.
6083 PetscCall(VecDuplicateVecs(t,nw,&eps->work));
201
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.
6083 PetscCall(BVRestoreColumn(eps->V,0,&t));
202 }
203
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.
8940 PetscFunctionReturn(PETSC_SUCCESS);
204 }
205
206 /*
207 EPSSetWhichEigenpairs_Default - Sets the default value for which,
208 depending on the ST.
209 */
210 999 PetscErrorCode EPSSetWhichEigenpairs_Default(EPS eps)
211 {
212 999 PetscBool target;
213
214
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
999 PetscFunctionBegin;
215
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.
999 PetscCall(PetscObjectTypeCompareAny((PetscObject)eps->st,&target,STSINVERT,STCAYLEY,""));
216
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
999 if (target) eps->which = EPS_TARGET_MAGNITUDE;
217 818 else eps->which = EPS_LARGEST_MAGNITUDE;
218
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.
234 PetscFunctionReturn(PETSC_SUCCESS);
219 }
220
221 /*
222 EPSConvergedRelative - Checks convergence relative to the eigenvalue.
223 */
224 385702 PetscErrorCode EPSConvergedRelative(EPS eps,PetscScalar eigr,PetscScalar eigi,PetscReal res,PetscReal *errest,void *ctx)
225 {
226 385702 PetscReal w;
227
228
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
385702 PetscFunctionBegin;
229 385702 w = SlepcAbsEigenvalue(eigr,eigi);
230
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
385702 *errest = (w!=0.0)? res/w: PETSC_MAX_REAL;
231
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.
385702 PetscFunctionReturn(PETSC_SUCCESS);
232 }
233
234 /*
235 EPSConvergedAbsolute - Checks convergence absolutely.
236 */
237 27096 PetscErrorCode EPSConvergedAbsolute(EPS eps,PetscScalar eigr,PetscScalar eigi,PetscReal res,PetscReal *errest,void *ctx)
238 {
239
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
27096 PetscFunctionBegin;
240 27096 *errest = res;
241
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.
27096 PetscFunctionReturn(PETSC_SUCCESS);
242 }
243
244 /*
245 EPSConvergedNorm - Checks convergence relative to the eigenvalue and
246 the matrix norms.
247 */
248 43379 PetscErrorCode EPSConvergedNorm(EPS eps,PetscScalar eigr,PetscScalar eigi,PetscReal res,PetscReal *errest,void *ctx)
249 {
250 43379 PetscReal w;
251
252
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
43379 PetscFunctionBegin;
253 43379 w = SlepcAbsEigenvalue(eigr,eigi);
254 43379 *errest = res / (eps->nrma + w*eps->nrmb);
255
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.
43379 PetscFunctionReturn(PETSC_SUCCESS);
256 }
257
258 /*@C
259 EPSStoppingBasic - Default routine to determine whether the outer eigensolver
260 iteration must be stopped.
261
262 Collective
263
264 Input Parameters:
265 + eps - the linear eigensolver context
266 . its - current number of iterations
267 . max_it - maximum number of iterations
268 . nconv - number of currently converged eigenpairs
269 . nev - number of requested eigenpairs
270 - ctx - context (not used here)
271
272 Output Parameter:
273 . reason - result of the stopping test
274
275 Notes:
276 `EPSStoppingBasic()` will stop if all requested eigenvalues are converged, or if
277 the maximum number of iterations has been reached.
278
279 This is the default stopping test.
280 Use `EPSSetStoppingTest()` to provide your own test instead of using this one.
281
282 Level: advanced
283
284 .seealso: [](ch:eps), `EPSSetStoppingTest()`, `EPSStoppingThreshold()`, `EPSConvergedReason`, `EPSGetConvergedReason()`
285 @*/
286 349551 PetscErrorCode EPSStoppingBasic(EPS eps,PetscInt its,PetscInt max_it,PetscInt nconv,PetscInt nev,EPSConvergedReason *reason,void *ctx)
287 {
288
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
349551 PetscFunctionBegin;
289 349551 *reason = EPS_CONVERGED_ITERATING;
290
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
349551 if (nconv >= nev) {
291
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.
6768 PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: %" PetscInt_FMT " eigenpairs converged at iteration %" PetscInt_FMT "\n",nconv,its));
292 6768 *reason = EPS_CONVERGED_TOL;
293
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
342783 } else if (its >= max_it) {
294 104 *reason = EPS_DIVERGED_ITS;
295
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.
104 PetscCall(PetscInfo(eps,"Linear eigensolver iteration reached maximum number of iterations (%" PetscInt_FMT ")\n",its));
296 }
297
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.
86771 PetscFunctionReturn(PETSC_SUCCESS);
298 }
299
300 /*@C
301 EPSStoppingThreshold - Routine to determine whether the outer eigenvalue solver
302 iteration must be stopped, according to some threshold for the computed values.
303
304 Collective
305
306 Input Parameters:
307 + eps - the linear eigensolver context
308 . its - current number of iterations
309 . max_it - maximum number of iterations
310 . nconv - number of currently converged eigenpairs (ignored here)
311 . nev - number of requested eigenpairs (ignored here)
312 - ctx - context containing additional data (`EPSStoppingCtx`)
313
314 Output Parameter:
315 . reason - result of the stopping test
316
317 Notes:
318 `EPSStoppingThreshold()` will stop when one of the computed eigenvalues is not
319 above/below the threshold given at `EPSSetThreshold()`. If a number of wanted
320 eigenvalues has been specified via `EPSSetDimensions()` then it is also taken into
321 account, and the solver will stop when one of the two conditions (threshold or
322 number of converged values) is met.
323
324 Use `EPSSetStoppingTest()` to provide your own test instead of using this one.
325
326 Level: advanced
327
328 .seealso: [](ch:eps), `EPSSetStoppingTest()`, `EPSStoppingBasic()`, `EPSSetThreshold()`, `EPSSetDimensions()`, `EPSConvergedReason`, `EPSGetConvergedReason()`
329 @*/
330 7189 PetscErrorCode EPSStoppingThreshold(EPS eps,PetscInt its,PetscInt max_it,PetscInt nconv,PetscInt nev,EPSConvergedReason *reason,void *ctx)
331 {
332 7189 PetscReal thres,firstev,lastev;
333 7189 PetscBool magnit,rel;
334 7189 EPSWhich which;
335
336
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
7189 PetscFunctionBegin;
337 7189 *reason = EPS_CONVERGED_ITERATING;
338 7189 firstev = ((EPSStoppingCtx)ctx)->firstev;
339 7189 lastev = ((EPSStoppingCtx)ctx)->lastev;
340 7189 thres = ((EPSStoppingCtx)ctx)->thres;
341 7189 rel = ((EPSStoppingCtx)ctx)->threlative;
342 7189 which = ((EPSStoppingCtx)ctx)->which;
343 7189 magnit = (which==EPS_SMALLEST_MAGNITUDE || which==EPS_LARGEST_MAGNITUDE || which==EPS_TARGET_MAGNITUDE)? PETSC_TRUE: PETSC_FALSE;
344
18/18
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 8 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 8 times.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 8 times.
✓ Branch 9 taken 8 times.
✓ Branch 10 taken 8 times.
✓ Branch 11 taken 8 times.
✓ Branch 12 taken 8 times.
✓ Branch 13 taken 8 times.
✓ Branch 14 taken 8 times.
✓ Branch 15 taken 8 times.
✓ Branch 16 taken 1 times.
✓ Branch 17 taken 1 times.
7189 if (nconv && magnit && which==EPS_TARGET_MAGNITUDE && ((rel && ((thres>1.0 && lastev>thres*firstev) || (thres<1.0 && lastev<thres*firstev))) || (!rel && lastev>thres))) {
345
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
26 if (!rel) PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: the eigenvalue magnitude %g is above the threshold %g\n",(double)lastev,(double)thres));
346
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
16 else if (thres>1.0) PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: the ratio %g/%g is above the threshold %g\n",(double)lastev,(double)firstev,(double)thres));
347
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 else PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: the ratio %g/%g is below the threshold %g\n",(double)lastev,(double)firstev,(double)thres));
348 26 *reason = EPS_CONVERGED_TOL;
349
16/16
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 7 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 7 times.
✓ Branch 9 taken 8 times.
✓ Branch 10 taken 7 times.
✓ Branch 11 taken 7 times.
✓ Branch 12 taken 8 times.
✓ Branch 13 taken 8 times.
✓ Branch 14 taken 1 times.
✓ Branch 15 taken 1 times.
7163 } else if (nconv && magnit && ((which==EPS_LARGEST_MAGNITUDE && ((rel && lastev<thres*firstev) || (!rel && lastev<thres))) || (which==EPS_SMALLEST_MAGNITUDE && lastev>thres))) {
350
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
92 if (which==EPS_SMALLEST_MAGNITUDE) PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: the eigenvalue magnitude %g is above the threshold %g\n",(double)lastev,(double)thres));
351
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
36 else if (!rel) PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: the eigenvalue magnitude %g is below the threshold %g\n",(double)lastev,(double)thres));
352
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
36 else PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: the ratio %g/%g is below the threshold %g\n",(double)lastev,(double)firstev,(double)thres));
353 92 *reason = EPS_CONVERGED_TOL;
354
1/10
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
7071 } else if (nconv && !magnit && ((which==EPS_LARGEST_REAL && lastev<thres) || (which==EPS_SMALLEST_REAL && lastev>thres))) {
355 if (which==EPS_LARGEST_REAL) PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: eigenvalue %g is below the threshold %g\n",(double)lastev,(double)thres));
356 else PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: eigenvalue %g is above the threshold %g\n",(double)lastev,(double)thres));
357 *reason = EPS_CONVERGED_TOL;
358
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 8 times.
7071 } else if (nev && nconv >= nev) {
359
3/6
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
2 PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: %" PetscInt_FMT " eigenpairs converged at iteration %" PetscInt_FMT "\n",nconv,its));
360 2 *reason = EPS_CONVERGED_TOL;
361
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
7069 } else if (its >= max_it) {
362 *reason = EPS_DIVERGED_ITS;
363 PetscCall(PetscInfo(eps,"Linear eigensolver iteration reached maximum number of iterations (%" PetscInt_FMT ")\n",its));
364 }
365
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.
1805 PetscFunctionReturn(PETSC_SUCCESS);
366 }
367
368 /*
369 EPSComputeRitzVector - Computes the current Ritz vector.
370
371 Simple case (complex scalars or real scalars with Zi=NULL):
372 x = V*Zr (V is a basis of nv vectors, Zr has length nv)
373
374 Split case:
375 x = V*Zr y = V*Zi (Zr and Zi have length nv)
376 */
377 3388 PetscErrorCode EPSComputeRitzVector(EPS eps,PetscScalar *Zr,PetscScalar *Zi,BV V,Vec x,Vec y)
378 {
379 3388 PetscInt l,k;
380 3388 PetscReal norm;
381 #if !defined(PETSC_USE_COMPLEX)
382 1664 Vec z;
383 #endif
384
385
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
3388 PetscFunctionBegin;
386 /* compute eigenvector */
387
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.
3388 PetscCall(BVGetActiveColumns(V,&l,&k));
388
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.
3388 PetscCall(BVSetActiveColumns(V,0,k));
389
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.
3388 PetscCall(BVMultVec(V,1.0,0.0,x,Zr));
390
391 /* purify eigenvector if necessary */
392
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
3388 if (eps->purify) {
393
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.
212 PetscCall(STApply(eps->st,x,y));
394
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
212 if (eps->ishermitian) PetscCall(BVNormVec(eps->V,y,NORM_2,&norm));
395
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
116 else PetscCall(VecNorm(y,NORM_2,&norm));
396
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.
212 PetscCall(VecScale(y,1.0/norm));
397
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.
212 PetscCall(VecCopy(y,x));
398 }
399 /* fix eigenvector if balancing is used */
400
9/12
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 6 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
3388 if (!eps->ishermitian && eps->balance!=EPS_BALANCE_NONE && eps->D) PetscCall(VecPointwiseDivide(x,x,eps->D));
401 #if !defined(PETSC_USE_COMPLEX)
402 /* compute imaginary part of eigenvector */
403
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
1664 if (Zi) {
404
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
100 PetscCall(BVMultVec(V,1.0,0.0,y,Zi));
405
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
100 if (eps->ispositive) {
406 PetscCall(BVCreateVec(V,&z));
407 PetscCall(STApply(eps->st,y,z));
408 PetscCall(VecNorm(z,NORM_2,&norm));
409 PetscCall(VecScale(z,1.0/norm));
410 PetscCall(VecCopy(z,y));
411 PetscCall(VecDestroy(&z));
412 }
413
7/10
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 3 times.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
100 if (eps->balance!=EPS_BALANCE_NONE && eps->D) PetscCall(VecPointwiseDivide(y,y,eps->D));
414 } else
415 #endif
416
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.
3288 PetscCall(VecSet(y,0.0));
417
418 /* normalize eigenvectors (when using balancing) */
419
3/4
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
3388 if (eps->balance!=EPS_BALANCE_NONE && eps->D) {
420 #if !defined(PETSC_USE_COMPLEX)
421
5/8
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
48 if (Zi) PetscCall(VecNormalizeComplex(x,y,PETSC_TRUE,NULL));
422 else
423 #endif
424
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
64 PetscCall(VecNormalize(x,NULL));
425 }
426
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.
3388 PetscCall(BVSetActiveColumns(V,l,k));
427
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.
803 PetscFunctionReturn(PETSC_SUCCESS);
428 }
429
430 /*
431 EPSBuildBalance_Krylov - uses a Krylov subspace method to compute the
432 diagonal matrix to be applied for balancing in non-Hermitian problems.
433 */
434 104 PetscErrorCode EPSBuildBalance_Krylov(EPS eps)
435 {
436 104 Vec z,p,r;
437 104 PetscInt i,j;
438 104 PetscReal norma;
439 104 PetscScalar *pz,*pD;
440 104 const PetscScalar *pr,*pp;
441 104 PetscRandom rand;
442
443
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
104 PetscFunctionBegin;
444
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.
104 PetscCall(EPSSetWorkVecs(eps,3));
445
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.
104 PetscCall(BVGetRandomContext(eps->V,&rand));
446 104 r = eps->work[0];
447 104 p = eps->work[1];
448 104 z = eps->work[2];
449
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.
104 PetscCall(VecSet(eps->D,1.0));
450
451
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
624 for (j=0;j<eps->balance_its;j++) {
452
453 /* Build a random vector of +-1's */
454
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.
520 PetscCall(VecSetRandom(z,rand));
455
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.
520 PetscCall(VecGetArray(z,&pz));
456
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
40760 for (i=0;i<eps->nloc;i++) {
457
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
40240 if (PetscRealPart(pz[i])<0.5) pz[i]=-1.0;
458 19540 else pz[i]=1.0;
459 }
460
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.
520 PetscCall(VecRestoreArray(z,&pz));
461
462 /* Compute p=DA(D\z) */
463
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.
520 PetscCall(VecPointwiseDivide(r,z,eps->D));
464
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.
520 PetscCall(STApply(eps->st,r,p));
465
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.
520 PetscCall(VecPointwiseMult(p,p,eps->D));
466
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
520 if (eps->balance == EPS_BALANCE_TWOSIDE) {
467
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
320 if (j==0) {
468 /* Estimate the matrix inf-norm */
469
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.
64 PetscCall(VecAbs(p));
470
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.
64 PetscCall(VecMax(p,NULL,&norma));
471 }
472 /* Compute r=D\(A'Dz) */
473
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.
320 PetscCall(VecPointwiseMult(z,z,eps->D));
474
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.
320 PetscCall(STApplyHermitianTranspose(eps->st,z,r));
475
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.
320 PetscCall(VecPointwiseDivide(r,r,eps->D));
476 }
477
478 /* Adjust values of D */
479
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
520 PetscCall(VecGetArrayRead(r,&pr));
480
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.
520 PetscCall(VecGetArrayRead(p,&pp));
481
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.
520 PetscCall(VecGetArray(eps->D,&pD));
482
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
40760 for (i=0;i<eps->nloc;i++) {
483
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
40240 if (eps->balance == EPS_BALANCE_TWOSIDE) {
484
4/4
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
23200 if (PetscAbsScalar(pp[i])>eps->balance_cutoff*norma && pr[i]!=0.0)
485 22592 pD[i] *= PetscSqrtReal(PetscAbsScalar(pr[i]/pp[i]));
486 } else {
487
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
17040 if (pp[i]!=0.0) pD[i] /= PetscAbsScalar(pp[i]);
488 }
489 }
490
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.
520 PetscCall(VecRestoreArrayRead(r,&pr));
491
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.
520 PetscCall(VecRestoreArrayRead(p,&pp));
492
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.
520 PetscCall(VecRestoreArray(eps->D,&pD));
493 }
494
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.
26 PetscFunctionReturn(PETSC_SUCCESS);
495 }
496