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 |