GCC Code Coverage Report


Directory: ./
File: src/nep/interface/nepsetup.c
Date: 2025-10-04 04:19:13
Exec Total Coverage
Lines: 137 171 80.1%
Functions: 5 5 100.0%
Branches: 326 656 49.7%

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 NEP routines related to problem setup
12 */
13
14 #include <slepc/private/nepimpl.h> /*I "slepcnep.h" I*/
15
16 /*@
17 NEPSetDSType - Sets the type of the internal DS object based on the current
18 settings of the nonlinear eigensolver.
19
20 Collective
21
22 Input Parameter:
23 . nep - nonlinear eigensolver context
24
25 Note:
26 This function need not be called explicitly, since it will be called at
27 both NEPSetFromOptions() and NEPSetUp().
28
29 Level: developer
30
31 .seealso: NEPSetFromOptions(), NEPSetUp()
32 @*/
33 2274 PetscErrorCode NEPSetDSType(NEP nep)
34 {
35
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2274 PetscFunctionBegin;
36
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.
2274 PetscValidHeaderSpecific(nep,NEP_CLASSID,1);
37
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.
2274 PetscTryTypeMethod(nep,setdstype);
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.
428 PetscFunctionReturn(PETSC_SUCCESS);
39 }
40
41 /*@
42 NEPSetUp - Sets up all the internal data structures necessary for the
43 execution of the NEP solver.
44
45 Collective
46
47 Input Parameter:
48 . nep - solver context
49
50 Notes:
51 This function need not be called explicitly in most cases, since NEPSolve()
52 calls it. It can be useful when one wants to measure the set-up time
53 separately from the solve time.
54
55 Level: developer
56
57 .seealso: NEPCreate(), NEPSolve(), NEPDestroy()
58 @*/
59 1495 PetscErrorCode NEPSetUp(NEP nep)
60 {
61 1495 PetscInt k;
62 1495 SlepcSC sc;
63 1495 Mat T;
64 1495 PetscBool flg;
65 1495 KSP ksp;
66 1495 PC pc;
67 1495 PetscMPIInt size;
68 1495 MatSolverType stype;
69
70
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1495 PetscFunctionBegin;
71
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.
1495 PetscValidHeaderSpecific(nep,NEP_CLASSID,1);
72
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1495 NEPCheckProblem(nep,1);
73
2/14
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 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.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
1495 if (nep->state) PetscFunctionReturn(PETSC_SUCCESS);
74
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1495 PetscCall(PetscLogEventBegin(NEP_SetUp,nep,0,0,0));
75
76 /* reset the convergence flag from the previous solves */
77 1495 nep->reason = NEP_CONVERGED_ITERATING;
78
79 /* set default solver type (NEPSetFromOptions was not called) */
80
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.
1495 if (!((PetscObject)nep)->type_name) PetscCall(NEPSetType(nep,NEPRII));
81
3/10
✓ 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 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
1495 if (nep->useds && !nep->ds) PetscCall(NEPGetDS(nep,&nep->ds));
82
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.
1495 if (nep->useds) PetscCall(NEPSetDSType(nep));
83
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.
1495 if (!nep->rg) PetscCall(NEPGetRG(nep,&nep->rg));
84
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.
1495 if (!((PetscObject)nep->rg)->type_name) PetscCall(RGSetType(nep->rg,RGINTERVAL));
85
86 /* set problem dimensions */
87
2/3
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
1495 switch (nep->fui) {
88 453 case NEP_USER_INTERFACE_CALLBACK:
89
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
453 PetscCall(NEPGetFunction(nep,&T,NULL,NULL,NULL));
90
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
453 PetscCall(MatGetSize(T,&nep->n,NULL));
91
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
453 PetscCall(MatGetLocalSize(T,&nep->nloc,NULL));
92 break;
93 1042 case NEP_USER_INTERFACE_SPLIT:
94
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1042 PetscCall(MatDuplicate(nep->A[0],MAT_DO_NOT_COPY_VALUES,&nep->function));
95
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.
1042 if (nep->P) PetscCall(MatDuplicate(nep->P[0],MAT_DO_NOT_COPY_VALUES,&nep->function_pre));
96
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1042 PetscCall(MatDuplicate(nep->A[0],MAT_DO_NOT_COPY_VALUES,&nep->jacobian));
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.
1042 PetscCall(MatGetSize(nep->A[0],&nep->n,NULL));
98
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1042 PetscCall(MatGetLocalSize(nep->A[0],&nep->nloc,NULL));
99 break;
100 }
101
102 /* set default problem type */
103
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.
1495 if (!nep->problem_type) PetscCall(NEPSetProblemType(nep,NEP_GENERAL));
104
105 /* check consistency of refinement options */
106
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1495 if (nep->refine) {
107
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
136 PetscCheck(nep->fui==NEP_USER_INTERFACE_SPLIT,PetscObjectComm((PetscObject)nep),PETSC_ERR_SUP,"Iterative refinement only implemented in split form");
108
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
136 if (!nep->scheme) { /* set default scheme */
109
4/6
✓ Branch 0 taken 2 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(NEPRefineGetKSP(nep,&ksp));
110
4/6
✓ Branch 0 taken 2 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(KSPGetPC(ksp,&pc));
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.
10 PetscCall(PetscObjectTypeCompare((PetscObject)ksp,KSPPREONLY,&flg));
112
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 (flg) PetscCall(PetscObjectTypeCompareAny((PetscObject)pc,&flg,PCLU,PCCHOLESKY,""));
113
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
20 nep->scheme = flg? NEP_REFINE_SCHEME_MBE: NEP_REFINE_SCHEME_SCHUR;
114 }
115
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
136 if (nep->scheme==NEP_REFINE_SCHEME_MBE) {
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.
30 PetscCall(NEPRefineGetKSP(nep,&ksp));
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.
30 PetscCall(KSPGetPC(ksp,&pc));
118
4/6
✓ Branch 0 taken 2 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(PetscObjectTypeCompare((PetscObject)ksp,KSPPREONLY,&flg));
119
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.
30 if (flg) PetscCall(PetscObjectTypeCompareAny((PetscObject)pc,&flg,PCLU,PCCHOLESKY,""));
120
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
30 PetscCheck(flg,PetscObjectComm((PetscObject)nep),PETSC_ERR_SUP,"The MBE scheme for refinement requires a direct solver in KSP");
121
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.
30 PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)pc),&size));
122
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
30 if (size>1) { /* currently selected PC is a factorization */
123 PetscCall(PCFactorGetMatSolverType(pc,&stype));
124 PetscCall(PetscStrcmp(stype,MATSOLVERPETSC,&flg));
125 PetscCheck(!flg,PetscObjectComm((PetscObject)nep),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");
126 }
127 }
128
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
136 if (nep->scheme==NEP_REFINE_SCHEME_SCHUR) {
129
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
20 PetscCheck(nep->npart==1,PetscObjectComm((PetscObject)nep),PETSC_ERR_SUP,"The Schur scheme for refinement does not support subcommunicators");
130 }
131 }
132 /* call specific solver setup */
133
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.
1495 PetscUseTypeMethod(nep,setup);
134
135 /* set tolerance if not yet set */
136
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1495 if (nep->tol==(PetscReal)PETSC_DETERMINE) nep->tol = SLEPC_DEFAULT_TOL;
137
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1495 if (nep->refine) {
138
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
256 if (nep->rtol==(PetscReal)PETSC_DETERMINE) nep->rtol = PetscMax(nep->tol/1000,PETSC_MACHINE_EPSILON);
139
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
136 if (nep->rits==(PetscReal)PETSC_DETERMINE) nep->rits = (nep->refine==NEP_REFINE_SIMPLE)? 10: 1;
140 }
141
142 /* fill sorting criterion context */
143
4/11
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 10 times.
✓ Branch 7 taken 5 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 5 times.
✓ Branch 10 taken 5 times.
1495 switch (nep->which) {
144 case NEP_LARGEST_MAGNITUDE:
145 nep->sc->comparison = SlepcCompareLargestMagnitude;
146 nep->sc->comparisonctx = NULL;
147 break;
148 case NEP_SMALLEST_MAGNITUDE:
149 nep->sc->comparison = SlepcCompareSmallestMagnitude;
150 nep->sc->comparisonctx = NULL;
151 break;
152 case NEP_LARGEST_REAL:
153 nep->sc->comparison = SlepcCompareLargestReal;
154 nep->sc->comparisonctx = NULL;
155 break;
156 case NEP_SMALLEST_REAL:
157 nep->sc->comparison = SlepcCompareSmallestReal;
158 nep->sc->comparisonctx = NULL;
159 break;
160 case NEP_LARGEST_IMAGINARY:
161 nep->sc->comparison = SlepcCompareLargestImaginary;
162 nep->sc->comparisonctx = NULL;
163 break;
164 case NEP_SMALLEST_IMAGINARY:
165 nep->sc->comparison = SlepcCompareSmallestImaginary;
166 nep->sc->comparisonctx = NULL;
167 break;
168 1288 case NEP_TARGET_MAGNITUDE:
169 1288 nep->sc->comparison = SlepcCompareTargetMagnitude;
170 1288 nep->sc->comparisonctx = &nep->target;
171 1288 break;
172 5 case NEP_TARGET_REAL:
173 5 nep->sc->comparison = SlepcCompareTargetReal;
174 5 nep->sc->comparisonctx = &nep->target;
175 5 break;
176 case NEP_TARGET_IMAGINARY:
177 nep->sc->comparison = SlepcCompareTargetImaginary;
178 nep->sc->comparisonctx = &nep->target;
179 break;
180 197 case NEP_ALL:
181 197 nep->sc->comparison = SlepcCompareSmallestReal;
182 197 nep->sc->comparisonctx = NULL;
183 197 break;
184 case NEP_WHICH_USER:
185 break;
186 }
187
188 1495 nep->sc->map = NULL;
189 1495 nep->sc->mapobj = NULL;
190
191 /* fill sorting criterion for DS */
192
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1495 if (nep->useds) {
193
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1215 PetscCall(DSGetSlepcSC(nep->ds,&sc));
194 1215 sc->comparison = nep->sc->comparison;
195 1215 sc->comparisonctx = nep->sc->comparisonctx;
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.
1215 PetscCall(PetscObjectTypeCompare((PetscObject)nep,NEPNLEIGS,&flg));
197
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1215 if (!flg) {
198 951 sc->map = NULL;
199 951 sc->mapobj = NULL;
200 }
201 }
202
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1495 PetscCheck(nep->nev<=nep->ncv,PetscObjectComm((PetscObject)nep),PETSC_ERR_ARG_OUTOFRANGE,"nev bigger than ncv");
203
204 /* process initial vectors */
205
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1495 if (nep->nini<0) {
206 48 k = -nep->nini;
207
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
48 PetscCheck(k<=nep->ncv,PetscObjectComm((PetscObject)nep),PETSC_ERR_USER_INPUT,"The number of initial vectors is larger than ncv");
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.
48 PetscCall(BVInsertVecs(nep->V,0,&k,nep->IS,PETSC_TRUE));
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.
48 PetscCall(SlepcBasisDestroy_Private(&nep->nini,&nep->IS));
210 48 nep->nini = k;
211 }
212
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1495 PetscCall(PetscLogEventEnd(NEP_SetUp,nep,0,0,0));
213 1495 nep->state = NEP_STATE_SETUP;
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.
1495 PetscFunctionReturn(PETSC_SUCCESS);
215 }
216
217 /*@
218 NEPSetInitialSpace - Specify a basis of vectors that constitute the initial
219 space, that is, the subspace from which the solver starts to iterate.
220
221 Collective
222
223 Input Parameters:
224 + nep - the nonlinear eigensolver context
225 . n - number of vectors
226 - is - set of basis vectors of the initial space
227
228 Notes:
229 Some solvers start to iterate on a single vector (initial vector). In that case,
230 the other vectors are ignored.
231
232 These vectors do not persist from one NEPSolve() call to the other, so the
233 initial space should be set every time.
234
235 The vectors do not need to be mutually orthonormal, since they are explicitly
236 orthonormalized internally.
237
238 Common usage of this function is when the user can provide a rough approximation
239 of the wanted eigenspace. Then, convergence may be faster.
240
241 Level: intermediate
242
243 .seealso: NEPSetUp()
244 @*/
245 68 PetscErrorCode NEPSetInitialSpace(NEP nep,PetscInt n,Vec is[])
246 {
247
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
68 PetscFunctionBegin;
248
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.
68 PetscValidHeaderSpecific(nep,NEP_CLASSID,1);
249
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.
68 PetscValidLogicalCollectiveInt(nep,n,2);
250
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
68 PetscCheck(n>=0,PetscObjectComm((PetscObject)nep),PETSC_ERR_ARG_OUTOFRANGE,"Argument n cannot be negative");
251
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
68 if (n>0) {
252
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.
68 PetscAssertPointer(is,3);
253
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.
68 PetscValidHeaderSpecific(*is,VEC_CLASSID,3);
254 }
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.
68 PetscCall(SlepcBasisReference_Private(n,is,&nep->nini,&nep->IS));
256
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
68 if (n>0) nep->state = NEP_STATE_INITIAL;
257
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.
12 PetscFunctionReturn(PETSC_SUCCESS);
258 }
259
260 /*
261 NEPSetDimensions_Default - Set reasonable values for ncv, mpd if not set
262 by the user. This is called at setup.
263 */
264 724 PetscErrorCode NEPSetDimensions_Default(NEP nep,PetscInt nev,PetscInt *ncv,PetscInt *mpd)
265 {
266
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
724 PetscFunctionBegin;
267
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
724 if (*ncv!=PETSC_DETERMINE) { /* ncv set */
268
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
165 PetscCheck(*ncv>=nev,PetscObjectComm((PetscObject)nep),PETSC_ERR_USER_INPUT,"The value of ncv must be at least nev");
269
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
559 } else if (*mpd!=PETSC_DETERMINE) { /* mpd set */
270 *ncv = PetscMin(nep->n,nev+(*mpd));
271 } else { /* neither set: defaults depend on nev being small or large */
272
3/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 3 times.
559 if (nev<500) *ncv = PetscMin(nep->n,PetscMax(2*nev,nev+15));
273 else {
274 *mpd = 500;
275 *ncv = PetscMin(nep->n,nev+(*mpd));
276 }
277 }
278
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
724 if (*mpd==PETSC_DETERMINE) *mpd = *ncv;
279
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.
138 PetscFunctionReturn(PETSC_SUCCESS);
280 }
281
282 /*@
283 NEPAllocateSolution - Allocate memory storage for common variables such
284 as eigenvalues and eigenvectors.
285
286 Collective
287
288 Input Parameters:
289 + nep - eigensolver context
290 - extra - number of additional positions, used for methods that require a
291 working basis slightly larger than ncv
292
293 Developer Notes:
294 This is SLEPC_EXTERN because it may be required by user plugin NEP
295 implementations.
296
297 Level: developer
298
299 .seealso: PEPSetUp()
300 @*/
301 1525 PetscErrorCode NEPAllocateSolution(NEP nep,PetscInt extra)
302 {
303 1525 PetscInt oldsize,requested;
304 1525 PetscRandom rand;
305 1525 Mat T;
306 1525 Vec t;
307
308
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1525 PetscFunctionBegin;
309 1525 requested = nep->ncv + extra;
310
311 /* oldsize is zero if this is the first time setup is called */
312
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1525 PetscCall(BVGetSizes(nep->V,NULL,NULL,&oldsize));
313
314 /* allocate space for eigenvalues and friends */
315
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1525 if (requested != oldsize || !nep->eigr) {
316
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1525 PetscCall(PetscFree4(nep->eigr,nep->eigi,nep->errest,nep->perm));
317
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1525 PetscCall(PetscMalloc4(requested,&nep->eigr,requested,&nep->eigi,requested,&nep->errest,requested,&nep->perm));
318 }
319
320 /* allocate V */
321
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.
1525 if (!nep->V) PetscCall(NEPGetBV(nep,&nep->V));
322
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1525 if (!oldsize) {
323
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.
1495 if (!((PetscObject)nep->V)->type_name) PetscCall(BVSetType(nep->V,BVMAT));
324
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1495 if (nep->fui==NEP_USER_INTERFACE_SPLIT) T = nep->A[0];
325
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
453 else PetscCall(NEPGetFunction(nep,&T,NULL,NULL,NULL));
326
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1495 PetscCall(MatCreateVecsEmpty(T,&t,NULL));
327
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1495 PetscCall(BVSetSizesFromVec(nep->V,t,requested));
328
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1495 PetscCall(VecDestroy(&t));
329
4/6
✓ Branch 0 taken 2 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 } else PetscCall(BVResize(nep->V,requested,PETSC_FALSE));
330
331 /* allocate W */
332
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1525 if (nep->twosided) {
333
4/6
✓ Branch 0 taken 2 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(BVGetRandomContext(nep->V,&rand)); /* make sure the random context is available when duplicating */
334
4/6
✓ Branch 0 taken 2 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(BVDestroy(&nep->W));
335
4/6
✓ Branch 0 taken 2 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(BVDuplicate(nep->V,&nep->W));
336 }
337
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.
291 PetscFunctionReturn(PETSC_SUCCESS);
338 }
339