GCC Code Coverage Report


Directory: ./
File: src/eps/interface/epsdefault.c
Date: 2025-10-04 04:19:13
Exec Total Coverage
Lines: 224 235 95.3%
Functions: 14 14 100.0%
Branches: 630 1066 59.1%

Line Branch Exec Source
1 /*
2 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
3 SLEPc - Scalable Library for Eigenvalue Problem Computations
4 Copyright (c) 2002-, Universitat Politecnica de Valencia, Spain
5
6 This file is part of SLEPc.
7 SLEPc is distributed under a 2-clause BSD license (see LICENSE).
8 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
9 */
10 /*
11 This file contains some simple default routines for common operations
12 */
13
14 #include <slepc/private/epsimpl.h> /*I "slepceps.h" I*/
15 #include <slepcvec.h>
16
17 6957 PetscErrorCode EPSBackTransform_Default(EPS eps)
18 {
19
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
6957 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.
6957 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.
1316 PetscFunctionReturn(PETSC_SUCCESS);
22 }
23
24 /*
25 EPSComputeVectors_Hermitian - Copies the Lanczos vectors as eigenvectors
26 using purification for generalized eigenproblems.
27 */
28 2985 PetscErrorCode EPSComputeVectors_Hermitian(EPS eps)
29 {
30 2985 PetscBool iscayley,indef;
31 2985 Mat B,C;
32
33
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2985 PetscFunctionBegin;
34
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2985 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.
2337 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.
2337 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.
581 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 3535 PetscErrorCode EPSComputeVectors_Schur(EPS eps)
106 {
107 3535 PetscInt i;
108 3535 Mat Z;
109 3535 Vec z;
110
111
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
3535 PetscFunctionBegin;
112
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3535 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.
552 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.
552 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.
552 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.
2983 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.
2983 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.
2983 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.
2983 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.
2983 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.
2983 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.
2983 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.
2983 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.
557 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 - eigensolver context
178 - nw - number of work vectors to allocate
179
180 Developer Notes:
181 This is SLEPC_EXTERN because it may be required by user plugin EPS
182 implementations.
183
184 Level: developer
185
186 .seealso: EPSSetUp()
187 @*/
188 44652 PetscErrorCode EPSSetWorkVecs(EPS eps,PetscInt nw)
189 {
190 44652 Vec t;
191
192
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
44652 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.
44652 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.
44652 PetscValidLogicalCollectiveInt(eps,nw,2);
195
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
44652 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.
44652 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.
7406 PetscCall(VecDestroyVecs(eps->nwork,&eps->work));
198 7406 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.
7406 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.
7406 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.
7406 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.
8821 PetscFunctionReturn(PETSC_SUCCESS);
204 }
205
206 /*
207 EPSSetWhichEigenpairs_Default - Sets the default value for which,
208 depending on the ST.
209 */
210 1238 PetscErrorCode EPSSetWhichEigenpairs_Default(EPS eps)
211 {
212 1238 PetscBool target;
213
214
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1238 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.
1238 PetscCall(PetscObjectTypeCompareAny((PetscObject)eps->st,&target,STSINVERT,STCAYLEY,""));
216
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1238 if (target) eps->which = EPS_TARGET_MAGNITUDE;
217 1006 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.
232 PetscFunctionReturn(PETSC_SUCCESS);
219 }
220
221 /*
222 EPSConvergedRelative - Checks convergence relative to the eigenvalue.
223 */
224 469538 PetscErrorCode EPSConvergedRelative(EPS eps,PetscScalar eigr,PetscScalar eigi,PetscReal res,PetscReal *errest,void *ctx)
225 {
226 469538 PetscReal w;
227
228
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
469538 PetscFunctionBegin;
229 469538 w = SlepcAbsEigenvalue(eigr,eigi);
230
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
469538 *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.
469538 PetscFunctionReturn(PETSC_SUCCESS);
232 }
233
234 /*
235 EPSConvergedAbsolute - Checks convergence absolutely.
236 */
237 27554 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.
27554 PetscFunctionBegin;
240 27554 *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.
27554 PetscFunctionReturn(PETSC_SUCCESS);
242 }
243
244 /*
245 EPSConvergedNorm - Checks convergence relative to the eigenvalue and
246 the matrix norms.
247 */
248 56321 PetscErrorCode EPSConvergedNorm(EPS eps,PetscScalar eigr,PetscScalar eigi,PetscReal res,PetscReal *errest,void *ctx)
249 {
250 56321 PetscReal w;
251
252
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
56321 PetscFunctionBegin;
253 56321 w = SlepcAbsEigenvalue(eigr,eigi);
254 56321 *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.
56321 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 - eigensolver context obtained from EPSCreate()
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 A positive value of reason indicates that the iteration has finished successfully
277 (converged), and a negative value indicates an error condition (diverged). If
278 the iteration needs to be continued, reason must be set to EPS_CONVERGED_ITERATING
279 (zero).
280
281 EPSStoppingBasic() will stop if all requested eigenvalues are converged, or if
282 the maximum number of iterations has been reached.
283
284 Use EPSSetStoppingTest() to provide your own test instead of using this one.
285
286 Level: advanced
287
288 .seealso: EPSSetStoppingTest(), EPSStoppingThreshold(), EPSConvergedReason, EPSGetConvergedReason()
289 @*/
290 437083 PetscErrorCode EPSStoppingBasic(EPS eps,PetscInt its,PetscInt max_it,PetscInt nconv,PetscInt nev,EPSConvergedReason *reason,void *ctx)
291 {
292
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
437083 PetscFunctionBegin;
293 437083 *reason = EPS_CONVERGED_ITERATING;
294
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
437083 if (nconv >= nev) {
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.
8253 PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: %" PetscInt_FMT " eigenpairs converged at iteration %" PetscInt_FMT "\n",nconv,its));
296 8253 *reason = EPS_CONVERGED_TOL;
297
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
428830 } else if (its >= max_it) {
298 130 *reason = EPS_DIVERGED_ITS;
299
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));
300 }
301
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.
86599 PetscFunctionReturn(PETSC_SUCCESS);
302 }
303
304 /*@C
305 EPSStoppingThreshold - Routine to determine whether the outer eigenvalue solver
306 iteration must be stopped, according to some threshold for the computed values.
307
308 Collective
309
310 Input Parameters:
311 + eps - eigenvalue solver context obtained from EPSCreate()
312 . its - current number of iterations
313 . max_it - maximum number of iterations
314 . nconv - number of currently converged eigenpairs (ignored here)
315 . nev - number of requested eigenpairs (ignored here)
316 - ctx - context containing additional data (EPSStoppingCtx)
317
318 Output Parameter:
319 . reason - result of the stopping test
320
321 Notes:
322 A positive value of reason indicates that the iteration has finished successfully
323 (converged), and a negative value indicates an error condition (diverged). If
324 the iteration needs to be continued, reason must be set to EPS_CONVERGED_ITERATING
325 (zero).
326
327 EPSStoppingThreshold() will stop when one of the computed eigenvalues is not
328 above/below the threshold given at EPSSetThreshold(). If a number of wanted
329 eigenvalues has been specified via EPSSetDimensions() then it is also taken into
330 account, and the solver will stop when one of the two conditions (threshold or
331 number of converged values) is met.
332
333 Use EPSSetStoppingTest() to provide your own test instead of using this one.
334
335 Level: advanced
336
337 .seealso: EPSSetStoppingTest(), EPSStoppingBasic(), EPSSetThreshold(), EPSSetDimensions(), EPSConvergedReason, EPSGetConvergedReason()
338 @*/
339 9005 PetscErrorCode EPSStoppingThreshold(EPS eps,PetscInt its,PetscInt max_it,PetscInt nconv,PetscInt nev,EPSConvergedReason *reason,void *ctx)
340 {
341 9005 PetscReal thres,firstev,lastev;
342 9005 PetscBool magnit,rel;
343 9005 EPSWhich which;
344
345
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
9005 PetscFunctionBegin;
346 9005 *reason = EPS_CONVERGED_ITERATING;
347 9005 firstev = ((EPSStoppingCtx)ctx)->firstev;
348 9005 lastev = ((EPSStoppingCtx)ctx)->lastev;
349 9005 thres = ((EPSStoppingCtx)ctx)->thres;
350 9005 rel = ((EPSStoppingCtx)ctx)->threlative;
351 9005 which = ((EPSStoppingCtx)ctx)->which;
352 9005 magnit = (which==EPS_SMALLEST_MAGNITUDE || which==EPS_LARGEST_MAGNITUDE || which==EPS_TARGET_MAGNITUDE)? PETSC_TRUE: PETSC_FALSE;
353
18/18
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
✓ 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 10 times.
✓ Branch 15 taken 10 times.
✓ Branch 16 taken 2 times.
✓ Branch 17 taken 2 times.
9005 if (nconv && magnit && which==EPS_TARGET_MAGNITUDE && ((rel && ((thres>1.0 && lastev>thres*firstev) || (thres<1.0 && lastev<thres*firstev))) || (!rel && lastev>thres))) {
354
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.
30 if (!rel) PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: the eigenvalue magnitude %g is above the threshold %g\n",(double)lastev,(double)thres));
355
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.
20 else if (thres>1.0) PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: the ratio %g/%g is above the threshold %g\n",(double)lastev,(double)firstev,(double)thres));
356
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)lastev,(double)firstev,(double)thres));
357 30 *reason = EPS_CONVERGED_TOL;
358
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 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 8 times.
✓ Branch 9 taken 10 times.
✓ Branch 10 taken 8 times.
✓ Branch 11 taken 8 times.
✓ Branch 12 taken 10 times.
✓ Branch 13 taken 10 times.
✓ Branch 14 taken 2 times.
✓ Branch 15 taken 2 times.
8975 } else if (nconv && magnit && ((which==EPS_LARGEST_MAGNITUDE && ((rel && lastev<thres*firstev) || (!rel && lastev<thres))) || (which==EPS_SMALLEST_MAGNITUDE && lastev>thres))) {
359
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.
112 if (which==EPS_SMALLEST_MAGNITUDE) PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: the eigenvalue magnitude %g is above the threshold %g\n",(double)lastev,(double)thres));
360
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
42 else if (!rel) PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: the eigenvalue magnitude %g is below the threshold %g\n",(double)lastev,(double)thres));
361
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)lastev,(double)firstev,(double)thres));
362 112 *reason = EPS_CONVERGED_TOL;
363
1/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
8863 } else if (nconv && !magnit && ((which==EPS_LARGEST_REAL && lastev<thres) || (which==EPS_SMALLEST_REAL && lastev>thres))) {
364 if (which==EPS_LARGEST_REAL) PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: eigenvalue %g is below the threshold %g\n",(double)lastev,(double)thres));
365 else PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: eigenvalue %g is above the threshold %g\n",(double)lastev,(double)thres));
366 *reason = EPS_CONVERGED_TOL;
367
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 10 times.
8863 } else if (nev && nconv >= nev) {
368
3/6
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
4 PetscCall(PetscInfo(eps,"Linear eigensolver finished successfully: %" PetscInt_FMT " eigenpairs converged at iteration %" PetscInt_FMT "\n",nconv,its));
369 4 *reason = EPS_CONVERGED_TOL;
370
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
8859 } else if (its >= max_it) {
371 *reason = EPS_DIVERGED_ITS;
372 PetscCall(PetscInfo(eps,"Linear eigensolver iteration reached maximum number of iterations (%" PetscInt_FMT ")\n",its));
373 }
374
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.
1841 PetscFunctionReturn(PETSC_SUCCESS);
375 }
376
377 /*
378 EPSComputeRitzVector - Computes the current Ritz vector.
379
380 Simple case (complex scalars or real scalars with Zi=NULL):
381 x = V*Zr (V is a basis of nv vectors, Zr has length nv)
382
383 Split case:
384 x = V*Zr y = V*Zi (Zr and Zi have length nv)
385 */
386 4191 PetscErrorCode EPSComputeRitzVector(EPS eps,PetscScalar *Zr,PetscScalar *Zi,BV V,Vec x,Vec y)
387 {
388 4191 PetscInt l,k;
389 4191 PetscReal norm;
390 #if !defined(PETSC_USE_COMPLEX)
391 2060 Vec z;
392 #endif
393
394
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
4191 PetscFunctionBegin;
395 /* compute eigenvector */
396
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));
397
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));
398
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));
399
400 /* purify eigenvector if necessary */
401
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4191 if (eps->purify) {
402
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));
403
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));
404
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));
405
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));
406
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));
407 }
408 /* fix eigenvector if balancing is used */
409
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));
410 #if !defined(PETSC_USE_COMPLEX)
411 /* compute imaginary part of eigenvector */
412
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
2060 if (Zi) {
413
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));
414
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
125 if (eps->ispositive) {
415 PetscCall(BVCreateVec(V,&z));
416 PetscCall(STApply(eps->st,y,z));
417 PetscCall(VecNorm(z,NORM_2,&norm));
418 PetscCall(VecScale(z,1.0/norm));
419 PetscCall(VecCopy(z,y));
420 PetscCall(VecDestroy(&z));
421 }
422
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));
423 } else
424 #endif
425
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));
426
427 /* normalize eigenvectors (when using balancing) */
428
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) {
429 #if !defined(PETSC_USE_COMPLEX)
430
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));
431 else
432 #endif
433
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));
434 }
435
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));
436
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
803 PetscFunctionReturn(PETSC_SUCCESS);
437 }
438
439 /*
440 EPSBuildBalance_Krylov - uses a Krylov subspace method to compute the
441 diagonal matrix to be applied for balancing in non-Hermitian problems.
442 */
443 130 PetscErrorCode EPSBuildBalance_Krylov(EPS eps)
444 {
445 130 Vec z,p,r;
446 130 PetscInt i,j;
447 130 PetscReal norma;
448 130 PetscScalar *pz,*pD;
449 130 const PetscScalar *pr,*pp;
450 130 PetscRandom rand;
451
452
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
130 PetscFunctionBegin;
453
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));
454
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));
455 130 r = eps->work[0];
456 130 p = eps->work[1];
457 130 z = eps->work[2];
458
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));
459
460
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
780 for (j=0;j<eps->balance_its;j++) {
461
462 /* Build a random vector of +-1's */
463
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));
464
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));
465
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
50950 for (i=0;i<eps->nloc;i++) {
466
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
50300 if (PetscRealPart(pz[i])<0.5) pz[i]=-1.0;
467 24425 else pz[i]=1.0;
468 }
469
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));
470
471 /* Compute p=DA(D\z) */
472
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));
473
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));
474
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));
475
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
650 if (eps->balance == EPS_BALANCE_TWOSIDE) {
476
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
400 if (j==0) {
477 /* Estimate the matrix inf-norm */
478
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));
479
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));
480 }
481 /* Compute r=D\(A'Dz) */
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.
400 PetscCall(VecPointwiseMult(z,z,eps->D));
483
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));
484
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));
485 }
486
487 /* Adjust values of D */
488
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));
489
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));
490
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));
491
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
50950 for (i=0;i<eps->nloc;i++) {
492
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
50300 if (eps->balance == EPS_BALANCE_TWOSIDE) {
493
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)
494 28240 pD[i] *= PetscSqrtReal(PetscAbsScalar(pr[i]/pp[i]));
495 } else {
496
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
21300 if (pp[i]!=0.0) pD[i] /= PetscAbsScalar(pp[i]);
497 }
498 }
499
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));
500
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));
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(VecRestoreArray(eps->D,&pD));
502 }
503
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);
504 }
505