GCC Code Coverage Report


Directory: ./
File: src/eps/impls/davidson/davidson.c
Date: 2025-10-04 04:19:13
Exec Total Coverage
Lines: 212 226 93.8%
Functions: 14 14 100.0%
Branches: 373 632 59.0%

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 Skeleton of Davidson solver. Actual solvers are GD and JD.
12
13 References:
14
15 [1] E. Romero and J.E. Roman, "A parallel implementation of Davidson
16 methods for large-scale eigenvalue problems in SLEPc", ACM Trans.
17 Math. Software 40(2):13, 2014.
18 */
19
20 #include "davidson.h"
21
22 static PetscBool cited = PETSC_FALSE;
23 static const char citation[] =
24 "@Article{slepc-davidson,\n"
25 " author = \"E. Romero and J. E. Roman\",\n"
26 " title = \"A parallel implementation of {Davidson} methods for large-scale eigenvalue problems in {SLEPc}\",\n"
27 " journal = \"{ACM} Trans. Math. Software\",\n"
28 " volume = \"40\",\n"
29 " number = \"2\",\n"
30 " pages = \"13:1--13:29\",\n"
31 " year = \"2014,\"\n"
32 " doi = \"https://doi.org/10.1145/2543696\"\n"
33 "}\n";
34
35 980 PetscErrorCode EPSSetUp_XD(EPS eps)
36 {
37 980 EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
38 980 dvdDashboard *dvd = &data->ddb;
39 980 dvdBlackboard b;
40 980 PetscInt min_size_V,bs,initv,nmat;
41 980 Mat A,B;
42 980 KSP ksp;
43 980 PetscBool ipB,ispositive;
44 980 HarmType_t harm;
45 980 InitType_t init;
46 980 PetscScalar target;
47
48
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
980 PetscFunctionBegin;
49
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
980 EPSCheckNotStructured(eps);
50 /* Setup EPS options and get the problem specification */
51
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
980 if (eps->nev==0) eps->nev = 1;
52 980 bs = data->blocksize;
53 980 if (bs <= 0) bs = 1;
54
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
980 if (eps->ncv!=PETSC_DETERMINE) {
55
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
426 PetscCheck(eps->ncv>=eps->nev,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"The value of ncv must be at least nev");
56
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
554 } else if (eps->mpd!=PETSC_DETERMINE) eps->ncv = eps->mpd + eps->nev + bs;
57
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
544 else if (eps->n < 10) eps->ncv = eps->n+eps->nev+bs;
58
2/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
544 else if (eps->nev < 500) eps->ncv = PetscMax(eps->nev,PetscMin(eps->n-bs,PetscMax(2*eps->nev,eps->nev+15))+bs);
59 else eps->ncv = PetscMax(eps->nev,PetscMin(eps->n-bs,eps->nev+500)+bs);
60
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
980 if (eps->mpd==PETSC_DETERMINE) eps->mpd = PetscMin(eps->n,eps->ncv);
61
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
980 PetscCheck(eps->mpd<=eps->ncv,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"The mpd parameter has to be less than or equal to ncv");
62
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
980 PetscCheck(eps->mpd>=2,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"The mpd parameter has to be greater than 2");
63
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
980 if (eps->max_it == PETSC_DETERMINE) eps->max_it = PetscMax(100*eps->ncv,2*eps->n);
64
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
980 if (!eps->which) eps->which = EPS_LARGEST_MAGNITUDE;
65
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
980 PetscCheck(eps->nev+bs<=eps->ncv,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"The value of ncv has to be greater than nev plus blocksize");
66
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
980 PetscCheck(!eps->trueres,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"-eps_true_residual is disabled in this solver.");
67
8/18
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ 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.
980 EPSCheckUnsupported(eps,EPS_FEATURE_REGION | EPS_FEATURE_TWOSIDED | EPS_FEATURE_THRESHOLD);
68
69
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
980 if (!data->minv) data->minv = (eps->n && eps->n<10)? 1: PetscMin(PetscMax(bs,6),eps->mpd/2);
70 980 min_size_V = data->minv;
71
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
980 PetscCheck(min_size_V+bs<=eps->mpd,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"The value of minv must be less than mpd minus blocksize");
72
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
980 if (data->plusk == PETSC_DETERMINE) {
73
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
642 if (eps->problem_type == EPS_GHIEP || eps->nev+bs>eps->ncv) data->plusk = 0;
74 622 else data->plusk = 1;
75 }
76
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
1614 if (!data->initialsize) data->initialsize = (eps->n && eps->n<10)? 1: 6;
77 980 initv = data->initialsize;
78
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
980 PetscCheck(eps->mpd>=initv,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"The initv parameter has to be less than or equal to mpd");
79
80 /* Change the default sigma to inf if necessary */
81
7/10
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 3 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
980 if (eps->which == EPS_LARGEST_MAGNITUDE || eps->which == EPS_LARGEST_REAL || eps->which == EPS_LARGEST_IMAGINARY) PetscCall(STSetDefaultShift(eps->st,PETSC_MAX_REAL));
82
83 /* Set up preconditioner */
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.
980 PetscCall(STSetUp(eps->st));
85
86 /* Setup problem specification in dvd */
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.
980 PetscCall(STGetNumMatrices(eps->st,&nmat));
88
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
980 PetscCall(STGetMatrix(eps->st,0,&A));
89
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.
980 if (nmat>1) PetscCall(STGetMatrix(eps->st,1,&B));
90
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
980 PetscCall(EPSReset_XD(eps));
91
4/6
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
980 PetscCall(PetscMemzero(dvd,sizeof(dvdDashboard)));
92
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
980 dvd->A = A; dvd->B = eps->isgeneralized? B: NULL;
93 980 ispositive = eps->ispositive;
94
5/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
1198 dvd->sA = DVD_MAT_IMPLICIT | (eps->ishermitian? DVD_MAT_HERMITIAN: 0) | ((ispositive && !eps->isgeneralized) ? DVD_MAT_POS_DEF: 0);
95 /* Assume -eps_hermitian means hermitian-definite in generalized problems */
96
6/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
980 if (!ispositive && !eps->isgeneralized && eps->ishermitian) ispositive = PETSC_TRUE;
97
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
980 if (!eps->isgeneralized) dvd->sB = DVD_MAT_IMPLICIT | DVD_MAT_HERMITIAN | DVD_MAT_IDENTITY | DVD_MAT_UNITARY | DVD_MAT_POS_DEF;
98
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
260 else dvd->sB = DVD_MAT_IMPLICIT | (eps->ishermitian? DVD_MAT_HERMITIAN: 0) | (ispositive? DVD_MAT_POS_DEF: 0);
99
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.
980 ipB = (dvd->B && data->ipB && DVD_IS(dvd->sB,DVD_MAT_HERMITIAN))?PETSC_TRUE:PETSC_FALSE;
100
9/10
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 10 times.
✓ Branch 6 taken 10 times.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 10 times.
1262 dvd->sEP = ((!eps->isgeneralized || (eps->isgeneralized && ipB))? DVD_EP_STD: 0) | (ispositive? DVD_EP_HERMITIAN: 0) | ((eps->problem_type == EPS_GHIEP && ipB) ? DVD_EP_INDEFINITE : 0);
101
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
980 if (data->ipB && !ipB) data->ipB = PETSC_FALSE;
102
5/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
980 dvd->correctXnorm = (dvd->B && (DVD_IS(dvd->sB,DVD_MAT_HERMITIAN)||DVD_IS(dvd->sEP,DVD_EP_INDEFINITE)))?PETSC_TRUE:PETSC_FALSE;
103 980 dvd->nev = eps->nev;
104 980 dvd->which = eps->which;
105 980 dvd->withTarget = PETSC_TRUE;
106
4/7
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 10 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
980 switch (eps->which) {
107 188 case EPS_TARGET_MAGNITUDE:
108 case EPS_TARGET_IMAGINARY:
109 188 dvd->target[0] = target = eps->target;
110 188 dvd->target[1] = 1.0;
111 188 break;
112 case EPS_TARGET_REAL:
113 dvd->target[0] = PetscRealPart(target = eps->target);
114 dvd->target[1] = 1.0;
115 break;
116 444 case EPS_LARGEST_REAL:
117 case EPS_LARGEST_MAGNITUDE:
118 case EPS_LARGEST_IMAGINARY: /* TODO: think about this case */
119 444 dvd->target[0] = 1.0;
120 444 dvd->target[1] = target = 0.0;
121 444 break;
122 308 case EPS_SMALLEST_MAGNITUDE:
123 case EPS_SMALLEST_REAL:
124 case EPS_SMALLEST_IMAGINARY: /* TODO: think about this case */
125 308 dvd->target[0] = target = 0.0;
126 308 dvd->target[1] = 1.0;
127 308 break;
128 40 case EPS_WHICH_USER:
129
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
40 PetscCall(STGetShift(eps->st,&target));
130 40 dvd->target[0] = target;
131 40 dvd->target[1] = 1.0;
132 40 break;
133 case EPS_ALL:
134 SETERRQ(PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"This solver does not support computing all eigenvalues");
135 default:
136 SETERRQ(PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Unsupported value of option 'which'");
137 }
138
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
980 dvd->tol = SlepcDefaultTol(eps->tol);
139 980 dvd->eps = eps;
140
141 /* Setup the extraction technique */
142
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
980 if (!eps->extraction) {
143
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
890 if (ipB || ispositive) eps->extraction = EPS_RITZ;
144 else {
145
3/3
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
158 switch (eps->which) {
146 60 case EPS_TARGET_REAL:
147 case EPS_TARGET_MAGNITUDE:
148 case EPS_TARGET_IMAGINARY:
149 case EPS_SMALLEST_MAGNITUDE:
150 case EPS_SMALLEST_REAL:
151 case EPS_SMALLEST_IMAGINARY:
152 60 eps->extraction = EPS_HARMONIC;
153 60 break;
154 68 case EPS_LARGEST_REAL:
155 case EPS_LARGEST_MAGNITUDE:
156 case EPS_LARGEST_IMAGINARY:
157 68 eps->extraction = EPS_HARMONIC_LARGEST;
158 68 break;
159 30 default:
160 30 eps->extraction = EPS_RITZ;
161 }
162 18 }
163 }
164
3/6
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
980 switch (eps->extraction) {
165 case EPS_RITZ: harm = DVD_HARM_NONE; break;
166 130 case EPS_HARMONIC: harm = DVD_HARM_RR; break;
167 case EPS_HARMONIC_RELATIVE: harm = DVD_HARM_RRR; break;
168 case EPS_HARMONIC_RIGHT: harm = DVD_HARM_REIGS; break;
169 88 case EPS_HARMONIC_LARGEST: harm = DVD_HARM_LEIGS; break;
170 default: SETERRQ(PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Unsupported extraction type");
171 }
172
173 /* Setup the type of starting subspace */
174 980 init = data->krylovstart? DVD_INITV_KRYLOV: DVD_INITV_CLASSIC;
175
176 /* Preconfigure dvd */
177
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
980 PetscCall(STGetKSP(eps->st,&ksp));
178
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
980 PetscCall(dvd_schm_basic_preconf(dvd,&b,eps->mpd,min_size_V,bs,initv,PetscAbs(eps->nini),data->plusk,harm,ksp,init,eps->trackall,data->ipB,data->doubleexp));
179
180 /* Allocate memory */
181
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
980 PetscCall(EPSAllocateSolution(eps,0));
182
183 /* Setup orthogonalization */
184
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
980 PetscCall(EPS_SetInnerProduct(eps));
185
7/10
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
980 if (!(ipB && dvd->B)) PetscCall(BVSetMatrix(eps->V,NULL,PETSC_FALSE));
186
187 /* Configure dvd for a basic GD */
188
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
980 PetscCall(dvd_schm_basic_conf(dvd,&b,eps->mpd,min_size_V,bs,initv,PetscAbs(eps->nini),data->plusk,harm,dvd->withTarget,target,ksp,data->fix,init,eps->trackall,data->ipB,data->dynamic,data->doubleexp));
189
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.
192 PetscFunctionReturn(PETSC_SUCCESS);
190 }
191
192 980 PetscErrorCode EPSSolve_XD(EPS eps)
193 {
194 980 EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
195 980 dvdDashboard *d = &data->ddb;
196 980 PetscInt l,k;
197
198
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
980 PetscFunctionBegin;
199
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
980 PetscCall(PetscCitationsRegister(citation,&cited));
200 /* Call the starting routines */
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.
980 PetscCall(EPSDavidsonFLCall(d->startList,d));
202
203 86393 while (eps->reason == EPS_CONVERGED_ITERATING) {
204
205 /* Initialize V, if it is needed */
206
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
86393 PetscCall(BVGetActiveColumns(d->eps->V,&l,&k));
207
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.
86393 if (PetscUnlikely(l == k)) PetscCall(d->initV(d));
208
209 /* Find the best approximated eigenpairs in V, X */
210
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
86393 PetscCall(d->calcPairs(d));
211
212 /* Test for convergence */
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.
86393 PetscCall((*eps->stopping)(eps,eps->its,eps->max_it,eps->nconv,eps->nev,&eps->reason,eps->stoppingctx));
214
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
86393 if (eps->reason != EPS_CONVERGED_ITERATING) break;
215
216 /* Expand the subspace */
217
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
85413 PetscCall(d->updateV(d));
218
219 /* Monitor progress */
220 85413 eps->nconv = d->nconv;
221 85413 eps->its++;
222
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
85413 PetscCall(BVGetActiveColumns(d->eps->V,NULL,&k));
223
5/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
86393 PetscCall(EPSMonitor(eps,eps->its,eps->nconv+d->npreconv,eps->eigr,eps->eigi,eps->errest,PetscMin(k,eps->nev)));
224 }
225
226 /* Call the ending routines */
227
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
980 PetscCall(EPSDavidsonFLCall(d->endList,d));
228
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.
192 PetscFunctionReturn(PETSC_SUCCESS);
229 }
230
231 1694 PetscErrorCode EPSReset_XD(EPS eps)
232 {
233 1694 EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
234 1694 dvdDashboard *dvd = &data->ddb;
235
236
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1694 PetscFunctionBegin;
237 /* Call step destructors and destroys the list */
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.
1694 PetscCall(EPSDavidsonFLCall(dvd->destroyList,dvd));
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.
1694 PetscCall(EPSDavidsonFLDestroy(&dvd->destroyList));
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.
1694 PetscCall(EPSDavidsonFLDestroy(&dvd->startList));
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.
1694 PetscCall(EPSDavidsonFLDestroy(&dvd->endList));
242
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.
334 PetscFunctionReturn(PETSC_SUCCESS);
243 }
244
245 40 PetscErrorCode EPSXDSetKrylovStart_XD(EPS eps,PetscBool krylovstart)
246 {
247 40 EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
248
249
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
40 PetscFunctionBegin;
250 40 data->krylovstart = krylovstart;
251
6/12
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
40 PetscFunctionReturn(PETSC_SUCCESS);
252 }
253
254 614 PetscErrorCode EPSXDGetKrylovStart_XD(EPS eps,PetscBool *krylovstart)
255 {
256 614 EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
257
258
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
614 PetscFunctionBegin;
259 614 *krylovstart = data->krylovstart;
260
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.
614 PetscFunctionReturn(PETSC_SUCCESS);
261 }
262
263 30 PetscErrorCode EPSXDSetBlockSize_XD(EPS eps,PetscInt blocksize)
264 {
265 30 EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
266
267
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
30 PetscFunctionBegin;
268
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
30 if (blocksize == PETSC_DEFAULT || blocksize == PETSC_DECIDE) blocksize = 1;
269
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
30 PetscCheck(blocksize>0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"Invalid blocksize value, must be >0");
270
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
30 if (data->blocksize != blocksize) {
271 30 data->blocksize = blocksize;
272 30 eps->state = EPS_STATE_INITIAL;
273 }
274
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.
6 PetscFunctionReturn(PETSC_SUCCESS);
275 }
276
277 614 PetscErrorCode EPSXDGetBlockSize_XD(EPS eps,PetscInt *blocksize)
278 {
279 614 EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
280
281
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
614 PetscFunctionBegin;
282 614 *blocksize = data->blocksize;
283
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.
614 PetscFunctionReturn(PETSC_SUCCESS);
284 }
285
286 22 PetscErrorCode EPSXDSetRestart_XD(EPS eps,PetscInt minv,PetscInt plusk)
287 {
288 22 EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
289
290
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
22 PetscFunctionBegin;
291
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
22 if (minv == PETSC_DETERMINE) {
292 if (data->minv != 0) eps->state = EPS_STATE_INITIAL;
293 data->minv = 0;
294
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
22 } else if (minv != PETSC_CURRENT) {
295
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
22 PetscCheck(minv>0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"Invalid minv value, must be >0");
296
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
22 if (data->minv != minv) eps->state = EPS_STATE_INITIAL;
297 22 data->minv = minv;
298 }
299
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 6 times.
22 if (plusk == PETSC_DETERMINE) {
300
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 if (data->plusk != PETSC_DETERMINE) eps->state = EPS_STATE_INITIAL;
301 10 data->plusk = PETSC_DETERMINE;
302
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
12 } else if (plusk != PETSC_CURRENT) {
303
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
12 PetscCheck(plusk>=0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"Invalid plusk value, must be >0");
304
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
12 if (data->plusk != plusk) eps->state = EPS_STATE_INITIAL;
305 12 data->plusk = plusk;
306 }
307
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.
6 PetscFunctionReturn(PETSC_SUCCESS);
308 }
309
310 614 PetscErrorCode EPSXDGetRestart_XD(EPS eps,PetscInt *minv,PetscInt *plusk)
311 {
312 614 EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
313
314
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
614 PetscFunctionBegin;
315
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
614 if (minv) *minv = data->minv;
316
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
614 if (plusk) *plusk = data->plusk;
317
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.
614 PetscFunctionReturn(PETSC_SUCCESS);
318 }
319
320 604 PetscErrorCode EPSXDGetInitialSize_XD(EPS eps,PetscInt *initialsize)
321 {
322 604 EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
323
324
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
604 PetscFunctionBegin;
325 604 *initialsize = data->initialsize;
326
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.
604 PetscFunctionReturn(PETSC_SUCCESS);
327 }
328
329 20 PetscErrorCode EPSXDSetInitialSize_XD(EPS eps,PetscInt initialsize)
330 {
331 20 EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
332
333
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
20 PetscFunctionBegin;
334
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
20 if (initialsize == PETSC_DEFAULT || initialsize == PETSC_DECIDE) initialsize = 0;
335
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
20 else PetscCheck(initialsize>0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"Invalid initial size value, must be >0");
336
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
20 if (data->initialsize != initialsize) {
337 20 data->initialsize = initialsize;
338 20 eps->state = EPS_STATE_INITIAL;
339 }
340
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);
341 }
342
343 20 PetscErrorCode EPSXDSetBOrth_XD(EPS eps,PetscBool borth)
344 {
345 20 EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
346
347
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
20 PetscFunctionBegin;
348 20 data->ipB = borth;
349
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.
20 PetscFunctionReturn(PETSC_SUCCESS);
350 }
351
352 614 PetscErrorCode EPSXDGetBOrth_XD(EPS eps,PetscBool *borth)
353 {
354 614 EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
355
356
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
614 PetscFunctionBegin;
357 614 *borth = data->ipB;
358
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.
614 PetscFunctionReturn(PETSC_SUCCESS);
359 }
360
361 /*
362 EPSComputeVectors_XD - Compute eigenvectors from the vectors
363 provided by the eigensolver. This version is intended for solvers
364 that provide Schur vectors from the QZ decomposition. Given the partial
365 Schur decomposition OP*V=V*T, the following steps are performed:
366 1) compute eigenvectors of (S,T): S*Z=T*Z*D
367 2) compute eigenvectors of OP: X=V*Z
368 */
369 940 PetscErrorCode EPSComputeVectors_XD(EPS eps)
370 {
371 940 Mat X;
372 940 PetscBool symm;
373
374
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
940 PetscFunctionBegin;
375
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
940 PetscCall(PetscObjectTypeCompare((PetscObject)eps->ds,DSHEP,&symm));
376
8/14
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ 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.
940 if (symm) PetscFunctionReturn(PETSC_SUCCESS);
377
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
248 PetscCall(DSVectors(eps->ds,DS_MAT_X,NULL,NULL));
378
379 /* V <- V * X */
380
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
248 PetscCall(DSGetMat(eps->ds,DS_MAT_X,&X));
381
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
248 PetscCall(BVSetActiveColumns(eps->V,0,eps->nconv));
382
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
248 PetscCall(BVMultInPlace(eps->V,X,0,eps->nconv));
383
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
248 PetscCall(DSRestoreMat(eps->ds,DS_MAT_X,&X));
384
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.
52 PetscFunctionReturn(PETSC_SUCCESS);
385 }
386