GCC Code Coverage Report


Directory: ./
File: src/pep/tutorials/nlevp/spring.c
Date: 2026-02-22 03:58:10
Exec Total Coverage
Lines: 52 56 92.9%
Functions: 1 1 100.0%
Branches: 183 294 62.2%

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 This example implements one of the problems found at
12 NLEVP: A Collection of Nonlinear Eigenvalue Problems,
13 The University of Manchester.
14 The details of the collection can be found at:
15 [1] T. Betcke et al., "NLEVP: A Collection of Nonlinear Eigenvalue
16 Problems", ACM Trans. Math. Software 39(2), Article 7, 2013.
17
18 The spring problem is a QEP from the finite element model of a damped
19 mass-spring system. This implementation supports only scalar parameters,
20 that is all masses, dampers and springs have the same constants.
21 Furthermore, this implementation does not consider different constants
22 for dampers and springs connecting adjacent masses or masses to the ground.
23 */
24
25 static char help[] = "FEM model of a damped mass-spring system.\n\n"
26 "The command line options are:\n"
27 " -n <n> ... dimension of the matrices.\n"
28 " -mu <value> ... mass (default 1).\n"
29 " -tau <value> ... damping constant of the dampers (default 10).\n"
30 " -kappa <value> ... damping constant of the springs (default 5).\n\n";
31
32 #include <slepcpep.h>
33
34 76 int main(int argc,char **argv)
35 {
36 76 Mat M,C,K,A[3]; /* problem matrices */
37 76 PEP pep; /* polynomial eigenproblem solver context */
38 76 PetscInt n=5,Istart,Iend,i;
39 76 PetscReal mu=1.0,tau=10.0,kappa=5.0;
40 76 PetscBool terse;
41
42
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
76 PetscFunctionBeginUser;
43
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(SlepcInitialize(&argc,&argv,NULL,help));
44
45
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL));
46
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(PetscOptionsGetReal(NULL,NULL,"-mu",&mu,NULL));
47
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(PetscOptionsGetReal(NULL,NULL,"-tau",&tau,NULL));
48
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(PetscOptionsGetReal(NULL,NULL,"-kappa",&kappa,NULL));
49
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(PetscPrintf(PETSC_COMM_WORLD,"\nDamped mass-spring system, n=%" PetscInt_FMT " mu=%g tau=%g kappa=%g\n\n",n,(double)mu,(double)tau,(double)kappa));
50
51 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
52 Compute the matrices that define the eigensystem, (k^2*M+k*C+K)x=0
53 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
54
55 /* K is a tridiagonal */
56
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(MatCreate(PETSC_COMM_WORLD,&K));
57
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(MatSetSizes(K,PETSC_DECIDE,PETSC_DECIDE,n,n));
58
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(MatSetFromOptions(K));
59
60
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(MatGetOwnershipRange(K,&Istart,&Iend));
61
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
8776 for (i=Istart;i<Iend;i++) {
62
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
8700 if (i>0) PetscCall(MatSetValue(K,i,i-1,-kappa,INSERT_VALUES));
63
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8700 PetscCall(MatSetValue(K,i,i,kappa*3.0,INSERT_VALUES));
64
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
8700 if (i<n-1) PetscCall(MatSetValue(K,i,i+1,-kappa,INSERT_VALUES));
65 }
66
67
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(MatAssemblyBegin(K,MAT_FINAL_ASSEMBLY));
68
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(MatAssemblyEnd(K,MAT_FINAL_ASSEMBLY));
69
70 /* C is a tridiagonal */
71
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(MatCreate(PETSC_COMM_WORLD,&C));
72
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(MatSetSizes(C,PETSC_DECIDE,PETSC_DECIDE,n,n));
73
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(MatSetFromOptions(C));
74
75
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(MatGetOwnershipRange(C,&Istart,&Iend));
76
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
8776 for (i=Istart;i<Iend;i++) {
77
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
8700 if (i>0) PetscCall(MatSetValue(C,i,i-1,-tau,INSERT_VALUES));
78
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
8700 PetscCall(MatSetValue(C,i,i,tau*3.0,INSERT_VALUES));
79
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
8700 if (i<n-1) PetscCall(MatSetValue(C,i,i+1,-tau,INSERT_VALUES));
80 }
81
82
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY));
83
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY));
84
85 /* M is a diagonal matrix */
86
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(MatCreate(PETSC_COMM_WORLD,&M));
87
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(MatSetSizes(M,PETSC_DECIDE,PETSC_DECIDE,n,n));
88
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(MatSetFromOptions(M));
89
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(MatGetOwnershipRange(M,&Istart,&Iend));
90
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
8776 for (i=Istart;i<Iend;i++) PetscCall(MatSetValue(M,i,i,mu,INSERT_VALUES));
91
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(MatAssemblyBegin(M,MAT_FINAL_ASSEMBLY));
92
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(MatAssemblyEnd(M,MAT_FINAL_ASSEMBLY));
93
94 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
95 Create the eigensolver and solve the problem
96 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
97
98
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(PEPCreate(PETSC_COMM_WORLD,&pep));
99 76 A[0] = K; A[1] = C; A[2] = M;
100
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(PEPSetOperators(pep,3,A));
101
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(PEPSetFromOptions(pep));
102
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(PEPSolve(pep));
103
104 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
105 Display solution and clean up
106 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
107
108 /* show detailed info unless -terse option is given by user */
109
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(PetscOptionsHasName(NULL,NULL,"-terse",&terse));
110
5/8
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
76 if (terse) PetscCall(PEPErrorView(pep,PEP_ERROR_BACKWARD,NULL));
111 else {
112 PetscCall(PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD,PETSC_VIEWER_ASCII_INFO_DETAIL));
113 PetscCall(PEPConvergedReasonView(pep,PETSC_VIEWER_STDOUT_WORLD));
114 PetscCall(PEPErrorView(pep,PEP_ERROR_BACKWARD,PETSC_VIEWER_STDOUT_WORLD));
115 PetscCall(PetscViewerPopFormat(PETSC_VIEWER_STDOUT_WORLD));
116 }
117
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(PEPDestroy(&pep));
118
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(MatDestroy(&M));
119
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(MatDestroy(&C));
120
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
76 PetscCall(MatDestroy(&K));
121
2/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
76 PetscCall(SlepcFinalize());
122 return 0;
123 }
124
125 /*TEST
126
127 testset:
128 args: -pep_nev 4 -n 24 -pep_ncv 18 -pep_target -.5 -st_type sinvert -pep_scale diagonal -terse
129 output_file: output/spring_1.out
130 filter: sed -e "s/[+-]0\.0*i//g"
131 test:
132 suffix: 1
133 args: -pep_type {{toar linear}} -pep_conv_norm
134 test:
135 suffix: 1_stoar
136 args: -pep_type stoar -pep_hermitian -pep_conv_rel
137 test:
138 suffix: 1_qarnoldi
139 args: -pep_type qarnoldi -pep_conv_rel
140 test:
141 suffix: 1_cuda
142 args: -mat_type aijcusparse
143 requires: cuda
144 test:
145 suffix: 1_hip
146 args: -mat_type aijhipsparse
147 requires: hip
148
149 test:
150 suffix: 2
151 args: -pep_type jd -pep_jd_minimality_index 1 -pep_nev 4 -n 24 -pep_ncv 18 -pep_target -50 -terse
152 requires: !single
153 filter: sed -e "s/[+-]0\.0*i//g"
154
155 test:
156 suffix: 3
157 args: -n 300 -pep_hermitian -pep_interval -10.1,-9.5 -pep_type stoar -st_type sinvert -st_pc_type cholesky -terse
158 filter: sed -e "s/52565/52566/" | sed -e "s/90758/90759/"
159 requires: !single
160
161 testset:
162 args: -n 300 -pep_hyperbolic -pep_interval -9.6,-.527 -pep_type stoar -st_type sinvert -terse
163 requires: !single
164 timeoutfactor: 2
165 output_file: output/spring_4.out
166 test:
167 suffix: 4
168 args: -st_pc_type cholesky
169 test:
170 suffix: 4_telescope
171 nsize: 2
172 args: -st_pc_type telescope -st_telescope_pc_type cholesky -st_telescope_mat_mumps_icntl_13 1
173 requires: mumps !complex
174
175 test:
176 suffix: 5
177 args: -n 300 -pep_hyperbolic -pep_interval -.506,-.3 -pep_type stoar -st_type sinvert -st_pc_type cholesky -pep_stoar_nev 11 -terse
178 requires: !single
179
180 test:
181 suffix: 6
182 args: -n 24 -pep_ncv 18 -pep_target -.5 -terse -pep_type jd -pep_jd_restart .6 -pep_jd_fix .001
183 requires: !single
184
185 TEST*/
186