GCC Code Coverage Report


Directory: ./
File: src/eps/impls/subspace/subspace.c
Date: 2026-05-12 09:16:45
Exec Total Coverage
Lines: 214 242 88.4%
Functions: 8 8 100.0%
Branches: 462 782 59.1%

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 7026 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 7026 PetscInt i;
121 7026 PetscReal rmod,rmod1;
122
123
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
7026 PetscFunctionBegin;
124 7026 *ngrp = 0;
125 7026 *ctr = 0;
126 7026 rmod = SlepcAbsEigenvalue(wr[l],wi[l]);
127
128
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
21188 for (i=l;i<m;) {
129 17520 rmod1 = SlepcAbsEigenvalue(wr[i],wi[i]);
130
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
17520 if (PetscAbsReal(rmod-rmod1) > grptol*(rmod+rmod1)) break;
131 10728 *ctr = (rmod+rmod1)/2.0;
132
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10728 if (wi[i] == 0.0) {
133 10728 (*ngrp)++;
134 10728 i++;
135 } else {
136 (*ngrp)+=2;
137 i+=2;
138 }
139 }
140
141 7026 *ae = 0;
142 7026 *arsd = 0;
143
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
7026 if (*ngrp) {
144
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
17754 for (i=l;i<l+*ngrp;i++) {
145 10728 (*ae) += PetscRealPart(wr[i]);
146 10728 (*arsd) += rsd[i]*rsd[i];
147 }
148 7026 *ae = *ae / *ngrp;
149 7026 *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.
7026 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 2064 static PetscErrorCode EPSSubspaceResidualNorms(BV R,BV V,Mat T,PetscInt l,PetscInt m,PetscScalar *eigi,PetscReal *rsd)
160 {
161 2064 PetscInt i;
162
163
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2064 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.
2064 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.
35909 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.
35909 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.
16442 for (i=l;i<m-1;i++) {
169
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
15434 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.
382 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,*p_itrsd,*p_itrsdold;
185 222 PetscInt nxtsrr,idsrr,idort,nxtort,nv,its;
186 222 PetscReal arsd,oarsd,ctr,octr,ae,oae,*rsd,*orsd,*p_rsd,*p_orsd,tcond=1.0;
187 222 PetscScalar *oeigr,*oeigi,*p_oeigr,*p_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 2064 while (eps->reason == EPS_CONVERGED_ITERATING) {
217 2064 eps->its++;
218 2064 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.
2064 PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,0));
220
221
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
35909 for (i=eps->nconv;i<nv;i++) {
222 33845 oeigr[i] = eps->eigr[i];
223 33845 oeigi[i] = eps->eigi[i];
224 33845 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.
2064 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.
2064 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.
2064 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.
2064 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.
2064 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.
2064 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.
2064 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.
2064 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.
2064 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.
2064 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.
2064 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.
2064 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.
2064 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.
2064 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.
2064 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.
2064 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.
2064 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.
2064 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.
2064 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.
2064 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.
2064 PetscCall(DSRestoreMat(eps->ds,DS_MAT_A,&T));
257
258
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
35909 for (i=eps->nconv;i<nv;i++) {
259 33845 itrsdold[i] = itrsd[i];
260 33845 itrsd[i] = its;
261 33845 eps->errest[i] = rsd[i];
262 }
263
264 3513 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.
3513 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.
3513 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.
3513 if (ngrp!=nogrp) break;
269
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
3291 if (ngrp==0) break;
270
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3291 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.
2474 if (arsd>ctr*eps->tol) break;
272 1455 eps->nconv = eps->nconv + ngrp;
273
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 6 times.
1455 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.
2064 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.
2064 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.
2064 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.
2064 if (eps->reason != EPS_CONVERGED_ITERATING) break;
280
281 /* Compute nxtsrr (iteration of next projection step) */
282 1842 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.
1842 if (ngrp!=nogrp || ngrp==0 || arsd>=oarsd) {
285 252 idsrr = nxtsrr - its;
286 } else {
287 1590 idsrr = (PetscInt)PetscFloorReal(alpha+beta*(itrsdold[eps->nconv]-itrsd[eps->nconv])*PetscLogReal(arsd/eps->tol)/PetscLogReal(arsd/oarsd));
288 1590 idsrr = PetscMax(1,idsrr);
289 }
290 1842 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.
1842 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.
1842 idort = PetscMax(1,(PetscInt)PetscFloorReal(orttol/PetscMax(1,PetscLog10Real(tcond))));
295 1842 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.
1842 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.
1842 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.
1842 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.
1842 PetscCall(BVCopy(AV,eps->V));
302 1842 its++;
303
304 /* Orthogonalization loop */
305 19672 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.
19672 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.
19672 PetscCall(BVSetMatrix(eps->V,NULL,PETSC_FALSE));
308
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
54561 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.
34889 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.
34889 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.
34889 PetscCall(BVNormalize(eps->V,NULL));
313 34889 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.
19672 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.
19672 PetscCall(BVOrthogonalize(eps->V,NULL));
318 19672 nxtort = PetscMin(its+idort,nxtsrr);
319
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
19672 } 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.
1842 if (eps->stop==EPS_STOP_THRESHOLD && nv/(PetscReal)eps->nconv<1.3) { /* reallocate */
322 eps->ncv = 1.3*eps->nconv+1;
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 PetscCall(DSReallocate(eps->ds,eps->ncv));
328 for (k=nv;k<eps->ncv;k++) {
329 PetscCall(BVSetRandomColumn(eps->V,k));
330 PetscCall(BVOrthonormalizeColumn(eps->V,k,PETSC_TRUE,NULL,NULL));
331 }
332 p_rsd = rsd;
333 p_orsd = orsd;
334 p_oeigr = oeigr;
335 p_oeigi = oeigi;
336 p_itrsd = itrsd;
337 p_itrsdold = itrsdold;
338 PetscCall(PetscMalloc6(eps->ncv,&rsd,eps->ncv,&orsd,eps->ncv,&oeigr,eps->ncv,&oeigi,eps->ncv,&itrsd,eps->ncv,&itrsdold));
339 for (i=0;i<nv;i++) {
340 rsd[i] = p_rsd[i];
341 orsd[i] = p_orsd[i];
342 oeigr[i] = p_oeigr[i];
343 oeigi[i] = p_oeigi[i];
344 itrsd[i] = p_itrsd[i];
345 itrsdold[i] = p_itrsdold[i];
346 }
347
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.
2064 PetscCall(PetscFree6(p_rsd,p_orsd,p_oeigr,p_oeigi,p_itrsd,p_itrsdold));
348 }
349
350 }
351
352
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
222 PetscCall(PetscFree6(rsd,orsd,oeigr,oeigi,itrsd,itrsdold));
353
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
222 PetscCall(BVDestroy(&AV));
354
4/6
✓ Branch 0 taken 2 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));
355
4/6
✓ Branch 0 taken 2 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));
356
4/6
✓ Branch 0 taken 2 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));
357
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);
358 }
359
360 202 static PetscErrorCode EPSDestroy_Subspace(EPS eps)
361 {
362
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
202 PetscFunctionBegin;
363
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));
364
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);
365 }
366
367 /*MC
368 EPSSUBSPACE - EPSSUBSPACE = "subspace" - The simple subspace iteration method.
369
370 Notes:
371 This solver is very basic and is not recommended in general, since it
372 will not be competitive with respect to other solvers.
373
374 The implemented method is subspace iteration with Rayleigh-Ritz projection and
375 locking, based on the SRRIT code {cite:p}`Bai97`.
376
377 Level: beginner
378
379 .seealso: [](ch:eps), `EPS`, `EPSType`, `EPSSetType()`
380 M*/
381 202 SLEPC_EXTERN PetscErrorCode EPSCreate_Subspace(EPS eps)
382 {
383 202 EPS_SUBSPACE *ctx;
384
385
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
202 PetscFunctionBegin;
386
4/6
✓ Branch 0 taken 2 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));
387 202 eps->data = (void*)ctx;
388
389 202 eps->useds = PETSC_TRUE;
390 202 eps->categ = EPS_CATEGORY_OTHER;
391
392 202 eps->ops->solve = EPSSolve_Subspace;
393 202 eps->ops->setup = EPSSetUp_Subspace;
394 202 eps->ops->setupsort = EPSSetUpSort_Subspace;
395 202 eps->ops->destroy = EPSDestroy_Subspace;
396 202 eps->ops->backtransform = EPSBackTransform_Default;
397 202 eps->ops->computevectors = EPSComputeVectors_Schur;
398
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);
399 }
400