GCC Code Coverage Report


Directory: ./
File: src/nep/tests/test16.c
Date: 2025-10-04 04:19:13
Exec Total Coverage
Lines: 78 85 91.8%
Functions: 3 3 100.0%
Branches: 157 284 55.3%

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 5 int main(int argc,char **argv)
40 {
41 5 NEP nep; /* nonlinear eigensolver context */
42 5 Mat F; /* Function matrix */
43 5 ApplicationCtx ctx; /* user-defined context */
44 5 PetscScalar target;
45 5 RG rg;
46 5 PetscInt n=128;
47 5 PetscBool terse;
48
49
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
5 PetscFunctionBeginUser;
50
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
5 PetscCall(SlepcInitialize(&argc,&argv,NULL,help));
51
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
5 PetscCall(PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL));
52
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
5 PetscCall(PetscPrintf(PETSC_COMM_WORLD,"\n1-D Nonlinear Eigenproblem, n=%" PetscInt_FMT "\n\n",n));
53 5 ctx.h = 1.0/(PetscReal)n;
54 5 ctx.kappa = 1.0;
55
56 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
57 Prepare nonlinear eigensolver context
58 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
59
60
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
5 PetscCall(NEPCreate(PETSC_COMM_WORLD,&nep));
61
62
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
5 PetscCall(MatCreate(PETSC_COMM_WORLD,&F));
63
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
5 PetscCall(MatSetSizes(F,PETSC_DECIDE,PETSC_DECIDE,n,n));
64
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
5 PetscCall(MatSetFromOptions(F));
65
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
5 PetscCall(MatSeqAIJSetPreallocation(F,3,NULL));
66
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
5 PetscCall(MatMPIAIJSetPreallocation(F,3,NULL,1,NULL));
67
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
5 PetscCall(NEPSetFunction(nep,F,F,FormFunction,&ctx));
68
69
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
5 PetscCall(NEPSetType(nep,NEPNLEIGS));
70
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
5 PetscCall(NEPGetRG(nep,&rg));
71
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
5 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 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
5 PetscCall(RGIntervalSetEndpoints(rg,2.0,400.0,0,0));
76 #endif
77
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
5 PetscCall(NEPSetTarget(nep,25.0));
78
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
5 PetscCall(NEPSetEigenvalueComparison(nep,MyEigenSort,&target));
79
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
5 PetscCall(NEPSetTolerances(nep,PETSC_SMALL,PETSC_CURRENT));
80
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
5 PetscCall(NEPSetFromOptions(nep));
81
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
5 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 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
5 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 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
5 PetscCall(PetscOptionsHasName(NULL,NULL,"-terse",&terse));
91
5/8
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ 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.
5 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 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
5 PetscCall(NEPDestroy(&nep));
100
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
5 PetscCall(MatDestroy(&F));
101
3/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
5 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 540 PetscErrorCode FormFunction(NEP nep,PetscScalar lambda,Mat fun,Mat B,void *ctx)
119 {
120 540 ApplicationCtx *user = (ApplicationCtx*)ctx;
121 540 PetscScalar A[3],c,d;
122 540 PetscReal h;
123 540 PetscInt i,n,j[3],Istart,Iend;
124 540 PetscBool FirstBlock=PETSC_FALSE,LastBlock=PETSC_FALSE;
125
126
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
540 PetscFunctionBeginUser;
127 /*
128 Compute Function entries and insert into matrix
129 */
130
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
540 PetscCall(MatGetSize(fun,&n,NULL));
131
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
540 PetscCall(MatGetOwnershipRange(fun,&Istart,&Iend));
132
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
540 if (Istart==0) FirstBlock=PETSC_TRUE;
133
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
540 if (Iend==n) LastBlock=PETSC_TRUE;
134 540 h = user->h;
135 540 c = user->kappa/(lambda-user->kappa);
136 540 d = n;
137
138 /*
139 Interior grid points
140 */
141
4/6
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5 times.
✓ Branch 5 taken 5 times.
68580 for (i=(FirstBlock? Istart+1: Istart);i<(LastBlock? Iend-1: Iend);i++) {
142 68040 j[0] = i-1; j[1] = i; j[2] = i+1;
143 68040 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 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
68040 PetscCall(MatSetValues(fun,1,&i,3,j,A,INSERT_VALUES));
145 }
146
147 /*
148 Boundary points
149 */
150
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
540 if (FirstBlock) {
151 540 i = 0;
152 540 j[0] = 0; j[1] = 1;
153 540 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 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
540 PetscCall(MatSetValues(fun,1,&i,2,j,A,INSERT_VALUES));
155 }
156
157
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
540 if (LastBlock) {
158 540 i = n-1;
159 540 j[0] = n-2; j[1] = n-1;
160 540 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 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
540 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 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
540 PetscCall(MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY));
168
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
540 PetscCall(MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY));
169
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
540 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 1028 PetscErrorCode MyEigenSort(PetscScalar ar,PetscScalar ai,PetscScalar br,PetscScalar bi,PetscInt *r,void *ctx)
185 {
186 1028 PetscReal a,b;
187 1028 PetscScalar target = *(PetscScalar*)ctx;
188
189
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1028 PetscFunctionBeginUser;
190
4/4
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 5 times.
1028 if (PetscRealPart(ar-target)<0.0 && PetscRealPart(br-target)>0.0) *r = 1;
191 else {
192 581 a = SlepcAbsEigenvalue(ar-target,ai);
193 581 b = SlepcAbsEigenvalue(br-target,bi);
194
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
581 if (a>b) *r = 1;
195
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
445 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.
1028 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