GCC Code Coverage Report


Directory: ./
File: src/pep/impls/krylov/stoar/qslice.c
Date: 2026-02-22 03:58:10
Exec Total Coverage
Lines: 965 1046 92.3%
Functions: 21 22 95.5%
Branches: 2134 3510 60.8%

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