GCC Code Coverage Report


Directory: ./
File: src/eps/tutorials/ex10.c
Date: 2025-10-03 04:28:47
Exec Total Coverage
Lines: 101 105 96.2%
Functions: 8 8 100.0%
Branches: 291 490 59.4%

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 the use of shell spectral transformations.\n\n"
12 "The problem to be solved is the same as ex1.c and"
13 "corresponds to the Laplacian operator in 1 dimension.\n\n"
14 "The command line options are:\n"
15 " -n <n>, where <n> = number of grid subdivisions = matrix dimension.\n\n";
16
17 #include <slepceps.h>
18
19 /* Define context for user-provided spectral transformation */
20 typedef struct {
21 KSP ksp;
22 } SampleShellST;
23
24 /* Declare routines for user-provided spectral transformation */
25 PetscErrorCode STCreate_User(SampleShellST**);
26 PetscErrorCode STSetUp_User(SampleShellST*,ST);
27 PetscErrorCode STApply_User(ST,Vec,Vec);
28 PetscErrorCode STApplyTranspose_User(ST,Vec,Vec);
29 #if defined(PETSC_USE_COMPLEX)
30 PetscErrorCode STApplyHermitianTranspose_User(ST,Vec,Vec);
31 #endif
32 PetscErrorCode STBackTransform_User(ST,PetscInt,PetscScalar*,PetscScalar*);
33 PetscErrorCode STDestroy_User(SampleShellST*);
34
35 60 int main (int argc,char **argv)
36 {
37 60 Mat A; /* operator matrix */
38 60 EPS eps; /* eigenproblem solver context */
39 60 ST st; /* spectral transformation context */
40 60 SampleShellST *shell; /* user-defined spectral transform context */
41 60 EPSType type;
42 60 PetscInt n=30,i,Istart,Iend,nev;
43 60 PetscBool isShell,terse;
44 60 PetscBool set_ht=PETSC_FALSE;
45
46
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
60 PetscFunctionBeginUser;
47
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.
60 PetscCall(SlepcInitialize(&argc,&argv,NULL,help));
48
49
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.
60 PetscCall(PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL));
50
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.
60 PetscCall(PetscPrintf(PETSC_COMM_WORLD,"\n1-D Laplacian Eigenproblem (shell-enabled), n=%" PetscInt_FMT "\n\n",n));
51
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.
60 PetscCall(PetscOptionsGetBool(NULL,NULL,"-set_ht",&set_ht,NULL));
52
53 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
54 Compute the operator matrix that defines the eigensystem, Ax=kx
55 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
56
57
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.
60 PetscCall(MatCreate(PETSC_COMM_WORLD,&A));
58
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.
60 PetscCall(MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,n,n));
59
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.
60 PetscCall(MatSetFromOptions(A));
60
61
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.
60 PetscCall(MatGetOwnershipRange(A,&Istart,&Iend));
62
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1860 for (i=Istart;i<Iend;i++) {
63
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.
1800 if (i>0) PetscCall(MatSetValue(A,i,i-1,-1.0,INSERT_VALUES));
64
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.
1800 if (i<n-1) PetscCall(MatSetValue(A,i,i+1,-1.0,INSERT_VALUES));
65
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.
1800 PetscCall(MatSetValue(A,i,i,2.0,INSERT_VALUES));
66 }
67
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.
60 PetscCall(MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY));
68
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.
60 PetscCall(MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY));
69
70 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
71 Create the eigensolver and set various options
72 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
73
74 /*
75 Create eigensolver context
76 */
77
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.
60 PetscCall(EPSCreate(PETSC_COMM_WORLD,&eps));
78
79 /*
80 Set operators. In this case, it is a standard eigenvalue problem
81 */
82
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.
60 PetscCall(EPSSetOperators(eps,A,NULL));
83
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.
60 PetscCall(EPSSetProblemType(eps,EPS_HEP));
84
85 /*
86 Set solver parameters at runtime
87 */
88
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.
60 PetscCall(EPSSetFromOptions(eps));
89
90 /*
91 Initialize shell spectral transformation if selected by user
92 */
93
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.
60 PetscCall(EPSGetST(eps,&st));
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.
60 PetscCall(PetscObjectTypeCompare((PetscObject)st,STSHELL,&isShell));
95
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
60 if (isShell) {
96 /* Change sorting criterion since this ST example computes values
97 closest to 0 */
98
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.
30 PetscCall(EPSSetWhichEigenpairs(eps,EPS_SMALLEST_REAL));
99
100 /* (Required) Create a context for the user-defined spectral transform;
101 this context can be defined to contain any application-specific data. */
102
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.
30 PetscCall(STCreate_User(&shell));
103
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.
30 PetscCall(STShellSetContext(st,shell));
104
105 /* (Required) Set the user-defined routine for applying the operator */
106
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.
30 PetscCall(STShellSetApply(st,STApply_User));
107
108 /* (Optional) Set the user-defined routine for applying the transposed operator */
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.
30 PetscCall(STShellSetApplyTranspose(st,STApplyTranspose_User));
110
111 /* (Optional) Set the user-defined routine for applying the conjugate-transposed operator */
112 #if defined(PETSC_USE_COMPLEX)
113
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✓ 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.
15 if (set_ht) PetscCall(STShellSetApplyHermitianTranspose(st,STApplyHermitianTranspose_User));
114 #endif
115
116 /* (Optional) Set the user-defined routine for back-transformation */
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.
30 PetscCall(STShellSetBackTransform(st,STBackTransform_User));
118
119 /* (Optional) Set a name for the transformation, used for STView() */
120
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.
30 PetscCall(PetscObjectSetName((PetscObject)st,"MyTransformation"));
121
122 /* (Optional) Do any setup required for the new transformation */
123
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.
30 PetscCall(STSetUp_User(shell,st));
124 }
125
126 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
127 Solve the eigensystem
128 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
129
130
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.
60 PetscCall(EPSSolve(eps));
131
132 /*
133 Optional: Get some information from the solver and display it
134 */
135
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.
60 PetscCall(EPSGetType(eps,&type));
136
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.
60 PetscCall(PetscPrintf(PETSC_COMM_WORLD," Solution method: %s\n\n",type));
137
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.
60 PetscCall(EPSGetDimensions(eps,&nev,NULL,NULL));
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.
60 PetscCall(PetscPrintf(PETSC_COMM_WORLD," Number of requested eigenvalues: %" PetscInt_FMT "\n",nev));
139
140 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
141 Display solution and clean up
142 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
143
144 /* show detailed info unless -terse option is given by user */
145
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.
60 PetscCall(PetscOptionsHasName(NULL,NULL,"-terse",&terse));
146
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.
60 if (terse) PetscCall(EPSErrorView(eps,EPS_ERROR_RELATIVE,NULL));
147 else {
148 PetscCall(PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD,PETSC_VIEWER_ASCII_INFO_DETAIL));
149 PetscCall(EPSConvergedReasonView(eps,PETSC_VIEWER_STDOUT_WORLD));
150 PetscCall(EPSErrorView(eps,EPS_ERROR_RELATIVE,PETSC_VIEWER_STDOUT_WORLD));
151 PetscCall(PetscViewerPopFormat(PETSC_VIEWER_STDOUT_WORLD));
152 }
153
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.
60 if (isShell) PetscCall(STDestroy_User(shell));
154
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.
60 PetscCall(EPSDestroy(&eps));
155
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.
60 PetscCall(MatDestroy(&A));
156
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.
60 PetscCall(SlepcFinalize());
157 return 0;
158 }
159
160 /***********************************************************************/
161 /* Routines for a user-defined shell spectral transformation */
162 /***********************************************************************/
163
164 /*
165 STCreate_User - This routine creates a user-defined
166 spectral transformation context.
167
168 Output Parameter:
169 . shell - user-defined spectral transformation context
170 */
171 30 PetscErrorCode STCreate_User(SampleShellST **shell)
172 {
173 30 SampleShellST *newctx;
174
175
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
30 PetscFunctionBeginUser;
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.
30 PetscCall(PetscNew(&newctx));
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.
30 PetscCall(KSPCreate(PETSC_COMM_WORLD,&newctx->ksp));
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.
30 PetscCall(KSPAppendOptionsPrefix(newctx->ksp,"st_"));
179 30 *shell = newctx;
180
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.
30 PetscFunctionReturn(PETSC_SUCCESS);
181 }
182 /* ------------------------------------------------------------------- */
183 /*
184 STSetUp_User - This routine sets up a user-defined
185 spectral transformation context.
186
187 Input Parameters:
188 + shell - user-defined spectral transformation context
189 - st - spectral transformation context containing the operator matrices
190
191 Output Parameter:
192 . shell - fully set up user-defined transformation context
193
194 Notes:
195 In this example, the user-defined transformation is simply OP=A^-1.
196 Therefore, the eigenpairs converge in reversed order. The KSP object
197 used for the solution of linear systems with A is handled via the
198 user-defined context SampleShellST.
199 */
200 30 PetscErrorCode STSetUp_User(SampleShellST *shell,ST st)
201 {
202 30 Mat A;
203
204
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
30 PetscFunctionBeginUser;
205
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.
30 PetscCall(STGetMatrix(st,0,&A));
206
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.
30 PetscCall(KSPSetOperators(shell->ksp,A,A));
207
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.
30 PetscCall(KSPSetFromOptions(shell->ksp));
208
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.
6 PetscFunctionReturn(PETSC_SUCCESS);
209 }
210 /* ------------------------------------------------------------------- */
211 /*
212 STApply_User - This routine demonstrates the use of a
213 user-provided spectral transformation.
214
215 Input Parameters:
216 + st - spectral transformation context
217 - x - input vector
218
219 Output Parameter:
220 . y - output vector
221
222 Notes:
223 The transformation implemented in this code is just OP=A^-1 and
224 therefore it is of little use, merely as an example of working with
225 a STSHELL.
226 */
227 700 PetscErrorCode STApply_User(ST st,Vec x,Vec y)
228 {
229 700 SampleShellST *shell;
230
231
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
700 PetscFunctionBeginUser;
232
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.
700 PetscCall(STShellGetContext(st,&shell));
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.
700 PetscCall(KSPSolve(shell->ksp,x,y));
234
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.
140 PetscFunctionReturn(PETSC_SUCCESS);
235 }
236 /* ------------------------------------------------------------------- */
237 /*
238 STApplyTranspose_User - This is not required unless using a two-sided
239 eigensolver.
240
241 Input Parameters:
242 + st - spectral transformation context
243 - x - input vector
244
245 Output Parameter:
246 . y - output vector
247 */
248 75 PetscErrorCode STApplyTranspose_User(ST st,Vec x,Vec y)
249 {
250 75 SampleShellST *shell;
251
252
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
75 PetscFunctionBeginUser;
253
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.
75 PetscCall(STShellGetContext(st,&shell));
254
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.
75 PetscCall(KSPSolveTranspose(shell->ksp,x,y));
255
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.
15 PetscFunctionReturn(PETSC_SUCCESS);
256 }
257 #if defined(PETSC_USE_COMPLEX)
258 /* ------------------------------------------------------------------- */
259 /*
260 STApplyHermitianTranspose_User - This is not required unless using a two-sided
261 eigensolver in complex scalars.
262
263 Input Parameters:
264 + st - spectral transformation context
265 - x - input vector
266
267 Output Parameter:
268 . y - output vector
269 */
270 25 PetscErrorCode STApplyHermitianTranspose_User(ST st,Vec x,Vec y)
271 {
272 25 SampleShellST *shell;
273 25 Vec w;
274
275
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
25 PetscFunctionBeginUser;
276
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.
25 PetscCall(STShellGetContext(st,&shell));
277
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.
25 PetscCall(VecDuplicate(x,&w));
278
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.
25 PetscCall(VecCopy(x,w));
279
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.
25 PetscCall(VecConjugate(w));
280
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.
25 PetscCall(KSPSolveTranspose(shell->ksp,w,y));
281
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.
25 PetscCall(VecConjugate(y));
282
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.
25 PetscCall(VecDestroy(&w));
283
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.
5 PetscFunctionReturn(PETSC_SUCCESS);
284 }
285 #endif
286 /* ------------------------------------------------------------------- */
287 /*
288 STBackTransform_User - This routine demonstrates the use of a
289 user-provided spectral transformation.
290
291 Input Parameters:
292 + st - spectral transformation context
293 - n - number of eigenvalues to transform
294
295 Input/Output Parameters:
296 + eigr - pointer to real part of eigenvalues
297 - eigi - pointer to imaginary part of eigenvalues
298
299 Notes:
300 This code implements the back transformation of eigenvalues in
301 order to retrieve the eigenvalues of the original problem. In this
302 example, simply set k_i = 1/k_i.
303 */
304 5730 PetscErrorCode STBackTransform_User(ST st,PetscInt n,PetscScalar *eigr,PetscScalar *eigi)
305 {
306 5730 PetscInt j;
307
308
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
5730 PetscFunctionBeginUser;
309
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
17340 for (j=0;j<n;j++) {
310 11610 eigr[j] = 1.0 / eigr[j];
311 }
312
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.
5730 PetscFunctionReturn(PETSC_SUCCESS);
313 }
314 /* ------------------------------------------------------------------- */
315 /*
316 STDestroy_User - This routine destroys a user-defined
317 spectral transformation context.
318
319 Input Parameter:
320 . shell - user-defined spectral transformation context
321 */
322 30 PetscErrorCode STDestroy_User(SampleShellST *shell)
323 {
324
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
30 PetscFunctionBeginUser;
325
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.
30 PetscCall(KSPDestroy(&shell->ksp));
326
6/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
30 PetscCall(PetscFree(shell));
327
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.
6 PetscFunctionReturn(PETSC_SUCCESS);
328 }
329
330 /*TEST
331
332 testset:
333 args: -eps_nev 5 -eps_non_hermitian -terse
334 output_file: output/ex10_1.out
335 test:
336 suffix: 1_sinvert
337 args: -st_type sinvert
338 requires: !single
339 test:
340 suffix: 1_sinvert_twoside
341 args: -st_type sinvert -eps_balance twoside -set_ht {{0 1}}
342 requires: !single
343 test:
344 suffix: 1_shell
345 args: -st_type shell
346 requires: !single
347 test:
348 suffix: 1_shell_twoside
349 args: -st_type shell -eps_balance twoside -set_ht {{0 1}}
350
351 TEST*/
352