GCC Code Coverage Report


Directory: ./
File: src/pep/interface/pepsetup.c
Date: 2026-02-22 03:58:10
Exec Total Coverage
Lines: 207 229 90.4%
Functions: 10 10 100.0%
Branches: 539 1053 51.2%

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 PEP routines related to problem setup
12 */
13
14 #include <slepc/private/pepimpl.h> /*I "slepcpep.h" I*/
15
16 /*
17 Let the solver choose the ST type that should be used by default,
18 otherwise set it to SHIFT.
19 This is called at PEPSetFromOptions (before STSetFromOptions)
20 and also at PEPSetUp (in case PEPSetFromOptions was not called).
21 */
22 3065 PetscErrorCode PEPSetDefaultST(PEP pep)
23 {
24
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
3065 PetscFunctionBegin;
25
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
3065 PetscTryTypeMethod(pep,setdefaultst);
26
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
3065 if (!((PetscObject)pep->st)->type_name) PetscCall(STSetType(pep->st,STSHIFT));
27
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.
752 PetscFunctionReturn(PETSC_SUCCESS);
28 }
29
30 /*
31 This is used in Q-Arnoldi and STOAR to set the transform flag by
32 default, otherwise the user has to explicitly run with -st_transform
33 */
34 268 PetscErrorCode PEPSetDefaultST_Transform(PEP pep)
35 {
36
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
268 PetscFunctionBegin;
37
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
268 PetscCall(STSetTransform(pep->st,PETSC_TRUE));
38
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.
66 PetscFunctionReturn(PETSC_SUCCESS);
39 }
40
41 /*@
42 PEPSetDSType - Sets the type of the internal `DS` object based on the current
43 settings of the polynomial eigensolver.
44
45 Collective
46
47 Input Parameter:
48 . pep - the polynomial eigensolver context
49
50 Note:
51 This function need not be called explicitly, since it will be called at
52 both `PEPSetFromOptions()` and `PEPSetUp()`.
53
54 Level: developer
55
56 .seealso: [](ch:pep), `PEPSetFromOptions()`, `PEPSetUp()`
57 @*/
58 3057 PetscErrorCode PEPSetDSType(PEP pep)
59 {
60
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
3057 PetscFunctionBegin;
61
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
3057 PetscValidHeaderSpecific(pep,PEP_CLASSID,1);
62
6/8
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
3057 PetscTryTypeMethod(pep,setdstype);
63
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.
750 PetscFunctionReturn(PETSC_SUCCESS);
64 }
65
66 /*@
67 PEPSetUp - Sets up all the internal data structures necessary for the
68 execution of the polynomial eigensolver.
69
70 Collective
71
72 Input Parameter:
73 . pep - the polynomial eigensolver context
74
75 Notes:
76 This function need not be called explicitly in most cases, since `PEPSolve()`
77 calls it. It can be useful when one wants to measure the set-up time
78 separately from the solve time.
79
80 Level: developer
81
82 .seealso: [](ch:pep), `PEPCreate()`, `PEPSolve()`, `PEPDestroy()`
83 @*/
84 1597 PetscErrorCode PEPSetUp(PEP pep)
85 {
86 1597 SlepcSC sc;
87 1597 PetscBool istrivial,flg;
88 1597 PetscInt k;
89 1597 KSP ksp;
90 1597 PC pc;
91 1597 PetscMPIInt size;
92 1597 MatSolverType stype;
93
94
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1597 PetscFunctionBegin;
95
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
1597 PetscValidHeaderSpecific(pep,PEP_CLASSID,1);
96
8/14
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
1597 if (pep->state) PetscFunctionReturn(PETSC_SUCCESS);
97
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1573 PetscCall(PetscLogEventBegin(PEP_SetUp,pep,0,0,0));
98
99 /* reset the convergence flag from the previous solves */
100 1573 pep->reason = PEP_CONVERGED_ITERATING;
101
102 /* set default solver type (PEPSetFromOptions was not called) */
103
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
1573 if (!((PetscObject)pep)->type_name) PetscCall(PEPSetType(pep,PEPTOAR));
104
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
1573 if (!pep->st) PetscCall(PEPGetST(pep,&pep->st));
105
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1573 PetscCall(PEPSetDefaultST(pep));
106
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
1573 if (!pep->ds) PetscCall(PEPGetDS(pep,&pep->ds));
107
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1573 PetscCall(PEPSetDSType(pep));
108
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
1573 if (!pep->rg) PetscCall(PEPGetRG(pep,&pep->rg));
109
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
1573 if (!((PetscObject)pep->rg)->type_name) PetscCall(RGSetType(pep->rg,RGINTERVAL));
110
111 /* check matrices, transfer them to ST */
112
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1573 PetscCheck(pep->A,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_WRONGSTATE,"PEPSetOperators must be called first");
113
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1573 PetscCall(STSetMatrices(pep->st,pep->nmat,pep->A));
114
115 /* set problem dimensions */
116
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1573 PetscCall(MatGetSize(pep->A[0],&pep->n,NULL));
117
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1573 PetscCall(MatGetLocalSize(pep->A[0],&pep->nloc,NULL));
118
119 /* set default problem type */
120
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
1573 if (!pep->problem_type) PetscCall(PEPSetProblemType(pep,PEP_GENERAL));
121
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 8 times.
1573 if (pep->nev > (pep->nmat-1)*pep->n) pep->nev = (pep->nmat-1)*pep->n;
122
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 8 times.
1573 if (pep->ncv > (pep->nmat-1)*pep->n) pep->ncv = (pep->nmat-1)*pep->n;
123
124 /* check consistency of refinement options */
125
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
1573 if (pep->refine) {
126
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
237 if (!pep->scheme) { /* set default scheme */
127
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
32 PetscCall(PEPRefineGetKSP(pep,&ksp));
128
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
32 PetscCall(KSPGetPC(ksp,&pc));
129
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
32 PetscCall(PetscObjectTypeCompare((PetscObject)ksp,KSPPREONLY,&flg));
130
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
32 if (flg) PetscCall(PetscObjectTypeCompareAny((PetscObject)pc,&flg,PCLU,PCCHOLESKY,""));
131
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
64 pep->scheme = flg? PEP_REFINE_SCHEME_MBE: PEP_REFINE_SCHEME_SCHUR;
132 }
133
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
237 if (pep->scheme==PEP_REFINE_SCHEME_MBE) {
134
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
64 PetscCall(PEPRefineGetKSP(pep,&ksp));
135
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
64 PetscCall(KSPGetPC(ksp,&pc));
136
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
64 PetscCall(PetscObjectTypeCompare((PetscObject)ksp,KSPPREONLY,&flg));
137
5/8
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
64 if (flg) PetscCall(PetscObjectTypeCompareAny((PetscObject)pc,&flg,PCLU,PCCHOLESKY,""));
138
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
64 PetscCheck(flg,PetscObjectComm((PetscObject)pep),PETSC_ERR_SUP,"The MBE scheme for refinement requires a direct solver in KSP");
139
14/28
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 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.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
64 PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)pc),&size));
140
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
64 if (size>1) { /* currently selected PC is a factorization */
141 PetscCall(PCFactorGetMatSolverType(pc,&stype));
142 PetscCall(PetscStrcmp(stype,MATSOLVERPETSC,&flg));
143 PetscCheck(!flg,PetscObjectComm((PetscObject)pep),PETSC_ERR_SUP,"For Newton refinement, you chose to solve linear systems with a factorization, but in parallel runs you need to select an external package");
144 }
145 }
146
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
237 if (pep->scheme==PEP_REFINE_SCHEME_SCHUR) {
147
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
77 PetscCheck(pep->npart==1,PetscObjectComm((PetscObject)pep),PETSC_ERR_SUP,"The Schur scheme for refinement does not support subcommunicators");
148 }
149 }
150 /* call specific solver setup */
151
5/10
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 6 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
1573 PetscUseTypeMethod(pep,setup);
152
153 /* set tolerance if not yet set */
154
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
1573 if (pep->tol==(PetscReal)PETSC_DETERMINE) pep->tol = SLEPC_DEFAULT_TOL;
155
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
1573 if (pep->refine) {
156
3/4
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
461 if (pep->rtol==(PetscReal)PETSC_DETERMINE) pep->rtol = PetscMax(pep->tol/1000,PETSC_MACHINE_EPSILON);
157
4/4
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
349 if (pep->rits==PETSC_DETERMINE) pep->rits = (pep->refine==PEP_REFINE_SIMPLE)? 10: 1;
158 }
159
160 /* set default extraction */
161
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
1573 if (!pep->extract) {
162
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
1358 pep->extract = (pep->basis==PEP_BASIS_MONOMIAL)? PEP_EXTRACT_NORM: PEP_EXTRACT_NONE;
163 }
164
165 /* fill sorting criterion context */
166
7/11
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 8 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 8 times.
✓ Branch 10 taken 8 times.
1573 switch (pep->which) {
167 499 case PEP_LARGEST_MAGNITUDE:
168 499 pep->sc->comparison = SlepcCompareLargestMagnitude;
169 499 pep->sc->comparisonctx = NULL;
170 499 break;
171 8 case PEP_SMALLEST_MAGNITUDE:
172 8 pep->sc->comparison = SlepcCompareSmallestMagnitude;
173 8 pep->sc->comparisonctx = NULL;
174 8 break;
175 23 case PEP_LARGEST_REAL:
176 23 pep->sc->comparison = SlepcCompareLargestReal;
177 23 pep->sc->comparisonctx = NULL;
178 23 break;
179 2 case PEP_SMALLEST_REAL:
180 2 pep->sc->comparison = SlepcCompareSmallestReal;
181 2 pep->sc->comparisonctx = NULL;
182 2 break;
183 case PEP_LARGEST_IMAGINARY:
184 pep->sc->comparison = SlepcCompareLargestImaginary;
185 pep->sc->comparisonctx = NULL;
186 break;
187 case PEP_SMALLEST_IMAGINARY:
188 pep->sc->comparison = SlepcCompareSmallestImaginary;
189 pep->sc->comparisonctx = NULL;
190 break;
191 903 case PEP_TARGET_MAGNITUDE:
192 903 pep->sc->comparison = SlepcCompareTargetMagnitude;
193 903 pep->sc->comparisonctx = &pep->target;
194 903 break;
195 case PEP_TARGET_REAL:
196 pep->sc->comparison = SlepcCompareTargetReal;
197 pep->sc->comparisonctx = &pep->target;
198 break;
199 case PEP_TARGET_IMAGINARY:
200 pep->sc->comparison = SlepcCompareTargetImaginary;
201 pep->sc->comparisonctx = &pep->target;
202 break;
203 118 case PEP_ALL:
204 118 pep->sc->comparison = SlepcCompareSmallestReal;
205 118 pep->sc->comparisonctx = NULL;
206 118 break;
207 case PEP_WHICH_USER:
208 break;
209 }
210 1573 pep->sc->map = NULL;
211 1573 pep->sc->mapobj = NULL;
212
213 /* fill sorting criterion for DS */
214
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
1573 if (pep->which!=PEP_ALL) {
215
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1455 PetscCall(DSGetSlepcSC(pep->ds,&sc));
216
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1455 PetscCall(RGIsTrivial(pep->rg,&istrivial));
217
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
1455 sc->rg = istrivial? NULL: pep->rg;
218 1455 sc->comparison = pep->sc->comparison;
219 1455 sc->comparisonctx = pep->sc->comparisonctx;
220 1455 sc->map = SlepcMap_ST;
221 1455 sc->mapobj = (PetscObject)pep->st;
222 }
223 /* setup ST */
224
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1573 PetscCall(STSetUp(pep->st));
225
226 /* compute matrix coefficients */
227
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1573 PetscCall(STGetTransform(pep->st,&flg));
228
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
1573 if (!flg) {
229
8/10
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 6 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
1319 if (pep->which!=PEP_ALL && pep->solvematcoeffs) PetscCall(STMatSetUp(pep->st,1.0,pep->solvematcoeffs));
230 } else {
231
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
254 PetscCheck(pep->basis==PEP_BASIS_MONOMIAL,PetscObjectComm((PetscObject)pep),PETSC_ERR_SUP,"Cannot use ST-transform with non-monomial basis in PEP");
232 }
233
234 /* compute scale factor if no set by user */
235
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1573 PetscCall(PEPComputeScaleFactor(pep));
236
237 /* build balancing matrix if required */
238
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
1573 if (pep->scale==PEP_SCALE_DIAGONAL || pep->scale==PEP_SCALE_BOTH) {
239
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
146 if (!pep->Dl) PetscCall(BVCreateVec(pep->V,&pep->Dl));
240
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
146 if (!pep->Dr) PetscCall(BVCreateVec(pep->V,&pep->Dr));
241
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
146 PetscCall(PEPBuildDiagonalScaling(pep));
242 }
243
244 /* process initial vectors */
245
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
1573 if (pep->nini<0) {
246 28 k = -pep->nini;
247
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
28 PetscCheck(k<=pep->ncv,PetscObjectComm((PetscObject)pep),PETSC_ERR_USER_INPUT,"The number of initial vectors is larger than ncv");
248
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
28 PetscCall(BVInsertVecs(pep->V,0,&k,pep->IS,PETSC_TRUE));
249
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
28 PetscCall(SlepcBasisDestroy_Private(&pep->nini,&pep->IS));
250 28 pep->nini = k;
251 }
252
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1573 PetscCall(PetscLogEventEnd(PEP_SetUp,pep,0,0,0));
253 1573 pep->state = PEP_STATE_SETUP;
254
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.
1573 PetscFunctionReturn(PETSC_SUCCESS);
255 }
256
257 /*@
258 PEPSetOperators - Sets the coefficient matrices associated with the polynomial
259 eigenvalue problem.
260
261 Collective
262
263 Input Parameters:
264 + pep - the polynomial eigensolver context
265 . nmat - number of matrices in array `A`
266 - A - the array of matrices associated with the eigenproblem
267
268 Notes:
269 The polynomial eigenproblem is defined as $P(\lambda)x=0$, where $\lambda$
270 is the eigenvalue, $x$ is the eigenvector, and $P$ is defined as
271 $P(\lambda) = A_0 + \lambda A_1 + \dots + \lambda^d A_d$, with $d$=`nmat`-1
272 (the degree of $P$). For non-monomial bases, this expression is different.
273
274 Level: beginner
275
276 .seealso: [](ch:pep), `PEPSolve()`, `PEPGetOperators()`, `PEPGetNumMatrices()`, `PEPSetBasis()`
277 @*/
278 1581 PetscErrorCode PEPSetOperators(PEP pep,PetscInt nmat,Mat A[])
279 {
280 1581 PetscInt i,n=0,m,m0=0,mloc,nloc,mloc0=0;
281
282
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1581 PetscFunctionBegin;
283
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
1581 PetscValidHeaderSpecific(pep,PEP_CLASSID,1);
284
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
1581 PetscValidLogicalCollectiveInt(pep,nmat,2);
285
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1581 PetscCheck(nmat>0,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_OUTOFRANGE,"Non-positive value of nmat: %" PetscInt_FMT,nmat);
286
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1581 PetscCheck(nmat>2,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_OUTOFRANGE,"Cannot solve linear eigenproblems with PEP; use EPS instead");
287
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
390 PetscAssertPointer(A,3);
288
289
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
7507 for (i=0;i<nmat;i++) {
290
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
5926 PetscValidHeaderSpecific(A[i],MAT_CLASSID,3);
291
13/32
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ 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.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
5926 PetscCheckSameComm(pep,1,A[i],3);
292
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5926 PetscCall(MatGetSize(A[i],&m,&n));
293
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5926 PetscCall(MatGetLocalSize(A[i],&mloc,&nloc));
294
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
5926 PetscCheck(m==n,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_WRONG,"A[%" PetscInt_FMT "] is a non-square matrix (%" PetscInt_FMT " rows, %" PetscInt_FMT " cols)",i,m,n);
295
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
5926 PetscCheck(mloc==nloc,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_WRONG,"A[%" PetscInt_FMT "] does not have equal row and column local sizes (%" PetscInt_FMT ", %" PetscInt_FMT ")",i,mloc,nloc);
296
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
5926 if (!i) { m0 = m; mloc0 = mloc; }
297
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
5926 PetscCheck(m==m0,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_INCOMP,"Dimensions of A[%" PetscInt_FMT "] do not match with previous matrices (%" PetscInt_FMT ", %" PetscInt_FMT ")",i,m,m0);
298
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
5926 PetscCheck(mloc==mloc0,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_INCOMP,"Local dimensions of A[%" PetscInt_FMT "] do not match with previous matrices (%" PetscInt_FMT ", %" PetscInt_FMT ")",i,mloc,mloc0);
299
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
5926 PetscCall(PetscObjectReference((PetscObject)A[i]));
300 }
301
302
7/12
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 6 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
1581 if (pep->state && (n!=pep->n || nloc!=pep->nloc)) PetscCall(PEPReset(pep));
303
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 8 times.
1549 else if (pep->nmat) {
304
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(MatDestroyMatrices(pep->nmat,&pep->A));
305
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8 PetscCall(PetscFree2(pep->pbc,pep->nrma));
306
5/8
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
8 PetscCall(PetscFree(pep->solvematcoeffs));
307 }
308
309
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1581 PetscCall(PetscMalloc1(nmat,&pep->A));
310
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1581 PetscCall(PetscCalloc2(3*nmat,&pep->pbc,nmat,&pep->nrma));
311
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
7507 for (i=0;i<nmat;i++) {
312 5926 pep->A[i] = A[i];
313 5926 pep->pbc[i] = 1.0; /* default to monomial basis */
314 }
315 1581 pep->nmat = nmat;
316 1581 pep->state = PEP_STATE_INITIAL;
317
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.
1581 PetscFunctionReturn(PETSC_SUCCESS);
318 }
319
320 /*@
321 PEPGetOperators - Gets the matrices associated with the polynomial eigensystem.
322
323 Collective
324
325 Input Parameters:
326 + pep - the polynomial eigensolver context
327 - k - the index of the requested matrix (starting in 0)
328
329 Output Parameter:
330 . A - the requested matrix
331
332 Level: intermediate
333
334 .seealso: [](ch:pep), `PEPSolve()`, `PEPSetOperators()`, `PEPGetNumMatrices()`
335 @*/
336 496 PetscErrorCode PEPGetOperators(PEP pep,PetscInt k,Mat *A)
337 {
338
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
496 PetscFunctionBegin;
339
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
496 PetscValidHeaderSpecific(pep,PEP_CLASSID,1);
340
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
496 PetscAssertPointer(A,3);
341
2/6
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
496 PetscCheck(k>=0 && k<pep->nmat,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_OUTOFRANGE,"k must be between 0 and %" PetscInt_FMT,pep->nmat-1);
342 496 *A = pep->A[k];
343
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.
496 PetscFunctionReturn(PETSC_SUCCESS);
344 }
345
346 /*@
347 PEPGetNumMatrices - Returns the number of matrices stored in the `PEP`.
348
349 Not Collective
350
351 Input Parameter:
352 . pep - the polynomial eigensolver context
353
354 Output Parameter:
355 . nmat - the number of matrices passed in `PEPSetOperators()`
356
357 Level: intermediate
358
359 .seealso: [](ch:pep), `PEPSetOperators()`
360 @*/
361 13 PetscErrorCode PEPGetNumMatrices(PEP pep,PetscInt *nmat)
362 {
363
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
13 PetscFunctionBegin;
364
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
13 PetscValidHeaderSpecific(pep,PEP_CLASSID,1);
365
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
13 PetscAssertPointer(nmat,2);
366 13 *nmat = pep->nmat;
367
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.
13 PetscFunctionReturn(PETSC_SUCCESS);
368 }
369
370 /*@
371 PEPSetInitialSpace - Specify a basis of vectors that constitute the initial
372 space, that is, the subspace from which the solver starts to iterate.
373
374 Collective
375
376 Input Parameters:
377 + pep - the polynomial eigensolver context
378 . n - number of vectors
379 - is - set of basis vectors of the initial space
380
381 Notes:
382 Some solvers start to iterate on a single vector (initial vector). In that case,
383 the other vectors are ignored.
384
385 These vectors do not persist from one `PEPSolve()` call to the other, so the
386 initial space should be set every time.
387
388 The vectors do not need to be mutually orthonormal, since they are explicitly
389 orthonormalized internally.
390
391 Common usage of this function is when the user can provide a rough approximation
392 of the wanted eigenspace. Then, convergence may be faster.
393
394 Level: intermediate
395
396 .seealso: [](ch:pep), `PEPSetUp()`
397 @*/
398 48 PetscErrorCode PEPSetInitialSpace(PEP pep,PetscInt n,Vec is[])
399 {
400
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
48 PetscFunctionBegin;
401
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
48 PetscValidHeaderSpecific(pep,PEP_CLASSID,1);
402
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
48 PetscValidLogicalCollectiveInt(pep,n,2);
403
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
48 PetscCheck(n>=0,PetscObjectComm((PetscObject)pep),PETSC_ERR_ARG_OUTOFRANGE,"Argument n cannot be negative");
404
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
48 if (n>0) {
405
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
48 PetscAssertPointer(is,3);
406
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
48 PetscValidHeaderSpecific(*is,VEC_CLASSID,3);
407 }
408
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
48 PetscCall(SlepcBasisReference_Private(n,is,&pep->nini,&pep->IS));
409
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
48 if (n>0) pep->state = PEP_STATE_INITIAL;
410
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);
411 }
412
413 /*
414 PEPSetDimensions_Default - Set reasonable values for ncv, mpd if not set
415 by the user. This is called at setup.
416 */
417 1185 PetscErrorCode PEPSetDimensions_Default(PEP pep,PetscInt nev,PetscInt *ncv,PetscInt *mpd)
418 {
419 1185 PetscBool krylov;
420 1185 PetscInt dim;
421
422
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1185 PetscFunctionBegin;
423
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1185 PetscCall(PetscObjectTypeCompareAny((PetscObject)pep,&krylov,PEPTOAR,PEPSTOAR,PEPQARNOLDI,""));
424 1185 dim = (pep->nmat-1)*pep->n;
425
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
1185 if (*ncv!=PETSC_DETERMINE) { /* ncv set */
426
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
585 if (krylov) {
427
4/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
501 PetscCheck(*ncv>nev || (*ncv==nev && *ncv==dim),PetscObjectComm((PetscObject)pep),PETSC_ERR_USER_INPUT,"The value of ncv must be at least nev+1");
428 } else {
429
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
84 PetscCheck(*ncv>=nev,PetscObjectComm((PetscObject)pep),PETSC_ERR_USER_INPUT,"The value of ncv must be at least nev");
430 }
431
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
600 } else if (*mpd!=PETSC_DETERMINE) { /* mpd set */
432 *ncv = PetscMin(dim,nev+(*mpd));
433 } else { /* neither set: defaults depend on nev being small or large */
434
3/4
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
600 if (nev<500) *ncv = PetscMin(dim,PetscMax(2*nev,nev+15));
435 else {
436 *mpd = 500;
437 *ncv = PetscMin(dim,nev+(*mpd));
438 }
439 }
440
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
1185 if (*mpd==PETSC_DETERMINE) *mpd = *ncv;
441
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.
292 PetscFunctionReturn(PETSC_SUCCESS);
442 }
443
444 /*@
445 PEPAllocateSolution - Allocate memory storage for common variables such
446 as eigenvalues and eigenvectors.
447
448 Collective
449
450 Input Parameters:
451 + pep - the polynomial eigensolver context
452 - extra - number of additional positions, used for methods that require a
453 working basis slightly larger than `ncv`
454
455 Developer Note:
456 This is `SLEPC_EXTERN` because it may be required by user plugin `PEP`
457 implementations.
458
459 Level: developer
460
461 .seealso: [](ch:pep), `PEPSetUp()`, `PEPSetDimensions()`
462 @*/
463 1755 PetscErrorCode PEPAllocateSolution(PEP pep,PetscInt extra)
464 {
465 1755 PetscInt oldsize,requested,requestedbv;
466 1755 Vec t;
467
468
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1755 PetscFunctionBegin;
469
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
1755 requested = (pep->lineariz? pep->ncv: pep->ncv*(pep->nmat-1)) + extra;
470 1755 requestedbv = pep->ncv + extra;
471
472 /* oldsize is zero if this is the first time setup is called */
473
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1755 PetscCall(BVGetSizes(pep->V,NULL,NULL,&oldsize));
474
475 /* allocate space for eigenvalues and friends */
476
3/4
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
1755 if (requested != oldsize || !pep->eigr) {
477
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1717 PetscCall(PetscFree4(pep->eigr,pep->eigi,pep->errest,pep->perm));
478
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1717 PetscCall(PetscMalloc4(requested,&pep->eigr,requested,&pep->eigi,requested,&pep->errest,requested,&pep->perm));
479 }
480
481 /* allocate V */
482
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
1755 if (!pep->V) PetscCall(PEPGetBV(pep,&pep->V));
483
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
1755 if (!oldsize) {
484
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
1573 if (!((PetscObject)pep->V)->type_name) PetscCall(BVSetType(pep->V,BVMAT));
485
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1573 PetscCall(STMatCreateVecsEmpty(pep->st,&t,NULL));
486
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1573 PetscCall(BVSetSizesFromVec(pep->V,t,requestedbv));
487
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1573 PetscCall(VecDestroy(&t));
488
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
182 } else PetscCall(BVResize(pep->V,requestedbv,PETSC_FALSE));
489
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.
431 PetscFunctionReturn(PETSC_SUCCESS);
490 }
491