GCC Code Coverage Report


Directory: ./
File: src/nep/interface/nepdefault.c
Date: 2025-11-19 04:19:03
Exec Total Coverage
Lines: 65 83 78.3%
Functions: 7 7 100.0%
Branches: 150 320 46.9%

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 Simple default routines for common NEP operations
12 */
13
14 #include <slepc/private/nepimpl.h> /*I "slepcnep.h" I*/
15
16 /*@
17 NEPSetWorkVecs - Sets a number of work vectors into a `NEP` object
18
19 Collective
20
21 Input Parameters:
22 + nep - the nonlinear eigensolver context
23 - nw - number of work vectors to allocate
24
25 Developer Note:
26 This is `SLEPC_EXTERN` because it may be required by user plugin `NEP`
27 implementations.
28
29 Level: developer
30
31 .seealso: [](ch:nep), `NEPSetUp()`
32 @*/
33 7068 PetscErrorCode NEPSetWorkVecs(NEP nep,PetscInt nw)
34 {
35 7068 Vec t;
36
37
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
7068 PetscFunctionBegin;
38
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.
7068 PetscValidHeaderSpecific(nep,NEP_CLASSID,1);
39
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.
7068 PetscValidLogicalCollectiveInt(nep,nw,2);
40
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
7068 PetscCheck(nw>0,PetscObjectComm((PetscObject)nep),PETSC_ERR_ARG_OUTOFRANGE,"nw must be > 0: nw = %" PetscInt_FMT,nw);
41
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
7068 if (nep->nwork < nw) {
42
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1981 PetscCall(VecDestroyVecs(nep->nwork,&nep->work));
43 1981 nep->nwork = nw;
44
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1981 PetscCall(BVGetColumn(nep->V,0,&t));
45
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1981 PetscCall(VecDuplicateVecs(t,nw,&nep->work));
46
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1981 PetscCall(BVRestoreColumn(nep->V,0,&t));
47 }
48
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.
1380 PetscFunctionReturn(PETSC_SUCCESS);
49 }
50
51 /*
52 NEPGetDefaultShift - Return the value of sigma to start the nonlinear iteration.
53 */
54 744 PetscErrorCode NEPGetDefaultShift(NEP nep,PetscScalar *sigma)
55 {
56
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
744 PetscFunctionBegin;
57
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.
744 PetscAssertPointer(sigma,2);
58
1/6
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
744 switch (nep->which) {
59 case NEP_LARGEST_MAGNITUDE:
60 case NEP_LARGEST_IMAGINARY:
61 case NEP_ALL:
62 case NEP_WHICH_USER:
63 *sigma = 1.0; /* arbitrary value */
64 break;
65 case NEP_SMALLEST_MAGNITUDE:
66 case NEP_SMALLEST_IMAGINARY:
67 *sigma = 0.0;
68 break;
69 case NEP_LARGEST_REAL:
70 *sigma = PETSC_MAX_REAL;
71 break;
72 case NEP_SMALLEST_REAL:
73 *sigma = PETSC_MIN_REAL;
74 break;
75 744 case NEP_TARGET_MAGNITUDE:
76 case NEP_TARGET_REAL:
77 case NEP_TARGET_IMAGINARY:
78 744 *sigma = nep->target;
79 744 break;
80 }
81
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.
744 PetscFunctionReturn(PETSC_SUCCESS);
82 }
83
84 /*
85 NEPConvergedRelative - Checks convergence relative to the eigenvalue.
86 */
87 10283 PetscErrorCode NEPConvergedRelative(NEP nep,PetscScalar eigr,PetscScalar eigi,PetscReal res,PetscReal *errest,void *ctx)
88 {
89 10283 PetscReal w;
90
91
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
10283 PetscFunctionBegin;
92 10283 w = SlepcAbsEigenvalue(eigr,eigi);
93
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
10283 *errest = (w!=0.0)? res/w: PETSC_MAX_REAL;
94
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.
10283 PetscFunctionReturn(PETSC_SUCCESS);
95 }
96
97 /*
98 NEPConvergedAbsolute - Checks convergence absolutely.
99 */
100 137 PetscErrorCode NEPConvergedAbsolute(NEP nep,PetscScalar eigr,PetscScalar eigi,PetscReal res,PetscReal *errest,void *ctx)
101 {
102
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
137 PetscFunctionBegin;
103 137 *errest = res;
104
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.
137 PetscFunctionReturn(PETSC_SUCCESS);
105 }
106
107 /*
108 NEPConvergedNorm - Checks convergence relative to the matrix norms.
109 */
110 60 PetscErrorCode NEPConvergedNorm(NEP nep,PetscScalar eigr,PetscScalar eigi,PetscReal res,PetscReal *errest,void *ctx)
111 {
112 60 PetscScalar s;
113 60 PetscReal w=0.0;
114 60 PetscInt j;
115 60 PetscBool flg;
116
117
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
60 PetscFunctionBegin;
118
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
60 if (nep->fui!=NEP_USER_INTERFACE_SPLIT) {
119 PetscCall(NEPComputeFunction(nep,eigr,nep->function,nep->function));
120 PetscCall(MatHasOperation(nep->function,MATOP_NORM,&flg));
121 PetscCheck(flg,PetscObjectComm((PetscObject)nep),PETSC_ERR_ARG_WRONG,"The computation of backward errors requires a matrix norm operation");
122 PetscCall(MatNorm(nep->function,NORM_INFINITY,&w));
123 } else {
124 /* initialization of matrix norms */
125
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
60 if (!nep->nrma[0]) {
126
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
30 for (j=0;j<nep->nt;j++) {
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.
20 PetscCall(MatHasOperation(nep->A[j],MATOP_NORM,&flg));
128
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
20 PetscCheck(flg,PetscObjectComm((PetscObject)nep),PETSC_ERR_ARG_WRONG,"The convergence test related to the matrix norms requires a matrix norm operation");
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.
20 PetscCall(MatNorm(nep->A[j],NORM_INFINITY,&nep->nrma[j]));
130 }
131 }
132
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
180 for (j=0;j<nep->nt;j++) {
133
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
120 PetscCall(FNEvaluateFunction(nep->f[j],eigr,&s));
134 120 w = w + nep->nrma[j]*PetscAbsScalar(s);
135 }
136 }
137 60 *errest = res/w;
138
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.
60 PetscFunctionReturn(PETSC_SUCCESS);
139 }
140
141 /*@C
142 NEPStoppingBasic - Default routine to determine whether the outer eigensolver
143 iteration must be stopped.
144
145 Collective
146
147 Input Parameters:
148 + nep - the nonlinear eigensolver context
149 . its - current number of iterations
150 . max_it - maximum number of iterations
151 . nconv - number of currently converged eigenpairs
152 . nev - number of requested eigenpairs
153 - ctx - context (not used here)
154
155 Output Parameter:
156 . reason - result of the stopping test
157
158 Notes:
159 `NEPStoppingBasic()` will stop if all requested eigenvalues are converged, or if
160 the maximum number of iterations has been reached.
161
162 This is the default stopping test.
163 Use `NEPSetStoppingTest()` to provide your own test instead of using this one.
164
165 Level: advanced
166
167 .seealso: [](ch:nep), `NEPSetStoppingTest()`, `NEPConvergedReason`, `NEPGetConvergedReason()`
168 @*/
169 8223 PetscErrorCode NEPStoppingBasic(NEP nep,PetscInt its,PetscInt max_it,PetscInt nconv,PetscInt nev,NEPConvergedReason *reason,void *ctx)
170 {
171
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
8223 PetscFunctionBegin;
172 8223 *reason = NEP_CONVERGED_ITERATING;
173
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
8223 if (nconv >= nev) {
174
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
998 PetscCall(PetscInfo(nep,"Nonlinear eigensolver finished successfully: %" PetscInt_FMT " eigenpairs converged at iteration %" PetscInt_FMT "\n",nconv,its));
175 998 *reason = NEP_CONVERGED_TOL;
176
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
7225 } else if (its >= max_it) {
177 *reason = NEP_DIVERGED_ITS;
178 PetscCall(PetscInfo(nep,"Nonlinear eigensolver iteration reached maximum number of iterations (%" PetscInt_FMT ")\n",its));
179 }
180
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.
1575 PetscFunctionReturn(PETSC_SUCCESS);
181 }
182
183 948 PetscErrorCode NEPComputeVectors_Schur(NEP nep)
184 {
185 948 Mat Z;
186
187
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
948 PetscFunctionBegin;
188
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
948 PetscCall(DSVectors(nep->ds,DS_MAT_X,NULL,NULL));
189
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
948 PetscCall(DSGetMat(nep->ds,DS_MAT_X,&Z));
190
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
948 PetscCall(BVMultInPlace(nep->V,Z,0,nep->nconv));
191
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
948 PetscCall(DSRestoreMat(nep->ds,DS_MAT_X,&Z));
192
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
948 PetscCall(BVNormalize(nep->V,nep->eigi));
193
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.
177 PetscFunctionReturn(PETSC_SUCCESS);
194 }
195