GCC Code Coverage Report


Directory: ./
File: src/eps/interface/epsdefault.c
Date: 2026-10-22 02:08:06
Exec Total Coverage
Lines: 235 253 92.9%
Functions: 14 14 100.0%
Branches: 682 1184 57.6%

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 8459 PetscErrorCode EPSBackTransform_Default(EPS eps)
18 {
19
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
8459 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.
8459 PetscCall(STBackTransform(eps->st,eps->nconv,eps->eigr,eps->eigi));
21
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
1601 PetscFunctionReturn(PETSC_SUCCESS);
22 }
23
24 /*
25 EPSComputeVectors_Hermitian - Copies the Lanczos vectors as eigenvectors
26 using purification for generalized eigenproblems.
27 */
28 3926 PetscErrorCode EPSComputeVectors_Hermitian(EPS eps)
29 {
30 3926 PetscBool iscayley,indef;
31 3926 Mat B,C;
32
33
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
3926 PetscFunctionBegin;
34
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3926 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.
3278 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.
3278 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
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
768 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
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 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
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 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
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
199 PetscFunctionBegin;
85
10/18
✓ 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 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 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
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 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 3647 PetscErrorCode EPSComputeVectors_Schur(EPS eps)
106 {
107 3647 PetscInt i;
108 3647 Mat Z;
109 3647 Vec z;
110
111
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
3647 PetscFunctionBegin;
112
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3647 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
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 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.
3085 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.
3085 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.
3085 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.
3085 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.
3085 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.
3085 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.
3085 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.
3085 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 !PetscDefined(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
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 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 48019 PetscErrorCode EPSSetWorkVecs(EPS eps,PetscInt nw)
189 {
190 48019 Vec t;
191
192
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
48019 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.
48019 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
194
31/70
✓ 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 not taken.
✓ Branch 9 taken 2 times.
✓ 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.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ 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 not taken.
✓ Branch 35 taken 2 times.
✓ Branch 36 taken 2 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 2 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 2 times.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✓ Branch 47 taken 2 times.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✓ Branch 51 taken 2 times.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✓ Branch 56 taken 2 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 2 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 2 times.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✓ Branch 63 taken 2 times.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 66 not taken.
✓ Branch 67 taken 2 times.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
48019 PetscValidLogicalCollectiveInt(eps,nw,2);
195
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
48019 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.
48019 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.
8112 PetscCall(VecDestroyVecs(eps->nwork,&eps->work));
198 8112 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.
8112 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.
8112 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.
8112 PetscCall(BVRestoreColumn(eps->V,0,&t));
202 }
203
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
9425 PetscFunctionReturn(PETSC_SUCCESS);
204 }
205
206 /*
207 EPSSetWhichEigenpairs_Default - Sets the default value for which,
208 depending on the ST.
209 */
210 1245 PetscErrorCode EPSSetWhichEigenpairs_Default(EPS eps)
211 {
212 1245 PetscBool target;
213
214
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
1245 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.
1245 PetscCall(PetscObjectTypeCompareAny((PetscObject)eps->st,&target,STSINVERT,STCAYLEY,""));
216
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1245 if (target) eps->which = EPS_TARGET_MAGNITUDE;
217 1018 else eps->which = EPS_LARGEST_MAGNITUDE;
218
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
233 PetscFunctionReturn(PETSC_SUCCESS);
219 }
220
221 /*
222 EPSConvergedRelative - Checks convergence relative to the eigenvalue.
223 */
224 484881 PetscErrorCode EPSConvergedRelative(EPS eps,PetscScalar eigr,PetscScalar eigi,PetscReal res,PetscReal *errest,void *ctx)
225 {
226 484881 PetscReal w;
227
228
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
484881 PetscFunctionBegin;
229 484881 w = SlepcAbsEigenvalue(eigr,eigi);
230
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
484881 *errest = (w!=0.0)? res/w: PETSC_MAX_REAL;
231
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
484881 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
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
27744 PetscFunctionBegin;
240 27744 *errest = res;
241
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 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 56403 PetscErrorCode EPSConvergedNorm(EPS eps,PetscScalar eigr,PetscScalar eigi,PetscReal res,PetscReal *errest,void *ctx)
249 {
250 56403 PetscReal w;
251
252
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
56403 PetscFunctionBegin;
253 56403 w = SlepcAbsEigenvalue(eigr,eigi);
254 56403 *errest = res / (eps->nrma + w*eps->nrmb);
255
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
56403 PetscFunctionReturn(PETSC_SUCCESS);
256 }
257
258 /*@
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 438647 PetscErrorCode EPSStoppingBasic(EPS eps,PetscInt its,PetscInt max_it,PetscInt nconv,PetscInt nev,EPSConvergedReason *reason,void *ctx)
287 {
288
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
438647 PetscFunctionBegin;
289 438647 *reason = EPS_CONVERGED_ITERATING;
290
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
438647 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.
9524 PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: %" PetscInt_FMT " eigenpairs converged at iteration %" PetscInt_FMT "\n",nconv,its));
292 9524 *reason = EPS_CONVERGED_TOL;
293
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
429123 } 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
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
86886 PetscFunctionReturn(PETSC_SUCCESS);
298 }
299
300 /*@
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 11297 PetscErrorCode EPSStoppingThreshold(EPS eps,PetscInt its,PetscInt max_it,PetscInt nconv,PetscInt nev,EPSConvergedReason *reason,void *ctx)
331 {
332 11297 PetscReal thres,firstev,firstnc,errest;
333 11297 PetscBool magnit,rel;
334 11297 PetscInt napprox;
335 11297 EPSWhich which;
336
337
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
11297 PetscFunctionBegin;
338 11297 *reason = EPS_CONVERGED_ITERATING;
339 11297 firstev = ((EPSStoppingCtx)ctx)->firstev;
340 11297 firstnc = ((EPSStoppingCtx)ctx)->firstnc;
341 11297 errest = ((EPSStoppingCtx)ctx)->errest;
342 11297 thres = ((EPSStoppingCtx)ctx)->thres;
343 11297 rel = ((EPSStoppingCtx)ctx)->threlative;
344 11297 napprox = ((EPSStoppingCtx)ctx)->napprox;
345 11297 which = ((EPSStoppingCtx)ctx)->which;
346
347
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
11297 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
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
4572 PetscFunctionReturn(PETSC_SUCCESS);
353 }
354
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
6725 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 6725 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 8 times.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 5 times.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 7 times.
✓ Branch 9 taken 5 times.
✓ Branch 10 taken 10 times.
✓ Branch 11 taken 7 times.
✓ Branch 12 taken 10 times.
✓ Branch 13 taken 10 times.
✓ Branch 14 taken 1 times.
✓ Branch 15 taken 1 times.
6725 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.
6651 } 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.
695 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.
335 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.
245 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 335 *reason = EPS_CONVERGED_TOL;
373 360 } 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 4 times.
✓ Branch 1 taken 10 times.
5956 } else if (nev && nconv >= nev) {
381
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.
5 PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: %" PetscInt_FMT " eigenpairs converged at iteration %" PetscInt_FMT "\n",nconv,its));
382 5 *reason = EPS_CONVERGED_TOL;
383
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
5951 } 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
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 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 !PetscDefined(USE_COMPLEX)
404 2060 Vec z;
405 #endif
406
407
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 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 !PetscDefined(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 !PetscDefined(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
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 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
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 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
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
26 PetscFunctionReturn(PETSC_SUCCESS);
517 }
518