GCC Code Coverage Report


Directory: ./
File: src/eps/impls/subspace/subspace.c
Date: 2026-04-06 03:57:41
Exec Total Coverage
Lines: 214 224 95.5%
Functions: 8 8 100.0%
Branches: 462 754 61.3%

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
4/6
✓ Branch 0 taken 2 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(EPSSetStoppingTest(eps,EPS_STOP_THRESHOLD));
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 222 static PetscErrorCode EPSSetUp_Subspace(EPS eps)
63 {
64 222 PetscBool isfilt;
65
66
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
222 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.
222 EPSCheckDefinite(eps);
68
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
222 EPSCheckNotStructured(eps);
69
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
222 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.
222 if (!eps->which) PetscCall(EPSSetWhichEigenpairs_Default(eps));
71
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
222 if (eps->which==EPS_ALL) {
72
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
28 PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STFILTER,&isfilt));
73
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");
74
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
28 PetscCall(EPSSetUp_Subspace_Filter(eps));
75 } else {
76
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
194 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");
77
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
194 PetscCall(EPSSetDimensions_Default(eps,&eps->nev,&eps->ncv,&eps->mpd));
78 }
79
3/12
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 10 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
222 EPSCheckUnsupported(eps,EPS_FEATURE_ARBITRARY | EPS_FEATURE_EXTRACTION | EPS_FEATURE_TWOSIDED);
80
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
222 PetscCheck(eps->converged==EPSConvergedRelative,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"This solver only supports relative convergence test");
81
82
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
222 PetscCall(EPSAllocateSolution(eps,0));
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.
222 PetscCall(EPS_SetInnerProduct(eps));
84
6/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
222 if (eps->ishermitian) PetscCall(DSSetType(eps->ds,DSHEP));
85
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
61 else PetscCall(DSSetType(eps->ds,DSNHEP));
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.
222 PetscCall(DSAllocate(eps->ds,eps->ncv));
87
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.
42 PetscFunctionReturn(PETSC_SUCCESS);
88 }
89
90 222 static PetscErrorCode EPSSetUpSort_Subspace(EPS eps)
91 {
92 222 SlepcSC sc;
93
94
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
222 PetscFunctionBegin;
95
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
222 PetscCall(EPSSetUpSort_Default(eps));
96
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
222 if (eps->which==EPS_ALL) {
97
4/6
✓ Branch 0 taken 2 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));
98 28 sc->rg = NULL;
99 28 sc->comparison = SlepcCompareLargestReal;
100 28 sc->comparisonctx = NULL;
101 28 sc->map = NULL;
102 28 sc->mapobj = NULL;
103 }
104
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.
42 PetscFunctionReturn(PETSC_SUCCESS);
105 }
106
107 /*
108 EPSSubspaceFindGroup - Find a group of nearly equimodular eigenvalues, provided
109 in arrays wr and wi, according to the tolerance grptol. Also the 2-norms
110 of the residuals must be passed in (rsd). Arrays are processed from index
111 l to index m only. The output information is:
112
113 ngrp - number of entries of the group
114 ctr - (w(l)+w(l+ngrp-1))/2
115 ae - average of wr(l),...,wr(l+ngrp-1)
116 arsd - average of rsd(l),...,rsd(l+ngrp-1)
117 */
118 6926 static PetscErrorCode EPSSubspaceFindGroup(PetscInt l,PetscInt m,PetscScalar *wr,PetscScalar *wi,PetscReal *rsd,PetscReal grptol,PetscInt *ngrp,PetscReal *ctr,PetscReal *ae,PetscReal *arsd)
119 {
120 6926 PetscInt i;
121 6926 PetscReal rmod,rmod1;
122
123
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
6926 PetscFunctionBegin;
124 6926 *ngrp = 0;
125 6926 *ctr = 0;
126 6926 rmod = SlepcAbsEigenvalue(wr[l],wi[l]);
127
128
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
20938 for (i=l;i<m;) {
129 17320 rmod1 = SlepcAbsEigenvalue(wr[i],wi[i]);
130
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
17320 if (PetscAbsReal(rmod-rmod1) > grptol*(rmod+rmod1)) break;
131 10628 *ctr = (rmod+rmod1)/2.0;
132
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10628 if (wi[i] == 0.0) {
133 10628 (*ngrp)++;
134 10628 i++;
135 } else {
136 (*ngrp)+=2;
137 i+=2;
138 }
139 }
140
141 6926 *ae = 0;
142 6926 *arsd = 0;
143
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
6926 if (*ngrp) {
144
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
17554 for (i=l;i<l+*ngrp;i++) {
145 10628 (*ae) += PetscRealPart(wr[i]);
146 10628 (*arsd) += rsd[i]*rsd[i];
147 }
148 6926 *ae = *ae / *ngrp;
149 6926 *arsd = PetscSqrtReal(*arsd / *ngrp);
150 }
151
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.
6926 PetscFunctionReturn(PETSC_SUCCESS);
152 }
153
154 /*
155 EPSSubspaceResidualNorms - Computes the column norms of residual vectors
156 OP*V(1:n,l:m) - V*T(1:m,l:m), where, on entry, OP*V has been computed and
157 stored in R. On exit, rsd(l) to rsd(m) contain the computed norms.
158 */
159 2044 static PetscErrorCode EPSSubspaceResidualNorms(BV R,BV V,Mat T,PetscInt l,PetscInt m,PetscScalar *eigi,PetscReal *rsd)
160 {
161 2044 PetscInt i;
162
163
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2044 PetscFunctionBegin;
164
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2044 PetscCall(BVMult(R,-1.0,1.0,V,T));
165
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.
35729 for (i=l;i<m;i++) PetscCall(BVNormColumnBegin(R,i,NORM_2,rsd+i));
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.
35729 for (i=l;i<m;i++) PetscCall(BVNormColumnEnd(R,i,NORM_2,rsd+i));
167 #if !defined(PETSC_USE_COMPLEX)
168
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
16362 for (i=l;i<m-1;i++) {
169
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
15364 if (eigi[i]!=0.0) {
170 rsd[i] = SlepcAbs(rsd[i],rsd[i+1]);
171 rsd[i+1] = rsd[i];
172 i++;
173 }
174 }
175 #endif
176
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.
378 PetscFunctionReturn(PETSC_SUCCESS);
177 }
178
179 222 static PetscErrorCode EPSSolve_Subspace(EPS eps)
180 {
181 222 Mat H,Q,S,T,B;
182 222 BV AV,R;
183 222 PetscBool indef;
184 222 PetscInt i,k,ngrp,nogrp,*itrsd,*itrsdold;
185 222 PetscInt nxtsrr,idsrr,idort,nxtort,nv,its;
186 222 PetscReal arsd,oarsd,ctr,octr,ae,oae,*rsd,*orsd,tcond=1.0;
187 222 PetscScalar *oeigr,*oeigi;
188 /* Parameters */
189 222 PetscInt init = 5; /* Number of initial iterations */
190 222 PetscReal stpfac = 1.5; /* Max num of iter before next SRR step */
191 222 PetscReal alpha = 1.0; /* Used to predict convergence of next residual */
192 222 PetscReal beta = 1.1; /* Used to predict convergence of next residual */
193 222 PetscReal grptol = SLEPC_DEFAULT_TOL; /* Tolerance for EPSSubspaceFindGroup */
194 222 PetscReal cnvtol = 1e-6; /* Convergence criterion for cnv */
195 222 PetscInt orttol = 2; /* Number of decimal digits whose loss
196 can be tolerated in orthogonalization */
197
198
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
222 PetscFunctionBegin;
199 222 its = 0;
200
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
222 PetscCall(PetscMalloc6(eps->ncv,&rsd,eps->ncv,&orsd,eps->ncv,&oeigr,eps->ncv,&oeigi,eps->ncv,&itrsd,eps->ncv,&itrsdold));
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.
222 PetscCall(BVDuplicate(eps->V,&AV));
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.
222 PetscCall(BVDuplicate(eps->V,&R));
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.
222 PetscCall(STGetOperator(eps->st,&S));
204
205
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4206 for (i=0;i<eps->ncv;i++) {
206 3984 rsd[i] = 0.0;
207 3984 itrsd[i] = -1;
208 }
209
210 /* Complete the initial basis with random vectors and orthonormalize them */
211
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
4176 for (k=eps->nini;k<eps->ncv;k++) {
212
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3954 PetscCall(BVSetRandomColumn(eps->V,k));
213
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3954 PetscCall(BVOrthonormalizeColumn(eps->V,k,PETSC_TRUE,NULL,NULL));
214 }
215
216 2044 while (eps->reason == EPS_CONVERGED_ITERATING) {
217 2044 eps->its++;
218 2044 nv = PetscMin(eps->nconv+eps->mpd,eps->ncv);
219
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2044 PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,0));
220
221
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
35729 for (i=eps->nconv;i<nv;i++) {
222 33685 oeigr[i] = eps->eigr[i];
223 33685 oeigi[i] = eps->eigi[i];
224 33685 orsd[i] = rsd[i];
225 }
226
227 /* AV(:,idx) = OP * V(:,idx) */
228
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2044 PetscCall(BVSetActiveColumns(eps->V,eps->nconv,nv));
229
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2044 PetscCall(BVSetActiveColumns(AV,eps->nconv,nv));
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.
2044 PetscCall(BVMatMult(eps->V,S,AV));
231
232 /* T(:,idx) = V' * AV(:,idx) */
233
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2044 PetscCall(BVSetActiveColumns(eps->V,0,nv));
234
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2044 PetscCall(DSGetMat(eps->ds,DS_MAT_A,&H));
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.
2044 PetscCall(BVDot(AV,eps->V,H));
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.
2044 PetscCall(DSRestoreMat(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.
2044 PetscCall(DSSetState(eps->ds,DS_STATE_RAW));
238
239 /* Solve projected problem */
240
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2044 PetscCall(DSSolve(eps->ds,eps->eigr,eps->eigi));
241
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2044 PetscCall(DSSort(eps->ds,eps->eigr,eps->eigi,NULL,NULL,NULL));
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.
2044 PetscCall(DSSynchronize(eps->ds,eps->eigr,eps->eigi));
243
244 /* Update vectors V(:,idx) = V * U(:,idx) */
245
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2044 PetscCall(DSGetMat(eps->ds,DS_MAT_Q,&Q));
246
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2044 PetscCall(BVSetActiveColumns(AV,0,nv));
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.
2044 PetscCall(BVSetActiveColumns(R,0,nv));
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.
2044 PetscCall(BVMultInPlace(eps->V,Q,eps->nconv,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.
2044 PetscCall(BVMultInPlace(AV,Q,eps->nconv,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.
2044 PetscCall(DSRestoreMat(eps->ds,DS_MAT_Q,&Q));
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.
2044 PetscCall(BVCopy(AV,R));
252
253 /* Convergence check */
254
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2044 PetscCall(DSGetMat(eps->ds,DS_MAT_A,&T));
255
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2044 PetscCall(EPSSubspaceResidualNorms(R,eps->V,T,eps->nconv,nv,eps->eigi,rsd));
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.
2044 PetscCall(DSRestoreMat(eps->ds,DS_MAT_A,&T));
257
258
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
35729 for (i=eps->nconv;i<nv;i++) {
259 33685 itrsdold[i] = itrsd[i];
260 33685 itrsd[i] = its;
261 33685 eps->errest[i] = rsd[i];
262 }
263
264 3463 for (;;) {
265 /* Find clusters of computed eigenvalues */
266
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3463 PetscCall(EPSSubspaceFindGroup(eps->nconv,nv,eps->eigr,eps->eigi,eps->errest,grptol,&ngrp,&ctr,&ae,&arsd));
267
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
3463 PetscCall(EPSSubspaceFindGroup(eps->nconv,nv,oeigr,oeigi,orsd,grptol,&nogrp,&octr,&oae,&oarsd));
268
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3463 if (ngrp!=nogrp) break;
269
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
3241 if (ngrp==0) break;
270
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3241 if (PetscAbsReal(ae-oae)>ctr*cnvtol*(itrsd[eps->nconv]-itrsdold[eps->nconv])) break;
271
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2424 if (arsd>ctr*eps->tol) break;
272 1425 eps->nconv = eps->nconv + ngrp;
273
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 6 times.
1425 if (eps->nconv>=nv) break;
274 }
275
276
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2044 PetscCall(EPSMonitor(eps,eps->its,eps->nconv,eps->eigr,eps->eigi,eps->errest,nv));
277
20/26
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 8 times.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 8 times.
✓ Branch 12 taken 2 times.
✓ Branch 13 taken 8 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
2044 EPSSetCtxThreshold(eps,eps->eigr,eps->eigi,eps->errest,eps->nconv,nv);
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.
2044 PetscCall((*eps->stopping)(eps,eps->its,eps->max_it,eps->nconv,eps->nev,&eps->reason,eps->stoppingctx));
279
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
2044 if (eps->reason != EPS_CONVERGED_ITERATING) break;
280
281 /* Compute nxtsrr (iteration of next projection step) */
282 1822 nxtsrr = PetscMax((PetscInt)PetscFloorReal(stpfac*its),init);
283
284
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.
1822 if (ngrp!=nogrp || ngrp==0 || arsd>=oarsd) {
285 252 idsrr = nxtsrr - its;
286 } else {
287 1570 idsrr = (PetscInt)PetscFloorReal(alpha+beta*(itrsdold[eps->nconv]-itrsd[eps->nconv])*PetscLogReal(arsd/eps->tol)/PetscLogReal(arsd/oarsd));
288 1570 idsrr = PetscMax(1,idsrr);
289 }
290 1822 nxtsrr = PetscMin(nxtsrr,its+idsrr);
291
292 /* Compute nxtort (iteration of next orthogonalization step) */
293
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1822 PetscCall(DSCond(eps->ds,&tcond));
294
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.
1822 idort = PetscMax(1,(PetscInt)PetscFloorReal(orttol/PetscMax(1,PetscLog10Real(tcond))));
295 1822 nxtort = PetscMin(its+idort,nxtsrr);
296
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1822 PetscCall(PetscInfo(eps,"Updated iteration counts: nxtort=%" PetscInt_FMT ", nxtsrr=%" PetscInt_FMT "\n",nxtort,nxtsrr));
297
298 /* V(:,idx) = AV(:,idx) */
299
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1822 PetscCall(BVSetActiveColumns(eps->V,eps->nconv,nv));
300
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1822 PetscCall(BVSetActiveColumns(AV,eps->nconv,nv));
301
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1822 PetscCall(BVCopy(AV,eps->V));
302 1822 its++;
303
304 /* Orthogonalization loop */
305 19472 do {
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.
19472 PetscCall(BVGetMatrix(eps->V,&B,&indef));
307
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
19472 PetscCall(BVSetMatrix(eps->V,NULL,PETSC_FALSE));
308
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
54181 while (its<nxtort) {
309 /* A(:,idx) = OP*V(:,idx) with normalization */
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.
34709 PetscCall(BVMatMult(eps->V,S,AV));
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.
34709 PetscCall(BVCopy(AV,eps->V));
312
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
34709 PetscCall(BVNormalize(eps->V,NULL));
313 34709 its++;
314 }
315
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
19472 PetscCall(BVSetMatrix(eps->V,B,indef));
316 /* Orthonormalize vectors */
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.
19472 PetscCall(BVOrthogonalize(eps->V,NULL));
318 19472 nxtort = PetscMin(its+idort,nxtsrr);
319
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
19472 } while (its<nxtsrr);
320
321
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
1822 if (eps->stop==EPS_STOP_THRESHOLD && nv/(PetscReal)eps->nconv<1.3) { /* reallocate */
322 eps->ncv = 1.3*eps->nconv;
323 PetscCall(EPSReallocateSolution(eps,eps->ncv));
324 PetscCall(BVResize(AV,eps->ncv,PETSC_TRUE));
325 PetscCall(BVResize(R,eps->ncv,PETSC_TRUE));
326 for (i=nv;i<eps->ncv;i++) eps->perm[i] = i;
327
2/8
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
2044 PetscCall(DSReallocate(eps->ds,eps->ncv));
328 }
329
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.
222 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.
222 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.
222 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.
222 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.
222 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.
42 PetscFunctionReturn(PETSC_SUCCESS);
338 }
339
340 202 static PetscErrorCode EPSDestroy_Subspace(EPS eps)
341 {
342
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
202 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.
202 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.
38 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 202 SLEPC_EXTERN PetscErrorCode EPSCreate_Subspace(EPS eps)
362 {
363 202 EPS_SUBSPACE *ctx;
364
365
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
202 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.
202 PetscCall(PetscNew(&ctx));
367 202 eps->data = (void*)ctx;
368
369 202 eps->useds = PETSC_TRUE;
370 202 eps->categ = EPS_CATEGORY_OTHER;
371
372 202 eps->ops->solve = EPSSolve_Subspace;
373 202 eps->ops->setup = EPSSetUp_Subspace;
374 202 eps->ops->setupsort = EPSSetUpSort_Subspace;
375 202 eps->ops->destroy = EPSDestroy_Subspace;
376 202 eps->ops->backtransform = EPSBackTransform_Default;
377 202 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.
202 PetscFunctionReturn(PETSC_SUCCESS);
379 }
380