GCC Code Coverage Report


Directory: ./
File: src/eps/impls/subspace/subspace.c
Date: 2025-11-19 04:19:03
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 8 times.
✓ Branch 3 taken 2 times.
28 estimaterange = (!rleft && !rright)? PETSC_TRUE: PETSC_FALSE;
48 }
49
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
4 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 207 static PetscErrorCode EPSSetUp_Subspace(EPS eps)
63 {
64 207 PetscBool isfilt;
65
66
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
207 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.
207 EPSCheckDefinite(eps);
68
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
207 EPSCheckNotStructured(eps);
69
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
207 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.
207 if (!eps->which) PetscCall(EPSSetWhichEigenpairs_Default(eps));
71
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
207 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.
179 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.
179 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.
207 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.
207 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.
207 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.
207 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.
207 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.
56 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.
207 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.
39 PetscFunctionReturn(PETSC_SUCCESS);
89 }
90
91 207 static PetscErrorCode EPSSetUpSort_Subspace(EPS eps)
92 {
93 207 SlepcSC sc;
94
95
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
207 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.
207 PetscCall(EPSSetUpSort_Default(eps));
97
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
207 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.
39 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 6560 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 6560 PetscInt i;
122 6560 PetscReal rmod,rmod1;
123
124
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
6560 PetscFunctionBegin;
125 6560 *ngrp = 0;
126 6560 *ctr = 0;
127 6560 rmod = SlepcAbsEigenvalue(wr[l],wi[l]);
128
129
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
19768 for (i=l;i<m;) {
130 16383 rmod1 = SlepcAbsEigenvalue(wr[i],wi[i]);
131
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
16383 if (PetscAbsReal(rmod-rmod1) > grptol*(rmod+rmod1)) break;
132 10042 *ctr = (rmod+rmod1)/2.0;
133
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10042 if (wi[i] == 0.0) {
134 10042 (*ngrp)++;
135 10042 i++;
136 } else {
137 (*ngrp)+=2;
138 i+=2;
139 }
140 }
141
142 6560 *ae = 0;
143 6560 *arsd = 0;
144
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
6560 if (*ngrp) {
145
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
16602 for (i=l;i<l+*ngrp;i++) {
146 10042 (*ae) += PetscRealPart(wr[i]);
147 10042 (*arsd) += rsd[i]*rsd[i];
148 }
149 6560 *ae = *ae / *ngrp;
150 6560 *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.
6560 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 1939 static PetscErrorCode EPSSubspaceResidualNorms(BV R,BV V,Mat T,PetscInt l,PetscInt m,PetscScalar *eigi,PetscReal *rsd)
161 {
162 1939 PetscInt i;
163
164
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1939 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.
1939 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.
34128 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.
34128 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.
15487 for (i=l;i<m-1;i++) {
170
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
14550 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.
357 PetscFunctionReturn(PETSC_SUCCESS);
178 }
179
180 207 static PetscErrorCode EPSSolve_Subspace(EPS eps)
181 {
182 207 Mat H,Q,S,T,B;
183 207 BV AV,R;
184 207 PetscBool indef;
185 207 PetscInt i,k,ld,ngrp,nogrp,*itrsd,*itrsdold;
186 207 PetscInt nxtsrr,idsrr,idort,nxtort,nv,ncv = eps->ncv,its,ninside;
187 207 PetscReal arsd,oarsd,ctr,octr,ae,oae,*rsd,*orsd,tcond=1.0,gamma;
188 207 PetscScalar *oeigr,*oeigi;
189 /* Parameters */
190 207 PetscInt init = 5; /* Number of initial iterations */
191 207 PetscReal stpfac = 1.5; /* Max num of iter before next SRR step */
192 207 PetscReal alpha = 1.0; /* Used to predict convergence of next residual */
193 207 PetscReal beta = 1.1; /* Used to predict convergence of next residual */
194 207 PetscReal grptol = SLEPC_DEFAULT_TOL; /* Tolerance for EPSSubspaceFindGroup */
195 207 PetscReal cnvtol = 1e-6; /* Convergence criterion for cnv */
196 207 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.
207 PetscFunctionBegin;
200 207 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.
207 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.
207 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.
207 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.
207 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.
207 PetscCall(STGetOperator(eps->st,&S));
206
207
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3956 for (i=0;i<ncv;i++) {
208 3749 rsd[i] = 0.0;
209 3749 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.
3936 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.
3729 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.
3729 PetscCall(BVOrthonormalizeColumn(eps->V,k,PETSC_TRUE,NULL,NULL));
216 }
217
218
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
1939 while (eps->reason == EPS_CONVERGED_ITERATING) {
219 1939 eps->its++;
220 1939 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.
1939 PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,0));
222
223
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
34128 for (i=eps->nconv;i<nv;i++) {
224 32189 oeigr[i] = eps->eigr[i];
225 32189 oeigi[i] = eps->eigi[i];
226 32189 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.
1939 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.
1939 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.
1939 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.
1939 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.
1939 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.
1939 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.
1939 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.
1939 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.
1939 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.
1939 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.
1939 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.
1939 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.
1939 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.
1939 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.
1939 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.
1939 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.
1939 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.
1939 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.
1939 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.
1939 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.
1939 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.
1939 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.
34128 for (i=eps->nconv;i<nv;i++) {
270 32189 itrsdold[i] = itrsd[i];
271 32189 itrsd[i] = its;
272 32189 eps->errest[i] = rsd[i];
273 }
274
275 3280 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.
3280 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.
3280 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.
3280 if (ngrp!=nogrp) break;
280
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
3073 if (ngrp==0) break;
281
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3073 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.
2271 if (arsd>ctr*eps->tol) break;
283 1347 eps->nconv = eps->nconv + ngrp;
284
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 6 times.
1347 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.
1939 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.
1939 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.
1939 if (eps->reason != EPS_CONVERGED_ITERATING) break;
290
291 /* Compute nxtsrr (iteration of next projection step) */
292 1732 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.
1732 if (ngrp!=nogrp || ngrp==0 || arsd>=oarsd) {
295 237 idsrr = nxtsrr - its;
296 } else {
297 1495 idsrr = (PetscInt)PetscFloorReal(alpha+beta*(itrsdold[eps->nconv]-itrsd[eps->nconv])*PetscLogReal(arsd/eps->tol)/PetscLogReal(arsd/oarsd));
298 1495 idsrr = PetscMax(1,idsrr);
299 }
300 1732 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.
1732 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.
1732 idort = PetscMax(1,(PetscInt)PetscFloorReal(orttol/PetscMax(1,PetscLog10Real(tcond))));
305 1732 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.
1732 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.
1732 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.
1732 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.
1732 PetscCall(BVCopy(AV,eps->V));
312 1732 its++;
313
314 /* Orthogonalization loop */
315 19216 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.
19216 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.
19216 PetscCall(BVSetMatrix(eps->V,NULL,PETSC_FALSE));
318
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
53751 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.
34535 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.
34535 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.
34535 PetscCall(BVNormalize(eps->V,NULL));
323 34535 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.
19216 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.
19216 PetscCall(BVOrthogonalize(eps->V,NULL));
328 19216 nxtort = PetscMin(its+idort,nxtsrr);
329
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
19216 } 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.
207 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.
207 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.
207 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.
207 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.
207 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.
39 PetscFunctionReturn(PETSC_SUCCESS);
338 }
339
340 187 static PetscErrorCode EPSDestroy_Subspace(EPS eps)
341 {
342
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
187 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.
187 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.
35 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 187 SLEPC_EXTERN PetscErrorCode EPSCreate_Subspace(EPS eps)
362 {
363 187 EPS_SUBSPACE *ctx;
364
365
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
187 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.
187 PetscCall(PetscNew(&ctx));
367 187 eps->data = (void*)ctx;
368
369 187 eps->useds = PETSC_TRUE;
370 187 eps->categ = EPS_CATEGORY_OTHER;
371
372 187 eps->ops->solve = EPSSolve_Subspace;
373 187 eps->ops->setup = EPSSetUp_Subspace;
374 187 eps->ops->setupsort = EPSSetUpSort_Subspace;
375 187 eps->ops->destroy = EPSDestroy_Subspace;
376 187 eps->ops->backtransform = EPSBackTransform_Default;
377 187 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.
187 PetscFunctionReturn(PETSC_SUCCESS);
379 }
380