GCC Code Coverage Report


Directory: ./
File: src/nep/interface/nepdefault.c
Date: 2025-10-04 04:19:13
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 - nonlinear eigensolver context
23 - nw - number of work vectors to allocate
24
25 Developer Notes:
26 This is SLEPC_EXTERN because it may be required by user plugin NEP
27 implementations.
28
29 Level: developer
30
31 .seealso: 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 - nonlinear eigensolver context obtained from NEPCreate()
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 A positive value of reason indicates that the iteration has finished successfully
160 (converged), and a negative value indicates an error condition (diverged). If
161 the iteration needs to be continued, reason must be set to NEP_CONVERGED_ITERATING
162 (zero).
163
164 NEPStoppingBasic() will stop if all requested eigenvalues are converged, or if
165 the maximum number of iterations has been reached.
166
167 Use NEPSetStoppingTest() to provide your own test instead of using this one.
168
169 Level: advanced
170
171 .seealso: NEPSetStoppingTest(), NEPConvergedReason, NEPGetConvergedReason()
172 @*/
173 8223 PetscErrorCode NEPStoppingBasic(NEP nep,PetscInt its,PetscInt max_it,PetscInt nconv,PetscInt nev,NEPConvergedReason *reason,void *ctx)
174 {
175
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
8223 PetscFunctionBegin;
176 8223 *reason = NEP_CONVERGED_ITERATING;
177
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
8223 if (nconv >= nev) {
178
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
998 PetscCall(PetscInfo(nep,"Nonlinear eigensolver finished successfully: %" PetscInt_FMT " eigenpairs converged at iteration %" PetscInt_FMT "\n",nconv,its));
179 998 *reason = NEP_CONVERGED_TOL;
180
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
7225 } else if (its >= max_it) {
181 *reason = NEP_DIVERGED_ITS;
182 PetscCall(PetscInfo(nep,"Nonlinear eigensolver iteration reached maximum number of iterations (%" PetscInt_FMT ")\n",its));
183 }
184
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);
185 }
186
187 948 PetscErrorCode NEPComputeVectors_Schur(NEP nep)
188 {
189 948 Mat Z;
190
191
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
948 PetscFunctionBegin;
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(DSVectors(nep->ds,DS_MAT_X,NULL,NULL));
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.
948 PetscCall(DSGetMat(nep->ds,DS_MAT_X,&Z));
194
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
948 PetscCall(BVMultInPlace(nep->V,Z,0,nep->nconv));
195
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
948 PetscCall(DSRestoreMat(nep->ds,DS_MAT_X,&Z));
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.
948 PetscCall(BVNormalize(nep->V,nep->eigi));
197
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);
198 }
199