GCC Code Coverage Report


Directory: ./
File: src/nep/impls/interpol/interpol.c
Date: 2026-01-12 03:57:26
Exec Total Coverage
Lines: 260 279 93.2%
Functions: 16 17 94.1%
Branches: 648 1276 50.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 SLEPc nonlinear eigensolver: "interpol"
12
13 Method: Polynomial interpolation
14
15 Algorithm:
16
17 Uses a PEP object to solve the interpolated NEP. Currently supports
18 only Chebyshev interpolation on an interval.
19
20 References:
21
22 [1] C. Effenberger and D. Kresser, "Chebyshev interpolation for
23 nonlinear eigenvalue problems", BIT 52:933-951, 2012.
24 */
25
26 #include <slepc/private/nepimpl.h> /*I "slepcnep.h" I*/
27
28 typedef struct {
29 PEP pep;
30 PetscReal tol; /* tolerance for norm of polynomial coefficients */
31 PetscInt maxdeg; /* maximum degree of interpolation polynomial */
32 PetscInt deg; /* actual degree of interpolation polynomial */
33 } NEP_INTERPOL;
34
35 252 static PetscErrorCode NEPSetUp_Interpol(NEP nep)
36 {
37 252 NEP_INTERPOL *ctx = (NEP_INTERPOL*)nep->data;
38 252 ST st;
39 252 RG rg;
40 252 PetscReal a,b,c,d,s,tol;
41 252 PetscScalar zero=0.0;
42 252 PetscBool flg,istrivial,trackall;
43 252 PetscInt its,in;
44
45
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
252 PetscFunctionBegin;
46
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.
252 PetscCall(NEPSetDimensions_Default(nep,nep->nev,&nep->ncv,&nep->mpd));
47
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
252 PetscCheck(nep->ncv<=nep->nev+nep->mpd,PetscObjectComm((PetscObject)nep),PETSC_ERR_USER_INPUT,"The value of ncv must not be larger than nev+mpd");
48
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
252 if (nep->max_it==PETSC_DETERMINE) nep->max_it = PetscMax(5000,2*nep->n/nep->ncv);
49
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
252 if (!nep->which) nep->which = NEP_TARGET_MAGNITUDE;
50
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
252 PetscCheck(nep->which==NEP_TARGET_MAGNITUDE,PetscObjectComm((PetscObject)nep),PETSC_ERR_SUP,"This solver supports only target magnitude eigenvalues");
51
3/12
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 10 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
252 NEPCheckUnsupported(nep,NEP_FEATURE_CALLBACK | NEP_FEATURE_STOPPING | NEP_FEATURE_TWOSIDED);
52
53 /* transfer PEP options */
54
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.
252 if (!ctx->pep) PetscCall(NEPInterpolGetPEP(nep,&ctx->pep));
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.
252 PetscCall(PEPSetBasis(ctx->pep,PEP_BASIS_CHEBYSHEV1));
56
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.
252 PetscCall(PEPSetWhichEigenpairs(ctx->pep,PEP_TARGET_MAGNITUDE));
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.
252 PetscCall(PetscObjectTypeCompare((PetscObject)ctx->pep,PEPJD,&flg));
58
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
252 if (!flg) {
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.
232 PetscCall(PEPGetST(ctx->pep,&st));
60
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.
232 PetscCall(STSetType(st,STSINVERT));
61 }
62
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.
252 PetscCall(PEPSetDimensions(ctx->pep,nep->nev,nep->ncv,nep->mpd));
63
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.
252 PetscCall(PEPGetTolerances(ctx->pep,&tol,&its));
64
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
395 if (tol==(PetscReal)PETSC_DETERMINE) tol = SlepcDefaultTol(nep->tol);
65
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
252 if (ctx->tol==(PetscReal)PETSC_DETERMINE) ctx->tol = tol;
66
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
252 if (its==PETSC_DETERMINE) its = nep->max_it;
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.
252 PetscCall(PEPSetTolerances(ctx->pep,tol,its));
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.
252 PetscCall(NEPGetTrackAll(nep,&trackall));
69
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.
252 PetscCall(PEPSetTrackAll(ctx->pep,trackall));
70
71 /* transfer region options */
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.
252 PetscCall(RGIsTrivial(nep->rg,&istrivial));
73
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
252 PetscCheck(!istrivial,PetscObjectComm((PetscObject)nep),PETSC_ERR_SUP,"NEPINTERPOL requires a nontrivial region");
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.
252 PetscCall(PetscObjectTypeCompare((PetscObject)nep->rg,RGINTERVAL,&flg));
75
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
252 PetscCheck(flg,PetscObjectComm((PetscObject)nep),PETSC_ERR_SUP,"Only implemented for interval regions");
76
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.
252 PetscCall(RGIntervalGetEndpoints(nep->rg,&a,&b,&c,&d));
77
2/6
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
252 PetscCheck(a>-PETSC_MAX_REAL && b<PETSC_MAX_REAL,PetscObjectComm((PetscObject)nep),PETSC_ERR_SUP,"Only implemented for bounded intervals");
78
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.
252 PetscCall(PEPGetRG(ctx->pep,&rg));
79
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.
252 PetscCall(RGSetType(rg,RGINTERVAL));
80
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
252 PetscCheck(a!=b,PetscObjectComm((PetscObject)nep),PETSC_ERR_SUP,"Only implemented for intervals on the real axis");
81 252 s = 2.0/(b-a);
82 252 c = c*s;
83 252 d = d*s;
84
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.
252 PetscCall(RGIntervalSetEndpoints(rg,-1.0,1.0,c,d));
85
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.
252 PetscCall(RGCheckInside(nep->rg,1,&nep->target,&zero,&in));
86
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
252 PetscCheck(in>=0,PetscObjectComm((PetscObject)nep),PETSC_ERR_SUP,"The target is not inside the target set");
87
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.
252 PetscCall(PEPSetTarget(ctx->pep,(nep->target-(a+b)/2)*s));
88
89
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.
252 PetscCall(NEPAllocateSolution(nep,0));
90
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.
50 PetscFunctionReturn(PETSC_SUCCESS);
91 }
92
93 /*
94 Input:
95 d, number of nodes to compute
96 a,b, interval extremes
97 Output:
98 *x, array containing the d Chebyshev nodes of the interval [a,b]
99 *dct2, coefficients to compute a discrete cosine transformation (DCT-II)
100 */
101 252 static PetscErrorCode ChebyshevNodes(PetscInt d,PetscReal a,PetscReal b,PetscScalar *x,PetscReal *dct2)
102 {
103 252 PetscInt j,i;
104 252 PetscReal t;
105
106
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
252 PetscFunctionBegin;
107
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2650 for (j=0;j<d+1;j++) {
108 2398 t = ((2*j+1)*PETSC_PI)/(2*(d+1));
109 2398 x[j] = (a+b)/2.0+((b-a)/2.0)*PetscCosReal(t);
110
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
28874 for (i=0;i<d+1;i++) dct2[j*(d+1)+i] = PetscCosReal(i*t);
111 }
112
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.
252 PetscFunctionReturn(PETSC_SUCCESS);
113 }
114
115 252 static PetscErrorCode NEPSolve_Interpol(NEP nep)
116 {
117 252 NEP_INTERPOL *ctx = (NEP_INTERPOL*)nep->data;
118 252 Mat *A,*P;
119 252 PetscScalar *x,*fx,t;
120 252 PetscReal *cs,a,b,s,aprox,aprox0=1.0,*matnorm;
121 252 PetscInt i,j,k,deg=ctx->maxdeg;
122 252 PetscBool hasmnorm=PETSC_FALSE;
123 252 Vec vr,vi=NULL;
124 252 ST st;
125
126
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
252 PetscFunctionBegin;
127
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.
252 PetscCall(PetscMalloc4((deg+1)*(deg+1),&cs,deg+1,&x,(deg+1)*nep->nt,&fx,nep->nt,&matnorm));
128
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1008 for (j=0;j<nep->nt;j++) {
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.
756 PetscCall(MatHasOperation(nep->A[j],MATOP_NORM,&hasmnorm));
130
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
756 if (!hasmnorm) break;
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.
756 PetscCall(MatNorm(nep->A[j],NORM_INFINITY,matnorm+j));
132 }
133
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
252 if (!hasmnorm) for (j=0;j<nep->nt;j++) matnorm[j] = 1.0;
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.
252 PetscCall(RGIntervalGetEndpoints(nep->rg,&a,&b,NULL,NULL));
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.
252 PetscCall(ChebyshevNodes(deg,a,b,x,cs));
136
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1008 for (j=0;j<nep->nt;j++) {
137
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
7950 for (i=0;i<=deg;i++) PetscCall(FNEvaluateFunction(nep->f[j],x[i],&fx[i+j*(deg+1)]));
138 }
139 /* Polynomial coefficients */
140
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.
252 PetscCall(PetscMalloc1(deg+1,&A));
141
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.
252 if (nep->P) PetscCall(PetscMalloc1(deg+1,&P));
142 252 ctx->deg = deg;
143
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2135 for (k=0;k<=deg;k++) {
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.
2015 PetscCall(MatDuplicate(nep->A[0],MAT_COPY_VALUES,&A[k]));
145
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.
2015 if (nep->P) PetscCall(MatDuplicate(nep->P[0],MAT_COPY_VALUES,&P[k]));
146 2015 t = 0.0;
147
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
25963 for (i=0;i<deg+1;i++) t += fx[i]*cs[i*(deg+1)+k];
148 2015 t *= 2.0/(deg+1);
149
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2015 if (k==0) t /= 2.0;
150 2015 aprox = matnorm[0]*PetscAbsScalar(t);
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.
2015 PetscCall(MatScale(A[k],t));
152
6/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
2015 if (nep->P) PetscCall(MatScale(P[k],t));
153
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6045 for (j=1;j<nep->nt;j++) {
154 t = 0.0;
155
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
51926 for (i=0;i<deg+1;i++) t += fx[i+j*(deg+1)]*cs[i*(deg+1)+k];
156 4030 t *= 2.0/(deg+1);
157
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4030 if (k==0) t /= 2.0;
158 4030 aprox += matnorm[j]*PetscAbsScalar(t);
159
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.
4030 PetscCall(MatAXPY(A[k],t,nep->A[j],nep->mstr));
160
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.
4030 if (nep->P) PetscCall(MatAXPY(P[k],t,nep->P[j],nep->mstrp));
161 }
162
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2015 if (k==0) aprox0 = aprox;
163
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
1786 if (k>1 && aprox/aprox0<ctx->tol) { ctx->deg = k; deg = k; break; }
164 }
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.
252 PetscCall(PEPSetOperators(ctx->pep,deg+1,A));
166
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.
252 PetscCall(MatDestroyMatrices(deg+1,&A));
167
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
252 if (nep->P) {
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(PEPGetST(ctx->pep,&st));
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(STSetSplitPreconditioner(st,deg+1,P,nep->mstrp));
170
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(MatDestroyMatrices(deg+1,&P));
171 }
172
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.
252 PetscCall(PetscFree4(cs,x,fx,matnorm));
173
174 /* Solve polynomial eigenproblem */
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.
252 PetscCall(PEPSolve(ctx->pep));
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.
252 PetscCall(PEPGetConverged(ctx->pep,&nep->nconv));
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.
252 PetscCall(PEPGetIterationNumber(ctx->pep,&nep->its));
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.
252 PetscCall(PEPGetConvergedReason(ctx->pep,(PEPConvergedReason*)&nep->reason));
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.
252 PetscCall(BVSetActiveColumns(nep->V,0,nep->nconv));
180
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.
252 PetscCall(BVCreateVec(nep->V,&vr));
181 #if !defined(PETSC_USE_COMPLEX)
182
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.
127 PetscCall(VecDuplicate(vr,&vi));
183 #endif
184 252 s = 2.0/(b-a);
185
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1368 for (i=0;i<nep->nconv;i++) {
186
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.
1116 PetscCall(PEPGetEigenpair(ctx->pep,i,&nep->eigr[i],&nep->eigi[i],vr,vi));
187 1116 nep->eigr[i] /= s;
188 1116 nep->eigr[i] += (a+b)/2.0;
189 1116 nep->eigi[i] /= s;
190
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.
1116 PetscCall(BVInsertVec(nep->V,i,vr));
191 #if !defined(PETSC_USE_COMPLEX)
192
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 5 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.
561 if (nep->eigi[i]!=0.0) PetscCall(BVInsertVec(nep->V,++i,vi));
193 #endif
194 }
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.
252 PetscCall(VecDestroy(&vr));
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.
252 PetscCall(VecDestroy(&vi));
197
198 252 nep->state = NEP_STATE_EIGENVECTORS;
199
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.
252 PetscFunctionReturn(PETSC_SUCCESS);
200 }
201
202 3244 static PetscErrorCode PEPMonitor_Interpol(PEP pep,PetscInt its,PetscInt nconv,PetscScalar *eigr,PetscScalar *eigi,PetscReal *errest,PetscInt nest,void *ctx)
203 {
204 3244 PetscInt i,n;
205 3244 NEP nep = (NEP)ctx;
206 3244 PetscReal a,b,s;
207 3244 ST st;
208
209
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
3244 PetscFunctionBegin;
210 3244 n = PetscMin(nest,nep->ncv);
211
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
67735 for (i=0;i<n;i++) {
212 64491 nep->eigr[i] = eigr[i];
213 64491 nep->eigi[i] = eigi[i];
214 64491 nep->errest[i] = errest[i];
215 }
216
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.
3244 PetscCall(PEPGetST(pep,&st));
217
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.
3244 PetscCall(STBackTransform(st,n,nep->eigr,nep->eigi));
218
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.
3244 PetscCall(RGIntervalGetEndpoints(nep->rg,&a,&b,NULL,NULL));
219 3244 s = 2.0/(b-a);
220
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
67735 for (i=0;i<n;i++) {
221 64491 nep->eigr[i] /= s;
222 64491 nep->eigr[i] += (a+b)/2.0;
223 64491 nep->eigi[i] /= s;
224 }
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.
3244 PetscCall(NEPMonitor(nep,its,nconv,nep->eigr,nep->eigi,nep->errest,nest));
226
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.
638 PetscFunctionReturn(PETSC_SUCCESS);
227 }
228
229 222 static PetscErrorCode NEPSetFromOptions_Interpol(NEP nep,PetscOptionItems PetscOptionsObject)
230 {
231 222 NEP_INTERPOL *ctx = (NEP_INTERPOL*)nep->data;
232 222 PetscInt i;
233 222 PetscBool flg1,flg2;
234 222 PetscReal r;
235
236
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
222 PetscFunctionBegin;
237
1/12
✗ 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.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
222 PetscOptionsHeadBegin(PetscOptionsObject,"NEP Interpol Options");
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.
222 PetscCall(NEPInterpolGetInterpolation(nep,&r,&i));
240
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
222 if (!i) i = PETSC_DETERMINE;
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.
222 PetscCall(PetscOptionsInt("-nep_interpol_interpolation_degree","Maximum degree of polynomial interpolation","NEPInterpolSetInterpolation",i,&i,&flg1));
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.
222 PetscCall(PetscOptionsReal("-nep_interpol_interpolation_tol","Tolerance for interpolation coefficients","NEPInterpolSetInterpolation",r,&r,&flg2));
243
7/10
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
222 if (flg1 || flg2) PetscCall(NEPInterpolSetInterpolation(nep,r,i));
244
245
2/14
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 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.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
222 PetscOptionsHeadEnd();
246
247
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.
222 if (!ctx->pep) PetscCall(NEPInterpolGetPEP(nep,&ctx->pep));
248
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.
222 PetscCall(PEPSetFromOptions(ctx->pep));
249
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.
44 PetscFunctionReturn(PETSC_SUCCESS);
250 }
251
252 143 static PetscErrorCode NEPInterpolSetInterpolation_Interpol(NEP nep,PetscReal tol,PetscInt degree)
253 {
254 143 NEP_INTERPOL *ctx = (NEP_INTERPOL*)nep->data;
255
256
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
143 PetscFunctionBegin;
257
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
143 if (tol == (PetscReal)PETSC_DETERMINE) {
258 143 ctx->tol = PETSC_DETERMINE;
259 143 nep->state = NEP_STATE_INITIAL;
260 } else if (tol != (PetscReal)PETSC_CURRENT) {
261 PetscCheck(tol>0.0,PetscObjectComm((PetscObject)nep),PETSC_ERR_ARG_OUTOFRANGE,"Illegal value of tol. Must be > 0");
262 ctx->tol = tol;
263 }
264
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
143 if (degree == PETSC_DETERMINE) {
265 ctx->maxdeg = 0;
266 if (nep->state) PetscCall(NEPReset(nep));
267 nep->state = NEP_STATE_INITIAL;
268
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
143 } else if (degree != PETSC_CURRENT) {
269
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
143 PetscCheck(degree>0,PetscObjectComm((PetscObject)nep),PETSC_ERR_ARG_OUTOFRANGE,"Illegal value of degree. Must be > 0");
270
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
143 if (ctx->maxdeg != degree) {
271 143 ctx->maxdeg = degree;
272
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.
143 if (nep->state) PetscCall(NEPReset(nep));
273 143 nep->state = NEP_STATE_INITIAL;
274 }
275 }
276
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.
28 PetscFunctionReturn(PETSC_SUCCESS);
277 }
278
279 /*@
280 NEPInterpolSetInterpolation - Sets the tolerance and maximum degree when building
281 the interpolation polynomial.
282
283 Collective
284
285 Input Parameters:
286 + nep - the nonlinear eigensolver context
287 . tol - tolerance to stop computing polynomial coefficients
288 - deg - maximum degree of interpolation
289
290 Options Database Keys:
291 + -nep_interpol_interpolation_tol \<tol\> - sets the tolerance to stop computing polynomial coefficients
292 - -nep_interpol_interpolation_degree \<deg\> - sets the maximum degree of interpolation
293
294 Note:
295 `PETSC_CURRENT` can be used to preserve the current value of any of the
296 arguments, and `PETSC_DETERMINE` to set them to a default value.
297
298 Level: advanced
299
300 .seealso: [](ch:nep), `NEPINTERPOL`, `NEPInterpolGetInterpolation()`
301 @*/
302 143 PetscErrorCode NEPInterpolSetInterpolation(NEP nep,PetscReal tol,PetscInt deg)
303 {
304
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
143 PetscFunctionBegin;
305
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
143 PetscValidHeaderSpecific(nep,NEP_CLASSID,1);
306
29/66
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✓ Branch 26 taken 2 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✓ Branch 30 taken 2 times.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 2 times.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 2 times.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✓ Branch 39 taken 2 times.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✓ Branch 47 taken 2 times.
✓ Branch 48 taken 2 times.
✗ Branch 49 not taken.
✗ Branch 50 not taken.
✓ Branch 51 taken 2 times.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 2 times.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✓ Branch 57 taken 2 times.
✗ Branch 58 not taken.
✗ Branch 59 not taken.
✓ Branch 60 taken 2 times.
✗ Branch 61 not taken.
✗ Branch 62 not taken.
✓ Branch 63 taken 2 times.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
143 PetscValidLogicalCollectiveReal(nep,tol,2);
307
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
143 PetscValidLogicalCollectiveInt(nep,deg,3);
308
8/14
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
143 PetscTryMethod(nep,"NEPInterpolSetInterpolation_C",(NEP,PetscReal,PetscInt),(nep,tol,deg));
309
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.
143 PetscFunctionReturn(PETSC_SUCCESS);
310 }
311
312 245 static PetscErrorCode NEPInterpolGetInterpolation_Interpol(NEP nep,PetscReal *tol,PetscInt *deg)
313 {
314 245 NEP_INTERPOL *ctx = (NEP_INTERPOL*)nep->data;
315
316
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
245 PetscFunctionBegin;
317
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
245 if (tol) *tol = ctx->tol;
318
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
245 if (deg) *deg = ctx->maxdeg;
319
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.
245 PetscFunctionReturn(PETSC_SUCCESS);
320 }
321
322 /*@
323 NEPInterpolGetInterpolation - Gets the tolerance and maximum degree when building
324 the interpolation polynomial.
325
326 Not Collective
327
328 Input Parameter:
329 . nep - the nonlinear eigensolver context
330
331 Output Parameters:
332 + tol - tolerance to stop computing polynomial coefficients
333 - deg - maximum degree of interpolation
334
335 Level: advanced
336
337 .seealso: [](ch:nep), `NEPINTERPOL`, `NEPInterpolSetInterpolation()`
338 @*/
339 245 PetscErrorCode NEPInterpolGetInterpolation(NEP nep,PetscReal *tol,PetscInt *deg)
340 {
341
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
245 PetscFunctionBegin;
342
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
245 PetscValidHeaderSpecific(nep,NEP_CLASSID,1);
343
9/16
✓ 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 10 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
245 PetscUseMethod(nep,"NEPInterpolGetInterpolation_C",(NEP,PetscReal*,PetscInt*),(nep,tol,deg));
344
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.
245 PetscFunctionReturn(PETSC_SUCCESS);
345 }
346
347 23 static PetscErrorCode NEPInterpolSetPEP_Interpol(NEP nep,PEP pep)
348 {
349 23 NEP_INTERPOL *ctx = (NEP_INTERPOL*)nep->data;
350
351
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
23 PetscFunctionBegin;
352
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.
23 PetscCall(PetscObjectReference((PetscObject)pep));
353
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.
23 PetscCall(PEPDestroy(&ctx->pep));
354 23 ctx->pep = pep;
355 23 nep->state = NEP_STATE_INITIAL;
356
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.
23 PetscFunctionReturn(PETSC_SUCCESS);
357 }
358
359 /*@
360 NEPInterpolSetPEP - Associate a polynomial eigensolver object (`PEP`) to the
361 nonlinear eigenvalue solver.
362
363 Collective
364
365 Input Parameters:
366 + nep - the nonlinear eigensolver context
367 - pep - the polynomial eigensolver context
368
369 Level: advanced
370
371 .seealso: [](ch:nep), `NEPINTERPOL`, `NEPInterpolGetPEP()`
372 @*/
373 23 PetscErrorCode NEPInterpolSetPEP(NEP nep,PEP pep)
374 {
375
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
23 PetscFunctionBegin;
376
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
23 PetscValidHeaderSpecific(nep,NEP_CLASSID,1);
377
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
23 PetscValidHeaderSpecific(pep,PEP_CLASSID,2);
378
13/32
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ 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.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
23 PetscCheckSameComm(nep,1,pep,2);
379
8/14
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
23 PetscTryMethod(nep,"NEPInterpolSetPEP_C",(NEP,PEP),(nep,pep));
380
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.
23 PetscFunctionReturn(PETSC_SUCCESS);
381 }
382
383 199 static PetscErrorCode NEPInterpolGetPEP_Interpol(NEP nep,PEP *pep)
384 {
385 199 NEP_INTERPOL *ctx = (NEP_INTERPOL*)nep->data;
386
387
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
199 PetscFunctionBegin;
388
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
199 if (!ctx->pep) {
389
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.
199 PetscCall(PEPCreate(PetscObjectComm((PetscObject)nep),&ctx->pep));
390
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.
199 PetscCall(PetscObjectIncrementTabLevel((PetscObject)ctx->pep,(PetscObject)nep,1));
391
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.
199 PetscCall(PEPSetOptionsPrefix(ctx->pep,((PetscObject)nep)->prefix));
392
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.
199 PetscCall(PEPAppendOptionsPrefix(ctx->pep,"nep_interpol_"));
393
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.
199 PetscCall(PetscObjectSetOptions((PetscObject)ctx->pep,((PetscObject)nep)->options));
394
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.
199 PetscCall(PEPMonitorSet(ctx->pep,PEPMonitor_Interpol,nep,NULL));
395 }
396 199 *pep = ctx->pep;
397
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.
199 PetscFunctionReturn(PETSC_SUCCESS);
398 }
399
400 /*@
401 NEPInterpolGetPEP - Retrieve the polynomial eigensolver object (`PEP`)
402 associated with the nonlinear eigenvalue solver.
403
404 Collective
405
406 Input Parameter:
407 . nep - the nonlinear eigensolver context
408
409 Output Parameter:
410 . pep - the polynomial eigensolver context
411
412 Level: advanced
413
414 .seealso: [](ch:nep), `NEPINTERPOL`, `NEPInterpolSetPEP()`
415 @*/
416 199 PetscErrorCode NEPInterpolGetPEP(NEP nep,PEP *pep)
417 {
418
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
199 PetscFunctionBegin;
419
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
199 PetscValidHeaderSpecific(nep,NEP_CLASSID,1);
420
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
199 PetscAssertPointer(pep,2);
421
9/16
✓ 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 10 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
199 PetscUseMethod(nep,"NEPInterpolGetPEP_C",(NEP,PEP*),(nep,pep));
422
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.
199 PetscFunctionReturn(PETSC_SUCCESS);
423 }
424
425 static PetscErrorCode NEPView_Interpol(NEP nep,PetscViewer viewer)
426 {
427 NEP_INTERPOL *ctx = (NEP_INTERPOL*)nep->data;
428 PetscBool isascii;
429
430 PetscFunctionBegin;
431 PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii));
432 if (isascii) {
433 if (!ctx->pep) PetscCall(NEPInterpolGetPEP(nep,&ctx->pep));
434 PetscCall(PetscViewerASCIIPrintf(viewer," polynomial degree %" PetscInt_FMT ", max=%" PetscInt_FMT "\n",ctx->deg,ctx->maxdeg));
435 PetscCall(PetscViewerASCIIPrintf(viewer," tolerance for norm of polynomial coefficients %g\n",(double)ctx->tol));
436 PetscCall(PetscViewerASCIIPushTab(viewer));
437 PetscCall(PEPView(ctx->pep,viewer));
438 PetscCall(PetscViewerASCIIPopTab(viewer));
439 }
440 PetscFunctionReturn(PETSC_SUCCESS);
441 }
442
443 252 static PetscErrorCode NEPReset_Interpol(NEP nep)
444 {
445 252 NEP_INTERPOL *ctx = (NEP_INTERPOL*)nep->data;
446
447
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
252 PetscFunctionBegin;
448
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.
252 PetscCall(PEPReset(ctx->pep));
449
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.
50 PetscFunctionReturn(PETSC_SUCCESS);
450 }
451
452 222 static PetscErrorCode NEPDestroy_Interpol(NEP nep)
453 {
454 222 NEP_INTERPOL *ctx = (NEP_INTERPOL*)nep->data;
455
456
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
222 PetscFunctionBegin;
457
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.
222 PetscCall(PEPDestroy(&ctx->pep));
458
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.
222 PetscCall(PetscFree(nep->data));
459
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.
222 PetscCall(PetscObjectComposeFunction((PetscObject)nep,"NEPInterpolSetInterpolation_C",NULL));
460
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.
222 PetscCall(PetscObjectComposeFunction((PetscObject)nep,"NEPInterpolGetInterpolation_C",NULL));
461
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.
222 PetscCall(PetscObjectComposeFunction((PetscObject)nep,"NEPInterpolSetPEP_C",NULL));
462
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.
222 PetscCall(PetscObjectComposeFunction((PetscObject)nep,"NEPInterpolGetPEP_C",NULL));
463
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.
44 PetscFunctionReturn(PETSC_SUCCESS);
464 }
465
466 /*MC
467 NEPINTERPOL - NEPINTERPOL = "interpol" - Solve the nonlinear
468 eigenvalue problem via polynomial interpolation.
469
470 Note:
471 This solver will approximate the nonlinear eigenvalue problem
472 with a polynomial eigenvalue problem and use `PEP` to solve it.
473 This is appropriate in nonlinear problems without singularities
474 and whose eigenvalues are all real. The degree of the polynomial
475 should generally be large, in which case a non-monomial representation
476 such as Chebyshev should be used {cite:p}`Kre14`.
477
478 Level: beginner
479
480 .seealso: [](ch:nep), `NEP`, `NEPType`, `NEPSetType()`, `NEPSLPGetEPS()`, `NEPSetTwoSided()`, `NEPSLPGetEPSLeft()`
481 M*/
482 222 SLEPC_EXTERN PetscErrorCode NEPCreate_Interpol(NEP nep)
483 {
484 222 NEP_INTERPOL *ctx;
485
486
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
222 PetscFunctionBegin;
487
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.
222 PetscCall(PetscNew(&ctx));
488 222 nep->data = (void*)ctx;
489 222 ctx->maxdeg = 5;
490 222 ctx->tol = PETSC_DETERMINE;
491
492 222 nep->ops->solve = NEPSolve_Interpol;
493 222 nep->ops->setup = NEPSetUp_Interpol;
494 222 nep->ops->setfromoptions = NEPSetFromOptions_Interpol;
495 222 nep->ops->reset = NEPReset_Interpol;
496 222 nep->ops->destroy = NEPDestroy_Interpol;
497 222 nep->ops->view = NEPView_Interpol;
498
499
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.
222 PetscCall(PetscObjectComposeFunction((PetscObject)nep,"NEPInterpolSetInterpolation_C",NEPInterpolSetInterpolation_Interpol));
500
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.
222 PetscCall(PetscObjectComposeFunction((PetscObject)nep,"NEPInterpolGetInterpolation_C",NEPInterpolGetInterpolation_Interpol));
501
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.
222 PetscCall(PetscObjectComposeFunction((PetscObject)nep,"NEPInterpolSetPEP_C",NEPInterpolSetPEP_Interpol));
502
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.
222 PetscCall(PetscObjectComposeFunction((PetscObject)nep,"NEPInterpolGetPEP_C",NEPInterpolGetPEP_Interpol));
503
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.
44 PetscFunctionReturn(PETSC_SUCCESS);
504 }
505