GCC Code Coverage Report


Directory: ./
File: src/nep/impls/interpol/interpol.c
Date: 2026-03-15 03:56:54
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 254 static PetscErrorCode NEPSetUp_Interpol(NEP nep)
36 {
37 254 NEP_INTERPOL *ctx = (NEP_INTERPOL*)nep->data;
38 254 ST st;
39 254 RG rg;
40 254 PetscReal a,b,c,d,s,tol;
41 254 PetscScalar zero=0.0;
42 254 PetscBool flg,istrivial,trackall;
43 254 PetscInt its,in;
44
45
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
254 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.
254 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.
254 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.
254 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.
254 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.
254 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.
254 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.
254 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.
254 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.
254 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.
254 PetscCall(PetscObjectTypeCompare((PetscObject)ctx->pep,PEPJD,&flg));
58
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
254 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.
234 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.
234 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.
254 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.
254 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.
398 if (tol==(PetscReal)PETSC_DETERMINE) tol = SlepcDefaultTol(nep->tol);
65
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
254 if (ctx->tol==(PetscReal)PETSC_DETERMINE) ctx->tol = tol;
66
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
254 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.
254 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.
254 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.
254 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.
254 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.
254 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.
254 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.
254 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.
254 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.
254 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.
254 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.
254 PetscCall(RGSetType(rg,RGINTERVAL));
80
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
254 PetscCheck(a!=b,PetscObjectComm((PetscObject)nep),PETSC_ERR_SUP,"Only implemented for intervals on the real axis");
81 254 s = 2.0/(b-a);
82 254 c = c*s;
83 254 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.
254 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.
254 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.
254 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.
254 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.
254 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 254 static PetscErrorCode ChebyshevNodes(PetscInt d,PetscReal a,PetscReal b,PetscScalar *x,PetscReal *dct2)
102 {
103 254 PetscInt j,i;
104 254 PetscReal t;
105
106
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
254 PetscFunctionBegin;
107
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2666 for (j=0;j<d+1;j++) {
108 2412 t = ((2*j+1)*PETSC_PI)/(2*(d+1));
109 2412 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.
28988 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.
254 PetscFunctionReturn(PETSC_SUCCESS);
113 }
114
115 254 static PetscErrorCode NEPSolve_Interpol(NEP nep)
116 {
117 254 NEP_INTERPOL *ctx = (NEP_INTERPOL*)nep->data;
118 254 Mat *A,*P;
119 254 PetscScalar *x,*fx,t;
120 254 PetscReal *cs,a,b,s,aprox,aprox0=1.0,*matnorm;
121 254 PetscInt i,j,k,deg=ctx->maxdeg;
122 254 PetscBool hasmnorm=PETSC_FALSE;
123 254 Vec vr,vi=NULL;
124 254 ST st;
125
126
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
254 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.
254 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.
1016 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.
762 PetscCall(MatHasOperation(nep->A[j],MATOP_NORM,&hasmnorm));
130
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
762 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.
762 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.
254 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.
254 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.
254 PetscCall(ChebyshevNodes(deg,a,b,x,cs));
136
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1016 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.
7998 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.
254 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.
254 if (nep->P) PetscCall(PetscMalloc1(deg+1,&P));
142 254 ctx->deg = deg;
143
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2142 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.
2022 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.
2022 if (nep->P) PetscCall(MatDuplicate(nep->P[0],MAT_COPY_VALUES,&P[k]));
146 2022 t = 0.0;
147
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
26018 for (i=0;i<deg+1;i++) t += fx[i]*cs[i*(deg+1)+k];
148 2022 t *= 2.0/(deg+1);
149
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2022 if (k==0) t /= 2.0;
150 2022 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.
2022 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.
2022 if (nep->P) PetscCall(MatScale(P[k],t));
153
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
6066 for (j=1;j<nep->nt;j++) {
154 t = 0.0;
155
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
52036 for (i=0;i<deg+1;i++) t += fx[i+j*(deg+1)]*cs[i*(deg+1)+k];
156 4044 t *= 2.0/(deg+1);
157
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4044 if (k==0) t /= 2.0;
158 4044 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.
4044 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.
4044 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.
2022 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.
1793 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.
254 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.
254 PetscCall(MatDestroyMatrices(deg+1,&A));
167
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
254 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.
254 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.
254 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.
254 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.
254 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.
254 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.
254 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.
254 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 254 s = 2.0/(b-a);
185
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1376 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.
1122 PetscCall(PEPGetEigenpair(ctx->pep,i,&nep->eigr[i],&nep->eigi[i],vr,vi));
187 1122 nep->eigr[i] /= s;
188 1122 nep->eigr[i] += (a+b)/2.0;
189 1122 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.
1122 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.
254 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.
254 PetscCall(VecDestroy(&vi));
197
198 254 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.
254 PetscFunctionReturn(PETSC_SUCCESS);
200 }
201
202 3245 static PetscErrorCode PEPMonitor_Interpol(PEP pep,PetscInt its,PetscInt nconv,PetscScalar *eigr,PetscScalar *eigi,PetscReal *errest,PetscInt nest,void *ctx)
203 {
204 3245 PetscInt i,n;
205 3245 NEP nep = (NEP)ctx;
206 3245 PetscReal a,b,s;
207 3245 ST st;
208
209
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
3245 PetscFunctionBegin;
210 3245 n = PetscMin(nest,nep->ncv);
211
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
67754 for (i=0;i<n;i++) {
212 64509 nep->eigr[i] = eigr[i];
213 64509 nep->eigi[i] = eigi[i];
214 64509 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.
3245 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.
3245 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.
3245 PetscCall(RGIntervalGetEndpoints(nep->rg,&a,&b,NULL,NULL));
219 3245 s = 2.0/(b-a);
220
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
67754 for (i=0;i<n;i++) {
221 64509 nep->eigr[i] /= s;
222 64509 nep->eigr[i] += (a+b)/2.0;
223 64509 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.
3245 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 224 static PetscErrorCode NEPSetFromOptions_Interpol(NEP nep,PetscOptionItems PetscOptionsObject)
230 {
231 224 NEP_INTERPOL *ctx = (NEP_INTERPOL*)nep->data;
232 224 PetscInt i;
233 224 PetscBool flg1,flg2;
234 224 PetscReal r;
235
236
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
224 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.
224 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.
224 PetscCall(NEPInterpolGetInterpolation(nep,&r,&i));
240
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
224 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.
224 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.
224 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.
224 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.
224 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.
224 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.
224 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 144 static PetscErrorCode NEPInterpolSetInterpolation_Interpol(NEP nep,PetscReal tol,PetscInt degree)
253 {
254 144 NEP_INTERPOL *ctx = (NEP_INTERPOL*)nep->data;
255
256
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
144 PetscFunctionBegin;
257
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
144 if (tol == (PetscReal)PETSC_DETERMINE) {
258 144 ctx->tol = PETSC_DETERMINE;
259 144 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.
144 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.
144 } 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.
144 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.
144 if (ctx->maxdeg != degree) {
271 144 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.
144 if (nep->state) PetscCall(NEPReset(nep));
273 144 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 144 PetscErrorCode NEPInterpolSetInterpolation(NEP nep,PetscReal tol,PetscInt deg)
303 {
304
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
144 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.
144 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.
144 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.
144 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.
144 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.
144 PetscFunctionReturn(PETSC_SUCCESS);
310 }
311
312 248 static PetscErrorCode NEPInterpolGetInterpolation_Interpol(NEP nep,PetscReal *tol,PetscInt *deg)
313 {
314 248 NEP_INTERPOL *ctx = (NEP_INTERPOL*)nep->data;
315
316
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
248 PetscFunctionBegin;
317
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
248 if (tol) *tol = ctx->tol;
318
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
248 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.
248 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 248 PetscErrorCode NEPInterpolGetInterpolation(NEP nep,PetscReal *tol,PetscInt *deg)
340 {
341
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
248 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.
248 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.
248 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.
248 PetscFunctionReturn(PETSC_SUCCESS);
345 }
346
347 24 static PetscErrorCode NEPInterpolSetPEP_Interpol(NEP nep,PEP pep)
348 {
349 24 NEP_INTERPOL *ctx = (NEP_INTERPOL*)nep->data;
350
351
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
24 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.
24 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.
24 PetscCall(PEPDestroy(&ctx->pep));
354 24 ctx->pep = pep;
355 24 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.
24 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 24 PetscErrorCode NEPInterpolSetPEP(NEP nep,PEP pep)
374 {
375
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
24 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.
24 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.
24 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.
24 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.
24 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.
24 PetscFunctionReturn(PETSC_SUCCESS);
381 }
382
383 200 static PetscErrorCode NEPInterpolGetPEP_Interpol(NEP nep,PEP *pep)
384 {
385 200 NEP_INTERPOL *ctx = (NEP_INTERPOL*)nep->data;
386
387
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
200 PetscFunctionBegin;
388
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
200 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.
200 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.
200 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.
200 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.
200 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.
200 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.
200 PetscCall(PEPMonitorSet(ctx->pep,PEPMonitor_Interpol,nep,NULL));
395 }
396 200 *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.
200 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 200 PetscErrorCode NEPInterpolGetPEP(NEP nep,PEP *pep)
417 {
418
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
200 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.
200 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.
200 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.
200 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.
200 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 254 static PetscErrorCode NEPReset_Interpol(NEP nep)
444 {
445 254 NEP_INTERPOL *ctx = (NEP_INTERPOL*)nep->data;
446
447
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
254 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.
254 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 224 static PetscErrorCode NEPDestroy_Interpol(NEP nep)
453 {
454 224 NEP_INTERPOL *ctx = (NEP_INTERPOL*)nep->data;
455
456
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
224 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.
224 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.
224 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.
224 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.
224 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.
224 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.
224 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 224 SLEPC_EXTERN PetscErrorCode NEPCreate_Interpol(NEP nep)
483 {
484 224 NEP_INTERPOL *ctx;
485
486
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
224 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.
224 PetscCall(PetscNew(&ctx));
488 224 nep->data = (void*)ctx;
489 224 ctx->maxdeg = 5;
490 224 ctx->tol = PETSC_DETERMINE;
491
492 224 nep->ops->solve = NEPSolve_Interpol;
493 224 nep->ops->setup = NEPSetUp_Interpol;
494 224 nep->ops->setfromoptions = NEPSetFromOptions_Interpol;
495 224 nep->ops->reset = NEPReset_Interpol;
496 224 nep->ops->destroy = NEPDestroy_Interpol;
497 224 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.
224 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.
224 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.
224 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.
224 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