GCC Code Coverage Report


Directory: ./
File: src/eps/tutorials/ex19.c
Date: 2025-10-04 04:19:13
Exec Total Coverage
Lines: 122 122 100.0%
Functions: 3 3 100.0%
Branches: 290 446 65.0%

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[] = "Standard symmetric eigenproblem for the 3-D Laplacian built with the DM interface.\n\n"
12 "Use -seed <k> to modify the random initial vector.\n"
13 "Use -da_grid_x <nx> etc. to change the problem size.\n\n";
14
15 #include <slepceps.h>
16 #include <petscdmda.h>
17 #include <petsctime.h>
18
19 10 PetscErrorCode GetExactEigenvalues(PetscInt M,PetscInt N,PetscInt P,PetscInt nconv,PetscReal *exact)
20 {
21 10 PetscInt n,i,j,k,l;
22 10 PetscReal *evals,ax,ay,az,sx,sy,sz;
23
24
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
10 PetscFunctionBeginUser;
25 10 ax = PETSC_PI/2/(M+1);
26 10 ay = PETSC_PI/2/(N+1);
27 10 az = PETSC_PI/2/(P+1);
28 10 n = PetscCeilReal(PetscPowReal((PetscReal)nconv,0.33333)+1);
29
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.
10 PetscCall(PetscMalloc1(n*n*n,&evals));
30 l = 0;
31
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
40 for (i=1;i<=n;i++) {
32 30 sx = PetscSinReal(ax*i);
33
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
120 for (j=1;j<=n;j++) {
34 90 sy = PetscSinReal(ay*j);
35
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
360 for (k=1;k<=n;k++) {
36 270 sz = PetscSinReal(az*k);
37 270 evals[l++] = 4.0*(sx*sx+sy*sy+sz*sz);
38 }
39 }
40 }
41
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.
10 PetscCall(PetscSortReal(n*n*n,evals));
42
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
50 for (i=0;i<nconv;i++) exact[i] = evals[i];
43
5/8
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
10 PetscCall(PetscFree(evals));
44
5/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 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
2 PetscFunctionReturn(PETSC_SUCCESS);
45 }
46
47 36 PetscErrorCode FillMatrix(DM da,Mat A)
48 {
49 36 PetscInt i,j,k,mx,my,mz,xm,ym,zm,xs,ys,zs,idx;
50 36 PetscScalar v[7];
51 36 MatStencil row,col[7];
52
53
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
36 PetscFunctionBeginUser;
54
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.
36 PetscCall(DMDAGetInfo(da,0,&mx,&my,&mz,0,0,0,0,0,0,0,0,0));
55
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.
36 PetscCall(DMDAGetCorners(da,&xs,&ys,&zs,&xm,&ym,&zm));
56
57
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
416 for (k=zs;k<zs+zm;k++) {
58
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4300 for (j=ys;j<ys+ym;j++) {
59
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
43120 for (i=xs;i<xs+xm;i++) {
60 39200 row.i=i; row.j=j; row.k=k;
61 39200 col[0].i=row.i; col[0].j=row.j; col[0].k=row.k;
62 39200 v[0]=6.0;
63 39200 idx=1;
64
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
39200 if (k>0) { v[idx]=-1.0; col[idx].i=i; col[idx].j=j; col[idx].k=k-1; idx++; }
65
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
39200 if (j>0) { v[idx]=-1.0; col[idx].i=i; col[idx].j=j-1; col[idx].k=k; idx++; }
66
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
39200 if (i>0) { v[idx]=-1.0; col[idx].i=i-1; col[idx].j=j; col[idx].k=k; idx++; }
67
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
39200 if (i<mx-1) { v[idx]=-1.0; col[idx].i=i+1; col[idx].j=j; col[idx].k=k; idx++; }
68
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
39200 if (j<my-1) { v[idx]=-1.0; col[idx].i=i; col[idx].j=j+1; col[idx].k=k; idx++; }
69
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
39200 if (k<mz-1) { v[idx]=-1.0; col[idx].i=i; col[idx].j=j; col[idx].k=k+1; idx++; }
70
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.
39200 PetscCall(MatSetValuesStencil(A,1,&row,idx,col,v,INSERT_VALUES));
71 }
72 }
73 }
74
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.
36 PetscCall(MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY));
75
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.
36 PetscCall(MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY));
76
5/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 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
8 PetscFunctionReturn(PETSC_SUCCESS);
77 }
78
79 36 int main(int argc,char **argv)
80 {
81 36 Mat A; /* operator matrix */
82 36 EPS eps; /* eigenproblem solver context */
83 36 EPSType type;
84 36 DM da;
85 36 Vec v0;
86 36 PetscReal error,tol,re,im,*exact;
87 36 PetscScalar kr,ki;
88 36 PetscInt M,N,P,m,n,p,nev,maxit,i,its,nconv,seed;
89 36 PetscLogDouble t1,t2,t3;
90 36 PetscBool flg,terse;
91 36 PetscRandom rctx;
92
93
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
36 PetscFunctionBeginUser;
94
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.
36 PetscCall(SlepcInitialize(&argc,&argv,NULL,help));
95
96
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.
36 PetscCall(PetscPrintf(PETSC_COMM_WORLD,"\n3-D Laplacian Eigenproblem\n\n"));
97
98 /* show detailed info unless -terse option is given by user */
99
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.
36 PetscCall(PetscOptionsHasName(NULL,NULL,"-terse",&terse));
100
101 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
102 Compute the operator matrix that defines the eigensystem, Ax=kx
103 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
104
105
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.
36 PetscCall(DMDACreate3d(PETSC_COMM_WORLD,DM_BOUNDARY_NONE,DM_BOUNDARY_NONE,
106 DM_BOUNDARY_NONE,DMDA_STENCIL_STAR,10,10,10,
107 PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE,
108 1,1,NULL,NULL,NULL,&da));
109
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.
36 PetscCall(DMSetFromOptions(da));
110
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.
36 PetscCall(DMSetUp(da));
111
112 /* print DM information */
113
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.
36 PetscCall(DMDAGetInfo(da,NULL,&M,&N,&P,&m,&n,&p,NULL,NULL,NULL,NULL,NULL,NULL));
114
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.
36 PetscCall(PetscPrintf(PETSC_COMM_WORLD," Grid partitioning: %" PetscInt_FMT " %" PetscInt_FMT " %" PetscInt_FMT "\n",m,n,p));
115
116 /* create and fill the matrix */
117
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.
36 PetscCall(DMCreateMatrix(da,&A));
118
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.
36 PetscCall(FillMatrix(da,A));
119
120 /* create random initial vector */
121 36 seed = 1;
122
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.
36 PetscCall(PetscOptionsGetInt(NULL,NULL,"-seed",&seed,NULL));
123
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
36 PetscCheck(seed>=0,PETSC_COMM_WORLD,PETSC_ERR_USER_INPUT,"Seed must be >=0");
124
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.
36 PetscCall(MatCreateVecs(A,&v0,NULL));
125
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.
36 PetscCall(PetscRandomCreate(PETSC_COMM_WORLD,&rctx));
126
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.
36 PetscCall(PetscRandomSetFromOptions(rctx));
127
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
72 for (i=0;i<seed;i++) { /* simulate different seeds in the random generator */
128
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.
36 PetscCall(VecSetRandom(v0,rctx));
129 }
130
131 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
132 Create the eigensolver and set various options
133 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
134
135 /*
136 Create eigensolver context
137 */
138
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.
36 PetscCall(EPSCreate(PETSC_COMM_WORLD,&eps));
139
140 /*
141 Set operators. In this case, it is a standard eigenvalue problem
142 */
143
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.
36 PetscCall(EPSSetOperators(eps,A,NULL));
144
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.
36 PetscCall(EPSSetProblemType(eps,EPS_HEP));
145
146 /*
147 Set specific solver options
148 */
149
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.
36 PetscCall(EPSSetWhichEigenpairs(eps,EPS_SMALLEST_REAL));
150
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.
36 PetscCall(EPSSetTolerances(eps,1e-8,PETSC_CURRENT));
151
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.
36 PetscCall(EPSSetInitialSpace(eps,1,&v0));
152
153 /*
154 Set solver parameters at runtime
155 */
156
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.
36 PetscCall(EPSSetFromOptions(eps));
157
158 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
159 Solve the eigensystem
160 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
161
162
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
36 PetscCall(PetscTime(&t1));
163
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.
36 PetscCall(EPSSetUp(eps));
164
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
36 PetscCall(PetscTime(&t2));
165
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.
36 PetscCall(EPSSolve(eps));
166
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
36 PetscCall(PetscTime(&t3));
167
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
36 if (!terse) {
168
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.
10 PetscCall(EPSGetIterationNumber(eps,&its));
169
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.
10 PetscCall(PetscPrintf(PETSC_COMM_WORLD," Number of iterations of the method: %" PetscInt_FMT "\n",its));
170
171 /*
172 Optional: Get some information from the solver and display it
173 */
174
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.
10 PetscCall(EPSGetType(eps,&type));
175
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.
10 PetscCall(PetscPrintf(PETSC_COMM_WORLD," Solution method: %s\n\n",type));
176
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.
10 PetscCall(EPSGetDimensions(eps,&nev,NULL,NULL));
177
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.
10 PetscCall(PetscPrintf(PETSC_COMM_WORLD," Number of requested eigenvalues: %" PetscInt_FMT "\n",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.
10 PetscCall(EPSGetTolerances(eps,&tol,&maxit));
179
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.
10 PetscCall(PetscPrintf(PETSC_COMM_WORLD," Stopping condition: tol=%.4g, maxit=%" PetscInt_FMT "\n",(double)tol,maxit));
180 }
181
182 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
183 Display solution and clean up
184 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
185
186
6/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
36 if (terse) PetscCall(EPSErrorView(eps,EPS_ERROR_RELATIVE,NULL));
187 else {
188 /*
189 Get number of converged approximate eigenpairs
190 */
191
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.
10 PetscCall(EPSGetConverged(eps,&nconv));
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.
10 PetscCall(PetscPrintf(PETSC_COMM_WORLD," Number of converged approximate eigenpairs: %" PetscInt_FMT "\n\n",nconv));
193
194
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10 if (nconv>0) {
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.
10 PetscCall(PetscMalloc1(nconv,&exact));
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.
10 PetscCall(GetExactEigenvalues(M,N,P,nconv,exact));
197 /*
198 Display eigenvalues and relative errors
199 */
200
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.
10 PetscCall(PetscPrintf(PETSC_COMM_WORLD,
201 " k ||Ax-kx||/||kx|| Eigenvalue Error \n"
202 " ----------------- ------------------ ------------------\n"));
203
204
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
50 for (i=0;i<nconv;i++) {
205 /*
206 Get converged eigenpairs: i-th eigenvalue is stored in kr (real part) and
207 ki (imaginary part)
208 */
209
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.
40 PetscCall(EPSGetEigenpair(eps,i,&kr,&ki,NULL,NULL));
210 /*
211 Compute the relative error associated to each eigenpair
212 */
213
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.
40 PetscCall(EPSComputeError(eps,i,EPS_ERROR_RELATIVE,&error));
214
215 #if defined(PETSC_USE_COMPLEX)
216 20 re = PetscRealPart(kr);
217 20 im = PetscImaginaryPart(kr);
218 #else
219 20 re = kr;
220 20 im = ki;
221 #endif
222
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
40 PetscCheck(im==0.0,PETSC_COMM_WORLD,PETSC_ERR_PLIB,"Eigenvalue should be real");
223
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.
40 PetscCall(PetscPrintf(PETSC_COMM_WORLD," %12g %12g %12g\n",(double)re,(double)error,(double)PetscAbsReal(re-exact[i])));
224 }
225
5/8
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
10 PetscCall(PetscFree(exact));
226
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.
10 PetscCall(PetscPrintf(PETSC_COMM_WORLD,"\n"));
227 }
228 }
229
230 /*
231 Show computing times
232 */
233
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.
36 PetscCall(PetscOptionsHasName(NULL,NULL,"-showtimes",&flg));
234
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
36 if (flg) PetscCall(PetscPrintf(PETSC_COMM_WORLD," Elapsed time: %g (setup), %g (solve)\n",(double)(t2-t1),(double)(t3-t2)));
235
236 /*
237 Free work space
238 */
239
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.
36 PetscCall(EPSDestroy(&eps));
240
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.
36 PetscCall(MatDestroy(&A));
241
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.
36 PetscCall(VecDestroy(&v0));
242
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.
36 PetscCall(PetscRandomDestroy(&rctx));
243
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.
36 PetscCall(DMDestroy(&da));
244
3/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
36 PetscCall(SlepcFinalize());
245 return 0;
246 }
247
248 /*TEST
249
250 testset:
251 args: -eps_nev 8 -terse
252 requires: double
253 output_file: output/ex19_1.out
254 test:
255 suffix: 1_krylovschur
256 args: -eps_type krylovschur -eps_ncv 64
257 test:
258 suffix: 1_lobpcg
259 args: -eps_type lobpcg -eps_tol 1e-7
260 test:
261 suffix: 1_blopex
262 args: -eps_type blopex -eps_tol 1e-7 -eps_blopex_blocksize 4 -st_ksp_type preonly
263 requires: blopex
264
265 test:
266 args: -eps_nev 4 -da_grid_x 10 -da_grid_y 11 -da_grid_z 12
267 requires: !single
268 filter: grep -v method | grep -v Stopping | sed -e "s/[+-]0\.0*i//g" | sed -e "s/[0-9]\.[0-9]*e[+-]\([0-9]*\)/removed/g"
269 suffix: 2
270
271 TEST*/
272