GCC Code Coverage Report


Directory: ./
File: src/pep/impls/krylov/stoar/qslice.c
Date: 2025-10-04 04:19:13
Exec Total Coverage
Lines: 959 1041 92.1%
Functions: 21 22 95.5%
Branches: 2121 3484 60.9%

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 polynomial eigensolver: "stoar"
12
13 Method: S-TOAR with spectrum slicing for symmetric quadratic eigenproblems
14
15 Algorithm:
16
17 Symmetric Two-Level Orthogonal Arnoldi.
18
19 References:
20
21 [1] C. Campos and J.E. Roman, "Inertia-based spectrum slicing
22 for symmetric quadratic eigenvalue problems", Numer. Linear
23 Algebra Appl. 27(4):e2293, 2020.
24 */
25
26 #include <slepc/private/pepimpl.h> /*I "slepcpep.h" I*/
27 #include "../src/pep/impls/krylov/pepkrylov.h"
28 #include <slepcblaslapack.h>
29
30 static PetscBool cited = PETSC_FALSE;
31 static const char citation[] =
32 "@Article{slepc-slice-qep,\n"
33 " author = \"C. Campos and J. E. Roman\",\n"
34 " title = \"Inertia-based spectrum slicing for symmetric quadratic eigenvalue problems\",\n"
35 " journal = \"Numer. Linear Algebra Appl.\",\n"
36 " volume = \"27\",\n"
37 " number = \"4\",\n"
38 " pages = \"e2293\",\n"
39 " year = \"2020,\"\n"
40 " doi = \"https://doi.org/10.1002/nla.2293\"\n"
41 "}\n";
42
43 #define SLICE_PTOL PETSC_SQRT_MACHINE_EPSILON
44
45 160 static PetscErrorCode PEPQSliceResetSR(PEP pep)
46 {
47 160 PEP_STOAR *ctx=(PEP_STOAR*)pep->data;
48 160 PEP_SR sr=ctx->sr;
49 160 PEP_shift s;
50 160 PetscInt i;
51
52
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
160 PetscFunctionBegin;
53
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
160 if (sr) {
54 /* Reviewing list of shifts to free memory */
55 80 s = sr->s0;
56
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
80 if (s) {
57 203 while (s->neighb[1]) {
58 133 s = s->neighb[1];
59
8/10
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 2 times.
203 PetscCall(PetscFree(s->neighb[0]));
60 }
61
6/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
70 PetscCall(PetscFree(s));
62 }
63
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.
80 PetscCall(PetscFree(sr->S));
64
8/10
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 2 times.
✓ Branch 9 taken 2 times.
1770 for (i=0;i<pep->nconv;i++) PetscCall(PetscFree(sr->qinfo[i].q));
65
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.
80 PetscCall(PetscFree(sr->qinfo));
66
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.
320 for (i=0;i<3;i++) PetscCall(VecDestroy(&sr->v[i]));
67
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
80 PetscCall(EPSDestroy(&sr->eps));
68
6/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
80 PetscCall(PetscFree(sr));
69 }
70 160 ctx->sr = NULL;
71
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.
160 PetscFunctionReturn(PETSC_SUCCESS);
72 }
73
74 80 PetscErrorCode PEPReset_STOAR_QSlice(PEP pep)
75 {
76 80 PEP_STOAR *ctx=(PEP_STOAR*)pep->data;
77
78
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
80 PetscFunctionBegin;
79
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
80 PetscCall(PEPQSliceResetSR(pep));
80
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.
80 PetscCall(PetscFree(ctx->inertias));
81
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.
80 PetscCall(PetscFree(ctx->shifts));
82
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.
16 PetscFunctionReturn(PETSC_SUCCESS);
83 }
84
85 /*
86 PEPQSliceAllocateSolution - Allocate memory storage for common variables such
87 as eigenvalues and eigenvectors.
88 */
89 70 static PetscErrorCode PEPQSliceAllocateSolution(PEP pep)
90 {
91 70 PEP_STOAR *ctx=(PEP_STOAR*)pep->data;
92 70 PetscInt k;
93 70 BVType type;
94 70 Vec t;
95 70 PEP_SR sr = ctx->sr;
96
97
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
70 PetscFunctionBegin;
98 /* allocate space for eigenvalues and friends */
99 70 k = PetscMax(1,sr->numEigs);
100
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70 PetscCall(PetscFree4(sr->eigr,sr->eigi,sr->errest,sr->perm));
101
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70 PetscCall(PetscCalloc4(k,&sr->eigr,k,&sr->eigi,k,&sr->errest,k,&sr->perm));
102
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.
70 PetscCall(PetscFree(sr->qinfo));
103
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70 PetscCall(PetscCalloc1(k,&sr->qinfo));
104
105 /* allocate sr->V and transfer options from pep->V */
106
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70 PetscCall(BVDestroy(&sr->V));
107
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70 PetscCall(BVCreate(PetscObjectComm((PetscObject)pep),&sr->V));
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.
70 if (!pep->V) PetscCall(PEPGetBV(pep,&pep->V));
109
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.
70 if (!((PetscObject)pep->V)->type_name) PetscCall(BVSetType(sr->V,BVMAT));
110 else {
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.
70 PetscCall(BVGetType(pep->V,&type));
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.
70 PetscCall(BVSetType(sr->V,type));
113 }
114
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70 PetscCall(STMatCreateVecsEmpty(pep->st,&t,NULL));
115
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70 PetscCall(BVSetSizesFromVec(sr->V,t,k+1));
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.
70 PetscCall(VecDestroy(&t));
117 70 sr->ld = k;
118
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.
70 PetscCall(PetscFree(sr->S));
119
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70 PetscCall(PetscMalloc1((k+1)*sr->ld*(pep->nmat-1),&sr->S));
120
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.
14 PetscFunctionReturn(PETSC_SUCCESS);
121 }
122
123 /* Convergence test to compute positive Ritz values */
124 315 static PetscErrorCode ConvergedPositive(EPS eps,PetscScalar eigr,PetscScalar eigi,PetscReal res,PetscReal *errest,void *ctx)
125 {
126
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
315 PetscFunctionBegin;
127
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
315 *errest = (PetscRealPart(eigr)>0.0)?0.0:res;
128
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.
315 PetscFunctionReturn(PETSC_SUCCESS);
129 }
130
131 323 static PetscErrorCode PEPQSliceMatGetInertia(PEP pep,PetscReal shift,PetscInt *inertia,PetscInt *zeros)
132 {
133 323 KSP ksp,kspr;
134 323 PC pc;
135 323 Mat F;
136 323 PetscBool flg;
137
138
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
323 PetscFunctionBegin;
139
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.
323 if (!pep->solvematcoeffs) PetscCall(PetscMalloc1(pep->nmat,&pep->solvematcoeffs));
140
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
323 if (shift==PETSC_MAX_REAL) { /* Inertia of matrix A[2] */
141 pep->solvematcoeffs[0] = 0.0; pep->solvematcoeffs[1] = 0.0; pep->solvematcoeffs[2] = 1.0;
142
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
323 } else PetscCall(PEPEvaluateBasis(pep,shift,0,pep->solvematcoeffs,NULL));
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.
323 PetscCall(STMatSetUp(pep->st,pep->sfactor,pep->solvematcoeffs));
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.
323 PetscCall(STGetKSP(pep->st,&ksp));
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.
323 PetscCall(KSPGetPC(ksp,&pc));
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.
323 PetscCall(PetscObjectTypeCompare((PetscObject)pc,PCREDUNDANT,&flg));
147
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
323 if (flg) {
148 PetscCall(PCRedundantGetKSP(pc,&kspr));
149 PetscCall(KSPGetPC(kspr,&pc));
150 }
151
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
323 PetscCall(PCFactorGetMatrix(pc,&F));
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.
323 PetscCall(MatGetInertia(F,inertia,zeros,NULL));
153
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.
65 PetscFunctionReturn(PETSC_SUCCESS);
154 }
155
156 303 static PetscErrorCode PEPQSliceGetInertia(PEP pep,PetscReal shift,PetscInt *inertia,PetscInt *zeros,PetscInt correction)
157 {
158 303 KSP ksp;
159 303 Mat P;
160 303 PetscReal nzshift=0.0,dot;
161 303 PetscRandom rand;
162 303 PetscInt nconv;
163 303 PEP_STOAR *ctx=(PEP_STOAR*)pep->data;
164 303 PEP_SR sr=ctx->sr;
165
166
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
303 PetscFunctionBegin;
167
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
303 if (shift >= PETSC_MAX_REAL) { /* Right-open interval */
168 *inertia = 0;
169
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
303 } else if (shift <= PETSC_MIN_REAL) {
170 *inertia = 0;
171 if (zeros) *zeros = 0;
172 } else {
173 /* If the shift is zero, perturb it to a very small positive value.
174 The goal is that the nonzero pattern is the same in all cases and reuse
175 the symbolic factorizations */
176
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
303 nzshift = (shift==0.0)? 10.0/PETSC_MAX_REAL: shift;
177
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
303 PetscCall(PEPQSliceMatGetInertia(pep,nzshift,inertia,zeros));
178
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
303 PetscCall(STSetShift(pep->st,nzshift));
179 }
180
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
303 if (!correction) {
181
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
170 if (shift >= PETSC_MAX_REAL) *inertia = 2*pep->n;
182
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
170 else if (shift>PETSC_MIN_REAL) {
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.
170 PetscCall(STGetKSP(pep->st,&ksp));
184
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
170 PetscCall(KSPGetOperators(ksp,&P,NULL));
185
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
170 if (*inertia!=pep->n && !sr->v[0]) {
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.
60 PetscCall(MatCreateVecs(P,&sr->v[0],NULL));
187
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
60 PetscCall(VecDuplicate(sr->v[0],&sr->v[1]));
188
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
60 PetscCall(VecDuplicate(sr->v[0],&sr->v[2]));
189
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
60 PetscCall(BVGetRandomContext(pep->V,&rand));
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.
60 PetscCall(VecSetRandom(sr->v[0],rand));
191 }
192
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
170 if (*inertia<pep->n && *inertia>0) {
193
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
90 if (!sr->eps) {
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.
50 PetscCall(EPSCreate(PetscObjectComm((PetscObject)pep),&sr->eps));
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.
50 PetscCall(EPSSetProblemType(sr->eps,EPS_HEP));
196
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
50 PetscCall(EPSSetWhichEigenpairs(sr->eps,EPS_LARGEST_REAL));
197 }
198
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
90 PetscCall(EPSSetConvergenceTestFunction(sr->eps,ConvergedPositive,NULL,NULL));
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.
90 PetscCall(EPSSetOperators(sr->eps,P,NULL));
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.
90 PetscCall(EPSSolve(sr->eps));
201
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
90 PetscCall(EPSGetConverged(sr->eps,&nconv));
202
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
90 PetscCheck(nconv,((PetscObject)pep)->comm,PETSC_ERR_CONV_FAILED,"Inertia computation fails in %g",(double)nzshift);
203
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
90 PetscCall(EPSGetEigenpair(sr->eps,0,NULL,NULL,sr->v[0],sr->v[1]));
204 }
205
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
170 if (*inertia!=pep->n) {
206
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
120 PetscCall(MatMult(pep->A[1],sr->v[0],sr->v[1]));
207
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
120 PetscCall(MatMult(pep->A[2],sr->v[0],sr->v[2]));
208
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
120 PetscCall(VecAXPY(sr->v[1],2*nzshift,sr->v[2]));
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.
120 PetscCall(VecDotRealPart(sr->v[1],sr->v[0],&dot));
210
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
120 if (dot>0.0) *inertia = 2*pep->n-*inertia;
211 }
212 }
213
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
133 } else if (correction<0) *inertia = 2*pep->n-*inertia;
214
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.
61 PetscFunctionReturn(PETSC_SUCCESS);
215 }
216
217 /*
218 Check eigenvalue type - used only in non-hyperbolic problems.
219 All computed eigenvalues must have the same definite type (positive or negative).
220 If ini=TRUE the type is available in omega, otherwise we compute an eigenvalue
221 closest to shift and determine its type.
222 */
223 2771 static PetscErrorCode PEPQSliceCheckEigenvalueType(PEP pep,PetscReal shift,PetscReal omega,PetscBool ini)
224 {
225 2771 PEP pep2;
226 2771 ST st;
227 2771 PetscInt nconv;
228 2771 PetscScalar lambda;
229 2771 PetscReal dot;
230 2771 PEP_STOAR *ctx=(PEP_STOAR*)pep->data;
231 2771 PEP_SR sr=ctx->sr;
232
233
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2771 PetscFunctionBegin;
234
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2771 if (!ini) {
235
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2731 PetscCheck(-(omega/(shift*ctx->alpha+ctx->beta))*sr->type>=0,((PetscObject)pep)->comm,PETSC_ERR_CONV_FAILED,"Different positive/negative type detected in eigenvalue %g",(double)shift);
236 } else {
237
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
40 PetscCall(PEPCreate(PetscObjectComm((PetscObject)pep),&pep2));
238
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
40 PetscCall(PEPSetOptionsPrefix(pep2,((PetscObject)pep)->prefix));
239
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
40 PetscCall(PEPAppendOptionsPrefix(pep2,"pep_eigenvalue_type_"));
240
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
40 PetscCall(PEPSetTolerances(pep2,PETSC_CURRENT,pep->max_it/4));
241
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
40 PetscCall(PEPSetType(pep2,PEPTOAR));
242
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
40 PetscCall(PEPSetOperators(pep2,pep->nmat,pep->A));
243
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
40 PetscCall(PEPSetWhichEigenpairs(pep2,PEP_TARGET_MAGNITUDE));
244
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
40 PetscCall(PEPGetRG(pep2,&pep2->rg));
245
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
40 PetscCall(RGSetType(pep2->rg,RGINTERVAL));
246 #if defined(PETSC_USE_COMPLEX)
247
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
20 PetscCall(RGIntervalSetEndpoints(pep2->rg,pep->inta,pep->intb,-PETSC_SQRT_MACHINE_EPSILON,PETSC_SQRT_MACHINE_EPSILON));
248 #else
249
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
20 PetscCall(RGIntervalSetEndpoints(pep2->rg,pep->inta,pep->intb,0.0,0.0));
250 #endif
251 40 pep2->target = shift;
252 40 st = pep2->st;
253 40 pep2->st = pep->st;
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.
40 PetscCall(PEPSolve(pep2));
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.
40 PetscCall(PEPGetConverged(pep2,&nconv));
256
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
40 if (nconv) {
257
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
40 PetscCall(PEPGetEigenpair(pep2,0,&lambda,NULL,pep2->work[0],NULL));
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.
40 PetscCall(MatMult(pep->A[1],pep2->work[0],pep2->work[1]));
259
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
40 PetscCall(MatMult(pep->A[2],pep2->work[0],pep2->work[2]));
260
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
40 PetscCall(VecAXPY(pep2->work[1],2.0*lambda*pep->sfactor,pep2->work[2]));
261
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
40 PetscCall(VecDotRealPart(pep2->work[1],pep2->work[0],&dot));
262
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.
80 PetscCall(PetscInfo(pep,"lambda=%g, %s type\n",(double)PetscRealPart(lambda),(dot>0.0)?"positive":"negative"));
263
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
60 if (!sr->type) sr->type = (dot>0.0)?1:-1;
264
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
20 else PetscCheck(sr->type*dot>=0.0,((PetscObject)pep)->comm,PETSC_ERR_CONV_FAILED,"Different positive/negative type detected in eigenvalue %g",(double)PetscRealPart(lambda));
265 }
266 40 pep2->st = st;
267
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
40 PetscCall(PEPDestroy(&pep2));
268 }
269
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.
555 PetscFunctionReturn(PETSC_SUCCESS);
270 }
271
272 30 static inline PetscErrorCode PEPQSliceDiscriminant(PEP pep,Vec u,Vec w,PetscReal *d,PetscReal *smas,PetscReal *smenos)
273 {
274 30 PetscReal ap,bp,cp,dis;
275
276
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
30 PetscFunctionBegin;
277
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
30 PetscCall(MatMult(pep->A[0],u,w));
278
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
30 PetscCall(VecDotRealPart(w,u,&cp));
279
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
30 PetscCall(MatMult(pep->A[1],u,w));
280
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
30 PetscCall(VecDotRealPart(w,u,&bp));
281
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
30 PetscCall(MatMult(pep->A[2],u,w));
282
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
30 PetscCall(VecDotRealPart(w,u,&ap));
283 30 dis = bp*bp-4*ap*cp;
284
2/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
30 if (dis>=0.0 && smas) {
285
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
30 if (ap>0) *smas = (-bp+PetscSqrtReal(dis))/(2*ap);
286
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
30 else if (ap<0) *smas = (-bp-PetscSqrtReal(dis))/(2*ap);
287 else {
288 if (bp >0) *smas = -cp/bp;
289 else *smas = PETSC_MAX_REAL;
290 }
291 }
292
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
30 if (dis>=0.0 && smenos) {
293
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
20 if (ap>0) *smenos = (-bp-PetscSqrtReal(dis))/(2*ap);
294
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
20 else if (ap<0) *smenos = (-bp+PetscSqrtReal(dis))/(2*ap);
295 else {
296 if (bp<0) *smenos = -cp/bp;
297 else *smenos = PETSC_MAX_REAL;
298 }
299 }
300
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
30 if (d) *d = dis;
301
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
6 PetscFunctionReturn(PETSC_SUCCESS);
302 }
303
304 20 static inline PetscErrorCode PEPQSliceEvaluateQEP(PEP pep,PetscScalar x,Mat M,MatStructure str)
305 {
306
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
20 PetscFunctionBegin;
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.
20 PetscCall(MatCopy(pep->A[0],M,SAME_NONZERO_PATTERN));
308
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
20 PetscCall(MatAXPY(M,x,pep->A[1],str));
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.
20 PetscCall(MatAXPY(M,x*x,pep->A[2],str));
310
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.
4 PetscFunctionReturn(PETSC_SUCCESS);
311 }
312
313 /*@
314 PEPCheckDefiniteQEP - Determines if a symmetric/Hermitian quadratic eigenvalue problem
315 is definite or not.
316
317 Collective
318
319 Input Parameter:
320 . pep - eigensolver context
321
322 Output Parameters:
323 + xi - first computed parameter
324 . mu - second computed parameter
325 . definite - flag indicating that the problem is definite
326 - hyperbolic - flag indicating that the problem is hyperbolic
327
328 Notes:
329 This function is intended for quadratic eigenvalue problems, Q(lambda)=A*lambda^2+B*lambda+C,
330 with symmetric (or Hermitian) coefficient matrices A,B,C.
331
332 On output, the flag 'definite' may have the values -1 (meaning that the QEP is not
333 definite), 1 (if the problem is definite), or 0 if the algorithm was not able to
334 determine whether the problem is definite or not.
335
336 If definite=1, the output flag 'hyperbolic' informs in a similar way about whether the
337 problem is hyperbolic or not.
338
339 If definite=1, the computed values xi and mu satisfy Q(xi)<0 and Q(mu)>0, as
340 obtained via the method proposed in [Niendorf and Voss, LAA 2010]. Furthermore, if
341 hyperbolic=1 then only xi is computed.
342
343 Level: advanced
344
345 .seealso: PEPSetProblemType()
346 @*/
347 10 PetscErrorCode PEPCheckDefiniteQEP(PEP pep,PetscReal *xi,PetscReal *mu,PetscInt *definite,PetscInt *hyperbolic)
348 {
349 10 PetscRandom rand;
350 10 Vec u,w;
351 10 PetscReal d=0.0,s=0.0,sp,mut=0.0,omg=0.0,omgp;
352 10 PetscInt k,its=10,hyp=0,check=0,nconv,inertia,n;
353 10 Mat M=NULL;
354 10 MatStructure str;
355 10 EPS eps;
356 10 PetscBool transform,ptypehyp;
357
358
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
10 PetscFunctionBegin;
359
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
10 PetscCheck(pep->problem_type==PEP_HERMITIAN || pep->problem_type==PEP_HYPERBOLIC,PetscObjectComm((PetscObject)pep),PETSC_ERR_SUP,"Only available for Hermitian (or hyperbolic) problems");
360 10 ptypehyp = (pep->problem_type==PEP_HYPERBOLIC)? PETSC_TRUE: PETSC_FALSE;
361
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.
10 if (!pep->st) PetscCall(PEPGetST(pep,&pep->st));
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.
10 PetscCall(PEPSetDefaultST(pep));
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.
10 PetscCall(STSetMatrices(pep->st,pep->nmat,pep->A));
364
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(MatGetSize(pep->A[0],&n,NULL));
365
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(STGetTransform(pep->st,&transform));
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.
10 PetscCall(STSetTransform(pep->st,PETSC_FALSE));
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.
10 PetscCall(STSetUp(pep->st));
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.
10 PetscCall(MatCreateVecs(pep->A[0],&u,&w));
369
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(PEPGetBV(pep,&pep->V));
370
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(BVGetRandomContext(pep->V,&rand));
371
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(VecSetRandom(u,rand));
372
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(VecNormalize(u,NULL));
373
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(PEPQSliceDiscriminant(pep,u,w,&d,&s,NULL));
374
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10 if (d<0.0) check = -1;
375 10 if (!check) {
376
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(EPSCreate(PetscObjectComm((PetscObject)pep),&eps));
377
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(EPSSetProblemType(eps,EPS_HEP));
378
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(EPSSetWhichEigenpairs(eps,EPS_LARGEST_REAL));
379
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(EPSSetTolerances(eps,PetscSqrtReal(PETSC_SQRT_MACHINE_EPSILON),PETSC_DECIDE));
380
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(MatDuplicate(pep->A[0],MAT_DO_NOT_COPY_VALUES,&M));
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.
10 PetscCall(STGetMatStructure(pep->st,&str));
382 }
383
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10 for (k=0;k<its&&!check;k++) {
384
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(PEPQSliceEvaluateQEP(pep,s,M,str));
385
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(EPSSetOperators(eps,M,NULL));
386
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(EPSSolve(eps));
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.
10 PetscCall(EPSGetConverged(eps,&nconv));
388
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10 if (!nconv) break;
389
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(EPSGetEigenpair(eps,0,NULL,NULL,u,w));
390 10 sp = s;
391
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(PEPQSliceDiscriminant(pep,u,w,&d,&s,&omg));
392
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
20 if (d<0.0) {check = -1; break;}
393
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10 if (PetscAbsReal((s-sp)/s)<100*PETSC_MACHINE_EPSILON) break;
394
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10 if (s>sp) hyp = -1;
395 10 mut = 2*s-sp;
396
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(PEPQSliceMatGetInertia(pep,mut,&inertia,NULL));
397
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 if (inertia == n) {check = 1; break;}
398 }
399
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 for (;k<its&&!check;k++) {
400 mut = (s-omg)/2;
401 PetscCall(PEPQSliceMatGetInertia(pep,mut,&inertia,NULL));
402 if (inertia == n) {check = 1; break;}
403 if (PetscAbsReal((s-omg)/omg)<100*PETSC_MACHINE_EPSILON) break;
404 PetscCall(PEPQSliceEvaluateQEP(pep,omg,M,str));
405 PetscCall(EPSSetOperators(eps,M,NULL));
406 PetscCall(EPSSolve(eps));
407 PetscCall(EPSGetConverged(eps,&nconv));
408 if (!nconv) break;
409 PetscCall(EPSGetEigenpair(eps,0,NULL,NULL,u,w));
410 omgp = omg;
411 PetscCall(PEPQSliceDiscriminant(pep,u,w,&d,NULL,&omg));
412 if (d<0.0) {check = -1; break;}
413 if (omg<omgp) hyp = -1;
414 }
415
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10 if (check==1) *xi = mut;
416
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
10 PetscCheck(hyp!=-1 || !ptypehyp,PetscObjectComm((PetscObject)pep),PETSC_ERR_PLIB,"Problem does not satisfy hyperbolic test; consider removing the hyperbolicity flag");
417
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 if (check==1 && hyp==0) {
418 PetscCall(PEPQSliceMatGetInertia(pep,PETSC_MAX_REAL,&inertia,NULL));
419 if (inertia == 0) hyp = 1;
420 else hyp = -1;
421 }
422
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10 if (check==1 && hyp!=1) {
423 10 check = 0;
424
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(EPSSetWhichEigenpairs(eps,EPS_SMALLEST_REAL));
425
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10 for (;k<its&&!check;k++) {
426
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(PEPQSliceEvaluateQEP(pep,s,M,str));
427
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(EPSSetOperators(eps,M,NULL));
428
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(EPSSolve(eps));
429
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(EPSGetConverged(eps,&nconv));
430
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10 if (!nconv) break;
431
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(EPSGetEigenpair(eps,0,NULL,NULL,u,w));
432 10 sp = s;
433
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(PEPQSliceDiscriminant(pep,u,w,&d,&s,&omg));
434
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
20 if (d<0.0) {check = -1; break;}
435
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10 if (PetscAbsReal((s-sp)/s)<100*PETSC_MACHINE_EPSILON) break;
436 10 mut = 2*s-sp;
437
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(PEPQSliceMatGetInertia(pep,mut,&inertia,NULL));
438
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 if (inertia == 0) {check = 1; break;}
439 }
440
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 for (;k<its&&!check;k++) {
441 mut = (s-omg)/2;
442 PetscCall(PEPQSliceMatGetInertia(pep,mut,&inertia,NULL));
443 if (inertia == 0) {check = 1; break;}
444 if (PetscAbsReal((s-omg)/omg)<100*PETSC_MACHINE_EPSILON) break;
445 PetscCall(PEPQSliceEvaluateQEP(pep,omg,M,str));
446 PetscCall(EPSSetOperators(eps,M,NULL));
447 PetscCall(EPSSolve(eps));
448 PetscCall(EPSGetConverged(eps,&nconv));
449 if (!nconv) break;
450 PetscCall(EPSGetEigenpair(eps,0,NULL,NULL,u,w));
451 PetscCall(PEPQSliceDiscriminant(pep,u,w,&d,NULL,&omg));
452 if (d<0.0) {check = -1; break;}
453 }
454 }
455
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10 if (check==1) *mu = mut;
456 10 *definite = check;
457 10 *hyperbolic = hyp;
458
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.
10 if (M) PetscCall(MatDestroy(&M));
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.
10 PetscCall(VecDestroy(&u));
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.
10 PetscCall(VecDestroy(&w));
461
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(EPSDestroy(&eps));
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.
10 PetscCall(STSetTransform(pep->st,transform));
463
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.
2 PetscFunctionReturn(PETSC_SUCCESS);
464 }
465
466 /*
467 Dummy backtransform operation
468 */
469 static PetscErrorCode PEPBackTransform_Skip(PEP pep)
470 {
471 PetscFunctionBegin;
472 PetscFunctionReturn(PETSC_SUCCESS);
473 }
474
475 80 PetscErrorCode PEPSetUp_STOAR_QSlice(PEP pep)
476 {
477 80 PEP_STOAR *ctx=(PEP_STOAR*)pep->data;
478 80 PEP_SR sr;
479 80 PetscInt ld,i,zeros=0;
480 80 SlepcSC sc;
481 80 PetscReal r;
482
483
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
80 PetscFunctionBegin;
484
6/10
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
80 PEPCheckSinvertCayley(pep);
485
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
80 PetscCheck(pep->inta<pep->intb,PetscObjectComm((PetscObject)pep),PETSC_ERR_SUP,"This solver does not support computing all eigenvalues unless you provide a computational interval with PEPSetInterval()");
486
1/6
✗ 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.
80 PetscCheck(pep->intb<PETSC_MAX_REAL || pep->inta>PETSC_MIN_REAL,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_WRONG,"The defined computational interval should have at least one of their sides bounded");
487
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
80 PEPCheckUnsupportedCondition(pep,PEP_FEATURE_STOPPING,PETSC_TRUE," (with spectrum slicing)");
488
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
80 if (pep->tol==(PetscReal)PETSC_DETERMINE) {
489 #if defined(PETSC_USE_REAL_SINGLE)
490 pep->tol = SLEPC_DEFAULT_TOL;
491 #else
492 /* use tighter tolerance */
493 80 pep->tol = SLEPC_DEFAULT_TOL*1e-2;
494 #endif
495 }
496
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
80 if (ctx->nev==1) ctx->nev = PetscMin(20,pep->n); /* nev not set, use default value */
497
2/6
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
80 PetscCheck(pep->n<=10 || ctx->nev>=10,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_WRONG,"nev cannot be less than 10 in spectrum slicing runs");
498 80 pep->ops->backtransform = PEPBackTransform_Skip;
499
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
80 if (pep->max_it==PETSC_DETERMINE) pep->max_it = 100;
500
501 /* create spectrum slicing context and initialize it */
502
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
80 PetscCall(PEPQSliceResetSR(pep));
503
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
80 PetscCall(PetscNew(&sr));
504 80 ctx->sr = sr;
505 80 sr->itsKs = 0;
506 80 sr->nleap = 0;
507 80 sr->sPres = NULL;
508
509
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.
80 if (pep->solvematcoeffs) PetscCall(PetscFree(pep->solvematcoeffs));
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.
80 PetscCall(PetscMalloc1(pep->nmat,&pep->solvematcoeffs));
511
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.
80 if (!pep->st) PetscCall(PEPGetST(pep,&pep->st));
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.
80 PetscCall(STSetTransform(pep->st,PETSC_FALSE));
513
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
80 PetscCall(STSetUp(pep->st));
514
515 80 ctx->hyperbolic = (pep->problem_type==PEP_HYPERBOLIC)? PETSC_TRUE: PETSC_FALSE;
516
517 /* check presence of ends and finding direction */
518
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
80 if (pep->inta > PETSC_MIN_REAL || pep->intb >= PETSC_MAX_REAL) {
519 80 sr->int0 = pep->inta;
520 80 sr->int1 = pep->intb;
521 80 sr->dir = 1;
522
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
80 if (pep->intb >= PETSC_MAX_REAL) { /* Right-open interval */
523 sr->hasEnd = PETSC_FALSE;
524 80 } else sr->hasEnd = PETSC_TRUE;
525 } else {
526 sr->int0 = pep->intb;
527 sr->int1 = pep->inta;
528 sr->dir = -1;
529 sr->hasEnd = PetscNot(pep->inta <= PETSC_MIN_REAL);
530 }
531
532 /* compute inertia0 */
533
7/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
146 PetscCall(PEPQSliceGetInertia(pep,sr->int0,&sr->inertia0,ctx->detect?&zeros:NULL,ctx->hyperbolic?0:1));
534
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.
80 PetscCheck(!zeros || (sr->int0!=pep->inta && sr->int0!=pep->intb),((PetscObject)pep)->comm,PETSC_ERR_USER,"Found singular matrix for the transformed problem in the interval endpoint");
535
7/10
✓ 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 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
80 if (!ctx->hyperbolic && ctx->checket) PetscCall(PEPQSliceCheckEigenvalueType(pep,sr->int0,0.0,PETSC_TRUE));
536
537 /* compute inertia1 */
538
7/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
146 PetscCall(PEPQSliceGetInertia(pep,sr->int1,&sr->inertia1,ctx->detect?&zeros:NULL,ctx->hyperbolic?0:1));
539
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
80 PetscCheck(!zeros,((PetscObject)pep)->comm,PETSC_ERR_USER,"Found singular matrix for the transformed problem in an interval endpoint defined by user");
540
4/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
80 if (!ctx->hyperbolic && ctx->checket && sr->hasEnd) {
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.
20 PetscCall(PEPQSliceCheckEigenvalueType(pep,sr->int1,0.0,PETSC_TRUE));
542
1/6
✗ 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.
20 PetscCheck(sr->type || sr->inertia1==sr->inertia0,((PetscObject)pep)->comm,PETSC_ERR_CONV_FAILED,"No information of eigenvalue type in interval");
543
2/6
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
20 PetscCheck(!sr->type || sr->inertia1!=sr->inertia0,((PetscObject)pep)->comm,PETSC_ERR_CONV_FAILED,"Different positive/negative type detected");
544
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
20 if (sr->dir*(sr->inertia1-sr->inertia0)<0) {
545 sr->intcorr = -1;
546 sr->inertia0 = 2*pep->n-sr->inertia0;
547 sr->inertia1 = 2*pep->n-sr->inertia1;
548 20 } else sr->intcorr = 1;
549 } else {
550
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
60 if (sr->inertia0<=pep->n && sr->inertia1<=pep->n) sr->intcorr = 1;
551
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
40 else if (sr->inertia0>=pep->n && sr->inertia1>=pep->n) sr->intcorr = -1;
552 }
553
554
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
80 if (sr->hasEnd) {
555 80 sr->dir = -sr->dir; r = sr->int0; sr->int0 = sr->int1; sr->int1 = r;
556 80 i = sr->inertia0; sr->inertia0 = sr->inertia1; sr->inertia1 = i;
557 }
558
559 /* number of eigenvalues in interval */
560 80 sr->numEigs = (sr->dir)*(sr->inertia1 - sr->inertia0);
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.
80 PetscCall(PetscInfo(pep,"QSlice setup: allocating for %" PetscInt_FMT " eigenvalues in [%g,%g]\n",sr->numEigs,(double)pep->inta,(double)pep->intb));
562
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
80 if (sr->numEigs) {
563
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70 PetscCall(PEPQSliceAllocateSolution(pep));
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.
70 PetscCall(PEPSetDimensions_Default(pep,ctx->nev,&ctx->ncv,&ctx->mpd));
565 70 pep->nev = ctx->nev; pep->ncv = ctx->ncv; pep->mpd = ctx->mpd;
566 70 ld = ctx->ncv+2;
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.
70 PetscCall(DSSetType(pep->ds,DSGHIEP));
568
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70 PetscCall(DSSetCompact(pep->ds,PETSC_TRUE));
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.
70 PetscCall(DSSetExtraRow(pep->ds,PETSC_TRUE));
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.
70 PetscCall(DSAllocate(pep->ds,ld));
571
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70 PetscCall(DSGetSlepcSC(pep->ds,&sc));
572 70 sc->rg = NULL;
573 70 sc->comparison = SlepcCompareLargestMagnitude;
574 70 sc->comparisonctx = NULL;
575 70 sc->map = NULL;
576 70 sc->mapobj = NULL;
577 10 } else {pep->ncv = 0; pep->nev = 0; pep->mpd = 0;}
578
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.
16 PetscFunctionReturn(PETSC_SUCCESS);
579 }
580
581 /*
582 Fills the fields of a shift structure
583 */
584 223 static PetscErrorCode PEPCreateShift(PEP pep,PetscReal val,PEP_shift neighb0,PEP_shift neighb1)
585 {
586 223 PEP_shift s,*pending2;
587 223 PetscInt i;
588 223 PEP_SR sr;
589 223 PEP_STOAR *ctx=(PEP_STOAR*)pep->data;
590
591
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
223 PetscFunctionBegin;
592 223 sr = ctx->sr;
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.
223 PetscCall(PetscNew(&s));
594 223 s->value = val;
595 223 s->neighb[0] = neighb0;
596
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
223 if (neighb0) neighb0->neighb[1] = s;
597 223 s->neighb[1] = neighb1;
598
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
223 if (neighb1) neighb1->neighb[0] = s;
599 223 s->comp[0] = PETSC_FALSE;
600 223 s->comp[1] = PETSC_FALSE;
601 223 s->index = -1;
602 223 s->neigs = 0;
603 223 s->nconv[0] = s->nconv[1] = 0;
604 223 s->nsch[0] = s->nsch[1]=0;
605 /* Inserts in the stack of pending shifts */
606 /* If needed, the array is resized */
607
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
223 if (sr->nPend >= sr->maxPend) {
608 sr->maxPend *= 2;
609 PetscCall(PetscMalloc1(sr->maxPend,&pending2));
610 for (i=0;i<sr->nPend;i++) pending2[i] = sr->pending[i];
611 PetscCall(PetscFree(sr->pending));
612 sr->pending = pending2;
613 }
614 223 sr->pending[sr->nPend++]=s;
615
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.
223 PetscFunctionReturn(PETSC_SUCCESS);
616 }
617
618 /* Provides next shift to be computed */
619 213 static PetscErrorCode PEPExtractShift(PEP pep)
620 {
621 213 PetscInt iner,zeros=0;
622 213 PEP_STOAR *ctx=(PEP_STOAR*)pep->data;
623 213 PEP_SR sr;
624 213 PetscReal newShift,aux;
625 213 PEP_shift sPres;
626
627
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
213 PetscFunctionBegin;
628 213 sr = ctx->sr;
629
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
213 if (sr->nPend > 0) {
630
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
143 if (sr->dirch) {
631 10 aux = sr->int1; sr->int1 = sr->int0; sr->int0 = aux;
632 10 iner = sr->inertia1; sr->inertia1 = sr->inertia0; sr->inertia0 = iner;
633 10 sr->dir *= -1;
634
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.
10 PetscCall(PetscFree(sr->s0->neighb[1]));
635
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.
10 PetscCall(PetscFree(sr->s0));
636 10 sr->nPend--;
637
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(PEPCreateShift(pep,sr->int0,NULL,NULL));
638 10 sr->sPrev = NULL;
639 10 sr->sPres = sr->pending[--sr->nPend];
640 10 pep->target = sr->sPres->value;
641 10 sr->s0 = sr->sPres;
642 10 pep->reason = PEP_CONVERGED_ITERATING;
643 } else {
644 133 sr->sPrev = sr->sPres;
645 133 sr->sPres = sr->pending[--sr->nPend];
646 }
647 143 sPres = sr->sPres;
648
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.
286 PetscCall(PEPQSliceGetInertia(pep,sPres->value,&iner,ctx->detect?&zeros:NULL,sr->intcorr));
649
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
143 if (zeros) {
650 newShift = sPres->value*(1.0+SLICE_PTOL);
651 if (sr->dir*(sPres->neighb[0] && newShift-sPres->neighb[0]->value) < 0) newShift = (sPres->value+sPres->neighb[0]->value)/2;
652 else if (sPres->neighb[1] && sr->dir*(sPres->neighb[1]->value-newShift) < 0) newShift = (sPres->value+sPres->neighb[1]->value)/2;
653 PetscCall(PEPQSliceGetInertia(pep,newShift,&iner,&zeros,sr->intcorr));
654 PetscCheck(!zeros,((PetscObject)pep)->comm,PETSC_ERR_CONV_FAILED,"Inertia computation fails in %g",(double)newShift);
655 sPres->value = newShift;
656 }
657 143 sr->sPres->inertia = iner;
658 143 pep->target = sr->sPres->value;
659 143 pep->reason = PEP_CONVERGED_ITERATING;
660 143 pep->its = 0;
661 70 } else sr->sPres = NULL;
662
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.
43 PetscFunctionReturn(PETSC_SUCCESS);
663 }
664
665 /*
666 Obtains value of subsequent shift
667 */
668 143 static PetscErrorCode PEPGetNewShiftValue(PEP pep,PetscInt side,PetscReal *newS)
669 {
670 143 PetscReal lambda,d_prev;
671 143 PetscInt i,idxP;
672 143 PEP_SR sr;
673 143 PEP_shift sPres,s;
674 143 PEP_STOAR *ctx=(PEP_STOAR*)pep->data;
675
676
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
143 PetscFunctionBegin;
677 143 sr = ctx->sr;
678 143 sPres = sr->sPres;
679
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
143 if (sPres->neighb[side]) {
680 /* Completing a previous interval */
681
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
30 if (!sPres->neighb[side]->neighb[side] && sPres->neighb[side]->nconv[side]==0) { /* One of the ends might be too far from eigenvalues */
682 if (side) *newS = (sPres->value + PetscRealPart(sr->eigr[sr->perm[sr->indexEig-1]]))/2;
683 else *newS = (sPres->value + PetscRealPart(sr->eigr[sr->perm[0]]))/2;
684 30 } else *newS=(sPres->value + sPres->neighb[side]->value)/2;
685 } else { /* (Only for side=1). Creating a new interval. */
686
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
113 if (sPres->neigs==0) {/* No value has been accepted*/
687
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
50 if (sPres->neighb[0]) {
688 /* Multiplying by 10 the previous distance */
689 40 *newS = sPres->value + 10*sr->dir*PetscAbsReal(sPres->value - sPres->neighb[0]->value);
690 40 sr->nleap++;
691 /* Stops when the interval is open and no values are found in the last 5 shifts (there might be infinite eigenvalues) */
692
1/6
✗ 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.
40 PetscCheck(sr->hasEnd || sr->nleap<=5,PetscObjectComm((PetscObject)pep),PETSC_ERR_CONV_FAILED,"Unable to compute the wanted eigenvalues with open interval");
693 } else { /* First shift */
694
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 if (pep->nconv != 0) {
695 /* Unaccepted values give information for next shift */
696 idxP=0;/* Number of values left from shift */
697 for (i=0;i<pep->nconv;i++) {
698 lambda = PetscRealPart(pep->eigr[i]);
699 if (sr->dir*(lambda - sPres->value) <0) idxP++;
700 else break;
701 }
702 /* Avoiding subtraction of eigenvalues (might be the same).*/
703 if (idxP>0) {
704 d_prev = PetscAbsReal(sPres->value - PetscRealPart(pep->eigr[0]))/(idxP+0.3);
705 } else {
706 d_prev = PetscAbsReal(sPres->value - PetscRealPart(pep->eigr[pep->nconv-1]))/(pep->nconv+0.3);
707 }
708 *newS = sPres->value + (sr->dir*d_prev*pep->nev)/2;
709 sr->dirch = PETSC_FALSE;
710 } else { /* No values found, no information for next shift */
711
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
10 PetscCheck(!sr->dirch,PetscObjectComm((PetscObject)pep),PETSC_ERR_PLIB,"First shift renders no information");
712 10 sr->dirch = PETSC_TRUE;
713 10 *newS = sr->int1;
714 }
715 }
716 } else { /* Accepted values found */
717 63 sr->dirch = PETSC_FALSE;
718 63 sr->nleap = 0;
719 /* Average distance of values in previous subinterval */
720 63 s = sPres->neighb[0];
721
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
63 while (s && PetscAbs(s->inertia - sPres->inertia)==0) {
722 s = s->neighb[0];/* Looking for previous shifts with eigenvalues within */
723 }
724
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
63 if (s) {
725 30 d_prev = PetscAbsReal((sPres->value - s->value)/(sPres->inertia - s->inertia));
726 } else { /* First shift. Average distance obtained with values in this shift */
727 /* first shift might be too far from first wanted eigenvalue (no values found outside the interval)*/
728
3/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 3 times.
33 if (sr->dir*(PetscRealPart(sr->eigr[0])-sPres->value)>0 && PetscAbsReal((PetscRealPart(sr->eigr[sr->indexEig-1]) - PetscRealPart(sr->eigr[0]))/PetscRealPart(sr->eigr[0])) > PetscSqrtReal(pep->tol)) {
729 30 d_prev = PetscAbsReal((PetscRealPart(sr->eigr[sr->indexEig-1]) - PetscRealPart(sr->eigr[0])))/(sPres->neigs+0.3);
730 } else {
731 3 d_prev = PetscAbsReal(PetscRealPart(sr->eigr[sr->indexEig-1]) - sPres->value)/(sPres->neigs+0.3);
732 }
733 }
734 /* Average distance is used for next shift by adding it to value on the right or to shift */
735
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
63 if (sr->dir*(PetscRealPart(sr->eigr[sPres->index + sPres->neigs -1]) - sPres->value)>0) {
736 63 *newS = PetscRealPart(sr->eigr[sPres->index + sPres->neigs -1])+ (sr->dir*d_prev*pep->nev)/2;
737 } else { /* Last accepted value is on the left of shift. Adding to shift */
738 *newS = sPres->value + (sr->dir*d_prev*pep->nev)/2;
739 }
740 }
741 /* End of interval can not be surpassed */
742
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
113 if (sr->dir*(sr->int1 - *newS) < 0) *newS = sr->int1;
743 }/* of neighb[side]==null */
744
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
29 PetscFunctionReturn(PETSC_SUCCESS);
745 }
746
747 /*
748 Function for sorting an array of real values
749 */
750 416 static PetscErrorCode sortRealEigenvalues(PetscScalar *r,PetscInt *perm,PetscInt nr,PetscBool prev,PetscInt dir)
751 {
752 416 PetscReal re;
753 416 PetscInt i,j,tmp;
754
755
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
416 PetscFunctionBegin;
756
3/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
10291 if (!prev) for (i=0;i<nr;i++) perm[i] = i;
757 /* Insertion sort */
758
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9553 for (i=1;i<nr;i++) {
759 9137 re = PetscRealPart(r[perm[i]]);
760 9137 j = i-1;
761
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
34084 while (j>=0 && dir*(re - PetscRealPart(r[perm[j]])) <= 0) {
762 24947 tmp = perm[j]; perm[j] = perm[j+1]; perm[j+1] = tmp; j--;
763 }
764 }
765
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.
416 PetscFunctionReturn(PETSC_SUCCESS);
766 }
767
768 /* Stores the pairs obtained since the last shift in the global arrays */
769 213 static PetscErrorCode PEPStoreEigenpairs(PEP pep)
770 {
771 213 PEP_STOAR *ctx=(PEP_STOAR*)pep->data;
772 213 PetscReal lambda,err,*errest;
773 213 PetscInt i,*aux,count=0,ndef,ld,nconv=pep->nconv,d=pep->nmat-1,idx;
774 213 PetscBool iscayley,divide=PETSC_FALSE;
775 213 PEP_SR sr = ctx->sr;
776 213 PEP_shift sPres;
777 213 Vec w,vomega;
778 213 Mat MS;
779 213 BV tV;
780 213 PetscScalar *S,*eigr,*tS,*omega;
781
782
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
213 PetscFunctionBegin;
783 213 sPres = sr->sPres;
784 213 sPres->index = sr->indexEig;
785
786
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
213 if (nconv>sr->ndef0+sr->ndef1) {
787 /* Back-transform */
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.
203 PetscCall(STBackTransform(pep->st,nconv,pep->eigr,pep->eigi));
789
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4430 for (i=0;i<nconv;i++) {
790 #if defined(PETSC_USE_COMPLEX)
791
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
2137 if (PetscImaginaryPart(pep->eigr[i])) pep->eigr[i] = sr->int0-sr->dir;
792 #else
793
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
2090 if (pep->eigi[i]) pep->eigr[i] = sr->int0-sr->dir;
794 #endif
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.
203 PetscCall(PetscObjectTypeCompare((PetscObject)pep->st,STCAYLEY,&iscayley));
797 /* Sort eigenvalues */
798
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
203 PetscCall(sortRealEigenvalues(pep->eigr,pep->perm,nconv,PETSC_FALSE,sr->dir));
799
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
203 PetscCall(VecCreateSeq(PETSC_COMM_SELF,nconv,&vomega));
800
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
203 PetscCall(BVGetSignature(ctx->V,vomega));
801
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
203 PetscCall(VecGetArray(vomega,&omega));
802
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
203 PetscCall(BVGetSizes(pep->V,NULL,NULL,&ld));
803
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
203 PetscCall(BVTensorGetFactors(ctx->V,NULL,&MS));
804
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
203 PetscCall(MatDenseGetArray(MS,&S));
805 /* Values stored in global array */
806
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
203 PetscCall(PetscCalloc4(nconv,&eigr,nconv,&errest,nconv*nconv*d,&tS,nconv,&aux));
807 203 ndef = sr->ndef0+sr->ndef1;
808
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4430 for (i=0;i<nconv;i++) {
809 4227 lambda = PetscRealPart(pep->eigr[pep->perm[i]]);
810 4227 err = pep->errest[pep->perm[i]];
811
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
4227 if (sr->dir*(lambda - sPres->ext[0]) > 0 && (sr->dir)*(sPres->ext[1] - lambda) > 0) {/* Valid value */
812
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2731 PetscCheck(sr->indexEig+count-ndef<sr->numEigs,PetscObjectComm((PetscObject)pep),PETSC_ERR_PLIB,"Unexpected error in Spectrum Slicing");
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.
2731 PetscCall(PEPQSliceCheckEigenvalueType(pep,lambda,PetscRealPart(omega[pep->perm[i]]),PETSC_FALSE));
814 2731 eigr[count] = lambda;
815 2731 errest[count] = err;
816
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
2731 if ((sr->dir*(sPres->value - lambda) > 0) && (sr->dir*(lambda - sPres->ext[0]) > 0)) sPres->nconv[0]++;
817
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
2731 if ((sr->dir*(lambda - sPres->value) > 0) && (sr->dir*(sPres->ext[1] - lambda) > 0)) sPres->nconv[1]++;
818
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2731 PetscCall(PetscArraycpy(tS+count*(d*nconv),S+pep->perm[i]*(d*ld),nconv));
819
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2731 PetscCall(PetscArraycpy(tS+count*(d*nconv)+nconv,S+pep->perm[i]*(d*ld)+ld,nconv));
820 2731 count++;
821 }
822 }
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.
203 PetscCall(VecRestoreArray(vomega,&omega));
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.
203 PetscCall(VecDestroy(&vomega));
825
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2934 for (i=0;i<count;i++) {
826
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2731 PetscCall(PetscArraycpy(S+i*(d*ld),tS+i*nconv*d,nconv));
827
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2731 PetscCall(PetscArraycpy(S+i*(d*ld)+ld,tS+i*nconv*d+nconv,nconv));
828 }
829
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
203 PetscCall(MatDenseRestoreArray(MS,&S));
830
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
203 PetscCall(BVTensorRestoreFactors(ctx->V,NULL,&MS));
831
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
203 PetscCall(BVSetActiveColumns(ctx->V,0,count));
832
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
203 PetscCall(BVTensorCompress(ctx->V,count));
833
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
203 if (sr->sPres->nconv[0] && sr->sPres->nconv[1]) {
834 60 divide = PETSC_TRUE;
835
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
60 PetscCall(BVTensorGetFactors(ctx->V,NULL,&MS));
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.
60 PetscCall(MatDenseGetArray(MS,&S));
837
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.
60 PetscCall(PetscArrayzero(tS,nconv*nconv*d));
838
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1360 for (i=0;i<count;i++) {
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.
1300 PetscCall(PetscArraycpy(tS+i*nconv*d,S+i*(d*ld),count));
840
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1300 PetscCall(PetscArraycpy(tS+i*nconv*d+nconv,S+i*(d*ld)+ld,count));
841 }
842
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
60 PetscCall(MatDenseRestoreArray(MS,&S));
843
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
60 PetscCall(BVTensorRestoreFactors(ctx->V,NULL,&MS));
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.
60 PetscCall(BVSetActiveColumns(pep->V,0,count));
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.
60 PetscCall(BVDuplicateResize(pep->V,count,&tV));
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.
60 PetscCall(BVCopy(pep->V,tV));
847 }
848
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
203 if (sr->sPres->nconv[0]) {
849
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
103 if (divide) {
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.
60 PetscCall(BVSetActiveColumns(ctx->V,0,sr->sPres->nconv[0]));
851
3/6
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
60 PetscCall(BVTensorCompress(ctx->V,sr->sPres->nconv[0]));
852 }
853
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
909 for (i=0;i<sr->ndef0;i++) aux[i] = sr->idxDef0[i];
854
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
585 for (i=sr->ndef0;i<sr->sPres->nconv[0];i++) aux[i] = sr->indexEig+i-sr->ndef0;
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.
103 PetscCall(BVTensorGetFactors(ctx->V,NULL,&MS));
856
4/6
✓ Branch 0 taken 2 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(MatDenseGetArray(MS,&S));
857
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1391 for (i=0;i<sr->sPres->nconv[0];i++) {
858 1288 sr->eigr[aux[i]] = eigr[i];
859 1288 sr->errest[aux[i]] = errest[i];
860
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1288 PetscCall(BVGetColumn(pep->V,i,&w));
861
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1288 PetscCall(BVInsertVec(sr->V,aux[i],w));
862
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1288 PetscCall(BVRestoreColumn(pep->V,i,&w));
863 1288 idx = sr->ld*d*aux[i];
864
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.
1288 PetscCall(PetscArrayzero(sr->S+idx,sr->ld*d));
865
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1288 PetscCall(PetscArraycpy(sr->S+idx,S+i*(ld*d),sr->sPres->nconv[0]));
866
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1288 PetscCall(PetscArraycpy(sr->S+idx+sr->ld,S+i*(ld*d)+ld,sr->sPres->nconv[0]));
867
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.
1288 PetscCall(PetscFree(sr->qinfo[aux[i]].q));
868
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1288 PetscCall(PetscMalloc1(sr->sPres->nconv[0],&sr->qinfo[aux[i]].q));
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.
1288 PetscCall(PetscArraycpy(sr->qinfo[aux[i]].q,aux,sr->sPres->nconv[0]));
870 1288 sr->qinfo[aux[i]].nq = sr->sPres->nconv[0];
871 }
872
4/6
✓ Branch 0 taken 2 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(MatDenseRestoreArray(MS,&S));
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.
103 PetscCall(BVTensorRestoreFactors(ctx->V,NULL,&MS));
874 }
875
876
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
203 if (sr->sPres->nconv[1]) {
877
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
130 if (divide) {
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.
60 PetscCall(BVTensorGetFactors(ctx->V,NULL,&MS));
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.
60 PetscCall(MatDenseGetArray(MS,&S));
880
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
725 for (i=0;i<sr->sPres->nconv[1];i++) {
881
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
665 PetscCall(PetscArraycpy(S+i*(d*ld),tS+(sr->sPres->nconv[0]+i)*nconv*d,count));
882
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
665 PetscCall(PetscArraycpy(S+i*(d*ld)+ld,tS+(sr->sPres->nconv[0]+i)*nconv*d+nconv,count));
883 }
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.
60 PetscCall(MatDenseRestoreArray(MS,&S));
885
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
60 PetscCall(BVTensorRestoreFactors(ctx->V,NULL,&MS));
886
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
60 PetscCall(BVSetActiveColumns(pep->V,0,count));
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.
60 PetscCall(BVCopy(tV,pep->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.
60 PetscCall(BVSetActiveColumns(ctx->V,0,sr->sPres->nconv[1]));
889
3/6
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
60 PetscCall(BVTensorCompress(ctx->V,sr->sPres->nconv[1]));
890 }
891
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
365 for (i=0;i<sr->ndef1;i++) aux[i] = sr->idxDef1[i];
892
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1338 for (i=sr->ndef1;i<sr->sPres->nconv[1];i++) aux[i] = sr->indexEig+sr->sPres->nconv[0]-sr->ndef0+i-sr->ndef1;
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.
130 PetscCall(BVTensorGetFactors(ctx->V,NULL,&MS));
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.
130 PetscCall(MatDenseGetArray(MS,&S));
895
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1573 for (i=0;i<sr->sPres->nconv[1];i++) {
896 1443 sr->eigr[aux[i]] = eigr[sr->sPres->nconv[0]+i];
897 1443 sr->errest[aux[i]] = errest[sr->sPres->nconv[0]+i];
898
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1443 PetscCall(BVGetColumn(pep->V,i,&w));
899
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1443 PetscCall(BVInsertVec(sr->V,aux[i],w));
900
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1443 PetscCall(BVRestoreColumn(pep->V,i,&w));
901 1443 idx = sr->ld*d*aux[i];
902
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.
1443 PetscCall(PetscArrayzero(sr->S+idx,sr->ld*d));
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.
1443 PetscCall(PetscArraycpy(sr->S+idx,S+i*(ld*d),sr->sPres->nconv[1]));
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.
1443 PetscCall(PetscArraycpy(sr->S+idx+sr->ld,S+i*(ld*d)+ld,sr->sPres->nconv[1]));
905
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.
1443 PetscCall(PetscFree(sr->qinfo[aux[i]].q));
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.
1443 PetscCall(PetscMalloc1(sr->sPres->nconv[1],&sr->qinfo[aux[i]].q));
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.
1443 PetscCall(PetscArraycpy(sr->qinfo[aux[i]].q,aux,sr->sPres->nconv[1]));
908 1443 sr->qinfo[aux[i]].nq = sr->sPres->nconv[1];
909 }
910
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
130 PetscCall(MatDenseRestoreArray(MS,&S));
911
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
130 PetscCall(BVTensorRestoreFactors(ctx->V,NULL,&MS));
912 }
913 203 sPres->neigs = count-sr->ndef0-sr->ndef1;
914 203 sr->indexEig += sPres->neigs;
915 203 sPres->nconv[0]-= sr->ndef0;
916 203 sPres->nconv[1]-= sr->ndef1;
917
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
203 PetscCall(PetscFree4(eigr,errest,tS,aux));
918 } else {
919 10 sPres->neigs = 0;
920 10 sPres->nconv[0]= 0;
921 10 sPres->nconv[1]= 0;
922 }
923 /* Global ordering array updating */
924
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213 PetscCall(sortRealEigenvalues(sr->eigr,sr->perm,sr->indexEig,PETSC_FALSE,sr->dir));
925 /* Check for completion */
926 213 sPres->comp[0] = PetscNot(sPres->nconv[0] < sPres->nsch[0]);
927 213 sPres->comp[1] = PetscNot(sPres->nconv[1] < sPres->nsch[1]);
928
2/6
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
213 PetscCheck(sPres->nconv[0]<=sPres->nsch[0] && sPres->nconv[1]<=sPres->nsch[1],PetscObjectComm((PetscObject)pep),PETSC_ERR_PLIB,"Mismatch between number of values found and information from inertia");
929
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.
213 if (divide) PetscCall(BVDestroy(&tV));
930
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.
43 PetscFunctionReturn(PETSC_SUCCESS);
931 }
932
933 213 static PetscErrorCode PEPLookForDeflation(PEP pep)
934 {
935 213 PetscReal val;
936 213 PetscInt i,count0=0,count1=0;
937 213 PEP_shift sPres;
938 213 PetscInt ini,fin;
939 213 PEP_SR sr;
940 213 PEP_STOAR *ctx=(PEP_STOAR*)pep->data;
941
942
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
213 PetscFunctionBegin;
943 213 sr = ctx->sr;
944 213 sPres = sr->sPres;
945
946
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
213 if (sPres->neighb[0]) ini = (sr->dir)*(sPres->neighb[0]->inertia - sr->inertia0);
947 else ini = 0;
948 213 fin = sr->indexEig;
949 /* Selection of ends for searching new values */
950
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
213 if (!sPres->neighb[0]) sPres->ext[0] = sr->int0;/* First shift */
951 133 else sPres->ext[0] = sPres->neighb[0]->value;
952
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
213 if (!sPres->neighb[1]) {
953
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
183 if (sr->hasEnd) sPres->ext[1] = sr->int1;
954 else sPres->ext[1] = (sr->dir > 0)?PETSC_MAX_REAL:PETSC_MIN_REAL;
955 30 } else sPres->ext[1] = sPres->neighb[1]->value;
956 /* Selection of values between right and left ends */
957
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1254 for (i=ini;i<fin;i++) {
958 1061 val=PetscRealPart(sr->eigr[sr->perm[i]]);
959 /* Values to the right of left shift */
960
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1061 if (sr->dir*(val - sPres->ext[1]) < 0) {
961
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1041 if (sr->dir*(val - sPres->value) < 0) count0++;
962 235 else count1++;
963 } else break;
964 }
965 /* The number of values on each side are found */
966
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
213 if (sPres->neighb[0]) {
967 133 sPres->nsch[0] = (sr->dir)*(sPres->inertia - sPres->neighb[0]->inertia)-count0;
968
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
133 PetscCheck(sPres->nsch[0]>=0,PetscObjectComm((PetscObject)pep),PETSC_ERR_PLIB,"Mismatch between number of values found and information from inertia");
969 80 } else sPres->nsch[0] = 0;
970
971
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
213 if (sPres->neighb[1]) {
972 30 sPres->nsch[1] = (sr->dir)*(sPres->neighb[1]->inertia - sPres->inertia) - count1;
973
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
30 PetscCheck(sPres->nsch[1]>=0,PetscObjectComm((PetscObject)pep),PETSC_ERR_PLIB,"Mismatch between number of values found and information from inertia");
974 183 } else sPres->nsch[1] = (sr->dir)*(sr->inertia1 - sPres->inertia);
975
976 /* Completing vector of indexes for deflation */
977
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1019 for (i=0;i<count0;i++) sr->idxDef0[i] = sr->perm[ini+i];
978 213 sr->ndef0 = count0;
979
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
448 for (i=0;i<count1;i++) sr->idxDef1[i] = sr->perm[ini+count0+i];
980 213 sr->ndef1 = count1;
981
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.
213 PetscFunctionReturn(PETSC_SUCCESS);
982 }
983
984 /*
985 Compute a run of Lanczos iterations
986 */
987 1939 static PetscErrorCode PEPSTOARrun_QSlice(PEP pep,PetscReal *a,PetscReal *b,PetscReal *omega,PetscInt k,PetscInt *M,PetscBool *breakdown,PetscBool *symmlost,Vec *t_)
988 {
989 1939 PEP_STOAR *ctx = (PEP_STOAR*)pep->data;
990 1939 PetscInt i,j,m=*M,l,lock;
991 1939 PetscInt lds,d,ld,offq,nqt,ldds;
992 1939 Vec v=t_[0],t=t_[1],q=t_[2];
993 1939 PetscReal norm,sym=0.0,fro=0.0,*f;
994 1939 PetscScalar *y,*S,sigma;
995 1939 PetscBLASInt j_,one=1;
996 1939 PetscBool lindep;
997 1939 Mat MS;
998
999
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1939 PetscFunctionBegin;
1000
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1939 PetscCall(PetscMalloc1(*M,&y));
1001
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1939 PetscCall(BVGetSizes(pep->V,NULL,NULL,&ld));
1002
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1939 PetscCall(BVTensorGetDegree(ctx->V,&d));
1003
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1939 PetscCall(BVGetActiveColumns(pep->V,&lock,&nqt));
1004 1939 lds = d*ld;
1005 1939 offq = ld;
1006
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1939 PetscCall(DSGetLeadingDimension(pep->ds,&ldds));
1007
1008 1939 *breakdown = PETSC_FALSE; /* ----- */
1009
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1939 PetscCall(STGetShift(pep->st,&sigma));
1010
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1939 PetscCall(DSGetDimensions(pep->ds,NULL,&l,NULL,NULL));
1011
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1939 PetscCall(BVSetActiveColumns(ctx->V,0,m));
1012
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1939 PetscCall(BVSetActiveColumns(pep->V,0,nqt));
1013
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
33789 for (j=k;j<m;j++) {
1014 /* apply operator */
1015
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
31854 PetscCall(BVTensorGetFactors(ctx->V,NULL,&MS));
1016
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
31854 PetscCall(MatDenseGetArray(MS,&S));
1017
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
31854 PetscCall(BVGetColumn(pep->V,nqt,&t));
1018
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
31854 PetscCall(BVMultVec(pep->V,1.0,0.0,v,S+j*lds));
1019
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
31854 PetscCall(MatMult(pep->A[1],v,q));
1020
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
31854 PetscCall(MatMult(pep->A[2],v,t));
1021
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
31854 PetscCall(VecAXPY(q,sigma*pep->sfactor,t));
1022
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
31854 PetscCall(VecScale(q,pep->sfactor));
1023
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
31854 PetscCall(BVMultVec(pep->V,1.0,0.0,v,S+offq+j*lds));
1024
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
31854 PetscCall(MatMult(pep->A[2],v,t));
1025
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
31854 PetscCall(VecAXPY(q,pep->sfactor*pep->sfactor,t));
1026
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
31854 PetscCall(STMatSolve(pep->st,q,t));
1027
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
31854 PetscCall(VecScale(t,-1.0));
1028
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
31854 PetscCall(BVRestoreColumn(pep->V,nqt,&t));
1029
1030 /* orthogonalize */
1031
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
31854 PetscCall(BVOrthogonalizeColumn(pep->V,nqt,S+(j+1)*lds,&norm,&lindep));
1032
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
31854 if (!lindep) {
1033 31854 *(S+(j+1)*lds+nqt) = norm;
1034
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
31854 PetscCall(BVScaleColumn(pep->V,nqt,1.0/norm));
1035 31854 nqt++;
1036 }
1037
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
894248 for (i=0;i<nqt;i++) *(S+(j+1)*lds+offq+i) = *(S+j*lds+i)+sigma*(*(S+(j+1)*lds+i));
1038
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
31854 PetscCall(BVSetActiveColumns(pep->V,0,nqt));
1039
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
31854 PetscCall(MatDenseRestoreArray(MS,&S));
1040
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
31854 PetscCall(BVTensorRestoreFactors(ctx->V,NULL,&MS));
1041
1042 /* level-2 orthogonalization */
1043
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
31854 PetscCall(BVOrthogonalizeColumn(ctx->V,j+1,y,&norm,&lindep));
1044 31854 a[j] = PetscRealPart(y[j]);
1045
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
31854 omega[j+1] = (norm > 0)?1.0:-1.0;
1046
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
31854 PetscCall(BVScaleColumn(ctx->V,j+1,1.0/norm));
1047 31854 b[j] = PetscAbsReal(norm);
1048
1049 /* check symmetry */
1050
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
31854 PetscCall(DSGetArrayReal(pep->ds,DS_MAT_T,&f));
1051
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
31854 if (j==k) {
1052
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
31501 for (i=l;i<j-1;i++) y[i] = PetscAbsScalar(y[i])-PetscAbsReal(f[2*ldds+i]);
1053
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
1939 for (i=0;i<l;i++) y[i] = 0.0;
1054 }
1055
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
31854 PetscCall(DSRestoreArrayReal(pep->ds,DS_MAT_T,&f));
1056
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
31854 if (j>0) y[j-1] = PetscAbsScalar(y[j-1])-PetscAbsReal(b[j-1]);
1057
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
31854 PetscCall(PetscBLASIntCast(j,&j_));
1058 31854 sym = SlepcAbs(BLASnrm2_(&j_,y,&one),sym);
1059 31854 fro = SlepcAbs(fro,SlepcAbs(a[j],b[j]));
1060
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
31854 if (j>0) fro = SlepcAbs(fro,b[j-1]);
1061
3/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 10 times.
31854 if (sym/fro>PetscMax(PETSC_SQRT_MACHINE_EPSILON,10*pep->tol)) {
1062 4 *symmlost = PETSC_TRUE;
1063 4 *M=j;
1064 4 break;
1065 }
1066 }
1067
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1939 PetscCall(BVSetActiveColumns(pep->V,lock,nqt));
1068
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1939 PetscCall(BVSetActiveColumns(ctx->V,0,*M));
1069
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.
1939 PetscCall(PetscFree(y));
1070
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.
388 PetscFunctionReturn(PETSC_SUCCESS);
1071 }
1072
1073 213 static PetscErrorCode PEPSTOAR_QSlice(PEP pep,Mat B)
1074 {
1075 213 PEP_STOAR *ctx = (PEP_STOAR*)pep->data;
1076 213 PetscInt j,k,l,nv=0,ld,ldds,t,nq=0,idx;
1077 213 PetscInt nconv=0,deg=pep->nmat-1,count0=0,count1=0;
1078 213 PetscScalar *om,sigma,*back,*S,*pQ;
1079 213 PetscReal beta,norm=1.0,*omega,*a,*b,eta,lambda;
1080 213 PetscBool breakdown,symmlost=PETSC_FALSE,sinv,falselock=PETSC_TRUE;
1081 213 Mat MS,MQ,D;
1082 213 Vec v,vomega;
1083 213 PEP_SR sr;
1084 213 BVOrthogType otype;
1085 213 BVOrthogBlockType obtype;
1086
1087
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
213 PetscFunctionBegin;
1088 /* Resize if needed for deflating vectors */
1089 213 sr = ctx->sr;
1090 213 sigma = sr->sPres->value;
1091 213 k = sr->ndef0+sr->ndef1;
1092 213 pep->ncv = ctx->ncv+k;
1093 213 pep->nev = ctx->nev+k;
1094
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213 PetscCall(PEPAllocateSolution(pep,3));
1095
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213 PetscCall(BVDestroy(&ctx->V));
1096
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213 PetscCall(BVCreateTensor(pep->V,pep->nmat-1,&ctx->V));
1097
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213 PetscCall(BVGetOrthogonalization(pep->V,&otype,NULL,&eta,&obtype));
1098
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213 PetscCall(BVSetOrthogonalization(ctx->V,otype,BV_ORTHOG_REFINE_ALWAYS,eta,obtype));
1099
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213 PetscCall(DSAllocate(pep->ds,pep->ncv+2));
1100
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213 PetscCall(PetscMalloc1(pep->ncv,&back));
1101
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213 PetscCall(DSGetLeadingDimension(pep->ds,&ldds));
1102
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213 PetscCall(BVSetMatrix(ctx->V,B,PETSC_TRUE));
1103
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
213 PetscCheck(ctx->lock,PetscObjectComm((PetscObject)pep),PETSC_ERR_SUP,"A locking variant is needed for spectrum slicing");
1104 /* undocumented option to use a cheaper locking instead of the true locking */
1105
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213 PetscCall(PetscOptionsGetBool(NULL,NULL,"-pep_stoar_falselocking",&falselock,NULL));
1106
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213 PetscCall(PetscObjectTypeCompare((PetscObject)pep->st,STSINVERT,&sinv));
1107
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.
213 PetscCall(RGPushScale(pep->rg,sinv?pep->sfactor:1.0/pep->sfactor));
1108
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.
213 PetscCall(STScaleShift(pep->st,sinv?pep->sfactor:1.0/pep->sfactor));
1109
1110 /* Get the starting Arnoldi vector */
1111
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213 PetscCall(BVSetActiveColumns(pep->V,0,1));
1112
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213 PetscCall(BVTensorBuildFirstColumn(ctx->V,pep->nini));
1113
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213 PetscCall(BVSetActiveColumns(ctx->V,0,1));
1114
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
213 if (k) {
1115 /* Insert deflated vectors */
1116
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
93 PetscCall(BVSetActiveColumns(pep->V,0,0));
1117
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
93 idx = sr->ndef0?sr->idxDef0[0]:sr->idxDef1[0];
1118
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1134 for (j=0;j<k;j++) {
1119
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1041 PetscCall(BVGetColumn(pep->V,j,&v));
1120
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1041 PetscCall(BVCopyVec(sr->V,sr->qinfo[idx].q[j],v));
1121
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1041 PetscCall(BVRestoreColumn(pep->V,j,&v));
1122 }
1123 /* Update innerproduct matrix */
1124
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
93 PetscCall(BVSetActiveColumns(ctx->V,0,0));
1125
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
93 PetscCall(BVTensorGetFactors(ctx->V,NULL,&MS));
1126
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
93 PetscCall(BVSetActiveColumns(pep->V,0,k));
1127
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
93 PetscCall(BVTensorRestoreFactors(ctx->V,NULL,&MS));
1128
1129
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
93 PetscCall(BVGetSizes(pep->V,NULL,NULL,&ld));
1130
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
93 PetscCall(BVTensorGetFactors(ctx->V,NULL,&MS));
1131
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
93 PetscCall(MatDenseGetArray(MS,&S));
1132
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
899 for (j=0;j<sr->ndef0;j++) {
1133
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.
806 PetscCall(PetscArrayzero(S+j*ld*deg,ld*deg));
1134
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
806 PetscCall(PetscArraycpy(S+j*ld*deg,sr->S+sr->idxDef0[j]*sr->ld*deg,k));
1135
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
806 PetscCall(PetscArraycpy(S+j*ld*deg+ld,sr->S+sr->idxDef0[j]*sr->ld*deg+sr->ld,k));
1136 806 pep->eigr[j] = sr->eigr[sr->idxDef0[j]];
1137 806 pep->errest[j] = sr->errest[sr->idxDef0[j]];
1138 }
1139
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
328 for (j=0;j<sr->ndef1;j++) {
1140
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.
235 PetscCall(PetscArrayzero(S+(j+sr->ndef0)*ld*deg,ld*deg));
1141
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
235 PetscCall(PetscArraycpy(S+(j+sr->ndef0)*ld*deg,sr->S+sr->idxDef1[j]*sr->ld*deg,k));
1142
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
235 PetscCall(PetscArraycpy(S+(j+sr->ndef0)*ld*deg+ld,sr->S+sr->idxDef1[j]*sr->ld*deg+sr->ld,k));
1143 235 pep->eigr[j+sr->ndef0] = sr->eigr[sr->idxDef1[j]];
1144 235 pep->errest[j+sr->ndef0] = sr->errest[sr->idxDef1[j]];
1145 }
1146
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
93 PetscCall(MatDenseRestoreArray(MS,&S));
1147
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
93 PetscCall(BVTensorRestoreFactors(ctx->V,NULL,&MS));
1148
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
93 PetscCall(BVSetActiveColumns(ctx->V,0,k+1));
1149
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
93 PetscCall(VecCreateSeq(PETSC_COMM_SELF,k+1,&vomega));
1150
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
93 PetscCall(VecGetArray(vomega,&om));
1151
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1134 for (j=0;j<k;j++) {
1152
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1041 PetscCall(BVOrthogonalizeColumn(ctx->V,j,NULL,&norm,NULL));
1153
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1041 PetscCall(BVScaleColumn(ctx->V,j,1/norm));
1154
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1217 om[j] = (norm>=0.0)?1.0:-1.0;
1155 }
1156
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
93 PetscCall(BVTensorGetFactors(ctx->V,NULL,&MS));
1157
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
93 PetscCall(MatDenseGetArray(MS,&S));
1158
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
279 for (j=0;j<deg;j++) {
1159
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
186 PetscCall(BVSetRandomColumn(pep->V,k+j));
1160
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
186 PetscCall(BVOrthogonalizeColumn(pep->V,k+j,S+k*ld*deg+j*ld,&norm,NULL));
1161
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
186 PetscCall(BVScaleColumn(pep->V,k+j,1.0/norm));
1162 186 S[k*ld*deg+j*ld+k+j] = norm;
1163 }
1164
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
93 PetscCall(MatDenseRestoreArray(MS,&S));
1165
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
93 PetscCall(BVSetActiveColumns(pep->V,0,k+deg));
1166
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
93 PetscCall(BVTensorRestoreFactors(ctx->V,NULL,&MS));
1167
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
93 PetscCall(BVOrthogonalizeColumn(ctx->V,k,NULL,&norm,NULL));
1168
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
93 PetscCall(BVScaleColumn(ctx->V,k,1.0/norm));
1169
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
93 om[k] = (norm>=0.0)?1.0:-1.0;
1170
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
93 PetscCall(VecRestoreArray(vomega,&om));
1171
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
93 PetscCall(BVSetSignature(ctx->V,vomega));
1172
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
93 PetscCall(DSGetArrayReal(pep->ds,DS_MAT_T,&a));
1173
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
93 PetscCall(VecGetArray(vomega,&om));
1174
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1134 for (j=0;j<k;j++) a[j] = PetscRealPart(om[j]/(pep->eigr[j]-sigma));
1175
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
93 PetscCall(VecRestoreArray(vomega,&om));
1176
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
93 PetscCall(VecDestroy(&vomega));
1177
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
93 PetscCall(DSRestoreArrayReal(pep->ds,DS_MAT_T,&a));
1178
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
93 PetscCall(DSGetArray(pep->ds,DS_MAT_Q,&pQ));
1179
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.
93 PetscCall(PetscArrayzero(pQ,ldds*k));
1180
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1134 for (j=0;j<k;j++) pQ[j+j*ldds] = 1.0;
1181
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
93 PetscCall(DSRestoreArray(pep->ds,DS_MAT_Q,&pQ));
1182 }
1183
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213 PetscCall(BVSetActiveColumns(ctx->V,0,k+1));
1184
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213 PetscCall(DSSetDimensions(pep->ds,k+1,PETSC_DETERMINE,PETSC_DETERMINE));
1185
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213 PetscCall(DSGetMatAndColumn(pep->ds,DS_MAT_D,0,&D,&vomega));
1186
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213 PetscCall(BVGetSignature(ctx->V,vomega));
1187
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213 PetscCall(DSRestoreMatAndColumn(pep->ds,DS_MAT_D,0,&D,&vomega));
1188
1189
9/10
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
213 PetscCall(PetscInfo(pep,"Start STOAR: sigma=%g in [%g,%g], for deflation: left=%" PetscInt_FMT " right=%" PetscInt_FMT ", searching: left=%" PetscInt_FMT " right=%" PetscInt_FMT "\n",(double)sr->sPres->value,(double)(sr->sPres->neighb[0]?sr->sPres->neighb[0]->value:sr->int0),(double)(sr->sPres->neighb[1]?sr->sPres->neighb[1]->value:sr->int1),sr->ndef0,sr->ndef1,sr->sPres->nsch[0],sr->sPres->nsch[1]));
1190
1191 /* Restart loop */
1192 213 l = 0;
1193 213 pep->nconv = k;
1194 213 while (pep->reason == PEP_CONVERGED_ITERATING) {
1195 1939 pep->its++;
1196
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1939 PetscCall(DSGetArrayReal(pep->ds,DS_MAT_T,&a));
1197 1939 b = a+ldds;
1198
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1939 PetscCall(DSGetArrayReal(pep->ds,DS_MAT_D,&omega));
1199
1200 /* Compute an nv-step Lanczos factorization */
1201 1939 nv = PetscMin(pep->nconv+pep->mpd,pep->ncv);
1202
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1939 PetscCall(PEPSTOARrun_QSlice(pep,a,b,omega,pep->nconv+l,&nv,&breakdown,&symmlost,pep->work));
1203 1939 beta = b[nv-1];
1204
4/4
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 1 times.
1939 if (symmlost && nv==pep->nconv+l) {
1205 3 pep->reason = PEP_DIVERGED_SYMMETRY_LOST;
1206 3 pep->nconv = nconv;
1207
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
3 PetscCall(PetscInfo(pep,"Symmetry lost in STOAR sigma=%g nconv=%" PetscInt_FMT "\n",(double)sr->sPres->value,nconv));
1208
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
3 if (falselock || !ctx->lock) {
1209
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
3 PetscCall(BVSetActiveColumns(ctx->V,0,pep->nconv));
1210
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
3 PetscCall(BVTensorCompress(ctx->V,0));
1211 }
1212 break;
1213 }
1214
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1936 PetscCall(DSRestoreArrayReal(pep->ds,DS_MAT_T,&a));
1215
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1936 PetscCall(DSRestoreArrayReal(pep->ds,DS_MAT_D,&omega));
1216
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1936 PetscCall(DSSetDimensions(pep->ds,nv,pep->nconv,pep->nconv+l));
1217
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.
1936 if (l==0) PetscCall(DSSetState(pep->ds,DS_STATE_INTERMEDIATE));
1218
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1723 else PetscCall(DSSetState(pep->ds,DS_STATE_RAW));
1219
1220 /* Solve projected problem */
1221
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1936 PetscCall(DSSolve(pep->ds,pep->eigr,pep->eigi));
1222
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1936 PetscCall(DSSort(pep->ds,pep->eigr,pep->eigi,NULL,NULL,NULL));
1223
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1936 PetscCall(DSUpdateExtraRow(pep->ds));
1224
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1936 PetscCall(DSSynchronize(pep->ds,pep->eigr,pep->eigi));
1225
1226 /* Check convergence */
1227 /* PetscCall(PEPSTOARpreKConvergence(pep,nv,&norm,pep->work));*/
1228 1936 norm = 1.0;
1229
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1936 PetscCall(DSGetDimensions(pep->ds,NULL,NULL,NULL,&t));
1230
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1936 PetscCall(PEPKrylovConvergence(pep,PETSC_FALSE,pep->nconv,t-pep->nconv,PetscAbsReal(beta)*norm,&k));
1231
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1936 PetscCall((*pep->stopping)(pep,pep->its,pep->max_it,k,pep->nev,&pep->reason,pep->stoppingctx));
1232
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
12291 for (j=0;j<k;j++) back[j] = pep->eigr[j];
1233
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1936 PetscCall(STBackTransform(pep->st,k,back,pep->eigi));
1234 count0=count1=0;
1235
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
12291 for (j=0;j<k;j++) {
1236 10355 lambda = PetscRealPart(back[j]);
1237
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
10355 if ((sr->dir*(sr->sPres->value - lambda) > 0) && (sr->dir*(lambda - sr->sPres->ext[0]) > 0)) count0++;
1238
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
10355 if ((sr->dir*(lambda - sr->sPres->value) > 0) && (sr->dir*(sr->sPres->ext[1] - lambda) > 0)) count1++;
1239 }
1240
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
1936 if ((count0-sr->ndef0 >= sr->sPres->nsch[0]) && (count1-sr->ndef1 >= sr->sPres->nsch[1])) pep->reason = PEP_CONVERGED_TOL;
1241 /* Update l */
1242
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
1936 if (pep->reason != PEP_CONVERGED_ITERATING || breakdown) l = 0;
1243 else {
1244
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
1726 l = PetscMax(1,(PetscInt)((nv-k)/2));
1245 1726 l = PetscMin(l,t);
1246
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1726 PetscCall(DSGetTruncateSize(pep->ds,k,t,&l));
1247
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1726 if (!breakdown) {
1248 /* Prepare the Rayleigh quotient for restart */
1249
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1726 PetscCall(DSTruncate(pep->ds,k+l,PETSC_FALSE));
1250 }
1251 }
1252 1936 nconv = k;
1253
1/6
✗ 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.
1936 if (!ctx->lock && pep->reason == PEP_CONVERGED_ITERATING && !breakdown) { l += k; k = 0; } /* non-locking variant: reset no. of converged pairs */
1254
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.
1936 if (l) PetscCall(PetscInfo(pep,"Preparing to restart keeping l=%" PetscInt_FMT " vectors\n",l));
1255
1256 /* Update S */
1257
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1936 PetscCall(DSGetMat(pep->ds,DS_MAT_Q,&MQ));
1258
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1936 PetscCall(BVMultInPlace(ctx->V,MQ,pep->nconv,k+l));
1259
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1936 PetscCall(DSRestoreMat(pep->ds,DS_MAT_Q,&MQ));
1260
1261 /* Copy last column of S */
1262
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1936 PetscCall(BVCopyColumn(ctx->V,nv,k+l));
1263
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1936 PetscCall(BVSetActiveColumns(ctx->V,0,k+l));
1264
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1936 if (k+l) {
1265
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1926 PetscCall(DSSetDimensions(pep->ds,k+l,PETSC_DETERMINE,PETSC_DETERMINE));
1266
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1926 PetscCall(DSGetMatAndColumn(pep->ds,DS_MAT_D,0,&D,&vomega));
1267
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1926 PetscCall(BVSetSignature(ctx->V,vomega));
1268
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1926 PetscCall(DSRestoreMatAndColumn(pep->ds,DS_MAT_D,0,&D,&vomega));
1269 }
1270
1271
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1936 if (breakdown && pep->reason == PEP_CONVERGED_ITERATING) {
1272 /* stop if breakdown */
1273 PetscCall(PetscInfo(pep,"Breakdown TOAR method (it=%" PetscInt_FMT " norm=%g)\n",pep->its,(double)beta));
1274 pep->reason = PEP_DIVERGED_BREAKDOWN;
1275 }
1276
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1936 if (pep->reason != PEP_CONVERGED_ITERATING) l--;
1277
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1936 PetscCall(BVGetActiveColumns(pep->V,NULL,&nq));
1278
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
1936 if (k+l+deg<=nq) {
1279
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1936 PetscCall(BVSetActiveColumns(ctx->V,pep->nconv,k+l+1));
1280
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.
1936 if (!falselock && ctx->lock) PetscCall(BVTensorCompress(ctx->V,k-pep->nconv));
1281
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1936 else PetscCall(BVTensorCompress(ctx->V,0));
1282 }
1283 1936 pep->nconv = k;
1284
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.
2149 PetscCall(PEPMonitor(pep,pep->its,nconv,pep->eigr,pep->eigi,pep->errest,nv));
1285 }
1286 213 sr->itsKs += pep->its;
1287
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
213 if (pep->nconv>0) {
1288
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
203 PetscCall(BVSetActiveColumns(ctx->V,0,pep->nconv));
1289
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
203 PetscCall(BVGetActiveColumns(pep->V,NULL,&nq));
1290
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
203 PetscCall(BVSetActiveColumns(pep->V,0,nq));
1291
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
203 if (nq>pep->nconv) {
1292
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
203 PetscCall(BVTensorCompress(ctx->V,pep->nconv));
1293
5/6
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 1 times.
203 PetscCall(BVSetActiveColumns(pep->V,0,pep->nconv));
1294 }
1295
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4430 for (j=0;j<pep->nconv;j++) {
1296 4227 pep->eigr[j] *= pep->sfactor;
1297 4227 pep->eigi[j] *= pep->sfactor;
1298 }
1299 }
1300
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213 PetscCall(PetscInfo(pep,"Finished STOAR: nconv=%" PetscInt_FMT " (deflated=%" PetscInt_FMT ", left=%" PetscInt_FMT ", right=%" PetscInt_FMT ")\n",pep->nconv,sr->ndef0+sr->ndef1,count0-sr->ndef0,count1-sr->ndef1));
1301
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.
213 PetscCall(STScaleShift(pep->st,sinv?1.0/pep->sfactor:pep->sfactor));
1302
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213 PetscCall(RGPopScale(pep->rg));
1303
1304
3/6
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
213 PetscCheck(pep->reason!=PEP_DIVERGED_SYMMETRY_LOST || nconv>=sr->ndef0+sr->ndef1,PetscObjectComm((PetscObject)pep),PETSC_ERR_PLIB,"Symmetry lost at sigma=%g",(double)sr->sPres->value);
1305
3/4
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
213 if (pep->reason == PEP_DIVERGED_SYMMETRY_LOST && nconv==sr->ndef0+sr->ndef1) {
1306 PetscCheck(++sr->symmlost<=10,PetscObjectComm((PetscObject)pep),PETSC_ERR_PLIB,"Symmetry lost at sigma=%g",(double)sr->sPres->value);
1307 213 } else sr->symmlost = 0;
1308
1309
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213 PetscCall(DSTruncate(pep->ds,pep->nconv,PETSC_TRUE));
1310
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.
213 PetscCall(PetscFree(back));
1311
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.
43 PetscFunctionReturn(PETSC_SUCCESS);
1312 }
1313
1314 70 static PetscErrorCode PEPQSliceGetInertias(PEP pep,PetscInt *n,PetscReal **shifts,PetscInt **inertias)
1315 {
1316 70 PEP_STOAR *ctx=(PEP_STOAR*)pep->data;
1317 70 PEP_SR sr=ctx->sr;
1318 70 PetscInt i=0,j,tmpi;
1319 70 PetscReal v,tmpr;
1320 70 PEP_shift s;
1321
1322
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
70 PetscFunctionBegin;
1323
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
70 PetscCheck(pep->state,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_WRONGSTATE,"Must call PEPSetUp() first");
1324
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
70 PetscCheck(sr,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_WRONGSTATE,"Only available in interval computations, see PEPSetInterval()");
1325
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
70 if (!sr->s0) { /* PEPSolve not called yet */
1326 *n = 2;
1327 } else {
1328 70 *n = 1;
1329 70 s = sr->s0;
1330
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
273 while (s) {
1331 203 (*n)++;
1332 203 s = s->neighb[1];
1333 }
1334 }
1335
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70 PetscCall(PetscMalloc1(*n,shifts));
1336
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70 PetscCall(PetscMalloc1(*n,inertias));
1337
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
70 if (!sr->s0) { /* PEPSolve not called yet */
1338 (*shifts)[0] = sr->int0;
1339 (*shifts)[1] = sr->int1;
1340 (*inertias)[0] = sr->inertia0;
1341 (*inertias)[1] = sr->inertia1;
1342 } else {
1343 s = sr->s0;
1344
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
273 while (s) {
1345 203 (*shifts)[i] = s->value;
1346 203 (*inertias)[i++] = s->inertia;
1347 203 s = s->neighb[1];
1348 }
1349 70 (*shifts)[i] = sr->int1;
1350 70 (*inertias)[i] = sr->inertia1;
1351 }
1352 /* remove possible duplicate in last position */
1353
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
70 if ((*shifts)[(*n)-1]==(*shifts)[(*n)-2]) (*n)--;
1354 /* sort result */
1355
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
320 for (i=0;i<*n;i++) {
1356 250 v = (*shifts)[i];
1357
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
810 for (j=i+1;j<*n;j++) {
1358
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
560 if (v > (*shifts)[j]) {
1359 200 SlepcSwap((*shifts)[i],(*shifts)[j],tmpr);
1360 200 SlepcSwap((*inertias)[i],(*inertias)[j],tmpi);
1361 200 v = (*shifts)[i];
1362 }
1363 }
1364 }
1365
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.
14 PetscFunctionReturn(PETSC_SUCCESS);
1366 }
1367
1368 80 PetscErrorCode PEPSolve_STOAR_QSlice(PEP pep)
1369 {
1370 80 PetscInt i,j,ti,deg=pep->nmat-1;
1371 80 PetscReal newS;
1372 80 PEP_STOAR *ctx=(PEP_STOAR*)pep->data;
1373 80 PEP_SR sr=ctx->sr;
1374 80 Mat S,B;
1375 80 PetscScalar *pS;
1376
1377
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
80 PetscFunctionBegin;
1378
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
80 PetscCall(PetscCitationsRegister(citation,&cited));
1379
1380 /* Only with eigenvalues present in the interval ...*/
1381
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
80 if (sr->numEigs==0) {
1382 10 pep->reason = PEP_CONVERGED_TOL;
1383
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.
10 PetscFunctionReturn(PETSC_SUCCESS);
1384 }
1385
1386 /* Inner product matrix */
1387
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70 PetscCall(PEPSTOARSetUpInnerMatrix(pep,&B));
1388
1389 /* Array of pending shifts */
1390 70 sr->maxPend = 100; /* Initial size */
1391 70 sr->nPend = 0;
1392
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70 PetscCall(PetscMalloc1(sr->maxPend,&sr->pending));
1393
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70 PetscCall(PEPCreateShift(pep,sr->int0,NULL,NULL));
1394 /* extract first shift */
1395 70 sr->sPrev = NULL;
1396 70 sr->sPres = sr->pending[--sr->nPend];
1397 70 sr->sPres->inertia = sr->inertia0;
1398 70 pep->target = sr->sPres->value;
1399 70 sr->s0 = sr->sPres;
1400 70 sr->indexEig = 0;
1401
1402
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1760 for (i=0;i<sr->numEigs;i++) {
1403 1690 sr->eigr[i] = 0.0;
1404 1690 sr->eigi[i] = 0.0;
1405 1690 sr->errest[i] = 0.0;
1406 1690 sr->perm[i] = i;
1407 }
1408 /* Vectors for deflation */
1409
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70 PetscCall(PetscMalloc2(sr->numEigs,&sr->idxDef0,sr->numEigs,&sr->idxDef1));
1410 70 sr->indexEig = 0;
1411 70 while (sr->sPres) {
1412 /* Search for deflation */
1413
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213 PetscCall(PEPLookForDeflation(pep));
1414 /* KrylovSchur */
1415
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213 PetscCall(PEPSTOAR_QSlice(pep,B));
1416
1417
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
213 PetscCall(PEPStoreEigenpairs(pep));
1418 /* Select new shift */
1419
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
213 if (!sr->sPres->comp[1]) {
1420
4/6
✓ Branch 0 taken 2 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(PEPGetNewShiftValue(pep,1,&newS));
1421
4/6
✓ Branch 0 taken 2 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(PEPCreateShift(pep,newS,sr->sPres,sr->sPres->neighb[1]));
1422 }
1423
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
213 if (!sr->sPres->comp[0]) {
1424 /* Completing earlier interval */
1425
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
30 PetscCall(PEPGetNewShiftValue(pep,0,&newS));
1426
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
30 PetscCall(PEPCreateShift(pep,newS,sr->sPres->neighb[0],sr->sPres));
1427 }
1428 /* Preparing for a new search of values */
1429
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.
283 PetscCall(PEPExtractShift(pep));
1430 }
1431
1432 /* Updating pep values prior to exit */
1433
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70 PetscCall(PetscFree2(sr->idxDef0,sr->idxDef1));
1434
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.
70 PetscCall(PetscFree(sr->pending));
1435 70 pep->nconv = sr->indexEig;
1436 70 pep->reason = PEP_CONVERGED_TOL;
1437 70 pep->its = sr->itsKs;
1438 70 pep->nev = sr->indexEig;
1439
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70 PetscCall(MatCreateSeqDense(PETSC_COMM_SELF,pep->nconv,pep->nconv,NULL,&S));
1440
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70 PetscCall(MatDenseGetArray(S,&pS));
1441
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1760 for (i=0;i<pep->nconv;i++) {
1442
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
24660 for (j=0;j<sr->qinfo[i].nq;j++) pS[i*pep->nconv+sr->qinfo[i].q[j]] = *(sr->S+i*sr->ld*deg+j);
1443 }
1444
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70 PetscCall(MatDenseRestoreArray(S,&pS));
1445
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70 PetscCall(BVSetActiveColumns(sr->V,0,pep->nconv));
1446
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70 PetscCall(BVMultInPlace(sr->V,S,0,pep->nconv));
1447
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70 PetscCall(MatDestroy(&S));
1448
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70 PetscCall(BVDestroy(&pep->V));
1449 70 pep->V = sr->V;
1450
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70 PetscCall(PetscFree4(pep->eigr,pep->eigi,pep->errest,pep->perm));
1451 70 pep->eigr = sr->eigr;
1452 70 pep->eigi = sr->eigi;
1453 70 pep->perm = sr->perm;
1454 70 pep->errest = sr->errest;
1455
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
70 if (sr->dir<0) {
1456
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
480 for (i=0;i<pep->nconv/2;i++) {
1457 420 ti = sr->perm[i]; sr->perm[i] = sr->perm[pep->nconv-1-i]; sr->perm[pep->nconv-1-i] = ti;
1458 }
1459 }
1460
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.
70 PetscCall(PetscFree(ctx->inertias));
1461
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.
70 PetscCall(PetscFree(ctx->shifts));
1462
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70 PetscCall(MatDestroy(&B));
1463
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
70 PetscCall(PEPQSliceGetInertias(pep,&ctx->nshifts,&ctx->shifts,&ctx->inertias));
1464
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.
14 PetscFunctionReturn(PETSC_SUCCESS);
1465 }
1466