GCC Code Coverage Report


Directory: ./
File: src/eps/interface/epssetup.c
Date: 2026-07-29 03:58:07
Exec Total Coverage
Lines: 401 405 99.0%
Functions: 18 18 100.0%
Branches: 1045 1915 54.6%

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 EPS routines related to problem setup
12 */
13
14 #include <slepc/private/epsimpl.h> /*I "slepceps.h" I*/
15
16 /*
17 Let the solver choose the ST type that should be used by default,
18 otherwise set it to SHIFT.
19 This is called at EPSSetFromOptions (before STSetFromOptions)
20 and also at EPSSetUp (in case EPSSetFromOptions was not called).
21 */
22 18409 PetscErrorCode EPSSetDefaultST(EPS eps)
23 {
24
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
18409 PetscFunctionBegin;
25
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.
18409 PetscTryTypeMethod(eps,setdefaultst);
26
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.
18409 if (!((PetscObject)eps->st)->type_name) PetscCall(STSetType(eps->st,STSHIFT));
27
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.
3550 PetscFunctionReturn(PETSC_SUCCESS);
28 }
29
30 /*
31 This is done by preconditioned eigensolvers that use the PC only.
32 It sets STPRECOND with KSPPREONLY.
33 */
34 1048 PetscErrorCode EPSSetDefaultST_Precond(EPS eps)
35 {
36 1048 KSP ksp;
37
38
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
1048 PetscFunctionBegin;
39
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.
1048 if (!((PetscObject)eps->st)->type_name) PetscCall(STSetType(eps->st,STPRECOND));
40
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.
1048 PetscCall(STGetKSP(eps->st,&ksp));
41
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.
1048 if (!((PetscObject)ksp)->type_name) PetscCall(KSPSetType(ksp,KSPPREONLY));
42
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.
208 PetscFunctionReturn(PETSC_SUCCESS);
43 }
44
45 /*
46 This is done by preconditioned eigensolvers that can also use the KSP.
47 It sets STPRECOND with the default KSP (GMRES) and maxit=5.
48 */
49 952 PetscErrorCode EPSSetDefaultST_GMRES(EPS eps)
50 {
51 952 KSP ksp;
52
53
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
952 PetscFunctionBegin;
54
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.
952 if (!((PetscObject)eps->st)->type_name) PetscCall(STSetType(eps->st,STPRECOND));
55
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.
952 PetscCall(STPrecondSetKSPHasMat(eps->st,PETSC_TRUE));
56
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
952 PetscCall(STGetKSP(eps->st,&ksp));
57
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
952 if (!((PetscObject)ksp)->type_name) {
58
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.
391 PetscCall(KSPSetType(ksp,KSPGMRES));
59
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.
391 PetscCall(KSPSetTolerances(ksp,PETSC_CURRENT,PETSC_CURRENT,PETSC_CURRENT,5));
60 }
61
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.
216 PetscFunctionReturn(PETSC_SUCCESS);
62 }
63
64 #if defined(SLEPC_HAVE_SCALAPACK) || defined(SLEPC_HAVE_ELPA) || defined(SLEPC_HAVE_ELEMENTAL) || defined(SLEPC_HAVE_EVSL)
65 /*
66 This is for direct eigensolvers that work with A and B directly, so
67 no need to factorize B.
68 */
69 192 PetscErrorCode EPSSetDefaultST_NoFactor(EPS eps)
70 {
71 192 KSP ksp;
72 192 PC pc;
73
74
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
192 PetscFunctionBegin;
75
6/8
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
192 if (!((PetscObject)eps->st)->type_name) PetscCall(STSetType(eps->st,STSHIFT));
76
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
192 PetscCall(STGetKSP(eps->st,&ksp));
77
6/8
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
192 if (!((PetscObject)ksp)->type_name) PetscCall(KSPSetType(ksp,KSPPREONLY));
78
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
192 PetscCall(KSPGetPC(ksp,&pc));
79
6/8
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 5 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
192 if (!((PetscObject)pc)->type_name) PetscCall(PCSetType(pc,PCNONE));
80
6/12
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
24 PetscFunctionReturn(PETSC_SUCCESS);
81 }
82 #endif
83
84 /*
85 Check that the ST selected by the user is compatible with the EPS solver and options
86 */
87 11218 static PetscErrorCode EPSCheckCompatibleST(EPS eps)
88 {
89 11218 PetscBool precond,shift,sinvert,cayley,lyapii;
90 #if PetscDefined(USE_COMPLEX)
91 5483 PetscScalar sigma;
92 #endif
93
94
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
11218 PetscFunctionBegin;
95
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
11218 PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STPRECOND,&precond));
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.
11218 PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STSHIFT,&shift));
97
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
11218 PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STSINVERT,&sinvert));
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.
11218 PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STCAYLEY,&cayley));
99
100 /* preconditioned eigensolvers */
101
3/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
11218 PetscCheck(eps->categ!=EPS_CATEGORY_PRECOND || precond,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"This solver requires ST=PRECOND");
102
3/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
11218 PetscCheck(eps->categ==EPS_CATEGORY_PRECOND || !precond,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"STPRECOND is intended for preconditioned eigensolvers only");
103
104 /* harmonic extraction */
105
5/8
✓ 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.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
11218 PetscCheck(precond || shift || !eps->extraction || eps->extraction==EPS_RITZ,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Cannot use a spectral transformation combined with harmonic extraction");
106
107 /* real shifts in Hermitian problems */
108 #if PetscDefined(USE_COMPLEX)
109
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
5483 PetscCall(STGetShift(eps->st,&sigma));
110
3/6
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 5 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
5483 PetscCheck(!eps->ishermitian || PetscImaginaryPart(sigma)==0.0,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Hermitian problems are not compatible with complex shifts");
111 #endif
112
113 /* Cayley with PGNHEP */
114
3/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
11218 PetscCheck(!cayley || eps->problem_type!=EPS_PGNHEP,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Cayley spectral transformation is not compatible with PGNHEP");
115
116 /* make sure that the user does not specify smallest magnitude with shift-and-invert */
117
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.
11218 if ((cayley || sinvert) && (eps->categ==EPS_CATEGORY_KRYLOV || eps->categ==EPS_CATEGORY_OTHER)) {
118
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.
1297 PetscCall(PetscObjectTypeCompare((PetscObject)eps,EPSLYAPII,&lyapii));
119
10/14
✓ 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 not taken.
✓ Branch 8 taken 10 times.
✓ Branch 9 taken 10 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 10 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
1297 PetscCheck(lyapii || eps->which==EPS_TARGET_MAGNITUDE || eps->which==EPS_TARGET_REAL || eps->which==EPS_TARGET_IMAGINARY || eps->which==EPS_ALL || eps->which==EPS_WHICH_USER,PetscObjectComm((PetscObject)eps),PETSC_ERR_USER_INPUT,"Shift-and-invert requires a target 'which' (see EPSSetWhichEigenpairs), for instance -st_type sinvert -eps_target 0 -eps_target_magnitude");
120 }
121
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.
2159 PetscFunctionReturn(PETSC_SUCCESS);
122 }
123
124 /*
125 MatEstimateSpectralRange_EPS: estimate the spectral range [left,right] of a
126 symmetric/Hermitian matrix A using an auxiliary EPS object
127 */
128 146 PetscErrorCode MatEstimateSpectralRange_EPS(Mat A,PetscReal *left,PetscReal *right)
129 {
130 146 PetscInt nconv;
131 146 PetscScalar eig0;
132 146 PetscReal tol=1e-3,errest=tol;
133 146 EPS eps;
134
135
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
146 PetscFunctionBegin;
136 146 *left = 0.0; *right = 0.0;
137
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.
146 PetscCall(EPSCreate(PetscObjectComm((PetscObject)A),&eps));
138
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.
146 PetscCall(EPSSetOptionsPrefix(eps,"eps_filter_"));
139
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.
146 PetscCall(EPSSetOperators(eps,A,NULL));
140
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.
146 PetscCall(EPSSetProblemType(eps,EPS_HEP));
141
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.
146 PetscCall(EPSSetTolerances(eps,tol,50));
142
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.
146 PetscCall(EPSSetConvergenceTest(eps,EPS_CONV_ABS));
143
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.
146 PetscCall(EPSSetWhichEigenpairs(eps,EPS_SMALLEST_REAL));
144
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.
146 PetscCall(EPSSolve(eps));
145
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.
146 PetscCall(EPSGetConverged(eps,&nconv));
146
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
146 if (nconv>0) {
147
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.
146 PetscCall(EPSGetEigenvalue(eps,0,&eig0,NULL));
148
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.
146 PetscCall(EPSGetErrorEstimate(eps,0,&errest));
149 } else eig0 = eps->eigr[0];
150 146 *left = PetscRealPart(eig0)-errest;
151
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.
146 PetscCall(EPSSetWhichEigenpairs(eps,EPS_LARGEST_REAL));
152
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.
146 PetscCall(EPSSolve(eps));
153
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.
146 PetscCall(EPSGetConverged(eps,&nconv));
154
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
146 if (nconv>0) {
155
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.
146 PetscCall(EPSGetEigenvalue(eps,0,&eig0,NULL));
156
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.
146 PetscCall(EPSGetErrorEstimate(eps,0,&errest));
157 } else eig0 = eps->eigr[0];
158 146 *right = PetscRealPart(eig0)+errest;
159
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.
146 PetscCall(EPSDestroy(&eps));
160
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.
26 PetscFunctionReturn(PETSC_SUCCESS);
161 }
162
163 /*
164 EPSSetUpSort_Basic: configure the EPS sorting criterion according to 'which'
165 */
166 10613 PetscErrorCode EPSSetUpSort_Basic(EPS eps)
167 {
168
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
10613 PetscFunctionBegin;
169
11/11
✓ 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 taken 5 times.
✓ Branch 9 taken 10 times.
✓ Branch 10 taken 10 times.
10613 switch (eps->which) {
170 3836 case EPS_LARGEST_MAGNITUDE:
171 3836 eps->sc->comparison = SlepcCompareLargestMagnitude;
172 3836 eps->sc->comparisonctx = NULL;
173 3836 break;
174 801 case EPS_SMALLEST_MAGNITUDE:
175 801 eps->sc->comparison = SlepcCompareSmallestMagnitude;
176 801 eps->sc->comparisonctx = NULL;
177 801 break;
178 1199 case EPS_LARGEST_REAL:
179 1199 eps->sc->comparison = SlepcCompareLargestReal;
180 1199 eps->sc->comparisonctx = NULL;
181 1199 break;
182 2534 case EPS_SMALLEST_REAL:
183 2534 eps->sc->comparison = SlepcCompareSmallestReal;
184 2534 eps->sc->comparisonctx = NULL;
185 2534 break;
186 14 case EPS_LARGEST_IMAGINARY:
187 14 eps->sc->comparison = SlepcCompareLargestImaginary;
188 14 eps->sc->comparisonctx = NULL;
189 14 break;
190 10 case EPS_SMALLEST_IMAGINARY:
191 10 eps->sc->comparison = SlepcCompareSmallestImaginary;
192 10 eps->sc->comparisonctx = NULL;
193 10 break;
194 1262 case EPS_TARGET_MAGNITUDE:
195 1262 eps->sc->comparison = SlepcCompareTargetMagnitude;
196 1262 eps->sc->comparisonctx = &eps->target;
197 1262 break;
198 52 case EPS_TARGET_REAL:
199 52 eps->sc->comparison = SlepcCompareTargetReal;
200 52 eps->sc->comparisonctx = &eps->target;
201 52 break;
202 5 case EPS_TARGET_IMAGINARY:
203 5 eps->sc->comparison = SlepcCompareTargetImaginary;
204 5 eps->sc->comparisonctx = &eps->target;
205 5 break;
206 645 case EPS_ALL:
207 645 eps->sc->comparison = SlepcCompareSmallestReal;
208 645 eps->sc->comparisonctx = NULL;
209 645 break;
210 case EPS_WHICH_USER:
211 break;
212 }
213 10613 eps->sc->map = NULL;
214 10613 eps->sc->mapobj = NULL;
215
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.
10613 PetscFunctionReturn(PETSC_SUCCESS);
216 }
217
218 /*
219 EPSSetUpSort_Default: configure both EPS and DS sorting criterion
220 */
221 10359 PetscErrorCode EPSSetUpSort_Default(EPS eps)
222 {
223 10359 SlepcSC sc;
224 10359 PetscBool istrivial;
225
226
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
10359 PetscFunctionBegin;
227 /* fill sorting criterion context */
228
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
10359 PetscCall(EPSSetUpSort_Basic(eps));
229 /* fill sorting criterion for DS */
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.
10359 PetscCall(DSGetSlepcSC(eps->ds,&sc));
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.
10359 PetscCall(RGIsTrivial(eps->rg,&istrivial));
232
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
10359 sc->rg = istrivial? NULL: eps->rg;
233 10359 sc->comparison = eps->sc->comparison;
234 10359 sc->comparisonctx = eps->sc->comparisonctx;
235 10359 sc->map = SlepcMap_ST;
236 10359 sc->mapobj = (PetscObject)eps->st;
237
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.
10359 PetscFunctionReturn(PETSC_SUCCESS);
238 }
239
240 /*@
241 EPSSetDSType - Sets the type of the internal `DS` object based on the current
242 settings of the eigenvalue solver.
243
244 Collective
245
246 Input Parameter:
247 . eps - the linear eigensolver context
248
249 Note:
250 This function need not be called explicitly, since it will be called at
251 both `EPSSetFromOptions()` and `EPSSetUp()`.
252
253 Level: developer
254
255 .seealso: [](ch:eps), `EPSSetFromOptions()`, `EPSSetUp()`
256 @*/
257 17050 PetscErrorCode EPSSetDSType(EPS eps)
258 {
259
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
17050 PetscFunctionBegin;
260
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
17050 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
261
1/8
✗ 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.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
17050 PetscTryTypeMethod(eps,setdstype);
262
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.
3262 PetscFunctionReturn(PETSC_SUCCESS);
263 }
264
265 /*@
266 EPSSetUp - Sets up all the internal data structures necessary for the
267 execution of the eigensolver. Then calls `STSetUp()` for any set-up
268 operations associated to the internal `ST` object.
269
270 Collective
271
272 Input Parameter:
273 . eps - the linear eigensolver context
274
275 Notes:
276 This function need not be called explicitly in most cases, since `EPSSolve()`
277 calls it. It can be useful when one wants to measure the set-up time
278 separately from the solve time.
279
280 Level: developer
281
282 .seealso: [](ch:eps), `EPSCreate()`, `EPSSolve()`, `EPSDestroy()`, `STSetUp()`, `EPSSetInitialSpace()`, `EPSSetDeflationSpace()`
283 @*/
284 13062 PetscErrorCode EPSSetUp(EPS eps)
285 {
286 13062 Mat A,B;
287 13062 PetscInt k,nmat;
288 13062 PetscBool flg,isfilter;
289 13062 EPSStoppingCtx ctx;
290
291
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
13062 PetscFunctionBegin;
292
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
13062 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
293
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.
13062 if (eps->state) PetscFunctionReturn(PETSC_SUCCESS);
294
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.
11218 PetscCall(PetscLogEventBegin(EPS_SetUp,eps,0,0,0));
295
296 /* reset the convergence flag from the previous solves */
297 11218 eps->reason = EPS_CONVERGED_ITERATING;
298
299 /* Set default solver type (EPSSetFromOptions was not called) */
300
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.
11218 if (!((PetscObject)eps)->type_name) PetscCall(EPSSetType(eps,EPSKRYLOVSCHUR));
301
1/8
✗ 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.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
11218 if (!eps->st) PetscCall(EPSGetST(eps,&eps->st));
302
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.
11218 PetscCall(EPSSetDefaultST(eps));
303
304
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.
11218 PetscCall(STSetTransform(eps->st,PETSC_TRUE));
305
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.
11218 PetscCall(STSetStructured(eps->st,PETSC_FALSE));
306
8/10
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
11218 if (eps->useds && !eps->ds) PetscCall(EPSGetDS(eps,&eps->ds));
307
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.
11218 if (eps->useds) PetscCall(EPSSetDSType(eps));
308
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
11218 if (eps->twosided) {
309
1/8
✗ 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.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
209 PetscCheck(!eps->ishermitian || (eps->isgeneralized && !eps->ispositive),PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Two-sided methods are not intended for %s problems",SLEPC_STRING_HERMITIAN);
310 }
311
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.
11218 if (!eps->rg) PetscCall(EPSGetRG(eps,&eps->rg));
312
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.
11218 if (!((PetscObject)eps->rg)->type_name) PetscCall(RGSetType(eps->rg,RGINTERVAL));
313
314 /* Set problem dimensions */
315
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
11218 PetscCall(STGetNumMatrices(eps->st,&nmat));
316
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
11218 PetscCheck(nmat,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONGSTATE,"EPSSetOperators must be called first");
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.
11218 PetscCall(STMatGetSize(eps->st,&eps->n,NULL));
318
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.
11218 PetscCall(STMatGetLocalSize(eps->st,&eps->nloc,NULL));
319
320 /* Set default problem type */
321
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
11218 if (!eps->problem_type) {
322
6/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 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.
457 if (nmat==1) PetscCall(EPSSetProblemType(eps,EPS_NHEP));
323
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.
41 else PetscCall(EPSSetProblemType(eps,EPS_GNHEP));
324
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 10 times.
10761 } else if (nmat==1 && eps->isgeneralized) {
325
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
3 PetscCall(PetscInfo(eps,"Eigenproblem set as generalized but no matrix B was provided; reverting to a standard eigenproblem\n"));
326 3 eps->isgeneralized = PETSC_FALSE;
327
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
6 eps->problem_type = eps->ishermitian? EPS_HEP: EPS_NHEP;
328
3/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
10758 } else PetscCheck(nmat==1 || eps->isgeneralized,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_INCOMP,"Inconsistent EPS state: the problem type does not match the number of matrices");
329
330
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
11218 if (eps->isstructured) {
331 /* make sure the user has set the appropriate matrix */
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.
848 PetscCall(STGetMatrix(eps->st,0,&A));
333
6/8
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 5 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.
848 if (eps->problem_type==EPS_BSE) PetscCall(SlepcCheckMatStruct(A,SLEPC_MAT_STRUCT_BSE,NULL));
334
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
848 if (eps->problem_type==EPS_HAMILT) PetscCall(SlepcCheckMatStruct(A,SLEPC_MAT_STRUCT_HAMILT,NULL));
335
6/8
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
848 if (eps->problem_type==EPS_LREP) PetscCall(SlepcCheckMatStruct(A,SLEPC_MAT_STRUCT_LREP,NULL));
336 }
337
338 /* safeguard for small problems */
339
2/14
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
11218 if (eps->n == 0) PetscFunctionReturn(PETSC_SUCCESS);
340
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
11218 if (eps->nev > eps->n) eps->nev = eps->n;
341
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
11218 if (eps->problem_type == EPS_BSE || eps->problem_type == EPS_LREP) {
342
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
813 if (2*eps->ncv > eps->n) eps->ncv = eps->n/2;
343 } else {
344
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
10405 if (eps->ncv > eps->n) eps->ncv = eps->n;
345 }
346
347 /* check some combinations of eps->which */
348
7/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 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
11218 PetscCheck(!eps->ishermitian || (eps->isgeneralized && !eps->ispositive) || (eps->which!=EPS_LARGEST_IMAGINARY && eps->which!=EPS_SMALLEST_IMAGINARY && eps->which!=EPS_TARGET_IMAGINARY),PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Sorting the eigenvalues along the imaginary axis is not allowed when all eigenvalues are real");
349
350 /* initialization of matrix norms */
351
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
11218 if (eps->conv==EPS_CONV_NORM) {
352
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
496 if (!eps->nrma) {
353
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
496 PetscCall(STGetMatrix(eps->st,0,&A));
354
4/6
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
496 PetscCall(MatNorm(A,NORM_INFINITY,&eps->nrma));
355 }
356
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
496 if (nmat>1 && !eps->nrmb) {
357
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.
486 PetscCall(STGetMatrix(eps->st,1,&B));
358
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.
486 PetscCall(MatNorm(B,NORM_INFINITY,&eps->nrmb));
359 }
360 }
361
362 /* call specific solver setup */
363
5/10
✗ 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 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
11218 PetscUseTypeMethod(eps,setup);
364
365 /* threshold stopping test */
366
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.
11218 PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STFILTER,&isfilter));
367
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
11218 if (eps->stop==EPS_STOP_THRESHOLD && !isfilter) {
368
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
171 PetscCheck(eps->thres!=PETSC_MIN_REAL,PetscObjectComm((PetscObject)eps),PETSC_ERR_USER_INPUT,"Must give a threshold value with EPSSetThreshold()");
369
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
171 PetscCheck(eps->which==EPS_LARGEST_MAGNITUDE || eps->which==EPS_SMALLEST_MAGNITUDE || eps->which==EPS_LARGEST_REAL || eps->which==EPS_SMALLEST_REAL || eps->which==EPS_TARGET_MAGNITUDE,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Threshold stopping test can only be used with largest/smallest/target magnitude or largest/smallest real selection of eigenvalues");
370
1/8
✗ 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.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
171 if (eps->which==EPS_LARGEST_REAL || eps->which==EPS_SMALLEST_REAL) PetscCheck(eps->problem_type==EPS_HEP || eps->problem_type==EPS_GHEP || eps->problem_type==EPS_BSE || eps->problem_type==EPS_LREP,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Threshold stopping test with largest/smallest real can only be used in problems that have all eigenvalues real");
371
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
171 else PetscCheck(eps->thres>0.0,PetscObjectComm((PetscObject)eps),PETSC_ERR_USER_INPUT,"In case of largest/smallest/target magnitude the threshold value must be positive");
372
3/6
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
171 PetscCheck(eps->which==EPS_LARGEST_MAGNITUDE || eps->which==EPS_TARGET_MAGNITUDE || !eps->threlative,PetscObjectComm((PetscObject)eps),PETSC_ERR_USER_INPUT,"Can only use a relative threshold with largest/target magnitude selection of eigenvalues");
373
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.
171 PetscCall(PetscNew(&ctx));
374 171 ctx->thres = eps->thres;
375 171 ctx->threlative = eps->threlative;
376 171 ctx->which = eps->which;
377 171 ctx->its = -1;
378
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.
171 PetscCall(EPSSetStoppingTestFunction(eps,EPSStoppingThreshold,ctx,PetscCtxDestroyDefault));
379 }
380
381 /* if purification is set, check that it really makes sense */
382
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
11218 if (eps->purify) {
383
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
7499 if (eps->categ==EPS_CATEGORY_PRECOND || eps->categ==EPS_CATEGORY_CONTOUR) eps->purify = PETSC_FALSE;
384 else {
385
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
5837 if (!eps->isgeneralized) eps->purify = PETSC_FALSE;
386
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 8 times.
1490 else if (!eps->ishermitian && !eps->ispositive) eps->purify = PETSC_FALSE;
387 else {
388
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.
1164 PetscCall(PetscObjectTypeCompare((PetscObject)eps->st,STCAYLEY,&flg));
389
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
1164 if (flg) eps->purify = PETSC_FALSE;
390 }
391 }
392 }
393
394 /* set tolerance if not yet set */
395
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
11218 if (eps->tol==(PetscReal)PETSC_DETERMINE) eps->tol = SLEPC_DEFAULT_TOL;
396
397 /* set up sorting criterion */
398
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.
11218 PetscTryTypeMethod(eps,setupsort);
399
400 /* Build balancing matrix if required */
401
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
11218 if (eps->balance!=EPS_BALANCE_USER) {
402
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.
11218 PetscCall(STSetBalanceMatrix(eps->st,NULL));
403
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
11218 if (!eps->ishermitian && (eps->balance==EPS_BALANCE_ONESIDE || eps->balance==EPS_BALANCE_TWOSIDE)) {
404
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.
130 if (!eps->D) PetscCall(BVCreateVec(eps->V,&eps->D));
405
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.
130 PetscCall(EPSBuildBalance_Krylov(eps));
406
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.
130 PetscCall(STSetBalanceMatrix(eps->st,eps->D));
407 }
408 }
409
410 /* Setup ST */
411
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.
11218 PetscCall(STSetUp(eps->st));
412
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.
11218 PetscCall(EPSCheckCompatibleST(eps));
413
414 /* threshold stopping test for STFILTER */
415
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
11218 if (isfilter) {
416
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.
206 PetscCall(PetscNew(&ctx));
417
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.
206 PetscCall(STFilterGetThreshold(eps->st,&eps->thres));
418 206 eps->threlative = PETSC_FALSE;
419 206 ctx->thres = eps->thres;
420 206 ctx->threlative = eps->threlative;
421 206 ctx->which = EPS_LARGEST_MAGNITUDE;
422 206 ctx->its = -1;
423
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.
206 PetscCall(EPSSetStoppingTestFunction(eps,EPSStoppingThreshold,ctx,PetscCtxDestroyDefault));
424 }
425
426 /* process deflation and initial vectors */
427
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
11218 if (eps->nds<0) {
428
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
153 PetscCheck(!eps->isstructured,PetscObjectComm((PetscObject)eps),PETSC_ERR_SUP,"Deflation space is not supported in structured eigenproblems");
429 153 k = -eps->nds;
430
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.
153 PetscCall(BVInsertConstraints(eps->V,&k,eps->defl));
431
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.
153 PetscCall(SlepcBasisDestroy_Private(&eps->nds,&eps->defl));
432 153 eps->nds = k;
433
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.
153 PetscCall(STCheckNullSpace(eps->st,eps->V));
434 }
435
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
11218 if (eps->nini<0) {
436 2624 k = -eps->nini;
437
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2624 PetscCheck(k<=eps->ncv,PetscObjectComm((PetscObject)eps),PETSC_ERR_USER_INPUT,"The number of initial vectors is larger than ncv");
438
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.
2624 PetscCall(BVInsertVecs(eps->V,0,&k,eps->IS,PETSC_TRUE));
439
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.
2624 PetscCall(SlepcBasisDestroy_Private(&eps->nini,&eps->IS));
440 2624 eps->nini = k;
441 }
442
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
11218 if (eps->twosided && eps->ninil<0) {
443 40 k = -eps->ninil;
444
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
40 PetscCheck(k<=eps->ncv,PetscObjectComm((PetscObject)eps),PETSC_ERR_USER_INPUT,"The number of left initial vectors is larger than ncv");
445
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(BVInsertVecs(eps->W,0,&k,eps->ISL,PETSC_TRUE));
446
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(SlepcBasisDestroy_Private(&eps->ninil,&eps->ISL));
447 40 eps->ninil = k;
448 }
449
450
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.
11218 PetscCall(PetscLogEventEnd(EPS_SetUp,eps,0,0,0));
451 11218 eps->state = EPS_STATE_SETUP;
452
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.
11218 PetscFunctionReturn(PETSC_SUCCESS);
453 }
454
455 /*@
456 EPSSetOperators - Sets the matrices associated with the eigenvalue problem.
457
458 Collective
459
460 Input Parameters:
461 + eps - the linear eigensolver context
462 . A - the matrix associated with the eigensystem
463 - B - the second matrix in the case of generalized eigenproblems
464
465 Notes:
466 To specify a standard eigenproblem, use `NULL` for parameter `B`.
467
468 It must be called before `EPSSetUp()`. If it is called again after `EPSSetUp()` and
469 the matrix sizes have changed then the `EPS` object is reset.
470
471 For structured eigenproblem types such as `EPS_BSE` (see `EPSSetProblemType()`), the
472 provided matrices must have been created with the corresponding helper function,
473 i.e., `MatCreateBSE()`.
474
475 Level: beginner
476
477 .seealso: [](ch:eps), `EPSSolve()`, `EPSSetUp()`, `EPSReset()`, `EPSSetProblemType()`
478 @*/
479 9595 PetscErrorCode EPSSetOperators(EPS eps,Mat A,Mat B)
480 {
481 9595 PetscInt m,n,m0,mloc,nloc,mloc0,nmat;
482 9595 Mat mat[2];
483 9595 VecType ta,tb;
484 9595 PetscBool same;
485
486
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
9595 PetscFunctionBegin;
487
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
9595 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
488
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
9595 PetscValidHeaderSpecific(A,MAT_CLASSID,2);
489
4/14
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
9595 if (B) PetscValidHeaderSpecific(B,MAT_CLASSID,3);
490
13/32
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ 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.
✓ Branch 12 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
9595 PetscCheckSameComm(eps,1,A,2);
491
15/34
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
9595 if (B) PetscCheckSameComm(eps,1,B,3);
492
493 /* Check matrix sizes */
494
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.
9595 PetscCall(MatGetSize(A,&m,&n));
495
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.
9595 PetscCall(MatGetLocalSize(A,&mloc,&nloc));
496
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
9595 PetscCheck(m==n,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONG,"A is a non-square matrix (%" PetscInt_FMT " rows, %" PetscInt_FMT " cols)",m,n);
497
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
9595 PetscCheck(mloc==nloc,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONG,"A does not have equal row and column sizes (%" PetscInt_FMT ", %" PetscInt_FMT ")",mloc,nloc);
498
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9595 if (B) {
499
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.
2311 PetscCall(MatGetSize(B,&m0,&n));
500
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.
2311 PetscCall(MatGetLocalSize(B,&mloc0,&nloc));
501
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2311 PetscCheck(m0==n,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONG,"B is a non-square matrix (%" PetscInt_FMT " rows, %" PetscInt_FMT " cols)",m0,n);
502
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2311 PetscCheck(mloc0==nloc,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_WRONG,"B does not have equal row and column local sizes (%" PetscInt_FMT ", %" PetscInt_FMT ")",mloc0,nloc);
503
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2311 PetscCheck(m==m0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_INCOMP,"Dimensions of A and B do not match (%" PetscInt_FMT ", %" PetscInt_FMT ")",m,m0);
504
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2311 PetscCheck(mloc==mloc0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_INCOMP,"Local dimensions of A and B do not match (%" PetscInt_FMT ", %" PetscInt_FMT ")",mloc,mloc0);
505 /* make sure both matrices have compatible VecType */
506
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.
2311 PetscCall(MatGetVecType(A,&ta));
507
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.
2311 PetscCall(MatGetVecType(B,&tb));
508
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
2311 PetscCall(PetscStrcmp(ta,tb,&same));
509
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2311 PetscCheck(same,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_INCOMP,"The provided matrices have different vector types (%s vs %s), consider calling MatSetVecType() in the one that is not on GPU",ta,tb);
510 }
511
10/12
✓ 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 2 times.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
9595 if (eps->state && (n!=eps->n || nloc!=eps->nloc)) PetscCall(EPSReset(eps));
512 9595 eps->nrma = 0.0;
513 9595 eps->nrmb = 0.0;
514
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.
9595 if (!eps->st) PetscCall(EPSGetST(eps,&eps->st));
515 9595 mat[0] = A;
516
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
9595 if (B) {
517 2311 mat[1] = B;
518 2311 nmat = 2;
519 } else nmat = 1;
520
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.
9595 PetscCall(STSetMatrices(eps->st,nmat,mat));
521 9595 eps->state = EPS_STATE_INITIAL;
522
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.
9595 PetscFunctionReturn(PETSC_SUCCESS);
523 }
524
525 /*@
526 EPSGetOperators - Gets the matrices associated with the eigensystem.
527
528 Collective
529
530 Input Parameter:
531 . eps - the linear eigensolver context
532
533 Output Parameters:
534 + A - the matrix associated with the eigensystem
535 - B - the second matrix in the case of generalized eigenproblems
536
537 Note:
538 Does not increase the reference count of the matrices, so you should not destroy them.
539
540 Level: intermediate
541
542 .seealso: [](ch:eps), `EPSSolve()`, `EPSGetST()`, `STGetMatrix()`, `STSetMatrices()`
543 @*/
544 11369 PetscErrorCode EPSGetOperators(EPS eps,Mat *A,Mat *B)
545 {
546 11369 ST st;
547 11369 PetscInt k;
548
549
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
11369 PetscFunctionBegin;
550
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
11369 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
551
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.
11369 PetscCall(EPSGetST(eps,&st));
552
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.
11369 PetscCall(STGetNumMatrices(st,&k));
553
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
11369 if (A) {
554
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
5881 if (k<1) *A = NULL;
555
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.
5881 else PetscCall(STGetMatrix(st,0,A));
556 }
557
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
11369 if (B) {
558
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
7273 if (k<2) *B = NULL;
559
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.
6861 else PetscCall(STGetMatrix(st,1,B));
560 }
561
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.
2239 PetscFunctionReturn(PETSC_SUCCESS);
562 }
563
564 /*@
565 EPSSetDeflationSpace - Specify a basis of vectors that constitute the deflation
566 space.
567
568 Collective
569
570 Input Parameters:
571 + eps - the linear eigensolver context
572 . n - number of vectors
573 - v - set of basis vectors of the deflation space
574
575 Notes:
576 When a deflation space is given, the eigensolver seeks the eigensolution
577 in the restriction of the problem to the orthogonal complement of this
578 space. This can be used for instance in the case that an invariant
579 subspace is known beforehand (such as the nullspace of the matrix).
580
581 These vectors do not persist from one `EPSSolve()` call to the other, so the
582 deflation space should be set every time.
583
584 The vectors do not need to be mutually orthonormal, since they are explicitly
585 orthonormalized internally.
586
587 Level: intermediate
588
589 .seealso: [](ch:eps), `EPSSetInitialSpace()`
590 @*/
591 171 PetscErrorCode EPSSetDeflationSpace(EPS eps,PetscInt n,Vec v[])
592 {
593
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
171 PetscFunctionBegin;
594
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
171 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
595
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
171 PetscValidLogicalCollectiveInt(eps,n,2);
596
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
171 PetscCheck(n>=0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"Argument n cannot be negative");
597
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
171 if (n>0) {
598
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
167 PetscAssertPointer(v,3);
599
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
167 PetscValidHeaderSpecific(*v,VEC_CLASSID,3);
600 }
601
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.
171 PetscCall(SlepcBasisReference_Private(n,v,&eps->nds,&eps->defl));
602
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
171 if (n>0) eps->state = EPS_STATE_INITIAL;
603
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.
33 PetscFunctionReturn(PETSC_SUCCESS);
604 }
605
606 /*@
607 EPSSetInitialSpace - Specify a basis of vectors that constitute the initial
608 space, that is, the subspace from which the solver starts to iterate.
609
610 Collective
611
612 Input Parameters:
613 + eps - the linear eigensolver context
614 . n - number of vectors
615 - is - set of basis vectors of the initial space
616
617 Notes:
618 Some solvers such as `EPSKRYLOVSCHUR` start to iterate on a single vector
619 (initial vector). In that case, only `is[0]` is taken into account and the
620 other vectors are ignored. But other solvers such as `EPSSUBSPACE` are
621 able to make use of the whole initial subspace as an initial guess.
622
623 These vectors do not persist from one `EPSSolve()` call to the other, so the
624 initial space should be set every time.
625
626 The vectors do not need to be mutually orthonormal, since they are explicitly
627 orthonormalized internally.
628
629 Common usage of this function is when the user can provide a rough approximation
630 of the wanted eigenspace. Then, convergence may be faster.
631
632 Level: intermediate
633
634 .seealso: [](ch:eps), `EPSSetLeftInitialSpace()`, `EPSSetDeflationSpace()`
635 @*/
636 2646 PetscErrorCode EPSSetInitialSpace(EPS eps,PetscInt n,Vec is[])
637 {
638
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2646 PetscFunctionBegin;
639
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
2646 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
640
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
2646 PetscValidLogicalCollectiveInt(eps,n,2);
641
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2646 PetscCheck(n>=0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"Argument n cannot be negative");
642
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
2646 if (n>0) {
643
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
2638 PetscAssertPointer(is,3);
644
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
2638 PetscValidHeaderSpecific(*is,VEC_CLASSID,3);
645 }
646
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.
2646 PetscCall(SlepcBasisReference_Private(n,is,&eps->nini,&eps->IS));
647
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 8 times.
2646 if (n>0) eps->state = EPS_STATE_INITIAL;
648
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.
501 PetscFunctionReturn(PETSC_SUCCESS);
649 }
650
651 /*@
652 EPSSetLeftInitialSpace - Specify a basis of vectors that constitute the left
653 initial space, used by two-sided solvers to start the left subspace.
654
655 Collective
656
657 Input Parameters:
658 + eps - the linear eigensolver context
659 . n - number of vectors
660 - isl - set of basis vectors of the left initial space
661
662 Notes:
663 Left initial vectors are used to initiate the left search space in two-sided
664 eigensolvers. Users should pass here an approximation of the left eigenspace,
665 if available.
666
667 The same comments in `EPSSetInitialSpace()` are applicable here.
668
669 Level: intermediate
670
671 .seealso: [](ch:eps), `EPSSetInitialSpace()`, `EPSSetTwoSided()`
672 @*/
673 40 PetscErrorCode EPSSetLeftInitialSpace(EPS eps,PetscInt n,Vec isl[])
674 {
675
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
40 PetscFunctionBegin;
676
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
40 PetscValidHeaderSpecific(eps,EPS_CLASSID,1);
677
27/62
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 2 times.
✓ Branch 24 taken 2 times.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✓ Branch 32 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✓ Branch 41 taken 2 times.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 2 times.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 53 not taken.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 56 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 2 times.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
40 PetscValidLogicalCollectiveInt(eps,n,2);
678
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
40 PetscCheck(n>=0,PetscObjectComm((PetscObject)eps),PETSC_ERR_ARG_OUTOFRANGE,"Argument n cannot be negative");
679
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
40 if (n>0) {
680
2/8
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
40 PetscAssertPointer(isl,3);
681
3/16
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
40 PetscValidHeaderSpecific(*isl,VEC_CLASSID,3);
682 }
683
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(SlepcBasisReference_Private(n,isl,&eps->ninil,&eps->ISL));
684
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
40 if (n>0) eps->state = EPS_STATE_INITIAL;
685
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.
8 PetscFunctionReturn(PETSC_SUCCESS);
686 }
687
688 /*
689 EPSSetDimensions_Default - Set reasonable values for ncv, mpd if not set
690 by the user. This is called at setup.
691 */
692 8437 PetscErrorCode EPSSetDimensions_Default(EPS eps,PetscInt *nev,PetscInt *ncv,PetscInt *mpd)
693 {
694 8437 PetscBool krylov;
695
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
8437 PetscInt nev2, n = (eps->problem_type==EPS_BSE || eps->problem_type==EPS_LREP)? eps->n/2: eps->n;
696
697
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
8437 PetscFunctionBegin;
698
4/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
8437 if (*nev==0 && eps->stop!=EPS_STOP_THRESHOLD) *nev = 1;
699
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
8437 nev2 = (eps->problem_type==EPS_BSE || eps->problem_type==EPS_LREP)? (*nev+1)/2: *nev;
700
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
8437 if (*ncv!=PETSC_DETERMINE) { /* ncv set */
701
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.
5140 PetscCall(PetscObjectTypeCompareAny((PetscObject)eps,&krylov,EPSKRYLOVSCHUR,EPSARNOLDI,EPSLANCZOS,""));
702
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
5140 if (krylov) {
703
4/8
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
4962 PetscCheck(*ncv>=nev2+1 || (*ncv==nev2 && *ncv==n),PetscObjectComm((PetscObject)eps),PETSC_ERR_USER_INPUT,"The value of ncv must be at least nev+1");
704 } else {
705
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
178 PetscCheck(*ncv>=nev2,PetscObjectComm((PetscObject)eps),PETSC_ERR_USER_INPUT,"The value of ncv must be at least nev");
706 }
707
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
3297 } else if (*mpd!=PETSC_DETERMINE) { /* mpd set */
708 60 *ncv = PetscMin(n,nev2+(*mpd));
709 } else { /* neither set: defaults depend on nev being small or large */
710
3/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 10 times.
3237 if (nev2<500) *ncv = PetscMin(n,PetscMax(2*(nev2),nev2+15));
711 else {
712 *mpd = 500;
713 *ncv = PetscMin(n,nev2+(*mpd));
714 }
715 }
716
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
8437 if (*mpd==PETSC_DETERMINE) *mpd = *ncv;
717
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.
1593 PetscFunctionReturn(PETSC_SUCCESS);
718 }
719
720 /*@
721 EPSAllocateSolution - Allocate memory storage for common variables such
722 as eigenvalues and eigenvectors.
723
724 Collective
725
726 Input Parameters:
727 + eps - the linear eigensolver context
728 - extra - number of additional positions, used for methods that require a
729 working basis slightly larger than `ncv`
730
731 Developer Note:
732 This is `SLEPC_EXTERN` because it may be required by user plugin `EPS`
733 implementations.
734
735 Level: developer
736
737 .seealso: [](ch:eps), `EPSSetUp()`, `EPSSetDimensions()`
738 @*/
739 11218 PetscErrorCode EPSAllocateSolution(EPS eps,PetscInt extra)
740 {
741 11218 PetscInt oldsize,requested;
742 11218 PetscRandom rand;
743 11218 Vec t;
744
745
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
11218 PetscFunctionBegin;
746 11218 requested = eps->ncv + extra;
747
748 /* oldsize is zero if this is the first time setup is called */
749
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.
11218 PetscCall(BVGetSizes(eps->V,NULL,NULL,&oldsize));
750
751 /* allocate space for eigenvalues and friends */
752
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
11218 if (requested != oldsize || !eps->eigr) {
753
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.
7872 PetscCall(PetscFree4(eps->eigr,eps->eigi,eps->errest,eps->perm));
754
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.
7872 PetscCall(PetscMalloc4(requested,&eps->eigr,requested,&eps->eigi,requested,&eps->errest,requested,&eps->perm));
755 }
756
757 /* workspace for the case of arbitrary selection */
758
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
11218 if (eps->arbitrary) {
759
1/8
✗ 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.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
82 if (eps->rr) PetscCall(PetscFree2(eps->rr,eps->ri));
760
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.
82 PetscCall(PetscMalloc2(requested,&eps->rr,requested,&eps->ri));
761 }
762
763 /* allocate V */
764
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.
11218 if (!eps->V) PetscCall(EPSGetBV(eps,&eps->V));
765
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
11218 if (!oldsize) {
766
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.
7731 if (!((PetscObject)eps->V)->type_name) PetscCall(BVSetType(eps->V,BVMAT));
767
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.
7731 PetscCall(STMatCreateVecsEmpty(eps->st,&t,NULL));
768
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.
7731 PetscCall(BVSetSizesFromVec(eps->V,t,requested));
769
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.
7731 PetscCall(VecDestroy(&t));
770
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.
3487 } else PetscCall(BVResize(eps->V,requested,PETSC_FALSE));
771
772 /* allocate W */
773
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
11218 if (eps->twosided) {
774
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.
209 PetscCall(BVGetRandomContext(eps->V,&rand)); /* make sure the random context is available when duplicating */
775
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.
209 PetscCall(BVDestroy(&eps->W));
776
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.
209 PetscCall(BVDuplicate(eps->V,&eps->W));
777 }
778
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.
2159 PetscFunctionReturn(PETSC_SUCCESS);
779 }
780
781 /*@
782 EPSReallocateSolution - Reallocate memory storage for common variables such
783 as the eigenvalues and the basis vectors.
784
785 Collective
786
787 Input Parameters:
788 + eps - the linear eigensolver context
789 - newsize - new size
790
791 Developer Notes:
792 This is `SLEPC_EXTERN` because it may be required by user plugin `EPS`
793 implementations.
794
795 This is called during the iteration in case the threshold stopping test has
796 been selected.
797
798 Level: developer
799
800 .seealso: [](ch:eps), `EPSAllocateSolution()`, `EPSSetThreshold()`
801 @*/
802 98 PetscErrorCode EPSReallocateSolution(EPS eps,PetscInt newsize)
803 {
804 98 PetscInt oldsize,*nperm;
805 98 PetscReal *nerrest;
806 98 PetscScalar *neigr,*neigi;
807
808
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
98 PetscFunctionBegin;
809
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.
98 PetscCall(BVGetSizes(eps->V,NULL,NULL,&oldsize));
810
2/14
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
98 if (oldsize>=newsize) PetscFunctionReturn(PETSC_SUCCESS);
811
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.
98 PetscCall(PetscInfo(eps,"Reallocating basis vectors to %" PetscInt_FMT " columns\n",newsize));
812
813 /* reallocate eigenvalues */
814
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.
98 PetscCall(PetscMalloc4(newsize,&neigr,newsize,&neigi,newsize,&nerrest,newsize,&nperm));
815
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.
98 PetscCall(PetscArraycpy(neigr,eps->eigr,oldsize));
816
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.
98 PetscCall(PetscArraycpy(neigi,eps->eigi,oldsize));
817
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.
98 PetscCall(PetscArraycpy(nerrest,eps->errest,oldsize));
818
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.
98 PetscCall(PetscArraycpy(nperm,eps->perm,oldsize));
819
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.
98 PetscCall(PetscFree4(eps->eigr,eps->eigi,eps->errest,eps->perm));
820 98 eps->eigr = neigr;
821 98 eps->eigi = neigi;
822 98 eps->errest = nerrest;
823 98 eps->perm = nperm;
824 /* reallocate V,W */
825
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.
98 PetscCall(BVResize(eps->V,newsize,PETSC_TRUE));
826
1/8
✗ 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.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
98 if (eps->twosided) PetscCall(BVResize(eps->W,newsize,PETSC_TRUE));
827
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);
828 }
829