GCC Code Coverage Report


Directory: ./
File: src/eps/impls/subspace/subspace.c
Date: 2026-01-12 03:57:26
Exec Total Coverage
Lines: 220 225 97.8%
Functions: 8 8 100.0%
Branches: 452 722 62.6%

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 eigensolver: "subspace"
12
13 Method: Subspace Iteration
14
15 Algorithm:
16
17 Subspace iteration with Rayleigh-Ritz projection and locking,
18 based on the SRRIT implementation.
19
20 References:
21
22 [1] "Subspace Iteration in SLEPc", SLEPc Technical Report STR-3,
23 available at https://slepc.upv.es.
24 */
25
26 #include <slepc/private/epsimpl.h>
27
28 typedef struct {
29 PetscBool estimatedrange; /* the filter range was not set by the user */
30 } EPS_SUBSPACE;
31
32 28 static PetscErrorCode EPSSetUp_Subspace_Filter(EPS eps)
33 {
34 28 EPS_SUBSPACE *ctx = (EPS_SUBSPACE*)eps->data;
35 28 PetscBool estimaterange=PETSC_TRUE;
36 28 PetscReal rleft,rright;
37 28 Mat A;
38
39
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
28 PetscFunctionBegin;
40
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
28 EPSCheckHermitianCondition(eps,PETSC_TRUE," with polynomial filter");
41
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
28 EPSCheckStandardCondition(eps,PETSC_TRUE," with polynomial filter");
42
1/6
✗ 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.
28 PetscCheck(eps->intb<PETSC_MAX_REAL || eps->inta>PETSC_MIN_REAL,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONG,"The defined computational interval should have at least one of their sides bounded");
43
8/18
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 10 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
28 EPSCheckUnsupportedCondition(eps,EPS_FEATURE_ARBITRARY | EPS_FEATURE_REGION | EPS_FEATURE_EXTRACTION,PETSC_TRUE," with polynomial filter");
44
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
28 PetscCall(STFilterSetInterval(eps->st,eps->inta,eps->intb));
45
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
28 if (!ctx->estimatedrange) {
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.
28 PetscCall(STFilterGetRange(eps->st,&rleft,&rright));
47
3/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 1 times.
28 estimaterange = (!rleft && !rright)? PETSC_TRUE: PETSC_FALSE;
48 }
49
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 if (estimaterange) { /* user did not set a range */
50
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
28 PetscCall(STGetMatrix(eps->st,0,&A));
51
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
28 PetscCall(MatEstimateSpectralRange_EPS(A,&rleft,&rright));
52
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
28 PetscCall(PetscInfo(eps,"Setting eigenvalue range to [%g,%g]\n",(double)rleft,(double)rright));
53
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
28 PetscCall(STFilterSetRange(eps->st,rleft,rright));
54 28 ctx->estimatedrange = PETSC_TRUE;
55 }
56
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
28 if (eps->ncv==PETSC_DETERMINE && eps->nev==1) eps->nev = 40; /* user did not provide nev estimation */
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.
28 PetscCall(EPSSetDimensions_Default(eps,&eps->nev,&eps->ncv,&eps->mpd));
58
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
28 PetscCheck(eps->ncv<=eps->nev+eps->mpd,PetscObjectComm((PetscObject)eps),PETSC_ERR_USER_INPUT,"The value of ncv must not be larger than nev+mpd");
59
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.
4 PetscFunctionReturn(PETSC_SUCCESS);
60 }
61
62 212 static PetscErrorCode EPSSetUp_Subspace(EPS eps)
63 {
64 212 PetscBool isfilt;
65
66
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
212 PetscFunctionBegin;
67
4/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
212 EPSCheckDefinite(eps);
68
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
212 EPSCheckNotStructured(eps);
69
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
212 if (eps->max_it==PETSC_DETERMINE) eps->max_it = PetscMax(100,2*eps->n/eps->ncv);
70
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.
212 if (!eps->which) PetscCall(EPSSetWhichEigenpairs_Default(eps));
71
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
212 if (eps->which==EPS_ALL) {
72
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
28 if (eps->nev==0) eps->nev = 1;
73
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
28 PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STFILTER,&isfilt));
74
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
28 PetscCheck(isfilt,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Spectrum slicing not supported in this solver");
75
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
28 PetscCall(EPSSetUp_Subspace_Filter(eps));
76 } else {
77
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
184 PetscCheck(eps->which==EPS_LARGEST_MAGNITUDE || eps->which==EPS_TARGET_MAGNITUDE,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"This solver supports only largest magnitude or target magnitude eigenvalues");
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.
184 PetscCall(EPSSetDimensions_Default(eps,&eps->nev,&eps->ncv,&eps->mpd));
79 }
80
4/16
✗ 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.
✗ Branch 12 not taken.
✓ Branch 13 taken 10 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
212 EPSCheckUnsupported(eps,EPS_FEATURE_ARBITRARY | EPS_FEATURE_EXTRACTION | EPS_FEATURE_THRESHOLD | EPS_FEATURE_TWOSIDED);
81
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
212 PetscCheck(eps->converged==EPSConvergedRelative,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"This solver only supports relative convergence test");
82
83
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
212 PetscCall(EPSAllocateSolution(eps,0));
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.
212 PetscCall(EPS_SetInnerProduct(eps));
85
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.
212 if (eps->ishermitian) PetscCall(DSSetType(eps->ds,DSHEP));
86
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
61 else PetscCall(DSSetType(eps->ds,DSNHEP));
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.
212 PetscCall(DSAllocate(eps->ds,eps->ncv));
88
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.
40 PetscFunctionReturn(PETSC_SUCCESS);
89 }
90
91 212 static PetscErrorCode EPSSetUpSort_Subspace(EPS eps)
92 {
93 212 SlepcSC sc;
94
95
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
212 PetscFunctionBegin;
96
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
212 PetscCall(EPSSetUpSort_Default(eps));
97
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
212 if (eps->which==EPS_ALL) {
98
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
28 PetscCall(DSGetSlepcSC(eps->ds,&sc));
99 28 sc->rg = NULL;
100 28 sc->comparison = SlepcCompareLargestReal;
101 28 sc->comparisonctx = NULL;
102 28 sc->map = NULL;
103 28 sc->mapobj = NULL;
104 }
105
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.
40 PetscFunctionReturn(PETSC_SUCCESS);
106 }
107
108 /*
109 EPSSubspaceFindGroup - Find a group of nearly equimodular eigenvalues, provided
110 in arrays wr and wi, according to the tolerance grptol. Also the 2-norms
111 of the residuals must be passed in (rsd). Arrays are processed from index
112 l to index m only. The output information is:
113
114 ngrp - number of entries of the group
115 ctr - (w(l)+w(l+ngrp-1))/2
116 ae - average of wr(l),...,wr(l+ngrp-1)
117 arsd - average of rsd(l),...,rsd(l+ngrp-1)
118 */
119 6604 static PetscErrorCode EPSSubspaceFindGroup(PetscInt l,PetscInt m,PetscScalar *wr,PetscScalar *wi,PetscReal *rsd,PetscReal grptol,PetscInt *ngrp,PetscReal *ctr,PetscReal *ae,PetscReal *arsd)
120 {
121 6604 PetscInt i;
122 6604 PetscReal rmod,rmod1;
123
124
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
6604 PetscFunctionBegin;
125 6604 *ngrp = 0;
126 6604 *ctr = 0;
127 6604 rmod = SlepcAbsEigenvalue(wr[l],wi[l]);
128
129
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
19980 for (i=l;i<m;) {
130 16546 rmod1 = SlepcAbsEigenvalue(wr[i],wi[i]);
131
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
16546 if (PetscAbsReal(rmod-rmod1) > grptol*(rmod+rmod1)) break;
132 10166 *ctr = (rmod+rmod1)/2.0;
133
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10166 if (wi[i] == 0.0) {
134 10166 (*ngrp)++;
135 10166 i++;
136 } else {
137 (*ngrp)+=2;
138 i+=2;
139 }
140 }
141
142 6604 *ae = 0;
143 6604 *arsd = 0;
144
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
6604 if (*ngrp) {
145
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
16770 for (i=l;i<l+*ngrp;i++) {
146 10166 (*ae) += PetscRealPart(wr[i]);
147 10166 (*arsd) += rsd[i]*rsd[i];
148 }
149 6604 *ae = *ae / *ngrp;
150 6604 *arsd = PetscSqrtReal(*arsd / *ngrp);
151 }
152
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.
6604 PetscFunctionReturn(PETSC_SUCCESS);
153 }
154
155 /*
156 EPSSubspaceResidualNorms - Computes the column norms of residual vectors
157 OP*V(1:n,l:m) - V*T(1:m,l:m), where, on entry, OP*V has been computed and
158 stored in R. On exit, rsd(l) to rsd(m) contain the computed norms.
159 */
160 1951 static PetscErrorCode EPSSubspaceResidualNorms(BV R,BV V,Mat T,PetscInt l,PetscInt m,PetscScalar *eigi,PetscReal *rsd)
161 {
162 1951 PetscInt i;
163
164
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1951 PetscFunctionBegin;
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.
1951 PetscCall(BVMult(R,-1.0,1.0,V,T));
166
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.
34344 for (i=l;i<m;i++) PetscCall(BVNormColumnBegin(R,i,NORM_2,rsd+i));
167
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.
34344 for (i=l;i<m;i++) PetscCall(BVNormColumnEnd(R,i,NORM_2,rsd+i));
168 #if !defined(PETSC_USE_COMPLEX)
169
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
15691 for (i=l;i<m-1;i++) {
170
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
14742 if (eigi[i]!=0.0) {
171 rsd[i] = SlepcAbs(rsd[i],rsd[i+1]);
172 rsd[i+1] = rsd[i];
173 i++;
174 }
175 }
176 #endif
177
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.
361 PetscFunctionReturn(PETSC_SUCCESS);
178 }
179
180 212 static PetscErrorCode EPSSolve_Subspace(EPS eps)
181 {
182 212 Mat H,Q,S,T,B;
183 212 BV AV,R;
184 212 PetscBool indef;
185 212 PetscInt i,k,ld,ngrp,nogrp,*itrsd,*itrsdold;
186 212 PetscInt nxtsrr,idsrr,idort,nxtort,nv,ncv = eps->ncv,its,ninside;
187 212 PetscReal arsd,oarsd,ctr,octr,ae,oae,*rsd,*orsd,tcond=1.0,gamma;
188 212 PetscScalar *oeigr,*oeigi;
189 /* Parameters */
190 212 PetscInt init = 5; /* Number of initial iterations */
191 212 PetscReal stpfac = 1.5; /* Max num of iter before next SRR step */
192 212 PetscReal alpha = 1.0; /* Used to predict convergence of next residual */
193 212 PetscReal beta = 1.1; /* Used to predict convergence of next residual */
194 212 PetscReal grptol = SLEPC_DEFAULT_TOL; /* Tolerance for EPSSubspaceFindGroup */
195 212 PetscReal cnvtol = 1e-6; /* Convergence criterion for cnv */
196 212 PetscInt orttol = 2; /* Number of decimal digits whose loss
197 can be tolerated in orthogonalization */
198
199
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
212 PetscFunctionBegin;
200 212 its = 0;
201
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
212 PetscCall(PetscMalloc6(ncv,&rsd,ncv,&orsd,ncv,&oeigr,ncv,&oeigi,ncv,&itrsd,ncv,&itrsdold));
202
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
212 PetscCall(DSGetLeadingDimension(eps->ds,&ld));
203
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
212 PetscCall(BVDuplicate(eps->V,&AV));
204
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
212 PetscCall(BVDuplicate(eps->V,&R));
205
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
212 PetscCall(STGetOperator(eps->st,&S));
206
207
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4046 for (i=0;i<ncv;i++) {
208 3834 rsd[i] = 0.0;
209 3834 itrsd[i] = -1;
210 }
211
212 /* Complete the initial basis with random vectors and orthonormalize them */
213
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4016 for (k=eps->nini;k<ncv;k++) {
214
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3804 PetscCall(BVSetRandomColumn(eps->V,k));
215
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3804 PetscCall(BVOrthonormalizeColumn(eps->V,k,PETSC_TRUE,NULL,NULL));
216 }
217
218
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
1951 while (eps->reason == EPS_CONVERGED_ITERATING) {
219 1951 eps->its++;
220 1951 nv = PetscMin(eps->nconv+eps->mpd,ncv);
221
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1951 PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,0));
222
223
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
34344 for (i=eps->nconv;i<nv;i++) {
224 32393 oeigr[i] = eps->eigr[i];
225 32393 oeigi[i] = eps->eigi[i];
226 32393 orsd[i] = rsd[i];
227 }
228
229 /* AV(:,idx) = OP * V(:,idx) */
230
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1951 PetscCall(BVSetActiveColumns(eps->V,eps->nconv,nv));
231
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1951 PetscCall(BVSetActiveColumns(AV,eps->nconv,nv));
232
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1951 PetscCall(BVMatMult(eps->V,S,AV));
233
234 /* T(:,idx) = V' * AV(:,idx) */
235
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1951 PetscCall(BVSetActiveColumns(eps->V,0,nv));
236
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1951 PetscCall(DSGetMat(eps->ds,DS_MAT_A,&H));
237
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1951 PetscCall(BVDot(AV,eps->V,H));
238
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1951 PetscCall(DSRestoreMat(eps->ds,DS_MAT_A,&H));
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.
1951 PetscCall(DSSetState(eps->ds,DS_STATE_RAW));
240
241 /* Solve projected problem */
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.
1951 PetscCall(DSSolve(eps->ds,eps->eigr,eps->eigi));
243
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1951 PetscCall(DSSort(eps->ds,eps->eigr,eps->eigi,NULL,NULL,NULL));
244
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1951 PetscCall(DSSynchronize(eps->ds,eps->eigr,eps->eigi));
245
246 /* Update vectors V(:,idx) = V * U(:,idx) */
247
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1951 PetscCall(DSGetMat(eps->ds,DS_MAT_Q,&Q));
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.
1951 PetscCall(BVSetActiveColumns(AV,0,nv));
249
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1951 PetscCall(BVSetActiveColumns(R,0,nv));
250
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1951 PetscCall(BVMultInPlace(eps->V,Q,eps->nconv,nv));
251
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1951 PetscCall(BVMultInPlace(AV,Q,eps->nconv,nv));
252
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1951 PetscCall(DSRestoreMat(eps->ds,DS_MAT_Q,&Q));
253
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1951 PetscCall(BVCopy(AV,R));
254
255 /* Convergence check */
256
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1951 PetscCall(DSGetMat(eps->ds,DS_MAT_A,&T));
257
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1951 PetscCall(EPSSubspaceResidualNorms(R,eps->V,T,eps->nconv,nv,eps->eigi,rsd));
258
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1951 PetscCall(DSRestoreMat(eps->ds,DS_MAT_A,&T));
259
260
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
1951 if (eps->which==EPS_ALL && eps->its>1) { /* adjust eigenvalue count */
261 289 ninside = 0;
262
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
289 PetscCall(STFilterGetThreshold(eps->st,&gamma));
263
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
2567 for (i=eps->nconv;i<nv;i++) {
264
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2567 if (PetscRealPart(eps->eigr[i]) < gamma) break;
265 2278 ninside++;
266 }
267 289 eps->nev = eps->nconv+ninside;
268 }
269
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
34344 for (i=eps->nconv;i<nv;i++) {
270 32393 itrsdold[i] = itrsd[i];
271 32393 itrsd[i] = its;
272 32393 eps->errest[i] = rsd[i];
273 }
274
275 3302 for (;;) {
276 /* Find clusters of computed eigenvalues */
277
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3302 PetscCall(EPSSubspaceFindGroup(eps->nconv,nv,eps->eigr,eps->eigi,eps->errest,grptol,&ngrp,&ctr,&ae,&arsd));
278
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3302 PetscCall(EPSSubspaceFindGroup(eps->nconv,nv,oeigr,oeigi,orsd,grptol,&nogrp,&octr,&oae,&oarsd));
279
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3302 if (ngrp!=nogrp) break;
280
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
3090 if (ngrp==0) break;
281
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3090 if (PetscAbsReal(ae-oae)>ctr*cnvtol*(itrsd[eps->nconv]-itrsdold[eps->nconv])) break;
282
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2283 if (arsd>ctr*eps->tol) break;
283 1357 eps->nconv = eps->nconv + ngrp;
284
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 6 times.
1357 if (eps->nconv>=nv) break;
285 }
286
287
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1951 PetscCall(EPSMonitor(eps,eps->its,eps->nconv,eps->eigr,eps->eigi,eps->errest,nv));
288
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1951 PetscCall((*eps->stopping)(eps,eps->its,eps->max_it,eps->nconv,eps->nev,&eps->reason,eps->stoppingctx));
289
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1951 if (eps->reason != EPS_CONVERGED_ITERATING) break;
290
291 /* Compute nxtsrr (iteration of next projection step) */
292 1739 nxtsrr = PetscMin(eps->max_it,PetscMax((PetscInt)PetscFloorReal(stpfac*its),init));
293
294
5/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
1739 if (ngrp!=nogrp || ngrp==0 || arsd>=oarsd) {
295 242 idsrr = nxtsrr - its;
296 } else {
297 1497 idsrr = (PetscInt)PetscFloorReal(alpha+beta*(itrsdold[eps->nconv]-itrsd[eps->nconv])*PetscLogReal(arsd/eps->tol)/PetscLogReal(arsd/oarsd));
298 1497 idsrr = PetscMax(1,idsrr);
299 }
300 1739 nxtsrr = PetscMin(nxtsrr,its+idsrr);
301
302 /* Compute nxtort (iteration of next orthogonalization step) */
303
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1739 PetscCall(DSCond(eps->ds,&tcond));
304
5/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
1739 idort = PetscMax(1,(PetscInt)PetscFloorReal(orttol/PetscMax(1,PetscLog10Real(tcond))));
305 1739 nxtort = PetscMin(its+idort,nxtsrr);
306
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1739 PetscCall(PetscInfo(eps,"Updated iteration counts: nxtort=%" PetscInt_FMT ", nxtsrr=%" PetscInt_FMT "\n",nxtort,nxtsrr));
307
308 /* V(:,idx) = AV(:,idx) */
309
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1739 PetscCall(BVSetActiveColumns(eps->V,eps->nconv,nv));
310
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1739 PetscCall(BVSetActiveColumns(AV,eps->nconv,nv));
311
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1739 PetscCall(BVCopy(AV,eps->V));
312 1739 its++;
313
314 /* Orthogonalization loop */
315 19243 do {
316
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
19243 PetscCall(BVGetMatrix(eps->V,&B,&indef));
317
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
19243 PetscCall(BVSetMatrix(eps->V,NULL,PETSC_FALSE));
318
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
53799 while (its<nxtort) {
319 /* A(:,idx) = OP*V(:,idx) with normalization */
320
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
34556 PetscCall(BVMatMult(eps->V,S,AV));
321
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
34556 PetscCall(BVCopy(AV,eps->V));
322
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
34556 PetscCall(BVNormalize(eps->V,NULL));
323 34556 its++;
324 }
325
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
19243 PetscCall(BVSetMatrix(eps->V,B,indef));
326 /* Orthonormalize vectors */
327
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
19243 PetscCall(BVOrthogonalize(eps->V,NULL));
328 19243 nxtort = PetscMin(its+idort,nxtsrr);
329
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
19243 } while (its<nxtsrr);
330 }
331
332
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
212 PetscCall(PetscFree6(rsd,orsd,oeigr,oeigi,itrsd,itrsdold));
333
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
212 PetscCall(BVDestroy(&AV));
334
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
212 PetscCall(BVDestroy(&R));
335
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
212 PetscCall(STRestoreOperator(eps->st,&S));
336
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
212 PetscCall(DSTruncate(eps->ds,eps->nconv,PETSC_TRUE));
337
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.
40 PetscFunctionReturn(PETSC_SUCCESS);
338 }
339
340 192 static PetscErrorCode EPSDestroy_Subspace(EPS eps)
341 {
342
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
192 PetscFunctionBegin;
343
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.
192 PetscCall(PetscFree(eps->data));
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.
36 PetscFunctionReturn(PETSC_SUCCESS);
345 }
346
347 /*MC
348 EPSSUBSPACE - EPSSUBSPACE = "subspace" - The simple subspace iteration method.
349
350 Notes:
351 This solver is very basic and is not recommended in general, since it
352 will not be competitive with respect to other solvers.
353
354 The implemented method is subspace iteration with Rayleigh-Ritz projection and
355 locking, based on the SRRIT code {cite:p}`Bai97`.
356
357 Level: beginner
358
359 .seealso: [](ch:eps), `EPS`, `EPSType`, `EPSSetType()`
360 M*/
361 192 SLEPC_EXTERN PetscErrorCode EPSCreate_Subspace(EPS eps)
362 {
363 192 EPS_SUBSPACE *ctx;
364
365
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
192 PetscFunctionBegin;
366
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
192 PetscCall(PetscNew(&ctx));
367 192 eps->data = (void*)ctx;
368
369 192 eps->useds = PETSC_TRUE;
370 192 eps->categ = EPS_CATEGORY_OTHER;
371
372 192 eps->ops->solve = EPSSolve_Subspace;
373 192 eps->ops->setup = EPSSetUp_Subspace;
374 192 eps->ops->setupsort = EPSSetUpSort_Subspace;
375 192 eps->ops->destroy = EPSDestroy_Subspace;
376 192 eps->ops->backtransform = EPSBackTransform_Default;
377 192 eps->ops->computevectors = EPSComputeVectors_Schur;
378
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.
192 PetscFunctionReturn(PETSC_SUCCESS);
379 }
380