GCC Code Coverage Report


Directory: ./
File: src/eps/impls/krylov/krylovschur/ks-lrep.c
Date: 2026-09-29 04:16:25
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 */
24 #include <slepc/private/epsimpl.h>
25 #include "krylovschur.h"
26
27 9218 static PetscErrorCode Orthog_Teng(Vec x,BV U,BV V,PetscInt j,PetscScalar *h,PetscScalar *c)
28 {
29 9218 PetscInt i;
30
31
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
9218 PetscFunctionBegin;
32
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));
33
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));
34 /* c = U^* x */
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(BVDotVec(U,x,c));
36 /* x = x-V*c */
37
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));
38 /* accumulate orthog coeffs into h */
39
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
186386 for (i=0;i<2*j;i++) h[i] += c[i];
40
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);
41 }
42
43 /* Orthogonalize vector x against first j vectors in U and V
44 v is column j-1 of V */
45 9218 static PetscErrorCode OrthogonalizeVector_Teng(Vec x,BV U,BV V,PetscInt j,Vec u,PetscReal *beta,PetscInt k,PetscScalar *h)
46 {
47 9218 PetscReal alpha;
48 9218 PetscInt i,l;
49
50
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
9218 PetscFunctionBegin;
51
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));
52
53 /* Local orthogonalization */
54
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 */
55
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));
56
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
25148 for (i=l;i<j-1;i++) h[i] = beta[i];
57 9218 h[j-1] = alpha;
58 /* x = x-V(:,l:j-1)*h(l:j-1) */
59
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));
60
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));
61
62 /* Full orthogonalization */
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(Orthog_Teng(x,U,V,j,h,h+2*j));
64
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);
65 }
66
67 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)
68 {
69 1418 PetscInt j,m = *min;
70 1418 Vec u,v,uh,vh;
71 1418 PetscReal beta0;
72 1418 PetscScalar *hwork,lhwork[100],gamma;
73 1418 PetscBool alloc=PETSC_FALSE;
74
75
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1418 PetscFunctionBegin;
76
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
1418 if (4*m > 100) {
77 ✗ PetscCall(PetscMalloc1(4*m,&hwork));
78 alloc = PETSC_TRUE;
79 1418 } else hwork = lhwork;
80
81 /* Normalize initial vector */
82
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
1418 if (k==0) {
83
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));
84
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));
85
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));
86
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));
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(VecDot(u,v,&gamma));
88 154 beta0 = PetscSqrtReal(PetscRealPart(gamma));
89
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
154 if (beta0==0.0) {
90 ✗ if (breakdown) *breakdown = PETSC_TRUE;
91 ✗ *min = 1; m = 0;
92 } else {
93
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));
94
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));
95 }
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(BVRestoreColumn(U,0,&u));
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(BVRestoreColumn(V,0,&v));
98 }
99
100
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
10636 for (j=k;j<m;j++) {
101 /* j+1 columns (indices 0 to j) have been computed */
102
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));
103
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));
104
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));
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(MatMult(K,u,vh));
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(OrthogonalizeVector_Teng(vh,U,V,j+1,u,beta,k,hwork));
107 9218 alpha[j] = PetscRealPart(hwork[j]);
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(M,vh,uh));
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(VecDot(uh,vh,&gamma));
110 9218 beta[j] = PetscSqrtReal(PetscRealPart(gamma));
111
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
9218 if (beta[j]==0.0) {
112 ✗ if (breakdown) *breakdown = PETSC_TRUE;
113 ✗ *min = j+1; m = j;
114 } else {
115
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]));
116
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]));
117 }
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(BVRestoreColumn(U,j+1,&uh));
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(BVRestoreColumn(V,j+1,&vh));
120
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));
121 }
122
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));
123
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);
124 }
125
126 /* K-Orthogonalize vector vh against first j vectors in V using beta coeffs */
127 9148 static PetscErrorCode OrthogonalizeVector_Zhong_v(Vec vh,BV V,PetscInt j,PetscReal *beta,PetscInt k,PetscScalar *h)
128 {
129 9148 PetscInt i,l;
130
131
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
9148 PetscFunctionBegin;
132 /* Local orthogonalization */
133
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
9148 l = j==k?0:j-1; /* 1st column to orthogonalize against */
134
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
24958 for (i=l;i<j;i++) h[i] = beta[i];
135 /* vh = vh-V[:,l:j-1]*h[l:j-1] */
136
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));
137
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));
138
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);
139 }
140
141 /* M-Orthogonalize vector uh against first j vectors in U. Full orthog */
142 9148 static PetscErrorCode Orthogonalize_Zhong_u(Vec uh,BV U,BV MU,PetscInt j,PetscScalar *h)
143 {
144
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
9148 PetscFunctionBegin;
145
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));
146
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));
147 /* h=MU'*uh */
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(BVDotVec(MU,uh,h));
149 /* uh=uh-U*h */
150
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));
151
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);
152 }
153
154 /* M-Orthogonalize vector uh against first j vectors in U. Local+full orthog */
155 9148 static PetscErrorCode OrthogonalizeVector_Zhong_u(Vec uh,BV U,BV MU,PetscInt j,PetscReal *alpha,PetscInt k,PetscScalar *h)
156 {
157 9148 Vec u;
158
159
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
9148 PetscFunctionBegin;
160 /* Local orthogonalization: uh = uh-U[:,j-1]*alpha[j-1] */
161
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));
162
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));
163
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));
164 /* Full orthogonalization */
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(Orthogonalize_Zhong_u(uh,U,MU,j,h));
166
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);
167 }
168
169 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)
170 {
171 1402 PetscInt j,m = *min;
172 1402 Vec uh,vh,x;
173 1402 PetscReal beta0;
174 1402 PetscScalar *hwork,lhwork[100],gamma;
175 1402 PetscBool alloc=PETSC_FALSE;
176
177
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1402 PetscFunctionBegin;
178
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
1402 if (m > 100) {
179 ✗ PetscCall(PetscMalloc1(m,&hwork));
180 alloc = PETSC_TRUE;
181 1402 } else hwork = lhwork;
182
183 /* Normalize initial vector */
184
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
1402 if (k==0) {
185
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));
186
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));
187
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));
188
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));
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(VecDot(uh,vh,&gamma));
190 154 beta0 = PetscSqrtReal(PetscRealPart(gamma));
191
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
154 if (beta0==0.0) {
192 ✗ if (breakdown) *breakdown = PETSC_TRUE;
193 ✗ *min = 1; m = 0;
194 } else {
195
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));
196
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));
197 }
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(BVRestoreColumn(U,0,&uh));
199
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));
200 }
201
202
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
10550 for (j=k;j<m;j++) {
203 /* Compute column j of V, then column j+1 of U and MU */
204
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));
205
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));
206
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));
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(VecCopy(x,vh));
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(BVRestoreColumn(MU,j,&x));
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(OrthogonalizeVector_Zhong_v(vh,V,j,beta,k,hwork));
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(MatMult(K,vh,uh));
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(VecDot(uh,vh,&gamma));
212 9148 alpha[j] = PetscSqrtReal(PetscRealPart(gamma));
213
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
9148 if (alpha[j]==0.0) {
214 ✗ if (breakdown) *breakdown = PETSC_TRUE;
215 ✗ *min = j+1; m = j;
216 ✗ PetscCall(BVRestoreColumn(U,j+1,&uh));
217 } else {
218
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]));
219
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]));
220 }
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(BVRestoreColumn(V,j,&vh));
222
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;
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(OrthogonalizeVector_Zhong_u(uh,U,MU,j+1,alpha,k,hwork));
225
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));
226
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));
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(VecDot(uh,vh,&gamma));
228 9148 beta[j] = PetscSqrtReal(PetscRealPart(gamma));
229
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
9148 if (beta[j]==0.0) {
230 ✗ if (breakdown) *breakdown = PETSC_TRUE;
231 ✗ *min = j+1; m = j;
232 } else {
233
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]));
234
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]));
235 }
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(BVRestoreColumn(U,j+1,&uh));
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(BVRestoreColumn(MU,j+1,&vh));
238 }
239
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));
240
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);
241 }
242
243 /*
244 EPSConvergence_Zhong - convergence check based on SVDKrylovConvergence().
245 FIXME: Code dulication. This is a copy of EPSConvergence_Gruning
246 */
247 1402 static PetscErrorCode EPSConvergence_Zhong(EPS eps,PetscBool getall,PetscInt kini,PetscInt nits,PetscInt *kout)
248 {
249 1402 PetscInt k,marker,ld;
250 1402 PetscReal *alpha,*beta,resnorm;
251 1402 PetscBool extra;
252
253
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1402 PetscFunctionBegin;
254 1402 *kout = 0;
255
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));
256
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));
257
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");
258 1402 marker = -1;
259
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
1402 if (eps->trackall) getall = PETSC_TRUE;
260
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));
261 1402 beta = alpha + ld;
262
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
2572 for (k=kini;k<kini+nits;k++) {
263 2572 resnorm = PetscAbsReal(beta[k]);
264
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));
265
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;
266
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
2572 if (marker!=-1 && !getall) break;
267 }
268
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));
269
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
1402 if (marker!=-1) k = marker;
270 1402 *kout = k;
271
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);
272 }
273
274 154 static PetscErrorCode EPSUnreduceVectors(EPS eps,BV U,BV V)
275 {
276 154 PetscInt k;
277 154 Vec u,v,w;
278
279
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
154 PetscFunctionBegin;
280 /* The approximate eigenvector is [u+v; u-v], where [u; v] is the reduced eigenvector */
281
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));
282
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
1278 for (k=0;k<eps->nconv;k++) {
283
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));
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.
1124 PetscCall(BVGetColumn(V,k,&v));
285
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));
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(VecCopy(u,v));
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(VecAXPY(u,1.0,w));
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(VecAXPY(v,-1.0,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(BVRestoreColumn(U,k,&u));
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(BVRestoreColumn(V,k,&v));
291 }
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.
154 PetscCall(VecDestroy(&w));
293
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);
294 }
295
296 154 static PetscErrorCode EPSComputeVectors_LREP_Teng(EPS eps)
297 {
298 154 Mat H;
299 154 Vec v;
300 154 BV U,V;
301 154 IS is[2];
302 154 PetscInt k;
303 154 PetscScalar lambda;
304 154 PetscBool reduced;
305
306
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
154 PetscFunctionBegin;
307
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));
308
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));
309
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));
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(BVGetSplitRows(eps->V,is[0],is[1],&V,&U));
311
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
1232 for (k=0;k<eps->nconv;k++) {
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.
1078 PetscCall(BVGetColumn(V,k,&v));
313 /* approx eigenvector is [eigr[k]*v; u] */
314 1078 lambda = eps->eigr[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(STBackTransform(eps->st,1,&lambda,&eps->eigi[k]));
316
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));
317
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));
318 }
319
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));
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.
154 PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&V,&U));
321 /* Normalize eigenvectors */
322
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));
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(BVNormalize(eps->V,NULL));
324
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);
325 }
326
327 154 static PetscErrorCode EPSComputeVectors_LREP_Zhong(EPS eps)
328 {
329 154 Mat H;
330 154 BV U,V;
331 154 IS is[2];
332 154 PetscBool reduced;
333
334
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
154 PetscFunctionBegin;
335
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));
336
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));
337 /* Approx eigenvector for the reduced form is [u; v] */
338
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
154 if (!reduced) {
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.
77 PetscCall(MatNestGetISs(H,is,NULL));
340
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));
341
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));
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(BVRestoreSplitRows(eps->V,is[0],is[1],&U,&V));
343 }
344 /* Normalize eigenvectors */
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.
154 PetscCall(BVSetActiveColumns(eps->V,0,eps->nconv));
346
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));
347
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);
348 }
349
350 308 PetscErrorCode EPSSetUp_KrylovSchur_LREP(EPS eps)
351 {
352 308 EPS_KRYLOVSCHUR *ctx = (EPS_KRYLOVSCHUR*)eps->data;
353 308 PetscBool flg;
354
355
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
308 PetscFunctionBegin;
356
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");
357
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");
358
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));
359
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");
360
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);
361
362
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));
363
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");
364
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
308 if (!eps->which) eps->which = EPS_SMALLEST_MAGNITUDE;
365
366
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
308 if (!ctx->keep) ctx->keep = 0.5;
367
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));
368
369
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));
370
2/3
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
308 switch (ctx->lrep) {
371 154 case EPS_KRYLOVSCHUR_LREP_TENG:
372 154 eps->ops->solve = EPSSolve_KrylovSchur_LREP_Teng;
373 154 eps->ops->computevectors = EPSComputeVectors_LREP_Teng;
374
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));
375
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));
376
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));
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(DSAllocate(eps->ds,eps->ncv+1));
378 break;
379 154 case EPS_KRYLOVSCHUR_LREP_ZHONG:
380 154 eps->ops->solve = EPSSolve_KrylovSchur_LREP_Zhong;
381 154 eps->ops->computevectors = EPSComputeVectors_LREP_Zhong;
382
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));
383
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));
384
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));
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(DSAllocate(eps->ds,eps->ncv+1));
386 break;
387 ✗ default: SETERRQ(PetscObjectComm((PetscObject)eps),PETSC_ERR_PLIB,"Unexpected error");
388 }
389
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);
390 }
391
392 154 static PetscErrorCode EPSCreateReducedMats(Mat H,Mat *K,Mat *M)
393 {
394 154 PetscInt ma,na,Ma,Na;
395 154 Mat A,B;
396 154 const PetscScalar scal[] = { 1.0, -1.0 };
397
398
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
154 PetscFunctionBegin;
399
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));
400
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));
401
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));
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(MatGetLocalSize(A,&ma,&na));
403 /* K = A-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(MatCreate(PetscObjectComm((PetscObject)A),K));
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(MatSetSizes(*K,ma,na,Ma,Na));
406
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));
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(MatCompositeAddMat(*K,A));
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(MatCompositeAddMat(*K,B));
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(MatAssemblyBegin(*K,MAT_FINAL_ASSEMBLY));
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(MatAssemblyEnd(*K,MAT_FINAL_ASSEMBLY));
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(MatCompositeSetScalings(*K,scal));
412 /* M = A+B */
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(MatCreate(PetscObjectComm((PetscObject)A),M));
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(MatSetSizes(*M,ma,na,Ma,Na));
415
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));
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(MatCompositeAddMat(*M,A));
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(MatCompositeAddMat(*M,B));
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(MatAssemblyBegin(*M,MAT_FINAL_ASSEMBLY));
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(MatAssemblyEnd(*M,MAT_FINAL_ASSEMBLY));
420
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);
421 }
422
423 154 PetscErrorCode EPSSolve_KrylovSchur_LREP_Teng(EPS eps)
424 {
425 154 EPS_KRYLOVSCHUR *ctx = (EPS_KRYLOVSCHUR*)eps->data;
426 154 PetscInt i,k,l,ld,nv,nconv=0,nevsave;
427 154 Mat H,Q,K,M;
428 154 BV U,V;
429 154 IS is[2];
430 154 PetscReal *a,*b,beta;
431 154 PetscBool reduced,breakdown=PETSC_FALSE;
432
433
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
154 PetscFunctionBegin;
434
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));
435
436 /* Extract matrix blocks */
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(STGetMatrix(eps->st,0,&H));
438
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));
439
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));
440
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
154 if (reduced) {
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.
77 PetscCall(MatNestGetSubMat(H,0,1,&K));
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.
77 PetscCall(MatNestGetSubMat(H,1,0,&M));
443
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));
444
445 /* Get the split bases */
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.
154 PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&V,&U));
447
448 154 nevsave = eps->nev;
449 154 eps->nev = (eps->nev+1)/2;
450 154 l = 0;
451
452 /* Restart loop */
453 154 while (eps->reason == EPS_CONVERGED_ITERATING) {
454 1418 eps->its++;
455
456 /* Compute an nv-step Lanczos factorization */
457 1418 nv = PetscMin(eps->nconv+eps->mpd,eps->ncv);
458
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));
459
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));
460 1418 b = a + ld;
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(EPSLREPLanczos_Teng(eps,K,M,U,V,a,b,eps->nconv+l,&nv,&breakdown));
462 1418 beta = b[nv-1];
463
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));
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(DSSetDimensions(eps->ds,nv,eps->nconv,eps->nconv+l));
465
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));
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(BVSetActiveColumns(eps->V,eps->nconv,nv));
467
468 /* Solve projected problem */
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(DSSolve(eps->ds,eps->eigr,eps->eigi));
470
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));
471
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));
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(DSSynchronize(eps->ds,eps->eigr,eps->eigi));
473
474 /* Check convergence */
475
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]));
476
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));
477
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);
478
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));
479 1418 nconv = k;
480
481 /* Update l */
482
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;
483 1264 else l = PetscMax(1,(PetscInt)((nv-k)*ctx->keep));
484
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 */
485
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));
486
487
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
1418 if (eps->reason == EPS_CONVERGED_ITERATING) {
488
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);
489 /* Prepare the Rayleigh quotient for restart */
490
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));
491 }
492 /* Update the corresponding vectors
493 U(:,idx) = U*Q(:,idx), V(:,idx) = V*Q(:,idx) */
494
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));
495
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));
496
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));
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(DSRestoreMat(eps->ds,DS_MAT_Q,&Q));
498
499
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) {
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.
1264 PetscCall(BVCopyColumn(eps->V,nv,k+l));
501
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 */
502 10 eps->ncv = eps->mpd+k;
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.
10 PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&V,&U));
504
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));
505
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));
506
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
70 for (i=nv;i<eps->ncv;i++) eps->perm[i] = i;
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(DSReallocate(eps->ds,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(DSGetLeadingDimension(eps->ds,&ld));
509 }
510 }
511 1418 eps->nconv = k;
512
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));
513 }
514
515 154 eps->nev = nevsave;
516
517
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));
518
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));
519
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
154 if (!reduced) {
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.
77 PetscCall(MatDestroy(&K));
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.
77 PetscCall(MatDestroy(&M));
522 }
523
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);
524 }
525
526 154 PetscErrorCode EPSSolve_KrylovSchur_LREP_Zhong(EPS eps)
527 {
528 154 EPS_KRYLOVSCHUR *ctx = (EPS_KRYLOVSCHUR*)eps->data;
529 154 PetscInt i,k,l,ld,nv,nconv=0,nevsave;
530 154 Mat H,Q,Z,K,M;
531 154 BV U,V,MU;
532 154 IS is[2];
533 154 PetscReal *a,*b,beta;
534 154 PetscBool reduced,breakdown=PETSC_FALSE;
535
536
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
154 PetscFunctionBegin;
537
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));
538
539 /* Extract matrix blocks */
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(STGetMatrix(eps->st,0,&H));
541
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));
542
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));
543
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
154 if (reduced) {
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.
77 PetscCall(MatNestGetSubMat(H,0,1,&K));
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.
77 PetscCall(MatNestGetSubMat(H,1,0,&M));
546
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));
547
548 /* Get the split bases */
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.
154 PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&U,&V));
550
551 /* Create MU */
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(BVDuplicate(U,&MU));
553
554 154 nevsave = eps->nev;
555 154 eps->nev = (eps->nev+1)/2;
556 154 l = 0;
557
558 /* Restart loop */
559 154 while (eps->reason == EPS_CONVERGED_ITERATING) {
560 1402 eps->its++;
561
562 /* Compute an nv-step Lanczos factorization */
563 1402 nv = PetscMin(eps->nconv+eps->mpd,eps->ncv);
564
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));
565
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));
566 1402 b = a + ld;
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(EPSLREPLanczos_Zhong(eps,K,M,U,V,MU,a,b,eps->nconv+l,&nv,&breakdown));
568 1402 beta = b[nv-1];
569
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));
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(DSSetDimensions(eps->ds,nv,eps->nconv,eps->nconv+l));
571
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));
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(DSSetState(eps->ds,l?DS_STATE_RAW:DS_STATE_INTERMEDIATE));
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(BVSetActiveColumns(U,eps->nconv,nv));
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(BVSetActiveColumns(V,eps->nconv,nv));
575
576 /* Solve projected problem */
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(DSSolve(eps->ds,eps->eigr,eps->eigi));
578
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));
579
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));
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(DSSynchronize(eps->ds,eps->eigr,eps->eigi));
581
582 /* Check convergence */
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(EPSConvergence_Zhong(eps,PETSC_FALSE,eps->nconv,nv-eps->nconv,&k));
584
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);
585
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));
586 1402 nconv = k;
587
588 /* Update l */
589
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;
590 1248 else l = PetscMax(1,(PetscInt)((nv-k)*ctx->keep));
591
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 */
592
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));
593
594
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
1402 if (eps->reason == EPS_CONVERGED_ITERATING) {
595
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);
596 /* Prepare the Rayleigh quotient for restart */
597
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));
598 }
599 /* Update the corresponding vectors
600 U(:,idx) = U*Q(:,idx), MU(:,idx) = MU*Q(:,idx), V(:,idx) = V*Z(:,idx), */
601
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));
602
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));
603
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));
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(BVMultInPlace(MU,Q,eps->nconv,k+l));
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(BVMultInPlace(V,Z,eps->nconv,k+l));
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(DSRestoreMat(eps->ds,DS_MAT_U,&Z));
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(DSRestoreMat(eps->ds,DS_MAT_V,&Q));
608
609
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) {
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.
1248 PetscCall(BVCopyColumn(U,nv,k+l));
611
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));
612
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 */
613 10 eps->ncv = eps->mpd+k;
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.
10 PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&U,&V));
615
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));
616
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));
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(BVResize(MU,eps->ncv+1,PETSC_TRUE));
618
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
70 for (i=nv;i<eps->ncv;i++) eps->perm[i] = i;
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(DSReallocate(eps->ds,eps->ncv+1));
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(DSGetLeadingDimension(eps->ds,&ld));
621 }
622 }
623
624 1402 eps->nconv = k;
625
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));
626 }
627
628 154 eps->nev = nevsave;
629
630
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));
631
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));
632
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));
633
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
154 if (!reduced) {
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.
77 PetscCall(MatDestroy(&K));
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.
77 PetscCall(MatDestroy(&M));
636 }
637
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);
638 }
639