GCC Code Coverage Report


Directory: ./
File: src/eps/impls/subspace/subspace.c
Date: 2026-10-22 02:08:06
Exec Total Coverage
Lines: 214 242 88.4%
Functions: 8 8 100.0%
Branches: 479 814 58.8%

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
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 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
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
4 PetscFunctionReturn(PETSC_SUCCESS);
60 }
61
62 222 static PetscErrorCode EPSSetUp_Subspace(EPS eps)
63 {
64 222 PetscBool isfilt;
65
66
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 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
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
42 PetscFunctionReturn(PETSC_SUCCESS);
88 }
89
90 222 static PetscErrorCode EPSSetUpSort_Subspace(EPS eps)
91 {
92 222 SlepcSC sc;
93
94
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 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
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 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 7036 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 7036 PetscInt i;
121 7036 PetscReal rmod,rmod1;
122
123
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
7036 PetscFunctionBegin;
124 7036 *ngrp = 0;
125 7036 *ctr = 0;
126 7036 rmod = SlepcAbsEigenvalue(wr[l],wi[l]);
127
128
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
21212 for (i=l;i<m;) {
129 17540 rmod1 = SlepcAbsEigenvalue(wr[i],wi[i]);
130
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
17540 if (PetscAbsReal(rmod-rmod1) > grptol*(rmod+rmod1)) break;
131 10738 *ctr = (rmod+rmod1)/2.0;
132
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10738 if (wi[i] == 0.0) {
133 10738 (*ngrp)++;
134 10738 i++;
135 } else {
136 ✗ (*ngrp)+=2;
137 ✗ i+=2;
138 }
139 }
140
141 7036 *ae = 0;
142 7036 *arsd = 0;
143
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
7036 if (*ngrp) {
144
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
17774 for (i=l;i<l+*ngrp;i++) {
145 10738 (*ae) += PetscRealPart(wr[i]);
146 10738 (*arsd) += rsd[i]*rsd[i];
147 }
148 7036 *ae = *ae / *ngrp;
149 7036 *arsd = PetscSqrtReal(*arsd / *ngrp);
150 }
151
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
7036 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 2067 static PetscErrorCode EPSSubspaceResidualNorms(BV R,BV V,Mat T,PetscInt l,PetscInt m,PetscScalar *eigi,PetscReal *rsd)
160 {
161 2067 PetscInt i;
162
163
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2067 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.
2067 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.
35961 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.
35961 for (i=l;i<m;i++) PetscCall(BVNormColumnEnd(R,i,NORM_2,rsd+i));
167 #if !PetscDefined(USE_COMPLEX)
168
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
16476 for (i=l;i<m-1;i++) {
169
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
15466 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
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 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
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 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 2067 while (eps->reason == EPS_CONVERGED_ITERATING) {
217 2067 eps->its++;
218 2067 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.
2067 PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,0));
220
221
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
35961 for (i=eps->nconv;i<nv;i++) {
222 33894 oeigr[i] = eps->eigr[i];
223 33894 oeigi[i] = eps->eigi[i];
224 33894 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.
2067 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.
2067 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.
2067 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.
2067 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.
2067 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.
2067 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.
2067 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.
2067 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.
2067 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.
2067 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.
2067 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.
2067 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.
2067 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.
2067 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.
2067 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.
2067 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.
2067 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.
2067 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.
2067 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.
2067 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.
2067 PetscCall(DSRestoreMat(eps->ds,DS_MAT_A,&T));
257
258
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
35961 for (i=eps->nconv;i<nv;i++) {
259 33894 itrsdold[i] = itrsd[i];
260 33894 itrsd[i] = its;
261 33894 eps->errest[i] = rsd[i];
262 }
263
264 3518 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.
3518 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.
3518 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.
3518 if (ngrp!=nogrp) break;
269
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
3296 if (ngrp==0) break;
270
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3296 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.
2479 if (arsd>ctr*eps->tol) break;
272 1457 eps->nconv = eps->nconv + ngrp;
273
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 6 times.
1457 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.
2067 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.
2067 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.
2067 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.
2067 if (eps->reason != EPS_CONVERGED_ITERATING) break;
280
281 /* Compute nxtsrr (iteration of next projection step) */
282 1845 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.
1845 if (ngrp!=nogrp || ngrp==0 || arsd>=oarsd) {
285 252 idsrr = nxtsrr - its;
286 } else {
287 1593 idsrr = (PetscInt)PetscFloorReal(alpha+beta*(itrsdold[eps->nconv]-itrsd[eps->nconv])*PetscLogReal(arsd/eps->tol)/PetscLogReal(arsd/oarsd));
288 1593 idsrr = PetscMax(1,idsrr);
289 }
290 1845 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.
1845 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.
1845 idort = PetscMax(1,(PetscInt)PetscFloorReal(orttol/PetscMax(1,PetscLog10Real(tcond))));
295 1845 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.
1845 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.
1845 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.
1845 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.
1845 PetscCall(BVCopy(AV,eps->V));
302 1845 its++;
303
304 /* Orthogonalization loop */
305 19676 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.
19676 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.
19676 PetscCall(BVSetMatrix(eps->V,NULL,PETSC_FALSE));
308
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
54569 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.
34893 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.
34893 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.
34893 PetscCall(BVNormalize(eps->V,NULL));
313 34893 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.
19676 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.
19676 PetscCall(BVOrthogonalize(eps->V,NULL));
318 19676 nxtort = PetscMin(its+idort,nxtsrr);
319
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
19676 } 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.
1845 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.
2067 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
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
42 PetscFunctionReturn(PETSC_SUCCESS);
358 }
359
360 202 static PetscErrorCode EPSDestroy_Subspace(EPS eps)
361 {
362
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
202 PetscFunctionBegin;
363
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 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.
202 PetscCall(PetscFree(eps->data));
364
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 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
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 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
7/14
✓ 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 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
202 PetscFunctionReturn(PETSC_SUCCESS);
399 }
400