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