Line | Branch | Exec | Source |
---|---|---|---|
1 | /* | ||
2 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
3 | SLEPc - Scalable Library for Eigenvalue Problem Computations | ||
4 | Copyright (c) 2002-, Universitat Politecnica de Valencia, Spain | ||
5 | |||
6 | This file is part of SLEPc. | ||
7 | SLEPc is distributed under a 2-clause BSD license (see LICENSE). | ||
8 | - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | ||
9 | */ | ||
10 | /* | ||
11 | SLEPc eigensolver: "subspace" | ||
12 | |||
13 | Method: Subspace Iteration | ||
14 | |||
15 | Algorithm: | ||
16 | |||
17 | Subspace iteration with Rayleigh-Ritz projection and locking, | ||
18 | based on the SRRIT implementation. | ||
19 | |||
20 | References: | ||
21 | |||
22 | [1] "Subspace Iteration in SLEPc", SLEPc Technical Report STR-3, | ||
23 | available at https://slepc.upv.es. | ||
24 | */ | ||
25 | |||
26 | #include <slepc/private/epsimpl.h> | ||
27 | |||
28 | typedef struct { | ||
29 | PetscBool estimatedrange; /* the filter range was not set by the user */ | ||
30 | } EPS_SUBSPACE; | ||
31 | |||
32 | 28 | static PetscErrorCode EPSSetUp_Subspace_Filter(EPS eps) | |
33 | { | ||
34 | 28 | EPS_SUBSPACE *ctx = (EPS_SUBSPACE*)eps->data; | |
35 | 28 | PetscBool estimaterange=PETSC_TRUE; | |
36 | 28 | PetscReal rleft,rright; | |
37 | 28 | Mat A; | |
38 | |||
39 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
28 | PetscFunctionBegin; |
40 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
28 | EPSCheckHermitianCondition(eps,PETSC_TRUE," with polynomial filter"); |
41 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
28 | EPSCheckStandardCondition(eps,PETSC_TRUE," with polynomial filter"); |
42 |
1/6✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
28 | PetscCheck(eps->intb<PETSC_MAX_REAL || eps->inta>PETSC_MIN_REAL,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONG,"The defined computational interval should have at least one of their sides bounded"); |
43 |
8/18✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 10 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
|
28 | EPSCheckUnsupportedCondition(eps,EPS_FEATURE_ARBITRARY | EPS_FEATURE_REGION | EPS_FEATURE_EXTRACTION,PETSC_TRUE," with polynomial filter"); |
44 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
28 | PetscCall(STFilterSetInterval(eps->st,eps->inta,eps->intb)); |
45 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
28 | if (!ctx->estimatedrange) { |
46 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
28 | PetscCall(STFilterGetRange(eps->st,&rleft,&rright)); |
47 |
3/4✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 2 times.
|
28 | estimaterange = (!rleft && !rright)? PETSC_TRUE: PETSC_FALSE; |
48 | } | ||
49 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
4 | if (estimaterange) { /* user did not set a range */ |
50 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
28 | PetscCall(STGetMatrix(eps->st,0,&A)); |
51 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
28 | PetscCall(MatEstimateSpectralRange_EPS(A,&rleft,&rright)); |
52 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
28 | PetscCall(PetscInfo(eps,"Setting eigenvalue range to [%g,%g]\n",(double)rleft,(double)rright)); |
53 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
28 | PetscCall(STFilterSetRange(eps->st,rleft,rright)); |
54 | 28 | ctx->estimatedrange = PETSC_TRUE; | |
55 | } | ||
56 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
28 | if (eps->ncv==PETSC_DETERMINE && eps->nev==1) eps->nev = 40; /* user did not provide nev estimation */ |
57 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
28 | PetscCall(EPSSetDimensions_Default(eps,&eps->nev,&eps->ncv,&eps->mpd)); |
58 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
28 | PetscCheck(eps->ncv<=eps->nev+eps->mpd,PetscObjectComm((PetscObject)eps),PETSC_ERR_USER_INPUT,"The value of ncv must not be larger than nev+mpd"); |
59 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
4 | PetscFunctionReturn(PETSC_SUCCESS); |
60 | } | ||
61 | |||
62 | 207 | static PetscErrorCode EPSSetUp_Subspace(EPS eps) | |
63 | { | ||
64 | 207 | PetscBool isfilt; | |
65 | |||
66 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
207 | PetscFunctionBegin; |
67 |
4/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
207 | EPSCheckDefinite(eps); |
68 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
207 | EPSCheckNotStructured(eps); |
69 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
207 | if (eps->max_it==PETSC_DETERMINE) eps->max_it = PetscMax(100,2*eps->n/eps->ncv); |
70 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
207 | if (!eps->which) PetscCall(EPSSetWhichEigenpairs_Default(eps)); |
71 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
207 | if (eps->which==EPS_ALL) { |
72 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
28 | if (eps->nev==0) eps->nev = 1; |
73 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
28 | PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STFILTER,&isfilt)); |
74 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
28 | PetscCheck(isfilt,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Spectrum slicing not supported in this solver"); |
75 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
28 | PetscCall(EPSSetUp_Subspace_Filter(eps)); |
76 | } else { | ||
77 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
179 | PetscCheck(eps->which==EPS_LARGEST_MAGNITUDE || eps->which==EPS_TARGET_MAGNITUDE,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"This solver supports only largest magnitude or target magnitude eigenvalues"); |
78 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
179 | PetscCall(EPSSetDimensions_Default(eps,&eps->nev,&eps->ncv,&eps->mpd)); |
79 | } | ||
80 |
4/16✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 10 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 10 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
|
207 | EPSCheckUnsupported(eps,EPS_FEATURE_ARBITRARY | EPS_FEATURE_EXTRACTION | EPS_FEATURE_THRESHOLD | EPS_FEATURE_TWOSIDED); |
81 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
207 | PetscCheck(eps->converged==EPSConvergedRelative,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"This solver only supports relative convergence test"); |
82 | |||
83 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
207 | PetscCall(EPSAllocateSolution(eps,0)); |
84 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
207 | PetscCall(EPS_SetInnerProduct(eps)); |
85 |
6/8✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
207 | if (eps->ishermitian) PetscCall(DSSetType(eps->ds,DSHEP)); |
86 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
56 | else PetscCall(DSSetType(eps->ds,DSNHEP)); |
87 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
207 | PetscCall(DSAllocate(eps->ds,eps->ncv)); |
88 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
39 | PetscFunctionReturn(PETSC_SUCCESS); |
89 | } | ||
90 | |||
91 | 207 | static PetscErrorCode EPSSetUpSort_Subspace(EPS eps) | |
92 | { | ||
93 | 207 | SlepcSC sc; | |
94 | |||
95 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
207 | PetscFunctionBegin; |
96 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
207 | PetscCall(EPSSetUpSort_Default(eps)); |
97 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
207 | if (eps->which==EPS_ALL) { |
98 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
28 | PetscCall(DSGetSlepcSC(eps->ds,&sc)); |
99 | 28 | sc->rg = NULL; | |
100 | 28 | sc->comparison = SlepcCompareLargestReal; | |
101 | 28 | sc->comparisonctx = NULL; | |
102 | 28 | sc->map = NULL; | |
103 | 28 | sc->mapobj = NULL; | |
104 | } | ||
105 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
39 | PetscFunctionReturn(PETSC_SUCCESS); |
106 | } | ||
107 | |||
108 | /* | ||
109 | EPSSubspaceFindGroup - Find a group of nearly equimodular eigenvalues, provided | ||
110 | in arrays wr and wi, according to the tolerance grptol. Also the 2-norms | ||
111 | of the residuals must be passed in (rsd). Arrays are processed from index | ||
112 | l to index m only. The output information is: | ||
113 | |||
114 | ngrp - number of entries of the group | ||
115 | ctr - (w(l)+w(l+ngrp-1))/2 | ||
116 | ae - average of wr(l),...,wr(l+ngrp-1) | ||
117 | arsd - average of rsd(l),...,rsd(l+ngrp-1) | ||
118 | */ | ||
119 | 6560 | static PetscErrorCode EPSSubspaceFindGroup(PetscInt l,PetscInt m,PetscScalar *wr,PetscScalar *wi,PetscReal *rsd,PetscReal grptol,PetscInt *ngrp,PetscReal *ctr,PetscReal *ae,PetscReal *arsd) | |
120 | { | ||
121 | 6560 | PetscInt i; | |
122 | 6560 | PetscReal rmod,rmod1; | |
123 | |||
124 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
6560 | PetscFunctionBegin; |
125 | 6560 | *ngrp = 0; | |
126 | 6560 | *ctr = 0; | |
127 | 6560 | rmod = SlepcAbsEigenvalue(wr[l],wi[l]); | |
128 | |||
129 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
19768 | for (i=l;i<m;) { |
130 | 16383 | rmod1 = SlepcAbsEigenvalue(wr[i],wi[i]); | |
131 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
16383 | if (PetscAbsReal(rmod-rmod1) > grptol*(rmod+rmod1)) break; |
132 | 10042 | *ctr = (rmod+rmod1)/2.0; | |
133 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
10042 | if (wi[i] == 0.0) { |
134 | 10042 | (*ngrp)++; | |
135 | 10042 | i++; | |
136 | } else { | ||
137 | ✗ | (*ngrp)+=2; | |
138 | ✗ | i+=2; | |
139 | } | ||
140 | } | ||
141 | |||
142 | 6560 | *ae = 0; | |
143 | 6560 | *arsd = 0; | |
144 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
6560 | if (*ngrp) { |
145 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
16602 | for (i=l;i<l+*ngrp;i++) { |
146 | 10042 | (*ae) += PetscRealPart(wr[i]); | |
147 | 10042 | (*arsd) += rsd[i]*rsd[i]; | |
148 | } | ||
149 | 6560 | *ae = *ae / *ngrp; | |
150 | 6560 | *arsd = PetscSqrtReal(*arsd / *ngrp); | |
151 | } | ||
152 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
6560 | PetscFunctionReturn(PETSC_SUCCESS); |
153 | } | ||
154 | |||
155 | /* | ||
156 | EPSSubspaceResidualNorms - Computes the column norms of residual vectors | ||
157 | OP*V(1:n,l:m) - V*T(1:m,l:m), where, on entry, OP*V has been computed and | ||
158 | stored in R. On exit, rsd(l) to rsd(m) contain the computed norms. | ||
159 | */ | ||
160 | 1939 | static PetscErrorCode EPSSubspaceResidualNorms(BV R,BV V,Mat T,PetscInt l,PetscInt m,PetscScalar *eigi,PetscReal *rsd) | |
161 | { | ||
162 | 1939 | PetscInt i; | |
163 | |||
164 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
1939 | PetscFunctionBegin; |
165 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(BVMult(R,-1.0,1.0,V,T)); |
166 |
7/8✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
|
34128 | for (i=l;i<m;i++) PetscCall(BVNormColumnBegin(R,i,NORM_2,rsd+i)); |
167 |
7/8✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
|
34128 | for (i=l;i<m;i++) PetscCall(BVNormColumnEnd(R,i,NORM_2,rsd+i)); |
168 | #if !defined(PETSC_USE_COMPLEX) | ||
169 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
|
15487 | for (i=l;i<m-1;i++) { |
170 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
|
14550 | if (eigi[i]!=0.0) { |
171 | ✗ | rsd[i] = SlepcAbs(rsd[i],rsd[i+1]); | |
172 | ✗ | rsd[i+1] = rsd[i]; | |
173 | ✗ | i++; | |
174 | } | ||
175 | } | ||
176 | #endif | ||
177 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
357 | PetscFunctionReturn(PETSC_SUCCESS); |
178 | } | ||
179 | |||
180 | 207 | static PetscErrorCode EPSSolve_Subspace(EPS eps) | |
181 | { | ||
182 | 207 | Mat H,Q,S,T,B; | |
183 | 207 | BV AV,R; | |
184 | 207 | PetscBool indef; | |
185 | 207 | PetscInt i,k,ld,ngrp,nogrp,*itrsd,*itrsdold; | |
186 | 207 | PetscInt nxtsrr,idsrr,idort,nxtort,nv,ncv = eps->ncv,its,ninside; | |
187 | 207 | PetscReal arsd,oarsd,ctr,octr,ae,oae,*rsd,*orsd,tcond=1.0,gamma; | |
188 | 207 | PetscScalar *oeigr,*oeigi; | |
189 | /* Parameters */ | ||
190 | 207 | PetscInt init = 5; /* Number of initial iterations */ | |
191 | 207 | PetscReal stpfac = 1.5; /* Max num of iter before next SRR step */ | |
192 | 207 | PetscReal alpha = 1.0; /* Used to predict convergence of next residual */ | |
193 | 207 | PetscReal beta = 1.1; /* Used to predict convergence of next residual */ | |
194 | 207 | PetscReal grptol = SLEPC_DEFAULT_TOL; /* Tolerance for EPSSubspaceFindGroup */ | |
195 | 207 | PetscReal cnvtol = 1e-6; /* Convergence criterion for cnv */ | |
196 | 207 | PetscInt orttol = 2; /* Number of decimal digits whose loss | |
197 | can be tolerated in orthogonalization */ | ||
198 | |||
199 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
207 | PetscFunctionBegin; |
200 | 207 | its = 0; | |
201 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
207 | PetscCall(PetscMalloc6(ncv,&rsd,ncv,&orsd,ncv,&oeigr,ncv,&oeigi,ncv,&itrsd,ncv,&itrsdold)); |
202 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
207 | PetscCall(DSGetLeadingDimension(eps->ds,&ld)); |
203 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
207 | PetscCall(BVDuplicate(eps->V,&AV)); |
204 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
207 | PetscCall(BVDuplicate(eps->V,&R)); |
205 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
207 | PetscCall(STGetOperator(eps->st,&S)); |
206 | |||
207 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
3956 | for (i=0;i<ncv;i++) { |
208 | 3749 | rsd[i] = 0.0; | |
209 | 3749 | itrsd[i] = -1; | |
210 | } | ||
211 | |||
212 | /* Complete the initial basis with random vectors and orthonormalize them */ | ||
213 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
3936 | for (k=eps->nini;k<ncv;k++) { |
214 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3729 | PetscCall(BVSetRandomColumn(eps->V,k)); |
215 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3729 | PetscCall(BVOrthonormalizeColumn(eps->V,k,PETSC_TRUE,NULL,NULL)); |
216 | } | ||
217 | |||
218 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
1939 | while (eps->reason == EPS_CONVERGED_ITERATING) { |
219 | 1939 | eps->its++; | |
220 | 1939 | nv = PetscMin(eps->nconv+eps->mpd,ncv); | |
221 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(DSSetDimensions(eps->ds,nv,eps->nconv,0)); |
222 | |||
223 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
34128 | for (i=eps->nconv;i<nv;i++) { |
224 | 32189 | oeigr[i] = eps->eigr[i]; | |
225 | 32189 | oeigi[i] = eps->eigi[i]; | |
226 | 32189 | orsd[i] = rsd[i]; | |
227 | } | ||
228 | |||
229 | /* AV(:,idx) = OP * V(:,idx) */ | ||
230 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(BVSetActiveColumns(eps->V,eps->nconv,nv)); |
231 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(BVSetActiveColumns(AV,eps->nconv,nv)); |
232 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(BVMatMult(eps->V,S,AV)); |
233 | |||
234 | /* T(:,idx) = V' * AV(:,idx) */ | ||
235 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(BVSetActiveColumns(eps->V,0,nv)); |
236 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(DSGetMat(eps->ds,DS_MAT_A,&H)); |
237 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(BVDot(AV,eps->V,H)); |
238 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(DSRestoreMat(eps->ds,DS_MAT_A,&H)); |
239 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(DSSetState(eps->ds,DS_STATE_RAW)); |
240 | |||
241 | /* Solve projected problem */ | ||
242 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(DSSolve(eps->ds,eps->eigr,eps->eigi)); |
243 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(DSSort(eps->ds,eps->eigr,eps->eigi,NULL,NULL,NULL)); |
244 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(DSSynchronize(eps->ds,eps->eigr,eps->eigi)); |
245 | |||
246 | /* Update vectors V(:,idx) = V * U(:,idx) */ | ||
247 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(DSGetMat(eps->ds,DS_MAT_Q,&Q)); |
248 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(BVSetActiveColumns(AV,0,nv)); |
249 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(BVSetActiveColumns(R,0,nv)); |
250 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(BVMultInPlace(eps->V,Q,eps->nconv,nv)); |
251 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(BVMultInPlace(AV,Q,eps->nconv,nv)); |
252 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(DSRestoreMat(eps->ds,DS_MAT_Q,&Q)); |
253 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(BVCopy(AV,R)); |
254 | |||
255 | /* Convergence check */ | ||
256 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(DSGetMat(eps->ds,DS_MAT_A,&T)); |
257 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(EPSSubspaceResidualNorms(R,eps->V,T,eps->nconv,nv,eps->eigi,rsd)); |
258 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(DSRestoreMat(eps->ds,DS_MAT_A,&T)); |
259 | |||
260 |
4/4✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
|
1939 | if (eps->which==EPS_ALL && eps->its>1) { /* adjust eigenvalue count */ |
261 | 289 | ninside = 0; | |
262 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
289 | PetscCall(STFilterGetThreshold(eps->st,&gamma)); |
263 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
2567 | for (i=eps->nconv;i<nv;i++) { |
264 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2567 | if (PetscRealPart(eps->eigr[i]) < gamma) break; |
265 | 2278 | ninside++; | |
266 | } | ||
267 | 289 | eps->nev = eps->nconv+ninside; | |
268 | } | ||
269 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
34128 | for (i=eps->nconv;i<nv;i++) { |
270 | 32189 | itrsdold[i] = itrsd[i]; | |
271 | 32189 | itrsd[i] = its; | |
272 | 32189 | eps->errest[i] = rsd[i]; | |
273 | } | ||
274 | |||
275 | 3280 | for (;;) { | |
276 | /* Find clusters of computed eigenvalues */ | ||
277 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3280 | PetscCall(EPSSubspaceFindGroup(eps->nconv,nv,eps->eigr,eps->eigi,eps->errest,grptol,&ngrp,&ctr,&ae,&arsd)); |
278 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
3280 | PetscCall(EPSSubspaceFindGroup(eps->nconv,nv,oeigr,oeigi,orsd,grptol,&nogrp,&octr,&oae,&oarsd)); |
279 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
3280 | if (ngrp!=nogrp) break; |
280 |
1/2✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
|
3073 | if (ngrp==0) break; |
281 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
3073 | if (PetscAbsReal(ae-oae)>ctr*cnvtol*(itrsd[eps->nconv]-itrsdold[eps->nconv])) break; |
282 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
2271 | if (arsd>ctr*eps->tol) break; |
283 | 1347 | eps->nconv = eps->nconv + ngrp; | |
284 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 6 times.
|
1347 | if (eps->nconv>=nv) break; |
285 | } | ||
286 | |||
287 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall(EPSMonitor(eps,eps->its,eps->nconv,eps->eigr,eps->eigi,eps->errest,nv)); |
288 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1939 | PetscCall((*eps->stopping)(eps,eps->its,eps->max_it,eps->nconv,eps->nev,&eps->reason,eps->stoppingctx)); |
289 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
1939 | if (eps->reason != EPS_CONVERGED_ITERATING) break; |
290 | |||
291 | /* Compute nxtsrr (iteration of next projection step) */ | ||
292 | 1732 | nxtsrr = PetscMin(eps->max_it,PetscMax((PetscInt)PetscFloorReal(stpfac*its),init)); | |
293 | |||
294 |
5/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
|
1732 | if (ngrp!=nogrp || ngrp==0 || arsd>=oarsd) { |
295 | 237 | idsrr = nxtsrr - its; | |
296 | } else { | ||
297 | 1495 | idsrr = (PetscInt)PetscFloorReal(alpha+beta*(itrsdold[eps->nconv]-itrsd[eps->nconv])*PetscLogReal(arsd/eps->tol)/PetscLogReal(arsd/oarsd)); | |
298 | 1495 | idsrr = PetscMax(1,idsrr); | |
299 | } | ||
300 | 1732 | nxtsrr = PetscMin(nxtsrr,its+idsrr); | |
301 | |||
302 | /* Compute nxtort (iteration of next orthogonalization step) */ | ||
303 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1732 | PetscCall(DSCond(eps->ds,&tcond)); |
304 |
5/6✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
|
1732 | idort = PetscMax(1,(PetscInt)PetscFloorReal(orttol/PetscMax(1,PetscLog10Real(tcond)))); |
305 | 1732 | nxtort = PetscMin(its+idort,nxtsrr); | |
306 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1732 | PetscCall(PetscInfo(eps,"Updated iteration counts: nxtort=%" PetscInt_FMT ", nxtsrr=%" PetscInt_FMT "\n",nxtort,nxtsrr)); |
307 | |||
308 | /* V(:,idx) = AV(:,idx) */ | ||
309 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1732 | PetscCall(BVSetActiveColumns(eps->V,eps->nconv,nv)); |
310 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1732 | PetscCall(BVSetActiveColumns(AV,eps->nconv,nv)); |
311 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
1732 | PetscCall(BVCopy(AV,eps->V)); |
312 | 1732 | its++; | |
313 | |||
314 | /* Orthogonalization loop */ | ||
315 | 19216 | do { | |
316 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
19216 | PetscCall(BVGetMatrix(eps->V,&B,&indef)); |
317 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
19216 | PetscCall(BVSetMatrix(eps->V,NULL,PETSC_FALSE)); |
318 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
53751 | while (its<nxtort) { |
319 | /* A(:,idx) = OP*V(:,idx) with normalization */ | ||
320 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
34535 | PetscCall(BVMatMult(eps->V,S,AV)); |
321 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
34535 | PetscCall(BVCopy(AV,eps->V)); |
322 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
34535 | PetscCall(BVNormalize(eps->V,NULL)); |
323 | 34535 | its++; | |
324 | } | ||
325 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
19216 | PetscCall(BVSetMatrix(eps->V,B,indef)); |
326 | /* Orthonormalize vectors */ | ||
327 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
19216 | PetscCall(BVOrthogonalize(eps->V,NULL)); |
328 | 19216 | nxtort = PetscMin(its+idort,nxtsrr); | |
329 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
|
19216 | } while (its<nxtsrr); |
330 | } | ||
331 | |||
332 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
207 | PetscCall(PetscFree6(rsd,orsd,oeigr,oeigi,itrsd,itrsdold)); |
333 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
207 | PetscCall(BVDestroy(&AV)); |
334 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
207 | PetscCall(BVDestroy(&R)); |
335 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
207 | PetscCall(STRestoreOperator(eps->st,&S)); |
336 |
4/6✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
|
207 | PetscCall(DSTruncate(eps->ds,eps->nconv,PETSC_TRUE)); |
337 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
39 | PetscFunctionReturn(PETSC_SUCCESS); |
338 | } | ||
339 | |||
340 | 187 | static PetscErrorCode EPSDestroy_Subspace(EPS eps) | |
341 | { | ||
342 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
187 | PetscFunctionBegin; |
343 |
5/8✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
|
187 | PetscCall(PetscFree(eps->data)); |
344 |
6/12✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
|
35 | PetscFunctionReturn(PETSC_SUCCESS); |
345 | } | ||
346 | |||
347 | 187 | SLEPC_EXTERN PetscErrorCode EPSCreate_Subspace(EPS eps) | |
348 | { | ||
349 | 187 | EPS_SUBSPACE *ctx; | |
350 | |||
351 |
1/2✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
|
187 | PetscFunctionBegin; |
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.
|
187 | PetscCall(PetscNew(&ctx)); |
353 | 187 | eps->data = (void*)ctx; | |
354 | |||
355 | 187 | eps->useds = PETSC_TRUE; | |
356 | 187 | eps->categ = EPS_CATEGORY_OTHER; | |
357 | |||
358 | 187 | eps->ops->solve = EPSSolve_Subspace; | |
359 | 187 | eps->ops->setup = EPSSetUp_Subspace; | |
360 | 187 | eps->ops->setupsort = EPSSetUpSort_Subspace; | |
361 | 187 | eps->ops->destroy = EPSDestroy_Subspace; | |
362 | 187 | eps->ops->backtransform = EPSBackTransform_Default; | |
363 | 187 | eps->ops->computevectors = EPSComputeVectors_Schur; | |
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.
|
187 | PetscFunctionReturn(PETSC_SUCCESS); |
365 | } | ||
366 |