GCC Code Coverage Report


Directory: ./
File: src/eps/impls/davidson/davidson.c
Date: 2026-02-22 03:58:10
Exec Total Coverage
Lines: 212 226 93.8%
Functions: 14 14 100.0%
Branches: 373 630 59.2%

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 778 PetscErrorCode EPSSetUp_XD(EPS eps)
36 {
37 778 EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
38 778 dvdDashboard *dvd = &data->ddb;
39 778 dvdBlackboard b;
40 778 PetscInt min_size_V,bs,initv,nmat;
41 778 Mat A,B;
42 778 KSP ksp;
43 778 PetscBool ipB,ispositive;
44 778 HarmType_t harm;
45 778 InitType_t init;
46 778 PetscScalar target;
47
48
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
778 PetscFunctionBegin;
49
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
778 EPSCheckNotStructured(eps);
50 /* Setup EPS options and get the problem specification */
51
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
778 if (eps->nev==0) eps->nev = 1;
52 778 bs = data->blocksize;
53 778 if (bs <= 0) bs = 1;
54
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
778 if (eps->ncv!=PETSC_DETERMINE) {
55
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
336 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 8 times.
✓ Branch 1 taken 8 times.
442 } else if (eps->mpd!=PETSC_DETERMINE) eps->ncv = eps->mpd + eps->nev + bs;
57
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
434 else if (eps->n < 10) eps->ncv = eps->n+eps->nev+bs;
58
2/4
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
434 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 8 times.
✓ Branch 1 taken 8 times.
778 if (eps->mpd==PETSC_DETERMINE) eps->mpd = PetscMin(eps->n,eps->ncv);
61
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
778 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 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
778 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 8 times.
✓ Branch 1 taken 8 times.
778 if (eps->max_it == PETSC_DETERMINE) eps->max_it = PetscMax(100*eps->ncv,2*eps->n);
64
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
778 if (!eps->which) eps->which = EPS_LARGEST_MAGNITUDE;
65
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
778 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 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
778 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 6 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 8 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.
778 EPSCheckUnsupported(eps,EPS_FEATURE_REGION | EPS_FEATURE_TWOSIDED | EPS_FEATURE_THRESHOLD);
68
69
3/4
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
778 if (!data->minv) data->minv = (eps->n && eps->n<10)? 1: PetscMin(PetscMax(bs,6),eps->mpd/2);
70 778 min_size_V = data->minv;
71
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
778 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 8 times.
✓ Branch 1 taken 8 times.
778 if (data->plusk == PETSC_DETERMINE) {
73
3/4
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
510 if (eps->problem_type == EPS_GHIEP || eps->nev+bs>eps->ncv) data->plusk = 0;
74 494 else data->plusk = 1;
75 }
76
3/4
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
1284 if (!data->initialsize) data->initialsize = (eps->n && eps->n<10)? 1: 6;
77 778 initv = data->initialsize;
78
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
778 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/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
778 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
778 PetscCall(STSetUp(eps->st));
85
86 /* Setup problem specification in dvd */
87
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
778 PetscCall(STGetNumMatrices(eps->st,&nmat));
88
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
778 PetscCall(STGetMatrix(eps->st,0,&A));
89
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 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.
778 if (nmat>1) PetscCall(STGetMatrix(eps->st,1,&B));
90
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
778 PetscCall(EPSReset_XD(eps));
91
4/6
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
778 PetscCall(PetscMemzero(dvd,sizeof(dvdDashboard)));
92
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
778 dvd->A = A; dvd->B = eps->isgeneralized? B: NULL;
93 778 ispositive = eps->ispositive;
94
5/6
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
956 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 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 8 times.
✓ Branch 5 taken 8 times.
778 if (!ispositive && !eps->isgeneralized && eps->ishermitian) ispositive = PETSC_TRUE;
97
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
778 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 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
202 else dvd->sB = DVD_MAT_IMPLICIT | (eps->ishermitian? DVD_MAT_HERMITIAN: 0) | (ispositive? DVD_MAT_POS_DEF: 0);
99
5/6
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✓ Branch 5 taken 8 times.
778 ipB = (dvd->B && data->ipB && DVD_IS(dvd->sB,DVD_MAT_HERMITIAN))?PETSC_TRUE:PETSC_FALSE;
100
9/10
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 8 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 8 times.
✓ Branch 7 taken 8 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 8 times.
1006 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 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
778 if (data->ipB && !ipB) data->ipB = PETSC_FALSE;
102
5/6
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
778 dvd->correctXnorm = (dvd->B && (DVD_IS(dvd->sB,DVD_MAT_HERMITIAN)||DVD_IS(dvd->sEP,DVD_EP_INDEFINITE)))?PETSC_TRUE:PETSC_FALSE;
103 778 dvd->nev = eps->nev;
104 778 dvd->which = eps->which;
105 778 dvd->withTarget = PETSC_TRUE;
106
4/7
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
778 switch (eps->which) {
107 148 case EPS_TARGET_MAGNITUDE:
108 case EPS_TARGET_IMAGINARY:
109 148 dvd->target[0] = target = eps->target;
110 148 dvd->target[1] = 1.0;
111 148 break;
112 case EPS_TARGET_REAL:
113 dvd->target[0] = PetscRealPart(target = eps->target);
114 dvd->target[1] = 1.0;
115 break;
116 354 case EPS_LARGEST_REAL:
117 case EPS_LARGEST_MAGNITUDE:
118 case EPS_LARGEST_IMAGINARY: /* TODO: think about this case */
119 354 dvd->target[0] = 1.0;
120 354 dvd->target[1] = target = 0.0;
121 354 break;
122 244 case EPS_SMALLEST_MAGNITUDE:
123 case EPS_SMALLEST_REAL:
124 case EPS_SMALLEST_IMAGINARY: /* TODO: think about this case */
125 244 dvd->target[0] = target = 0.0;
126 244 dvd->target[1] = 1.0;
127 244 break;
128 32 case EPS_WHICH_USER:
129
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
32 PetscCall(STGetShift(eps->st,&target));
130 32 dvd->target[0] = target;
131 32 dvd->target[1] = 1.0;
132 32 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 8 times.
✓ Branch 1 taken 8 times.
778 dvd->tol = SlepcDefaultTol(eps->tol);
139 778 dvd->eps = eps;
140
141 /* Setup the extraction technique */
142
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
778 if (!eps->extraction) {
143
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
706 if (ipB || ispositive) eps->extraction = EPS_RITZ;
144 else {
145
3/3
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 8 times.
130 switch (eps->which) {
146 48 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 48 eps->extraction = EPS_HARMONIC;
153 48 break;
154 58 case EPS_LARGEST_REAL:
155 case EPS_LARGEST_MAGNITUDE:
156 case EPS_LARGEST_IMAGINARY:
157 58 eps->extraction = EPS_HARMONIC_LARGEST;
158 58 break;
159 24 default:
160 24 eps->extraction = EPS_RITZ;
161 }
162 9 }
163 }
164
3/6
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
778 switch (eps->extraction) {
165 case EPS_RITZ: harm = DVD_HARM_NONE; break;
166 104 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 74 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 778 init = data->krylovstart? DVD_INITV_KRYLOV: DVD_INITV_CLASSIC;
175
176 /* Preconfigure dvd */
177
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
778 PetscCall(STGetKSP(eps->st,&ksp));
178
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
778 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
778 PetscCall(EPSAllocateSolution(eps,0));
182
183 /* Setup orthogonalization */
184
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
778 PetscCall(EPS_SetInnerProduct(eps));
185
7/10
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 6 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
778 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
778 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 778 PetscErrorCode EPSSolve_XD(EPS eps)
193 {
194 778 EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
195 778 dvdDashboard *d = &data->ddb;
196 778 PetscInt l,k;
197
198
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
778 PetscFunctionBegin;
199
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
778 PetscCall(PetscCitationsRegister(citation,&cited));
200 /* Call the starting routines */
201
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
778 PetscCall(EPSDavidsonFLCall(d->startList,d));
202
203 68342 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
68342 PetscCall(BVGetActiveColumns(d->eps->V,&l,&k));
207
6/8
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 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.
68342 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
68342 PetscCall(d->calcPairs(d));
211
212 /* Test for convergence */
213
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
68342 PetscCall((*eps->stopping)(eps,eps->its,eps->max_it,eps->nconv,eps->nev,&eps->reason,eps->stoppingctx));
214
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
68342 if (eps->reason != EPS_CONVERGED_ITERATING) break;
215
216 /* Expand the subspace */
217
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
67564 PetscCall(d->updateV(d));
218
219 /* Monitor progress */
220 67564 eps->nconv = d->nconv;
221 67564 eps->its++;
222
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
67564 PetscCall(BVGetActiveColumns(d->eps->V,NULL,&k));
223
5/8
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
68342 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
778 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 1348 PetscErrorCode EPSReset_XD(EPS eps)
232 {
233 1348 EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
234 1348 dvdDashboard *dvd = &data->ddb;
235
236
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1348 PetscFunctionBegin;
237 /* Call step destructors and destroys the list */
238
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1348 PetscCall(EPSDavidsonFLCall(dvd->destroyList,dvd));
239
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1348 PetscCall(EPSDavidsonFLDestroy(&dvd->destroyList));
240
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1348 PetscCall(EPSDavidsonFLDestroy(&dvd->startList));
241
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
1348 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 32 PetscErrorCode EPSXDSetKrylovStart_XD(EPS eps,PetscBool krylovstart)
246 {
247 32 EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
248
249
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
32 PetscFunctionBegin;
250 32 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.
32 PetscFunctionReturn(PETSC_SUCCESS);
252 }
253
254 490 PetscErrorCode EPSXDGetKrylovStart_XD(EPS eps,PetscBool *krylovstart)
255 {
256 490 EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
257
258
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
490 PetscFunctionBegin;
259 490 *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.
490 PetscFunctionReturn(PETSC_SUCCESS);
261 }
262
263 24 PetscErrorCode EPSXDSetBlockSize_XD(EPS eps,PetscInt blocksize)
264 {
265 24 EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
266
267
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
24 PetscFunctionBegin;
268
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
24 if (blocksize == PETSC_DEFAULT || blocksize == PETSC_DECIDE) blocksize = 1;
269
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
24 PetscCheck(blocksize>0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"Invalid blocksize value, must be >0");
270
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
24 if (data->blocksize != blocksize) {
271 24 data->blocksize = blocksize;
272 24 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 490 PetscErrorCode EPSXDGetBlockSize_XD(EPS eps,PetscInt *blocksize)
278 {
279 490 EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
280
281
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
490 PetscFunctionBegin;
282 490 *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.
490 PetscFunctionReturn(PETSC_SUCCESS);
284 }
285
286 20 PetscErrorCode EPSXDSetRestart_XD(EPS eps,PetscInt minv,PetscInt plusk)
287 {
288 20 EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
289
290
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
20 PetscFunctionBegin;
291
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
20 if (minv == PETSC_DETERMINE) {
292 if (data->minv != 0) eps->state = EPS_STATE_INITIAL;
293 data->minv = 0;
294
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
20 } else if (minv != PETSC_CURRENT) {
295
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
20 PetscCheck(minv>0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"Invalid minv value, must be >0");
296
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
20 if (data->minv != minv) eps->state = EPS_STATE_INITIAL;
297 20 data->minv = minv;
298 }
299
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 6 times.
20 if (plusk == PETSC_DETERMINE) {
300
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (data->plusk != PETSC_DETERMINE) eps->state = EPS_STATE_INITIAL;
301 8 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 490 PetscErrorCode EPSXDGetRestart_XD(EPS eps,PetscInt *minv,PetscInt *plusk)
311 {
312 490 EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
313
314
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
490 PetscFunctionBegin;
315
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
490 if (minv) *minv = data->minv;
316
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
490 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.
490 PetscFunctionReturn(PETSC_SUCCESS);
318 }
319
320 482 PetscErrorCode EPSXDGetInitialSize_XD(EPS eps,PetscInt *initialsize)
321 {
322 482 EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
323
324
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
482 PetscFunctionBegin;
325 482 *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.
482 PetscFunctionReturn(PETSC_SUCCESS);
327 }
328
329 16 PetscErrorCode EPSXDSetInitialSize_XD(EPS eps,PetscInt initialsize)
330 {
331 16 EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
332
333
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
16 PetscFunctionBegin;
334
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
16 if (initialsize == PETSC_DEFAULT || initialsize == PETSC_DECIDE) initialsize = 0;
335
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
16 else PetscCheck(initialsize>0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"Invalid initial size value, must be >0");
336
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
16 if (data->initialsize != initialsize) {
337 16 data->initialsize = initialsize;
338 16 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 16 PetscErrorCode EPSXDSetBOrth_XD(EPS eps,PetscBool borth)
344 {
345 16 EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
346
347
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
16 PetscFunctionBegin;
348 16 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.
16 PetscFunctionReturn(PETSC_SUCCESS);
350 }
351
352 490 PetscErrorCode EPSXDGetBOrth_XD(EPS eps,PetscBool *borth)
353 {
354 490 EPS_DAVIDSON *data = (EPS_DAVIDSON*)eps->data;
355
356
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
490 PetscFunctionBegin;
357 490 *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.
490 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 746 PetscErrorCode EPSComputeVectors_XD(EPS eps)
370 {
371 746 Mat X;
372 746 PetscBool symm;
373
374
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
746 PetscFunctionBegin;
375
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
746 PetscCall(PetscObjectTypeCompare((PetscObject)eps->ds,DSHEP,&symm));
376
8/14
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 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.
746 if (symm) PetscFunctionReturn(PETSC_SUCCESS);
377
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
202 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 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
202 PetscCall(DSGetMat(eps->ds,DS_MAT_X,&X));
381
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
202 PetscCall(BVSetActiveColumns(eps->V,0,eps->nconv));
382
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
202 PetscCall(BVMultInPlace(eps->V,X,0,eps->nconv));
383
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
202 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