GCC Code Coverage Report


Directory: ./
File: src/eps/impls/krylov/krylovschur/ks-bse.c
Date: 2025-10-04 04:19:13
Exec Total Coverage
Lines: 673 674 99.9%
Functions: 17 17 100.0%
Branches: 1832 2830 64.7%

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 Bethe-Salpeter pseudo-Hermitan matrices
14
15 References:
16
17 [1] M. Shao et al, "A structure preserving Lanczos algorithm for computing
18 the optical absorption spectrum", SIAM J. Matrix Anal. App. 39(2), 2018.
19
20 [2] F. Alvarruiz, B. Mellado-Pinto, J. E. Roman, "Variants of thick-restart
21 Lanczos for the Bethe-Salpeter eigenvalue problem", arXiv:2503.20920,
22 2025.
23
24 */
25 #include <slepc/private/epsimpl.h>
26 #include "krylovschur.h"
27
28 static PetscBool cited = PETSC_FALSE;
29 static const char citation[] =
30 "@Misc{slepc-bse,\n"
31 " author = \"F. Alvarruiz and B. Mellado-Pinto and J. E. Roman\",\n"
32 " title = \"Variants of thick-restart {Lanczos} for the {Bethe--Salpeter} eigenvalue problem\",\n"
33 " eprint = \"2503.20920\",\n"
34 " archivePrefix = \"arXiv\",\n"
35 " primaryClass = \"mathematics.numerical analysis\",\n"
36 " year = \"2025,\"\n"
37 " doi = \"https://doi.org/10.48550/arXiv.2503.20920\"\n"
38 "}\n";
39
40 13981 static PetscErrorCode Orthog_Shao(Vec x,BV U,BV V,PetscInt j,PetscScalar *h,PetscScalar *c,PetscBool *breakdown)
41 {
42 13981 PetscInt i;
43
44
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
13981 PetscFunctionBegin;
45
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13981 PetscCall(BVSetActiveColumns(U,0,j));
46
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13981 PetscCall(BVSetActiveColumns(V,0,j));
47 /* c = real(V^* x) ; c2 = imag(U^* x)*1i */
48 #if defined(PETSC_USE_COMPLEX)
49
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
8421 PetscCall(BVDotVecBegin(V,x,c));
50
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
8421 PetscCall(BVDotVecBegin(U,x,c+j));
51
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
8421 PetscCall(BVDotVecEnd(V,x,c));
52
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
8421 PetscCall(BVDotVecEnd(U,x,c+j));
53 #else
54
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
5560 PetscCall(BVDotVec(V,x,c));
55 #endif
56 #if defined(PETSC_USE_COMPLEX)
57
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
113896 for (i=0; i<j; i++) {
58 105475 c[i] = PetscRealPart(c[i]);
59 105475 c[j+i] = PetscCMPLX(0.0,PetscImaginaryPart(c[j+i]));
60 }
61 #endif
62 /* x = x-U*c-V*c2 */
63
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13981 PetscCall(BVMultVec(U,-1.0,1.0,x,c));
64 #if defined(PETSC_USE_COMPLEX)
65
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
8421 PetscCall(BVMultVec(V,-1.0,1.0,x,c+j));
66 #endif
67 /* accumulate orthog coeffs into h */
68
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
355191 for (i=0; i<2*j; i++) h[i] += c[i];
69
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
2590 PetscFunctionReturn(PETSC_SUCCESS);
70 }
71
72 /* Orthogonalize vector x against first j vectors in U and V
73 v is column j-1 of V */
74 13981 static PetscErrorCode OrthogonalizeVector_Shao(Vec x,BV U,BV V,PetscInt j,Vec v,PetscReal *beta,PetscInt k,PetscScalar *h,PetscBool *breakdown)
75 {
76 13981 PetscReal alpha;
77 13981 PetscInt i,l;
78
79
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
13981 PetscFunctionBegin;
80
4/6
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13981 PetscCall(PetscArrayzero(h,2*j));
81
82 /* Local orthogonalization */
83
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
13981 l = j==k+1?0:j-2; /* 1st column to orthogonalize against */
84
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13981 PetscCall(VecDotRealPart(x,v,&alpha));
85
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
45933 for (i=l; i<j-1; i++) h[i] = beta[i];
86 13981 h[j-1] = alpha;
87 /* x = x-U(:,l:j-1)*h(l:j-1) */
88
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13981 PetscCall(BVSetActiveColumns(U,l,j));
89
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13981 PetscCall(BVMultVec(U,-1.0,1.0,x,h+l));
90
91 /* Full orthogonalization */
92
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13981 PetscCall(Orthog_Shao(x,U,V,j,h,h+2*j,breakdown));
93
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
2590 PetscFunctionReturn(PETSC_SUCCESS);
94 }
95
96 2376 static PetscErrorCode EPSBSELanczos_Shao(EPS eps,BV U,BV V,PetscReal *alpha,PetscReal *beta,PetscInt k,PetscInt *M,PetscBool *breakdown)
97 {
98 2376 PetscInt j,m = *M;
99 2376 Vec v,x,y,w,f,g,vecs[2];
100 2376 Mat H;
101 2376 IS is[2];
102 2376 PetscReal nrm;
103 2376 PetscScalar *hwork,lhwork[100],gamma;
104 2376 PetscContainer container;
105 2376 SlepcMatStruct mctx;
106
107
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2376 PetscFunctionBegin;
108
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
2376 if (4*m > 100) PetscCall(PetscMalloc1(4*m,&hwork));
109 2376 else hwork = lhwork;
110
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2376 PetscCall(STGetMatrix(eps->st,0,&H));
111
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2376 PetscCall(MatNestGetISs(H,is,NULL));
112
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2376 PetscCall(PetscObjectQuery((PetscObject)H,"SlepcMatStruct",(PetscObject*)&container));
113
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2376 PetscCall(PetscContainerGetPointer(container,(void**)&mctx));
114
115 /* create work vectors */
116
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2376 PetscCall(BVGetColumn(V,0,&v));
117
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2376 PetscCall(VecDuplicate(v,&w));
118 2376 vecs[0] = v;
119 2376 vecs[1] = w;
120
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2376 PetscCall(VecCreateNest(PetscObjectComm((PetscObject)eps),2,is,vecs,&f));
121
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2376 PetscCall(VecCreateNest(PetscObjectComm((PetscObject)eps),2,is,vecs,&g));
122
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2376 PetscCall(BVRestoreColumn(V,0,&v));
123
124 /* Normalize initial vector */
125
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2376 if (k==0) {
126
5/8
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
118 if (eps->nini==0) PetscCall(BVSetRandomColumn(eps->V,0));
127
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
118 PetscCall(BVGetColumn(U,0,&x));
128
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
118 PetscCall(BVGetColumn(V,0,&y));
129
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
118 PetscCall(VecNestSetSubVec(f,0,x));
130
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
118 PetscCall(VecNestSetSubVec(g,0,y));
131 118 mctx->s = 1.0;
132
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
118 PetscCall(STApply(eps->st,f,g));
133
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
118 PetscCall(VecDot(y,x,&gamma));
134 118 nrm = PetscSqrtReal(PetscRealPart(gamma));
135
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
118 PetscCall(VecScale(x,1.0/nrm));
136
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
118 PetscCall(VecScale(y,1.0/nrm));
137
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
118 PetscCall(BVRestoreColumn(U,0,&x));
138
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
118 PetscCall(BVRestoreColumn(V,0,&y));
139 }
140
141
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
16357 for (j=k;j<m;j++) {
142 /* j+1 columns (indexes 0 to j) have been computed */
143
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13981 PetscCall(BVGetColumn(V,j,&v));
144
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13981 PetscCall(BVGetColumn(U,j+1,&x));
145
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13981 PetscCall(BVGetColumn(V,j+1,&y));
146
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13981 PetscCall(VecNestSetSubVec(f,0,v));
147
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13981 PetscCall(VecNestSetSubVec(g,0,x));
148 13981 mctx->s = -1.0;
149
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13981 PetscCall(STApply(eps->st,f,g));
150
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13981 PetscCall(OrthogonalizeVector_Shao(x,U,V,j+1,v,beta,k,hwork,breakdown));
151 13981 alpha[j] = PetscRealPart(hwork[j]);
152
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13981 PetscCall(VecNestSetSubVec(f,0,x));
153
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13981 PetscCall(VecNestSetSubVec(g,0,y));
154 13981 mctx->s = 1.0;
155
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13981 PetscCall(STApply(eps->st,f,g));
156
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13981 PetscCall(VecDot(x,y,&gamma));
157 13981 beta[j] = PetscSqrtReal(PetscRealPart(gamma));
158
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13981 PetscCall(VecScale(x,1.0/beta[j]));
159
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13981 PetscCall(VecScale(y,1.0/beta[j]));
160
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13981 PetscCall(BVRestoreColumn(V,j,&v));
161
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13981 PetscCall(BVRestoreColumn(U,j+1,&x));
162
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13981 PetscCall(BVRestoreColumn(V,j+1,&y));
163 }
164
1/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
2376 if (4*m > 100) PetscCall(PetscFree(hwork));
165
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2376 PetscCall(VecDestroy(&w));
166
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2376 PetscCall(VecDestroy(&f));
167
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2376 PetscCall(VecDestroy(&g));
168
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
456 PetscFunctionReturn(PETSC_SUCCESS);
169 }
170
171 118 static PetscErrorCode EPSComputeVectors_BSE_Shao(EPS eps)
172 {
173 118 Mat H;
174 118 Vec u1,v1;
175 118 BV U,V;
176 118 IS is[2];
177 118 PetscInt k;
178 118 PetscScalar lambda;
179
180
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
118 PetscFunctionBegin;
181
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
118 PetscCall(STGetMatrix(eps->st,0,&H));
182
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
118 PetscCall(MatNestGetISs(H,is,NULL));
183
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
118 PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&U,&V));
184
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
975 for (k=0; k<eps->nconv; k++) {
185
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
857 PetscCall(BVGetColumn(U,k,&u1));
186
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
857 PetscCall(BVGetColumn(V,k,&v1));
187 /* approx eigenvector is [ (eigr[k]*u1+v1)]
188 [conj(eigr[k]*u1-v1)] */
189 857 lambda = eps->eigr[k];
190
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
857 PetscCall(STBackTransform(eps->st,1,&lambda,&eps->eigi[k]));
191
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
857 PetscCall(VecAYPX(u1,lambda,v1));
192
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
857 PetscCall(VecAYPX(v1,-2.0,u1));
193
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
857 PetscCall(VecConjugate(v1));
194
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
857 PetscCall(BVRestoreColumn(U,k,&u1));
195
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
857 PetscCall(BVRestoreColumn(V,k,&v1));
196 }
197
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
118 PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&U,&V));
198 /* Normalize eigenvectors */
199
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
118 PetscCall(BVSetActiveColumns(eps->V,0,eps->nconv));
200
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
118 PetscCall(BVNormalize(eps->V,NULL));
201
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
18 PetscFunctionReturn(PETSC_SUCCESS);
202 }
203
204 13541 static PetscErrorCode Orthog_Gruning(Vec x,BV U,BV V,BV HU,BV HV,PetscInt j,PetscScalar *h,PetscScalar *c,PetscBool *breakdown)
205 {
206 13541 PetscInt i;
207
208
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
13541 PetscFunctionBegin;
209
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(BVSetActiveColumns(U,0,j));
210
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(BVSetActiveColumns(HU,0,j));
211
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(BVSetActiveColumns(V,0,j));
212
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(BVSetActiveColumns(HV,0,j));
213 #if defined(PETSC_USE_COMPLEX)
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.
8262 PetscCall(BVDotVecBegin(HU,x,c));
215
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
8262 PetscCall(BVDotVecBegin(HV,x,c+j));
216
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
8262 PetscCall(BVDotVecEnd(HU,x,c));
217
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
8262 PetscCall(BVDotVecEnd(HV,x,c+j));
218 #else
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.
5279 PetscCall(BVDotVec(HU,x,c));
220 #endif
221
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
178056 for (i=0; i<j; i++) {
222 /* c1 = 2*real(HU^* x) ; c2 = 2*imag(HV^* x)*1i */
223 #if defined(PETSC_USE_COMPLEX)
224 103033 c[i] = PetscRealPart(c[i]);
225 103033 c[j+i] = PetscCMPLX(0.0,PetscImaginaryPart(c[j+i]));
226 #else
227 61482 c[j+i] = 0.0;
228 #endif
229 }
230 /* x = x-U*c1-V*c2 */
231 #if defined(PETSC_USE_COMPLEX)
232
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
8262 PetscCall(BVMultVec(U,-2.0,1.0,x,c));
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.
8262 PetscCall(BVMultVec(V,-2.0,1.0,x,c+j));
234 #else
235
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
5279 PetscCall(BVMultVec(U,-2.0,1.0,x,c));
236 #endif
237 /* accumulate orthog coeffs into h */
238
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
342571 for (i=0; i<2*j; i++) h[i] += 2*c[i];
239
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
2575 PetscFunctionReturn(PETSC_SUCCESS);
240 }
241
242 /* Orthogonalize vector x against first j vectors in U and V */
243 27082 static PetscErrorCode OrthogonalizeVector_Gruning(Vec x,BV U,BV V,BV HU,BV HV,PetscInt j,PetscReal *beta,PetscInt k,PetscScalar *h,PetscBool s,PetscBool *breakdown)
244 {
245 27082 PetscInt l,i;
246 27082 Vec u;
247
248
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
27082 PetscFunctionBegin;
249
4/6
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
27082 PetscCall(PetscArrayzero(h,4*j));
250
251
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
27082 if (s) {
252 /* Local orthogonalization */
253
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(BVGetColumn(U,j-1,&u));
254
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(VecAXPY(x,-*beta,u));
255
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(BVRestoreColumn(U,j-1,&u));
256 13541 h[j-1] = *beta;
257 /* Full orthogonalization */
258
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(Orthog_Gruning(x,U,V,HU,HV,j,h,h+2*j,breakdown));
259 } else {
260 /* Local orthogonalization */
261
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
13541 l = j==k+1?0:j-2; /* 1st column to orthogonalize against */
262
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
44717 for (i=l; i<j-1; i++) h[j+i] = beta[i];
263 /* x = x-V(:,l:j-2)*h(l:j-2) */
264
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(BVSetActiveColumns(V,l,j-1));
265
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(BVMultVec(V,-1.0,1.0,x,h+j+l));
266 }
267
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
5150 PetscFunctionReturn(PETSC_SUCCESS);
268 }
269
270 2332 static PetscErrorCode EPSBSELanczos_Gruning(EPS eps,BV U,BV V,BV HU,BV HV,PetscReal *beta1,PetscReal *beta2,PetscInt k,PetscInt *M,PetscBool *breakdown)
271 {
272 2332 PetscInt j,m = *M;
273 2332 Vec v,x,y,w,f,g,vecs[2];
274 2332 Mat H;
275 2332 IS is[2];
276 2332 PetscReal nrm;
277 2332 PetscScalar *hwork,lhwork[100],dot;
278 2332 PetscContainer container;
279 2332 SlepcMatStruct mctx;
280
281
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2332 PetscFunctionBegin;
282
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
2332 if (4*m > 100) PetscCall(PetscMalloc1(4*m,&hwork));
283 2332 else hwork = lhwork;
284
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(STGetMatrix(eps->st,0,&H));
285
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(MatNestGetISs(H,is,NULL));
286
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(PetscObjectQuery((PetscObject)H,"SlepcMatStruct",(PetscObject*)&container));
287
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(PetscContainerGetPointer(container,(void**)&mctx));
288
289 /* create work vectors */
290
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(BVGetColumn(V,0,&v));
291
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(VecDuplicate(v,&w));
292 2332 vecs[0] = v;
293 2332 vecs[1] = w;
294
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(VecCreateNest(PetscObjectComm((PetscObject)eps),2,is,vecs,&f));
295
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(VecCreateNest(PetscObjectComm((PetscObject)eps),2,is,vecs,&g));
296
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(BVRestoreColumn(V,0,&v));
297
298 /* Normalize initial vector */
299
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2332 if (k==0) {
300
5/8
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
113 if (eps->nini==0) PetscCall(BVSetRandomColumn(eps->V,0));
301 /* y = Hmult(v1,1) */
302
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(BVGetColumn(U,k,&x));
303
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(BVGetColumn(HU,k,&y));
304
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(VecNestSetSubVec(f,0,x));
305
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(VecNestSetSubVec(g,0,y));
306 113 mctx->s = 1.0;
307
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(STApply(eps->st,f,g));
308 /* nrm = sqrt(2*real(u1'*y)); */
309
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(VecDot(x,y,&dot));
310 113 nrm = PetscSqrtReal(PetscRealPart(2*dot));
311 /* U(:,j) = u1/nrm; */
312 /* HU(:,j) = y/nrm; */
313
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(VecScale(x,1.0/nrm));
314
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(VecScale(y,1.0/nrm));
315
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(BVRestoreColumn(U,k,&x));
316
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(BVRestoreColumn(HU,k,&y));
317 }
318
319
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
15873 for (j=k;j<m;j++) {
320 /* j+1 columns (indexes 0 to j) have been computed */
321
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(BVGetColumn(HU,j,&x));
322
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(BVGetColumn(V,j,&v));
323
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(BVGetColumn(HV,j,&y));
324
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(VecCopy(x,v));
325
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(BVRestoreColumn(HU,j,&x));
326 /* v = Orthogonalize HU(:,j) */
327
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(OrthogonalizeVector_Gruning(v,U,V,HU,HV,j+1,beta2,k,hwork,PETSC_FALSE,breakdown));
328 /* y = Hmult(v,-1) */
329
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(VecNestSetSubVec(f,0,v));
330
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(VecNestSetSubVec(g,0,y));
331 13541 mctx->s = -1.0;
332
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(STApply(eps->st,f,g));
333 /* beta = sqrt(2*real(v'*y)); */
334
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(VecDot(v,y,&dot));
335 13541 beta1[j] = PetscSqrtReal(PetscRealPart(2*dot)); //FIXME Check beta != 0?
336 /* V(:,j) = v/beta1; */
337 /* HV(:,j) = y/beta1; */
338
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(VecScale(v,1.0/beta1[j]));
339
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(VecScale(y,1.0/beta1[j]));
340
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(BVRestoreColumn(V,j,&v));
341
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(BVRestoreColumn(HV,j,&y));
342
343
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(BVGetColumn(HV,j,&x));
344
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(BVGetColumn(U,j+1,&v));
345
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(BVGetColumn(HU,j+1,&y));
346
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(VecCopy(x,v));
347
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(BVRestoreColumn(HV,j,&x));
348 /* v = Orthogonalize HV(:,j) */
349
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(OrthogonalizeVector_Gruning(v,U,V,HU,HV,j+1,&beta1[j],k,hwork,PETSC_TRUE,breakdown));
350 /* y = Hmult(v,1) */
351
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(VecNestSetSubVec(f,0,v));
352
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(VecNestSetSubVec(g,0,y));
353 13541 mctx->s = 1.0;
354
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(STApply(eps->st,f,g));
355 /* beta = sqrt(2*real(v'*y)); */
356
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(VecDot(v,y,&dot));
357 13541 beta2[j] = PetscSqrtReal(PetscRealPart(2*dot)); //FIXME Check beta != 0?
358 /* U(:,j) = v/beta2; */
359 /* HU(:,j) = y/beta2; */
360
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(VecScale(v,1.0/beta2[j]));
361
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(VecScale(y,1.0/beta2[j]));
362
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(BVRestoreColumn(U,j+1,&v));
363
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13541 PetscCall(BVRestoreColumn(HU,j+1,&y));
364 }
365
1/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
2332 if (4*m > 100) PetscCall(PetscFree(hwork));
366
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(VecDestroy(&w));
367
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(VecDestroy(&f));
368
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(VecDestroy(&g));
369
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
465 PetscFunctionReturn(PETSC_SUCCESS);
370 }
371
372 113 static PetscErrorCode EPSComputeVectors_BSE_Gruning(EPS eps)
373 {
374 113 Mat H;
375 113 Vec u1,v1;
376 113 BV U,V;
377 113 IS is[2];
378 113 PetscInt k;
379
380
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
113 PetscFunctionBegin;
381
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(STGetMatrix(eps->st,0,&H));
382
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(MatNestGetISs(H,is,NULL));
383
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&U,&V));
384 /* approx eigenvector [x1] is [ u1+v1 ]
385 [x2] [conj(u1)-conj(v1)] */
386
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
901 for (k=0; k<eps->nconv; k++) {
387
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
788 PetscCall(BVGetColumn(U,k,&u1));
388
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
788 PetscCall(BVGetColumn(V,k,&v1));
389 /* x1 = u1 + v1 */
390
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
788 PetscCall(VecAXPY(u1,1.0,v1));
391 /* x2 = conj(u1) - conj(v1) = conj(u1 - v1) = conj((u1 + v1) - 2*v1) */
392
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
788 PetscCall(VecAYPX(v1,-2.0,u1));
393
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
788 PetscCall(VecConjugate(v1));
394
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
788 PetscCall(BVRestoreColumn(U,k,&u1));
395
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
788 PetscCall(BVRestoreColumn(V,k,&v1));
396 }
397
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&U,&V));
398 /* Normalize eigenvectors */
399
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(BVSetActiveColumns(eps->V,0,eps->nconv));
400
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(BVNormalize(eps->V,NULL));
401
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
17 PetscFunctionReturn(PETSC_SUCCESS);
402 }
403
404 /* Full orthogonalization of vector [hx, conj(hx)] against first j vectors in X and Y */
405 13491 static PetscErrorCode Orthog_ProjectedBSE(Vec hx,BV X,BV Y,PetscInt j,PetscScalar *h,PetscScalar *c,PetscBool *breakdown)
406 {
407 13491 PetscInt i;
408
409
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
13491 PetscFunctionBegin;
410
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(BVSetActiveColumns(X,0,j));
411
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(BVSetActiveColumns(Y,0,j));
412 /* c1 = X^* hx */
413
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(BVDotVec(X,hx,c));
414 /* c2 = Y^* conj(hx) */
415
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(VecConjugate(hx));
416
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(BVDotVec(Y,hx,c+j));
417 /* c = c1 - c2 */
418
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
179616 for (i=0;i<j;i++) c[i] -= c[i+j];
419 /* hx = hx - conj(Y*c) */
420
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(BVMultVec(Y,-1.0,1.0,hx,c));
421
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(VecConjugate(hx));
422 /* hx = hx - X*c */
423
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(BVMultVec(X,-1.0,1.0,hx,c));
424 /* accumulate orthog coeffs into h */
425
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
179616 for (i=0;i<j;i++) h[i] += c[i];
426
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
2528 PetscFunctionReturn(PETSC_SUCCESS);
427 }
428
429 /* Orthogonalize vector [hx; hy] against first j vectors in X and Y
430 The result is a vector [u; conj(u)]. Vector hx is overwritten with u. */
431 13491 static PetscErrorCode OrthogonalizeVector_ProjectedBSE(Vec hx,Vec hy,BV X,BV Y,PetscInt j,PetscReal *beta,PetscInt k,PetscScalar *h,PetscBool *breakdown)
432 {
433 13491 PetscInt l,i;
434 13491 PetscScalar alpha,alpha1,alpha2;
435 13491 Vec x,y;
436
437
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
13491 PetscFunctionBegin;
438
4/6
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(PetscArrayzero(h,2*j));
439
440 /* Local orthogonalization */
441
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
13491 l = j==k+1?0:j-2; /* 1st column to orthogonalize against */
442 /* alpha = X(:,j-1)'*hx-Y(:,j-1)'*hy */
443
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(BVGetColumn(X,j-1,&x));
444
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(BVGetColumn(Y,j-1,&y));
445
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(VecDotBegin(hx,x,&alpha1));
446
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(VecDotBegin(hy,y,&alpha2));
447
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(VecDotEnd(hx,x,&alpha1));
448
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(VecDotEnd(hy,y,&alpha2));
449
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(BVRestoreColumn(X,j-1,&x));
450
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(BVRestoreColumn(Y,j-1,&y));
451 13491 alpha = alpha1-alpha2;
452 /* Store coeffs into h */
453
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
44911 for (i=l; i<j-1; i++) h[i] = h[j+i] = beta[i]/2.0;
454 13491 h[j-1] = alpha;
455
456 /* Orthogonalize: hx = hx - X(:,l:j-1)*h1 - conj(Y(:,l:j-1))*h2 */
457 /* hx = hx - X(:,l:j-1)*h1 */
458
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(BVSetActiveColumns(X,l,j));
459
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(BVSetActiveColumns(Y,l,j));
460
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(BVMultVec(X,-1.0,1.0,hx,h+l));
461 /* hx = conj(hx) */
462
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(VecConjugate(hx));
463 /* hx = hx - Y(:,l:j-1)*conj(h2) */
464 13491 h[2*j-1] = PetscConj(alpha-1.0);
465
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(BVMultVec(Y,-1.0,1.0,hx,h+j+l));
466 13491 h[2*j-1] = alpha-1.0;
467 /* hx = conj(hx) */
468
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(VecConjugate(hx));
469
470 /* Full orthogonalization */
471
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(Orthog_ProjectedBSE(hx,X,Y,j,h,h+2*j,breakdown));
472
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
2528 PetscFunctionReturn(PETSC_SUCCESS);
473 }
474
475 2332 static PetscErrorCode EPSBSELanczos_ProjectedBSE(EPS eps,BV X,BV Y,Vec v,PetscReal *alpha,PetscReal *beta,PetscInt k,PetscInt *M,PetscBool *breakdown)
476 {
477 2332 PetscInt j,m = *M;
478 2332 Vec u,x,y,w,f,g,vecs[2];
479 2332 Mat H;
480 2332 IS is[2];
481 2332 PetscReal nrm;
482 2332 PetscScalar *hwork,lhwork[100],gamma;
483 2332 PetscContainer container;
484 2332 SlepcMatStruct mctx;
485
486
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2332 PetscFunctionBegin;
487
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
2332 if (4*m > 100) PetscCall(PetscMalloc1(4*m,&hwork));
488 2332 else hwork = lhwork;
489
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(STGetMatrix(eps->st,0,&H));
490
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(MatNestGetISs(H,is,NULL));
491
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(PetscObjectQuery((PetscObject)H,"SlepcMatStruct",(PetscObject*)&container));
492
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(PetscContainerGetPointer(container,(void**)&mctx));
493
494 /* create work vectors */
495
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(BVGetColumn(Y,0,&u));
496
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(VecDuplicate(u,&w));
497 2332 vecs[0] = u;
498 2332 vecs[1] = w;
499
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(VecCreateNest(PetscObjectComm((PetscObject)eps),2,is,vecs,&f));
500
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(VecCreateNest(PetscObjectComm((PetscObject)eps),2,is,vecs,&g));
501
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(BVRestoreColumn(Y,0,&u));
502
503 /* Normalize initial vector */
504
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2332 if (k==0) {
505
5/8
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
103 if (eps->nini==0) PetscCall(BVSetRandomColumn(eps->V,0));
506
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(BVGetColumn(X,0,&x));
507 /* v = Hmult(u,1) */
508
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(BVGetColumn(Y,0,&y));
509
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(VecNestSetSubVec(f,0,x));
510
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(VecNestSetSubVec(g,0,y));
511 103 mctx->s = 1.0;
512
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(STApply(eps->st,f,g));
513 /* nrm = sqrt(real(u'*v)) */
514
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(VecDot(y,x,&gamma));
515 103 nrm = PetscSqrtReal(PetscRealPart(gamma));
516 /* u = u /(nrm*2) */
517
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(VecScale(x,1.0/(2.0*nrm)));
518 /* v = v /(nrm*2) */
519
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(VecScale(y,1.0/(2.0*nrm)));
520
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(VecCopy(y,v));
521 /* X(:,1) = (u+v) */
522
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(VecAXPY(x,1,y));
523 /* Y(:,1) = conj(u-v) */
524
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(VecAYPX(y,-2,x));
525
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(VecConjugate(y));
526
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(BVRestoreColumn(X,0,&x));
527
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(BVRestoreColumn(Y,0,&y));
528 }
529
530
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
15823 for (j=k;j<m;j++) {
531 /* j+1 columns (indexes 0 to j) have been computed */
532
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(BVGetColumn(X,j+1,&x));
533
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(BVGetColumn(Y,j+1,&y));
534 /* u = Hmult(v,-1)*/
535
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(VecNestSetSubVec(f,0,v));
536
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(VecNestSetSubVec(g,0,x));
537 13491 mctx->s = -1.0;
538
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(STApply(eps->st,f,g));
539 /* hx = (u+v) */
540
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(VecCopy(x,y));
541
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(VecAXPY(x,1,v));
542 /* hy = conj(u-v) */
543
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(VecAXPY(y,-1,v));
544
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(VecConjugate(y));
545 /* [u,cd] = orthog(hx,hy,X(:,1:j),Y(:,1:j),opt)*/
546
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(OrthogonalizeVector_ProjectedBSE(x,y,X,Y,j+1,beta,k,hwork,breakdown));
547 /* alpha(j) = 2*(real(cd(j))-1/2) */
548 13491 alpha[j] = 2*(PetscRealPart(hwork[j]) - 0.5);
549 /* v = Hmult(u,1) */
550
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(VecNestSetSubVec(f,0,x));
551
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(VecNestSetSubVec(g,0,y));
552 13491 mctx->s = 1.0;
553
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(STApply(eps->st,f,g));
554 /* nrm = sqrt(real(u'*v)) */
555 /* beta(j) = 2*nrm */
556
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(VecDot(x,y,&gamma));
557 13491 beta[j] = 2.0*PetscSqrtReal(PetscRealPart(gamma));
558 /* u = u/(nrm*2) */
559
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(VecScale(x,1.0/beta[j]));
560 /* v = v/(nrm*2) */
561
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(VecScale(y,1.0/beta[j]));
562
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(VecCopy(y,v));
563 /* X(:,j+1) = (u+v) */
564
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(VecAXPY(x,1,y));
565 /* Y(:,j+1) = conj(u-v) */
566
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(VecAYPX(y,-2,x));
567
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(VecConjugate(y));
568 /* Restore */
569
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(BVRestoreColumn(X,j+1,&x));
570
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
13491 PetscCall(BVRestoreColumn(Y,j+1,&y));
571 }
572
1/10
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
2332 if (4*m > 100) PetscCall(PetscFree(hwork));
573
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(VecDestroy(&w));
574
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(VecDestroy(&f));
575
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(VecDestroy(&g));
576
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
452 PetscFunctionReturn(PETSC_SUCCESS);
577 }
578
579 103 static PetscErrorCode EPSComputeVectors_BSE_ProjectedBSE(EPS eps)
580 {
581 103 Mat H;
582 103 Vec x1,y1,cx1,cy1;
583 103 BV X,Y;
584 103 IS is[2];
585 103 PetscInt k;
586 103 PetscScalar delta1,delta2,lambda;
587
588
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
103 PetscFunctionBegin;
589
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(STGetMatrix(eps->st,0,&H));
590
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(MatNestGetISs(H,is,NULL));
591
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&X,&Y));
592
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(BVCreateVec(X,&cx1));
593
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(BVCreateVec(Y,&cy1));
594
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
835 for (k=0; k<eps->nconv; k++) {
595 /* approx eigenvector is [ delta1*x1 + delta2*conj(y1) ]
596 [ delta1*y1 + delta2*conj(x1) ] */
597 732 lambda = eps->eigr[k];
598
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
732 PetscCall(STBackTransform(eps->st,1,&lambda,&eps->eigi[k]));
599 732 delta1 = lambda+1.0;
600 732 delta2 = lambda-1.0;
601
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
732 PetscCall(BVGetColumn(X,k,&x1));
602
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
732 PetscCall(BVGetColumn(Y,k,&y1));
603
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
732 PetscCall(VecCopy(x1,cx1));
604
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
732 PetscCall(VecCopy(y1,cy1));
605
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
732 PetscCall(VecConjugate(cx1));
606
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
732 PetscCall(VecConjugate(cy1));
607
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
732 PetscCall(VecScale(x1,delta1));
608
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
732 PetscCall(VecScale(y1,delta1));
609
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
732 PetscCall(VecAXPY(x1,delta2,cy1));
610
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
732 PetscCall(VecAXPY(y1,delta2,cx1));
611
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
732 PetscCall(BVRestoreColumn(X,k,&x1));
612
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
732 PetscCall(BVRestoreColumn(Y,k,&y1));
613 }
614
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&X,&Y));
615
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(BVSetActiveColumns(eps->V,0,eps->nconv));
616 /* Normalize eigenvector */
617
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(BVNormalize(eps->V,NULL));
618
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(VecDestroy(&cx1));
619
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(VecDestroy(&cy1));
620
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
15 PetscFunctionReturn(PETSC_SUCCESS);
621 }
622
623 334 PetscErrorCode EPSSetUp_KrylovSchur_BSE(EPS eps)
624 {
625 334 EPS_KRYLOVSCHUR *ctx = (EPS_KRYLOVSCHUR*)eps->data;
626 334 PetscBool flg,sinvert;
627
628
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
334 PetscFunctionBegin;
629
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
334 PetscCheck((eps->problem_type==EPS_BSE),PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONGSTATE,"Problem type should be BSE");
630
9/22
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 8 times.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 8 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 10 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
334 EPSCheckUnsupportedCondition(eps,EPS_FEATURE_ARBITRARY | EPS_FEATURE_REGION | EPS_FEATURE_EXTRACTION | EPS_FEATURE_BALANCE,PETSC_TRUE," with BSE structure");
631
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
334 PetscCall(PetscCitationsRegister(citation,&cited));
632
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
334 PetscCall(EPSSetDimensions_Default(eps,&eps->nev,&eps->ncv,&eps->mpd));
633
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
334 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");
634
3/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
608 if (eps->max_it==PETSC_DETERMINE) eps->max_it = PetscMax(100,2*eps->n/eps->ncv)*((eps->stop==EPS_STOP_THRESHOLD)?10:1);
635
636
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
334 PetscCall(PetscObjectTypeCompareAny((PetscObject)eps->st,&flg,STSINVERT,STSHIFT,""));
637
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
334 PetscCheck(flg,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Krylov-Schur BSE only supports shift and shift-and-invert ST");
638
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
334 PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STSINVERT,&sinvert));
639
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
334 if (!eps->which) {
640
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
314 if (sinvert) eps->which = EPS_TARGET_MAGNITUDE;
641 236 else eps->which = EPS_SMALLEST_MAGNITUDE;
642 }
643
644
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
334 if (!ctx->keep) ctx->keep = 0.5;
645
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
334 PetscCall(STSetStructured(eps->st,PETSC_TRUE));
646
647
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
334 PetscCall(EPSAllocateSolution(eps,1));
648
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
334 switch (ctx->bse) {
649 118 case EPS_KRYLOVSCHUR_BSE_SHAO:
650 118 eps->ops->solve = EPSSolve_KrylovSchur_BSE_Shao;
651 118 eps->ops->computevectors = EPSComputeVectors_BSE_Shao;
652
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
118 PetscCall(DSSetType(eps->ds,DSHEP));
653
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
118 PetscCall(DSSetCompact(eps->ds,PETSC_TRUE));
654
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
118 PetscCall(DSSetExtraRow(eps->ds,PETSC_TRUE));
655
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
118 PetscCall(DSAllocate(eps->ds,eps->ncv+1));
656 break;
657 113 case EPS_KRYLOVSCHUR_BSE_GRUNING:
658 113 eps->ops->solve = EPSSolve_KrylovSchur_BSE_Gruning;
659 113 eps->ops->computevectors = EPSComputeVectors_BSE_Gruning;
660
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(DSSetType(eps->ds,DSSVD));
661
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(DSSetCompact(eps->ds,PETSC_TRUE));
662
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(DSSetExtraRow(eps->ds,PETSC_TRUE));
663
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(DSAllocate(eps->ds,eps->ncv+1));
664 break;
665 103 case EPS_KRYLOVSCHUR_BSE_PROJECTEDBSE:
666 103 eps->ops->solve = EPSSolve_KrylovSchur_BSE_ProjectedBSE;
667 103 eps->ops->computevectors = EPSComputeVectors_BSE_ProjectedBSE;
668
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(DSSetType(eps->ds,DSHEP));
669
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(DSSetCompact(eps->ds,PETSC_TRUE));
670
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(DSSetExtraRow(eps->ds,PETSC_TRUE));
671
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(DSAllocate(eps->ds,eps->ncv+1));
672 break;
673 default: SETERRQ(PetscObjectComm((PetscObject)eps),PETSC_ERR_PLIB,"Unexpected error");
674 }
675
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
50 PetscFunctionReturn(PETSC_SUCCESS);
676 }
677
678 118 PetscErrorCode EPSSolve_KrylovSchur_BSE_Shao(EPS eps)
679 {
680 118 EPS_KRYLOVSCHUR *ctx = (EPS_KRYLOVSCHUR*)eps->data;
681 118 PetscInt i,k,l,ld,nv,nconv=0,nevsave;
682 118 Mat H,Q;
683 118 BV U,V;
684 118 IS is[2];
685 118 PetscReal *a,*b,beta;
686 118 PetscBool breakdown=PETSC_FALSE;
687
688
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
118 PetscFunctionBegin;
689
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
118 PetscCall(DSGetLeadingDimension(eps->ds,&ld));
690
691 /* Extract matrix blocks */
692
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
118 PetscCall(STGetMatrix(eps->st,0,&H));
693
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
118 PetscCall(MatNestGetISs(H,is,NULL));
694
695 /* Get the split bases */
696
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
118 PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&U,&V));
697
698 118 nevsave = eps->nev;
699 118 eps->nev = (eps->nev+1)/2;
700 118 l = 0;
701
702 /* Restart loop */
703 118 while (eps->reason == EPS_CONVERGED_ITERATING) {
704 2376 eps->its++;
705
706 /* Compute an nv-step Lanczos factorization */
707 2376 nv = PetscMin(eps->nconv+eps->mpd,eps->ncv);
708
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2376 PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,eps->nconv+l));
709
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2376 PetscCall(DSGetArrayReal(eps->ds,DS_MAT_T,&a));
710 2376 b = a + ld;
711
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2376 PetscCall(EPSBSELanczos_Shao(eps,U,V,a,b,eps->nconv+l,&nv,&breakdown));
712 2376 beta = b[nv-1];
713
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2376 PetscCall(DSRestoreArrayReal(eps->ds,DS_MAT_T,&a));
714
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2376 PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,eps->nconv+l));
715
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2376 PetscCall(DSSetState(eps->ds,l?DS_STATE_RAW:DS_STATE_INTERMEDIATE));
716
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2376 PetscCall(BVSetActiveColumns(eps->V,eps->nconv,nv));
717
718 /* Solve projected problem */
719
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2376 PetscCall(DSSolve(eps->ds,eps->eigr,eps->eigi));
720
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2376 PetscCall(DSSort(eps->ds,eps->eigr,eps->eigi,NULL,NULL,NULL));
721
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2376 PetscCall(DSUpdateExtraRow(eps->ds));
722
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2376 PetscCall(DSSynchronize(eps->ds,eps->eigr,eps->eigi));
723
724 /* Check convergence */
725
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
36704 for (i=0;i<nv;i++) eps->eigr[i] = PetscSqrtReal(PetscRealPart(eps->eigr[i]));
726
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2376 PetscCall(EPSKrylovConvergence(eps,PETSC_FALSE,eps->nconv,nv-eps->nconv,beta,0.0,1.0,&k));
727
14/18
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 8 times.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
2376 EPSSetCtxThreshold(eps,eps->eigr,eps->eigi,k);
728
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2376 PetscCall((*eps->stopping)(eps,eps->its,eps->max_it,k,eps->nev,&eps->reason,eps->stoppingctx));
729 2376 nconv = k;
730
731 /* Update l */
732
4/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2376 if (eps->reason != EPS_CONVERGED_ITERATING || breakdown || k==nv) l = 0;
733 2258 else l = PetscMax(1,(PetscInt)((nv-k)*ctx->keep));
734
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2376 if (!ctx->lock && l>0) { l += k; k = 0; } /* non-locking variant: reset no. of converged pairs */
735
6/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
2376 if (l) PetscCall(PetscInfo(eps,"Preparing to restart keeping l=%" PetscInt_FMT " vectors\n",l));
736
737
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2376 if (eps->reason == EPS_CONVERGED_ITERATING) {
738
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2258 PetscCheck(!breakdown,PetscObjectComm((PetscObject)eps),PETSC_ERR_CONV_FAILED,"Breakdown in BSE Krylov-Schur (beta=%g)",(double)beta);
739 /* Prepare the Rayleigh quotient for restart */
740
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2258 PetscCall(DSTruncate(eps->ds,k+l,PETSC_FALSE));
741 }
742 /* Update the corresponding vectors
743 U(:,idx) = U*Q(:,idx), V(:,idx) = V*Q(:,idx) */
744
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2376 PetscCall(DSGetMat(eps->ds,DS_MAT_Q,&Q));
745
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2376 PetscCall(BVMultInPlace(U,Q,eps->nconv,k+l));
746
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2376 PetscCall(BVMultInPlace(V,Q,eps->nconv,k+l));
747
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2376 PetscCall(DSRestoreMat(eps->ds,DS_MAT_Q,&Q));
748
749
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2376 if (eps->reason == EPS_CONVERGED_ITERATING && !breakdown) {
750
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2258 PetscCall(BVCopyColumn(eps->V,nv,k+l));
751
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
2258 if (eps->stop==EPS_STOP_THRESHOLD && nv-k<5) { /* reallocate */
752 15 eps->ncv = eps->mpd+k;
753
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
15 PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&U,&V));
754
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
15 PetscCall(EPSReallocateSolution(eps,eps->ncv+1));
755
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
15 PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&U,&V));
756
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
105 for (i=nv;i<eps->ncv;i++) eps->perm[i] = i;
757
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
15 PetscCall(DSReallocate(eps->ds,eps->ncv+1));
758
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
15 PetscCall(DSGetLeadingDimension(eps->ds,&ld));
759 }
760 }
761 2376 eps->nconv = k;
762
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
2494 PetscCall(EPSMonitor(eps,eps->its,nconv,eps->eigr,eps->eigi,eps->errest,nv));
763 }
764
765 118 eps->nev = nevsave;
766
767
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
118 PetscCall(DSTruncate(eps->ds,eps->nconv,PETSC_TRUE));
768
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
118 PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&U,&V));
769
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
18 PetscFunctionReturn(PETSC_SUCCESS);
770 }
771
772 /*
773 EPSConvergence_Gruning - convergence check based on SVDKrylovConvergence().
774 */
775 2332 static PetscErrorCode EPSConvergence_Gruning(EPS eps,PetscBool getall,PetscInt kini,PetscInt nits,PetscInt *kout)
776 {
777 2332 PetscInt k,marker,ld;
778 2332 PetscReal *alpha,*beta,resnorm;
779 2332 PetscBool extra;
780
781
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2332 PetscFunctionBegin;
782 2332 *kout = 0;
783
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(DSGetLeadingDimension(eps->ds,&ld));
784
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(DSGetExtraRow(eps->ds,&extra));
785
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2332 PetscCheck(extra,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Only implemented for DS with extra row");
786 2332 marker = -1;
787
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
2332 if (eps->trackall) getall = PETSC_TRUE;
788
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(DSGetArrayReal(eps->ds,DS_MAT_T,&alpha));
789 2332 beta = alpha + ld;
790
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
3120 for (k=kini;k<kini+nits;k++) {
791 3120 resnorm = PetscAbsReal(beta[k]);
792
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3120 PetscCall((*eps->converged)(eps,eps->eigr[k],eps->eigi[k],resnorm,&eps->errest[k],eps->convergedctx));
793
3/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
3120 if (marker==-1 && eps->errest[k] >= eps->tol) marker = k;
794
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3120 if (marker!=-1 && !getall) break;
795 }
796
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(DSRestoreArrayReal(eps->ds,DS_MAT_T,&alpha));
797
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
2332 if (marker!=-1) k = marker;
798 2332 *kout = k;
799
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
2332 PetscFunctionReturn(PETSC_SUCCESS);
800 }
801
802 113 PetscErrorCode EPSSolve_KrylovSchur_BSE_Gruning(EPS eps)
803 {
804 113 EPS_KRYLOVSCHUR *ctx = (EPS_KRYLOVSCHUR*)eps->data;
805 113 PetscInt i,k,l,ld,nv,nconv=0,nevsave;
806 113 Mat H,Q,Z;
807 113 BV U,V,HU,HV;
808 113 IS is[2];
809 113 PetscReal *d1,*d2,beta;
810 113 PetscBool breakdown=PETSC_FALSE;
811
812
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
113 PetscFunctionBegin;
813
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(DSGetLeadingDimension(eps->ds,&ld));
814
815 /* Extract matrix blocks */
816
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(STGetMatrix(eps->st,0,&H));
817
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(MatNestGetISs(H,is,NULL));
818
819 /* Get the split bases */
820
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&U,&V));
821
822 /* Create HU and HV */
823
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(BVDuplicate(U,&HU));
824
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(BVDuplicate(V,&HV));
825
826 113 nevsave = eps->nev;
827 113 eps->nev = (eps->nev+1)/2;
828 113 l = 0;
829
830 /* Restart loop */
831 113 while (eps->reason == EPS_CONVERGED_ITERATING) {
832 2332 eps->its++;
833
834 /* Compute an nv-step Lanczos factorization */
835 2332 nv = PetscMin(eps->nconv+eps->mpd,eps->ncv);
836
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,eps->nconv+l));
837
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(DSGetArrayReal(eps->ds,DS_MAT_T,&d1));
838 2332 d2 = d1 + ld;
839
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(EPSBSELanczos_Gruning(eps,U,V,HU,HV,d1,d2,eps->nconv+l,&nv,&breakdown));
840 2332 beta = d1[nv-1];
841
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(DSRestoreArrayReal(eps->ds,DS_MAT_T,&d1));
842
843 /* Compute SVD */
844
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,eps->nconv+l));
845
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(DSSVDSetDimensions(eps->ds,nv));
846
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(DSSetState(eps->ds,l?DS_STATE_RAW:DS_STATE_INTERMEDIATE));
847
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(BVSetActiveColumns(eps->V,eps->nconv,nv));
848
849
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(DSSolve(eps->ds,eps->eigr,eps->eigi));
850
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(DSSort(eps->ds,eps->eigr,eps->eigi,NULL,NULL,NULL));
851
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(DSUpdateExtraRow(eps->ds));
852
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(DSSynchronize(eps->ds,eps->eigr,eps->eigi));
853
854 /* Check convergence */
855
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(EPSConvergence_Gruning(eps,PETSC_FALSE,eps->nconv,nv-eps->nconv,&k));
856
14/18
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 8 times.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
2332 EPSSetCtxThreshold(eps,eps->eigr,eps->eigi,k);
857
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall((*eps->stopping)(eps,eps->its,eps->max_it,k,eps->nev,&eps->reason,eps->stoppingctx));
858 2332 nconv = k;
859
860 /* Update l */
861
4/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2332 if (eps->reason != EPS_CONVERGED_ITERATING || breakdown || k==nv) l = 0;
862 2219 else l = PetscMax(1,(PetscInt)((nv-k)*ctx->keep));
863
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2332 if (!ctx->lock && l>0) { l += k; k = 0; } /* non-locking variant: reset no. of converged pairs */
864
6/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
2332 if (l) PetscCall(PetscInfo(eps,"Preparing to restart keeping l=%" PetscInt_FMT " vectors\n",l));
865
866
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2332 if (eps->reason == EPS_CONVERGED_ITERATING) {
867
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2219 PetscCheck(!breakdown,PetscObjectComm((PetscObject)eps),PETSC_ERR_CONV_FAILED,"Breakdown in BSE Krylov-Schur (beta=%g)",(double)beta);
868 /* Prepare the Rayleigh quotient for restart */
869
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2219 PetscCall(DSTruncate(eps->ds,k+l,PETSC_FALSE));
870 }
871 /* Update the corresponding vectors
872 U(:,idx) = U*Q(:,idx), V(:,idx) = V*Z(:,idx) */
873
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(DSGetMat(eps->ds,DS_MAT_U,&Q));
874
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(DSGetMat(eps->ds,DS_MAT_V,&Z));
875
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(BVMultInPlace(U,Z,eps->nconv,k+l));
876
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(BVMultInPlace(V,Q,eps->nconv,k+l));
877
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(BVMultInPlace(HU,Z,eps->nconv,k+l));
878
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(BVMultInPlace(HV,Q,eps->nconv,k+l));
879
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(DSRestoreMat(eps->ds,DS_MAT_U,&Q));
880
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(DSRestoreMat(eps->ds,DS_MAT_V,&Z));
881
882
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2332 if (eps->reason == EPS_CONVERGED_ITERATING && !breakdown) {
883
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2219 PetscCall(BVCopyColumn(U,nv,k+l));
884
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2219 PetscCall(BVCopyColumn(HU,nv,k+l));
885
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
2219 if (eps->stop==EPS_STOP_THRESHOLD && nv-k<5) { /* reallocate */
886 15 eps->ncv = eps->mpd+k;
887
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
15 PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&U,&V));
888
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
15 PetscCall(EPSReallocateSolution(eps,eps->ncv+1));
889
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
15 PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&U,&V));
890
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
15 PetscCall(BVResize(HU,eps->ncv+1,PETSC_TRUE));
891
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
15 PetscCall(BVResize(HV,eps->ncv+1,PETSC_TRUE));
892
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
105 for (i=nv;i<eps->ncv;i++) { eps->perm[i] = i; eps->eigi[i] = 0.0; }
893
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
15 PetscCall(DSReallocate(eps->ds,eps->ncv+1));
894
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
15 PetscCall(DSGetLeadingDimension(eps->ds,&ld));
895 }
896 }
897 2332 eps->nconv = k;
898
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
2445 PetscCall(EPSMonitor(eps,eps->its,nconv,eps->eigr,eps->eigi,eps->errest,nv));
899 }
900
901 113 eps->nev = nevsave;
902
903
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(DSTruncate(eps->ds,eps->nconv,PETSC_TRUE));
904
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&U,&V));
905
906
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(BVDestroy(&HU));
907
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
113 PetscCall(BVDestroy(&HV));
908
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
17 PetscFunctionReturn(PETSC_SUCCESS);
909 }
910
911 103 PetscErrorCode EPSSolve_KrylovSchur_BSE_ProjectedBSE(EPS eps)
912 {
913 103 EPS_KRYLOVSCHUR *ctx = (EPS_KRYLOVSCHUR*)eps->data;
914 103 PetscInt i,k,l,ld,nv,nconv=0,nevsave;
915 103 Mat H,Q;
916 103 Vec v;
917 103 BV U,V;
918 103 IS is[2];
919 103 PetscReal *a,*b,beta;
920 103 PetscBool breakdown=PETSC_FALSE;
921
922
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
103 PetscFunctionBegin;
923
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(DSGetLeadingDimension(eps->ds,&ld));
924
925 /* Extract matrix blocks */
926
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(STGetMatrix(eps->st,0,&H));
927
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(MatNestGetISs(H,is,NULL));
928
929 /* Get the split bases */
930
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&U,&V));
931
932 /* Vector v */
933
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(BVCreateVec(V,&v));
934
935 103 nevsave = eps->nev;
936 103 eps->nev = (eps->nev+1)/2;
937 103 l = 0;
938
939 /* Restart loop */
940 103 while (eps->reason == EPS_CONVERGED_ITERATING) {
941 2332 eps->its++;
942
943 /* Compute an nv-step Lanczos factorization */
944 2332 nv = PetscMin(eps->nconv+eps->mpd,eps->ncv);
945
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,eps->nconv+l));
946
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(DSGetArrayReal(eps->ds,DS_MAT_T,&a));
947 2332 b = a + ld;
948
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(EPSBSELanczos_ProjectedBSE(eps,U,V,v,a,b,eps->nconv+l,&nv,&breakdown));
949 2332 beta = b[nv-1];
950
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(DSRestoreArrayReal(eps->ds,DS_MAT_T,&a));
951
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,eps->nconv+l));
952
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(DSSetState(eps->ds,l?DS_STATE_RAW:DS_STATE_INTERMEDIATE));
953
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(BVSetActiveColumns(eps->V,eps->nconv,nv));
954
955 /* Solve projected problem */
956
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(DSSolve(eps->ds,eps->eigr,eps->eigi));
957
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(DSSort(eps->ds,eps->eigr,eps->eigi,NULL,NULL,NULL));
958
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(DSUpdateExtraRow(eps->ds));
959
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(DSSynchronize(eps->ds,eps->eigr,eps->eigi));
960
961 /* Check convergence */
962
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
36084 for (i=0;i<nv;i++) eps->eigr[i] = PetscSqrtReal(PetscRealPart(eps->eigr[i]));
963
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(EPSKrylovConvergence(eps,PETSC_FALSE,eps->nconv,nv-eps->nconv,beta,0.0,1.0,&k));
964
14/18
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 8 times.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
2332 EPSSetCtxThreshold(eps,eps->eigr,eps->eigi,k);
965
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall((*eps->stopping)(eps,eps->its,eps->max_it,k,eps->nev,&eps->reason,eps->stoppingctx));
966 2332 nconv = k;
967
968 /* Update l */
969
4/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2332 if (eps->reason != EPS_CONVERGED_ITERATING || breakdown || k==nv) l = 0;
970 2229 else l = PetscMax(1,(PetscInt)((nv-k)*ctx->keep));
971
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2332 if (!ctx->lock && l>0) { l += k; k = 0; } /* non-locking variant: reset no. of converged pairs */
972
6/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
2332 if (l) PetscCall(PetscInfo(eps,"Preparing to restart keeping l=%" PetscInt_FMT " vectors\n",l));
973
974
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2332 if (eps->reason == EPS_CONVERGED_ITERATING) {
975
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2229 PetscCheck(!breakdown,PetscObjectComm((PetscObject)eps),PETSC_ERR_CONV_FAILED,"Breakdown in BSE Krylov-Schur (beta=%g)",(double)beta);
976 /* Prepare the Rayleigh quotient for restart */
977
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2229 PetscCall(DSTruncate(eps->ds,k+l,PETSC_FALSE));
978 }
979 /* Update the corresponding vectors
980 U(:,idx) = U*Q(:,idx), V(:,idx) = V*Q(:,idx) */
981
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(DSGetMat(eps->ds,DS_MAT_Q,&Q));
982
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(BVMultInPlace(U,Q,eps->nconv,k+l));
983
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(BVMultInPlace(V,Q,eps->nconv,k+l));
984
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2332 PetscCall(DSRestoreMat(eps->ds,DS_MAT_Q,&Q));
985
986
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2332 if (eps->reason == EPS_CONVERGED_ITERATING && !breakdown) {
987
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2229 PetscCall(BVCopyColumn(eps->V,nv,k+l));
988
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
2229 if (eps->stop==EPS_STOP_THRESHOLD && nv-k<5) { /* reallocate */
989 15 eps->ncv = eps->mpd+k;
990
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
15 PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&U,&V));
991
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
15 PetscCall(EPSReallocateSolution(eps,eps->ncv+1));
992
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
15 PetscCall(BVGetSplitRows(eps->V,is[0],is[1],&U,&V));
993
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
105 for (i=nv;i<eps->ncv;i++) eps->perm[i] = i;
994
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
15 PetscCall(DSReallocate(eps->ds,eps->ncv+1));
995
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
15 PetscCall(DSGetLeadingDimension(eps->ds,&ld));
996 }
997 }
998 2332 eps->nconv = k;
999
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
2435 PetscCall(EPSMonitor(eps,eps->its,nconv,eps->eigr,eps->eigi,eps->errest,nv));
1000 }
1001
1002 103 eps->nev = nevsave;
1003
1004
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(DSTruncate(eps->ds,eps->nconv,PETSC_TRUE));
1005
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(BVRestoreSplitRows(eps->V,is[0],is[1],&U,&V));
1006
1007
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
103 PetscCall(VecDestroy(&v));
1008
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
15 PetscFunctionReturn(PETSC_SUCCESS);
1009 }
1010