GCC Code Coverage Report


Directory: ./
File: src/eps/impls/krylov/krylovschur/ks-lrep.c
Date: 2026-05-14 04:00:17
Exec Total Coverage
Lines: 418 432 96.8%
Functions: 15 15 100.0%
Branches: 1139 1805 63.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 SLEPc eigensolver: "krylovschur"
12
13 Method: thick-restarted Lanczos for Linear Response eigenvalue problems
14
15 References:
16
17 [1] Z. Teng, R.-C. Li, "Convergence analysis of Lanczos-type methods for the
18 linear response eigenvalue problem", J. Comput. Appl. Math. 247, 2013.
19
20 [2] H.-X. Zhong, H. Xu, "Weighted Golub-Kahan-Lanczos bidiagonalization
21 algorithms", Elec. Trans. Numer. Anal. 47, 2017.
22
23 [3] F. Alvarruiz, B. Mellado-Pinto, J. E. Roman, "Restarted Lanczos methods
24 for the linear response eigenvalue problem", in preparation, 2026.
25
26 */
27 #include <slepc/private/epsimpl.h>
28 #include "krylovschur.h"
29
30 9218 static PetscErrorCode Orthog_Teng(Vec x,BV U,BV V,PetscInt j,PetscScalar *h,PetscScalar *c)
31 {
32 9218 PetscInt i;
33
34
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
9218 PetscFunctionBegin;
35
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.
9218 PetscCall(BVSetActiveColumns(U,0,j));
36
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.
9218 PetscCall(BVSetActiveColumns(V,0,j));
37 /* c = U^* x */
38
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.
9218 PetscCall(BVDotVec(U,x,c));
39 /* x = x-V*c */
40
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.
9218 PetscCall(BVMultVec(V,-1.0,1.0,x,c));
41 /* accumulate orthog coeffs into h */
42
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
186386 for (i=0;i<2*j;i++) h[i] += c[i];
43
6/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
1694 PetscFunctionReturn(PETSC_SUCCESS);
44 }
45
46 /* Orthogonalize vector x against first j vectors in U and V
47 v is column j-1 of V */
48 9218 static PetscErrorCode OrthogonalizeVector_Teng(Vec x,BV U,BV V,PetscInt j,Vec u,PetscReal *beta,PetscInt k,PetscScalar *h)
49 {
50 9218 PetscReal alpha;
51 9218 PetscInt i,l;
52
53
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
9218 PetscFunctionBegin;
54
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
9218 PetscCall(PetscArrayzero(h,2*j));
55
56 /* Local orthogonalization */
57
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
9218 l = j==k+1?0:j-2; /* 1st column to orthogonalize against */
58
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.
9218 PetscCall(VecDotRealPart(x,u,&alpha));
59
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
25148 for (i=l;i<j-1;i++) h[i] = beta[i];
60 9218 h[j-1] = alpha;
61 /* x = x-V(:,l:j-1)*h(l:j-1) */
62
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.
9218 PetscCall(BVSetActiveColumns(V,l,j));
63
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.
9218 PetscCall(BVMultVec(V,-1.0,1.0,x,h+l));
64
65 /* Full orthogonalization */
66
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.
9218 PetscCall(Orthog_Teng(x,U,V,j,h,h+2*j));
67
6/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
1694 PetscFunctionReturn(PETSC_SUCCESS);
68 }
69
70 1418 static PetscErrorCode EPSLREPLanczos_Teng(EPS eps,Mat K,Mat M,BV U,BV V,PetscReal *alpha,PetscReal *beta,PetscInt k,PetscInt *min,PetscBool *breakdown)
71 {
72 1418 PetscInt j,m = *min;
73 1418 Vec u,v,uh,vh;
74 1418 PetscReal beta0;
75 1418 PetscScalar *hwork,lhwork[100],gamma;
76 1418 PetscBool alloc=PETSC_FALSE;
77
78
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1418 PetscFunctionBegin;
79
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
1418 if (4*m > 100) {
80 PetscCall(PetscMalloc1(4*m,&hwork));
81 alloc = PETSC_TRUE;
82 1418 } else hwork = lhwork;
83
84 /* Normalize initial vector */
85
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
1418 if (k==0) {
86
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.
154 if (eps->nini==0) PetscCall(BVSetRandomColumn(V,0));
87
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.
154 PetscCall(BVGetColumn(U,0,&u));
88
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.
154 PetscCall(BVGetColumn(V,0,&v));
89
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.
154 PetscCall(MatMult(M,v,u));
90
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.
154 PetscCall(VecDot(u,v,&gamma));
91 154 beta0 = PetscSqrtReal(PetscRealPart(gamma));
92
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
154 if (beta0==0.0) {
93 if (breakdown) *breakdown = PETSC_TRUE;
94 *min = 1; m = 0;
95 } else {
96
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.
154 PetscCall(VecScale(u,1.0/beta0));
97
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.
154 PetscCall(VecScale(v,1.0/beta0));
98 }
99
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.
154 PetscCall(BVRestoreColumn(U,0,&u));
100
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.
154 PetscCall(BVRestoreColumn(V,0,&v));
101 }
102
103
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
10636 for (j=k;j<m;j++) {
104 /* j+1 columns (indices 0 to j) have been computed */
105
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.
9218 PetscCall(BVGetColumn(U,j+1,&uh));
106
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.
9218 PetscCall(BVGetColumn(V,j+1,&vh));
107
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.
9218 PetscCall(BVGetColumn(U,j,&u));
108
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.
9218 PetscCall(MatMult(K,u,vh));
109
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.
9218 PetscCall(OrthogonalizeVector_Teng(vh,U,V,j+1,u,beta,k,hwork));
110 9218 alpha[j] = PetscRealPart(hwork[j]);
111
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.
9218 PetscCall(MatMult(M,vh,uh));
112
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.
9218 PetscCall(VecDot(uh,vh,&gamma));
113 9218 beta[j] = PetscSqrtReal(PetscRealPart(gamma));
114
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
9218 if (beta[j]==0.0) {
115 if (breakdown) *breakdown = PETSC_TRUE;
116 *min = j+1; m = j;
117 } else {
118
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.
9218 PetscCall(VecScale(uh,1.0/beta[j]));
119
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.
9218 PetscCall(VecScale(vh,1.0/beta[j]));
120 }
121
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.
9218 PetscCall(BVRestoreColumn(U,j+1,&uh));
122
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.
9218 PetscCall(BVRestoreColumn(V,j+1,&vh));
123
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.
9218 PetscCall(BVRestoreColumn(U,j,&u));
124 }
125
1/10
✗ Branch 0 not taken.
✓ Branch 1 taken 5 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.
1418 if (alloc) PetscCall(PetscFree(hwork));
126
6/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
270 PetscFunctionReturn(PETSC_SUCCESS);
127 }
128
129 /* K-Orthogonalize vector vh against first j vectors in V using beta coeffs */
130 9148 static PetscErrorCode OrthogonalizeVector_Zhong_v(Vec vh,BV V,PetscInt j,PetscReal *beta,PetscInt k,PetscScalar *h)
131 {
132 9148 PetscInt i,l;
133
134
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
9148 PetscFunctionBegin;
135 /* Local orthogonalization */
136
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
9148 l = j==k?0:j-1; /* 1st column to orthogonalize against */
137
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
24958 for (i=l;i<j;i++) h[i] = beta[i];
138 /* vh = vh-V[:,l:j-1]*h[l:j-1] */
139
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.
9148 PetscCall(BVSetActiveColumns(V,l,j));
140
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.
9148 PetscCall(BVMultVec(V,-1.0,1.0,vh,h+l));
141
6/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
1676 PetscFunctionReturn(PETSC_SUCCESS);
142 }
143
144 /* M-Orthogonalize vector uh against first j vectors in U. Full orthog */
145 9148 static PetscErrorCode Orthogonalize_Zhong_u(Vec uh,BV U,BV MU,PetscInt j,PetscScalar *h)
146 {
147
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
9148 PetscFunctionBegin;
148
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.
9148 PetscCall(BVSetActiveColumns(U,0,j));
149
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.
9148 PetscCall(BVSetActiveColumns(MU,0,j));
150 /* h=MU'*uh */
151
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.
9148 PetscCall(BVDotVec(MU,uh,h));
152 /* uh=uh-U*h */
153
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.
9148 PetscCall(BVMultVec(U,-1.0,1.0,uh,h));
154
6/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
1676 PetscFunctionReturn(PETSC_SUCCESS);
155 }
156
157 /* M-Orthogonalize vector uh against first j vectors in U. Local+full orthog */
158 9148 static PetscErrorCode OrthogonalizeVector_Zhong_u(Vec uh,BV U,BV MU,PetscInt j,PetscReal *alpha,PetscInt k,PetscScalar *h)
159 {
160 9148 Vec u;
161
162
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
9148 PetscFunctionBegin;
163 /* Local orthogonalization: uh = uh-U[:,j-1]*alpha[j-1] */
164
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.
9148 PetscCall(BVGetColumn(U,j-1,&u));
165
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.
9148 PetscCall(VecAXPY(uh,-alpha[j-1],u));
166
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.
9148 PetscCall(BVRestoreColumn(U,j-1,&u));
167 /* Full orthogonalization */
168
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.
9148 PetscCall(Orthogonalize_Zhong_u(uh,U,MU,j,h));
169
6/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
1676 PetscFunctionReturn(PETSC_SUCCESS);
170 }
171
172 1402 static PetscErrorCode EPSLREPLanczos_Zhong(EPS eps,Mat K,Mat M,BV U,BV V,BV MU,PetscReal *alpha,PetscReal *beta,PetscInt k,PetscInt *min,PetscBool *breakdown)
173 {
174 1402 PetscInt j,m = *min;
175 1402 Vec uh,vh,x;
176 1402 PetscReal beta0;
177 1402 PetscScalar *hwork,lhwork[100],gamma;
178 1402 PetscBool alloc=PETSC_FALSE;
179
180
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1402 PetscFunctionBegin;
181
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
1402 if (m > 100) {
182 PetscCall(PetscMalloc1(m,&hwork));
183 alloc = PETSC_TRUE;
184 1402 } else hwork = lhwork;
185
186 /* Normalize initial vector */
187
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
1402 if (k==0) {
188
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.
154 if (eps->nini==0) PetscCall(BVSetRandomColumn(U,0));
189
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.
154 PetscCall(BVGetColumn(U,0,&uh));
190
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.
154 PetscCall(BVGetColumn(MU,0,&vh));
191
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.
154 PetscCall(MatMult(M,uh,vh));
192
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.
154 PetscCall(VecDot(uh,vh,&gamma));
193 154 beta0 = PetscSqrtReal(PetscRealPart(gamma));
194
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
154 if (beta0==0.0) {
195 if (breakdown) *breakdown = PETSC_TRUE;
196 *min = 1; m = 0;
197 } else {
198
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.
154 PetscCall(VecScale(uh,1.0/beta0));
199
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.
154 PetscCall(VecScale(vh,1.0/beta0));
200 }
201
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.
154 PetscCall(BVRestoreColumn(U,0,&uh));
202
3/6
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
154 PetscCall(BVRestoreColumn(MU,0,&vh));
203 }
204
205
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
10550 for (j=k;j<m;j++) {
206 /* Compute column j of V, then column j+1 of U and MU */
207
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.
9148 PetscCall(BVGetColumn(U,j+1,&uh));
208
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.
9148 PetscCall(BVGetColumn(V,j,&vh));
209
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.
9148 PetscCall(BVGetColumn(MU,j,&x));
210
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.
9148 PetscCall(VecCopy(x,vh));
211
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.
9148 PetscCall(BVRestoreColumn(MU,j,&x));
212
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.
9148 PetscCall(OrthogonalizeVector_Zhong_v(vh,V,j,beta,k,hwork));
213
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.
9148 PetscCall(MatMult(K,vh,uh));
214
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.
9148 PetscCall(VecDot(uh,vh,&gamma));
215 9148 alpha[j] = PetscSqrtReal(PetscRealPart(gamma));
216
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
9148 if (alpha[j]==0.0) {
217 if (breakdown) *breakdown = PETSC_TRUE;
218 *min = j+1; m = j;
219 PetscCall(BVRestoreColumn(U,j+1,&uh));
220 } else {
221
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.
9148 PetscCall(VecScale(uh,1.0/alpha[j]));
222
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.
9148 PetscCall(VecScale(vh,1.0/alpha[j]));
223 }
224
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.
9148 PetscCall(BVRestoreColumn(V,j,&vh));
225
2/4
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
9148 if (breakdown && *breakdown) continue;
226
227
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.
9148 PetscCall(OrthogonalizeVector_Zhong_u(uh,U,MU,j+1,alpha,k,hwork));
228
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.
9148 PetscCall(BVGetColumn(MU,j+1,&vh));
229
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.
9148 PetscCall(MatMult(M,uh,vh));
230
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.
9148 PetscCall(VecDot(uh,vh,&gamma));
231 9148 beta[j] = PetscSqrtReal(PetscRealPart(gamma));
232
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
9148 if (beta[j]==0.0) {
233 if (breakdown) *breakdown = PETSC_TRUE;
234 *min = j+1; m = j;
235 } else {
236
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.
9148 PetscCall(VecScale(uh,1.0/beta[j]));
237
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.
9148 PetscCall(VecScale(vh,1.0/beta[j]));
238 }
239
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.
9148 PetscCall(BVRestoreColumn(U,j+1,&uh));
240
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.
9148 PetscCall(BVRestoreColumn(MU,j+1,&vh));
241 }
242
1/10
✗ Branch 0 not taken.
✓ Branch 1 taken 5 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.
1402 if (alloc) PetscCall(PetscFree(hwork));
243
6/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
266 PetscFunctionReturn(PETSC_SUCCESS);
244 }
245
246 /*
247 EPSConvergence_Zhong - convergence check based on SVDKrylovConvergence().
248 FIXME: Code dulication. This is a copy of EPSConvergence_Gruning
249 */
250 1402 static PetscErrorCode EPSConvergence_Zhong(EPS eps,PetscBool getall,PetscInt kini,PetscInt nits,PetscInt *kout)
251 {
252 1402 PetscInt k,marker,ld;
253 1402 PetscReal *alpha,*beta,resnorm;
254 1402 PetscBool extra;
255
256
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1402 PetscFunctionBegin;
257 1402 *kout = 0;
258
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.
1402 PetscCall(DSGetLeadingDimension(eps->ds,&ld));
259
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.
1402 PetscCall(DSGetExtraRow(eps->ds,&extra));
260
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1402 PetscCheck(extra,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Only implemented for DS with extra row");
261 1402 marker = -1;
262
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
1402 if (eps->trackall) getall = PETSC_TRUE;
263
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.
1402 PetscCall(DSGetArrayReal(eps->ds,DS_MAT_T,&alpha));
264 1402 beta = alpha + ld;
265
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
2572 for (k=kini;k<kini+nits;k++) {
266 2572 resnorm = PetscAbsReal(beta[k]);
267
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.
2572 PetscCall((*eps->converged)(eps,eps->eigr[k],eps->eigi[k],resnorm,&eps->errest[k],eps->convergedctx));
268
3/4
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
2572 if (marker==-1 && eps->errest[k] >= eps->tol) marker = k;
269
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
2572 if (marker!=-1 && !getall) break;
270 }
271
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.
1402 PetscCall(DSRestoreArrayReal(eps->ds,DS_MAT_T,&alpha));
272
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
1402 if (marker!=-1) k = marker;
273 1402 *kout = k;
274
6/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
1402 PetscFunctionReturn(PETSC_SUCCESS);
275 }
276
277 154 static PetscErrorCode EPSUnreduceVectors(EPS eps,BV U,BV V)
278 {
279 154 PetscInt k;
280 154 Vec u,v,w;
281
282
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
154 PetscFunctionBegin;
283 /* The approximate eigenvector is [u+v; u-v], where [u; v] is the reduced eigenvector */
284
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.
154 PetscCall(BVCreateVec(V,&w));
285
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
1278 for (k=0;k<eps->nconv;k++) {
286
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.
1124 PetscCall(BVGetColumn(U,k,&u));
287
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.
1124 PetscCall(BVGetColumn(V,k,&v));
288
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.
1124 PetscCall(VecCopy(v,w));
289
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.
1124 PetscCall(VecCopy(u,v));
290
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.
1124 PetscCall(VecAXPY(u,1.0,w));
291
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.
1124 PetscCall(VecAXPY(v,-1.0,w));
292
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.
1124 PetscCall(BVRestoreColumn(U,k,&u));
293
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.
1124 PetscCall(BVRestoreColumn(V,k,&v));
294 }
295
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.
154 PetscCall(VecDestroy(&w));
296
6/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
26 PetscFunctionReturn(PETSC_SUCCESS);
297 }
298
299 154 static PetscErrorCode EPSComputeVectors_LREP_Teng(EPS eps)
300 {
301 154 Mat H;
302 154 Vec v;
303 154 BV U,V;
304 154 IS is[2];
305 154 PetscInt k;
306 154 PetscScalar lambda;
307 154 PetscBool reduced;
308
309
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
154 PetscFunctionBegin;
310
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.
154 PetscCall(STGetMatrix(eps->st,0,&H));
311
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.
154 PetscCall(MatNestGetISs(H,is,NULL));
312
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.
154 PetscCall(SlepcCheckMatLREPReduced(H,&reduced));
313
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.
154 PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&V,&U));
314
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
1232 for (k=0;k<eps->nconv;k++) {
315
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.
1078 PetscCall(BVGetColumn(V,k,&v));
316 /* approx eigenvector is [eigr[k]*v; u] */
317 1078 lambda = eps->eigr[k];
318
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.
1078 PetscCall(STBackTransform(eps->st,1,&lambda,&eps->eigi[k]));
319
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.
1078 PetscCall(VecScale(v,lambda));
320
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.
1078 PetscCall(BVRestoreColumn(V,k,&v));
321 }
322
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
154 if (!reduced) PetscCall(EPSUnreduceVectors(eps,V,U));
323
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.
154 PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&V,&U));
324 /* Normalize eigenvectors */
325
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.
154 PetscCall(BVSetActiveColumns(eps->V,0,eps->nconv));
326
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.
154 PetscCall(BVNormalize(eps->V,NULL));
327
6/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
26 PetscFunctionReturn(PETSC_SUCCESS);
328 }
329
330 154 static PetscErrorCode EPSComputeVectors_LREP_Zhong(EPS eps)
331 {
332 154 Mat H;
333 154 BV U,V;
334 154 IS is[2];
335 154 PetscBool reduced;
336
337
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
154 PetscFunctionBegin;
338
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.
154 PetscCall(STGetMatrix(eps->st,0,&H));
339
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.
154 PetscCall(SlepcCheckMatLREPReduced(H,&reduced));
340 /* Approx eigenvector for the reduced form is [u; v] */
341
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
154 if (!reduced) {
342
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.
77 PetscCall(MatNestGetISs(H,is,NULL));
343
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.
77 PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&U,&V));
344
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.
77 PetscCall(EPSUnreduceVectors(eps, U, V));
345
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.
77 PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&U,&V));
346 }
347 /* Normalize eigenvectors */
348
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.
154 PetscCall(BVSetActiveColumns(eps->V,0,eps->nconv));
349
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.
154 PetscCall(BVNormalize(eps->V,NULL));
350
6/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
26 PetscFunctionReturn(PETSC_SUCCESS);
351 }
352
353 308 PetscErrorCode EPSSetUp_KrylovSchur_LREP(EPS eps)
354 {
355 308 EPS_KRYLOVSCHUR *ctx = (EPS_KRYLOVSCHUR*)eps->data;
356 308 PetscBool flg;
357
358
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
308 PetscFunctionBegin;
359
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
308 PetscCheck((eps->problem_type==EPS_LREP),PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONGSTATE,"Problem type should be LREP");
360
9/22
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✓ Branch 9 taken 4 times.
✓ Branch 10 taken 1 times.
✓ Branch 11 taken 4 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 5 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
308 EPSCheckUnsupportedCondition(eps,EPS_FEATURE_ARBITRARY | EPS_FEATURE_REGION | EPS_FEATURE_EXTRACTION | EPS_FEATURE_BALANCE,PETSC_TRUE," with LREP structure");
361
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.
308 PetscCall(EPSSetDimensions_Default(eps,&eps->nev,&eps->ncv,&eps->mpd));
362
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
308 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");
363
3/4
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
596 if (eps->max_it==PETSC_DETERMINE) eps->max_it = PetscMax(100,2*eps->n/eps->ncv)*((eps->stop==EPS_STOP_THRESHOLD)?10:1);
364
365
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.
308 PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STSHIFT,&flg));
366
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
308 PetscCheck(flg,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Krylov-Schur LREP only supports shift ST");
367
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
308 if (!eps->which) eps->which = EPS_SMALLEST_MAGNITUDE;
368
369
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
308 if (!ctx->keep) ctx->keep = 0.5;
370
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.
308 PetscCall(STSetStructured(eps->st,PETSC_FALSE));
371
372
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.
308 PetscCall(EPSAllocateSolution(eps,1));
373
2/3
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
308 switch (ctx->lrep) {
374 154 case EPS_KRYLOVSCHUR_LREP_TENG:
375 154 eps->ops->solve = EPSSolve_KrylovSchur_LREP_Teng;
376 154 eps->ops->computevectors = EPSComputeVectors_LREP_Teng;
377
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.
154 PetscCall(DSSetType(eps->ds,DSHEP));
378
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.
154 PetscCall(DSSetCompact(eps->ds,PETSC_TRUE));
379
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.
154 PetscCall(DSSetExtraRow(eps->ds,PETSC_TRUE));
380
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.
154 PetscCall(DSAllocate(eps->ds,eps->ncv+1));
381 break;
382 154 case EPS_KRYLOVSCHUR_LREP_ZHONG:
383 154 eps->ops->solve = EPSSolve_KrylovSchur_LREP_Zhong;
384 154 eps->ops->computevectors = EPSComputeVectors_LREP_Zhong;
385
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.
154 PetscCall(DSSetType(eps->ds,DSSVD));
386
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.
154 PetscCall(DSSetCompact(eps->ds,PETSC_TRUE));
387
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.
154 PetscCall(DSSetExtraRow(eps->ds,PETSC_TRUE));
388
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.
154 PetscCall(DSAllocate(eps->ds,eps->ncv+1));
389 break;
390 default: SETERRQ(PetscObjectComm((PetscObject)eps),PETSC_ERR_PLIB,"Unexpected error");
391 }
392
6/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
52 PetscFunctionReturn(PETSC_SUCCESS);
393 }
394
395 154 static PetscErrorCode EPSCreateReducedMats(Mat H,Mat *K,Mat *M)
396 {
397 154 PetscInt ma,na,Ma,Na;
398 154 Mat A,B;
399 154 const PetscScalar scal[] = { 1.0, -1.0 };
400
401
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
154 PetscFunctionBegin;
402
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.
154 PetscCall(MatNestGetSubMat(H,0,0,&A));
403
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.
154 PetscCall(MatNestGetSubMat(H,0,1,&B));
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.
154 PetscCall(MatGetSize(A,&Ma,&Na));
405
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.
154 PetscCall(MatGetLocalSize(A,&ma,&na));
406 /* K = A-B */
407
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.
154 PetscCall(MatCreate(PetscObjectComm((PetscObject)A),K));
408
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.
154 PetscCall(MatSetSizes(*K,ma,na,Ma,Na));
409
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.
154 PetscCall(MatSetType(*K,MATCOMPOSITE));
410
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.
154 PetscCall(MatCompositeAddMat(*K,A));
411
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.
154 PetscCall(MatCompositeAddMat(*K,B));
412
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.
154 PetscCall(MatAssemblyBegin(*K,MAT_FINAL_ASSEMBLY));
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.
154 PetscCall(MatAssemblyEnd(*K,MAT_FINAL_ASSEMBLY));
414
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.
154 PetscCall(MatCompositeSetScalings(*K,scal));
415 /* M = A+B */
416
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.
154 PetscCall(MatCreate(PetscObjectComm((PetscObject)A),M));
417
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
154 PetscCall(MatSetSizes(*M,ma,na,Ma,Na));
418
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.
154 PetscCall(MatSetType(*M,MATCOMPOSITE));
419
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.
154 PetscCall(MatCompositeAddMat(*M,A));
420
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.
154 PetscCall(MatCompositeAddMat(*M,B));
421
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.
154 PetscCall(MatAssemblyBegin(*M,MAT_FINAL_ASSEMBLY));
422
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.
154 PetscCall(MatAssemblyEnd(*M,MAT_FINAL_ASSEMBLY));
423
6/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
26 PetscFunctionReturn(PETSC_SUCCESS);
424 }
425
426 154 PetscErrorCode EPSSolve_KrylovSchur_LREP_Teng(EPS eps)
427 {
428 154 EPS_KRYLOVSCHUR *ctx = (EPS_KRYLOVSCHUR*)eps->data;
429 154 PetscInt i,k,l,ld,nv,nconv=0,nevsave;
430 154 Mat H,Q,K,M;
431 154 BV U,V;
432 154 IS is[2];
433 154 PetscReal *a,*b,beta;
434 154 PetscBool reduced,breakdown=PETSC_FALSE;
435
436
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
154 PetscFunctionBegin;
437
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.
154 PetscCall(DSGetLeadingDimension(eps->ds,&ld));
438
439 /* Extract matrix blocks */
440
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.
154 PetscCall(STGetMatrix(eps->st,0,&H));
441
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.
154 PetscCall(MatNestGetISs(H,is,NULL));
442
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.
154 PetscCall(SlepcCheckMatLREPReduced(H,&reduced));
443
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
154 if (reduced) {
444
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.
77 PetscCall(MatNestGetSubMat(H,0,1,&K));
445
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.
77 PetscCall(MatNestGetSubMat(H,1,0,&M));
446
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
77 } else PetscCall(EPSCreateReducedMats(H,&K,&M));
447
448 /* Get the split bases */
449
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.
154 PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&V,&U));
450
451 154 nevsave = eps->nev;
452 154 eps->nev = (eps->nev+1)/2;
453 154 l = 0;
454
455 /* Restart loop */
456 154 while (eps->reason == EPS_CONVERGED_ITERATING) {
457 1418 eps->its++;
458
459 /* Compute an nv-step Lanczos factorization */
460 1418 nv = PetscMin(eps->nconv+eps->mpd,eps->ncv);
461
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.
1418 PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,eps->nconv+l));
462
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.
1418 PetscCall(DSGetArrayReal(eps->ds,DS_MAT_T,&a));
463 1418 b = a + ld;
464
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.
1418 PetscCall(EPSLREPLanczos_Teng(eps,K,M,U,V,a,b,eps->nconv+l,&nv,&breakdown));
465 1418 beta = b[nv-1];
466
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.
1418 PetscCall(DSRestoreArrayReal(eps->ds,DS_MAT_T,&a));
467
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.
1418 PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,eps->nconv+l));
468
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.
1418 PetscCall(DSSetState(eps->ds,l?DS_STATE_RAW:DS_STATE_INTERMEDIATE));
469
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.
1418 PetscCall(BVSetActiveColumns(eps->V,eps->nconv,nv));
470
471 /* Solve projected problem */
472
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.
1418 PetscCall(DSSolve(eps->ds,eps->eigr,eps->eigi));
473
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.
1418 PetscCall(DSSort(eps->ds,eps->eigr,eps->eigi,NULL,NULL,NULL));
474
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.
1418 PetscCall(DSUpdateExtraRow(eps->ds));
475
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.
1418 PetscCall(DSSynchronize(eps->ds,eps->eigr,eps->eigi));
476
477 /* Check convergence */
478
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
18766 for (i=0;i<nv;i++) eps->eigr[i] = PetscSqrtReal(PetscRealPart(eps->eigr[i]));
479
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.
1418 PetscCall(EPSKrylovConvergence(eps,PETSC_FALSE,eps->nconv,nv-eps->nconv,beta,0.0,1.0,&k));
480
19/26
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 4 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 4 times.
✓ Branch 8 taken 4 times.
✓ Branch 9 taken 1 times.
✓ Branch 10 taken 1 times.
✓ Branch 11 taken 4 times.
✓ Branch 12 taken 5 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
1418 EPSSetCtxThreshold(eps,eps->eigr,eps->eigi,eps->errest,k,nv);
481
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.
1418 PetscCall((*eps->stopping)(eps,eps->its,eps->max_it,k,eps->nev,&eps->reason,eps->stoppingctx));
482 1418 nconv = k;
483
484 /* Update l */
485
4/6
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
1418 if (eps->reason != EPS_CONVERGED_ITERATING || breakdown || k==nv) l = 0;
486 1264 else l = PetscMax(1,(PetscInt)((nv-k)*ctx->keep));
487
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1418 if (!ctx->lock && l>0) { l += k; k = 0; } /* non-locking variant: reset no. of converged pairs */
488
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
1418 if (l) PetscCall(PetscInfo(eps,"Preparing to restart keeping l=%" PetscInt_FMT " vectors\n",l));
489
490
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
1418 if (eps->reason == EPS_CONVERGED_ITERATING) {
491
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1264 PetscCheck(!breakdown,PetscObjectComm((PetscObject)eps),PETSC_ERR_CONV_FAILED,"Breakdown in LREP Krylov-Schur (beta=%g)",(double)beta);
492 /* Prepare the Rayleigh quotient for restart */
493
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.
1264 PetscCall(DSTruncate(eps->ds,k+l,PETSC_FALSE));
494 }
495 /* Update the corresponding vectors
496 U(:,idx) = U*Q(:,idx), V(:,idx) = V*Q(:,idx) */
497
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.
1418 PetscCall(DSGetMat(eps->ds,DS_MAT_Q,&Q));
498
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.
1418 PetscCall(BVMultInPlace(U,Q,eps->nconv,k+l));
499
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.
1418 PetscCall(BVMultInPlace(V,Q,eps->nconv,k+l));
500
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.
1418 PetscCall(DSRestoreMat(eps->ds,DS_MAT_Q,&Q));
501
502
3/4
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
1418 if (eps->reason == EPS_CONVERGED_ITERATING && !breakdown) {
503
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.
1264 PetscCall(BVCopyColumn(eps->V,nv,k+l));
504
4/4
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
1264 if (eps->stop==EPS_STOP_THRESHOLD && nv-k<5) { /* reallocate */
505 10 eps->ncv = eps->mpd+k;
506
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.
10 PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&V,&U));
507
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.
10 PetscCall(EPSReallocateSolution(eps,eps->ncv+1));
508
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.
10 PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&V,&U));
509
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
70 for (i=nv;i<eps->ncv;i++) eps->perm[i] = i;
510
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.
10 PetscCall(DSReallocate(eps->ds,eps->ncv+1));
511
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.
10 PetscCall(DSGetLeadingDimension(eps->ds,&ld));
512 }
513 }
514 1418 eps->nconv = k;
515
7/8
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 1 times.
1572 PetscCall(EPSMonitor(eps,eps->its,nconv,eps->eigr,eps->eigi,eps->errest,nv));
516 }
517
518 154 eps->nev = nevsave;
519
520
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.
154 PetscCall(DSTruncate(eps->ds,eps->nconv,PETSC_TRUE));
521
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.
154 PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&V,&U));
522
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
154 if (!reduced) {
523
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.
77 PetscCall(MatDestroy(&K));
524
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.
77 PetscCall(MatDestroy(&M));
525 }
526
6/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
26 PetscFunctionReturn(PETSC_SUCCESS);
527 }
528
529 154 PetscErrorCode EPSSolve_KrylovSchur_LREP_Zhong(EPS eps)
530 {
531 154 EPS_KRYLOVSCHUR *ctx = (EPS_KRYLOVSCHUR*)eps->data;
532 154 PetscInt i,k,l,ld,nv,nconv=0,nevsave;
533 154 Mat H,Q,Z,K,M;
534 154 BV U,V,MU;
535 154 IS is[2];
536 154 PetscReal *a,*b,beta;
537 154 PetscBool reduced,breakdown=PETSC_FALSE;
538
539
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
154 PetscFunctionBegin;
540
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.
154 PetscCall(DSGetLeadingDimension(eps->ds,&ld));
541
542 /* Extract matrix blocks */
543
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.
154 PetscCall(STGetMatrix(eps->st,0,&H));
544
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.
154 PetscCall(MatNestGetISs(H,is,NULL));
545
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.
154 PetscCall(SlepcCheckMatLREPReduced(H,&reduced));
546
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
154 if (reduced) {
547
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.
77 PetscCall(MatNestGetSubMat(H,0,1,&K));
548
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.
77 PetscCall(MatNestGetSubMat(H,1,0,&M));
549
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.
77 } else PetscCall(EPSCreateReducedMats(H,&K,&M));
550
551 /* Get the split bases */
552
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.
154 PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&U,&V));
553
554 /* Create MU */
555
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.
154 PetscCall(BVDuplicate(U,&MU));
556
557 154 nevsave = eps->nev;
558 154 eps->nev = (eps->nev+1)/2;
559 154 l = 0;
560
561 /* Restart loop */
562 154 while (eps->reason == EPS_CONVERGED_ITERATING) {
563 1402 eps->its++;
564
565 /* Compute an nv-step Lanczos factorization */
566 1402 nv = PetscMin(eps->nconv+eps->mpd,eps->ncv);
567
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.
1402 PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,eps->nconv+l));
568
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.
1402 PetscCall(DSGetArrayReal(eps->ds,DS_MAT_T,&a));
569 1402 b = a + ld;
570
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.
1402 PetscCall(EPSLREPLanczos_Zhong(eps,K,M,U,V,MU,a,b,eps->nconv+l,&nv,&breakdown));
571 1402 beta = b[nv-1];
572
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.
1402 PetscCall(DSRestoreArrayReal(eps->ds,DS_MAT_T,&a));
573
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.
1402 PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,eps->nconv+l));
574
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.
1402 PetscCall(DSSVDSetDimensions(eps->ds,nv));
575
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.
1402 PetscCall(DSSetState(eps->ds,l?DS_STATE_RAW:DS_STATE_INTERMEDIATE));
576
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.
1402 PetscCall(BVSetActiveColumns(U,eps->nconv,nv));
577
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.
1402 PetscCall(BVSetActiveColumns(V,eps->nconv,nv));
578
579 /* Solve projected problem */
580
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.
1402 PetscCall(DSSolve(eps->ds,eps->eigr,eps->eigi));
581
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.
1402 PetscCall(DSSort(eps->ds,eps->eigr,eps->eigi,NULL,NULL,NULL));
582
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.
1402 PetscCall(DSUpdateExtraRow(eps->ds));
583
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.
1402 PetscCall(DSSynchronize(eps->ds,eps->eigr,eps->eigi));
584
585 /* Check convergence */
586
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.
1402 PetscCall(EPSConvergence_Zhong(eps,PETSC_FALSE,eps->nconv,nv-eps->nconv,&k));
587
19/26
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 4 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 4 times.
✓ Branch 8 taken 4 times.
✓ Branch 9 taken 1 times.
✓ Branch 10 taken 1 times.
✓ Branch 11 taken 4 times.
✓ Branch 12 taken 5 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
1402 EPSSetCtxThreshold(eps,eps->eigr,eps->eigi,eps->errest,k,nv);
588
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.
1402 PetscCall((*eps->stopping)(eps,eps->its,eps->max_it,k,eps->nev,&eps->reason,eps->stoppingctx));
589 1402 nconv = k;
590
591 /* Update l */
592
4/6
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5 times.
✗ Branch 5 not taken.
1402 if (eps->reason != EPS_CONVERGED_ITERATING || breakdown || k==nv) l = 0;
593 1248 else l = PetscMax(1,(PetscInt)((nv-k)*ctx->keep));
594
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1402 if (!ctx->lock && l>0) { l += k; k = 0; } /* non-locking variant: reset no. of converged pairs */
595
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
1402 if (l) PetscCall(PetscInfo(eps,"Preparing to restart keeping l=%" PetscInt_FMT " vectors\n",l));
596
597
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
1402 if (eps->reason == EPS_CONVERGED_ITERATING) {
598
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1248 PetscCheck(!breakdown,PetscObjectComm((PetscObject)eps),PETSC_ERR_CONV_FAILED,"Breakdown in LREP Krylov-Schur (beta=%g)",(double)beta);
599 /* Prepare the Rayleigh quotient for restart */
600
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.
1248 PetscCall(DSTruncate(eps->ds,k+l,PETSC_FALSE));
601 }
602 /* Update the corresponding vectors
603 U(:,idx) = U*Q(:,idx), MU(:,idx) = MU*Q(:,idx), V(:,idx) = V*Z(:,idx), */
604
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.
1402 PetscCall(DSGetMat(eps->ds,DS_MAT_U,&Z));
605
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.
1402 PetscCall(DSGetMat(eps->ds,DS_MAT_V,&Q));
606
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.
1402 PetscCall(BVMultInPlace(U,Q,eps->nconv,k+l));
607
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.
1402 PetscCall(BVMultInPlace(MU,Q,eps->nconv,k+l));
608
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.
1402 PetscCall(BVMultInPlace(V,Z,eps->nconv,k+l));
609
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.
1402 PetscCall(DSRestoreMat(eps->ds,DS_MAT_U,&Z));
610
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.
1402 PetscCall(DSRestoreMat(eps->ds,DS_MAT_V,&Q));
611
612
3/4
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
1402 if (eps->reason == EPS_CONVERGED_ITERATING && !breakdown) {
613
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.
1248 PetscCall(BVCopyColumn(U,nv,k+l));
614
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.
1248 PetscCall(BVCopyColumn(MU,nv,k+l));
615
4/4
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
1248 if (eps->stop==EPS_STOP_THRESHOLD && nv-k<5) { /* reallocate */
616 10 eps->ncv = eps->mpd+k;
617
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.
10 PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&U,&V));
618
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.
10 PetscCall(EPSReallocateSolution(eps,eps->ncv+1));
619
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.
10 PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&U,&V));
620
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.
10 PetscCall(BVResize(MU,eps->ncv+1,PETSC_TRUE));
621
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
70 for (i=nv;i<eps->ncv;i++) eps->perm[i] = i;
622
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.
10 PetscCall(DSReallocate(eps->ds,eps->ncv+1));
623
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.
10 PetscCall(DSGetLeadingDimension(eps->ds,&ld));
624 }
625 }
626
627 1402 eps->nconv = k;
628
7/8
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 1 times.
1556 PetscCall(EPSMonitor(eps,eps->its,nconv,eps->eigr,eps->eigi,eps->errest,nv));
629 }
630
631 154 eps->nev = nevsave;
632
633
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.
154 PetscCall(DSTruncate(eps->ds,eps->nconv,PETSC_TRUE));
634
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.
154 PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&U,&V));
635
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.
154 PetscCall(BVDestroy(&MU));
636
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
154 if (!reduced) {
637
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.
77 PetscCall(MatDestroy(&K));
638
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.
77 PetscCall(MatDestroy(&M));
639 }
640
6/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
26 PetscFunctionReturn(PETSC_SUCCESS);
641 }
642