GCC Code Coverage Report


Directory: ./
File: src/nep/tutorials/ex21.c
Date: 2025-10-04 04:19:13
Exec Total Coverage
Lines: 172 191 90.1%
Functions: 9 10 90.0%
Branches: 434 792 54.8%

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[] = "Simple 1-D nonlinear eigenproblem (matrix-free version).\n\n"
12 "The command line options are:\n"
13 " -n <n>, where <n> = number of grid subdivisions\n\n";
14
15 /*
16 Solve 1-D PDE
17 -u'' = lambda*u
18 on [0,1] subject to
19 u(0)=0, u'(1)=u(1)*lambda*kappa/(kappa-lambda)
20 */
21
22 #include <slepcnep.h>
23
24 /*
25 User-defined routines
26 */
27 PetscErrorCode FormFunction(NEP,PetscScalar,Mat,Mat,void*);
28 PetscErrorCode FormJacobian(NEP,PetscScalar,Mat,void*);
29
30 /*
31 Matrix operations and context
32 */
33 PetscErrorCode MatMult_Fun(Mat,Vec,Vec);
34 PetscErrorCode MatGetDiagonal_Fun(Mat,Vec);
35 PetscErrorCode MatDestroy_Fun(Mat);
36 PetscErrorCode MatDuplicate_Fun(Mat,MatDuplicateOption,Mat*);
37 PetscErrorCode MatMult_Jac(Mat,Vec,Vec);
38 PetscErrorCode MatGetDiagonal_Jac(Mat,Vec);
39 PetscErrorCode MatDestroy_Jac(Mat);
40
41 typedef struct {
42 PetscScalar lambda,kappa;
43 PetscReal h;
44 PetscMPIInt next,prev;
45 } MatCtx;
46
47 /*
48 User-defined application context
49 */
50 typedef struct {
51 PetscScalar kappa; /* ratio between stiffness of spring and attached mass */
52 PetscReal h; /* mesh spacing */
53 } ApplicationCtx;
54
55 60 int main(int argc,char **argv)
56 {
57 60 NEP nep; /* nonlinear eigensolver context */
58 60 Mat F,J; /* Function and Jacobian matrices */
59 60 ApplicationCtx ctx; /* user-defined context */
60 60 MatCtx *ctxF,*ctxJ; /* contexts for shell matrices */
61 60 PetscInt n=128,nev;
62 60 KSP ksp;
63 60 PC pc;
64 60 PetscMPIInt rank,size;
65 60 PetscBool terse;
66
67
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
60 PetscFunctionBeginUser;
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(SlepcInitialize(&argc,&argv,NULL,help));
69
14/28
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
60 PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD,&size));
70
14/28
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
60 PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD,&rank));
71
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));
72
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 Nonlinear Eigenproblem, n=%" PetscInt_FMT "\n\n",n));
73 60 ctx.h = 1.0/(PetscReal)n;
74 60 ctx.kappa = 1.0;
75
76 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
77 Create nonlinear eigensolver context
78 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
79
80
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(NEPCreate(PETSC_COMM_WORLD,&nep));
81
82 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
83 Create matrix data structure; set Function evaluation routine
84 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
85
86
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(PetscNew(&ctxF));
87 60 ctxF->h = ctx.h;
88 60 ctxF->kappa = ctx.kappa;
89
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
60 ctxF->next = rank==size-1? MPI_PROC_NULL: rank+1;
90
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
60 ctxF->prev = rank==0? MPI_PROC_NULL: rank-1;
91
92
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(MatCreateShell(PETSC_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE,n,n,(void*)ctxF,&F));
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(MatShellSetOperation(F,MATOP_MULT,(PetscErrorCodeFn*)MatMult_Fun));
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(MatShellSetOperation(F,MATOP_GET_DIAGONAL,(PetscErrorCodeFn*)MatGetDiagonal_Fun));
95
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(MatShellSetOperation(F,MATOP_DESTROY,(PetscErrorCodeFn*)MatDestroy_Fun));
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.
60 PetscCall(MatShellSetOperation(F,MATOP_DUPLICATE,(PetscErrorCodeFn*)MatDuplicate_Fun));
97
98 /*
99 Set Function matrix data structure and default Function evaluation
100 routine
101 */
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.
60 PetscCall(NEPSetFunction(nep,F,F,FormFunction,NULL));
103
104 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
105 Create matrix data structure; set Jacobian evaluation routine
106 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
107
108
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(PetscNew(&ctxJ));
109 60 ctxJ->h = ctx.h;
110 60 ctxJ->kappa = ctx.kappa;
111
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
60 ctxJ->next = rank==size-1? MPI_PROC_NULL: rank+1;
112
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
60 ctxJ->prev = rank==0? MPI_PROC_NULL: rank-1;
113
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.
60 PetscCall(MatCreateShell(PETSC_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE,n,n,(void*)ctxJ,&J));
115
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(MatShellSetOperation(J,MATOP_MULT,(PetscErrorCodeFn*)MatMult_Jac));
116
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(MatShellSetOperation(J,MATOP_GET_DIAGONAL,(PetscErrorCodeFn*)MatGetDiagonal_Jac));
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.
60 PetscCall(MatShellSetOperation(J,MATOP_DESTROY,(PetscErrorCodeFn*)MatDestroy_Jac));
118
119 /*
120 Set Jacobian matrix data structure and default Jacobian evaluation
121 routine
122 */
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.
60 PetscCall(NEPSetJacobian(nep,J,FormJacobian,NULL));
124
125 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
126 Customize nonlinear solver; set runtime options
127 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
128
129
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(NEPSetType(nep,NEPRII));
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(NEPRIISetLagPreconditioner(nep,0));
131
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(NEPRIIGetKSP(nep,&ksp));
132
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(KSPSetType(ksp,KSPBCGS));
133
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(KSPGetPC(ksp,&pc));
134
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(PCSetType(pc,PCJACOBI));
135
136 /*
137 Set solver parameters at runtime
138 */
139
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(NEPSetFromOptions(nep));
140
141 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
142 Solve the eigensystem
143 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
144
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(NEPSolve(nep));
146
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(NEPGetDimensions(nep,&nev,NULL,NULL));
147
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));
148
149 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
150 Display solution and clean up
151 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
152
153 /* show detailed info unless -terse option is given by user */
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(PetscOptionsHasName(NULL,NULL,"-terse",&terse));
155
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(NEPErrorView(nep,NEP_ERROR_RELATIVE,NULL));
156 else {
157 PetscCall(PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD,PETSC_VIEWER_ASCII_INFO_DETAIL));
158 PetscCall(NEPConvergedReasonView(nep,PETSC_VIEWER_STDOUT_WORLD));
159 PetscCall(NEPErrorView(nep,NEP_ERROR_RELATIVE,PETSC_VIEWER_STDOUT_WORLD));
160 PetscCall(PetscViewerPopFormat(PETSC_VIEWER_STDOUT_WORLD));
161 }
162
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(NEPDestroy(&nep));
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.
60 PetscCall(MatDestroy(&F));
164
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(&J));
165
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());
166 return 0;
167 }
168
169 /* ------------------------------------------------------------------- */
170 /*
171 FormFunction - Computes Function matrix T(lambda)
172
173 Input Parameters:
174 . nep - the NEP context
175 . lambda - real part of the scalar argument
176 . ctx - optional user-defined context, as set by NEPSetFunction()
177
178 Output Parameters:
179 . fun - Function matrix
180 . B - optionally different preconditioning matrix
181 */
182 1078 PetscErrorCode FormFunction(NEP nep,PetscScalar lambda,Mat fun,Mat B,void *ctx)
183 {
184 1078 MatCtx *ctxF;
185
186
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1078 PetscFunctionBeginUser;
187
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.
1078 PetscCall(MatShellGetContext(fun,&ctxF));
188 1078 ctxF->lambda = lambda;
189
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.
1078 PetscFunctionReturn(PETSC_SUCCESS);
190 }
191
192 /* ------------------------------------------------------------------- */
193 /*
194 FormJacobian - Computes Jacobian matrix T'(lambda)
195
196 Input Parameters:
197 . nep - the NEP context
198 . lambda - real part of the scalar argument
199 . ctx - optional user-defined context, as set by NEPSetJacobian()
200
201 Output Parameters:
202 . jac - Jacobian matrix
203 */
204 928 PetscErrorCode FormJacobian(NEP nep,PetscScalar lambda,Mat jac,void *ctx)
205 {
206 928 MatCtx *ctxJ;
207
208
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
928 PetscFunctionBeginUser;
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.
928 PetscCall(MatShellGetContext(jac,&ctxJ));
210 928 ctxJ->lambda = lambda;
211
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.
928 PetscFunctionReturn(PETSC_SUCCESS);
212 }
213
214 /* ------------------------------------------------------------------- */
215 836796 PetscErrorCode MatMult_Fun(Mat A,Vec x,Vec y)
216 {
217 836796 MatCtx *ctx;
218 836796 PetscInt i,n,N;
219 836796 const PetscScalar *px;
220 836796 PetscScalar *py,c,d,de,oe,upper=0.0,lower=0.0;
221 836796 PetscReal h;
222 836796 MPI_Comm comm;
223
224
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
836796 PetscFunctionBeginUser;
225
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.
836796 PetscCall(MatShellGetContext(A,&ctx));
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.
836796 PetscCall(VecGetArrayRead(x,&px));
227
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.
836796 PetscCall(VecGetArray(y,&py));
228
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.
836796 PetscCall(VecGetSize(x,&N));
229
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.
836796 PetscCall(VecGetLocalSize(x,&n));
230
231
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.
836796 PetscCall(PetscObjectGetComm((PetscObject)A,&comm));
232
14/28
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
836796 PetscCallMPI(MPI_Sendrecv(px,1,MPIU_SCALAR,ctx->prev,0,&lower,1,MPIU_SCALAR,ctx->next,0,comm,MPI_STATUS_IGNORE));
233
14/28
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
836796 PetscCallMPI(MPI_Sendrecv(px+n-1,1,MPIU_SCALAR,ctx->next,0,&upper,1,MPIU_SCALAR,ctx->prev,0,comm,MPI_STATUS_IGNORE));
234
235 836796 h = ctx->h;
236 836796 c = ctx->kappa/(ctx->lambda-ctx->kappa);
237 836796 d = N;
238 836796 de = 2.0*(d-ctx->lambda*h/3.0); /* diagonal entry */
239 836796 oe = -d-ctx->lambda*h/6.0; /* offdiagonal entry */
240 836796 py[0] = oe*upper + de*px[0] + oe*px[1];
241
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
70543172 for (i=1;i<n-1;i++) py[i] = oe*px[i-1] +de*px[i] + oe*px[i+1];
242
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
836796 if (ctx->next==MPI_PROC_NULL) de = d-ctx->lambda*h/3.0+ctx->lambda*c; /* diagonal entry of last row */
243 836796 py[n-1] = oe*px[n-2] + de*px[n-1] + oe*lower;
244
245
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.
836796 PetscCall(VecRestoreArrayRead(x,&px));
246
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.
836796 PetscCall(VecRestoreArray(y,&py));
247
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.
167636 PetscFunctionReturn(PETSC_SUCCESS);
248 }
249
250 /* ------------------------------------------------------------------- */
251 60 PetscErrorCode MatGetDiagonal_Fun(Mat A,Vec diag)
252 {
253 60 MatCtx *ctx;
254 60 PetscInt n,N;
255 60 PetscScalar *pd,c,d;
256 60 PetscReal h;
257
258
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
60 PetscFunctionBeginUser;
259
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(MatShellGetContext(A,&ctx));
260
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(VecGetSize(diag,&N));
261
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(VecGetLocalSize(diag,&n));
262 60 h = ctx->h;
263 60 c = ctx->kappa/(ctx->lambda-ctx->kappa);
264 60 d = N;
265
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(VecSet(diag,2.0*(d-ctx->lambda*h/3.0)));
266
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(VecGetArray(diag,&pd));
267 60 pd[n-1] = d-ctx->lambda*h/3.0+ctx->lambda*c;
268
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(VecRestoreArray(diag,&pd));
269
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.
12 PetscFunctionReturn(PETSC_SUCCESS);
270 }
271
272 /* ------------------------------------------------------------------- */
273 90 PetscErrorCode MatDestroy_Fun(Mat A)
274 {
275 90 MatCtx *ctx;
276
277
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
90 PetscFunctionBegin;
278
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.
90 PetscCall(MatShellGetContext(A,&ctx));
279
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.
90 PetscCall(PetscFree(ctx));
280
6/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 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
18 PetscFunctionReturn(PETSC_SUCCESS);
281 }
282
283 /* ------------------------------------------------------------------- */
284 30 PetscErrorCode MatDuplicate_Fun(Mat A,MatDuplicateOption op,Mat *B)
285 {
286 30 MatCtx *actx,*bctx;
287 30 PetscInt m,n,M,N;
288 30 MPI_Comm comm;
289
290
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
30 PetscFunctionBegin;
291
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(MatShellGetContext(A,&actx));
292
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(MatGetSize(A,&M,&N));
293
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(MatGetLocalSize(A,&m,&n));
294
295
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(&bctx));
296 30 bctx->h = actx->h;
297 30 bctx->kappa = actx->kappa;
298 30 bctx->lambda = actx->lambda;
299 30 bctx->next = actx->next;
300 30 bctx->prev = actx->prev;
301
302
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(PetscObjectGetComm((PetscObject)A,&comm));
303
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(MatCreateShell(comm,m,n,M,N,(void*)bctx,B));
304
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(MatShellSetOperation(*B,MATOP_MULT,(PetscErrorCodeFn*)MatMult_Fun));
305
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(MatShellSetOperation(*B,MATOP_GET_DIAGONAL,(PetscErrorCodeFn*)MatGetDiagonal_Fun));
306
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(MatShellSetOperation(*B,MATOP_DESTROY,(PetscErrorCodeFn*)MatDestroy_Fun));
307
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(MatShellSetOperation(*B,MATOP_DUPLICATE,(PetscErrorCodeFn*)MatDuplicate_Fun));
308
6/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 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
6 PetscFunctionReturn(PETSC_SUCCESS);
309 }
310
311 /* ------------------------------------------------------------------- */
312 2278 PetscErrorCode MatMult_Jac(Mat A,Vec x,Vec y)
313 {
314 2278 MatCtx *ctx;
315 2278 PetscInt i,n;
316 2278 const PetscScalar *px;
317 2278 PetscScalar *py,c,de,oe,upper=0.0,lower=0.0;
318 2278 PetscReal h;
319 2278 MPI_Comm comm;
320
321
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2278 PetscFunctionBeginUser;
322
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.
2278 PetscCall(MatShellGetContext(A,&ctx));
323
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.
2278 PetscCall(VecGetArrayRead(x,&px));
324
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.
2278 PetscCall(VecGetArray(y,&py));
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.
2278 PetscCall(VecGetLocalSize(x,&n));
326
327
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.
2278 PetscCall(PetscObjectGetComm((PetscObject)A,&comm));
328
14/28
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
2278 PetscCallMPI(MPI_Sendrecv(px,1,MPIU_SCALAR,ctx->prev,0,&lower,1,MPIU_SCALAR,ctx->next,0,comm,MPI_STATUS_IGNORE));
329
14/28
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
2278 PetscCallMPI(MPI_Sendrecv(px+n-1,1,MPIU_SCALAR,ctx->next,0,&upper,1,MPIU_SCALAR,ctx->prev,0,comm,MPI_STATUS_IGNORE));
330
331 2278 h = ctx->h;
332 2278 c = ctx->kappa/(ctx->lambda-ctx->kappa);
333 2278 de = -2.0*h/3.0; /* diagonal entry */
334 2278 oe = -h/6.0; /* offdiagonal entry */
335 2278 py[0] = oe*upper + de*px[0] + oe*px[1];
336
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
192026 for (i=1;i<n-1;i++) py[i] = oe*px[i-1] +de*px[i] + oe*px[i+1];
337
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2278 if (ctx->next==MPI_PROC_NULL) de = -h/3.0-c*c; /* diagonal entry of last row */
338 2278 py[n-1] = oe*px[n-2] + de*px[n-1] + oe*lower;
339
340
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.
2278 PetscCall(VecRestoreArrayRead(x,&px));
341
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.
2278 PetscCall(VecRestoreArray(y,&py));
342
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.
456 PetscFunctionReturn(PETSC_SUCCESS);
343 }
344
345 /* ------------------------------------------------------------------- */
346 PetscErrorCode MatGetDiagonal_Jac(Mat A,Vec diag)
347 {
348 MatCtx *ctx;
349 PetscInt n;
350 PetscScalar *pd,c;
351 PetscReal h;
352
353 PetscFunctionBeginUser;
354 PetscCall(MatShellGetContext(A,&ctx));
355 PetscCall(VecGetLocalSize(diag,&n));
356 h = ctx->h;
357 c = ctx->kappa/(ctx->lambda-ctx->kappa);
358 PetscCall(VecSet(diag,-2.0*h/3.0));
359 PetscCall(VecGetArray(diag,&pd));
360 pd[n-1] = -h/3.0-c*c;
361 PetscCall(VecRestoreArray(diag,&pd));
362 PetscFunctionReturn(PETSC_SUCCESS);
363 }
364
365 /* ------------------------------------------------------------------- */
366 60 PetscErrorCode MatDestroy_Jac(Mat A)
367 {
368 60 MatCtx *ctx;
369
370
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
60 PetscFunctionBegin;
371
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(MatShellGetContext(A,&ctx));
372
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 PetscCall(PetscFree(ctx));
373
6/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 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
12 PetscFunctionReturn(PETSC_SUCCESS);
374 }
375
376 /*TEST
377
378 testset:
379 nsize: {{1 2}}
380 args: -terse
381 requires: !single
382 output_file: output/ex21_1.out
383 filter: sed -e "s/[+-]0\.0*i//g" -e "s/+0i//g"
384 test:
385 suffix: 1_rii
386 args: -nep_type rii -nep_target 4
387 test:
388 suffix: 1_slp
389 args: -nep_type slp -nep_slp_pc_type jacobi -nep_slp_ksp_type bcgs -nep_target 10
390
391 TEST*/
392