GCC Code Coverage Report


Directory: ./
File: src/eps/impls/krylov/lanczos/lanczos.c
Date: 2025-10-03 04:28:47
Exec Total Coverage
Lines: 462 493 93.7%
Functions: 17 18 94.4%
Branches: 926 1596 58.0%

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 SLEPc eigensolver: "lanczos"
12
13 Method: Explicitly Restarted Symmetric/Hermitian Lanczos
14
15 Algorithm:
16
17 Lanczos method for symmetric (Hermitian) problems, with explicit
18 restart and deflation. Several reorthogonalization strategies can
19 be selected.
20
21 References:
22
23 [1] "Lanczos Methods in SLEPc", SLEPc Technical Report STR-5,
24 available at https://slepc.upv.es.
25 */
26
27 #include <slepc/private/epsimpl.h> /*I "slepceps.h" I*/
28 #include <slepcblaslapack.h>
29
30 typedef struct {
31 EPSLanczosReorthogType reorthog; /* user-provided reorthogonalization parameter */
32 PetscInt allocsize; /* number of columns of work BV's allocated at setup */
33 BV AV; /* work BV used in selective reorthogonalization */
34 } EPS_LANCZOS;
35
36 364 static PetscErrorCode EPSSetUp_Lanczos(EPS eps)
37 {
38 364 EPS_LANCZOS *lanczos = (EPS_LANCZOS*)eps->data;
39 364 BVOrthogRefineType refine;
40 364 BVOrthogBlockType btype;
41 364 PetscReal eta;
42
43
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
364 PetscFunctionBegin;
44
4/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
364 EPSCheckHermitianDefinite(eps);
45
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
364 EPSCheckNotStructured(eps);
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.
364 PetscCall(EPSSetDimensions_Default(eps,&eps->nev,&eps->ncv,&eps->mpd));
47
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
364 PetscCheck(eps->ncv<=eps->nev+eps->mpd,PetscObjectComm((PetscObject)eps),PETSC_ERR_USER_INPUT,"The value of ncv must not be larger than nev+mpd");
48
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
364 if (eps->max_it==PETSC_DETERMINE) eps->max_it = PetscMax(100,2*eps->n/eps->ncv);
49
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.
364 if (!eps->which) PetscCall(EPSSetWhichEigenpairs_Default(eps));
50
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
364 PetscCheck(eps->which!=EPS_ALL,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"This solver does not support computing all eigenvalues");
51
9/22
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 10 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 10 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
364 EPSCheckUnsupported(eps,EPS_FEATURE_ARBITRARY | EPS_FEATURE_REGION | EPS_FEATURE_EXTRACTION | EPS_FEATURE_THRESHOLD);
52
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.
364 EPSCheckIgnored(eps,EPS_FEATURE_BALANCE);
53
54
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
364 PetscCheck(lanczos->reorthog!=(EPSLanczosReorthogType)-1,PetscObjectComm((PetscObject)eps),PETSC_ERR_USER_INPUT,"You should explicitly provide the reorthogonalization type, e.g., -eps_lanczos_reorthog local. Note that the EPSLANCZOS solver is *NOT RECOMMENDED* for general use, because it uses explicit restart which typically has slow convergence. The recommended solver is EPSKRYLOVSCHUR (the default), which implements Lanczos with thick restart in the case of symmetric/Hermitian problems");
55
56
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
364 PetscCall(EPSAllocateSolution(eps,1));
57
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
364 PetscCall(EPS_SetInnerProduct(eps));
58
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
364 if (lanczos->reorthog != EPS_LANCZOS_REORTHOG_FULL) {
59
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
290 PetscCall(BVGetOrthogonalization(eps->V,NULL,&refine,&eta,&btype));
60
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
290 PetscCall(BVSetOrthogonalization(eps->V,BV_ORTHOG_MGS,refine,eta,btype));
61
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
290 PetscCall(PetscInfo(eps,"Switching to MGS orthogonalization\n"));
62 }
63
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
364 if (lanczos->reorthog == EPS_LANCZOS_REORTHOG_SELECTIVE) {
64
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
30 if (!lanczos->allocsize) {
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.
10 PetscCall(BVDuplicate(eps->V,&lanczos->AV));
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.
10 PetscCall(BVGetSizes(lanczos->AV,NULL,NULL,&lanczos->allocsize));
67 } else { /* make sure V and AV have the same size */
68
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
20 PetscCall(BVGetSizes(eps->V,NULL,NULL,&lanczos->allocsize));
69
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
20 PetscCall(BVResize(lanczos->AV,lanczos->allocsize,PETSC_FALSE));
70 }
71 }
72
73
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
364 PetscCall(DSSetType(eps->ds,DSHEP));
74
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
364 PetscCall(DSSetCompact(eps->ds,PETSC_TRUE));
75
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
364 PetscCall(DSAllocate(eps->ds,eps->ncv+1));
76
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.
364 if (lanczos->reorthog == EPS_LANCZOS_REORTHOG_LOCAL) PetscCall(EPSSetWorkVecs(eps,1));
77
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.
72 PetscFunctionReturn(PETSC_SUCCESS);
78 }
79
80 /*
81 EPSLocalLanczos - Local reorthogonalization.
82
83 This is the simplest variant. At each Lanczos step, the corresponding Lanczos vector
84 is orthogonalized with respect to the two previous Lanczos vectors, according to
85 the three term Lanczos recurrence. WARNING: This variant does not track the loss of
86 orthogonality that occurs in finite-precision arithmetic and, therefore, the
87 generated vectors are not guaranteed to be (semi-)orthogonal.
88 */
89 5204 static PetscErrorCode EPSLocalLanczos(EPS eps,PetscReal *alpha,PetscReal *beta,PetscInt k,PetscInt *M,PetscBool *breakdown)
90 {
91 5204 PetscInt i,j,m = *M;
92 5204 Mat Op;
93 5204 PetscBool *which,lwhich[100];
94 5204 PetscScalar *hwork,lhwork[100];
95
96
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
5204 PetscFunctionBegin;
97
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.
5204 if (m > 100) PetscCall(PetscMalloc2(m,&which,m,&hwork));
98 else {
99 5204 which = lwhich;
100 5204 hwork = lhwork;
101 }
102
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
18198 for (i=0;i<k;i++) which[i] = PETSC_TRUE;
103
104
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5204 PetscCall(BVSetActiveColumns(eps->V,0,m));
105
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5204 PetscCall(STGetOperator(eps->st,&Op));
106
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
75639 for (j=k;j<m;j++) {
107
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70435 PetscCall(BVMatMultColumn(eps->V,Op,j));
108 70435 which[j] = PETSC_TRUE;
109
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
70435 if (j-2>=k) which[j-2] = PETSC_FALSE;
110
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70435 PetscCall(BVOrthogonalizeSomeColumn(eps->V,j+1,which,hwork,beta+j,breakdown));
111 70435 alpha[j] = PetscRealPart(hwork[j]);
112
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
70435 if (PetscUnlikely(*breakdown)) {
113 *M = j+1;
114 break;
115
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70435 } else PetscCall(BVScaleColumn(eps->V,j+1,1/beta[j]));
116 }
117
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5204 PetscCall(STRestoreOperator(eps->st,&Op));
118
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.
5204 if (m > 100) PetscCall(PetscFree2(which,hwork));
119
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.
1046 PetscFunctionReturn(PETSC_SUCCESS);
120 }
121
122 /*
123 DenseTridiagonal - Solves a real tridiagonal Hermitian Eigenvalue Problem.
124
125 Input Parameters:
126 + n - dimension of the eigenproblem
127 . D - pointer to the array containing the diagonal elements
128 - E - pointer to the array containing the off-diagonal elements
129
130 Output Parameters:
131 + w - pointer to the array to store the computed eigenvalues
132 - V - pointer to the array to store the eigenvectors
133
134 Notes:
135 If V is NULL then the eigenvectors are not computed.
136
137 This routine use LAPACK routines xSTEVR.
138 */
139 6745 static PetscErrorCode DenseTridiagonal(PetscInt n_,PetscReal *D,PetscReal *E,PetscReal *w,PetscScalar *V)
140 {
141 6745 PetscReal abstol = 0.0,vl,vu,*work;
142 6745 PetscBLASInt il,iu,m,*isuppz,n,lwork,*iwork,liwork,info;
143 6745 const char *jobz;
144 #if defined(PETSC_USE_COMPLEX)
145 3380 PetscInt i,j;
146 3380 PetscReal *VV=NULL;
147 #endif
148
149
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
6745 PetscFunctionBegin;
150
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6745 PetscCall(PetscBLASIntCast(n_,&n));
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.
6745 PetscCall(PetscBLASIntCast(20*n_,&lwork));
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.
6745 PetscCall(PetscBLASIntCast(10*n_,&liwork));
153
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
6745 if (V) {
154 3380 jobz = "V";
155 #if defined(PETSC_USE_COMPLEX)
156
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.
3380 PetscCall(PetscMalloc1(n*n,&VV));
157 #endif
158 } else jobz = "N";
159
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6745 PetscCall(PetscMalloc3(2*n,&isuppz,lwork,&work,liwork,&iwork));
160
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6745 PetscCall(PetscFPTrapPush(PETSC_FP_TRAP_OFF));
161 #if defined(PETSC_USE_COMPLEX)
162
10/20
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
3380 PetscCallBLAS("LAPACKstevr",LAPACKstevr_(jobz,"A",&n,D,E,&vl,&vu,&il,&iu,&abstol,&m,w,VV,&n,isuppz,work,&lwork,iwork,&liwork,&info));
163 #else
164
10/20
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
3365 PetscCallBLAS("LAPACKstevr",LAPACKstevr_(jobz,"A",&n,D,E,&vl,&vu,&il,&iu,&abstol,&m,w,V,&n,isuppz,work,&lwork,iwork,&liwork,&info));
165 #endif
166
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6745 PetscCall(PetscFPTrapPop());
167
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6745 SlepcCheckLapackInfo("stevr",info);
168 #if defined(PETSC_USE_COMPLEX)
169
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
3380 if (V) {
170
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
35265 for (i=0;i<n;i++)
171
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
423810 for (j=0;j<n;j++)
172 391925 V[i*n+j] = VV[i*n+j];
173
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.
3380 PetscCall(PetscFree(VV));
174 }
175 #endif
176
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6745 PetscCall(PetscFree3(isuppz,work,iwork));
177
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.
1349 PetscFunctionReturn(PETSC_SUCCESS);
178 }
179
180 /*
181 EPSSelectiveLanczos - Selective reorthogonalization.
182 */
183 380 static PetscErrorCode EPSSelectiveLanczos(EPS eps,PetscReal *alpha,PetscReal *beta,PetscInt k,PetscInt *M,PetscBool *breakdown,PetscReal anorm)
184 {
185 380 EPS_LANCZOS *lanczos = (EPS_LANCZOS*)eps->data;
186 380 PetscInt i,j,m = *M,n,nritz=0,nritzo;
187 380 Vec vj1,av;
188 380 Mat Op;
189 380 PetscReal *d,*e,*ritz,norm;
190 380 PetscScalar *Y,*hwork;
191 380 PetscBool *which;
192
193
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
380 PetscFunctionBegin;
194
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
380 PetscCall(PetscCalloc6(m+1,&d,m,&e,m,&ritz,m*m,&Y,m,&which,m,&hwork));
195
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
855 for (i=0;i<k;i++) which[i] = PETSC_TRUE;
196
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
380 PetscCall(STGetOperator(eps->st,&Op));
197
198
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
7125 for (j=k;j<m;j++) {
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.
6745 PetscCall(BVSetActiveColumns(eps->V,0,m));
200
201 /* Lanczos step */
202
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6745 PetscCall(BVMatMultColumn(eps->V,Op,j));
203 6745 which[j] = PETSC_TRUE;
204
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6745 if (j-2>=k) which[j-2] = PETSC_FALSE;
205
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6745 PetscCall(BVOrthogonalizeSomeColumn(eps->V,j+1,which,hwork,&norm,breakdown));
206 6745 alpha[j] = PetscRealPart(hwork[j]);
207 6745 beta[j] = norm;
208
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
6745 if (PetscUnlikely(*breakdown)) {
209 *M = j+1;
210 break;
211 }
212
213 /* Compute eigenvalues and eigenvectors Y of the tridiagonal block */
214 6745 n = j-k+1;
215
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
70235 for (i=0;i<n;i++) {
216 63490 d[i] = alpha[i+k];
217 63490 e[i] = beta[i+k];
218 }
219
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6745 PetscCall(DenseTridiagonal(n,d,e,ritz,Y));
220
221 /* Estimate ||A|| */
222
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
70235 for (i=0;i<n;i++)
223
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
63490 if (PetscAbsReal(ritz[i]) > anorm) anorm = PetscAbsReal(ritz[i]);
224
225 /* Compute nearly converged Ritz vectors */
226 nritzo = 0;
227
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
70235 for (i=0;i<n;i++) {
228
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
63490 if (norm*PetscAbsScalar(Y[i*n+n-1]) < PETSC_SQRT_MACHINE_EPSILON*anorm) nritzo++;
229 }
230
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6745 if (nritzo>nritz) {
231 nritz = 0;
232
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1780 for (i=0;i<n;i++) {
233
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1555 if (norm*PetscAbsScalar(Y[i*n+n-1]) < PETSC_SQRT_MACHINE_EPSILON*anorm) {
234
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
345 PetscCall(BVSetActiveColumns(eps->V,k,k+n));
235
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
345 PetscCall(BVGetColumn(lanczos->AV,nritz,&av));
236
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
345 PetscCall(BVMultVec(eps->V,1.0,0.0,av,Y+i*n));
237
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
345 PetscCall(BVRestoreColumn(lanczos->AV,nritz,&av));
238 345 nritz++;
239 }
240 }
241 }
242
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6745 if (nritz > 0) {
243
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2510 PetscCall(BVGetColumn(eps->V,j+1,&vj1));
244
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2510 PetscCall(BVSetActiveColumns(lanczos->AV,0,nritz));
245
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2510 PetscCall(BVOrthogonalizeVec(lanczos->AV,vj1,hwork,&norm,breakdown));
246
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2510 PetscCall(BVRestoreColumn(eps->V,j+1,&vj1));
247
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
2510 if (PetscUnlikely(*breakdown)) {
248 *M = j+1;
249 break;
250 }
251 }
252
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
6745 PetscCall(BVScaleColumn(eps->V,j+1,1.0/norm));
253 }
254
255
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
380 PetscCall(STRestoreOperator(eps->st,&Op));
256
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
380 PetscCall(PetscFree6(d,e,ritz,Y,which,hwork));
257
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.
76 PetscFunctionReturn(PETSC_SUCCESS);
258 }
259
260 8050 static void update_omega(PetscReal *omega,PetscReal *omega_old,PetscInt j,PetscReal *alpha,PetscReal *beta,PetscReal eps1,PetscReal anorm)
261 {
262 8050 PetscInt k;
263 8050 PetscReal T,binv;
264
265
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
8050 PetscFunctionBegin;
266 /* Estimate of contribution to roundoff errors from A*v
267 fl(A*v) = A*v + f,
268 where ||f|| \approx eps1*||A||.
269 For a full matrix A, a rule-of-thumb estimate is eps1 = sqrt(n)*eps */
270 8050 T = eps1*anorm;
271 8050 binv = 1.0/beta[j+1];
272
273 /* Update omega(1) using omega(0)==0 */
274 8050 omega_old[0]= beta[1]*omega[1] + (alpha[0]-alpha[j])*omega[0] - beta[j]*omega_old[0];
275
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
8050 if (omega_old[0] > 0) omega_old[0] = binv*(omega_old[0] + T);
276 4835 else omega_old[0] = binv*(omega_old[0] - T);
277
278 /* Update remaining components */
279
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
73230 for (k=1;k<j-1;k++) {
280 65180 omega_old[k] = beta[k+1]*omega[k+1] + (alpha[k]-alpha[j])*omega[k] + beta[k]*omega[k-1] - beta[j]*omega_old[k];
281
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
65180 if (omega_old[k] > 0) omega_old[k] = binv*(omega_old[k] + T);
282 33928 else omega_old[k] = binv*(omega_old[k] - T);
283 }
284 8050 omega_old[j-1] = binv*T;
285
286 /* Swap omega and omega_old */
287
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
89150 for (k=0;k<j;k++) {
288 81100 omega[k] = omega_old[k];
289 81100 omega_old[k] = omega[k];
290 }
291 8050 omega[j] = eps1;
292
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.
8050 PetscFunctionReturnVoid();
293 }
294
295 505 static void compute_int(PetscBool *which,PetscReal *mu,PetscInt j,PetscReal delta,PetscReal eta)
296 {
297 505 PetscInt i,k,maxpos;
298 505 PetscReal max;
299 505 PetscBool found;
300
301
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
505 PetscFunctionBegin;
302 /* initialize which */
303 505 found = PETSC_FALSE;
304 505 maxpos = 0;
305 505 max = 0.0;
306
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
7990 for (i=0;i<j;i++) {
307
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
7485 if (PetscAbsReal(mu[i]) >= delta) {
308 1820 which[i] = PETSC_TRUE;
309 1820 found = PETSC_TRUE;
310 5665 } else which[i] = PETSC_FALSE;
311
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
7485 if (PetscAbsReal(mu[i]) > max) {
312 830 maxpos = i;
313 830 max = PetscAbsReal(mu[i]);
314 }
315 }
316
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
505 if (!found) which[maxpos] = PETSC_TRUE;
317
318
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
7990 for (i=0;i<j;i++) {
319
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
7485 if (which[i]) {
320 /* find left interval */
321
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
6560 for (k=i;k>=0;k--) {
322
2/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
6560 if (PetscAbsReal(mu[k])<eta || which[k]) break;
323 else which[k] = PETSC_TRUE;
324 }
325 /* find right interval */
326
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
11300 for (k=i+1;k<j;k++) {
327
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
10980 if (PetscAbsReal(mu[k])<eta || which[k]) break;
328 4740 else which[k] = PETSC_TRUE;
329 }
330 }
331 }
332
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.
505 PetscFunctionReturnVoid();
333 }
334
335 /*
336 EPSPartialLanczos - Partial reorthogonalization.
337 */
338 760 static PetscErrorCode EPSPartialLanczos(EPS eps,PetscReal *alpha,PetscReal *beta,PetscInt k,PetscInt *M,PetscBool *breakdown,PetscReal anorm)
339 {
340 760 EPS_LANCZOS *lanczos = (EPS_LANCZOS*)eps->data;
341 760 PetscInt i,j,m = *M;
342 760 Mat Op;
343 760 PetscReal norm,*omega,lomega[100],*omega_old,lomega_old[100],eps1,delta,eta;
344 760 PetscBool *which,lwhich[100],*which2,lwhich2[100];
345 760 PetscBool reorth = PETSC_FALSE,force_reorth = PETSC_FALSE;
346 760 PetscBool fro = PETSC_FALSE,estimate_anorm = PETSC_FALSE;
347 760 PetscScalar *hwork,lhwork[100];
348
349
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
760 PetscFunctionBegin;
350
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.
760 if (m>100) PetscCall(PetscMalloc5(m,&omega,m,&omega_old,m,&which,m,&which2,m,&hwork));
351 else {
352 760 omega = lomega;
353 760 omega_old = lomega_old;
354 760 which = lwhich;
355 760 which2 = lwhich2;
356 760 hwork = lhwork;
357 }
358
359 760 eps1 = PetscSqrtReal((PetscReal)eps->n)*PETSC_MACHINE_EPSILON/2;
360 760 delta = PETSC_SQRT_MACHINE_EPSILON/PetscSqrtReal((PetscReal)eps->ncv);
361 760 eta = PetscPowReal(PETSC_MACHINE_EPSILON,3.0/4.0)/PetscSqrtReal((PetscReal)eps->ncv);
362
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
760 if (anorm < 0.0) {
363 60 anorm = 1.0;
364 60 estimate_anorm = PETSC_TRUE;
365 }
366
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
76760 for (i=0;i<PetscMax(100,m);i++) omega[i] = omega_old[i] = 0.0;
367
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1710 for (i=0;i<k;i++) which[i] = PETSC_TRUE;
368
369
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
760 PetscCall(BVSetActiveColumns(eps->V,0,m));
370
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
760 PetscCall(STGetOperator(eps->st,&Op));
371
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
14250 for (j=k;j<m;j++) {
372
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13490 PetscCall(BVMatMultColumn(eps->V,Op,j));
373
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
13490 if (fro) {
374 /* Lanczos step with full reorthogonalization */
375
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
4680 PetscCall(BVOrthogonalizeColumn(eps->V,j+1,hwork,&norm,breakdown));
376 4680 alpha[j] = PetscRealPart(hwork[j]);
377 } else {
378 /* Lanczos step */
379 8810 which[j] = PETSC_TRUE;
380
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
8810 if (j-2>=k) which[j-2] = PETSC_FALSE;
381
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8810 PetscCall(BVOrthogonalizeSomeColumn(eps->V,j+1,which,hwork,&norm,breakdown));
382 8810 alpha[j] = PetscRealPart(hwork[j]);
383 8810 beta[j] = norm;
384
385 /* Estimate ||A|| if needed */
386
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
8810 if (estimate_anorm) {
387
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
1140 if (j>k) anorm = PetscMax(anorm,PetscAbsReal(alpha[j])+norm+beta[j-1]);
388
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
60 else anorm = PetscMax(anorm,PetscAbsReal(alpha[j])+norm);
389 }
390
391 /* Check if reorthogonalization is needed */
392 8810 reorth = PETSC_FALSE;
393
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
8810 if (j>k) {
394 8050 update_omega(omega,omega_old,j,alpha,beta-1,eps1,anorm);
395
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
87950 for (i=0;i<j-k;i++) {
396
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
71850 if (PetscAbsReal(omega[i]) > delta) reorth = PETSC_TRUE;
397 }
398 }
399
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
8810 if (reorth || force_reorth) {
400
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2940 for (i=0;i<k;i++) which2[i] = PETSC_FALSE;
401
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
27790 for (i=k;i<=j;i++) which2[i] = PETSC_TRUE;
402
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1660 if (lanczos->reorthog == EPS_LANCZOS_REORTHOG_PERIODIC) {
403 /* Periodic reorthogonalization */
404
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
820 if (force_reorth) force_reorth = PETSC_FALSE;
405 485 else force_reorth = PETSC_TRUE;
406
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
12880 for (i=0;i<j-k;i++) omega[i] = eps1;
407 } else {
408 /* Partial reorthogonalization */
409
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
840 if (force_reorth) force_reorth = PETSC_FALSE;
410 else {
411 505 force_reorth = PETSC_TRUE;
412 505 compute_int(which2+k,omega,j-k,delta,eta);
413
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
8495 for (i=0;i<j-k;i++) {
414
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
7485 if (which2[i+k]) omega[i] = eps1;
415 }
416 }
417 }
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.
1660 PetscCall(BVOrthogonalizeSomeColumn(eps->V,j+1,which2,hwork,&norm,breakdown));
419 }
420 }
421
422
2/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
13490 if (PetscUnlikely(*breakdown || norm < eps->n*anorm*PETSC_MACHINE_EPSILON)) {
423 *M = j+1;
424 break;
425 }
426
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
13490 if (!fro && norm*delta < anorm*eps1) {
427 280 fro = PETSC_TRUE;
428
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
280 PetscCall(PetscInfo(eps,"Switching to full reorthogonalization at iteration %" PetscInt_FMT "\n",eps->its));
429 }
430 13490 beta[j] = norm;
431
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13490 PetscCall(BVScaleColumn(eps->V,j+1,1.0/norm));
432 }
433
434
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
760 PetscCall(STRestoreOperator(eps->st,&Op));
435
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.
760 if (m>100) PetscCall(PetscFree5(omega,omega_old,which,which2,hwork));
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.
152 PetscFunctionReturn(PETSC_SUCCESS);
437 }
438
439 /*
440 EPSBasicLanczos - Computes an m-step Lanczos factorization. The first k
441 columns are assumed to be locked and therefore they are not modified. On
442 exit, the following relation is satisfied:
443
444 OP * V - V * T = f * e_m^T
445
446 where the columns of V are the Lanczos vectors, T is a tridiagonal matrix,
447 f is the residual vector and e_m is the m-th vector of the canonical basis.
448 The Lanczos vectors (together with vector f) are B-orthogonal (to working
449 accuracy) if full reorthogonalization is being used, otherwise they are
450 (B-)semi-orthogonal. On exit, beta contains the B-norm of f and the next
451 Lanczos vector can be computed as v_{m+1} = f / beta.
452
453 This function simply calls another function which depends on the selected
454 reorthogonalization strategy.
455 */
456 9504 static PetscErrorCode EPSBasicLanczos(EPS eps,PetscInt k,PetscInt *m,PetscReal *betam,PetscBool *breakdown,PetscReal anorm)
457 {
458 9504 EPS_LANCZOS *lanczos = (EPS_LANCZOS*)eps->data;
459 9504 PetscScalar *T;
460 9504 PetscInt i,n=*m,ld;
461 9504 PetscReal *alpha,*beta;
462 9504 BVOrthogRefineType orthog_ref;
463 9504 Mat Op,M;
464
465
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
9504 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.
9504 PetscCall(DSGetLeadingDimension(eps->ds,&ld));
467
5/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
9504 switch (lanczos->reorthog) {
468 5204 case EPS_LANCZOS_REORTHOG_LOCAL:
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.
5204 PetscCall(DSGetArrayReal(eps->ds,DS_MAT_T,&alpha));
470 5204 beta = alpha + ld;
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.
5204 PetscCall(EPSLocalLanczos(eps,alpha,beta,k,m,breakdown));
472 5204 *betam = beta[*m-1];
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.
5204 PetscCall(DSRestoreArrayReal(eps->ds,DS_MAT_T,&alpha));
474 break;
475 2910 case EPS_LANCZOS_REORTHOG_FULL:
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.
2910 PetscCall(STGetOperator(eps->st,&Op));
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.
2910 PetscCall(DSGetMat(eps->ds,DS_MAT_T,&M));
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.
2910 PetscCall(BVMatLanczos(eps->V,Op,M,k,m,betam,breakdown));
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.
2910 PetscCall(DSRestoreMat(eps->ds,DS_MAT_T,&M));
480
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2910 PetscCall(STRestoreOperator(eps->st,&Op));
481 break;
482 380 case EPS_LANCZOS_REORTHOG_SELECTIVE:
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.
380 PetscCall(DSGetArrayReal(eps->ds,DS_MAT_T,&alpha));
484 380 beta = alpha + ld;
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.
380 PetscCall(EPSSelectiveLanczos(eps,alpha,beta,k,m,breakdown,anorm));
486 380 *betam = beta[*m-1];
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.
380 PetscCall(DSRestoreArrayReal(eps->ds,DS_MAT_T,&alpha));
488 break;
489 760 case EPS_LANCZOS_REORTHOG_PERIODIC:
490 case EPS_LANCZOS_REORTHOG_PARTIAL:
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.
760 PetscCall(DSGetArrayReal(eps->ds,DS_MAT_T,&alpha));
492 760 beta = alpha + ld;
493
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
760 PetscCall(EPSPartialLanczos(eps,alpha,beta,k,m,breakdown,anorm));
494 760 *betam = beta[*m-1];
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.
760 PetscCall(DSRestoreArrayReal(eps->ds,DS_MAT_T,&alpha));
496 break;
497 250 case EPS_LANCZOS_REORTHOG_DELAYED:
498
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
250 PetscCall(PetscMalloc1(n*n,&T));
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.
250 PetscCall(BVGetOrthogonalization(eps->V,NULL,&orthog_ref,NULL,NULL));
500
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.
250 if (orthog_ref == BV_ORTHOG_REFINE_NEVER) PetscCall(EPSDelayedArnoldi1(eps,T,n,k,m,betam,breakdown));
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.
250 else PetscCall(EPSDelayedArnoldi(eps,T,n,k,m,betam,breakdown));
502 250 n = *m;
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.
250 PetscCall(DSGetArrayReal(eps->ds,DS_MAT_T,&alpha));
504 250 beta = alpha + ld;
505
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4375 for (i=k;i<n-1;i++) {
506 4125 alpha[i] = PetscRealPart(T[n*i+i]);
507 4125 beta[i] = PetscRealPart(T[n*i+i+1]);
508 }
509 250 alpha[n-1] = PetscRealPart(T[n*(n-1)+n-1]);
510 250 beta[n-1] = *betam;
511
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
250 PetscCall(DSRestoreArrayReal(eps->ds,DS_MAT_T,&alpha));
512
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.
250 PetscCall(PetscFree(T));
513 break;
514 }
515
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.
1877 PetscFunctionReturn(PETSC_SUCCESS);
516 }
517
518 364 static PetscErrorCode EPSSolve_Lanczos(EPS eps)
519 {
520 364 EPS_LANCZOS *lanczos = (EPS_LANCZOS*)eps->data;
521 364 PetscInt nconv,i,j,k,l,x,n,*perm,restart,ncv=eps->ncv,r,ld;
522 364 Vec vi,vj,w;
523 364 Mat U;
524 364 PetscScalar *Y,*ritz,stmp;
525 364 PetscReal *bnd,anorm,beta,norm,rtmp,resnorm;
526 364 PetscBool breakdown;
527 364 char *conv,ctmp;
528
529
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
364 PetscFunctionBegin;
530
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
364 PetscCall(DSGetLeadingDimension(eps->ds,&ld));
531
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
364 PetscCall(PetscMalloc4(ncv,&ritz,ncv,&bnd,ncv,&perm,ncv,&conv));
532
533 /* The first Lanczos vector is the normalized initial vector */
534
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
364 PetscCall(EPSGetStartVector(eps,0,NULL));
535
536 anorm = -1.0;
537 nconv = 0;
538
539 /* Restart loop */
540 9868 while (eps->reason == EPS_CONVERGED_ITERATING) {
541 9504 eps->its++;
542
543 /* Compute an ncv-step Lanczos factorization */
544 9504 n = PetscMin(nconv+eps->mpd,ncv);
545
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9504 PetscCall(DSSetDimensions(eps->ds,n,nconv,PETSC_DETERMINE));
546
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9504 PetscCall(EPSBasicLanczos(eps,nconv,&n,&beta,&breakdown,anorm));
547
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9504 PetscCall(DSSetDimensions(eps->ds,n,nconv,0));
548
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9504 PetscCall(DSSetState(eps->ds,DS_STATE_INTERMEDIATE));
549
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9504 PetscCall(BVSetActiveColumns(eps->V,nconv,n));
550
551 /* Solve projected problem */
552
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9504 PetscCall(DSSolve(eps->ds,ritz,NULL));
553
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9504 PetscCall(DSSort(eps->ds,ritz,NULL,NULL,NULL,NULL));
554
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9504 PetscCall(DSSynchronize(eps->ds,ritz,NULL));
555
556 /* Estimate ||A|| */
557
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
135454 for (i=nconv;i<n;i++)
558
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
130215 anorm = PetscMax(anorm,PetscAbsReal(PetscRealPart(ritz[i])));
559
560 /* Compute residual norm estimates as beta*abs(Y(m,:)) + eps*||A|| */
561
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9504 PetscCall(DSGetArray(eps->ds,DS_MAT_Q,&Y));
562
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
135454 for (i=nconv;i<n;i++) {
563 125950 resnorm = beta*PetscAbsScalar(Y[n-1+i*ld]) + PETSC_MACHINE_EPSILON*anorm;
564
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
125950 PetscCall((*eps->converged)(eps,ritz[i],eps->eigi[i],resnorm,&bnd[i],eps->convergedctx));
565
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
125950 if (bnd[i]<eps->tol) conv[i] = 'C';
566 124255 else conv[i] = 'N';
567 }
568
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9504 PetscCall(DSRestoreArray(eps->ds,DS_MAT_Q,&Y));
569
570 /* purge repeated ritz values */
571
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9504 if (lanczos->reorthog == EPS_LANCZOS_REORTHOG_LOCAL) {
572
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
70435 for (i=nconv+1;i<n;i++) {
573
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
65231 if (conv[i] == 'C' && PetscAbsScalar((ritz[i]-ritz[i-1])/ritz[i]) < eps->tol) conv[i] = 'R';
574 }
575 }
576
577 /* Compute restart vector */
578
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.
9504 if (breakdown) PetscCall(PetscInfo(eps,"Breakdown in Lanczos method (it=%" PetscInt_FMT " norm=%g)\n",eps->its,(double)beta));
579 else {
580 restart = nconv;
581
3/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
10975 while (restart<n && conv[restart] != 'N') restart++;
582
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
9494 if (restart >= n) {
583 breakdown = PETSC_TRUE;
584 } else {
585
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
124289 for (i=restart+1;i<n;i++) {
586
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
114795 if (conv[i] == 'N') {
587
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
114761 PetscCall(SlepcSCCompare(eps->sc,ritz[restart],0.0,ritz[i],0.0,&r));
588
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
114761 if (r>0) restart = i;
589 }
590 }
591
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9494 PetscCall(DSGetArray(eps->ds,DS_MAT_Q,&Y));
592
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9494 PetscCall(BVMultColumn(eps->V,1.0,0.0,n,Y+restart*ld+nconv));
593
5/6
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 1 times.
9494 PetscCall(DSRestoreArray(eps->ds,DS_MAT_Q,&Y));
594 }
595 }
596
597 /* Count and put converged eigenvalues first */
598
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
135454 for (i=nconv;i<n;i++) perm[i] = i;
599
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
11175 for (k=nconv;k<n;k++) {
600
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
11165 if (conv[perm[k]] != 'C') {
601 9521 j = k + 1;
602
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
124340 while (j<n && conv[perm[j]] != 'C') j++;
603
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9521 if (j>=n) break;
604 27 l = perm[k]; perm[k] = perm[j]; perm[j] = l;
605 }
606 }
607
608 /* Sort eigenvectors according to permutation */
609
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9504 PetscCall(DSGetArray(eps->ds,DS_MAT_Q,&Y));
610
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
11175 for (i=nconv;i<k;i++) {
611 1671 x = perm[i];
612
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1671 if (x != i) {
613 27 j = i + 1;
614
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
61 while (perm[j] != i) j++;
615 /* swap eigenvalues i and j */
616 27 stmp = ritz[x]; ritz[x] = ritz[i]; ritz[i] = stmp;
617 27 rtmp = bnd[x]; bnd[x] = bnd[i]; bnd[i] = rtmp;
618 27 ctmp = conv[x]; conv[x] = conv[i]; conv[i] = ctmp;
619 27 perm[j] = x; perm[i] = i;
620 /* swap eigenvectors i and j */
621
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
540 for (l=0;l<n;l++) {
622 513 stmp = Y[l+x*ld]; Y[l+x*ld] = Y[l+i*ld]; Y[l+i*ld] = stmp;
623 }
624 }
625 }
626
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9504 PetscCall(DSRestoreArray(eps->ds,DS_MAT_Q,&Y));
627
628 /* compute converged eigenvectors */
629
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9504 PetscCall(DSGetMat(eps->ds,DS_MAT_Q,&U));
630
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9504 PetscCall(BVMultInPlace(eps->V,U,nconv,k));
631
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9504 PetscCall(DSRestoreMat(eps->ds,DS_MAT_Q,&U));
632
633 /* purge spurious ritz values */
634
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9504 if (lanczos->reorthog == EPS_LANCZOS_REORTHOG_LOCAL) {
635
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
5949 for (i=nconv;i<k;i++) {
636
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
745 PetscCall(BVGetColumn(eps->V,i,&vi));
637
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
745 PetscCall(VecNorm(vi,NORM_2,&norm));
638
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
745 PetscCall(VecScale(vi,1.0/norm));
639 745 w = eps->work[0];
640
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
745 PetscCall(STApply(eps->st,vi,w));
641
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
745 PetscCall(VecAXPY(w,-ritz[i],vi));
642
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
745 PetscCall(BVRestoreColumn(eps->V,i,&vi));
643
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
745 PetscCall(VecNorm(w,NORM_2,&norm));
644
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
745 PetscCall((*eps->converged)(eps,ritz[i],eps->eigi[i],norm,&bnd[i],eps->convergedctx));
645
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
745 if (bnd[i]>=eps->tol) conv[i] = 'S';
646 }
647
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
5944 for (i=nconv;i<k;i++) {
648
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
745 if (conv[i] != 'C') {
649 5 j = i + 1;
650
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
5 while (j<k && conv[j] != 'C') j++;
651
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
5 if (j>=k) break;
652 /* swap eigenvalues i and j */
653 stmp = ritz[j]; ritz[j] = ritz[i]; ritz[i] = stmp;
654 rtmp = bnd[j]; bnd[j] = bnd[i]; bnd[i] = rtmp;
655 ctmp = conv[j]; conv[j] = conv[i]; conv[i] = ctmp;
656 /* swap eigenvectors i and j */
657 PetscCall(BVGetColumn(eps->V,i,&vi));
658 PetscCall(BVGetColumn(eps->V,j,&vj));
659 PetscCall(VecSwap(vi,vj));
660 PetscCall(BVRestoreColumn(eps->V,i,&vi));
661
0/6
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
740 PetscCall(BVRestoreColumn(eps->V,j,&vj));
662 }
663 }
664 k = i;
665 }
666
667 /* store ritz values and estimated errors */
668
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
135454 for (i=nconv;i<n;i++) {
669 125950 eps->eigr[i] = ritz[i];
670 125950 eps->errest[i] = bnd[i];
671 }
672 9504 nconv = k;
673
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9504 PetscCall(EPSMonitor(eps,eps->its,nconv,eps->eigr,eps->eigi,eps->errest,n));
674
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9504 PetscCall((*eps->stopping)(eps,eps->its,eps->max_it,nconv,eps->nev,&eps->reason,eps->stoppingctx));
675
676
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9504 if (eps->reason == EPS_CONVERGED_ITERATING) { /* copy restart vector */
677
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
9140 PetscCall(BVCopyColumn(eps->V,n,nconv));
678
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
9140 if (lanczos->reorthog == EPS_LANCZOS_REORTHOG_LOCAL && !breakdown) {
679 /* Reorthonormalize restart vector */
680
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5024 PetscCall(BVOrthonormalizeColumn(eps->V,nconv,PETSC_FALSE,NULL,&breakdown));
681 }
682
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
9140 if (breakdown) {
683 /* Use random vector for restarting */
684 PetscCall(PetscInfo(eps,"Using random vector for restart\n"));
685 PetscCall(EPSGetStartVector(eps,nconv,&breakdown));
686 }
687
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
9140 if (PetscUnlikely(breakdown)) { /* give up */
688 eps->reason = EPS_DIVERGED_BREAKDOWN;
689
4/8
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
9868 PetscCall(PetscInfo(eps,"Unable to generate more start vectors\n"));
690 }
691 }
692 }
693 364 eps->nconv = nconv;
694
695
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
364 PetscCall(PetscFree4(ritz,bnd,perm,conv));
696
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.
72 PetscFunctionReturn(PETSC_SUCCESS);
697 }
698
699 184 static PetscErrorCode EPSSetFromOptions_Lanczos(EPS eps,PetscOptionItems PetscOptionsObject)
700 {
701 184 EPS_LANCZOS *lanczos = (EPS_LANCZOS*)eps->data;
702 184 PetscBool flg;
703 184 EPSLanczosReorthogType reorthog=EPS_LANCZOS_REORTHOG_LOCAL,curval;
704
705
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
184 PetscFunctionBegin;
706
1/12
✗ 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.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
184 PetscOptionsHeadBegin(PetscOptionsObject,"EPS Lanczos Options");
707
708
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
184 curval = (lanczos->reorthog==(EPSLanczosReorthogType)-1)? EPS_LANCZOS_REORTHOG_LOCAL: lanczos->reorthog;
709
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
184 PetscCall(PetscOptionsEnum("-eps_lanczos_reorthog","Lanczos reorthogonalization","EPSLanczosSetReorthog",EPSLanczosReorthogTypes,(PetscEnum)curval,(PetscEnum*)&reorthog,&flg));
710
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.
184 if (flg) PetscCall(EPSLanczosSetReorthog(eps,reorthog));
711
712
1/14
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
184 PetscOptionsHeadEnd();
713
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.
36 PetscFunctionReturn(PETSC_SUCCESS);
714 }
715
716 194 static PetscErrorCode EPSLanczosSetReorthog_Lanczos(EPS eps,EPSLanczosReorthogType reorthog)
717 {
718 194 EPS_LANCZOS *lanczos = (EPS_LANCZOS*)eps->data;
719
720
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
194 PetscFunctionBegin;
721
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
194 switch (reorthog) {
722 194 case EPS_LANCZOS_REORTHOG_LOCAL:
723 case EPS_LANCZOS_REORTHOG_FULL:
724 case EPS_LANCZOS_REORTHOG_DELAYED:
725 case EPS_LANCZOS_REORTHOG_SELECTIVE:
726 case EPS_LANCZOS_REORTHOG_PERIODIC:
727 case EPS_LANCZOS_REORTHOG_PARTIAL:
728
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
194 if (lanczos->reorthog != reorthog) {
729 194 lanczos->reorthog = reorthog;
730 194 eps->state = EPS_STATE_INITIAL;
731 }
732 38 break;
733 default:
734 SETERRQ(PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"Invalid reorthogonalization type");
735 }
736
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.
38 PetscFunctionReturn(PETSC_SUCCESS);
737 }
738
739 /*@
740 EPSLanczosSetReorthog - Sets the type of reorthogonalization used during the Lanczos
741 iteration.
742
743 Logically Collective
744
745 Input Parameters:
746 + eps - the eigenproblem solver context
747 - reorthog - the type of reorthogonalization
748
749 Options Database Key:
750 . -eps_lanczos_reorthog - Sets the reorthogonalization type (either 'local', 'selective',
751 'periodic', 'partial', 'full' or 'delayed')
752
753 Level: advanced
754
755 .seealso: EPSLanczosGetReorthog(), EPSLanczosReorthogType
756 @*/
757 194 PetscErrorCode EPSLanczosSetReorthog(EPS eps,EPSLanczosReorthogType reorthog)
758 {
759
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
194 PetscFunctionBegin;
760
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.
194 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
761
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.
194 PetscValidLogicalCollectiveEnum(eps,reorthog,2);
762
8/14
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✓ 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.
194 PetscTryMethod(eps,"EPSLanczosSetReorthog_C",(EPS,EPSLanczosReorthogType),(eps,reorthog));
763
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.
194 PetscFunctionReturn(PETSC_SUCCESS);
764 }
765
766 50 static PetscErrorCode EPSLanczosGetReorthog_Lanczos(EPS eps,EPSLanczosReorthogType *reorthog)
767 {
768 50 EPS_LANCZOS *lanczos = (EPS_LANCZOS*)eps->data;
769
770
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
50 PetscFunctionBegin;
771 50 *reorthog = lanczos->reorthog;
772
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
50 PetscFunctionReturn(PETSC_SUCCESS);
773 }
774
775 /*@
776 EPSLanczosGetReorthog - Gets the type of reorthogonalization used during
777 the Lanczos iteration.
778
779 Not Collective
780
781 Input Parameter:
782 . eps - the eigenproblem solver context
783
784 Output Parameter:
785 . reorthog - the type of reorthogonalization
786
787 Level: advanced
788
789 .seealso: EPSLanczosSetReorthog(), EPSLanczosReorthogType
790 @*/
791 50 PetscErrorCode EPSLanczosGetReorthog(EPS eps,EPSLanczosReorthogType *reorthog)
792 {
793
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
50 PetscFunctionBegin;
794
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.
50 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
795
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
50 PetscAssertPointer(reorthog,2);
796
9/16
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✗ 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.
50 PetscUseMethod(eps,"EPSLanczosGetReorthog_C",(EPS,EPSLanczosReorthogType*),(eps,reorthog));
797
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
50 PetscFunctionReturn(PETSC_SUCCESS);
798 }
799
800 224 static PetscErrorCode EPSReset_Lanczos(EPS eps)
801 {
802 224 EPS_LANCZOS *lanczos = (EPS_LANCZOS*)eps->data;
803
804
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
224 PetscFunctionBegin;
805
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
224 PetscCall(BVDestroy(&lanczos->AV));
806 224 lanczos->allocsize = 0;
807
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.
224 PetscFunctionReturn(PETSC_SUCCESS);
808 }
809
810 194 static PetscErrorCode EPSDestroy_Lanczos(EPS eps)
811 {
812
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
194 PetscFunctionBegin;
813
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.
194 PetscCall(PetscFree(eps->data));
814
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
194 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSLanczosSetReorthog_C",NULL));
815
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
194 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSLanczosGetReorthog_C",NULL));
816
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.
38 PetscFunctionReturn(PETSC_SUCCESS);
817 }
818
819 static PetscErrorCode EPSView_Lanczos(EPS eps,PetscViewer viewer)
820 {
821 EPS_LANCZOS *lanczos = (EPS_LANCZOS*)eps->data;
822 PetscBool isascii;
823
824 PetscFunctionBegin;
825 PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii));
826 if (isascii) {
827 if (lanczos->reorthog != (EPSLanczosReorthogType)-1) PetscCall(PetscViewerASCIIPrintf(viewer," %s reorthogonalization\n",EPSLanczosReorthogTypes[lanczos->reorthog]));
828 }
829 PetscFunctionReturn(PETSC_SUCCESS);
830 }
831
832 194 SLEPC_EXTERN PetscErrorCode EPSCreate_Lanczos(EPS eps)
833 {
834 194 EPS_LANCZOS *ctx;
835
836
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
194 PetscFunctionBegin;
837
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
194 PetscCall(PetscNew(&ctx));
838 194 eps->data = (void*)ctx;
839 194 ctx->reorthog = (EPSLanczosReorthogType)-1;
840
841 194 eps->useds = PETSC_TRUE;
842
843 194 eps->ops->solve = EPSSolve_Lanczos;
844 194 eps->ops->setup = EPSSetUp_Lanczos;
845 194 eps->ops->setupsort = EPSSetUpSort_Default;
846 194 eps->ops->setfromoptions = EPSSetFromOptions_Lanczos;
847 194 eps->ops->destroy = EPSDestroy_Lanczos;
848 194 eps->ops->reset = EPSReset_Lanczos;
849 194 eps->ops->view = EPSView_Lanczos;
850 194 eps->ops->backtransform = EPSBackTransform_Default;
851 194 eps->ops->computevectors = EPSComputeVectors_Hermitian;
852
853
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
194 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSLanczosSetReorthog_C",EPSLanczosSetReorthog_Lanczos));
854
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
194 PetscCall(PetscObjectComposeFunction((PetscObject)eps,"EPSLanczosGetReorthog_C",EPSLanczosGetReorthog_Lanczos));
855
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.
38 PetscFunctionReturn(PETSC_SUCCESS);
856 }
857