GCC Code Coverage Report


Directory: ./
File: src/nep/tests/test16.c
Date: 2026-02-22 03:58:10
Exec Total Coverage
Lines: 78 85 91.8%
Functions: 3 3 100.0%
Branches: 156 284 54.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 static char help[] = "Illustrates use of NEPSetEigenvalueComparison().\n\n"
12 "This is a simplified version of ex20.\n"
13 "The command line options are:\n"
14 " -n <n>, where <n> = number of grid subdivisions.\n";
15
16 /*
17 Solve 1-D PDE
18 -u'' = lambda*u
19 on [0,1] subject to
20 u(0)=0, u'(1)=u(1)*lambda*kappa/(kappa-lambda)
21 */
22
23 #include <slepcnep.h>
24
25 /*
26 User-defined routines
27 */
28 PetscErrorCode FormFunction(NEP,PetscScalar,Mat,Mat,void*);
29 PetscErrorCode MyEigenSort(PetscScalar,PetscScalar,PetscScalar,PetscScalar,PetscInt*,void*);
30
31 /*
32 User-defined application context
33 */
34 typedef struct {
35 PetscScalar kappa; /* ratio between stiffness of spring and attached mass */
36 PetscReal h; /* mesh spacing */
37 } ApplicationCtx;
38
39 4 int main(int argc,char **argv)
40 {
41 4 NEP nep; /* nonlinear eigensolver context */
42 4 Mat F; /* Function matrix */
43 4 ApplicationCtx ctx; /* user-defined context */
44 4 PetscScalar target;
45 4 RG rg;
46 4 PetscInt n=128;
47 4 PetscBool terse;
48
49
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
4 PetscFunctionBeginUser;
50
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
4 PetscCall(SlepcInitialize(&argc,&argv,NULL,help));
51
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
4 PetscCall(PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL));
52
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
4 PetscCall(PetscPrintf(PETSC_COMM_WORLD,"\n1-D Nonlinear Eigenproblem, n=%" PetscInt_FMT "\n\n",n));
53 4 ctx.h = 1.0/(PetscReal)n;
54 4 ctx.kappa = 1.0;
55
56 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
57 Prepare nonlinear eigensolver context
58 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
59
60
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
4 PetscCall(NEPCreate(PETSC_COMM_WORLD,&nep));
61
62
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
4 PetscCall(MatCreate(PETSC_COMM_WORLD,&F));
63
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
4 PetscCall(MatSetSizes(F,PETSC_DECIDE,PETSC_DECIDE,n,n));
64
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
4 PetscCall(MatSetFromOptions(F));
65
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
4 PetscCall(MatSeqAIJSetPreallocation(F,3,NULL));
66
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
4 PetscCall(MatMPIAIJSetPreallocation(F,3,NULL,1,NULL));
67
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
4 PetscCall(NEPSetFunction(nep,F,F,FormFunction,&ctx));
68
69
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
4 PetscCall(NEPSetType(nep,NEPNLEIGS));
70
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
4 PetscCall(NEPGetRG(nep,&rg));
71
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
4 PetscCall(RGSetType(rg,RGINTERVAL));
72 #if defined(PETSC_USE_COMPLEX)
73 PetscCall(RGIntervalSetEndpoints(rg,2.0,400.0,-0.001,0.001));
74 #else
75
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
4 PetscCall(RGIntervalSetEndpoints(rg,2.0,400.0,0,0));
76 #endif
77
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
4 PetscCall(NEPSetTarget(nep,25.0));
78
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
4 PetscCall(NEPSetEigenvalueComparison(nep,MyEigenSort,&target));
79
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
4 PetscCall(NEPSetTolerances(nep,PETSC_SMALL,PETSC_CURRENT));
80
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
4 PetscCall(NEPSetFromOptions(nep));
81
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
4 PetscCall(NEPGetTarget(nep,&target));
82
83 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
84 Solve the eigensystem and display the solution
85 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
86
87
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
4 PetscCall(NEPSolve(nep));
88
89 /* show detailed info unless -terse option is given by user */
90
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
4 PetscCall(PetscOptionsHasName(NULL,NULL,"-terse",&terse));
91
5/8
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
4 if (terse) PetscCall(NEPErrorView(nep,NEP_ERROR_RELATIVE,NULL));
92 else {
93 PetscCall(PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD,PETSC_VIEWER_ASCII_INFO_DETAIL));
94 PetscCall(NEPConvergedReasonView(nep,PETSC_VIEWER_STDOUT_WORLD));
95 PetscCall(NEPErrorView(nep,NEP_ERROR_RELATIVE,PETSC_VIEWER_STDOUT_WORLD));
96 PetscCall(PetscViewerPopFormat(PETSC_VIEWER_STDOUT_WORLD));
97 }
98
99
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
4 PetscCall(NEPDestroy(&nep));
100
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
4 PetscCall(MatDestroy(&F));
101
2/6
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
4 PetscCall(SlepcFinalize());
102 return 0;
103 }
104
105 /* ------------------------------------------------------------------- */
106 /*
107 FormFunction - Computes Function matrix T(lambda)
108
109 Input Parameters:
110 . nep - the NEP context
111 . lambda - the scalar argument
112 . ctx - optional user-defined context, as set by NEPSetFunction()
113
114 Output Parameters:
115 . fun - Function matrix
116 . B - optionally different preconditioning matrix
117 */
118 432 PetscErrorCode FormFunction(NEP nep,PetscScalar lambda,Mat fun,Mat B,void *ctx)
119 {
120 432 ApplicationCtx *user = (ApplicationCtx*)ctx;
121 432 PetscScalar A[3],c,d;
122 432 PetscReal h;
123 432 PetscInt i,n,j[3],Istart,Iend;
124 432 PetscBool FirstBlock=PETSC_FALSE,LastBlock=PETSC_FALSE;
125
126
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
432 PetscFunctionBeginUser;
127 /*
128 Compute Function entries and insert into matrix
129 */
130
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
432 PetscCall(MatGetSize(fun,&n,NULL));
131
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
432 PetscCall(MatGetOwnershipRange(fun,&Istart,&Iend));
132
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
432 if (Istart==0) FirstBlock=PETSC_TRUE;
133
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
432 if (Iend==n) LastBlock=PETSC_TRUE;
134 432 h = user->h;
135 432 c = user->kappa/(lambda-user->kappa);
136 432 d = n;
137
138 /*
139 Interior grid points
140 */
141
4/6
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✓ Branch 5 taken 4 times.
54864 for (i=(FirstBlock? Istart+1: Istart);i<(LastBlock? Iend-1: Iend);i++) {
142 54432 j[0] = i-1; j[1] = i; j[2] = i+1;
143 54432 A[0] = A[2] = -d-lambda*h/6.0; A[1] = 2.0*(d-lambda*h/3.0);
144
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
54432 PetscCall(MatSetValues(fun,1,&i,3,j,A,INSERT_VALUES));
145 }
146
147 /*
148 Boundary points
149 */
150
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
432 if (FirstBlock) {
151 432 i = 0;
152 432 j[0] = 0; j[1] = 1;
153 432 A[0] = 2.0*(d-lambda*h/3.0); A[1] = -d-lambda*h/6.0;
154
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
432 PetscCall(MatSetValues(fun,1,&i,2,j,A,INSERT_VALUES));
155 }
156
157
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
432 if (LastBlock) {
158 432 i = n-1;
159 432 j[0] = n-2; j[1] = n-1;
160 432 A[0] = -d-lambda*h/6.0; A[1] = d-lambda*h/3.0+lambda*c;
161
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
432 PetscCall(MatSetValues(fun,1,&i,2,j,A,INSERT_VALUES));
162 }
163
164 /*
165 Assemble matrix
166 */
167
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
432 PetscCall(MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY));
168
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
432 PetscCall(MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY));
169
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
432 if (fun != B) {
170 PetscCall(MatAssemblyBegin(fun,MAT_FINAL_ASSEMBLY));
171 PetscCall(MatAssemblyEnd(fun,MAT_FINAL_ASSEMBLY));
172 }
173
5/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
108 PetscFunctionReturn(PETSC_SUCCESS);
174 }
175
176 /*
177 Function for user-defined eigenvalue ordering criterion.
178
179 Given two eigenvalues ar+i*ai and br+i*bi, the subroutine must choose
180 one of them as the preferred one according to the criterion.
181 In this example, eigenvalues are sorted with respect to the target,
182 but those on the right of the target are preferred.
183 */
184 820 PetscErrorCode MyEigenSort(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *r,void *ctx)
185 {
186 820 PetscReal a,b;
187 820 PetscScalar target = *(PetscScalar*)ctx;
188
189
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
820 PetscFunctionBeginUser;
190
4/4
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 4 times.
820 if (PetscRealPart(ar-target)<0.0 && PetscRealPart(br-target)>0.0) *r = 1;
191 else {
192 463 a = SlepcAbsEigenvalue(ar-target,ai);
193 463 b = SlepcAbsEigenvalue(br-target,bi);
194
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
463 if (a>b) *r = 1;
195
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
355 else if (a<b) *r = -1;
196 else *r = 0;
197 }
198
5/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
820 PetscFunctionReturn(PETSC_SUCCESS);
199 }
200
201 /*TEST
202
203 test:
204 suffix: 1
205 args: -nep_nev 4 -nep_ncv 8 -terse
206 requires: double !complex
207
208 TEST*/
209