GCC Code Coverage Report


Directory: ./
File: src/pep/tutorials/nlevp/acoustic_wave_1d.c
Date: 2026-02-22 03:58:10
Exec Total Coverage
Lines: 53 57 93.0%
Functions: 1 1 100.0%
Branches: 176 288 61.1%

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 acoustic_wave_1d problem is a QEP from an acoustics application.
19 Here we solve it with the eigenvalue scaled by the imaginary unit, to be
20 able to use real arithmetic, so the computed eigenvalues should be scaled
21 back.
22 */
23
24 static char help[] = "Quadratic eigenproblem from an acoustics application (1-D).\n\n"
25 "The command line options are:\n"
26 " -n <n>, where <n> = dimension of the matrices.\n"
27 " -z <z>, where <z> = impedance (default 1.0).\n\n";
28
29 #include <slepcpep.h>
30
31 88 int main(int argc,char **argv)
32 {
33 88 Mat M,C,K,A[3]; /* problem matrices */
34 88 PEP pep; /* polynomial eigenproblem solver context */
35 88 PetscInt n=10,Istart,Iend,i;
36 88 PetscScalar z=1.0;
37 88 char str[50];
38 88 PetscBool terse;
39
40
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
88 PetscFunctionBeginUser;
41
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.
88 PetscCall(SlepcInitialize(&argc,&argv,NULL,help));
42
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.
88 PetscCall(PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL));
44
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.
88 PetscCall(PetscOptionsGetScalar(NULL,NULL,"-z",&z,NULL));
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.
88 PetscCall(SlepcSNPrintfScalar(str,sizeof(str),z,PETSC_FALSE));
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.
88 PetscCall(PetscPrintf(PETSC_COMM_WORLD,"\nAcoustic wave 1-D, n=%" PetscInt_FMT " z=%s\n\n",n,str));
47
48 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
49 Compute the matrices that define the eigensystem, (k^2*M+k*C+K)x=0
50 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
51
52 /* K is a tridiagonal */
53
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.
88 PetscCall(MatCreate(PETSC_COMM_WORLD,&K));
54
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.
88 PetscCall(MatSetSizes(K,PETSC_DECIDE,PETSC_DECIDE,n,n));
55
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.
88 PetscCall(MatSetFromOptions(K));
56
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.
88 PetscCall(MatGetOwnershipRange(K,&Istart,&Iend));
58
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
2200 for (i=Istart;i<Iend;i++) {
59
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.
2112 if (i>0) PetscCall(MatSetValue(K,i,i-1,-1.0*n,INSERT_VALUES));
60
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
2112 if (i<n-1) {
61
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.
2024 PetscCall(MatSetValue(K,i,i,2.0*n,INSERT_VALUES));
62
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.
2024 PetscCall(MatSetValue(K,i,i+1,-1.0*n,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.
2112 } else PetscCall(MatSetValue(K,i,i,1.0*n,INSERT_VALUES));
64 }
65
66
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.
88 PetscCall(MatAssemblyBegin(K,MAT_FINAL_ASSEMBLY));
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.
88 PetscCall(MatAssemblyEnd(K,MAT_FINAL_ASSEMBLY));
68
69 /* C is the zero matrix but one element*/
70
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.
88 PetscCall(MatCreate(PETSC_COMM_WORLD,&C));
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.
88 PetscCall(MatSetSizes(C,PETSC_DECIDE,PETSC_DECIDE,n,n));
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.
88 PetscCall(MatSetFromOptions(C));
73
74
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.
88 PetscCall(MatGetOwnershipRange(C,&Istart,&Iend));
75
6/10
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 6 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
88 if (n-1>=Istart && n-1<Iend) PetscCall(MatSetValue(C,n-1,n-1,-2*PETSC_PI/z,INSERT_VALUES));
76
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.
88 PetscCall(MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY));
77
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.
88 PetscCall(MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY));
78
79 /* M is a diagonal matrix */
80
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.
88 PetscCall(MatCreate(PETSC_COMM_WORLD,&M));
81
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.
88 PetscCall(MatSetSizes(M,PETSC_DECIDE,PETSC_DECIDE,n,n));
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.
88 PetscCall(MatSetFromOptions(M));
83
84
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.
88 PetscCall(MatGetOwnershipRange(M,&Istart,&Iend));
85
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
2200 for (i=Istart;i<Iend;i++) {
86
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.
2112 if (i<n-1) PetscCall(MatSetValue(M,i,i,4*PETSC_PI*PETSC_PI/n,INSERT_VALUES));
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.
2112 else PetscCall(MatSetValue(M,i,i,2*PETSC_PI*PETSC_PI/n,INSERT_VALUES));
88 }
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.
88 PetscCall(MatAssemblyBegin(M,MAT_FINAL_ASSEMBLY));
90
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.
88 PetscCall(MatAssemblyEnd(M,MAT_FINAL_ASSEMBLY));
91
92 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
93 Create the eigensolver and solve the problem
94 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
95
96
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.
88 PetscCall(PEPCreate(PETSC_COMM_WORLD,&pep));
97 88 A[0] = K; A[1] = C; A[2] = M;
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.
88 PetscCall(PEPSetOperators(pep,3,A));
99
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.
88 PetscCall(PEPSetFromOptions(pep));
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.
88 PetscCall(PEPSolve(pep));
101
102 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
103 Display solution and clean up
104 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
105
106 /* show detailed info unless -terse option is given by user */
107
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.
88 PetscCall(PetscOptionsHasName(NULL,NULL,"-terse",&terse));
108
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.
88 if (terse) PetscCall(PEPErrorView(pep,PEP_ERROR_BACKWARD,NULL));
109 else {
110 PetscCall(PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD,PETSC_VIEWER_ASCII_INFO_DETAIL));
111 PetscCall(PEPConvergedReasonView(pep,PETSC_VIEWER_STDOUT_WORLD));
112 PetscCall(PEPErrorView(pep,PEP_ERROR_BACKWARD,PETSC_VIEWER_STDOUT_WORLD));
113 PetscCall(PetscViewerPopFormat(PETSC_VIEWER_STDOUT_WORLD));
114 }
115
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.
88 PetscCall(PEPDestroy(&pep));
116
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.
88 PetscCall(MatDestroy(&M));
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.
88 PetscCall(MatDestroy(&C));
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.
88 PetscCall(MatDestroy(&K));
119
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.
88 PetscCall(SlepcFinalize());
120 return 0;
121 }
122
123 /*TEST
124
125 testset:
126 args: -pep_nev 4 -pep_tol 1e-7 -n 24 -terse
127 output_file: output/acoustic_wave_1d_1.out
128 requires: !single
129 test:
130 suffix: 1
131 args: -st_type sinvert -st_transform -pep_type {{toar qarnoldi linear}}
132 test:
133 suffix: 1_stoar
134 args: -st_type sinvert -st_transform -pep_type stoar -pep_hermitian -pep_stoar_locking 0 -pep_stoar_nev 11 -pep_ncv 10
135 test:
136 suffix: 2
137 args: -st_type sinvert -st_transform -pep_type toar -pep_extract {{none norm residual}}
138 test:
139 suffix: 3
140 args: -st_type sinvert -pep_type linear -pep_extract {{none norm residual}}
141 test:
142 suffix: 4
143 args: -pep_type jd
144
145 TEST*/
146