GCC Code Coverage Report


Directory: ./
File: src/pep/interface/pepsetup.c
Date: 2025-10-03 04:28:47
Exec Total Coverage
Lines: 199 229 86.9%
Functions: 10 10 100.0%
Branches: 537 1053 51.0%

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 3808 PetscErrorCode PEPSetDefaultST(PEP pep)
23 {
24
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
3808 PetscFunctionBegin;
25
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.
3808 PetscTryTypeMethod(pep,setdefaultst);
26
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.
3808 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.
739 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 338 PetscErrorCode PEPSetDefaultST_Transform(PEP pep)
35 {
36
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
338 PetscFunctionBegin;
37
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
338 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 - 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: PEPSetFromOptions(), PEPSetUp()
57 @*/
58 3798 PetscErrorCode PEPSetDSType(PEP pep)
59 {
60
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
3798 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.
3798 PetscValidHeaderSpecific(pep,PEP_CLASSID,1);
62
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
3798 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.
737 PetscFunctionReturn(PETSC_SUCCESS);
64 }
65
66 /*@
67 PEPSetUp - Sets up all the internal data structures necessary for the
68 execution of the PEP solver.
69
70 Collective
71
72 Input Parameter:
73 . pep - solver 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: PEPCreate(), PEPSolve(), PEPDestroy()
83 @*/
84 1986 PetscErrorCode PEPSetUp(PEP pep)
85 {
86 1986 SlepcSC sc;
87 1986 PetscBool istrivial,flg;
88 1986 PetscInt k;
89 1986 KSP ksp;
90 1986 PC pc;
91 1986 PetscMPIInt size;
92 1986 MatSolverType stype;
93
94
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1986 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.
1986 PetscValidHeaderSpecific(pep,PEP_CLASSID,1);
96
8/14
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 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.
1986 if (pep->state) PetscFunctionReturn(PETSC_SUCCESS);
97
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1956 PetscCall(PetscLogEventBegin(PEP_SetUp,pep,0,0,0));
98
99 /* reset the convergence flag from the previous solves */
100 1956 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 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.
1956 if (!((PetscObject)pep)->type_name) PetscCall(PEPSetType(pep,PEPTOAR));
104
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.
1956 if (!pep->st) PetscCall(PEPGetST(pep,&pep->st));
105
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1956 PetscCall(PEPSetDefaultST(pep));
106
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.
1956 if (!pep->ds) PetscCall(PEPGetDS(pep,&pep->ds));
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.
1956 PetscCall(PEPSetDSType(pep));
108
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.
1956 if (!pep->rg) PetscCall(PEPGetRG(pep,&pep->rg));
109
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.
1956 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 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1956 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 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1956 PetscCall(STSetMatrices(pep->st,pep->nmat,pep->A));
114
115 /* set problem dimensions */
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.
1956 PetscCall(MatGetSize(pep->A[0],&pep->n,NULL));
117
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1956 PetscCall(MatGetLocalSize(pep->A[0],&pep->nloc,NULL));
118
119 /* set default problem type */
120
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.
1956 if (!pep->problem_type) PetscCall(PEPSetProblemType(pep,PEP_GENERAL));
121
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1956 if (pep->nev > (pep->nmat-1)*pep->n) pep->nev = (pep->nmat-1)*pep->n;
122
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1956 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 10 times.
✓ Branch 1 taken 10 times.
1956 if (pep->refine) {
126
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
296 if (!pep->scheme) { /* set default scheme */
127
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
40 PetscCall(PEPRefineGetKSP(pep,&ksp));
128
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
40 PetscCall(KSPGetPC(ksp,&pc));
129
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
40 PetscCall(PetscObjectTypeCompare((PetscObject)ksp,KSPPREONLY,&flg));
130
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.
40 if (flg) PetscCall(PetscObjectTypeCompareAny((PetscObject)pc,&flg,PCLU,PCCHOLESKY,""));
131
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
80 pep->scheme = flg? PEP_REFINE_SCHEME_MBE: PEP_REFINE_SCHEME_SCHUR;
132 }
133
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
296 if (pep->scheme==PEP_REFINE_SCHEME_MBE) {
134
4/6
✓ Branch 0 taken 2 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(PEPRefineGetKSP(pep,&ksp));
135
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
80 PetscCall(KSPGetPC(ksp,&pc));
136
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
80 PetscCall(PetscObjectTypeCompare((PetscObject)ksp,KSPPREONLY,&flg));
137
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 if (flg) PetscCall(PetscObjectTypeCompareAny((PetscObject)pc,&flg,PCLU,PCCHOLESKY,""));
138
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
80 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 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 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.
80 PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)pc),&size));
140
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
80 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 10 times.
✓ Branch 1 taken 10 times.
296 if (pep->scheme==PEP_REFINE_SCHEME_SCHUR) {
147
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
96 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 10 times.
✗ Branch 2 not taken.
✗ 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.
1956 PetscUseTypeMethod(pep,setup);
152
153 /* set tolerance if not yet set */
154
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1956 if (pep->tol==(PetscReal)PETSC_DETERMINE) pep->tol = SLEPC_DEFAULT_TOL;
155
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1956 if (pep->refine) {
156
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
576 if (pep->rtol==(PetscReal)PETSC_DETERMINE) pep->rtol = PetscMax(pep->tol/1000,PETSC_MACHINE_EPSILON);
157
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
436 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 10 times.
✓ Branch 1 taken 10 times.
1956 if (!pep->extract) {
162
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1686 pep->extract = (pep->basis==PEP_BASIS_MONOMIAL)? PEP_EXTRACT_NORM: PEP_EXTRACT_NONE;
163 }
164
165 /* fill sorting criterion context */
166
5/11
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 10 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 10 times.
✓ Branch 10 taken 10 times.
1956 switch (pep->which) {
167 628 case PEP_LARGEST_MAGNITUDE:
168 628 pep->sc->comparison = SlepcCompareLargestMagnitude;
169 628 pep->sc->comparisonctx = NULL;
170 628 break;
171 case PEP_SMALLEST_MAGNITUDE:
172 pep->sc->comparison = SlepcCompareSmallestMagnitude;
173 pep->sc->comparisonctx = NULL;
174 break;
175 28 case PEP_LARGEST_REAL:
176 28 pep->sc->comparison = SlepcCompareLargestReal;
177 28 pep->sc->comparisonctx = NULL;
178 28 break;
179 case PEP_SMALLEST_REAL:
180 pep->sc->comparison = SlepcCompareSmallestReal;
181 pep->sc->comparisonctx = NULL;
182 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 1130 case PEP_TARGET_MAGNITUDE:
192 1130 pep->sc->comparison = SlepcCompareTargetMagnitude;
193 1130 pep->sc->comparisonctx = &pep->target;
194 1130 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 145 case PEP_ALL:
204 145 pep->sc->comparison = SlepcCompareSmallestReal;
205 145 pep->sc->comparisonctx = NULL;
206 145 break;
207 case PEP_WHICH_USER:
208 break;
209 }
210 1956 pep->sc->map = NULL;
211 1956 pep->sc->mapobj = NULL;
212
213 /* fill sorting criterion for DS */
214
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1956 if (pep->which!=PEP_ALL) {
215
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1811 PetscCall(DSGetSlepcSC(pep->ds,&sc));
216
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1811 PetscCall(RGIsTrivial(pep->rg,&istrivial));
217
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1811 sc->rg = istrivial? NULL: pep->rg;
218 1811 sc->comparison = pep->sc->comparison;
219 1811 sc->comparisonctx = pep->sc->comparisonctx;
220 1811 sc->map = SlepcMap_ST;
221 1811 sc->mapobj = (PetscObject)pep->st;
222 }
223 /* setup ST */
224
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1956 PetscCall(STSetUp(pep->st));
225
226 /* compute matrix coefficients */
227
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1956 PetscCall(STGetTransform(pep->st,&flg));
228
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1956 if (!flg) {
229
8/10
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
1637 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 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
319 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 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1956 PetscCall(PEPComputeScaleFactor(pep));
236
237 /* build balancing matrix if required */
238
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1956 if (pep->scale==PEP_SCALE_DIAGONAL || pep->scale==PEP_SCALE_BOTH) {
239
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.
184 if (!pep->Dl) PetscCall(BVCreateVec(pep->V,&pep->Dl));
240
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.
184 if (!pep->Dr) PetscCall(BVCreateVec(pep->V,&pep->Dr));
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.
184 PetscCall(PEPBuildDiagonalScaling(pep));
242 }
243
244 /* process initial vectors */
245
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1956 if (pep->nini<0) {
246 38 k = -pep->nini;
247
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
38 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 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
38 PetscCall(BVInsertVecs(pep->V,0,&k,pep->IS,PETSC_TRUE));
249
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
38 PetscCall(SlepcBasisDestroy_Private(&pep->nini,&pep->IS));
250 38 pep->nini = k;
251 }
252
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1956 PetscCall(PetscLogEventEnd(PEP_SetUp,pep,0,0,0));
253 1956 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.
1956 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 eigenproblem solver 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(l)*x=0, where l is
270 the eigenvalue, x is the eigenvector, and P(l) is defined as
271 P(l) = A_0 + l*A_1 + ... + l^d*A_d, with d=nmat-1 (the degree of P).
272 For non-monomial bases, this expression is different.
273
274 Level: beginner
275
276 .seealso: PEPSolve(), PEPGetOperators(), PEPGetNumMatrices(), PEPSetBasis()
277 @*/
278 1966 PetscErrorCode PEPSetOperators(PEP pep,PetscInt nmat,Mat A[])
279 {
280 1966 PetscInt i,n=0,m,m0=0,mloc,nloc,mloc0=0;
281
282
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1966 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.
1966 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.
1966 PetscValidLogicalCollectiveInt(pep,nmat,2);
285
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1966 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 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1966 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.
384 PetscAssertPointer(A,3);
288
289
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9342 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.
7376 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.
7376 PetscCheckSameComm(pep,1,A[i],3);
292
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
7376 PetscCall(MatGetSize(A[i],&m,&n));
293
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
7376 PetscCall(MatGetLocalSize(A[i],&mloc,&nloc));
294
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
7376 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 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
7376 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 10 times.
✓ Branch 1 taken 10 times.
7376 if (!i) { m0 = m; mloc0 = mloc; }
297
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
7376 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 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
7376 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 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
7376 PetscCall(PetscObjectReference((PetscObject)A[i]));
300 }
301
302
7/12
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
1966 if (pep->state && (n!=pep->n || nloc!=pep->nloc)) PetscCall(PEPReset(pep));
303
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1926 else if (pep->nmat) {
304
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(MatDestroyMatrices(pep->nmat,&pep->A));
305
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10 PetscCall(PetscFree2(pep->pbc,pep->nrma));
306
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(pep->solvematcoeffs));
307 }
308
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.
1966 PetscCall(PetscMalloc1(nmat,&pep->A));
310
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1966 PetscCall(PetscCalloc2(3*nmat,&pep->pbc,nmat,&pep->nrma));
311
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9342 for (i=0;i<nmat;i++) {
312 7376 pep->A[i] = A[i];
313 7376 pep->pbc[i] = 1.0; /* default to monomial basis */
314 }
315 1966 pep->nmat = nmat;
316 1966 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.
1966 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 PEP 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: PEPSolve(), PEPSetOperators(), PEPGetNumMatrices()
335 @*/
336 625 PetscErrorCode PEPGetOperators(PEP pep,PetscInt k,Mat *A)
337 {
338
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
625 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.
625 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.
625 PetscAssertPointer(A,3);
341
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.
625 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 625 *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.
625 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 PEP context
353
354 Output Parameters:
355 . nmat - the number of matrices passed in PEPSetOperators()
356
357 Level: intermediate
358
359 .seealso: PEPSetOperators()
360 @*/
361 16 PetscErrorCode PEPGetNumMatrices(PEP pep,PetscInt *nmat)
362 {
363
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
16 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.
16 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.
16 PetscAssertPointer(nmat,2);
366 16 *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.
16 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: PEPSetUp()
397 @*/
398 66 PetscErrorCode PEPSetInitialSpace(PEP pep,PetscInt n,Vec is[])
399 {
400
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
66 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.
66 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.
66 PetscValidLogicalCollectiveInt(pep,n,2);
403
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
66 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.
66 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.
66 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.
66 PetscValidHeaderSpecific(*is,VEC_CLASSID,3);
407 }
408
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
66 PetscCall(SlepcBasisReference_Private(n,is,&pep->nini,&pep->IS));
409
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
66 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 1468 PetscErrorCode PEPSetDimensions_Default(PEP pep,PetscInt nev,PetscInt *ncv,PetscInt *mpd)
418 {
419 1468 PetscBool krylov;
420 1468 PetscInt dim;
421
422
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1468 PetscFunctionBegin;
423
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1468 PetscCall(PetscObjectTypeCompareAny((PetscObject)pep,&krylov,PEPTOAR,PEPSTOAR,PEPQARNOLDI,""));
424 1468 dim = (pep->nmat-1)*pep->n;
425
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1468 if (*ncv!=PETSC_DETERMINE) { /* ncv set */
426
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
722 if (krylov) {
427
4/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
617 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 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
105 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 10 times.
746 } 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 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
746 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 10 times.
✓ Branch 1 taken 10 times.
1468 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.
286 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 - eigensolver context
452 - extra - number of additional positions, used for methods that require a
453 working basis slightly larger than ncv
454
455 Developer Notes:
456 This is SLEPC_EXTERN because it may be required by user plugin PEP
457 implementations.
458
459 Level: developer
460
461 .seealso: PEPSetUp()
462 @*/
463 2169 PetscErrorCode PEPAllocateSolution(PEP pep,PetscInt extra)
464 {
465 2169 PetscInt oldsize,requested,requestedbv;
466 2169 Vec t;
467
468
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2169 PetscFunctionBegin;
469
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2169 requested = (pep->lineariz? pep->ncv: pep->ncv*(pep->nmat-1)) + extra;
470 2169 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 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2169 PetscCall(BVGetSizes(pep->V,NULL,NULL,&oldsize));
474
475 /* allocate space for eigenvalues and friends */
476
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
2169 if (requested != oldsize || !pep->eigr) {
477
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2129 PetscCall(PetscFree4(pep->eigr,pep->eigi,pep->errest,pep->perm));
478
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2129 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 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.
2169 if (!pep->V) PetscCall(PEPGetBV(pep,&pep->V));
483
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2169 if (!oldsize) {
484
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.
1956 if (!((PetscObject)pep->V)->type_name) PetscCall(BVSetType(pep->V,BVMAT));
485
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1956 PetscCall(STMatCreateVecsEmpty(pep->st,&t,NULL));
486
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1956 PetscCall(BVSetSizesFromVec(pep->V,t,requestedbv));
487
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1956 PetscCall(VecDestroy(&t));
488
4/6
✓ Branch 0 taken 2 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 } 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.
425 PetscFunctionReturn(PETSC_SUCCESS);
490 }
491