GCC Code Coverage Report


Directory: ./
File: src/eps/impls/subspace/subspace.c
Date: 2026-02-22 03:58:10
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 20 static PetscErrorCode EPSSetUp_Subspace_Filter(EPS eps)
33 {
34 20 EPS_SUBSPACE *ctx = (EPS_SUBSPACE*)eps->data;
35 20 PetscBool estimaterange=PETSC_TRUE;
36 20 PetscReal rleft,rright;
37 20 Mat A;
38
39
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
20 PetscFunctionBegin;
40
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
20 EPSCheckHermitianCondition(eps,PETSC_TRUE," with polynomial filter");
41
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
20 EPSCheckStandardCondition(eps,PETSC_TRUE," with polynomial filter");
42
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
20 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 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 6 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 8 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.
20 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
20 PetscCall(STFilterSetInterval(eps->st,eps->inta,eps->intb));
45
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
20 if (!ctx->estimatedrange) {
46
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
20 PetscCall(STFilterGetRange(eps->st,&rleft,&rright));
47
3/4
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 7 times.
✓ Branch 3 taken 1 times.
20 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
20 PetscCall(STGetMatrix(eps->st,0,&A));
51
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
20 PetscCall(MatEstimateSpectralRange_EPS(A,&rleft,&rright));
52
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
20 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
20 PetscCall(STFilterSetRange(eps->st,rleft,rright));
54 20 ctx->estimatedrange = PETSC_TRUE;
55 }
56
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
20 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
20 PetscCall(EPSSetDimensions_Default(eps,&eps->nev,&eps->ncv,&eps->mpd));
58
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
20 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 166 static PetscErrorCode EPSSetUp_Subspace(EPS eps)
63 {
64 166 PetscBool isfilt;
65
66
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
166 PetscFunctionBegin;
67
4/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
166 EPSCheckDefinite(eps);
68
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
166 EPSCheckNotStructured(eps);
69
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
166 if (eps->max_it==PETSC_DETERMINE) eps->max_it = PetscMax(100,2*eps->n/eps->ncv);
70
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
166 if (!eps->which) PetscCall(EPSSetWhichEigenpairs_Default(eps));
71
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
166 if (eps->which==EPS_ALL) {
72
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
20 if (eps->nev==0) eps->nev = 1;
73
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
20 PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STFILTER,&isfilt));
74
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
20 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
20 PetscCall(EPSSetUp_Subspace_Filter(eps));
76 } else {
77
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
146 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
146 PetscCall(EPSSetDimensions_Default(eps,&eps->nev,&eps->ncv,&eps->mpd));
79 }
80
4/16
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 8 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 8 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
166 EPSCheckUnsupported(eps,EPS_FEATURE_ARBITRARY | EPS_FEATURE_EXTRACTION | EPS_FEATURE_THRESHOLD | EPS_FEATURE_TWOSIDED);
81
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
166 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
166 PetscCall(EPSAllocateSolution(eps,0));
84
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
166 PetscCall(EPS_SetInnerProduct(eps));
85
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
166 if (eps->ishermitian) PetscCall(DSSetType(eps->ds,DSHEP));
86
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
50 else PetscCall(DSSetType(eps->ds,DSNHEP));
87
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
166 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 166 static PetscErrorCode EPSSetUpSort_Subspace(EPS eps)
92 {
93 166 SlepcSC sc;
94
95
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
166 PetscFunctionBegin;
96
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
166 PetscCall(EPSSetUpSort_Default(eps));
97
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
166 if (eps->which==EPS_ALL) {
98
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
20 PetscCall(DSGetSlepcSC(eps->ds,&sc));
99 20 sc->rg = NULL;
100 20 sc->comparison = SlepcCompareLargestReal;
101 20 sc->comparisonctx = NULL;
102 20 sc->map = NULL;
103 20 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 5154 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 5154 PetscInt i;
122 5154 PetscReal rmod,rmod1;
123
124
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
5154 PetscFunctionBegin;
125 5154 *ngrp = 0;
126 5154 *ctr = 0;
127 5154 rmod = SlepcAbsEigenvalue(wr[l],wi[l]);
128
129
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
15582 for (i=l;i<m;) {
130 12898 rmod1 = SlepcAbsEigenvalue(wr[i],wi[i]);
131
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
12898 if (PetscAbsReal(rmod-rmod1) > grptol*(rmod+rmod1)) break;
132 7922 *ctr = (rmod+rmod1)/2.0;
133
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
7922 if (wi[i] == 0.0) {
134 7922 (*ngrp)++;
135 7922 i++;
136 } else {
137 (*ngrp)+=2;
138 i+=2;
139 }
140 }
141
142 5154 *ae = 0;
143 5154 *arsd = 0;
144
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
5154 if (*ngrp) {
145
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
13076 for (i=l;i<l+*ngrp;i++) {
146 7922 (*ae) += PetscRealPart(wr[i]);
147 7922 (*arsd) += rsd[i]*rsd[i];
148 }
149 5154 *ae = *ae / *ngrp;
150 5154 *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.
5154 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 1516 static PetscErrorCode EPSSubspaceResidualNorms(BV R,BV V,Mat T,PetscInt l,PetscInt m,PetscScalar *eigi,PetscReal *rsd)
161 {
162 1516 PetscInt i;
163
164
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1516 PetscFunctionBegin;
165
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1516 PetscCall(BVMult(R,-1.0,1.0,V,T));
166
7/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
26496 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 6 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
26496 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 4 times.
✓ Branch 1 taken 4 times.
12089 for (i=l;i<m-1;i++) {
170
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
11352 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 166 static PetscErrorCode EPSSolve_Subspace(EPS eps)
181 {
182 166 Mat H,Q,S,T,B;
183 166 BV AV,R;
184 166 PetscBool indef;
185 166 PetscInt i,k,ld,ngrp,nogrp,*itrsd,*itrsdold;
186 166 PetscInt nxtsrr,idsrr,idort,nxtort,nv,ncv = eps->ncv,its,ninside;
187 166 PetscReal arsd,oarsd,ctr,octr,ae,oae,*rsd,*orsd,tcond=1.0,gamma;
188 166 PetscScalar *oeigr,*oeigi;
189 /* Parameters */
190 166 PetscInt init = 5; /* Number of initial iterations */
191 166 PetscReal stpfac = 1.5; /* Max num of iter before next SRR step */
192 166 PetscReal alpha = 1.0; /* Used to predict convergence of next residual */
193 166 PetscReal beta = 1.1; /* Used to predict convergence of next residual */
194 166 PetscReal grptol = SLEPC_DEFAULT_TOL; /* Tolerance for EPSSubspaceFindGroup */
195 166 PetscReal cnvtol = 1e-6; /* Convergence criterion for cnv */
196 166 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.
166 PetscFunctionBegin;
200 166 its = 0;
201
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
166 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
166 PetscCall(DSGetLeadingDimension(eps->ds,&ld));
203
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
166 PetscCall(BVDuplicate(eps->V,&AV));
204
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
166 PetscCall(BVDuplicate(eps->V,&R));
205
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
166 PetscCall(STGetOperator(eps->st,&S));
206
207
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
3148 for (i=0;i<ncv;i++) {
208 2982 rsd[i] = 0.0;
209 2982 itrsd[i] = -1;
210 }
211
212 /* Complete the initial basis with random vectors and orthonormalize them */
213
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
3124 for (k=eps->nini;k<ncv;k++) {
214
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2958 PetscCall(BVSetRandomColumn(eps->V,k));
215
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2958 PetscCall(BVOrthonormalizeColumn(eps->V,k,PETSC_TRUE,NULL,NULL));
216 }
217
218
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
1516 while (eps->reason == EPS_CONVERGED_ITERATING) {
219 1516 eps->its++;
220 1516 nv = PetscMin(eps->nconv+eps->mpd,ncv);
221
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1516 PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,0));
222
223
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
26496 for (i=eps->nconv;i<nv;i++) {
224 24980 oeigr[i] = eps->eigr[i];
225 24980 oeigi[i] = eps->eigi[i];
226 24980 orsd[i] = rsd[i];
227 }
228
229 /* AV(:,idx) = OP * V(:,idx) */
230
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1516 PetscCall(BVSetActiveColumns(eps->V,eps->nconv,nv));
231
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1516 PetscCall(BVSetActiveColumns(AV,eps->nconv,nv));
232
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1516 PetscCall(BVMatMult(eps->V,S,AV));
233
234 /* T(:,idx) = V' * AV(:,idx) */
235
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1516 PetscCall(BVSetActiveColumns(eps->V,0,nv));
236
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1516 PetscCall(DSGetMat(eps->ds,DS_MAT_A,&H));
237
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1516 PetscCall(BVDot(AV,eps->V,H));
238
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1516 PetscCall(DSRestoreMat(eps->ds,DS_MAT_A,&H));
239
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1516 PetscCall(DSSetState(eps->ds,DS_STATE_RAW));
240
241 /* Solve projected problem */
242
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1516 PetscCall(DSSolve(eps->ds,eps->eigr,eps->eigi));
243
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1516 PetscCall(DSSort(eps->ds,eps->eigr,eps->eigi,NULL,NULL,NULL));
244
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1516 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1516 PetscCall(DSGetMat(eps->ds,DS_MAT_Q,&Q));
248
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1516 PetscCall(BVSetActiveColumns(AV,0,nv));
249
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1516 PetscCall(BVSetActiveColumns(R,0,nv));
250
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1516 PetscCall(BVMultInPlace(eps->V,Q,eps->nconv,nv));
251
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1516 PetscCall(BVMultInPlace(AV,Q,eps->nconv,nv));
252
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1516 PetscCall(DSRestoreMat(eps->ds,DS_MAT_Q,&Q));
253
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1516 PetscCall(BVCopy(AV,R));
254
255 /* Convergence check */
256
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1516 PetscCall(DSGetMat(eps->ds,DS_MAT_A,&T));
257
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1516 PetscCall(EPSSubspaceResidualNorms(R,eps->V,T,eps->nconv,nv,eps->eigi,rsd));
258
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1516 PetscCall(DSRestoreMat(eps->ds,DS_MAT_A,&T));
259
260
4/4
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
1516 if (eps->which==EPS_ALL && eps->its>1) { /* adjust eigenvalue count */
261 207 ninside = 0;
262
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
207 PetscCall(STFilterGetThreshold(eps->st,&gamma));
263
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
1833 for (i=eps->nconv;i<nv;i++) {
264
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
1833 if (PetscRealPart(eps->eigr[i]) < gamma) break;
265 1626 ninside++;
266 }
267 207 eps->nev = eps->nconv+ninside;
268 }
269
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
26496 for (i=eps->nconv;i<nv;i++) {
270 24980 itrsdold[i] = itrsd[i];
271 24980 itrsd[i] = its;
272 24980 eps->errest[i] = rsd[i];
273 }
274
275 2577 for (;;) {
276 /* Find clusters of computed eigenvalues */
277
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2577 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2577 PetscCall(EPSSubspaceFindGroup(eps->nconv,nv,oeigr,oeigi,orsd,grptol,&nogrp,&octr,&oae,&oarsd));
279
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
2577 if (ngrp!=nogrp) break;
280
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
2411 if (ngrp==0) break;
281
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
2411 if (PetscAbsReal(ae-oae)>ctr*cnvtol*(itrsd[eps->nconv]-itrsdold[eps->nconv])) break;
282
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
1781 if (arsd>ctr*eps->tol) break;
283 1067 eps->nconv = eps->nconv + ngrp;
284
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 6 times.
1067 if (eps->nconv>=nv) break;
285 }
286
287
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1516 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1516 PetscCall((*eps->stopping)(eps,eps->its,eps->max_it,eps->nconv,eps->nev,&eps->reason,eps->stoppingctx));
289
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
1516 if (eps->reason != EPS_CONVERGED_ITERATING) break;
290
291 /* Compute nxtsrr (iteration of next projection step) */
292 1350 nxtsrr = PetscMax((PetscInt)PetscFloorReal(stpfac*its),init);
293
294
5/6
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✓ Branch 5 taken 8 times.
1350 if (ngrp!=nogrp || ngrp==0 || arsd>=oarsd) {
295 190 idsrr = nxtsrr - its;
296 } else {
297 1160 idsrr = (PetscInt)PetscFloorReal(alpha+beta*(itrsdold[eps->nconv]-itrsd[eps->nconv])*PetscLogReal(arsd/eps->tol)/PetscLogReal(arsd/oarsd));
298 1160 idsrr = PetscMax(1,idsrr);
299 }
300 1350 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1350 PetscCall(DSCond(eps->ds,&tcond));
304
5/6
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
1350 idort = PetscMax(1,(PetscInt)PetscFloorReal(orttol/PetscMax(1,PetscLog10Real(tcond))));
305 1350 nxtort = PetscMin(its+idort,nxtsrr);
306
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1350 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1350 PetscCall(BVSetActiveColumns(eps->V,eps->nconv,nv));
310
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1350 PetscCall(BVSetActiveColumns(AV,eps->nconv,nv));
311
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1350 PetscCall(BVCopy(AV,eps->V));
312 1350 its++;
313
314 /* Orthogonalization loop */
315 15229 do {
316
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
15229 PetscCall(BVGetMatrix(eps->V,&B,&indef));
317
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
15229 PetscCall(BVSetMatrix(eps->V,NULL,PETSC_FALSE));
318
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
42631 while (its<nxtort) {
319 /* A(:,idx) = OP*V(:,idx) with normalization */
320
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
27402 PetscCall(BVMatMult(eps->V,S,AV));
321
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
27402 PetscCall(BVCopy(AV,eps->V));
322
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
27402 PetscCall(BVNormalize(eps->V,NULL));
323 27402 its++;
324 }
325
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
15229 PetscCall(BVSetMatrix(eps->V,B,indef));
326 /* Orthonormalize vectors */
327
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
15229 PetscCall(BVOrthogonalize(eps->V,NULL));
328 15229 nxtort = PetscMin(its+idort,nxtsrr);
329
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
15229 } while (its<nxtsrr);
330 }
331
332
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
166 PetscCall(PetscFree6(rsd,orsd,oeigr,oeigi,itrsd,itrsdold));
333
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
166 PetscCall(BVDestroy(&AV));
334
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
166 PetscCall(BVDestroy(&R));
335
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
166 PetscCall(STRestoreOperator(eps->st,&S));
336
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
166 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 150 static PetscErrorCode EPSDestroy_Subspace(EPS eps)
341 {
342
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
150 PetscFunctionBegin;
343
5/8
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
150 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 150 SLEPC_EXTERN PetscErrorCode EPSCreate_Subspace(EPS eps)
362 {
363 150 EPS_SUBSPACE *ctx;
364
365
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
150 PetscFunctionBegin;
366
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
150 PetscCall(PetscNew(&ctx));
367 150 eps->data = (void*)ctx;
368
369 150 eps->useds = PETSC_TRUE;
370 150 eps->categ = EPS_CATEGORY_OTHER;
371
372 150 eps->ops->solve = EPSSolve_Subspace;
373 150 eps->ops->setup = EPSSetUp_Subspace;
374 150 eps->ops->setupsort = EPSSetUpSort_Subspace;
375 150 eps->ops->destroy = EPSDestroy_Subspace;
376 150 eps->ops->backtransform = EPSBackTransform_Default;
377 150 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.
150 PetscFunctionReturn(PETSC_SUCCESS);
379 }
380