GCC Code Coverage Report


Directory: ./
File: src/eps/interface/epsdefault.c
Date: 2026-05-04 03:58:11
Exec Total Coverage
Lines: 235 253 92.9%
Functions: 14 14 100.0%
Branches: 647 1112 58.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 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 7533 PetscErrorCode EPSBackTransform_Default(EPS eps)
18 {
19
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
7533 PetscFunctionBegin;
20
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.
7533 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.
1421 PetscFunctionReturn(PETSC_SUCCESS);
22 }
23
24 /*
25 EPSComputeVectors_Hermitian - Copies the Lanczos vectors as eigenvectors
26 using purification for generalized eigenproblems.
27 */
28 3006 PetscErrorCode EPSComputeVectors_Hermitian(EPS eps)
29 {
30 3006 PetscBool iscayley,indef;
31 3006 Mat B,C;
32
33
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
3006 PetscFunctionBegin;
34
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3006 if (eps->purify) {
35
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.
648 PetscCall(EPS_Purify(eps,eps->nconv));
36
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.
648 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 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2358 PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STCAYLEY,&iscayley));
40
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
2358 if (iscayley && eps->isgeneralized) {
41
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(STGetMatrix(eps->st,1,&B));
42
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(BVGetMatrix(eps->V,&C,&indef));
43
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
10 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 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(BVSetMatrix(eps->V,B,PETSC_FALSE));
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.
10 PetscCall(BVNormalize(eps->V,NULL));
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.
10 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.
584 PetscFunctionReturn(PETSC_SUCCESS);
50 }
51
52 /*
53 EPSComputeVectors_Indefinite - similar to the Schur version but
54 for indefinite problems
55 */
56 121 PetscErrorCode EPSComputeVectors_Indefinite(EPS eps)
57 {
58 121 PetscInt n;
59 121 Mat X;
60
61
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
121 PetscFunctionBegin;
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.
121 PetscCall(DSGetDimensions(eps->ds,&n,NULL,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.
121 PetscCall(DSVectors(eps->ds,DS_MAT_X,NULL,NULL));
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.
121 PetscCall(DSGetMat(eps->ds,DS_MAT_X,&X));
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.
121 PetscCall(BVMultInPlace(eps->V,X,0,n));
66
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.
121 PetscCall(DSRestoreMat(eps->ds,DS_MAT_X,&X));
67
68 /* purification */
69
5/8
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ 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.
121 if (eps->purify) PetscCall(EPS_Purify(eps,eps->nconv));
70
71 /* normalization */
72
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.
121 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 199 PetscErrorCode EPSComputeVectors_Twosided(EPS eps)
80 {
81 199 PetscInt i;
82 199 Vec w,y;
83
84
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
199 PetscFunctionBegin;
85
9/16
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 10 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.
199 if (!eps->twosided || !eps->isgeneralized) PetscFunctionReturn(PETSC_SUCCESS);
86
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.
41 PetscCall(EPSSetWorkVecs(eps,1));
87 41 w = eps->work[0];
88
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
246 for (i=0;i<eps->nconv;i++) {
89
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
205 PetscCall(BVCopyVec(eps->W,i,w));
90
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
205 PetscCall(BVGetColumn(eps->W,i,&y));
91
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
205 PetscCall(STMatSolveHermitianTranspose(eps->st,w,y));
92
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
205 PetscCall(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 3621 PetscErrorCode EPSComputeVectors_Schur(EPS eps)
106 {
107 3621 PetscInt i;
108 3621 Mat Z;
109 3621 Vec z;
110
111
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
3621 PetscFunctionBegin;
112
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3621 if (eps->ishermitian) {
113
3/10
✓ 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.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
562 if (eps->isgeneralized && !eps->ispositive) PetscCall(EPSComputeVectors_Indefinite(eps));
114
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.
562 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.
562 PetscFunctionReturn(PETSC_SUCCESS);
116 }
117
118 /* right eigenvectors */
119
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.
3059 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 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3059 PetscCall(DSGetMat(eps->ds,DS_MAT_X,&Z));
123
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.
3059 PetscCall(BVMultInPlace(eps->V,Z,0,eps->nconv));
124
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.
3059 PetscCall(DSRestoreMat(eps->ds,DS_MAT_X,&Z));
125
126 /* Purify eigenvectors */
127
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 10 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.
3059 if (eps->purify) PetscCall(EPS_Purify(eps,eps->nconv));
128
129 /* Fix eigenvectors if balancing was used */
130
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
3059 if (eps->balance!=EPS_BALANCE_NONE && eps->D) {
131
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
740 for (i=0;i<eps->nconv;i++) {
132
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.
620 PetscCall(BVGetColumn(eps->V,i,&z));
133
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.
620 PetscCall(VecPointwiseDivide(z,z,eps->D));
134
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.
620 PetscCall(BVRestoreColumn(eps->V,i,&z));
135 }
136 }
137
138 /* normalize eigenvectors (when using purification or balancing) */
139
9/12
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
3059 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 10 times.
✓ Branch 1 taken 10 times.
3059 if (eps->twosided) {
143
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.
159 PetscCall(DSVectors(eps->ds,DS_MAT_Y,NULL,NULL));
144 /* W = W * Z */
145
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.
159 PetscCall(DSGetMat(eps->ds,DS_MAT_Y,&Z));
146
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.
159 PetscCall(BVMultInPlace(eps->W,Z,0,eps->nconv));
147
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.
159 PetscCall(DSRestoreMat(eps->ds,DS_MAT_Y,&Z));
148 /* Fix left eigenvectors if balancing was used */
149
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
159 if (eps->balance!=EPS_BALANCE_NONE && eps->D) {
150
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
100 for (i=0;i<eps->nconv;i++) {
151
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.
80 PetscCall(BVGetColumn(eps->W,i,&z));
152
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.
80 PetscCall(VecPointwiseMult(z,z,eps->D));
153
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.
80 PetscCall(BVRestoreColumn(eps->W,i,&z));
154 }
155 }
156
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.
159 PetscCall(EPSComputeVectors_Twosided(eps));
157 /* normalize */
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.
159 PetscCall(BVNormalize(eps->W,eps->eigi));
159 #if !defined(PETSC_USE_COMPLEX)
160
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
450 for (i=0;i<eps->nconv-1;i++) {
161
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
361 if (eps->eigi[i] != 0.0) {
162
5/8
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ 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.
24 if (eps->eigi[i] > 0.0) PetscCall(BVScaleColumn(eps->W,i+1,-1.0));
163 24 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 46591 PetscErrorCode EPSSetWorkVecs(EPS eps,PetscInt nw)
189 {
190 46591 Vec t;
191
192
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
46591 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.
46591 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.
46591 PetscValidLogicalCollectiveInt(eps,nw,2);
195
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
46591 PetscCheck(nw>0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"nw must be > 0: nw = %" PetscInt_FMT,nw);
196
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
46591 if (eps->nwork < nw) {
197
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.
7907 PetscCall(VecDestroyVecs(eps->nwork,&eps->work));
198 7907 eps->nwork = nw;
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.
7907 PetscCall(BVGetColumn(eps->V,0,&t));
200
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
7907 PetscCall(VecDuplicateVecs(t,nw,&eps->work));
201
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.
7907 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.
9145 PetscFunctionReturn(PETSC_SUCCESS);
204 }
205
206 /*
207 EPSSetWhichEigenpairs_Default - Sets the default value for which,
208 depending on the ST.
209 */
210 1243 PetscErrorCode EPSSetWhichEigenpairs_Default(EPS eps)
211 {
212 1243 PetscBool target;
213
214
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1243 PetscFunctionBegin;
215
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1243 PetscCall(PetscObjectTypeCompareAny((PetscObject)eps->st,&target,STSINVERT,STCAYLEY,""));
216
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1243 if (target) eps->which = EPS_TARGET_MAGNITUDE;
217 1016 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.
233 PetscFunctionReturn(PETSC_SUCCESS);
219 }
220
221 /*
222 EPSConvergedRelative - Checks convergence relative to the eigenvalue.
223 */
224 478337 PetscErrorCode EPSConvergedRelative(EPS eps,PetscScalar eigr,PetscScalar eigi,PetscReal res,PetscReal *errest,void *ctx)
225 {
226 478337 PetscReal w;
227
228
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
478337 PetscFunctionBegin;
229 478337 w = SlepcAbsEigenvalue(eigr,eigi);
230
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
478337 *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.
478337 PetscFunctionReturn(PETSC_SUCCESS);
232 }
233
234 /*
235 EPSConvergedAbsolute - Checks convergence absolutely.
236 */
237 27744 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.
27744 PetscFunctionBegin;
240 27744 *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.
27744 PetscFunctionReturn(PETSC_SUCCESS);
242 }
243
244 /*
245 EPSConvergedNorm - Checks convergence relative to the eigenvalue and
246 the matrix norms.
247 */
248 56367 PetscErrorCode EPSConvergedNorm(EPS eps,PetscScalar eigr,PetscScalar eigi,PetscReal res,PetscReal *errest,void *ctx)
249 {
250 56367 PetscReal w;
251
252
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
56367 PetscFunctionBegin;
253 56367 w = SlepcAbsEigenvalue(eigr,eigi);
254 56367 *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.
56367 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 437928 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.
437928 PetscFunctionBegin;
289 437928 *reason = EPS_CONVERGED_ITERATING;
290
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
437928 if (nconv >= nev) {
291
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8598 PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: %" PetscInt_FMT " eigenpairs converged at iteration %" PetscInt_FMT "\n",nconv,its));
292 8598 *reason = EPS_CONVERGED_TOL;
293
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
429330 } else if (its >= max_it) {
294 130 *reason = EPS_DIVERGED_ITS;
295
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.
130 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.
86810 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
311 . nev - number of requested eigenpairs
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 11290 PetscErrorCode EPSStoppingThreshold(EPS eps,PetscInt its,PetscInt max_it,PetscInt nconv,PetscInt nev,EPSConvergedReason *reason,void *ctx)
331 {
332 11290 PetscReal thres,firstev,firstnc,errest;
333 11290 PetscBool magnit,rel;
334 11290 PetscInt napprox;
335 11290 EPSWhich which;
336
337
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
11290 PetscFunctionBegin;
338 11290 *reason = EPS_CONVERGED_ITERATING;
339 11290 firstev = ((EPSStoppingCtx)ctx)->firstev;
340 11290 firstnc = ((EPSStoppingCtx)ctx)->firstnc;
341 11290 errest = ((EPSStoppingCtx)ctx)->errest;
342 11290 thres = ((EPSStoppingCtx)ctx)->thres;
343 11290 rel = ((EPSStoppingCtx)ctx)->threlative;
344 11290 napprox = ((EPSStoppingCtx)ctx)->napprox;
345 11290 which = ((EPSStoppingCtx)ctx)->which;
346
347
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
11290 if (!nconv) { /* no converged eigenvalues yet */
348
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
4572 if (its >= max_it) {
349 PetscCall(PetscInfo(eps,"Linear eigensolver iteration reached maximum number of iterations (%" PetscInt_FMT ")\n",its));
350 *reason = EPS_DIVERGED_ITS;
351 }
352
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.
4572 PetscFunctionReturn(PETSC_SUCCESS);
353 }
354
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
6718 if (nconv==napprox) { /* all approximations converged, very unusual */
355 PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: all available eigenvalue approximations have converged\n"));
356 *reason = EPS_CONVERGED_TOL;
357 PetscFunctionReturn(PETSC_SUCCESS);
358 }
359 6718 magnit = (which==EPS_SMALLEST_MAGNITUDE || which==EPS_LARGEST_MAGNITUDE || which==EPS_TARGET_MAGNITUDE)? PETSC_TRUE: PETSC_FALSE;
360
16/16
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 5 times.
✓ Branch 7 taken 9 times.
✓ Branch 8 taken 6 times.
✓ Branch 9 taken 5 times.
✓ Branch 10 taken 10 times.
✓ Branch 11 taken 6 times.
✓ Branch 12 taken 10 times.
✓ Branch 13 taken 10 times.
✓ Branch 14 taken 1 times.
✓ Branch 15 taken 1 times.
6718 if (magnit && which==EPS_TARGET_MAGNITUDE && ((rel && ((thres>1.0 && firstnc-errest>thres*firstev) || (thres<1.0 && firstnc+errest<thres*firstev))) || (!rel && firstnc-errest>thres))) {
361
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
74 if (its==((EPSStoppingCtx)ctx)->its+1) {
362
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.
37 if (!rel) PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: the approximation magnitude %g (minus error estimate %g) is above the threshold %g\n",(double)firstnc,(double)errest,(double)thres));
363
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.
15 else if (thres>1.0) PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: the ratio %g/%g is above the threshold %g\n",(double)(firstnc-errest),(double)firstev,(double)thres));
364
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 else PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: the ratio %g/%g is below the threshold %g\n",(double)(firstnc+errest),(double)firstev,(double)thres));
365 37 *reason = EPS_CONVERGED_TOL;
366 37 } else ((EPSStoppingCtx)ctx)->its = its; /* wait until next iteration */
367
15/16
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 10 times.
✓ Branch 7 taken 10 times.
✓ Branch 8 taken 10 times.
✓ Branch 9 taken 10 times.
✓ Branch 10 taken 10 times.
✓ Branch 11 taken 10 times.
✓ Branch 12 taken 10 times.
✓ Branch 13 taken 10 times.
✓ Branch 14 taken 1 times.
✓ Branch 15 taken 1 times.
6644 } else if (magnit && ((which==EPS_LARGEST_MAGNITUDE && ((rel && firstnc+errest<thres*firstev) || (!rel && firstnc+errest<thres))) || (which==EPS_SMALLEST_MAGNITUDE && firstnc-errest>thres))) {
368
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
697 if (its==((EPSStoppingCtx)ctx)->its+1) {
369
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.
336 if (which==EPS_SMALLEST_MAGNITUDE) PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: the approximation magnitude %g (minus error estimate %g) is above the threshold %g\n",(double)firstnc,(double)errest,(double)thres));
370
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.
246 else if (!rel) PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: the approximation magnitude %g (plus error estimate %g) is below the threshold %g\n",(double)firstnc,(double)errest,(double)thres));
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.
42 else PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: the ratio %g/%g is below the threshold %g\n",(double)(firstnc+errest),(double)firstev,(double)thres));
372 336 *reason = EPS_CONVERGED_TOL;
373 361 } else ((EPSStoppingCtx)ctx)->its = its; /* wait until next iteration */
374
1/10
✗ Branch 0 not taken.
✓ Branch 1 taken 1 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.
568 } else if (!magnit && ((which==EPS_LARGEST_REAL && firstnc+errest<thres) || (which==EPS_SMALLEST_REAL && firstnc-errest>thres))) {
375 if (its==((EPSStoppingCtx)ctx)->its+1) {
376 if (which==EPS_LARGEST_REAL) PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: approximation %g (plus error estimate %g) is below the threshold %g\n",(double)firstnc,(double)errest,(double)thres));
377 else PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: approximation %g (minus error estimate %g) is above the threshold %g\n",(double)firstnc,(double)errest,(double)thres));
378 *reason = EPS_CONVERGED_TOL;
379 } else ((EPSStoppingCtx)ctx)->its = its; /* wait until next iteration */
380
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 10 times.
5947 } else if (nev && nconv >= nev) {
381
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
4 PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: %" PetscInt_FMT " eigenpairs converged at iteration %" PetscInt_FMT "\n",nconv,its));
382 4 *reason = EPS_CONVERGED_TOL;
383
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
5943 } else if (its >= max_it) {
384 PetscCall(PetscInfo(eps,"Linear eigensolver iteration reached maximum number of iterations (%" PetscInt_FMT ")\n",its));
385 *reason = EPS_DIVERGED_ITS;
386 }
387
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.
1353 PetscFunctionReturn(PETSC_SUCCESS);
388 }
389
390 /*
391 EPSComputeRitzVector - Computes the current Ritz vector.
392
393 Simple case (complex scalars or real scalars with Zi=NULL):
394 x = V*Zr (V is a basis of nv vectors, Zr has length nv)
395
396 Split case:
397 x = V*Zr y = V*Zi (Zr and Zi have length nv)
398 */
399 4191 PetscErrorCode EPSComputeRitzVector(EPS eps,PetscScalar *Zr,PetscScalar *Zi,BV V,Vec x,Vec y)
400 {
401 4191 PetscInt l,k;
402 4191 PetscReal norm;
403 #if !defined(PETSC_USE_COMPLEX)
404 2060 Vec z;
405 #endif
406
407
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
4191 PetscFunctionBegin;
408 /* compute eigenvector */
409
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.
4191 PetscCall(BVGetActiveColumns(V,&l,&k));
410
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.
4191 PetscCall(BVSetActiveColumns(V,0,k));
411
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.
4191 PetscCall(BVMultVec(V,1.0,0.0,x,Zr));
412
413 /* purify eigenvector if necessary */
414
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4191 if (eps->purify) {
415
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.
265 PetscCall(STApply(eps->st,x,y));
416
6/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 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.
265 if (eps->ishermitian) PetscCall(BVNormVec(eps->V,y,NORM_2,&norm));
417
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.
145 else PetscCall(VecNorm(y,NORM_2,&norm));
418
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.
265 PetscCall(VecScale(y,1.0/norm));
419
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.
265 PetscCall(VecCopy(y,x));
420 }
421 /* fix eigenvector if balancing is used */
422
9/12
✓ 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 not taken.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
4191 if (!eps->ishermitian && eps->balance!=EPS_BALANCE_NONE && eps->D) PetscCall(VecPointwiseDivide(x,x,eps->D));
423 #if !defined(PETSC_USE_COMPLEX)
424 /* compute imaginary part of eigenvector */
425
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
2060 if (Zi) {
426
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.
125 PetscCall(BVMultVec(V,1.0,0.0,y,Zi));
427
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
125 if (eps->ispositive) {
428 PetscCall(BVCreateVec(V,&z));
429 PetscCall(STApply(eps->st,y,z));
430 PetscCall(VecNorm(z,NORM_2,&norm));
431 PetscCall(VecScale(z,1.0/norm));
432 PetscCall(VecCopy(z,y));
433 PetscCall(VecDestroy(&z));
434 }
435
7/10
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 4 times.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
125 if (eps->balance!=EPS_BALANCE_NONE && eps->D) PetscCall(VecPointwiseDivide(y,y,eps->D));
436 } else
437 #endif
438
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
4066 PetscCall(VecSet(y,0.0));
439
440 /* normalize eigenvectors (when using balancing) */
441
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
4191 if (eps->balance!=EPS_BALANCE_NONE && eps->D) {
442 #if !defined(PETSC_USE_COMPLEX)
443
5/8
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ 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.
60 if (Zi) PetscCall(VecNormalizeComplex(x,y,PETSC_TRUE,NULL));
444 else
445 #endif
446
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.
80 PetscCall(VecNormalize(x,NULL));
447 }
448
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.
4191 PetscCall(BVSetActiveColumns(V,l,k));
449
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);
450 }
451
452 /*
453 EPSBuildBalance_Krylov - uses a Krylov subspace method to compute the
454 diagonal matrix to be applied for balancing in non-Hermitian problems.
455 */
456 130 PetscErrorCode EPSBuildBalance_Krylov(EPS eps)
457 {
458 130 Vec z,p,r;
459 130 PetscInt i,j;
460 130 PetscReal norma;
461 130 PetscScalar *pz,*pD;
462 130 const PetscScalar *pr,*pp;
463 130 PetscRandom rand;
464
465
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
130 PetscFunctionBegin;
466
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.
130 PetscCall(EPSSetWorkVecs(eps,3));
467
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.
130 PetscCall(BVGetRandomContext(eps->V,&rand));
468 130 r = eps->work[0];
469 130 p = eps->work[1];
470 130 z = eps->work[2];
471
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.
130 PetscCall(VecSet(eps->D,1.0));
472
473
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
780 for (j=0;j<eps->balance_its;j++) {
474
475 /* Build a random vector of +-1's */
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.
650 PetscCall(VecSetRandom(z,rand));
477
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.
650 PetscCall(VecGetArray(z,&pz));
478
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
50950 for (i=0;i<eps->nloc;i++) {
479
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
50300 if (PetscRealPart(pz[i])<0.5) pz[i]=-1.0;
480 24425 else pz[i]=1.0;
481 }
482
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.
650 PetscCall(VecRestoreArray(z,&pz));
483
484 /* Compute p=DA(D\z) */
485
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.
650 PetscCall(VecPointwiseDivide(r,z,eps->D));
486
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.
650 PetscCall(STApply(eps->st,r,p));
487
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.
650 PetscCall(VecPointwiseMult(p,p,eps->D));
488
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
650 if (eps->balance == EPS_BALANCE_TWOSIDE) {
489
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
400 if (j==0) {
490 /* Estimate the matrix inf-norm */
491
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.
80 PetscCall(VecAbs(p));
492
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.
80 PetscCall(VecMax(p,NULL,&norma));
493 }
494 /* Compute r=D\(A'Dz) */
495
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.
400 PetscCall(VecPointwiseMult(z,z,eps->D));
496
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.
400 PetscCall(STApplyHermitianTranspose(eps->st,z,r));
497
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.
400 PetscCall(VecPointwiseDivide(r,r,eps->D));
498 }
499
500 /* Adjust values of D */
501
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.
650 PetscCall(VecGetArrayRead(r,&pr));
502
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.
650 PetscCall(VecGetArrayRead(p,&pp));
503
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.
650 PetscCall(VecGetArray(eps->D,&pD));
504
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
50950 for (i=0;i<eps->nloc;i++) {
505
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
50300 if (eps->balance == EPS_BALANCE_TWOSIDE) {
506
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
29000 if (PetscAbsScalar(pp[i])>eps->balance_cutoff*norma && pr[i]!=0.0)
507 28240 pD[i] *= PetscSqrtReal(PetscAbsScalar(pr[i]/pp[i]));
508 } else {
509
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
21300 if (pp[i]!=0.0) pD[i] /= PetscAbsScalar(pp[i]);
510 }
511 }
512
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.
650 PetscCall(VecRestoreArrayRead(r,&pr));
513
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.
650 PetscCall(VecRestoreArrayRead(p,&pp));
514
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.
650 PetscCall(VecRestoreArray(eps->D,&pD));
515 }
516
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);
517 }
518